
Hi Muganthan,
On 27 October 2015 at 05:12, Mugunthan V N mugunthanvnm@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 mugunthanvnm@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