aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pinctrl/pinctrl-rockchip.c36
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
168struct rockchip_pin_config { 171struct 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
584static int rk3288_drv_list[] = { 2, 4, 8, 12 };
585 587
586static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 588static 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
614static int rk3288_get_drive(struct rockchip_pin_bank *bank, int pin_num) 616static int rockchip_perpin_drv_list[] = { 2, 4, 8, 12 };
617
618static 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, &regmap, &reg, &bit); 628 ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &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
633static int rk3288_set_drive(struct rockchip_pin_bank *bank, int pin_num, 640static 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, &regmap, &reg, &bit); 651 ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &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
2061static const struct of_device_id rockchip_pinctrl_dt_match[] = { 2071static const struct of_device_id rockchip_pinctrl_dt_match[] = {