diff options
-rw-r--r-- | drivers/pinctrl/pinctrl-rockchip.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 6e7643f7f2a0..429a6eec8c47 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
@@ -163,6 +163,9 @@ struct rockchip_pin_ctrl { | |||
163 | void (*pull_calc_reg)(struct rockchip_pin_bank *bank, | 163 | void (*pull_calc_reg)(struct rockchip_pin_bank *bank, |
164 | int pin_num, struct regmap **regmap, | 164 | int pin_num, struct regmap **regmap, |
165 | int *reg, u8 *bit); | 165 | int *reg, u8 *bit); |
166 | void (*drv_calc_reg)(struct rockchip_pin_bank *bank, | ||
167 | int pin_num, struct regmap **regmap, | ||
168 | int *reg, u8 *bit); | ||
166 | }; | 169 | }; |
167 | 170 | ||
168 | struct rockchip_pin_config { | 171 | struct rockchip_pin_config { |
@@ -581,7 +584,6 @@ static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, | |||
581 | #define RK3288_DRV_BITS_PER_PIN 2 | 584 | #define RK3288_DRV_BITS_PER_PIN 2 |
582 | #define RK3288_DRV_PINS_PER_REG 8 | 585 | #define RK3288_DRV_PINS_PER_REG 8 |
583 | #define RK3288_DRV_BANK_STRIDE 16 | 586 | #define RK3288_DRV_BANK_STRIDE 16 |
584 | static int rk3288_drv_list[] = { 2, 4, 8, 12 }; | ||
585 | 587 | ||
586 | static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, | 588 | static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, |
587 | int pin_num, struct regmap **regmap, | 589 | int pin_num, struct regmap **regmap, |
@@ -611,14 +613,19 @@ static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, | |||
611 | } | 613 | } |
612 | } | 614 | } |
613 | 615 | ||
614 | static int rk3288_get_drive(struct rockchip_pin_bank *bank, int pin_num) | 616 | static int rockchip_perpin_drv_list[] = { 2, 4, 8, 12 }; |
617 | |||
618 | static int rockchip_get_drive_perpin(struct rockchip_pin_bank *bank, | ||
619 | int pin_num) | ||
615 | { | 620 | { |
621 | struct rockchip_pinctrl *info = bank->drvdata; | ||
622 | struct rockchip_pin_ctrl *ctrl = info->ctrl; | ||
616 | struct regmap *regmap; | 623 | struct regmap *regmap; |
617 | int reg, ret; | 624 | int reg, ret; |
618 | u32 data; | 625 | u32 data; |
619 | u8 bit; | 626 | u8 bit; |
620 | 627 | ||
621 | rk3288_calc_drv_reg_and_bit(bank, pin_num, ®map, ®, &bit); | 628 | ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); |
622 | 629 | ||
623 | ret = regmap_read(regmap, reg, &data); | 630 | ret = regmap_read(regmap, reg, &data); |
624 | if (ret) | 631 | if (ret) |
@@ -627,24 +634,25 @@ static int rk3288_get_drive(struct rockchip_pin_bank *bank, int pin_num) | |||
627 | data >>= bit; | 634 | data >>= bit; |
628 | data &= (1 << RK3288_DRV_BITS_PER_PIN) - 1; | 635 | data &= (1 << RK3288_DRV_BITS_PER_PIN) - 1; |
629 | 636 | ||
630 | return rk3288_drv_list[data]; | 637 | return rockchip_perpin_drv_list[data]; |
631 | } | 638 | } |
632 | 639 | ||
633 | static int rk3288_set_drive(struct rockchip_pin_bank *bank, int pin_num, | 640 | static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, |
634 | int strength) | 641 | int pin_num, int strength) |
635 | { | 642 | { |
636 | struct rockchip_pinctrl *info = bank->drvdata; | 643 | struct rockchip_pinctrl *info = bank->drvdata; |
644 | struct rockchip_pin_ctrl *ctrl = info->ctrl; | ||
637 | struct regmap *regmap; | 645 | struct regmap *regmap; |
638 | unsigned long flags; | 646 | unsigned long flags; |
639 | int reg, ret, i; | 647 | int reg, ret, i; |
640 | u32 data, rmask; | 648 | u32 data, rmask; |
641 | u8 bit; | 649 | u8 bit; |
642 | 650 | ||
643 | rk3288_calc_drv_reg_and_bit(bank, pin_num, ®map, ®, &bit); | 651 | ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); |
644 | 652 | ||
645 | ret = -EINVAL; | 653 | ret = -EINVAL; |
646 | for (i = 0; i < ARRAY_SIZE(rk3288_drv_list); i++) { | 654 | for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list); i++) { |
647 | if (rk3288_drv_list[i] == strength) { | 655 | if (rockchip_perpin_drv_list[i] == strength) { |
648 | ret = i; | 656 | ret = i; |
649 | break; | 657 | break; |
650 | } | 658 | } |
@@ -983,10 +991,11 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, | |||
983 | break; | 991 | break; |
984 | case PIN_CONFIG_DRIVE_STRENGTH: | 992 | case PIN_CONFIG_DRIVE_STRENGTH: |
985 | /* rk3288 is the first with per-pin drive-strength */ | 993 | /* rk3288 is the first with per-pin drive-strength */ |
986 | if (info->ctrl->type != RK3288) | 994 | if (!info->ctrl->drv_calc_reg) |
987 | return -ENOTSUPP; | 995 | return -ENOTSUPP; |
988 | 996 | ||
989 | rc = rk3288_set_drive(bank, pin - bank->pin_base, arg); | 997 | rc = rockchip_set_drive_perpin(bank, |
998 | pin - bank->pin_base, arg); | ||
990 | if (rc < 0) | 999 | if (rc < 0) |
991 | return rc; | 1000 | return rc; |
992 | break; | 1001 | break; |
@@ -1041,10 +1050,10 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin, | |||
1041 | break; | 1050 | break; |
1042 | case PIN_CONFIG_DRIVE_STRENGTH: | 1051 | case PIN_CONFIG_DRIVE_STRENGTH: |
1043 | /* rk3288 is the first with per-pin drive-strength */ | 1052 | /* rk3288 is the first with per-pin drive-strength */ |
1044 | if (info->ctrl->type != RK3288) | 1053 | if (!info->ctrl->drv_calc_reg) |
1045 | return -ENOTSUPP; | 1054 | return -ENOTSUPP; |
1046 | 1055 | ||
1047 | rc = rk3288_get_drive(bank, pin - bank->pin_base); | 1056 | rc = rockchip_get_drive_perpin(bank, pin - bank->pin_base); |
1048 | if (rc < 0) | 1057 | if (rc < 0) |
1049 | return rc; | 1058 | return rc; |
1050 | 1059 | ||
@@ -2056,6 +2065,7 @@ static struct rockchip_pin_ctrl rk3288_pin_ctrl = { | |||
2056 | .grf_mux_offset = 0x0, | 2065 | .grf_mux_offset = 0x0, |
2057 | .pmu_mux_offset = 0x84, | 2066 | .pmu_mux_offset = 0x84, |
2058 | .pull_calc_reg = rk3288_calc_pull_reg_and_bit, | 2067 | .pull_calc_reg = rk3288_calc_pull_reg_and_bit, |
2068 | .drv_calc_reg = rk3288_calc_drv_reg_and_bit, | ||
2059 | }; | 2069 | }; |
2060 | 2070 | ||
2061 | static const struct of_device_id rockchip_pinctrl_dt_match[] = { | 2071 | static const struct of_device_id rockchip_pinctrl_dt_match[] = { |