drivers: sensor: ccs811: Update driver to use i2c_dt_spec

Simplify driver by using i2c_dt_spec for bus access.

Signed-off-by: Benjamin Björnsson <benjamin.bjornsson@gmail.com>
diff --git a/drivers/sensor/ccs811/ccs811.c b/drivers/sensor/ccs811/ccs811.c
index 29a1af5..1b71e8b 100644
--- a/drivers/sensor/ccs811/ccs811.c
+++ b/drivers/sensor/ccs811/ccs811.c
@@ -46,12 +46,11 @@
  */
 static int fetch_status(const struct device *dev)
 {
-	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	uint8_t status;
 	int rv;
 
-	if (i2c_reg_read_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
-			      CCS811_REG_STATUS, &status) < 0) {
+	if (i2c_reg_read_byte_dt(&config->i2c, CCS811_REG_STATUS, &status) < 0) {
 		LOG_ERR("Failed to read Status register");
 		return -EIO;
 	}
@@ -60,8 +59,7 @@
 	if (status & CCS811_STATUS_ERROR) {
 		uint8_t error_id;
 
-		if (i2c_reg_read_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
-				      CCS811_REG_ERROR_ID, &error_id) < 0) {
+		if (i2c_reg_read_byte_dt(&config->i2c, CCS811_REG_ERROR_ID, &error_id) < 0) {
 			LOG_ERR("Failed to read ERROR_ID register");
 			return -EIO;
 		}
@@ -88,6 +86,7 @@
 			   struct ccs811_configver_type *ptr)
 {
 	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	uint8_t cmd;
 	int rc;
 
@@ -97,24 +96,21 @@
 
 	set_wake(dev, true);
 	cmd = CCS811_REG_HW_VERSION;
-	rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
-			    &cmd, sizeof(cmd),
-			    &ptr->hw_version, sizeof(ptr->hw_version));
+	rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), &ptr->hw_version,
+			       sizeof(ptr->hw_version));
 	if (rc == 0) {
 		cmd = CCS811_REG_FW_BOOT_VERSION;
-		rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
-				    &cmd, sizeof(cmd),
-				    (uint8_t *)&ptr->fw_boot_version,
-				    sizeof(ptr->fw_boot_version));
+		rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd),
+				       (uint8_t *)&ptr->fw_boot_version,
+				       sizeof(ptr->fw_boot_version));
 		ptr->fw_boot_version = sys_be16_to_cpu(ptr->fw_boot_version);
 	}
 
 	if (rc == 0) {
 		cmd = CCS811_REG_FW_APP_VERSION;
-		rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
-				    &cmd, sizeof(cmd),
-				    (uint8_t *)&ptr->fw_app_version,
-				    sizeof(ptr->fw_app_version));
+		rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd),
+				       (uint8_t *)&ptr->fw_app_version,
+				       sizeof(ptr->fw_app_version));
 		ptr->fw_app_version = sys_be16_to_cpu(ptr->fw_app_version);
 	}
 	if (rc == 0) {
@@ -132,15 +128,14 @@
 int ccs811_baseline_fetch(const struct device *dev)
 {
 	const uint8_t cmd = CCS811_REG_BASELINE;
-	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	int rc;
 	uint16_t baseline;
 
 	set_wake(dev, true);
 
-	rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
-			    &cmd, sizeof(cmd),
-			    (uint8_t *)&baseline, sizeof(baseline));
+	rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), (uint8_t *)&baseline,
+			       sizeof(baseline));
 	set_wake(dev, false);
 	if (rc <= 0) {
 		rc = baseline;
@@ -152,14 +147,14 @@
 int ccs811_baseline_update(const struct device *dev,
 			   uint16_t baseline)
 {
-	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	uint8_t buf[1 + sizeof(baseline)];
 	int rc;
 
 	buf[0] = CCS811_REG_BASELINE;
 	memcpy(buf + 1, &baseline, sizeof(baseline));
 	set_wake(dev, true);
-	rc = i2c_write(drv_data->i2c, buf, sizeof(buf), DT_INST_REG_ADDR(0));
+	rc = i2c_write_dt(&config->i2c, buf, sizeof(buf));
 	set_wake(dev, false);
 	return rc;
 }
@@ -168,7 +163,7 @@
 			  const struct sensor_value *temperature,
 			  const struct sensor_value *humidity)
 {
-	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	int rc;
 	uint8_t buf[5] = { CCS811_REG_ENV_DATA };
 
@@ -227,7 +222,7 @@
 	}
 
 	set_wake(dev, true);
