Patchwork fix i2c on PPC linkstation / kurobox machines

login
register
mail settings
Submitter Guennadi Liakhovetski
Date Oct. 23, 2008, 11:05 p.m.
Message ID <Pine.LNX.4.64.0810240059170.9657@axis700.grange>
Download mbox | patch
Permalink /patch/5540/
State Accepted
Commit 22e181ba7f09197dd6f35a48013cb86289644eb6
Delegated to: Kumar Gala
Headers show

Comments

Guennadi Liakhovetski - Oct. 23, 2008, 11:05 p.m.
i2c is broken on linkstation / kurobox machines since at least 2.6.27. Fix 
it. Also remove CONFIG_SERIAL_OF_PLATFORM, which, if enabled, breaks the 
serial console after the "console handover: boot [udbg0] -> real [ttyS1]" 
message.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>

---

No, I do not really understand why I have to remove 
CONFIG_SERIAL_OF_PLATFORM now after adding a call to 
of_platform_bus_probe(), but it works this way. It must have something to 
do with the legacy serial driver... If accepted in this form, I'll also 
forward it to stable.
Benjamin Herrenschmidt - Oct. 24, 2008, 12:19 a.m.
On Fri, 2008-10-24 at 01:05 +0200, Guennadi Liakhovetski wrote:
> i2c is broken on linkstation / kurobox machines since at least 2.6.27. Fix 
> it. Also remove CONFIG_SERIAL_OF_PLATFORM, which, if enabled, breaks the 
> serial console after the "console handover: boot [udbg0] -> real [ttyS1]" 
> message.
> 
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>

You may want to use udbg_printf() to track down what's up. There's some
fishy code there indeed, what happens is that the legacy serial code
creates a platform device at boot time. Then, the of_serial attaches to
the device node for the same device and tries to register it. It's
supposed to "detect" that it's the same device but yeah, it may be
buggy, I've seen problems with it in the past, among others, I think it
can lose some state.

In the meantime, removing SERIAL_OF_PLATFORM is a good solution.

Ben.
Guennadi Liakhovetski - Oct. 24, 2008, 6:25 p.m.
On Fri, 24 Oct 2008, Benjamin Herrenschmidt wrote:

> On Fri, 2008-10-24 at 01:05 +0200, Guennadi Liakhovetski wrote:
> > i2c is broken on linkstation / kurobox machines since at least 2.6.27. Fix 
> > it. Also remove CONFIG_SERIAL_OF_PLATFORM, which, if enabled, breaks the 
> > serial console after the "console handover: boot [udbg0] -> real [ttyS1]" 
> > message.
> > 
> > Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> 
> You may want to use udbg_printf() to track down what's up. There's some
> fishy code there indeed, what happens is that the legacy serial code
> creates a platform device at boot time. Then, the of_serial attaches to
> the device node for the same device and tries to register it. It's
> supposed to "detect" that it's the same device but yeah, it may be
> buggy, I've seen problems with it in the past, among others, I think it
> can lose some state.
> 
> In the meantime, removing SERIAL_OF_PLATFORM is a good solution.
> 
> Ben.

I think, this needs an acked-by for -stable.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
Kumar Gala - Oct. 28, 2008, 1:58 p.m.
On Oct 23, 2008, at 6:05 PM, Guennadi Liakhovetski wrote:

> i2c is broken on linkstation / kurobox machines since at least  
> 2.6.27. Fix
> it. Also remove CONFIG_SERIAL_OF_PLATFORM, which, if enabled, breaks  
> the
> serial console after the "console handover: boot [udbg0] -> real  
> [ttyS1]"
> message.
>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
>
> ---
>
> No, I do not really understand why I have to remove
> CONFIG_SERIAL_OF_PLATFORM now after adding a call to
> of_platform_bus_probe(), but it works this way. It must have  
> something to
> do with the legacy serial driver... If accepted in this form, I'll  
> also
> forward it to stable.
>
> diff --git


applied to merge.

- k
Jon Smirl - Oct. 28, 2008, 2:06 p.m.
On Tue, Oct 28, 2008 at 9:58 AM, Kumar Gala <galak@kernel.crashing.org> wrote:
>
> On Oct 23, 2008, at 6:05 PM, Guennadi Liakhovetski wrote:
>
>> i2c is broken on linkstation / kurobox machines since at least 2.6.27. Fix
>> it. Also remove CONFIG_SERIAL_OF_PLATFORM, which, if enabled, breaks the
>> serial console after the "console handover: boot [udbg0] -> real [ttyS1]"
>> message.
>>
>> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
>>
>> ---
>>
>> No, I do not really understand why I have to remove
>> CONFIG_SERIAL_OF_PLATFORM now after adding a call to
>> of_platform_bus_probe(), but it works this way. It must have something to
>> do with the legacy serial driver... If accepted in this form, I'll also
>> forward it to stable.
>>
>> diff --git
>
>
> applied to merge.

Did you change the comment? I2C wasn't broken, the bus definition was broken.


>
> - k
>

Patch

diff --git a/arch/powerpc/configs/linkstation_defconfig b/arch/powerpc/configs/linkstation_defconfig
index 6fc4c21..d0846ec 100644
--- a/arch/powerpc/configs/linkstation_defconfig
+++ b/arch/powerpc/configs/linkstation_defconfig
@@ -1,7 +1,7 @@ 
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.27-rc4
-# Thu Aug 21 00:52:05 2008
+# Linux kernel version: 2.6.27
+# Fri Oct 24 00:42:39 2008
 #
 # CONFIG_PPC64 is not set
 
@@ -934,7 +934,7 @@  CONFIG_SERIAL_8250_RUNTIME_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
-CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_SERIAL_OF_PLATFORM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -1211,7 +1211,6 @@  CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_ALAUDA is not set
 # CONFIG_USB_STORAGE_ONETOUCH is not set
 # CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_STORAGE_SIERRA is not set
 # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
 # CONFIG_USB_LIBUSUAL is not set
 
diff --git a/arch/powerpc/platforms/embedded6xx/linkstation.c b/arch/powerpc/platforms/embedded6xx/linkstation.c
index eb5d74e..2ca7be6 100644
--- a/arch/powerpc/platforms/embedded6xx/linkstation.c
+++ b/arch/powerpc/platforms/embedded6xx/linkstation.c
@@ -13,6 +13,7 @@ 
 #include <linux/kernel.h>
 #include <linux/initrd.h>
 #include <linux/mtd/physmap.h>
+#include <linux/of_platform.h>
 
 #include <asm/time.h>
 #include <asm/prom.h>
@@ -54,6 +55,19 @@  static struct mtd_partition linkstation_physmap_partitions[] = {
 	},
 };
 
+static __initdata struct of_device_id of_bus_ids[] = {
+	{ .type = "soc", },
+	{ .compatible = "simple-bus", },
+	{},
+};
+
+static int __init declare_of_platform_devices(void)
+{
+	of_platform_bus_probe(NULL, of_bus_ids, NULL);
+	return 0;
+}
+machine_device_initcall(linkstation, declare_of_platform_devices);
+
 static int __init linkstation_add_bridge(struct device_node *dev)
 {
 #ifdef CONFIG_PCI