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 {