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> 11d499d466SJianqun Xu #include <linux/bitops.h> 1249c55878SDavid Wu #include <regmap.h> 1349c55878SDavid Wu #include <syscon.h> 14d5517017SDavid Wu #include <asm/arch/cpu.h> 15d499d466SJianqun Xu #include <dt-bindings/pinctrl/rockchip.h> 1649c55878SDavid Wu 1749c55878SDavid Wu #define MAX_ROCKCHIP_GPIO_PER_BANK 32 1849c55878SDavid Wu #define RK_FUNC_GPIO 0 1987f0ac57SDavid Wu #define MAX_ROCKCHIP_PINS_ENTRIES 30 2049c55878SDavid Wu 2149c55878SDavid Wu enum rockchip_pinctrl_type { 2249c55878SDavid Wu PX30, 2349c55878SDavid Wu RV1108, 24cf04a17bSJianqun Xu RV1126, 25a2a3fc8fSJianqun Xu RK1808, 2649c55878SDavid Wu RK2928, 2749c55878SDavid Wu RK3066B, 2849c55878SDavid Wu RK3128, 2949c55878SDavid Wu RK3188, 3049c55878SDavid Wu RK3288, 31b3077611SDavid Wu RK3308, 3249c55878SDavid Wu RK3368, 3349c55878SDavid Wu RK3399, 3449c55878SDavid Wu }; 3549c55878SDavid Wu 36cef897f0SJianqun Xu #define RK_GENMASK_VAL(h, l, v) \ 37cef897f0SJianqun Xu (GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l)))) 38d499d466SJianqun Xu 3949c55878SDavid Wu /** 4049c55878SDavid Wu * Encode variants of iomux registers into a type variable 4149c55878SDavid Wu */ 4249c55878SDavid Wu #define IOMUX_GPIO_ONLY BIT(0) 4349c55878SDavid Wu #define IOMUX_WIDTH_4BIT BIT(1) 4449c55878SDavid Wu #define IOMUX_SOURCE_PMU BIT(2) 4549c55878SDavid Wu #define IOMUX_UNROUTED BIT(3) 4649c55878SDavid Wu #define IOMUX_WIDTH_3BIT BIT(4) 47b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT BIT(5) 484bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT BIT(6) 49cf04a17bSJianqun Xu #define IOMUX_L_SOURCE_PMU BIT(7) 5049c55878SDavid Wu 5149c55878SDavid Wu /** 5249c55878SDavid Wu * @type: iomux variant using IOMUX_* constants 5349c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 5449c55878SDavid Wu * an initial offset value the relevant source offset can be reset 5549c55878SDavid Wu * to a new value for autocalculating the following iomux registers. 5649c55878SDavid Wu */ 5749c55878SDavid Wu struct rockchip_iomux { 5849c55878SDavid Wu int type; 5949c55878SDavid Wu int offset; 6049c55878SDavid Wu }; 6149c55878SDavid Wu 6255a89bc6SDavid Wu #define DRV_TYPE_IO_MASK GENMASK(31, 16) 6355a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT BIT(31) 6455a89bc6SDavid Wu 6549c55878SDavid Wu /** 6649c55878SDavid Wu * enum type index corresponding to rockchip_perpin_drv_list arrays index. 6749c55878SDavid Wu */ 6849c55878SDavid Wu enum rockchip_pin_drv_type { 6949c55878SDavid Wu DRV_TYPE_IO_DEFAULT = 0, 7049c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 7149c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 7249c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 7349c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 7449c55878SDavid Wu DRV_TYPE_MAX 7549c55878SDavid Wu }; 7649c55878SDavid Wu 7755a89bc6SDavid Wu #define PULL_TYPE_IO_MASK GENMASK(31, 16) 7855a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT BIT(31) 7955a89bc6SDavid Wu 8049c55878SDavid Wu /** 8149c55878SDavid Wu * enum type index corresponding to rockchip_pull_list arrays index. 8249c55878SDavid Wu */ 8349c55878SDavid Wu enum rockchip_pin_pull_type { 8449c55878SDavid Wu PULL_TYPE_IO_DEFAULT = 0, 8549c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 8649c55878SDavid Wu PULL_TYPE_MAX 8749c55878SDavid Wu }; 8849c55878SDavid Wu 8949c55878SDavid Wu /** 9049e04eddSJianqun Xu * enum mux route register type, should be invalid/default/topgrf/pmugrf. 9149e04eddSJianqun Xu * INVALID: means do not need to set mux route 9249e04eddSJianqun Xu * DEFAULT: means same regmap as pin iomux 9349e04eddSJianqun Xu * TOPGRF: means mux route setting in topgrf 9449e04eddSJianqun Xu * PMUGRF: means mux route setting in pmugrf 9549e04eddSJianqun Xu */ 9649e04eddSJianqun Xu enum rockchip_pin_route_type { 9749e04eddSJianqun Xu ROUTE_TYPE_DEFAULT = 0, 9849e04eddSJianqun Xu ROUTE_TYPE_TOPGRF = 1, 9949e04eddSJianqun Xu ROUTE_TYPE_PMUGRF = 2, 10049e04eddSJianqun Xu 10149e04eddSJianqun Xu ROUTE_TYPE_INVALID = -1, 10249e04eddSJianqun Xu }; 10349e04eddSJianqun Xu 10449e04eddSJianqun Xu /** 10549c55878SDavid Wu * @drv_type: drive strength variant using rockchip_perpin_drv_type 10649c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 10749c55878SDavid Wu * an initial offset value the relevant source offset can be reset 10849c55878SDavid Wu * to a new value for autocalculating the following drive strength 10949c55878SDavid Wu * registers. if used chips own cal_drv func instead to calculate 11049c55878SDavid Wu * registers offset, the variant could be ignored. 11149c55878SDavid Wu */ 11249c55878SDavid Wu struct rockchip_drv { 11349c55878SDavid Wu enum rockchip_pin_drv_type drv_type; 11449c55878SDavid Wu int offset; 11549c55878SDavid Wu }; 11649c55878SDavid Wu 11749c55878SDavid Wu /** 11849c55878SDavid Wu * @priv: common pinctrl private basedata 11949c55878SDavid Wu * @pin_base: first pin number 12049c55878SDavid Wu * @nr_pins: number of pins in this bank 12149c55878SDavid Wu * @name: name of the bank 12249c55878SDavid Wu * @bank_num: number of the bank, to account for holes 12349c55878SDavid Wu * @iomux: array describing the 4 iomux sources of the bank 12449c55878SDavid Wu * @drv: array describing the 4 drive strength sources of the bank 12549c55878SDavid Wu * @pull_type: array describing the 4 pull type sources of the bank 12649c55878SDavid Wu * @recalced_mask: bits describing the mux recalced pins of per bank 12749c55878SDavid Wu * @route_mask: bits describing the routing pins of per bank 12849c55878SDavid Wu */ 12949c55878SDavid Wu struct rockchip_pin_bank { 13049c55878SDavid Wu struct rockchip_pinctrl_priv *priv; 13149c55878SDavid Wu u32 pin_base; 13249c55878SDavid Wu u8 nr_pins; 13349c55878SDavid Wu char *name; 13449c55878SDavid Wu u8 bank_num; 13549c55878SDavid Wu struct rockchip_iomux iomux[4]; 13649c55878SDavid Wu struct rockchip_drv drv[4]; 13749c55878SDavid Wu enum rockchip_pin_pull_type pull_type[4]; 13849c55878SDavid Wu u32 recalced_mask; 13949c55878SDavid Wu u32 route_mask; 14049c55878SDavid Wu }; 14149c55878SDavid Wu 14249c55878SDavid Wu #define PIN_BANK(id, pins, label) \ 14349c55878SDavid Wu { \ 14449c55878SDavid Wu .bank_num = id, \ 14549c55878SDavid Wu .nr_pins = pins, \ 14649c55878SDavid Wu .name = label, \ 14749c55878SDavid Wu .iomux = { \ 14849c55878SDavid Wu { .offset = -1 }, \ 14949c55878SDavid Wu { .offset = -1 }, \ 15049c55878SDavid Wu { .offset = -1 }, \ 15149c55878SDavid Wu { .offset = -1 }, \ 15249c55878SDavid Wu }, \ 15349c55878SDavid Wu } 15449c55878SDavid Wu 15549c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 15649c55878SDavid Wu { \ 15749c55878SDavid Wu .bank_num = id, \ 15849c55878SDavid Wu .nr_pins = pins, \ 15949c55878SDavid Wu .name = label, \ 16049c55878SDavid Wu .iomux = { \ 16149c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 16249c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 16349c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 16449c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 16549c55878SDavid Wu }, \ 16649c55878SDavid Wu } 16749c55878SDavid Wu 168d499d466SJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, \ 169d499d466SJianqun Xu iom3, offset0, offset1, offset2, \ 170d499d466SJianqun Xu offset3) \ 171d499d466SJianqun Xu { \ 172d499d466SJianqun Xu .bank_num = id, \ 173d499d466SJianqun Xu .nr_pins = pins, \ 174d499d466SJianqun Xu .name = label, \ 175d499d466SJianqun Xu .iomux = { \ 176d499d466SJianqun Xu { .type = iom0, .offset = offset0 }, \ 177d499d466SJianqun Xu { .type = iom1, .offset = offset1 }, \ 178d499d466SJianqun Xu { .type = iom2, .offset = offset2 }, \ 179d499d466SJianqun Xu { .type = iom3, .offset = offset3 }, \ 180d499d466SJianqun Xu }, \ 181d499d466SJianqun Xu } 182d499d466SJianqun Xu 18349c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 18449c55878SDavid Wu { \ 18549c55878SDavid Wu .bank_num = id, \ 18649c55878SDavid Wu .nr_pins = pins, \ 18749c55878SDavid Wu .name = label, \ 18849c55878SDavid Wu .iomux = { \ 18949c55878SDavid Wu { .offset = -1 }, \ 19049c55878SDavid Wu { .offset = -1 }, \ 19149c55878SDavid Wu { .offset = -1 }, \ 19249c55878SDavid Wu { .offset = -1 }, \ 19349c55878SDavid Wu }, \ 19449c55878SDavid Wu .drv = { \ 19549c55878SDavid Wu { .drv_type = type0, .offset = -1 }, \ 19649c55878SDavid Wu { .drv_type = type1, .offset = -1 }, \ 19749c55878SDavid Wu { .drv_type = type2, .offset = -1 }, \ 19849c55878SDavid Wu { .drv_type = type3, .offset = -1 }, \ 19949c55878SDavid Wu }, \ 20049c55878SDavid Wu } 20149c55878SDavid Wu 20249c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \ 20349c55878SDavid Wu drv2, drv3, pull0, pull1, \ 20449c55878SDavid Wu pull2, pull3) \ 20549c55878SDavid Wu { \ 20649c55878SDavid Wu .bank_num = id, \ 20749c55878SDavid Wu .nr_pins = pins, \ 20849c55878SDavid Wu .name = label, \ 20949c55878SDavid Wu .iomux = { \ 21049c55878SDavid Wu { .offset = -1 }, \ 21149c55878SDavid Wu { .offset = -1 }, \ 21249c55878SDavid Wu { .offset = -1 }, \ 21349c55878SDavid Wu { .offset = -1 }, \ 21449c55878SDavid Wu }, \ 21549c55878SDavid Wu .drv = { \ 21649c55878SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 21749c55878SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 21849c55878SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 21949c55878SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 22049c55878SDavid Wu }, \ 22149c55878SDavid Wu .pull_type[0] = pull0, \ 22249c55878SDavid Wu .pull_type[1] = pull1, \ 22349c55878SDavid Wu .pull_type[2] = pull2, \ 22449c55878SDavid Wu .pull_type[3] = pull3, \ 22549c55878SDavid Wu } 22649c55878SDavid Wu 22749c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \ 22849c55878SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 22949c55878SDavid Wu drv3, offset0, offset1, \ 23049c55878SDavid Wu offset2, offset3) \ 23149c55878SDavid Wu { \ 23249c55878SDavid Wu .bank_num = id, \ 23349c55878SDavid Wu .nr_pins = pins, \ 23449c55878SDavid Wu .name = label, \ 23549c55878SDavid Wu .iomux = { \ 23649c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 23749c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 23849c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 23949c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 24049c55878SDavid Wu }, \ 24149c55878SDavid Wu .drv = { \ 24249c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 24349c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 24449c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 24549c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 24649c55878SDavid Wu }, \ 24749c55878SDavid Wu } 24849c55878SDavid Wu 24955a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1, \ 25055a89bc6SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 25155a89bc6SDavid Wu drv3, pull0, pull1, pull2, \ 25255a89bc6SDavid Wu pull3) \ 25355a89bc6SDavid Wu { \ 25455a89bc6SDavid Wu .bank_num = id, \ 25555a89bc6SDavid Wu .nr_pins = pins, \ 25655a89bc6SDavid Wu .name = label, \ 25755a89bc6SDavid Wu .iomux = { \ 25855a89bc6SDavid Wu { .type = iom0, .offset = -1 }, \ 25955a89bc6SDavid Wu { .type = iom1, .offset = -1 }, \ 26055a89bc6SDavid Wu { .type = iom2, .offset = -1 }, \ 26155a89bc6SDavid Wu { .type = iom3, .offset = -1 }, \ 26255a89bc6SDavid Wu }, \ 26355a89bc6SDavid Wu .drv = { \ 26455a89bc6SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 26555a89bc6SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 26655a89bc6SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 26755a89bc6SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 26855a89bc6SDavid Wu }, \ 26955a89bc6SDavid Wu .pull_type[0] = pull0, \ 27055a89bc6SDavid Wu .pull_type[1] = pull1, \ 27155a89bc6SDavid Wu .pull_type[2] = pull2, \ 27255a89bc6SDavid Wu .pull_type[3] = pull3, \ 27355a89bc6SDavid Wu } 27455a89bc6SDavid Wu 27549c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \ 27649c55878SDavid Wu label, iom0, iom1, iom2, \ 27749c55878SDavid Wu iom3, drv0, drv1, drv2, \ 27849c55878SDavid Wu drv3, offset0, offset1, \ 27949c55878SDavid Wu offset2, offset3, pull0, \ 28049c55878SDavid Wu pull1, pull2, pull3) \ 28149c55878SDavid Wu { \ 28249c55878SDavid Wu .bank_num = id, \ 28349c55878SDavid Wu .nr_pins = pins, \ 28449c55878SDavid Wu .name = label, \ 28549c55878SDavid Wu .iomux = { \ 28649c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 28749c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 28849c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 28949c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 29049c55878SDavid Wu }, \ 29149c55878SDavid Wu .drv = { \ 29249c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 29349c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 29449c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 29549c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 29649c55878SDavid Wu }, \ 29749c55878SDavid Wu .pull_type[0] = pull0, \ 29849c55878SDavid Wu .pull_type[1] = pull1, \ 29949c55878SDavid Wu .pull_type[2] = pull2, \ 30049c55878SDavid Wu .pull_type[3] = pull3, \ 30149c55878SDavid Wu } 30249c55878SDavid Wu 30349e04eddSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \ 304d499d466SJianqun Xu { \ 305d499d466SJianqun Xu .bank_num = ID, \ 306d499d466SJianqun Xu .pin = PIN, \ 307d499d466SJianqun Xu .func = FUNC, \ 308d499d466SJianqun Xu .route_offset = REG, \ 309d499d466SJianqun Xu .route_val = VAL, \ 31049e04eddSJianqun Xu .route_type = FLAG, \ 311d499d466SJianqun Xu } 312d499d466SJianqun Xu 31349e04eddSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL) \ 31449e04eddSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT) 31549e04eddSJianqun Xu 31649e04eddSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL) \ 31749e04eddSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF) 31849e04eddSJianqun Xu 31949e04eddSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL) \ 32049e04eddSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF) 32149e04eddSJianqun Xu 32249c55878SDavid Wu /** 32349c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 32449c55878SDavid Wu * @num: bank number. 32549c55878SDavid Wu * @pin: pin number. 32649c55878SDavid Wu * @bit: index at register. 32749c55878SDavid Wu * @reg: register offset. 32849c55878SDavid Wu * @mask: mask bit 32949c55878SDavid Wu */ 33049c55878SDavid Wu struct rockchip_mux_recalced_data { 33149c55878SDavid Wu u8 num; 33249c55878SDavid Wu u8 pin; 33349c55878SDavid Wu u32 reg; 33449c55878SDavid Wu u8 bit; 33549c55878SDavid Wu u8 mask; 33649c55878SDavid Wu }; 33749c55878SDavid Wu 33849c55878SDavid Wu /** 33949c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 34049c55878SDavid Wu * @bank_num: bank number. 34149c55878SDavid Wu * @pin: index at register or used to calc index. 34249c55878SDavid Wu * @func: the min pin. 34349e04eddSJianqun Xu * @route_type: the register type. 34449c55878SDavid Wu * @route_offset: the max pin. 34549c55878SDavid Wu * @route_val: the register offset. 34649c55878SDavid Wu */ 34749c55878SDavid Wu struct rockchip_mux_route_data { 34849c55878SDavid Wu u8 bank_num; 34949c55878SDavid Wu u8 pin; 35049c55878SDavid Wu u8 func; 35149e04eddSJianqun Xu enum rockchip_pin_route_type route_type : 8; 35249c55878SDavid Wu u32 route_offset; 35349c55878SDavid Wu u32 route_val; 35449c55878SDavid Wu }; 35549c55878SDavid Wu 35649c55878SDavid Wu /** 35749c55878SDavid Wu */ 35849c55878SDavid Wu struct rockchip_pin_ctrl { 35949c55878SDavid Wu struct rockchip_pin_bank *pin_banks; 36049c55878SDavid Wu u32 nr_banks; 36149c55878SDavid Wu u32 nr_pins; 36249c55878SDavid Wu char *label; 36349c55878SDavid Wu enum rockchip_pinctrl_type type; 36449c55878SDavid Wu int grf_mux_offset; 36549c55878SDavid Wu int pmu_mux_offset; 36649c55878SDavid Wu int grf_drv_offset; 36749c55878SDavid Wu int pmu_drv_offset; 36849c55878SDavid Wu struct rockchip_mux_recalced_data *iomux_recalced; 36949c55878SDavid Wu u32 niomux_recalced; 37049c55878SDavid Wu struct rockchip_mux_route_data *iomux_routes; 37149c55878SDavid Wu u32 niomux_routes; 37249c55878SDavid Wu 37313c03cb6SJianqun Xu int (*ctrl_data_re_init)(const struct rockchip_pin_ctrl *ctrl); 374d5517017SDavid Wu 375d5517017SDavid Wu int (*soc_data_init)(struct rockchip_pinctrl_priv *info); 376d5517017SDavid Wu 37749c55878SDavid Wu void (*pull_calc_reg)(struct rockchip_pin_bank *bank, 37849c55878SDavid Wu int pin_num, struct regmap **regmap, 37949c55878SDavid Wu int *reg, u8 *bit); 38049c55878SDavid Wu void (*drv_calc_reg)(struct rockchip_pin_bank *bank, 38149c55878SDavid Wu int pin_num, struct regmap **regmap, 38249c55878SDavid Wu int *reg, u8 *bit); 38349c55878SDavid Wu int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank, 38449c55878SDavid Wu int pin_num, struct regmap **regmap, 38549c55878SDavid Wu int *reg, u8 *bit); 38632c25d1fSDavid Wu int (*slew_rate_calc_reg)(struct rockchip_pin_bank *bank, 38732c25d1fSDavid Wu int pin_num, struct regmap **regmap, 38832c25d1fSDavid Wu int *reg, u8 *bit); 38949c55878SDavid Wu }; 39049c55878SDavid Wu 39149c55878SDavid Wu /** 39249c55878SDavid Wu */ 39349c55878SDavid Wu struct rockchip_pinctrl_priv { 39449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 39549c55878SDavid Wu struct regmap *regmap_base; 39649c55878SDavid Wu struct regmap *regmap_pmu; 39749c55878SDavid Wu 39849c55878SDavid Wu }; 39949c55878SDavid Wu 40049c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin) 40149c55878SDavid Wu { 40249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 40349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 40449c55878SDavid Wu 40549c55878SDavid Wu if (bank >= ctrl->nr_banks) { 40649c55878SDavid Wu debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks); 40749c55878SDavid Wu return -EINVAL; 40849c55878SDavid Wu } 40949c55878SDavid Wu 41049c55878SDavid Wu if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) { 41149c55878SDavid Wu debug("pin conf pin %d >= %d\n", pin, 41249c55878SDavid Wu MAX_ROCKCHIP_GPIO_PER_BANK); 41349c55878SDavid Wu return -EINVAL; 41449c55878SDavid Wu } 41549c55878SDavid Wu 41649c55878SDavid Wu return 0; 41749c55878SDavid Wu } 41849c55878SDavid Wu 41949c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = { 42049c55878SDavid Wu { 42149c55878SDavid Wu .num = 1, 42249c55878SDavid Wu .pin = 0, 42349c55878SDavid Wu .reg = 0x418, 42449c55878SDavid Wu .bit = 0, 42549c55878SDavid Wu .mask = 0x3 42649c55878SDavid Wu }, { 42749c55878SDavid Wu .num = 1, 42849c55878SDavid Wu .pin = 1, 42949c55878SDavid Wu .reg = 0x418, 43049c55878SDavid Wu .bit = 2, 43149c55878SDavid Wu .mask = 0x3 43249c55878SDavid Wu }, { 43349c55878SDavid Wu .num = 1, 43449c55878SDavid Wu .pin = 2, 43549c55878SDavid Wu .reg = 0x418, 43649c55878SDavid Wu .bit = 4, 43749c55878SDavid Wu .mask = 0x3 43849c55878SDavid Wu }, { 43949c55878SDavid Wu .num = 1, 44049c55878SDavid Wu .pin = 3, 44149c55878SDavid Wu .reg = 0x418, 44249c55878SDavid Wu .bit = 6, 44349c55878SDavid Wu .mask = 0x3 44449c55878SDavid Wu }, { 44549c55878SDavid Wu .num = 1, 44649c55878SDavid Wu .pin = 4, 44749c55878SDavid Wu .reg = 0x418, 44849c55878SDavid Wu .bit = 8, 44949c55878SDavid Wu .mask = 0x3 45049c55878SDavid Wu }, { 45149c55878SDavid Wu .num = 1, 45249c55878SDavid Wu .pin = 5, 45349c55878SDavid Wu .reg = 0x418, 45449c55878SDavid Wu .bit = 10, 45549c55878SDavid Wu .mask = 0x3 45649c55878SDavid Wu }, { 45749c55878SDavid Wu .num = 1, 45849c55878SDavid Wu .pin = 6, 45949c55878SDavid Wu .reg = 0x418, 46049c55878SDavid Wu .bit = 12, 46149c55878SDavid Wu .mask = 0x3 46249c55878SDavid Wu }, { 46349c55878SDavid Wu .num = 1, 46449c55878SDavid Wu .pin = 7, 46549c55878SDavid Wu .reg = 0x418, 46649c55878SDavid Wu .bit = 14, 46749c55878SDavid Wu .mask = 0x3 46849c55878SDavid Wu }, { 46949c55878SDavid Wu .num = 1, 47049c55878SDavid Wu .pin = 8, 47149c55878SDavid Wu .reg = 0x41c, 47249c55878SDavid Wu .bit = 0, 47349c55878SDavid Wu .mask = 0x3 47449c55878SDavid Wu }, { 47549c55878SDavid Wu .num = 1, 47649c55878SDavid Wu .pin = 9, 47749c55878SDavid Wu .reg = 0x41c, 47849c55878SDavid Wu .bit = 2, 47949c55878SDavid Wu .mask = 0x3 48049c55878SDavid Wu }, 48149c55878SDavid Wu }; 48249c55878SDavid Wu 483cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = { 484cf04a17bSJianqun Xu { 485cf04a17bSJianqun Xu .num = 0, 486cf04a17bSJianqun Xu .pin = 20, 487cf04a17bSJianqun Xu .reg = 0x10000, 488cf04a17bSJianqun Xu .bit = 0, 489cf04a17bSJianqun Xu .mask = 0xf 490cf04a17bSJianqun Xu }, 491cf04a17bSJianqun Xu { 492cf04a17bSJianqun Xu .num = 0, 493cf04a17bSJianqun Xu .pin = 21, 494cf04a17bSJianqun Xu .reg = 0x10000, 495cf04a17bSJianqun Xu .bit = 4, 496cf04a17bSJianqun Xu .mask = 0xf 497cf04a17bSJianqun Xu }, 498cf04a17bSJianqun Xu { 499cf04a17bSJianqun Xu .num = 0, 500cf04a17bSJianqun Xu .pin = 22, 501cf04a17bSJianqun Xu .reg = 0x10000, 502cf04a17bSJianqun Xu .bit = 8, 503cf04a17bSJianqun Xu .mask = 0xf 504cf04a17bSJianqun Xu }, 505cf04a17bSJianqun Xu { 506cf04a17bSJianqun Xu .num = 0, 507cf04a17bSJianqun Xu .pin = 23, 508cf04a17bSJianqun Xu .reg = 0x10000, 509cf04a17bSJianqun Xu .bit = 12, 510cf04a17bSJianqun Xu .mask = 0xf 511cf04a17bSJianqun Xu }, 512cf04a17bSJianqun Xu }; 513cf04a17bSJianqun Xu 51449c55878SDavid Wu static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { 51549c55878SDavid Wu { 51649c55878SDavid Wu .num = 2, 51749c55878SDavid Wu .pin = 20, 51849c55878SDavid Wu .reg = 0xe8, 51949c55878SDavid Wu .bit = 0, 52049c55878SDavid Wu .mask = 0x7 52149c55878SDavid Wu }, { 52249c55878SDavid Wu .num = 2, 52349c55878SDavid Wu .pin = 21, 52449c55878SDavid Wu .reg = 0xe8, 52549c55878SDavid Wu .bit = 4, 52649c55878SDavid Wu .mask = 0x7 52749c55878SDavid Wu }, { 52849c55878SDavid Wu .num = 2, 52949c55878SDavid Wu .pin = 22, 53049c55878SDavid Wu .reg = 0xe8, 53149c55878SDavid Wu .bit = 8, 53249c55878SDavid Wu .mask = 0x7 53349c55878SDavid Wu }, { 53449c55878SDavid Wu .num = 2, 53549c55878SDavid Wu .pin = 23, 53649c55878SDavid Wu .reg = 0xe8, 53749c55878SDavid Wu .bit = 12, 53849c55878SDavid Wu .mask = 0x7 53949c55878SDavid Wu }, { 54049c55878SDavid Wu .num = 2, 54149c55878SDavid Wu .pin = 24, 54249c55878SDavid Wu .reg = 0xd4, 54349c55878SDavid Wu .bit = 12, 54449c55878SDavid Wu .mask = 0x7 54549c55878SDavid Wu }, 54649c55878SDavid Wu }; 54749c55878SDavid Wu 548b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { 549b3077611SDavid Wu { 550b3077611SDavid Wu .num = 1, 551b3077611SDavid Wu .pin = 14, 552b3077611SDavid Wu .reg = 0x28, 553b3077611SDavid Wu .bit = 12, 554b3077611SDavid Wu .mask = 0x7 555b3077611SDavid Wu }, { 556b3077611SDavid Wu .num = 1, 557b3077611SDavid Wu .pin = 15, 558b3077611SDavid Wu .reg = 0x2c, 559b3077611SDavid Wu .bit = 0, 560b3077611SDavid Wu .mask = 0x3 561b3077611SDavid Wu }, { 562b3077611SDavid Wu .num = 1, 563b3077611SDavid Wu .pin = 18, 564b3077611SDavid Wu .reg = 0x30, 565b3077611SDavid Wu .bit = 4, 566b3077611SDavid Wu .mask = 0x7 567b3077611SDavid Wu }, { 568b3077611SDavid Wu .num = 1, 569b3077611SDavid Wu .pin = 19, 570b3077611SDavid Wu .reg = 0x30, 571b3077611SDavid Wu .bit = 8, 572b3077611SDavid Wu .mask = 0x7 573b3077611SDavid Wu }, { 574b3077611SDavid Wu .num = 1, 575b3077611SDavid Wu .pin = 20, 576b3077611SDavid Wu .reg = 0x30, 577b3077611SDavid Wu .bit = 12, 578b3077611SDavid Wu .mask = 0x7 579b3077611SDavid Wu }, { 580b3077611SDavid Wu .num = 1, 581b3077611SDavid Wu .pin = 21, 582b3077611SDavid Wu .reg = 0x34, 583b3077611SDavid Wu .bit = 0, 584b3077611SDavid Wu .mask = 0x7 585b3077611SDavid Wu }, { 586b3077611SDavid Wu .num = 1, 587b3077611SDavid Wu .pin = 22, 588b3077611SDavid Wu .reg = 0x34, 589b3077611SDavid Wu .bit = 4, 590b3077611SDavid Wu .mask = 0x7 591b3077611SDavid Wu }, { 592b3077611SDavid Wu .num = 1, 593b3077611SDavid Wu .pin = 23, 594b3077611SDavid Wu .reg = 0x34, 595b3077611SDavid Wu .bit = 8, 596b3077611SDavid Wu .mask = 0x7 597b3077611SDavid Wu }, { 598b3077611SDavid Wu .num = 3, 599b3077611SDavid Wu .pin = 12, 600b3077611SDavid Wu .reg = 0x68, 601b3077611SDavid Wu .bit = 8, 602b3077611SDavid Wu .mask = 0x7 603b3077611SDavid Wu }, { 604b3077611SDavid Wu .num = 3, 605b3077611SDavid Wu .pin = 13, 606b3077611SDavid Wu .reg = 0x68, 607b3077611SDavid Wu .bit = 12, 608b3077611SDavid Wu .mask = 0x7 609b3077611SDavid Wu }, 610b3077611SDavid Wu }; 611b3077611SDavid Wu 612d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = { 613d5517017SDavid Wu { 614d5517017SDavid Wu .num = 1, 615d5517017SDavid Wu .pin = 14, 616d5517017SDavid Wu .reg = 0x28, 617d5517017SDavid Wu .bit = 12, 618d5517017SDavid Wu .mask = 0xf 619d5517017SDavid Wu }, { 620d5517017SDavid Wu .num = 1, 621d5517017SDavid Wu .pin = 15, 622d5517017SDavid Wu .reg = 0x2c, 623d5517017SDavid Wu .bit = 0, 624d5517017SDavid Wu .mask = 0x3 625d5517017SDavid Wu }, { 626d5517017SDavid Wu .num = 1, 627d5517017SDavid Wu .pin = 18, 628d5517017SDavid Wu .reg = 0x30, 629d5517017SDavid Wu .bit = 4, 630d5517017SDavid Wu .mask = 0xf 631d5517017SDavid Wu }, { 632d5517017SDavid Wu .num = 1, 633d5517017SDavid Wu .pin = 19, 634d5517017SDavid Wu .reg = 0x30, 635d5517017SDavid Wu .bit = 8, 636d5517017SDavid Wu .mask = 0xf 637d5517017SDavid Wu }, { 638d5517017SDavid Wu .num = 1, 639d5517017SDavid Wu .pin = 20, 640d5517017SDavid Wu .reg = 0x30, 641d5517017SDavid Wu .bit = 12, 642d5517017SDavid Wu .mask = 0xf 643d5517017SDavid Wu }, { 644d5517017SDavid Wu .num = 1, 645d5517017SDavid Wu .pin = 21, 646d5517017SDavid Wu .reg = 0x34, 647d5517017SDavid Wu .bit = 0, 648d5517017SDavid Wu .mask = 0xf 649d5517017SDavid Wu }, { 650d5517017SDavid Wu .num = 1, 651d5517017SDavid Wu .pin = 22, 652d5517017SDavid Wu .reg = 0x34, 653d5517017SDavid Wu .bit = 4, 654d5517017SDavid Wu .mask = 0xf 655d5517017SDavid Wu }, { 656d5517017SDavid Wu .num = 1, 657d5517017SDavid Wu .pin = 23, 658d5517017SDavid Wu .reg = 0x34, 659d5517017SDavid Wu .bit = 8, 660d5517017SDavid Wu .mask = 0xf 661d5517017SDavid Wu }, { 662d5517017SDavid Wu .num = 3, 663752032c9SDavid.Wu .pin = 12, 664752032c9SDavid.Wu .reg = 0x68, 665752032c9SDavid.Wu .bit = 8, 666752032c9SDavid.Wu .mask = 0xf 667752032c9SDavid.Wu }, { 668752032c9SDavid.Wu .num = 3, 669d5517017SDavid Wu .pin = 13, 670d5517017SDavid Wu .reg = 0x68, 671d5517017SDavid Wu .bit = 12, 672d5517017SDavid Wu .mask = 0xf 673d5517017SDavid Wu }, { 674d5517017SDavid Wu .num = 2, 675d5517017SDavid Wu .pin = 2, 676d5517017SDavid Wu .reg = 0x608, 677d5517017SDavid Wu .bit = 0, 678d5517017SDavid Wu .mask = 0x7 679d5517017SDavid Wu }, { 680d5517017SDavid Wu .num = 2, 681d5517017SDavid Wu .pin = 3, 682d5517017SDavid Wu .reg = 0x608, 683d5517017SDavid Wu .bit = 4, 684d5517017SDavid Wu .mask = 0x7 685d5517017SDavid Wu }, { 686d5517017SDavid Wu .num = 2, 687d5517017SDavid Wu .pin = 16, 688d5517017SDavid Wu .reg = 0x610, 689d5517017SDavid Wu .bit = 8, 690d5517017SDavid Wu .mask = 0x7 691d5517017SDavid Wu }, { 692d5517017SDavid Wu .num = 3, 693d5517017SDavid Wu .pin = 10, 694d5517017SDavid Wu .reg = 0x610, 695d5517017SDavid Wu .bit = 0, 696d5517017SDavid Wu .mask = 0x7 697d5517017SDavid Wu }, { 698d5517017SDavid Wu .num = 3, 699d5517017SDavid Wu .pin = 11, 700d5517017SDavid Wu .reg = 0x610, 701d5517017SDavid Wu .bit = 4, 702d5517017SDavid Wu .mask = 0x7 703d5517017SDavid Wu }, 704d5517017SDavid Wu }; 705d5517017SDavid Wu 70649c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = { 70749c55878SDavid Wu { 70849c55878SDavid Wu .num = 2, 70949c55878SDavid Wu .pin = 12, 71049c55878SDavid Wu .reg = 0x24, 71149c55878SDavid Wu .bit = 8, 71249c55878SDavid Wu .mask = 0x3 71349c55878SDavid Wu }, { 71449c55878SDavid Wu .num = 2, 71549c55878SDavid Wu .pin = 15, 71649c55878SDavid Wu .reg = 0x28, 71749c55878SDavid Wu .bit = 0, 71849c55878SDavid Wu .mask = 0x7 71949c55878SDavid Wu }, { 72049c55878SDavid Wu .num = 2, 72149c55878SDavid Wu .pin = 23, 72249c55878SDavid Wu .reg = 0x30, 72349c55878SDavid Wu .bit = 14, 72449c55878SDavid Wu .mask = 0x3 72549c55878SDavid Wu }, 72649c55878SDavid Wu }; 72749c55878SDavid Wu 728d499d466SJianqun Xu static struct rockchip_mux_route_data rv1126_mux_route_data[] = { 72949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */ 73049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */ 731d499d466SJianqun Xu 73249e04eddSJianqun Xu MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(2, 3, 0)), /* I2S1_MCLK_M0 */ 73349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(2, 3, 1)), /* I2S1_MCLK_M1 */ 73449e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(2, 3, 2)), /* I2S1_MCLK_M2 */ 735d499d466SJianqun Xu 73649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */ 73749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */ 738d499d466SJianqun Xu 73949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */ 74049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */ 741d499d466SJianqun Xu 74249e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */ 74349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */ 744d499d466SJianqun Xu 74549e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(4, 5, 0)), /* I2C3_SCL_M0 */ 74649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(4, 5, 1)), /* I2C3_SCL_M1 */ 74749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(4, 5, 2)), /* I2C3_SCL_M2 */ 748d499d466SJianqun Xu 74949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */ 75049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */ 751d499d466SJianqun Xu 75249e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(8, 9, 0)), /* I2C5_SCL_M0 */ 75349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(8, 9, 1)), /* I2C5_SCL_M1 */ 75449e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(8, 9, 2)), /* I2C5_SCL_M2 */ 755d499d466SJianqun Xu 75649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(10, 11, 0)), /* SPI1_CLK_M0 */ 75749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(10, 11, 1)), /* SPI1_CLK_M1 */ 75849e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(10, 11, 2)), /* SPI1_CLK_M2 */ 759d499d466SJianqun Xu 76049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */ 76149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */ 762d499d466SJianqun Xu 76349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */ 76449e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */ 765d499d466SJianqun Xu 76649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */ 76749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */ 768d499d466SJianqun Xu 76949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */ 77049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */ 771d499d466SJianqun Xu 77249e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */ 77349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */ 774d499d466SJianqun Xu 77549e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */ 77649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */ 777d499d466SJianqun Xu 77849e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */ 77949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */ 780d499d466SJianqun Xu 78149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(10, 11, 0)), /* UART3_TX_M0 */ 78249e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(10, 11, 1)), /* UART3_TX_M1 */ 78349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(10, 11, 2)), /* UART3_TX_M2 */ 784d499d466SJianqun Xu 78549e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(12, 13, 0)), /* UART4_TX_M0 */ 78649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(12, 13, 1)), /* UART4_TX_M1 */ 78749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(12, 13, 2)), /* UART4_TX_M2 */ 788d499d466SJianqun Xu 78949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(14, 15, 0)), /* UART5_TX_M0 */ 79049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(14, 15, 1)), /* UART5_TX_M1 */ 79149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(14, 15, 2)), /* UART5_TX_M2 */ 79249e04eddSJianqun Xu 79349e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */ 79449e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */ 79549e04eddSJianqun Xu 79649e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */ 79749e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */ 79849e04eddSJianqun Xu 79949e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */ 80049e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */ 80149e04eddSJianqun Xu 80249e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */ 80349e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */ 80449e04eddSJianqun Xu 80549e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */ 80649e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */ 80749e04eddSJianqun Xu 80849e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */ 80949e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */ 81049e04eddSJianqun Xu 81149e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */ 81249e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */ 81349e04eddSJianqun Xu 81449e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */ 81549e04eddSJianqun Xu MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */ 81649e04eddSJianqun Xu 81749e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(0, 1, 0)), /* SPI0_CLK_M0 */ 81849e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(0, 1, 1)), /* SPI0_CLK_M1 */ 81949e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(0, 1, 2)), /* SPI0_CLK_M2 */ 82049e04eddSJianqun Xu 82149e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */ 82249e04eddSJianqun Xu MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */ 823d499d466SJianqun Xu }; 824d499d466SJianqun Xu 82549c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, 82649c55878SDavid Wu int *reg, u8 *bit, int *mask) 82749c55878SDavid Wu { 82849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 82949c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 83049c55878SDavid Wu struct rockchip_mux_recalced_data *data; 83149c55878SDavid Wu int i; 83249c55878SDavid Wu 83349c55878SDavid Wu for (i = 0; i < ctrl->niomux_recalced; i++) { 83449c55878SDavid Wu data = &ctrl->iomux_recalced[i]; 83549c55878SDavid Wu if (data->num == bank->bank_num && 83649c55878SDavid Wu data->pin == pin) 83749c55878SDavid Wu break; 83849c55878SDavid Wu } 83949c55878SDavid Wu 84049c55878SDavid Wu if (i >= ctrl->niomux_recalced) 84149c55878SDavid Wu return; 84249c55878SDavid Wu 84349c55878SDavid Wu *reg = data->reg; 84449c55878SDavid Wu *mask = data->mask; 84549c55878SDavid Wu *bit = data->bit; 84649c55878SDavid Wu } 84749c55878SDavid Wu 84849c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = { 84949c55878SDavid Wu { 85049c55878SDavid Wu /* cif-d2m0 */ 85149c55878SDavid Wu .bank_num = 2, 85249c55878SDavid Wu .pin = 0, 85349c55878SDavid Wu .func = 1, 85449c55878SDavid Wu .route_offset = 0x184, 85549c55878SDavid Wu .route_val = BIT(16 + 7), 85649c55878SDavid Wu }, { 85749c55878SDavid Wu /* cif-d2m1 */ 85849c55878SDavid Wu .bank_num = 3, 85949c55878SDavid Wu .pin = 3, 86049c55878SDavid Wu .func = 3, 86149c55878SDavid Wu .route_offset = 0x184, 86249c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 86349c55878SDavid Wu }, { 86449c55878SDavid Wu /* pdm-m0 */ 86549c55878SDavid Wu .bank_num = 3, 86649c55878SDavid Wu .pin = 22, 86749c55878SDavid Wu .func = 2, 86849c55878SDavid Wu .route_offset = 0x184, 86949c55878SDavid Wu .route_val = BIT(16 + 8), 87049c55878SDavid Wu }, { 87149c55878SDavid Wu /* pdm-m1 */ 87249c55878SDavid Wu .bank_num = 2, 87349c55878SDavid Wu .pin = 22, 87449c55878SDavid Wu .func = 1, 87549c55878SDavid Wu .route_offset = 0x184, 87649c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 87749c55878SDavid Wu }, { 87849c55878SDavid Wu /* uart2-rxm0 */ 87949c55878SDavid Wu .bank_num = 1, 880793770dfSDavid Wu .pin = 27, 88149c55878SDavid Wu .func = 2, 88249c55878SDavid Wu .route_offset = 0x184, 883793770dfSDavid Wu .route_val = BIT(16 + 10), 88449c55878SDavid Wu }, { 88549c55878SDavid Wu /* uart2-rxm1 */ 88649c55878SDavid Wu .bank_num = 2, 88749c55878SDavid Wu .pin = 14, 88849c55878SDavid Wu .func = 2, 88949c55878SDavid Wu .route_offset = 0x184, 890793770dfSDavid Wu .route_val = BIT(16 + 10) | BIT(10), 89149c55878SDavid Wu }, { 89249c55878SDavid Wu /* uart3-rxm0 */ 89349c55878SDavid Wu .bank_num = 0, 89449c55878SDavid Wu .pin = 17, 89549c55878SDavid Wu .func = 2, 89649c55878SDavid Wu .route_offset = 0x184, 897793770dfSDavid Wu .route_val = BIT(16 + 9), 89849c55878SDavid Wu }, { 89949c55878SDavid Wu /* uart3-rxm1 */ 90049c55878SDavid Wu .bank_num = 1, 901793770dfSDavid Wu .pin = 15, 90249c55878SDavid Wu .func = 2, 90349c55878SDavid Wu .route_offset = 0x184, 904793770dfSDavid Wu .route_val = BIT(16 + 9) | BIT(9), 90549c55878SDavid Wu }, 90649c55878SDavid Wu }; 90749c55878SDavid Wu 908a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = { 909a2a3fc8fSJianqun Xu { 910a2a3fc8fSJianqun Xu /* i2c2m0_sda */ 911a2a3fc8fSJianqun Xu .bank_num = 3, 912a2a3fc8fSJianqun Xu .pin = 12, 913a2a3fc8fSJianqun Xu .func = 2, 914a2a3fc8fSJianqun Xu .route_offset = 0x190, 915a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3), 916a2a3fc8fSJianqun Xu }, { 917a2a3fc8fSJianqun Xu /* i2c2m1_sda */ 918a2a3fc8fSJianqun Xu .bank_num = 1, 919a2a3fc8fSJianqun Xu .pin = 13, 920a2a3fc8fSJianqun Xu .func = 2, 921a2a3fc8fSJianqun Xu .route_offset = 0x190, 922a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3) | BIT(3), 923a2a3fc8fSJianqun Xu }, { 924a2a3fc8fSJianqun Xu /* uart2_rxm0 */ 925a2a3fc8fSJianqun Xu .bank_num = 4, 926a2a3fc8fSJianqun Xu .pin = 3, 927a2a3fc8fSJianqun Xu .func = 2, 928a2a3fc8fSJianqun Xu .route_offset = 0x190, 929a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15), 930a2a3fc8fSJianqun Xu }, { 931a2a3fc8fSJianqun Xu /* uart2_rxm1 */ 932a2a3fc8fSJianqun Xu .bank_num = 2, 933a2a3fc8fSJianqun Xu .pin = 25, 934a2a3fc8fSJianqun Xu .func = 2, 935a2a3fc8fSJianqun Xu .route_offset = 0x190, 936a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15), 937a2a3fc8fSJianqun Xu }, { 938a2a3fc8fSJianqun Xu /* uart2_rxm2 */ 939a2a3fc8fSJianqun Xu .bank_num = 3, 940a2a3fc8fSJianqun Xu .pin = 4, 941a2a3fc8fSJianqun Xu .func = 2, 942a2a3fc8fSJianqun Xu .route_offset = 0x190, 943a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15), 944a2a3fc8fSJianqun Xu }, 945a2a3fc8fSJianqun Xu }; 946a2a3fc8fSJianqun Xu 94749c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = { 94849c55878SDavid Wu { 94949c55878SDavid Wu /* spi-0 */ 95049c55878SDavid Wu .bank_num = 1, 95149c55878SDavid Wu .pin = 10, 95249c55878SDavid Wu .func = 1, 95349c55878SDavid Wu .route_offset = 0x144, 95449c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4), 95549c55878SDavid Wu }, { 95649c55878SDavid Wu /* spi-1 */ 95749c55878SDavid Wu .bank_num = 1, 95849c55878SDavid Wu .pin = 27, 95949c55878SDavid Wu .func = 3, 96049c55878SDavid Wu .route_offset = 0x144, 96149c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3), 96249c55878SDavid Wu }, { 96349c55878SDavid Wu /* spi-2 */ 96449c55878SDavid Wu .bank_num = 0, 96549c55878SDavid Wu .pin = 13, 96649c55878SDavid Wu .func = 2, 96749c55878SDavid Wu .route_offset = 0x144, 96849c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4), 96949c55878SDavid Wu }, { 97049c55878SDavid Wu /* i2s-0 */ 97149c55878SDavid Wu .bank_num = 1, 97249c55878SDavid Wu .pin = 5, 97349c55878SDavid Wu .func = 1, 97449c55878SDavid Wu .route_offset = 0x144, 97549c55878SDavid Wu .route_val = BIT(16 + 5), 97649c55878SDavid Wu }, { 97749c55878SDavid Wu /* i2s-1 */ 97849c55878SDavid Wu .bank_num = 0, 97949c55878SDavid Wu .pin = 14, 98049c55878SDavid Wu .func = 1, 98149c55878SDavid Wu .route_offset = 0x144, 98249c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 98349c55878SDavid Wu }, { 98449c55878SDavid Wu /* emmc-0 */ 98549c55878SDavid Wu .bank_num = 1, 98649c55878SDavid Wu .pin = 22, 98749c55878SDavid Wu .func = 2, 98849c55878SDavid Wu .route_offset = 0x144, 98949c55878SDavid Wu .route_val = BIT(16 + 6), 99049c55878SDavid Wu }, { 99149c55878SDavid Wu /* emmc-1 */ 99249c55878SDavid Wu .bank_num = 2, 99349c55878SDavid Wu .pin = 4, 99449c55878SDavid Wu .func = 2, 99549c55878SDavid Wu .route_offset = 0x144, 99649c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 99749c55878SDavid Wu }, 99849c55878SDavid Wu }; 99949c55878SDavid Wu 100049c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = { 100149c55878SDavid Wu { 100249c55878SDavid Wu /* pwm0-0 */ 100349c55878SDavid Wu .bank_num = 0, 100449c55878SDavid Wu .pin = 26, 100549c55878SDavid Wu .func = 1, 100649c55878SDavid Wu .route_offset = 0x50, 100749c55878SDavid Wu .route_val = BIT(16), 100849c55878SDavid Wu }, { 100949c55878SDavid Wu /* pwm0-1 */ 101049c55878SDavid Wu .bank_num = 3, 101149c55878SDavid Wu .pin = 21, 101249c55878SDavid Wu .func = 1, 101349c55878SDavid Wu .route_offset = 0x50, 101449c55878SDavid Wu .route_val = BIT(16) | BIT(0), 101549c55878SDavid Wu }, { 101649c55878SDavid Wu /* pwm1-0 */ 101749c55878SDavid Wu .bank_num = 0, 101849c55878SDavid Wu .pin = 27, 101949c55878SDavid Wu .func = 1, 102049c55878SDavid Wu .route_offset = 0x50, 102149c55878SDavid Wu .route_val = BIT(16 + 1), 102249c55878SDavid Wu }, { 102349c55878SDavid Wu /* pwm1-1 */ 102449c55878SDavid Wu .bank_num = 0, 102549c55878SDavid Wu .pin = 30, 102649c55878SDavid Wu .func = 2, 102749c55878SDavid Wu .route_offset = 0x50, 102849c55878SDavid Wu .route_val = BIT(16 + 1) | BIT(1), 102949c55878SDavid Wu }, { 103049c55878SDavid Wu /* pwm2-0 */ 103149c55878SDavid Wu .bank_num = 0, 103249c55878SDavid Wu .pin = 28, 103349c55878SDavid Wu .func = 1, 103449c55878SDavid Wu .route_offset = 0x50, 103549c55878SDavid Wu .route_val = BIT(16 + 2), 103649c55878SDavid Wu }, { 103749c55878SDavid Wu /* pwm2-1 */ 103849c55878SDavid Wu .bank_num = 1, 103949c55878SDavid Wu .pin = 12, 104049c55878SDavid Wu .func = 2, 104149c55878SDavid Wu .route_offset = 0x50, 104249c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 104349c55878SDavid Wu }, { 104449c55878SDavid Wu /* pwm3-0 */ 104549c55878SDavid Wu .bank_num = 3, 104649c55878SDavid Wu .pin = 26, 104749c55878SDavid Wu .func = 1, 104849c55878SDavid Wu .route_offset = 0x50, 104949c55878SDavid Wu .route_val = BIT(16 + 3), 105049c55878SDavid Wu }, { 105149c55878SDavid Wu /* pwm3-1 */ 105249c55878SDavid Wu .bank_num = 1, 105349c55878SDavid Wu .pin = 11, 105449c55878SDavid Wu .func = 2, 105549c55878SDavid Wu .route_offset = 0x50, 105649c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 105749c55878SDavid Wu }, { 105849c55878SDavid Wu /* sdio-0_d0 */ 105949c55878SDavid Wu .bank_num = 1, 106049c55878SDavid Wu .pin = 1, 106149c55878SDavid Wu .func = 1, 106249c55878SDavid Wu .route_offset = 0x50, 106349c55878SDavid Wu .route_val = BIT(16 + 4), 106449c55878SDavid Wu }, { 106549c55878SDavid Wu /* sdio-1_d0 */ 106649c55878SDavid Wu .bank_num = 3, 106749c55878SDavid Wu .pin = 2, 106849c55878SDavid Wu .func = 1, 106949c55878SDavid Wu .route_offset = 0x50, 107049c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 107149c55878SDavid Wu }, { 107249c55878SDavid Wu /* spi-0_rx */ 107349c55878SDavid Wu .bank_num = 0, 107449c55878SDavid Wu .pin = 13, 107549c55878SDavid Wu .func = 2, 107649c55878SDavid Wu .route_offset = 0x50, 107749c55878SDavid Wu .route_val = BIT(16 + 5), 107849c55878SDavid Wu }, { 107949c55878SDavid Wu /* spi-1_rx */ 108049c55878SDavid Wu .bank_num = 2, 108149c55878SDavid Wu .pin = 0, 108249c55878SDavid Wu .func = 2, 108349c55878SDavid Wu .route_offset = 0x50, 108449c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 108549c55878SDavid Wu }, { 108649c55878SDavid Wu /* emmc-0_cmd */ 108749c55878SDavid Wu .bank_num = 1, 108849c55878SDavid Wu .pin = 22, 108949c55878SDavid Wu .func = 2, 109049c55878SDavid Wu .route_offset = 0x50, 109149c55878SDavid Wu .route_val = BIT(16 + 7), 109249c55878SDavid Wu }, { 109349c55878SDavid Wu /* emmc-1_cmd */ 109449c55878SDavid Wu .bank_num = 2, 109549c55878SDavid Wu .pin = 4, 109649c55878SDavid Wu .func = 2, 109749c55878SDavid Wu .route_offset = 0x50, 109849c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 109949c55878SDavid Wu }, { 110049c55878SDavid Wu /* uart2-0_rx */ 110149c55878SDavid Wu .bank_num = 1, 110249c55878SDavid Wu .pin = 19, 110349c55878SDavid Wu .func = 2, 110449c55878SDavid Wu .route_offset = 0x50, 110549c55878SDavid Wu .route_val = BIT(16 + 8), 110649c55878SDavid Wu }, { 110749c55878SDavid Wu /* uart2-1_rx */ 110849c55878SDavid Wu .bank_num = 1, 110949c55878SDavid Wu .pin = 10, 111049c55878SDavid Wu .func = 2, 111149c55878SDavid Wu .route_offset = 0x50, 111249c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 111349c55878SDavid Wu }, { 111449c55878SDavid Wu /* uart1-0_rx */ 111549c55878SDavid Wu .bank_num = 1, 111649c55878SDavid Wu .pin = 10, 111749c55878SDavid Wu .func = 1, 111849c55878SDavid Wu .route_offset = 0x50, 111949c55878SDavid Wu .route_val = BIT(16 + 11), 112049c55878SDavid Wu }, { 112149c55878SDavid Wu /* uart1-1_rx */ 112249c55878SDavid Wu .bank_num = 3, 112349c55878SDavid Wu .pin = 13, 112449c55878SDavid Wu .func = 1, 112549c55878SDavid Wu .route_offset = 0x50, 112649c55878SDavid Wu .route_val = BIT(16 + 11) | BIT(11), 112749c55878SDavid Wu }, 112849c55878SDavid Wu }; 112949c55878SDavid Wu 113049c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = { 113149c55878SDavid Wu { 113249c55878SDavid Wu /* edphdmi_cecinoutt1 */ 113349c55878SDavid Wu .bank_num = 7, 113449c55878SDavid Wu .pin = 16, 113549c55878SDavid Wu .func = 2, 113649c55878SDavid Wu .route_offset = 0x264, 113749c55878SDavid Wu .route_val = BIT(16 + 12) | BIT(12), 113849c55878SDavid Wu }, { 113949c55878SDavid Wu /* edphdmi_cecinout */ 114049c55878SDavid Wu .bank_num = 7, 114149c55878SDavid Wu .pin = 23, 114249c55878SDavid Wu .func = 4, 114349c55878SDavid Wu .route_offset = 0x264, 114449c55878SDavid Wu .route_val = BIT(16 + 12), 114549c55878SDavid Wu }, 114649c55878SDavid Wu }; 114749c55878SDavid Wu 1148b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = { 1149b3077611SDavid Wu { 1150d5517017SDavid Wu /* rtc_clk */ 1151d5517017SDavid Wu .bank_num = 0, 1152d5517017SDavid Wu .pin = 19, 1153d5517017SDavid Wu .func = 1, 1154d5517017SDavid Wu .route_offset = 0x314, 1155d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1156d5517017SDavid Wu }, { 1157b3077611SDavid Wu /* uart2_rxm0 */ 1158b3077611SDavid Wu .bank_num = 1, 1159b3077611SDavid Wu .pin = 22, 1160b3077611SDavid Wu .func = 2, 1161b3077611SDavid Wu .route_offset = 0x314, 1162b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1163b3077611SDavid Wu }, { 1164b3077611SDavid Wu /* uart2_rxm1 */ 1165b3077611SDavid Wu .bank_num = 4, 1166b3077611SDavid Wu .pin = 26, 1167b3077611SDavid Wu .func = 2, 1168b3077611SDavid Wu .route_offset = 0x314, 1169b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1170b3077611SDavid Wu }, { 1171b3077611SDavid Wu /* i2c3_sdam0 */ 1172b3077611SDavid Wu .bank_num = 0, 1173b3077611SDavid Wu .pin = 23, 1174b3077611SDavid Wu .func = 2, 1175b3077611SDavid Wu .route_offset = 0x314, 1176b3077611SDavid Wu .route_val = BIT(16 + 4), 1177b3077611SDavid Wu }, { 1178b3077611SDavid Wu /* i2c3_sdam1 */ 1179b3077611SDavid Wu .bank_num = 3, 1180b3077611SDavid Wu .pin = 12, 1181b3077611SDavid Wu .func = 2, 1182b3077611SDavid Wu .route_offset = 0x314, 1183b3077611SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 1184d5517017SDavid Wu }, { 1185d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1186d5517017SDavid Wu .bank_num = 1, 1187d5517017SDavid Wu .pin = 3, 1188d5517017SDavid Wu .func = 2, 1189d5517017SDavid Wu .route_offset = 0x308, 1190d5517017SDavid Wu .route_val = BIT(16 + 3), 1191d5517017SDavid Wu }, { 1192d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1193d5517017SDavid Wu .bank_num = 1, 1194d5517017SDavid Wu .pin = 4, 1195d5517017SDavid Wu .func = 2, 1196d5517017SDavid Wu .route_offset = 0x308, 1197d5517017SDavid Wu .route_val = BIT(16 + 3), 1198d5517017SDavid Wu }, { 1199d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1200d5517017SDavid Wu .bank_num = 1, 1201d5517017SDavid Wu .pin = 13, 1202d5517017SDavid Wu .func = 2, 1203d5517017SDavid Wu .route_offset = 0x308, 1204d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1205d5517017SDavid Wu }, { 1206d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1207d5517017SDavid Wu .bank_num = 1, 1208d5517017SDavid Wu .pin = 14, 1209d5517017SDavid Wu .func = 2, 1210d5517017SDavid Wu .route_offset = 0x308, 1211d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1212d5517017SDavid Wu }, { 1213d5517017SDavid Wu /* pdm-clkm0 */ 1214d5517017SDavid Wu .bank_num = 1, 1215d5517017SDavid Wu .pin = 4, 1216d5517017SDavid Wu .func = 3, 1217d5517017SDavid Wu .route_offset = 0x308, 1218d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1219d5517017SDavid Wu }, { 1220d5517017SDavid Wu /* pdm-clkm1 */ 1221d5517017SDavid Wu .bank_num = 1, 1222d5517017SDavid Wu .pin = 14, 1223d5517017SDavid Wu .func = 4, 1224d5517017SDavid Wu .route_offset = 0x308, 1225d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1226d5517017SDavid Wu }, { 1227d5517017SDavid Wu /* pdm-clkm2 */ 1228d5517017SDavid Wu .bank_num = 2, 1229d5517017SDavid Wu .pin = 6, 1230d5517017SDavid Wu .func = 2, 1231d5517017SDavid Wu .route_offset = 0x308, 1232d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1233d5517017SDavid Wu }, { 1234d5517017SDavid Wu /* pdm-clkm-m2 */ 1235d5517017SDavid Wu .bank_num = 2, 1236d5517017SDavid Wu .pin = 4, 1237d5517017SDavid Wu .func = 3, 1238d5517017SDavid Wu .route_offset = 0x600, 1239d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1240d5517017SDavid Wu }, 1241d5517017SDavid Wu }; 1242d5517017SDavid Wu 1243d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = { 1244d5517017SDavid Wu { 1245d5517017SDavid Wu /* rtc_clk */ 1246d5517017SDavid Wu .bank_num = 0, 1247d5517017SDavid Wu .pin = 19, 1248d5517017SDavid Wu .func = 1, 1249d5517017SDavid Wu .route_offset = 0x314, 1250d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1251d5517017SDavid Wu }, { 1252d5517017SDavid Wu /* uart2_rxm0 */ 1253d5517017SDavid Wu .bank_num = 1, 1254d5517017SDavid Wu .pin = 22, 1255d5517017SDavid Wu .func = 2, 1256d5517017SDavid Wu .route_offset = 0x314, 1257d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1258d5517017SDavid Wu }, { 1259d5517017SDavid Wu /* uart2_rxm1 */ 1260d5517017SDavid Wu .bank_num = 4, 1261d5517017SDavid Wu .pin = 26, 1262d5517017SDavid Wu .func = 2, 1263d5517017SDavid Wu .route_offset = 0x314, 1264d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1265d5517017SDavid Wu }, { 1266d5517017SDavid Wu /* i2c3_sdam0 */ 1267d5517017SDavid Wu .bank_num = 0, 1268d5517017SDavid Wu .pin = 15, 1269d5517017SDavid Wu .func = 2, 1270d5517017SDavid Wu .route_offset = 0x608, 1271d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9), 1272d5517017SDavid Wu }, { 1273d5517017SDavid Wu /* i2c3_sdam1 */ 1274d5517017SDavid Wu .bank_num = 3, 1275d5517017SDavid Wu .pin = 12, 1276d5517017SDavid Wu .func = 2, 1277d5517017SDavid Wu .route_offset = 0x608, 1278d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8), 1279d5517017SDavid Wu }, { 1280d5517017SDavid Wu /* i2c3_sdam2 */ 1281d5517017SDavid Wu .bank_num = 2, 1282d5517017SDavid Wu .pin = 0, 1283d5517017SDavid Wu .func = 3, 1284d5517017SDavid Wu .route_offset = 0x608, 1285d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9), 1286d5517017SDavid Wu }, { 1287d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1288d5517017SDavid Wu .bank_num = 1, 1289d5517017SDavid Wu .pin = 3, 1290d5517017SDavid Wu .func = 2, 1291d5517017SDavid Wu .route_offset = 0x308, 1292d5517017SDavid Wu .route_val = BIT(16 + 3), 1293d5517017SDavid Wu }, { 1294d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1295d5517017SDavid Wu .bank_num = 1, 1296d5517017SDavid Wu .pin = 4, 1297d5517017SDavid Wu .func = 2, 1298d5517017SDavid Wu .route_offset = 0x308, 1299d5517017SDavid Wu .route_val = BIT(16 + 3), 1300d5517017SDavid Wu }, { 1301d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1302d5517017SDavid Wu .bank_num = 1, 1303d5517017SDavid Wu .pin = 13, 1304d5517017SDavid Wu .func = 2, 1305d5517017SDavid Wu .route_offset = 0x308, 1306d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1307d5517017SDavid Wu }, { 1308d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1309d5517017SDavid Wu .bank_num = 1, 1310d5517017SDavid Wu .pin = 14, 1311d5517017SDavid Wu .func = 2, 1312d5517017SDavid Wu .route_offset = 0x308, 1313d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1314d5517017SDavid Wu }, { 1315d5517017SDavid Wu /* pdm-clkm0 */ 1316d5517017SDavid Wu .bank_num = 1, 1317d5517017SDavid Wu .pin = 4, 1318d5517017SDavid Wu .func = 3, 1319d5517017SDavid Wu .route_offset = 0x308, 1320d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1321d5517017SDavid Wu }, { 1322d5517017SDavid Wu /* pdm-clkm1 */ 1323d5517017SDavid Wu .bank_num = 1, 1324d5517017SDavid Wu .pin = 14, 1325d5517017SDavid Wu .func = 4, 1326d5517017SDavid Wu .route_offset = 0x308, 1327d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1328d5517017SDavid Wu }, { 1329d5517017SDavid Wu /* pdm-clkm2 */ 1330d5517017SDavid Wu .bank_num = 2, 1331d5517017SDavid Wu .pin = 6, 1332d5517017SDavid Wu .func = 2, 1333d5517017SDavid Wu .route_offset = 0x308, 1334d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1335d5517017SDavid Wu }, { 1336d5517017SDavid Wu /* pdm-clkm-m2 */ 1337d5517017SDavid Wu .bank_num = 2, 1338d5517017SDavid Wu .pin = 4, 1339d5517017SDavid Wu .func = 3, 1340d5517017SDavid Wu .route_offset = 0x600, 1341d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1342d5517017SDavid Wu }, { 1343d5517017SDavid Wu /* spi1_miso */ 1344d5517017SDavid Wu .bank_num = 3, 1345d5517017SDavid Wu .pin = 10, 1346d5517017SDavid Wu .func = 3, 1347d5517017SDavid Wu .route_offset = 0x314, 1348d5517017SDavid Wu .route_val = BIT(16 + 9), 1349d5517017SDavid Wu }, { 1350d5517017SDavid Wu /* spi1_miso_m1 */ 1351d5517017SDavid Wu .bank_num = 2, 1352d5517017SDavid Wu .pin = 4, 1353d5517017SDavid Wu .func = 2, 1354d5517017SDavid Wu .route_offset = 0x314, 1355d5517017SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 1356d5517017SDavid Wu }, { 1357d5517017SDavid Wu /* owire_m0 */ 1358d5517017SDavid Wu .bank_num = 0, 1359d5517017SDavid Wu .pin = 11, 1360d5517017SDavid Wu .func = 3, 1361d5517017SDavid Wu .route_offset = 0x314, 1362d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 1363d5517017SDavid Wu }, { 1364d5517017SDavid Wu /* owire_m1 */ 1365d5517017SDavid Wu .bank_num = 1, 1366d5517017SDavid Wu .pin = 22, 1367d5517017SDavid Wu .func = 7, 1368d5517017SDavid Wu .route_offset = 0x314, 1369d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 1370d5517017SDavid Wu }, { 1371d5517017SDavid Wu /* owire_m2 */ 1372d5517017SDavid Wu .bank_num = 2, 1373d5517017SDavid Wu .pin = 2, 1374d5517017SDavid Wu .func = 5, 1375d5517017SDavid Wu .route_offset = 0x314, 1376d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 1377d5517017SDavid Wu }, { 1378d5517017SDavid Wu /* can_rxd_m0 */ 1379d5517017SDavid Wu .bank_num = 0, 1380d5517017SDavid Wu .pin = 11, 1381d5517017SDavid Wu .func = 2, 1382d5517017SDavid Wu .route_offset = 0x314, 1383d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1384d5517017SDavid Wu }, { 1385d5517017SDavid Wu /* can_rxd_m1 */ 1386d5517017SDavid Wu .bank_num = 1, 1387d5517017SDavid Wu .pin = 22, 1388d5517017SDavid Wu .func = 5, 1389d5517017SDavid Wu .route_offset = 0x314, 1390d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1391d5517017SDavid Wu }, { 1392d5517017SDavid Wu /* can_rxd_m2 */ 1393d5517017SDavid Wu .bank_num = 2, 1394d5517017SDavid Wu .pin = 2, 1395d5517017SDavid Wu .func = 4, 1396d5517017SDavid Wu .route_offset = 0x314, 1397d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1398d5517017SDavid Wu }, { 1399d5517017SDavid Wu /* mac_rxd0_m0 */ 1400d5517017SDavid Wu .bank_num = 1, 1401d5517017SDavid Wu .pin = 20, 1402d5517017SDavid Wu .func = 3, 1403d5517017SDavid Wu .route_offset = 0x314, 1404d5517017SDavid Wu .route_val = BIT(16 + 14), 1405d5517017SDavid Wu }, { 1406d5517017SDavid Wu /* mac_rxd0_m1 */ 1407d5517017SDavid Wu .bank_num = 4, 1408d5517017SDavid Wu .pin = 2, 1409d5517017SDavid Wu .func = 2, 1410d5517017SDavid Wu .route_offset = 0x314, 1411d5517017SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 1412d5517017SDavid Wu }, { 1413d5517017SDavid Wu /* uart3_rx */ 1414d5517017SDavid Wu .bank_num = 3, 1415d5517017SDavid Wu .pin = 12, 1416d5517017SDavid Wu .func = 4, 1417d5517017SDavid Wu .route_offset = 0x314, 1418d5517017SDavid Wu .route_val = BIT(16 + 15), 1419d5517017SDavid Wu }, { 1420d5517017SDavid Wu /* uart3_rx_m1 */ 1421d5517017SDavid Wu .bank_num = 0, 1422d5517017SDavid Wu .pin = 17, 1423d5517017SDavid Wu .func = 3, 1424d5517017SDavid Wu .route_offset = 0x314, 1425d5517017SDavid Wu .route_val = BIT(16 + 15) | BIT(15), 1426b3077611SDavid Wu }, 1427b3077611SDavid Wu }; 1428b3077611SDavid Wu 142949c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = { 143049c55878SDavid Wu { 143149c55878SDavid Wu /* uart2dbg_rxm0 */ 143249c55878SDavid Wu .bank_num = 1, 143349c55878SDavid Wu .pin = 1, 143449c55878SDavid Wu .func = 2, 143549c55878SDavid Wu .route_offset = 0x50, 143649c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1), 143749c55878SDavid Wu }, { 143849c55878SDavid Wu /* uart2dbg_rxm1 */ 143949c55878SDavid Wu .bank_num = 2, 144049c55878SDavid Wu .pin = 1, 144149c55878SDavid Wu .func = 1, 144249c55878SDavid Wu .route_offset = 0x50, 144349c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1) | BIT(0), 144449c55878SDavid Wu }, { 144549c55878SDavid Wu /* gmac-m1_rxd0 */ 144649c55878SDavid Wu .bank_num = 1, 144749c55878SDavid Wu .pin = 11, 144849c55878SDavid Wu .func = 2, 144949c55878SDavid Wu .route_offset = 0x50, 145049c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 145149c55878SDavid Wu }, { 145249c55878SDavid Wu /* gmac-m1-optimized_rxd3 */ 145349c55878SDavid Wu .bank_num = 1, 145449c55878SDavid Wu .pin = 14, 145549c55878SDavid Wu .func = 2, 145649c55878SDavid Wu .route_offset = 0x50, 145749c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(10), 145849c55878SDavid Wu }, { 145949c55878SDavid Wu /* pdm_sdi0m0 */ 146049c55878SDavid Wu .bank_num = 2, 146149c55878SDavid Wu .pin = 19, 146249c55878SDavid Wu .func = 2, 146349c55878SDavid Wu .route_offset = 0x50, 146449c55878SDavid Wu .route_val = BIT(16 + 3), 146549c55878SDavid Wu }, { 146649c55878SDavid Wu /* pdm_sdi0m1 */ 146749c55878SDavid Wu .bank_num = 1, 146849c55878SDavid Wu .pin = 23, 146949c55878SDavid Wu .func = 3, 147049c55878SDavid Wu .route_offset = 0x50, 147149c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 147249c55878SDavid Wu }, { 147349c55878SDavid Wu /* spi_rxdm2 */ 147449c55878SDavid Wu .bank_num = 3, 147549c55878SDavid Wu .pin = 2, 147649c55878SDavid Wu .func = 4, 147749c55878SDavid Wu .route_offset = 0x50, 147849c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5), 147949c55878SDavid Wu }, { 148049c55878SDavid Wu /* i2s2_sdim0 */ 148149c55878SDavid Wu .bank_num = 1, 148249c55878SDavid Wu .pin = 24, 148349c55878SDavid Wu .func = 1, 148449c55878SDavid Wu .route_offset = 0x50, 148549c55878SDavid Wu .route_val = BIT(16 + 6), 148649c55878SDavid Wu }, { 148749c55878SDavid Wu /* i2s2_sdim1 */ 148849c55878SDavid Wu .bank_num = 3, 148949c55878SDavid Wu .pin = 2, 149049c55878SDavid Wu .func = 6, 149149c55878SDavid Wu .route_offset = 0x50, 149249c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 149349c55878SDavid Wu }, { 149449c55878SDavid Wu /* card_iom1 */ 149549c55878SDavid Wu .bank_num = 2, 149649c55878SDavid Wu .pin = 22, 149749c55878SDavid Wu .func = 3, 149849c55878SDavid Wu .route_offset = 0x50, 149949c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 150049c55878SDavid Wu }, { 150149c55878SDavid Wu /* tsp_d5m1 */ 150249c55878SDavid Wu .bank_num = 2, 150349c55878SDavid Wu .pin = 16, 150449c55878SDavid Wu .func = 3, 150549c55878SDavid Wu .route_offset = 0x50, 150649c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 150749c55878SDavid Wu }, { 150849c55878SDavid Wu /* cif_data5m1 */ 150949c55878SDavid Wu .bank_num = 2, 151049c55878SDavid Wu .pin = 16, 151149c55878SDavid Wu .func = 4, 151249c55878SDavid Wu .route_offset = 0x50, 151349c55878SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 151449c55878SDavid Wu }, 151549c55878SDavid Wu }; 151649c55878SDavid Wu 151749c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = { 151849c55878SDavid Wu { 151949c55878SDavid Wu /* uart2dbga_rx */ 152049c55878SDavid Wu .bank_num = 4, 152149c55878SDavid Wu .pin = 8, 152249c55878SDavid Wu .func = 2, 152349c55878SDavid Wu .route_offset = 0xe21c, 152449c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 152549c55878SDavid Wu }, { 152649c55878SDavid Wu /* uart2dbgb_rx */ 152749c55878SDavid Wu .bank_num = 4, 152849c55878SDavid Wu .pin = 16, 152949c55878SDavid Wu .func = 2, 153049c55878SDavid Wu .route_offset = 0xe21c, 153149c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 153249c55878SDavid Wu }, { 153349c55878SDavid Wu /* uart2dbgc_rx */ 153449c55878SDavid Wu .bank_num = 4, 153549c55878SDavid Wu .pin = 19, 153649c55878SDavid Wu .func = 1, 153749c55878SDavid Wu .route_offset = 0xe21c, 153849c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 153949c55878SDavid Wu }, { 154049c55878SDavid Wu /* pcie_clkreqn */ 154149c55878SDavid Wu .bank_num = 2, 154249c55878SDavid Wu .pin = 26, 154349c55878SDavid Wu .func = 2, 154449c55878SDavid Wu .route_offset = 0xe21c, 154549c55878SDavid Wu .route_val = BIT(16 + 14), 154649c55878SDavid Wu }, { 154749c55878SDavid Wu /* pcie_clkreqnb */ 154849c55878SDavid Wu .bank_num = 4, 154949c55878SDavid Wu .pin = 24, 155049c55878SDavid Wu .func = 1, 155149c55878SDavid Wu .route_offset = 0xe21c, 155249c55878SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 155349c55878SDavid Wu }, 155449c55878SDavid Wu }; 155549c55878SDavid Wu 155649e04eddSJianqun Xu static enum rockchip_pin_route_type 155749e04eddSJianqun Xu rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, 155849c55878SDavid Wu int mux, u32 *reg, u32 *value) 155949c55878SDavid Wu { 156049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 156149c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 156249c55878SDavid Wu struct rockchip_mux_route_data *data; 156349c55878SDavid Wu int i; 156449c55878SDavid Wu 156549c55878SDavid Wu for (i = 0; i < ctrl->niomux_routes; i++) { 156649c55878SDavid Wu data = &ctrl->iomux_routes[i]; 156749c55878SDavid Wu if ((data->bank_num == bank->bank_num) && 156849c55878SDavid Wu (data->pin == pin) && (data->func == mux)) 156949c55878SDavid Wu break; 157049c55878SDavid Wu } 157149c55878SDavid Wu 157249c55878SDavid Wu if (i >= ctrl->niomux_routes) 157349e04eddSJianqun Xu return ROUTE_TYPE_INVALID; 157449c55878SDavid Wu 157549c55878SDavid Wu *reg = data->route_offset; 157649c55878SDavid Wu *value = data->route_val; 157749c55878SDavid Wu 157849e04eddSJianqun Xu return data->route_type; 157949c55878SDavid Wu } 158049c55878SDavid Wu 158149c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) 158249c55878SDavid Wu { 158349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 158449c55878SDavid Wu int iomux_num = (pin / 8); 158549c55878SDavid Wu struct regmap *regmap; 158649c55878SDavid Wu unsigned int val; 158749c55878SDavid Wu int reg, ret, mask, mux_type; 158849c55878SDavid Wu u8 bit; 158949c55878SDavid Wu 159049c55878SDavid Wu if (iomux_num > 3) 159149c55878SDavid Wu return -EINVAL; 159249c55878SDavid Wu 159349c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 159449c55878SDavid Wu debug("pin %d is unrouted\n", pin); 159549c55878SDavid Wu return -EINVAL; 159649c55878SDavid Wu } 159749c55878SDavid Wu 159849c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 159949c55878SDavid Wu return RK_FUNC_GPIO; 160049c55878SDavid Wu 1601cf04a17bSJianqun Xu if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 1602cf04a17bSJianqun Xu regmap = priv->regmap_pmu; 1603cf04a17bSJianqun Xu else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) 1604cf04a17bSJianqun Xu regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base; 1605cf04a17bSJianqun Xu else 1606cf04a17bSJianqun Xu regmap = priv->regmap_base; 160749c55878SDavid Wu 160849c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 160949c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 161049c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 161149c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 161249c55878SDavid Wu if ((pin % 8) >= 4) 161349c55878SDavid Wu reg += 0x4; 161449c55878SDavid Wu bit = (pin % 4) * 4; 161549c55878SDavid Wu mask = 0xf; 161649c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 161749c55878SDavid Wu if ((pin % 8) >= 5) 161849c55878SDavid Wu reg += 0x4; 161949c55878SDavid Wu bit = (pin % 8 % 5) * 3; 162049c55878SDavid Wu mask = 0x7; 162149c55878SDavid Wu } else { 162249c55878SDavid Wu bit = (pin % 8) * 2; 162349c55878SDavid Wu mask = 0x3; 162449c55878SDavid Wu } 162549c55878SDavid Wu 162649c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 162749c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 162849c55878SDavid Wu 162949c55878SDavid Wu ret = regmap_read(regmap, reg, &val); 163049c55878SDavid Wu if (ret) 163149c55878SDavid Wu return ret; 163249c55878SDavid Wu 163349c55878SDavid Wu return ((val >> bit) & mask); 163449c55878SDavid Wu } 163549c55878SDavid Wu 163649c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, 163749c55878SDavid Wu int index) 163849c55878SDavid Wu { struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 163949c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 164049c55878SDavid Wu 164149c55878SDavid Wu return rockchip_get_mux(&ctrl->pin_banks[banknum], index); 164249c55878SDavid Wu } 164349c55878SDavid Wu 164449c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank, 164549c55878SDavid Wu int pin, int mux) 164649c55878SDavid Wu { 164749c55878SDavid Wu int iomux_num = (pin / 8); 164849c55878SDavid Wu 164949c55878SDavid Wu if (iomux_num > 3) 165049c55878SDavid Wu return -EINVAL; 165149c55878SDavid Wu 165249c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 165349c55878SDavid Wu debug("pin %d is unrouted\n", pin); 165449c55878SDavid Wu return -EINVAL; 165549c55878SDavid Wu } 165649c55878SDavid Wu 165749c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 165849c55878SDavid Wu if (mux != IOMUX_GPIO_ONLY) { 165949c55878SDavid Wu debug("pin %d only supports a gpio mux\n", pin); 166049c55878SDavid Wu return -ENOTSUPP; 166149c55878SDavid Wu } 166249c55878SDavid Wu } 166349c55878SDavid Wu 166449c55878SDavid Wu return 0; 166549c55878SDavid Wu } 166649c55878SDavid Wu 166749c55878SDavid Wu /* 166849c55878SDavid Wu * Set a new mux function for a pin. 166949c55878SDavid Wu * 167049c55878SDavid Wu * The register is divided into the upper and lower 16 bit. When changing 167149c55878SDavid Wu * a value, the previous register value is not read and changed. Instead 167249c55878SDavid Wu * it seems the changed bits are marked in the upper 16 bit, while the 167349c55878SDavid Wu * changed value gets set in the same offset in the lower 16 bit. 167449c55878SDavid Wu * All pin settings seem to be 2 bit wide in both the upper and lower 167549c55878SDavid Wu * parts. 167649c55878SDavid Wu * @bank: pin bank to change 167749c55878SDavid Wu * @pin: pin to change 167849c55878SDavid Wu * @mux: new mux function to set 167949c55878SDavid Wu */ 168049c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) 168149c55878SDavid Wu { 168249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 168349c55878SDavid Wu int iomux_num = (pin / 8); 168449c55878SDavid Wu struct regmap *regmap; 168549c55878SDavid Wu int reg, ret, mask, mux_type; 168649c55878SDavid Wu u8 bit; 168749e04eddSJianqun Xu u32 data; 168849c55878SDavid Wu 168949c55878SDavid Wu ret = rockchip_verify_mux(bank, pin, mux); 169049c55878SDavid Wu if (ret < 0) 169149c55878SDavid Wu return ret; 169249c55878SDavid Wu 169349c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 169449c55878SDavid Wu return 0; 169549c55878SDavid Wu 169649c55878SDavid Wu debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); 169749c55878SDavid Wu 1698cf04a17bSJianqun Xu if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 1699cf04a17bSJianqun Xu regmap = priv->regmap_pmu; 1700cf04a17bSJianqun Xu else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) 1701cf04a17bSJianqun Xu regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base; 1702cf04a17bSJianqun Xu else 1703cf04a17bSJianqun Xu regmap = priv->regmap_base; 170449c55878SDavid Wu 170549c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 170649c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 170749c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 170849c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 170949c55878SDavid Wu if ((pin % 8) >= 4) 171049c55878SDavid Wu reg += 0x4; 171149c55878SDavid Wu bit = (pin % 4) * 4; 171249c55878SDavid Wu mask = 0xf; 171349c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 171449c55878SDavid Wu if ((pin % 8) >= 5) 171549c55878SDavid Wu reg += 0x4; 171649c55878SDavid Wu bit = (pin % 8 % 5) * 3; 171749c55878SDavid Wu mask = 0x7; 171849c55878SDavid Wu } else { 171949c55878SDavid Wu bit = (pin % 8) * 2; 172049c55878SDavid Wu mask = 0x3; 172149c55878SDavid Wu } 172249c55878SDavid Wu 172349c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 172449c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 172549c55878SDavid Wu 172649c55878SDavid Wu if (bank->route_mask & BIT(pin)) { 172749e04eddSJianqun Xu u32 route_reg = 0, route_val = 0; 172849e04eddSJianqun Xu 172949e04eddSJianqun Xu ret = rockchip_get_mux_route(bank, pin, mux, 173049e04eddSJianqun Xu &route_reg, &route_val); 173149e04eddSJianqun Xu switch (ret) { 173249e04eddSJianqun Xu case ROUTE_TYPE_DEFAULT: 173349e04eddSJianqun Xu regmap_write(regmap, route_reg, route_val); 173449e04eddSJianqun Xu break; 173549e04eddSJianqun Xu case ROUTE_TYPE_TOPGRF: 173649e04eddSJianqun Xu regmap_write(priv->regmap_base, route_reg, route_val); 173749e04eddSJianqun Xu break; 173849e04eddSJianqun Xu case ROUTE_TYPE_PMUGRF: 173949e04eddSJianqun Xu regmap_write(priv->regmap_pmu, route_reg, route_val); 174049e04eddSJianqun Xu break; 174149e04eddSJianqun Xu case ROUTE_TYPE_INVALID: /* Fall through */ 174249e04eddSJianqun Xu default: 174349e04eddSJianqun Xu break; 174449c55878SDavid Wu } 174549c55878SDavid Wu } 174649c55878SDavid Wu 17474bafc2daSDavid Wu if (mux_type & IOMUX_WRITABLE_32BIT) { 17488bf1bc66SDavid Wu regmap_read(regmap, reg, &data); 17494bafc2daSDavid Wu data &= ~(mask << bit); 17504bafc2daSDavid Wu } else { 175149c55878SDavid Wu data = (mask << (bit + 16)); 17524bafc2daSDavid Wu } 17538bf1bc66SDavid Wu 175449c55878SDavid Wu data |= (mux & mask) << bit; 175549c55878SDavid Wu ret = regmap_write(regmap, reg, data); 175649c55878SDavid Wu 175749c55878SDavid Wu return ret; 175849c55878SDavid Wu } 175949c55878SDavid Wu 176049c55878SDavid Wu #define PX30_PULL_PMU_OFFSET 0x10 176149c55878SDavid Wu #define PX30_PULL_GRF_OFFSET 0x60 176249c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN 2 176349c55878SDavid Wu #define PX30_PULL_PINS_PER_REG 8 176449c55878SDavid Wu #define PX30_PULL_BANK_STRIDE 16 176549c55878SDavid Wu 176649c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 176749c55878SDavid Wu int pin_num, struct regmap **regmap, 176849c55878SDavid Wu int *reg, u8 *bit) 176949c55878SDavid Wu { 177049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 177149c55878SDavid Wu 177249c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 177349c55878SDavid Wu if (bank->bank_num == 0) { 177449c55878SDavid Wu *regmap = priv->regmap_pmu; 177549c55878SDavid Wu *reg = PX30_PULL_PMU_OFFSET; 177649c55878SDavid Wu } else { 177749c55878SDavid Wu *regmap = priv->regmap_base; 177849c55878SDavid Wu *reg = PX30_PULL_GRF_OFFSET; 177949c55878SDavid Wu 178049c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 178149c55878SDavid Wu *reg -= 0x10; 178249c55878SDavid Wu *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; 178349c55878SDavid Wu } 178449c55878SDavid Wu 178549c55878SDavid Wu *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4); 178649c55878SDavid Wu *bit = (pin_num % PX30_PULL_PINS_PER_REG); 178749c55878SDavid Wu *bit *= PX30_PULL_BITS_PER_PIN; 178849c55878SDavid Wu } 178949c55878SDavid Wu 179049c55878SDavid Wu #define PX30_DRV_PMU_OFFSET 0x20 179149c55878SDavid Wu #define PX30_DRV_GRF_OFFSET 0xf0 179249c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN 2 179349c55878SDavid Wu #define PX30_DRV_PINS_PER_REG 8 179449c55878SDavid Wu #define PX30_DRV_BANK_STRIDE 16 179549c55878SDavid Wu 179649c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 179749c55878SDavid Wu int pin_num, struct regmap **regmap, 179849c55878SDavid Wu int *reg, u8 *bit) 179949c55878SDavid Wu { 180049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 180149c55878SDavid Wu 180249c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 180349c55878SDavid Wu if (bank->bank_num == 0) { 180449c55878SDavid Wu *regmap = priv->regmap_pmu; 180549c55878SDavid Wu *reg = PX30_DRV_PMU_OFFSET; 180649c55878SDavid Wu } else { 180749c55878SDavid Wu *regmap = priv->regmap_base; 180849c55878SDavid Wu *reg = PX30_DRV_GRF_OFFSET; 180949c55878SDavid Wu 181049c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 181149c55878SDavid Wu *reg -= 0x10; 181249c55878SDavid Wu *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; 181349c55878SDavid Wu } 181449c55878SDavid Wu 181549c55878SDavid Wu *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4); 181649c55878SDavid Wu *bit = (pin_num % PX30_DRV_PINS_PER_REG); 181749c55878SDavid Wu *bit *= PX30_DRV_BITS_PER_PIN; 181849c55878SDavid Wu } 181949c55878SDavid Wu 182049c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET 0x38 182149c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET 0xc0 182249c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG 16 182349c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE 16 182449c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG 8 182549c55878SDavid Wu 182649c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 182749c55878SDavid Wu int pin_num, 182849c55878SDavid Wu struct regmap **regmap, 182949c55878SDavid Wu int *reg, u8 *bit) 183049c55878SDavid Wu { 183149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 183249c55878SDavid Wu int pins_per_reg; 183349c55878SDavid Wu 183449c55878SDavid Wu if (bank->bank_num == 0) { 183549c55878SDavid Wu *regmap = priv->regmap_pmu; 183649c55878SDavid Wu *reg = PX30_SCHMITT_PMU_OFFSET; 183749c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 183849c55878SDavid Wu } else { 183949c55878SDavid Wu *regmap = priv->regmap_base; 184049c55878SDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 184149c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 184249c55878SDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 184349c55878SDavid Wu } 184449c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 184549c55878SDavid Wu *bit = pin_num % pins_per_reg; 184649c55878SDavid Wu 184749c55878SDavid Wu return 0; 184849c55878SDavid Wu } 184949c55878SDavid Wu 185049c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET 0x10 185149c55878SDavid Wu #define RV1108_PULL_OFFSET 0x110 185249c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG 8 185349c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN 2 185449c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE 16 185549c55878SDavid Wu 185649c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 185749c55878SDavid Wu int pin_num, struct regmap **regmap, 185849c55878SDavid Wu int *reg, u8 *bit) 185949c55878SDavid Wu { 186049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 186149c55878SDavid Wu 186249c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 186349c55878SDavid Wu if (bank->bank_num == 0) { 186449c55878SDavid Wu *regmap = priv->regmap_pmu; 186549c55878SDavid Wu *reg = RV1108_PULL_PMU_OFFSET; 186649c55878SDavid Wu } else { 186749c55878SDavid Wu *reg = RV1108_PULL_OFFSET; 186849c55878SDavid Wu *regmap = priv->regmap_base; 186949c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 187049c55878SDavid Wu *reg -= 0x10; 187149c55878SDavid Wu *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE; 187249c55878SDavid Wu } 187349c55878SDavid Wu 187449c55878SDavid Wu *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4); 187549c55878SDavid Wu *bit = (pin_num % RV1108_PULL_PINS_PER_REG); 187649c55878SDavid Wu *bit *= RV1108_PULL_BITS_PER_PIN; 187749c55878SDavid Wu } 187849c55878SDavid Wu 187949c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET 0x20 188049c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET 0x210 188149c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN 2 188249c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG 8 188349c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE 16 188449c55878SDavid Wu 188549c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 188649c55878SDavid Wu int pin_num, struct regmap **regmap, 188749c55878SDavid Wu int *reg, u8 *bit) 188849c55878SDavid Wu { 188949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 189049c55878SDavid Wu 189149c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 189249c55878SDavid Wu if (bank->bank_num == 0) { 189349c55878SDavid Wu *regmap = priv->regmap_pmu; 189449c55878SDavid Wu *reg = RV1108_DRV_PMU_OFFSET; 189549c55878SDavid Wu } else { 189649c55878SDavid Wu *regmap = priv->regmap_base; 189749c55878SDavid Wu *reg = RV1108_DRV_GRF_OFFSET; 189849c55878SDavid Wu 189949c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 190049c55878SDavid Wu *reg -= 0x10; 190149c55878SDavid Wu *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE; 190249c55878SDavid Wu } 190349c55878SDavid Wu 190449c55878SDavid Wu *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4); 190549c55878SDavid Wu *bit = pin_num % RV1108_DRV_PINS_PER_REG; 190649c55878SDavid Wu *bit *= RV1108_DRV_BITS_PER_PIN; 190749c55878SDavid Wu } 190849c55878SDavid Wu 190949c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET 0x30 191049c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET 0x388 191149c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE 8 191249c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG 16 191349c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG 8 191449c55878SDavid Wu 191549c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 191649c55878SDavid Wu int pin_num, 191749c55878SDavid Wu struct regmap **regmap, 191849c55878SDavid Wu int *reg, u8 *bit) 191949c55878SDavid Wu { 192049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 192149c55878SDavid Wu int pins_per_reg; 192249c55878SDavid Wu 192349c55878SDavid Wu if (bank->bank_num == 0) { 192449c55878SDavid Wu *regmap = priv->regmap_pmu; 192549c55878SDavid Wu *reg = RV1108_SCHMITT_PMU_OFFSET; 192649c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG; 192749c55878SDavid Wu } else { 192849c55878SDavid Wu *regmap = priv->regmap_base; 192949c55878SDavid Wu *reg = RV1108_SCHMITT_GRF_OFFSET; 193049c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG; 193149c55878SDavid Wu *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE; 193249c55878SDavid Wu } 193349c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 193449c55878SDavid Wu *bit = pin_num % pins_per_reg; 193549c55878SDavid Wu 193649c55878SDavid Wu return 0; 193749c55878SDavid Wu } 193849c55878SDavid Wu 1939cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET 0x40 1940cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET 0x10108 1941cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG 8 1942cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN 2 1943cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE 16 1944cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */ 1945cf04a17bSJianqun Xu 1946cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1947cf04a17bSJianqun Xu int pin_num, struct regmap **regmap, 1948cf04a17bSJianqun Xu int *reg, u8 *bit) 1949cf04a17bSJianqun Xu { 1950cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1951cf04a17bSJianqun Xu 1952cf04a17bSJianqun Xu /* The first 24 pins of the first bank are located in PMU */ 1953cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1954cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1955cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1956cf04a17bSJianqun Xu *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 1957cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4); 1958cf04a17bSJianqun Xu *bit = pin_num % RV1126_PULL_PINS_PER_REG; 1959cf04a17bSJianqun Xu *bit *= RV1126_PULL_BITS_PER_PIN; 1960cf04a17bSJianqun Xu return; 1961cf04a17bSJianqun Xu } 1962cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 1963cf04a17bSJianqun Xu *reg = RV1126_PULL_PMU_OFFSET; 1964cf04a17bSJianqun Xu } else { 1965cf04a17bSJianqun Xu *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 1966cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1967d499d466SJianqun Xu *reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE; 1968cf04a17bSJianqun Xu } 1969cf04a17bSJianqun Xu 1970cf04a17bSJianqun Xu *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4); 1971cf04a17bSJianqun Xu *bit = (pin_num % RV1126_PULL_PINS_PER_REG); 1972cf04a17bSJianqun Xu *bit *= RV1126_PULL_BITS_PER_PIN; 1973cf04a17bSJianqun Xu } 1974cf04a17bSJianqun Xu 1975cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET 0x20 1976cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET 0x10090 1977cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN 4 1978cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG 4 1979cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE 32 1980cf04a17bSJianqun Xu 1981cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1982cf04a17bSJianqun Xu int pin_num, struct regmap **regmap, 1983cf04a17bSJianqun Xu int *reg, u8 *bit) 1984cf04a17bSJianqun Xu { 1985cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1986cf04a17bSJianqun Xu 1987cf04a17bSJianqun Xu /* The first 24 pins of the first bank are located in PMU */ 1988cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1989cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1990cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1991cf04a17bSJianqun Xu *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 1992cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4); 1993d499d466SJianqun Xu *reg -= 0x4; 1994cf04a17bSJianqun Xu *bit = pin_num % RV1126_DRV_PINS_PER_REG; 1995cf04a17bSJianqun Xu *bit *= RV1126_DRV_BITS_PER_PIN; 1996cf04a17bSJianqun Xu return; 1997cf04a17bSJianqun Xu } 1998cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 1999cf04a17bSJianqun Xu *reg = RV1126_DRV_PMU_OFFSET; 2000cf04a17bSJianqun Xu } else { 2001cf04a17bSJianqun Xu *regmap = priv->regmap_base; 2002cf04a17bSJianqun Xu *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 2003d499d466SJianqun Xu *reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE; 2004cf04a17bSJianqun Xu } 2005cf04a17bSJianqun Xu 2006cf04a17bSJianqun Xu *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4); 2007cf04a17bSJianqun Xu *bit = pin_num % RV1126_DRV_PINS_PER_REG; 2008cf04a17bSJianqun Xu *bit *= RV1126_DRV_BITS_PER_PIN; 2009cf04a17bSJianqun Xu } 2010cf04a17bSJianqun Xu 2011cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET 0x60 2012cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET 0x10188 2013cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE 16 2014cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG 8 2015cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG 8 2016cf04a17bSJianqun Xu 2017cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2018cf04a17bSJianqun Xu int pin_num, 2019cf04a17bSJianqun Xu struct regmap **regmap, 2020cf04a17bSJianqun Xu int *reg, u8 *bit) 2021cf04a17bSJianqun Xu { 2022cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2023cf04a17bSJianqun Xu int pins_per_reg; 2024cf04a17bSJianqun Xu 2025cf04a17bSJianqun Xu if (bank->bank_num == 0) { 2026cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 2027cf04a17bSJianqun Xu *regmap = priv->regmap_base; 2028cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 2029cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4); 2030cf04a17bSJianqun Xu *bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG; 2031cf04a17bSJianqun Xu return 0; 2032cf04a17bSJianqun Xu } 2033cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 2034cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_PMU_OFFSET; 2035cf04a17bSJianqun Xu pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG; 2036cf04a17bSJianqun Xu } else { 2037cf04a17bSJianqun Xu *regmap = priv->regmap_base; 2038cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 2039cf04a17bSJianqun Xu pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG; 2040d499d466SJianqun Xu *reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE; 2041cf04a17bSJianqun Xu } 2042cf04a17bSJianqun Xu *reg += ((pin_num / pins_per_reg) * 4); 2043cf04a17bSJianqun Xu *bit = pin_num % pins_per_reg; 2044cf04a17bSJianqun Xu 2045cf04a17bSJianqun Xu return 0; 2046cf04a17bSJianqun Xu } 2047cf04a17bSJianqun Xu 2048a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET 0x10 2049a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET 0x80 2050a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG 8 2051a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN 2 2052a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE 16 2053a2a3fc8fSJianqun Xu 2054a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 2055a2a3fc8fSJianqun Xu int pin_num, 2056a2a3fc8fSJianqun Xu struct regmap **regmap, 2057a2a3fc8fSJianqun Xu int *reg, u8 *bit) 2058a2a3fc8fSJianqun Xu { 2059a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2060a2a3fc8fSJianqun Xu 2061a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 2062a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 2063a2a3fc8fSJianqun Xu *reg = RK1808_PULL_PMU_OFFSET; 2064a2a3fc8fSJianqun Xu } else { 2065a2a3fc8fSJianqun Xu *reg = RK1808_PULL_GRF_OFFSET; 2066a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 2067a2a3fc8fSJianqun Xu } 2068a2a3fc8fSJianqun Xu 2069a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4); 2070a2a3fc8fSJianqun Xu *bit = (pin_num % RK1808_PULL_PINS_PER_REG); 2071a2a3fc8fSJianqun Xu *bit *= RK1808_PULL_BITS_PER_PIN; 2072a2a3fc8fSJianqun Xu } 2073a2a3fc8fSJianqun Xu 2074a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET 0x20 2075a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET 0x140 2076a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN 2 2077a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG 8 2078a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE 16 2079a2a3fc8fSJianqun Xu 2080a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 2081a2a3fc8fSJianqun Xu int pin_num, 2082a2a3fc8fSJianqun Xu struct regmap **regmap, 2083a2a3fc8fSJianqun Xu int *reg, u8 *bit) 2084a2a3fc8fSJianqun Xu { 2085a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2086a2a3fc8fSJianqun Xu 2087a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 2088a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 2089a2a3fc8fSJianqun Xu *reg = RK1808_DRV_PMU_OFFSET; 2090a2a3fc8fSJianqun Xu } else { 2091a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 2092a2a3fc8fSJianqun Xu *reg = RK1808_DRV_GRF_OFFSET; 2093a2a3fc8fSJianqun Xu } 2094a2a3fc8fSJianqun Xu 2095a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4); 2096a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_DRV_PINS_PER_REG; 2097a2a3fc8fSJianqun Xu *bit *= RK1808_DRV_BITS_PER_PIN; 2098a2a3fc8fSJianqun Xu } 2099a2a3fc8fSJianqun Xu 2100a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET 0x0040 2101a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET 0x0100 2102a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE 16 2103a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG 8 2104a2a3fc8fSJianqun Xu 2105a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2106a2a3fc8fSJianqun Xu int pin_num, 2107a2a3fc8fSJianqun Xu struct regmap **regmap, 2108a2a3fc8fSJianqun Xu int *reg, u8 *bit) 2109a2a3fc8fSJianqun Xu { 2110a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2111a2a3fc8fSJianqun Xu 2112a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 2113a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 2114a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_PMU_OFFSET; 2115a2a3fc8fSJianqun Xu } else { 2116a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 2117a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_GRF_OFFSET; 2118a2a3fc8fSJianqun Xu *reg += (bank->bank_num - 1) * RK1808_SCHMITT_BANK_STRIDE; 2119a2a3fc8fSJianqun Xu } 2120a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4); 2121a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG; 2122a2a3fc8fSJianqun Xu 2123a2a3fc8fSJianqun Xu return 0; 2124a2a3fc8fSJianqun Xu } 2125a2a3fc8fSJianqun Xu 212649c55878SDavid Wu #define RK2928_PULL_OFFSET 0x118 212749c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG 16 212849c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE 8 212949c55878SDavid Wu 213049c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 213149c55878SDavid Wu int pin_num, struct regmap **regmap, 213249c55878SDavid Wu int *reg, u8 *bit) 213349c55878SDavid Wu { 213449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 213549c55878SDavid Wu 213649c55878SDavid Wu *regmap = priv->regmap_base; 213749c55878SDavid Wu *reg = RK2928_PULL_OFFSET; 213849c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 213949c55878SDavid Wu *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; 214049c55878SDavid Wu 214149c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 214249c55878SDavid Wu }; 214349c55878SDavid Wu 214449c55878SDavid Wu #define RK3128_PULL_OFFSET 0x118 214549c55878SDavid Wu 214649c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 214749c55878SDavid Wu int pin_num, struct regmap **regmap, 214849c55878SDavid Wu int *reg, u8 *bit) 214949c55878SDavid Wu { 215049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 215149c55878SDavid Wu 215249c55878SDavid Wu *regmap = priv->regmap_base; 215349c55878SDavid Wu *reg = RK3128_PULL_OFFSET; 215449c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 215549c55878SDavid Wu *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4); 215649c55878SDavid Wu 215749c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 215849c55878SDavid Wu } 215949c55878SDavid Wu 216049c55878SDavid Wu #define RK3188_PULL_OFFSET 0x164 216149c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN 2 216249c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG 8 216349c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE 16 216449c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET 0x64 216549c55878SDavid Wu 216649c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 216749c55878SDavid Wu int pin_num, struct regmap **regmap, 216849c55878SDavid Wu int *reg, u8 *bit) 216949c55878SDavid Wu { 217049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 217149c55878SDavid Wu 217249c55878SDavid Wu /* The first 12 pins of the first bank are located elsewhere */ 217349c55878SDavid Wu if (bank->bank_num == 0 && pin_num < 12) { 217449c55878SDavid Wu *regmap = priv->regmap_pmu; 217549c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 217649c55878SDavid Wu 217749c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 217849c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 217949c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 218049c55878SDavid Wu } else { 218149c55878SDavid Wu *regmap = priv->regmap_base; 218249c55878SDavid Wu *reg = RK3188_PULL_OFFSET; 218349c55878SDavid Wu 218449c55878SDavid Wu /* correct the offset, as it is the 2nd pull register */ 218549c55878SDavid Wu *reg -= 4; 218649c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 218749c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 218849c55878SDavid Wu 218949c55878SDavid Wu /* 219049c55878SDavid Wu * The bits in these registers have an inverse ordering 219149c55878SDavid Wu * with the lowest pin being in bits 15:14 and the highest 219249c55878SDavid Wu * pin in bits 1:0 219349c55878SDavid Wu */ 219449c55878SDavid Wu *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); 219549c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 219649c55878SDavid Wu } 219749c55878SDavid Wu } 219849c55878SDavid Wu 219949c55878SDavid Wu #define RK3288_PULL_OFFSET 0x140 220049c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 220149c55878SDavid Wu int pin_num, struct regmap **regmap, 220249c55878SDavid Wu int *reg, u8 *bit) 220349c55878SDavid Wu { 220449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 220549c55878SDavid Wu 220649c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 220749c55878SDavid Wu if (bank->bank_num == 0) { 220849c55878SDavid Wu *regmap = priv->regmap_pmu; 220949c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 221049c55878SDavid Wu 221149c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 221249c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 221349c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 221449c55878SDavid Wu } else { 221549c55878SDavid Wu *regmap = priv->regmap_base; 221649c55878SDavid Wu *reg = RK3288_PULL_OFFSET; 221749c55878SDavid Wu 221849c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 221949c55878SDavid Wu *reg -= 0x10; 222049c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 222149c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 222249c55878SDavid Wu 222349c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 222449c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 222549c55878SDavid Wu } 222649c55878SDavid Wu } 222749c55878SDavid Wu 222849c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET 0x70 222949c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET 0x1c0 223049c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN 2 223149c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG 8 223249c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE 16 223349c55878SDavid Wu 223449c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 223549c55878SDavid Wu int pin_num, struct regmap **regmap, 223649c55878SDavid Wu int *reg, u8 *bit) 223749c55878SDavid Wu { 223849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 223949c55878SDavid Wu 224049c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 224149c55878SDavid Wu if (bank->bank_num == 0) { 224249c55878SDavid Wu *regmap = priv->regmap_pmu; 224349c55878SDavid Wu *reg = RK3288_DRV_PMU_OFFSET; 224449c55878SDavid Wu 224549c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 224649c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 224749c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 224849c55878SDavid Wu } else { 224949c55878SDavid Wu *regmap = priv->regmap_base; 225049c55878SDavid Wu *reg = RK3288_DRV_GRF_OFFSET; 225149c55878SDavid Wu 225249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 225349c55878SDavid Wu *reg -= 0x10; 225449c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 225549c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 225649c55878SDavid Wu 225749c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 225849c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 225949c55878SDavid Wu } 226049c55878SDavid Wu } 226149c55878SDavid Wu 226249c55878SDavid Wu #define RK3228_PULL_OFFSET 0x100 226349c55878SDavid Wu 226449c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 226549c55878SDavid Wu int pin_num, struct regmap **regmap, 226649c55878SDavid Wu int *reg, u8 *bit) 226749c55878SDavid Wu { 226849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 226949c55878SDavid Wu 227049c55878SDavid Wu *regmap = priv->regmap_base; 227149c55878SDavid Wu *reg = RK3228_PULL_OFFSET; 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 #define RK3228_DRV_GRF_OFFSET 0x200 228049c55878SDavid Wu 228149c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 228249c55878SDavid Wu int pin_num, struct regmap **regmap, 228349c55878SDavid Wu int *reg, u8 *bit) 228449c55878SDavid Wu { 228549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 228649c55878SDavid Wu 228749c55878SDavid Wu *regmap = priv->regmap_base; 228849c55878SDavid Wu *reg = RK3228_DRV_GRF_OFFSET; 228949c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 229049c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 229149c55878SDavid Wu 229249c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 229349c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 229449c55878SDavid Wu } 229549c55878SDavid Wu 2296b3077611SDavid Wu #define RK3308_PULL_OFFSET 0xa0 2297b3077611SDavid Wu 2298b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 2299b3077611SDavid Wu int pin_num, struct regmap **regmap, 2300b3077611SDavid Wu int *reg, u8 *bit) 2301b3077611SDavid Wu { 2302b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2303b3077611SDavid Wu 2304b3077611SDavid Wu *regmap = priv->regmap_base; 2305b3077611SDavid Wu *reg = RK3308_PULL_OFFSET; 2306b3077611SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 2307b3077611SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 2308b3077611SDavid Wu 2309b3077611SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 2310b3077611SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 2311b3077611SDavid Wu } 2312b3077611SDavid Wu 2313b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET 0x100 2314b3077611SDavid Wu 2315b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 2316b3077611SDavid Wu int pin_num, struct regmap **regmap, 2317b3077611SDavid Wu int *reg, u8 *bit) 2318b3077611SDavid Wu { 2319b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2320b3077611SDavid Wu 2321b3077611SDavid Wu *regmap = priv->regmap_base; 2322b3077611SDavid Wu *reg = RK3308_DRV_GRF_OFFSET; 2323b3077611SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 2324b3077611SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 2325b3077611SDavid Wu 2326b3077611SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 2327b3077611SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 2328b3077611SDavid Wu } 2329b3077611SDavid Wu 2330b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG 8 2331b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE 16 2332b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET 0x1a0 2333b3077611SDavid Wu 2334b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2335b3077611SDavid Wu int pin_num, 2336b3077611SDavid Wu struct regmap **regmap, 2337b3077611SDavid Wu int *reg, u8 *bit) 2338b3077611SDavid Wu { 2339b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2340b3077611SDavid Wu 2341b3077611SDavid Wu *regmap = priv->regmap_base; 2342b3077611SDavid Wu *reg = RK3308_SCHMITT_GRF_OFFSET; 2343b3077611SDavid Wu 2344b3077611SDavid Wu *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE; 2345b3077611SDavid Wu *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4); 2346b3077611SDavid Wu *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG; 2347b3077611SDavid Wu 2348b3077611SDavid Wu return 0; 2349b3077611SDavid Wu } 2350b3077611SDavid Wu 235149c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET 0x100 235249c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET 0x10 235349c55878SDavid Wu 235449c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 235549c55878SDavid Wu int pin_num, struct regmap **regmap, 235649c55878SDavid Wu int *reg, u8 *bit) 235749c55878SDavid Wu { 235849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 235949c55878SDavid Wu 236049c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 236149c55878SDavid Wu if (bank->bank_num == 0) { 236249c55878SDavid Wu *regmap = priv->regmap_pmu; 236349c55878SDavid Wu *reg = RK3368_PULL_PMU_OFFSET; 236449c55878SDavid Wu 236549c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 236649c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 236749c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 236849c55878SDavid Wu } else { 236949c55878SDavid Wu *regmap = priv->regmap_base; 237049c55878SDavid Wu *reg = RK3368_PULL_GRF_OFFSET; 237149c55878SDavid Wu 237249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 237349c55878SDavid Wu *reg -= 0x10; 237449c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 237549c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 237649c55878SDavid Wu 237749c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 237849c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 237949c55878SDavid Wu } 238049c55878SDavid Wu } 238149c55878SDavid Wu 238249c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET 0x20 238349c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET 0x200 238449c55878SDavid Wu 238549c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 238649c55878SDavid Wu int pin_num, struct regmap **regmap, 238749c55878SDavid Wu int *reg, u8 *bit) 238849c55878SDavid Wu { 238949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 239049c55878SDavid Wu 239149c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 239249c55878SDavid Wu if (bank->bank_num == 0) { 239349c55878SDavid Wu *regmap = priv->regmap_pmu; 239449c55878SDavid Wu *reg = RK3368_DRV_PMU_OFFSET; 239549c55878SDavid Wu 239649c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 239749c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 239849c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 239949c55878SDavid Wu } else { 240049c55878SDavid Wu *regmap = priv->regmap_base; 240149c55878SDavid Wu *reg = RK3368_DRV_GRF_OFFSET; 240249c55878SDavid Wu 240349c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 240449c55878SDavid Wu *reg -= 0x10; 240549c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 240649c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 240749c55878SDavid Wu 240849c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 240949c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 241049c55878SDavid Wu } 241149c55878SDavid Wu } 241249c55878SDavid Wu 241349c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET 0xe040 241449c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET 0x40 241549c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN 3 241649c55878SDavid Wu 241749c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 241849c55878SDavid Wu int pin_num, struct regmap **regmap, 241949c55878SDavid Wu int *reg, u8 *bit) 242049c55878SDavid Wu { 242149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 242249c55878SDavid Wu 242349c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 242449c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) { 242549c55878SDavid Wu *regmap = priv->regmap_pmu; 242649c55878SDavid Wu *reg = RK3399_PULL_PMU_OFFSET; 242749c55878SDavid Wu 242849c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 242949c55878SDavid Wu 243049c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 243149c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 243249c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 243349c55878SDavid Wu } else { 243449c55878SDavid Wu *regmap = priv->regmap_base; 243549c55878SDavid Wu *reg = RK3399_PULL_GRF_OFFSET; 243649c55878SDavid Wu 243749c55878SDavid Wu /* correct the offset, as we're starting with the 3rd bank */ 243849c55878SDavid Wu *reg -= 0x20; 243949c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 244049c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 244149c55878SDavid Wu 244249c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 244349c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 244449c55878SDavid Wu } 244549c55878SDavid Wu } 244649c55878SDavid Wu 244749c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 244849c55878SDavid Wu int pin_num, struct regmap **regmap, 244949c55878SDavid Wu int *reg, u8 *bit) 245049c55878SDavid Wu { 245149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 245249c55878SDavid Wu int drv_num = (pin_num / 8); 245349c55878SDavid Wu 245449c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 245549c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) 245649c55878SDavid Wu *regmap = priv->regmap_pmu; 245749c55878SDavid Wu else 245849c55878SDavid Wu *regmap = priv->regmap_base; 245949c55878SDavid Wu 246049c55878SDavid Wu *reg = bank->drv[drv_num].offset; 246149c55878SDavid Wu if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 246249c55878SDavid Wu (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)) 246349c55878SDavid Wu *bit = (pin_num % 8) * 3; 246449c55878SDavid Wu else 246549c55878SDavid Wu *bit = (pin_num % 8) * 2; 246649c55878SDavid Wu } 246749c55878SDavid Wu 246849c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = { 246949c55878SDavid Wu { 2, 4, 8, 12, -1, -1, -1, -1 }, 247049c55878SDavid Wu { 3, 6, 9, 12, -1, -1, -1, -1 }, 247149c55878SDavid Wu { 5, 10, 15, 20, -1, -1, -1, -1 }, 247249c55878SDavid Wu { 4, 6, 8, 10, 12, 14, 16, 18 }, 247349c55878SDavid Wu { 4, 7, 10, 13, 16, 19, 22, 26 } 247449c55878SDavid Wu }; 247549c55878SDavid Wu 247649c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, 247749c55878SDavid Wu int pin_num, int strength) 247849c55878SDavid Wu { 247949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 248049c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 248149c55878SDavid Wu struct regmap *regmap; 248249c55878SDavid Wu int reg, ret, i; 248349c55878SDavid Wu u32 data, rmask_bits, temp; 248449c55878SDavid Wu u8 bit; 24852c16899dSDavid.Wu /* Where need to clean the special mask for rockchip_perpin_drv_list */ 24862c16899dSDavid.Wu int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK); 248749c55878SDavid Wu 248849c55878SDavid Wu debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num, 248949c55878SDavid Wu pin_num, strength); 249049c55878SDavid Wu 249149c55878SDavid Wu ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 2492d499d466SJianqun Xu if (ctrl->type == RV1126) { 2493d499d466SJianqun Xu rmask_bits = RV1126_DRV_BITS_PER_PIN; 2494d499d466SJianqun Xu ret = strength; 2495d499d466SJianqun Xu goto config; 2496d499d466SJianqun Xu } 249749c55878SDavid Wu 249849c55878SDavid Wu ret = -EINVAL; 249949c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { 250049c55878SDavid Wu if (rockchip_perpin_drv_list[drv_type][i] == strength) { 250149c55878SDavid Wu ret = i; 250249c55878SDavid Wu break; 250349c55878SDavid Wu } else if (rockchip_perpin_drv_list[drv_type][i] < 0) { 250449c55878SDavid Wu ret = rockchip_perpin_drv_list[drv_type][i]; 250549c55878SDavid Wu break; 250649c55878SDavid Wu } 250749c55878SDavid Wu } 250849c55878SDavid Wu 250949c55878SDavid Wu if (ret < 0) { 251049c55878SDavid Wu debug("unsupported driver strength %d\n", strength); 251149c55878SDavid Wu return ret; 251249c55878SDavid Wu } 251349c55878SDavid Wu 251449c55878SDavid Wu switch (drv_type) { 251549c55878SDavid Wu case DRV_TYPE_IO_1V8_3V0_AUTO: 251649c55878SDavid Wu case DRV_TYPE_IO_3V3_ONLY: 251749c55878SDavid Wu rmask_bits = RK3399_DRV_3BITS_PER_PIN; 251849c55878SDavid Wu switch (bit) { 251949c55878SDavid Wu case 0 ... 12: 252049c55878SDavid Wu /* regular case, nothing to do */ 252149c55878SDavid Wu break; 252249c55878SDavid Wu case 15: 252349c55878SDavid Wu /* 252449c55878SDavid Wu * drive-strength offset is special, as it is spread 252549c55878SDavid Wu * over 2 registers, the bit data[15] contains bit 0 252649c55878SDavid Wu * of the value while temp[1:0] contains bits 2 and 1 252749c55878SDavid Wu */ 252849c55878SDavid Wu data = (ret & 0x1) << 15; 252949c55878SDavid Wu temp = (ret >> 0x1) & 0x3; 253049c55878SDavid Wu 253149c55878SDavid Wu data |= BIT(31); 253249c55878SDavid Wu ret = regmap_write(regmap, reg, data); 253349c55878SDavid Wu if (ret) 253449c55878SDavid Wu return ret; 253549c55878SDavid Wu 253649c55878SDavid Wu temp |= (0x3 << 16); 253749c55878SDavid Wu reg += 0x4; 253849c55878SDavid Wu ret = regmap_write(regmap, reg, temp); 253949c55878SDavid Wu 254049c55878SDavid Wu return ret; 254149c55878SDavid Wu case 18 ... 21: 254249c55878SDavid Wu /* setting fully enclosed in the second register */ 254349c55878SDavid Wu reg += 4; 254449c55878SDavid Wu bit -= 16; 254549c55878SDavid Wu break; 254649c55878SDavid Wu default: 254749c55878SDavid Wu debug("unsupported bit: %d for pinctrl drive type: %d\n", 254849c55878SDavid Wu bit, drv_type); 254949c55878SDavid Wu return -EINVAL; 255049c55878SDavid Wu } 255149c55878SDavid Wu break; 255249c55878SDavid Wu case DRV_TYPE_IO_DEFAULT: 255349c55878SDavid Wu case DRV_TYPE_IO_1V8_OR_3V0: 255449c55878SDavid Wu case DRV_TYPE_IO_1V8_ONLY: 255549c55878SDavid Wu rmask_bits = RK3288_DRV_BITS_PER_PIN; 255649c55878SDavid Wu break; 255749c55878SDavid Wu default: 255849c55878SDavid Wu debug("unsupported pinctrl drive type: %d\n", 255949c55878SDavid Wu drv_type); 256049c55878SDavid Wu return -EINVAL; 256149c55878SDavid Wu } 256249c55878SDavid Wu 2563d499d466SJianqun Xu config: 256455a89bc6SDavid Wu if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) { 256555a89bc6SDavid Wu regmap_read(regmap, reg, &data); 256655a89bc6SDavid Wu data &= ~(((1 << rmask_bits) - 1) << bit); 256755a89bc6SDavid Wu } else { 256849c55878SDavid Wu /* enable the write to the equivalent lower bits */ 256949c55878SDavid Wu data = ((1 << rmask_bits) - 1) << (bit + 16); 257055a89bc6SDavid Wu } 257149c55878SDavid Wu 257255a89bc6SDavid Wu data |= (ret << bit); 257349c55878SDavid Wu ret = regmap_write(regmap, reg, data); 257449c55878SDavid Wu return ret; 257549c55878SDavid Wu } 257649c55878SDavid Wu 257749c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = { 257849c55878SDavid Wu { 257949c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 258049c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP, 258149c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 258249c55878SDavid Wu PIN_CONFIG_BIAS_BUS_HOLD 258349c55878SDavid Wu }, 258449c55878SDavid Wu { 258549c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 258649c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 258749c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 258849c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP 258949c55878SDavid Wu }, 259049c55878SDavid Wu }; 259149c55878SDavid Wu 259249c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank, 259349c55878SDavid Wu int pin_num, int pull) 259449c55878SDavid Wu { 259549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 259649c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 259749c55878SDavid Wu struct regmap *regmap; 259849c55878SDavid Wu int reg, ret, i, pull_type; 259949c55878SDavid Wu u8 bit; 260049c55878SDavid Wu u32 data; 260149c55878SDavid Wu 260249c55878SDavid Wu debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num, 260349c55878SDavid Wu pin_num, pull); 260449c55878SDavid Wu 260549c55878SDavid Wu /* rk3066b does support any pulls */ 260649c55878SDavid Wu if (ctrl->type == RK3066B) 260749c55878SDavid Wu return pull ? -EINVAL : 0; 260849c55878SDavid Wu 260949c55878SDavid Wu ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 261049c55878SDavid Wu 261149c55878SDavid Wu switch (ctrl->type) { 261249c55878SDavid Wu case RK2928: 261349c55878SDavid Wu case RK3128: 261449c55878SDavid Wu data = BIT(bit + 16); 261549c55878SDavid Wu if (pull == PIN_CONFIG_BIAS_DISABLE) 261649c55878SDavid Wu data |= BIT(bit); 261749c55878SDavid Wu ret = regmap_write(regmap, reg, data); 261849c55878SDavid Wu break; 261949c55878SDavid Wu case PX30: 262049c55878SDavid Wu case RV1108: 2621cf04a17bSJianqun Xu case RV1126: 2622a2a3fc8fSJianqun Xu case RK1808: 262349c55878SDavid Wu case RK3188: 262449c55878SDavid Wu case RK3288: 2625b3077611SDavid Wu case RK3308: 262649c55878SDavid Wu case RK3368: 262749c55878SDavid Wu case RK3399: 26282c16899dSDavid.Wu /* 26292c16899dSDavid.Wu * Where need to clean the special mask for 26302c16899dSDavid.Wu * rockchip_pull_list. 26312c16899dSDavid.Wu */ 26322c16899dSDavid.Wu pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK); 263349c55878SDavid Wu ret = -EINVAL; 263449c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); 263549c55878SDavid Wu i++) { 263649c55878SDavid Wu if (rockchip_pull_list[pull_type][i] == pull) { 263749c55878SDavid Wu ret = i; 263849c55878SDavid Wu break; 263949c55878SDavid Wu } 264049c55878SDavid Wu } 264149c55878SDavid Wu 264249c55878SDavid Wu if (ret < 0) { 264349c55878SDavid Wu debug("unsupported pull setting %d\n", pull); 264449c55878SDavid Wu return ret; 264549c55878SDavid Wu } 264649c55878SDavid Wu 264755a89bc6SDavid Wu if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) { 264855a89bc6SDavid Wu regmap_read(regmap, reg, &data); 264955a89bc6SDavid Wu data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit); 265055a89bc6SDavid Wu } else { 265149c55878SDavid Wu /* enable the write to the equivalent lower bits */ 265249c55878SDavid Wu data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); 265355a89bc6SDavid Wu } 265449c55878SDavid Wu 265555a89bc6SDavid Wu data |= (ret << bit); 265649c55878SDavid Wu ret = regmap_write(regmap, reg, data); 265749c55878SDavid Wu break; 265849c55878SDavid Wu default: 265949c55878SDavid Wu debug("unsupported pinctrl type\n"); 266049c55878SDavid Wu return -EINVAL; 266149c55878SDavid Wu } 266249c55878SDavid Wu 266349c55878SDavid Wu return ret; 266449c55878SDavid Wu } 266549c55878SDavid Wu 266649c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN 1 266749c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG 16 266849c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE 8 266949c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET 0x380 267049c55878SDavid Wu 267149c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 267249c55878SDavid Wu int pin_num, 267349c55878SDavid Wu struct regmap **regmap, 267449c55878SDavid Wu int *reg, u8 *bit) 267549c55878SDavid Wu { 267649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 267749c55878SDavid Wu 267849c55878SDavid Wu *regmap = priv->regmap_base; 267949c55878SDavid Wu *reg = RK3328_SCHMITT_GRF_OFFSET; 268049c55878SDavid Wu 268149c55878SDavid Wu *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE; 268249c55878SDavid Wu *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4); 268349c55878SDavid Wu *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG; 268449c55878SDavid Wu 268549c55878SDavid Wu return 0; 268649c55878SDavid Wu } 268749c55878SDavid Wu 268849c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, 268949c55878SDavid Wu int pin_num, int enable) 269049c55878SDavid Wu { 269149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 269249c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 269349c55878SDavid Wu struct regmap *regmap; 269449c55878SDavid Wu int reg, ret; 269549c55878SDavid Wu u8 bit; 269649c55878SDavid Wu u32 data; 269749c55878SDavid Wu 269849c55878SDavid Wu debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num, 269949c55878SDavid Wu pin_num, enable); 270049c55878SDavid Wu 270149c55878SDavid Wu ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 270249c55878SDavid Wu if (ret) 270349c55878SDavid Wu return ret; 270449c55878SDavid Wu 270549c55878SDavid Wu /* enable the write to the equivalent lower bits */ 270649c55878SDavid Wu data = BIT(bit + 16) | (enable << bit); 270749c55878SDavid Wu 270849c55878SDavid Wu return regmap_write(regmap, reg, data); 270949c55878SDavid Wu } 271049c55878SDavid Wu 271132c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET 0x30 271232c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET 0x90 271332c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG 16 271432c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE 16 271532c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG 8 271632c25d1fSDavid Wu 271732c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, 271832c25d1fSDavid Wu int pin_num, 271932c25d1fSDavid Wu struct regmap **regmap, 272032c25d1fSDavid Wu int *reg, u8 *bit) 272132c25d1fSDavid Wu { 272232c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 272332c25d1fSDavid Wu int pins_per_reg; 272432c25d1fSDavid Wu 272532c25d1fSDavid Wu if (bank->bank_num == 0) { 272632c25d1fSDavid Wu *regmap = priv->regmap_pmu; 272732c25d1fSDavid Wu *reg = PX30_SLEW_RATE_PMU_OFFSET; 272832c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 272932c25d1fSDavid Wu } else { 273032c25d1fSDavid Wu *regmap = priv->regmap_base; 273132c25d1fSDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 273232c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 273332c25d1fSDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 273432c25d1fSDavid Wu } 273532c25d1fSDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 273632c25d1fSDavid Wu *bit = pin_num % pins_per_reg; 273732c25d1fSDavid Wu 273832c25d1fSDavid Wu return 0; 273932c25d1fSDavid Wu } 274032c25d1fSDavid Wu 274132c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank, 274232c25d1fSDavid Wu int pin_num, int speed) 274332c25d1fSDavid Wu { 274432c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 274532c25d1fSDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 274632c25d1fSDavid Wu struct regmap *regmap; 274732c25d1fSDavid Wu int reg, ret; 274832c25d1fSDavid Wu u8 bit; 274932c25d1fSDavid Wu u32 data; 275032c25d1fSDavid Wu 275132c25d1fSDavid Wu debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num, 275232c25d1fSDavid Wu pin_num, speed); 275332c25d1fSDavid Wu 275432c25d1fSDavid Wu ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit); 275532c25d1fSDavid Wu if (ret) 275632c25d1fSDavid Wu return ret; 275732c25d1fSDavid Wu 275832c25d1fSDavid Wu /* enable the write to the equivalent lower bits */ 275932c25d1fSDavid Wu data = BIT(bit + 16) | (speed << bit); 276032c25d1fSDavid Wu 276132c25d1fSDavid Wu return regmap_write(regmap, reg, data); 276232c25d1fSDavid Wu } 276332c25d1fSDavid Wu 276449c55878SDavid Wu /* 276549c55878SDavid Wu * Pinconf_ops handling 276649c55878SDavid Wu */ 276749c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, 276849c55878SDavid Wu unsigned int pull) 276949c55878SDavid Wu { 277049c55878SDavid Wu switch (ctrl->type) { 277149c55878SDavid Wu case RK2928: 277249c55878SDavid Wu case RK3128: 277349c55878SDavid Wu return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || 277449c55878SDavid Wu pull == PIN_CONFIG_BIAS_DISABLE); 277549c55878SDavid Wu case RK3066B: 277649c55878SDavid Wu return pull ? false : true; 277749c55878SDavid Wu case PX30: 277849c55878SDavid Wu case RV1108: 2779cf04a17bSJianqun Xu case RV1126: 2780a2a3fc8fSJianqun Xu case RK1808: 278149c55878SDavid Wu case RK3188: 278249c55878SDavid Wu case RK3288: 2783b3077611SDavid Wu case RK3308: 278449c55878SDavid Wu case RK3368: 278549c55878SDavid Wu case RK3399: 278649c55878SDavid Wu return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 278749c55878SDavid Wu } 278849c55878SDavid Wu 278949c55878SDavid Wu return false; 279049c55878SDavid Wu } 279149c55878SDavid Wu 279249c55878SDavid Wu /* set the pin config settings for a specified pin */ 279349c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank, 279449c55878SDavid Wu u32 pin, u32 param, u32 arg) 279549c55878SDavid Wu { 279649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 279749c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 279849c55878SDavid Wu int rc; 279949c55878SDavid Wu 280049c55878SDavid Wu switch (param) { 280149c55878SDavid Wu case PIN_CONFIG_BIAS_DISABLE: 280249c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 280349c55878SDavid Wu if (rc) 280449c55878SDavid Wu return rc; 280549c55878SDavid Wu break; 280649c55878SDavid Wu 280749c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_UP: 280849c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_DOWN: 280949c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 281049c55878SDavid Wu case PIN_CONFIG_BIAS_BUS_HOLD: 281149c55878SDavid Wu if (!rockchip_pinconf_pull_valid(ctrl, param)) 281249c55878SDavid Wu return -ENOTSUPP; 281349c55878SDavid Wu 281449c55878SDavid Wu if (!arg) 281549c55878SDavid Wu return -EINVAL; 281649c55878SDavid Wu 281749c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 281849c55878SDavid Wu if (rc) 281949c55878SDavid Wu return rc; 282049c55878SDavid Wu break; 282149c55878SDavid Wu 282249c55878SDavid Wu case PIN_CONFIG_DRIVE_STRENGTH: 282349c55878SDavid Wu if (!ctrl->drv_calc_reg) 282449c55878SDavid Wu return -ENOTSUPP; 282549c55878SDavid Wu 282649c55878SDavid Wu rc = rockchip_set_drive_perpin(bank, pin, arg); 282749c55878SDavid Wu if (rc < 0) 282849c55878SDavid Wu return rc; 282949c55878SDavid Wu break; 283049c55878SDavid Wu 283149c55878SDavid Wu case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 283249c55878SDavid Wu if (!ctrl->schmitt_calc_reg) 283349c55878SDavid Wu return -ENOTSUPP; 283449c55878SDavid Wu 283549c55878SDavid Wu rc = rockchip_set_schmitt(bank, pin, arg); 283649c55878SDavid Wu if (rc < 0) 283749c55878SDavid Wu return rc; 283849c55878SDavid Wu break; 283949c55878SDavid Wu 284032c25d1fSDavid Wu case PIN_CONFIG_SLEW_RATE: 284132c25d1fSDavid Wu if (!ctrl->slew_rate_calc_reg) 284232c25d1fSDavid Wu return -ENOTSUPP; 284332c25d1fSDavid Wu 284432c25d1fSDavid Wu rc = rockchip_set_slew_rate(bank, 284532c25d1fSDavid Wu pin - bank->pin_base, arg); 284632c25d1fSDavid Wu if (rc < 0) 284732c25d1fSDavid Wu return rc; 284832c25d1fSDavid Wu break; 284932c25d1fSDavid Wu 285049c55878SDavid Wu default: 285149c55878SDavid Wu break; 285249c55878SDavid Wu } 285349c55878SDavid Wu 285449c55878SDavid Wu return 0; 285549c55878SDavid Wu } 285649c55878SDavid Wu 285749c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = { 285849c55878SDavid Wu { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, 285949c55878SDavid Wu { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 }, 286049c55878SDavid Wu { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 }, 286149c55878SDavid Wu { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 }, 286249c55878SDavid Wu { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 }, 286349c55878SDavid Wu { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 }, 286449c55878SDavid Wu { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 }, 286549c55878SDavid Wu { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 }, 286649c55878SDavid Wu { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 }, 286732c25d1fSDavid Wu { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 }, 286849c55878SDavid Wu }; 286949c55878SDavid Wu 287049c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property, 287149c55878SDavid Wu u32 *default_value) 287249c55878SDavid Wu { 287349c55878SDavid Wu const struct pinconf_param *p, *end; 287449c55878SDavid Wu 287549c55878SDavid Wu p = rockchip_conf_params; 287649c55878SDavid Wu end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param); 287749c55878SDavid Wu 287849c55878SDavid Wu /* See if this pctldev supports this parameter */ 287949c55878SDavid Wu for (; p < end; p++) { 288049c55878SDavid Wu if (!strcmp(property, p->property)) { 288149c55878SDavid Wu *default_value = p->default_value; 288249c55878SDavid Wu return p->param; 288349c55878SDavid Wu } 288449c55878SDavid Wu } 288549c55878SDavid Wu 288649c55878SDavid Wu *default_value = 0; 288749c55878SDavid Wu return -EPERM; 288849c55878SDavid Wu } 288949c55878SDavid Wu 289049c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev, 289149c55878SDavid Wu struct udevice *config) 289249c55878SDavid Wu { 289349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 289449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 289549c55878SDavid Wu u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4]; 289649c55878SDavid Wu u32 bank, pin, mux, conf, arg, default_val; 289749c55878SDavid Wu int ret, count, i; 289849c55878SDavid Wu const char *prop_name; 289949c55878SDavid Wu const void *value; 29002208cfa9SKever Yang int prop_len, param; 29012208cfa9SKever Yang const u32 *data; 29022208cfa9SKever Yang ofnode node; 2903d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 29042208cfa9SKever Yang const struct device_node *np; 29052208cfa9SKever Yang struct property *pp; 29062208cfa9SKever Yang #else 29072208cfa9SKever Yang int property_offset, pcfg_node; 29082208cfa9SKever Yang const void *blob = gd->fdt_blob; 29092208cfa9SKever Yang #endif 29102208cfa9SKever Yang data = dev_read_prop(config, "rockchip,pins", &count); 291149c55878SDavid Wu if (count < 0) { 291287f0ac57SDavid Wu debug("%s: bad array size %d\n", __func__, count); 291349c55878SDavid Wu return -EINVAL; 291449c55878SDavid Wu } 291549c55878SDavid Wu 291687f0ac57SDavid Wu count /= sizeof(u32); 291749c55878SDavid Wu if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) { 291849c55878SDavid Wu debug("%s: unsupported pins array count %d\n", 291949c55878SDavid Wu __func__, count); 292049c55878SDavid Wu return -EINVAL; 292149c55878SDavid Wu } 292249c55878SDavid Wu 292387f0ac57SDavid Wu for (i = 0; i < count; i++) 292487f0ac57SDavid Wu cells[i] = fdt32_to_cpu(data[i]); 292587f0ac57SDavid Wu 292649c55878SDavid Wu for (i = 0; i < (count >> 2); i++) { 292749c55878SDavid Wu bank = cells[4 * i + 0]; 292849c55878SDavid Wu pin = cells[4 * i + 1]; 292949c55878SDavid Wu mux = cells[4 * i + 2]; 293049c55878SDavid Wu conf = cells[4 * i + 3]; 293149c55878SDavid Wu 293249c55878SDavid Wu ret = rockchip_verify_config(dev, bank, pin); 293349c55878SDavid Wu if (ret) 293449c55878SDavid Wu return ret; 293549c55878SDavid Wu 293649c55878SDavid Wu ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux); 293749c55878SDavid Wu if (ret) 293849c55878SDavid Wu return ret; 293949c55878SDavid Wu 29402208cfa9SKever Yang node = ofnode_get_by_phandle(conf); 29412208cfa9SKever Yang if (!ofnode_valid(node)) 294249c55878SDavid Wu return -ENODEV; 2943d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 29442208cfa9SKever Yang np = ofnode_to_np(node); 29452208cfa9SKever Yang for (pp = np->properties; pp; pp = pp->next) { 29462208cfa9SKever Yang prop_name = pp->name; 29472208cfa9SKever Yang prop_len = pp->length; 29482208cfa9SKever Yang value = pp->value; 29492208cfa9SKever Yang #else 29502208cfa9SKever Yang pcfg_node = ofnode_to_offset(node); 295149c55878SDavid Wu fdt_for_each_property_offset(property_offset, blob, pcfg_node) { 295249c55878SDavid Wu value = fdt_getprop_by_offset(blob, property_offset, 295349c55878SDavid Wu &prop_name, &prop_len); 295449c55878SDavid Wu if (!value) 295549c55878SDavid Wu return -ENOENT; 29562208cfa9SKever Yang #endif 295749c55878SDavid Wu param = rockchip_pinconf_prop_name_to_param(prop_name, 295849c55878SDavid Wu &default_val); 295949c55878SDavid Wu if (param < 0) 296049c55878SDavid Wu break; 296149c55878SDavid Wu 296249c55878SDavid Wu if (prop_len >= sizeof(fdt32_t)) 296349c55878SDavid Wu arg = fdt32_to_cpu(*(fdt32_t *)value); 296449c55878SDavid Wu else 296549c55878SDavid Wu arg = default_val; 296649c55878SDavid Wu 296749c55878SDavid Wu ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin, 296849c55878SDavid Wu param, arg); 296949c55878SDavid Wu if (ret) { 297049c55878SDavid Wu debug("%s: rockchip_pinconf_set fail: %d\n", 297149c55878SDavid Wu __func__, ret); 297249c55878SDavid Wu return ret; 297349c55878SDavid Wu } 297449c55878SDavid Wu } 297549c55878SDavid Wu } 297649c55878SDavid Wu 297749c55878SDavid Wu return 0; 297849c55878SDavid Wu } 297949c55878SDavid Wu 298009989a56SJianqun Xu static int rockchip_pinctrl_get_pins_count(struct udevice *dev) 298109989a56SJianqun Xu { 298209989a56SJianqun Xu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 298309989a56SJianqun Xu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 298409989a56SJianqun Xu 298509989a56SJianqun Xu return ctrl->nr_pins; 298609989a56SJianqun Xu } 298709989a56SJianqun Xu 298849c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = { 298909989a56SJianqun Xu .get_pins_count = rockchip_pinctrl_get_pins_count, 299049c55878SDavid Wu .set_state = rockchip_pinctrl_set_state, 299149c55878SDavid Wu .get_gpio_mux = rockchip_pinctrl_get_gpio_mux, 299249c55878SDavid Wu }; 299349c55878SDavid Wu 299413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl; 2995d5517017SDavid Wu 299649c55878SDavid Wu /* retrieve the soc specific data */ 299713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl * 299813c03cb6SJianqun Xu rockchip_pinctrl_get_soc_data(struct udevice *dev) 299949c55878SDavid Wu { 300049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 300113c03cb6SJianqun Xu const struct rockchip_pin_ctrl *ctrl = 300213c03cb6SJianqun Xu (const struct rockchip_pin_ctrl *)dev_get_driver_data(dev); 300349c55878SDavid Wu struct rockchip_pin_bank *bank; 300449c55878SDavid Wu int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; 300513c03cb6SJianqun Xu u32 nr_pins; 300613c03cb6SJianqun Xu 300713c03cb6SJianqun Xu if (soc_is_rk3308b()) 300813c03cb6SJianqun Xu ctrl = &rk3308b_pin_ctrl; 300949c55878SDavid Wu 301049c55878SDavid Wu grf_offs = ctrl->grf_mux_offset; 301149c55878SDavid Wu pmu_offs = ctrl->pmu_mux_offset; 301249c55878SDavid Wu drv_pmu_offs = ctrl->pmu_drv_offset; 301349c55878SDavid Wu drv_grf_offs = ctrl->grf_drv_offset; 301449c55878SDavid Wu bank = ctrl->pin_banks; 301549c55878SDavid Wu 3016d5517017SDavid Wu /* Ctrl data re-initialize for some Socs */ 3017d5517017SDavid Wu if (ctrl->ctrl_data_re_init) { 3018d5517017SDavid Wu if (ctrl->ctrl_data_re_init(ctrl)) 3019d5517017SDavid Wu return NULL; 3020d5517017SDavid Wu } 3021d5517017SDavid Wu 302213c03cb6SJianqun Xu nr_pins = 0; 302349c55878SDavid Wu for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { 302449c55878SDavid Wu int bank_pins = 0; 302549c55878SDavid Wu 302649c55878SDavid Wu bank->priv = priv; 302713c03cb6SJianqun Xu bank->pin_base = nr_pins; 302813c03cb6SJianqun Xu nr_pins += bank->nr_pins; 302949c55878SDavid Wu 303049c55878SDavid Wu /* calculate iomux and drv offsets */ 303149c55878SDavid Wu for (j = 0; j < 4; j++) { 303249c55878SDavid Wu struct rockchip_iomux *iom = &bank->iomux[j]; 303349c55878SDavid Wu struct rockchip_drv *drv = &bank->drv[j]; 303449c55878SDavid Wu int inc; 303549c55878SDavid Wu 303649c55878SDavid Wu if (bank_pins >= bank->nr_pins) 303749c55878SDavid Wu break; 303849c55878SDavid Wu 303949c55878SDavid Wu /* preset iomux offset value, set new start value */ 304049c55878SDavid Wu if (iom->offset >= 0) { 3041d499d466SJianqun Xu if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) 304249c55878SDavid Wu pmu_offs = iom->offset; 304349c55878SDavid Wu else 304449c55878SDavid Wu grf_offs = iom->offset; 304549c55878SDavid Wu } else { /* set current iomux offset */ 3046d499d466SJianqun Xu iom->offset = ((iom->type & IOMUX_SOURCE_PMU) || 3047d499d466SJianqun Xu (iom->type & IOMUX_L_SOURCE_PMU)) ? 304849c55878SDavid Wu pmu_offs : grf_offs; 304949c55878SDavid Wu } 305049c55878SDavid Wu 305149c55878SDavid Wu /* preset drv offset value, set new start value */ 305249c55878SDavid Wu if (drv->offset >= 0) { 305349c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 305449c55878SDavid Wu drv_pmu_offs = drv->offset; 305549c55878SDavid Wu else 305649c55878SDavid Wu drv_grf_offs = drv->offset; 305749c55878SDavid Wu } else { /* set current drv offset */ 305849c55878SDavid Wu drv->offset = (iom->type & IOMUX_SOURCE_PMU) ? 305949c55878SDavid Wu drv_pmu_offs : drv_grf_offs; 306049c55878SDavid Wu } 306149c55878SDavid Wu 306249c55878SDavid Wu debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n", 306349c55878SDavid Wu i, j, iom->offset, drv->offset); 306449c55878SDavid Wu 306549c55878SDavid Wu /* 306649c55878SDavid Wu * Increase offset according to iomux width. 306749c55878SDavid Wu * 4bit iomux'es are spread over two registers. 306849c55878SDavid Wu */ 306949c55878SDavid Wu inc = (iom->type & (IOMUX_WIDTH_4BIT | 307088a1f7ffSDavid Wu IOMUX_WIDTH_3BIT | 307188a1f7ffSDavid Wu IOMUX_8WIDTH_2BIT)) ? 8 : 4; 3072d499d466SJianqun Xu if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) 307349c55878SDavid Wu pmu_offs += inc; 307449c55878SDavid Wu else 307549c55878SDavid Wu grf_offs += inc; 307649c55878SDavid Wu 307749c55878SDavid Wu /* 307849c55878SDavid Wu * Increase offset according to drv width. 307949c55878SDavid Wu * 3bit drive-strenth'es are spread over two registers. 308049c55878SDavid Wu */ 308149c55878SDavid Wu if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 308249c55878SDavid Wu (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) 308349c55878SDavid Wu inc = 8; 308449c55878SDavid Wu else 308549c55878SDavid Wu inc = 4; 308649c55878SDavid Wu 308749c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 308849c55878SDavid Wu drv_pmu_offs += inc; 308949c55878SDavid Wu else 309049c55878SDavid Wu drv_grf_offs += inc; 309149c55878SDavid Wu 309249c55878SDavid Wu bank_pins += 8; 309349c55878SDavid Wu } 309449c55878SDavid Wu 309549c55878SDavid Wu /* calculate the per-bank recalced_mask */ 309649c55878SDavid Wu for (j = 0; j < ctrl->niomux_recalced; j++) { 309749c55878SDavid Wu int pin = 0; 309849c55878SDavid Wu 309949c55878SDavid Wu if (ctrl->iomux_recalced[j].num == bank->bank_num) { 310049c55878SDavid Wu pin = ctrl->iomux_recalced[j].pin; 310149c55878SDavid Wu bank->recalced_mask |= BIT(pin); 310249c55878SDavid Wu } 310349c55878SDavid Wu } 310449c55878SDavid Wu 310549c55878SDavid Wu /* calculate the per-bank route_mask */ 310649c55878SDavid Wu for (j = 0; j < ctrl->niomux_routes; j++) { 310749c55878SDavid Wu int pin = 0; 310849c55878SDavid Wu 310949c55878SDavid Wu if (ctrl->iomux_routes[j].bank_num == bank->bank_num) { 311049c55878SDavid Wu pin = ctrl->iomux_routes[j].pin; 311149c55878SDavid Wu bank->route_mask |= BIT(pin); 311249c55878SDavid Wu } 311349c55878SDavid Wu } 311449c55878SDavid Wu } 311549c55878SDavid Wu 311613c03cb6SJianqun Xu WARN_ON(nr_pins != ctrl->nr_pins); 311713c03cb6SJianqun Xu 311849c55878SDavid Wu return ctrl; 311949c55878SDavid Wu } 312049c55878SDavid Wu 3121d5517017SDavid Wu /* SoC data specially handle */ 3122d5517017SDavid Wu 3123d5517017SDavid Wu /* rk3308b SoC data initialize */ 3124d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13 0x608 3125d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15 0x610 3126d5517017SDavid Wu 3127d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */ 3128d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10)) 3129d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 3130d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 3131d5517017SDavid Wu 3132d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */ 3133d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11)) 3134d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 3135d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 3136d5517017SDavid Wu 3137d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv) 3138d5517017SDavid Wu { 3139d5517017SDavid Wu int ret; 3140d5517017SDavid Wu 3141d5517017SDavid Wu /* 3142d5517017SDavid Wu * Enable the special ctrl of selected sources. 3143d5517017SDavid Wu */ 3144d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13, 3145d5517017SDavid Wu RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL | 3146d5517017SDavid Wu RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL | 3147d5517017SDavid Wu RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL); 3148d5517017SDavid Wu if (ret) 3149d5517017SDavid Wu return ret; 3150d5517017SDavid Wu 3151d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15, 3152d5517017SDavid Wu RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL | 3153d5517017SDavid Wu RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL | 3154d5517017SDavid Wu RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL); 3155d5517017SDavid Wu if (ret) 3156d5517017SDavid Wu return ret; 3157d5517017SDavid Wu 3158d5517017SDavid Wu return 0; 3159d5517017SDavid Wu } 3160d5517017SDavid Wu 316149c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev) 316249c55878SDavid Wu { 316349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 316413c03cb6SJianqun Xu const struct rockchip_pin_ctrl *ctrl; 316549c55878SDavid Wu struct udevice *syscon; 316649c55878SDavid Wu struct regmap *regmap; 316749c55878SDavid Wu int ret = 0; 316849c55878SDavid Wu 316949c55878SDavid Wu /* get rockchip grf syscon phandle */ 317049c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf", 317149c55878SDavid Wu &syscon); 317249c55878SDavid Wu if (ret) { 317349c55878SDavid Wu debug("unable to find rockchip,grf syscon device (%d)\n", ret); 317449c55878SDavid Wu return ret; 317549c55878SDavid Wu } 317649c55878SDavid Wu 317749c55878SDavid Wu /* get grf-reg base address */ 317849c55878SDavid Wu regmap = syscon_get_regmap(syscon); 317949c55878SDavid Wu if (!regmap) { 318049c55878SDavid Wu debug("unable to find rockchip grf regmap\n"); 318149c55878SDavid Wu return -ENODEV; 318249c55878SDavid Wu } 318349c55878SDavid Wu priv->regmap_base = regmap; 318449c55878SDavid Wu 318549c55878SDavid Wu /* option: get pmu-reg base address */ 318649c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu", 318749c55878SDavid Wu &syscon); 318849c55878SDavid Wu if (!ret) { 318949c55878SDavid Wu /* get pmugrf-reg base address */ 319049c55878SDavid Wu regmap = syscon_get_regmap(syscon); 319149c55878SDavid Wu if (!regmap) { 319249c55878SDavid Wu debug("unable to find rockchip pmu regmap\n"); 319349c55878SDavid Wu return -ENODEV; 319449c55878SDavid Wu } 319549c55878SDavid Wu priv->regmap_pmu = regmap; 319649c55878SDavid Wu } 319749c55878SDavid Wu 319849c55878SDavid Wu ctrl = rockchip_pinctrl_get_soc_data(dev); 319949c55878SDavid Wu if (!ctrl) { 320049c55878SDavid Wu debug("driver data not available\n"); 320149c55878SDavid Wu return -EINVAL; 320249c55878SDavid Wu } 320349c55878SDavid Wu 3204d5517017SDavid Wu /* Special handle for some Socs */ 3205d5517017SDavid Wu if (ctrl->soc_data_init) { 3206d5517017SDavid Wu ret = ctrl->soc_data_init(priv); 3207d5517017SDavid Wu if (ret) 3208d5517017SDavid Wu return ret; 3209d5517017SDavid Wu } 3210d5517017SDavid Wu 321113c03cb6SJianqun Xu priv->ctrl = (struct rockchip_pin_ctrl *)ctrl; 321249c55878SDavid Wu return 0; 321349c55878SDavid Wu } 321449c55878SDavid Wu 321549c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = { 321649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 321749c55878SDavid Wu IOMUX_SOURCE_PMU, 321849c55878SDavid Wu IOMUX_SOURCE_PMU, 321949c55878SDavid Wu IOMUX_SOURCE_PMU 322049c55878SDavid Wu ), 322149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, 322249c55878SDavid Wu IOMUX_WIDTH_4BIT, 322349c55878SDavid Wu IOMUX_WIDTH_4BIT, 322449c55878SDavid Wu IOMUX_WIDTH_4BIT 322549c55878SDavid Wu ), 322649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, 322749c55878SDavid Wu IOMUX_WIDTH_4BIT, 322849c55878SDavid Wu IOMUX_WIDTH_4BIT, 322949c55878SDavid Wu IOMUX_WIDTH_4BIT 323049c55878SDavid Wu ), 323149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, 323249c55878SDavid Wu IOMUX_WIDTH_4BIT, 323349c55878SDavid Wu IOMUX_WIDTH_4BIT, 323449c55878SDavid Wu IOMUX_WIDTH_4BIT 323549c55878SDavid Wu ), 323649c55878SDavid Wu }; 323749c55878SDavid Wu 323813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl px30_pin_ctrl = { 323949c55878SDavid Wu .pin_banks = px30_pin_banks, 324049c55878SDavid Wu .nr_banks = ARRAY_SIZE(px30_pin_banks), 324113c03cb6SJianqun Xu .nr_pins = 128, 324249c55878SDavid Wu .label = "PX30-GPIO", 324349c55878SDavid Wu .type = PX30, 324449c55878SDavid Wu .grf_mux_offset = 0x0, 324549c55878SDavid Wu .pmu_mux_offset = 0x0, 324649c55878SDavid Wu .iomux_routes = px30_mux_route_data, 324749c55878SDavid Wu .niomux_routes = ARRAY_SIZE(px30_mux_route_data), 324849c55878SDavid Wu .pull_calc_reg = px30_calc_pull_reg_and_bit, 324949c55878SDavid Wu .drv_calc_reg = px30_calc_drv_reg_and_bit, 325049c55878SDavid Wu .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, 325132c25d1fSDavid Wu .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit, 325249c55878SDavid Wu }; 325349c55878SDavid Wu 325449c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = { 325549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 325649c55878SDavid Wu IOMUX_SOURCE_PMU, 325749c55878SDavid Wu IOMUX_SOURCE_PMU, 325849c55878SDavid Wu IOMUX_SOURCE_PMU), 325949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 326049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0), 326149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0), 326249c55878SDavid Wu }; 326349c55878SDavid Wu 326413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1108_pin_ctrl = { 326549c55878SDavid Wu .pin_banks = rv1108_pin_banks, 326649c55878SDavid Wu .nr_banks = ARRAY_SIZE(rv1108_pin_banks), 326713c03cb6SJianqun Xu .nr_pins = 128, 326849c55878SDavid Wu .label = "RV1108-GPIO", 326949c55878SDavid Wu .type = RV1108, 327049c55878SDavid Wu .grf_mux_offset = 0x10, 327149c55878SDavid Wu .pmu_mux_offset = 0x0, 327249c55878SDavid Wu .iomux_recalced = rv1108_mux_recalced_data, 327349c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data), 327449c55878SDavid Wu .pull_calc_reg = rv1108_calc_pull_reg_and_bit, 327549c55878SDavid Wu .drv_calc_reg = rv1108_calc_drv_reg_and_bit, 327649c55878SDavid Wu .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit, 327749c55878SDavid Wu }; 327849c55878SDavid Wu 3279cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = { 3280cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 3281cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 3282cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 3283cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU, 3284cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3285d499d466SJianqun Xu PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1", 3286cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3287cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3288cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3289d499d466SJianqun Xu IOMUX_WIDTH_4BIT, 3290d499d466SJianqun Xu 0x10010, 0x10018, 0x10020, 0x10028), 3291cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 3292cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3293cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3294cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3295cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3296cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 3297cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3298cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3299cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3300cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3301cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4", 3302cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 0, 0, 0), 3303cf04a17bSJianqun Xu }; 3304cf04a17bSJianqun Xu 330513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1126_pin_ctrl = { 3306cf04a17bSJianqun Xu .pin_banks = rv1126_pin_banks, 3307cf04a17bSJianqun Xu .nr_banks = ARRAY_SIZE(rv1126_pin_banks), 330813c03cb6SJianqun Xu .nr_pins = 130, 3309cf04a17bSJianqun Xu .label = "RV1126-GPIO", 3310cf04a17bSJianqun Xu .type = RV1126, 3311cf04a17bSJianqun Xu .grf_mux_offset = 0x10004, /* mux offset from GPIO0_D0 */ 3312cf04a17bSJianqun Xu .pmu_mux_offset = 0x0, 3313d499d466SJianqun Xu .iomux_routes = rv1126_mux_route_data, 3314d499d466SJianqun Xu .niomux_routes = ARRAY_SIZE(rv1126_mux_route_data), 3315cf04a17bSJianqun Xu .iomux_recalced = rv1126_mux_recalced_data, 3316cf04a17bSJianqun Xu .niomux_recalced = ARRAY_SIZE(rv1126_mux_recalced_data), 3317cf04a17bSJianqun Xu .pull_calc_reg = rv1126_calc_pull_reg_and_bit, 3318cf04a17bSJianqun Xu .drv_calc_reg = rv1126_calc_drv_reg_and_bit, 3319cf04a17bSJianqun Xu .schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit, 3320cf04a17bSJianqun Xu }; 3321cf04a17bSJianqun Xu 3322a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = { 3323a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 3324a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3325a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3326a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3327a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU), 3328a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 3329a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3330a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3331a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3332a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3333a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 3334a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3335a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3336a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3337a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3338a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 3339a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3340a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3341a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3342a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3343a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", 3344a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3345a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3346a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3347a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3348a2a3fc8fSJianqun Xu }; 3349a2a3fc8fSJianqun Xu 335013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk1808_pin_ctrl = { 3351a2a3fc8fSJianqun Xu .pin_banks = rk1808_pin_banks, 3352a2a3fc8fSJianqun Xu .nr_banks = ARRAY_SIZE(rk1808_pin_banks), 335313c03cb6SJianqun Xu .nr_pins = 160, 3354a2a3fc8fSJianqun Xu .label = "RK1808-GPIO", 3355a2a3fc8fSJianqun Xu .type = RK1808, 3356a2a3fc8fSJianqun Xu .iomux_routes = rk1808_mux_route_data, 3357a2a3fc8fSJianqun Xu .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data), 3358a2a3fc8fSJianqun Xu .grf_mux_offset = 0x0, 3359a2a3fc8fSJianqun Xu .pmu_mux_offset = 0x0, 3360a2a3fc8fSJianqun Xu .pull_calc_reg = rk1808_calc_pull_reg_and_bit, 3361a2a3fc8fSJianqun Xu .drv_calc_reg = rk1808_calc_drv_reg_and_bit, 3362a2a3fc8fSJianqun Xu .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit, 3363a2a3fc8fSJianqun Xu }; 3364a2a3fc8fSJianqun Xu 336549c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = { 336649c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 336749c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 336849c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 336949c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 337049c55878SDavid Wu }; 337149c55878SDavid Wu 337213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk2928_pin_ctrl = { 337349c55878SDavid Wu .pin_banks = rk2928_pin_banks, 337449c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 337513c03cb6SJianqun Xu .nr_pins = 128, 337649c55878SDavid Wu .label = "RK2928-GPIO", 337749c55878SDavid Wu .type = RK2928, 337849c55878SDavid Wu .grf_mux_offset = 0xa8, 337949c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 338049c55878SDavid Wu }; 338149c55878SDavid Wu 338249c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = { 338349c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 338449c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 338549c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 338649c55878SDavid Wu }; 338749c55878SDavid Wu 338813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3036_pin_ctrl = { 338949c55878SDavid Wu .pin_banks = rk3036_pin_banks, 339049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3036_pin_banks), 339113c03cb6SJianqun Xu .nr_pins = 96, 339249c55878SDavid Wu .label = "RK3036-GPIO", 339349c55878SDavid Wu .type = RK2928, 339449c55878SDavid Wu .grf_mux_offset = 0xa8, 339549c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 339649c55878SDavid Wu }; 339749c55878SDavid Wu 339849c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = { 339949c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 340049c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 340149c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 340249c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 340349c55878SDavid Wu PIN_BANK(4, 32, "gpio4"), 340449c55878SDavid Wu PIN_BANK(6, 16, "gpio6"), 340549c55878SDavid Wu }; 340649c55878SDavid Wu 340713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066a_pin_ctrl = { 340849c55878SDavid Wu .pin_banks = rk3066a_pin_banks, 340949c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 341013c03cb6SJianqun Xu .nr_pins = 176, 341149c55878SDavid Wu .label = "RK3066a-GPIO", 341249c55878SDavid Wu .type = RK2928, 341349c55878SDavid Wu .grf_mux_offset = 0xa8, 341449c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 341549c55878SDavid Wu }; 341649c55878SDavid Wu 341749c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = { 341849c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 341949c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 342049c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 342149c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 342249c55878SDavid Wu }; 342349c55878SDavid Wu 342413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066b_pin_ctrl = { 342549c55878SDavid Wu .pin_banks = rk3066b_pin_banks, 342649c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 342713c03cb6SJianqun Xu .nr_pins = 128, 342849c55878SDavid Wu .label = "RK3066b-GPIO", 342949c55878SDavid Wu .type = RK3066B, 343049c55878SDavid Wu .grf_mux_offset = 0x60, 343149c55878SDavid Wu }; 343249c55878SDavid Wu 343349c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = { 343449c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 343549c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 343649c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 343749c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 343849c55878SDavid Wu }; 343949c55878SDavid Wu 344013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3128_pin_ctrl = { 344149c55878SDavid Wu .pin_banks = rk3128_pin_banks, 344249c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3128_pin_banks), 344313c03cb6SJianqun Xu .nr_pins = 128, 344449c55878SDavid Wu .label = "RK3128-GPIO", 344549c55878SDavid Wu .type = RK3128, 344649c55878SDavid Wu .grf_mux_offset = 0xa8, 344749c55878SDavid Wu .iomux_recalced = rk3128_mux_recalced_data, 344849c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data), 344949c55878SDavid Wu .iomux_routes = rk3128_mux_route_data, 345049c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data), 345149c55878SDavid Wu .pull_calc_reg = rk3128_calc_pull_reg_and_bit, 345249c55878SDavid Wu }; 345349c55878SDavid Wu 345449c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = { 345549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0), 345649c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 345749c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 345849c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 345949c55878SDavid Wu }; 346049c55878SDavid Wu 346113c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3188_pin_ctrl = { 346249c55878SDavid Wu .pin_banks = rk3188_pin_banks, 346349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 346413c03cb6SJianqun Xu .nr_pins = 128, 346549c55878SDavid Wu .label = "RK3188-GPIO", 346649c55878SDavid Wu .type = RK3188, 346749c55878SDavid Wu .grf_mux_offset = 0x60, 346849c55878SDavid Wu .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 346949c55878SDavid Wu }; 347049c55878SDavid Wu 347149c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = { 347249c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 347349c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 347449c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 347549c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 347649c55878SDavid Wu }; 347749c55878SDavid Wu 347813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3228_pin_ctrl = { 347949c55878SDavid Wu .pin_banks = rk3228_pin_banks, 348049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3228_pin_banks), 348113c03cb6SJianqun Xu .nr_pins = 128, 348249c55878SDavid Wu .label = "RK3228-GPIO", 348349c55878SDavid Wu .type = RK3288, 348449c55878SDavid Wu .grf_mux_offset = 0x0, 348549c55878SDavid Wu .iomux_routes = rk3228_mux_route_data, 348649c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data), 348749c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 348849c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 348949c55878SDavid Wu }; 349049c55878SDavid Wu 349149c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = { 349255a89bc6SDavid Wu PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0", 34934bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 34944bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 349555a89bc6SDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 349655a89bc6SDavid Wu IOMUX_UNROUTED, 349755a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 349855a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 349955a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 350055a89bc6SDavid Wu 0, 350155a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 350255a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 350355a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 350455a89bc6SDavid Wu 0 350549c55878SDavid Wu ), 350649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED, 350749c55878SDavid Wu IOMUX_UNROUTED, 350849c55878SDavid Wu IOMUX_UNROUTED, 350949c55878SDavid Wu 0 351049c55878SDavid Wu ), 351149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED), 351249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT), 351349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, 351449c55878SDavid Wu IOMUX_WIDTH_4BIT, 351549c55878SDavid Wu 0, 351649c55878SDavid Wu 0 351749c55878SDavid Wu ), 351849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED, 351949c55878SDavid Wu 0, 352049c55878SDavid Wu 0, 352149c55878SDavid Wu IOMUX_UNROUTED 352249c55878SDavid Wu ), 352349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED), 352449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0, 352549c55878SDavid Wu 0, 352649c55878SDavid Wu IOMUX_WIDTH_4BIT, 352749c55878SDavid Wu IOMUX_UNROUTED 352849c55878SDavid Wu ), 352949c55878SDavid Wu PIN_BANK(8, 16, "gpio8"), 353049c55878SDavid Wu }; 353149c55878SDavid Wu 353213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3288_pin_ctrl = { 353349c55878SDavid Wu .pin_banks = rk3288_pin_banks, 353449c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3288_pin_banks), 3535*2f6aff58SJianqun Xu .nr_pins = 264, 353649c55878SDavid Wu .label = "RK3288-GPIO", 353749c55878SDavid Wu .type = RK3288, 353849c55878SDavid Wu .grf_mux_offset = 0x0, 353949c55878SDavid Wu .pmu_mux_offset = 0x84, 354049c55878SDavid Wu .iomux_routes = rk3288_mux_route_data, 354149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data), 354249c55878SDavid Wu .pull_calc_reg = rk3288_calc_pull_reg_and_bit, 354349c55878SDavid Wu .drv_calc_reg = rk3288_calc_drv_reg_and_bit, 354449c55878SDavid Wu }; 354549c55878SDavid Wu 3546b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = { 3547b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT, 3548b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3549b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3550b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3551b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT, 3552b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3553b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3554b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3555b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT, 3556b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3557b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3558b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3559b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT, 3560b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3561b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3562b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3563b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT, 3564b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3565b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3566b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3567b3077611SDavid Wu }; 3568b3077611SDavid Wu 3569b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = { 3570b3077611SDavid Wu .pin_banks = rk3308_pin_banks, 3571b3077611SDavid Wu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 3572e21613fbSJianqun Xu .nr_pins = 160, 3573b3077611SDavid Wu .label = "RK3308-GPIO", 3574b3077611SDavid Wu .type = RK3308, 3575b3077611SDavid Wu .grf_mux_offset = 0x0, 3576b3077611SDavid Wu .iomux_recalced = rk3308_mux_recalced_data, 3577b3077611SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data), 3578b3077611SDavid Wu .iomux_routes = rk3308_mux_route_data, 3579b3077611SDavid Wu .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data), 358013c03cb6SJianqun Xu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 358113c03cb6SJianqun Xu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 358213c03cb6SJianqun Xu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 358313c03cb6SJianqun Xu }; 358413c03cb6SJianqun Xu 358513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = { 358613c03cb6SJianqun Xu .pin_banks = rk3308_pin_banks, 358713c03cb6SJianqun Xu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 358813c03cb6SJianqun Xu .nr_pins = 160, 358913c03cb6SJianqun Xu .label = "RK3308-GPIO", 359013c03cb6SJianqun Xu .type = RK3308, 359113c03cb6SJianqun Xu .grf_mux_offset = 0x0, 359213c03cb6SJianqun Xu .iomux_recalced = rk3308b_mux_recalced_data, 359313c03cb6SJianqun Xu .niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data), 359413c03cb6SJianqun Xu .iomux_routes = rk3308b_mux_route_data, 359513c03cb6SJianqun Xu .niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data), 3596d5517017SDavid Wu .soc_data_init = rk3308b_soc_data_init, 3597b3077611SDavid Wu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 3598b3077611SDavid Wu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 3599b3077611SDavid Wu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 3600b3077611SDavid Wu }; 3601b3077611SDavid Wu 360249c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = { 360349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0), 360449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 360549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 360649c55878SDavid Wu IOMUX_WIDTH_3BIT, 360749c55878SDavid Wu IOMUX_WIDTH_3BIT, 360849c55878SDavid Wu 0), 360949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 361049c55878SDavid Wu IOMUX_WIDTH_3BIT, 361149c55878SDavid Wu IOMUX_WIDTH_3BIT, 361249c55878SDavid Wu 0, 361349c55878SDavid Wu 0), 361449c55878SDavid Wu }; 361549c55878SDavid Wu 361613c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3328_pin_ctrl = { 361749c55878SDavid Wu .pin_banks = rk3328_pin_banks, 361849c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3328_pin_banks), 361913c03cb6SJianqun Xu .nr_pins = 128, 362049c55878SDavid Wu .label = "RK3328-GPIO", 362149c55878SDavid Wu .type = RK3288, 362249c55878SDavid Wu .grf_mux_offset = 0x0, 362349c55878SDavid Wu .iomux_recalced = rk3328_mux_recalced_data, 362449c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data), 362549c55878SDavid Wu .iomux_routes = rk3328_mux_route_data, 362649c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data), 362749c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 362849c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 362949c55878SDavid Wu .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit, 363049c55878SDavid Wu }; 363149c55878SDavid Wu 363249c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = { 363349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 363449c55878SDavid Wu IOMUX_SOURCE_PMU, 363549c55878SDavid Wu IOMUX_SOURCE_PMU, 363649c55878SDavid Wu IOMUX_SOURCE_PMU 363749c55878SDavid Wu ), 363849c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 363949c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 364049c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 364149c55878SDavid Wu }; 364249c55878SDavid Wu 364313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3368_pin_ctrl = { 364449c55878SDavid Wu .pin_banks = rk3368_pin_banks, 364549c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3368_pin_banks), 364613c03cb6SJianqun Xu .nr_pins = 128, 364749c55878SDavid Wu .label = "RK3368-GPIO", 364849c55878SDavid Wu .type = RK3368, 364949c55878SDavid Wu .grf_mux_offset = 0x0, 365049c55878SDavid Wu .pmu_mux_offset = 0x0, 365149c55878SDavid Wu .pull_calc_reg = rk3368_calc_pull_reg_and_bit, 365249c55878SDavid Wu .drv_calc_reg = rk3368_calc_drv_reg_and_bit, 365349c55878SDavid Wu }; 365449c55878SDavid Wu 365549c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = { 365649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0", 365749c55878SDavid Wu IOMUX_SOURCE_PMU, 365849c55878SDavid Wu IOMUX_SOURCE_PMU, 365949c55878SDavid Wu IOMUX_SOURCE_PMU, 366049c55878SDavid Wu IOMUX_SOURCE_PMU, 366149c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 366249c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 366349c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 366449c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 366549c55878SDavid Wu 0x80, 366649c55878SDavid Wu 0x88, 366749c55878SDavid Wu -1, 366849c55878SDavid Wu -1, 366949c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 367049c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 367149c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 367249c55878SDavid Wu PULL_TYPE_IO_DEFAULT 367349c55878SDavid Wu ), 367449c55878SDavid Wu PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU, 367549c55878SDavid Wu IOMUX_SOURCE_PMU, 367649c55878SDavid Wu IOMUX_SOURCE_PMU, 367749c55878SDavid Wu IOMUX_SOURCE_PMU, 367849c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 367949c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 368049c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 368149c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 368249c55878SDavid Wu 0xa0, 368349c55878SDavid Wu 0xa8, 368449c55878SDavid Wu 0xb0, 368549c55878SDavid Wu 0xb8 368649c55878SDavid Wu ), 368749c55878SDavid Wu PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0, 368849c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 368949c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 369049c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 369149c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 369249c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 369349c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 369449c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY 369549c55878SDavid Wu ), 369649c55878SDavid Wu PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY, 369749c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 369849c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 369949c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 370049c55878SDavid Wu ), 370149c55878SDavid Wu PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0, 370249c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 370349c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 370449c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 370549c55878SDavid Wu ), 370649c55878SDavid Wu }; 370749c55878SDavid Wu 370813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3399_pin_ctrl = { 370949c55878SDavid Wu .pin_banks = rk3399_pin_banks, 371049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3399_pin_banks), 371113c03cb6SJianqun Xu .nr_pins = 160, 371249c55878SDavid Wu .label = "RK3399-GPIO", 371349c55878SDavid Wu .type = RK3399, 371449c55878SDavid Wu .grf_mux_offset = 0xe000, 371549c55878SDavid Wu .pmu_mux_offset = 0x0, 371649c55878SDavid Wu .grf_drv_offset = 0xe100, 371749c55878SDavid Wu .pmu_drv_offset = 0x80, 371849c55878SDavid Wu .iomux_routes = rk3399_mux_route_data, 371949c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data), 372049c55878SDavid Wu .pull_calc_reg = rk3399_calc_pull_reg_and_bit, 372149c55878SDavid Wu .drv_calc_reg = rk3399_calc_drv_reg_and_bit, 372249c55878SDavid Wu }; 372349c55878SDavid Wu 372449c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = { 372549c55878SDavid Wu { .compatible = "rockchip,px30-pinctrl", 372649c55878SDavid Wu .data = (ulong)&px30_pin_ctrl }, 372749c55878SDavid Wu { .compatible = "rockchip,rv1108-pinctrl", 372849c55878SDavid Wu .data = (ulong)&rv1108_pin_ctrl }, 3729cf04a17bSJianqun Xu { .compatible = "rockchip,rv1126-pinctrl", 3730cf04a17bSJianqun Xu .data = (ulong)&rv1126_pin_ctrl }, 3731a2a3fc8fSJianqun Xu { .compatible = "rockchip,rk1808-pinctrl", 3732a2a3fc8fSJianqun Xu .data = (ulong)&rk1808_pin_ctrl }, 373349c55878SDavid Wu { .compatible = "rockchip,rk2928-pinctrl", 373449c55878SDavid Wu .data = (ulong)&rk2928_pin_ctrl }, 373549c55878SDavid Wu { .compatible = "rockchip,rk3036-pinctrl", 373649c55878SDavid Wu .data = (ulong)&rk3036_pin_ctrl }, 373749c55878SDavid Wu { .compatible = "rockchip,rk3066a-pinctrl", 373849c55878SDavid Wu .data = (ulong)&rk3066a_pin_ctrl }, 373949c55878SDavid Wu { .compatible = "rockchip,rk3066b-pinctrl", 374049c55878SDavid Wu .data = (ulong)&rk3066b_pin_ctrl }, 374149c55878SDavid Wu { .compatible = "rockchip,rk3128-pinctrl", 374249c55878SDavid Wu .data = (ulong)&rk3128_pin_ctrl }, 374349c55878SDavid Wu { .compatible = "rockchip,rk3188-pinctrl", 374449c55878SDavid Wu .data = (ulong)&rk3188_pin_ctrl }, 374549c55878SDavid Wu { .compatible = "rockchip,rk3228-pinctrl", 374649c55878SDavid Wu .data = (ulong)&rk3228_pin_ctrl }, 374749c55878SDavid Wu { .compatible = "rockchip,rk3288-pinctrl", 374849c55878SDavid Wu .data = (ulong)&rk3288_pin_ctrl }, 3749b3077611SDavid Wu { .compatible = "rockchip,rk3308-pinctrl", 3750b3077611SDavid Wu .data = (ulong)&rk3308_pin_ctrl }, 375149c55878SDavid Wu { .compatible = "rockchip,rk3328-pinctrl", 375249c55878SDavid Wu .data = (ulong)&rk3328_pin_ctrl }, 375349c55878SDavid Wu { .compatible = "rockchip,rk3368-pinctrl", 375449c55878SDavid Wu .data = (ulong)&rk3368_pin_ctrl }, 375549c55878SDavid Wu { .compatible = "rockchip,rk3399-pinctrl", 375649c55878SDavid Wu .data = (ulong)&rk3399_pin_ctrl }, 375749c55878SDavid Wu {}, 375849c55878SDavid Wu }; 375949c55878SDavid Wu 376049c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = { 376149c55878SDavid Wu .name = "rockchip_pinctrl", 376249c55878SDavid Wu .id = UCLASS_PINCTRL, 376349c55878SDavid Wu .of_match = rockchip_pinctrl_dt_match, 376449c55878SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), 376549c55878SDavid Wu .ops = &rockchip_pinctrl_ops, 376649c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA) 376749c55878SDavid Wu .bind = dm_scan_fdt_dev, 376849c55878SDavid Wu #endif 376949c55878SDavid Wu .probe = rockchip_pinctrl_probe, 377049c55878SDavid Wu }; 3771