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