gpio: mcp23s17: convert to `spi_dt_spec`
Convery mcp12s17 GPIO driver to `spi_dt_spec`. Also perform some minor
cleanup on non-standard device data pointers.
Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
diff --git a/drivers/gpio/gpio_mcp23s17.c b/drivers/gpio/gpio_mcp23s17.c
index 86809a6..c152fda 100644
--- a/drivers/gpio/gpio_mcp23s17.c
+++ b/drivers/gpio/gpio_mcp23s17.c
@@ -40,8 +40,7 @@
static int read_port_regs(const struct device *dev, uint8_t reg,
uint16_t *buf)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ const struct mcp23s17_config *config = dev->config;
int ret;
uint16_t port_data;
@@ -71,7 +70,7 @@
.count = ARRAY_SIZE(rx_buf),
};
- ret = spi_transceive(drv_data->spi, &drv_data->spi_cfg, &tx, &rx);
+ ret = spi_transceive_dt(&config->bus, &tx, &rx);
if (ret) {
LOG_DBG("spi_transceive FAIL %d\n", ret);
return ret;
@@ -99,8 +98,7 @@
static int write_port_regs(const struct device *dev, uint8_t reg,
uint16_t value)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ const struct mcp23s17_config *config = dev->config;
int ret;
uint16_t port_data;
@@ -127,7 +125,7 @@
.count = ARRAY_SIZE(tx_buf),
};
- ret = spi_write(drv_data->spi, &drv_data->spi_cfg, &tx);
+ ret = spi_write_dt(&config->bus, &tx);
if (ret) {
LOG_DBG("spi_write FAIL %d\n", ret);
return ret;
@@ -147,8 +145,7 @@
*/
static int setup_pin_dir(const struct device *dev, uint32_t pin, int flags)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ struct mcp23s17_drv_data *drv_data = dev->data;
uint16_t *dir = &drv_data->reg_cache.iodir;
uint16_t *output = &drv_data->reg_cache.gpio;
int ret;
@@ -186,8 +183,7 @@
static int setup_pin_pullupdown(const struct device *dev, uint32_t pin,
int flags)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ struct mcp23s17_drv_data *drv_data = dev->data;
uint16_t port;
int ret;
@@ -212,8 +208,7 @@
static int mcp23s17_config(const struct device *dev,
gpio_pin_t pin, gpio_flags_t flags)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ struct mcp23s17_drv_data *drv_data = dev->data;
int ret;
/* Can't do SPI bus operations from an ISR */
@@ -247,8 +242,7 @@
static int mcp23s17_port_get_raw(const struct device *dev, uint32_t *value)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ struct mcp23s17_drv_data *drv_data = dev->data;
uint16_t buf;
int ret;
@@ -274,8 +268,7 @@
static int mcp23s17_port_set_masked_raw(const struct device *dev,
uint32_t mask, uint32_t value)
{
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ struct mcp23s17_drv_data *drv_data = dev->data;
uint16_t buf;
int ret;
@@ -363,90 +356,54 @@
*/
static int mcp23s17_init(const struct device *dev)
{
- const struct mcp23s17_config *const config =
- dev->config;
- struct mcp23s17_drv_data *const drv_data =
- (struct mcp23s17_drv_data *const)dev->data;
+ const struct mcp23s17_config *config = dev->config;
+ struct mcp23s17_drv_data *drv_data = dev->data;
- drv_data->spi = device_get_binding((char *)config->spi_dev_name);
- if (!drv_data->spi) {
- LOG_DBG("Unable to get SPI device");
+ if (!spi_is_ready(&config->bus)) {
+ LOG_ERR("SPI bus %s not ready", config->bus.bus->name);
return -ENODEV;
}
- if (config->cs_dev) {
- /* handle SPI CS thru GPIO if it is the case */
- drv_data->mcp23s17_cs_ctrl.gpio_dev =
- device_get_binding(config->cs_dev);
- if (!drv_data->mcp23s17_cs_ctrl.gpio_dev) {
- LOG_ERR("Unable to get GPIO SPI CS device");
- return -ENODEV;
- }
-
- drv_data->mcp23s17_cs_ctrl.gpio_pin = config->cs_pin;
- drv_data->mcp23s17_cs_ctrl.gpio_dt_flags = config->cs_flags;
- drv_data->mcp23s17_cs_ctrl.delay = 0;
-
- drv_data->spi_cfg.cs = &drv_data->mcp23s17_cs_ctrl;
-
- LOG_DBG("SPI GPIO CS configured on %s:%u",
- config->cs_dev, config->cs_pin);
- }
-
- drv_data->spi_cfg.frequency = config->freq;
- drv_data->spi_cfg.operation = (SPI_OP_MODE_MASTER | SPI_MODE_CPOL |
- SPI_MODE_CPHA | SPI_WORD_SET(8) |
- SPI_LINES_SINGLE);
- drv_data->spi_cfg.slave = config->slave;
-
k_sem_init(&drv_data->lock, 1, 1);
return 0;
}
-#define MCP23S17_INIT(inst) \
- static struct mcp23s17_config mcp23s17_##inst##_config = { \
- .common = { \
- .port_pin_mask = \
- GPIO_PORT_PIN_MASK_FROM_DT_INST(inst), \
- }, \
- .spi_dev_name = DT_INST_BUS_LABEL(inst), \
- .slave = DT_INST_REG_ADDR(inst), \
- .freq = DT_INST_PROP(inst, spi_max_frequency), \
- \
- IF_ENABLED(DT_INST_SPI_DEV_HAS_CS_GPIOS(inst), \
- (.cs_dev = \
- DT_INST_SPI_DEV_CS_GPIOS_LABEL(inst),)) \
- IF_ENABLED(DT_INST_SPI_DEV_HAS_CS_GPIOS(inst), \
- (.cs_pin = \
- DT_INST_SPI_DEV_CS_GPIOS_PIN(inst),)) \
- IF_ENABLED(DT_INST_SPI_DEV_HAS_CS_GPIOS(inst), \
- (.cs_flags = \
- DT_INST_SPI_DEV_CS_GPIOS_FLAGS(inst),)) \
- }; \
- \
- static struct mcp23s17_drv_data mcp23s17_##inst##_drvdata = { \
- /* Default for registers according to datasheet */ \
- .reg_cache.iodir = 0xFFFF, \
- .reg_cache.ipol = 0x0, \
- .reg_cache.gpinten = 0x0, \
- .reg_cache.defval = 0x0, \
- .reg_cache.intcon = 0x0, \
- .reg_cache.iocon = 0x0, \
- .reg_cache.gppu = 0x0, \
- .reg_cache.intf = 0x0, \
- .reg_cache.intcap = 0x0, \
- .reg_cache.gpio = 0x0, \
- .reg_cache.olat = 0x0, \
- }; \
- \
- /* This has to init after SPI master */ \
- DEVICE_DT_INST_DEFINE(inst, mcp23s17_init, \
- NULL, \
- &mcp23s17_##inst##_drvdata, \
- &mcp23s17_##inst##_config, \
- POST_KERNEL, \
- CONFIG_GPIO_MCP23S17_INIT_PRIORITY, \
- &api_table);
+#define MCP23S17_INIT(inst) \
+ static const struct mcp23s17_config mcp23s17_##inst##_config = { \
+ .common = { \
+ .port_pin_mask = \
+ GPIO_PORT_PIN_MASK_FROM_DT_INST(inst), \
+ }, \
+ .bus = SPI_DT_SPEC_INST_GET( \
+ inst, \
+ SPI_OP_MODE_MASTER | SPI_MODE_CPOL | \
+ SPI_MODE_CPHA | SPI_WORD_SET(8) | \
+ SPI_LINES_SINGLE, 0), \
+ }; \
+ \
+ static struct mcp23s17_drv_data mcp23s17_##inst##_drvdata = { \
+ /* Default for registers according to datasheet */ \
+ .reg_cache.iodir = 0xFFFF, \
+ .reg_cache.ipol = 0x0, \
+ .reg_cache.gpinten = 0x0, \
+ .reg_cache.defval = 0x0, \
+ .reg_cache.intcon = 0x0, \
+ .reg_cache.iocon = 0x0, \
+ .reg_cache.gppu = 0x0, \
+ .reg_cache.intf = 0x0, \
+ .reg_cache.intcap = 0x0, \
+ .reg_cache.gpio = 0x0, \
+ .reg_cache.olat = 0x0, \
+ }; \
+ \
+ /* This has to init after SPI master */ \
+ DEVICE_DT_INST_DEFINE(inst, mcp23s17_init, \
+ NULL, \
+ &mcp23s17_##inst##_drvdata, \
+ &mcp23s17_##inst##_config, \
+ POST_KERNEL, \
+ CONFIG_GPIO_MCP23S17_INIT_PRIORITY, \
+ &api_table);
DT_INST_FOREACH_STATUS_OKAY(MCP23S17_INIT)
diff --git a/drivers/gpio/gpio_mcp23s17.h b/drivers/gpio/gpio_mcp23s17.h
index 2827822..e40acf2 100644
--- a/drivers/gpio/gpio_mcp23s17.h
+++ b/drivers/gpio/gpio_mcp23s17.h
@@ -50,12 +50,7 @@
/* gpio_driver_data needs to be first */
struct gpio_driver_config common;
- const char *const spi_dev_name;
- const uint16_t slave;
- const uint32_t freq;
- const char *const cs_dev;
- const uint32_t cs_pin;
- const uint8_t cs_flags;
+ struct spi_dt_spec bus;
};
/** Runtime driver data */
@@ -63,11 +58,6 @@
/* gpio_driver_data needs to be first */
struct gpio_driver_config data;
- /** Master SPI device */
- const struct device *spi;
- struct spi_config spi_cfg;
- struct spi_cs_control mcp23s17_cs_ctrl;
-
struct k_sem lock;
struct {