/* * Copyright (c) 2024 ITE Corporation. All Rights Reserved. * * SPDX-License-Identifier: Apache-2.0 */ #define DT_DRV_COMPAT ite_it8801_altctrl #include #include #include #include LOG_MODULE_REGISTER(mfd_it8801_altctrl, LOG_LEVEL_ERR); struct mfd_altfunc_config { /* gpiocr register */ uint8_t reg_gpiocr; }; int mfd_it8801_configure_pins(const struct i2c_dt_spec *i2c_dev, const struct device *dev, uint8_t pin, uint8_t func) { const struct mfd_altfunc_config *config = dev->config; int ret; uint8_t reg_gpiocr = config->reg_gpiocr + pin; uint8_t alt_val; switch (func) { case IT8801_ALT_FUNC_1: /* Func1: Default GPIO setting */ alt_val = IT8801_GPIOAFS_FUN1; break; case IT8801_ALT_FUNC_2: /* Func2: KSO or PWM setting */ alt_val = IT8801_GPIOAFS_FUN2; break; case IT8801_ALT_FUNC_3: /* Func3: PWM setting */ alt_val = IT8801_GPIOAFS_FUN3; break; case IT8801_ALT_DEFAULT: alt_val = IT8801_GPIOAFS_FUN1; break; default: LOG_ERR("This function is not supported."); return -EINVAL; } /* Common settings for alternate function. */ ret = i2c_reg_update_byte_dt(i2c_dev, reg_gpiocr, GENMASK(7, 6), alt_val << 6); if (ret != 0) { LOG_ERR("Failed to update gpiocr (ret %d)", ret); return ret; } return 0; } #define MFD_IT8801_ALTCTRL_INIT(inst) \ static const struct mfd_altfunc_config it8801_mfd_alt_cfg_##inst = { \ .reg_gpiocr = DT_INST_REG_ADDR(inst), \ }; \ DEVICE_DT_INST_DEFINE(inst, NULL, NULL, NULL, &it8801_mfd_alt_cfg_##inst, POST_KERNEL, \ CONFIG_MFD_INIT_PRIORITY, NULL); DT_INST_FOREACH_STATUS_OKAY(MFD_IT8801_ALTCTRL_INIT)