diff options
Diffstat (limited to 'src/soc/mediatek/mt8186/gpio.c')
-rw-r--r-- | src/soc/mediatek/mt8186/gpio.c | 112 |
1 files changed, 2 insertions, 110 deletions
diff --git a/src/soc/mediatek/mt8186/gpio.c b/src/soc/mediatek/mt8186/gpio.c index 0dad34205c..a92349c3a5 100644 --- a/src/soc/mediatek/mt8186/gpio.c +++ b/src/soc/mediatek/mt8186/gpio.c @@ -278,7 +278,7 @@ void *gpio_find_reg_addr(gpio_t gpio) return reg_addr; } -static const struct gpio_drv_info *get_gpio_driving_info(uint32_t raw_id) +const struct gpio_drv_info *get_gpio_driving_info(uint32_t raw_id) { if (ENV_BOOTBLOCK) { uint32_t id; @@ -321,7 +321,7 @@ static const struct gpio_drv_info *get_gpio_driving_info(uint32_t raw_id) } } -static const struct gpio_drv_info *get_gpio_driving_adv_info(uint32_t raw_id) +const struct gpio_drv_info *get_gpio_driving_adv_info(uint32_t raw_id) { if (ENV_BOOTBLOCK) { return NULL; @@ -331,111 +331,3 @@ static const struct gpio_drv_info *get_gpio_driving_adv_info(uint32_t raw_id) return &gpio_driving_adv_info[raw_id]; } } - -static inline bool is_valid_drv(uint8_t drv) -{ - return drv <= GPIO_DRV_16_MA; -} - -static inline bool is_valid_drv_adv(enum gpio_drv_adv drv) -{ - return drv <= GPIO_DRV_ADV_1_MA && drv >= GPIO_DRV_ADV_125_UA; -} - -int gpio_set_driving(gpio_t gpio, uint8_t drv) -{ - uint32_t mask; - const struct gpio_drv_info *info = get_gpio_driving_info(gpio.id); - const struct gpio_drv_info *adv_info = get_gpio_driving_adv_info(gpio.id); - void *reg, *reg_adv, *reg_addr; - - if (!info) - return -1; - - if (!is_valid_drv(drv)) - return -1; - - if (info->width == 0) - return -1; - - mask = BIT(info->width) - 1; - /* Check setting value is not beyond width */ - if ((uint32_t)drv > mask) - return -1; - - reg_addr = gpio_find_reg_addr(gpio); - reg = reg_addr + info->offset; - clrsetbits32(reg, mask << info->shift, drv << info->shift); - - /* Disable EH if supported */ - if (adv_info && adv_info->width != 0) { - reg_adv = reg_addr + adv_info->offset; - clrbits32(reg_adv, BIT(adv_info->shift)); - } - - return 0; -} - -int gpio_get_driving(gpio_t gpio) -{ - const struct gpio_drv_info *info = get_gpio_driving_info(gpio.id); - void *reg; - - if (!info) - return -1; - - reg = gpio_find_reg_addr(gpio) + info->offset; - if (info->width == 0) - return -1; - - return (read32(reg) >> info->shift) & (BIT(info->width) - 1); -} - -int gpio_set_driving_adv(gpio_t gpio, enum gpio_drv_adv drv) -{ - uint32_t mask; - const struct gpio_drv_info *adv_info = get_gpio_driving_adv_info(gpio.id); - void *reg_adv; - - if (!adv_info) - return -1; - - if (!is_valid_drv_adv(drv)) - return -1; - - reg_adv = gpio_find_reg_addr(gpio) + adv_info->offset; - - if (adv_info->width == 0) - return -1; - - /* Not include EH bit (the lowest bit) */ - if ((uint32_t)drv > (BIT(adv_info->width - 1) - 1)) - return -1; - - mask = BIT(adv_info->width) - 1; - /* EH enable */ - drv = (drv << 1) | BIT(0); - - clrsetbits32(reg_adv, mask << adv_info->shift, drv << adv_info->shift); - - return 0; -} - -int gpio_get_driving_adv(gpio_t gpio) -{ - const struct gpio_drv_info *adv_info = get_gpio_driving_adv_info(gpio.id); - void *reg_adv; - uint32_t drv; - - if (!adv_info) - return -1; - - reg_adv = gpio_find_reg_addr(gpio) + adv_info->offset; - if (adv_info->width == 0) - return -1; - - drv = (read32(reg_adv) >> adv_info->shift) & (BIT(adv_info->width) - 1); - - /* Drop EH bit */ - return drv >> 1; -} |