• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2014 Google, Inc
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <errno.h>
9 #include <malloc.h>
10 #include <spi.h>
11 #include <dm/device-internal.h>
12 #include <dm/uclass-internal.h>
13 #include <dm/lists.h>
14 #include <dm/util.h>
15 
16 DECLARE_GLOBAL_DATA_PTR;
17 
18 #define SPI_DEFAULT_SPEED_HZ 100000
19 
spi_set_speed_mode(struct udevice * bus,int speed,int mode)20 static int spi_set_speed_mode(struct udevice *bus, int speed, int mode)
21 {
22 	struct dm_spi_ops *ops;
23 	int ret;
24 
25 	ops = spi_get_ops(bus);
26 	if (ops->set_speed)
27 		ret = ops->set_speed(bus, speed);
28 	else
29 		ret = -EINVAL;
30 	if (ret) {
31 		printf("Cannot set speed (err=%d)\n", ret);
32 		return ret;
33 	}
34 
35 	if (ops->set_mode)
36 		ret = ops->set_mode(bus, mode);
37 	else
38 		ret = -EINVAL;
39 	if (ret) {
40 		printf("Cannot set mode (err=%d)\n", ret);
41 		return ret;
42 	}
43 
44 	return 0;
45 }
46 
dm_spi_claim_bus(struct udevice * dev)47 int dm_spi_claim_bus(struct udevice *dev)
48 {
49 	struct udevice *bus = dev->parent;
50 	struct dm_spi_ops *ops = spi_get_ops(bus);
51 	struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
52 	struct spi_slave *slave = dev_get_parent_priv(dev);
53 	int speed;
54 
55 	speed = slave->max_hz;
56 	if (spi->max_hz) {
57 		if (speed)
58 			speed = min(speed, (int)spi->max_hz);
59 		else
60 			speed = spi->max_hz;
61 	}
62 	if (!speed)
63 		speed = SPI_DEFAULT_SPEED_HZ;
64 	if (speed != slave->speed) {
65 		int ret = spi_set_speed_mode(bus, speed, slave->mode);
66 
67 		if (ret)
68 			return log_ret(ret);
69 		slave->speed = speed;
70 	}
71 
72 	return log_ret(ops->claim_bus ? ops->claim_bus(dev) : 0);
73 }
74 
dm_spi_release_bus(struct udevice * dev)75 void dm_spi_release_bus(struct udevice *dev)
76 {
77 	struct udevice *bus = dev->parent;
78 	struct dm_spi_ops *ops = spi_get_ops(bus);
79 
80 	if (ops->release_bus)
81 		ops->release_bus(dev);
82 }
83 
dm_spi_xfer(struct udevice * dev,unsigned int bitlen,const void * dout,void * din,unsigned long flags)84 int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
85 		const void *dout, void *din, unsigned long flags)
86 {
87 	struct udevice *bus = dev->parent;
88 
89 	if (bus->uclass->uc_drv->id != UCLASS_SPI)
90 		return -EOPNOTSUPP;
91 
92 	return spi_get_ops(bus)->xfer(dev, bitlen, dout, din, flags);
93 }
94 
dm_spi_get_mmap(struct udevice * dev,ulong * map_basep,uint * map_sizep,uint * offsetp)95 int dm_spi_get_mmap(struct udevice *dev, ulong *map_basep, uint *map_sizep,
96 		    uint *offsetp)
97 {
98 	struct udevice *bus = dev->parent;
99 	struct dm_spi_ops *ops = spi_get_ops(bus);
100 
101 	if (bus->uclass->uc_drv->id != UCLASS_SPI)
102 		return -EOPNOTSUPP;
103 	if (!ops->get_mmap)
104 		return -ENOSYS;
105 
106 	return ops->get_mmap(dev, map_basep, map_sizep, offsetp);
107 }
108 
spi_claim_bus(struct spi_slave * slave)109 int spi_claim_bus(struct spi_slave *slave)
110 {
111 	return log_ret(dm_spi_claim_bus(slave->dev));
112 }
113 
spi_release_bus(struct spi_slave * slave)114 void spi_release_bus(struct spi_slave *slave)
115 {
116 	dm_spi_release_bus(slave->dev);
117 }
118 
spi_xfer(struct spi_slave * slave,unsigned int bitlen,const void * dout,void * din,unsigned long flags)119 int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
120 	     const void *dout, void *din, unsigned long flags)
121 {
122 	return dm_spi_xfer(slave->dev, bitlen, dout, din, flags);
123 }
124 
spi_write_then_read(struct spi_slave * slave,const u8 * opcode,size_t n_opcode,const u8 * txbuf,u8 * rxbuf,size_t n_buf)125 int spi_write_then_read(struct spi_slave *slave, const u8 *opcode,
126 			size_t n_opcode, const u8 *txbuf, u8 *rxbuf,
127 			size_t n_buf)
128 {
129 	unsigned long flags = SPI_XFER_BEGIN;
130 	int ret;
131 
132 	if (n_buf == 0)
133 		flags |= SPI_XFER_END;
134 
135 	ret = spi_xfer(slave, n_opcode * 8, opcode, NULL, flags);
136 	if (ret) {
137 		debug("spi: failed to send command (%zu bytes): %d\n",
138 		      n_opcode, ret);
139 	} else if (n_buf != 0) {
140 		ret = spi_xfer(slave, n_buf * 8, txbuf, rxbuf, SPI_XFER_END);
141 		if (ret)
142 			debug("spi: failed to transfer %zu bytes of data: %d\n",
143 			      n_buf, ret);
144 	}
145 
146 	return ret;
147 }
148 
149 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
spi_child_post_bind(struct udevice * dev)150 static int spi_child_post_bind(struct udevice *dev)
151 {
152 	struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
153 
154 	if (!dev_of_valid(dev))
155 		return 0;
156 
157 	return spi_slave_ofdata_to_platdata(dev, plat);
158 }
159 #endif
160 
spi_post_probe(struct udevice * bus)161 static int spi_post_probe(struct udevice *bus)
162 {
163 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
164 	struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
165 
166 	spi->max_hz = dev_read_u32_default(bus, "spi-max-frequency", 0);
167 #endif
168 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
169 	struct dm_spi_ops *ops = spi_get_ops(bus);
170 
171 	if (ops->claim_bus)
172 		ops->claim_bus += gd->reloc_off;
173 	if (ops->release_bus)
174 		ops->release_bus += gd->reloc_off;
175 	if (ops->set_wordlen)
176 		ops->set_wordlen += gd->reloc_off;
177 	if (ops->xfer)
178 		ops->xfer += gd->reloc_off;
179 	if (ops->set_speed)
180 		ops->set_speed += gd->reloc_off;
181 	if (ops->set_mode)
182 		ops->set_mode += gd->reloc_off;
183 	if (ops->cs_info)
184 		ops->cs_info += gd->reloc_off;
185 #endif
186 
187 	return 0;
188 }
189 
spi_child_pre_probe(struct udevice * dev)190 static int spi_child_pre_probe(struct udevice *dev)
191 {
192 	struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
193 	struct spi_slave *slave = dev_get_parent_priv(dev);
194 
195 	/*
196 	 * This is needed because we pass struct spi_slave around the place
197 	 * instead slave->dev (a struct udevice). So we have to have some
198 	 * way to access the slave udevice given struct spi_slave. Once we
199 	 * change the SPI API to use udevice instead of spi_slave, we can
200 	 * drop this.
201 	 */
202 	slave->dev = dev;
203 
204 	slave->max_hz = plat->max_hz;
205 	slave->mode = plat->mode;
206 	slave->wordlen = SPI_DEFAULT_WORDLEN;
207 
208 	return 0;
209 }
210 
spi_chip_select(struct udevice * dev)211 int spi_chip_select(struct udevice *dev)
212 {
213 	struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
214 
215 	return plat ? plat->cs : -ENOENT;
216 }
217 
spi_find_chip_select(struct udevice * bus,int cs,struct udevice ** devp)218 int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp)
219 {
220 	struct udevice *dev;
221 
222 	for (device_find_first_child(bus, &dev); dev;
223 	     device_find_next_child(&dev)) {
224 		struct dm_spi_slave_platdata *plat;
225 
226 		plat = dev_get_parent_platdata(dev);
227 		debug("%s: plat=%p, cs=%d\n", __func__, plat, plat->cs);
228 		if (plat->cs == cs) {
229 			*devp = dev;
230 			return 0;
231 		}
232 	}
233 
234 	return -ENODEV;
235 }
236 
spi_cs_is_valid(unsigned int busnum,unsigned int cs)237 int spi_cs_is_valid(unsigned int busnum, unsigned int cs)
238 {
239 	struct spi_cs_info info;
240 	struct udevice *bus;
241 	int ret;
242 
243 	ret = uclass_find_device_by_seq(UCLASS_SPI, busnum, false, &bus);
244 	if (ret) {
245 		debug("%s: No bus %d\n", __func__, busnum);
246 		return ret;
247 	}
248 
249 	return spi_cs_info(bus, cs, &info);
250 }
251 
spi_cs_info(struct udevice * bus,uint cs,struct spi_cs_info * info)252 int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info)
253 {
254 	struct spi_cs_info local_info;
255 	struct dm_spi_ops *ops;
256 	int ret;
257 
258 	if (!info)
259 		info = &local_info;
260 
261 	/* If there is a device attached, return it */
262 	info->dev = NULL;
263 	ret = spi_find_chip_select(bus, cs, &info->dev);
264 	if (!ret)
265 		return 0;
266 
267 	/*
268 	 * Otherwise ask the driver. For the moment we don't have CS info.
269 	 * When we do we could provide the driver with a helper function
270 	 * to figure out what chip selects are valid, or just handle the
271 	 * request.
272 	 */
273 	ops = spi_get_ops(bus);
274 	if (ops->cs_info)
275 		return ops->cs_info(bus, cs, info);
276 
277 	/*
278 	 * We could assume there is at least one valid chip select.
279 	 * The driver didn't care enough to tell us.
280 	 */
281 	return 0;
282 }
283 
spi_find_bus_and_cs(int busnum,int cs,struct udevice ** busp,struct udevice ** devp)284 int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
285 			struct udevice **devp)
286 {
287 	struct udevice *bus, *dev;
288 	int ret;
289 
290 	ret = uclass_find_device_by_seq(UCLASS_SPI, busnum, false, &bus);
291 	if (ret) {
292 		debug("%s: No bus %d\n", __func__, busnum);
293 		return ret;
294 	}
295 	ret = spi_find_chip_select(bus, cs, &dev);
296 	if (ret) {
297 		debug("%s: No cs %d\n", __func__, cs);
298 		return ret;
299 	}
300 	*busp = bus;
301 	*devp = dev;
302 
303 	return ret;
304 }
305 
spi_get_bus_and_cs(int busnum,int cs,int speed,int mode,const char * drv_name,const char * dev_name,struct udevice ** busp,struct spi_slave ** devp)306 int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
307 		       const char *drv_name, const char *dev_name,
308 		       struct udevice **busp, struct spi_slave **devp)
309 {
310 	struct udevice *bus, *dev;
311 	struct dm_spi_slave_platdata *plat;
312 	bool created = false;
313 	int ret;
314 
315 #if CONFIG_IS_ENABLED(OF_PLATDATA)
316 	ret = uclass_first_device_err(UCLASS_SPI, &bus);
317 #else
318 	ret = uclass_get_device_by_seq(UCLASS_SPI, busnum, &bus);
319 #endif
320 	if (ret) {
321 		printf("Invalid bus %d (err=%d)\n", busnum, ret);
322 		return ret;
323 	}
324 	ret = spi_find_chip_select(bus, cs, &dev);
325 
326 	/*
327 	 * If there is no such device, create one automatically. This means
328 	 * that we don't need a device tree node or platform data for the
329 	 * SPI flash chip - we will bind to the correct driver.
330 	 */
331 	if (ret == -ENODEV && drv_name) {
332 		debug("%s: Binding new device '%s', busnum=%d, cs=%d, driver=%s\n",
333 		      __func__, dev_name, busnum, cs, drv_name);
334 		ret = device_bind_driver(bus, drv_name, dev_name, &dev);
335 		if (ret) {
336 			debug("%s: Unable to bind driver (ret=%d)\n", __func__,
337 			      ret);
338 			return ret;
339 		}
340 		plat = dev_get_parent_platdata(dev);
341 		plat->cs = cs;
342 		if (speed) {
343 			plat->max_hz = speed;
344 		} else {
345 			printf("Warning: SPI speed fallback to %u kHz\n",
346 			       SPI_DEFAULT_SPEED_HZ / 1000);
347 			plat->max_hz = SPI_DEFAULT_SPEED_HZ;
348 		}
349 		plat->mode = mode;
350 		created = true;
351 	} else if (ret) {
352 		printf("Invalid chip select %d:%d (err=%d)\n", busnum, cs,
353 		       ret);
354 		return ret;
355 	}
356 
357 	if (!device_active(dev)) {
358 		struct spi_slave *slave;
359 
360 		ret = device_probe(dev);
361 		if (ret)
362 			goto err;
363 		slave = dev_get_parent_priv(dev);
364 		slave->dev = dev;
365 	}
366 
367 	plat = dev_get_parent_platdata(dev);
368 
369 	/* get speed and mode from platdata when available */
370 	if (plat->max_hz) {
371 		speed = plat->max_hz;
372 		mode = plat->mode;
373 	}
374 	ret = spi_set_speed_mode(bus, speed, mode);
375 	if (ret)
376 		goto err;
377 
378 	*busp = bus;
379 	*devp = dev_get_parent_priv(dev);
380 	debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp);
381 
382 	return 0;
383 
384 err:
385 	debug("%s: Error path, created=%d, device '%s'\n", __func__,
386 	      created, dev->name);
387 	if (created) {
388 		device_remove(dev, DM_REMOVE_NORMAL);
389 		device_unbind(dev);
390 	}
391 
392 	return ret;
393 }
394 
395 /* Compatibility function - to be removed */
spi_setup_slave(unsigned int busnum,unsigned int cs,unsigned int speed,unsigned int mode)396 struct spi_slave *spi_setup_slave(unsigned int busnum, unsigned int cs,
397 				  unsigned int speed, unsigned int mode)
398 {
399 	struct spi_slave *slave;
400 	struct udevice *dev;
401 	int ret;
402 
403 	ret = spi_get_bus_and_cs(busnum, cs, speed, mode, NULL, 0, &dev,
404 				 &slave);
405 	if (ret)
406 		return NULL;
407 
408 	return slave;
409 }
410 
spi_free_slave(struct spi_slave * slave)411 void spi_free_slave(struct spi_slave *slave)
412 {
413 	device_remove(slave->dev, DM_REMOVE_NORMAL);
414 	slave->dev = NULL;
415 }
416 
spi_slave_ofdata_to_platdata(struct udevice * dev,struct dm_spi_slave_platdata * plat)417 int spi_slave_ofdata_to_platdata(struct udevice *dev,
418 				 struct dm_spi_slave_platdata *plat)
419 {
420 	int mode = 0;
421 	int value;
422 
423 	plat->cs = dev_read_u32_default(dev, "reg", -1);
424 	plat->max_hz = dev_read_u32_default(dev, "spi-max-frequency",
425 					    SPI_DEFAULT_SPEED_HZ);
426 	if (dev_read_bool(dev, "spi-cpol"))
427 		mode |= SPI_CPOL;
428 	if (dev_read_bool(dev, "spi-cpha"))
429 		mode |= SPI_CPHA;
430 	if (dev_read_bool(dev, "spi-cs-high"))
431 		mode |= SPI_CS_HIGH;
432 	if (dev_read_bool(dev, "spi-3wire"))
433 		mode |= SPI_3WIRE;
434 	if (dev_read_bool(dev, "spi-half-duplex"))
435 		mode |= SPI_PREAMBLE;
436 
437 	/* Device DUAL/QUAD mode */
438 	value = dev_read_u32_default(dev, "spi-tx-bus-width", 1);
439 	switch (value) {
440 	case 1:
441 		break;
442 	case 2:
443 		mode |= SPI_TX_DUAL;
444 		break;
445 	case 4:
446 		mode |= SPI_TX_QUAD;
447 		break;
448 	default:
449 		warn_non_spl("spi-tx-bus-width %d not supported\n", value);
450 		break;
451 	}
452 
453 	value = dev_read_u32_default(dev, "spi-rx-bus-width", 1);
454 	switch (value) {
455 	case 1:
456 		break;
457 	case 2:
458 		mode |= SPI_RX_DUAL;
459 		break;
460 	case 4:
461 		mode |= SPI_RX_QUAD;
462 		break;
463 	default:
464 		warn_non_spl("spi-rx-bus-width %d not supported\n", value);
465 		break;
466 	}
467 
468 	plat->mode = mode;
469 
470 	return 0;
471 }
472 
473 UCLASS_DRIVER(spi) = {
474 	.id		= UCLASS_SPI,
475 	.name		= "spi",
476 	.flags		= DM_UC_FLAG_SEQ_ALIAS,
477 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
478 	.post_bind	= dm_scan_fdt_dev,
479 #endif
480 	.post_probe	= spi_post_probe,
481 	.child_pre_probe = spi_child_pre_probe,
482 	.per_device_auto_alloc_size = sizeof(struct dm_spi_bus),
483 	.per_child_auto_alloc_size = sizeof(struct spi_slave),
484 	.per_child_platdata_auto_alloc_size =
485 			sizeof(struct dm_spi_slave_platdata),
486 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
487 	.child_post_bind = spi_child_post_bind,
488 #endif
489 };
490 
491 UCLASS_DRIVER(spi_generic) = {
492 	.id		= UCLASS_SPI_GENERIC,
493 	.name		= "spi_generic",
494 };
495 
496 U_BOOT_DRIVER(spi_generic_drv) = {
497 	.name		= "spi_generic_drv",
498 	.id		= UCLASS_SPI_GENERIC,
499 };
500