dm: spi: Check cs number before accessing slaves
Add chip select number check in spi_find_chip_select(). Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Jagan Teki <jagan@amarulasolutions.com> # SoPine
This commit is contained in:
parent
383fded70c
commit
7bacce524d
@ -224,7 +224,32 @@ int spi_chip_select(struct udevice *dev)
|
|||||||
|
|
||||||
int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp)
|
int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp)
|
||||||
{
|
{
|
||||||
|
struct dm_spi_ops *ops;
|
||||||
|
struct spi_cs_info info;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ask the driver. For the moment we don't have CS info.
|
||||||
|
* When we do we could provide the driver with a helper function
|
||||||
|
* to figure out what chip selects are valid, or just handle the
|
||||||
|
* request.
|
||||||
|
*/
|
||||||
|
ops = spi_get_ops(bus);
|
||||||
|
if (ops->cs_info) {
|
||||||
|
ret = ops->cs_info(bus, cs, &info);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* We could assume there is at least one valid chip select.
|
||||||
|
* The driver didn't care enough to tell us.
|
||||||
|
*/
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
printf("Invalid cs %d (err=%d)\n", cs, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
for (device_find_first_child(bus, &dev); dev;
|
for (device_find_first_child(bus, &dev); dev;
|
||||||
device_find_next_child(&dev)) {
|
device_find_next_child(&dev)) {
|
||||||
@ -259,7 +284,6 @@ int spi_cs_is_valid(unsigned int busnum, unsigned int cs)
|
|||||||
int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info)
|
int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info)
|
||||||
{
|
{
|
||||||
struct spi_cs_info local_info;
|
struct spi_cs_info local_info;
|
||||||
struct dm_spi_ops *ops;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!info)
|
if (!info)
|
||||||
@ -268,24 +292,7 @@ int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info)
|
|||||||
/* If there is a device attached, return it */
|
/* If there is a device attached, return it */
|
||||||
info->dev = NULL;
|
info->dev = NULL;
|
||||||
ret = spi_find_chip_select(bus, cs, &info->dev);
|
ret = spi_find_chip_select(bus, cs, &info->dev);
|
||||||
if (!ret)
|
return ret == -ENODEV ? 0 : ret;
|
||||||
return 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Otherwise ask the driver. For the moment we don't have CS info.
|
|
||||||
* When we do we could provide the driver with a helper function
|
|
||||||
* to figure out what chip selects are valid, or just handle the
|
|
||||||
* request.
|
|
||||||
*/
|
|
||||||
ops = spi_get_ops(bus);
|
|
||||||
if (ops->cs_info)
|
|
||||||
return ops->cs_info(bus, cs, info);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We could assume there is at least one valid chip select.
|
|
||||||
* The driver didn't care enough to tell us.
|
|
||||||
*/
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
|
int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
|
||||||
|
@ -561,7 +561,8 @@ int spi_chip_select(struct udevice *slave);
|
|||||||
* @bus: SPI bus to search
|
* @bus: SPI bus to search
|
||||||
* @cs: Chip select to look for
|
* @cs: Chip select to look for
|
||||||
* @devp: Returns the slave device if found
|
* @devp: Returns the slave device if found
|
||||||
* @return 0 if found, -ENODEV on error
|
* @return 0 if found, -EINVAL if cs is invalid, -ENODEV if no device attached,
|
||||||
|
* other -ve value on error
|
||||||
*/
|
*/
|
||||||
int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp);
|
int spi_find_chip_select(struct udevice *bus, int cs, struct udevice **devp);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user