/* ST Microelectronics ISM330DHCX 6-axis IMU sensor driver
 *
 * Copyright (c) 2020 STMicroelectronics
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Datasheet:
 * https://www.st.com/resource/en/datasheet/ism330dhcx.pdf
 */

#define DT_DRV_COMPAT st_ism330dhcx

#include <zephyr/device.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/sys/__assert.h>
#include <zephyr/sys/util.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/logging/log.h>

#include "ism330dhcx.h"

LOG_MODULE_DECLARE(ISM330DHCX, CONFIG_SENSOR_LOG_LEVEL);

#define ISM330DHCX_SHUB_DATA_OUT				0x02

#define ISM330DHCX_SHUB_SLV0_ADDR				0x15
#define ISM330DHCX_SHUB_SLV0_SUBADDR			0x16
#define ISM330DHCX_SHUB_SLV0_CONFIG			0x17
#define ISM330DHCX_SHUB_SLV1_ADDR				0x18
#define ISM330DHCX_SHUB_SLV1_SUBADDR			0x19
#define ISM330DHCX_SHUB_SLV1_CONFIG			0x1A
#define ISM330DHCX_SHUB_SLV2_ADDR				0x1B
#define ISM330DHCX_SHUB_SLV2_SUBADDR			0x1C
#define ISM330DHCX_SHUB_SLV2_CONFIG			0x1D
#define ISM330DHCX_SHUB_SLV3_ADDR				0x1E
#define ISM330DHCX_SHUB_SLV3_SUBADDR			0x1F
#define ISM330DHCX_SHUB_SLV3_CONFIG			0x20
#define ISM330DHCX_SHUB_SLV0_DATAWRITE			0x21

#define ISM330DHCX_SHUB_STATUS_MASTER			0x22
#define ISM330DHCX_SHUB_STATUS_SLV0_NACK			BIT(3)
#define ISM330DHCX_SHUB_STATUS_ENDOP			BIT(0)

#define ISM330DHCX_SHUB_SLVX_WRITE				0x0
#define ISM330DHCX_SHUB_SLVX_READ				0x1

static uint8_t num_ext_dev;
static uint8_t shub_ext[ISM330DHCX_SHUB_MAX_NUM_SLVS];

static int ism330dhcx_shub_write_slave_reg(const struct device *dev, uint8_t slv_addr,
					   uint8_t slv_reg, uint8_t *value, uint16_t len);
static int ism330dhcx_shub_read_slave_reg(const struct device *dev, uint8_t slv_addr,
					  uint8_t slv_reg, uint8_t *value, uint16_t len);
static void ism330dhcx_shub_enable(const struct device *dev, uint8_t enable);

/*
 * LIS2MDL magn device specific part
 */
#if defined(CONFIG_ISM330DHCX_EXT_LIS2MDL) || defined(CONFIG_ISM330DHCX_EXT_IIS2MDC)

#define LIS2MDL_CFG_REG_A		0x60
#define LIS2MDL_CFG_REG_B		0x61
#define LIS2MDL_CFG_REG_C		0x62
#define LIS2MDL_STATUS_REG		0x67

#define LIS2MDL_SW_RESET		0x20
#define LIS2MDL_ODR_10HZ		0x00
#define LIS2MDL_ODR_100HZ		0x0C
#define LIS2MDL_OFF_CANC		0x02
#define LIS2MDL_SENSITIVITY		1500

static int ism330dhcx_lis2mdl_init(const struct device *dev, uint8_t i2c_addr)
{
	struct ism330dhcx_data *data = dev->data;
	uint8_t mag_cfg[2];

	data->magn_gain = LIS2MDL_SENSITIVITY;

	/* sw reset device */
	mag_cfg[0] = LIS2MDL_SW_RESET;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LIS2MDL_CFG_REG_A, mag_cfg, 1);

	k_sleep(K_MSEC(10)); /* turn-on time in ms */

	/* configure mag */
	mag_cfg[0] = LIS2MDL_ODR_10HZ;
	mag_cfg[1] = LIS2MDL_OFF_CANC;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LIS2MDL_CFG_REG_A, mag_cfg, 2);

	return 0;
}

