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, 22*cf04a17bSJianqun Xu RV1126, 23a2a3fc8fSJianqun Xu RK1808, 2449c55878SDavid Wu RK2928, 2549c55878SDavid Wu RK3066B, 2649c55878SDavid Wu RK3128, 2749c55878SDavid Wu RK3188, 2849c55878SDavid Wu RK3288, 29b3077611SDavid Wu RK3308, 3049c55878SDavid Wu RK3368, 3149c55878SDavid Wu RK3399, 3249c55878SDavid Wu }; 3349c55878SDavid Wu 3449c55878SDavid Wu /** 3549c55878SDavid Wu * Encode variants of iomux registers into a type variable 3649c55878SDavid Wu */ 3749c55878SDavid Wu #define IOMUX_GPIO_ONLY BIT(0) 3849c55878SDavid Wu #define IOMUX_WIDTH_4BIT BIT(1) 3949c55878SDavid Wu #define IOMUX_SOURCE_PMU BIT(2) 4049c55878SDavid Wu #define IOMUX_UNROUTED BIT(3) 4149c55878SDavid Wu #define IOMUX_WIDTH_3BIT BIT(4) 42b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT BIT(5) 434bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT BIT(6) 44*cf04a17bSJianqun Xu #define IOMUX_L_SOURCE_PMU BIT(7) 4549c55878SDavid Wu 4649c55878SDavid Wu /** 4749c55878SDavid Wu * @type: iomux variant using IOMUX_* constants 4849c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 4949c55878SDavid Wu * an initial offset value the relevant source offset can be reset 5049c55878SDavid Wu * to a new value for autocalculating the following iomux registers. 5149c55878SDavid Wu */ 5249c55878SDavid Wu struct rockchip_iomux { 5349c55878SDavid Wu int type; 5449c55878SDavid Wu int offset; 5549c55878SDavid Wu }; 5649c55878SDavid Wu 5755a89bc6SDavid Wu #define DRV_TYPE_IO_MASK GENMASK(31, 16) 5855a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT BIT(31) 5955a89bc6SDavid Wu 6049c55878SDavid Wu /** 6149c55878SDavid Wu * enum type index corresponding to rockchip_perpin_drv_list arrays index. 6249c55878SDavid Wu */ 6349c55878SDavid Wu enum rockchip_pin_drv_type { 6449c55878SDavid Wu DRV_TYPE_IO_DEFAULT = 0, 6549c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 6649c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 6749c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 6849c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 6949c55878SDavid Wu DRV_TYPE_MAX 7049c55878SDavid Wu }; 7149c55878SDavid Wu 7255a89bc6SDavid Wu #define PULL_TYPE_IO_MASK GENMASK(31, 16) 7355a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT BIT(31) 7455a89bc6SDavid Wu 7549c55878SDavid Wu /** 7649c55878SDavid Wu * enum type index corresponding to rockchip_pull_list arrays index. 7749c55878SDavid Wu */ 7849c55878SDavid Wu enum rockchip_pin_pull_type { 7949c55878SDavid Wu PULL_TYPE_IO_DEFAULT = 0, 8049c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 8149c55878SDavid Wu PULL_TYPE_MAX 8249c55878SDavid Wu }; 8349c55878SDavid Wu 8449c55878SDavid Wu /** 8549c55878SDavid Wu * @drv_type: drive strength variant using rockchip_perpin_drv_type 8649c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 8749c55878SDavid Wu * an initial offset value the relevant source offset can be reset 8849c55878SDavid Wu * to a new value for autocalculating the following drive strength 8949c55878SDavid Wu * registers. if used chips own cal_drv func instead to calculate 9049c55878SDavid Wu * registers offset, the variant could be ignored. 9149c55878SDavid Wu */ 9249c55878SDavid Wu struct rockchip_drv { 9349c55878SDavid Wu enum rockchip_pin_drv_type drv_type; 9449c55878SDavid Wu int offset; 9549c55878SDavid Wu }; 9649c55878SDavid Wu 9749c55878SDavid Wu /** 9849c55878SDavid Wu * @priv: common pinctrl private basedata 9949c55878SDavid Wu * @pin_base: first pin number 10049c55878SDavid Wu * @nr_pins: number of pins in this bank 10149c55878SDavid Wu * @name: name of the bank 10249c55878SDavid Wu * @bank_num: number of the bank, to account for holes 10349c55878SDavid Wu * @iomux: array describing the 4 iomux sources of the bank 10449c55878SDavid Wu * @drv: array describing the 4 drive strength sources of the bank 10549c55878SDavid Wu * @pull_type: array describing the 4 pull type sources of the bank 10649c55878SDavid Wu * @recalced_mask: bits describing the mux recalced pins of per bank 10749c55878SDavid Wu * @route_mask: bits describing the routing pins of per bank 10849c55878SDavid Wu */ 10949c55878SDavid Wu struct rockchip_pin_bank { 11049c55878SDavid Wu struct rockchip_pinctrl_priv *priv; 11149c55878SDavid Wu u32 pin_base; 11249c55878SDavid Wu u8 nr_pins; 11349c55878SDavid Wu char *name; 11449c55878SDavid Wu u8 bank_num; 11549c55878SDavid Wu struct rockchip_iomux iomux[4]; 11649c55878SDavid Wu struct rockchip_drv drv[4]; 11749c55878SDavid Wu enum rockchip_pin_pull_type pull_type[4]; 11849c55878SDavid Wu u32 recalced_mask; 11949c55878SDavid Wu u32 route_mask; 12049c55878SDavid Wu }; 12149c55878SDavid Wu 12249c55878SDavid Wu #define PIN_BANK(id, pins, label) \ 12349c55878SDavid Wu { \ 12449c55878SDavid Wu .bank_num = id, \ 12549c55878SDavid Wu .nr_pins = pins, \ 12649c55878SDavid Wu .name = label, \ 12749c55878SDavid Wu .iomux = { \ 12849c55878SDavid Wu { .offset = -1 }, \ 12949c55878SDavid Wu { .offset = -1 }, \ 13049c55878SDavid Wu { .offset = -1 }, \ 13149c55878SDavid Wu { .offset = -1 }, \ 13249c55878SDavid Wu }, \ 13349c55878SDavid Wu } 13449c55878SDavid Wu 13549c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 13649c55878SDavid Wu { \ 13749c55878SDavid Wu .bank_num = id, \ 13849c55878SDavid Wu .nr_pins = pins, \ 13949c55878SDavid Wu .name = label, \ 14049c55878SDavid Wu .iomux = { \ 14149c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 14249c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 14349c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 14449c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 14549c55878SDavid Wu }, \ 14649c55878SDavid Wu } 14749c55878SDavid Wu 14849c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 14949c55878SDavid Wu { \ 15049c55878SDavid Wu .bank_num = id, \ 15149c55878SDavid Wu .nr_pins = pins, \ 15249c55878SDavid Wu .name = label, \ 15349c55878SDavid Wu .iomux = { \ 15449c55878SDavid Wu { .offset = -1 }, \ 15549c55878SDavid Wu { .offset = -1 }, \ 15649c55878SDavid Wu { .offset = -1 }, \ 15749c55878SDavid Wu { .offset = -1 }, \ 15849c55878SDavid Wu }, \ 15949c55878SDavid Wu .drv = { \ 16049c55878SDavid Wu { .drv_type = type0, .offset = -1 }, \ 16149c55878SDavid Wu { .drv_type = type1, .offset = -1 }, \ 16249c55878SDavid Wu { .drv_type = type2, .offset = -1 }, \ 16349c55878SDavid Wu { .drv_type = type3, .offset = -1 }, \ 16449c55878SDavid Wu }, \ 16549c55878SDavid Wu } 16649c55878SDavid Wu 16749c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \ 16849c55878SDavid Wu drv2, drv3, pull0, pull1, \ 16949c55878SDavid Wu pull2, pull3) \ 17049c55878SDavid Wu { \ 17149c55878SDavid Wu .bank_num = id, \ 17249c55878SDavid Wu .nr_pins = pins, \ 17349c55878SDavid Wu .name = label, \ 17449c55878SDavid Wu .iomux = { \ 17549c55878SDavid Wu { .offset = -1 }, \ 17649c55878SDavid Wu { .offset = -1 }, \ 17749c55878SDavid Wu { .offset = -1 }, \ 17849c55878SDavid Wu { .offset = -1 }, \ 17949c55878SDavid Wu }, \ 18049c55878SDavid Wu .drv = { \ 18149c55878SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 18249c55878SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 18349c55878SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 18449c55878SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 18549c55878SDavid Wu }, \ 18649c55878SDavid Wu .pull_type[0] = pull0, \ 18749c55878SDavid Wu .pull_type[1] = pull1, \ 18849c55878SDavid Wu .pull_type[2] = pull2, \ 18949c55878SDavid Wu .pull_type[3] = pull3, \ 19049c55878SDavid Wu } 19149c55878SDavid Wu 19249c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \ 19349c55878SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 19449c55878SDavid Wu drv3, offset0, offset1, \ 19549c55878SDavid Wu offset2, offset3) \ 19649c55878SDavid Wu { \ 19749c55878SDavid Wu .bank_num = id, \ 19849c55878SDavid Wu .nr_pins = pins, \ 19949c55878SDavid Wu .name = label, \ 20049c55878SDavid Wu .iomux = { \ 20149c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 20249c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 20349c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 20449c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 20549c55878SDavid Wu }, \ 20649c55878SDavid Wu .drv = { \ 20749c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 20849c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 20949c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 21049c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 21149c55878SDavid Wu }, \ 21249c55878SDavid Wu } 21349c55878SDavid Wu 21455a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1, \ 21555a89bc6SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 21655a89bc6SDavid Wu drv3, pull0, pull1, pull2, \ 21755a89bc6SDavid Wu pull3) \ 21855a89bc6SDavid Wu { \ 21955a89bc6SDavid Wu .bank_num = id, \ 22055a89bc6SDavid Wu .nr_pins = pins, \ 22155a89bc6SDavid Wu .name = label, \ 22255a89bc6SDavid Wu .iomux = { \ 22355a89bc6SDavid Wu { .type = iom0, .offset = -1 }, \ 22455a89bc6SDavid Wu { .type = iom1, .offset = -1 }, \ 22555a89bc6SDavid Wu { .type = iom2, .offset = -1 }, \ 22655a89bc6SDavid Wu { .type = iom3, .offset = -1 }, \ 22755a89bc6SDavid Wu }, \ 22855a89bc6SDavid Wu .drv = { \ 22955a89bc6SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 23055a89bc6SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 23155a89bc6SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 23255a89bc6SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 23355a89bc6SDavid Wu }, \ 23455a89bc6SDavid Wu .pull_type[0] = pull0, \ 23555a89bc6SDavid Wu .pull_type[1] = pull1, \ 23655a89bc6SDavid Wu .pull_type[2] = pull2, \ 23755a89bc6SDavid Wu .pull_type[3] = pull3, \ 23855a89bc6SDavid Wu } 23955a89bc6SDavid Wu 24049c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \ 24149c55878SDavid Wu label, iom0, iom1, iom2, \ 24249c55878SDavid Wu iom3, drv0, drv1, drv2, \ 24349c55878SDavid Wu drv3, offset0, offset1, \ 24449c55878SDavid Wu offset2, offset3, pull0, \ 24549c55878SDavid Wu pull1, pull2, pull3) \ 24649c55878SDavid Wu { \ 24749c55878SDavid Wu .bank_num = id, \ 24849c55878SDavid Wu .nr_pins = pins, \ 24949c55878SDavid Wu .name = label, \ 25049c55878SDavid Wu .iomux = { \ 25149c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 25249c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 25349c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 25449c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 25549c55878SDavid Wu }, \ 25649c55878SDavid Wu .drv = { \ 25749c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 25849c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 25949c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 26049c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 26149c55878SDavid Wu }, \ 26249c55878SDavid Wu .pull_type[0] = pull0, \ 26349c55878SDavid Wu .pull_type[1] = pull1, \ 26449c55878SDavid Wu .pull_type[2] = pull2, \ 26549c55878SDavid Wu .pull_type[3] = pull3, \ 26649c55878SDavid Wu } 26749c55878SDavid Wu 26849c55878SDavid Wu /** 26949c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 27049c55878SDavid Wu * @num: bank number. 27149c55878SDavid Wu * @pin: pin number. 27249c55878SDavid Wu * @bit: index at register. 27349c55878SDavid Wu * @reg: register offset. 27449c55878SDavid Wu * @mask: mask bit 27549c55878SDavid Wu */ 27649c55878SDavid Wu struct rockchip_mux_recalced_data { 27749c55878SDavid Wu u8 num; 27849c55878SDavid Wu u8 pin; 27949c55878SDavid Wu u32 reg; 28049c55878SDavid Wu u8 bit; 28149c55878SDavid Wu u8 mask; 28249c55878SDavid Wu }; 28349c55878SDavid Wu 28449c55878SDavid Wu /** 28549c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 28649c55878SDavid Wu * @bank_num: bank number. 28749c55878SDavid Wu * @pin: index at register or used to calc index. 28849c55878SDavid Wu * @func: the min pin. 28949c55878SDavid Wu * @route_offset: the max pin. 29049c55878SDavid Wu * @route_val: the register offset. 29149c55878SDavid Wu */ 29249c55878SDavid Wu struct rockchip_mux_route_data { 29349c55878SDavid Wu u8 bank_num; 29449c55878SDavid Wu u8 pin; 29549c55878SDavid Wu u8 func; 29649c55878SDavid Wu u32 route_offset; 29749c55878SDavid Wu u32 route_val; 29849c55878SDavid Wu }; 29949c55878SDavid Wu 30049c55878SDavid Wu /** 30149c55878SDavid Wu */ 30249c55878SDavid Wu struct rockchip_pin_ctrl { 30349c55878SDavid Wu struct rockchip_pin_bank *pin_banks; 30449c55878SDavid Wu u32 nr_banks; 30549c55878SDavid Wu u32 nr_pins; 30649c55878SDavid Wu char *label; 30749c55878SDavid Wu enum rockchip_pinctrl_type type; 30849c55878SDavid Wu int grf_mux_offset; 30949c55878SDavid Wu int pmu_mux_offset; 31049c55878SDavid Wu int grf_drv_offset; 31149c55878SDavid Wu int pmu_drv_offset; 31249c55878SDavid Wu struct rockchip_mux_recalced_data *iomux_recalced; 31349c55878SDavid Wu u32 niomux_recalced; 31449c55878SDavid Wu struct rockchip_mux_route_data *iomux_routes; 31549c55878SDavid Wu u32 niomux_routes; 31649c55878SDavid Wu 317d5517017SDavid Wu int (*ctrl_data_re_init)(struct rockchip_pin_ctrl *ctrl); 318d5517017SDavid Wu 319d5517017SDavid Wu int (*soc_data_init)(struct rockchip_pinctrl_priv *info); 320d5517017SDavid Wu 32149c55878SDavid Wu void (*pull_calc_reg)(struct rockchip_pin_bank *bank, 32249c55878SDavid Wu int pin_num, struct regmap **regmap, 32349c55878SDavid Wu int *reg, u8 *bit); 32449c55878SDavid Wu void (*drv_calc_reg)(struct rockchip_pin_bank *bank, 32549c55878SDavid Wu int pin_num, struct regmap **regmap, 32649c55878SDavid Wu int *reg, u8 *bit); 32749c55878SDavid Wu int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank, 32849c55878SDavid Wu int pin_num, struct regmap **regmap, 32949c55878SDavid Wu int *reg, u8 *bit); 33032c25d1fSDavid Wu int (*slew_rate_calc_reg)(struct rockchip_pin_bank *bank, 33132c25d1fSDavid Wu int pin_num, struct regmap **regmap, 33232c25d1fSDavid Wu int *reg, u8 *bit); 33349c55878SDavid Wu }; 33449c55878SDavid Wu 33549c55878SDavid Wu /** 33649c55878SDavid Wu */ 33749c55878SDavid Wu struct rockchip_pinctrl_priv { 33849c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 33949c55878SDavid Wu struct regmap *regmap_base; 34049c55878SDavid Wu struct regmap *regmap_pmu; 34149c55878SDavid Wu 34249c55878SDavid Wu }; 34349c55878SDavid Wu 34449c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin) 34549c55878SDavid Wu { 34649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 34749c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 34849c55878SDavid Wu 34949c55878SDavid Wu if (bank >= ctrl->nr_banks) { 35049c55878SDavid Wu debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks); 35149c55878SDavid Wu return -EINVAL; 35249c55878SDavid Wu } 35349c55878SDavid Wu 35449c55878SDavid Wu if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) { 35549c55878SDavid Wu debug("pin conf pin %d >= %d\n", pin, 35649c55878SDavid Wu MAX_ROCKCHIP_GPIO_PER_BANK); 35749c55878SDavid Wu return -EINVAL; 35849c55878SDavid Wu } 35949c55878SDavid Wu 36049c55878SDavid Wu return 0; 36149c55878SDavid Wu } 36249c55878SDavid Wu 36349c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = { 36449c55878SDavid Wu { 36549c55878SDavid Wu .num = 1, 36649c55878SDavid Wu .pin = 0, 36749c55878SDavid Wu .reg = 0x418, 36849c55878SDavid Wu .bit = 0, 36949c55878SDavid Wu .mask = 0x3 37049c55878SDavid Wu }, { 37149c55878SDavid Wu .num = 1, 37249c55878SDavid Wu .pin = 1, 37349c55878SDavid Wu .reg = 0x418, 37449c55878SDavid Wu .bit = 2, 37549c55878SDavid Wu .mask = 0x3 37649c55878SDavid Wu }, { 37749c55878SDavid Wu .num = 1, 37849c55878SDavid Wu .pin = 2, 37949c55878SDavid Wu .reg = 0x418, 38049c55878SDavid Wu .bit = 4, 38149c55878SDavid Wu .mask = 0x3 38249c55878SDavid Wu }, { 38349c55878SDavid Wu .num = 1, 38449c55878SDavid Wu .pin = 3, 38549c55878SDavid Wu .reg = 0x418, 38649c55878SDavid Wu .bit = 6, 38749c55878SDavid Wu .mask = 0x3 38849c55878SDavid Wu }, { 38949c55878SDavid Wu .num = 1, 39049c55878SDavid Wu .pin = 4, 39149c55878SDavid Wu .reg = 0x418, 39249c55878SDavid Wu .bit = 8, 39349c55878SDavid Wu .mask = 0x3 39449c55878SDavid Wu }, { 39549c55878SDavid Wu .num = 1, 39649c55878SDavid Wu .pin = 5, 39749c55878SDavid Wu .reg = 0x418, 39849c55878SDavid Wu .bit = 10, 39949c55878SDavid Wu .mask = 0x3 40049c55878SDavid Wu }, { 40149c55878SDavid Wu .num = 1, 40249c55878SDavid Wu .pin = 6, 40349c55878SDavid Wu .reg = 0x418, 40449c55878SDavid Wu .bit = 12, 40549c55878SDavid Wu .mask = 0x3 40649c55878SDavid Wu }, { 40749c55878SDavid Wu .num = 1, 40849c55878SDavid Wu .pin = 7, 40949c55878SDavid Wu .reg = 0x418, 41049c55878SDavid Wu .bit = 14, 41149c55878SDavid Wu .mask = 0x3 41249c55878SDavid Wu }, { 41349c55878SDavid Wu .num = 1, 41449c55878SDavid Wu .pin = 8, 41549c55878SDavid Wu .reg = 0x41c, 41649c55878SDavid Wu .bit = 0, 41749c55878SDavid Wu .mask = 0x3 41849c55878SDavid Wu }, { 41949c55878SDavid Wu .num = 1, 42049c55878SDavid Wu .pin = 9, 42149c55878SDavid Wu .reg = 0x41c, 42249c55878SDavid Wu .bit = 2, 42349c55878SDavid Wu .mask = 0x3 42449c55878SDavid Wu }, 42549c55878SDavid Wu }; 42649c55878SDavid Wu 427*cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = { 428*cf04a17bSJianqun Xu { 429*cf04a17bSJianqun Xu .num = 0, 430*cf04a17bSJianqun Xu .pin = 20, 431*cf04a17bSJianqun Xu .reg = 0x10000, 432*cf04a17bSJianqun Xu .bit = 0, 433*cf04a17bSJianqun Xu .mask = 0xf 434*cf04a17bSJianqun Xu }, 435*cf04a17bSJianqun Xu { 436*cf04a17bSJianqun Xu .num = 0, 437*cf04a17bSJianqun Xu .pin = 21, 438*cf04a17bSJianqun Xu .reg = 0x10000, 439*cf04a17bSJianqun Xu .bit = 4, 440*cf04a17bSJianqun Xu .mask = 0xf 441*cf04a17bSJianqun Xu }, 442*cf04a17bSJianqun Xu { 443*cf04a17bSJianqun Xu .num = 0, 444*cf04a17bSJianqun Xu .pin = 22, 445*cf04a17bSJianqun Xu .reg = 0x10000, 446*cf04a17bSJianqun Xu .bit = 8, 447*cf04a17bSJianqun Xu .mask = 0xf 448*cf04a17bSJianqun Xu }, 449*cf04a17bSJianqun Xu { 450*cf04a17bSJianqun Xu .num = 0, 451*cf04a17bSJianqun Xu .pin = 23, 452*cf04a17bSJianqun Xu .reg = 0x10000, 453*cf04a17bSJianqun Xu .bit = 12, 454*cf04a17bSJianqun Xu .mask = 0xf 455*cf04a17bSJianqun Xu }, 456*cf04a17bSJianqun Xu }; 457*cf04a17bSJianqun Xu 45849c55878SDavid Wu static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { 45949c55878SDavid Wu { 46049c55878SDavid Wu .num = 2, 46149c55878SDavid Wu .pin = 20, 46249c55878SDavid Wu .reg = 0xe8, 46349c55878SDavid Wu .bit = 0, 46449c55878SDavid Wu .mask = 0x7 46549c55878SDavid Wu }, { 46649c55878SDavid Wu .num = 2, 46749c55878SDavid Wu .pin = 21, 46849c55878SDavid Wu .reg = 0xe8, 46949c55878SDavid Wu .bit = 4, 47049c55878SDavid Wu .mask = 0x7 47149c55878SDavid Wu }, { 47249c55878SDavid Wu .num = 2, 47349c55878SDavid Wu .pin = 22, 47449c55878SDavid Wu .reg = 0xe8, 47549c55878SDavid Wu .bit = 8, 47649c55878SDavid Wu .mask = 0x7 47749c55878SDavid Wu }, { 47849c55878SDavid Wu .num = 2, 47949c55878SDavid Wu .pin = 23, 48049c55878SDavid Wu .reg = 0xe8, 48149c55878SDavid Wu .bit = 12, 48249c55878SDavid Wu .mask = 0x7 48349c55878SDavid Wu }, { 48449c55878SDavid Wu .num = 2, 48549c55878SDavid Wu .pin = 24, 48649c55878SDavid Wu .reg = 0xd4, 48749c55878SDavid Wu .bit = 12, 48849c55878SDavid Wu .mask = 0x7 48949c55878SDavid Wu }, 49049c55878SDavid Wu }; 49149c55878SDavid Wu 492b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { 493b3077611SDavid Wu { 494b3077611SDavid Wu .num = 1, 495b3077611SDavid Wu .pin = 14, 496b3077611SDavid Wu .reg = 0x28, 497b3077611SDavid Wu .bit = 12, 498b3077611SDavid Wu .mask = 0x7 499b3077611SDavid Wu }, { 500b3077611SDavid Wu .num = 1, 501b3077611SDavid Wu .pin = 15, 502b3077611SDavid Wu .reg = 0x2c, 503b3077611SDavid Wu .bit = 0, 504b3077611SDavid Wu .mask = 0x3 505b3077611SDavid Wu }, { 506b3077611SDavid Wu .num = 1, 507b3077611SDavid Wu .pin = 18, 508b3077611SDavid Wu .reg = 0x30, 509b3077611SDavid Wu .bit = 4, 510b3077611SDavid Wu .mask = 0x7 511b3077611SDavid Wu }, { 512b3077611SDavid Wu .num = 1, 513b3077611SDavid Wu .pin = 19, 514b3077611SDavid Wu .reg = 0x30, 515b3077611SDavid Wu .bit = 8, 516b3077611SDavid Wu .mask = 0x7 517b3077611SDavid Wu }, { 518b3077611SDavid Wu .num = 1, 519b3077611SDavid Wu .pin = 20, 520b3077611SDavid Wu .reg = 0x30, 521b3077611SDavid Wu .bit = 12, 522b3077611SDavid Wu .mask = 0x7 523b3077611SDavid Wu }, { 524b3077611SDavid Wu .num = 1, 525b3077611SDavid Wu .pin = 21, 526b3077611SDavid Wu .reg = 0x34, 527b3077611SDavid Wu .bit = 0, 528b3077611SDavid Wu .mask = 0x7 529b3077611SDavid Wu }, { 530b3077611SDavid Wu .num = 1, 531b3077611SDavid Wu .pin = 22, 532b3077611SDavid Wu .reg = 0x34, 533b3077611SDavid Wu .bit = 4, 534b3077611SDavid Wu .mask = 0x7 535b3077611SDavid Wu }, { 536b3077611SDavid Wu .num = 1, 537b3077611SDavid Wu .pin = 23, 538b3077611SDavid Wu .reg = 0x34, 539b3077611SDavid Wu .bit = 8, 540b3077611SDavid Wu .mask = 0x7 541b3077611SDavid Wu }, { 542b3077611SDavid Wu .num = 3, 543b3077611SDavid Wu .pin = 12, 544b3077611SDavid Wu .reg = 0x68, 545b3077611SDavid Wu .bit = 8, 546b3077611SDavid Wu .mask = 0x7 547b3077611SDavid Wu }, { 548b3077611SDavid Wu .num = 3, 549b3077611SDavid Wu .pin = 13, 550b3077611SDavid Wu .reg = 0x68, 551b3077611SDavid Wu .bit = 12, 552b3077611SDavid Wu .mask = 0x7 553b3077611SDavid Wu }, 554b3077611SDavid Wu }; 555b3077611SDavid Wu 556d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = { 557d5517017SDavid Wu { 558d5517017SDavid Wu .num = 1, 559d5517017SDavid Wu .pin = 14, 560d5517017SDavid Wu .reg = 0x28, 561d5517017SDavid Wu .bit = 12, 562d5517017SDavid Wu .mask = 0xf 563d5517017SDavid Wu }, { 564d5517017SDavid Wu .num = 1, 565d5517017SDavid Wu .pin = 15, 566d5517017SDavid Wu .reg = 0x2c, 567d5517017SDavid Wu .bit = 0, 568d5517017SDavid Wu .mask = 0x3 569d5517017SDavid Wu }, { 570d5517017SDavid Wu .num = 1, 571d5517017SDavid Wu .pin = 18, 572d5517017SDavid Wu .reg = 0x30, 573d5517017SDavid Wu .bit = 4, 574d5517017SDavid Wu .mask = 0xf 575d5517017SDavid Wu }, { 576d5517017SDavid Wu .num = 1, 577d5517017SDavid Wu .pin = 19, 578d5517017SDavid Wu .reg = 0x30, 579d5517017SDavid Wu .bit = 8, 580d5517017SDavid Wu .mask = 0xf 581d5517017SDavid Wu }, { 582d5517017SDavid Wu .num = 1, 583d5517017SDavid Wu .pin = 20, 584d5517017SDavid Wu .reg = 0x30, 585d5517017SDavid Wu .bit = 12, 586d5517017SDavid Wu .mask = 0xf 587d5517017SDavid Wu }, { 588d5517017SDavid Wu .num = 1, 589d5517017SDavid Wu .pin = 21, 590d5517017SDavid Wu .reg = 0x34, 591d5517017SDavid Wu .bit = 0, 592d5517017SDavid Wu .mask = 0xf 593d5517017SDavid Wu }, { 594d5517017SDavid Wu .num = 1, 595d5517017SDavid Wu .pin = 22, 596d5517017SDavid Wu .reg = 0x34, 597d5517017SDavid Wu .bit = 4, 598d5517017SDavid Wu .mask = 0xf 599d5517017SDavid Wu }, { 600d5517017SDavid Wu .num = 1, 601d5517017SDavid Wu .pin = 23, 602d5517017SDavid Wu .reg = 0x34, 603d5517017SDavid Wu .bit = 8, 604d5517017SDavid Wu .mask = 0xf 605d5517017SDavid Wu }, { 606d5517017SDavid Wu .num = 3, 607752032c9SDavid.Wu .pin = 12, 608752032c9SDavid.Wu .reg = 0x68, 609752032c9SDavid.Wu .bit = 8, 610752032c9SDavid.Wu .mask = 0xf 611752032c9SDavid.Wu }, { 612752032c9SDavid.Wu .num = 3, 613d5517017SDavid Wu .pin = 13, 614d5517017SDavid Wu .reg = 0x68, 615d5517017SDavid Wu .bit = 12, 616d5517017SDavid Wu .mask = 0xf 617d5517017SDavid Wu }, { 618d5517017SDavid Wu .num = 2, 619d5517017SDavid Wu .pin = 2, 620d5517017SDavid Wu .reg = 0x608, 621d5517017SDavid Wu .bit = 0, 622d5517017SDavid Wu .mask = 0x7 623d5517017SDavid Wu }, { 624d5517017SDavid Wu .num = 2, 625d5517017SDavid Wu .pin = 3, 626d5517017SDavid Wu .reg = 0x608, 627d5517017SDavid Wu .bit = 4, 628d5517017SDavid Wu .mask = 0x7 629d5517017SDavid Wu }, { 630d5517017SDavid Wu .num = 2, 631d5517017SDavid Wu .pin = 16, 632d5517017SDavid Wu .reg = 0x610, 633d5517017SDavid Wu .bit = 8, 634d5517017SDavid Wu .mask = 0x7 635d5517017SDavid Wu }, { 636d5517017SDavid Wu .num = 3, 637d5517017SDavid Wu .pin = 10, 638d5517017SDavid Wu .reg = 0x610, 639d5517017SDavid Wu .bit = 0, 640d5517017SDavid Wu .mask = 0x7 641d5517017SDavid Wu }, { 642d5517017SDavid Wu .num = 3, 643d5517017SDavid Wu .pin = 11, 644d5517017SDavid Wu .reg = 0x610, 645d5517017SDavid Wu .bit = 4, 646d5517017SDavid Wu .mask = 0x7 647d5517017SDavid Wu }, 648d5517017SDavid Wu }; 649d5517017SDavid Wu 65049c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = { 65149c55878SDavid Wu { 65249c55878SDavid Wu .num = 2, 65349c55878SDavid Wu .pin = 12, 65449c55878SDavid Wu .reg = 0x24, 65549c55878SDavid Wu .bit = 8, 65649c55878SDavid Wu .mask = 0x3 65749c55878SDavid Wu }, { 65849c55878SDavid Wu .num = 2, 65949c55878SDavid Wu .pin = 15, 66049c55878SDavid Wu .reg = 0x28, 66149c55878SDavid Wu .bit = 0, 66249c55878SDavid Wu .mask = 0x7 66349c55878SDavid Wu }, { 66449c55878SDavid Wu .num = 2, 66549c55878SDavid Wu .pin = 23, 66649c55878SDavid Wu .reg = 0x30, 66749c55878SDavid Wu .bit = 14, 66849c55878SDavid Wu .mask = 0x3 66949c55878SDavid Wu }, 67049c55878SDavid Wu }; 67149c55878SDavid Wu 67249c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, 67349c55878SDavid Wu int *reg, u8 *bit, int *mask) 67449c55878SDavid Wu { 67549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 67649c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 67749c55878SDavid Wu struct rockchip_mux_recalced_data *data; 67849c55878SDavid Wu int i; 67949c55878SDavid Wu 68049c55878SDavid Wu for (i = 0; i < ctrl->niomux_recalced; i++) { 68149c55878SDavid Wu data = &ctrl->iomux_recalced[i]; 68249c55878SDavid Wu if (data->num == bank->bank_num && 68349c55878SDavid Wu data->pin == pin) 68449c55878SDavid Wu break; 68549c55878SDavid Wu } 68649c55878SDavid Wu 68749c55878SDavid Wu if (i >= ctrl->niomux_recalced) 68849c55878SDavid Wu return; 68949c55878SDavid Wu 69049c55878SDavid Wu *reg = data->reg; 69149c55878SDavid Wu *mask = data->mask; 69249c55878SDavid Wu *bit = data->bit; 69349c55878SDavid Wu } 69449c55878SDavid Wu 69549c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = { 69649c55878SDavid Wu { 69749c55878SDavid Wu /* cif-d2m0 */ 69849c55878SDavid Wu .bank_num = 2, 69949c55878SDavid Wu .pin = 0, 70049c55878SDavid Wu .func = 1, 70149c55878SDavid Wu .route_offset = 0x184, 70249c55878SDavid Wu .route_val = BIT(16 + 7), 70349c55878SDavid Wu }, { 70449c55878SDavid Wu /* cif-d2m1 */ 70549c55878SDavid Wu .bank_num = 3, 70649c55878SDavid Wu .pin = 3, 70749c55878SDavid Wu .func = 3, 70849c55878SDavid Wu .route_offset = 0x184, 70949c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 71049c55878SDavid Wu }, { 71149c55878SDavid Wu /* pdm-m0 */ 71249c55878SDavid Wu .bank_num = 3, 71349c55878SDavid Wu .pin = 22, 71449c55878SDavid Wu .func = 2, 71549c55878SDavid Wu .route_offset = 0x184, 71649c55878SDavid Wu .route_val = BIT(16 + 8), 71749c55878SDavid Wu }, { 71849c55878SDavid Wu /* pdm-m1 */ 71949c55878SDavid Wu .bank_num = 2, 72049c55878SDavid Wu .pin = 22, 72149c55878SDavid Wu .func = 1, 72249c55878SDavid Wu .route_offset = 0x184, 72349c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 72449c55878SDavid Wu }, { 72549c55878SDavid Wu /* uart2-rxm0 */ 72649c55878SDavid Wu .bank_num = 1, 727793770dfSDavid Wu .pin = 27, 72849c55878SDavid Wu .func = 2, 72949c55878SDavid Wu .route_offset = 0x184, 730793770dfSDavid Wu .route_val = BIT(16 + 10), 73149c55878SDavid Wu }, { 73249c55878SDavid Wu /* uart2-rxm1 */ 73349c55878SDavid Wu .bank_num = 2, 73449c55878SDavid Wu .pin = 14, 73549c55878SDavid Wu .func = 2, 73649c55878SDavid Wu .route_offset = 0x184, 737793770dfSDavid Wu .route_val = BIT(16 + 10) | BIT(10), 73849c55878SDavid Wu }, { 73949c55878SDavid Wu /* uart3-rxm0 */ 74049c55878SDavid Wu .bank_num = 0, 74149c55878SDavid Wu .pin = 17, 74249c55878SDavid Wu .func = 2, 74349c55878SDavid Wu .route_offset = 0x184, 744793770dfSDavid Wu .route_val = BIT(16 + 9), 74549c55878SDavid Wu }, { 74649c55878SDavid Wu /* uart3-rxm1 */ 74749c55878SDavid Wu .bank_num = 1, 748793770dfSDavid Wu .pin = 15, 74949c55878SDavid Wu .func = 2, 75049c55878SDavid Wu .route_offset = 0x184, 751793770dfSDavid Wu .route_val = BIT(16 + 9) | BIT(9), 75249c55878SDavid Wu }, 75349c55878SDavid Wu }; 75449c55878SDavid Wu 755a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = { 756a2a3fc8fSJianqun Xu { 757a2a3fc8fSJianqun Xu /* i2c2m0_sda */ 758a2a3fc8fSJianqun Xu .bank_num = 3, 759a2a3fc8fSJianqun Xu .pin = 12, 760a2a3fc8fSJianqun Xu .func = 2, 761a2a3fc8fSJianqun Xu .route_offset = 0x190, 762a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3), 763a2a3fc8fSJianqun Xu }, { 764a2a3fc8fSJianqun Xu /* i2c2m1_sda */ 765a2a3fc8fSJianqun Xu .bank_num = 1, 766a2a3fc8fSJianqun Xu .pin = 13, 767a2a3fc8fSJianqun Xu .func = 2, 768a2a3fc8fSJianqun Xu .route_offset = 0x190, 769a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3) | BIT(3), 770a2a3fc8fSJianqun Xu }, { 771a2a3fc8fSJianqun Xu /* uart2_rxm0 */ 772a2a3fc8fSJianqun Xu .bank_num = 4, 773a2a3fc8fSJianqun Xu .pin = 3, 774a2a3fc8fSJianqun Xu .func = 2, 775a2a3fc8fSJianqun Xu .route_offset = 0x190, 776a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15), 777a2a3fc8fSJianqun Xu }, { 778a2a3fc8fSJianqun Xu /* uart2_rxm1 */ 779a2a3fc8fSJianqun Xu .bank_num = 2, 780a2a3fc8fSJianqun Xu .pin = 25, 781a2a3fc8fSJianqun Xu .func = 2, 782a2a3fc8fSJianqun Xu .route_offset = 0x190, 783a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15), 784a2a3fc8fSJianqun Xu }, { 785a2a3fc8fSJianqun Xu /* uart2_rxm2 */ 786a2a3fc8fSJianqun Xu .bank_num = 3, 787a2a3fc8fSJianqun Xu .pin = 4, 788a2a3fc8fSJianqun Xu .func = 2, 789a2a3fc8fSJianqun Xu .route_offset = 0x190, 790a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15), 791a2a3fc8fSJianqun Xu }, 792a2a3fc8fSJianqun Xu }; 793a2a3fc8fSJianqun Xu 79449c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = { 79549c55878SDavid Wu { 79649c55878SDavid Wu /* spi-0 */ 79749c55878SDavid Wu .bank_num = 1, 79849c55878SDavid Wu .pin = 10, 79949c55878SDavid Wu .func = 1, 80049c55878SDavid Wu .route_offset = 0x144, 80149c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4), 80249c55878SDavid Wu }, { 80349c55878SDavid Wu /* spi-1 */ 80449c55878SDavid Wu .bank_num = 1, 80549c55878SDavid Wu .pin = 27, 80649c55878SDavid Wu .func = 3, 80749c55878SDavid Wu .route_offset = 0x144, 80849c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3), 80949c55878SDavid Wu }, { 81049c55878SDavid Wu /* spi-2 */ 81149c55878SDavid Wu .bank_num = 0, 81249c55878SDavid Wu .pin = 13, 81349c55878SDavid Wu .func = 2, 81449c55878SDavid Wu .route_offset = 0x144, 81549c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4), 81649c55878SDavid Wu }, { 81749c55878SDavid Wu /* i2s-0 */ 81849c55878SDavid Wu .bank_num = 1, 81949c55878SDavid Wu .pin = 5, 82049c55878SDavid Wu .func = 1, 82149c55878SDavid Wu .route_offset = 0x144, 82249c55878SDavid Wu .route_val = BIT(16 + 5), 82349c55878SDavid Wu }, { 82449c55878SDavid Wu /* i2s-1 */ 82549c55878SDavid Wu .bank_num = 0, 82649c55878SDavid Wu .pin = 14, 82749c55878SDavid Wu .func = 1, 82849c55878SDavid Wu .route_offset = 0x144, 82949c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 83049c55878SDavid Wu }, { 83149c55878SDavid Wu /* emmc-0 */ 83249c55878SDavid Wu .bank_num = 1, 83349c55878SDavid Wu .pin = 22, 83449c55878SDavid Wu .func = 2, 83549c55878SDavid Wu .route_offset = 0x144, 83649c55878SDavid Wu .route_val = BIT(16 + 6), 83749c55878SDavid Wu }, { 83849c55878SDavid Wu /* emmc-1 */ 83949c55878SDavid Wu .bank_num = 2, 84049c55878SDavid Wu .pin = 4, 84149c55878SDavid Wu .func = 2, 84249c55878SDavid Wu .route_offset = 0x144, 84349c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 84449c55878SDavid Wu }, 84549c55878SDavid Wu }; 84649c55878SDavid Wu 84749c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = { 84849c55878SDavid Wu { 84949c55878SDavid Wu /* pwm0-0 */ 85049c55878SDavid Wu .bank_num = 0, 85149c55878SDavid Wu .pin = 26, 85249c55878SDavid Wu .func = 1, 85349c55878SDavid Wu .route_offset = 0x50, 85449c55878SDavid Wu .route_val = BIT(16), 85549c55878SDavid Wu }, { 85649c55878SDavid Wu /* pwm0-1 */ 85749c55878SDavid Wu .bank_num = 3, 85849c55878SDavid Wu .pin = 21, 85949c55878SDavid Wu .func = 1, 86049c55878SDavid Wu .route_offset = 0x50, 86149c55878SDavid Wu .route_val = BIT(16) | BIT(0), 86249c55878SDavid Wu }, { 86349c55878SDavid Wu /* pwm1-0 */ 86449c55878SDavid Wu .bank_num = 0, 86549c55878SDavid Wu .pin = 27, 86649c55878SDavid Wu .func = 1, 86749c55878SDavid Wu .route_offset = 0x50, 86849c55878SDavid Wu .route_val = BIT(16 + 1), 86949c55878SDavid Wu }, { 87049c55878SDavid Wu /* pwm1-1 */ 87149c55878SDavid Wu .bank_num = 0, 87249c55878SDavid Wu .pin = 30, 87349c55878SDavid Wu .func = 2, 87449c55878SDavid Wu .route_offset = 0x50, 87549c55878SDavid Wu .route_val = BIT(16 + 1) | BIT(1), 87649c55878SDavid Wu }, { 87749c55878SDavid Wu /* pwm2-0 */ 87849c55878SDavid Wu .bank_num = 0, 87949c55878SDavid Wu .pin = 28, 88049c55878SDavid Wu .func = 1, 88149c55878SDavid Wu .route_offset = 0x50, 88249c55878SDavid Wu .route_val = BIT(16 + 2), 88349c55878SDavid Wu }, { 88449c55878SDavid Wu /* pwm2-1 */ 88549c55878SDavid Wu .bank_num = 1, 88649c55878SDavid Wu .pin = 12, 88749c55878SDavid Wu .func = 2, 88849c55878SDavid Wu .route_offset = 0x50, 88949c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 89049c55878SDavid Wu }, { 89149c55878SDavid Wu /* pwm3-0 */ 89249c55878SDavid Wu .bank_num = 3, 89349c55878SDavid Wu .pin = 26, 89449c55878SDavid Wu .func = 1, 89549c55878SDavid Wu .route_offset = 0x50, 89649c55878SDavid Wu .route_val = BIT(16 + 3), 89749c55878SDavid Wu }, { 89849c55878SDavid Wu /* pwm3-1 */ 89949c55878SDavid Wu .bank_num = 1, 90049c55878SDavid Wu .pin = 11, 90149c55878SDavid Wu .func = 2, 90249c55878SDavid Wu .route_offset = 0x50, 90349c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 90449c55878SDavid Wu }, { 90549c55878SDavid Wu /* sdio-0_d0 */ 90649c55878SDavid Wu .bank_num = 1, 90749c55878SDavid Wu .pin = 1, 90849c55878SDavid Wu .func = 1, 90949c55878SDavid Wu .route_offset = 0x50, 91049c55878SDavid Wu .route_val = BIT(16 + 4), 91149c55878SDavid Wu }, { 91249c55878SDavid Wu /* sdio-1_d0 */ 91349c55878SDavid Wu .bank_num = 3, 91449c55878SDavid Wu .pin = 2, 91549c55878SDavid Wu .func = 1, 91649c55878SDavid Wu .route_offset = 0x50, 91749c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 91849c55878SDavid Wu }, { 91949c55878SDavid Wu /* spi-0_rx */ 92049c55878SDavid Wu .bank_num = 0, 92149c55878SDavid Wu .pin = 13, 92249c55878SDavid Wu .func = 2, 92349c55878SDavid Wu .route_offset = 0x50, 92449c55878SDavid Wu .route_val = BIT(16 + 5), 92549c55878SDavid Wu }, { 92649c55878SDavid Wu /* spi-1_rx */ 92749c55878SDavid Wu .bank_num = 2, 92849c55878SDavid Wu .pin = 0, 92949c55878SDavid Wu .func = 2, 93049c55878SDavid Wu .route_offset = 0x50, 93149c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 93249c55878SDavid Wu }, { 93349c55878SDavid Wu /* emmc-0_cmd */ 93449c55878SDavid Wu .bank_num = 1, 93549c55878SDavid Wu .pin = 22, 93649c55878SDavid Wu .func = 2, 93749c55878SDavid Wu .route_offset = 0x50, 93849c55878SDavid Wu .route_val = BIT(16 + 7), 93949c55878SDavid Wu }, { 94049c55878SDavid Wu /* emmc-1_cmd */ 94149c55878SDavid Wu .bank_num = 2, 94249c55878SDavid Wu .pin = 4, 94349c55878SDavid Wu .func = 2, 94449c55878SDavid Wu .route_offset = 0x50, 94549c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 94649c55878SDavid Wu }, { 94749c55878SDavid Wu /* uart2-0_rx */ 94849c55878SDavid Wu .bank_num = 1, 94949c55878SDavid Wu .pin = 19, 95049c55878SDavid Wu .func = 2, 95149c55878SDavid Wu .route_offset = 0x50, 95249c55878SDavid Wu .route_val = BIT(16 + 8), 95349c55878SDavid Wu }, { 95449c55878SDavid Wu /* uart2-1_rx */ 95549c55878SDavid Wu .bank_num = 1, 95649c55878SDavid Wu .pin = 10, 95749c55878SDavid Wu .func = 2, 95849c55878SDavid Wu .route_offset = 0x50, 95949c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 96049c55878SDavid Wu }, { 96149c55878SDavid Wu /* uart1-0_rx */ 96249c55878SDavid Wu .bank_num = 1, 96349c55878SDavid Wu .pin = 10, 96449c55878SDavid Wu .func = 1, 96549c55878SDavid Wu .route_offset = 0x50, 96649c55878SDavid Wu .route_val = BIT(16 + 11), 96749c55878SDavid Wu }, { 96849c55878SDavid Wu /* uart1-1_rx */ 96949c55878SDavid Wu .bank_num = 3, 97049c55878SDavid Wu .pin = 13, 97149c55878SDavid Wu .func = 1, 97249c55878SDavid Wu .route_offset = 0x50, 97349c55878SDavid Wu .route_val = BIT(16 + 11) | BIT(11), 97449c55878SDavid Wu }, 97549c55878SDavid Wu }; 97649c55878SDavid Wu 97749c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = { 97849c55878SDavid Wu { 97949c55878SDavid Wu /* edphdmi_cecinoutt1 */ 98049c55878SDavid Wu .bank_num = 7, 98149c55878SDavid Wu .pin = 16, 98249c55878SDavid Wu .func = 2, 98349c55878SDavid Wu .route_offset = 0x264, 98449c55878SDavid Wu .route_val = BIT(16 + 12) | BIT(12), 98549c55878SDavid Wu }, { 98649c55878SDavid Wu /* edphdmi_cecinout */ 98749c55878SDavid Wu .bank_num = 7, 98849c55878SDavid Wu .pin = 23, 98949c55878SDavid Wu .func = 4, 99049c55878SDavid Wu .route_offset = 0x264, 99149c55878SDavid Wu .route_val = BIT(16 + 12), 99249c55878SDavid Wu }, 99349c55878SDavid Wu }; 99449c55878SDavid Wu 995b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = { 996b3077611SDavid Wu { 997d5517017SDavid Wu /* rtc_clk */ 998d5517017SDavid Wu .bank_num = 0, 999d5517017SDavid Wu .pin = 19, 1000d5517017SDavid Wu .func = 1, 1001d5517017SDavid Wu .route_offset = 0x314, 1002d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1003d5517017SDavid Wu }, { 1004b3077611SDavid Wu /* uart2_rxm0 */ 1005b3077611SDavid Wu .bank_num = 1, 1006b3077611SDavid Wu .pin = 22, 1007b3077611SDavid Wu .func = 2, 1008b3077611SDavid Wu .route_offset = 0x314, 1009b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1010b3077611SDavid Wu }, { 1011b3077611SDavid Wu /* uart2_rxm1 */ 1012b3077611SDavid Wu .bank_num = 4, 1013b3077611SDavid Wu .pin = 26, 1014b3077611SDavid Wu .func = 2, 1015b3077611SDavid Wu .route_offset = 0x314, 1016b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1017b3077611SDavid Wu }, { 1018b3077611SDavid Wu /* i2c3_sdam0 */ 1019b3077611SDavid Wu .bank_num = 0, 1020b3077611SDavid Wu .pin = 23, 1021b3077611SDavid Wu .func = 2, 1022b3077611SDavid Wu .route_offset = 0x314, 1023b3077611SDavid Wu .route_val = BIT(16 + 4), 1024b3077611SDavid Wu }, { 1025b3077611SDavid Wu /* i2c3_sdam1 */ 1026b3077611SDavid Wu .bank_num = 3, 1027b3077611SDavid Wu .pin = 12, 1028b3077611SDavid Wu .func = 2, 1029b3077611SDavid Wu .route_offset = 0x314, 1030b3077611SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 1031d5517017SDavid Wu }, { 1032d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1033d5517017SDavid Wu .bank_num = 1, 1034d5517017SDavid Wu .pin = 3, 1035d5517017SDavid Wu .func = 2, 1036d5517017SDavid Wu .route_offset = 0x308, 1037d5517017SDavid Wu .route_val = BIT(16 + 3), 1038d5517017SDavid Wu }, { 1039d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1040d5517017SDavid Wu .bank_num = 1, 1041d5517017SDavid Wu .pin = 4, 1042d5517017SDavid Wu .func = 2, 1043d5517017SDavid Wu .route_offset = 0x308, 1044d5517017SDavid Wu .route_val = BIT(16 + 3), 1045d5517017SDavid Wu }, { 1046d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1047d5517017SDavid Wu .bank_num = 1, 1048d5517017SDavid Wu .pin = 13, 1049d5517017SDavid Wu .func = 2, 1050d5517017SDavid Wu .route_offset = 0x308, 1051d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1052d5517017SDavid Wu }, { 1053d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1054d5517017SDavid Wu .bank_num = 1, 1055d5517017SDavid Wu .pin = 14, 1056d5517017SDavid Wu .func = 2, 1057d5517017SDavid Wu .route_offset = 0x308, 1058d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1059d5517017SDavid Wu }, { 1060d5517017SDavid Wu /* pdm-clkm0 */ 1061d5517017SDavid Wu .bank_num = 1, 1062d5517017SDavid Wu .pin = 4, 1063d5517017SDavid Wu .func = 3, 1064d5517017SDavid Wu .route_offset = 0x308, 1065d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1066d5517017SDavid Wu }, { 1067d5517017SDavid Wu /* pdm-clkm1 */ 1068d5517017SDavid Wu .bank_num = 1, 1069d5517017SDavid Wu .pin = 14, 1070d5517017SDavid Wu .func = 4, 1071d5517017SDavid Wu .route_offset = 0x308, 1072d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1073d5517017SDavid Wu }, { 1074d5517017SDavid Wu /* pdm-clkm2 */ 1075d5517017SDavid Wu .bank_num = 2, 1076d5517017SDavid Wu .pin = 6, 1077d5517017SDavid Wu .func = 2, 1078d5517017SDavid Wu .route_offset = 0x308, 1079d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1080d5517017SDavid Wu }, { 1081d5517017SDavid Wu /* pdm-clkm-m2 */ 1082d5517017SDavid Wu .bank_num = 2, 1083d5517017SDavid Wu .pin = 4, 1084d5517017SDavid Wu .func = 3, 1085d5517017SDavid Wu .route_offset = 0x600, 1086d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1087d5517017SDavid Wu }, 1088d5517017SDavid Wu }; 1089d5517017SDavid Wu 1090d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = { 1091d5517017SDavid Wu { 1092d5517017SDavid Wu /* rtc_clk */ 1093d5517017SDavid Wu .bank_num = 0, 1094d5517017SDavid Wu .pin = 19, 1095d5517017SDavid Wu .func = 1, 1096d5517017SDavid Wu .route_offset = 0x314, 1097d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1098d5517017SDavid Wu }, { 1099d5517017SDavid Wu /* uart2_rxm0 */ 1100d5517017SDavid Wu .bank_num = 1, 1101d5517017SDavid Wu .pin = 22, 1102d5517017SDavid Wu .func = 2, 1103d5517017SDavid Wu .route_offset = 0x314, 1104d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1105d5517017SDavid Wu }, { 1106d5517017SDavid Wu /* uart2_rxm1 */ 1107d5517017SDavid Wu .bank_num = 4, 1108d5517017SDavid Wu .pin = 26, 1109d5517017SDavid Wu .func = 2, 1110d5517017SDavid Wu .route_offset = 0x314, 1111d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1112d5517017SDavid Wu }, { 1113d5517017SDavid Wu /* i2c3_sdam0 */ 1114d5517017SDavid Wu .bank_num = 0, 1115d5517017SDavid Wu .pin = 15, 1116d5517017SDavid Wu .func = 2, 1117d5517017SDavid Wu .route_offset = 0x608, 1118d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9), 1119d5517017SDavid Wu }, { 1120d5517017SDavid Wu /* i2c3_sdam1 */ 1121d5517017SDavid Wu .bank_num = 3, 1122d5517017SDavid Wu .pin = 12, 1123d5517017SDavid Wu .func = 2, 1124d5517017SDavid Wu .route_offset = 0x608, 1125d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8), 1126d5517017SDavid Wu }, { 1127d5517017SDavid Wu /* i2c3_sdam2 */ 1128d5517017SDavid Wu .bank_num = 2, 1129d5517017SDavid Wu .pin = 0, 1130d5517017SDavid Wu .func = 3, 1131d5517017SDavid Wu .route_offset = 0x608, 1132d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9), 1133d5517017SDavid Wu }, { 1134d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1135d5517017SDavid Wu .bank_num = 1, 1136d5517017SDavid Wu .pin = 3, 1137d5517017SDavid Wu .func = 2, 1138d5517017SDavid Wu .route_offset = 0x308, 1139d5517017SDavid Wu .route_val = BIT(16 + 3), 1140d5517017SDavid Wu }, { 1141d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1142d5517017SDavid Wu .bank_num = 1, 1143d5517017SDavid Wu .pin = 4, 1144d5517017SDavid Wu .func = 2, 1145d5517017SDavid Wu .route_offset = 0x308, 1146d5517017SDavid Wu .route_val = BIT(16 + 3), 1147d5517017SDavid Wu }, { 1148d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1149d5517017SDavid Wu .bank_num = 1, 1150d5517017SDavid Wu .pin = 13, 1151d5517017SDavid Wu .func = 2, 1152d5517017SDavid Wu .route_offset = 0x308, 1153d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1154d5517017SDavid Wu }, { 1155d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1156d5517017SDavid Wu .bank_num = 1, 1157d5517017SDavid Wu .pin = 14, 1158d5517017SDavid Wu .func = 2, 1159d5517017SDavid Wu .route_offset = 0x308, 1160d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1161d5517017SDavid Wu }, { 1162d5517017SDavid Wu /* pdm-clkm0 */ 1163d5517017SDavid Wu .bank_num = 1, 1164d5517017SDavid Wu .pin = 4, 1165d5517017SDavid Wu .func = 3, 1166d5517017SDavid Wu .route_offset = 0x308, 1167d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1168d5517017SDavid Wu }, { 1169d5517017SDavid Wu /* pdm-clkm1 */ 1170d5517017SDavid Wu .bank_num = 1, 1171d5517017SDavid Wu .pin = 14, 1172d5517017SDavid Wu .func = 4, 1173d5517017SDavid Wu .route_offset = 0x308, 1174d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1175d5517017SDavid Wu }, { 1176d5517017SDavid Wu /* pdm-clkm2 */ 1177d5517017SDavid Wu .bank_num = 2, 1178d5517017SDavid Wu .pin = 6, 1179d5517017SDavid Wu .func = 2, 1180d5517017SDavid Wu .route_offset = 0x308, 1181d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1182d5517017SDavid Wu }, { 1183d5517017SDavid Wu /* pdm-clkm-m2 */ 1184d5517017SDavid Wu .bank_num = 2, 1185d5517017SDavid Wu .pin = 4, 1186d5517017SDavid Wu .func = 3, 1187d5517017SDavid Wu .route_offset = 0x600, 1188d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1189d5517017SDavid Wu }, { 1190d5517017SDavid Wu /* spi1_miso */ 1191d5517017SDavid Wu .bank_num = 3, 1192d5517017SDavid Wu .pin = 10, 1193d5517017SDavid Wu .func = 3, 1194d5517017SDavid Wu .route_offset = 0x314, 1195d5517017SDavid Wu .route_val = BIT(16 + 9), 1196d5517017SDavid Wu }, { 1197d5517017SDavid Wu /* spi1_miso_m1 */ 1198d5517017SDavid Wu .bank_num = 2, 1199d5517017SDavid Wu .pin = 4, 1200d5517017SDavid Wu .func = 2, 1201d5517017SDavid Wu .route_offset = 0x314, 1202d5517017SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 1203d5517017SDavid Wu }, { 1204d5517017SDavid Wu /* owire_m0 */ 1205d5517017SDavid Wu .bank_num = 0, 1206d5517017SDavid Wu .pin = 11, 1207d5517017SDavid Wu .func = 3, 1208d5517017SDavid Wu .route_offset = 0x314, 1209d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 1210d5517017SDavid Wu }, { 1211d5517017SDavid Wu /* owire_m1 */ 1212d5517017SDavid Wu .bank_num = 1, 1213d5517017SDavid Wu .pin = 22, 1214d5517017SDavid Wu .func = 7, 1215d5517017SDavid Wu .route_offset = 0x314, 1216d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 1217d5517017SDavid Wu }, { 1218d5517017SDavid Wu /* owire_m2 */ 1219d5517017SDavid Wu .bank_num = 2, 1220d5517017SDavid Wu .pin = 2, 1221d5517017SDavid Wu .func = 5, 1222d5517017SDavid Wu .route_offset = 0x314, 1223d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 1224d5517017SDavid Wu }, { 1225d5517017SDavid Wu /* can_rxd_m0 */ 1226d5517017SDavid Wu .bank_num = 0, 1227d5517017SDavid Wu .pin = 11, 1228d5517017SDavid Wu .func = 2, 1229d5517017SDavid Wu .route_offset = 0x314, 1230d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1231d5517017SDavid Wu }, { 1232d5517017SDavid Wu /* can_rxd_m1 */ 1233d5517017SDavid Wu .bank_num = 1, 1234d5517017SDavid Wu .pin = 22, 1235d5517017SDavid Wu .func = 5, 1236d5517017SDavid Wu .route_offset = 0x314, 1237d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1238d5517017SDavid Wu }, { 1239d5517017SDavid Wu /* can_rxd_m2 */ 1240d5517017SDavid Wu .bank_num = 2, 1241d5517017SDavid Wu .pin = 2, 1242d5517017SDavid Wu .func = 4, 1243d5517017SDavid Wu .route_offset = 0x314, 1244d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1245d5517017SDavid Wu }, { 1246d5517017SDavid Wu /* mac_rxd0_m0 */ 1247d5517017SDavid Wu .bank_num = 1, 1248d5517017SDavid Wu .pin = 20, 1249d5517017SDavid Wu .func = 3, 1250d5517017SDavid Wu .route_offset = 0x314, 1251d5517017SDavid Wu .route_val = BIT(16 + 14), 1252d5517017SDavid Wu }, { 1253d5517017SDavid Wu /* mac_rxd0_m1 */ 1254d5517017SDavid Wu .bank_num = 4, 1255d5517017SDavid Wu .pin = 2, 1256d5517017SDavid Wu .func = 2, 1257d5517017SDavid Wu .route_offset = 0x314, 1258d5517017SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 1259d5517017SDavid Wu }, { 1260d5517017SDavid Wu /* uart3_rx */ 1261d5517017SDavid Wu .bank_num = 3, 1262d5517017SDavid Wu .pin = 12, 1263d5517017SDavid Wu .func = 4, 1264d5517017SDavid Wu .route_offset = 0x314, 1265d5517017SDavid Wu .route_val = BIT(16 + 15), 1266d5517017SDavid Wu }, { 1267d5517017SDavid Wu /* uart3_rx_m1 */ 1268d5517017SDavid Wu .bank_num = 0, 1269d5517017SDavid Wu .pin = 17, 1270d5517017SDavid Wu .func = 3, 1271d5517017SDavid Wu .route_offset = 0x314, 1272d5517017SDavid Wu .route_val = BIT(16 + 15) | BIT(15), 1273b3077611SDavid Wu }, 1274b3077611SDavid Wu }; 1275b3077611SDavid Wu 127649c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = { 127749c55878SDavid Wu { 127849c55878SDavid Wu /* uart2dbg_rxm0 */ 127949c55878SDavid Wu .bank_num = 1, 128049c55878SDavid Wu .pin = 1, 128149c55878SDavid Wu .func = 2, 128249c55878SDavid Wu .route_offset = 0x50, 128349c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1), 128449c55878SDavid Wu }, { 128549c55878SDavid Wu /* uart2dbg_rxm1 */ 128649c55878SDavid Wu .bank_num = 2, 128749c55878SDavid Wu .pin = 1, 128849c55878SDavid Wu .func = 1, 128949c55878SDavid Wu .route_offset = 0x50, 129049c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1) | BIT(0), 129149c55878SDavid Wu }, { 129249c55878SDavid Wu /* gmac-m1_rxd0 */ 129349c55878SDavid Wu .bank_num = 1, 129449c55878SDavid Wu .pin = 11, 129549c55878SDavid Wu .func = 2, 129649c55878SDavid Wu .route_offset = 0x50, 129749c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 129849c55878SDavid Wu }, { 129949c55878SDavid Wu /* gmac-m1-optimized_rxd3 */ 130049c55878SDavid Wu .bank_num = 1, 130149c55878SDavid Wu .pin = 14, 130249c55878SDavid Wu .func = 2, 130349c55878SDavid Wu .route_offset = 0x50, 130449c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(10), 130549c55878SDavid Wu }, { 130649c55878SDavid Wu /* pdm_sdi0m0 */ 130749c55878SDavid Wu .bank_num = 2, 130849c55878SDavid Wu .pin = 19, 130949c55878SDavid Wu .func = 2, 131049c55878SDavid Wu .route_offset = 0x50, 131149c55878SDavid Wu .route_val = BIT(16 + 3), 131249c55878SDavid Wu }, { 131349c55878SDavid Wu /* pdm_sdi0m1 */ 131449c55878SDavid Wu .bank_num = 1, 131549c55878SDavid Wu .pin = 23, 131649c55878SDavid Wu .func = 3, 131749c55878SDavid Wu .route_offset = 0x50, 131849c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 131949c55878SDavid Wu }, { 132049c55878SDavid Wu /* spi_rxdm2 */ 132149c55878SDavid Wu .bank_num = 3, 132249c55878SDavid Wu .pin = 2, 132349c55878SDavid Wu .func = 4, 132449c55878SDavid Wu .route_offset = 0x50, 132549c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5), 132649c55878SDavid Wu }, { 132749c55878SDavid Wu /* i2s2_sdim0 */ 132849c55878SDavid Wu .bank_num = 1, 132949c55878SDavid Wu .pin = 24, 133049c55878SDavid Wu .func = 1, 133149c55878SDavid Wu .route_offset = 0x50, 133249c55878SDavid Wu .route_val = BIT(16 + 6), 133349c55878SDavid Wu }, { 133449c55878SDavid Wu /* i2s2_sdim1 */ 133549c55878SDavid Wu .bank_num = 3, 133649c55878SDavid Wu .pin = 2, 133749c55878SDavid Wu .func = 6, 133849c55878SDavid Wu .route_offset = 0x50, 133949c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 134049c55878SDavid Wu }, { 134149c55878SDavid Wu /* card_iom1 */ 134249c55878SDavid Wu .bank_num = 2, 134349c55878SDavid Wu .pin = 22, 134449c55878SDavid Wu .func = 3, 134549c55878SDavid Wu .route_offset = 0x50, 134649c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 134749c55878SDavid Wu }, { 134849c55878SDavid Wu /* tsp_d5m1 */ 134949c55878SDavid Wu .bank_num = 2, 135049c55878SDavid Wu .pin = 16, 135149c55878SDavid Wu .func = 3, 135249c55878SDavid Wu .route_offset = 0x50, 135349c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 135449c55878SDavid Wu }, { 135549c55878SDavid Wu /* cif_data5m1 */ 135649c55878SDavid Wu .bank_num = 2, 135749c55878SDavid Wu .pin = 16, 135849c55878SDavid Wu .func = 4, 135949c55878SDavid Wu .route_offset = 0x50, 136049c55878SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 136149c55878SDavid Wu }, 136249c55878SDavid Wu }; 136349c55878SDavid Wu 136449c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = { 136549c55878SDavid Wu { 136649c55878SDavid Wu /* uart2dbga_rx */ 136749c55878SDavid Wu .bank_num = 4, 136849c55878SDavid Wu .pin = 8, 136949c55878SDavid Wu .func = 2, 137049c55878SDavid Wu .route_offset = 0xe21c, 137149c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 137249c55878SDavid Wu }, { 137349c55878SDavid Wu /* uart2dbgb_rx */ 137449c55878SDavid Wu .bank_num = 4, 137549c55878SDavid Wu .pin = 16, 137649c55878SDavid Wu .func = 2, 137749c55878SDavid Wu .route_offset = 0xe21c, 137849c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 137949c55878SDavid Wu }, { 138049c55878SDavid Wu /* uart2dbgc_rx */ 138149c55878SDavid Wu .bank_num = 4, 138249c55878SDavid Wu .pin = 19, 138349c55878SDavid Wu .func = 1, 138449c55878SDavid Wu .route_offset = 0xe21c, 138549c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 138649c55878SDavid Wu }, { 138749c55878SDavid Wu /* pcie_clkreqn */ 138849c55878SDavid Wu .bank_num = 2, 138949c55878SDavid Wu .pin = 26, 139049c55878SDavid Wu .func = 2, 139149c55878SDavid Wu .route_offset = 0xe21c, 139249c55878SDavid Wu .route_val = BIT(16 + 14), 139349c55878SDavid Wu }, { 139449c55878SDavid Wu /* pcie_clkreqnb */ 139549c55878SDavid Wu .bank_num = 4, 139649c55878SDavid Wu .pin = 24, 139749c55878SDavid Wu .func = 1, 139849c55878SDavid Wu .route_offset = 0xe21c, 139949c55878SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 140049c55878SDavid Wu }, 140149c55878SDavid Wu }; 140249c55878SDavid Wu 140349c55878SDavid Wu static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, 140449c55878SDavid Wu int mux, u32 *reg, u32 *value) 140549c55878SDavid Wu { 140649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 140749c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 140849c55878SDavid Wu struct rockchip_mux_route_data *data; 140949c55878SDavid Wu int i; 141049c55878SDavid Wu 141149c55878SDavid Wu for (i = 0; i < ctrl->niomux_routes; i++) { 141249c55878SDavid Wu data = &ctrl->iomux_routes[i]; 141349c55878SDavid Wu if ((data->bank_num == bank->bank_num) && 141449c55878SDavid Wu (data->pin == pin) && (data->func == mux)) 141549c55878SDavid Wu break; 141649c55878SDavid Wu } 141749c55878SDavid Wu 141849c55878SDavid Wu if (i >= ctrl->niomux_routes) 141949c55878SDavid Wu return false; 142049c55878SDavid Wu 142149c55878SDavid Wu *reg = data->route_offset; 142249c55878SDavid Wu *value = data->route_val; 142349c55878SDavid Wu 142449c55878SDavid Wu return true; 142549c55878SDavid Wu } 142649c55878SDavid Wu 142749c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) 142849c55878SDavid Wu { 142949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 143049c55878SDavid Wu int iomux_num = (pin / 8); 143149c55878SDavid Wu struct regmap *regmap; 143249c55878SDavid Wu unsigned int val; 143349c55878SDavid Wu int reg, ret, mask, mux_type; 143449c55878SDavid Wu u8 bit; 143549c55878SDavid Wu 143649c55878SDavid Wu if (iomux_num > 3) 143749c55878SDavid Wu return -EINVAL; 143849c55878SDavid Wu 143949c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 144049c55878SDavid Wu debug("pin %d is unrouted\n", pin); 144149c55878SDavid Wu return -EINVAL; 144249c55878SDavid Wu } 144349c55878SDavid Wu 144449c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 144549c55878SDavid Wu return RK_FUNC_GPIO; 144649c55878SDavid Wu 1447*cf04a17bSJianqun Xu if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 1448*cf04a17bSJianqun Xu regmap = priv->regmap_pmu; 1449*cf04a17bSJianqun Xu else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) 1450*cf04a17bSJianqun Xu regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base; 1451*cf04a17bSJianqun Xu else 1452*cf04a17bSJianqun Xu regmap = priv->regmap_base; 145349c55878SDavid Wu 145449c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 145549c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 145649c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 145749c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 145849c55878SDavid Wu if ((pin % 8) >= 4) 145949c55878SDavid Wu reg += 0x4; 146049c55878SDavid Wu bit = (pin % 4) * 4; 146149c55878SDavid Wu mask = 0xf; 146249c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 146349c55878SDavid Wu if ((pin % 8) >= 5) 146449c55878SDavid Wu reg += 0x4; 146549c55878SDavid Wu bit = (pin % 8 % 5) * 3; 146649c55878SDavid Wu mask = 0x7; 146749c55878SDavid Wu } else { 146849c55878SDavid Wu bit = (pin % 8) * 2; 146949c55878SDavid Wu mask = 0x3; 147049c55878SDavid Wu } 147149c55878SDavid Wu 147249c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 147349c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 147449c55878SDavid Wu 147549c55878SDavid Wu ret = regmap_read(regmap, reg, &val); 147649c55878SDavid Wu if (ret) 147749c55878SDavid Wu return ret; 147849c55878SDavid Wu 147949c55878SDavid Wu return ((val >> bit) & mask); 148049c55878SDavid Wu } 148149c55878SDavid Wu 148249c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, 148349c55878SDavid Wu int index) 148449c55878SDavid Wu { struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 148549c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 148649c55878SDavid Wu 148749c55878SDavid Wu return rockchip_get_mux(&ctrl->pin_banks[banknum], index); 148849c55878SDavid Wu } 148949c55878SDavid Wu 149049c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank, 149149c55878SDavid Wu int pin, int mux) 149249c55878SDavid Wu { 149349c55878SDavid Wu int iomux_num = (pin / 8); 149449c55878SDavid Wu 149549c55878SDavid Wu if (iomux_num > 3) 149649c55878SDavid Wu return -EINVAL; 149749c55878SDavid Wu 149849c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 149949c55878SDavid Wu debug("pin %d is unrouted\n", pin); 150049c55878SDavid Wu return -EINVAL; 150149c55878SDavid Wu } 150249c55878SDavid Wu 150349c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 150449c55878SDavid Wu if (mux != IOMUX_GPIO_ONLY) { 150549c55878SDavid Wu debug("pin %d only supports a gpio mux\n", pin); 150649c55878SDavid Wu return -ENOTSUPP; 150749c55878SDavid Wu } 150849c55878SDavid Wu } 150949c55878SDavid Wu 151049c55878SDavid Wu return 0; 151149c55878SDavid Wu } 151249c55878SDavid Wu 151349c55878SDavid Wu /* 151449c55878SDavid Wu * Set a new mux function for a pin. 151549c55878SDavid Wu * 151649c55878SDavid Wu * The register is divided into the upper and lower 16 bit. When changing 151749c55878SDavid Wu * a value, the previous register value is not read and changed. Instead 151849c55878SDavid Wu * it seems the changed bits are marked in the upper 16 bit, while the 151949c55878SDavid Wu * changed value gets set in the same offset in the lower 16 bit. 152049c55878SDavid Wu * All pin settings seem to be 2 bit wide in both the upper and lower 152149c55878SDavid Wu * parts. 152249c55878SDavid Wu * @bank: pin bank to change 152349c55878SDavid Wu * @pin: pin to change 152449c55878SDavid Wu * @mux: new mux function to set 152549c55878SDavid Wu */ 152649c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) 152749c55878SDavid Wu { 152849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 152949c55878SDavid Wu int iomux_num = (pin / 8); 153049c55878SDavid Wu struct regmap *regmap; 153149c55878SDavid Wu int reg, ret, mask, mux_type; 153249c55878SDavid Wu u8 bit; 153349c55878SDavid Wu u32 data, route_reg, route_val; 153449c55878SDavid Wu 153549c55878SDavid Wu ret = rockchip_verify_mux(bank, pin, mux); 153649c55878SDavid Wu if (ret < 0) 153749c55878SDavid Wu return ret; 153849c55878SDavid Wu 153949c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 154049c55878SDavid Wu return 0; 154149c55878SDavid Wu 154249c55878SDavid Wu debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); 154349c55878SDavid Wu 1544*cf04a17bSJianqun Xu if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 1545*cf04a17bSJianqun Xu regmap = priv->regmap_pmu; 1546*cf04a17bSJianqun Xu else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) 1547*cf04a17bSJianqun Xu regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base; 1548*cf04a17bSJianqun Xu else 1549*cf04a17bSJianqun Xu regmap = priv->regmap_base; 155049c55878SDavid Wu 155149c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 155249c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 155349c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 155449c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 155549c55878SDavid Wu if ((pin % 8) >= 4) 155649c55878SDavid Wu reg += 0x4; 155749c55878SDavid Wu bit = (pin % 4) * 4; 155849c55878SDavid Wu mask = 0xf; 155949c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 156049c55878SDavid Wu if ((pin % 8) >= 5) 156149c55878SDavid Wu reg += 0x4; 156249c55878SDavid Wu bit = (pin % 8 % 5) * 3; 156349c55878SDavid Wu mask = 0x7; 156449c55878SDavid Wu } else { 156549c55878SDavid Wu bit = (pin % 8) * 2; 156649c55878SDavid Wu mask = 0x3; 156749c55878SDavid Wu } 156849c55878SDavid Wu 156949c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 157049c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 157149c55878SDavid Wu 157249c55878SDavid Wu if (bank->route_mask & BIT(pin)) { 157349c55878SDavid Wu if (rockchip_get_mux_route(bank, pin, mux, &route_reg, 157449c55878SDavid Wu &route_val)) { 157549c55878SDavid Wu ret = regmap_write(regmap, route_reg, route_val); 157649c55878SDavid Wu if (ret) 157749c55878SDavid Wu return ret; 157849c55878SDavid Wu } 157949c55878SDavid Wu } 158049c55878SDavid Wu 15814bafc2daSDavid Wu if (mux_type & IOMUX_WRITABLE_32BIT) { 15828bf1bc66SDavid Wu regmap_read(regmap, reg, &data); 15834bafc2daSDavid Wu data &= ~(mask << bit); 15844bafc2daSDavid Wu } else { 158549c55878SDavid Wu data = (mask << (bit + 16)); 15864bafc2daSDavid Wu } 15878bf1bc66SDavid Wu 158849c55878SDavid Wu data |= (mux & mask) << bit; 158949c55878SDavid Wu ret = regmap_write(regmap, reg, data); 159049c55878SDavid Wu 159149c55878SDavid Wu return ret; 159249c55878SDavid Wu } 159349c55878SDavid Wu 159449c55878SDavid Wu #define PX30_PULL_PMU_OFFSET 0x10 159549c55878SDavid Wu #define PX30_PULL_GRF_OFFSET 0x60 159649c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN 2 159749c55878SDavid Wu #define PX30_PULL_PINS_PER_REG 8 159849c55878SDavid Wu #define PX30_PULL_BANK_STRIDE 16 159949c55878SDavid Wu 160049c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 160149c55878SDavid Wu int pin_num, struct regmap **regmap, 160249c55878SDavid Wu int *reg, u8 *bit) 160349c55878SDavid Wu { 160449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 160549c55878SDavid Wu 160649c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 160749c55878SDavid Wu if (bank->bank_num == 0) { 160849c55878SDavid Wu *regmap = priv->regmap_pmu; 160949c55878SDavid Wu *reg = PX30_PULL_PMU_OFFSET; 161049c55878SDavid Wu } else { 161149c55878SDavid Wu *regmap = priv->regmap_base; 161249c55878SDavid Wu *reg = PX30_PULL_GRF_OFFSET; 161349c55878SDavid Wu 161449c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 161549c55878SDavid Wu *reg -= 0x10; 161649c55878SDavid Wu *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; 161749c55878SDavid Wu } 161849c55878SDavid Wu 161949c55878SDavid Wu *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4); 162049c55878SDavid Wu *bit = (pin_num % PX30_PULL_PINS_PER_REG); 162149c55878SDavid Wu *bit *= PX30_PULL_BITS_PER_PIN; 162249c55878SDavid Wu } 162349c55878SDavid Wu 162449c55878SDavid Wu #define PX30_DRV_PMU_OFFSET 0x20 162549c55878SDavid Wu #define PX30_DRV_GRF_OFFSET 0xf0 162649c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN 2 162749c55878SDavid Wu #define PX30_DRV_PINS_PER_REG 8 162849c55878SDavid Wu #define PX30_DRV_BANK_STRIDE 16 162949c55878SDavid Wu 163049c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 163149c55878SDavid Wu int pin_num, struct regmap **regmap, 163249c55878SDavid Wu int *reg, u8 *bit) 163349c55878SDavid Wu { 163449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 163549c55878SDavid Wu 163649c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 163749c55878SDavid Wu if (bank->bank_num == 0) { 163849c55878SDavid Wu *regmap = priv->regmap_pmu; 163949c55878SDavid Wu *reg = PX30_DRV_PMU_OFFSET; 164049c55878SDavid Wu } else { 164149c55878SDavid Wu *regmap = priv->regmap_base; 164249c55878SDavid Wu *reg = PX30_DRV_GRF_OFFSET; 164349c55878SDavid Wu 164449c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 164549c55878SDavid Wu *reg -= 0x10; 164649c55878SDavid Wu *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; 164749c55878SDavid Wu } 164849c55878SDavid Wu 164949c55878SDavid Wu *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4); 165049c55878SDavid Wu *bit = (pin_num % PX30_DRV_PINS_PER_REG); 165149c55878SDavid Wu *bit *= PX30_DRV_BITS_PER_PIN; 165249c55878SDavid Wu } 165349c55878SDavid Wu 165449c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET 0x38 165549c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET 0xc0 165649c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG 16 165749c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE 16 165849c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG 8 165949c55878SDavid Wu 166049c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 166149c55878SDavid Wu int pin_num, 166249c55878SDavid Wu struct regmap **regmap, 166349c55878SDavid Wu int *reg, u8 *bit) 166449c55878SDavid Wu { 166549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 166649c55878SDavid Wu int pins_per_reg; 166749c55878SDavid Wu 166849c55878SDavid Wu if (bank->bank_num == 0) { 166949c55878SDavid Wu *regmap = priv->regmap_pmu; 167049c55878SDavid Wu *reg = PX30_SCHMITT_PMU_OFFSET; 167149c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 167249c55878SDavid Wu } else { 167349c55878SDavid Wu *regmap = priv->regmap_base; 167449c55878SDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 167549c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 167649c55878SDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 167749c55878SDavid Wu } 167849c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 167949c55878SDavid Wu *bit = pin_num % pins_per_reg; 168049c55878SDavid Wu 168149c55878SDavid Wu return 0; 168249c55878SDavid Wu } 168349c55878SDavid Wu 168449c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET 0x10 168549c55878SDavid Wu #define RV1108_PULL_OFFSET 0x110 168649c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG 8 168749c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN 2 168849c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE 16 168949c55878SDavid Wu 169049c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 169149c55878SDavid Wu int pin_num, struct regmap **regmap, 169249c55878SDavid Wu int *reg, u8 *bit) 169349c55878SDavid Wu { 169449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 169549c55878SDavid Wu 169649c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 169749c55878SDavid Wu if (bank->bank_num == 0) { 169849c55878SDavid Wu *regmap = priv->regmap_pmu; 169949c55878SDavid Wu *reg = RV1108_PULL_PMU_OFFSET; 170049c55878SDavid Wu } else { 170149c55878SDavid Wu *reg = RV1108_PULL_OFFSET; 170249c55878SDavid Wu *regmap = priv->regmap_base; 170349c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 170449c55878SDavid Wu *reg -= 0x10; 170549c55878SDavid Wu *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE; 170649c55878SDavid Wu } 170749c55878SDavid Wu 170849c55878SDavid Wu *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4); 170949c55878SDavid Wu *bit = (pin_num % RV1108_PULL_PINS_PER_REG); 171049c55878SDavid Wu *bit *= RV1108_PULL_BITS_PER_PIN; 171149c55878SDavid Wu } 171249c55878SDavid Wu 171349c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET 0x20 171449c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET 0x210 171549c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN 2 171649c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG 8 171749c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE 16 171849c55878SDavid Wu 171949c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 172049c55878SDavid Wu int pin_num, struct regmap **regmap, 172149c55878SDavid Wu int *reg, u8 *bit) 172249c55878SDavid Wu { 172349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 172449c55878SDavid Wu 172549c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 172649c55878SDavid Wu if (bank->bank_num == 0) { 172749c55878SDavid Wu *regmap = priv->regmap_pmu; 172849c55878SDavid Wu *reg = RV1108_DRV_PMU_OFFSET; 172949c55878SDavid Wu } else { 173049c55878SDavid Wu *regmap = priv->regmap_base; 173149c55878SDavid Wu *reg = RV1108_DRV_GRF_OFFSET; 173249c55878SDavid Wu 173349c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 173449c55878SDavid Wu *reg -= 0x10; 173549c55878SDavid Wu *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE; 173649c55878SDavid Wu } 173749c55878SDavid Wu 173849c55878SDavid Wu *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4); 173949c55878SDavid Wu *bit = pin_num % RV1108_DRV_PINS_PER_REG; 174049c55878SDavid Wu *bit *= RV1108_DRV_BITS_PER_PIN; 174149c55878SDavid Wu } 174249c55878SDavid Wu 174349c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET 0x30 174449c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET 0x388 174549c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE 8 174649c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG 16 174749c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG 8 174849c55878SDavid Wu 174949c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 175049c55878SDavid Wu int pin_num, 175149c55878SDavid Wu struct regmap **regmap, 175249c55878SDavid Wu int *reg, u8 *bit) 175349c55878SDavid Wu { 175449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 175549c55878SDavid Wu int pins_per_reg; 175649c55878SDavid Wu 175749c55878SDavid Wu if (bank->bank_num == 0) { 175849c55878SDavid Wu *regmap = priv->regmap_pmu; 175949c55878SDavid Wu *reg = RV1108_SCHMITT_PMU_OFFSET; 176049c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG; 176149c55878SDavid Wu } else { 176249c55878SDavid Wu *regmap = priv->regmap_base; 176349c55878SDavid Wu *reg = RV1108_SCHMITT_GRF_OFFSET; 176449c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG; 176549c55878SDavid Wu *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE; 176649c55878SDavid Wu } 176749c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 176849c55878SDavid Wu *bit = pin_num % pins_per_reg; 176949c55878SDavid Wu 177049c55878SDavid Wu return 0; 177149c55878SDavid Wu } 177249c55878SDavid Wu 1773*cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET 0x40 1774*cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET 0x10108 1775*cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG 8 1776*cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN 2 1777*cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE 16 1778*cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */ 1779*cf04a17bSJianqun Xu 1780*cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1781*cf04a17bSJianqun Xu int pin_num, struct regmap **regmap, 1782*cf04a17bSJianqun Xu int *reg, u8 *bit) 1783*cf04a17bSJianqun Xu { 1784*cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1785*cf04a17bSJianqun Xu 1786*cf04a17bSJianqun Xu /* The first 24 pins of the first bank are located in PMU */ 1787*cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1788*cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1789*cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1790*cf04a17bSJianqun Xu *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 1791*cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4); 1792*cf04a17bSJianqun Xu *bit = pin_num % RV1126_PULL_PINS_PER_REG; 1793*cf04a17bSJianqun Xu *bit *= RV1126_PULL_BITS_PER_PIN; 1794*cf04a17bSJianqun Xu return; 1795*cf04a17bSJianqun Xu } 1796*cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 1797*cf04a17bSJianqun Xu *reg = RV1126_PULL_PMU_OFFSET; 1798*cf04a17bSJianqun Xu } else { 1799*cf04a17bSJianqun Xu *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 1800*cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1801*cf04a17bSJianqun Xu *reg += bank->bank_num * RV1126_PULL_BANK_STRIDE; 1802*cf04a17bSJianqun Xu } 1803*cf04a17bSJianqun Xu 1804*cf04a17bSJianqun Xu *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4); 1805*cf04a17bSJianqun Xu *bit = (pin_num % RV1126_PULL_PINS_PER_REG); 1806*cf04a17bSJianqun Xu *bit *= RV1126_PULL_BITS_PER_PIN; 1807*cf04a17bSJianqun Xu } 1808*cf04a17bSJianqun Xu 1809*cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET 0x20 1810*cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET 0x10090 1811*cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN 4 1812*cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG 4 1813*cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE 32 1814*cf04a17bSJianqun Xu 1815*cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1816*cf04a17bSJianqun Xu int pin_num, struct regmap **regmap, 1817*cf04a17bSJianqun Xu int *reg, u8 *bit) 1818*cf04a17bSJianqun Xu { 1819*cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1820*cf04a17bSJianqun Xu 1821*cf04a17bSJianqun Xu /* The first 24 pins of the first bank are located in PMU */ 1822*cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1823*cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1824*cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1825*cf04a17bSJianqun Xu *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 1826*cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4); 1827*cf04a17bSJianqun Xu *bit = pin_num % RV1126_DRV_PINS_PER_REG; 1828*cf04a17bSJianqun Xu *bit *= RV1126_DRV_BITS_PER_PIN; 1829*cf04a17bSJianqun Xu return; 1830*cf04a17bSJianqun Xu } 1831*cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 1832*cf04a17bSJianqun Xu *reg = RV1126_DRV_PMU_OFFSET; 1833*cf04a17bSJianqun Xu } else { 1834*cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1835*cf04a17bSJianqun Xu *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 1836*cf04a17bSJianqun Xu *reg += bank->bank_num * RV1126_DRV_BANK_STRIDE; 1837*cf04a17bSJianqun Xu } 1838*cf04a17bSJianqun Xu 1839*cf04a17bSJianqun Xu *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4); 1840*cf04a17bSJianqun Xu *bit = pin_num % RV1126_DRV_PINS_PER_REG; 1841*cf04a17bSJianqun Xu *bit *= RV1126_DRV_BITS_PER_PIN; 1842*cf04a17bSJianqun Xu } 1843*cf04a17bSJianqun Xu 1844*cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET 0x60 1845*cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET 0x10188 1846*cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE 16 1847*cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG 8 1848*cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG 8 1849*cf04a17bSJianqun Xu 1850*cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 1851*cf04a17bSJianqun Xu int pin_num, 1852*cf04a17bSJianqun Xu struct regmap **regmap, 1853*cf04a17bSJianqun Xu int *reg, u8 *bit) 1854*cf04a17bSJianqun Xu { 1855*cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1856*cf04a17bSJianqun Xu int pins_per_reg; 1857*cf04a17bSJianqun Xu 1858*cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1859*cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1860*cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1861*cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 1862*cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4); 1863*cf04a17bSJianqun Xu *bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG; 1864*cf04a17bSJianqun Xu return 0; 1865*cf04a17bSJianqun Xu } 1866*cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 1867*cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_PMU_OFFSET; 1868*cf04a17bSJianqun Xu pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG; 1869*cf04a17bSJianqun Xu } else { 1870*cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1871*cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 1872*cf04a17bSJianqun Xu pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG; 1873*cf04a17bSJianqun Xu *reg += bank->bank_num * RV1126_SCHMITT_BANK_STRIDE; 1874*cf04a17bSJianqun Xu } 1875*cf04a17bSJianqun Xu *reg += ((pin_num / pins_per_reg) * 4); 1876*cf04a17bSJianqun Xu *bit = pin_num % pins_per_reg; 1877*cf04a17bSJianqun Xu 1878*cf04a17bSJianqun Xu return 0; 1879*cf04a17bSJianqun Xu } 1880*cf04a17bSJianqun Xu 1881a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET 0x10 1882a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET 0x80 1883a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG 8 1884a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN 2 1885a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE 16 1886a2a3fc8fSJianqun Xu 1887a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1888a2a3fc8fSJianqun Xu int pin_num, 1889a2a3fc8fSJianqun Xu struct regmap **regmap, 1890a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1891a2a3fc8fSJianqun Xu { 1892a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1893a2a3fc8fSJianqun Xu 1894a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1895a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1896a2a3fc8fSJianqun Xu *reg = RK1808_PULL_PMU_OFFSET; 1897a2a3fc8fSJianqun Xu } else { 1898a2a3fc8fSJianqun Xu *reg = RK1808_PULL_GRF_OFFSET; 1899a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1900a2a3fc8fSJianqun Xu } 1901a2a3fc8fSJianqun Xu 1902a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4); 1903a2a3fc8fSJianqun Xu *bit = (pin_num % RK1808_PULL_PINS_PER_REG); 1904a2a3fc8fSJianqun Xu *bit *= RK1808_PULL_BITS_PER_PIN; 1905a2a3fc8fSJianqun Xu } 1906a2a3fc8fSJianqun Xu 1907a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET 0x20 1908a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET 0x140 1909a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN 2 1910a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG 8 1911a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE 16 1912a2a3fc8fSJianqun Xu 1913a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1914a2a3fc8fSJianqun Xu int pin_num, 1915a2a3fc8fSJianqun Xu struct regmap **regmap, 1916a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1917a2a3fc8fSJianqun Xu { 1918a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1919a2a3fc8fSJianqun Xu 1920a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1921a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1922a2a3fc8fSJianqun Xu *reg = RK1808_DRV_PMU_OFFSET; 1923a2a3fc8fSJianqun Xu } else { 1924a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1925a2a3fc8fSJianqun Xu *reg = RK1808_DRV_GRF_OFFSET; 1926a2a3fc8fSJianqun Xu } 1927a2a3fc8fSJianqun Xu 1928a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4); 1929a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_DRV_PINS_PER_REG; 1930a2a3fc8fSJianqun Xu *bit *= RK1808_DRV_BITS_PER_PIN; 1931a2a3fc8fSJianqun Xu } 1932a2a3fc8fSJianqun Xu 1933a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET 0x0040 1934a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET 0x0100 1935a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE 16 1936a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG 8 1937a2a3fc8fSJianqun Xu 1938a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 1939a2a3fc8fSJianqun Xu int pin_num, 1940a2a3fc8fSJianqun Xu struct regmap **regmap, 1941a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1942a2a3fc8fSJianqun Xu { 1943a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1944a2a3fc8fSJianqun Xu 1945a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1946a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1947a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_PMU_OFFSET; 1948a2a3fc8fSJianqun Xu } else { 1949a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1950a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_GRF_OFFSET; 1951a2a3fc8fSJianqun Xu *reg += (bank->bank_num - 1) * RK1808_SCHMITT_BANK_STRIDE; 1952a2a3fc8fSJianqun Xu } 1953a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4); 1954a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG; 1955a2a3fc8fSJianqun Xu 1956a2a3fc8fSJianqun Xu return 0; 1957a2a3fc8fSJianqun Xu } 1958a2a3fc8fSJianqun Xu 195949c55878SDavid Wu #define RK2928_PULL_OFFSET 0x118 196049c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG 16 196149c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE 8 196249c55878SDavid Wu 196349c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 196449c55878SDavid Wu int pin_num, struct regmap **regmap, 196549c55878SDavid Wu int *reg, u8 *bit) 196649c55878SDavid Wu { 196749c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 196849c55878SDavid Wu 196949c55878SDavid Wu *regmap = priv->regmap_base; 197049c55878SDavid Wu *reg = RK2928_PULL_OFFSET; 197149c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 197249c55878SDavid Wu *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; 197349c55878SDavid Wu 197449c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 197549c55878SDavid Wu }; 197649c55878SDavid Wu 197749c55878SDavid Wu #define RK3128_PULL_OFFSET 0x118 197849c55878SDavid Wu 197949c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 198049c55878SDavid Wu int pin_num, struct regmap **regmap, 198149c55878SDavid Wu int *reg, u8 *bit) 198249c55878SDavid Wu { 198349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 198449c55878SDavid Wu 198549c55878SDavid Wu *regmap = priv->regmap_base; 198649c55878SDavid Wu *reg = RK3128_PULL_OFFSET; 198749c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 198849c55878SDavid Wu *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4); 198949c55878SDavid Wu 199049c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 199149c55878SDavid Wu } 199249c55878SDavid Wu 199349c55878SDavid Wu #define RK3188_PULL_OFFSET 0x164 199449c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN 2 199549c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG 8 199649c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE 16 199749c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET 0x64 199849c55878SDavid Wu 199949c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 200049c55878SDavid Wu int pin_num, struct regmap **regmap, 200149c55878SDavid Wu int *reg, u8 *bit) 200249c55878SDavid Wu { 200349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 200449c55878SDavid Wu 200549c55878SDavid Wu /* The first 12 pins of the first bank are located elsewhere */ 200649c55878SDavid Wu if (bank->bank_num == 0 && pin_num < 12) { 200749c55878SDavid Wu *regmap = priv->regmap_pmu; 200849c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 200949c55878SDavid Wu 201049c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 201149c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 201249c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 201349c55878SDavid Wu } else { 201449c55878SDavid Wu *regmap = priv->regmap_base; 201549c55878SDavid Wu *reg = RK3188_PULL_OFFSET; 201649c55878SDavid Wu 201749c55878SDavid Wu /* correct the offset, as it is the 2nd pull register */ 201849c55878SDavid Wu *reg -= 4; 201949c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 202049c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 202149c55878SDavid Wu 202249c55878SDavid Wu /* 202349c55878SDavid Wu * The bits in these registers have an inverse ordering 202449c55878SDavid Wu * with the lowest pin being in bits 15:14 and the highest 202549c55878SDavid Wu * pin in bits 1:0 202649c55878SDavid Wu */ 202749c55878SDavid Wu *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); 202849c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 202949c55878SDavid Wu } 203049c55878SDavid Wu } 203149c55878SDavid Wu 203249c55878SDavid Wu #define RK3288_PULL_OFFSET 0x140 203349c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 203449c55878SDavid Wu int pin_num, struct regmap **regmap, 203549c55878SDavid Wu int *reg, u8 *bit) 203649c55878SDavid Wu { 203749c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 203849c55878SDavid Wu 203949c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 204049c55878SDavid Wu if (bank->bank_num == 0) { 204149c55878SDavid Wu *regmap = priv->regmap_pmu; 204249c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 204349c55878SDavid Wu 204449c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 204549c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 204649c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 204749c55878SDavid Wu } else { 204849c55878SDavid Wu *regmap = priv->regmap_base; 204949c55878SDavid Wu *reg = RK3288_PULL_OFFSET; 205049c55878SDavid Wu 205149c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 205249c55878SDavid Wu *reg -= 0x10; 205349c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 205449c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 205549c55878SDavid Wu 205649c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 205749c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 205849c55878SDavid Wu } 205949c55878SDavid Wu } 206049c55878SDavid Wu 206149c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET 0x70 206249c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET 0x1c0 206349c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN 2 206449c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG 8 206549c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE 16 206649c55878SDavid Wu 206749c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 206849c55878SDavid Wu int pin_num, struct regmap **regmap, 206949c55878SDavid Wu int *reg, u8 *bit) 207049c55878SDavid Wu { 207149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 207249c55878SDavid Wu 207349c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 207449c55878SDavid Wu if (bank->bank_num == 0) { 207549c55878SDavid Wu *regmap = priv->regmap_pmu; 207649c55878SDavid Wu *reg = RK3288_DRV_PMU_OFFSET; 207749c55878SDavid Wu 207849c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 207949c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 208049c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 208149c55878SDavid Wu } else { 208249c55878SDavid Wu *regmap = priv->regmap_base; 208349c55878SDavid Wu *reg = RK3288_DRV_GRF_OFFSET; 208449c55878SDavid Wu 208549c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 208649c55878SDavid Wu *reg -= 0x10; 208749c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 208849c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 208949c55878SDavid Wu 209049c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 209149c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 209249c55878SDavid Wu } 209349c55878SDavid Wu } 209449c55878SDavid Wu 209549c55878SDavid Wu #define RK3228_PULL_OFFSET 0x100 209649c55878SDavid Wu 209749c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 209849c55878SDavid Wu int pin_num, struct regmap **regmap, 209949c55878SDavid Wu int *reg, u8 *bit) 210049c55878SDavid Wu { 210149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 210249c55878SDavid Wu 210349c55878SDavid Wu *regmap = priv->regmap_base; 210449c55878SDavid Wu *reg = RK3228_PULL_OFFSET; 210549c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 210649c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 210749c55878SDavid Wu 210849c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 210949c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 211049c55878SDavid Wu } 211149c55878SDavid Wu 211249c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET 0x200 211349c55878SDavid Wu 211449c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 211549c55878SDavid Wu int pin_num, struct regmap **regmap, 211649c55878SDavid Wu int *reg, u8 *bit) 211749c55878SDavid Wu { 211849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 211949c55878SDavid Wu 212049c55878SDavid Wu *regmap = priv->regmap_base; 212149c55878SDavid Wu *reg = RK3228_DRV_GRF_OFFSET; 212249c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 212349c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 212449c55878SDavid Wu 212549c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 212649c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 212749c55878SDavid Wu } 212849c55878SDavid Wu 2129b3077611SDavid Wu #define RK3308_PULL_OFFSET 0xa0 2130b3077611SDavid Wu 2131b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 2132b3077611SDavid Wu int pin_num, struct regmap **regmap, 2133b3077611SDavid Wu int *reg, u8 *bit) 2134b3077611SDavid Wu { 2135b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2136b3077611SDavid Wu 2137b3077611SDavid Wu *regmap = priv->regmap_base; 2138b3077611SDavid Wu *reg = RK3308_PULL_OFFSET; 2139b3077611SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 2140b3077611SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 2141b3077611SDavid Wu 2142b3077611SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 2143b3077611SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 2144b3077611SDavid Wu } 2145b3077611SDavid Wu 2146b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET 0x100 2147b3077611SDavid Wu 2148b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 2149b3077611SDavid Wu int pin_num, struct regmap **regmap, 2150b3077611SDavid Wu int *reg, u8 *bit) 2151b3077611SDavid Wu { 2152b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2153b3077611SDavid Wu 2154b3077611SDavid Wu *regmap = priv->regmap_base; 2155b3077611SDavid Wu *reg = RK3308_DRV_GRF_OFFSET; 2156b3077611SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 2157b3077611SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 2158b3077611SDavid Wu 2159b3077611SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 2160b3077611SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 2161b3077611SDavid Wu } 2162b3077611SDavid Wu 2163b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG 8 2164b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE 16 2165b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET 0x1a0 2166b3077611SDavid Wu 2167b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2168b3077611SDavid Wu int pin_num, 2169b3077611SDavid Wu struct regmap **regmap, 2170b3077611SDavid Wu int *reg, u8 *bit) 2171b3077611SDavid Wu { 2172b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2173b3077611SDavid Wu 2174b3077611SDavid Wu *regmap = priv->regmap_base; 2175b3077611SDavid Wu *reg = RK3308_SCHMITT_GRF_OFFSET; 2176b3077611SDavid Wu 2177b3077611SDavid Wu *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE; 2178b3077611SDavid Wu *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4); 2179b3077611SDavid Wu *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG; 2180b3077611SDavid Wu 2181b3077611SDavid Wu return 0; 2182b3077611SDavid Wu } 2183b3077611SDavid Wu 218449c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET 0x100 218549c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET 0x10 218649c55878SDavid Wu 218749c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 218849c55878SDavid Wu int pin_num, struct regmap **regmap, 218949c55878SDavid Wu int *reg, u8 *bit) 219049c55878SDavid Wu { 219149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 219249c55878SDavid Wu 219349c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 219449c55878SDavid Wu if (bank->bank_num == 0) { 219549c55878SDavid Wu *regmap = priv->regmap_pmu; 219649c55878SDavid Wu *reg = RK3368_PULL_PMU_OFFSET; 219749c55878SDavid Wu 219849c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 219949c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 220049c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 220149c55878SDavid Wu } else { 220249c55878SDavid Wu *regmap = priv->regmap_base; 220349c55878SDavid Wu *reg = RK3368_PULL_GRF_OFFSET; 220449c55878SDavid Wu 220549c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 220649c55878SDavid Wu *reg -= 0x10; 220749c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 220849c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 220949c55878SDavid Wu 221049c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 221149c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 221249c55878SDavid Wu } 221349c55878SDavid Wu } 221449c55878SDavid Wu 221549c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET 0x20 221649c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET 0x200 221749c55878SDavid Wu 221849c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 221949c55878SDavid Wu int pin_num, struct regmap **regmap, 222049c55878SDavid Wu int *reg, u8 *bit) 222149c55878SDavid Wu { 222249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 222349c55878SDavid Wu 222449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 222549c55878SDavid Wu if (bank->bank_num == 0) { 222649c55878SDavid Wu *regmap = priv->regmap_pmu; 222749c55878SDavid Wu *reg = RK3368_DRV_PMU_OFFSET; 222849c55878SDavid Wu 222949c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 223049c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 223149c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 223249c55878SDavid Wu } else { 223349c55878SDavid Wu *regmap = priv->regmap_base; 223449c55878SDavid Wu *reg = RK3368_DRV_GRF_OFFSET; 223549c55878SDavid Wu 223649c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 223749c55878SDavid Wu *reg -= 0x10; 223849c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 223949c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 224049c55878SDavid Wu 224149c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 224249c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 224349c55878SDavid Wu } 224449c55878SDavid Wu } 224549c55878SDavid Wu 224649c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET 0xe040 224749c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET 0x40 224849c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN 3 224949c55878SDavid Wu 225049c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 225149c55878SDavid Wu int pin_num, struct regmap **regmap, 225249c55878SDavid Wu int *reg, u8 *bit) 225349c55878SDavid Wu { 225449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 225549c55878SDavid Wu 225649c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 225749c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) { 225849c55878SDavid Wu *regmap = priv->regmap_pmu; 225949c55878SDavid Wu *reg = RK3399_PULL_PMU_OFFSET; 226049c55878SDavid Wu 226149c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 226249c55878SDavid Wu 226349c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 226449c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 226549c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 226649c55878SDavid Wu } else { 226749c55878SDavid Wu *regmap = priv->regmap_base; 226849c55878SDavid Wu *reg = RK3399_PULL_GRF_OFFSET; 226949c55878SDavid Wu 227049c55878SDavid Wu /* correct the offset, as we're starting with the 3rd bank */ 227149c55878SDavid Wu *reg -= 0x20; 227249c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 227349c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 227449c55878SDavid Wu 227549c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 227649c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 227749c55878SDavid Wu } 227849c55878SDavid Wu } 227949c55878SDavid Wu 228049c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 228149c55878SDavid Wu int pin_num, struct regmap **regmap, 228249c55878SDavid Wu int *reg, u8 *bit) 228349c55878SDavid Wu { 228449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 228549c55878SDavid Wu int drv_num = (pin_num / 8); 228649c55878SDavid Wu 228749c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 228849c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) 228949c55878SDavid Wu *regmap = priv->regmap_pmu; 229049c55878SDavid Wu else 229149c55878SDavid Wu *regmap = priv->regmap_base; 229249c55878SDavid Wu 229349c55878SDavid Wu *reg = bank->drv[drv_num].offset; 229449c55878SDavid Wu if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 229549c55878SDavid Wu (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)) 229649c55878SDavid Wu *bit = (pin_num % 8) * 3; 229749c55878SDavid Wu else 229849c55878SDavid Wu *bit = (pin_num % 8) * 2; 229949c55878SDavid Wu } 230049c55878SDavid Wu 230149c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = { 230249c55878SDavid Wu { 2, 4, 8, 12, -1, -1, -1, -1 }, 230349c55878SDavid Wu { 3, 6, 9, 12, -1, -1, -1, -1 }, 230449c55878SDavid Wu { 5, 10, 15, 20, -1, -1, -1, -1 }, 230549c55878SDavid Wu { 4, 6, 8, 10, 12, 14, 16, 18 }, 230649c55878SDavid Wu { 4, 7, 10, 13, 16, 19, 22, 26 } 230749c55878SDavid Wu }; 230849c55878SDavid Wu 230949c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, 231049c55878SDavid Wu int pin_num, int strength) 231149c55878SDavid Wu { 231249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 231349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 231449c55878SDavid Wu struct regmap *regmap; 231549c55878SDavid Wu int reg, ret, i; 231649c55878SDavid Wu u32 data, rmask_bits, temp; 231749c55878SDavid Wu u8 bit; 23182c16899dSDavid.Wu /* Where need to clean the special mask for rockchip_perpin_drv_list */ 23192c16899dSDavid.Wu int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK); 232049c55878SDavid Wu 232149c55878SDavid Wu debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num, 232249c55878SDavid Wu pin_num, strength); 232349c55878SDavid Wu 232449c55878SDavid Wu ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 232549c55878SDavid Wu 232649c55878SDavid Wu ret = -EINVAL; 232749c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { 232849c55878SDavid Wu if (rockchip_perpin_drv_list[drv_type][i] == strength) { 232949c55878SDavid Wu ret = i; 233049c55878SDavid Wu break; 233149c55878SDavid Wu } else if (rockchip_perpin_drv_list[drv_type][i] < 0) { 233249c55878SDavid Wu ret = rockchip_perpin_drv_list[drv_type][i]; 233349c55878SDavid Wu break; 233449c55878SDavid Wu } 233549c55878SDavid Wu } 233649c55878SDavid Wu 233749c55878SDavid Wu if (ret < 0) { 233849c55878SDavid Wu debug("unsupported driver strength %d\n", strength); 233949c55878SDavid Wu return ret; 234049c55878SDavid Wu } 234149c55878SDavid Wu 234249c55878SDavid Wu switch (drv_type) { 234349c55878SDavid Wu case DRV_TYPE_IO_1V8_3V0_AUTO: 234449c55878SDavid Wu case DRV_TYPE_IO_3V3_ONLY: 234549c55878SDavid Wu rmask_bits = RK3399_DRV_3BITS_PER_PIN; 234649c55878SDavid Wu switch (bit) { 234749c55878SDavid Wu case 0 ... 12: 234849c55878SDavid Wu /* regular case, nothing to do */ 234949c55878SDavid Wu break; 235049c55878SDavid Wu case 15: 235149c55878SDavid Wu /* 235249c55878SDavid Wu * drive-strength offset is special, as it is spread 235349c55878SDavid Wu * over 2 registers, the bit data[15] contains bit 0 235449c55878SDavid Wu * of the value while temp[1:0] contains bits 2 and 1 235549c55878SDavid Wu */ 235649c55878SDavid Wu data = (ret & 0x1) << 15; 235749c55878SDavid Wu temp = (ret >> 0x1) & 0x3; 235849c55878SDavid Wu 235949c55878SDavid Wu data |= BIT(31); 236049c55878SDavid Wu ret = regmap_write(regmap, reg, data); 236149c55878SDavid Wu if (ret) 236249c55878SDavid Wu return ret; 236349c55878SDavid Wu 236449c55878SDavid Wu temp |= (0x3 << 16); 236549c55878SDavid Wu reg += 0x4; 236649c55878SDavid Wu ret = regmap_write(regmap, reg, temp); 236749c55878SDavid Wu 236849c55878SDavid Wu return ret; 236949c55878SDavid Wu case 18 ... 21: 237049c55878SDavid Wu /* setting fully enclosed in the second register */ 237149c55878SDavid Wu reg += 4; 237249c55878SDavid Wu bit -= 16; 237349c55878SDavid Wu break; 237449c55878SDavid Wu default: 237549c55878SDavid Wu debug("unsupported bit: %d for pinctrl drive type: %d\n", 237649c55878SDavid Wu bit, drv_type); 237749c55878SDavid Wu return -EINVAL; 237849c55878SDavid Wu } 237949c55878SDavid Wu break; 238049c55878SDavid Wu case DRV_TYPE_IO_DEFAULT: 238149c55878SDavid Wu case DRV_TYPE_IO_1V8_OR_3V0: 238249c55878SDavid Wu case DRV_TYPE_IO_1V8_ONLY: 238349c55878SDavid Wu rmask_bits = RK3288_DRV_BITS_PER_PIN; 238449c55878SDavid Wu break; 238549c55878SDavid Wu default: 238649c55878SDavid Wu debug("unsupported pinctrl drive type: %d\n", 238749c55878SDavid Wu drv_type); 238849c55878SDavid Wu return -EINVAL; 238949c55878SDavid Wu } 239049c55878SDavid Wu 239155a89bc6SDavid Wu if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) { 239255a89bc6SDavid Wu regmap_read(regmap, reg, &data); 239355a89bc6SDavid Wu data &= ~(((1 << rmask_bits) - 1) << bit); 239455a89bc6SDavid Wu } else { 239549c55878SDavid Wu /* enable the write to the equivalent lower bits */ 239649c55878SDavid Wu data = ((1 << rmask_bits) - 1) << (bit + 16); 239755a89bc6SDavid Wu } 239849c55878SDavid Wu 239955a89bc6SDavid Wu data |= (ret << bit); 240049c55878SDavid Wu ret = regmap_write(regmap, reg, data); 240149c55878SDavid Wu return ret; 240249c55878SDavid Wu } 240349c55878SDavid Wu 240449c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = { 240549c55878SDavid Wu { 240649c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 240749c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP, 240849c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 240949c55878SDavid Wu PIN_CONFIG_BIAS_BUS_HOLD 241049c55878SDavid Wu }, 241149c55878SDavid Wu { 241249c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 241349c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 241449c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 241549c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP 241649c55878SDavid Wu }, 241749c55878SDavid Wu }; 241849c55878SDavid Wu 241949c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank, 242049c55878SDavid Wu int pin_num, int pull) 242149c55878SDavid Wu { 242249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 242349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 242449c55878SDavid Wu struct regmap *regmap; 242549c55878SDavid Wu int reg, ret, i, pull_type; 242649c55878SDavid Wu u8 bit; 242749c55878SDavid Wu u32 data; 242849c55878SDavid Wu 242949c55878SDavid Wu debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num, 243049c55878SDavid Wu pin_num, pull); 243149c55878SDavid Wu 243249c55878SDavid Wu /* rk3066b does support any pulls */ 243349c55878SDavid Wu if (ctrl->type == RK3066B) 243449c55878SDavid Wu return pull ? -EINVAL : 0; 243549c55878SDavid Wu 243649c55878SDavid Wu ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 243749c55878SDavid Wu 243849c55878SDavid Wu switch (ctrl->type) { 243949c55878SDavid Wu case RK2928: 244049c55878SDavid Wu case RK3128: 244149c55878SDavid Wu data = BIT(bit + 16); 244249c55878SDavid Wu if (pull == PIN_CONFIG_BIAS_DISABLE) 244349c55878SDavid Wu data |= BIT(bit); 244449c55878SDavid Wu ret = regmap_write(regmap, reg, data); 244549c55878SDavid Wu break; 244649c55878SDavid Wu case PX30: 244749c55878SDavid Wu case RV1108: 2448*cf04a17bSJianqun Xu case RV1126: 2449a2a3fc8fSJianqun Xu case RK1808: 245049c55878SDavid Wu case RK3188: 245149c55878SDavid Wu case RK3288: 2452b3077611SDavid Wu case RK3308: 245349c55878SDavid Wu case RK3368: 245449c55878SDavid Wu case RK3399: 24552c16899dSDavid.Wu /* 24562c16899dSDavid.Wu * Where need to clean the special mask for 24572c16899dSDavid.Wu * rockchip_pull_list. 24582c16899dSDavid.Wu */ 24592c16899dSDavid.Wu pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK); 246049c55878SDavid Wu ret = -EINVAL; 246149c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); 246249c55878SDavid Wu i++) { 246349c55878SDavid Wu if (rockchip_pull_list[pull_type][i] == pull) { 246449c55878SDavid Wu ret = i; 246549c55878SDavid Wu break; 246649c55878SDavid Wu } 246749c55878SDavid Wu } 246849c55878SDavid Wu 246949c55878SDavid Wu if (ret < 0) { 247049c55878SDavid Wu debug("unsupported pull setting %d\n", pull); 247149c55878SDavid Wu return ret; 247249c55878SDavid Wu } 247349c55878SDavid Wu 247455a89bc6SDavid Wu if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) { 247555a89bc6SDavid Wu regmap_read(regmap, reg, &data); 247655a89bc6SDavid Wu data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit); 247755a89bc6SDavid Wu } else { 247849c55878SDavid Wu /* enable the write to the equivalent lower bits */ 247949c55878SDavid Wu data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); 248055a89bc6SDavid Wu } 248149c55878SDavid Wu 248255a89bc6SDavid Wu data |= (ret << bit); 248349c55878SDavid Wu ret = regmap_write(regmap, reg, data); 248449c55878SDavid Wu break; 248549c55878SDavid Wu default: 248649c55878SDavid Wu debug("unsupported pinctrl type\n"); 248749c55878SDavid Wu return -EINVAL; 248849c55878SDavid Wu } 248949c55878SDavid Wu 249049c55878SDavid Wu return ret; 249149c55878SDavid Wu } 249249c55878SDavid Wu 249349c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN 1 249449c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG 16 249549c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE 8 249649c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET 0x380 249749c55878SDavid Wu 249849c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 249949c55878SDavid Wu int pin_num, 250049c55878SDavid Wu struct regmap **regmap, 250149c55878SDavid Wu int *reg, u8 *bit) 250249c55878SDavid Wu { 250349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 250449c55878SDavid Wu 250549c55878SDavid Wu *regmap = priv->regmap_base; 250649c55878SDavid Wu *reg = RK3328_SCHMITT_GRF_OFFSET; 250749c55878SDavid Wu 250849c55878SDavid Wu *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE; 250949c55878SDavid Wu *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4); 251049c55878SDavid Wu *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG; 251149c55878SDavid Wu 251249c55878SDavid Wu return 0; 251349c55878SDavid Wu } 251449c55878SDavid Wu 251549c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, 251649c55878SDavid Wu int pin_num, int enable) 251749c55878SDavid Wu { 251849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 251949c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 252049c55878SDavid Wu struct regmap *regmap; 252149c55878SDavid Wu int reg, ret; 252249c55878SDavid Wu u8 bit; 252349c55878SDavid Wu u32 data; 252449c55878SDavid Wu 252549c55878SDavid Wu debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num, 252649c55878SDavid Wu pin_num, enable); 252749c55878SDavid Wu 252849c55878SDavid Wu ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 252949c55878SDavid Wu if (ret) 253049c55878SDavid Wu return ret; 253149c55878SDavid Wu 253249c55878SDavid Wu /* enable the write to the equivalent lower bits */ 253349c55878SDavid Wu data = BIT(bit + 16) | (enable << bit); 253449c55878SDavid Wu 253549c55878SDavid Wu return regmap_write(regmap, reg, data); 253649c55878SDavid Wu } 253749c55878SDavid Wu 253832c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET 0x30 253932c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET 0x90 254032c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG 16 254132c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE 16 254232c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG 8 254332c25d1fSDavid Wu 254432c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, 254532c25d1fSDavid Wu int pin_num, 254632c25d1fSDavid Wu struct regmap **regmap, 254732c25d1fSDavid Wu int *reg, u8 *bit) 254832c25d1fSDavid Wu { 254932c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 255032c25d1fSDavid Wu int pins_per_reg; 255132c25d1fSDavid Wu 255232c25d1fSDavid Wu if (bank->bank_num == 0) { 255332c25d1fSDavid Wu *regmap = priv->regmap_pmu; 255432c25d1fSDavid Wu *reg = PX30_SLEW_RATE_PMU_OFFSET; 255532c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 255632c25d1fSDavid Wu } else { 255732c25d1fSDavid Wu *regmap = priv->regmap_base; 255832c25d1fSDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 255932c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 256032c25d1fSDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 256132c25d1fSDavid Wu } 256232c25d1fSDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 256332c25d1fSDavid Wu *bit = pin_num % pins_per_reg; 256432c25d1fSDavid Wu 256532c25d1fSDavid Wu return 0; 256632c25d1fSDavid Wu } 256732c25d1fSDavid Wu 256832c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank, 256932c25d1fSDavid Wu int pin_num, int speed) 257032c25d1fSDavid Wu { 257132c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 257232c25d1fSDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 257332c25d1fSDavid Wu struct regmap *regmap; 257432c25d1fSDavid Wu int reg, ret; 257532c25d1fSDavid Wu u8 bit; 257632c25d1fSDavid Wu u32 data; 257732c25d1fSDavid Wu 257832c25d1fSDavid Wu debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num, 257932c25d1fSDavid Wu pin_num, speed); 258032c25d1fSDavid Wu 258132c25d1fSDavid Wu ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit); 258232c25d1fSDavid Wu if (ret) 258332c25d1fSDavid Wu return ret; 258432c25d1fSDavid Wu 258532c25d1fSDavid Wu /* enable the write to the equivalent lower bits */ 258632c25d1fSDavid Wu data = BIT(bit + 16) | (speed << bit); 258732c25d1fSDavid Wu 258832c25d1fSDavid Wu return regmap_write(regmap, reg, data); 258932c25d1fSDavid Wu } 259032c25d1fSDavid Wu 259149c55878SDavid Wu /* 259249c55878SDavid Wu * Pinconf_ops handling 259349c55878SDavid Wu */ 259449c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, 259549c55878SDavid Wu unsigned int pull) 259649c55878SDavid Wu { 259749c55878SDavid Wu switch (ctrl->type) { 259849c55878SDavid Wu case RK2928: 259949c55878SDavid Wu case RK3128: 260049c55878SDavid Wu return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || 260149c55878SDavid Wu pull == PIN_CONFIG_BIAS_DISABLE); 260249c55878SDavid Wu case RK3066B: 260349c55878SDavid Wu return pull ? false : true; 260449c55878SDavid Wu case PX30: 260549c55878SDavid Wu case RV1108: 2606*cf04a17bSJianqun Xu case RV1126: 2607a2a3fc8fSJianqun Xu case RK1808: 260849c55878SDavid Wu case RK3188: 260949c55878SDavid Wu case RK3288: 2610b3077611SDavid Wu case RK3308: 261149c55878SDavid Wu case RK3368: 261249c55878SDavid Wu case RK3399: 261349c55878SDavid Wu return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 261449c55878SDavid Wu } 261549c55878SDavid Wu 261649c55878SDavid Wu return false; 261749c55878SDavid Wu } 261849c55878SDavid Wu 261949c55878SDavid Wu /* set the pin config settings for a specified pin */ 262049c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank, 262149c55878SDavid Wu u32 pin, u32 param, u32 arg) 262249c55878SDavid Wu { 262349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 262449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 262549c55878SDavid Wu int rc; 262649c55878SDavid Wu 262749c55878SDavid Wu switch (param) { 262849c55878SDavid Wu case PIN_CONFIG_BIAS_DISABLE: 262949c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 263049c55878SDavid Wu if (rc) 263149c55878SDavid Wu return rc; 263249c55878SDavid Wu break; 263349c55878SDavid Wu 263449c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_UP: 263549c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_DOWN: 263649c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 263749c55878SDavid Wu case PIN_CONFIG_BIAS_BUS_HOLD: 263849c55878SDavid Wu if (!rockchip_pinconf_pull_valid(ctrl, param)) 263949c55878SDavid Wu return -ENOTSUPP; 264049c55878SDavid Wu 264149c55878SDavid Wu if (!arg) 264249c55878SDavid Wu return -EINVAL; 264349c55878SDavid Wu 264449c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 264549c55878SDavid Wu if (rc) 264649c55878SDavid Wu return rc; 264749c55878SDavid Wu break; 264849c55878SDavid Wu 264949c55878SDavid Wu case PIN_CONFIG_DRIVE_STRENGTH: 265049c55878SDavid Wu if (!ctrl->drv_calc_reg) 265149c55878SDavid Wu return -ENOTSUPP; 265249c55878SDavid Wu 265349c55878SDavid Wu rc = rockchip_set_drive_perpin(bank, pin, arg); 265449c55878SDavid Wu if (rc < 0) 265549c55878SDavid Wu return rc; 265649c55878SDavid Wu break; 265749c55878SDavid Wu 265849c55878SDavid Wu case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 265949c55878SDavid Wu if (!ctrl->schmitt_calc_reg) 266049c55878SDavid Wu return -ENOTSUPP; 266149c55878SDavid Wu 266249c55878SDavid Wu rc = rockchip_set_schmitt(bank, pin, arg); 266349c55878SDavid Wu if (rc < 0) 266449c55878SDavid Wu return rc; 266549c55878SDavid Wu break; 266649c55878SDavid Wu 266732c25d1fSDavid Wu case PIN_CONFIG_SLEW_RATE: 266832c25d1fSDavid Wu if (!ctrl->slew_rate_calc_reg) 266932c25d1fSDavid Wu return -ENOTSUPP; 267032c25d1fSDavid Wu 267132c25d1fSDavid Wu rc = rockchip_set_slew_rate(bank, 267232c25d1fSDavid Wu pin - bank->pin_base, arg); 267332c25d1fSDavid Wu if (rc < 0) 267432c25d1fSDavid Wu return rc; 267532c25d1fSDavid Wu break; 267632c25d1fSDavid Wu 267749c55878SDavid Wu default: 267849c55878SDavid Wu break; 267949c55878SDavid Wu } 268049c55878SDavid Wu 268149c55878SDavid Wu return 0; 268249c55878SDavid Wu } 268349c55878SDavid Wu 268449c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = { 268549c55878SDavid Wu { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, 268649c55878SDavid Wu { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 }, 268749c55878SDavid Wu { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 }, 268849c55878SDavid Wu { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 }, 268949c55878SDavid Wu { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 }, 269049c55878SDavid Wu { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 }, 269149c55878SDavid Wu { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 }, 269249c55878SDavid Wu { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 }, 269349c55878SDavid Wu { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 }, 269432c25d1fSDavid Wu { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 }, 269549c55878SDavid Wu }; 269649c55878SDavid Wu 269749c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property, 269849c55878SDavid Wu u32 *default_value) 269949c55878SDavid Wu { 270049c55878SDavid Wu const struct pinconf_param *p, *end; 270149c55878SDavid Wu 270249c55878SDavid Wu p = rockchip_conf_params; 270349c55878SDavid Wu end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param); 270449c55878SDavid Wu 270549c55878SDavid Wu /* See if this pctldev supports this parameter */ 270649c55878SDavid Wu for (; p < end; p++) { 270749c55878SDavid Wu if (!strcmp(property, p->property)) { 270849c55878SDavid Wu *default_value = p->default_value; 270949c55878SDavid Wu return p->param; 271049c55878SDavid Wu } 271149c55878SDavid Wu } 271249c55878SDavid Wu 271349c55878SDavid Wu *default_value = 0; 271449c55878SDavid Wu return -EPERM; 271549c55878SDavid Wu } 271649c55878SDavid Wu 271749c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev, 271849c55878SDavid Wu struct udevice *config) 271949c55878SDavid Wu { 272049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 272149c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 272249c55878SDavid Wu u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4]; 272349c55878SDavid Wu u32 bank, pin, mux, conf, arg, default_val; 272449c55878SDavid Wu int ret, count, i; 272549c55878SDavid Wu const char *prop_name; 272649c55878SDavid Wu const void *value; 27272208cfa9SKever Yang int prop_len, param; 27282208cfa9SKever Yang const u32 *data; 27292208cfa9SKever Yang ofnode node; 2730d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 27312208cfa9SKever Yang const struct device_node *np; 27322208cfa9SKever Yang struct property *pp; 27332208cfa9SKever Yang #else 27342208cfa9SKever Yang int property_offset, pcfg_node; 27352208cfa9SKever Yang const void *blob = gd->fdt_blob; 27362208cfa9SKever Yang #endif 27372208cfa9SKever Yang data = dev_read_prop(config, "rockchip,pins", &count); 273849c55878SDavid Wu if (count < 0) { 273987f0ac57SDavid Wu debug("%s: bad array size %d\n", __func__, count); 274049c55878SDavid Wu return -EINVAL; 274149c55878SDavid Wu } 274249c55878SDavid Wu 274387f0ac57SDavid Wu count /= sizeof(u32); 274449c55878SDavid Wu if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) { 274549c55878SDavid Wu debug("%s: unsupported pins array count %d\n", 274649c55878SDavid Wu __func__, count); 274749c55878SDavid Wu return -EINVAL; 274849c55878SDavid Wu } 274949c55878SDavid Wu 275087f0ac57SDavid Wu for (i = 0; i < count; i++) 275187f0ac57SDavid Wu cells[i] = fdt32_to_cpu(data[i]); 275287f0ac57SDavid Wu 275349c55878SDavid Wu for (i = 0; i < (count >> 2); i++) { 275449c55878SDavid Wu bank = cells[4 * i + 0]; 275549c55878SDavid Wu pin = cells[4 * i + 1]; 275649c55878SDavid Wu mux = cells[4 * i + 2]; 275749c55878SDavid Wu conf = cells[4 * i + 3]; 275849c55878SDavid Wu 275949c55878SDavid Wu ret = rockchip_verify_config(dev, bank, pin); 276049c55878SDavid Wu if (ret) 276149c55878SDavid Wu return ret; 276249c55878SDavid Wu 276349c55878SDavid Wu ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux); 276449c55878SDavid Wu if (ret) 276549c55878SDavid Wu return ret; 276649c55878SDavid Wu 27672208cfa9SKever Yang node = ofnode_get_by_phandle(conf); 27682208cfa9SKever Yang if (!ofnode_valid(node)) 276949c55878SDavid Wu return -ENODEV; 2770d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 27712208cfa9SKever Yang np = ofnode_to_np(node); 27722208cfa9SKever Yang for (pp = np->properties; pp; pp = pp->next) { 27732208cfa9SKever Yang prop_name = pp->name; 27742208cfa9SKever Yang prop_len = pp->length; 27752208cfa9SKever Yang value = pp->value; 27762208cfa9SKever Yang #else 27772208cfa9SKever Yang pcfg_node = ofnode_to_offset(node); 277849c55878SDavid Wu fdt_for_each_property_offset(property_offset, blob, pcfg_node) { 277949c55878SDavid Wu value = fdt_getprop_by_offset(blob, property_offset, 278049c55878SDavid Wu &prop_name, &prop_len); 278149c55878SDavid Wu if (!value) 278249c55878SDavid Wu return -ENOENT; 27832208cfa9SKever Yang #endif 278449c55878SDavid Wu param = rockchip_pinconf_prop_name_to_param(prop_name, 278549c55878SDavid Wu &default_val); 278649c55878SDavid Wu if (param < 0) 278749c55878SDavid Wu break; 278849c55878SDavid Wu 278949c55878SDavid Wu if (prop_len >= sizeof(fdt32_t)) 279049c55878SDavid Wu arg = fdt32_to_cpu(*(fdt32_t *)value); 279149c55878SDavid Wu else 279249c55878SDavid Wu arg = default_val; 279349c55878SDavid Wu 279449c55878SDavid Wu ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin, 279549c55878SDavid Wu param, arg); 279649c55878SDavid Wu if (ret) { 279749c55878SDavid Wu debug("%s: rockchip_pinconf_set fail: %d\n", 279849c55878SDavid Wu __func__, ret); 279949c55878SDavid Wu return ret; 280049c55878SDavid Wu } 280149c55878SDavid Wu } 280249c55878SDavid Wu } 280349c55878SDavid Wu 280449c55878SDavid Wu return 0; 280549c55878SDavid Wu } 280649c55878SDavid Wu 280749c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = { 280849c55878SDavid Wu .set_state = rockchip_pinctrl_set_state, 280949c55878SDavid Wu .get_gpio_mux = rockchip_pinctrl_get_gpio_mux, 281049c55878SDavid Wu }; 281149c55878SDavid Wu 2812d5517017SDavid Wu /* Ctrl data specially handle */ 2813d5517017SDavid Wu static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl) 2814d5517017SDavid Wu { 2815d5517017SDavid Wu /* 2816d5517017SDavid Wu * Special for rk3308b, where we need to replace the recalced 2817d5517017SDavid Wu * and routed arrays. 2818d5517017SDavid Wu */ 2819d5517017SDavid Wu if (soc_is_rk3308b()) { 2820d5517017SDavid Wu ctrl->iomux_recalced = rk3308b_mux_recalced_data; 2821d5517017SDavid Wu ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data); 2822d5517017SDavid Wu ctrl->iomux_routes = rk3308b_mux_route_data; 2823d5517017SDavid Wu ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data); 2824d5517017SDavid Wu } 2825d5517017SDavid Wu 2826d5517017SDavid Wu return 0; 2827d5517017SDavid Wu } 2828d5517017SDavid Wu 282949c55878SDavid Wu /* retrieve the soc specific data */ 283049c55878SDavid Wu static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct udevice *dev) 283149c55878SDavid Wu { 283249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 283349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = 283449c55878SDavid Wu (struct rockchip_pin_ctrl *)dev_get_driver_data(dev); 283549c55878SDavid Wu struct rockchip_pin_bank *bank; 283649c55878SDavid Wu int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; 283749c55878SDavid Wu 283849c55878SDavid Wu grf_offs = ctrl->grf_mux_offset; 283949c55878SDavid Wu pmu_offs = ctrl->pmu_mux_offset; 284049c55878SDavid Wu drv_pmu_offs = ctrl->pmu_drv_offset; 284149c55878SDavid Wu drv_grf_offs = ctrl->grf_drv_offset; 284249c55878SDavid Wu bank = ctrl->pin_banks; 284349c55878SDavid Wu 2844d5517017SDavid Wu /* Ctrl data re-initialize for some Socs */ 2845d5517017SDavid Wu if (ctrl->ctrl_data_re_init) { 2846d5517017SDavid Wu if (ctrl->ctrl_data_re_init(ctrl)) 2847d5517017SDavid Wu return NULL; 2848d5517017SDavid Wu } 2849d5517017SDavid Wu 285049c55878SDavid Wu for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { 285149c55878SDavid Wu int bank_pins = 0; 285249c55878SDavid Wu 285349c55878SDavid Wu bank->priv = priv; 285449c55878SDavid Wu bank->pin_base = ctrl->nr_pins; 285549c55878SDavid Wu ctrl->nr_pins += bank->nr_pins; 285649c55878SDavid Wu 285749c55878SDavid Wu /* calculate iomux and drv offsets */ 285849c55878SDavid Wu for (j = 0; j < 4; j++) { 285949c55878SDavid Wu struct rockchip_iomux *iom = &bank->iomux[j]; 286049c55878SDavid Wu struct rockchip_drv *drv = &bank->drv[j]; 286149c55878SDavid Wu int inc; 286249c55878SDavid Wu 286349c55878SDavid Wu if (bank_pins >= bank->nr_pins) 286449c55878SDavid Wu break; 286549c55878SDavid Wu 286649c55878SDavid Wu /* preset iomux offset value, set new start value */ 286749c55878SDavid Wu if (iom->offset >= 0) { 286849c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 286949c55878SDavid Wu pmu_offs = iom->offset; 287049c55878SDavid Wu else 287149c55878SDavid Wu grf_offs = iom->offset; 287249c55878SDavid Wu } else { /* set current iomux offset */ 287349c55878SDavid Wu iom->offset = (iom->type & IOMUX_SOURCE_PMU) ? 287449c55878SDavid Wu pmu_offs : grf_offs; 287549c55878SDavid Wu } 287649c55878SDavid Wu 287749c55878SDavid Wu /* preset drv offset value, set new start value */ 287849c55878SDavid Wu if (drv->offset >= 0) { 287949c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 288049c55878SDavid Wu drv_pmu_offs = drv->offset; 288149c55878SDavid Wu else 288249c55878SDavid Wu drv_grf_offs = drv->offset; 288349c55878SDavid Wu } else { /* set current drv offset */ 288449c55878SDavid Wu drv->offset = (iom->type & IOMUX_SOURCE_PMU) ? 288549c55878SDavid Wu drv_pmu_offs : drv_grf_offs; 288649c55878SDavid Wu } 288749c55878SDavid Wu 288849c55878SDavid Wu debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n", 288949c55878SDavid Wu i, j, iom->offset, drv->offset); 289049c55878SDavid Wu 289149c55878SDavid Wu /* 289249c55878SDavid Wu * Increase offset according to iomux width. 289349c55878SDavid Wu * 4bit iomux'es are spread over two registers. 289449c55878SDavid Wu */ 289549c55878SDavid Wu inc = (iom->type & (IOMUX_WIDTH_4BIT | 289688a1f7ffSDavid Wu IOMUX_WIDTH_3BIT | 289788a1f7ffSDavid Wu IOMUX_8WIDTH_2BIT)) ? 8 : 4; 289849c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 289949c55878SDavid Wu pmu_offs += inc; 290049c55878SDavid Wu else 290149c55878SDavid Wu grf_offs += inc; 290249c55878SDavid Wu 290349c55878SDavid Wu /* 290449c55878SDavid Wu * Increase offset according to drv width. 290549c55878SDavid Wu * 3bit drive-strenth'es are spread over two registers. 290649c55878SDavid Wu */ 290749c55878SDavid Wu if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 290849c55878SDavid Wu (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) 290949c55878SDavid Wu inc = 8; 291049c55878SDavid Wu else 291149c55878SDavid Wu inc = 4; 291249c55878SDavid Wu 291349c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 291449c55878SDavid Wu drv_pmu_offs += inc; 291549c55878SDavid Wu else 291649c55878SDavid Wu drv_grf_offs += inc; 291749c55878SDavid Wu 291849c55878SDavid Wu bank_pins += 8; 291949c55878SDavid Wu } 292049c55878SDavid Wu 292149c55878SDavid Wu /* calculate the per-bank recalced_mask */ 292249c55878SDavid Wu for (j = 0; j < ctrl->niomux_recalced; j++) { 292349c55878SDavid Wu int pin = 0; 292449c55878SDavid Wu 292549c55878SDavid Wu if (ctrl->iomux_recalced[j].num == bank->bank_num) { 292649c55878SDavid Wu pin = ctrl->iomux_recalced[j].pin; 292749c55878SDavid Wu bank->recalced_mask |= BIT(pin); 292849c55878SDavid Wu } 292949c55878SDavid Wu } 293049c55878SDavid Wu 293149c55878SDavid Wu /* calculate the per-bank route_mask */ 293249c55878SDavid Wu for (j = 0; j < ctrl->niomux_routes; j++) { 293349c55878SDavid Wu int pin = 0; 293449c55878SDavid Wu 293549c55878SDavid Wu if (ctrl->iomux_routes[j].bank_num == bank->bank_num) { 293649c55878SDavid Wu pin = ctrl->iomux_routes[j].pin; 293749c55878SDavid Wu bank->route_mask |= BIT(pin); 293849c55878SDavid Wu } 293949c55878SDavid Wu } 294049c55878SDavid Wu } 294149c55878SDavid Wu 294249c55878SDavid Wu return ctrl; 294349c55878SDavid Wu } 294449c55878SDavid Wu 2945d5517017SDavid Wu /* SoC data specially handle */ 2946d5517017SDavid Wu 2947d5517017SDavid Wu /* rk3308b SoC data initialize */ 2948d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13 0x608 2949d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15 0x610 2950d5517017SDavid Wu 2951d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */ 2952d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10)) 2953d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 2954d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 2955d5517017SDavid Wu 2956d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */ 2957d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11)) 2958d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 2959d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 2960d5517017SDavid Wu 2961d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv) 2962d5517017SDavid Wu { 2963d5517017SDavid Wu int ret; 2964d5517017SDavid Wu 2965d5517017SDavid Wu /* 2966d5517017SDavid Wu * Enable the special ctrl of selected sources. 2967d5517017SDavid Wu */ 2968d5517017SDavid Wu if (soc_is_rk3308b()) { 2969d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13, 2970d5517017SDavid Wu RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL | 2971d5517017SDavid Wu RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL | 2972d5517017SDavid Wu RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL); 2973d5517017SDavid Wu if (ret) 2974d5517017SDavid Wu return ret; 2975d5517017SDavid Wu 2976d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15, 2977d5517017SDavid Wu RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL | 2978d5517017SDavid Wu RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL | 2979d5517017SDavid Wu RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL); 2980d5517017SDavid Wu if (ret) 2981d5517017SDavid Wu return ret; 2982d5517017SDavid Wu } 2983d5517017SDavid Wu 2984d5517017SDavid Wu return 0; 2985d5517017SDavid Wu } 2986d5517017SDavid Wu 298749c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev) 298849c55878SDavid Wu { 298949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 299049c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 299149c55878SDavid Wu struct udevice *syscon; 299249c55878SDavid Wu struct regmap *regmap; 299349c55878SDavid Wu int ret = 0; 299449c55878SDavid Wu 299549c55878SDavid Wu /* get rockchip grf syscon phandle */ 299649c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf", 299749c55878SDavid Wu &syscon); 299849c55878SDavid Wu if (ret) { 299949c55878SDavid Wu debug("unable to find rockchip,grf syscon device (%d)\n", ret); 300049c55878SDavid Wu return ret; 300149c55878SDavid Wu } 300249c55878SDavid Wu 300349c55878SDavid Wu /* get grf-reg base address */ 300449c55878SDavid Wu regmap = syscon_get_regmap(syscon); 300549c55878SDavid Wu if (!regmap) { 300649c55878SDavid Wu debug("unable to find rockchip grf regmap\n"); 300749c55878SDavid Wu return -ENODEV; 300849c55878SDavid Wu } 300949c55878SDavid Wu priv->regmap_base = regmap; 301049c55878SDavid Wu 301149c55878SDavid Wu /* option: get pmu-reg base address */ 301249c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu", 301349c55878SDavid Wu &syscon); 301449c55878SDavid Wu if (!ret) { 301549c55878SDavid Wu /* get pmugrf-reg base address */ 301649c55878SDavid Wu regmap = syscon_get_regmap(syscon); 301749c55878SDavid Wu if (!regmap) { 301849c55878SDavid Wu debug("unable to find rockchip pmu regmap\n"); 301949c55878SDavid Wu return -ENODEV; 302049c55878SDavid Wu } 302149c55878SDavid Wu priv->regmap_pmu = regmap; 302249c55878SDavid Wu } 302349c55878SDavid Wu 302449c55878SDavid Wu ctrl = rockchip_pinctrl_get_soc_data(dev); 302549c55878SDavid Wu if (!ctrl) { 302649c55878SDavid Wu debug("driver data not available\n"); 302749c55878SDavid Wu return -EINVAL; 302849c55878SDavid Wu } 302949c55878SDavid Wu 3030d5517017SDavid Wu /* Special handle for some Socs */ 3031d5517017SDavid Wu if (ctrl->soc_data_init) { 3032d5517017SDavid Wu ret = ctrl->soc_data_init(priv); 3033d5517017SDavid Wu if (ret) 3034d5517017SDavid Wu return ret; 3035d5517017SDavid Wu } 3036d5517017SDavid Wu 303749c55878SDavid Wu priv->ctrl = ctrl; 303849c55878SDavid Wu return 0; 303949c55878SDavid Wu } 304049c55878SDavid Wu 304149c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = { 304249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 304349c55878SDavid Wu IOMUX_SOURCE_PMU, 304449c55878SDavid Wu IOMUX_SOURCE_PMU, 304549c55878SDavid Wu IOMUX_SOURCE_PMU 304649c55878SDavid Wu ), 304749c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, 304849c55878SDavid Wu IOMUX_WIDTH_4BIT, 304949c55878SDavid Wu IOMUX_WIDTH_4BIT, 305049c55878SDavid Wu IOMUX_WIDTH_4BIT 305149c55878SDavid Wu ), 305249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, 305349c55878SDavid Wu IOMUX_WIDTH_4BIT, 305449c55878SDavid Wu IOMUX_WIDTH_4BIT, 305549c55878SDavid Wu IOMUX_WIDTH_4BIT 305649c55878SDavid Wu ), 305749c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, 305849c55878SDavid Wu IOMUX_WIDTH_4BIT, 305949c55878SDavid Wu IOMUX_WIDTH_4BIT, 306049c55878SDavid Wu IOMUX_WIDTH_4BIT 306149c55878SDavid Wu ), 306249c55878SDavid Wu }; 306349c55878SDavid Wu 306449c55878SDavid Wu static struct rockchip_pin_ctrl px30_pin_ctrl = { 306549c55878SDavid Wu .pin_banks = px30_pin_banks, 306649c55878SDavid Wu .nr_banks = ARRAY_SIZE(px30_pin_banks), 306749c55878SDavid Wu .label = "PX30-GPIO", 306849c55878SDavid Wu .type = PX30, 306949c55878SDavid Wu .grf_mux_offset = 0x0, 307049c55878SDavid Wu .pmu_mux_offset = 0x0, 307149c55878SDavid Wu .iomux_routes = px30_mux_route_data, 307249c55878SDavid Wu .niomux_routes = ARRAY_SIZE(px30_mux_route_data), 307349c55878SDavid Wu .pull_calc_reg = px30_calc_pull_reg_and_bit, 307449c55878SDavid Wu .drv_calc_reg = px30_calc_drv_reg_and_bit, 307549c55878SDavid Wu .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, 307632c25d1fSDavid Wu .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit, 307749c55878SDavid Wu }; 307849c55878SDavid Wu 307949c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = { 308049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 308149c55878SDavid Wu IOMUX_SOURCE_PMU, 308249c55878SDavid Wu IOMUX_SOURCE_PMU, 308349c55878SDavid Wu IOMUX_SOURCE_PMU), 308449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 308549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0), 308649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0), 308749c55878SDavid Wu }; 308849c55878SDavid Wu 308949c55878SDavid Wu static struct rockchip_pin_ctrl rv1108_pin_ctrl = { 309049c55878SDavid Wu .pin_banks = rv1108_pin_banks, 309149c55878SDavid Wu .nr_banks = ARRAY_SIZE(rv1108_pin_banks), 309249c55878SDavid Wu .label = "RV1108-GPIO", 309349c55878SDavid Wu .type = RV1108, 309449c55878SDavid Wu .grf_mux_offset = 0x10, 309549c55878SDavid Wu .pmu_mux_offset = 0x0, 309649c55878SDavid Wu .iomux_recalced = rv1108_mux_recalced_data, 309749c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data), 309849c55878SDavid Wu .pull_calc_reg = rv1108_calc_pull_reg_and_bit, 309949c55878SDavid Wu .drv_calc_reg = rv1108_calc_drv_reg_and_bit, 310049c55878SDavid Wu .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit, 310149c55878SDavid Wu }; 310249c55878SDavid Wu 3103*cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = { 3104*cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 3105*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 3106*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 3107*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU, 3108*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3109*cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 3110*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3111*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3112*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3113*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3114*cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 3115*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3116*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3117*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3118*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3119*cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 3120*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3121*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3122*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3123*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3124*cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4", 3125*cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 0, 0, 0), 3126*cf04a17bSJianqun Xu }; 3127*cf04a17bSJianqun Xu 3128*cf04a17bSJianqun Xu static struct rockchip_pin_ctrl rv1126_pin_ctrl = { 3129*cf04a17bSJianqun Xu .pin_banks = rv1126_pin_banks, 3130*cf04a17bSJianqun Xu .nr_banks = ARRAY_SIZE(rv1126_pin_banks), 3131*cf04a17bSJianqun Xu .label = "RV1126-GPIO", 3132*cf04a17bSJianqun Xu .type = RV1126, 3133*cf04a17bSJianqun Xu .grf_mux_offset = 0x10004, /* mux offset from GPIO0_D0 */ 3134*cf04a17bSJianqun Xu .pmu_mux_offset = 0x0, 3135*cf04a17bSJianqun Xu .iomux_recalced = rv1126_mux_recalced_data, 3136*cf04a17bSJianqun Xu .niomux_recalced = ARRAY_SIZE(rv1126_mux_recalced_data), 3137*cf04a17bSJianqun Xu .pull_calc_reg = rv1126_calc_pull_reg_and_bit, 3138*cf04a17bSJianqun Xu .drv_calc_reg = rv1126_calc_drv_reg_and_bit, 3139*cf04a17bSJianqun Xu .schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit, 3140*cf04a17bSJianqun Xu }; 3141*cf04a17bSJianqun Xu 3142a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = { 3143a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 3144a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3145a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3146a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3147a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU), 3148a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 3149a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3150a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3151a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3152a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3153a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 3154a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3155a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3156a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3157a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3158a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 3159a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3160a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3161a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3162a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3163a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", 3164a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3165a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3166a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3167a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3168a2a3fc8fSJianqun Xu }; 3169a2a3fc8fSJianqun Xu 3170a2a3fc8fSJianqun Xu static struct rockchip_pin_ctrl rk1808_pin_ctrl = { 3171a2a3fc8fSJianqun Xu .pin_banks = rk1808_pin_banks, 3172a2a3fc8fSJianqun Xu .nr_banks = ARRAY_SIZE(rk1808_pin_banks), 3173a2a3fc8fSJianqun Xu .label = "RK1808-GPIO", 3174a2a3fc8fSJianqun Xu .type = RK1808, 3175a2a3fc8fSJianqun Xu .iomux_routes = rk1808_mux_route_data, 3176a2a3fc8fSJianqun Xu .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data), 3177a2a3fc8fSJianqun Xu .grf_mux_offset = 0x0, 3178a2a3fc8fSJianqun Xu .pmu_mux_offset = 0x0, 3179a2a3fc8fSJianqun Xu .pull_calc_reg = rk1808_calc_pull_reg_and_bit, 3180a2a3fc8fSJianqun Xu .drv_calc_reg = rk1808_calc_drv_reg_and_bit, 3181a2a3fc8fSJianqun Xu .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit, 3182a2a3fc8fSJianqun Xu }; 3183a2a3fc8fSJianqun Xu 318449c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = { 318549c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 318649c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 318749c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 318849c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 318949c55878SDavid Wu }; 319049c55878SDavid Wu 319149c55878SDavid Wu static struct rockchip_pin_ctrl rk2928_pin_ctrl = { 319249c55878SDavid Wu .pin_banks = rk2928_pin_banks, 319349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 319449c55878SDavid Wu .label = "RK2928-GPIO", 319549c55878SDavid Wu .type = RK2928, 319649c55878SDavid Wu .grf_mux_offset = 0xa8, 319749c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 319849c55878SDavid Wu }; 319949c55878SDavid Wu 320049c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = { 320149c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 320249c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 320349c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 320449c55878SDavid Wu }; 320549c55878SDavid Wu 320649c55878SDavid Wu static struct rockchip_pin_ctrl rk3036_pin_ctrl = { 320749c55878SDavid Wu .pin_banks = rk3036_pin_banks, 320849c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3036_pin_banks), 320949c55878SDavid Wu .label = "RK3036-GPIO", 321049c55878SDavid Wu .type = RK2928, 321149c55878SDavid Wu .grf_mux_offset = 0xa8, 321249c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 321349c55878SDavid Wu }; 321449c55878SDavid Wu 321549c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = { 321649c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 321749c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 321849c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 321949c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 322049c55878SDavid Wu PIN_BANK(4, 32, "gpio4"), 322149c55878SDavid Wu PIN_BANK(6, 16, "gpio6"), 322249c55878SDavid Wu }; 322349c55878SDavid Wu 322449c55878SDavid Wu static struct rockchip_pin_ctrl rk3066a_pin_ctrl = { 322549c55878SDavid Wu .pin_banks = rk3066a_pin_banks, 322649c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 322749c55878SDavid Wu .label = "RK3066a-GPIO", 322849c55878SDavid Wu .type = RK2928, 322949c55878SDavid Wu .grf_mux_offset = 0xa8, 323049c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 323149c55878SDavid Wu }; 323249c55878SDavid Wu 323349c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = { 323449c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 323549c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 323649c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 323749c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 323849c55878SDavid Wu }; 323949c55878SDavid Wu 324049c55878SDavid Wu static struct rockchip_pin_ctrl rk3066b_pin_ctrl = { 324149c55878SDavid Wu .pin_banks = rk3066b_pin_banks, 324249c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 324349c55878SDavid Wu .label = "RK3066b-GPIO", 324449c55878SDavid Wu .type = RK3066B, 324549c55878SDavid Wu .grf_mux_offset = 0x60, 324649c55878SDavid Wu }; 324749c55878SDavid Wu 324849c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = { 324949c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 325049c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 325149c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 325249c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 325349c55878SDavid Wu }; 325449c55878SDavid Wu 325549c55878SDavid Wu static struct rockchip_pin_ctrl rk3128_pin_ctrl = { 325649c55878SDavid Wu .pin_banks = rk3128_pin_banks, 325749c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3128_pin_banks), 325849c55878SDavid Wu .label = "RK3128-GPIO", 325949c55878SDavid Wu .type = RK3128, 326049c55878SDavid Wu .grf_mux_offset = 0xa8, 326149c55878SDavid Wu .iomux_recalced = rk3128_mux_recalced_data, 326249c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data), 326349c55878SDavid Wu .iomux_routes = rk3128_mux_route_data, 326449c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data), 326549c55878SDavid Wu .pull_calc_reg = rk3128_calc_pull_reg_and_bit, 326649c55878SDavid Wu }; 326749c55878SDavid Wu 326849c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = { 326949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0), 327049c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 327149c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 327249c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 327349c55878SDavid Wu }; 327449c55878SDavid Wu 327549c55878SDavid Wu static struct rockchip_pin_ctrl rk3188_pin_ctrl = { 327649c55878SDavid Wu .pin_banks = rk3188_pin_banks, 327749c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 327849c55878SDavid Wu .label = "RK3188-GPIO", 327949c55878SDavid Wu .type = RK3188, 328049c55878SDavid Wu .grf_mux_offset = 0x60, 328149c55878SDavid Wu .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 328249c55878SDavid Wu }; 328349c55878SDavid Wu 328449c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = { 328549c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 328649c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 328749c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 328849c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 328949c55878SDavid Wu }; 329049c55878SDavid Wu 329149c55878SDavid Wu static struct rockchip_pin_ctrl rk3228_pin_ctrl = { 329249c55878SDavid Wu .pin_banks = rk3228_pin_banks, 329349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3228_pin_banks), 329449c55878SDavid Wu .label = "RK3228-GPIO", 329549c55878SDavid Wu .type = RK3288, 329649c55878SDavid Wu .grf_mux_offset = 0x0, 329749c55878SDavid Wu .iomux_routes = rk3228_mux_route_data, 329849c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data), 329949c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 330049c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 330149c55878SDavid Wu }; 330249c55878SDavid Wu 330349c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = { 330455a89bc6SDavid Wu PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0", 33054bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 33064bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 330755a89bc6SDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 330855a89bc6SDavid Wu IOMUX_UNROUTED, 330955a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 331055a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 331155a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 331255a89bc6SDavid Wu 0, 331355a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 331455a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 331555a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 331655a89bc6SDavid Wu 0 331749c55878SDavid Wu ), 331849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED, 331949c55878SDavid Wu IOMUX_UNROUTED, 332049c55878SDavid Wu IOMUX_UNROUTED, 332149c55878SDavid Wu 0 332249c55878SDavid Wu ), 332349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED), 332449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT), 332549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, 332649c55878SDavid Wu IOMUX_WIDTH_4BIT, 332749c55878SDavid Wu 0, 332849c55878SDavid Wu 0 332949c55878SDavid Wu ), 333049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED, 333149c55878SDavid Wu 0, 333249c55878SDavid Wu 0, 333349c55878SDavid Wu IOMUX_UNROUTED 333449c55878SDavid Wu ), 333549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED), 333649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0, 333749c55878SDavid Wu 0, 333849c55878SDavid Wu IOMUX_WIDTH_4BIT, 333949c55878SDavid Wu IOMUX_UNROUTED 334049c55878SDavid Wu ), 334149c55878SDavid Wu PIN_BANK(8, 16, "gpio8"), 334249c55878SDavid Wu }; 334349c55878SDavid Wu 334449c55878SDavid Wu static struct rockchip_pin_ctrl rk3288_pin_ctrl = { 334549c55878SDavid Wu .pin_banks = rk3288_pin_banks, 334649c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3288_pin_banks), 334749c55878SDavid Wu .label = "RK3288-GPIO", 334849c55878SDavid Wu .type = RK3288, 334949c55878SDavid Wu .grf_mux_offset = 0x0, 335049c55878SDavid Wu .pmu_mux_offset = 0x84, 335149c55878SDavid Wu .iomux_routes = rk3288_mux_route_data, 335249c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data), 335349c55878SDavid Wu .pull_calc_reg = rk3288_calc_pull_reg_and_bit, 335449c55878SDavid Wu .drv_calc_reg = rk3288_calc_drv_reg_and_bit, 335549c55878SDavid Wu }; 335649c55878SDavid Wu 3357b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = { 3358b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT, 3359b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3360b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3361b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3362b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT, 3363b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3364b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3365b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3366b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT, 3367b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3368b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3369b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3370b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT, 3371b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3372b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3373b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3374b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT, 3375b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3376b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3377b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3378b3077611SDavid Wu }; 3379b3077611SDavid Wu 3380b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = { 3381b3077611SDavid Wu .pin_banks = rk3308_pin_banks, 3382b3077611SDavid Wu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 3383b3077611SDavid Wu .label = "RK3308-GPIO", 3384b3077611SDavid Wu .type = RK3308, 3385b3077611SDavid Wu .grf_mux_offset = 0x0, 3386b3077611SDavid Wu .iomux_recalced = rk3308_mux_recalced_data, 3387b3077611SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data), 3388b3077611SDavid Wu .iomux_routes = rk3308_mux_route_data, 3389b3077611SDavid Wu .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data), 3390d5517017SDavid Wu .ctrl_data_re_init = rk3308b_ctrl_data_re_init, 3391d5517017SDavid Wu .soc_data_init = rk3308b_soc_data_init, 3392b3077611SDavid Wu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 3393b3077611SDavid Wu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 3394b3077611SDavid Wu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 3395b3077611SDavid Wu }; 3396b3077611SDavid Wu 339749c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = { 339849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0), 339949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 340049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 340149c55878SDavid Wu IOMUX_WIDTH_3BIT, 340249c55878SDavid Wu IOMUX_WIDTH_3BIT, 340349c55878SDavid Wu 0), 340449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 340549c55878SDavid Wu IOMUX_WIDTH_3BIT, 340649c55878SDavid Wu IOMUX_WIDTH_3BIT, 340749c55878SDavid Wu 0, 340849c55878SDavid Wu 0), 340949c55878SDavid Wu }; 341049c55878SDavid Wu 341149c55878SDavid Wu static struct rockchip_pin_ctrl rk3328_pin_ctrl = { 341249c55878SDavid Wu .pin_banks = rk3328_pin_banks, 341349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3328_pin_banks), 341449c55878SDavid Wu .label = "RK3328-GPIO", 341549c55878SDavid Wu .type = RK3288, 341649c55878SDavid Wu .grf_mux_offset = 0x0, 341749c55878SDavid Wu .iomux_recalced = rk3328_mux_recalced_data, 341849c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data), 341949c55878SDavid Wu .iomux_routes = rk3328_mux_route_data, 342049c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data), 342149c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 342249c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 342349c55878SDavid Wu .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit, 342449c55878SDavid Wu }; 342549c55878SDavid Wu 342649c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = { 342749c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 342849c55878SDavid Wu IOMUX_SOURCE_PMU, 342949c55878SDavid Wu IOMUX_SOURCE_PMU, 343049c55878SDavid Wu IOMUX_SOURCE_PMU 343149c55878SDavid Wu ), 343249c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 343349c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 343449c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 343549c55878SDavid Wu }; 343649c55878SDavid Wu 343749c55878SDavid Wu static struct rockchip_pin_ctrl rk3368_pin_ctrl = { 343849c55878SDavid Wu .pin_banks = rk3368_pin_banks, 343949c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3368_pin_banks), 344049c55878SDavid Wu .label = "RK3368-GPIO", 344149c55878SDavid Wu .type = RK3368, 344249c55878SDavid Wu .grf_mux_offset = 0x0, 344349c55878SDavid Wu .pmu_mux_offset = 0x0, 344449c55878SDavid Wu .pull_calc_reg = rk3368_calc_pull_reg_and_bit, 344549c55878SDavid Wu .drv_calc_reg = rk3368_calc_drv_reg_and_bit, 344649c55878SDavid Wu }; 344749c55878SDavid Wu 344849c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = { 344949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0", 345049c55878SDavid Wu IOMUX_SOURCE_PMU, 345149c55878SDavid Wu IOMUX_SOURCE_PMU, 345249c55878SDavid Wu IOMUX_SOURCE_PMU, 345349c55878SDavid Wu IOMUX_SOURCE_PMU, 345449c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 345549c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 345649c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 345749c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 345849c55878SDavid Wu 0x80, 345949c55878SDavid Wu 0x88, 346049c55878SDavid Wu -1, 346149c55878SDavid Wu -1, 346249c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 346349c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 346449c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 346549c55878SDavid Wu PULL_TYPE_IO_DEFAULT 346649c55878SDavid Wu ), 346749c55878SDavid Wu PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU, 346849c55878SDavid Wu IOMUX_SOURCE_PMU, 346949c55878SDavid Wu IOMUX_SOURCE_PMU, 347049c55878SDavid Wu IOMUX_SOURCE_PMU, 347149c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 347249c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 347349c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 347449c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 347549c55878SDavid Wu 0xa0, 347649c55878SDavid Wu 0xa8, 347749c55878SDavid Wu 0xb0, 347849c55878SDavid Wu 0xb8 347949c55878SDavid Wu ), 348049c55878SDavid Wu PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0, 348149c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 348249c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 348349c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 348449c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 348549c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 348649c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 348749c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY 348849c55878SDavid Wu ), 348949c55878SDavid Wu PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY, 349049c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 349149c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 349249c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 349349c55878SDavid Wu ), 349449c55878SDavid Wu PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0, 349549c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 349649c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 349749c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 349849c55878SDavid Wu ), 349949c55878SDavid Wu }; 350049c55878SDavid Wu 350149c55878SDavid Wu static struct rockchip_pin_ctrl rk3399_pin_ctrl = { 350249c55878SDavid Wu .pin_banks = rk3399_pin_banks, 350349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3399_pin_banks), 350449c55878SDavid Wu .label = "RK3399-GPIO", 350549c55878SDavid Wu .type = RK3399, 350649c55878SDavid Wu .grf_mux_offset = 0xe000, 350749c55878SDavid Wu .pmu_mux_offset = 0x0, 350849c55878SDavid Wu .grf_drv_offset = 0xe100, 350949c55878SDavid Wu .pmu_drv_offset = 0x80, 351049c55878SDavid Wu .iomux_routes = rk3399_mux_route_data, 351149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data), 351249c55878SDavid Wu .pull_calc_reg = rk3399_calc_pull_reg_and_bit, 351349c55878SDavid Wu .drv_calc_reg = rk3399_calc_drv_reg_and_bit, 351449c55878SDavid Wu }; 351549c55878SDavid Wu 351649c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = { 351749c55878SDavid Wu { .compatible = "rockchip,px30-pinctrl", 351849c55878SDavid Wu .data = (ulong)&px30_pin_ctrl }, 351949c55878SDavid Wu { .compatible = "rockchip,rv1108-pinctrl", 352049c55878SDavid Wu .data = (ulong)&rv1108_pin_ctrl }, 3521*cf04a17bSJianqun Xu { .compatible = "rockchip,rv1126-pinctrl", 3522*cf04a17bSJianqun Xu .data = (ulong)&rv1126_pin_ctrl }, 3523a2a3fc8fSJianqun Xu { .compatible = "rockchip,rk1808-pinctrl", 3524a2a3fc8fSJianqun Xu .data = (ulong)&rk1808_pin_ctrl }, 352549c55878SDavid Wu { .compatible = "rockchip,rk2928-pinctrl", 352649c55878SDavid Wu .data = (ulong)&rk2928_pin_ctrl }, 352749c55878SDavid Wu { .compatible = "rockchip,rk3036-pinctrl", 352849c55878SDavid Wu .data = (ulong)&rk3036_pin_ctrl }, 352949c55878SDavid Wu { .compatible = "rockchip,rk3066a-pinctrl", 353049c55878SDavid Wu .data = (ulong)&rk3066a_pin_ctrl }, 353149c55878SDavid Wu { .compatible = "rockchip,rk3066b-pinctrl", 353249c55878SDavid Wu .data = (ulong)&rk3066b_pin_ctrl }, 353349c55878SDavid Wu { .compatible = "rockchip,rk3128-pinctrl", 353449c55878SDavid Wu .data = (ulong)&rk3128_pin_ctrl }, 353549c55878SDavid Wu { .compatible = "rockchip,rk3188-pinctrl", 353649c55878SDavid Wu .data = (ulong)&rk3188_pin_ctrl }, 353749c55878SDavid Wu { .compatible = "rockchip,rk3228-pinctrl", 353849c55878SDavid Wu .data = (ulong)&rk3228_pin_ctrl }, 353949c55878SDavid Wu { .compatible = "rockchip,rk3288-pinctrl", 354049c55878SDavid Wu .data = (ulong)&rk3288_pin_ctrl }, 3541b3077611SDavid Wu { .compatible = "rockchip,rk3308-pinctrl", 3542b3077611SDavid Wu .data = (ulong)&rk3308_pin_ctrl }, 354349c55878SDavid Wu { .compatible = "rockchip,rk3328-pinctrl", 354449c55878SDavid Wu .data = (ulong)&rk3328_pin_ctrl }, 354549c55878SDavid Wu { .compatible = "rockchip,rk3368-pinctrl", 354649c55878SDavid Wu .data = (ulong)&rk3368_pin_ctrl }, 354749c55878SDavid Wu { .compatible = "rockchip,rk3399-pinctrl", 354849c55878SDavid Wu .data = (ulong)&rk3399_pin_ctrl }, 354949c55878SDavid Wu {}, 355049c55878SDavid Wu }; 355149c55878SDavid Wu 355249c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = { 355349c55878SDavid Wu .name = "rockchip_pinctrl", 355449c55878SDavid Wu .id = UCLASS_PINCTRL, 355549c55878SDavid Wu .of_match = rockchip_pinctrl_dt_match, 355649c55878SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), 355749c55878SDavid Wu .ops = &rockchip_pinctrl_ops, 355849c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA) 355949c55878SDavid Wu .bind = dm_scan_fdt_dev, 356049c55878SDavid Wu #endif 356149c55878SDavid Wu .probe = rockchip_pinctrl_probe, 356249c55878SDavid Wu }; 3563