-	rc = i2c_write(drv_data->i2c, buf, sizeof(buf), DT_INST_REG_ADDR(0));
+	rc = i2c_write_dt(&config->i2c, buf, sizeof(buf));
 	set_wake(dev, false);
 	return rc;
 }
@@ -236,6 +231,7 @@
 			       enum sensor_channel chan)
 {
 	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	struct ccs811_result_type *rp = &drv_data->result;
 	const uint8_t cmd = CCS811_REG_ALG_RESULT_DATA;
 	int rc;
@@ -243,9 +239,7 @@
 	unsigned int status;
 
 	set_wake(dev, true);
-	rc = i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
-			    &cmd, sizeof(cmd),
-			    (uint8_t *)buf, sizeof(buf));
+	rc = i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), (uint8_t *)buf, sizeof(buf));
 	set_wake(dev, false);
 	if (rc < 0) {
 		return -EIO;
@@ -328,7 +322,7 @@
 
 static int switch_to_app_mode(const struct device *dev)
 {
-	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	uint8_t buf;
 	int status;
 
@@ -353,7 +347,7 @@
 
 	buf = CCS811_REG_APP_START;
 	/* Set the device to application mode */
-	if (i2c_write(drv_data->i2c, &buf, 1, DT_INST_REG_ADDR(0)) < 0) {
+	if (i2c_write_dt(&config->i2c, &buf, 1) < 0) {
 		LOG_ERR("Failed to set Application mode");
 		return -EIO;
 	}
@@ -382,6 +376,7 @@
 			    uint8_t clear)
 {
 	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	int rc = 0;
 	uint8_t mode = set | (drv_data->mode & ~clear);
 
@@ -395,9 +390,7 @@
 
 	if (mode != drv_data->mode) {
 		set_wake(dev, true);
-		rc = i2c_reg_write_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
-					CCS811_REG_MEAS_MODE,
-					mode);
+		rc = i2c_reg_write_byte_dt(&config->i2c, CCS811_REG_MEAS_MODE, mode);
 		LOG_DBG("CCS811 meas mode change %02x to %02x got %d",
 			drv_data->mode, mode, rc);
 		if (rc < 0) {
@@ -417,6 +410,7 @@
 int ccs811_set_thresholds(const struct device *dev)
 {
 	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	const uint8_t buf[5] = {
 		CCS811_REG_THRESHOLDS,
 		drv_data->co2_l2m >> 8,
@@ -427,7 +421,7 @@
 	int rc;
 
 	set_wake(dev, true);
-	rc = i2c_write(drv_data->i2c, buf, sizeof(buf), DT_INST_REG_ADDR(0));
+	rc = i2c_write_dt(&config->i2c, buf, sizeof(buf));
 	set_wake(dev, false);
 	return rc;
 }
@@ -437,18 +431,16 @@
 static int ccs811_init(const struct device *dev)
 {
 	struct ccs811_data *drv_data = dev->data;
+	const struct ccs811_config *config = dev->config;
 	int ret = 0;
 	int status;
 	uint16_t fw_ver;
 	uint8_t cmd;
 	uint8_t hw_id;
 
-	*drv_data = (struct ccs811_data){ 0 };
-	drv_data->i2c = device_get_binding(DT_INST_BUS_LABEL(0));
-	if (drv_data->i2c == NULL) {
-		LOG_ERR("Failed to get pointer to %s device!",
-			DT_INST_BUS_LABEL(0));
-		return -EINVAL;
+	if (!device_is_ready(config->i2c.bus)) {
+		LOG_ERR("I2C bus device not ready");
+		return -ENODEV;
 	}
 
 #if DT_INST_NODE_HAS_PROP(0, wake_gpios)
@@ -510,8 +502,7 @@
 			0xFF, 0x11, 0xE5, 0x72, 0x8A,
 		};
 
-		if (i2c_write(drv_data->i2c, reset_seq, sizeof(reset_seq),
-			      DT_INST_REG_ADDR(0)) < 0) {
+		if (i2c_write_dt(&config->i2c, reset_seq, sizeof(reset_seq)) < 0) {
 			LOG_ERR("Failed to issue SW reset");
 			ret = -EIO;
 			goto out;
@@ -527,8 +518,7 @@
 	}
 
 	/* Check Hardware ID */
-	if (i2c_reg_read_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
-			      CCS811_REG_HW_ID, &hw_id) < 0) {
+	if (i2c_reg_read_byte_dt(&config->i2c, CCS811_REG_HW_ID, &hw_id) < 0) {
 		LOG_ERR("Failed to read Hardware ID register");
 		ret = -EIO;
 		goto out;
@@ -542,9 +532,7 @@
 
 	/* Check application firmware version (first byte) */
 	cmd = CCS811_REG_FW_APP_VERSION;
-	if (i2c_write_read(drv_data->i2c, DT_INST_REG_ADDR(0),
-			   &cmd, sizeof(cmd),
-			   &fw_ver, sizeof(fw_ver)) < 0) {
+	if (i2c_write_read_dt(&config->i2c, &cmd, sizeof(cmd), &fw_ver, sizeof(fw_ver)) < 0) {
 		LOG_ERR("Failed to read App Firmware Version register");
 		ret = -EIO;
 		goto out;
@@ -564,9 +552,7 @@
 #elif defined(CONFIG_CCS811_DRIVE_MODE_4)
 	meas_mode = CCS811_MODE_IAQ_250MSEC;
 #endif
-	if (i2c_reg_write_byte(drv_data->i2c, DT_INST_REG_ADDR(0),
-			       CCS811_REG_MEAS_MODE,
-			       meas_mode) < 0) {
+	if (i2c_reg_write_byte_dt(&config->i2c, CCS811_REG_MEAS_MODE, meas_mode) < 0) {
 		LOG_ERR("Failed to set Measurement mode");
 		ret = -EIO;
 		goto out;
@@ -597,9 +583,13 @@
 	return ret;
 }
 
-static struct ccs811_data ccs811_driver;
+static struct ccs811_data ccs811_data_inst;
+
+static const struct ccs811_config ccs811_config_inst = {
+	.i2c = I2C_DT_SPEC_INST_GET(0),
+};
 
 DEVICE_DT_INST_DEFINE(0, ccs811_init, NULL,
-		 &ccs811_driver, NULL,
-		 POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY,
-		 &ccs811_driver_api);
+		      &ccs811_data_inst, &ccs811_config_inst,
+		      POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY,
+		      &ccs811_driver_api);
diff --git a/drivers/sensor/ccs811/ccs811.h b/drivers/sensor/ccs811/ccs811.h
index f595f61..c5471c1 100644
--- a/drivers/sensor/ccs811/ccs811.h
+++ b/drivers/sensor/ccs811/ccs811.h
@@ -9,6 +9,7 @@
 #define ZEPHYR_DRIVERS_SENSOR_CCS811_CCS811_H_
 
 #include <zephyr/device.h>
+#include <zephyr/drivers/i2c.h>
 #include <zephyr/drivers/gpio.h>
 #include <zephyr/sys/util.h>
 #include <zephyr/drivers/sensor/ccs811.h>
@@ -48,7 +49,6 @@
 #define CCS811_CO2_MAX_PPM              32767
 
 struct ccs811_data {
-	const struct device *i2c;
 #if DT_INST_NODE_HAS_PROP(0, irq_gpios)
 	const struct device *irq_gpio;
 #ifdef CONFIG_CCS811_TRIGGER
@@ -83,6 +83,10 @@
 	uint8_t app_fw_ver;
 };
 
+struct ccs811_config {
+	struct i2c_dt_spec i2c;
+};
+
 #ifdef CONFIG_CCS811_TRIGGER
 
 int ccs811_mutate_meas_mode(const struct device *dev,