static const uint16_t lis2mdl_map[] = {10, 20, 50, 100};

static int ism330dhcx_lis2mdl_odr_set(const struct device *dev, uint8_t i2c_addr, uint16_t freq)
{
	uint8_t odr, cfg;

	for (odr = 0; odr < ARRAY_SIZE(lis2mdl_map); odr++) {
		if (freq == lis2mdl_map[odr]) {
			break;
		}
	}

	if (odr == ARRAY_SIZE(lis2mdl_map)) {
		LOG_DBG("shub: LIS2MDL freq val %d not supported.", freq);
		return -ENOTSUP;
	}

	cfg = (odr << 2);
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LIS2MDL_CFG_REG_A, &cfg, 1);

	ism330dhcx_shub_enable(dev, 1);
	return 0;
}

static int ism330dhcx_lis2mdl_conf(const struct device *dev, uint8_t i2c_addr,
				   enum sensor_channel chan, enum sensor_attribute attr,
				   const struct sensor_value *val)
{
	switch (attr) {
	case SENSOR_ATTR_SAMPLING_FREQUENCY:
		return ism330dhcx_lis2mdl_odr_set(dev, i2c_addr, val->val1);
	default:
		LOG_DBG("shub: LIS2MDL attribute not supported.");
		return -ENOTSUP;
	}

	return 0;
}
#endif /* CONFIG_ISM330DHCX_EXT_LIS2MDL || CONFIG_ISM330DHCX_EXT_IIS2MDC */

/*
 * HTS221 humidity device specific part
 */
#ifdef CONFIG_ISM330DHCX_EXT_HTS221

#define HTS221_AUTOINCREMENT		BIT(7)

#define HTS221_REG_CTRL1		0x20
#define HTS221_ODR_1HZ			0x01
#define HTS221_BDU			0x04
#define HTS221_PD			0x80

#define HTS221_REG_CONV_START		0x30

static int lsmdso_hts221_read_conv_data(const struct device *dev, uint8_t i2c_addr)
{
	struct ism330dhcx_data *data = dev->data;
	uint8_t buf[16], i;
	struct hts221_data *ht = &data->hts221;

	for (i = 0; i < sizeof(buf); i += 7) {
		unsigned char len = MIN(7, sizeof(buf) - i);

		if (ism330dhcx_shub_read_slave_reg(dev, i2c_addr, (HTS221_REG_CONV_START + i)
							| HTS221_AUTOINCREMENT, &buf[i],
						   len) < 0) {
			LOG_DBG("shub: failed to read hts221 conv data");
			return -EIO;
		}
	}

	ht->y0 = buf[0] / 2;
	ht->y1 = buf[1] / 2;
	ht->x0 = sys_le16_to_cpu(buf[6] | (buf[7] << 8));
	ht->x1 = sys_le16_to_cpu(buf[10] | (buf[11] << 8));

	return 0;
}

static int ism330dhcx_hts221_init(const struct device *dev, uint8_t i2c_addr)
{
	uint8_t hum_cfg;

	/* configure ODR and BDU */
	hum_cfg = HTS221_ODR_1HZ | HTS221_BDU | HTS221_PD;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, HTS221_REG_CTRL1, &hum_cfg, 1);

	return lsmdso_hts221_read_conv_data(dev, i2c_addr);
}

static const uint16_t hts221_map[] = {0, 1, 7, 12};

static int ism330dhcx_hts221_odr_set(const struct device *dev, uint8_t i2c_addr, uint16_t freq)
{
	uint8_t odr, cfg;

	for (odr = 0; odr < ARRAY_SIZE(hts221_map); odr++) {
		if (freq == hts221_map[odr]) {
			break;
		}
	}

	if (odr == ARRAY_SIZE(hts221_map)) {
		LOG_DBG("shub: HTS221 freq val %d not supported.", freq);
		return -ENOTSUP;
	}

	cfg = odr | HTS221_BDU | HTS221_PD;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, HTS221_REG_CTRL1, &cfg, 1);

	ism330dhcx_shub_enable(dev, 1);
	return 0;
}

