Add support for GPIO controller feature of AW9523B. Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com> Co-authored-by: Benjamin Cabé <kartben@gmail.com>
65 lines
1.8 KiB
C
65 lines
1.8 KiB
C
/*
|
|
* Copyright (c) 2024 TOKITA Hiroshi
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#define DT_DRV_COMPAT awinic_aw9523b
|
|
|
|
#include <zephyr/drivers/i2c.h>
|
|
#include <zephyr/drivers/mfd/aw9523b.h>
|
|
#include <zephyr/kernel.h>
|
|
|
|
#define AW9523B_ID_VALUE 0x23
|
|
|
|
struct mfd_aw9523b_config {
|
|
struct i2c_dt_spec i2c;
|
|
};
|
|
|
|
struct mfd_aw9523b_data {
|
|
struct k_sem lock;
|
|
};
|
|
|
|
static int mfd_aw9523b_init(const struct device *dev)
|
|
{
|
|
const struct mfd_aw9523b_config *config = dev->config;
|
|
struct mfd_aw9523b_data *data = dev->data;
|
|
uint8_t reg;
|
|
int ret;
|
|
|
|
if (!i2c_is_ready_dt(&config->i2c)) {
|
|
return -ENODEV;
|
|
}
|
|
|
|
k_sem_init(&data->lock, 1, 1);
|
|
|
|
ret = i2c_reg_read_byte_dt(&config->i2c, AW9523B_REG_ID, ®);
|
|
|
|
if (ret) {
|
|
return ret;
|
|
};
|
|
|
|
if (reg != AW9523B_ID_VALUE) {
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct k_sem *aw9523b_get_lock(const struct device *dev)
|
|
{
|
|
struct mfd_aw9523b_data *data = dev->data;
|
|
|
|
return &data->lock;
|
|
}
|
|
|
|
#define MFD_AW9523B_DEFINE(inst) \
|
|
static const struct mfd_aw9523b_config config##inst = { \
|
|
.i2c = I2C_DT_SPEC_INST_GET(inst), \
|
|
}; \
|
|
\
|
|
static struct mfd_aw9523b_data data##inst; \
|
|
\
|
|
DEVICE_DT_INST_DEFINE(inst, mfd_aw9523b_init, NULL, &data##inst, &config##inst, \
|
|
POST_KERNEL, CONFIG_MFD_INIT_PRIORITY, NULL);
|
|
|
|
DT_INST_FOREACH_STATUS_OKAY(MFD_AW9523B_DEFINE)
|