xref: /openbmc/u-boot/drivers/mtd/spi/sf-uclass.c (revision 4c2dbefde58917205af51a2c20b3069e01e55cf4)
1*4c2dbefdSSimon Glass /*
2*4c2dbefdSSimon Glass  * Copyright (c) 2014 Google, Inc
3*4c2dbefdSSimon Glass  *
4*4c2dbefdSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
5*4c2dbefdSSimon Glass  */
6*4c2dbefdSSimon Glass 
7*4c2dbefdSSimon Glass #include <common.h>
8*4c2dbefdSSimon Glass #include <dm.h>
9*4c2dbefdSSimon Glass #include <spi.h>
10*4c2dbefdSSimon Glass #include <spi_flash.h>
11*4c2dbefdSSimon Glass #include <dm/device-internal.h>
12*4c2dbefdSSimon Glass #include "sf_internal.h"
13*4c2dbefdSSimon Glass 
14*4c2dbefdSSimon Glass /*
15*4c2dbefdSSimon Glass  * TODO(sjg@chromium.org): This is an old-style function. We should remove
16*4c2dbefdSSimon Glass  * it when all SPI flash drivers use dm
17*4c2dbefdSSimon Glass  */
18*4c2dbefdSSimon Glass struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
19*4c2dbefdSSimon Glass 				  unsigned int max_hz, unsigned int spi_mode)
20*4c2dbefdSSimon Glass {
21*4c2dbefdSSimon Glass 	struct udevice *dev;
22*4c2dbefdSSimon Glass 
23*4c2dbefdSSimon Glass 	if (spi_flash_probe_bus_cs(bus, cs, max_hz, spi_mode, &dev))
24*4c2dbefdSSimon Glass 		return NULL;
25*4c2dbefdSSimon Glass 
26*4c2dbefdSSimon Glass 	return dev->uclass_priv;
27*4c2dbefdSSimon Glass }
28*4c2dbefdSSimon Glass 
29*4c2dbefdSSimon Glass void spi_flash_free(struct spi_flash *flash)
30*4c2dbefdSSimon Glass {
31*4c2dbefdSSimon Glass 	spi_flash_remove(flash->spi->dev);
32*4c2dbefdSSimon Glass }
33*4c2dbefdSSimon Glass 
34*4c2dbefdSSimon Glass int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs,
35*4c2dbefdSSimon Glass 			   unsigned int max_hz, unsigned int spi_mode,
36*4c2dbefdSSimon Glass 			   struct udevice **devp)
37*4c2dbefdSSimon Glass {
38*4c2dbefdSSimon Glass 	struct spi_slave *slave;
39*4c2dbefdSSimon Glass 	struct udevice *bus;
40*4c2dbefdSSimon Glass 	char name[20], *str;
41*4c2dbefdSSimon Glass 	int ret;
42*4c2dbefdSSimon Glass 
43*4c2dbefdSSimon Glass 	snprintf(name, sizeof(name), "%d:%d", busnum, cs);
44*4c2dbefdSSimon Glass 	str = strdup(name);
45*4c2dbefdSSimon Glass 	ret = spi_get_bus_and_cs(busnum, cs, max_hz, spi_mode,
46*4c2dbefdSSimon Glass 				  "spi_flash_std", str, &bus, &slave);
47*4c2dbefdSSimon Glass 	if (ret)
48*4c2dbefdSSimon Glass 		return ret;
49*4c2dbefdSSimon Glass 
50*4c2dbefdSSimon Glass 	*devp = slave->dev;
51*4c2dbefdSSimon Glass 	return 0;
52*4c2dbefdSSimon Glass }
53*4c2dbefdSSimon Glass 
54*4c2dbefdSSimon Glass int spi_flash_remove(struct udevice *dev)
55*4c2dbefdSSimon Glass {
56*4c2dbefdSSimon Glass 	return device_remove(dev);
57*4c2dbefdSSimon Glass }
58*4c2dbefdSSimon Glass 
59*4c2dbefdSSimon Glass UCLASS_DRIVER(spi_flash) = {
60*4c2dbefdSSimon Glass 	.id		= UCLASS_SPI_FLASH,
61*4c2dbefdSSimon Glass 	.name		= "spi_flash",
62*4c2dbefdSSimon Glass 	.per_device_auto_alloc_size = sizeof(struct spi_flash),
63*4c2dbefdSSimon Glass };
64