static int ism330dhcx_hts221_conf(const struct device *dev, uint8_t i2c_addr,
				  enum sensor_channel chan, enum sensor_attribute attr,
				  const struct sensor_value *val)
{
	switch (attr) {
	case SENSOR_ATTR_SAMPLING_FREQUENCY:
		return ism330dhcx_hts221_odr_set(dev, i2c_addr, val->val1);
	default:
		LOG_DBG("shub: HTS221 attribute not supported.");
		return -ENOTSUP;
	}

	return 0;
}
#endif /* CONFIG_ISM330DHCX_EXT_HTS221 */

/*
 * LPS22HB baro/temp device specific part
 */
#ifdef CONFIG_ISM330DHCX_EXT_LPS22HB

#define LPS22HB_CTRL_REG1		0x10
#define LPS22HB_CTRL_REG2		0x11

#define LPS22HB_SW_RESET		0x04
#define LPS22HB_ODR_10HZ		0x20
#define LPS22HB_LPF_EN			0x08
#define LPS22HB_BDU_EN			0x02

static int ism330dhcx_lps22hb_init(const struct device *dev, uint8_t i2c_addr)
{
	uint8_t baro_cfg[2];

	/* sw reset device */
	baro_cfg[0] = LPS22HB_SW_RESET;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LPS22HB_CTRL_REG2, baro_cfg, 1);

	k_sleep(K_MSEC(1)); /* turn-on time in ms */

	/* configure device */
	baro_cfg[0] = LPS22HB_ODR_10HZ | LPS22HB_LPF_EN | LPS22HB_BDU_EN;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LPS22HB_CTRL_REG1, baro_cfg, 1);

	return 0;
}
#endif /* CONFIG_ISM330DHCX_EXT_LPS22HB */

/*
 * LPS22HH baro/temp device specific part
 */
#ifdef CONFIG_ISM330DHCX_EXT_LPS22HH

#define LPS22HH_CTRL_REG1		0x10
#define LPS22HH_CTRL_REG2		0x11

#define LPS22HH_SW_RESET		0x04
#define LPS22HH_IF_ADD_INC		0x10
#define LPS22HH_ODR_10HZ		0x20
#define LPS22HH_LPF_EN			0x08
#define LPS22HH_BDU_EN			0x02

static int ism330dhcx_lps22hh_init(const struct device *dev, uint8_t i2c_addr)
{
	uint8_t baro_cfg[2];

	/* sw reset device */
	baro_cfg[0] = LPS22HH_SW_RESET;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LPS22HH_CTRL_REG2, baro_cfg, 1);

	k_sleep(K_MSEC(100)); /* turn-on time in ms */

	/* configure device */
	baro_cfg[0] = LPS22HH_IF_ADD_INC;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LPS22HH_CTRL_REG2, baro_cfg, 1);

	baro_cfg[0] = LPS22HH_ODR_10HZ | LPS22HH_LPF_EN | LPS22HH_BDU_EN;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LPS22HH_CTRL_REG1, baro_cfg, 1);

	return 0;
}

static const uint16_t lps22hh_map[] = {0, 1, 10, 25, 50, 75, 100, 200};

static int ism330dhcx_lps22hh_odr_set(const struct device *dev, uint8_t i2c_addr, uint16_t freq)
{
	uint8_t odr, cfg;

	for (odr = 0; odr < ARRAY_SIZE(lps22hh_map); odr++) {
		if (freq == lps22hh_map[odr]) {
			break;
		}
	}

	if (odr == ARRAY_SIZE(lps22hh_map)) {
		LOG_DBG("shub: LPS22HH freq val %d not supported.", freq);
		return -ENOTSUP;
	}

	cfg = (odr << 4) | LPS22HH_LPF_EN | LPS22HH_BDU_EN;
	ism330dhcx_shub_write_slave_reg(dev, i2c_addr, LPS22HH_CTRL_REG1, &cfg, 1);

	ism330dhcx_shub_enable(dev, 1);
	return 0;
}

