/* * Copyright (c) 2023 Google, LLC * SPDX-License-Identifier: Apache-2.0 */ #define DT_DRV_COMPAT nuvoton_nct38xx #include 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)