MPC8321, ethernet and i2c problems after upgrade from 2.6.25 to 2.6.27
Joakim Tjernlund
joakim.tjernlund at transmode.se
Wed Oct 15 03:45:40 EST 2008
On Tue, 2008-10-14 at 10:27 -0500, Scott Wood wrote:
> On Tue, Oct 14, 2008 at 09:55:31AM +0200, Joakim Tjernlund wrote:
> > On Mon, 2008-10-13 at 14:03 -0500, Scott Wood wrote:
> > > Joakim Tjernlund wrote:
> > > > Because all the kernel comments I can see still implies that this should work
> > >
> > > Which kernel comments?
> >
> > The one already mentioned and in i2c-boardinfo.c
>
> I already addressed the one already mentioned (it was sloppy terminology
> in the comment, written from the perspective of devtree-less arches).
> The latter is even less clear, as it doesn't mention dynamic buses at
> all.
>
> Feel free to submit a documentation patch clearing it up. :-)
>
> > > > and because this was the only way in earlier releases to add an i2c device.
> > >
> > > We've supported enumerating i2c-mpc devices using the device tree for
> > > almost as long as there's been new-style i2c devices.
> >
> > Don't know how long that has been but looking at the mpc832x_mds dts
> > file it has been there less than a year.
>
> commit d13ae8620dfdedfa7e9ab6d1eec294adc0516065 added i2c device probing
> from the device tree in 7/21/07, less than 3 months after new-style i2c
> devices were added to the i2c core. There were patches floating around
> the lists for longer than that.
>
> > > Why not? U-boot allows you to pass in a device tree dynamically.
> >
> > I don't use a dynamic device tree, mine is built in.
>
> So do a fixup in your board code.
Just did and this is what I came up with:
/* This should be removed once we have the rtc in u-boot's
device tree */
static struct device_node *new_node(const char *path,
struct device_node *parent)
{
struct device_node *np = kzalloc(sizeof(*np), GFP_KERNEL);
if (!np)
return NULL;
np->full_name = kmalloc(strlen(path) + 1, GFP_KERNEL);
if (!np->full_name) {
kfree(np);
return NULL;
}
strcpy(np->full_name, path);
of_node_set_flag(np, OF_DYNAMIC);
kref_init(&np->kref);
np->parent = of_node_get(parent);
return np;
}
static struct property prop_compatible = {
.name "compatible",
.value = "dallas,ds1337",
.length = sizeof("dallas,ds1337"),
};
static const unsigned long rtc_addr = 0x68;
static struct property prop_reg = {
.name "reg",
.value = &rtc_addr,
.length = sizeof(rtc_addr),
};
int __init tmcu_i2c_board_devs(void)
{
int ret=0;
struct device_node *np, *i2c_np, *rtc_node=NULL;
i2c_np = of_find_node_by_name(NULL, "i2c");
if (!i2c_np)
return -1;
np = of_find_node_by_name(i2c_np, "rtc");
if (!np) {
rtc_node = new_node("/rtc", i2c_np);
prom_add_property(rtc_node, &prop_compatible);
prom_add_property(rtc_node, &prop_reg);
of_attach_node(rtc_node);
}
return ret;
}
arch_initcall(tmcu_i2c_board_devs);
Wasn't easy to find out how, strangely I could not find a generic
new_node() function, had to copy one.
>
> I'm not sure how you would even go about building a device tree into
> U-boot currently, though.
That is easy :)
More information about the Linuxppc-dev
mailing list