static int ism330dhcx_lps22hh_conf(const struct device *dev, uint8_t i2c_addr,
				   enum sensor_channel chan, enum sensor_attribute attr,
				   const struct sensor_value *val)
{
	switch (attr) {
	case SENSOR_ATTR_SAMPLING_FREQUENCY:
		return ism330dhcx_lps22hh_odr_set(dev, i2c_addr, val->val1);
	default:
		LOG_DBG("shub: LPS22HH attribute not supported.");
		return -ENOTSUP;
	}

	return 0;
}
#endif /* CONFIG_ISM330DHCX_EXT_LPS22HH */

/* List of supported external sensors */
static struct ism330dhcx_shub_slist {
	enum sensor_channel type;
	uint8_t i2c_addr[2];
	uint8_t ext_i2c_addr;
	uint8_t wai_addr;
	uint8_t wai_val;
	uint8_t out_data_addr;
	uint8_t out_data_len;
	uint8_t sh_out_reg;
	int (*dev_init)(const struct device *dev, uint8_t i2c_addr);
	int (*dev_conf)(const struct device *dev, uint8_t i2c_addr, enum sensor_channel chan,
			enum sensor_attribute attr, const struct sensor_value *val);
} ism330dhcx_shub_slist[] = {
#if defined(CONFIG_ISM330DHCX_EXT_LIS2MDL) || defined(CONFIG_ISM330DHCX_EXT_IIS2MDC)
	{
		/* LIS2MDL */
		.type		= SENSOR_CHAN_MAGN_XYZ,
		.i2c_addr       = { 0x1E },
		.wai_addr       = 0x4F,
		.wai_val        = 0x40,
		.out_data_addr  = 0x68,
		.out_data_len   = 0x06,
		.dev_init       = (ism330dhcx_lis2mdl_init),
		.dev_conf       = (ism330dhcx_lis2mdl_conf),
	},
#endif /* CONFIG_ISM330DHCX_EXT_LIS2MDL || CONFIG_ISM330DHCX_EXT_IIS2MDC */

#ifdef CONFIG_ISM330DHCX_EXT_HTS221
	{
		/* HTS221 */
		.type		= SENSOR_CHAN_HUMIDITY,
		.i2c_addr       = { 0x5F },
		.wai_addr       = 0x0F,
		.wai_val        = 0xBC,
		.out_data_addr  = 0x28 | HTS221_AUTOINCREMENT,
		.out_data_len   = 0x02,
		.dev_init       = (ism330dhcx_hts221_init),
		.dev_conf       = (ism330dhcx_hts221_conf),
	},
#endif /* CONFIG_ISM330DHCX_EXT_HTS221 */

#ifdef CONFIG_ISM330DHCX_EXT_LPS22HB
	{
		/* LPS22HB */
		.type		= SENSOR_CHAN_PRESS,
		.i2c_addr       = { 0x5C, 0x5D },
		.wai_addr       = 0x0F,
		.wai_val        = 0xB1,
		.out_data_addr  = 0x28,
		.out_data_len   = 0x05,
		.dev_init       = (ism330dhcx_lps22hb_init),
	},
#endif /* CONFIG_ISM330DHCX_EXT_LPS22HB */

#ifdef CONFIG_ISM330DHCX_EXT_LPS22HH
	{
		/* LPS22HH */
		.type		= SENSOR_CHAN_PRESS,
		.i2c_addr       = { 0x5C, 0x5D },
		.wai_addr       = 0x0F,
		.wai_val        = 0xB3,
		.out_data_addr  = 0x28,
		.out_data_len   = 0x05,
		.dev_init       = (ism330dhcx_lps22hh_init),
		.dev_conf       = (ism330dhcx_lps22hh_conf),
	},
#endif /* CONFIG_ISM330DHCX_EXT_LPS22HH */
};

static inline void ism330dhcx_shub_wait_completed(const struct device *dev)
{
	struct ism330dhcx_data *data = dev->data;
	ism330dhcx_status_master_t status;

	do {
		k_msleep(1);
		ism330dhcx_sh_status_get(data->ctx, &status);
	} while (status.sens_hub_endop == 0);
}

