diff options
author | David Wu <david.wu@rock-chips.com> | 2018-05-14 07:59:51 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2018-05-23 05:10:46 -0400 |
commit | 87065ca9b8e5951920034d5c06687c049a5cf2cf (patch) | |
tree | 5cbcedb9411f54320c16040261ef0c9abbdc7867 | |
parent | f61f5a2174cd7534f128dc26e2fe7de56cb08a3c (diff) |
pinctrl: rockchip: Add pinctrl support for PX30
There are 4 banks (GPIO0 ~ GPIO3), bank0 is in PD_PMU
subsystem, bank1/bank2/bank3 are in PD_BUS subsystem.
Signed-off-by: David Wu <david.wu@rock-chips.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt | 1 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-rockchip.c | 194 |
2 files changed, 195 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt index a01a3b8a2363..0919db294c17 100644 --- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt +++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt | |||
@@ -20,6 +20,7 @@ defined as gpio sub-nodes of the pinmux controller. | |||
20 | 20 | ||
21 | Required properties for iomux controller: | 21 | Required properties for iomux controller: |
22 | - compatible: should be | 22 | - compatible: should be |
23 | "rockchip,px30-pinctrl": for Rockchip PX30 | ||
23 | "rockchip,rv1108-pinctrl": for Rockchip RV1108 | 24 | "rockchip,rv1108-pinctrl": for Rockchip RV1108 |
24 | "rockchip,rk2928-pinctrl": for Rockchip RK2928 | 25 | "rockchip,rk2928-pinctrl": for Rockchip RK2928 |
25 | "rockchip,rk3066a-pinctrl": for Rockchip RK3066a | 26 | "rockchip,rk3066a-pinctrl": for Rockchip RK3066a |
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 3924779f5578..88d40772e387 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #define GPIO_LS_SYNC 0x60 | 59 | #define GPIO_LS_SYNC 0x60 |
60 | 60 | ||
61 | enum rockchip_pinctrl_type { | 61 | enum rockchip_pinctrl_type { |
62 | PX30, | ||
62 | RV1108, | 63 | RV1108, |
63 | RK2928, | 64 | RK2928, |
64 | RK3066B, | 65 | RK3066B, |
@@ -701,6 +702,66 @@ static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, | |||
701 | *bit = data->bit; | 702 | *bit = data->bit; |
702 | } | 703 | } |
703 | 704 | ||
705 | static struct rockchip_mux_route_data px30_mux_route_data[] = { | ||
706 | { | ||
707 | /* cif-d2m0 */ | ||
708 | .bank_num = 2, | ||
709 | .pin = 0, | ||
710 | .func = 1, | ||
711 | .route_offset = 0x184, | ||
712 | .route_val = BIT(16 + 7), | ||
713 | }, { | ||
714 | /* cif-d2m1 */ | ||
715 | .bank_num = 3, | ||
716 | .pin = 3, | ||
717 | .func = 3, | ||
718 | .route_offset = 0x184, | ||
719 | .route_val = BIT(16 + 7) | BIT(7), | ||
720 | }, { | ||
721 | /* pdm-m0 */ | ||
722 | .bank_num = 3, | ||
723 | .pin = 22, | ||
724 | .func = 2, | ||
725 | .route_offset = 0x184, | ||
726 | .route_val = BIT(16 + 8), | ||
727 | }, { | ||
728 | /* pdm-m1 */ | ||
729 | .bank_num = 2, | ||
730 | .pin = 22, | ||
731 | .func = 1, | ||
732 | .route_offset = 0x184, | ||
733 | .route_val = BIT(16 + 8) | BIT(8), | ||
734 | }, { | ||
735 | /* uart2-rxm0 */ | ||
736 | .bank_num = 1, | ||
737 | .pin = 27, | ||
738 | .func = 2, | ||
739 | .route_offset = 0x184, | ||
740 | .route_val = BIT(16 + 10), | ||
741 | }, { | ||
742 | /* uart2-rxm1 */ | ||
743 | .bank_num = 2, | ||
744 | .pin = 14, | ||
745 | .func = 2, | ||
746 | .route_offset = 0x184, | ||
747 | .route_val = BIT(16 + 10) | BIT(10), | ||
748 | }, { | ||
749 | /* uart3-rxm0 */ | ||
750 | .bank_num = 0, | ||
751 | .pin = 17, | ||
752 | .func = 2, | ||
753 | .route_offset = 0x184, | ||
754 | .route_val = BIT(16 + 9), | ||
755 | }, { | ||
756 | /* uart3-rxm1 */ | ||
757 | .bank_num = 1, | ||
758 | .pin = 15, | ||
759 | .func = 2, | ||
760 | .route_offset = 0x184, | ||
761 | .route_val = BIT(16 + 9) | BIT(9), | ||
762 | }, | ||
763 | }; | ||
764 | |||
704 | static struct rockchip_mux_route_data rk3128_mux_route_data[] = { | 765 | static struct rockchip_mux_route_data rk3128_mux_route_data[] = { |
705 | { | 766 | { |
706 | /* spi-0 */ | 767 | /* spi-0 */ |
@@ -1202,6 +1263,97 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) | |||
1202 | return ret; | 1263 | return ret; |
1203 | } | 1264 | } |
1204 | 1265 | ||
1266 | #define PX30_PULL_PMU_OFFSET 0x10 | ||
1267 | #define PX30_PULL_GRF_OFFSET 0x60 | ||
1268 | #define PX30_PULL_BITS_PER_PIN 2 | ||
1269 | #define PX30_PULL_PINS_PER_REG 8 | ||
1270 | #define PX30_PULL_BANK_STRIDE 16 | ||
1271 | |||
1272 | static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, | ||
1273 | int pin_num, struct regmap **regmap, | ||
1274 | int *reg, u8 *bit) | ||
1275 | { | ||
1276 | struct rockchip_pinctrl *info = bank->drvdata; | ||
1277 | |||
1278 | /* The first 32 pins of the first bank are located in PMU */ | ||
1279 | if (bank->bank_num == 0) { | ||
1280 | *regmap = info->regmap_pmu; | ||
1281 | *reg = PX30_PULL_PMU_OFFSET; | ||
1282 | } else { | ||
1283 | *regmap = info->regmap_base; | ||
1284 | *reg = PX30_PULL_GRF_OFFSET; | ||
1285 | |||
1286 | /* correct the offset, as we're starting with the 2nd bank */ | ||
1287 | *reg -= 0x10; | ||
1288 | *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; | ||
1289 | } | ||
1290 | |||
1291 | *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4); | ||
1292 | *bit = (pin_num % PX30_PULL_PINS_PER_REG); | ||
1293 | *bit *= PX30_PULL_BITS_PER_PIN; | ||
1294 | } | ||
1295 | |||
1296 | #define PX30_DRV_PMU_OFFSET 0x20 | ||
1297 | #define PX30_DRV_GRF_OFFSET 0xf0 | ||
1298 | #define PX30_DRV_BITS_PER_PIN 2 | ||
1299 | #define PX30_DRV_PINS_PER_REG 8 | ||
1300 | #define PX30_DRV_BANK_STRIDE 16 | ||
1301 | |||
1302 | static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, | ||
1303 | int pin_num, struct regmap **regmap, | ||
1304 | int *reg, u8 *bit) | ||
1305 | { | ||
1306 | struct rockchip_pinctrl *info = bank->drvdata; | ||
1307 | |||
1308 | /* The first 32 pins of the first bank are located in PMU */ | ||
1309 | if (bank->bank_num == 0) { | ||
1310 | *regmap = info->regmap_pmu; | ||
1311 | *reg = PX30_DRV_PMU_OFFSET; | ||
1312 | } else { | ||
1313 | *regmap = info->regmap_base; | ||
1314 | *reg = PX30_DRV_GRF_OFFSET; | ||
1315 | |||
1316 | /* correct the offset, as we're starting with the 2nd bank */ | ||
1317 | *reg -= 0x10; | ||
1318 | *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; | ||
1319 | } | ||
1320 | |||
1321 | *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4); | ||
1322 | *bit = (pin_num % PX30_DRV_PINS_PER_REG); | ||
1323 | *bit *= PX30_DRV_BITS_PER_PIN; | ||
1324 | } | ||
1325 | |||
1326 | #define PX30_SCHMITT_PMU_OFFSET 0x38 | ||
1327 | #define PX30_SCHMITT_GRF_OFFSET 0xc0 | ||
1328 | #define PX30_SCHMITT_PINS_PER_PMU_REG 16 | ||
1329 | #define PX30_SCHMITT_BANK_STRIDE 16 | ||
1330 | #define PX30_SCHMITT_PINS_PER_GRF_REG 8 | ||
1331 | |||
1332 | static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, | ||
1333 | int pin_num, | ||
1334 | struct regmap **regmap, | ||
1335 | int *reg, u8 *bit) | ||
1336 | { | ||
1337 | struct rockchip_pinctrl *info = bank->drvdata; | ||
1338 | int pins_per_reg; | ||
1339 | |||
1340 | if (bank->bank_num == 0) { | ||
1341 | *regmap = info->regmap_pmu; | ||
1342 | *reg = PX30_SCHMITT_PMU_OFFSET; | ||
1343 | pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; | ||
1344 | } else { | ||
1345 | *regmap = info->regmap_base; | ||
1346 | *reg = PX30_SCHMITT_GRF_OFFSET; | ||
1347 | pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; | ||
1348 | *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; | ||
1349 | } | ||
1350 | |||
1351 | *reg += ((pin_num / pins_per_reg) * 4); | ||
1352 | *bit = pin_num % pins_per_reg; | ||
1353 | |||
1354 | return 0; | ||
1355 | } | ||
1356 | |||
1205 | #define RV1108_PULL_PMU_OFFSET 0x10 | 1357 | #define RV1108_PULL_PMU_OFFSET 0x10 |
1206 | #define RV1108_PULL_OFFSET 0x110 | 1358 | #define RV1108_PULL_OFFSET 0x110 |
1207 | #define RV1108_PULL_PINS_PER_REG 8 | 1359 | #define RV1108_PULL_PINS_PER_REG 8 |
@@ -1798,6 +1950,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num) | |||
1798 | return !(data & BIT(bit)) | 1950 | return !(data & BIT(bit)) |
1799 | ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT | 1951 | ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT |
1800 | : PIN_CONFIG_BIAS_DISABLE; | 1952 | : PIN_CONFIG_BIAS_DISABLE; |
1953 | case PX30: | ||
1801 | case RV1108: | 1954 | case RV1108: |
1802 | case RK3188: | 1955 | case RK3188: |
1803 | case RK3288: | 1956 | case RK3288: |
@@ -1841,6 +1994,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, | |||
1841 | data |= BIT(bit); | 1994 | data |= BIT(bit); |
1842 | ret = regmap_write(regmap, reg, data); | 1995 | ret = regmap_write(regmap, reg, data); |
1843 | break; | 1996 | break; |
1997 | case PX30: | ||
1844 | case RV1108: | 1998 | case RV1108: |
1845 | case RK3188: | 1999 | case RK3188: |
1846 | case RK3288: | 2000 | case RK3288: |
@@ -2103,6 +2257,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, | |||
2103 | pull == PIN_CONFIG_BIAS_DISABLE); | 2257 | pull == PIN_CONFIG_BIAS_DISABLE); |
2104 | case RK3066B: | 2258 | case RK3066B: |
2105 | return pull ? false : true; | 2259 | return pull ? false : true; |
2260 | case PX30: | ||
2106 | case RV1108: | 2261 | case RV1108: |
2107 | case RK3188: | 2262 | case RK3188: |
2108 | case RK3288: | 2263 | case RK3288: |
@@ -3237,6 +3392,43 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev) | |||
3237 | return 0; | 3392 | return 0; |
3238 | } | 3393 | } |
3239 | 3394 | ||
3395 | static struct rockchip_pin_bank px30_pin_banks[] = { | ||
3396 | PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, | ||
3397 | IOMUX_SOURCE_PMU, | ||
3398 | IOMUX_SOURCE_PMU, | ||
3399 | IOMUX_SOURCE_PMU | ||
3400 | ), | ||
3401 | PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, | ||
3402 | IOMUX_WIDTH_4BIT, | ||
3403 | IOMUX_WIDTH_4BIT, | ||
3404 | IOMUX_WIDTH_4BIT | ||
3405 | ), | ||
3406 | PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, | ||
3407 | IOMUX_WIDTH_4BIT, | ||
3408 | IOMUX_WIDTH_4BIT, | ||
3409 | IOMUX_WIDTH_4BIT | ||
3410 | ), | ||
3411 | PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, | ||
3412 | IOMUX_WIDTH_4BIT, | ||
3413 | IOMUX_WIDTH_4BIT, | ||
3414 | IOMUX_WIDTH_4BIT | ||
3415 | ), | ||
3416 | }; | ||
3417 | |||
3418 | static struct rockchip_pin_ctrl px30_pin_ctrl = { | ||
3419 | .pin_banks = px30_pin_banks, | ||
3420 | .nr_banks = ARRAY_SIZE(px30_pin_banks), | ||
3421 | .label = "PX30-GPIO", | ||
3422 | .type = PX30, | ||
3423 | .grf_mux_offset = 0x0, | ||
3424 | .pmu_mux_offset = 0x0, | ||
3425 | .iomux_routes = px30_mux_route_data, | ||
3426 | .niomux_routes = ARRAY_SIZE(px30_mux_route_data), | ||
3427 | .pull_calc_reg = px30_calc_pull_reg_and_bit, | ||
3428 | .drv_calc_reg = px30_calc_drv_reg_and_bit, | ||
3429 | .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, | ||
3430 | }; | ||
3431 | |||
3240 | static struct rockchip_pin_bank rv1108_pin_banks[] = { | 3432 | static struct rockchip_pin_bank rv1108_pin_banks[] = { |
3241 | PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, | 3433 | PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, |
3242 | IOMUX_SOURCE_PMU, | 3434 | IOMUX_SOURCE_PMU, |
@@ -3545,6 +3737,8 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl = { | |||
3545 | }; | 3737 | }; |
3546 | 3738 | ||
3547 | static const struct of_device_id rockchip_pinctrl_dt_match[] = { | 3739 | static const struct of_device_id rockchip_pinctrl_dt_match[] = { |
3740 | { .compatible = "rockchip,px30-pinctrl", | ||
3741 | .data = &px30_pin_ctrl }, | ||
3548 | { .compatible = "rockchip,rv1108-pinctrl", | 3742 | { .compatible = "rockchip,rv1108-pinctrl", |
3549 | .data = &rv1108_pin_ctrl }, | 3743 | .data = &rv1108_pin_ctrl }, |
3550 | { .compatible = "rockchip,rk2928-pinctrl", | 3744 | { .compatible = "rockchip,rk2928-pinctrl", |