Skip to content

Commit 7735d13

Browse files
committed
Fixup the SPI device pre-alloc
May the bus is a QSPI, we should check the mode before alloc the SPI device. The raw API the SPI mode default but the SPI DM bus probe run before the SPI mode confirm, we should move the SPI register API alone, then confirm the bus mode before register. Signed-off-by: GuEe-GUI <[email protected]>
1 parent e165fcc commit 7735d13

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

components/drivers/spi/dev_qspi_core.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010

1111
#include "drivers/dev_spi.h"
1212

13+
extern rt_err_t spi_bus_register(struct rt_spi_bus *bus,
14+
const char *name,
15+
const struct rt_spi_ops *ops);
16+
1317
rt_err_t rt_qspi_configure(struct rt_qspi_device *device, struct rt_qspi_configuration *cfg)
1418
{
1519
RT_ASSERT(device != RT_NULL);
@@ -67,16 +71,10 @@ rt_err_t rt_qspi_configure(struct rt_qspi_device *device, struct rt_qspi_configu
6771

6872
rt_err_t rt_qspi_bus_register(struct rt_spi_bus *bus, const char *name, const struct rt_spi_ops *ops)
6973
{
70-
rt_err_t result = RT_EOK;
74+
/* set SPI bus to qspi modes */
75+
bus->mode = RT_SPI_BUS_MODE_QSPI;
7176

72-
result = rt_spi_bus_register(bus, name, ops);
73-
if(result == RT_EOK)
74-
{
75-
/* set SPI bus to qspi modes */
76-
bus->mode = RT_SPI_BUS_MODE_QSPI;
77-
}
78-
79-
return result;
77+
return spi_bus_register(bus, name, ops);
8078
}
8179

8280
rt_size_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qspi_message *message)

components/drivers/spi/dev_spi_bus.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,19 @@ void spi_bus_scan_devices(struct rt_spi_bus *bus)
3434
continue;
3535
}
3636

37-
spi_dev = rt_calloc(1, sizeof(*spi_dev));
37+
if ((bus->mode & RT_SPI_BUS_MODE_SPI) == RT_SPI_BUS_MODE_SPI)
38+
{
39+
spi_dev = rt_calloc(1, sizeof(struct rt_spi_device));
40+
}
41+
else if ((bus->mode & RT_SPI_BUS_MODE_QSPI) == RT_SPI_BUS_MODE_QSPI)
42+
{
43+
spi_dev = rt_calloc(1, sizeof(struct rt_qspi_device));
44+
}
45+
else
46+
{
47+
LOG_E("Unknown bus mode = %x", bus->mode);
48+
RT_ASSERT(0);
49+
}
3850

3951
if (!spi_dev)
4052
{

components/drivers/spi/dev_spi_core.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
extern rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name);
2727
extern rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name);
2828

29-
rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus,
30-
const char *name,
31-
const struct rt_spi_ops *ops)
29+
rt_err_t spi_bus_register(struct rt_spi_bus *bus,
30+
const char *name,
31+
const struct rt_spi_ops *ops)
3232
{
3333
rt_err_t result;
3434

@@ -42,8 +42,6 @@ rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus,
4242
bus->ops = ops;
4343
/* initialize owner */
4444
bus->owner = RT_NULL;
45-
/* set bus mode */
46-
bus->mode = RT_SPI_BUS_MODE_SPI;
4745

4846
#ifdef RT_USING_DM
4947
if (!bus->slave)
@@ -77,6 +75,16 @@ rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus,
7775
return RT_EOK;
7876
}
7977

78+
rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus,
79+
const char *name,
80+
const struct rt_spi_ops *ops)
81+
{
82+
/* set bus mode */
83+
bus->mode = RT_SPI_BUS_MODE_SPI;
84+
85+
return spi_bus_register(bus, name, ops);
86+
}
87+
8088
rt_err_t rt_spi_bus_attach_device_cspin(struct rt_spi_device *device,
8189
const char *name,
8290
const char *bus_name,

0 commit comments

Comments
 (0)