149c55878SDavid Wu /* 249c55878SDavid Wu * (C) Copyright 2018 Rockchip Electronics Co., Ltd 349c55878SDavid Wu * 449c55878SDavid Wu * SPDX-License-Identifier: GPL-2.0+ 549c55878SDavid Wu */ 649c55878SDavid Wu 749c55878SDavid Wu #include <common.h> 849c55878SDavid Wu #include <dm.h> 949c55878SDavid Wu #include <dm/pinctrl.h> 102208cfa9SKever Yang #include <dm/ofnode.h> 1149c55878SDavid Wu #include <regmap.h> 1249c55878SDavid Wu #include <syscon.h> 13d5517017SDavid Wu #include <asm/arch/cpu.h> 1449c55878SDavid Wu 1549c55878SDavid Wu #define MAX_ROCKCHIP_GPIO_PER_BANK 32 1649c55878SDavid Wu #define RK_FUNC_GPIO 0 1787f0ac57SDavid Wu #define MAX_ROCKCHIP_PINS_ENTRIES 30 1849c55878SDavid Wu 1949c55878SDavid Wu enum rockchip_pinctrl_type { 2049c55878SDavid Wu PX30, 2149c55878SDavid Wu RV1108, 22a2a3fc8fSJianqun Xu RK1808, 2349c55878SDavid Wu RK2928, 2449c55878SDavid Wu RK3066B, 2549c55878SDavid Wu RK3128, 2649c55878SDavid Wu RK3188, 2749c55878SDavid Wu RK3288, 28b3077611SDavid Wu RK3308, 2949c55878SDavid Wu RK3368, 3049c55878SDavid Wu RK3399, 3149c55878SDavid Wu }; 3249c55878SDavid Wu 3349c55878SDavid Wu /** 3449c55878SDavid Wu * Encode variants of iomux registers into a type variable 3549c55878SDavid Wu */ 3649c55878SDavid Wu #define IOMUX_GPIO_ONLY BIT(0) 3749c55878SDavid Wu #define IOMUX_WIDTH_4BIT BIT(1) 3849c55878SDavid Wu #define IOMUX_SOURCE_PMU BIT(2) 3949c55878SDavid Wu #define IOMUX_UNROUTED BIT(3) 4049c55878SDavid Wu #define IOMUX_WIDTH_3BIT BIT(4) 41b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT BIT(5) 424bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT BIT(6) 4349c55878SDavid Wu 4449c55878SDavid Wu /** 4549c55878SDavid Wu * @type: iomux variant using IOMUX_* constants 4649c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 4749c55878SDavid Wu * an initial offset value the relevant source offset can be reset 4849c55878SDavid Wu * to a new value for autocalculating the following iomux registers. 4949c55878SDavid Wu */ 5049c55878SDavid Wu struct rockchip_iomux { 5149c55878SDavid Wu int type; 5249c55878SDavid Wu int offset; 5349c55878SDavid Wu }; 5449c55878SDavid Wu 5555a89bc6SDavid Wu #define DRV_TYPE_IO_MASK GENMASK(31, 16) 5655a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT BIT(31) 5755a89bc6SDavid Wu 5849c55878SDavid Wu /** 5949c55878SDavid Wu * enum type index corresponding to rockchip_perpin_drv_list arrays index. 6049c55878SDavid Wu */ 6149c55878SDavid Wu enum rockchip_pin_drv_type { 6249c55878SDavid Wu DRV_TYPE_IO_DEFAULT = 0, 6349c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 6449c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 6549c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 6649c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 6749c55878SDavid Wu DRV_TYPE_MAX 6849c55878SDavid Wu }; 6949c55878SDavid Wu 7055a89bc6SDavid Wu #define PULL_TYPE_IO_MASK GENMASK(31, 16) 7155a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT BIT(31) 7255a89bc6SDavid Wu 7349c55878SDavid Wu /** 7449c55878SDavid Wu * enum type index corresponding to rockchip_pull_list arrays index. 7549c55878SDavid Wu */ 7649c55878SDavid Wu enum rockchip_pin_pull_type { 7749c55878SDavid Wu PULL_TYPE_IO_DEFAULT = 0, 7849c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 7949c55878SDavid Wu PULL_TYPE_MAX 8049c55878SDavid Wu }; 8149c55878SDavid Wu 8249c55878SDavid Wu /** 8349c55878SDavid Wu * @drv_type: drive strength variant using rockchip_perpin_drv_type 8449c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 8549c55878SDavid Wu * an initial offset value the relevant source offset can be reset 8649c55878SDavid Wu * to a new value for autocalculating the following drive strength 8749c55878SDavid Wu * registers. if used chips own cal_drv func instead to calculate 8849c55878SDavid Wu * registers offset, the variant could be ignored. 8949c55878SDavid Wu */ 9049c55878SDavid Wu struct rockchip_drv { 9149c55878SDavid Wu enum rockchip_pin_drv_type drv_type; 9249c55878SDavid Wu int offset; 9349c55878SDavid Wu }; 9449c55878SDavid Wu 9549c55878SDavid Wu /** 9649c55878SDavid Wu * @priv: common pinctrl private basedata 9749c55878SDavid Wu * @pin_base: first pin number 9849c55878SDavid Wu * @nr_pins: number of pins in this bank 9949c55878SDavid Wu * @name: name of the bank 10049c55878SDavid Wu * @bank_num: number of the bank, to account for holes 10149c55878SDavid Wu * @iomux: array describing the 4 iomux sources of the bank 10249c55878SDavid Wu * @drv: array describing the 4 drive strength sources of the bank 10349c55878SDavid Wu * @pull_type: array describing the 4 pull type sources of the bank 10449c55878SDavid Wu * @recalced_mask: bits describing the mux recalced pins of per bank 10549c55878SDavid Wu * @route_mask: bits describing the routing pins of per bank 10649c55878SDavid Wu */ 10749c55878SDavid Wu struct rockchip_pin_bank { 10849c55878SDavid Wu struct rockchip_pinctrl_priv *priv; 10949c55878SDavid Wu u32 pin_base; 11049c55878SDavid Wu u8 nr_pins; 11149c55878SDavid Wu char *name; 11249c55878SDavid Wu u8 bank_num; 11349c55878SDavid Wu struct rockchip_iomux iomux[4]; 11449c55878SDavid Wu struct rockchip_drv drv[4]; 11549c55878SDavid Wu enum rockchip_pin_pull_type pull_type[4]; 11649c55878SDavid Wu u32 recalced_mask; 11749c55878SDavid Wu u32 route_mask; 11849c55878SDavid Wu }; 11949c55878SDavid Wu 12049c55878SDavid Wu #define PIN_BANK(id, pins, label) \ 12149c55878SDavid Wu { \ 12249c55878SDavid Wu .bank_num = id, \ 12349c55878SDavid Wu .nr_pins = pins, \ 12449c55878SDavid Wu .name = label, \ 12549c55878SDavid Wu .iomux = { \ 12649c55878SDavid Wu { .offset = -1 }, \ 12749c55878SDavid Wu { .offset = -1 }, \ 12849c55878SDavid Wu { .offset = -1 }, \ 12949c55878SDavid Wu { .offset = -1 }, \ 13049c55878SDavid Wu }, \ 13149c55878SDavid Wu } 13249c55878SDavid Wu 13349c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 13449c55878SDavid Wu { \ 13549c55878SDavid Wu .bank_num = id, \ 13649c55878SDavid Wu .nr_pins = pins, \ 13749c55878SDavid Wu .name = label, \ 13849c55878SDavid Wu .iomux = { \ 13949c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 14049c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 14149c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 14249c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 14349c55878SDavid Wu }, \ 14449c55878SDavid Wu } 14549c55878SDavid Wu 14649c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 14749c55878SDavid Wu { \ 14849c55878SDavid Wu .bank_num = id, \ 14949c55878SDavid Wu .nr_pins = pins, \ 15049c55878SDavid Wu .name = label, \ 15149c55878SDavid Wu .iomux = { \ 15249c55878SDavid Wu { .offset = -1 }, \ 15349c55878SDavid Wu { .offset = -1 }, \ 15449c55878SDavid Wu { .offset = -1 }, \ 15549c55878SDavid Wu { .offset = -1 }, \ 15649c55878SDavid Wu }, \ 15749c55878SDavid Wu .drv = { \ 15849c55878SDavid Wu { .drv_type = type0, .offset = -1 }, \ 15949c55878SDavid Wu { .drv_type = type1, .offset = -1 }, \ 16049c55878SDavid Wu { .drv_type = type2, .offset = -1 }, \ 16149c55878SDavid Wu { .drv_type = type3, .offset = -1 }, \ 16249c55878SDavid Wu }, \ 16349c55878SDavid Wu } 16449c55878SDavid Wu 16549c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \ 16649c55878SDavid Wu drv2, drv3, pull0, pull1, \ 16749c55878SDavid Wu pull2, pull3) \ 16849c55878SDavid Wu { \ 16949c55878SDavid Wu .bank_num = id, \ 17049c55878SDavid Wu .nr_pins = pins, \ 17149c55878SDavid Wu .name = label, \ 17249c55878SDavid Wu .iomux = { \ 17349c55878SDavid Wu { .offset = -1 }, \ 17449c55878SDavid Wu { .offset = -1 }, \ 17549c55878SDavid Wu { .offset = -1 }, \ 17649c55878SDavid Wu { .offset = -1 }, \ 17749c55878SDavid Wu }, \ 17849c55878SDavid Wu .drv = { \ 17949c55878SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 18049c55878SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 18149c55878SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 18249c55878SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 18349c55878SDavid Wu }, \ 18449c55878SDavid Wu .pull_type[0] = pull0, \ 18549c55878SDavid Wu .pull_type[1] = pull1, \ 18649c55878SDavid Wu .pull_type[2] = pull2, \ 18749c55878SDavid Wu .pull_type[3] = pull3, \ 18849c55878SDavid Wu } 18949c55878SDavid Wu 19049c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \ 19149c55878SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 19249c55878SDavid Wu drv3, offset0, offset1, \ 19349c55878SDavid Wu offset2, offset3) \ 19449c55878SDavid Wu { \ 19549c55878SDavid Wu .bank_num = id, \ 19649c55878SDavid Wu .nr_pins = pins, \ 19749c55878SDavid Wu .name = label, \ 19849c55878SDavid Wu .iomux = { \ 19949c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 20049c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 20149c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 20249c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 20349c55878SDavid Wu }, \ 20449c55878SDavid Wu .drv = { \ 20549c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 20649c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 20749c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 20849c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 20949c55878SDavid Wu }, \ 21049c55878SDavid Wu } 21149c55878SDavid Wu 21255a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1, \ 21355a89bc6SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 21455a89bc6SDavid Wu drv3, pull0, pull1, pull2, \ 21555a89bc6SDavid Wu pull3) \ 21655a89bc6SDavid Wu { \ 21755a89bc6SDavid Wu .bank_num = id, \ 21855a89bc6SDavid Wu .nr_pins = pins, \ 21955a89bc6SDavid Wu .name = label, \ 22055a89bc6SDavid Wu .iomux = { \ 22155a89bc6SDavid Wu { .type = iom0, .offset = -1 }, \ 22255a89bc6SDavid Wu { .type = iom1, .offset = -1 }, \ 22355a89bc6SDavid Wu { .type = iom2, .offset = -1 }, \ 22455a89bc6SDavid Wu { .type = iom3, .offset = -1 }, \ 22555a89bc6SDavid Wu }, \ 22655a89bc6SDavid Wu .drv = { \ 22755a89bc6SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 22855a89bc6SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 22955a89bc6SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 23055a89bc6SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 23155a89bc6SDavid Wu }, \ 23255a89bc6SDavid Wu .pull_type[0] = pull0, \ 23355a89bc6SDavid Wu .pull_type[1] = pull1, \ 23455a89bc6SDavid Wu .pull_type[2] = pull2, \ 23555a89bc6SDavid Wu .pull_type[3] = pull3, \ 23655a89bc6SDavid Wu } 23755a89bc6SDavid Wu 23849c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \ 23949c55878SDavid Wu label, iom0, iom1, iom2, \ 24049c55878SDavid Wu iom3, drv0, drv1, drv2, \ 24149c55878SDavid Wu drv3, offset0, offset1, \ 24249c55878SDavid Wu offset2, offset3, pull0, \ 24349c55878SDavid Wu pull1, pull2, pull3) \ 24449c55878SDavid Wu { \ 24549c55878SDavid Wu .bank_num = id, \ 24649c55878SDavid Wu .nr_pins = pins, \ 24749c55878SDavid Wu .name = label, \ 24849c55878SDavid Wu .iomux = { \ 24949c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 25049c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 25149c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 25249c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 25349c55878SDavid Wu }, \ 25449c55878SDavid Wu .drv = { \ 25549c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 25649c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 25749c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 25849c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 25949c55878SDavid Wu }, \ 26049c55878SDavid Wu .pull_type[0] = pull0, \ 26149c55878SDavid Wu .pull_type[1] = pull1, \ 26249c55878SDavid Wu .pull_type[2] = pull2, \ 26349c55878SDavid Wu .pull_type[3] = pull3, \ 26449c55878SDavid Wu } 26549c55878SDavid Wu 26649c55878SDavid Wu /** 26749c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 26849c55878SDavid Wu * @num: bank number. 26949c55878SDavid Wu * @pin: pin number. 27049c55878SDavid Wu * @bit: index at register. 27149c55878SDavid Wu * @reg: register offset. 27249c55878SDavid Wu * @mask: mask bit 27349c55878SDavid Wu */ 27449c55878SDavid Wu struct rockchip_mux_recalced_data { 27549c55878SDavid Wu u8 num; 27649c55878SDavid Wu u8 pin; 27749c55878SDavid Wu u32 reg; 27849c55878SDavid Wu u8 bit; 27949c55878SDavid Wu u8 mask; 28049c55878SDavid Wu }; 28149c55878SDavid Wu 28249c55878SDavid Wu /** 28349c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 28449c55878SDavid Wu * @bank_num: bank number. 28549c55878SDavid Wu * @pin: index at register or used to calc index. 28649c55878SDavid Wu * @func: the min pin. 28749c55878SDavid Wu * @route_offset: the max pin. 28849c55878SDavid Wu * @route_val: the register offset. 28949c55878SDavid Wu */ 29049c55878SDavid Wu struct rockchip_mux_route_data { 29149c55878SDavid Wu u8 bank_num; 29249c55878SDavid Wu u8 pin; 29349c55878SDavid Wu u8 func; 29449c55878SDavid Wu u32 route_offset; 29549c55878SDavid Wu u32 route_val; 29649c55878SDavid Wu }; 29749c55878SDavid Wu 29849c55878SDavid Wu /** 29949c55878SDavid Wu */ 30049c55878SDavid Wu struct rockchip_pin_ctrl { 30149c55878SDavid Wu struct rockchip_pin_bank *pin_banks; 30249c55878SDavid Wu u32 nr_banks; 30349c55878SDavid Wu u32 nr_pins; 30449c55878SDavid Wu char *label; 30549c55878SDavid Wu enum rockchip_pinctrl_type type; 30649c55878SDavid Wu int grf_mux_offset; 30749c55878SDavid Wu int pmu_mux_offset; 30849c55878SDavid Wu int grf_drv_offset; 30949c55878SDavid Wu int pmu_drv_offset; 31049c55878SDavid Wu struct rockchip_mux_recalced_data *iomux_recalced; 31149c55878SDavid Wu u32 niomux_recalced; 31249c55878SDavid Wu struct rockchip_mux_route_data *iomux_routes; 31349c55878SDavid Wu u32 niomux_routes; 31449c55878SDavid Wu 315d5517017SDavid Wu int (*ctrl_data_re_init)(struct rockchip_pin_ctrl *ctrl); 316d5517017SDavid Wu 317d5517017SDavid Wu int (*soc_data_init)(struct rockchip_pinctrl_priv *info); 318d5517017SDavid Wu 31949c55878SDavid Wu void (*pull_calc_reg)(struct rockchip_pin_bank *bank, 32049c55878SDavid Wu int pin_num, struct regmap **regmap, 32149c55878SDavid Wu int *reg, u8 *bit); 32249c55878SDavid Wu void (*drv_calc_reg)(struct rockchip_pin_bank *bank, 32349c55878SDavid Wu int pin_num, struct regmap **regmap, 32449c55878SDavid Wu int *reg, u8 *bit); 32549c55878SDavid Wu int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank, 32649c55878SDavid Wu int pin_num, struct regmap **regmap, 32749c55878SDavid Wu int *reg, u8 *bit); 32832c25d1fSDavid Wu int (*slew_rate_calc_reg)(struct rockchip_pin_bank *bank, 32932c25d1fSDavid Wu int pin_num, struct regmap **regmap, 33032c25d1fSDavid Wu int *reg, u8 *bit); 33149c55878SDavid Wu }; 33249c55878SDavid Wu 33349c55878SDavid Wu /** 33449c55878SDavid Wu */ 33549c55878SDavid Wu struct rockchip_pinctrl_priv { 33649c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 33749c55878SDavid Wu struct regmap *regmap_base; 33849c55878SDavid Wu struct regmap *regmap_pmu; 33949c55878SDavid Wu 34049c55878SDavid Wu }; 34149c55878SDavid Wu 34249c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin) 34349c55878SDavid Wu { 34449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 34549c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 34649c55878SDavid Wu 34749c55878SDavid Wu if (bank >= ctrl->nr_banks) { 34849c55878SDavid Wu debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks); 34949c55878SDavid Wu return -EINVAL; 35049c55878SDavid Wu } 35149c55878SDavid Wu 35249c55878SDavid Wu if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) { 35349c55878SDavid Wu debug("pin conf pin %d >= %d\n", pin, 35449c55878SDavid Wu MAX_ROCKCHIP_GPIO_PER_BANK); 35549c55878SDavid Wu return -EINVAL; 35649c55878SDavid Wu } 35749c55878SDavid Wu 35849c55878SDavid Wu return 0; 35949c55878SDavid Wu } 36049c55878SDavid Wu 36149c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = { 36249c55878SDavid Wu { 36349c55878SDavid Wu .num = 1, 36449c55878SDavid Wu .pin = 0, 36549c55878SDavid Wu .reg = 0x418, 36649c55878SDavid Wu .bit = 0, 36749c55878SDavid Wu .mask = 0x3 36849c55878SDavid Wu }, { 36949c55878SDavid Wu .num = 1, 37049c55878SDavid Wu .pin = 1, 37149c55878SDavid Wu .reg = 0x418, 37249c55878SDavid Wu .bit = 2, 37349c55878SDavid Wu .mask = 0x3 37449c55878SDavid Wu }, { 37549c55878SDavid Wu .num = 1, 37649c55878SDavid Wu .pin = 2, 37749c55878SDavid Wu .reg = 0x418, 37849c55878SDavid Wu .bit = 4, 37949c55878SDavid Wu .mask = 0x3 38049c55878SDavid Wu }, { 38149c55878SDavid Wu .num = 1, 38249c55878SDavid Wu .pin = 3, 38349c55878SDavid Wu .reg = 0x418, 38449c55878SDavid Wu .bit = 6, 38549c55878SDavid Wu .mask = 0x3 38649c55878SDavid Wu }, { 38749c55878SDavid Wu .num = 1, 38849c55878SDavid Wu .pin = 4, 38949c55878SDavid Wu .reg = 0x418, 39049c55878SDavid Wu .bit = 8, 39149c55878SDavid Wu .mask = 0x3 39249c55878SDavid Wu }, { 39349c55878SDavid Wu .num = 1, 39449c55878SDavid Wu .pin = 5, 39549c55878SDavid Wu .reg = 0x418, 39649c55878SDavid Wu .bit = 10, 39749c55878SDavid Wu .mask = 0x3 39849c55878SDavid Wu }, { 39949c55878SDavid Wu .num = 1, 40049c55878SDavid Wu .pin = 6, 40149c55878SDavid Wu .reg = 0x418, 40249c55878SDavid Wu .bit = 12, 40349c55878SDavid Wu .mask = 0x3 40449c55878SDavid Wu }, { 40549c55878SDavid Wu .num = 1, 40649c55878SDavid Wu .pin = 7, 40749c55878SDavid Wu .reg = 0x418, 40849c55878SDavid Wu .bit = 14, 40949c55878SDavid Wu .mask = 0x3 41049c55878SDavid Wu }, { 41149c55878SDavid Wu .num = 1, 41249c55878SDavid Wu .pin = 8, 41349c55878SDavid Wu .reg = 0x41c, 41449c55878SDavid Wu .bit = 0, 41549c55878SDavid Wu .mask = 0x3 41649c55878SDavid Wu }, { 41749c55878SDavid Wu .num = 1, 41849c55878SDavid Wu .pin = 9, 41949c55878SDavid Wu .reg = 0x41c, 42049c55878SDavid Wu .bit = 2, 42149c55878SDavid Wu .mask = 0x3 42249c55878SDavid Wu }, 42349c55878SDavid Wu }; 42449c55878SDavid Wu 42549c55878SDavid Wu static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { 42649c55878SDavid Wu { 42749c55878SDavid Wu .num = 2, 42849c55878SDavid Wu .pin = 20, 42949c55878SDavid Wu .reg = 0xe8, 43049c55878SDavid Wu .bit = 0, 43149c55878SDavid Wu .mask = 0x7 43249c55878SDavid Wu }, { 43349c55878SDavid Wu .num = 2, 43449c55878SDavid Wu .pin = 21, 43549c55878SDavid Wu .reg = 0xe8, 43649c55878SDavid Wu .bit = 4, 43749c55878SDavid Wu .mask = 0x7 43849c55878SDavid Wu }, { 43949c55878SDavid Wu .num = 2, 44049c55878SDavid Wu .pin = 22, 44149c55878SDavid Wu .reg = 0xe8, 44249c55878SDavid Wu .bit = 8, 44349c55878SDavid Wu .mask = 0x7 44449c55878SDavid Wu }, { 44549c55878SDavid Wu .num = 2, 44649c55878SDavid Wu .pin = 23, 44749c55878SDavid Wu .reg = 0xe8, 44849c55878SDavid Wu .bit = 12, 44949c55878SDavid Wu .mask = 0x7 45049c55878SDavid Wu }, { 45149c55878SDavid Wu .num = 2, 45249c55878SDavid Wu .pin = 24, 45349c55878SDavid Wu .reg = 0xd4, 45449c55878SDavid Wu .bit = 12, 45549c55878SDavid Wu .mask = 0x7 45649c55878SDavid Wu }, 45749c55878SDavid Wu }; 45849c55878SDavid Wu 459b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { 460b3077611SDavid Wu { 461b3077611SDavid Wu .num = 1, 462b3077611SDavid Wu .pin = 14, 463b3077611SDavid Wu .reg = 0x28, 464b3077611SDavid Wu .bit = 12, 465b3077611SDavid Wu .mask = 0x7 466b3077611SDavid Wu }, { 467b3077611SDavid Wu .num = 1, 468b3077611SDavid Wu .pin = 15, 469b3077611SDavid Wu .reg = 0x2c, 470b3077611SDavid Wu .bit = 0, 471b3077611SDavid Wu .mask = 0x3 472b3077611SDavid Wu }, { 473b3077611SDavid Wu .num = 1, 474b3077611SDavid Wu .pin = 18, 475b3077611SDavid Wu .reg = 0x30, 476b3077611SDavid Wu .bit = 4, 477b3077611SDavid Wu .mask = 0x7 478b3077611SDavid Wu }, { 479b3077611SDavid Wu .num = 1, 480b3077611SDavid Wu .pin = 19, 481b3077611SDavid Wu .reg = 0x30, 482b3077611SDavid Wu .bit = 8, 483b3077611SDavid Wu .mask = 0x7 484b3077611SDavid Wu }, { 485b3077611SDavid Wu .num = 1, 486b3077611SDavid Wu .pin = 20, 487b3077611SDavid Wu .reg = 0x30, 488b3077611SDavid Wu .bit = 12, 489b3077611SDavid Wu .mask = 0x7 490b3077611SDavid Wu }, { 491b3077611SDavid Wu .num = 1, 492b3077611SDavid Wu .pin = 21, 493b3077611SDavid Wu .reg = 0x34, 494b3077611SDavid Wu .bit = 0, 495b3077611SDavid Wu .mask = 0x7 496b3077611SDavid Wu }, { 497b3077611SDavid Wu .num = 1, 498b3077611SDavid Wu .pin = 22, 499b3077611SDavid Wu .reg = 0x34, 500b3077611SDavid Wu .bit = 4, 501b3077611SDavid Wu .mask = 0x7 502b3077611SDavid Wu }, { 503b3077611SDavid Wu .num = 1, 504b3077611SDavid Wu .pin = 23, 505b3077611SDavid Wu .reg = 0x34, 506b3077611SDavid Wu .bit = 8, 507b3077611SDavid Wu .mask = 0x7 508b3077611SDavid Wu }, { 509b3077611SDavid Wu .num = 3, 510b3077611SDavid Wu .pin = 12, 511b3077611SDavid Wu .reg = 0x68, 512b3077611SDavid Wu .bit = 8, 513b3077611SDavid Wu .mask = 0x7 514b3077611SDavid Wu }, { 515b3077611SDavid Wu .num = 3, 516b3077611SDavid Wu .pin = 13, 517b3077611SDavid Wu .reg = 0x68, 518b3077611SDavid Wu .bit = 12, 519b3077611SDavid Wu .mask = 0x7 520b3077611SDavid Wu }, 521b3077611SDavid Wu }; 522b3077611SDavid Wu 523d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = { 524d5517017SDavid Wu { 525d5517017SDavid Wu .num = 1, 526d5517017SDavid Wu .pin = 14, 527d5517017SDavid Wu .reg = 0x28, 528d5517017SDavid Wu .bit = 12, 529d5517017SDavid Wu .mask = 0xf 530d5517017SDavid Wu }, { 531d5517017SDavid Wu .num = 1, 532d5517017SDavid Wu .pin = 15, 533d5517017SDavid Wu .reg = 0x2c, 534d5517017SDavid Wu .bit = 0, 535d5517017SDavid Wu .mask = 0x3 536d5517017SDavid Wu }, { 537d5517017SDavid Wu .num = 1, 538d5517017SDavid Wu .pin = 18, 539d5517017SDavid Wu .reg = 0x30, 540d5517017SDavid Wu .bit = 4, 541d5517017SDavid Wu .mask = 0xf 542d5517017SDavid Wu }, { 543d5517017SDavid Wu .num = 1, 544d5517017SDavid Wu .pin = 19, 545d5517017SDavid Wu .reg = 0x30, 546d5517017SDavid Wu .bit = 8, 547d5517017SDavid Wu .mask = 0xf 548d5517017SDavid Wu }, { 549d5517017SDavid Wu .num = 1, 550d5517017SDavid Wu .pin = 20, 551d5517017SDavid Wu .reg = 0x30, 552d5517017SDavid Wu .bit = 12, 553d5517017SDavid Wu .mask = 0xf 554d5517017SDavid Wu }, { 555d5517017SDavid Wu .num = 1, 556d5517017SDavid Wu .pin = 21, 557d5517017SDavid Wu .reg = 0x34, 558d5517017SDavid Wu .bit = 0, 559d5517017SDavid Wu .mask = 0xf 560d5517017SDavid Wu }, { 561d5517017SDavid Wu .num = 1, 562d5517017SDavid Wu .pin = 22, 563d5517017SDavid Wu .reg = 0x34, 564d5517017SDavid Wu .bit = 4, 565d5517017SDavid Wu .mask = 0xf 566d5517017SDavid Wu }, { 567d5517017SDavid Wu .num = 1, 568d5517017SDavid Wu .pin = 23, 569d5517017SDavid Wu .reg = 0x34, 570d5517017SDavid Wu .bit = 8, 571d5517017SDavid Wu .mask = 0xf 572d5517017SDavid Wu }, { 573d5517017SDavid Wu .num = 3, 574752032c9SDavid.Wu .pin = 12, 575752032c9SDavid.Wu .reg = 0x68, 576752032c9SDavid.Wu .bit = 8, 577752032c9SDavid.Wu .mask = 0xf 578752032c9SDavid.Wu }, { 579752032c9SDavid.Wu .num = 3, 580d5517017SDavid Wu .pin = 13, 581d5517017SDavid Wu .reg = 0x68, 582d5517017SDavid Wu .bit = 12, 583d5517017SDavid Wu .mask = 0xf 584d5517017SDavid Wu }, { 585d5517017SDavid Wu .num = 2, 586d5517017SDavid Wu .pin = 2, 587d5517017SDavid Wu .reg = 0x608, 588d5517017SDavid Wu .bit = 0, 589d5517017SDavid Wu .mask = 0x7 590d5517017SDavid Wu }, { 591d5517017SDavid Wu .num = 2, 592d5517017SDavid Wu .pin = 3, 593d5517017SDavid Wu .reg = 0x608, 594d5517017SDavid Wu .bit = 4, 595d5517017SDavid Wu .mask = 0x7 596d5517017SDavid Wu }, { 597d5517017SDavid Wu .num = 2, 598d5517017SDavid Wu .pin = 16, 599d5517017SDavid Wu .reg = 0x610, 600d5517017SDavid Wu .bit = 8, 601d5517017SDavid Wu .mask = 0x7 602d5517017SDavid Wu }, { 603d5517017SDavid Wu .num = 3, 604d5517017SDavid Wu .pin = 10, 605d5517017SDavid Wu .reg = 0x610, 606d5517017SDavid Wu .bit = 0, 607d5517017SDavid Wu .mask = 0x7 608d5517017SDavid Wu }, { 609d5517017SDavid Wu .num = 3, 610d5517017SDavid Wu .pin = 11, 611d5517017SDavid Wu .reg = 0x610, 612d5517017SDavid Wu .bit = 4, 613d5517017SDavid Wu .mask = 0x7 614d5517017SDavid Wu }, 615d5517017SDavid Wu }; 616d5517017SDavid Wu 61749c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = { 61849c55878SDavid Wu { 61949c55878SDavid Wu .num = 2, 62049c55878SDavid Wu .pin = 12, 62149c55878SDavid Wu .reg = 0x24, 62249c55878SDavid Wu .bit = 8, 62349c55878SDavid Wu .mask = 0x3 62449c55878SDavid Wu }, { 62549c55878SDavid Wu .num = 2, 62649c55878SDavid Wu .pin = 15, 62749c55878SDavid Wu .reg = 0x28, 62849c55878SDavid Wu .bit = 0, 62949c55878SDavid Wu .mask = 0x7 63049c55878SDavid Wu }, { 63149c55878SDavid Wu .num = 2, 63249c55878SDavid Wu .pin = 23, 63349c55878SDavid Wu .reg = 0x30, 63449c55878SDavid Wu .bit = 14, 63549c55878SDavid Wu .mask = 0x3 63649c55878SDavid Wu }, 63749c55878SDavid Wu }; 63849c55878SDavid Wu 63949c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, 64049c55878SDavid Wu int *reg, u8 *bit, int *mask) 64149c55878SDavid Wu { 64249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 64349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 64449c55878SDavid Wu struct rockchip_mux_recalced_data *data; 64549c55878SDavid Wu int i; 64649c55878SDavid Wu 64749c55878SDavid Wu for (i = 0; i < ctrl->niomux_recalced; i++) { 64849c55878SDavid Wu data = &ctrl->iomux_recalced[i]; 64949c55878SDavid Wu if (data->num == bank->bank_num && 65049c55878SDavid Wu data->pin == pin) 65149c55878SDavid Wu break; 65249c55878SDavid Wu } 65349c55878SDavid Wu 65449c55878SDavid Wu if (i >= ctrl->niomux_recalced) 65549c55878SDavid Wu return; 65649c55878SDavid Wu 65749c55878SDavid Wu *reg = data->reg; 65849c55878SDavid Wu *mask = data->mask; 65949c55878SDavid Wu *bit = data->bit; 66049c55878SDavid Wu } 66149c55878SDavid Wu 66249c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = { 66349c55878SDavid Wu { 66449c55878SDavid Wu /* cif-d2m0 */ 66549c55878SDavid Wu .bank_num = 2, 66649c55878SDavid Wu .pin = 0, 66749c55878SDavid Wu .func = 1, 66849c55878SDavid Wu .route_offset = 0x184, 66949c55878SDavid Wu .route_val = BIT(16 + 7), 67049c55878SDavid Wu }, { 67149c55878SDavid Wu /* cif-d2m1 */ 67249c55878SDavid Wu .bank_num = 3, 67349c55878SDavid Wu .pin = 3, 67449c55878SDavid Wu .func = 3, 67549c55878SDavid Wu .route_offset = 0x184, 67649c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 67749c55878SDavid Wu }, { 67849c55878SDavid Wu /* pdm-m0 */ 67949c55878SDavid Wu .bank_num = 3, 68049c55878SDavid Wu .pin = 22, 68149c55878SDavid Wu .func = 2, 68249c55878SDavid Wu .route_offset = 0x184, 68349c55878SDavid Wu .route_val = BIT(16 + 8), 68449c55878SDavid Wu }, { 68549c55878SDavid Wu /* pdm-m1 */ 68649c55878SDavid Wu .bank_num = 2, 68749c55878SDavid Wu .pin = 22, 68849c55878SDavid Wu .func = 1, 68949c55878SDavid Wu .route_offset = 0x184, 69049c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 69149c55878SDavid Wu }, { 69249c55878SDavid Wu /* uart2-rxm0 */ 69349c55878SDavid Wu .bank_num = 1, 694793770dfSDavid Wu .pin = 27, 69549c55878SDavid Wu .func = 2, 69649c55878SDavid Wu .route_offset = 0x184, 697793770dfSDavid Wu .route_val = BIT(16 + 10), 69849c55878SDavid Wu }, { 69949c55878SDavid Wu /* uart2-rxm1 */ 70049c55878SDavid Wu .bank_num = 2, 70149c55878SDavid Wu .pin = 14, 70249c55878SDavid Wu .func = 2, 70349c55878SDavid Wu .route_offset = 0x184, 704793770dfSDavid Wu .route_val = BIT(16 + 10) | BIT(10), 70549c55878SDavid Wu }, { 70649c55878SDavid Wu /* uart3-rxm0 */ 70749c55878SDavid Wu .bank_num = 0, 70849c55878SDavid Wu .pin = 17, 70949c55878SDavid Wu .func = 2, 71049c55878SDavid Wu .route_offset = 0x184, 711793770dfSDavid Wu .route_val = BIT(16 + 9), 71249c55878SDavid Wu }, { 71349c55878SDavid Wu /* uart3-rxm1 */ 71449c55878SDavid Wu .bank_num = 1, 715793770dfSDavid Wu .pin = 15, 71649c55878SDavid Wu .func = 2, 71749c55878SDavid Wu .route_offset = 0x184, 718793770dfSDavid Wu .route_val = BIT(16 + 9) | BIT(9), 71949c55878SDavid Wu }, 72049c55878SDavid Wu }; 72149c55878SDavid Wu 722a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = { 723a2a3fc8fSJianqun Xu { 724a2a3fc8fSJianqun Xu /* i2c2m0_sda */ 725a2a3fc8fSJianqun Xu .bank_num = 3, 726a2a3fc8fSJianqun Xu .pin = 12, 727a2a3fc8fSJianqun Xu .func = 2, 728a2a3fc8fSJianqun Xu .route_offset = 0x190, 729a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3), 730a2a3fc8fSJianqun Xu }, { 731a2a3fc8fSJianqun Xu /* i2c2m1_sda */ 732a2a3fc8fSJianqun Xu .bank_num = 1, 733a2a3fc8fSJianqun Xu .pin = 13, 734a2a3fc8fSJianqun Xu .func = 2, 735a2a3fc8fSJianqun Xu .route_offset = 0x190, 736a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3) | BIT(3), 737a2a3fc8fSJianqun Xu }, { 738a2a3fc8fSJianqun Xu /* uart2_rxm0 */ 739a2a3fc8fSJianqun Xu .bank_num = 4, 740a2a3fc8fSJianqun Xu .pin = 3, 741a2a3fc8fSJianqun Xu .func = 2, 742a2a3fc8fSJianqun Xu .route_offset = 0x190, 743a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15), 744a2a3fc8fSJianqun Xu }, { 745a2a3fc8fSJianqun Xu /* uart2_rxm1 */ 746a2a3fc8fSJianqun Xu .bank_num = 2, 747a2a3fc8fSJianqun Xu .pin = 25, 748a2a3fc8fSJianqun Xu .func = 2, 749a2a3fc8fSJianqun Xu .route_offset = 0x190, 750a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15), 751a2a3fc8fSJianqun Xu }, { 752a2a3fc8fSJianqun Xu /* uart2_rxm2 */ 753a2a3fc8fSJianqun Xu .bank_num = 3, 754a2a3fc8fSJianqun Xu .pin = 4, 755a2a3fc8fSJianqun Xu .func = 2, 756a2a3fc8fSJianqun Xu .route_offset = 0x190, 757a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15), 758a2a3fc8fSJianqun Xu }, 759a2a3fc8fSJianqun Xu }; 760a2a3fc8fSJianqun Xu 76149c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = { 76249c55878SDavid Wu { 76349c55878SDavid Wu /* spi-0 */ 76449c55878SDavid Wu .bank_num = 1, 76549c55878SDavid Wu .pin = 10, 76649c55878SDavid Wu .func = 1, 76749c55878SDavid Wu .route_offset = 0x144, 76849c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4), 76949c55878SDavid Wu }, { 77049c55878SDavid Wu /* spi-1 */ 77149c55878SDavid Wu .bank_num = 1, 77249c55878SDavid Wu .pin = 27, 77349c55878SDavid Wu .func = 3, 77449c55878SDavid Wu .route_offset = 0x144, 77549c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3), 77649c55878SDavid Wu }, { 77749c55878SDavid Wu /* spi-2 */ 77849c55878SDavid Wu .bank_num = 0, 77949c55878SDavid Wu .pin = 13, 78049c55878SDavid Wu .func = 2, 78149c55878SDavid Wu .route_offset = 0x144, 78249c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4), 78349c55878SDavid Wu }, { 78449c55878SDavid Wu /* i2s-0 */ 78549c55878SDavid Wu .bank_num = 1, 78649c55878SDavid Wu .pin = 5, 78749c55878SDavid Wu .func = 1, 78849c55878SDavid Wu .route_offset = 0x144, 78949c55878SDavid Wu .route_val = BIT(16 + 5), 79049c55878SDavid Wu }, { 79149c55878SDavid Wu /* i2s-1 */ 79249c55878SDavid Wu .bank_num = 0, 79349c55878SDavid Wu .pin = 14, 79449c55878SDavid Wu .func = 1, 79549c55878SDavid Wu .route_offset = 0x144, 79649c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 79749c55878SDavid Wu }, { 79849c55878SDavid Wu /* emmc-0 */ 79949c55878SDavid Wu .bank_num = 1, 80049c55878SDavid Wu .pin = 22, 80149c55878SDavid Wu .func = 2, 80249c55878SDavid Wu .route_offset = 0x144, 80349c55878SDavid Wu .route_val = BIT(16 + 6), 80449c55878SDavid Wu }, { 80549c55878SDavid Wu /* emmc-1 */ 80649c55878SDavid Wu .bank_num = 2, 80749c55878SDavid Wu .pin = 4, 80849c55878SDavid Wu .func = 2, 80949c55878SDavid Wu .route_offset = 0x144, 81049c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 81149c55878SDavid Wu }, 81249c55878SDavid Wu }; 81349c55878SDavid Wu 81449c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = { 81549c55878SDavid Wu { 81649c55878SDavid Wu /* pwm0-0 */ 81749c55878SDavid Wu .bank_num = 0, 81849c55878SDavid Wu .pin = 26, 81949c55878SDavid Wu .func = 1, 82049c55878SDavid Wu .route_offset = 0x50, 82149c55878SDavid Wu .route_val = BIT(16), 82249c55878SDavid Wu }, { 82349c55878SDavid Wu /* pwm0-1 */ 82449c55878SDavid Wu .bank_num = 3, 82549c55878SDavid Wu .pin = 21, 82649c55878SDavid Wu .func = 1, 82749c55878SDavid Wu .route_offset = 0x50, 82849c55878SDavid Wu .route_val = BIT(16) | BIT(0), 82949c55878SDavid Wu }, { 83049c55878SDavid Wu /* pwm1-0 */ 83149c55878SDavid Wu .bank_num = 0, 83249c55878SDavid Wu .pin = 27, 83349c55878SDavid Wu .func = 1, 83449c55878SDavid Wu .route_offset = 0x50, 83549c55878SDavid Wu .route_val = BIT(16 + 1), 83649c55878SDavid Wu }, { 83749c55878SDavid Wu /* pwm1-1 */ 83849c55878SDavid Wu .bank_num = 0, 83949c55878SDavid Wu .pin = 30, 84049c55878SDavid Wu .func = 2, 84149c55878SDavid Wu .route_offset = 0x50, 84249c55878SDavid Wu .route_val = BIT(16 + 1) | BIT(1), 84349c55878SDavid Wu }, { 84449c55878SDavid Wu /* pwm2-0 */ 84549c55878SDavid Wu .bank_num = 0, 84649c55878SDavid Wu .pin = 28, 84749c55878SDavid Wu .func = 1, 84849c55878SDavid Wu .route_offset = 0x50, 84949c55878SDavid Wu .route_val = BIT(16 + 2), 85049c55878SDavid Wu }, { 85149c55878SDavid Wu /* pwm2-1 */ 85249c55878SDavid Wu .bank_num = 1, 85349c55878SDavid Wu .pin = 12, 85449c55878SDavid Wu .func = 2, 85549c55878SDavid Wu .route_offset = 0x50, 85649c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 85749c55878SDavid Wu }, { 85849c55878SDavid Wu /* pwm3-0 */ 85949c55878SDavid Wu .bank_num = 3, 86049c55878SDavid Wu .pin = 26, 86149c55878SDavid Wu .func = 1, 86249c55878SDavid Wu .route_offset = 0x50, 86349c55878SDavid Wu .route_val = BIT(16 + 3), 86449c55878SDavid Wu }, { 86549c55878SDavid Wu /* pwm3-1 */ 86649c55878SDavid Wu .bank_num = 1, 86749c55878SDavid Wu .pin = 11, 86849c55878SDavid Wu .func = 2, 86949c55878SDavid Wu .route_offset = 0x50, 87049c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 87149c55878SDavid Wu }, { 87249c55878SDavid Wu /* sdio-0_d0 */ 87349c55878SDavid Wu .bank_num = 1, 87449c55878SDavid Wu .pin = 1, 87549c55878SDavid Wu .func = 1, 87649c55878SDavid Wu .route_offset = 0x50, 87749c55878SDavid Wu .route_val = BIT(16 + 4), 87849c55878SDavid Wu }, { 87949c55878SDavid Wu /* sdio-1_d0 */ 88049c55878SDavid Wu .bank_num = 3, 88149c55878SDavid Wu .pin = 2, 88249c55878SDavid Wu .func = 1, 88349c55878SDavid Wu .route_offset = 0x50, 88449c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 88549c55878SDavid Wu }, { 88649c55878SDavid Wu /* spi-0_rx */ 88749c55878SDavid Wu .bank_num = 0, 88849c55878SDavid Wu .pin = 13, 88949c55878SDavid Wu .func = 2, 89049c55878SDavid Wu .route_offset = 0x50, 89149c55878SDavid Wu .route_val = BIT(16 + 5), 89249c55878SDavid Wu }, { 89349c55878SDavid Wu /* spi-1_rx */ 89449c55878SDavid Wu .bank_num = 2, 89549c55878SDavid Wu .pin = 0, 89649c55878SDavid Wu .func = 2, 89749c55878SDavid Wu .route_offset = 0x50, 89849c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 89949c55878SDavid Wu }, { 90049c55878SDavid Wu /* emmc-0_cmd */ 90149c55878SDavid Wu .bank_num = 1, 90249c55878SDavid Wu .pin = 22, 90349c55878SDavid Wu .func = 2, 90449c55878SDavid Wu .route_offset = 0x50, 90549c55878SDavid Wu .route_val = BIT(16 + 7), 90649c55878SDavid Wu }, { 90749c55878SDavid Wu /* emmc-1_cmd */ 90849c55878SDavid Wu .bank_num = 2, 90949c55878SDavid Wu .pin = 4, 91049c55878SDavid Wu .func = 2, 91149c55878SDavid Wu .route_offset = 0x50, 91249c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 91349c55878SDavid Wu }, { 91449c55878SDavid Wu /* uart2-0_rx */ 91549c55878SDavid Wu .bank_num = 1, 91649c55878SDavid Wu .pin = 19, 91749c55878SDavid Wu .func = 2, 91849c55878SDavid Wu .route_offset = 0x50, 91949c55878SDavid Wu .route_val = BIT(16 + 8), 92049c55878SDavid Wu }, { 92149c55878SDavid Wu /* uart2-1_rx */ 92249c55878SDavid Wu .bank_num = 1, 92349c55878SDavid Wu .pin = 10, 92449c55878SDavid Wu .func = 2, 92549c55878SDavid Wu .route_offset = 0x50, 92649c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 92749c55878SDavid Wu }, { 92849c55878SDavid Wu /* uart1-0_rx */ 92949c55878SDavid Wu .bank_num = 1, 93049c55878SDavid Wu .pin = 10, 93149c55878SDavid Wu .func = 1, 93249c55878SDavid Wu .route_offset = 0x50, 93349c55878SDavid Wu .route_val = BIT(16 + 11), 93449c55878SDavid Wu }, { 93549c55878SDavid Wu /* uart1-1_rx */ 93649c55878SDavid Wu .bank_num = 3, 93749c55878SDavid Wu .pin = 13, 93849c55878SDavid Wu .func = 1, 93949c55878SDavid Wu .route_offset = 0x50, 94049c55878SDavid Wu .route_val = BIT(16 + 11) | BIT(11), 94149c55878SDavid Wu }, 94249c55878SDavid Wu }; 94349c55878SDavid Wu 94449c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = { 94549c55878SDavid Wu { 94649c55878SDavid Wu /* edphdmi_cecinoutt1 */ 94749c55878SDavid Wu .bank_num = 7, 94849c55878SDavid Wu .pin = 16, 94949c55878SDavid Wu .func = 2, 95049c55878SDavid Wu .route_offset = 0x264, 95149c55878SDavid Wu .route_val = BIT(16 + 12) | BIT(12), 95249c55878SDavid Wu }, { 95349c55878SDavid Wu /* edphdmi_cecinout */ 95449c55878SDavid Wu .bank_num = 7, 95549c55878SDavid Wu .pin = 23, 95649c55878SDavid Wu .func = 4, 95749c55878SDavid Wu .route_offset = 0x264, 95849c55878SDavid Wu .route_val = BIT(16 + 12), 95949c55878SDavid Wu }, 96049c55878SDavid Wu }; 96149c55878SDavid Wu 962b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = { 963b3077611SDavid Wu { 964d5517017SDavid Wu /* rtc_clk */ 965d5517017SDavid Wu .bank_num = 0, 966d5517017SDavid Wu .pin = 19, 967d5517017SDavid Wu .func = 1, 968d5517017SDavid Wu .route_offset = 0x314, 969d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 970d5517017SDavid Wu }, { 971b3077611SDavid Wu /* uart2_rxm0 */ 972b3077611SDavid Wu .bank_num = 1, 973b3077611SDavid Wu .pin = 22, 974b3077611SDavid Wu .func = 2, 975b3077611SDavid Wu .route_offset = 0x314, 976b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 977b3077611SDavid Wu }, { 978b3077611SDavid Wu /* uart2_rxm1 */ 979b3077611SDavid Wu .bank_num = 4, 980b3077611SDavid Wu .pin = 26, 981b3077611SDavid Wu .func = 2, 982b3077611SDavid Wu .route_offset = 0x314, 983b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 984b3077611SDavid Wu }, { 985b3077611SDavid Wu /* i2c3_sdam0 */ 986b3077611SDavid Wu .bank_num = 0, 987b3077611SDavid Wu .pin = 23, 988b3077611SDavid Wu .func = 2, 989b3077611SDavid Wu .route_offset = 0x314, 990b3077611SDavid Wu .route_val = BIT(16 + 4), 991b3077611SDavid Wu }, { 992b3077611SDavid Wu /* i2c3_sdam1 */ 993b3077611SDavid Wu .bank_num = 3, 994b3077611SDavid Wu .pin = 12, 995b3077611SDavid Wu .func = 2, 996b3077611SDavid Wu .route_offset = 0x314, 997b3077611SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 998d5517017SDavid Wu }, { 999d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1000d5517017SDavid Wu .bank_num = 1, 1001d5517017SDavid Wu .pin = 3, 1002d5517017SDavid Wu .func = 2, 1003d5517017SDavid Wu .route_offset = 0x308, 1004d5517017SDavid Wu .route_val = BIT(16 + 3), 1005d5517017SDavid Wu }, { 1006d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1007d5517017SDavid Wu .bank_num = 1, 1008d5517017SDavid Wu .pin = 4, 1009d5517017SDavid Wu .func = 2, 1010d5517017SDavid Wu .route_offset = 0x308, 1011d5517017SDavid Wu .route_val = BIT(16 + 3), 1012d5517017SDavid Wu }, { 1013d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1014d5517017SDavid Wu .bank_num = 1, 1015d5517017SDavid Wu .pin = 13, 1016d5517017SDavid Wu .func = 2, 1017d5517017SDavid Wu .route_offset = 0x308, 1018d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1019d5517017SDavid Wu }, { 1020d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1021d5517017SDavid Wu .bank_num = 1, 1022d5517017SDavid Wu .pin = 14, 1023d5517017SDavid Wu .func = 2, 1024d5517017SDavid Wu .route_offset = 0x308, 1025d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1026d5517017SDavid Wu }, { 1027d5517017SDavid Wu /* pdm-clkm0 */ 1028d5517017SDavid Wu .bank_num = 1, 1029d5517017SDavid Wu .pin = 4, 1030d5517017SDavid Wu .func = 3, 1031d5517017SDavid Wu .route_offset = 0x308, 1032d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1033d5517017SDavid Wu }, { 1034d5517017SDavid Wu /* pdm-clkm1 */ 1035d5517017SDavid Wu .bank_num = 1, 1036d5517017SDavid Wu .pin = 14, 1037d5517017SDavid Wu .func = 4, 1038d5517017SDavid Wu .route_offset = 0x308, 1039d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1040d5517017SDavid Wu }, { 1041d5517017SDavid Wu /* pdm-clkm2 */ 1042d5517017SDavid Wu .bank_num = 2, 1043d5517017SDavid Wu .pin = 6, 1044d5517017SDavid Wu .func = 2, 1045d5517017SDavid Wu .route_offset = 0x308, 1046d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1047d5517017SDavid Wu }, { 1048d5517017SDavid Wu /* pdm-clkm-m2 */ 1049d5517017SDavid Wu .bank_num = 2, 1050d5517017SDavid Wu .pin = 4, 1051d5517017SDavid Wu .func = 3, 1052d5517017SDavid Wu .route_offset = 0x600, 1053d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1054d5517017SDavid Wu }, 1055d5517017SDavid Wu }; 1056d5517017SDavid Wu 1057d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = { 1058d5517017SDavid Wu { 1059d5517017SDavid Wu /* rtc_clk */ 1060d5517017SDavid Wu .bank_num = 0, 1061d5517017SDavid Wu .pin = 19, 1062d5517017SDavid Wu .func = 1, 1063d5517017SDavid Wu .route_offset = 0x314, 1064d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1065d5517017SDavid Wu }, { 1066d5517017SDavid Wu /* uart2_rxm0 */ 1067d5517017SDavid Wu .bank_num = 1, 1068d5517017SDavid Wu .pin = 22, 1069d5517017SDavid Wu .func = 2, 1070d5517017SDavid Wu .route_offset = 0x314, 1071d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1072d5517017SDavid Wu }, { 1073d5517017SDavid Wu /* uart2_rxm1 */ 1074d5517017SDavid Wu .bank_num = 4, 1075d5517017SDavid Wu .pin = 26, 1076d5517017SDavid Wu .func = 2, 1077d5517017SDavid Wu .route_offset = 0x314, 1078d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1079d5517017SDavid Wu }, { 1080d5517017SDavid Wu /* i2c3_sdam0 */ 1081d5517017SDavid Wu .bank_num = 0, 1082d5517017SDavid Wu .pin = 15, 1083d5517017SDavid Wu .func = 2, 1084d5517017SDavid Wu .route_offset = 0x608, 1085d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9), 1086d5517017SDavid Wu }, { 1087d5517017SDavid Wu /* i2c3_sdam1 */ 1088d5517017SDavid Wu .bank_num = 3, 1089d5517017SDavid Wu .pin = 12, 1090d5517017SDavid Wu .func = 2, 1091d5517017SDavid Wu .route_offset = 0x608, 1092d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8), 1093d5517017SDavid Wu }, { 1094d5517017SDavid Wu /* i2c3_sdam2 */ 1095d5517017SDavid Wu .bank_num = 2, 1096d5517017SDavid Wu .pin = 0, 1097d5517017SDavid Wu .func = 3, 1098d5517017SDavid Wu .route_offset = 0x608, 1099d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9), 1100d5517017SDavid Wu }, { 1101d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1102d5517017SDavid Wu .bank_num = 1, 1103d5517017SDavid Wu .pin = 3, 1104d5517017SDavid Wu .func = 2, 1105d5517017SDavid Wu .route_offset = 0x308, 1106d5517017SDavid Wu .route_val = BIT(16 + 3), 1107d5517017SDavid Wu }, { 1108d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1109d5517017SDavid Wu .bank_num = 1, 1110d5517017SDavid Wu .pin = 4, 1111d5517017SDavid Wu .func = 2, 1112d5517017SDavid Wu .route_offset = 0x308, 1113d5517017SDavid Wu .route_val = BIT(16 + 3), 1114d5517017SDavid Wu }, { 1115d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1116d5517017SDavid Wu .bank_num = 1, 1117d5517017SDavid Wu .pin = 13, 1118d5517017SDavid Wu .func = 2, 1119d5517017SDavid Wu .route_offset = 0x308, 1120d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1121d5517017SDavid Wu }, { 1122d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1123d5517017SDavid Wu .bank_num = 1, 1124d5517017SDavid Wu .pin = 14, 1125d5517017SDavid Wu .func = 2, 1126d5517017SDavid Wu .route_offset = 0x308, 1127d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1128d5517017SDavid Wu }, { 1129d5517017SDavid Wu /* pdm-clkm0 */ 1130d5517017SDavid Wu .bank_num = 1, 1131d5517017SDavid Wu .pin = 4, 1132d5517017SDavid Wu .func = 3, 1133d5517017SDavid Wu .route_offset = 0x308, 1134d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1135d5517017SDavid Wu }, { 1136d5517017SDavid Wu /* pdm-clkm1 */ 1137d5517017SDavid Wu .bank_num = 1, 1138d5517017SDavid Wu .pin = 14, 1139d5517017SDavid Wu .func = 4, 1140d5517017SDavid Wu .route_offset = 0x308, 1141d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1142d5517017SDavid Wu }, { 1143d5517017SDavid Wu /* pdm-clkm2 */ 1144d5517017SDavid Wu .bank_num = 2, 1145d5517017SDavid Wu .pin = 6, 1146d5517017SDavid Wu .func = 2, 1147d5517017SDavid Wu .route_offset = 0x308, 1148d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1149d5517017SDavid Wu }, { 1150d5517017SDavid Wu /* pdm-clkm-m2 */ 1151d5517017SDavid Wu .bank_num = 2, 1152d5517017SDavid Wu .pin = 4, 1153d5517017SDavid Wu .func = 3, 1154d5517017SDavid Wu .route_offset = 0x600, 1155d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1156d5517017SDavid Wu }, { 1157d5517017SDavid Wu /* spi1_miso */ 1158d5517017SDavid Wu .bank_num = 3, 1159d5517017SDavid Wu .pin = 10, 1160d5517017SDavid Wu .func = 3, 1161d5517017SDavid Wu .route_offset = 0x314, 1162d5517017SDavid Wu .route_val = BIT(16 + 9), 1163d5517017SDavid Wu }, { 1164d5517017SDavid Wu /* spi1_miso_m1 */ 1165d5517017SDavid Wu .bank_num = 2, 1166d5517017SDavid Wu .pin = 4, 1167d5517017SDavid Wu .func = 2, 1168d5517017SDavid Wu .route_offset = 0x314, 1169d5517017SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 1170d5517017SDavid Wu }, { 1171d5517017SDavid Wu /* owire_m0 */ 1172d5517017SDavid Wu .bank_num = 0, 1173d5517017SDavid Wu .pin = 11, 1174d5517017SDavid Wu .func = 3, 1175d5517017SDavid Wu .route_offset = 0x314, 1176d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 1177d5517017SDavid Wu }, { 1178d5517017SDavid Wu /* owire_m1 */ 1179d5517017SDavid Wu .bank_num = 1, 1180d5517017SDavid Wu .pin = 22, 1181d5517017SDavid Wu .func = 7, 1182d5517017SDavid Wu .route_offset = 0x314, 1183d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 1184d5517017SDavid Wu }, { 1185d5517017SDavid Wu /* owire_m2 */ 1186d5517017SDavid Wu .bank_num = 2, 1187d5517017SDavid Wu .pin = 2, 1188d5517017SDavid Wu .func = 5, 1189d5517017SDavid Wu .route_offset = 0x314, 1190d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 1191d5517017SDavid Wu }, { 1192d5517017SDavid Wu /* can_rxd_m0 */ 1193d5517017SDavid Wu .bank_num = 0, 1194d5517017SDavid Wu .pin = 11, 1195d5517017SDavid Wu .func = 2, 1196d5517017SDavid Wu .route_offset = 0x314, 1197d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1198d5517017SDavid Wu }, { 1199d5517017SDavid Wu /* can_rxd_m1 */ 1200d5517017SDavid Wu .bank_num = 1, 1201d5517017SDavid Wu .pin = 22, 1202d5517017SDavid Wu .func = 5, 1203d5517017SDavid Wu .route_offset = 0x314, 1204d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1205d5517017SDavid Wu }, { 1206d5517017SDavid Wu /* can_rxd_m2 */ 1207d5517017SDavid Wu .bank_num = 2, 1208d5517017SDavid Wu .pin = 2, 1209d5517017SDavid Wu .func = 4, 1210d5517017SDavid Wu .route_offset = 0x314, 1211d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1212d5517017SDavid Wu }, { 1213d5517017SDavid Wu /* mac_rxd0_m0 */ 1214d5517017SDavid Wu .bank_num = 1, 1215d5517017SDavid Wu .pin = 20, 1216d5517017SDavid Wu .func = 3, 1217d5517017SDavid Wu .route_offset = 0x314, 1218d5517017SDavid Wu .route_val = BIT(16 + 14), 1219d5517017SDavid Wu }, { 1220d5517017SDavid Wu /* mac_rxd0_m1 */ 1221d5517017SDavid Wu .bank_num = 4, 1222d5517017SDavid Wu .pin = 2, 1223d5517017SDavid Wu .func = 2, 1224d5517017SDavid Wu .route_offset = 0x314, 1225d5517017SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 1226d5517017SDavid Wu }, { 1227d5517017SDavid Wu /* uart3_rx */ 1228d5517017SDavid Wu .bank_num = 3, 1229d5517017SDavid Wu .pin = 12, 1230d5517017SDavid Wu .func = 4, 1231d5517017SDavid Wu .route_offset = 0x314, 1232d5517017SDavid Wu .route_val = BIT(16 + 15), 1233d5517017SDavid Wu }, { 1234d5517017SDavid Wu /* uart3_rx_m1 */ 1235d5517017SDavid Wu .bank_num = 0, 1236d5517017SDavid Wu .pin = 17, 1237d5517017SDavid Wu .func = 3, 1238d5517017SDavid Wu .route_offset = 0x314, 1239d5517017SDavid Wu .route_val = BIT(16 + 15) | BIT(15), 1240b3077611SDavid Wu }, 1241b3077611SDavid Wu }; 1242b3077611SDavid Wu 124349c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = { 124449c55878SDavid Wu { 124549c55878SDavid Wu /* uart2dbg_rxm0 */ 124649c55878SDavid Wu .bank_num = 1, 124749c55878SDavid Wu .pin = 1, 124849c55878SDavid Wu .func = 2, 124949c55878SDavid Wu .route_offset = 0x50, 125049c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1), 125149c55878SDavid Wu }, { 125249c55878SDavid Wu /* uart2dbg_rxm1 */ 125349c55878SDavid Wu .bank_num = 2, 125449c55878SDavid Wu .pin = 1, 125549c55878SDavid Wu .func = 1, 125649c55878SDavid Wu .route_offset = 0x50, 125749c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1) | BIT(0), 125849c55878SDavid Wu }, { 125949c55878SDavid Wu /* gmac-m1_rxd0 */ 126049c55878SDavid Wu .bank_num = 1, 126149c55878SDavid Wu .pin = 11, 126249c55878SDavid Wu .func = 2, 126349c55878SDavid Wu .route_offset = 0x50, 126449c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 126549c55878SDavid Wu }, { 126649c55878SDavid Wu /* gmac-m1-optimized_rxd3 */ 126749c55878SDavid Wu .bank_num = 1, 126849c55878SDavid Wu .pin = 14, 126949c55878SDavid Wu .func = 2, 127049c55878SDavid Wu .route_offset = 0x50, 127149c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(10), 127249c55878SDavid Wu }, { 127349c55878SDavid Wu /* pdm_sdi0m0 */ 127449c55878SDavid Wu .bank_num = 2, 127549c55878SDavid Wu .pin = 19, 127649c55878SDavid Wu .func = 2, 127749c55878SDavid Wu .route_offset = 0x50, 127849c55878SDavid Wu .route_val = BIT(16 + 3), 127949c55878SDavid Wu }, { 128049c55878SDavid Wu /* pdm_sdi0m1 */ 128149c55878SDavid Wu .bank_num = 1, 128249c55878SDavid Wu .pin = 23, 128349c55878SDavid Wu .func = 3, 128449c55878SDavid Wu .route_offset = 0x50, 128549c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 128649c55878SDavid Wu }, { 128749c55878SDavid Wu /* spi_rxdm2 */ 128849c55878SDavid Wu .bank_num = 3, 128949c55878SDavid Wu .pin = 2, 129049c55878SDavid Wu .func = 4, 129149c55878SDavid Wu .route_offset = 0x50, 129249c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5), 129349c55878SDavid Wu }, { 129449c55878SDavid Wu /* i2s2_sdim0 */ 129549c55878SDavid Wu .bank_num = 1, 129649c55878SDavid Wu .pin = 24, 129749c55878SDavid Wu .func = 1, 129849c55878SDavid Wu .route_offset = 0x50, 129949c55878SDavid Wu .route_val = BIT(16 + 6), 130049c55878SDavid Wu }, { 130149c55878SDavid Wu /* i2s2_sdim1 */ 130249c55878SDavid Wu .bank_num = 3, 130349c55878SDavid Wu .pin = 2, 130449c55878SDavid Wu .func = 6, 130549c55878SDavid Wu .route_offset = 0x50, 130649c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 130749c55878SDavid Wu }, { 130849c55878SDavid Wu /* card_iom1 */ 130949c55878SDavid Wu .bank_num = 2, 131049c55878SDavid Wu .pin = 22, 131149c55878SDavid Wu .func = 3, 131249c55878SDavid Wu .route_offset = 0x50, 131349c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 131449c55878SDavid Wu }, { 131549c55878SDavid Wu /* tsp_d5m1 */ 131649c55878SDavid Wu .bank_num = 2, 131749c55878SDavid Wu .pin = 16, 131849c55878SDavid Wu .func = 3, 131949c55878SDavid Wu .route_offset = 0x50, 132049c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 132149c55878SDavid Wu }, { 132249c55878SDavid Wu /* cif_data5m1 */ 132349c55878SDavid Wu .bank_num = 2, 132449c55878SDavid Wu .pin = 16, 132549c55878SDavid Wu .func = 4, 132649c55878SDavid Wu .route_offset = 0x50, 132749c55878SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 132849c55878SDavid Wu }, 132949c55878SDavid Wu }; 133049c55878SDavid Wu 133149c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = { 133249c55878SDavid Wu { 133349c55878SDavid Wu /* uart2dbga_rx */ 133449c55878SDavid Wu .bank_num = 4, 133549c55878SDavid Wu .pin = 8, 133649c55878SDavid Wu .func = 2, 133749c55878SDavid Wu .route_offset = 0xe21c, 133849c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 133949c55878SDavid Wu }, { 134049c55878SDavid Wu /* uart2dbgb_rx */ 134149c55878SDavid Wu .bank_num = 4, 134249c55878SDavid Wu .pin = 16, 134349c55878SDavid Wu .func = 2, 134449c55878SDavid Wu .route_offset = 0xe21c, 134549c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 134649c55878SDavid Wu }, { 134749c55878SDavid Wu /* uart2dbgc_rx */ 134849c55878SDavid Wu .bank_num = 4, 134949c55878SDavid Wu .pin = 19, 135049c55878SDavid Wu .func = 1, 135149c55878SDavid Wu .route_offset = 0xe21c, 135249c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 135349c55878SDavid Wu }, { 135449c55878SDavid Wu /* pcie_clkreqn */ 135549c55878SDavid Wu .bank_num = 2, 135649c55878SDavid Wu .pin = 26, 135749c55878SDavid Wu .func = 2, 135849c55878SDavid Wu .route_offset = 0xe21c, 135949c55878SDavid Wu .route_val = BIT(16 + 14), 136049c55878SDavid Wu }, { 136149c55878SDavid Wu /* pcie_clkreqnb */ 136249c55878SDavid Wu .bank_num = 4, 136349c55878SDavid Wu .pin = 24, 136449c55878SDavid Wu .func = 1, 136549c55878SDavid Wu .route_offset = 0xe21c, 136649c55878SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 136749c55878SDavid Wu }, 136849c55878SDavid Wu }; 136949c55878SDavid Wu 137049c55878SDavid Wu static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, 137149c55878SDavid Wu int mux, u32 *reg, u32 *value) 137249c55878SDavid Wu { 137349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 137449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 137549c55878SDavid Wu struct rockchip_mux_route_data *data; 137649c55878SDavid Wu int i; 137749c55878SDavid Wu 137849c55878SDavid Wu for (i = 0; i < ctrl->niomux_routes; i++) { 137949c55878SDavid Wu data = &ctrl->iomux_routes[i]; 138049c55878SDavid Wu if ((data->bank_num == bank->bank_num) && 138149c55878SDavid Wu (data->pin == pin) && (data->func == mux)) 138249c55878SDavid Wu break; 138349c55878SDavid Wu } 138449c55878SDavid Wu 138549c55878SDavid Wu if (i >= ctrl->niomux_routes) 138649c55878SDavid Wu return false; 138749c55878SDavid Wu 138849c55878SDavid Wu *reg = data->route_offset; 138949c55878SDavid Wu *value = data->route_val; 139049c55878SDavid Wu 139149c55878SDavid Wu return true; 139249c55878SDavid Wu } 139349c55878SDavid Wu 139449c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) 139549c55878SDavid Wu { 139649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 139749c55878SDavid Wu int iomux_num = (pin / 8); 139849c55878SDavid Wu struct regmap *regmap; 139949c55878SDavid Wu unsigned int val; 140049c55878SDavid Wu int reg, ret, mask, mux_type; 140149c55878SDavid Wu u8 bit; 140249c55878SDavid Wu 140349c55878SDavid Wu if (iomux_num > 3) 140449c55878SDavid Wu return -EINVAL; 140549c55878SDavid Wu 140649c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 140749c55878SDavid Wu debug("pin %d is unrouted\n", pin); 140849c55878SDavid Wu return -EINVAL; 140949c55878SDavid Wu } 141049c55878SDavid Wu 141149c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 141249c55878SDavid Wu return RK_FUNC_GPIO; 141349c55878SDavid Wu 141449c55878SDavid Wu regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 141549c55878SDavid Wu ? priv->regmap_pmu : priv->regmap_base; 141649c55878SDavid Wu 141749c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 141849c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 141949c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 142049c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 142149c55878SDavid Wu if ((pin % 8) >= 4) 142249c55878SDavid Wu reg += 0x4; 142349c55878SDavid Wu bit = (pin % 4) * 4; 142449c55878SDavid Wu mask = 0xf; 142549c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 142649c55878SDavid Wu if ((pin % 8) >= 5) 142749c55878SDavid Wu reg += 0x4; 142849c55878SDavid Wu bit = (pin % 8 % 5) * 3; 142949c55878SDavid Wu mask = 0x7; 143049c55878SDavid Wu } else { 143149c55878SDavid Wu bit = (pin % 8) * 2; 143249c55878SDavid Wu mask = 0x3; 143349c55878SDavid Wu } 143449c55878SDavid Wu 143549c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 143649c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 143749c55878SDavid Wu 143849c55878SDavid Wu ret = regmap_read(regmap, reg, &val); 143949c55878SDavid Wu if (ret) 144049c55878SDavid Wu return ret; 144149c55878SDavid Wu 144249c55878SDavid Wu return ((val >> bit) & mask); 144349c55878SDavid Wu } 144449c55878SDavid Wu 144549c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, 144649c55878SDavid Wu int index) 144749c55878SDavid Wu { struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 144849c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 144949c55878SDavid Wu 145049c55878SDavid Wu return rockchip_get_mux(&ctrl->pin_banks[banknum], index); 145149c55878SDavid Wu } 145249c55878SDavid Wu 145349c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank, 145449c55878SDavid Wu int pin, int mux) 145549c55878SDavid Wu { 145649c55878SDavid Wu int iomux_num = (pin / 8); 145749c55878SDavid Wu 145849c55878SDavid Wu if (iomux_num > 3) 145949c55878SDavid Wu return -EINVAL; 146049c55878SDavid Wu 146149c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 146249c55878SDavid Wu debug("pin %d is unrouted\n", pin); 146349c55878SDavid Wu return -EINVAL; 146449c55878SDavid Wu } 146549c55878SDavid Wu 146649c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 146749c55878SDavid Wu if (mux != IOMUX_GPIO_ONLY) { 146849c55878SDavid Wu debug("pin %d only supports a gpio mux\n", pin); 146949c55878SDavid Wu return -ENOTSUPP; 147049c55878SDavid Wu } 147149c55878SDavid Wu } 147249c55878SDavid Wu 147349c55878SDavid Wu return 0; 147449c55878SDavid Wu } 147549c55878SDavid Wu 147649c55878SDavid Wu /* 147749c55878SDavid Wu * Set a new mux function for a pin. 147849c55878SDavid Wu * 147949c55878SDavid Wu * The register is divided into the upper and lower 16 bit. When changing 148049c55878SDavid Wu * a value, the previous register value is not read and changed. Instead 148149c55878SDavid Wu * it seems the changed bits are marked in the upper 16 bit, while the 148249c55878SDavid Wu * changed value gets set in the same offset in the lower 16 bit. 148349c55878SDavid Wu * All pin settings seem to be 2 bit wide in both the upper and lower 148449c55878SDavid Wu * parts. 148549c55878SDavid Wu * @bank: pin bank to change 148649c55878SDavid Wu * @pin: pin to change 148749c55878SDavid Wu * @mux: new mux function to set 148849c55878SDavid Wu */ 148949c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) 149049c55878SDavid Wu { 149149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 149249c55878SDavid Wu int iomux_num = (pin / 8); 149349c55878SDavid Wu struct regmap *regmap; 149449c55878SDavid Wu int reg, ret, mask, mux_type; 149549c55878SDavid Wu u8 bit; 149649c55878SDavid Wu u32 data, route_reg, route_val; 149749c55878SDavid Wu 149849c55878SDavid Wu ret = rockchip_verify_mux(bank, pin, mux); 149949c55878SDavid Wu if (ret < 0) 150049c55878SDavid Wu return ret; 150149c55878SDavid Wu 150249c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 150349c55878SDavid Wu return 0; 150449c55878SDavid Wu 150549c55878SDavid Wu debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); 150649c55878SDavid Wu 150749c55878SDavid Wu regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 150849c55878SDavid Wu ? priv->regmap_pmu : priv->regmap_base; 150949c55878SDavid Wu 151049c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 151149c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 151249c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 151349c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 151449c55878SDavid Wu if ((pin % 8) >= 4) 151549c55878SDavid Wu reg += 0x4; 151649c55878SDavid Wu bit = (pin % 4) * 4; 151749c55878SDavid Wu mask = 0xf; 151849c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 151949c55878SDavid Wu if ((pin % 8) >= 5) 152049c55878SDavid Wu reg += 0x4; 152149c55878SDavid Wu bit = (pin % 8 % 5) * 3; 152249c55878SDavid Wu mask = 0x7; 152349c55878SDavid Wu } else { 152449c55878SDavid Wu bit = (pin % 8) * 2; 152549c55878SDavid Wu mask = 0x3; 152649c55878SDavid Wu } 152749c55878SDavid Wu 152849c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 152949c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 153049c55878SDavid Wu 153149c55878SDavid Wu if (bank->route_mask & BIT(pin)) { 153249c55878SDavid Wu if (rockchip_get_mux_route(bank, pin, mux, &route_reg, 153349c55878SDavid Wu &route_val)) { 153449c55878SDavid Wu ret = regmap_write(regmap, route_reg, route_val); 153549c55878SDavid Wu if (ret) 153649c55878SDavid Wu return ret; 153749c55878SDavid Wu } 153849c55878SDavid Wu } 153949c55878SDavid Wu 15404bafc2daSDavid Wu if (mux_type & IOMUX_WRITABLE_32BIT) { 15418bf1bc66SDavid Wu regmap_read(regmap, reg, &data); 15424bafc2daSDavid Wu data &= ~(mask << bit); 15434bafc2daSDavid Wu } else { 154449c55878SDavid Wu data = (mask << (bit + 16)); 15454bafc2daSDavid Wu } 15468bf1bc66SDavid Wu 154749c55878SDavid Wu data |= (mux & mask) << bit; 154849c55878SDavid Wu ret = regmap_write(regmap, reg, data); 154949c55878SDavid Wu 155049c55878SDavid Wu return ret; 155149c55878SDavid Wu } 155249c55878SDavid Wu 155349c55878SDavid Wu #define PX30_PULL_PMU_OFFSET 0x10 155449c55878SDavid Wu #define PX30_PULL_GRF_OFFSET 0x60 155549c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN 2 155649c55878SDavid Wu #define PX30_PULL_PINS_PER_REG 8 155749c55878SDavid Wu #define PX30_PULL_BANK_STRIDE 16 155849c55878SDavid Wu 155949c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 156049c55878SDavid Wu int pin_num, struct regmap **regmap, 156149c55878SDavid Wu int *reg, u8 *bit) 156249c55878SDavid Wu { 156349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 156449c55878SDavid Wu 156549c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 156649c55878SDavid Wu if (bank->bank_num == 0) { 156749c55878SDavid Wu *regmap = priv->regmap_pmu; 156849c55878SDavid Wu *reg = PX30_PULL_PMU_OFFSET; 156949c55878SDavid Wu } else { 157049c55878SDavid Wu *regmap = priv->regmap_base; 157149c55878SDavid Wu *reg = PX30_PULL_GRF_OFFSET; 157249c55878SDavid Wu 157349c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 157449c55878SDavid Wu *reg -= 0x10; 157549c55878SDavid Wu *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; 157649c55878SDavid Wu } 157749c55878SDavid Wu 157849c55878SDavid Wu *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4); 157949c55878SDavid Wu *bit = (pin_num % PX30_PULL_PINS_PER_REG); 158049c55878SDavid Wu *bit *= PX30_PULL_BITS_PER_PIN; 158149c55878SDavid Wu } 158249c55878SDavid Wu 158349c55878SDavid Wu #define PX30_DRV_PMU_OFFSET 0x20 158449c55878SDavid Wu #define PX30_DRV_GRF_OFFSET 0xf0 158549c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN 2 158649c55878SDavid Wu #define PX30_DRV_PINS_PER_REG 8 158749c55878SDavid Wu #define PX30_DRV_BANK_STRIDE 16 158849c55878SDavid Wu 158949c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 159049c55878SDavid Wu int pin_num, struct regmap **regmap, 159149c55878SDavid Wu int *reg, u8 *bit) 159249c55878SDavid Wu { 159349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 159449c55878SDavid Wu 159549c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 159649c55878SDavid Wu if (bank->bank_num == 0) { 159749c55878SDavid Wu *regmap = priv->regmap_pmu; 159849c55878SDavid Wu *reg = PX30_DRV_PMU_OFFSET; 159949c55878SDavid Wu } else { 160049c55878SDavid Wu *regmap = priv->regmap_base; 160149c55878SDavid Wu *reg = PX30_DRV_GRF_OFFSET; 160249c55878SDavid Wu 160349c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 160449c55878SDavid Wu *reg -= 0x10; 160549c55878SDavid Wu *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; 160649c55878SDavid Wu } 160749c55878SDavid Wu 160849c55878SDavid Wu *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4); 160949c55878SDavid Wu *bit = (pin_num % PX30_DRV_PINS_PER_REG); 161049c55878SDavid Wu *bit *= PX30_DRV_BITS_PER_PIN; 161149c55878SDavid Wu } 161249c55878SDavid Wu 161349c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET 0x38 161449c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET 0xc0 161549c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG 16 161649c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE 16 161749c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG 8 161849c55878SDavid Wu 161949c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 162049c55878SDavid Wu int pin_num, 162149c55878SDavid Wu struct regmap **regmap, 162249c55878SDavid Wu int *reg, u8 *bit) 162349c55878SDavid Wu { 162449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 162549c55878SDavid Wu int pins_per_reg; 162649c55878SDavid Wu 162749c55878SDavid Wu if (bank->bank_num == 0) { 162849c55878SDavid Wu *regmap = priv->regmap_pmu; 162949c55878SDavid Wu *reg = PX30_SCHMITT_PMU_OFFSET; 163049c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 163149c55878SDavid Wu } else { 163249c55878SDavid Wu *regmap = priv->regmap_base; 163349c55878SDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 163449c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 163549c55878SDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 163649c55878SDavid Wu } 163749c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 163849c55878SDavid Wu *bit = pin_num % pins_per_reg; 163949c55878SDavid Wu 164049c55878SDavid Wu return 0; 164149c55878SDavid Wu } 164249c55878SDavid Wu 164349c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET 0x10 164449c55878SDavid Wu #define RV1108_PULL_OFFSET 0x110 164549c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG 8 164649c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN 2 164749c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE 16 164849c55878SDavid Wu 164949c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 165049c55878SDavid Wu int pin_num, struct regmap **regmap, 165149c55878SDavid Wu int *reg, u8 *bit) 165249c55878SDavid Wu { 165349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 165449c55878SDavid Wu 165549c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 165649c55878SDavid Wu if (bank->bank_num == 0) { 165749c55878SDavid Wu *regmap = priv->regmap_pmu; 165849c55878SDavid Wu *reg = RV1108_PULL_PMU_OFFSET; 165949c55878SDavid Wu } else { 166049c55878SDavid Wu *reg = RV1108_PULL_OFFSET; 166149c55878SDavid Wu *regmap = priv->regmap_base; 166249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 166349c55878SDavid Wu *reg -= 0x10; 166449c55878SDavid Wu *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE; 166549c55878SDavid Wu } 166649c55878SDavid Wu 166749c55878SDavid Wu *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4); 166849c55878SDavid Wu *bit = (pin_num % RV1108_PULL_PINS_PER_REG); 166949c55878SDavid Wu *bit *= RV1108_PULL_BITS_PER_PIN; 167049c55878SDavid Wu } 167149c55878SDavid Wu 167249c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET 0x20 167349c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET 0x210 167449c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN 2 167549c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG 8 167649c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE 16 167749c55878SDavid Wu 167849c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 167949c55878SDavid Wu int pin_num, struct regmap **regmap, 168049c55878SDavid Wu int *reg, u8 *bit) 168149c55878SDavid Wu { 168249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 168349c55878SDavid Wu 168449c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 168549c55878SDavid Wu if (bank->bank_num == 0) { 168649c55878SDavid Wu *regmap = priv->regmap_pmu; 168749c55878SDavid Wu *reg = RV1108_DRV_PMU_OFFSET; 168849c55878SDavid Wu } else { 168949c55878SDavid Wu *regmap = priv->regmap_base; 169049c55878SDavid Wu *reg = RV1108_DRV_GRF_OFFSET; 169149c55878SDavid Wu 169249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 169349c55878SDavid Wu *reg -= 0x10; 169449c55878SDavid Wu *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE; 169549c55878SDavid Wu } 169649c55878SDavid Wu 169749c55878SDavid Wu *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4); 169849c55878SDavid Wu *bit = pin_num % RV1108_DRV_PINS_PER_REG; 169949c55878SDavid Wu *bit *= RV1108_DRV_BITS_PER_PIN; 170049c55878SDavid Wu } 170149c55878SDavid Wu 170249c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET 0x30 170349c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET 0x388 170449c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE 8 170549c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG 16 170649c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG 8 170749c55878SDavid Wu 170849c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 170949c55878SDavid Wu int pin_num, 171049c55878SDavid Wu struct regmap **regmap, 171149c55878SDavid Wu int *reg, u8 *bit) 171249c55878SDavid Wu { 171349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 171449c55878SDavid Wu int pins_per_reg; 171549c55878SDavid Wu 171649c55878SDavid Wu if (bank->bank_num == 0) { 171749c55878SDavid Wu *regmap = priv->regmap_pmu; 171849c55878SDavid Wu *reg = RV1108_SCHMITT_PMU_OFFSET; 171949c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG; 172049c55878SDavid Wu } else { 172149c55878SDavid Wu *regmap = priv->regmap_base; 172249c55878SDavid Wu *reg = RV1108_SCHMITT_GRF_OFFSET; 172349c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG; 172449c55878SDavid Wu *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE; 172549c55878SDavid Wu } 172649c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 172749c55878SDavid Wu *bit = pin_num % pins_per_reg; 172849c55878SDavid Wu 172949c55878SDavid Wu return 0; 173049c55878SDavid Wu } 173149c55878SDavid Wu 1732a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET 0x10 1733a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET 0x80 1734a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG 8 1735a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN 2 1736a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE 16 1737a2a3fc8fSJianqun Xu 1738a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1739a2a3fc8fSJianqun Xu int pin_num, 1740a2a3fc8fSJianqun Xu struct regmap **regmap, 1741a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1742a2a3fc8fSJianqun Xu { 1743a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1744a2a3fc8fSJianqun Xu 1745a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1746a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1747a2a3fc8fSJianqun Xu *reg = RK1808_PULL_PMU_OFFSET; 1748a2a3fc8fSJianqun Xu } else { 1749a2a3fc8fSJianqun Xu *reg = RK1808_PULL_GRF_OFFSET; 1750a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1751a2a3fc8fSJianqun Xu } 1752a2a3fc8fSJianqun Xu 1753a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4); 1754a2a3fc8fSJianqun Xu *bit = (pin_num % RK1808_PULL_PINS_PER_REG); 1755a2a3fc8fSJianqun Xu *bit *= RK1808_PULL_BITS_PER_PIN; 1756a2a3fc8fSJianqun Xu } 1757a2a3fc8fSJianqun Xu 1758a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET 0x20 1759a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET 0x140 1760a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN 2 1761a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG 8 1762a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE 16 1763a2a3fc8fSJianqun Xu 1764a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1765a2a3fc8fSJianqun Xu int pin_num, 1766a2a3fc8fSJianqun Xu struct regmap **regmap, 1767a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1768a2a3fc8fSJianqun Xu { 1769a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1770a2a3fc8fSJianqun Xu 1771a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1772a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1773a2a3fc8fSJianqun Xu *reg = RK1808_DRV_PMU_OFFSET; 1774a2a3fc8fSJianqun Xu } else { 1775a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1776a2a3fc8fSJianqun Xu *reg = RK1808_DRV_GRF_OFFSET; 1777a2a3fc8fSJianqun Xu } 1778a2a3fc8fSJianqun Xu 1779a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4); 1780a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_DRV_PINS_PER_REG; 1781a2a3fc8fSJianqun Xu *bit *= RK1808_DRV_BITS_PER_PIN; 1782a2a3fc8fSJianqun Xu } 1783a2a3fc8fSJianqun Xu 1784a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET 0x0040 1785a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET 0x0100 1786a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE 16 1787a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG 8 1788a2a3fc8fSJianqun Xu 1789a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 1790a2a3fc8fSJianqun Xu int pin_num, 1791a2a3fc8fSJianqun Xu struct regmap **regmap, 1792a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1793a2a3fc8fSJianqun Xu { 1794a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1795a2a3fc8fSJianqun Xu 1796a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1797a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1798a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_PMU_OFFSET; 1799a2a3fc8fSJianqun Xu } else { 1800a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1801a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_GRF_OFFSET; 1802a2a3fc8fSJianqun Xu *reg += (bank->bank_num - 1) * RK1808_SCHMITT_BANK_STRIDE; 1803a2a3fc8fSJianqun Xu } 1804a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4); 1805a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG; 1806a2a3fc8fSJianqun Xu 1807a2a3fc8fSJianqun Xu return 0; 1808a2a3fc8fSJianqun Xu } 1809a2a3fc8fSJianqun Xu 181049c55878SDavid Wu #define RK2928_PULL_OFFSET 0x118 181149c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG 16 181249c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE 8 181349c55878SDavid Wu 181449c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 181549c55878SDavid Wu int pin_num, struct regmap **regmap, 181649c55878SDavid Wu int *reg, u8 *bit) 181749c55878SDavid Wu { 181849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 181949c55878SDavid Wu 182049c55878SDavid Wu *regmap = priv->regmap_base; 182149c55878SDavid Wu *reg = RK2928_PULL_OFFSET; 182249c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 182349c55878SDavid Wu *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; 182449c55878SDavid Wu 182549c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 182649c55878SDavid Wu }; 182749c55878SDavid Wu 182849c55878SDavid Wu #define RK3128_PULL_OFFSET 0x118 182949c55878SDavid Wu 183049c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 183149c55878SDavid Wu int pin_num, struct regmap **regmap, 183249c55878SDavid Wu int *reg, u8 *bit) 183349c55878SDavid Wu { 183449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 183549c55878SDavid Wu 183649c55878SDavid Wu *regmap = priv->regmap_base; 183749c55878SDavid Wu *reg = RK3128_PULL_OFFSET; 183849c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 183949c55878SDavid Wu *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4); 184049c55878SDavid Wu 184149c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 184249c55878SDavid Wu } 184349c55878SDavid Wu 184449c55878SDavid Wu #define RK3188_PULL_OFFSET 0x164 184549c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN 2 184649c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG 8 184749c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE 16 184849c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET 0x64 184949c55878SDavid Wu 185049c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 185149c55878SDavid Wu int pin_num, struct regmap **regmap, 185249c55878SDavid Wu int *reg, u8 *bit) 185349c55878SDavid Wu { 185449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 185549c55878SDavid Wu 185649c55878SDavid Wu /* The first 12 pins of the first bank are located elsewhere */ 185749c55878SDavid Wu if (bank->bank_num == 0 && pin_num < 12) { 185849c55878SDavid Wu *regmap = priv->regmap_pmu; 185949c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 186049c55878SDavid Wu 186149c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 186249c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 186349c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 186449c55878SDavid Wu } else { 186549c55878SDavid Wu *regmap = priv->regmap_base; 186649c55878SDavid Wu *reg = RK3188_PULL_OFFSET; 186749c55878SDavid Wu 186849c55878SDavid Wu /* correct the offset, as it is the 2nd pull register */ 186949c55878SDavid Wu *reg -= 4; 187049c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 187149c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 187249c55878SDavid Wu 187349c55878SDavid Wu /* 187449c55878SDavid Wu * The bits in these registers have an inverse ordering 187549c55878SDavid Wu * with the lowest pin being in bits 15:14 and the highest 187649c55878SDavid Wu * pin in bits 1:0 187749c55878SDavid Wu */ 187849c55878SDavid Wu *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); 187949c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 188049c55878SDavid Wu } 188149c55878SDavid Wu } 188249c55878SDavid Wu 188349c55878SDavid Wu #define RK3288_PULL_OFFSET 0x140 188449c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 188549c55878SDavid Wu int pin_num, struct regmap **regmap, 188649c55878SDavid Wu int *reg, u8 *bit) 188749c55878SDavid Wu { 188849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 188949c55878SDavid Wu 189049c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 189149c55878SDavid Wu if (bank->bank_num == 0) { 189249c55878SDavid Wu *regmap = priv->regmap_pmu; 189349c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 189449c55878SDavid Wu 189549c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 189649c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 189749c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 189849c55878SDavid Wu } else { 189949c55878SDavid Wu *regmap = priv->regmap_base; 190049c55878SDavid Wu *reg = RK3288_PULL_OFFSET; 190149c55878SDavid Wu 190249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 190349c55878SDavid Wu *reg -= 0x10; 190449c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 190549c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 190649c55878SDavid Wu 190749c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 190849c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 190949c55878SDavid Wu } 191049c55878SDavid Wu } 191149c55878SDavid Wu 191249c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET 0x70 191349c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET 0x1c0 191449c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN 2 191549c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG 8 191649c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE 16 191749c55878SDavid Wu 191849c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 191949c55878SDavid Wu int pin_num, struct regmap **regmap, 192049c55878SDavid Wu int *reg, u8 *bit) 192149c55878SDavid Wu { 192249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 192349c55878SDavid Wu 192449c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 192549c55878SDavid Wu if (bank->bank_num == 0) { 192649c55878SDavid Wu *regmap = priv->regmap_pmu; 192749c55878SDavid Wu *reg = RK3288_DRV_PMU_OFFSET; 192849c55878SDavid Wu 192949c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 193049c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 193149c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 193249c55878SDavid Wu } else { 193349c55878SDavid Wu *regmap = priv->regmap_base; 193449c55878SDavid Wu *reg = RK3288_DRV_GRF_OFFSET; 193549c55878SDavid Wu 193649c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 193749c55878SDavid Wu *reg -= 0x10; 193849c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 193949c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 194049c55878SDavid Wu 194149c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 194249c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 194349c55878SDavid Wu } 194449c55878SDavid Wu } 194549c55878SDavid Wu 194649c55878SDavid Wu #define RK3228_PULL_OFFSET 0x100 194749c55878SDavid Wu 194849c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 194949c55878SDavid Wu int pin_num, struct regmap **regmap, 195049c55878SDavid Wu int *reg, u8 *bit) 195149c55878SDavid Wu { 195249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 195349c55878SDavid Wu 195449c55878SDavid Wu *regmap = priv->regmap_base; 195549c55878SDavid Wu *reg = RK3228_PULL_OFFSET; 195649c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 195749c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 195849c55878SDavid Wu 195949c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 196049c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 196149c55878SDavid Wu } 196249c55878SDavid Wu 196349c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET 0x200 196449c55878SDavid Wu 196549c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 196649c55878SDavid Wu int pin_num, struct regmap **regmap, 196749c55878SDavid Wu int *reg, u8 *bit) 196849c55878SDavid Wu { 196949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 197049c55878SDavid Wu 197149c55878SDavid Wu *regmap = priv->regmap_base; 197249c55878SDavid Wu *reg = RK3228_DRV_GRF_OFFSET; 197349c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 197449c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 197549c55878SDavid Wu 197649c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 197749c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 197849c55878SDavid Wu } 197949c55878SDavid Wu 1980b3077611SDavid Wu #define RK3308_PULL_OFFSET 0xa0 1981b3077611SDavid Wu 1982b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1983b3077611SDavid Wu int pin_num, struct regmap **regmap, 1984b3077611SDavid Wu int *reg, u8 *bit) 1985b3077611SDavid Wu { 1986b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 1987b3077611SDavid Wu 1988b3077611SDavid Wu *regmap = priv->regmap_base; 1989b3077611SDavid Wu *reg = RK3308_PULL_OFFSET; 1990b3077611SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 1991b3077611SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 1992b3077611SDavid Wu 1993b3077611SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 1994b3077611SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 1995b3077611SDavid Wu } 1996b3077611SDavid Wu 1997b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET 0x100 1998b3077611SDavid Wu 1999b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 2000b3077611SDavid Wu int pin_num, struct regmap **regmap, 2001b3077611SDavid Wu int *reg, u8 *bit) 2002b3077611SDavid Wu { 2003b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2004b3077611SDavid Wu 2005b3077611SDavid Wu *regmap = priv->regmap_base; 2006b3077611SDavid Wu *reg = RK3308_DRV_GRF_OFFSET; 2007b3077611SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 2008b3077611SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 2009b3077611SDavid Wu 2010b3077611SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 2011b3077611SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 2012b3077611SDavid Wu } 2013b3077611SDavid Wu 2014b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG 8 2015b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE 16 2016b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET 0x1a0 2017b3077611SDavid Wu 2018b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2019b3077611SDavid Wu int pin_num, 2020b3077611SDavid Wu struct regmap **regmap, 2021b3077611SDavid Wu int *reg, u8 *bit) 2022b3077611SDavid Wu { 2023b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2024b3077611SDavid Wu 2025b3077611SDavid Wu *regmap = priv->regmap_base; 2026b3077611SDavid Wu *reg = RK3308_SCHMITT_GRF_OFFSET; 2027b3077611SDavid Wu 2028b3077611SDavid Wu *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE; 2029b3077611SDavid Wu *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4); 2030b3077611SDavid Wu *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG; 2031b3077611SDavid Wu 2032b3077611SDavid Wu return 0; 2033b3077611SDavid Wu } 2034b3077611SDavid Wu 203549c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET 0x100 203649c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET 0x10 203749c55878SDavid Wu 203849c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 203949c55878SDavid Wu int pin_num, struct regmap **regmap, 204049c55878SDavid Wu int *reg, u8 *bit) 204149c55878SDavid Wu { 204249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 204349c55878SDavid Wu 204449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 204549c55878SDavid Wu if (bank->bank_num == 0) { 204649c55878SDavid Wu *regmap = priv->regmap_pmu; 204749c55878SDavid Wu *reg = RK3368_PULL_PMU_OFFSET; 204849c55878SDavid Wu 204949c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 205049c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 205149c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 205249c55878SDavid Wu } else { 205349c55878SDavid Wu *regmap = priv->regmap_base; 205449c55878SDavid Wu *reg = RK3368_PULL_GRF_OFFSET; 205549c55878SDavid Wu 205649c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 205749c55878SDavid Wu *reg -= 0x10; 205849c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 205949c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 206049c55878SDavid Wu 206149c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 206249c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 206349c55878SDavid Wu } 206449c55878SDavid Wu } 206549c55878SDavid Wu 206649c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET 0x20 206749c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET 0x200 206849c55878SDavid Wu 206949c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 207049c55878SDavid Wu int pin_num, struct regmap **regmap, 207149c55878SDavid Wu int *reg, u8 *bit) 207249c55878SDavid Wu { 207349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 207449c55878SDavid Wu 207549c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 207649c55878SDavid Wu if (bank->bank_num == 0) { 207749c55878SDavid Wu *regmap = priv->regmap_pmu; 207849c55878SDavid Wu *reg = RK3368_DRV_PMU_OFFSET; 207949c55878SDavid Wu 208049c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 208149c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 208249c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 208349c55878SDavid Wu } else { 208449c55878SDavid Wu *regmap = priv->regmap_base; 208549c55878SDavid Wu *reg = RK3368_DRV_GRF_OFFSET; 208649c55878SDavid Wu 208749c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 208849c55878SDavid Wu *reg -= 0x10; 208949c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 209049c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 209149c55878SDavid Wu 209249c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 209349c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 209449c55878SDavid Wu } 209549c55878SDavid Wu } 209649c55878SDavid Wu 209749c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET 0xe040 209849c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET 0x40 209949c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN 3 210049c55878SDavid Wu 210149c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 210249c55878SDavid Wu int pin_num, struct regmap **regmap, 210349c55878SDavid Wu int *reg, u8 *bit) 210449c55878SDavid Wu { 210549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 210649c55878SDavid Wu 210749c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 210849c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) { 210949c55878SDavid Wu *regmap = priv->regmap_pmu; 211049c55878SDavid Wu *reg = RK3399_PULL_PMU_OFFSET; 211149c55878SDavid Wu 211249c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 211349c55878SDavid Wu 211449c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 211549c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 211649c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 211749c55878SDavid Wu } else { 211849c55878SDavid Wu *regmap = priv->regmap_base; 211949c55878SDavid Wu *reg = RK3399_PULL_GRF_OFFSET; 212049c55878SDavid Wu 212149c55878SDavid Wu /* correct the offset, as we're starting with the 3rd bank */ 212249c55878SDavid Wu *reg -= 0x20; 212349c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 212449c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 212549c55878SDavid Wu 212649c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 212749c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 212849c55878SDavid Wu } 212949c55878SDavid Wu } 213049c55878SDavid Wu 213149c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 213249c55878SDavid Wu int pin_num, struct regmap **regmap, 213349c55878SDavid Wu int *reg, u8 *bit) 213449c55878SDavid Wu { 213549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 213649c55878SDavid Wu int drv_num = (pin_num / 8); 213749c55878SDavid Wu 213849c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 213949c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) 214049c55878SDavid Wu *regmap = priv->regmap_pmu; 214149c55878SDavid Wu else 214249c55878SDavid Wu *regmap = priv->regmap_base; 214349c55878SDavid Wu 214449c55878SDavid Wu *reg = bank->drv[drv_num].offset; 214549c55878SDavid Wu if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 214649c55878SDavid Wu (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)) 214749c55878SDavid Wu *bit = (pin_num % 8) * 3; 214849c55878SDavid Wu else 214949c55878SDavid Wu *bit = (pin_num % 8) * 2; 215049c55878SDavid Wu } 215149c55878SDavid Wu 215249c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = { 215349c55878SDavid Wu { 2, 4, 8, 12, -1, -1, -1, -1 }, 215449c55878SDavid Wu { 3, 6, 9, 12, -1, -1, -1, -1 }, 215549c55878SDavid Wu { 5, 10, 15, 20, -1, -1, -1, -1 }, 215649c55878SDavid Wu { 4, 6, 8, 10, 12, 14, 16, 18 }, 215749c55878SDavid Wu { 4, 7, 10, 13, 16, 19, 22, 26 } 215849c55878SDavid Wu }; 215949c55878SDavid Wu 216049c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, 216149c55878SDavid Wu int pin_num, int strength) 216249c55878SDavid Wu { 216349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 216449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 216549c55878SDavid Wu struct regmap *regmap; 216649c55878SDavid Wu int reg, ret, i; 216749c55878SDavid Wu u32 data, rmask_bits, temp; 216849c55878SDavid Wu u8 bit; 21692c16899dSDavid.Wu /* Where need to clean the special mask for rockchip_perpin_drv_list */ 21702c16899dSDavid.Wu int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK); 217149c55878SDavid Wu 217249c55878SDavid Wu debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num, 217349c55878SDavid Wu pin_num, strength); 217449c55878SDavid Wu 217549c55878SDavid Wu ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 217649c55878SDavid Wu 217749c55878SDavid Wu ret = -EINVAL; 217849c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { 217949c55878SDavid Wu if (rockchip_perpin_drv_list[drv_type][i] == strength) { 218049c55878SDavid Wu ret = i; 218149c55878SDavid Wu break; 218249c55878SDavid Wu } else if (rockchip_perpin_drv_list[drv_type][i] < 0) { 218349c55878SDavid Wu ret = rockchip_perpin_drv_list[drv_type][i]; 218449c55878SDavid Wu break; 218549c55878SDavid Wu } 218649c55878SDavid Wu } 218749c55878SDavid Wu 218849c55878SDavid Wu if (ret < 0) { 218949c55878SDavid Wu debug("unsupported driver strength %d\n", strength); 219049c55878SDavid Wu return ret; 219149c55878SDavid Wu } 219249c55878SDavid Wu 219349c55878SDavid Wu switch (drv_type) { 219449c55878SDavid Wu case DRV_TYPE_IO_1V8_3V0_AUTO: 219549c55878SDavid Wu case DRV_TYPE_IO_3V3_ONLY: 219649c55878SDavid Wu rmask_bits = RK3399_DRV_3BITS_PER_PIN; 219749c55878SDavid Wu switch (bit) { 219849c55878SDavid Wu case 0 ... 12: 219949c55878SDavid Wu /* regular case, nothing to do */ 220049c55878SDavid Wu break; 220149c55878SDavid Wu case 15: 220249c55878SDavid Wu /* 220349c55878SDavid Wu * drive-strength offset is special, as it is spread 220449c55878SDavid Wu * over 2 registers, the bit data[15] contains bit 0 220549c55878SDavid Wu * of the value while temp[1:0] contains bits 2 and 1 220649c55878SDavid Wu */ 220749c55878SDavid Wu data = (ret & 0x1) << 15; 220849c55878SDavid Wu temp = (ret >> 0x1) & 0x3; 220949c55878SDavid Wu 221049c55878SDavid Wu data |= BIT(31); 221149c55878SDavid Wu ret = regmap_write(regmap, reg, data); 221249c55878SDavid Wu if (ret) 221349c55878SDavid Wu return ret; 221449c55878SDavid Wu 221549c55878SDavid Wu temp |= (0x3 << 16); 221649c55878SDavid Wu reg += 0x4; 221749c55878SDavid Wu ret = regmap_write(regmap, reg, temp); 221849c55878SDavid Wu 221949c55878SDavid Wu return ret; 222049c55878SDavid Wu case 18 ... 21: 222149c55878SDavid Wu /* setting fully enclosed in the second register */ 222249c55878SDavid Wu reg += 4; 222349c55878SDavid Wu bit -= 16; 222449c55878SDavid Wu break; 222549c55878SDavid Wu default: 222649c55878SDavid Wu debug("unsupported bit: %d for pinctrl drive type: %d\n", 222749c55878SDavid Wu bit, drv_type); 222849c55878SDavid Wu return -EINVAL; 222949c55878SDavid Wu } 223049c55878SDavid Wu break; 223149c55878SDavid Wu case DRV_TYPE_IO_DEFAULT: 223249c55878SDavid Wu case DRV_TYPE_IO_1V8_OR_3V0: 223349c55878SDavid Wu case DRV_TYPE_IO_1V8_ONLY: 223449c55878SDavid Wu rmask_bits = RK3288_DRV_BITS_PER_PIN; 223549c55878SDavid Wu break; 223649c55878SDavid Wu default: 223749c55878SDavid Wu debug("unsupported pinctrl drive type: %d\n", 223849c55878SDavid Wu drv_type); 223949c55878SDavid Wu return -EINVAL; 224049c55878SDavid Wu } 224149c55878SDavid Wu 224255a89bc6SDavid Wu if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) { 224355a89bc6SDavid Wu regmap_read(regmap, reg, &data); 224455a89bc6SDavid Wu data &= ~(((1 << rmask_bits) - 1) << bit); 224555a89bc6SDavid Wu } else { 224649c55878SDavid Wu /* enable the write to the equivalent lower bits */ 224749c55878SDavid Wu data = ((1 << rmask_bits) - 1) << (bit + 16); 224855a89bc6SDavid Wu } 224949c55878SDavid Wu 225055a89bc6SDavid Wu data |= (ret << bit); 225149c55878SDavid Wu ret = regmap_write(regmap, reg, data); 225249c55878SDavid Wu return ret; 225349c55878SDavid Wu } 225449c55878SDavid Wu 225549c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = { 225649c55878SDavid Wu { 225749c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 225849c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP, 225949c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 226049c55878SDavid Wu PIN_CONFIG_BIAS_BUS_HOLD 226149c55878SDavid Wu }, 226249c55878SDavid Wu { 226349c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 226449c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 226549c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 226649c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP 226749c55878SDavid Wu }, 226849c55878SDavid Wu }; 226949c55878SDavid Wu 227049c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank, 227149c55878SDavid Wu int pin_num, int pull) 227249c55878SDavid Wu { 227349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 227449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 227549c55878SDavid Wu struct regmap *regmap; 227649c55878SDavid Wu int reg, ret, i, pull_type; 227749c55878SDavid Wu u8 bit; 227849c55878SDavid Wu u32 data; 227949c55878SDavid Wu 228049c55878SDavid Wu debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num, 228149c55878SDavid Wu pin_num, pull); 228249c55878SDavid Wu 228349c55878SDavid Wu /* rk3066b does support any pulls */ 228449c55878SDavid Wu if (ctrl->type == RK3066B) 228549c55878SDavid Wu return pull ? -EINVAL : 0; 228649c55878SDavid Wu 228749c55878SDavid Wu ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 228849c55878SDavid Wu 228949c55878SDavid Wu switch (ctrl->type) { 229049c55878SDavid Wu case RK2928: 229149c55878SDavid Wu case RK3128: 229249c55878SDavid Wu data = BIT(bit + 16); 229349c55878SDavid Wu if (pull == PIN_CONFIG_BIAS_DISABLE) 229449c55878SDavid Wu data |= BIT(bit); 229549c55878SDavid Wu ret = regmap_write(regmap, reg, data); 229649c55878SDavid Wu break; 229749c55878SDavid Wu case PX30: 229849c55878SDavid Wu case RV1108: 2299a2a3fc8fSJianqun Xu case RK1808: 230049c55878SDavid Wu case RK3188: 230149c55878SDavid Wu case RK3288: 2302b3077611SDavid Wu case RK3308: 230349c55878SDavid Wu case RK3368: 230449c55878SDavid Wu case RK3399: 23052c16899dSDavid.Wu /* 23062c16899dSDavid.Wu * Where need to clean the special mask for 23072c16899dSDavid.Wu * rockchip_pull_list. 23082c16899dSDavid.Wu */ 23092c16899dSDavid.Wu pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK); 231049c55878SDavid Wu ret = -EINVAL; 231149c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); 231249c55878SDavid Wu i++) { 231349c55878SDavid Wu if (rockchip_pull_list[pull_type][i] == pull) { 231449c55878SDavid Wu ret = i; 231549c55878SDavid Wu break; 231649c55878SDavid Wu } 231749c55878SDavid Wu } 231849c55878SDavid Wu 231949c55878SDavid Wu if (ret < 0) { 232049c55878SDavid Wu debug("unsupported pull setting %d\n", pull); 232149c55878SDavid Wu return ret; 232249c55878SDavid Wu } 232349c55878SDavid Wu 232455a89bc6SDavid Wu if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) { 232555a89bc6SDavid Wu regmap_read(regmap, reg, &data); 232655a89bc6SDavid Wu data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit); 232755a89bc6SDavid Wu } else { 232849c55878SDavid Wu /* enable the write to the equivalent lower bits */ 232949c55878SDavid Wu data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); 233055a89bc6SDavid Wu } 233149c55878SDavid Wu 233255a89bc6SDavid Wu data |= (ret << bit); 233349c55878SDavid Wu ret = regmap_write(regmap, reg, data); 233449c55878SDavid Wu break; 233549c55878SDavid Wu default: 233649c55878SDavid Wu debug("unsupported pinctrl type\n"); 233749c55878SDavid Wu return -EINVAL; 233849c55878SDavid Wu } 233949c55878SDavid Wu 234049c55878SDavid Wu return ret; 234149c55878SDavid Wu } 234249c55878SDavid Wu 234349c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN 1 234449c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG 16 234549c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE 8 234649c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET 0x380 234749c55878SDavid Wu 234849c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 234949c55878SDavid Wu int pin_num, 235049c55878SDavid Wu struct regmap **regmap, 235149c55878SDavid Wu int *reg, u8 *bit) 235249c55878SDavid Wu { 235349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 235449c55878SDavid Wu 235549c55878SDavid Wu *regmap = priv->regmap_base; 235649c55878SDavid Wu *reg = RK3328_SCHMITT_GRF_OFFSET; 235749c55878SDavid Wu 235849c55878SDavid Wu *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE; 235949c55878SDavid Wu *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4); 236049c55878SDavid Wu *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG; 236149c55878SDavid Wu 236249c55878SDavid Wu return 0; 236349c55878SDavid Wu } 236449c55878SDavid Wu 236549c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, 236649c55878SDavid Wu int pin_num, int enable) 236749c55878SDavid Wu { 236849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 236949c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 237049c55878SDavid Wu struct regmap *regmap; 237149c55878SDavid Wu int reg, ret; 237249c55878SDavid Wu u8 bit; 237349c55878SDavid Wu u32 data; 237449c55878SDavid Wu 237549c55878SDavid Wu debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num, 237649c55878SDavid Wu pin_num, enable); 237749c55878SDavid Wu 237849c55878SDavid Wu ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 237949c55878SDavid Wu if (ret) 238049c55878SDavid Wu return ret; 238149c55878SDavid Wu 238249c55878SDavid Wu /* enable the write to the equivalent lower bits */ 238349c55878SDavid Wu data = BIT(bit + 16) | (enable << bit); 238449c55878SDavid Wu 238549c55878SDavid Wu return regmap_write(regmap, reg, data); 238649c55878SDavid Wu } 238749c55878SDavid Wu 238832c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET 0x30 238932c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET 0x90 239032c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG 16 239132c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE 16 239232c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG 8 239332c25d1fSDavid Wu 239432c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, 239532c25d1fSDavid Wu int pin_num, 239632c25d1fSDavid Wu struct regmap **regmap, 239732c25d1fSDavid Wu int *reg, u8 *bit) 239832c25d1fSDavid Wu { 239932c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 240032c25d1fSDavid Wu int pins_per_reg; 240132c25d1fSDavid Wu 240232c25d1fSDavid Wu if (bank->bank_num == 0) { 240332c25d1fSDavid Wu *regmap = priv->regmap_pmu; 240432c25d1fSDavid Wu *reg = PX30_SLEW_RATE_PMU_OFFSET; 240532c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 240632c25d1fSDavid Wu } else { 240732c25d1fSDavid Wu *regmap = priv->regmap_base; 240832c25d1fSDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 240932c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 241032c25d1fSDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 241132c25d1fSDavid Wu } 241232c25d1fSDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 241332c25d1fSDavid Wu *bit = pin_num % pins_per_reg; 241432c25d1fSDavid Wu 241532c25d1fSDavid Wu return 0; 241632c25d1fSDavid Wu } 241732c25d1fSDavid Wu 241832c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank, 241932c25d1fSDavid Wu int pin_num, int speed) 242032c25d1fSDavid Wu { 242132c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 242232c25d1fSDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 242332c25d1fSDavid Wu struct regmap *regmap; 242432c25d1fSDavid Wu int reg, ret; 242532c25d1fSDavid Wu u8 bit; 242632c25d1fSDavid Wu u32 data; 242732c25d1fSDavid Wu 242832c25d1fSDavid Wu debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num, 242932c25d1fSDavid Wu pin_num, speed); 243032c25d1fSDavid Wu 243132c25d1fSDavid Wu ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit); 243232c25d1fSDavid Wu if (ret) 243332c25d1fSDavid Wu return ret; 243432c25d1fSDavid Wu 243532c25d1fSDavid Wu /* enable the write to the equivalent lower bits */ 243632c25d1fSDavid Wu data = BIT(bit + 16) | (speed << bit); 243732c25d1fSDavid Wu 243832c25d1fSDavid Wu return regmap_write(regmap, reg, data); 243932c25d1fSDavid Wu } 244032c25d1fSDavid Wu 244149c55878SDavid Wu /* 244249c55878SDavid Wu * Pinconf_ops handling 244349c55878SDavid Wu */ 244449c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, 244549c55878SDavid Wu unsigned int pull) 244649c55878SDavid Wu { 244749c55878SDavid Wu switch (ctrl->type) { 244849c55878SDavid Wu case RK2928: 244949c55878SDavid Wu case RK3128: 245049c55878SDavid Wu return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || 245149c55878SDavid Wu pull == PIN_CONFIG_BIAS_DISABLE); 245249c55878SDavid Wu case RK3066B: 245349c55878SDavid Wu return pull ? false : true; 245449c55878SDavid Wu case PX30: 245549c55878SDavid Wu case RV1108: 2456a2a3fc8fSJianqun Xu case RK1808: 245749c55878SDavid Wu case RK3188: 245849c55878SDavid Wu case RK3288: 2459b3077611SDavid Wu case RK3308: 246049c55878SDavid Wu case RK3368: 246149c55878SDavid Wu case RK3399: 246249c55878SDavid Wu return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 246349c55878SDavid Wu } 246449c55878SDavid Wu 246549c55878SDavid Wu return false; 246649c55878SDavid Wu } 246749c55878SDavid Wu 246849c55878SDavid Wu /* set the pin config settings for a specified pin */ 246949c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank, 247049c55878SDavid Wu u32 pin, u32 param, u32 arg) 247149c55878SDavid Wu { 247249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 247349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 247449c55878SDavid Wu int rc; 247549c55878SDavid Wu 247649c55878SDavid Wu switch (param) { 247749c55878SDavid Wu case PIN_CONFIG_BIAS_DISABLE: 247849c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 247949c55878SDavid Wu if (rc) 248049c55878SDavid Wu return rc; 248149c55878SDavid Wu break; 248249c55878SDavid Wu 248349c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_UP: 248449c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_DOWN: 248549c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 248649c55878SDavid Wu case PIN_CONFIG_BIAS_BUS_HOLD: 248749c55878SDavid Wu if (!rockchip_pinconf_pull_valid(ctrl, param)) 248849c55878SDavid Wu return -ENOTSUPP; 248949c55878SDavid Wu 249049c55878SDavid Wu if (!arg) 249149c55878SDavid Wu return -EINVAL; 249249c55878SDavid Wu 249349c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 249449c55878SDavid Wu if (rc) 249549c55878SDavid Wu return rc; 249649c55878SDavid Wu break; 249749c55878SDavid Wu 249849c55878SDavid Wu case PIN_CONFIG_DRIVE_STRENGTH: 249949c55878SDavid Wu if (!ctrl->drv_calc_reg) 250049c55878SDavid Wu return -ENOTSUPP; 250149c55878SDavid Wu 250249c55878SDavid Wu rc = rockchip_set_drive_perpin(bank, pin, arg); 250349c55878SDavid Wu if (rc < 0) 250449c55878SDavid Wu return rc; 250549c55878SDavid Wu break; 250649c55878SDavid Wu 250749c55878SDavid Wu case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 250849c55878SDavid Wu if (!ctrl->schmitt_calc_reg) 250949c55878SDavid Wu return -ENOTSUPP; 251049c55878SDavid Wu 251149c55878SDavid Wu rc = rockchip_set_schmitt(bank, pin, arg); 251249c55878SDavid Wu if (rc < 0) 251349c55878SDavid Wu return rc; 251449c55878SDavid Wu break; 251549c55878SDavid Wu 251632c25d1fSDavid Wu case PIN_CONFIG_SLEW_RATE: 251732c25d1fSDavid Wu if (!ctrl->slew_rate_calc_reg) 251832c25d1fSDavid Wu return -ENOTSUPP; 251932c25d1fSDavid Wu 252032c25d1fSDavid Wu rc = rockchip_set_slew_rate(bank, 252132c25d1fSDavid Wu pin - bank->pin_base, arg); 252232c25d1fSDavid Wu if (rc < 0) 252332c25d1fSDavid Wu return rc; 252432c25d1fSDavid Wu break; 252532c25d1fSDavid Wu 252649c55878SDavid Wu default: 252749c55878SDavid Wu break; 252849c55878SDavid Wu } 252949c55878SDavid Wu 253049c55878SDavid Wu return 0; 253149c55878SDavid Wu } 253249c55878SDavid Wu 253349c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = { 253449c55878SDavid Wu { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, 253549c55878SDavid Wu { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 }, 253649c55878SDavid Wu { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 }, 253749c55878SDavid Wu { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 }, 253849c55878SDavid Wu { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 }, 253949c55878SDavid Wu { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 }, 254049c55878SDavid Wu { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 }, 254149c55878SDavid Wu { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 }, 254249c55878SDavid Wu { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 }, 254332c25d1fSDavid Wu { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 }, 254449c55878SDavid Wu }; 254549c55878SDavid Wu 254649c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property, 254749c55878SDavid Wu u32 *default_value) 254849c55878SDavid Wu { 254949c55878SDavid Wu const struct pinconf_param *p, *end; 255049c55878SDavid Wu 255149c55878SDavid Wu p = rockchip_conf_params; 255249c55878SDavid Wu end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param); 255349c55878SDavid Wu 255449c55878SDavid Wu /* See if this pctldev supports this parameter */ 255549c55878SDavid Wu for (; p < end; p++) { 255649c55878SDavid Wu if (!strcmp(property, p->property)) { 255749c55878SDavid Wu *default_value = p->default_value; 255849c55878SDavid Wu return p->param; 255949c55878SDavid Wu } 256049c55878SDavid Wu } 256149c55878SDavid Wu 256249c55878SDavid Wu *default_value = 0; 256349c55878SDavid Wu return -EPERM; 256449c55878SDavid Wu } 256549c55878SDavid Wu 256649c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev, 256749c55878SDavid Wu struct udevice *config) 256849c55878SDavid Wu { 256949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 257049c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 257149c55878SDavid Wu u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4]; 257249c55878SDavid Wu u32 bank, pin, mux, conf, arg, default_val; 257349c55878SDavid Wu int ret, count, i; 257449c55878SDavid Wu const char *prop_name; 257549c55878SDavid Wu const void *value; 25762208cfa9SKever Yang int prop_len, param; 25772208cfa9SKever Yang const u32 *data; 25782208cfa9SKever Yang ofnode node; 2579*d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 25802208cfa9SKever Yang const struct device_node *np; 25812208cfa9SKever Yang struct property *pp; 25822208cfa9SKever Yang #else 25832208cfa9SKever Yang int property_offset, pcfg_node; 25842208cfa9SKever Yang const void *blob = gd->fdt_blob; 25852208cfa9SKever Yang #endif 25862208cfa9SKever Yang data = dev_read_prop(config, "rockchip,pins", &count); 258749c55878SDavid Wu if (count < 0) { 258887f0ac57SDavid Wu debug("%s: bad array size %d\n", __func__, count); 258949c55878SDavid Wu return -EINVAL; 259049c55878SDavid Wu } 259149c55878SDavid Wu 259287f0ac57SDavid Wu count /= sizeof(u32); 259349c55878SDavid Wu if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) { 259449c55878SDavid Wu debug("%s: unsupported pins array count %d\n", 259549c55878SDavid Wu __func__, count); 259649c55878SDavid Wu return -EINVAL; 259749c55878SDavid Wu } 259849c55878SDavid Wu 259987f0ac57SDavid Wu for (i = 0; i < count; i++) 260087f0ac57SDavid Wu cells[i] = fdt32_to_cpu(data[i]); 260187f0ac57SDavid Wu 260249c55878SDavid Wu for (i = 0; i < (count >> 2); i++) { 260349c55878SDavid Wu bank = cells[4 * i + 0]; 260449c55878SDavid Wu pin = cells[4 * i + 1]; 260549c55878SDavid Wu mux = cells[4 * i + 2]; 260649c55878SDavid Wu conf = cells[4 * i + 3]; 260749c55878SDavid Wu 260849c55878SDavid Wu ret = rockchip_verify_config(dev, bank, pin); 260949c55878SDavid Wu if (ret) 261049c55878SDavid Wu return ret; 261149c55878SDavid Wu 261249c55878SDavid Wu ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux); 261349c55878SDavid Wu if (ret) 261449c55878SDavid Wu return ret; 261549c55878SDavid Wu 26162208cfa9SKever Yang node = ofnode_get_by_phandle(conf); 26172208cfa9SKever Yang if (!ofnode_valid(node)) 261849c55878SDavid Wu return -ENODEV; 2619*d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 26202208cfa9SKever Yang np = ofnode_to_np(node); 26212208cfa9SKever Yang for (pp = np->properties; pp; pp = pp->next) { 26222208cfa9SKever Yang prop_name = pp->name; 26232208cfa9SKever Yang prop_len = pp->length; 26242208cfa9SKever Yang value = pp->value; 26252208cfa9SKever Yang #else 26262208cfa9SKever Yang pcfg_node = ofnode_to_offset(node); 262749c55878SDavid Wu fdt_for_each_property_offset(property_offset, blob, pcfg_node) { 262849c55878SDavid Wu value = fdt_getprop_by_offset(blob, property_offset, 262949c55878SDavid Wu &prop_name, &prop_len); 263049c55878SDavid Wu if (!value) 263149c55878SDavid Wu return -ENOENT; 26322208cfa9SKever Yang #endif 263349c55878SDavid Wu param = rockchip_pinconf_prop_name_to_param(prop_name, 263449c55878SDavid Wu &default_val); 263549c55878SDavid Wu if (param < 0) 263649c55878SDavid Wu break; 263749c55878SDavid Wu 263849c55878SDavid Wu if (prop_len >= sizeof(fdt32_t)) 263949c55878SDavid Wu arg = fdt32_to_cpu(*(fdt32_t *)value); 264049c55878SDavid Wu else 264149c55878SDavid Wu arg = default_val; 264249c55878SDavid Wu 264349c55878SDavid Wu ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin, 264449c55878SDavid Wu param, arg); 264549c55878SDavid Wu if (ret) { 264649c55878SDavid Wu debug("%s: rockchip_pinconf_set fail: %d\n", 264749c55878SDavid Wu __func__, ret); 264849c55878SDavid Wu return ret; 264949c55878SDavid Wu } 265049c55878SDavid Wu } 265149c55878SDavid Wu } 265249c55878SDavid Wu 265349c55878SDavid Wu return 0; 265449c55878SDavid Wu } 265549c55878SDavid Wu 265649c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = { 265749c55878SDavid Wu .set_state = rockchip_pinctrl_set_state, 265849c55878SDavid Wu .get_gpio_mux = rockchip_pinctrl_get_gpio_mux, 265949c55878SDavid Wu }; 266049c55878SDavid Wu 2661d5517017SDavid Wu /* Ctrl data specially handle */ 2662d5517017SDavid Wu static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl) 2663d5517017SDavid Wu { 2664d5517017SDavid Wu /* 2665d5517017SDavid Wu * Special for rk3308b, where we need to replace the recalced 2666d5517017SDavid Wu * and routed arrays. 2667d5517017SDavid Wu */ 2668d5517017SDavid Wu if (soc_is_rk3308b()) { 2669d5517017SDavid Wu ctrl->iomux_recalced = rk3308b_mux_recalced_data; 2670d5517017SDavid Wu ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data); 2671d5517017SDavid Wu ctrl->iomux_routes = rk3308b_mux_route_data; 2672d5517017SDavid Wu ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data); 2673d5517017SDavid Wu } 2674d5517017SDavid Wu 2675d5517017SDavid Wu return 0; 2676d5517017SDavid Wu } 2677d5517017SDavid Wu 267849c55878SDavid Wu /* retrieve the soc specific data */ 267949c55878SDavid Wu static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct udevice *dev) 268049c55878SDavid Wu { 268149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 268249c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = 268349c55878SDavid Wu (struct rockchip_pin_ctrl *)dev_get_driver_data(dev); 268449c55878SDavid Wu struct rockchip_pin_bank *bank; 268549c55878SDavid Wu int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; 268649c55878SDavid Wu 268749c55878SDavid Wu grf_offs = ctrl->grf_mux_offset; 268849c55878SDavid Wu pmu_offs = ctrl->pmu_mux_offset; 268949c55878SDavid Wu drv_pmu_offs = ctrl->pmu_drv_offset; 269049c55878SDavid Wu drv_grf_offs = ctrl->grf_drv_offset; 269149c55878SDavid Wu bank = ctrl->pin_banks; 269249c55878SDavid Wu 2693d5517017SDavid Wu /* Ctrl data re-initialize for some Socs */ 2694d5517017SDavid Wu if (ctrl->ctrl_data_re_init) { 2695d5517017SDavid Wu if (ctrl->ctrl_data_re_init(ctrl)) 2696d5517017SDavid Wu return NULL; 2697d5517017SDavid Wu } 2698d5517017SDavid Wu 269949c55878SDavid Wu for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { 270049c55878SDavid Wu int bank_pins = 0; 270149c55878SDavid Wu 270249c55878SDavid Wu bank->priv = priv; 270349c55878SDavid Wu bank->pin_base = ctrl->nr_pins; 270449c55878SDavid Wu ctrl->nr_pins += bank->nr_pins; 270549c55878SDavid Wu 270649c55878SDavid Wu /* calculate iomux and drv offsets */ 270749c55878SDavid Wu for (j = 0; j < 4; j++) { 270849c55878SDavid Wu struct rockchip_iomux *iom = &bank->iomux[j]; 270949c55878SDavid Wu struct rockchip_drv *drv = &bank->drv[j]; 271049c55878SDavid Wu int inc; 271149c55878SDavid Wu 271249c55878SDavid Wu if (bank_pins >= bank->nr_pins) 271349c55878SDavid Wu break; 271449c55878SDavid Wu 271549c55878SDavid Wu /* preset iomux offset value, set new start value */ 271649c55878SDavid Wu if (iom->offset >= 0) { 271749c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 271849c55878SDavid Wu pmu_offs = iom->offset; 271949c55878SDavid Wu else 272049c55878SDavid Wu grf_offs = iom->offset; 272149c55878SDavid Wu } else { /* set current iomux offset */ 272249c55878SDavid Wu iom->offset = (iom->type & IOMUX_SOURCE_PMU) ? 272349c55878SDavid Wu pmu_offs : grf_offs; 272449c55878SDavid Wu } 272549c55878SDavid Wu 272649c55878SDavid Wu /* preset drv offset value, set new start value */ 272749c55878SDavid Wu if (drv->offset >= 0) { 272849c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 272949c55878SDavid Wu drv_pmu_offs = drv->offset; 273049c55878SDavid Wu else 273149c55878SDavid Wu drv_grf_offs = drv->offset; 273249c55878SDavid Wu } else { /* set current drv offset */ 273349c55878SDavid Wu drv->offset = (iom->type & IOMUX_SOURCE_PMU) ? 273449c55878SDavid Wu drv_pmu_offs : drv_grf_offs; 273549c55878SDavid Wu } 273649c55878SDavid Wu 273749c55878SDavid Wu debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n", 273849c55878SDavid Wu i, j, iom->offset, drv->offset); 273949c55878SDavid Wu 274049c55878SDavid Wu /* 274149c55878SDavid Wu * Increase offset according to iomux width. 274249c55878SDavid Wu * 4bit iomux'es are spread over two registers. 274349c55878SDavid Wu */ 274449c55878SDavid Wu inc = (iom->type & (IOMUX_WIDTH_4BIT | 274588a1f7ffSDavid Wu IOMUX_WIDTH_3BIT | 274688a1f7ffSDavid Wu IOMUX_8WIDTH_2BIT)) ? 8 : 4; 274749c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 274849c55878SDavid Wu pmu_offs += inc; 274949c55878SDavid Wu else 275049c55878SDavid Wu grf_offs += inc; 275149c55878SDavid Wu 275249c55878SDavid Wu /* 275349c55878SDavid Wu * Increase offset according to drv width. 275449c55878SDavid Wu * 3bit drive-strenth'es are spread over two registers. 275549c55878SDavid Wu */ 275649c55878SDavid Wu if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 275749c55878SDavid Wu (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) 275849c55878SDavid Wu inc = 8; 275949c55878SDavid Wu else 276049c55878SDavid Wu inc = 4; 276149c55878SDavid Wu 276249c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 276349c55878SDavid Wu drv_pmu_offs += inc; 276449c55878SDavid Wu else 276549c55878SDavid Wu drv_grf_offs += inc; 276649c55878SDavid Wu 276749c55878SDavid Wu bank_pins += 8; 276849c55878SDavid Wu } 276949c55878SDavid Wu 277049c55878SDavid Wu /* calculate the per-bank recalced_mask */ 277149c55878SDavid Wu for (j = 0; j < ctrl->niomux_recalced; j++) { 277249c55878SDavid Wu int pin = 0; 277349c55878SDavid Wu 277449c55878SDavid Wu if (ctrl->iomux_recalced[j].num == bank->bank_num) { 277549c55878SDavid Wu pin = ctrl->iomux_recalced[j].pin; 277649c55878SDavid Wu bank->recalced_mask |= BIT(pin); 277749c55878SDavid Wu } 277849c55878SDavid Wu } 277949c55878SDavid Wu 278049c55878SDavid Wu /* calculate the per-bank route_mask */ 278149c55878SDavid Wu for (j = 0; j < ctrl->niomux_routes; j++) { 278249c55878SDavid Wu int pin = 0; 278349c55878SDavid Wu 278449c55878SDavid Wu if (ctrl->iomux_routes[j].bank_num == bank->bank_num) { 278549c55878SDavid Wu pin = ctrl->iomux_routes[j].pin; 278649c55878SDavid Wu bank->route_mask |= BIT(pin); 278749c55878SDavid Wu } 278849c55878SDavid Wu } 278949c55878SDavid Wu } 279049c55878SDavid Wu 279149c55878SDavid Wu return ctrl; 279249c55878SDavid Wu } 279349c55878SDavid Wu 2794d5517017SDavid Wu /* SoC data specially handle */ 2795d5517017SDavid Wu 2796d5517017SDavid Wu /* rk3308b SoC data initialize */ 2797d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13 0x608 2798d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15 0x610 2799d5517017SDavid Wu 2800d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */ 2801d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10)) 2802d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 2803d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 2804d5517017SDavid Wu 2805d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */ 2806d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11)) 2807d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 2808d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 2809d5517017SDavid Wu 2810d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv) 2811d5517017SDavid Wu { 2812d5517017SDavid Wu int ret; 2813d5517017SDavid Wu 2814d5517017SDavid Wu /* 2815d5517017SDavid Wu * Enable the special ctrl of selected sources. 2816d5517017SDavid Wu */ 2817d5517017SDavid Wu if (soc_is_rk3308b()) { 2818d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13, 2819d5517017SDavid Wu RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL | 2820d5517017SDavid Wu RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL | 2821d5517017SDavid Wu RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL); 2822d5517017SDavid Wu if (ret) 2823d5517017SDavid Wu return ret; 2824d5517017SDavid Wu 2825d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15, 2826d5517017SDavid Wu RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL | 2827d5517017SDavid Wu RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL | 2828d5517017SDavid Wu RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL); 2829d5517017SDavid Wu if (ret) 2830d5517017SDavid Wu return ret; 2831d5517017SDavid Wu } 2832d5517017SDavid Wu 2833d5517017SDavid Wu return 0; 2834d5517017SDavid Wu } 2835d5517017SDavid Wu 283649c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev) 283749c55878SDavid Wu { 283849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 283949c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 284049c55878SDavid Wu struct udevice *syscon; 284149c55878SDavid Wu struct regmap *regmap; 284249c55878SDavid Wu int ret = 0; 284349c55878SDavid Wu 284449c55878SDavid Wu /* get rockchip grf syscon phandle */ 284549c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf", 284649c55878SDavid Wu &syscon); 284749c55878SDavid Wu if (ret) { 284849c55878SDavid Wu debug("unable to find rockchip,grf syscon device (%d)\n", ret); 284949c55878SDavid Wu return ret; 285049c55878SDavid Wu } 285149c55878SDavid Wu 285249c55878SDavid Wu /* get grf-reg base address */ 285349c55878SDavid Wu regmap = syscon_get_regmap(syscon); 285449c55878SDavid Wu if (!regmap) { 285549c55878SDavid Wu debug("unable to find rockchip grf regmap\n"); 285649c55878SDavid Wu return -ENODEV; 285749c55878SDavid Wu } 285849c55878SDavid Wu priv->regmap_base = regmap; 285949c55878SDavid Wu 286049c55878SDavid Wu /* option: get pmu-reg base address */ 286149c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu", 286249c55878SDavid Wu &syscon); 286349c55878SDavid Wu if (!ret) { 286449c55878SDavid Wu /* get pmugrf-reg base address */ 286549c55878SDavid Wu regmap = syscon_get_regmap(syscon); 286649c55878SDavid Wu if (!regmap) { 286749c55878SDavid Wu debug("unable to find rockchip pmu regmap\n"); 286849c55878SDavid Wu return -ENODEV; 286949c55878SDavid Wu } 287049c55878SDavid Wu priv->regmap_pmu = regmap; 287149c55878SDavid Wu } 287249c55878SDavid Wu 287349c55878SDavid Wu ctrl = rockchip_pinctrl_get_soc_data(dev); 287449c55878SDavid Wu if (!ctrl) { 287549c55878SDavid Wu debug("driver data not available\n"); 287649c55878SDavid Wu return -EINVAL; 287749c55878SDavid Wu } 287849c55878SDavid Wu 2879d5517017SDavid Wu /* Special handle for some Socs */ 2880d5517017SDavid Wu if (ctrl->soc_data_init) { 2881d5517017SDavid Wu ret = ctrl->soc_data_init(priv); 2882d5517017SDavid Wu if (ret) 2883d5517017SDavid Wu return ret; 2884d5517017SDavid Wu } 2885d5517017SDavid Wu 288649c55878SDavid Wu priv->ctrl = ctrl; 288749c55878SDavid Wu return 0; 288849c55878SDavid Wu } 288949c55878SDavid Wu 289049c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = { 289149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 289249c55878SDavid Wu IOMUX_SOURCE_PMU, 289349c55878SDavid Wu IOMUX_SOURCE_PMU, 289449c55878SDavid Wu IOMUX_SOURCE_PMU 289549c55878SDavid Wu ), 289649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, 289749c55878SDavid Wu IOMUX_WIDTH_4BIT, 289849c55878SDavid Wu IOMUX_WIDTH_4BIT, 289949c55878SDavid Wu IOMUX_WIDTH_4BIT 290049c55878SDavid Wu ), 290149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, 290249c55878SDavid Wu IOMUX_WIDTH_4BIT, 290349c55878SDavid Wu IOMUX_WIDTH_4BIT, 290449c55878SDavid Wu IOMUX_WIDTH_4BIT 290549c55878SDavid Wu ), 290649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, 290749c55878SDavid Wu IOMUX_WIDTH_4BIT, 290849c55878SDavid Wu IOMUX_WIDTH_4BIT, 290949c55878SDavid Wu IOMUX_WIDTH_4BIT 291049c55878SDavid Wu ), 291149c55878SDavid Wu }; 291249c55878SDavid Wu 291349c55878SDavid Wu static struct rockchip_pin_ctrl px30_pin_ctrl = { 291449c55878SDavid Wu .pin_banks = px30_pin_banks, 291549c55878SDavid Wu .nr_banks = ARRAY_SIZE(px30_pin_banks), 291649c55878SDavid Wu .label = "PX30-GPIO", 291749c55878SDavid Wu .type = PX30, 291849c55878SDavid Wu .grf_mux_offset = 0x0, 291949c55878SDavid Wu .pmu_mux_offset = 0x0, 292049c55878SDavid Wu .iomux_routes = px30_mux_route_data, 292149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(px30_mux_route_data), 292249c55878SDavid Wu .pull_calc_reg = px30_calc_pull_reg_and_bit, 292349c55878SDavid Wu .drv_calc_reg = px30_calc_drv_reg_and_bit, 292449c55878SDavid Wu .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, 292532c25d1fSDavid Wu .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit, 292649c55878SDavid Wu }; 292749c55878SDavid Wu 292849c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = { 292949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 293049c55878SDavid Wu IOMUX_SOURCE_PMU, 293149c55878SDavid Wu IOMUX_SOURCE_PMU, 293249c55878SDavid Wu IOMUX_SOURCE_PMU), 293349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 293449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0), 293549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0), 293649c55878SDavid Wu }; 293749c55878SDavid Wu 293849c55878SDavid Wu static struct rockchip_pin_ctrl rv1108_pin_ctrl = { 293949c55878SDavid Wu .pin_banks = rv1108_pin_banks, 294049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rv1108_pin_banks), 294149c55878SDavid Wu .label = "RV1108-GPIO", 294249c55878SDavid Wu .type = RV1108, 294349c55878SDavid Wu .grf_mux_offset = 0x10, 294449c55878SDavid Wu .pmu_mux_offset = 0x0, 294549c55878SDavid Wu .iomux_recalced = rv1108_mux_recalced_data, 294649c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data), 294749c55878SDavid Wu .pull_calc_reg = rv1108_calc_pull_reg_and_bit, 294849c55878SDavid Wu .drv_calc_reg = rv1108_calc_drv_reg_and_bit, 294949c55878SDavid Wu .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit, 295049c55878SDavid Wu }; 295149c55878SDavid Wu 2952a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = { 2953a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 2954a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 2955a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 2956a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 2957a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU), 2958a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 2959a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2960a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2961a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2962a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2963a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 2964a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2965a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2966a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2967a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2968a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 2969a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2970a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2971a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2972a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2973a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", 2974a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2975a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2976a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2977a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2978a2a3fc8fSJianqun Xu }; 2979a2a3fc8fSJianqun Xu 2980a2a3fc8fSJianqun Xu static struct rockchip_pin_ctrl rk1808_pin_ctrl = { 2981a2a3fc8fSJianqun Xu .pin_banks = rk1808_pin_banks, 2982a2a3fc8fSJianqun Xu .nr_banks = ARRAY_SIZE(rk1808_pin_banks), 2983a2a3fc8fSJianqun Xu .label = "RK1808-GPIO", 2984a2a3fc8fSJianqun Xu .type = RK1808, 2985a2a3fc8fSJianqun Xu .iomux_routes = rk1808_mux_route_data, 2986a2a3fc8fSJianqun Xu .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data), 2987a2a3fc8fSJianqun Xu .grf_mux_offset = 0x0, 2988a2a3fc8fSJianqun Xu .pmu_mux_offset = 0x0, 2989a2a3fc8fSJianqun Xu .pull_calc_reg = rk1808_calc_pull_reg_and_bit, 2990a2a3fc8fSJianqun Xu .drv_calc_reg = rk1808_calc_drv_reg_and_bit, 2991a2a3fc8fSJianqun Xu .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit, 2992a2a3fc8fSJianqun Xu }; 2993a2a3fc8fSJianqun Xu 299449c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = { 299549c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 299649c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 299749c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 299849c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 299949c55878SDavid Wu }; 300049c55878SDavid Wu 300149c55878SDavid Wu static struct rockchip_pin_ctrl rk2928_pin_ctrl = { 300249c55878SDavid Wu .pin_banks = rk2928_pin_banks, 300349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 300449c55878SDavid Wu .label = "RK2928-GPIO", 300549c55878SDavid Wu .type = RK2928, 300649c55878SDavid Wu .grf_mux_offset = 0xa8, 300749c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 300849c55878SDavid Wu }; 300949c55878SDavid Wu 301049c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = { 301149c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 301249c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 301349c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 301449c55878SDavid Wu }; 301549c55878SDavid Wu 301649c55878SDavid Wu static struct rockchip_pin_ctrl rk3036_pin_ctrl = { 301749c55878SDavid Wu .pin_banks = rk3036_pin_banks, 301849c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3036_pin_banks), 301949c55878SDavid Wu .label = "RK3036-GPIO", 302049c55878SDavid Wu .type = RK2928, 302149c55878SDavid Wu .grf_mux_offset = 0xa8, 302249c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 302349c55878SDavid Wu }; 302449c55878SDavid Wu 302549c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = { 302649c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 302749c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 302849c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 302949c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 303049c55878SDavid Wu PIN_BANK(4, 32, "gpio4"), 303149c55878SDavid Wu PIN_BANK(6, 16, "gpio6"), 303249c55878SDavid Wu }; 303349c55878SDavid Wu 303449c55878SDavid Wu static struct rockchip_pin_ctrl rk3066a_pin_ctrl = { 303549c55878SDavid Wu .pin_banks = rk3066a_pin_banks, 303649c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 303749c55878SDavid Wu .label = "RK3066a-GPIO", 303849c55878SDavid Wu .type = RK2928, 303949c55878SDavid Wu .grf_mux_offset = 0xa8, 304049c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 304149c55878SDavid Wu }; 304249c55878SDavid Wu 304349c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = { 304449c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 304549c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 304649c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 304749c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 304849c55878SDavid Wu }; 304949c55878SDavid Wu 305049c55878SDavid Wu static struct rockchip_pin_ctrl rk3066b_pin_ctrl = { 305149c55878SDavid Wu .pin_banks = rk3066b_pin_banks, 305249c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 305349c55878SDavid Wu .label = "RK3066b-GPIO", 305449c55878SDavid Wu .type = RK3066B, 305549c55878SDavid Wu .grf_mux_offset = 0x60, 305649c55878SDavid Wu }; 305749c55878SDavid Wu 305849c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = { 305949c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 306049c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 306149c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 306249c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 306349c55878SDavid Wu }; 306449c55878SDavid Wu 306549c55878SDavid Wu static struct rockchip_pin_ctrl rk3128_pin_ctrl = { 306649c55878SDavid Wu .pin_banks = rk3128_pin_banks, 306749c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3128_pin_banks), 306849c55878SDavid Wu .label = "RK3128-GPIO", 306949c55878SDavid Wu .type = RK3128, 307049c55878SDavid Wu .grf_mux_offset = 0xa8, 307149c55878SDavid Wu .iomux_recalced = rk3128_mux_recalced_data, 307249c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data), 307349c55878SDavid Wu .iomux_routes = rk3128_mux_route_data, 307449c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data), 307549c55878SDavid Wu .pull_calc_reg = rk3128_calc_pull_reg_and_bit, 307649c55878SDavid Wu }; 307749c55878SDavid Wu 307849c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = { 307949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0), 308049c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 308149c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 308249c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 308349c55878SDavid Wu }; 308449c55878SDavid Wu 308549c55878SDavid Wu static struct rockchip_pin_ctrl rk3188_pin_ctrl = { 308649c55878SDavid Wu .pin_banks = rk3188_pin_banks, 308749c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 308849c55878SDavid Wu .label = "RK3188-GPIO", 308949c55878SDavid Wu .type = RK3188, 309049c55878SDavid Wu .grf_mux_offset = 0x60, 309149c55878SDavid Wu .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 309249c55878SDavid Wu }; 309349c55878SDavid Wu 309449c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = { 309549c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 309649c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 309749c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 309849c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 309949c55878SDavid Wu }; 310049c55878SDavid Wu 310149c55878SDavid Wu static struct rockchip_pin_ctrl rk3228_pin_ctrl = { 310249c55878SDavid Wu .pin_banks = rk3228_pin_banks, 310349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3228_pin_banks), 310449c55878SDavid Wu .label = "RK3228-GPIO", 310549c55878SDavid Wu .type = RK3288, 310649c55878SDavid Wu .grf_mux_offset = 0x0, 310749c55878SDavid Wu .iomux_routes = rk3228_mux_route_data, 310849c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data), 310949c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 311049c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 311149c55878SDavid Wu }; 311249c55878SDavid Wu 311349c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = { 311455a89bc6SDavid Wu PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0", 31154bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 31164bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 311755a89bc6SDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 311855a89bc6SDavid Wu IOMUX_UNROUTED, 311955a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 312055a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 312155a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 312255a89bc6SDavid Wu 0, 312355a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 312455a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 312555a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 312655a89bc6SDavid Wu 0 312749c55878SDavid Wu ), 312849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED, 312949c55878SDavid Wu IOMUX_UNROUTED, 313049c55878SDavid Wu IOMUX_UNROUTED, 313149c55878SDavid Wu 0 313249c55878SDavid Wu ), 313349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED), 313449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT), 313549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, 313649c55878SDavid Wu IOMUX_WIDTH_4BIT, 313749c55878SDavid Wu 0, 313849c55878SDavid Wu 0 313949c55878SDavid Wu ), 314049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED, 314149c55878SDavid Wu 0, 314249c55878SDavid Wu 0, 314349c55878SDavid Wu IOMUX_UNROUTED 314449c55878SDavid Wu ), 314549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED), 314649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0, 314749c55878SDavid Wu 0, 314849c55878SDavid Wu IOMUX_WIDTH_4BIT, 314949c55878SDavid Wu IOMUX_UNROUTED 315049c55878SDavid Wu ), 315149c55878SDavid Wu PIN_BANK(8, 16, "gpio8"), 315249c55878SDavid Wu }; 315349c55878SDavid Wu 315449c55878SDavid Wu static struct rockchip_pin_ctrl rk3288_pin_ctrl = { 315549c55878SDavid Wu .pin_banks = rk3288_pin_banks, 315649c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3288_pin_banks), 315749c55878SDavid Wu .label = "RK3288-GPIO", 315849c55878SDavid Wu .type = RK3288, 315949c55878SDavid Wu .grf_mux_offset = 0x0, 316049c55878SDavid Wu .pmu_mux_offset = 0x84, 316149c55878SDavid Wu .iomux_routes = rk3288_mux_route_data, 316249c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data), 316349c55878SDavid Wu .pull_calc_reg = rk3288_calc_pull_reg_and_bit, 316449c55878SDavid Wu .drv_calc_reg = rk3288_calc_drv_reg_and_bit, 316549c55878SDavid Wu }; 316649c55878SDavid Wu 3167b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = { 3168b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT, 3169b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3170b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3171b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3172b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT, 3173b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3174b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3175b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3176b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT, 3177b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3178b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3179b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3180b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT, 3181b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3182b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3183b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3184b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT, 3185b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3186b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3187b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3188b3077611SDavid Wu }; 3189b3077611SDavid Wu 3190b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = { 3191b3077611SDavid Wu .pin_banks = rk3308_pin_banks, 3192b3077611SDavid Wu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 3193b3077611SDavid Wu .label = "RK3308-GPIO", 3194b3077611SDavid Wu .type = RK3308, 3195b3077611SDavid Wu .grf_mux_offset = 0x0, 3196b3077611SDavid Wu .iomux_recalced = rk3308_mux_recalced_data, 3197b3077611SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data), 3198b3077611SDavid Wu .iomux_routes = rk3308_mux_route_data, 3199b3077611SDavid Wu .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data), 3200d5517017SDavid Wu .ctrl_data_re_init = rk3308b_ctrl_data_re_init, 3201d5517017SDavid Wu .soc_data_init = rk3308b_soc_data_init, 3202b3077611SDavid Wu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 3203b3077611SDavid Wu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 3204b3077611SDavid Wu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 3205b3077611SDavid Wu }; 3206b3077611SDavid Wu 320749c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = { 320849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0), 320949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 321049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 321149c55878SDavid Wu IOMUX_WIDTH_3BIT, 321249c55878SDavid Wu IOMUX_WIDTH_3BIT, 321349c55878SDavid Wu 0), 321449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 321549c55878SDavid Wu IOMUX_WIDTH_3BIT, 321649c55878SDavid Wu IOMUX_WIDTH_3BIT, 321749c55878SDavid Wu 0, 321849c55878SDavid Wu 0), 321949c55878SDavid Wu }; 322049c55878SDavid Wu 322149c55878SDavid Wu static struct rockchip_pin_ctrl rk3328_pin_ctrl = { 322249c55878SDavid Wu .pin_banks = rk3328_pin_banks, 322349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3328_pin_banks), 322449c55878SDavid Wu .label = "RK3328-GPIO", 322549c55878SDavid Wu .type = RK3288, 322649c55878SDavid Wu .grf_mux_offset = 0x0, 322749c55878SDavid Wu .iomux_recalced = rk3328_mux_recalced_data, 322849c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data), 322949c55878SDavid Wu .iomux_routes = rk3328_mux_route_data, 323049c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data), 323149c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 323249c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 323349c55878SDavid Wu .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit, 323449c55878SDavid Wu }; 323549c55878SDavid Wu 323649c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = { 323749c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 323849c55878SDavid Wu IOMUX_SOURCE_PMU, 323949c55878SDavid Wu IOMUX_SOURCE_PMU, 324049c55878SDavid Wu IOMUX_SOURCE_PMU 324149c55878SDavid Wu ), 324249c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 324349c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 324449c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 324549c55878SDavid Wu }; 324649c55878SDavid Wu 324749c55878SDavid Wu static struct rockchip_pin_ctrl rk3368_pin_ctrl = { 324849c55878SDavid Wu .pin_banks = rk3368_pin_banks, 324949c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3368_pin_banks), 325049c55878SDavid Wu .label = "RK3368-GPIO", 325149c55878SDavid Wu .type = RK3368, 325249c55878SDavid Wu .grf_mux_offset = 0x0, 325349c55878SDavid Wu .pmu_mux_offset = 0x0, 325449c55878SDavid Wu .pull_calc_reg = rk3368_calc_pull_reg_and_bit, 325549c55878SDavid Wu .drv_calc_reg = rk3368_calc_drv_reg_and_bit, 325649c55878SDavid Wu }; 325749c55878SDavid Wu 325849c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = { 325949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0", 326049c55878SDavid Wu IOMUX_SOURCE_PMU, 326149c55878SDavid Wu IOMUX_SOURCE_PMU, 326249c55878SDavid Wu IOMUX_SOURCE_PMU, 326349c55878SDavid Wu IOMUX_SOURCE_PMU, 326449c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 326549c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 326649c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 326749c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 326849c55878SDavid Wu 0x80, 326949c55878SDavid Wu 0x88, 327049c55878SDavid Wu -1, 327149c55878SDavid Wu -1, 327249c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 327349c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 327449c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 327549c55878SDavid Wu PULL_TYPE_IO_DEFAULT 327649c55878SDavid Wu ), 327749c55878SDavid Wu PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU, 327849c55878SDavid Wu IOMUX_SOURCE_PMU, 327949c55878SDavid Wu IOMUX_SOURCE_PMU, 328049c55878SDavid Wu IOMUX_SOURCE_PMU, 328149c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 328249c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 328349c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 328449c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 328549c55878SDavid Wu 0xa0, 328649c55878SDavid Wu 0xa8, 328749c55878SDavid Wu 0xb0, 328849c55878SDavid Wu 0xb8 328949c55878SDavid Wu ), 329049c55878SDavid Wu PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0, 329149c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 329249c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 329349c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 329449c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 329549c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 329649c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 329749c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY 329849c55878SDavid Wu ), 329949c55878SDavid Wu PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY, 330049c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 330149c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 330249c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 330349c55878SDavid Wu ), 330449c55878SDavid Wu PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0, 330549c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 330649c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 330749c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 330849c55878SDavid Wu ), 330949c55878SDavid Wu }; 331049c55878SDavid Wu 331149c55878SDavid Wu static struct rockchip_pin_ctrl rk3399_pin_ctrl = { 331249c55878SDavid Wu .pin_banks = rk3399_pin_banks, 331349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3399_pin_banks), 331449c55878SDavid Wu .label = "RK3399-GPIO", 331549c55878SDavid Wu .type = RK3399, 331649c55878SDavid Wu .grf_mux_offset = 0xe000, 331749c55878SDavid Wu .pmu_mux_offset = 0x0, 331849c55878SDavid Wu .grf_drv_offset = 0xe100, 331949c55878SDavid Wu .pmu_drv_offset = 0x80, 332049c55878SDavid Wu .iomux_routes = rk3399_mux_route_data, 332149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data), 332249c55878SDavid Wu .pull_calc_reg = rk3399_calc_pull_reg_and_bit, 332349c55878SDavid Wu .drv_calc_reg = rk3399_calc_drv_reg_and_bit, 332449c55878SDavid Wu }; 332549c55878SDavid Wu 332649c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = { 332749c55878SDavid Wu { .compatible = "rockchip,px30-pinctrl", 332849c55878SDavid Wu .data = (ulong)&px30_pin_ctrl }, 332949c55878SDavid Wu { .compatible = "rockchip,rv1108-pinctrl", 333049c55878SDavid Wu .data = (ulong)&rv1108_pin_ctrl }, 3331a2a3fc8fSJianqun Xu { .compatible = "rockchip,rk1808-pinctrl", 3332a2a3fc8fSJianqun Xu .data = (ulong)&rk1808_pin_ctrl }, 333349c55878SDavid Wu { .compatible = "rockchip,rk2928-pinctrl", 333449c55878SDavid Wu .data = (ulong)&rk2928_pin_ctrl }, 333549c55878SDavid Wu { .compatible = "rockchip,rk3036-pinctrl", 333649c55878SDavid Wu .data = (ulong)&rk3036_pin_ctrl }, 333749c55878SDavid Wu { .compatible = "rockchip,rk3066a-pinctrl", 333849c55878SDavid Wu .data = (ulong)&rk3066a_pin_ctrl }, 333949c55878SDavid Wu { .compatible = "rockchip,rk3066b-pinctrl", 334049c55878SDavid Wu .data = (ulong)&rk3066b_pin_ctrl }, 334149c55878SDavid Wu { .compatible = "rockchip,rk3128-pinctrl", 334249c55878SDavid Wu .data = (ulong)&rk3128_pin_ctrl }, 334349c55878SDavid Wu { .compatible = "rockchip,rk3188-pinctrl", 334449c55878SDavid Wu .data = (ulong)&rk3188_pin_ctrl }, 334549c55878SDavid Wu { .compatible = "rockchip,rk3228-pinctrl", 334649c55878SDavid Wu .data = (ulong)&rk3228_pin_ctrl }, 334749c55878SDavid Wu { .compatible = "rockchip,rk3288-pinctrl", 334849c55878SDavid Wu .data = (ulong)&rk3288_pin_ctrl }, 3349b3077611SDavid Wu { .compatible = "rockchip,rk3308-pinctrl", 3350b3077611SDavid Wu .data = (ulong)&rk3308_pin_ctrl }, 335149c55878SDavid Wu { .compatible = "rockchip,rk3328-pinctrl", 335249c55878SDavid Wu .data = (ulong)&rk3328_pin_ctrl }, 335349c55878SDavid Wu { .compatible = "rockchip,rk3368-pinctrl", 335449c55878SDavid Wu .data = (ulong)&rk3368_pin_ctrl }, 335549c55878SDavid Wu { .compatible = "rockchip,rk3399-pinctrl", 335649c55878SDavid Wu .data = (ulong)&rk3399_pin_ctrl }, 335749c55878SDavid Wu {}, 335849c55878SDavid Wu }; 335949c55878SDavid Wu 336049c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = { 336149c55878SDavid Wu .name = "rockchip_pinctrl", 336249c55878SDavid Wu .id = UCLASS_PINCTRL, 336349c55878SDavid Wu .of_match = rockchip_pinctrl_dt_match, 336449c55878SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), 336549c55878SDavid Wu .ops = &rockchip_pinctrl_ops, 336649c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA) 336749c55878SDavid Wu .bind = dm_scan_fdt_dev, 336849c55878SDavid Wu #endif 336949c55878SDavid Wu .probe = rockchip_pinctrl_probe, 337049c55878SDavid Wu }; 3371