2023-07-20 02:02:34 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2023 Google, LLC
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define DT_DRV_COMPAT nuvoton_nct38xx
|
|
|
|
|
|
|
|
#include <zephyr/drivers/i2c.h>
|
|
|
|
|
|
|
|
struct mfd_nct38xx_config {
|
|
|
|
const struct i2c_dt_spec i2c_dev;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mfd_nct38xx_data {
|
|
|
|
/* lock NC38xx register access */
|
|
|
|
struct k_sem lock;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int mfd_nct38xx_init(const struct device *dev)
|
|
|
|
{
|
|
|
|
const struct mfd_nct38xx_config *config = dev->config;
|
|
|
|
struct mfd_nct38xx_data *data = dev->data;
|
|
|
|
|
|
|
|
if (!device_is_ready(config->i2c_dev.bus)) {
|
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
|
|
|
k_sem_init(&data->lock, 1, 1);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct k_sem *mfd_nct38xx_get_lock_reference(const struct device *dev)
|
|
|
|
{
|
|
|
|
struct mfd_nct38xx_data *data = dev->data;
|
|
|
|
|
|
|
|
return &data->lock;
|
|
|
|
}
|
|
|
|
|
2023-08-12 03:50:26 +08:00
|
|
|
const struct i2c_dt_spec *mfd_nct38xx_get_i2c_dt_spec(const struct device *dev)
|
2023-07-20 02:02:34 +08:00
|
|
|
{
|
2023-08-12 03:50:26 +08:00
|
|
|
const struct mfd_nct38xx_config *config = dev->config;
|
2023-07-20 02:02:34 +08:00
|
|
|
|
2023-08-12 03:50:26 +08:00
|
|
|
return &config->i2c_dev;
|
2023-07-20 02:02:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#define MFD_NCT38XX_DEFINE(inst) \
|
|
|
|
static struct mfd_nct38xx_data nct38xx_data_##inst; \
|
|
|
|
static const struct mfd_nct38xx_config nct38xx_cfg_##inst = { \
|
|
|
|
.i2c_dev = I2C_DT_SPEC_INST_GET(inst), \
|
|
|
|
}; \
|
|
|
|
\
|
|
|
|
DEVICE_DT_INST_DEFINE(inst, mfd_nct38xx_init, NULL, &nct38xx_data_##inst, \
|
|
|
|
&nct38xx_cfg_##inst, POST_KERNEL, CONFIG_MFD_INIT_PRIORITY, NULL);
|
|
|
|
|
|
|
|
DT_INST_FOREACH_STATUS_OKAY(MFD_NCT38XX_DEFINE)
|