aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Wu <david.wu@rock-chips.com>2018-05-14 07:59:51 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-05-23 05:10:46 -0400
commit87065ca9b8e5951920034d5c06687c049a5cf2cf (patch)
tree5cbcedb9411f54320c16040261ef0c9abbdc7867
parentf61f5a2174cd7534f128dc26e2fe7de56cb08a3c (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.txt1
-rw-r--r--drivers/pinctrl/pinctrl-rockchip.c194
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
21Required properties for iomux controller: 21Required 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
61enum rockchip_pinctrl_type { 61enum 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
705static 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
704static struct rockchip_mux_route_data rk3128_mux_route_data[] = { 765static 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
1272static 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
1302static 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
1332static 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
3395static 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
3418static 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
3240static struct rockchip_pin_bank rv1108_pin_banks[] = { 3432static 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
3547static const struct of_device_id rockchip_pinctrl_dt_match[] = { 3739static 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",