I2C not working upon 2.6.24 to 2.6.28 kernel upgrade

Johns Daniel johns.daniel at gmail.com
Fri Mar 13 08:38:50 EST 2009


On Thu, Mar 12, 2009 at 1:08 PM, Grant Likely <grant.likely at secretlab.ca> wrote:
> On Thu, Mar 12, 2009 at 11:37 AM, Johns Daniel <johns.daniel at gmail.com> wrote:
>> We have had this device tree (a section shown below) working for a long time:
>>        soc8343 at e0000000 {
>>                #address-cells = <1>;
>>                #size-cells = <1>;
>>                #interrupt-cells = <2>;
>>                device_type = "soc";
>>                ranges = <00000000 e0000000 00100000>;
>>                reg = <e0000000 00000200>;
>>                bus-frequency = <0>;
>>
>>                i2c at 3000 {
>>                        device_type = "i2c";
>>                        compatible = "fsl-i2c";
>>                        reg = <3000 100>;
>>                        interrupts = <e 8>;
>>                        interrupt-parent = <700>;
>>                        dfsrr;
>>                };
>> ...
>> }
>>
>> With linux-2.6.24, it worked with this struct defined in the
>> board-specific file:
>>          static struct of_device_id __initdata of_bus_ids[] = {
>>                { .compatible = "fsl,pq2pro-localbus", },
>>                {},
>>          };
>
> This doesn't make much sense since the snippit above doesn't show a
> compatible value in the soc node.

I am glad I am not the only one to whom some of this does not make sense!    ;~)

But I can assure you that I have been using this with 2.6.20 and
2.6.24 without any problems---and there has not been a compatible
value in the soc node. (There are compatible values in the subnodes of
soc.) Even with linux 2.6.28, everything but I2C works.

>
>> With linux-2.6.28, it needs the following struct in the board-specific
>> file for I2C to work:
>>          static struct of_device_id __initdata of_bus_ids[] = {
>>                { .type = "soc", },
>>                { .name = "localbus", },
>>                {},
>>          };
>>
>> Is this easily explained?
>
> Binding on device_type or name is strongly discouraged, so the above
> snippit isn't a good idea.

Would you please explain why? I just want to weigh the risk of
changing the DTB vs. the risk of using a device_type binding.

>
> Is it okay to add a property to your device tree?  If so, then add:
> compatible = "fsl,mpc8315-immr", "simple-bus" and make sure that {
> .compatible = "simple-bus"} is in the of_bus_ids list.  Adding this
> property will not break older versions of the kernel.

Thanks for your excellent answers!

>
>> What is the right way to do this now? Ideally, I would like to keep
>> the device tree unchanged since I need for it to work with older
>> versions of the kernel!
>
> compatible = "simple-bus" is the right way to describe simple memory
> mapped translations like on the internally memory mapped registers.
>
> Cheers,
> g.
>
> --
> Grant Likely, B.Sc., P.Eng.
> Secret Lab Technologies Ltd.
>



More information about the devicetree-discuss mailing list