|  | /* | 
|  | * Copyright (c) 2024 ITE Corporation. All Rights Reserved. | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #define DT_DRV_COMPAT ite_it8801_altctrl | 
|  |  | 
|  | #include <zephyr/drivers/i2c.h> | 
|  | #include <zephyr/drivers/mfd/mfd_ite_it8801.h> | 
|  | #include <zephyr/dt-bindings/mfd/mfd_it8801_altctrl.h> | 
|  |  | 
|  | #include <zephyr/logging/log.h> | 
|  | 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) |