static inline void ism330dhcx_shub_embedded_en(const struct device *dev, bool on)
{
	struct ism330dhcx_data *data = dev->data;

	if (on) {
		(void) ism330dhcx_mem_bank_set(data->ctx, ISM330DHCX_SENSOR_HUB_BANK);
	} else {
		(void) ism330dhcx_mem_bank_set(data->ctx, ISM330DHCX_USER_BANK);
	}

	k_busy_wait(150);
}

static int ism330dhcx_shub_read_embedded_regs(const struct device *dev, uint8_t reg_addr,
					      uint8_t *value, int len)
{
	struct ism330dhcx_data *data = dev->data;

	ism330dhcx_shub_embedded_en(dev, true);

	if (ism330dhcx_read_reg(data->ctx, reg_addr, value, len) < 0) {
		LOG_DBG("shub: failed to read external reg: %02x", reg_addr);
		ism330dhcx_shub_embedded_en(dev, false);
		return -EIO;
	}

	ism330dhcx_shub_embedded_en(dev, false);

	return 0;
}

static int ism330dhcx_shub_write_embedded_regs(const struct device *dev, uint8_t reg_addr,
					       uint8_t *value, uint8_t len)
{
	struct ism330dhcx_data *data = dev->data;

	ism330dhcx_shub_embedded_en(dev, true);

	if (ism330dhcx_write_reg(data->ctx, reg_addr, value, len) < 0) {
		LOG_DBG("shub: failed to write external reg: %02x", reg_addr);
		ism330dhcx_shub_embedded_en(dev, false);
		return -EIO;
	}

	ism330dhcx_shub_embedded_en(dev, false);

	return 0;
}

static void ism330dhcx_shub_enable(const struct device *dev, uint8_t enable)
{
	struct ism330dhcx_data *data = dev->data;

	/* Enable Accel @26hz */
	if (!data->accel_freq) {
		uint8_t odr = (enable) ? 2 : 0;

		if (ism330dhcx_xl_data_rate_set(data->ctx, odr) < 0) {
			LOG_DBG("shub: failed to set XL sampling rate");
			return;
		}
	}

	ism330dhcx_shub_embedded_en(dev, true);

	if (ism330dhcx_sh_master_set(data->ctx, enable) < 0) {
		LOG_DBG("shub: failed to set master on");
		ism330dhcx_shub_embedded_en(dev, false);
		return;
	}

	ism330dhcx_shub_embedded_en(dev, false);
}

/* must be called with master on */
static int ism330dhcx_shub_check_slv0_nack(const struct device *dev)
{
	uint8_t status;

	if (ism330dhcx_shub_read_embedded_regs(dev, ISM330DHCX_SHUB_STATUS_MASTER, &status, 1) <
	    0) {
		LOG_DBG("shub: error reading embedded reg");
		return -EIO;
	}

	if (status & (ISM330DHCX_SHUB_STATUS_SLV0_NACK)) {
		LOG_DBG("shub: SLV0 nacked");
		return -EIO;
	}

	return 0;
}

/*
 * use SLV0 for generic read to slave device
 */
static int ism330dhcx_shub_read_slave_reg(const struct device *dev, uint8_t slv_addr,
					  uint8_t slv_reg, uint8_t *value, uint16_t len)
{
	struct ism330dhcx_data *data = dev->data;
	uint8_t slave[3];

	slave[0] = (slv_addr << 1) | ISM330DHCX_SHUB_SLVX_READ;
	slave[1] = slv_reg;
	slave[2] = (len & 0x7);

	if (ism330dhcx_shub_write_embedded_regs(dev, ISM330DHCX_SHUB_SLV0_ADDR, slave, 3) < 0) {
		LOG_DBG("shub: error writing embedded reg");
		return -EIO;
	}

	/* turn SH on */
	ism330dhcx_shub_enable(dev, 1);
	ism330dhcx_shub_wait_completed(dev);

	if (ism330dhcx_shub_check_slv0_nack(dev) < 0) {
		ism330dhcx_shub_enable(dev, 0);
		return -EIO;
	}

	/* read data from external slave */
	ism330dhcx_shub_embedded_en(dev, true);
	if (ism330dhcx_read_reg(data->ctx, ISM330DHCX_SHUB_DATA_OUT,
				value, len) < 0) {
		LOG_DBG("shub: error reading sensor data");
		ism330dhcx_shub_embedded_en(dev, false);
		return -EIO;
	}
	ism330dhcx_shub_embedded_en(dev, false);

	ism330dhcx_shub_enable(dev, 0);
	return 0;
}

