zephyr/drivers/mfd/mfd_nct38xx.c

57 lines
1.6 KiB
C

/*
* 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;
}
const struct i2c_dt_spec *mfd_nct38xx_get_i2c_dt_spec(const struct device *dev)
{
const struct mfd_nct38xx_config *config = dev->config;
return &config->i2c_dev;
}
#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)