]> Git Repo - J-u-boot.git/blob - drivers/spi/spi-uclass.c
Merge patch series "spi: Various Kconfig fixes"
[J-u-boot.git] / drivers / spi / spi-uclass.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2014 Google, Inc
4  */
5
6 #define LOG_CATEGORY UCLASS_SPI
7
8 #include <dm.h>
9 #include <errno.h>
10 #include <log.h>
11 #include <malloc.h>
12 #include <spi.h>
13 #include <spi-mem.h>
14 #include <dm/device_compat.h>
15 #include <asm/global_data.h>
16 #include <dm/device-internal.h>
17 #include <dm/uclass-internal.h>
18 #include <dm/lists.h>
19 #include <dm/util.h>
20
21 DECLARE_GLOBAL_DATA_PTR;
22
23 #define SPI_DEFAULT_SPEED_HZ 100000
24
25 static int spi_set_speed_mode(struct udevice *bus, int speed, int mode)
26 {
27         struct dm_spi_ops *ops;
28         int ret;
29
30         ops = spi_get_ops(bus);
31         if (ops->set_speed)
32                 ret = ops->set_speed(bus, speed);
33         else
34                 ret = -EINVAL;
35         if (ret) {
36                 dev_err(bus, "Cannot set speed (err=%d)\n", ret);
37                 return ret;
38         }
39
40         if (ops->set_mode)
41                 ret = ops->set_mode(bus, mode);
42         else
43                 ret = -EINVAL;
44         if (ret) {
45                 dev_err(bus, "Cannot set mode (err=%d)\n", ret);
46                 return ret;
47         }
48
49         return 0;
50 }
51
52 int dm_spi_claim_bus(struct udevice *dev)
53 {
54         struct udevice *bus = dev->parent;
55         struct dm_spi_ops *ops = spi_get_ops(bus);
56         struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
57         struct spi_slave *slave = dev_get_parent_priv(dev);
58         uint speed, mode;
59
60         speed = slave->max_hz;
61         mode = slave->mode;
62
63         if (spi->max_hz) {
64                 if (speed)
65                         speed = min(speed, spi->max_hz);
66                 else
67                         speed = spi->max_hz;
68         }
69         if (!speed)
70                 speed = SPI_DEFAULT_SPEED_HZ;
71
72         if (speed != spi->speed || mode != spi->mode) {
73                 int ret = spi_set_speed_mode(bus, speed, slave->mode);
74
75                 if (ret)
76                         return log_ret(ret);
77
78                 spi->speed = speed;
79                 spi->mode = mode;
80         }
81
82         return log_ret(ops->claim_bus ? ops->claim_bus(dev) : 0);
83 }
84
85 void dm_spi_release_bus(struct udevice *dev)
86 {
87         struct udevice *bus = dev->parent;
88         struct dm_spi_ops *ops = spi_get_ops(bus);
89
90         if (ops->release_bus)
91                 ops->release_bus(dev);
92 }
93
94 int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
95                 const void *dout, void *din, unsigned long flags)
96 {
97         struct udevice *bus = dev->parent;
98         struct dm_spi_ops *ops = spi_get_ops(bus);
99
100         if (bus->uclass->uc_drv->id != UCLASS_SPI)
101                 return -EOPNOTSUPP;
102         if (!ops->xfer)
103                 return -ENOSYS;
104
105         return ops->xfer(dev, bitlen, dout, din, flags);
106 }
107
108 int dm_spi_get_mmap(struct udevice *dev, ulong *map_basep, uint *map_sizep,
109                     uint *offsetp)
110 {
111         struct udevice *bus = dev->parent;
112         struct dm_spi_ops *ops = spi_get_ops(bus);
113
114         if (bus->uclass->uc_drv->id != UCLASS_SPI)
115                 return -EOPNOTSUPP;
116         if (!ops->get_mmap)
117                 return -ENOSYS;
118
119         return ops->get_mmap(dev, map_basep, map_sizep, offsetp);
120 }
121
122 int spi_claim_bus(struct spi_slave *slave)
123 {
124         return log_ret(dm_spi_claim_bus(slave->dev));
125 }
126
127 void spi_release_bus(struct spi_slave *slave)
128 {
129         dm_spi_release_bus(slave->dev);
130 }
131
132 int spi_set_speed(struct spi_slave *slave, uint hz)
133 {
134         struct dm_spi_ops *ops;
135         int ret;
136
137         ops = spi_get_ops(slave->dev->parent);
138         if (ops->set_speed)
139                 ret = ops->set_speed(slave->dev->parent, hz);
140         else
141                 ret = -EINVAL;
142         if (ret)
143                 dev_err(slave->dev, "Cannot set speed (err=%d)\n", ret);
144         return ret;
145 }
146
147 int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
148              const void *dout, void *din, unsigned long flags)
149 {
150         return dm_spi_xfer(slave->dev, bitlen, dout, din, flags);
151 }
152
153 int spi_write_then_read(struct spi_slave *slave, const u8 *opcode,
154                         size_t n_opcode, const u8 *txbuf, u8 *rxbuf,
155                         size_t n_buf)
156 {
157         unsigned long flags = SPI_XFER_BEGIN;
158         int ret;
159
160         if (n_buf == 0)
161                 flags |= SPI_XFER_END;
162
163         ret = spi_xfer(slave, n_opcode * 8, opcode, NULL, flags);
164         if (ret) {
165                 dev_dbg(slave->dev,
166                         "spi: failed to send command (%zu bytes): %d\n",
167                         n_opcode, ret);
168         } else if (n_buf != 0) {
169                 ret = spi_xfer(slave, n_buf * 8, txbuf, rxbuf, SPI_XFER_END);
170                 if (ret)
171                         dev_dbg(slave->dev,
172                                 "spi: failed to transfer %zu bytes of data: %d\n",
173                                 n_buf, ret);
174         }
175
176         return ret;
177 }
178
179 #if CONFIG_IS_ENABLED(OF_REAL)
180 static int spi_child_post_bind(struct udevice *dev)
181 {
182         struct dm_spi_slave_plat *plat = dev_get_parent_plat(dev);
183
184         if (!dev_has_ofnode(dev))
185                 return 0;
186
187         return spi_slave_of_to_plat(dev, plat);
188 }
189 #endif
190
191 static int spi_post_probe(struct udevice *bus)
192 {
193         if (CONFIG_IS_ENABLED(OF_REAL)) {
194                 struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
195
196                 spi->max_hz = dev_read_u32_default(bus, "spi-max-frequency", 0);
197         }
198
199         return 0;
200 }
201
202 static int spi_child_pre_probe(struct udevice *dev)
203 {
204         struct dm_spi_slave_plat *plat = dev_get_parent_plat(dev);
205         struct spi_slave *slave = dev_get_parent_priv(dev);
206
207         /*
208          * This is needed because we pass struct spi_slave around the place
209          * instead slave->dev (a struct udevice). So we have to have some
210          * way to access the slave udevice given struct spi_slave. Once we
211          * change the SPI API to use udevice instead of spi_slave, we can
212          * drop this.
213          */
214         slave->dev = dev;
215
216         slave->max_hz = plat->max_hz;
217         slave->mode = plat->mode;
218         slave->wordlen = SPI_DEFAULT_WORDLEN;
219
220         return 0;
221 }
222
223 int spi_chip_select(struct udevice *dev)
224 {
225         struct dm_spi_slave_plat *plat = dev_get_parent_plat(dev);
226
227         return plat ? plat->cs[0] : -ENOENT;
228 }
229
230 int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp)
231 {
232         struct dm_spi_ops *ops;
233         struct spi_cs_info info;
234         struct udevice *dev;
235         int ret;
236
237         /*
238          * Ask the driver. For the moment we don't have CS info.
239          * When we do we could provide the driver with a helper function
240          * to figure out what chip selects are valid, or just handle the
241          * request.
242          */
243         ops = spi_get_ops(bus);
244         if (ops->cs_info) {
245                 ret = ops->cs_info(bus, cs, &info);
246         } else {
247                 /*
248                  * We could assume there is at least one valid chip select.
249                  * The driver didn't care enough to tell us.
250                  */
251                 ret = 0;
252         }
253
254         if (ret) {
255                 dev_err(bus, "Invalid cs %d (err=%d)\n", cs, ret);
256                 return ret;
257         }
258
259         for (device_find_first_child(bus, &dev); dev;
260              device_find_next_child(&dev)) {
261                 struct dm_spi_slave_plat *plat;
262
263                 plat = dev_get_parent_plat(dev);
264                 dev_dbg(bus, "%s: plat=%p, cs=%d\n", __func__, plat, plat->cs[0]);
265                 if (plat->cs[0] == cs) {
266                         *devp = dev;
267                         return 0;
268                 }
269         }
270
271         return -ENODEV;
272 }
273
274 int spi_cs_is_valid(unsigned int busnum, unsigned int cs)
275 {
276         struct spi_cs_info info;
277         struct udevice *bus;
278         int ret;
279
280         ret = uclass_find_device_by_seq(UCLASS_SPI, busnum, &bus);
281         if (ret) {
282                 log_debug("%s: No bus %d\n", __func__, busnum);
283                 return ret;
284         }
285
286         return spi_cs_info(bus, cs, &info);
287 }
288
289 int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info)
290 {
291         struct spi_cs_info local_info;
292         int ret;
293
294         if (!info)
295                 info = &local_info;
296
297         /* If there is a device attached, return it */
298         info->dev = NULL;
299         ret = spi_find_chip_select(bus, cs, &info->dev);
300         return ret == -ENODEV ? 0 : ret;
301 }
302
303 int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
304                         struct udevice **devp)
305 {
306         struct udevice *bus, *dev;
307         int ret;
308
309         ret = uclass_find_device_by_seq(UCLASS_SPI, busnum, &bus);
310         if (ret) {
311                 log_debug("%s: No bus %d\n", __func__, busnum);
312                 return ret;
313         }
314         ret = spi_find_chip_select(bus, cs, &dev);
315         if (ret) {
316                 dev_dbg(bus, "%s: No cs %d\n", __func__, cs);
317                 return ret;
318         }
319         *busp = bus;
320         *devp = dev;
321
322         return ret;
323 }
324
325 int spi_get_bus_and_cs(int busnum, int cs, struct udevice **busp,
326                        struct spi_slave **devp)
327 {
328         struct udevice *bus, *dev;
329         struct dm_spi_bus *bus_data;
330         struct spi_slave *slave;
331         int ret;
332
333 #if CONFIG_IS_ENABLED(OF_PLATDATA)
334         ret = uclass_first_device_err(UCLASS_SPI, &bus);
335 #else
336         ret = uclass_get_device_by_seq(UCLASS_SPI, busnum, &bus);
337 #endif
338         if (ret) {
339                 log_err("Invalid bus %d (err=%d)\n", busnum, ret);
340                 return ret;
341         }
342         ret = spi_find_chip_select(bus, cs, &dev);
343         if (ret) {
344                 dev_err(bus, "Invalid chip select %d:%d (err=%d)\n", busnum, cs, ret);
345                 return ret;
346         }
347
348         if (!device_active(dev)) {
349                 struct spi_slave *slave;
350
351                 ret = device_probe(dev);
352                 if (ret)
353                         goto err;
354                 slave = dev_get_parent_priv(dev);
355                 slave->dev = dev;
356         }
357
358         slave = dev_get_parent_priv(dev);
359         bus_data = dev_get_uclass_priv(bus);
360
361         /*
362          * In case the operation speed is not yet established by
363          * dm_spi_claim_bus() ensure the bus is configured properly.
364          */
365         if (!bus_data->speed) {
366                 ret = spi_claim_bus(slave);
367                 if (ret)
368                         goto err;
369         }
370         *busp = bus;
371         *devp = slave;
372
373         return 0;
374
375 err:
376         log_debug("%s: Error path, device '%s'\n", __func__, dev->name);
377
378         return ret;
379 }
380
381 int _spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
382                         const char *drv_name, const char *dev_name,
383                         struct udevice **busp, struct spi_slave **devp)
384 {
385         struct udevice *bus, *dev;
386         struct dm_spi_slave_plat *plat;
387         struct dm_spi_bus *bus_data;
388         struct spi_slave *slave;
389         bool created = false;
390         int ret;
391
392 #if CONFIG_IS_ENABLED(OF_PLATDATA)
393         ret = uclass_first_device_err(UCLASS_SPI, &bus);
394 #else
395         ret = uclass_get_device_by_seq(UCLASS_SPI, busnum, &bus);
396 #endif
397         if (ret) {
398                 log_err("Invalid bus %d (err=%d)\n", busnum, ret);
399                 return ret;
400         }
401         ret = spi_find_chip_select(bus, cs, &dev);
402
403         /*
404          * If there is no such device, create one automatically. This means
405          * that we don't need a device tree node or platform data for the
406          * SPI flash chip - we will bind to the correct driver.
407          */
408         if (ret == -ENODEV && drv_name) {
409                 dev_dbg(bus, "%s: Binding new device '%s', busnum=%d, cs=%d, driver=%s\n",
410                         __func__, dev_name, busnum, cs, drv_name);
411                 ret = device_bind_driver(bus, drv_name, dev_name, &dev);
412                 if (ret) {
413                         dev_dbg(bus, "%s: Unable to bind driver (ret=%d)\n",
414                                 __func__, ret);
415                         return ret;
416                 }
417                 plat = dev_get_parent_plat(dev);
418                 plat->cs[0] = cs;
419                 if (speed) {
420                         plat->max_hz = speed;
421                 } else {
422                         dev_warn(bus,
423                                  "Warning: SPI speed fallback to %u kHz\n",
424                                  SPI_DEFAULT_SPEED_HZ / 1000);
425                         plat->max_hz = SPI_DEFAULT_SPEED_HZ;
426                 }
427                 plat->mode = mode;
428                 created = true;
429         } else if (ret) {
430                 dev_err(bus, "Invalid chip select %d:%d (err=%d)\n", busnum, cs, ret);
431                 return ret;
432         } else if (dev) {
433                 plat = dev_get_parent_plat(dev);
434         }
435
436         if (!device_active(dev)) {
437                 struct spi_slave *slave;
438
439                 ret = device_probe(dev);
440                 if (ret)
441                         goto err;
442                 slave = dev_get_parent_priv(dev);
443                 slave->dev = dev;
444         }
445
446         slave = dev_get_parent_priv(dev);
447         bus_data = dev_get_uclass_priv(bus);
448
449 #if CONFIG_IS_ENABLED(SPI_ADVANCE)
450         if ((dev_read_bool(dev, "parallel-memories")) && !slave->multi_cs_cap) {
451                 dev_err(dev, "controller doesn't support multi CS\n");
452                 return -EINVAL;
453         }
454 #endif
455         /*
456          * In case the operation speed is not yet established by
457          * dm_spi_claim_bus() ensure the bus is configured properly.
458          */
459         if (!bus_data->speed) {
460                 ret = spi_claim_bus(slave);
461                 if (ret)
462                         goto err;
463         }
464
465         /* In case bus frequency or mode changed, update it. */
466         if ((speed && bus_data->speed && bus_data->speed != speed) ||
467             (plat && plat->mode != mode)) {
468                 ret = spi_set_speed_mode(bus, speed, mode);
469                 if (ret)
470                         goto err_speed_mode;
471         }
472
473         *busp = bus;
474         *devp = slave;
475         log_debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp);
476
477         return 0;
478
479 err_speed_mode:
480         spi_release_bus(slave);
481 err:
482         log_debug("%s: Error path, created=%d, device '%s'\n", __func__,
483                   created, dev->name);
484         if (created) {
485                 device_remove(dev, DM_REMOVE_NORMAL);
486                 device_unbind(dev);
487         }
488
489         return ret;
490 }
491
492 /* Compatibility function - to be removed */
493 struct spi_slave *spi_setup_slave(unsigned int busnum, unsigned int cs,
494                                   unsigned int speed, unsigned int mode)
495 {
496         struct spi_slave *slave;
497         struct udevice *dev;
498         int ret;
499
500         ret = _spi_get_bus_and_cs(busnum, cs, speed, mode, NULL, 0, &dev,
501                                   &slave);
502         if (ret)
503                 return NULL;
504
505         return slave;
506 }
507
508 void spi_free_slave(struct spi_slave *slave)
509 {
510         device_remove(slave->dev, DM_REMOVE_NORMAL);
511 }
512
513 int spi_slave_of_to_plat(struct udevice *dev, struct dm_spi_slave_plat *plat)
514 {
515         int mode = 0;
516         int value;
517
518 #if CONFIG_IS_ENABLED(SPI_ADVANCE)
519         int ret;
520
521         ret = dev_read_u32_array(dev, "reg", plat->cs, SPI_CS_CNT_MAX);
522
523         if (ret == -EOVERFLOW || ret == -FDT_ERR_BADLAYOUT) {
524                 dev_read_u32(dev, "reg", &plat->cs[0]);
525         } else {
526                 dev_err(dev, "has no valid 'reg' property (%d)\n", ret);
527                 return ret;
528         }
529 #else
530         plat->cs[0] = dev_read_u32_default(dev, "reg", -1);
531 #endif
532
533         plat->max_hz = dev_read_u32_default(dev, "spi-max-frequency",
534                                             SPI_DEFAULT_SPEED_HZ);
535         if (dev_read_bool(dev, "spi-cpol"))
536                 mode |= SPI_CPOL;
537         if (dev_read_bool(dev, "spi-cpha"))
538                 mode |= SPI_CPHA;
539         if (dev_read_bool(dev, "spi-cs-high"))
540                 mode |= SPI_CS_HIGH;
541         if (dev_read_bool(dev, "spi-3wire"))
542                 mode |= SPI_3WIRE;
543         if (dev_read_bool(dev, "spi-half-duplex"))
544                 mode |= SPI_PREAMBLE;
545
546         /* Device DUAL/QUAD mode */
547         value = dev_read_u32_default(dev, "spi-tx-bus-width", 1);
548         switch (value) {
549         case 1:
550                 break;
551         case 2:
552                 mode |= SPI_TX_DUAL;
553                 break;
554         case 4:
555                 mode |= SPI_TX_QUAD;
556                 break;
557         case 8:
558                 mode |= SPI_TX_OCTAL;
559                 break;
560         default:
561                 warn_non_spl("spi-tx-bus-width %d not supported\n", value);
562                 break;
563         }
564
565         value = dev_read_u32_default(dev, "spi-rx-bus-width", 1);
566         switch (value) {
567         case 1:
568                 break;
569         case 2:
570                 mode |= SPI_RX_DUAL;
571                 break;
572         case 4:
573                 mode |= SPI_RX_QUAD;
574                 break;
575         case 8:
576                 mode |= SPI_RX_OCTAL;
577                 break;
578         default:
579                 warn_non_spl("spi-rx-bus-width %d not supported\n", value);
580                 break;
581         }
582
583         plat->mode = mode;
584
585         return 0;
586 }
587
588 UCLASS_DRIVER(spi) = {
589         .id             = UCLASS_SPI,
590         .name           = "spi",
591         .flags          = DM_UC_FLAG_SEQ_ALIAS,
592 #if CONFIG_IS_ENABLED(OF_REAL)
593         .post_bind      = dm_scan_fdt_dev,
594 #endif
595         .post_probe     = spi_post_probe,
596         .child_pre_probe = spi_child_pre_probe,
597         .per_device_auto        = sizeof(struct dm_spi_bus),
598         .per_child_auto = sizeof(struct spi_slave),
599         .per_child_plat_auto    = sizeof(struct dm_spi_slave_plat),
600 #if CONFIG_IS_ENABLED(OF_REAL)
601         .child_post_bind = spi_child_post_bind,
602 #endif
603 };
604
605 UCLASS_DRIVER(spi_generic) = {
606         .id             = UCLASS_SPI_GENERIC,
607         .name           = "spi_generic",
608 };
609
610 U_BOOT_DRIVER(spi_generic_drv) = {
611         .name           = "spi_generic_drv",
612         .id             = UCLASS_SPI_GENERIC,
613 };
This page took 0.062025 seconds and 4 git commands to generate.