IT8801 support GPIO alternate function switching. Some GPIO pins can be switched as KSO or PWM function. Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com>
66 lines
1.9 KiB
C
66 lines
1.9 KiB
C
/*
|
|
* 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)
|