Lines Matching +full:d +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0+
11 #include <dm/device-internal.h>
12 #include <dm/uclass-internal.h>
20 static int spi_set_speed_mode(struct udevice *bus, int speed, int mode) in spi_set_speed_mode() argument
25 ops = spi_get_ops(bus); in spi_set_speed_mode()
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()
31 printf("Cannot set speed (err=%d)\n", ret); 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()
40 printf("Cannot set mode (err=%d)\n", ret); in spi_set_speed_mode()
49 struct udevice *bus = dev->parent; in dm_spi_claim_bus() local
50 struct dm_spi_ops *ops = spi_get_ops(bus); in dm_spi_claim_bus()
51 struct dm_spi_bus *spi = dev_get_uclass_priv(bus); in dm_spi_claim_bus()
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()
77 struct udevice *bus = dev->parent; in dm_spi_release_bus() local
78 struct dm_spi_ops *ops = spi_get_ops(bus); 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()
87 struct udevice *bus = dev->parent; in dm_spi_xfer() local
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()
97 struct udevice *bus = dev->parent; in dm_spi_nor_ctrl_wlock() local
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()
107 struct udevice *bus = dev->parent; in dm_spi_nor_ctrl_wunlock() local
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()
117 return log_ret(dm_spi_claim_bus(slave->dev)); in spi_claim_bus()
122 dm_spi_release_bus(slave->dev); in spi_release_bus()
128 return dm_spi_xfer(slave->dev, bitlen, dout, din, flags); in spi_xfer()
133 return dm_spi_nor_ctrl_wlock(slave->dev, offset, len); in spi_nor_ctrl_wlock()
138 return dm_spi_nor_ctrl_wunlock(slave->dev, offset, len); in spi_nor_ctrl_wunlock()
153 static int spi_post_probe(struct udevice *bus) in spi_post_probe() argument
156 struct dm_spi_bus *spi = dev_get_uclass_priv(bus); in spi_post_probe()
158 spi->max_hz = dev_read_u32_default(bus, "spi-max-frequency", 0); in spi_post_probe()
161 struct dm_spi_ops *ops = spi_get_ops(bus); 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()
189 * instead slave->dev (a struct udevice). So we have to have some 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()
207 return plat ? plat->cs : -ENOENT; in spi_chip_select()
210 int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp) in spi_find_chip_select() argument
214 for (device_find_first_child(bus, &dev); 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()
226 return -ENODEV; in spi_find_chip_select()
232 struct udevice *bus; in spi_cs_is_valid() local
235 ret = uclass_find_device_by_seq(UCLASS_SPI, busnum, false, &bus); in spi_cs_is_valid()
237 debug("%s: No bus %d\n", __func__, busnum); in spi_cs_is_valid()
241 return spi_cs_info(bus, cs, &info); in spi_cs_is_valid()
244 int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info) in spi_cs_info() argument
254 info->dev = NULL; in spi_cs_info()
255 ret = spi_find_chip_select(bus, cs, &info->dev); in spi_cs_info()
265 ops = spi_get_ops(bus); 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
283 ret = uclass_find_device_by_seq(UCLASS_SPI, busnum, false, &bus); in spi_find_bus_and_cs()
285 debug("%s: No bus %d\n", __func__, busnum); in spi_find_bus_and_cs()
288 ret = spi_find_chip_select(bus, cs, &dev); in spi_find_bus_and_cs()
290 debug("%s: No cs %d\n", __func__, cs); in spi_find_bus_and_cs()
293 *busp = bus; in spi_find_bus_and_cs()
303 struct udevice *bus, *dev; in spi_get_bus_and_cs() local
309 ret = uclass_first_device_err(UCLASS_SPI, &bus); in spi_get_bus_and_cs()
311 ret = uclass_get_device_by_seq(UCLASS_SPI, busnum, &bus); in spi_get_bus_and_cs()
314 printf("Invalid bus %d (err=%d)\n", busnum, ret); in spi_get_bus_and_cs()
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()
325 debug("%s: Binding new device '%s', busnum=%d, cs=%d, driver=%s\n", in spi_get_bus_and_cs()
327 ret = device_bind_driver(bus, drv_name, dev_name, &dev); in spi_get_bus_and_cs()
329 debug("%s: Unable to bind driver (ret=%d)\n", __func__, 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()
345 printf("Invalid chip select %d:%d (err=%d)\n", busnum, cs, in spi_get_bus_and_cs()
357 slave->dev = 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()
365 ret = spi_set_speed_mode(bus, speed, mode); in spi_get_bus_and_cs()
369 *busp = bus; in spi_get_bus_and_cs()
371 debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp); in spi_get_bus_and_cs()
376 debug("%s: Error path, created=%d, device '%s'\n", __func__, in spi_get_bus_and_cs()
377 created, dev->name); in spi_get_bus_and_cs()
386 /* Compatibility function - to be removed */
404 device_remove(slave->dev, DM_REMOVE_NORMAL); in spi_free_slave()
405 slave->dev = NULL; in spi_free_slave()
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()