Hi Muganthan, On 27 October 2015 at 05:12, Mugunthan V N <mugunthan...@ti.com> wrote: > when a device registered with device_bind_driver(), its fdt node > is not added to the device. Due to this, in spi_child_post_bind() > dev->of_offset is -1 and spi device fdt is never parsed. So > changing the device register by device_bind_driver_to_node() so > that the spi slave device is registered with of_offset and its > fdt is parsed properly. > > Signed-off-by: Mugunthan V N <mugunthan...@ti.com> > --- > drivers/spi/spi-uclass.c | 38 ++++++++++++++++++++++++++++++++------ > 1 file changed, 32 insertions(+), 6 deletions(-) > > diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c > index 9a32b6c..cfd14b1 100644 > --- a/drivers/spi/spi-uclass.c > +++ b/drivers/spi/spi-uclass.c > @@ -138,6 +138,7 @@ static int spi_child_pre_probe(struct udevice *dev) > slave->max_hz = plat->max_hz; > slave->mode = plat->mode; > > + > return 0; > } > > @@ -258,17 +259,42 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, > int mode, > * SPI flash chip - we will bind to the correct driver. > */ > if (ret == -ENODEV && drv_name) { > - struct dm_spi_slave_platdata *plat; > + const void *fdt = gd->fdt_blob; > + int node = bus->of_offset; > + int subnode = -1; > + int slave_cs = -1; > > debug("%s: Binding new device '%s', busnum=%d, cs=%d, > driver=%s\n", > __func__, dev_name, busnum, cs, drv_name); > - ret = device_bind_driver(bus, drv_name, dev_name, &dev); > +
Please see the comment above: /* * If there is no such device, create one automatically. This means * that we don't need a device tree node or platform data for the * SPI flash chip - we will bind to the correct driver. */ This code is used when there is no device attached. It should not happen that you have a device tree node which is ignored when the SPI bus is bound. spi_post_bind() should pick up these node and create drivers for them. > + fdt_for_each_subnode(fdt, subnode, node) { > + slave_cs = fdtdec_get_int(fdt, subnode, "reg", -1); > + if(cs == slave_cs) > + break; > + } > + > + if(cs != slave_cs) { > + printf("%s: device not found in device tree blob\n", > + __func__); > + subnode = -1; > + } > + > + ret = device_bind_driver_to_node(bus, drv_name, dev_name, > + subnode, &dev); > if (ret) > return ret; > - plat = dev_get_parent_platdata(dev); > - plat->cs = cs; > - plat->max_hz = speed; > - plat->mode = mode; > + /* > + * If a Device tree spi slave is found, then use settings > + * from Device tree. > + */ > + if (subnode < 0) { > + struct dm_spi_slave_platdata *plat; > + > + plat = dev_get_parent_platdata(dev); > + plat->cs = cs; > + plat->max_hz = speed; > + plat->mode = mode; > + } > created = true; > } else if (ret) { > printf("Invalid chip select %d:%d (err=%d)\n", busnum, cs, > -- > 2.6.2.280.g74301d6 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot