Lines Matching +full:slave +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0+
11 #include <dm/device-internal.h>
12 #include <dm/uclass-internal.h>
26 if (ops->set_speed) in spi_set_speed_mode()
27 ret = ops->set_speed(bus, speed); in spi_set_speed_mode()
29 ret = -EINVAL; in spi_set_speed_mode()
35 if (ops->set_mode) in spi_set_speed_mode()
36 ret = ops->set_mode(bus, mode); in spi_set_speed_mode()
38 ret = -EINVAL; in spi_set_speed_mode()
47 int dm_spi_claim_bus(struct udevice *dev) in dm_spi_claim_bus() argument
49 struct udevice *bus = dev->parent; in dm_spi_claim_bus()
52 struct spi_slave *slave = dev_get_parent_priv(dev); in dm_spi_claim_bus() local
55 speed = slave->max_hz; in dm_spi_claim_bus()
56 if (spi->max_hz) { in dm_spi_claim_bus()
58 speed = min(speed, (int)spi->max_hz); in dm_spi_claim_bus()
60 speed = spi->max_hz; in dm_spi_claim_bus()
64 if (speed != slave->speed) { in dm_spi_claim_bus()
65 int ret = spi_set_speed_mode(bus, speed, slave->mode); in dm_spi_claim_bus()
69 slave->speed = speed; in dm_spi_claim_bus()
72 return log_ret(ops->claim_bus ? ops->claim_bus(dev) : 0); in dm_spi_claim_bus()
75 void dm_spi_release_bus(struct udevice *dev) in dm_spi_release_bus() argument
77 struct udevice *bus = dev->parent; in dm_spi_release_bus()
80 if (ops->release_bus) in dm_spi_release_bus()
81 ops->release_bus(dev); in dm_spi_release_bus()
84 int dm_spi_xfer(struct udevice *dev, unsigned int bitlen, in dm_spi_xfer() argument
87 struct udevice *bus = dev->parent; in dm_spi_xfer()
89 if (bus->uclass->uc_drv->id != UCLASS_SPI) in dm_spi_xfer()
90 return -EOPNOTSUPP; in dm_spi_xfer()
92 return spi_get_ops(bus)->xfer(dev, bitlen, dout, din, flags); in dm_spi_xfer()
95 int dm_spi_nor_ctrl_wlock(struct udevice *dev, u32 offset, size_t len) in dm_spi_nor_ctrl_wlock() argument
97 struct udevice *bus = dev->parent; in dm_spi_nor_ctrl_wlock()
99 if (bus->uclass->uc_drv->id != UCLASS_SPI) in dm_spi_nor_ctrl_wlock()
100 return -EOPNOTSUPP; in dm_spi_nor_ctrl_wlock()
102 return spi_get_ops(bus)->mem_ctrl_wlock(dev, offset, len); in dm_spi_nor_ctrl_wlock()
105 int dm_spi_nor_ctrl_wunlock(struct udevice *dev, u32 offset, size_t len) in dm_spi_nor_ctrl_wunlock() argument
107 struct udevice *bus = dev->parent; in dm_spi_nor_ctrl_wunlock()
109 if (bus->uclass->uc_drv->id != UCLASS_SPI) in dm_spi_nor_ctrl_wunlock()
110 return -EOPNOTSUPP; in dm_spi_nor_ctrl_wunlock()
112 return spi_get_ops(bus)->mem_ctrl_wunlock(dev, offset, len); in dm_spi_nor_ctrl_wunlock()
115 int spi_claim_bus(struct spi_slave *slave) in spi_claim_bus() argument
117 return log_ret(dm_spi_claim_bus(slave->dev)); in spi_claim_bus()
120 void spi_release_bus(struct spi_slave *slave) in spi_release_bus() argument
122 dm_spi_release_bus(slave->dev); in spi_release_bus()
125 int spi_xfer(struct spi_slave *slave, unsigned int bitlen, in spi_xfer() argument
128 return dm_spi_xfer(slave->dev, bitlen, dout, din, flags); in spi_xfer()
131 int spi_nor_ctrl_wlock(struct spi_slave *slave, u32 offset, size_t len) in spi_nor_ctrl_wlock() argument
133 return dm_spi_nor_ctrl_wlock(slave->dev, offset, len); in spi_nor_ctrl_wlock()
136 int spi_nor_ctrl_wunlock(struct spi_slave *slave, u32 offset, size_t len) in spi_nor_ctrl_wunlock() argument
138 return dm_spi_nor_ctrl_wunlock(slave->dev, offset, len); in spi_nor_ctrl_wunlock()
142 static int spi_child_post_bind(struct udevice *dev) in spi_child_post_bind() argument
144 struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev); in spi_child_post_bind()
146 if (!dev_of_valid(dev)) in spi_child_post_bind()
149 return spi_slave_ofdata_to_platdata(dev, plat); in spi_child_post_bind()
158 spi->max_hz = dev_read_u32_default(bus, "spi-max-frequency", 0); in spi_post_probe()
163 if (ops->claim_bus) in spi_post_probe()
164 ops->claim_bus += gd->reloc_off; in spi_post_probe()
165 if (ops->release_bus) in spi_post_probe()
166 ops->release_bus += gd->reloc_off; in spi_post_probe()
167 if (ops->set_wordlen) in spi_post_probe()
168 ops->set_wordlen += gd->reloc_off; in spi_post_probe()
169 if (ops->xfer) in spi_post_probe()
170 ops->xfer += gd->reloc_off; in spi_post_probe()
171 if (ops->set_speed) in spi_post_probe()
172 ops->set_speed += gd->reloc_off; in spi_post_probe()
173 if (ops->set_mode) in spi_post_probe()
174 ops->set_mode += gd->reloc_off; in spi_post_probe()
175 if (ops->cs_info) in spi_post_probe()
176 ops->cs_info += gd->reloc_off; in spi_post_probe()
182 static int spi_child_pre_probe(struct udevice *dev) in spi_child_pre_probe() argument
184 struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev); in spi_child_pre_probe()
185 struct spi_slave *slave = dev_get_parent_priv(dev); in spi_child_pre_probe() local
189 * instead slave->dev (a struct udevice). So we have to have some in spi_child_pre_probe()
190 * way to access the slave udevice given struct spi_slave. Once we in spi_child_pre_probe()
194 slave->dev = dev; in spi_child_pre_probe()
196 slave->max_hz = plat->max_hz; in spi_child_pre_probe()
197 slave->mode = plat->mode; in spi_child_pre_probe()
198 slave->wordlen = SPI_DEFAULT_WORDLEN; in spi_child_pre_probe()
203 int spi_chip_select(struct udevice *dev) in spi_chip_select() argument
205 struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev); in spi_chip_select()
207 return plat ? plat->cs : -ENOENT; in spi_chip_select()
212 struct udevice *dev; in spi_find_chip_select() local
214 for (device_find_first_child(bus, &dev); dev; in spi_find_chip_select()
215 device_find_next_child(&dev)) { in spi_find_chip_select()
218 plat = dev_get_parent_platdata(dev); in spi_find_chip_select()
219 debug("%s: plat=%p, cs=%d\n", __func__, plat, plat->cs); in spi_find_chip_select()
220 if (plat->cs == cs) { in spi_find_chip_select()
221 *devp = dev; in spi_find_chip_select()
226 return -ENODEV; in spi_find_chip_select()
254 info->dev = NULL; in spi_cs_info()
255 ret = spi_find_chip_select(bus, cs, &info->dev); in spi_cs_info()
266 if (ops->cs_info) in spi_cs_info()
267 return ops->cs_info(bus, cs, info); in spi_cs_info()
274 return -ENODEV; in spi_cs_info()
280 struct udevice *bus, *dev; in spi_find_bus_and_cs() local
288 ret = spi_find_chip_select(bus, cs, &dev); in spi_find_bus_and_cs()
294 *devp = dev; in spi_find_bus_and_cs()
303 struct udevice *bus, *dev; in spi_get_bus_and_cs() local
317 ret = spi_find_chip_select(bus, cs, &dev); in spi_get_bus_and_cs()
322 * SPI flash chip - we will bind to the correct driver. in spi_get_bus_and_cs()
324 if (ret == -ENODEV && drv_name) { in spi_get_bus_and_cs()
327 ret = device_bind_driver(bus, drv_name, dev_name, &dev); in spi_get_bus_and_cs()
333 plat = dev_get_parent_platdata(dev); in spi_get_bus_and_cs()
334 plat->cs = cs; in spi_get_bus_and_cs()
336 plat->max_hz = speed; in spi_get_bus_and_cs()
340 plat->max_hz = SPI_DEFAULT_SPEED_HZ; in spi_get_bus_and_cs()
342 plat->mode = mode; in spi_get_bus_and_cs()
350 if (!device_active(dev)) { in spi_get_bus_and_cs()
351 struct spi_slave *slave; in spi_get_bus_and_cs() local
353 ret = device_probe(dev); in spi_get_bus_and_cs()
356 slave = dev_get_parent_priv(dev); in spi_get_bus_and_cs()
357 slave->dev = dev; in spi_get_bus_and_cs()
360 plat = dev_get_parent_platdata(dev); in spi_get_bus_and_cs()
362 speed = plat->max_hz; in spi_get_bus_and_cs()
363 mode = plat->mode; in spi_get_bus_and_cs()
370 *devp = dev_get_parent_priv(dev); in spi_get_bus_and_cs()
371 debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp); in spi_get_bus_and_cs()
377 created, dev->name); in spi_get_bus_and_cs()
379 device_remove(dev, DM_REMOVE_NORMAL); in spi_get_bus_and_cs()
380 device_unbind(dev); in spi_get_bus_and_cs()
386 /* Compatibility function - to be removed */
390 struct spi_slave *slave; in spi_setup_slave() local
391 struct udevice *dev; in spi_setup_slave() local
394 ret = spi_get_bus_and_cs(busnum, cs, speed, mode, NULL, 0, &dev, in spi_setup_slave()
395 &slave); in spi_setup_slave()
399 return slave; in spi_setup_slave()
402 void spi_free_slave(struct spi_slave *slave) in spi_free_slave() argument
404 device_remove(slave->dev, DM_REMOVE_NORMAL); in spi_free_slave()
405 slave->dev = NULL; in spi_free_slave()
408 int spi_slave_ofdata_to_platdata(struct udevice *dev, in spi_slave_ofdata_to_platdata() argument
414 plat->cs = dev_read_u32_default(dev, "reg", -1); in spi_slave_ofdata_to_platdata()
415 plat->max_hz = dev_read_u32_default(dev, "spi-max-frequency", in spi_slave_ofdata_to_platdata()
417 if (dev_read_bool(dev, "spi-cpol")) in spi_slave_ofdata_to_platdata()
419 if (dev_read_bool(dev, "spi-cpha")) in spi_slave_ofdata_to_platdata()
421 if (dev_read_bool(dev, "spi-cs-high")) in spi_slave_ofdata_to_platdata()
423 if (dev_read_bool(dev, "spi-3wire")) in spi_slave_ofdata_to_platdata()
425 if (dev_read_bool(dev, "spi-half-duplex")) in spi_slave_ofdata_to_platdata()
429 value = dev_read_u32_default(dev, "spi-tx-bus-width", 1); in spi_slave_ofdata_to_platdata()
440 warn_non_spl("spi-tx-bus-width %d not supported\n", value); in spi_slave_ofdata_to_platdata()
444 value = dev_read_u32_default(dev, "spi-rx-bus-width", 1); in spi_slave_ofdata_to_platdata()
455 warn_non_spl("spi-rx-bus-width %d not supported\n", value); in spi_slave_ofdata_to_platdata()
459 plat->mode = mode; in spi_slave_ofdata_to_platdata()