Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

66 lines
1.9 KiB

/*
* 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)