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