/*
 * use SLV0 to configure slave device
 */
static int ism330dhcx_shub_write_slave_reg(const struct device *dev, uint8_t slv_addr,
					   uint8_t slv_reg, uint8_t *value, uint16_t len)
{
	uint8_t slv_cfg[3];
	uint8_t cnt = 0U;

	while (cnt < len) {
		slv_cfg[0] = (slv_addr << 1) & ~ISM330DHCX_SHUB_SLVX_READ;
		slv_cfg[1] = slv_reg + cnt;

		if (ism330dhcx_shub_write_embedded_regs(dev, ISM330DHCX_SHUB_SLV0_ADDR, slv_cfg,
							2) < 0) {
			LOG_DBG("shub: error writing embedded reg");
			return -EIO;
		}

		slv_cfg[0] = value[cnt];
		if (ism330dhcx_shub_write_embedded_regs(dev, ISM330DHCX_SHUB_SLV0_DATAWRITE,
							slv_cfg, 1) < 0) {
			LOG_DBG("shub: error writing embedded reg");
			return -EIO;
		}

		/* turn SH on */
		ism330dhcx_shub_enable(dev, 1);
		ism330dhcx_shub_wait_completed(dev);

		if (ism330dhcx_shub_check_slv0_nack(dev) < 0) {
			ism330dhcx_shub_enable(dev, 0);
			return -EIO;
		}

		ism330dhcx_shub_enable(dev, 0);

		cnt++;
	}

	/* Put SLV0 in IDLE mode */
	slv_cfg[0] = 0x7;
	slv_cfg[1] = 0x0;
	slv_cfg[2] = 0x0;
	if (ism330dhcx_shub_write_embedded_regs(dev, ISM330DHCX_SHUB_SLV0_ADDR, slv_cfg, 3) < 0) {
		LOG_DBG("shub: error writing embedded reg");
		return -EIO;
	}

	return 0;
}

/*
 * SLAVEs configurations:
 *
 *  - SLAVE 0: used for configuring all slave devices
 *  - SLAVE 1: used as data read channel for external slave device #1
 *  - SLAVE 2: used as data read channel for external slave device #2
 *  - SLAVE 3: used for generic reads while data channel is enabled
 */
static int ism330dhcx_shub_set_data_channel(const struct device *dev)
{
	struct ism330dhcx_data *data = dev->data;
	uint8_t n, i, slv_cfg[6];
	struct ism330dhcx_shub_slist *sp;

	/* Set data channel for slave devices */
	for (n = 0; n < num_ext_dev; n++) {
		sp = &ism330dhcx_shub_slist[shub_ext[n]];

		i = n * 3;
		slv_cfg[i] = (sp->ext_i2c_addr << 1) | ISM330DHCX_SHUB_SLVX_READ;
		slv_cfg[i + 1] = sp->out_data_addr;
		slv_cfg[i + 2] = sp->out_data_len;
	}

	if (ism330dhcx_shub_write_embedded_regs(dev, ISM330DHCX_SHUB_SLV1_ADDR, slv_cfg,
						n * 3) < 0) {
		LOG_DBG("shub: error writing embedded reg");
		return -EIO;
	}

	/* Configure the master */
	ism330dhcx_aux_sens_on_t aux = ISM330DHCX_SLV_0_1_2;

	if (ism330dhcx_sh_slave_connected_set(data->ctx, aux) < 0) {
		LOG_DBG("shub: error setting aux sensors");
		return -EIO;
	}

	ism330dhcx_write_once_t wo = ISM330DHCX_ONLY_FIRST_CYCLE;

	if (ism330dhcx_sh_write_mode_set(data->ctx, wo) < 0) {
		LOG_DBG("shub: error setting write once");
		return -EIO;
	}


	/* turn SH on */
	ism330dhcx_shub_enable(dev, 1);
	ism330dhcx_shub_wait_completed(dev);

	return 0;
}

int ism330dhcx_shub_get_idx(enum sensor_channel type)
{
	uint8_t n;
	struct ism330dhcx_shub_slist *sp;

	for (n = 0; n < num_ext_dev; n++) {
		sp = &ism330dhcx_shub_slist[shub_ext[n]];

		if (sp->type == type) {
			return n;
		}
	}

	return -ENOTSUP;
}

int ism330dhcx_shub_fetch_external_devs(const struct device *dev)
{
	uint8_t n;
	struct ism330dhcx_data *data = dev->data;
	struct ism330dhcx_shub_slist *sp;

	/* read data from external slave */
	ism330dhcx_shub_embedded_en(dev, true);

	for (n = 0; n < num_ext_dev; n++) {
		sp = &ism330dhcx_shub_slist[shub_ext[n]];

		if (ism330dhcx_read_reg(data->ctx, sp->sh_out_reg,
				     data->ext_data[n], sp->out_data_len) < 0) {
			LOG_DBG("shub: failed to read sample");
			ism330dhcx_shub_embedded_en(dev, false);
			return -EIO;
		}
	}

	ism330dhcx_shub_embedded_en(dev, false);

	return 0;
}

int ism330dhcx_shub_config(const struct device *dev, enum sensor_channel chan,
			   enum sensor_attribute attr,
			   const struct sensor_value *val)
{
	struct ism330dhcx_shub_slist *sp = NULL;
	uint8_t n;

	for (n = 0; n < num_ext_dev; n++) {
		sp = &ism330dhcx_shub_slist[shub_ext[n]];

		if (sp->type == chan) {
			break;
		}
	}

	if (n == num_ext_dev) {
		LOG_DBG("shub: chan not supported");
		return -ENOTSUP;
	}

	if (sp == NULL || sp->dev_conf == NULL) {
		LOG_DBG("shub: chan not configurable");
		return -ENOTSUP;
	}

	return sp->dev_conf(dev, sp->ext_i2c_addr, chan, attr, val);
}

int ism330dhcx_shub_init(const struct device *dev)
{
	uint8_t i, n = 0, regn;
	uint8_t chip_id;
	struct ism330dhcx_shub_slist *sp;

	for (n = 0; n < ARRAY_SIZE(ism330dhcx_shub_slist); n++) {
		if (num_ext_dev >= ISM330DHCX_SHUB_MAX_NUM_SLVS) {
			break;
		}

		chip_id = 0;
		sp = &ism330dhcx_shub_slist[n];

		/*
		 * The external sensor may have different I2C address.
		 * So, try them one by one until we read the correct
		 * chip ID.
		 */
		for (i = 0U; i < ARRAY_SIZE(sp->i2c_addr); i++) {
			if (ism330dhcx_shub_read_slave_reg(dev, sp->i2c_addr[i], sp->wai_addr,
							   &chip_id, 1) < 0) {
				continue;
			}
			if (chip_id == sp->wai_val) {
				break;
			}
		}

		if (i >= ARRAY_SIZE(sp->i2c_addr)) {
			LOG_DBG("shub: invalid chip id 0x%x", chip_id);
			continue;
		}
		LOG_INF("shub: Ext Device Chip Id: 0x%02x", chip_id);
		sp->ext_i2c_addr = sp->i2c_addr[i];

		shub_ext[num_ext_dev++] = n;
	}

	if (num_ext_dev == 0) {
		LOG_ERR("shub: no slave devices found");
		return -EINVAL;
	}

	/* init external devices */
	for (n = 0, regn = 0; n < num_ext_dev; n++) {
		sp = &ism330dhcx_shub_slist[shub_ext[n]];
		sp->sh_out_reg = ISM330DHCX_SHUB_DATA_OUT + regn;
		regn += sp->out_data_len;
		sp->dev_init(dev, sp->ext_i2c_addr);
	}

	ism330dhcx_shub_set_data_channel(dev);

	return 0;
}
