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, 74*c066e3f7SJianqun Xu DRV_TYPE_IO_SMIC, 7549c55878SDavid Wu DRV_TYPE_MAX 7649c55878SDavid Wu }; 7749c55878SDavid Wu 7855a89bc6SDavid Wu #define PULL_TYPE_IO_MASK GENMASK(31, 16) 7955a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT BIT(31) 8055a89bc6SDavid Wu 8149c55878SDavid Wu /** 8249c55878SDavid Wu * enum type index corresponding to rockchip_pull_list arrays index. 8349c55878SDavid Wu */ 8449c55878SDavid Wu enum rockchip_pin_pull_type { 8549c55878SDavid Wu PULL_TYPE_IO_DEFAULT = 0, 8649c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 8749c55878SDavid Wu PULL_TYPE_MAX 8849c55878SDavid Wu }; 8949c55878SDavid Wu 9049c55878SDavid Wu /** 9149e04eddSJianqun Xu * enum mux route register type, should be invalid/default/topgrf/pmugrf. 9249e04eddSJianqun Xu * INVALID: means do not need to set mux route 9349e04eddSJianqun Xu * DEFAULT: means same regmap as pin iomux 9449e04eddSJianqun Xu * TOPGRF: means mux route setting in topgrf 9549e04eddSJianqun Xu * PMUGRF: means mux route setting in pmugrf 9649e04eddSJianqun Xu */ 9749e04eddSJianqun Xu enum rockchip_pin_route_type { 9849e04eddSJianqun Xu ROUTE_TYPE_DEFAULT = 0, 9949e04eddSJianqun Xu ROUTE_TYPE_TOPGRF = 1, 10049e04eddSJianqun Xu ROUTE_TYPE_PMUGRF = 2, 10149e04eddSJianqun Xu 10249e04eddSJianqun Xu ROUTE_TYPE_INVALID = -1, 10349e04eddSJianqun Xu }; 10449e04eddSJianqun Xu 10549e04eddSJianqun Xu /** 10649c55878SDavid Wu * @drv_type: drive strength variant using rockchip_perpin_drv_type 10749c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 10849c55878SDavid Wu * an initial offset value the relevant source offset can be reset 10949c55878SDavid Wu * to a new value for autocalculating the following drive strength 11049c55878SDavid Wu * registers. if used chips own cal_drv func instead to calculate 11149c55878SDavid Wu * registers offset, the variant could be ignored. 11249c55878SDavid Wu */ 11349c55878SDavid Wu struct rockchip_drv { 11449c55878SDavid Wu enum rockchip_pin_drv_type drv_type; 11549c55878SDavid Wu int offset; 11649c55878SDavid Wu }; 11749c55878SDavid Wu 11849c55878SDavid Wu /** 11949c55878SDavid Wu * @priv: common pinctrl private basedata 12049c55878SDavid Wu * @pin_base: first pin number 12149c55878SDavid Wu * @nr_pins: number of pins in this bank 12249c55878SDavid Wu * @name: name of the bank 12349c55878SDavid Wu * @bank_num: number of the bank, to account for holes 12449c55878SDavid Wu * @iomux: array describing the 4 iomux sources of the bank 12549c55878SDavid Wu * @drv: array describing the 4 drive strength sources of the bank 12649c55878SDavid Wu * @pull_type: array describing the 4 pull type sources of the bank 12749c55878SDavid Wu * @recalced_mask: bits describing the mux recalced pins of per bank 12849c55878SDavid Wu * @route_mask: bits describing the routing pins of per bank 12949c55878SDavid Wu */ 13049c55878SDavid Wu struct rockchip_pin_bank { 13149c55878SDavid Wu struct rockchip_pinctrl_priv *priv; 13249c55878SDavid Wu u32 pin_base; 13349c55878SDavid Wu u8 nr_pins; 13449c55878SDavid Wu char *name; 13549c55878SDavid Wu u8 bank_num; 13649c55878SDavid Wu struct rockchip_iomux iomux[4]; 13749c55878SDavid Wu struct rockchip_drv drv[4]; 13849c55878SDavid Wu enum rockchip_pin_pull_type pull_type[4]; 13949c55878SDavid Wu u32 recalced_mask; 14049c55878SDavid Wu u32 route_mask; 14149c55878SDavid Wu }; 14249c55878SDavid Wu 14349c55878SDavid Wu #define PIN_BANK(id, pins, label) \ 14449c55878SDavid Wu { \ 14549c55878SDavid Wu .bank_num = id, \ 14649c55878SDavid Wu .nr_pins = pins, \ 14749c55878SDavid Wu .name = label, \ 14849c55878SDavid Wu .iomux = { \ 14949c55878SDavid Wu { .offset = -1 }, \ 15049c55878SDavid Wu { .offset = -1 }, \ 15149c55878SDavid Wu { .offset = -1 }, \ 15249c55878SDavid Wu { .offset = -1 }, \ 15349c55878SDavid Wu }, \ 15449c55878SDavid Wu } 15549c55878SDavid Wu 15649c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 15749c55878SDavid Wu { \ 15849c55878SDavid Wu .bank_num = id, \ 15949c55878SDavid Wu .nr_pins = pins, \ 16049c55878SDavid Wu .name = label, \ 16149c55878SDavid Wu .iomux = { \ 16249c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 16349c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 16449c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 16549c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 16649c55878SDavid Wu }, \ 16749c55878SDavid Wu } 16849c55878SDavid Wu 169d499d466SJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, \ 170d499d466SJianqun Xu iom3, offset0, offset1, offset2, \ 171d499d466SJianqun Xu offset3) \ 172d499d466SJianqun Xu { \ 173d499d466SJianqun Xu .bank_num = id, \ 174d499d466SJianqun Xu .nr_pins = pins, \ 175d499d466SJianqun Xu .name = label, \ 176d499d466SJianqun Xu .iomux = { \ 177d499d466SJianqun Xu { .type = iom0, .offset = offset0 }, \ 178d499d466SJianqun Xu { .type = iom1, .offset = offset1 }, \ 179d499d466SJianqun Xu { .type = iom2, .offset = offset2 }, \ 180d499d466SJianqun Xu { .type = iom3, .offset = offset3 }, \ 181d499d466SJianqun Xu }, \ 182d499d466SJianqun Xu } 183d499d466SJianqun Xu 18449c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 18549c55878SDavid Wu { \ 18649c55878SDavid Wu .bank_num = id, \ 18749c55878SDavid Wu .nr_pins = pins, \ 18849c55878SDavid Wu .name = label, \ 18949c55878SDavid Wu .iomux = { \ 19049c55878SDavid Wu { .offset = -1 }, \ 19149c55878SDavid Wu { .offset = -1 }, \ 19249c55878SDavid Wu { .offset = -1 }, \ 19349c55878SDavid Wu { .offset = -1 }, \ 19449c55878SDavid Wu }, \ 19549c55878SDavid Wu .drv = { \ 19649c55878SDavid Wu { .drv_type = type0, .offset = -1 }, \ 19749c55878SDavid Wu { .drv_type = type1, .offset = -1 }, \ 19849c55878SDavid Wu { .drv_type = type2, .offset = -1 }, \ 19949c55878SDavid Wu { .drv_type = type3, .offset = -1 }, \ 20049c55878SDavid Wu }, \ 20149c55878SDavid Wu } 20249c55878SDavid Wu 20349c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \ 20449c55878SDavid Wu drv2, drv3, pull0, pull1, \ 20549c55878SDavid Wu pull2, pull3) \ 20649c55878SDavid Wu { \ 20749c55878SDavid Wu .bank_num = id, \ 20849c55878SDavid Wu .nr_pins = pins, \ 20949c55878SDavid Wu .name = label, \ 21049c55878SDavid Wu .iomux = { \ 21149c55878SDavid Wu { .offset = -1 }, \ 21249c55878SDavid Wu { .offset = -1 }, \ 21349c55878SDavid Wu { .offset = -1 }, \ 21449c55878SDavid Wu { .offset = -1 }, \ 21549c55878SDavid Wu }, \ 21649c55878SDavid Wu .drv = { \ 21749c55878SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 21849c55878SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 21949c55878SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 22049c55878SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 22149c55878SDavid Wu }, \ 22249c55878SDavid Wu .pull_type[0] = pull0, \ 22349c55878SDavid Wu .pull_type[1] = pull1, \ 22449c55878SDavid Wu .pull_type[2] = pull2, \ 22549c55878SDavid Wu .pull_type[3] = pull3, \ 22649c55878SDavid Wu } 22749c55878SDavid Wu 22849c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \ 22949c55878SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 23049c55878SDavid Wu drv3, offset0, offset1, \ 23149c55878SDavid Wu offset2, offset3) \ 23249c55878SDavid Wu { \ 23349c55878SDavid Wu .bank_num = id, \ 23449c55878SDavid Wu .nr_pins = pins, \ 23549c55878SDavid Wu .name = label, \ 23649c55878SDavid Wu .iomux = { \ 23749c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 23849c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 23949c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 24049c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 24149c55878SDavid Wu }, \ 24249c55878SDavid Wu .drv = { \ 24349c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 24449c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 24549c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 24649c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 24749c55878SDavid Wu }, \ 24849c55878SDavid Wu } 24949c55878SDavid Wu 25055a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1, \ 25155a89bc6SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 25255a89bc6SDavid Wu drv3, pull0, pull1, pull2, \ 25355a89bc6SDavid Wu pull3) \ 25455a89bc6SDavid Wu { \ 25555a89bc6SDavid Wu .bank_num = id, \ 25655a89bc6SDavid Wu .nr_pins = pins, \ 25755a89bc6SDavid Wu .name = label, \ 25855a89bc6SDavid Wu .iomux = { \ 25955a89bc6SDavid Wu { .type = iom0, .offset = -1 }, \ 26055a89bc6SDavid Wu { .type = iom1, .offset = -1 }, \ 26155a89bc6SDavid Wu { .type = iom2, .offset = -1 }, \ 26255a89bc6SDavid Wu { .type = iom3, .offset = -1 }, \ 26355a89bc6SDavid Wu }, \ 26455a89bc6SDavid Wu .drv = { \ 26555a89bc6SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 26655a89bc6SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 26755a89bc6SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 26855a89bc6SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 26955a89bc6SDavid Wu }, \ 27055a89bc6SDavid Wu .pull_type[0] = pull0, \ 27155a89bc6SDavid Wu .pull_type[1] = pull1, \ 27255a89bc6SDavid Wu .pull_type[2] = pull2, \ 27355a89bc6SDavid Wu .pull_type[3] = pull3, \ 27455a89bc6SDavid Wu } 27555a89bc6SDavid Wu 27649c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \ 27749c55878SDavid Wu label, iom0, iom1, iom2, \ 27849c55878SDavid Wu iom3, drv0, drv1, drv2, \ 27949c55878SDavid Wu drv3, offset0, offset1, \ 28049c55878SDavid Wu offset2, offset3, pull0, \ 28149c55878SDavid Wu pull1, pull2, pull3) \ 28249c55878SDavid Wu { \ 28349c55878SDavid Wu .bank_num = id, \ 28449c55878SDavid Wu .nr_pins = pins, \ 28549c55878SDavid Wu .name = label, \ 28649c55878SDavid Wu .iomux = { \ 28749c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 28849c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 28949c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 29049c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 29149c55878SDavid Wu }, \ 29249c55878SDavid Wu .drv = { \ 29349c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 29449c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 29549c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 29649c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 29749c55878SDavid Wu }, \ 29849c55878SDavid Wu .pull_type[0] = pull0, \ 29949c55878SDavid Wu .pull_type[1] = pull1, \ 30049c55878SDavid Wu .pull_type[2] = pull2, \ 30149c55878SDavid Wu .pull_type[3] = pull3, \ 30249c55878SDavid Wu } 30349c55878SDavid Wu 30449e04eddSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \ 305d499d466SJianqun Xu { \ 306d499d466SJianqun Xu .bank_num = ID, \ 307d499d466SJianqun Xu .pin = PIN, \ 308d499d466SJianqun Xu .func = FUNC, \ 309d499d466SJianqun Xu .route_offset = REG, \ 310d499d466SJianqun Xu .route_val = VAL, \ 31149e04eddSJianqun Xu .route_type = FLAG, \ 312d499d466SJianqun Xu } 313d499d466SJianqun Xu 31449e04eddSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL) \ 31549e04eddSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT) 31649e04eddSJianqun Xu 31749e04eddSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL) \ 31849e04eddSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF) 31949e04eddSJianqun Xu 32049e04eddSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL) \ 32149e04eddSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF) 32249e04eddSJianqun Xu 32349c55878SDavid Wu /** 32449c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 32549c55878SDavid Wu * @num: bank number. 32649c55878SDavid Wu * @pin: pin number. 32749c55878SDavid Wu * @bit: index at register. 32849c55878SDavid Wu * @reg: register offset. 32949c55878SDavid Wu * @mask: mask bit 33049c55878SDavid Wu */ 33149c55878SDavid Wu struct rockchip_mux_recalced_data { 33249c55878SDavid Wu u8 num; 33349c55878SDavid Wu u8 pin; 33449c55878SDavid Wu u32 reg; 33549c55878SDavid Wu u8 bit; 33649c55878SDavid Wu u8 mask; 33749c55878SDavid Wu }; 33849c55878SDavid Wu 33949c55878SDavid Wu /** 34049c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 34149c55878SDavid Wu * @bank_num: bank number. 34249c55878SDavid Wu * @pin: index at register or used to calc index. 34349c55878SDavid Wu * @func: the min pin. 34449e04eddSJianqun Xu * @route_type: the register type. 34549c55878SDavid Wu * @route_offset: the max pin. 34649c55878SDavid Wu * @route_val: the register offset. 34749c55878SDavid Wu */ 34849c55878SDavid Wu struct rockchip_mux_route_data { 34949c55878SDavid Wu u8 bank_num; 35049c55878SDavid Wu u8 pin; 35149c55878SDavid Wu u8 func; 35249e04eddSJianqun Xu enum rockchip_pin_route_type route_type : 8; 35349c55878SDavid Wu u32 route_offset; 35449c55878SDavid Wu u32 route_val; 35549c55878SDavid Wu }; 35649c55878SDavid Wu 35749c55878SDavid Wu /** 35849c55878SDavid Wu */ 35949c55878SDavid Wu struct rockchip_pin_ctrl { 36049c55878SDavid Wu struct rockchip_pin_bank *pin_banks; 36149c55878SDavid Wu u32 nr_banks; 36249c55878SDavid Wu u32 nr_pins; 36349c55878SDavid Wu char *label; 36449c55878SDavid Wu enum rockchip_pinctrl_type type; 36549c55878SDavid Wu int grf_mux_offset; 36649c55878SDavid Wu int pmu_mux_offset; 36749c55878SDavid Wu int grf_drv_offset; 36849c55878SDavid Wu int pmu_drv_offset; 36949c55878SDavid Wu struct rockchip_mux_recalced_data *iomux_recalced; 37049c55878SDavid Wu u32 niomux_recalced; 37149c55878SDavid Wu struct rockchip_mux_route_data *iomux_routes; 37249c55878SDavid Wu u32 niomux_routes; 37349c55878SDavid Wu 37413c03cb6SJianqun Xu int (*ctrl_data_re_init)(const struct rockchip_pin_ctrl *ctrl); 375d5517017SDavid Wu 376d5517017SDavid Wu int (*soc_data_init)(struct rockchip_pinctrl_priv *info); 377d5517017SDavid Wu 37849c55878SDavid Wu void (*pull_calc_reg)(struct rockchip_pin_bank *bank, 37949c55878SDavid Wu int pin_num, struct regmap **regmap, 38049c55878SDavid Wu int *reg, u8 *bit); 38149c55878SDavid Wu void (*drv_calc_reg)(struct rockchip_pin_bank *bank, 38249c55878SDavid Wu int pin_num, struct regmap **regmap, 38349c55878SDavid Wu int *reg, u8 *bit); 38449c55878SDavid Wu int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank, 38549c55878SDavid Wu int pin_num, struct regmap **regmap, 38649c55878SDavid Wu int *reg, u8 *bit); 38732c25d1fSDavid Wu int (*slew_rate_calc_reg)(struct rockchip_pin_bank *bank, 38832c25d1fSDavid Wu int pin_num, struct regmap **regmap, 38932c25d1fSDavid Wu int *reg, u8 *bit); 39049c55878SDavid Wu }; 39149c55878SDavid Wu 39249c55878SDavid Wu /** 39349c55878SDavid Wu */ 39449c55878SDavid Wu struct rockchip_pinctrl_priv { 39549c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 39649c55878SDavid Wu struct regmap *regmap_base; 39749c55878SDavid Wu struct regmap *regmap_pmu; 39849c55878SDavid Wu 39949c55878SDavid Wu }; 40049c55878SDavid Wu 40149c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin) 40249c55878SDavid Wu { 40349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 40449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 40549c55878SDavid Wu 40649c55878SDavid Wu if (bank >= ctrl->nr_banks) { 40749c55878SDavid Wu debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks); 40849c55878SDavid Wu return -EINVAL; 40949c55878SDavid Wu } 41049c55878SDavid Wu 41149c55878SDavid Wu if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) { 41249c55878SDavid Wu debug("pin conf pin %d >= %d\n", pin, 41349c55878SDavid Wu MAX_ROCKCHIP_GPIO_PER_BANK); 41449c55878SDavid Wu return -EINVAL; 41549c55878SDavid Wu } 41649c55878SDavid Wu 41749c55878SDavid Wu return 0; 41849c55878SDavid Wu } 41949c55878SDavid Wu 42049c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = { 42149c55878SDavid Wu { 42249c55878SDavid Wu .num = 1, 42349c55878SDavid Wu .pin = 0, 42449c55878SDavid Wu .reg = 0x418, 42549c55878SDavid Wu .bit = 0, 42649c55878SDavid Wu .mask = 0x3 42749c55878SDavid Wu }, { 42849c55878SDavid Wu .num = 1, 42949c55878SDavid Wu .pin = 1, 43049c55878SDavid Wu .reg = 0x418, 43149c55878SDavid Wu .bit = 2, 43249c55878SDavid Wu .mask = 0x3 43349c55878SDavid Wu }, { 43449c55878SDavid Wu .num = 1, 43549c55878SDavid Wu .pin = 2, 43649c55878SDavid Wu .reg = 0x418, 43749c55878SDavid Wu .bit = 4, 43849c55878SDavid Wu .mask = 0x3 43949c55878SDavid Wu }, { 44049c55878SDavid Wu .num = 1, 44149c55878SDavid Wu .pin = 3, 44249c55878SDavid Wu .reg = 0x418, 44349c55878SDavid Wu .bit = 6, 44449c55878SDavid Wu .mask = 0x3 44549c55878SDavid Wu }, { 44649c55878SDavid Wu .num = 1, 44749c55878SDavid Wu .pin = 4, 44849c55878SDavid Wu .reg = 0x418, 44949c55878SDavid Wu .bit = 8, 45049c55878SDavid Wu .mask = 0x3 45149c55878SDavid Wu }, { 45249c55878SDavid Wu .num = 1, 45349c55878SDavid Wu .pin = 5, 45449c55878SDavid Wu .reg = 0x418, 45549c55878SDavid Wu .bit = 10, 45649c55878SDavid Wu .mask = 0x3 45749c55878SDavid Wu }, { 45849c55878SDavid Wu .num = 1, 45949c55878SDavid Wu .pin = 6, 46049c55878SDavid Wu .reg = 0x418, 46149c55878SDavid Wu .bit = 12, 46249c55878SDavid Wu .mask = 0x3 46349c55878SDavid Wu }, { 46449c55878SDavid Wu .num = 1, 46549c55878SDavid Wu .pin = 7, 46649c55878SDavid Wu .reg = 0x418, 46749c55878SDavid Wu .bit = 14, 46849c55878SDavid Wu .mask = 0x3 46949c55878SDavid Wu }, { 47049c55878SDavid Wu .num = 1, 47149c55878SDavid Wu .pin = 8, 47249c55878SDavid Wu .reg = 0x41c, 47349c55878SDavid Wu .bit = 0, 47449c55878SDavid Wu .mask = 0x3 47549c55878SDavid Wu }, { 47649c55878SDavid Wu .num = 1, 47749c55878SDavid Wu .pin = 9, 47849c55878SDavid Wu .reg = 0x41c, 47949c55878SDavid Wu .bit = 2, 48049c55878SDavid Wu .mask = 0x3 48149c55878SDavid Wu }, 48249c55878SDavid Wu }; 48349c55878SDavid Wu 484cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = { 485cf04a17bSJianqun Xu { 486cf04a17bSJianqun Xu .num = 0, 487cf04a17bSJianqun Xu .pin = 20, 488cf04a17bSJianqun Xu .reg = 0x10000, 489cf04a17bSJianqun Xu .bit = 0, 490cf04a17bSJianqun Xu .mask = 0xf 491cf04a17bSJianqun Xu }, 492cf04a17bSJianqun Xu { 493cf04a17bSJianqun Xu .num = 0, 494cf04a17bSJianqun Xu .pin = 21, 495cf04a17bSJianqun Xu .reg = 0x10000, 496cf04a17bSJianqun Xu .bit = 4, 497cf04a17bSJianqun Xu .mask = 0xf 498cf04a17bSJianqun Xu }, 499cf04a17bSJianqun Xu { 500cf04a17bSJianqun Xu .num = 0, 501cf04a17bSJianqun Xu .pin = 22, 502cf04a17bSJianqun Xu .reg = 0x10000, 503cf04a17bSJianqun Xu .bit = 8, 504cf04a17bSJianqun Xu .mask = 0xf 505cf04a17bSJianqun Xu }, 506cf04a17bSJianqun Xu { 507cf04a17bSJianqun Xu .num = 0, 508cf04a17bSJianqun Xu .pin = 23, 509cf04a17bSJianqun Xu .reg = 0x10000, 510cf04a17bSJianqun Xu .bit = 12, 511cf04a17bSJianqun Xu .mask = 0xf 512cf04a17bSJianqun Xu }, 513cf04a17bSJianqun Xu }; 514cf04a17bSJianqun Xu 51549c55878SDavid Wu static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { 51649c55878SDavid Wu { 51749c55878SDavid Wu .num = 2, 51849c55878SDavid Wu .pin = 20, 51949c55878SDavid Wu .reg = 0xe8, 52049c55878SDavid Wu .bit = 0, 52149c55878SDavid Wu .mask = 0x7 52249c55878SDavid Wu }, { 52349c55878SDavid Wu .num = 2, 52449c55878SDavid Wu .pin = 21, 52549c55878SDavid Wu .reg = 0xe8, 52649c55878SDavid Wu .bit = 4, 52749c55878SDavid Wu .mask = 0x7 52849c55878SDavid Wu }, { 52949c55878SDavid Wu .num = 2, 53049c55878SDavid Wu .pin = 22, 53149c55878SDavid Wu .reg = 0xe8, 53249c55878SDavid Wu .bit = 8, 53349c55878SDavid Wu .mask = 0x7 53449c55878SDavid Wu }, { 53549c55878SDavid Wu .num = 2, 53649c55878SDavid Wu .pin = 23, 53749c55878SDavid Wu .reg = 0xe8, 53849c55878SDavid Wu .bit = 12, 53949c55878SDavid Wu .mask = 0x7 54049c55878SDavid Wu }, { 54149c55878SDavid Wu .num = 2, 54249c55878SDavid Wu .pin = 24, 54349c55878SDavid Wu .reg = 0xd4, 54449c55878SDavid Wu .bit = 12, 54549c55878SDavid Wu .mask = 0x7 54649c55878SDavid Wu }, 54749c55878SDavid Wu }; 54849c55878SDavid Wu 549b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { 550b3077611SDavid Wu { 551b3077611SDavid Wu .num = 1, 552b3077611SDavid Wu .pin = 14, 553b3077611SDavid Wu .reg = 0x28, 554b3077611SDavid Wu .bit = 12, 555b3077611SDavid Wu .mask = 0x7 556b3077611SDavid Wu }, { 557b3077611SDavid Wu .num = 1, 558b3077611SDavid Wu .pin = 15, 559b3077611SDavid Wu .reg = 0x2c, 560b3077611SDavid Wu .bit = 0, 561b3077611SDavid Wu .mask = 0x3 562b3077611SDavid Wu }, { 563b3077611SDavid Wu .num = 1, 564b3077611SDavid Wu .pin = 18, 565b3077611SDavid Wu .reg = 0x30, 566b3077611SDavid Wu .bit = 4, 567b3077611SDavid Wu .mask = 0x7 568b3077611SDavid Wu }, { 569b3077611SDavid Wu .num = 1, 570b3077611SDavid Wu .pin = 19, 571b3077611SDavid Wu .reg = 0x30, 572b3077611SDavid Wu .bit = 8, 573b3077611SDavid Wu .mask = 0x7 574b3077611SDavid Wu }, { 575b3077611SDavid Wu .num = 1, 576b3077611SDavid Wu .pin = 20, 577b3077611SDavid Wu .reg = 0x30, 578b3077611SDavid Wu .bit = 12, 579b3077611SDavid Wu .mask = 0x7 580b3077611SDavid Wu }, { 581b3077611SDavid Wu .num = 1, 582b3077611SDavid Wu .pin = 21, 583b3077611SDavid Wu .reg = 0x34, 584b3077611SDavid Wu .bit = 0, 585b3077611SDavid Wu .mask = 0x7 586b3077611SDavid Wu }, { 587b3077611SDavid Wu .num = 1, 588b3077611SDavid Wu .pin = 22, 589b3077611SDavid Wu .reg = 0x34, 590b3077611SDavid Wu .bit = 4, 591b3077611SDavid Wu .mask = 0x7 592b3077611SDavid Wu }, { 593b3077611SDavid Wu .num = 1, 594b3077611SDavid Wu .pin = 23, 595b3077611SDavid Wu .reg = 0x34, 596b3077611SDavid Wu .bit = 8, 597b3077611SDavid Wu .mask = 0x7 598b3077611SDavid Wu }, { 599b3077611SDavid Wu .num = 3, 600b3077611SDavid Wu .pin = 12, 601b3077611SDavid Wu .reg = 0x68, 602b3077611SDavid Wu .bit = 8, 603b3077611SDavid Wu .mask = 0x7 604b3077611SDavid Wu }, { 605b3077611SDavid Wu .num = 3, 606b3077611SDavid Wu .pin = 13, 607b3077611SDavid Wu .reg = 0x68, 608b3077611SDavid Wu .bit = 12, 609b3077611SDavid Wu .mask = 0x7 610b3077611SDavid Wu }, 611b3077611SDavid Wu }; 612b3077611SDavid Wu 613d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = { 614d5517017SDavid Wu { 615d5517017SDavid Wu .num = 1, 616d5517017SDavid Wu .pin = 14, 617d5517017SDavid Wu .reg = 0x28, 618d5517017SDavid Wu .bit = 12, 619d5517017SDavid Wu .mask = 0xf 620d5517017SDavid Wu }, { 621d5517017SDavid Wu .num = 1, 622d5517017SDavid Wu .pin = 15, 623d5517017SDavid Wu .reg = 0x2c, 624d5517017SDavid Wu .bit = 0, 625d5517017SDavid Wu .mask = 0x3 626d5517017SDavid Wu }, { 627d5517017SDavid Wu .num = 1, 628d5517017SDavid Wu .pin = 18, 629d5517017SDavid Wu .reg = 0x30, 630d5517017SDavid Wu .bit = 4, 631d5517017SDavid Wu .mask = 0xf 632d5517017SDavid Wu }, { 633d5517017SDavid Wu .num = 1, 634d5517017SDavid Wu .pin = 19, 635d5517017SDavid Wu .reg = 0x30, 636d5517017SDavid Wu .bit = 8, 637d5517017SDavid Wu .mask = 0xf 638d5517017SDavid Wu }, { 639d5517017SDavid Wu .num = 1, 640d5517017SDavid Wu .pin = 20, 641d5517017SDavid Wu .reg = 0x30, 642d5517017SDavid Wu .bit = 12, 643d5517017SDavid Wu .mask = 0xf 644d5517017SDavid Wu }, { 645d5517017SDavid Wu .num = 1, 646d5517017SDavid Wu .pin = 21, 647d5517017SDavid Wu .reg = 0x34, 648d5517017SDavid Wu .bit = 0, 649d5517017SDavid Wu .mask = 0xf 650d5517017SDavid Wu }, { 651d5517017SDavid Wu .num = 1, 652d5517017SDavid Wu .pin = 22, 653d5517017SDavid Wu .reg = 0x34, 654d5517017SDavid Wu .bit = 4, 655d5517017SDavid Wu .mask = 0xf 656d5517017SDavid Wu }, { 657d5517017SDavid Wu .num = 1, 658d5517017SDavid Wu .pin = 23, 659d5517017SDavid Wu .reg = 0x34, 660d5517017SDavid Wu .bit = 8, 661d5517017SDavid Wu .mask = 0xf 662d5517017SDavid Wu }, { 663d5517017SDavid Wu .num = 3, 664752032c9SDavid.Wu .pin = 12, 665752032c9SDavid.Wu .reg = 0x68, 666752032c9SDavid.Wu .bit = 8, 667752032c9SDavid.Wu .mask = 0xf 668752032c9SDavid.Wu }, { 669752032c9SDavid.Wu .num = 3, 670d5517017SDavid Wu .pin = 13, 671d5517017SDavid Wu .reg = 0x68, 672d5517017SDavid Wu .bit = 12, 673d5517017SDavid Wu .mask = 0xf 674d5517017SDavid Wu }, { 675d5517017SDavid Wu .num = 2, 676d5517017SDavid Wu .pin = 2, 677d5517017SDavid Wu .reg = 0x608, 678d5517017SDavid Wu .bit = 0, 679d5517017SDavid Wu .mask = 0x7 680d5517017SDavid Wu }, { 681d5517017SDavid Wu .num = 2, 682d5517017SDavid Wu .pin = 3, 683d5517017SDavid Wu .reg = 0x608, 684d5517017SDavid Wu .bit = 4, 685d5517017SDavid Wu .mask = 0x7 686d5517017SDavid Wu }, { 687d5517017SDavid Wu .num = 2, 688d5517017SDavid Wu .pin = 16, 689d5517017SDavid Wu .reg = 0x610, 690d5517017SDavid Wu .bit = 8, 691d5517017SDavid Wu .mask = 0x7 692d5517017SDavid Wu }, { 693d5517017SDavid Wu .num = 3, 694d5517017SDavid Wu .pin = 10, 695d5517017SDavid Wu .reg = 0x610, 696d5517017SDavid Wu .bit = 0, 697d5517017SDavid Wu .mask = 0x7 698d5517017SDavid Wu }, { 699d5517017SDavid Wu .num = 3, 700d5517017SDavid Wu .pin = 11, 701d5517017SDavid Wu .reg = 0x610, 702d5517017SDavid Wu .bit = 4, 703d5517017SDavid Wu .mask = 0x7 704d5517017SDavid Wu }, 705d5517017SDavid Wu }; 706d5517017SDavid Wu 70749c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = { 70849c55878SDavid Wu { 70949c55878SDavid Wu .num = 2, 71049c55878SDavid Wu .pin = 12, 71149c55878SDavid Wu .reg = 0x24, 71249c55878SDavid Wu .bit = 8, 71349c55878SDavid Wu .mask = 0x3 71449c55878SDavid Wu }, { 71549c55878SDavid Wu .num = 2, 71649c55878SDavid Wu .pin = 15, 71749c55878SDavid Wu .reg = 0x28, 71849c55878SDavid Wu .bit = 0, 71949c55878SDavid Wu .mask = 0x7 72049c55878SDavid Wu }, { 72149c55878SDavid Wu .num = 2, 72249c55878SDavid Wu .pin = 23, 72349c55878SDavid Wu .reg = 0x30, 72449c55878SDavid Wu .bit = 14, 72549c55878SDavid Wu .mask = 0x3 72649c55878SDavid Wu }, 72749c55878SDavid Wu }; 72849c55878SDavid Wu 729d499d466SJianqun Xu static struct rockchip_mux_route_data rv1126_mux_route_data[] = { 73049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */ 73149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */ 732d499d466SJianqun Xu 733d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */ 734d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */ 735d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */ 736d499d466SJianqun Xu 73749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */ 73849e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */ 739d499d466SJianqun Xu 74049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */ 74149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */ 742d499d466SJianqun Xu 74349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */ 74449e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */ 745d499d466SJianqun Xu 746d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */ 747d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */ 748d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */ 749d499d466SJianqun Xu 75049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */ 75149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */ 752d499d466SJianqun Xu 753d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */ 754d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */ 755d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */ 756d499d466SJianqun Xu 757d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */ 758d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */ 759d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */ 760d499d466SJianqun Xu 76149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */ 76249e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */ 763d499d466SJianqun Xu 76449e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */ 76549e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */ 766d499d466SJianqun Xu 76749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */ 76849e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */ 769d499d466SJianqun Xu 77049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */ 77149e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */ 772d499d466SJianqun Xu 77349e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */ 77449e04eddSJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */ 775d499d466SJianqun Xu 77649e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */ 77749e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */ 778d499d466SJianqun Xu 77949e04eddSJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */ 78049e04eddSJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */ 781d499d466SJianqun Xu 782d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(11, 10, 0)), /* UART3_TX_M0 */ 783d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(11, 10, 1)), /* UART3_TX_M1 */ 784d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(11, 10, 2)), /* UART3_TX_M2 */ 785d499d466SJianqun Xu 786d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 0)), /* UART4_TX_M0 */ 787d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 1)), /* UART4_TX_M1 */ 788d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(13, 12, 2)), /* UART4_TX_M2 */ 789d499d466SJianqun Xu 790d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 0)), /* UART5_TX_M0 */ 791d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 1)), /* UART5_TX_M1 */ 792d2f01304SJianqun Xu MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(15, 14, 2)), /* UART5_TX_M2 */ 79349e04eddSJianqun Xu 79449e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */ 79549e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */ 79649e04eddSJianqun Xu 79749e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */ 79849e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */ 79949e04eddSJianqun Xu 80049e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */ 80149e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */ 80249e04eddSJianqun Xu 80349e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */ 80449e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */ 80549e04eddSJianqun Xu 80649e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */ 80749e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */ 80849e04eddSJianqun Xu 80949e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */ 81049e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */ 81149e04eddSJianqun Xu 81249e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */ 81349e04eddSJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */ 81449e04eddSJianqun Xu 81549e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */ 81649e04eddSJianqun Xu MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */ 81749e04eddSJianqun Xu 818d2f01304SJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */ 819d2f01304SJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */ 820d2f01304SJianqun Xu MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */ 82149e04eddSJianqun Xu 82249e04eddSJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */ 82349e04eddSJianqun Xu MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */ 824d2f01304SJianqun Xu MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(4, 4, 1)), /* I2C2 */ 825d499d466SJianqun Xu }; 826d499d466SJianqun Xu 82749c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, 82849c55878SDavid Wu int *reg, u8 *bit, int *mask) 82949c55878SDavid Wu { 83049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 83149c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 83249c55878SDavid Wu struct rockchip_mux_recalced_data *data; 83349c55878SDavid Wu int i; 83449c55878SDavid Wu 83549c55878SDavid Wu for (i = 0; i < ctrl->niomux_recalced; i++) { 83649c55878SDavid Wu data = &ctrl->iomux_recalced[i]; 83749c55878SDavid Wu if (data->num == bank->bank_num && 83849c55878SDavid Wu data->pin == pin) 83949c55878SDavid Wu break; 84049c55878SDavid Wu } 84149c55878SDavid Wu 84249c55878SDavid Wu if (i >= ctrl->niomux_recalced) 84349c55878SDavid Wu return; 84449c55878SDavid Wu 84549c55878SDavid Wu *reg = data->reg; 84649c55878SDavid Wu *mask = data->mask; 84749c55878SDavid Wu *bit = data->bit; 84849c55878SDavid Wu } 84949c55878SDavid Wu 85049c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = { 85149c55878SDavid Wu { 85249c55878SDavid Wu /* cif-d2m0 */ 85349c55878SDavid Wu .bank_num = 2, 85449c55878SDavid Wu .pin = 0, 85549c55878SDavid Wu .func = 1, 85649c55878SDavid Wu .route_offset = 0x184, 85749c55878SDavid Wu .route_val = BIT(16 + 7), 85849c55878SDavid Wu }, { 85949c55878SDavid Wu /* cif-d2m1 */ 86049c55878SDavid Wu .bank_num = 3, 86149c55878SDavid Wu .pin = 3, 86249c55878SDavid Wu .func = 3, 86349c55878SDavid Wu .route_offset = 0x184, 86449c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 86549c55878SDavid Wu }, { 86649c55878SDavid Wu /* pdm-m0 */ 86749c55878SDavid Wu .bank_num = 3, 86849c55878SDavid Wu .pin = 22, 86949c55878SDavid Wu .func = 2, 87049c55878SDavid Wu .route_offset = 0x184, 87149c55878SDavid Wu .route_val = BIT(16 + 8), 87249c55878SDavid Wu }, { 87349c55878SDavid Wu /* pdm-m1 */ 87449c55878SDavid Wu .bank_num = 2, 87549c55878SDavid Wu .pin = 22, 87649c55878SDavid Wu .func = 1, 87749c55878SDavid Wu .route_offset = 0x184, 87849c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 87949c55878SDavid Wu }, { 88049c55878SDavid Wu /* uart2-rxm0 */ 88149c55878SDavid Wu .bank_num = 1, 882793770dfSDavid Wu .pin = 27, 88349c55878SDavid Wu .func = 2, 88449c55878SDavid Wu .route_offset = 0x184, 885793770dfSDavid Wu .route_val = BIT(16 + 10), 88649c55878SDavid Wu }, { 88749c55878SDavid Wu /* uart2-rxm1 */ 88849c55878SDavid Wu .bank_num = 2, 88949c55878SDavid Wu .pin = 14, 89049c55878SDavid Wu .func = 2, 89149c55878SDavid Wu .route_offset = 0x184, 892793770dfSDavid Wu .route_val = BIT(16 + 10) | BIT(10), 89349c55878SDavid Wu }, { 89449c55878SDavid Wu /* uart3-rxm0 */ 89549c55878SDavid Wu .bank_num = 0, 89649c55878SDavid Wu .pin = 17, 89749c55878SDavid Wu .func = 2, 89849c55878SDavid Wu .route_offset = 0x184, 899793770dfSDavid Wu .route_val = BIT(16 + 9), 90049c55878SDavid Wu }, { 90149c55878SDavid Wu /* uart3-rxm1 */ 90249c55878SDavid Wu .bank_num = 1, 903793770dfSDavid Wu .pin = 15, 90449c55878SDavid Wu .func = 2, 90549c55878SDavid Wu .route_offset = 0x184, 906793770dfSDavid Wu .route_val = BIT(16 + 9) | BIT(9), 90749c55878SDavid Wu }, 90849c55878SDavid Wu }; 90949c55878SDavid Wu 910a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = { 911a2a3fc8fSJianqun Xu { 912a2a3fc8fSJianqun Xu /* i2c2m0_sda */ 913a2a3fc8fSJianqun Xu .bank_num = 3, 914a2a3fc8fSJianqun Xu .pin = 12, 915a2a3fc8fSJianqun Xu .func = 2, 916a2a3fc8fSJianqun Xu .route_offset = 0x190, 917a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3), 918a2a3fc8fSJianqun Xu }, { 919a2a3fc8fSJianqun Xu /* i2c2m1_sda */ 920a2a3fc8fSJianqun Xu .bank_num = 1, 921a2a3fc8fSJianqun Xu .pin = 13, 922a2a3fc8fSJianqun Xu .func = 2, 923a2a3fc8fSJianqun Xu .route_offset = 0x190, 924a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3) | BIT(3), 925a2a3fc8fSJianqun Xu }, { 926a2a3fc8fSJianqun Xu /* uart2_rxm0 */ 927a2a3fc8fSJianqun Xu .bank_num = 4, 928a2a3fc8fSJianqun Xu .pin = 3, 929a2a3fc8fSJianqun Xu .func = 2, 930a2a3fc8fSJianqun Xu .route_offset = 0x190, 931a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15), 932a2a3fc8fSJianqun Xu }, { 933a2a3fc8fSJianqun Xu /* uart2_rxm1 */ 934a2a3fc8fSJianqun Xu .bank_num = 2, 935a2a3fc8fSJianqun Xu .pin = 25, 936a2a3fc8fSJianqun Xu .func = 2, 937a2a3fc8fSJianqun Xu .route_offset = 0x190, 938a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15), 939a2a3fc8fSJianqun Xu }, { 940a2a3fc8fSJianqun Xu /* uart2_rxm2 */ 941a2a3fc8fSJianqun Xu .bank_num = 3, 942a2a3fc8fSJianqun Xu .pin = 4, 943a2a3fc8fSJianqun Xu .func = 2, 944a2a3fc8fSJianqun Xu .route_offset = 0x190, 945a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15), 946a2a3fc8fSJianqun Xu }, 947a2a3fc8fSJianqun Xu }; 948a2a3fc8fSJianqun Xu 94949c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = { 95049c55878SDavid Wu { 95149c55878SDavid Wu /* spi-0 */ 95249c55878SDavid Wu .bank_num = 1, 95349c55878SDavid Wu .pin = 10, 95449c55878SDavid Wu .func = 1, 95549c55878SDavid Wu .route_offset = 0x144, 95649c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4), 95749c55878SDavid Wu }, { 95849c55878SDavid Wu /* spi-1 */ 95949c55878SDavid Wu .bank_num = 1, 96049c55878SDavid Wu .pin = 27, 96149c55878SDavid Wu .func = 3, 96249c55878SDavid Wu .route_offset = 0x144, 96349c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3), 96449c55878SDavid Wu }, { 96549c55878SDavid Wu /* spi-2 */ 96649c55878SDavid Wu .bank_num = 0, 96749c55878SDavid Wu .pin = 13, 96849c55878SDavid Wu .func = 2, 96949c55878SDavid Wu .route_offset = 0x144, 97049c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4), 97149c55878SDavid Wu }, { 97249c55878SDavid Wu /* i2s-0 */ 97349c55878SDavid Wu .bank_num = 1, 97449c55878SDavid Wu .pin = 5, 97549c55878SDavid Wu .func = 1, 97649c55878SDavid Wu .route_offset = 0x144, 97749c55878SDavid Wu .route_val = BIT(16 + 5), 97849c55878SDavid Wu }, { 97949c55878SDavid Wu /* i2s-1 */ 98049c55878SDavid Wu .bank_num = 0, 98149c55878SDavid Wu .pin = 14, 98249c55878SDavid Wu .func = 1, 98349c55878SDavid Wu .route_offset = 0x144, 98449c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 98549c55878SDavid Wu }, { 98649c55878SDavid Wu /* emmc-0 */ 98749c55878SDavid Wu .bank_num = 1, 98849c55878SDavid Wu .pin = 22, 98949c55878SDavid Wu .func = 2, 99049c55878SDavid Wu .route_offset = 0x144, 99149c55878SDavid Wu .route_val = BIT(16 + 6), 99249c55878SDavid Wu }, { 99349c55878SDavid Wu /* emmc-1 */ 99449c55878SDavid Wu .bank_num = 2, 99549c55878SDavid Wu .pin = 4, 99649c55878SDavid Wu .func = 2, 99749c55878SDavid Wu .route_offset = 0x144, 99849c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 99949c55878SDavid Wu }, 100049c55878SDavid Wu }; 100149c55878SDavid Wu 100249c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = { 100349c55878SDavid Wu { 100449c55878SDavid Wu /* pwm0-0 */ 100549c55878SDavid Wu .bank_num = 0, 100649c55878SDavid Wu .pin = 26, 100749c55878SDavid Wu .func = 1, 100849c55878SDavid Wu .route_offset = 0x50, 100949c55878SDavid Wu .route_val = BIT(16), 101049c55878SDavid Wu }, { 101149c55878SDavid Wu /* pwm0-1 */ 101249c55878SDavid Wu .bank_num = 3, 101349c55878SDavid Wu .pin = 21, 101449c55878SDavid Wu .func = 1, 101549c55878SDavid Wu .route_offset = 0x50, 101649c55878SDavid Wu .route_val = BIT(16) | BIT(0), 101749c55878SDavid Wu }, { 101849c55878SDavid Wu /* pwm1-0 */ 101949c55878SDavid Wu .bank_num = 0, 102049c55878SDavid Wu .pin = 27, 102149c55878SDavid Wu .func = 1, 102249c55878SDavid Wu .route_offset = 0x50, 102349c55878SDavid Wu .route_val = BIT(16 + 1), 102449c55878SDavid Wu }, { 102549c55878SDavid Wu /* pwm1-1 */ 102649c55878SDavid Wu .bank_num = 0, 102749c55878SDavid Wu .pin = 30, 102849c55878SDavid Wu .func = 2, 102949c55878SDavid Wu .route_offset = 0x50, 103049c55878SDavid Wu .route_val = BIT(16 + 1) | BIT(1), 103149c55878SDavid Wu }, { 103249c55878SDavid Wu /* pwm2-0 */ 103349c55878SDavid Wu .bank_num = 0, 103449c55878SDavid Wu .pin = 28, 103549c55878SDavid Wu .func = 1, 103649c55878SDavid Wu .route_offset = 0x50, 103749c55878SDavid Wu .route_val = BIT(16 + 2), 103849c55878SDavid Wu }, { 103949c55878SDavid Wu /* pwm2-1 */ 104049c55878SDavid Wu .bank_num = 1, 104149c55878SDavid Wu .pin = 12, 104249c55878SDavid Wu .func = 2, 104349c55878SDavid Wu .route_offset = 0x50, 104449c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 104549c55878SDavid Wu }, { 104649c55878SDavid Wu /* pwm3-0 */ 104749c55878SDavid Wu .bank_num = 3, 104849c55878SDavid Wu .pin = 26, 104949c55878SDavid Wu .func = 1, 105049c55878SDavid Wu .route_offset = 0x50, 105149c55878SDavid Wu .route_val = BIT(16 + 3), 105249c55878SDavid Wu }, { 105349c55878SDavid Wu /* pwm3-1 */ 105449c55878SDavid Wu .bank_num = 1, 105549c55878SDavid Wu .pin = 11, 105649c55878SDavid Wu .func = 2, 105749c55878SDavid Wu .route_offset = 0x50, 105849c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 105949c55878SDavid Wu }, { 106049c55878SDavid Wu /* sdio-0_d0 */ 106149c55878SDavid Wu .bank_num = 1, 106249c55878SDavid Wu .pin = 1, 106349c55878SDavid Wu .func = 1, 106449c55878SDavid Wu .route_offset = 0x50, 106549c55878SDavid Wu .route_val = BIT(16 + 4), 106649c55878SDavid Wu }, { 106749c55878SDavid Wu /* sdio-1_d0 */ 106849c55878SDavid Wu .bank_num = 3, 106949c55878SDavid Wu .pin = 2, 107049c55878SDavid Wu .func = 1, 107149c55878SDavid Wu .route_offset = 0x50, 107249c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 107349c55878SDavid Wu }, { 107449c55878SDavid Wu /* spi-0_rx */ 107549c55878SDavid Wu .bank_num = 0, 107649c55878SDavid Wu .pin = 13, 107749c55878SDavid Wu .func = 2, 107849c55878SDavid Wu .route_offset = 0x50, 107949c55878SDavid Wu .route_val = BIT(16 + 5), 108049c55878SDavid Wu }, { 108149c55878SDavid Wu /* spi-1_rx */ 108249c55878SDavid Wu .bank_num = 2, 108349c55878SDavid Wu .pin = 0, 108449c55878SDavid Wu .func = 2, 108549c55878SDavid Wu .route_offset = 0x50, 108649c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 108749c55878SDavid Wu }, { 108849c55878SDavid Wu /* emmc-0_cmd */ 108949c55878SDavid Wu .bank_num = 1, 109049c55878SDavid Wu .pin = 22, 109149c55878SDavid Wu .func = 2, 109249c55878SDavid Wu .route_offset = 0x50, 109349c55878SDavid Wu .route_val = BIT(16 + 7), 109449c55878SDavid Wu }, { 109549c55878SDavid Wu /* emmc-1_cmd */ 109649c55878SDavid Wu .bank_num = 2, 109749c55878SDavid Wu .pin = 4, 109849c55878SDavid Wu .func = 2, 109949c55878SDavid Wu .route_offset = 0x50, 110049c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 110149c55878SDavid Wu }, { 110249c55878SDavid Wu /* uart2-0_rx */ 110349c55878SDavid Wu .bank_num = 1, 110449c55878SDavid Wu .pin = 19, 110549c55878SDavid Wu .func = 2, 110649c55878SDavid Wu .route_offset = 0x50, 110749c55878SDavid Wu .route_val = BIT(16 + 8), 110849c55878SDavid Wu }, { 110949c55878SDavid Wu /* uart2-1_rx */ 111049c55878SDavid Wu .bank_num = 1, 111149c55878SDavid Wu .pin = 10, 111249c55878SDavid Wu .func = 2, 111349c55878SDavid Wu .route_offset = 0x50, 111449c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 111549c55878SDavid Wu }, { 111649c55878SDavid Wu /* uart1-0_rx */ 111749c55878SDavid Wu .bank_num = 1, 111849c55878SDavid Wu .pin = 10, 111949c55878SDavid Wu .func = 1, 112049c55878SDavid Wu .route_offset = 0x50, 112149c55878SDavid Wu .route_val = BIT(16 + 11), 112249c55878SDavid Wu }, { 112349c55878SDavid Wu /* uart1-1_rx */ 112449c55878SDavid Wu .bank_num = 3, 112549c55878SDavid Wu .pin = 13, 112649c55878SDavid Wu .func = 1, 112749c55878SDavid Wu .route_offset = 0x50, 112849c55878SDavid Wu .route_val = BIT(16 + 11) | BIT(11), 112949c55878SDavid Wu }, 113049c55878SDavid Wu }; 113149c55878SDavid Wu 113249c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = { 113349c55878SDavid Wu { 113449c55878SDavid Wu /* edphdmi_cecinoutt1 */ 113549c55878SDavid Wu .bank_num = 7, 113649c55878SDavid Wu .pin = 16, 113749c55878SDavid Wu .func = 2, 113849c55878SDavid Wu .route_offset = 0x264, 113949c55878SDavid Wu .route_val = BIT(16 + 12) | BIT(12), 114049c55878SDavid Wu }, { 114149c55878SDavid Wu /* edphdmi_cecinout */ 114249c55878SDavid Wu .bank_num = 7, 114349c55878SDavid Wu .pin = 23, 114449c55878SDavid Wu .func = 4, 114549c55878SDavid Wu .route_offset = 0x264, 114649c55878SDavid Wu .route_val = BIT(16 + 12), 114749c55878SDavid Wu }, 114849c55878SDavid Wu }; 114949c55878SDavid Wu 1150b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = { 1151b3077611SDavid Wu { 1152d5517017SDavid Wu /* rtc_clk */ 1153d5517017SDavid Wu .bank_num = 0, 1154d5517017SDavid Wu .pin = 19, 1155d5517017SDavid Wu .func = 1, 1156d5517017SDavid Wu .route_offset = 0x314, 1157d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1158d5517017SDavid Wu }, { 1159b3077611SDavid Wu /* uart2_rxm0 */ 1160b3077611SDavid Wu .bank_num = 1, 1161b3077611SDavid Wu .pin = 22, 1162b3077611SDavid Wu .func = 2, 1163b3077611SDavid Wu .route_offset = 0x314, 1164b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1165b3077611SDavid Wu }, { 1166b3077611SDavid Wu /* uart2_rxm1 */ 1167b3077611SDavid Wu .bank_num = 4, 1168b3077611SDavid Wu .pin = 26, 1169b3077611SDavid Wu .func = 2, 1170b3077611SDavid Wu .route_offset = 0x314, 1171b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1172b3077611SDavid Wu }, { 1173b3077611SDavid Wu /* i2c3_sdam0 */ 1174b3077611SDavid Wu .bank_num = 0, 1175b3077611SDavid Wu .pin = 23, 1176b3077611SDavid Wu .func = 2, 1177b3077611SDavid Wu .route_offset = 0x314, 1178b3077611SDavid Wu .route_val = BIT(16 + 4), 1179b3077611SDavid Wu }, { 1180b3077611SDavid Wu /* i2c3_sdam1 */ 1181b3077611SDavid Wu .bank_num = 3, 1182b3077611SDavid Wu .pin = 12, 1183b3077611SDavid Wu .func = 2, 1184b3077611SDavid Wu .route_offset = 0x314, 1185b3077611SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 1186d5517017SDavid Wu }, { 1187d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1188d5517017SDavid Wu .bank_num = 1, 1189d5517017SDavid Wu .pin = 3, 1190d5517017SDavid Wu .func = 2, 1191d5517017SDavid Wu .route_offset = 0x308, 1192d5517017SDavid Wu .route_val = BIT(16 + 3), 1193d5517017SDavid Wu }, { 1194d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1195d5517017SDavid Wu .bank_num = 1, 1196d5517017SDavid Wu .pin = 4, 1197d5517017SDavid Wu .func = 2, 1198d5517017SDavid Wu .route_offset = 0x308, 1199d5517017SDavid Wu .route_val = BIT(16 + 3), 1200d5517017SDavid Wu }, { 1201d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1202d5517017SDavid Wu .bank_num = 1, 1203d5517017SDavid Wu .pin = 13, 1204d5517017SDavid Wu .func = 2, 1205d5517017SDavid Wu .route_offset = 0x308, 1206d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1207d5517017SDavid Wu }, { 1208d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1209d5517017SDavid Wu .bank_num = 1, 1210d5517017SDavid Wu .pin = 14, 1211d5517017SDavid Wu .func = 2, 1212d5517017SDavid Wu .route_offset = 0x308, 1213d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1214d5517017SDavid Wu }, { 1215d5517017SDavid Wu /* pdm-clkm0 */ 1216d5517017SDavid Wu .bank_num = 1, 1217d5517017SDavid Wu .pin = 4, 1218d5517017SDavid Wu .func = 3, 1219d5517017SDavid Wu .route_offset = 0x308, 1220d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1221d5517017SDavid Wu }, { 1222d5517017SDavid Wu /* pdm-clkm1 */ 1223d5517017SDavid Wu .bank_num = 1, 1224d5517017SDavid Wu .pin = 14, 1225d5517017SDavid Wu .func = 4, 1226d5517017SDavid Wu .route_offset = 0x308, 1227d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1228d5517017SDavid Wu }, { 1229d5517017SDavid Wu /* pdm-clkm2 */ 1230d5517017SDavid Wu .bank_num = 2, 1231d5517017SDavid Wu .pin = 6, 1232d5517017SDavid Wu .func = 2, 1233d5517017SDavid Wu .route_offset = 0x308, 1234d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1235d5517017SDavid Wu }, { 1236d5517017SDavid Wu /* pdm-clkm-m2 */ 1237d5517017SDavid Wu .bank_num = 2, 1238d5517017SDavid Wu .pin = 4, 1239d5517017SDavid Wu .func = 3, 1240d5517017SDavid Wu .route_offset = 0x600, 1241d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1242d5517017SDavid Wu }, 1243d5517017SDavid Wu }; 1244d5517017SDavid Wu 1245d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = { 1246d5517017SDavid Wu { 1247d5517017SDavid Wu /* rtc_clk */ 1248d5517017SDavid Wu .bank_num = 0, 1249d5517017SDavid Wu .pin = 19, 1250d5517017SDavid Wu .func = 1, 1251d5517017SDavid Wu .route_offset = 0x314, 1252d5517017SDavid Wu .route_val = BIT(16 + 0) | BIT(0), 1253d5517017SDavid Wu }, { 1254d5517017SDavid Wu /* uart2_rxm0 */ 1255d5517017SDavid Wu .bank_num = 1, 1256d5517017SDavid Wu .pin = 22, 1257d5517017SDavid Wu .func = 2, 1258d5517017SDavid Wu .route_offset = 0x314, 1259d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 1260d5517017SDavid Wu }, { 1261d5517017SDavid Wu /* uart2_rxm1 */ 1262d5517017SDavid Wu .bank_num = 4, 1263d5517017SDavid Wu .pin = 26, 1264d5517017SDavid Wu .func = 2, 1265d5517017SDavid Wu .route_offset = 0x314, 1266d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 1267d5517017SDavid Wu }, { 1268d5517017SDavid Wu /* i2c3_sdam0 */ 1269d5517017SDavid Wu .bank_num = 0, 1270d5517017SDavid Wu .pin = 15, 1271d5517017SDavid Wu .func = 2, 1272d5517017SDavid Wu .route_offset = 0x608, 1273d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9), 1274d5517017SDavid Wu }, { 1275d5517017SDavid Wu /* i2c3_sdam1 */ 1276d5517017SDavid Wu .bank_num = 3, 1277d5517017SDavid Wu .pin = 12, 1278d5517017SDavid Wu .func = 2, 1279d5517017SDavid Wu .route_offset = 0x608, 1280d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8), 1281d5517017SDavid Wu }, { 1282d5517017SDavid Wu /* i2c3_sdam2 */ 1283d5517017SDavid Wu .bank_num = 2, 1284d5517017SDavid Wu .pin = 0, 1285d5517017SDavid Wu .func = 3, 1286d5517017SDavid Wu .route_offset = 0x608, 1287d5517017SDavid Wu .route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9), 1288d5517017SDavid Wu }, { 1289d5517017SDavid Wu /* i2s-8ch-1-sclktxm0 */ 1290d5517017SDavid Wu .bank_num = 1, 1291d5517017SDavid Wu .pin = 3, 1292d5517017SDavid Wu .func = 2, 1293d5517017SDavid Wu .route_offset = 0x308, 1294d5517017SDavid Wu .route_val = BIT(16 + 3), 1295d5517017SDavid Wu }, { 1296d5517017SDavid Wu /* i2s-8ch-1-sclkrxm0 */ 1297d5517017SDavid Wu .bank_num = 1, 1298d5517017SDavid Wu .pin = 4, 1299d5517017SDavid Wu .func = 2, 1300d5517017SDavid Wu .route_offset = 0x308, 1301d5517017SDavid Wu .route_val = BIT(16 + 3), 1302d5517017SDavid Wu }, { 1303d5517017SDavid Wu /* i2s-8ch-1-sclktxm1 */ 1304d5517017SDavid Wu .bank_num = 1, 1305d5517017SDavid Wu .pin = 13, 1306d5517017SDavid Wu .func = 2, 1307d5517017SDavid Wu .route_offset = 0x308, 1308d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1309d5517017SDavid Wu }, { 1310d5517017SDavid Wu /* i2s-8ch-1-sclkrxm1 */ 1311d5517017SDavid Wu .bank_num = 1, 1312d5517017SDavid Wu .pin = 14, 1313d5517017SDavid Wu .func = 2, 1314d5517017SDavid Wu .route_offset = 0x308, 1315d5517017SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 1316d5517017SDavid Wu }, { 1317d5517017SDavid Wu /* pdm-clkm0 */ 1318d5517017SDavid Wu .bank_num = 1, 1319d5517017SDavid Wu .pin = 4, 1320d5517017SDavid Wu .func = 3, 1321d5517017SDavid Wu .route_offset = 0x308, 1322d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1323d5517017SDavid Wu }, { 1324d5517017SDavid Wu /* pdm-clkm1 */ 1325d5517017SDavid Wu .bank_num = 1, 1326d5517017SDavid Wu .pin = 14, 1327d5517017SDavid Wu .func = 4, 1328d5517017SDavid Wu .route_offset = 0x308, 1329d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1330d5517017SDavid Wu }, { 1331d5517017SDavid Wu /* pdm-clkm2 */ 1332d5517017SDavid Wu .bank_num = 2, 1333d5517017SDavid Wu .pin = 6, 1334d5517017SDavid Wu .func = 2, 1335d5517017SDavid Wu .route_offset = 0x308, 1336d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1337d5517017SDavid Wu }, { 1338d5517017SDavid Wu /* pdm-clkm-m2 */ 1339d5517017SDavid Wu .bank_num = 2, 1340d5517017SDavid Wu .pin = 4, 1341d5517017SDavid Wu .func = 3, 1342d5517017SDavid Wu .route_offset = 0x600, 1343d5517017SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 1344d5517017SDavid Wu }, { 1345d5517017SDavid Wu /* spi1_miso */ 1346d5517017SDavid Wu .bank_num = 3, 1347d5517017SDavid Wu .pin = 10, 1348d5517017SDavid Wu .func = 3, 1349d5517017SDavid Wu .route_offset = 0x314, 1350d5517017SDavid Wu .route_val = BIT(16 + 9), 1351d5517017SDavid Wu }, { 1352d5517017SDavid Wu /* spi1_miso_m1 */ 1353d5517017SDavid Wu .bank_num = 2, 1354d5517017SDavid Wu .pin = 4, 1355d5517017SDavid Wu .func = 2, 1356d5517017SDavid Wu .route_offset = 0x314, 1357d5517017SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 1358d5517017SDavid Wu }, { 1359d5517017SDavid Wu /* owire_m0 */ 1360d5517017SDavid Wu .bank_num = 0, 1361d5517017SDavid Wu .pin = 11, 1362d5517017SDavid Wu .func = 3, 1363d5517017SDavid Wu .route_offset = 0x314, 1364d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 1365d5517017SDavid Wu }, { 1366d5517017SDavid Wu /* owire_m1 */ 1367d5517017SDavid Wu .bank_num = 1, 1368d5517017SDavid Wu .pin = 22, 1369d5517017SDavid Wu .func = 7, 1370d5517017SDavid Wu .route_offset = 0x314, 1371d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 1372d5517017SDavid Wu }, { 1373d5517017SDavid Wu /* owire_m2 */ 1374d5517017SDavid Wu .bank_num = 2, 1375d5517017SDavid Wu .pin = 2, 1376d5517017SDavid Wu .func = 5, 1377d5517017SDavid Wu .route_offset = 0x314, 1378d5517017SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 1379d5517017SDavid Wu }, { 1380d5517017SDavid Wu /* can_rxd_m0 */ 1381d5517017SDavid Wu .bank_num = 0, 1382d5517017SDavid Wu .pin = 11, 1383d5517017SDavid Wu .func = 2, 1384d5517017SDavid Wu .route_offset = 0x314, 1385d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13), 1386d5517017SDavid Wu }, { 1387d5517017SDavid Wu /* can_rxd_m1 */ 1388d5517017SDavid Wu .bank_num = 1, 1389d5517017SDavid Wu .pin = 22, 1390d5517017SDavid Wu .func = 5, 1391d5517017SDavid Wu .route_offset = 0x314, 1392d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12), 1393d5517017SDavid Wu }, { 1394d5517017SDavid Wu /* can_rxd_m2 */ 1395d5517017SDavid Wu .bank_num = 2, 1396d5517017SDavid Wu .pin = 2, 1397d5517017SDavid Wu .func = 4, 1398d5517017SDavid Wu .route_offset = 0x314, 1399d5517017SDavid Wu .route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13), 1400d5517017SDavid Wu }, { 1401d5517017SDavid Wu /* mac_rxd0_m0 */ 1402d5517017SDavid Wu .bank_num = 1, 1403d5517017SDavid Wu .pin = 20, 1404d5517017SDavid Wu .func = 3, 1405d5517017SDavid Wu .route_offset = 0x314, 1406d5517017SDavid Wu .route_val = BIT(16 + 14), 1407d5517017SDavid Wu }, { 1408d5517017SDavid Wu /* mac_rxd0_m1 */ 1409d5517017SDavid Wu .bank_num = 4, 1410d5517017SDavid Wu .pin = 2, 1411d5517017SDavid Wu .func = 2, 1412d5517017SDavid Wu .route_offset = 0x314, 1413d5517017SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 1414d5517017SDavid Wu }, { 1415d5517017SDavid Wu /* uart3_rx */ 1416d5517017SDavid Wu .bank_num = 3, 1417d5517017SDavid Wu .pin = 12, 1418d5517017SDavid Wu .func = 4, 1419d5517017SDavid Wu .route_offset = 0x314, 1420d5517017SDavid Wu .route_val = BIT(16 + 15), 1421d5517017SDavid Wu }, { 1422d5517017SDavid Wu /* uart3_rx_m1 */ 1423d5517017SDavid Wu .bank_num = 0, 1424d5517017SDavid Wu .pin = 17, 1425d5517017SDavid Wu .func = 3, 1426d5517017SDavid Wu .route_offset = 0x314, 1427d5517017SDavid Wu .route_val = BIT(16 + 15) | BIT(15), 1428b3077611SDavid Wu }, 1429b3077611SDavid Wu }; 1430b3077611SDavid Wu 143149c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = { 143249c55878SDavid Wu { 143349c55878SDavid Wu /* uart2dbg_rxm0 */ 143449c55878SDavid Wu .bank_num = 1, 143549c55878SDavid Wu .pin = 1, 143649c55878SDavid Wu .func = 2, 143749c55878SDavid Wu .route_offset = 0x50, 143849c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1), 143949c55878SDavid Wu }, { 144049c55878SDavid Wu /* uart2dbg_rxm1 */ 144149c55878SDavid Wu .bank_num = 2, 144249c55878SDavid Wu .pin = 1, 144349c55878SDavid Wu .func = 1, 144449c55878SDavid Wu .route_offset = 0x50, 144549c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1) | BIT(0), 144649c55878SDavid Wu }, { 144749c55878SDavid Wu /* gmac-m1_rxd0 */ 144849c55878SDavid Wu .bank_num = 1, 144949c55878SDavid Wu .pin = 11, 145049c55878SDavid Wu .func = 2, 145149c55878SDavid Wu .route_offset = 0x50, 145249c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 145349c55878SDavid Wu }, { 145449c55878SDavid Wu /* gmac-m1-optimized_rxd3 */ 145549c55878SDavid Wu .bank_num = 1, 145649c55878SDavid Wu .pin = 14, 145749c55878SDavid Wu .func = 2, 145849c55878SDavid Wu .route_offset = 0x50, 145949c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(10), 146049c55878SDavid Wu }, { 146149c55878SDavid Wu /* pdm_sdi0m0 */ 146249c55878SDavid Wu .bank_num = 2, 146349c55878SDavid Wu .pin = 19, 146449c55878SDavid Wu .func = 2, 146549c55878SDavid Wu .route_offset = 0x50, 146649c55878SDavid Wu .route_val = BIT(16 + 3), 146749c55878SDavid Wu }, { 146849c55878SDavid Wu /* pdm_sdi0m1 */ 146949c55878SDavid Wu .bank_num = 1, 147049c55878SDavid Wu .pin = 23, 147149c55878SDavid Wu .func = 3, 147249c55878SDavid Wu .route_offset = 0x50, 147349c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 147449c55878SDavid Wu }, { 147549c55878SDavid Wu /* spi_rxdm2 */ 147649c55878SDavid Wu .bank_num = 3, 147749c55878SDavid Wu .pin = 2, 147849c55878SDavid Wu .func = 4, 147949c55878SDavid Wu .route_offset = 0x50, 148049c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5), 148149c55878SDavid Wu }, { 148249c55878SDavid Wu /* i2s2_sdim0 */ 148349c55878SDavid Wu .bank_num = 1, 148449c55878SDavid Wu .pin = 24, 148549c55878SDavid Wu .func = 1, 148649c55878SDavid Wu .route_offset = 0x50, 148749c55878SDavid Wu .route_val = BIT(16 + 6), 148849c55878SDavid Wu }, { 148949c55878SDavid Wu /* i2s2_sdim1 */ 149049c55878SDavid Wu .bank_num = 3, 149149c55878SDavid Wu .pin = 2, 149249c55878SDavid Wu .func = 6, 149349c55878SDavid Wu .route_offset = 0x50, 149449c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 149549c55878SDavid Wu }, { 149649c55878SDavid Wu /* card_iom1 */ 149749c55878SDavid Wu .bank_num = 2, 149849c55878SDavid Wu .pin = 22, 149949c55878SDavid Wu .func = 3, 150049c55878SDavid Wu .route_offset = 0x50, 150149c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 150249c55878SDavid Wu }, { 150349c55878SDavid Wu /* tsp_d5m1 */ 150449c55878SDavid Wu .bank_num = 2, 150549c55878SDavid Wu .pin = 16, 150649c55878SDavid Wu .func = 3, 150749c55878SDavid Wu .route_offset = 0x50, 150849c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 150949c55878SDavid Wu }, { 151049c55878SDavid Wu /* cif_data5m1 */ 151149c55878SDavid Wu .bank_num = 2, 151249c55878SDavid Wu .pin = 16, 151349c55878SDavid Wu .func = 4, 151449c55878SDavid Wu .route_offset = 0x50, 151549c55878SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 151649c55878SDavid Wu }, 151749c55878SDavid Wu }; 151849c55878SDavid Wu 151949c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = { 152049c55878SDavid Wu { 152149c55878SDavid Wu /* uart2dbga_rx */ 152249c55878SDavid Wu .bank_num = 4, 152349c55878SDavid Wu .pin = 8, 152449c55878SDavid Wu .func = 2, 152549c55878SDavid Wu .route_offset = 0xe21c, 152649c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 152749c55878SDavid Wu }, { 152849c55878SDavid Wu /* uart2dbgb_rx */ 152949c55878SDavid Wu .bank_num = 4, 153049c55878SDavid Wu .pin = 16, 153149c55878SDavid Wu .func = 2, 153249c55878SDavid Wu .route_offset = 0xe21c, 153349c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 153449c55878SDavid Wu }, { 153549c55878SDavid Wu /* uart2dbgc_rx */ 153649c55878SDavid Wu .bank_num = 4, 153749c55878SDavid Wu .pin = 19, 153849c55878SDavid Wu .func = 1, 153949c55878SDavid Wu .route_offset = 0xe21c, 154049c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 154149c55878SDavid Wu }, { 154249c55878SDavid Wu /* pcie_clkreqn */ 154349c55878SDavid Wu .bank_num = 2, 154449c55878SDavid Wu .pin = 26, 154549c55878SDavid Wu .func = 2, 154649c55878SDavid Wu .route_offset = 0xe21c, 154749c55878SDavid Wu .route_val = BIT(16 + 14), 154849c55878SDavid Wu }, { 154949c55878SDavid Wu /* pcie_clkreqnb */ 155049c55878SDavid Wu .bank_num = 4, 155149c55878SDavid Wu .pin = 24, 155249c55878SDavid Wu .func = 1, 155349c55878SDavid Wu .route_offset = 0xe21c, 155449c55878SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 155549c55878SDavid Wu }, 155649c55878SDavid Wu }; 155749c55878SDavid Wu 155849e04eddSJianqun Xu static enum rockchip_pin_route_type 155949e04eddSJianqun Xu rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, 156049c55878SDavid Wu int mux, u32 *reg, u32 *value) 156149c55878SDavid Wu { 156249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 156349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 156449c55878SDavid Wu struct rockchip_mux_route_data *data; 156549c55878SDavid Wu int i; 156649c55878SDavid Wu 156749c55878SDavid Wu for (i = 0; i < ctrl->niomux_routes; i++) { 156849c55878SDavid Wu data = &ctrl->iomux_routes[i]; 156949c55878SDavid Wu if ((data->bank_num == bank->bank_num) && 157049c55878SDavid Wu (data->pin == pin) && (data->func == mux)) 157149c55878SDavid Wu break; 157249c55878SDavid Wu } 157349c55878SDavid Wu 157449c55878SDavid Wu if (i >= ctrl->niomux_routes) 157549e04eddSJianqun Xu return ROUTE_TYPE_INVALID; 157649c55878SDavid Wu 157749c55878SDavid Wu *reg = data->route_offset; 157849c55878SDavid Wu *value = data->route_val; 157949c55878SDavid Wu 158049e04eddSJianqun Xu return data->route_type; 158149c55878SDavid Wu } 158249c55878SDavid Wu 158349c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) 158449c55878SDavid Wu { 158549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 158649c55878SDavid Wu int iomux_num = (pin / 8); 158749c55878SDavid Wu struct regmap *regmap; 158849c55878SDavid Wu unsigned int val; 158949c55878SDavid Wu int reg, ret, mask, mux_type; 159049c55878SDavid Wu u8 bit; 159149c55878SDavid Wu 159249c55878SDavid Wu if (iomux_num > 3) 159349c55878SDavid Wu return -EINVAL; 159449c55878SDavid Wu 159549c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 159649c55878SDavid Wu debug("pin %d is unrouted\n", pin); 159749c55878SDavid Wu return -EINVAL; 159849c55878SDavid Wu } 159949c55878SDavid Wu 160049c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 160149c55878SDavid Wu return RK_FUNC_GPIO; 160249c55878SDavid Wu 1603cf04a17bSJianqun Xu if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 1604cf04a17bSJianqun Xu regmap = priv->regmap_pmu; 1605cf04a17bSJianqun Xu else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) 1606cf04a17bSJianqun Xu regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base; 1607cf04a17bSJianqun Xu else 1608cf04a17bSJianqun Xu regmap = priv->regmap_base; 160949c55878SDavid Wu 161049c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 161149c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 161249c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 161349c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 161449c55878SDavid Wu if ((pin % 8) >= 4) 161549c55878SDavid Wu reg += 0x4; 161649c55878SDavid Wu bit = (pin % 4) * 4; 161749c55878SDavid Wu mask = 0xf; 161849c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 161949c55878SDavid Wu if ((pin % 8) >= 5) 162049c55878SDavid Wu reg += 0x4; 162149c55878SDavid Wu bit = (pin % 8 % 5) * 3; 162249c55878SDavid Wu mask = 0x7; 162349c55878SDavid Wu } else { 162449c55878SDavid Wu bit = (pin % 8) * 2; 162549c55878SDavid Wu mask = 0x3; 162649c55878SDavid Wu } 162749c55878SDavid Wu 162849c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 162949c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 163049c55878SDavid Wu 163149c55878SDavid Wu ret = regmap_read(regmap, reg, &val); 163249c55878SDavid Wu if (ret) 163349c55878SDavid Wu return ret; 163449c55878SDavid Wu 163549c55878SDavid Wu return ((val >> bit) & mask); 163649c55878SDavid Wu } 163749c55878SDavid Wu 163849c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, 163949c55878SDavid Wu int index) 164049c55878SDavid Wu { struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 164149c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 164249c55878SDavid Wu 164349c55878SDavid Wu return rockchip_get_mux(&ctrl->pin_banks[banknum], index); 164449c55878SDavid Wu } 164549c55878SDavid Wu 164649c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank, 164749c55878SDavid Wu int pin, int mux) 164849c55878SDavid Wu { 164949c55878SDavid Wu int iomux_num = (pin / 8); 165049c55878SDavid Wu 165149c55878SDavid Wu if (iomux_num > 3) 165249c55878SDavid Wu return -EINVAL; 165349c55878SDavid Wu 165449c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 165549c55878SDavid Wu debug("pin %d is unrouted\n", pin); 165649c55878SDavid Wu return -EINVAL; 165749c55878SDavid Wu } 165849c55878SDavid Wu 165949c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 166049c55878SDavid Wu if (mux != IOMUX_GPIO_ONLY) { 166149c55878SDavid Wu debug("pin %d only supports a gpio mux\n", pin); 166249c55878SDavid Wu return -ENOTSUPP; 166349c55878SDavid Wu } 166449c55878SDavid Wu } 166549c55878SDavid Wu 166649c55878SDavid Wu return 0; 166749c55878SDavid Wu } 166849c55878SDavid Wu 166949c55878SDavid Wu /* 167049c55878SDavid Wu * Set a new mux function for a pin. 167149c55878SDavid Wu * 167249c55878SDavid Wu * The register is divided into the upper and lower 16 bit. When changing 167349c55878SDavid Wu * a value, the previous register value is not read and changed. Instead 167449c55878SDavid Wu * it seems the changed bits are marked in the upper 16 bit, while the 167549c55878SDavid Wu * changed value gets set in the same offset in the lower 16 bit. 167649c55878SDavid Wu * All pin settings seem to be 2 bit wide in both the upper and lower 167749c55878SDavid Wu * parts. 167849c55878SDavid Wu * @bank: pin bank to change 167949c55878SDavid Wu * @pin: pin to change 168049c55878SDavid Wu * @mux: new mux function to set 168149c55878SDavid Wu */ 168249c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) 168349c55878SDavid Wu { 168449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 168549c55878SDavid Wu int iomux_num = (pin / 8); 168649c55878SDavid Wu struct regmap *regmap; 168749c55878SDavid Wu int reg, ret, mask, mux_type; 168849c55878SDavid Wu u8 bit; 168949e04eddSJianqun Xu u32 data; 169049c55878SDavid Wu 169149c55878SDavid Wu ret = rockchip_verify_mux(bank, pin, mux); 169249c55878SDavid Wu if (ret < 0) 169349c55878SDavid Wu return ret; 169449c55878SDavid Wu 169549c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 169649c55878SDavid Wu return 0; 169749c55878SDavid Wu 169849c55878SDavid Wu debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); 169949c55878SDavid Wu 1700cf04a17bSJianqun Xu if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 1701cf04a17bSJianqun Xu regmap = priv->regmap_pmu; 1702cf04a17bSJianqun Xu else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) 1703cf04a17bSJianqun Xu regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base; 1704cf04a17bSJianqun Xu else 1705cf04a17bSJianqun Xu regmap = priv->regmap_base; 170649c55878SDavid Wu 170749c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 170849c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 170949c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 171049c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 171149c55878SDavid Wu if ((pin % 8) >= 4) 171249c55878SDavid Wu reg += 0x4; 171349c55878SDavid Wu bit = (pin % 4) * 4; 171449c55878SDavid Wu mask = 0xf; 171549c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 171649c55878SDavid Wu if ((pin % 8) >= 5) 171749c55878SDavid Wu reg += 0x4; 171849c55878SDavid Wu bit = (pin % 8 % 5) * 3; 171949c55878SDavid Wu mask = 0x7; 172049c55878SDavid Wu } else { 172149c55878SDavid Wu bit = (pin % 8) * 2; 172249c55878SDavid Wu mask = 0x3; 172349c55878SDavid Wu } 172449c55878SDavid Wu 172549c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 172649c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 172749c55878SDavid Wu 172849c55878SDavid Wu if (bank->route_mask & BIT(pin)) { 172949e04eddSJianqun Xu u32 route_reg = 0, route_val = 0; 173049e04eddSJianqun Xu 173149e04eddSJianqun Xu ret = rockchip_get_mux_route(bank, pin, mux, 173249e04eddSJianqun Xu &route_reg, &route_val); 173349e04eddSJianqun Xu switch (ret) { 173449e04eddSJianqun Xu case ROUTE_TYPE_DEFAULT: 173549e04eddSJianqun Xu regmap_write(regmap, route_reg, route_val); 173649e04eddSJianqun Xu break; 173749e04eddSJianqun Xu case ROUTE_TYPE_TOPGRF: 173849e04eddSJianqun Xu regmap_write(priv->regmap_base, route_reg, route_val); 173949e04eddSJianqun Xu break; 174049e04eddSJianqun Xu case ROUTE_TYPE_PMUGRF: 174149e04eddSJianqun Xu regmap_write(priv->regmap_pmu, route_reg, route_val); 174249e04eddSJianqun Xu break; 174349e04eddSJianqun Xu case ROUTE_TYPE_INVALID: /* Fall through */ 174449e04eddSJianqun Xu default: 174549e04eddSJianqun Xu break; 174649c55878SDavid Wu } 174749c55878SDavid Wu } 174849c55878SDavid Wu 17494bafc2daSDavid Wu if (mux_type & IOMUX_WRITABLE_32BIT) { 17508bf1bc66SDavid Wu regmap_read(regmap, reg, &data); 17514bafc2daSDavid Wu data &= ~(mask << bit); 17524bafc2daSDavid Wu } else { 175349c55878SDavid Wu data = (mask << (bit + 16)); 17544bafc2daSDavid Wu } 17558bf1bc66SDavid Wu 175649c55878SDavid Wu data |= (mux & mask) << bit; 175749c55878SDavid Wu ret = regmap_write(regmap, reg, data); 175849c55878SDavid Wu 175949c55878SDavid Wu return ret; 176049c55878SDavid Wu } 176149c55878SDavid Wu 176249c55878SDavid Wu #define PX30_PULL_PMU_OFFSET 0x10 176349c55878SDavid Wu #define PX30_PULL_GRF_OFFSET 0x60 176449c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN 2 176549c55878SDavid Wu #define PX30_PULL_PINS_PER_REG 8 176649c55878SDavid Wu #define PX30_PULL_BANK_STRIDE 16 176749c55878SDavid Wu 176849c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 176949c55878SDavid Wu int pin_num, struct regmap **regmap, 177049c55878SDavid Wu int *reg, u8 *bit) 177149c55878SDavid Wu { 177249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 177349c55878SDavid Wu 177449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 177549c55878SDavid Wu if (bank->bank_num == 0) { 177649c55878SDavid Wu *regmap = priv->regmap_pmu; 177749c55878SDavid Wu *reg = PX30_PULL_PMU_OFFSET; 177849c55878SDavid Wu } else { 177949c55878SDavid Wu *regmap = priv->regmap_base; 178049c55878SDavid Wu *reg = PX30_PULL_GRF_OFFSET; 178149c55878SDavid Wu 178249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 178349c55878SDavid Wu *reg -= 0x10; 178449c55878SDavid Wu *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; 178549c55878SDavid Wu } 178649c55878SDavid Wu 178749c55878SDavid Wu *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4); 178849c55878SDavid Wu *bit = (pin_num % PX30_PULL_PINS_PER_REG); 178949c55878SDavid Wu *bit *= PX30_PULL_BITS_PER_PIN; 179049c55878SDavid Wu } 179149c55878SDavid Wu 179249c55878SDavid Wu #define PX30_DRV_PMU_OFFSET 0x20 179349c55878SDavid Wu #define PX30_DRV_GRF_OFFSET 0xf0 179449c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN 2 179549c55878SDavid Wu #define PX30_DRV_PINS_PER_REG 8 179649c55878SDavid Wu #define PX30_DRV_BANK_STRIDE 16 179749c55878SDavid Wu 179849c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 179949c55878SDavid Wu int pin_num, struct regmap **regmap, 180049c55878SDavid Wu int *reg, u8 *bit) 180149c55878SDavid Wu { 180249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 180349c55878SDavid Wu 180449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 180549c55878SDavid Wu if (bank->bank_num == 0) { 180649c55878SDavid Wu *regmap = priv->regmap_pmu; 180749c55878SDavid Wu *reg = PX30_DRV_PMU_OFFSET; 180849c55878SDavid Wu } else { 180949c55878SDavid Wu *regmap = priv->regmap_base; 181049c55878SDavid Wu *reg = PX30_DRV_GRF_OFFSET; 181149c55878SDavid Wu 181249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 181349c55878SDavid Wu *reg -= 0x10; 181449c55878SDavid Wu *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; 181549c55878SDavid Wu } 181649c55878SDavid Wu 181749c55878SDavid Wu *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4); 181849c55878SDavid Wu *bit = (pin_num % PX30_DRV_PINS_PER_REG); 181949c55878SDavid Wu *bit *= PX30_DRV_BITS_PER_PIN; 182049c55878SDavid Wu } 182149c55878SDavid Wu 182249c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET 0x38 182349c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET 0xc0 182449c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG 16 182549c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE 16 182649c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG 8 182749c55878SDavid Wu 182849c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 182949c55878SDavid Wu int pin_num, 183049c55878SDavid Wu struct regmap **regmap, 183149c55878SDavid Wu int *reg, u8 *bit) 183249c55878SDavid Wu { 183349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 183449c55878SDavid Wu int pins_per_reg; 183549c55878SDavid Wu 183649c55878SDavid Wu if (bank->bank_num == 0) { 183749c55878SDavid Wu *regmap = priv->regmap_pmu; 183849c55878SDavid Wu *reg = PX30_SCHMITT_PMU_OFFSET; 183949c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 184049c55878SDavid Wu } else { 184149c55878SDavid Wu *regmap = priv->regmap_base; 184249c55878SDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 184349c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 184449c55878SDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 184549c55878SDavid Wu } 184649c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 184749c55878SDavid Wu *bit = pin_num % pins_per_reg; 184849c55878SDavid Wu 184949c55878SDavid Wu return 0; 185049c55878SDavid Wu } 185149c55878SDavid Wu 185249c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET 0x10 185349c55878SDavid Wu #define RV1108_PULL_OFFSET 0x110 185449c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG 8 185549c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN 2 185649c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE 16 185749c55878SDavid Wu 185849c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 185949c55878SDavid Wu int pin_num, struct regmap **regmap, 186049c55878SDavid Wu int *reg, u8 *bit) 186149c55878SDavid Wu { 186249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 186349c55878SDavid Wu 186449c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 186549c55878SDavid Wu if (bank->bank_num == 0) { 186649c55878SDavid Wu *regmap = priv->regmap_pmu; 186749c55878SDavid Wu *reg = RV1108_PULL_PMU_OFFSET; 186849c55878SDavid Wu } else { 186949c55878SDavid Wu *reg = RV1108_PULL_OFFSET; 187049c55878SDavid Wu *regmap = priv->regmap_base; 187149c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 187249c55878SDavid Wu *reg -= 0x10; 187349c55878SDavid Wu *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE; 187449c55878SDavid Wu } 187549c55878SDavid Wu 187649c55878SDavid Wu *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4); 187749c55878SDavid Wu *bit = (pin_num % RV1108_PULL_PINS_PER_REG); 187849c55878SDavid Wu *bit *= RV1108_PULL_BITS_PER_PIN; 187949c55878SDavid Wu } 188049c55878SDavid Wu 188149c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET 0x20 188249c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET 0x210 188349c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN 2 188449c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG 8 188549c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE 16 188649c55878SDavid Wu 188749c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 188849c55878SDavid Wu int pin_num, struct regmap **regmap, 188949c55878SDavid Wu int *reg, u8 *bit) 189049c55878SDavid Wu { 189149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 189249c55878SDavid Wu 189349c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 189449c55878SDavid Wu if (bank->bank_num == 0) { 189549c55878SDavid Wu *regmap = priv->regmap_pmu; 189649c55878SDavid Wu *reg = RV1108_DRV_PMU_OFFSET; 189749c55878SDavid Wu } else { 189849c55878SDavid Wu *regmap = priv->regmap_base; 189949c55878SDavid Wu *reg = RV1108_DRV_GRF_OFFSET; 190049c55878SDavid Wu 190149c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 190249c55878SDavid Wu *reg -= 0x10; 190349c55878SDavid Wu *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE; 190449c55878SDavid Wu } 190549c55878SDavid Wu 190649c55878SDavid Wu *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4); 190749c55878SDavid Wu *bit = pin_num % RV1108_DRV_PINS_PER_REG; 190849c55878SDavid Wu *bit *= RV1108_DRV_BITS_PER_PIN; 190949c55878SDavid Wu } 191049c55878SDavid Wu 191149c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET 0x30 191249c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET 0x388 191349c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE 8 191449c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG 16 191549c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG 8 191649c55878SDavid Wu 191749c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 191849c55878SDavid Wu int pin_num, 191949c55878SDavid Wu struct regmap **regmap, 192049c55878SDavid Wu int *reg, u8 *bit) 192149c55878SDavid Wu { 192249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 192349c55878SDavid Wu int pins_per_reg; 192449c55878SDavid Wu 192549c55878SDavid Wu if (bank->bank_num == 0) { 192649c55878SDavid Wu *regmap = priv->regmap_pmu; 192749c55878SDavid Wu *reg = RV1108_SCHMITT_PMU_OFFSET; 192849c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG; 192949c55878SDavid Wu } else { 193049c55878SDavid Wu *regmap = priv->regmap_base; 193149c55878SDavid Wu *reg = RV1108_SCHMITT_GRF_OFFSET; 193249c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG; 193349c55878SDavid Wu *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE; 193449c55878SDavid Wu } 193549c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 193649c55878SDavid Wu *bit = pin_num % pins_per_reg; 193749c55878SDavid Wu 193849c55878SDavid Wu return 0; 193949c55878SDavid Wu } 194049c55878SDavid Wu 1941cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET 0x40 1942cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET 0x10108 1943cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG 8 1944cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN 2 1945cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE 16 1946cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */ 1947cf04a17bSJianqun Xu 1948cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1949cf04a17bSJianqun Xu int pin_num, struct regmap **regmap, 1950cf04a17bSJianqun Xu int *reg, u8 *bit) 1951cf04a17bSJianqun Xu { 1952cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1953cf04a17bSJianqun Xu 1954cf04a17bSJianqun Xu /* The first 24 pins of the first bank are located in PMU */ 1955cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1956cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1957cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1958cf04a17bSJianqun Xu *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 1959cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4); 1960cf04a17bSJianqun Xu *bit = pin_num % RV1126_PULL_PINS_PER_REG; 1961cf04a17bSJianqun Xu *bit *= RV1126_PULL_BITS_PER_PIN; 1962cf04a17bSJianqun Xu return; 1963cf04a17bSJianqun Xu } 1964cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 1965cf04a17bSJianqun Xu *reg = RV1126_PULL_PMU_OFFSET; 1966cf04a17bSJianqun Xu } else { 1967cf04a17bSJianqun Xu *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 1968cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1969d499d466SJianqun Xu *reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE; 1970cf04a17bSJianqun Xu } 1971cf04a17bSJianqun Xu 1972cf04a17bSJianqun Xu *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4); 1973cf04a17bSJianqun Xu *bit = (pin_num % RV1126_PULL_PINS_PER_REG); 1974cf04a17bSJianqun Xu *bit *= RV1126_PULL_BITS_PER_PIN; 1975cf04a17bSJianqun Xu } 1976cf04a17bSJianqun Xu 1977cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET 0x20 1978cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET 0x10090 1979cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN 4 1980cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG 4 1981cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE 32 1982cf04a17bSJianqun Xu 1983cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1984cf04a17bSJianqun Xu int pin_num, struct regmap **regmap, 1985cf04a17bSJianqun Xu int *reg, u8 *bit) 1986cf04a17bSJianqun Xu { 1987cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1988cf04a17bSJianqun Xu 1989cf04a17bSJianqun Xu /* The first 24 pins of the first bank are located in PMU */ 1990cf04a17bSJianqun Xu if (bank->bank_num == 0) { 1991cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 1992cf04a17bSJianqun Xu *regmap = priv->regmap_base; 1993cf04a17bSJianqun Xu *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 1994cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4); 1995d499d466SJianqun Xu *reg -= 0x4; 1996cf04a17bSJianqun Xu *bit = pin_num % RV1126_DRV_PINS_PER_REG; 1997cf04a17bSJianqun Xu *bit *= RV1126_DRV_BITS_PER_PIN; 1998cf04a17bSJianqun Xu return; 1999cf04a17bSJianqun Xu } 2000cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 2001cf04a17bSJianqun Xu *reg = RV1126_DRV_PMU_OFFSET; 2002cf04a17bSJianqun Xu } else { 2003cf04a17bSJianqun Xu *regmap = priv->regmap_base; 2004cf04a17bSJianqun Xu *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 2005d499d466SJianqun Xu *reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE; 2006cf04a17bSJianqun Xu } 2007cf04a17bSJianqun Xu 2008cf04a17bSJianqun Xu *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4); 2009cf04a17bSJianqun Xu *bit = pin_num % RV1126_DRV_PINS_PER_REG; 2010cf04a17bSJianqun Xu *bit *= RV1126_DRV_BITS_PER_PIN; 2011cf04a17bSJianqun Xu } 2012cf04a17bSJianqun Xu 2013cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET 0x60 2014cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET 0x10188 2015cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE 16 2016cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG 8 2017cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG 8 2018cf04a17bSJianqun Xu 2019cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2020cf04a17bSJianqun Xu int pin_num, 2021cf04a17bSJianqun Xu struct regmap **regmap, 2022cf04a17bSJianqun Xu int *reg, u8 *bit) 2023cf04a17bSJianqun Xu { 2024cf04a17bSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2025cf04a17bSJianqun Xu int pins_per_reg; 2026cf04a17bSJianqun Xu 2027cf04a17bSJianqun Xu if (bank->bank_num == 0) { 2028cf04a17bSJianqun Xu if (RV1126_GPIO_C4_D7(pin_num)) { 2029cf04a17bSJianqun Xu *regmap = priv->regmap_base; 2030cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 2031cf04a17bSJianqun Xu *reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4); 2032cf04a17bSJianqun Xu *bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG; 2033cf04a17bSJianqun Xu return 0; 2034cf04a17bSJianqun Xu } 2035cf04a17bSJianqun Xu *regmap = priv->regmap_pmu; 2036cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_PMU_OFFSET; 2037cf04a17bSJianqun Xu pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG; 2038cf04a17bSJianqun Xu } else { 2039cf04a17bSJianqun Xu *regmap = priv->regmap_base; 2040cf04a17bSJianqun Xu *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 2041cf04a17bSJianqun Xu pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG; 2042d499d466SJianqun Xu *reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE; 2043cf04a17bSJianqun Xu } 2044cf04a17bSJianqun Xu *reg += ((pin_num / pins_per_reg) * 4); 2045cf04a17bSJianqun Xu *bit = pin_num % pins_per_reg; 2046cf04a17bSJianqun Xu 2047cf04a17bSJianqun Xu return 0; 2048cf04a17bSJianqun Xu } 2049cf04a17bSJianqun Xu 2050a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET 0x10 2051a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET 0x80 2052a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG 8 2053a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN 2 2054a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE 16 2055a2a3fc8fSJianqun Xu 2056a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 2057a2a3fc8fSJianqun Xu int pin_num, 2058a2a3fc8fSJianqun Xu struct regmap **regmap, 2059a2a3fc8fSJianqun Xu int *reg, u8 *bit) 2060a2a3fc8fSJianqun Xu { 2061a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2062a2a3fc8fSJianqun Xu 2063a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 2064a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 2065a2a3fc8fSJianqun Xu *reg = RK1808_PULL_PMU_OFFSET; 2066a2a3fc8fSJianqun Xu } else { 2067a2a3fc8fSJianqun Xu *reg = RK1808_PULL_GRF_OFFSET; 2068a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 2069a2a3fc8fSJianqun Xu } 2070a2a3fc8fSJianqun Xu 2071a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4); 2072a2a3fc8fSJianqun Xu *bit = (pin_num % RK1808_PULL_PINS_PER_REG); 2073a2a3fc8fSJianqun Xu *bit *= RK1808_PULL_BITS_PER_PIN; 2074a2a3fc8fSJianqun Xu } 2075a2a3fc8fSJianqun Xu 2076a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET 0x20 2077a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET 0x140 2078a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN 2 2079a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG 8 2080a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE 16 2081a2a3fc8fSJianqun Xu 2082a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 2083a2a3fc8fSJianqun Xu int pin_num, 2084a2a3fc8fSJianqun Xu struct regmap **regmap, 2085a2a3fc8fSJianqun Xu int *reg, u8 *bit) 2086a2a3fc8fSJianqun Xu { 2087a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2088a2a3fc8fSJianqun Xu 2089a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 2090a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 2091a2a3fc8fSJianqun Xu *reg = RK1808_DRV_PMU_OFFSET; 2092a2a3fc8fSJianqun Xu } else { 2093a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 2094a2a3fc8fSJianqun Xu *reg = RK1808_DRV_GRF_OFFSET; 2095a2a3fc8fSJianqun Xu } 2096a2a3fc8fSJianqun Xu 2097a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4); 2098a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_DRV_PINS_PER_REG; 2099a2a3fc8fSJianqun Xu *bit *= RK1808_DRV_BITS_PER_PIN; 2100a2a3fc8fSJianqun Xu } 2101a2a3fc8fSJianqun Xu 2102a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET 0x0040 2103a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET 0x0100 2104a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE 16 2105a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG 8 2106a2a3fc8fSJianqun Xu 2107a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2108a2a3fc8fSJianqun Xu int pin_num, 2109a2a3fc8fSJianqun Xu struct regmap **regmap, 2110a2a3fc8fSJianqun Xu int *reg, u8 *bit) 2111a2a3fc8fSJianqun Xu { 2112a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2113a2a3fc8fSJianqun Xu 2114a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 2115a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 2116a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_PMU_OFFSET; 2117a2a3fc8fSJianqun Xu } else { 2118a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 2119a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_GRF_OFFSET; 2120a2a3fc8fSJianqun Xu *reg += (bank->bank_num - 1) * RK1808_SCHMITT_BANK_STRIDE; 2121a2a3fc8fSJianqun Xu } 2122a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4); 2123a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG; 2124a2a3fc8fSJianqun Xu 2125a2a3fc8fSJianqun Xu return 0; 2126a2a3fc8fSJianqun Xu } 2127a2a3fc8fSJianqun Xu 212849c55878SDavid Wu #define RK2928_PULL_OFFSET 0x118 212949c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG 16 213049c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE 8 213149c55878SDavid Wu 213249c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 213349c55878SDavid Wu int pin_num, struct regmap **regmap, 213449c55878SDavid Wu int *reg, u8 *bit) 213549c55878SDavid Wu { 213649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 213749c55878SDavid Wu 213849c55878SDavid Wu *regmap = priv->regmap_base; 213949c55878SDavid Wu *reg = RK2928_PULL_OFFSET; 214049c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 214149c55878SDavid Wu *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; 214249c55878SDavid Wu 214349c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 214449c55878SDavid Wu }; 214549c55878SDavid Wu 214649c55878SDavid Wu #define RK3128_PULL_OFFSET 0x118 214749c55878SDavid Wu 214849c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 214949c55878SDavid Wu int pin_num, struct regmap **regmap, 215049c55878SDavid Wu int *reg, u8 *bit) 215149c55878SDavid Wu { 215249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 215349c55878SDavid Wu 215449c55878SDavid Wu *regmap = priv->regmap_base; 215549c55878SDavid Wu *reg = RK3128_PULL_OFFSET; 215649c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 215749c55878SDavid Wu *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4); 215849c55878SDavid Wu 215949c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 216049c55878SDavid Wu } 216149c55878SDavid Wu 216249c55878SDavid Wu #define RK3188_PULL_OFFSET 0x164 216349c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN 2 216449c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG 8 216549c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE 16 216649c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET 0x64 216749c55878SDavid Wu 216849c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 216949c55878SDavid Wu int pin_num, struct regmap **regmap, 217049c55878SDavid Wu int *reg, u8 *bit) 217149c55878SDavid Wu { 217249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 217349c55878SDavid Wu 217449c55878SDavid Wu /* The first 12 pins of the first bank are located elsewhere */ 217549c55878SDavid Wu if (bank->bank_num == 0 && pin_num < 12) { 217649c55878SDavid Wu *regmap = priv->regmap_pmu; 217749c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 217849c55878SDavid Wu 217949c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 218049c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 218149c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 218249c55878SDavid Wu } else { 218349c55878SDavid Wu *regmap = priv->regmap_base; 218449c55878SDavid Wu *reg = RK3188_PULL_OFFSET; 218549c55878SDavid Wu 218649c55878SDavid Wu /* correct the offset, as it is the 2nd pull register */ 218749c55878SDavid Wu *reg -= 4; 218849c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 218949c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 219049c55878SDavid Wu 219149c55878SDavid Wu /* 219249c55878SDavid Wu * The bits in these registers have an inverse ordering 219349c55878SDavid Wu * with the lowest pin being in bits 15:14 and the highest 219449c55878SDavid Wu * pin in bits 1:0 219549c55878SDavid Wu */ 219649c55878SDavid Wu *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); 219749c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 219849c55878SDavid Wu } 219949c55878SDavid Wu } 220049c55878SDavid Wu 220149c55878SDavid Wu #define RK3288_PULL_OFFSET 0x140 220249c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 220349c55878SDavid Wu int pin_num, struct regmap **regmap, 220449c55878SDavid Wu int *reg, u8 *bit) 220549c55878SDavid Wu { 220649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 220749c55878SDavid Wu 220849c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 220949c55878SDavid Wu if (bank->bank_num == 0) { 221049c55878SDavid Wu *regmap = priv->regmap_pmu; 221149c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 221249c55878SDavid Wu 221349c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 221449c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 221549c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 221649c55878SDavid Wu } else { 221749c55878SDavid Wu *regmap = priv->regmap_base; 221849c55878SDavid Wu *reg = RK3288_PULL_OFFSET; 221949c55878SDavid Wu 222049c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 222149c55878SDavid Wu *reg -= 0x10; 222249c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 222349c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 222449c55878SDavid Wu 222549c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 222649c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 222749c55878SDavid Wu } 222849c55878SDavid Wu } 222949c55878SDavid Wu 223049c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET 0x70 223149c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET 0x1c0 223249c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN 2 223349c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG 8 223449c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE 16 223549c55878SDavid Wu 223649c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 223749c55878SDavid Wu int pin_num, struct regmap **regmap, 223849c55878SDavid Wu int *reg, u8 *bit) 223949c55878SDavid Wu { 224049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 224149c55878SDavid Wu 224249c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 224349c55878SDavid Wu if (bank->bank_num == 0) { 224449c55878SDavid Wu *regmap = priv->regmap_pmu; 224549c55878SDavid Wu *reg = RK3288_DRV_PMU_OFFSET; 224649c55878SDavid Wu 224749c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 224849c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 224949c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 225049c55878SDavid Wu } else { 225149c55878SDavid Wu *regmap = priv->regmap_base; 225249c55878SDavid Wu *reg = RK3288_DRV_GRF_OFFSET; 225349c55878SDavid Wu 225449c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 225549c55878SDavid Wu *reg -= 0x10; 225649c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 225749c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 225849c55878SDavid Wu 225949c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 226049c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 226149c55878SDavid Wu } 226249c55878SDavid Wu } 226349c55878SDavid Wu 226449c55878SDavid Wu #define RK3228_PULL_OFFSET 0x100 226549c55878SDavid Wu 226649c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 226749c55878SDavid Wu int pin_num, struct regmap **regmap, 226849c55878SDavid Wu int *reg, u8 *bit) 226949c55878SDavid Wu { 227049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 227149c55878SDavid Wu 227249c55878SDavid Wu *regmap = priv->regmap_base; 227349c55878SDavid Wu *reg = RK3228_PULL_OFFSET; 227449c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 227549c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 227649c55878SDavid Wu 227749c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 227849c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 227949c55878SDavid Wu } 228049c55878SDavid Wu 228149c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET 0x200 228249c55878SDavid Wu 228349c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 228449c55878SDavid Wu int pin_num, struct regmap **regmap, 228549c55878SDavid Wu int *reg, u8 *bit) 228649c55878SDavid Wu { 228749c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 228849c55878SDavid Wu 228949c55878SDavid Wu *regmap = priv->regmap_base; 229049c55878SDavid Wu *reg = RK3228_DRV_GRF_OFFSET; 229149c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 229249c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 229349c55878SDavid Wu 229449c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 229549c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 229649c55878SDavid Wu } 229749c55878SDavid Wu 2298b3077611SDavid Wu #define RK3308_PULL_OFFSET 0xa0 2299b3077611SDavid Wu 2300b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 2301b3077611SDavid Wu int pin_num, struct regmap **regmap, 2302b3077611SDavid Wu int *reg, u8 *bit) 2303b3077611SDavid Wu { 2304b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2305b3077611SDavid Wu 2306b3077611SDavid Wu *regmap = priv->regmap_base; 2307b3077611SDavid Wu *reg = RK3308_PULL_OFFSET; 2308b3077611SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 2309b3077611SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 2310b3077611SDavid Wu 2311b3077611SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 2312b3077611SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 2313b3077611SDavid Wu } 2314b3077611SDavid Wu 2315b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET 0x100 2316b3077611SDavid Wu 2317b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 2318b3077611SDavid Wu int pin_num, struct regmap **regmap, 2319b3077611SDavid Wu int *reg, u8 *bit) 2320b3077611SDavid Wu { 2321b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2322b3077611SDavid Wu 2323b3077611SDavid Wu *regmap = priv->regmap_base; 2324b3077611SDavid Wu *reg = RK3308_DRV_GRF_OFFSET; 2325b3077611SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 2326b3077611SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 2327b3077611SDavid Wu 2328b3077611SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 2329b3077611SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 2330b3077611SDavid Wu } 2331b3077611SDavid Wu 2332b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG 8 2333b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE 16 2334b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET 0x1a0 2335b3077611SDavid Wu 2336b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 2337b3077611SDavid Wu int pin_num, 2338b3077611SDavid Wu struct regmap **regmap, 2339b3077611SDavid Wu int *reg, u8 *bit) 2340b3077611SDavid Wu { 2341b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 2342b3077611SDavid Wu 2343b3077611SDavid Wu *regmap = priv->regmap_base; 2344b3077611SDavid Wu *reg = RK3308_SCHMITT_GRF_OFFSET; 2345b3077611SDavid Wu 2346b3077611SDavid Wu *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE; 2347b3077611SDavid Wu *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4); 2348b3077611SDavid Wu *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG; 2349b3077611SDavid Wu 2350b3077611SDavid Wu return 0; 2351b3077611SDavid Wu } 2352b3077611SDavid Wu 235349c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET 0x100 235449c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET 0x10 235549c55878SDavid Wu 235649c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 235749c55878SDavid Wu int pin_num, struct regmap **regmap, 235849c55878SDavid Wu int *reg, u8 *bit) 235949c55878SDavid Wu { 236049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 236149c55878SDavid Wu 236249c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 236349c55878SDavid Wu if (bank->bank_num == 0) { 236449c55878SDavid Wu *regmap = priv->regmap_pmu; 236549c55878SDavid Wu *reg = RK3368_PULL_PMU_OFFSET; 236649c55878SDavid Wu 236749c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 236849c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 236949c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 237049c55878SDavid Wu } else { 237149c55878SDavid Wu *regmap = priv->regmap_base; 237249c55878SDavid Wu *reg = RK3368_PULL_GRF_OFFSET; 237349c55878SDavid Wu 237449c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 237549c55878SDavid Wu *reg -= 0x10; 237649c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 237749c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 237849c55878SDavid Wu 237949c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 238049c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 238149c55878SDavid Wu } 238249c55878SDavid Wu } 238349c55878SDavid Wu 238449c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET 0x20 238549c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET 0x200 238649c55878SDavid Wu 238749c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 238849c55878SDavid Wu int pin_num, struct regmap **regmap, 238949c55878SDavid Wu int *reg, u8 *bit) 239049c55878SDavid Wu { 239149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 239249c55878SDavid Wu 239349c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 239449c55878SDavid Wu if (bank->bank_num == 0) { 239549c55878SDavid Wu *regmap = priv->regmap_pmu; 239649c55878SDavid Wu *reg = RK3368_DRV_PMU_OFFSET; 239749c55878SDavid Wu 239849c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 239949c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 240049c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 240149c55878SDavid Wu } else { 240249c55878SDavid Wu *regmap = priv->regmap_base; 240349c55878SDavid Wu *reg = RK3368_DRV_GRF_OFFSET; 240449c55878SDavid Wu 240549c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 240649c55878SDavid Wu *reg -= 0x10; 240749c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 240849c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 240949c55878SDavid Wu 241049c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 241149c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 241249c55878SDavid Wu } 241349c55878SDavid Wu } 241449c55878SDavid Wu 241549c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET 0xe040 241649c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET 0x40 241749c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN 3 241849c55878SDavid Wu 241949c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 242049c55878SDavid Wu int pin_num, struct regmap **regmap, 242149c55878SDavid Wu int *reg, u8 *bit) 242249c55878SDavid Wu { 242349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 242449c55878SDavid Wu 242549c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 242649c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) { 242749c55878SDavid Wu *regmap = priv->regmap_pmu; 242849c55878SDavid Wu *reg = RK3399_PULL_PMU_OFFSET; 242949c55878SDavid Wu 243049c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 243149c55878SDavid Wu 243249c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 243349c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 243449c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 243549c55878SDavid Wu } else { 243649c55878SDavid Wu *regmap = priv->regmap_base; 243749c55878SDavid Wu *reg = RK3399_PULL_GRF_OFFSET; 243849c55878SDavid Wu 243949c55878SDavid Wu /* correct the offset, as we're starting with the 3rd bank */ 244049c55878SDavid Wu *reg -= 0x20; 244149c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 244249c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 244349c55878SDavid Wu 244449c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 244549c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 244649c55878SDavid Wu } 244749c55878SDavid Wu } 244849c55878SDavid Wu 244949c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 245049c55878SDavid Wu int pin_num, struct regmap **regmap, 245149c55878SDavid Wu int *reg, u8 *bit) 245249c55878SDavid Wu { 245349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 245449c55878SDavid Wu int drv_num = (pin_num / 8); 245549c55878SDavid Wu 245649c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 245749c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) 245849c55878SDavid Wu *regmap = priv->regmap_pmu; 245949c55878SDavid Wu else 246049c55878SDavid Wu *regmap = priv->regmap_base; 246149c55878SDavid Wu 246249c55878SDavid Wu *reg = bank->drv[drv_num].offset; 246349c55878SDavid Wu if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 246449c55878SDavid Wu (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)) 246549c55878SDavid Wu *bit = (pin_num % 8) * 3; 246649c55878SDavid Wu else 246749c55878SDavid Wu *bit = (pin_num % 8) * 2; 246849c55878SDavid Wu } 246949c55878SDavid Wu 2470*c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_GRF_OFFSET 0x150 2471*c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_BANK_STRIDE 16 2472*c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_PINS_PER_GRF_REG 8 2473*c066e3f7SJianqun Xu 2474*c066e3f7SJianqun Xu static void rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, 2475*c066e3f7SJianqun Xu int pin_num, 2476*c066e3f7SJianqun Xu struct regmap **regmap, 2477*c066e3f7SJianqun Xu int *reg, u8 *bit) 2478*c066e3f7SJianqun Xu { 2479*c066e3f7SJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 2480*c066e3f7SJianqun Xu int pins_per_reg; 2481*c066e3f7SJianqun Xu 2482*c066e3f7SJianqun Xu *regmap = priv->regmap_base; 2483*c066e3f7SJianqun Xu *reg = RK3308_SLEW_RATE_GRF_OFFSET; 2484*c066e3f7SJianqun Xu *reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE; 2485*c066e3f7SJianqun Xu pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG; 2486*c066e3f7SJianqun Xu 2487*c066e3f7SJianqun Xu *reg += ((pin_num / pins_per_reg) * 4); 2488*c066e3f7SJianqun Xu *bit = pin_num % pins_per_reg; 2489*c066e3f7SJianqun Xu } 2490*c066e3f7SJianqun Xu 249149c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = { 249249c55878SDavid Wu { 2, 4, 8, 12, -1, -1, -1, -1 }, 249349c55878SDavid Wu { 3, 6, 9, 12, -1, -1, -1, -1 }, 249449c55878SDavid Wu { 5, 10, 15, 20, -1, -1, -1, -1 }, 249549c55878SDavid Wu { 4, 6, 8, 10, 12, 14, 16, 18 }, 2496*c066e3f7SJianqun Xu { 4, 7, 10, 13, 16, 19, 22, 26 }, 2497*c066e3f7SJianqun Xu { 0, 2, 4, 6, 6, 8, 10, 12 } 249849c55878SDavid Wu }; 249949c55878SDavid Wu 250049c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, 250149c55878SDavid Wu int pin_num, int strength) 250249c55878SDavid Wu { 250349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 250449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 250549c55878SDavid Wu struct regmap *regmap; 250649c55878SDavid Wu int reg, ret, i; 250749c55878SDavid Wu u32 data, rmask_bits, temp; 250849c55878SDavid Wu u8 bit; 25092c16899dSDavid.Wu /* Where need to clean the special mask for rockchip_perpin_drv_list */ 25102c16899dSDavid.Wu int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK); 251149c55878SDavid Wu 251249c55878SDavid Wu debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num, 251349c55878SDavid Wu pin_num, strength); 251449c55878SDavid Wu 251549c55878SDavid Wu ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 2516d499d466SJianqun Xu if (ctrl->type == RV1126) { 2517d499d466SJianqun Xu rmask_bits = RV1126_DRV_BITS_PER_PIN; 2518d499d466SJianqun Xu ret = strength; 2519d499d466SJianqun Xu goto config; 2520d499d466SJianqun Xu } 2521*c066e3f7SJianqun Xu if (soc_is_rk3308bs()) 2522*c066e3f7SJianqun Xu drv_type = DRV_TYPE_IO_SMIC; 252349c55878SDavid Wu 252449c55878SDavid Wu ret = -EINVAL; 252549c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { 252649c55878SDavid Wu if (rockchip_perpin_drv_list[drv_type][i] == strength) { 252749c55878SDavid Wu ret = i; 252849c55878SDavid Wu break; 252949c55878SDavid Wu } else if (rockchip_perpin_drv_list[drv_type][i] < 0) { 253049c55878SDavid Wu ret = rockchip_perpin_drv_list[drv_type][i]; 253149c55878SDavid Wu break; 253249c55878SDavid Wu } 253349c55878SDavid Wu } 253449c55878SDavid Wu 253549c55878SDavid Wu if (ret < 0) { 253649c55878SDavid Wu debug("unsupported driver strength %d\n", strength); 253749c55878SDavid Wu return ret; 253849c55878SDavid Wu } 253949c55878SDavid Wu 254049c55878SDavid Wu switch (drv_type) { 2541*c066e3f7SJianqun Xu case DRV_TYPE_IO_SMIC: 2542*c066e3f7SJianqun Xu if (ctrl->type == RK3308) { /* RK3308B-S */ 2543*c066e3f7SJianqun Xu int regval = ret; 2544*c066e3f7SJianqun Xu 2545*c066e3f7SJianqun Xu data = 0x3 << (bit + 16); 2546*c066e3f7SJianqun Xu data |= ((regval & 0x3) << bit); 2547*c066e3f7SJianqun Xu 2548*c066e3f7SJianqun Xu ret = regmap_write(regmap, reg, data); 2549*c066e3f7SJianqun Xu if (ret < 0) 2550*c066e3f7SJianqun Xu return ret; 2551*c066e3f7SJianqun Xu 2552*c066e3f7SJianqun Xu rk3308_calc_slew_rate_reg_and_bit(bank, pin_num, ®map, ®, &bit); 2553*c066e3f7SJianqun Xu data = BIT(bit + 16) | (((regval > 3) ? 1 : 0) << bit); 2554*c066e3f7SJianqun Xu 2555*c066e3f7SJianqun Xu return regmap_write(regmap, reg, data); 2556*c066e3f7SJianqun Xu } 2557*c066e3f7SJianqun Xu 2558*c066e3f7SJianqun Xu dev_err(info->dev, "unsupported type DRV_TYPE_IO_SMIC\n"); 2559*c066e3f7SJianqun Xu return -EINVAL; 256049c55878SDavid Wu case DRV_TYPE_IO_1V8_3V0_AUTO: 256149c55878SDavid Wu case DRV_TYPE_IO_3V3_ONLY: 256249c55878SDavid Wu rmask_bits = RK3399_DRV_3BITS_PER_PIN; 256349c55878SDavid Wu switch (bit) { 256449c55878SDavid Wu case 0 ... 12: 256549c55878SDavid Wu /* regular case, nothing to do */ 256649c55878SDavid Wu break; 256749c55878SDavid Wu case 15: 256849c55878SDavid Wu /* 256949c55878SDavid Wu * drive-strength offset is special, as it is spread 257049c55878SDavid Wu * over 2 registers, the bit data[15] contains bit 0 257149c55878SDavid Wu * of the value while temp[1:0] contains bits 2 and 1 257249c55878SDavid Wu */ 257349c55878SDavid Wu data = (ret & 0x1) << 15; 257449c55878SDavid Wu temp = (ret >> 0x1) & 0x3; 257549c55878SDavid Wu 257649c55878SDavid Wu data |= BIT(31); 257749c55878SDavid Wu ret = regmap_write(regmap, reg, data); 257849c55878SDavid Wu if (ret) 257949c55878SDavid Wu return ret; 258049c55878SDavid Wu 258149c55878SDavid Wu temp |= (0x3 << 16); 258249c55878SDavid Wu reg += 0x4; 258349c55878SDavid Wu ret = regmap_write(regmap, reg, temp); 258449c55878SDavid Wu 258549c55878SDavid Wu return ret; 258649c55878SDavid Wu case 18 ... 21: 258749c55878SDavid Wu /* setting fully enclosed in the second register */ 258849c55878SDavid Wu reg += 4; 258949c55878SDavid Wu bit -= 16; 259049c55878SDavid Wu break; 259149c55878SDavid Wu default: 259249c55878SDavid Wu debug("unsupported bit: %d for pinctrl drive type: %d\n", 259349c55878SDavid Wu bit, drv_type); 259449c55878SDavid Wu return -EINVAL; 259549c55878SDavid Wu } 259649c55878SDavid Wu break; 259749c55878SDavid Wu case DRV_TYPE_IO_DEFAULT: 259849c55878SDavid Wu case DRV_TYPE_IO_1V8_OR_3V0: 259949c55878SDavid Wu case DRV_TYPE_IO_1V8_ONLY: 260049c55878SDavid Wu rmask_bits = RK3288_DRV_BITS_PER_PIN; 260149c55878SDavid Wu break; 260249c55878SDavid Wu default: 260349c55878SDavid Wu debug("unsupported pinctrl drive type: %d\n", 260449c55878SDavid Wu drv_type); 260549c55878SDavid Wu return -EINVAL; 260649c55878SDavid Wu } 260749c55878SDavid Wu 2608d499d466SJianqun Xu config: 260955a89bc6SDavid Wu if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) { 261055a89bc6SDavid Wu regmap_read(regmap, reg, &data); 261155a89bc6SDavid Wu data &= ~(((1 << rmask_bits) - 1) << bit); 261255a89bc6SDavid Wu } else { 261349c55878SDavid Wu /* enable the write to the equivalent lower bits */ 261449c55878SDavid Wu data = ((1 << rmask_bits) - 1) << (bit + 16); 261555a89bc6SDavid Wu } 261649c55878SDavid Wu 261755a89bc6SDavid Wu data |= (ret << bit); 261849c55878SDavid Wu ret = regmap_write(regmap, reg, data); 261949c55878SDavid Wu return ret; 262049c55878SDavid Wu } 262149c55878SDavid Wu 262249c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = { 262349c55878SDavid Wu { 262449c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 262549c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP, 262649c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 262749c55878SDavid Wu PIN_CONFIG_BIAS_BUS_HOLD 262849c55878SDavid Wu }, 262949c55878SDavid Wu { 263049c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 263149c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 263249c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 263349c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP 263449c55878SDavid Wu }, 263549c55878SDavid Wu }; 263649c55878SDavid Wu 263749c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank, 263849c55878SDavid Wu int pin_num, int pull) 263949c55878SDavid Wu { 264049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 264149c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 264249c55878SDavid Wu struct regmap *regmap; 264349c55878SDavid Wu int reg, ret, i, pull_type; 264449c55878SDavid Wu u8 bit; 264549c55878SDavid Wu u32 data; 264649c55878SDavid Wu 264749c55878SDavid Wu debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num, 264849c55878SDavid Wu pin_num, pull); 264949c55878SDavid Wu 265049c55878SDavid Wu /* rk3066b does support any pulls */ 265149c55878SDavid Wu if (ctrl->type == RK3066B) 265249c55878SDavid Wu return pull ? -EINVAL : 0; 265349c55878SDavid Wu 265449c55878SDavid Wu ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 265549c55878SDavid Wu 265649c55878SDavid Wu switch (ctrl->type) { 265749c55878SDavid Wu case RK2928: 265849c55878SDavid Wu case RK3128: 265949c55878SDavid Wu data = BIT(bit + 16); 266049c55878SDavid Wu if (pull == PIN_CONFIG_BIAS_DISABLE) 266149c55878SDavid Wu data |= BIT(bit); 266249c55878SDavid Wu ret = regmap_write(regmap, reg, data); 266349c55878SDavid Wu break; 266449c55878SDavid Wu case PX30: 266549c55878SDavid Wu case RV1108: 2666cf04a17bSJianqun Xu case RV1126: 2667a2a3fc8fSJianqun Xu case RK1808: 266849c55878SDavid Wu case RK3188: 266949c55878SDavid Wu case RK3288: 2670b3077611SDavid Wu case RK3308: 267149c55878SDavid Wu case RK3368: 267249c55878SDavid Wu case RK3399: 26732c16899dSDavid.Wu /* 26742c16899dSDavid.Wu * Where need to clean the special mask for 26752c16899dSDavid.Wu * rockchip_pull_list. 26762c16899dSDavid.Wu */ 26772c16899dSDavid.Wu pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK); 267849c55878SDavid Wu ret = -EINVAL; 267949c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); 268049c55878SDavid Wu i++) { 268149c55878SDavid Wu if (rockchip_pull_list[pull_type][i] == pull) { 268249c55878SDavid Wu ret = i; 268349c55878SDavid Wu break; 268449c55878SDavid Wu } 268549c55878SDavid Wu } 268649c55878SDavid Wu 268749c55878SDavid Wu if (ret < 0) { 268849c55878SDavid Wu debug("unsupported pull setting %d\n", pull); 268949c55878SDavid Wu return ret; 269049c55878SDavid Wu } 269149c55878SDavid Wu 269255a89bc6SDavid Wu if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) { 269355a89bc6SDavid Wu regmap_read(regmap, reg, &data); 269455a89bc6SDavid Wu data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit); 269555a89bc6SDavid Wu } else { 269649c55878SDavid Wu /* enable the write to the equivalent lower bits */ 269749c55878SDavid Wu data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); 269855a89bc6SDavid Wu } 269949c55878SDavid Wu 270055a89bc6SDavid Wu data |= (ret << bit); 270149c55878SDavid Wu ret = regmap_write(regmap, reg, data); 270249c55878SDavid Wu break; 270349c55878SDavid Wu default: 270449c55878SDavid Wu debug("unsupported pinctrl type\n"); 270549c55878SDavid Wu return -EINVAL; 270649c55878SDavid Wu } 270749c55878SDavid Wu 270849c55878SDavid Wu return ret; 270949c55878SDavid Wu } 271049c55878SDavid Wu 271149c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN 1 271249c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG 16 271349c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE 8 271449c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET 0x380 271549c55878SDavid Wu 271649c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 271749c55878SDavid Wu int pin_num, 271849c55878SDavid Wu struct regmap **regmap, 271949c55878SDavid Wu int *reg, u8 *bit) 272049c55878SDavid Wu { 272149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 272249c55878SDavid Wu 272349c55878SDavid Wu *regmap = priv->regmap_base; 272449c55878SDavid Wu *reg = RK3328_SCHMITT_GRF_OFFSET; 272549c55878SDavid Wu 272649c55878SDavid Wu *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE; 272749c55878SDavid Wu *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4); 272849c55878SDavid Wu *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG; 272949c55878SDavid Wu 273049c55878SDavid Wu return 0; 273149c55878SDavid Wu } 273249c55878SDavid Wu 273349c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, 273449c55878SDavid Wu int pin_num, int enable) 273549c55878SDavid Wu { 273649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 273749c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 273849c55878SDavid Wu struct regmap *regmap; 273949c55878SDavid Wu int reg, ret; 274049c55878SDavid Wu u8 bit; 274149c55878SDavid Wu u32 data; 274249c55878SDavid Wu 274349c55878SDavid Wu debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num, 274449c55878SDavid Wu pin_num, enable); 274549c55878SDavid Wu 274649c55878SDavid Wu ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 274749c55878SDavid Wu if (ret) 274849c55878SDavid Wu return ret; 274949c55878SDavid Wu 275049c55878SDavid Wu /* enable the write to the equivalent lower bits */ 275149c55878SDavid Wu data = BIT(bit + 16) | (enable << bit); 275249c55878SDavid Wu 275349c55878SDavid Wu return regmap_write(regmap, reg, data); 275449c55878SDavid Wu } 275549c55878SDavid Wu 275632c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET 0x30 275732c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET 0x90 275832c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG 16 275932c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE 16 276032c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG 8 276132c25d1fSDavid Wu 276232c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, 276332c25d1fSDavid Wu int pin_num, 276432c25d1fSDavid Wu struct regmap **regmap, 276532c25d1fSDavid Wu int *reg, u8 *bit) 276632c25d1fSDavid Wu { 276732c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 276832c25d1fSDavid Wu int pins_per_reg; 276932c25d1fSDavid Wu 277032c25d1fSDavid Wu if (bank->bank_num == 0) { 277132c25d1fSDavid Wu *regmap = priv->regmap_pmu; 277232c25d1fSDavid Wu *reg = PX30_SLEW_RATE_PMU_OFFSET; 277332c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 277432c25d1fSDavid Wu } else { 277532c25d1fSDavid Wu *regmap = priv->regmap_base; 277632c25d1fSDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 277732c25d1fSDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 277832c25d1fSDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 277932c25d1fSDavid Wu } 278032c25d1fSDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 278132c25d1fSDavid Wu *bit = pin_num % pins_per_reg; 278232c25d1fSDavid Wu 278332c25d1fSDavid Wu return 0; 278432c25d1fSDavid Wu } 278532c25d1fSDavid Wu 278632c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank, 278732c25d1fSDavid Wu int pin_num, int speed) 278832c25d1fSDavid Wu { 278932c25d1fSDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 279032c25d1fSDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 279132c25d1fSDavid Wu struct regmap *regmap; 279232c25d1fSDavid Wu int reg, ret; 279332c25d1fSDavid Wu u8 bit; 279432c25d1fSDavid Wu u32 data; 279532c25d1fSDavid Wu 279632c25d1fSDavid Wu debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num, 279732c25d1fSDavid Wu pin_num, speed); 279832c25d1fSDavid Wu 279932c25d1fSDavid Wu ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit); 280032c25d1fSDavid Wu if (ret) 280132c25d1fSDavid Wu return ret; 280232c25d1fSDavid Wu 280332c25d1fSDavid Wu /* enable the write to the equivalent lower bits */ 280432c25d1fSDavid Wu data = BIT(bit + 16) | (speed << bit); 280532c25d1fSDavid Wu 280632c25d1fSDavid Wu return regmap_write(regmap, reg, data); 280732c25d1fSDavid Wu } 280832c25d1fSDavid Wu 280949c55878SDavid Wu /* 281049c55878SDavid Wu * Pinconf_ops handling 281149c55878SDavid Wu */ 281249c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, 281349c55878SDavid Wu unsigned int pull) 281449c55878SDavid Wu { 281549c55878SDavid Wu switch (ctrl->type) { 281649c55878SDavid Wu case RK2928: 281749c55878SDavid Wu case RK3128: 281849c55878SDavid Wu return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || 281949c55878SDavid Wu pull == PIN_CONFIG_BIAS_DISABLE); 282049c55878SDavid Wu case RK3066B: 282149c55878SDavid Wu return pull ? false : true; 282249c55878SDavid Wu case PX30: 282349c55878SDavid Wu case RV1108: 2824cf04a17bSJianqun Xu case RV1126: 2825a2a3fc8fSJianqun Xu case RK1808: 282649c55878SDavid Wu case RK3188: 282749c55878SDavid Wu case RK3288: 2828b3077611SDavid Wu case RK3308: 282949c55878SDavid Wu case RK3368: 283049c55878SDavid Wu case RK3399: 283149c55878SDavid Wu return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 283249c55878SDavid Wu } 283349c55878SDavid Wu 283449c55878SDavid Wu return false; 283549c55878SDavid Wu } 283649c55878SDavid Wu 283749c55878SDavid Wu /* set the pin config settings for a specified pin */ 283849c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank, 283949c55878SDavid Wu u32 pin, u32 param, u32 arg) 284049c55878SDavid Wu { 284149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 284249c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 284349c55878SDavid Wu int rc; 284449c55878SDavid Wu 284549c55878SDavid Wu switch (param) { 284649c55878SDavid Wu case PIN_CONFIG_BIAS_DISABLE: 284749c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 284849c55878SDavid Wu if (rc) 284949c55878SDavid Wu return rc; 285049c55878SDavid Wu break; 285149c55878SDavid Wu 285249c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_UP: 285349c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_DOWN: 285449c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 285549c55878SDavid Wu case PIN_CONFIG_BIAS_BUS_HOLD: 285649c55878SDavid Wu if (!rockchip_pinconf_pull_valid(ctrl, param)) 285749c55878SDavid Wu return -ENOTSUPP; 285849c55878SDavid Wu 285949c55878SDavid Wu if (!arg) 286049c55878SDavid Wu return -EINVAL; 286149c55878SDavid Wu 286249c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 286349c55878SDavid Wu if (rc) 286449c55878SDavid Wu return rc; 286549c55878SDavid Wu break; 286649c55878SDavid Wu 286749c55878SDavid Wu case PIN_CONFIG_DRIVE_STRENGTH: 286849c55878SDavid Wu if (!ctrl->drv_calc_reg) 286949c55878SDavid Wu return -ENOTSUPP; 287049c55878SDavid Wu 287149c55878SDavid Wu rc = rockchip_set_drive_perpin(bank, pin, arg); 287249c55878SDavid Wu if (rc < 0) 287349c55878SDavid Wu return rc; 287449c55878SDavid Wu break; 287549c55878SDavid Wu 287649c55878SDavid Wu case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 287749c55878SDavid Wu if (!ctrl->schmitt_calc_reg) 287849c55878SDavid Wu return -ENOTSUPP; 287949c55878SDavid Wu 288049c55878SDavid Wu rc = rockchip_set_schmitt(bank, pin, arg); 288149c55878SDavid Wu if (rc < 0) 288249c55878SDavid Wu return rc; 288349c55878SDavid Wu break; 288449c55878SDavid Wu 288532c25d1fSDavid Wu case PIN_CONFIG_SLEW_RATE: 288632c25d1fSDavid Wu if (!ctrl->slew_rate_calc_reg) 288732c25d1fSDavid Wu return -ENOTSUPP; 288832c25d1fSDavid Wu 288932c25d1fSDavid Wu rc = rockchip_set_slew_rate(bank, 289032c25d1fSDavid Wu pin - bank->pin_base, arg); 289132c25d1fSDavid Wu if (rc < 0) 289232c25d1fSDavid Wu return rc; 289332c25d1fSDavid Wu break; 289432c25d1fSDavid Wu 289549c55878SDavid Wu default: 289649c55878SDavid Wu break; 289749c55878SDavid Wu } 289849c55878SDavid Wu 289949c55878SDavid Wu return 0; 290049c55878SDavid Wu } 290149c55878SDavid Wu 290249c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = { 290349c55878SDavid Wu { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, 290449c55878SDavid Wu { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 }, 290549c55878SDavid Wu { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 }, 290649c55878SDavid Wu { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 }, 290749c55878SDavid Wu { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 }, 290849c55878SDavid Wu { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 }, 290949c55878SDavid Wu { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 }, 291049c55878SDavid Wu { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 }, 291149c55878SDavid Wu { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 }, 291232c25d1fSDavid Wu { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 }, 291349c55878SDavid Wu }; 291449c55878SDavid Wu 291549c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property, 291649c55878SDavid Wu u32 *default_value) 291749c55878SDavid Wu { 291849c55878SDavid Wu const struct pinconf_param *p, *end; 291949c55878SDavid Wu 292049c55878SDavid Wu p = rockchip_conf_params; 292149c55878SDavid Wu end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param); 292249c55878SDavid Wu 292349c55878SDavid Wu /* See if this pctldev supports this parameter */ 292449c55878SDavid Wu for (; p < end; p++) { 292549c55878SDavid Wu if (!strcmp(property, p->property)) { 292649c55878SDavid Wu *default_value = p->default_value; 292749c55878SDavid Wu return p->param; 292849c55878SDavid Wu } 292949c55878SDavid Wu } 293049c55878SDavid Wu 293149c55878SDavid Wu *default_value = 0; 293249c55878SDavid Wu return -EPERM; 293349c55878SDavid Wu } 293449c55878SDavid Wu 293549c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev, 293649c55878SDavid Wu struct udevice *config) 293749c55878SDavid Wu { 293849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 293949c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 294049c55878SDavid Wu u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4]; 294149c55878SDavid Wu u32 bank, pin, mux, conf, arg, default_val; 294249c55878SDavid Wu int ret, count, i; 294349c55878SDavid Wu const char *prop_name; 294449c55878SDavid Wu const void *value; 29452208cfa9SKever Yang int prop_len, param; 29462208cfa9SKever Yang const u32 *data; 29472208cfa9SKever Yang ofnode node; 2948d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 29492208cfa9SKever Yang const struct device_node *np; 29502208cfa9SKever Yang struct property *pp; 29512208cfa9SKever Yang #else 29522208cfa9SKever Yang int property_offset, pcfg_node; 29532208cfa9SKever Yang const void *blob = gd->fdt_blob; 29542208cfa9SKever Yang #endif 29552208cfa9SKever Yang data = dev_read_prop(config, "rockchip,pins", &count); 295649c55878SDavid Wu if (count < 0) { 295787f0ac57SDavid Wu debug("%s: bad array size %d\n", __func__, count); 295849c55878SDavid Wu return -EINVAL; 295949c55878SDavid Wu } 296049c55878SDavid Wu 296187f0ac57SDavid Wu count /= sizeof(u32); 296249c55878SDavid Wu if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) { 296349c55878SDavid Wu debug("%s: unsupported pins array count %d\n", 296449c55878SDavid Wu __func__, count); 296549c55878SDavid Wu return -EINVAL; 296649c55878SDavid Wu } 296749c55878SDavid Wu 296887f0ac57SDavid Wu for (i = 0; i < count; i++) 296987f0ac57SDavid Wu cells[i] = fdt32_to_cpu(data[i]); 297087f0ac57SDavid Wu 297149c55878SDavid Wu for (i = 0; i < (count >> 2); i++) { 297249c55878SDavid Wu bank = cells[4 * i + 0]; 297349c55878SDavid Wu pin = cells[4 * i + 1]; 297449c55878SDavid Wu mux = cells[4 * i + 2]; 297549c55878SDavid Wu conf = cells[4 * i + 3]; 297649c55878SDavid Wu 297749c55878SDavid Wu ret = rockchip_verify_config(dev, bank, pin); 297849c55878SDavid Wu if (ret) 297949c55878SDavid Wu return ret; 298049c55878SDavid Wu 298149c55878SDavid Wu ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux); 298249c55878SDavid Wu if (ret) 298349c55878SDavid Wu return ret; 298449c55878SDavid Wu 29852208cfa9SKever Yang node = ofnode_get_by_phandle(conf); 29862208cfa9SKever Yang if (!ofnode_valid(node)) 298749c55878SDavid Wu return -ENODEV; 2988d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD) 29892208cfa9SKever Yang np = ofnode_to_np(node); 29902208cfa9SKever Yang for (pp = np->properties; pp; pp = pp->next) { 29912208cfa9SKever Yang prop_name = pp->name; 29922208cfa9SKever Yang prop_len = pp->length; 29932208cfa9SKever Yang value = pp->value; 29942208cfa9SKever Yang #else 29952208cfa9SKever Yang pcfg_node = ofnode_to_offset(node); 299649c55878SDavid Wu fdt_for_each_property_offset(property_offset, blob, pcfg_node) { 299749c55878SDavid Wu value = fdt_getprop_by_offset(blob, property_offset, 299849c55878SDavid Wu &prop_name, &prop_len); 299949c55878SDavid Wu if (!value) 300049c55878SDavid Wu return -ENOENT; 30012208cfa9SKever Yang #endif 300249c55878SDavid Wu param = rockchip_pinconf_prop_name_to_param(prop_name, 300349c55878SDavid Wu &default_val); 300449c55878SDavid Wu if (param < 0) 300549c55878SDavid Wu break; 300649c55878SDavid Wu 300749c55878SDavid Wu if (prop_len >= sizeof(fdt32_t)) 300849c55878SDavid Wu arg = fdt32_to_cpu(*(fdt32_t *)value); 300949c55878SDavid Wu else 301049c55878SDavid Wu arg = default_val; 301149c55878SDavid Wu 301249c55878SDavid Wu ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin, 301349c55878SDavid Wu param, arg); 301449c55878SDavid Wu if (ret) { 301549c55878SDavid Wu debug("%s: rockchip_pinconf_set fail: %d\n", 301649c55878SDavid Wu __func__, ret); 301749c55878SDavid Wu return ret; 301849c55878SDavid Wu } 301949c55878SDavid Wu } 302049c55878SDavid Wu } 302149c55878SDavid Wu 302249c55878SDavid Wu return 0; 302349c55878SDavid Wu } 302449c55878SDavid Wu 302509989a56SJianqun Xu static int rockchip_pinctrl_get_pins_count(struct udevice *dev) 302609989a56SJianqun Xu { 302709989a56SJianqun Xu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 302809989a56SJianqun Xu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 302909989a56SJianqun Xu 303009989a56SJianqun Xu return ctrl->nr_pins; 303109989a56SJianqun Xu } 303209989a56SJianqun Xu 303349c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = { 303409989a56SJianqun Xu .get_pins_count = rockchip_pinctrl_get_pins_count, 303549c55878SDavid Wu .set_state = rockchip_pinctrl_set_state, 303649c55878SDavid Wu .get_gpio_mux = rockchip_pinctrl_get_gpio_mux, 303749c55878SDavid Wu }; 303849c55878SDavid Wu 303913c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl; 3040d5517017SDavid Wu 304149c55878SDavid Wu /* retrieve the soc specific data */ 304213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl * 304313c03cb6SJianqun Xu rockchip_pinctrl_get_soc_data(struct udevice *dev) 304449c55878SDavid Wu { 304549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 304613c03cb6SJianqun Xu const struct rockchip_pin_ctrl *ctrl = 304713c03cb6SJianqun Xu (const struct rockchip_pin_ctrl *)dev_get_driver_data(dev); 304849c55878SDavid Wu struct rockchip_pin_bank *bank; 304949c55878SDavid Wu int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; 305013c03cb6SJianqun Xu u32 nr_pins; 305113c03cb6SJianqun Xu 3052*c066e3f7SJianqun Xu if (soc_is_rk3308b() || soc_is_rk3308bs()) 305313c03cb6SJianqun Xu ctrl = &rk3308b_pin_ctrl; 305449c55878SDavid Wu 305549c55878SDavid Wu grf_offs = ctrl->grf_mux_offset; 305649c55878SDavid Wu pmu_offs = ctrl->pmu_mux_offset; 305749c55878SDavid Wu drv_pmu_offs = ctrl->pmu_drv_offset; 305849c55878SDavid Wu drv_grf_offs = ctrl->grf_drv_offset; 305949c55878SDavid Wu bank = ctrl->pin_banks; 306049c55878SDavid Wu 3061d5517017SDavid Wu /* Ctrl data re-initialize for some Socs */ 3062d5517017SDavid Wu if (ctrl->ctrl_data_re_init) { 3063d5517017SDavid Wu if (ctrl->ctrl_data_re_init(ctrl)) 3064d5517017SDavid Wu return NULL; 3065d5517017SDavid Wu } 3066d5517017SDavid Wu 306713c03cb6SJianqun Xu nr_pins = 0; 306849c55878SDavid Wu for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { 306949c55878SDavid Wu int bank_pins = 0; 307049c55878SDavid Wu 307149c55878SDavid Wu bank->priv = priv; 307213c03cb6SJianqun Xu bank->pin_base = nr_pins; 307313c03cb6SJianqun Xu nr_pins += bank->nr_pins; 307449c55878SDavid Wu 307549c55878SDavid Wu /* calculate iomux and drv offsets */ 307649c55878SDavid Wu for (j = 0; j < 4; j++) { 307749c55878SDavid Wu struct rockchip_iomux *iom = &bank->iomux[j]; 307849c55878SDavid Wu struct rockchip_drv *drv = &bank->drv[j]; 307949c55878SDavid Wu int inc; 308049c55878SDavid Wu 308149c55878SDavid Wu if (bank_pins >= bank->nr_pins) 308249c55878SDavid Wu break; 308349c55878SDavid Wu 308449c55878SDavid Wu /* preset iomux offset value, set new start value */ 308549c55878SDavid Wu if (iom->offset >= 0) { 3086d499d466SJianqun Xu if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) 308749c55878SDavid Wu pmu_offs = iom->offset; 308849c55878SDavid Wu else 308949c55878SDavid Wu grf_offs = iom->offset; 309049c55878SDavid Wu } else { /* set current iomux offset */ 3091d499d466SJianqun Xu iom->offset = ((iom->type & IOMUX_SOURCE_PMU) || 3092d499d466SJianqun Xu (iom->type & IOMUX_L_SOURCE_PMU)) ? 309349c55878SDavid Wu pmu_offs : grf_offs; 309449c55878SDavid Wu } 309549c55878SDavid Wu 309649c55878SDavid Wu /* preset drv offset value, set new start value */ 309749c55878SDavid Wu if (drv->offset >= 0) { 309849c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 309949c55878SDavid Wu drv_pmu_offs = drv->offset; 310049c55878SDavid Wu else 310149c55878SDavid Wu drv_grf_offs = drv->offset; 310249c55878SDavid Wu } else { /* set current drv offset */ 310349c55878SDavid Wu drv->offset = (iom->type & IOMUX_SOURCE_PMU) ? 310449c55878SDavid Wu drv_pmu_offs : drv_grf_offs; 310549c55878SDavid Wu } 310649c55878SDavid Wu 310749c55878SDavid Wu debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n", 310849c55878SDavid Wu i, j, iom->offset, drv->offset); 310949c55878SDavid Wu 311049c55878SDavid Wu /* 311149c55878SDavid Wu * Increase offset according to iomux width. 311249c55878SDavid Wu * 4bit iomux'es are spread over two registers. 311349c55878SDavid Wu */ 311449c55878SDavid Wu inc = (iom->type & (IOMUX_WIDTH_4BIT | 311588a1f7ffSDavid Wu IOMUX_WIDTH_3BIT | 311688a1f7ffSDavid Wu IOMUX_8WIDTH_2BIT)) ? 8 : 4; 3117d499d466SJianqun Xu if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) 311849c55878SDavid Wu pmu_offs += inc; 311949c55878SDavid Wu else 312049c55878SDavid Wu grf_offs += inc; 312149c55878SDavid Wu 312249c55878SDavid Wu /* 312349c55878SDavid Wu * Increase offset according to drv width. 312449c55878SDavid Wu * 3bit drive-strenth'es are spread over two registers. 312549c55878SDavid Wu */ 312649c55878SDavid Wu if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 312749c55878SDavid Wu (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) 312849c55878SDavid Wu inc = 8; 312949c55878SDavid Wu else 313049c55878SDavid Wu inc = 4; 313149c55878SDavid Wu 313249c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 313349c55878SDavid Wu drv_pmu_offs += inc; 313449c55878SDavid Wu else 313549c55878SDavid Wu drv_grf_offs += inc; 313649c55878SDavid Wu 313749c55878SDavid Wu bank_pins += 8; 313849c55878SDavid Wu } 313949c55878SDavid Wu 314049c55878SDavid Wu /* calculate the per-bank recalced_mask */ 314149c55878SDavid Wu for (j = 0; j < ctrl->niomux_recalced; j++) { 314249c55878SDavid Wu int pin = 0; 314349c55878SDavid Wu 314449c55878SDavid Wu if (ctrl->iomux_recalced[j].num == bank->bank_num) { 314549c55878SDavid Wu pin = ctrl->iomux_recalced[j].pin; 314649c55878SDavid Wu bank->recalced_mask |= BIT(pin); 314749c55878SDavid Wu } 314849c55878SDavid Wu } 314949c55878SDavid Wu 315049c55878SDavid Wu /* calculate the per-bank route_mask */ 315149c55878SDavid Wu for (j = 0; j < ctrl->niomux_routes; j++) { 315249c55878SDavid Wu int pin = 0; 315349c55878SDavid Wu 315449c55878SDavid Wu if (ctrl->iomux_routes[j].bank_num == bank->bank_num) { 315549c55878SDavid Wu pin = ctrl->iomux_routes[j].pin; 315649c55878SDavid Wu bank->route_mask |= BIT(pin); 315749c55878SDavid Wu } 315849c55878SDavid Wu } 315949c55878SDavid Wu } 316049c55878SDavid Wu 316113c03cb6SJianqun Xu WARN_ON(nr_pins != ctrl->nr_pins); 316213c03cb6SJianqun Xu 316349c55878SDavid Wu return ctrl; 316449c55878SDavid Wu } 316549c55878SDavid Wu 3166d5517017SDavid Wu /* SoC data specially handle */ 3167d5517017SDavid Wu 3168d5517017SDavid Wu /* rk3308b SoC data initialize */ 3169d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13 0x608 3170d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15 0x610 3171d5517017SDavid Wu 3172d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */ 3173d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10)) 3174d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 3175d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 3176d5517017SDavid Wu 3177d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */ 3178d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11)) 3179d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7)) 3180d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3)) 3181d5517017SDavid Wu 3182d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv) 3183d5517017SDavid Wu { 3184d5517017SDavid Wu int ret; 3185d5517017SDavid Wu 3186d5517017SDavid Wu /* 3187d5517017SDavid Wu * Enable the special ctrl of selected sources. 3188d5517017SDavid Wu */ 3189d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13, 3190d5517017SDavid Wu RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL | 3191d5517017SDavid Wu RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL | 3192d5517017SDavid Wu RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL); 3193d5517017SDavid Wu if (ret) 3194d5517017SDavid Wu return ret; 3195d5517017SDavid Wu 3196d5517017SDavid Wu ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15, 3197d5517017SDavid Wu RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL | 3198d5517017SDavid Wu RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL | 3199d5517017SDavid Wu RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL); 3200d5517017SDavid Wu if (ret) 3201d5517017SDavid Wu return ret; 3202d5517017SDavid Wu 3203d5517017SDavid Wu return 0; 3204d5517017SDavid Wu } 3205d5517017SDavid Wu 320649c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev) 320749c55878SDavid Wu { 320849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 320913c03cb6SJianqun Xu const struct rockchip_pin_ctrl *ctrl; 321049c55878SDavid Wu struct udevice *syscon; 321149c55878SDavid Wu struct regmap *regmap; 321249c55878SDavid Wu int ret = 0; 321349c55878SDavid Wu 321449c55878SDavid Wu /* get rockchip grf syscon phandle */ 321549c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf", 321649c55878SDavid Wu &syscon); 321749c55878SDavid Wu if (ret) { 321849c55878SDavid Wu debug("unable to find rockchip,grf syscon device (%d)\n", ret); 321949c55878SDavid Wu return ret; 322049c55878SDavid Wu } 322149c55878SDavid Wu 322249c55878SDavid Wu /* get grf-reg base address */ 322349c55878SDavid Wu regmap = syscon_get_regmap(syscon); 322449c55878SDavid Wu if (!regmap) { 322549c55878SDavid Wu debug("unable to find rockchip grf regmap\n"); 322649c55878SDavid Wu return -ENODEV; 322749c55878SDavid Wu } 322849c55878SDavid Wu priv->regmap_base = regmap; 322949c55878SDavid Wu 323049c55878SDavid Wu /* option: get pmu-reg base address */ 323149c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu", 323249c55878SDavid Wu &syscon); 323349c55878SDavid Wu if (!ret) { 323449c55878SDavid Wu /* get pmugrf-reg base address */ 323549c55878SDavid Wu regmap = syscon_get_regmap(syscon); 323649c55878SDavid Wu if (!regmap) { 323749c55878SDavid Wu debug("unable to find rockchip pmu regmap\n"); 323849c55878SDavid Wu return -ENODEV; 323949c55878SDavid Wu } 324049c55878SDavid Wu priv->regmap_pmu = regmap; 324149c55878SDavid Wu } 324249c55878SDavid Wu 324349c55878SDavid Wu ctrl = rockchip_pinctrl_get_soc_data(dev); 324449c55878SDavid Wu if (!ctrl) { 324549c55878SDavid Wu debug("driver data not available\n"); 324649c55878SDavid Wu return -EINVAL; 324749c55878SDavid Wu } 324849c55878SDavid Wu 3249d5517017SDavid Wu /* Special handle for some Socs */ 3250d5517017SDavid Wu if (ctrl->soc_data_init) { 3251d5517017SDavid Wu ret = ctrl->soc_data_init(priv); 3252d5517017SDavid Wu if (ret) 3253d5517017SDavid Wu return ret; 3254d5517017SDavid Wu } 3255d5517017SDavid Wu 325613c03cb6SJianqun Xu priv->ctrl = (struct rockchip_pin_ctrl *)ctrl; 325749c55878SDavid Wu return 0; 325849c55878SDavid Wu } 325949c55878SDavid Wu 326049c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = { 326149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 326249c55878SDavid Wu IOMUX_SOURCE_PMU, 326349c55878SDavid Wu IOMUX_SOURCE_PMU, 326449c55878SDavid Wu IOMUX_SOURCE_PMU 326549c55878SDavid Wu ), 326649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, 326749c55878SDavid Wu IOMUX_WIDTH_4BIT, 326849c55878SDavid Wu IOMUX_WIDTH_4BIT, 326949c55878SDavid Wu IOMUX_WIDTH_4BIT 327049c55878SDavid Wu ), 327149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, 327249c55878SDavid Wu IOMUX_WIDTH_4BIT, 327349c55878SDavid Wu IOMUX_WIDTH_4BIT, 327449c55878SDavid Wu IOMUX_WIDTH_4BIT 327549c55878SDavid Wu ), 327649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, 327749c55878SDavid Wu IOMUX_WIDTH_4BIT, 327849c55878SDavid Wu IOMUX_WIDTH_4BIT, 327949c55878SDavid Wu IOMUX_WIDTH_4BIT 328049c55878SDavid Wu ), 328149c55878SDavid Wu }; 328249c55878SDavid Wu 328313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl px30_pin_ctrl = { 328449c55878SDavid Wu .pin_banks = px30_pin_banks, 328549c55878SDavid Wu .nr_banks = ARRAY_SIZE(px30_pin_banks), 328613c03cb6SJianqun Xu .nr_pins = 128, 328749c55878SDavid Wu .label = "PX30-GPIO", 328849c55878SDavid Wu .type = PX30, 328949c55878SDavid Wu .grf_mux_offset = 0x0, 329049c55878SDavid Wu .pmu_mux_offset = 0x0, 329149c55878SDavid Wu .iomux_routes = px30_mux_route_data, 329249c55878SDavid Wu .niomux_routes = ARRAY_SIZE(px30_mux_route_data), 329349c55878SDavid Wu .pull_calc_reg = px30_calc_pull_reg_and_bit, 329449c55878SDavid Wu .drv_calc_reg = px30_calc_drv_reg_and_bit, 329549c55878SDavid Wu .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, 329632c25d1fSDavid Wu .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit, 329749c55878SDavid Wu }; 329849c55878SDavid Wu 329949c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = { 330049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 330149c55878SDavid Wu IOMUX_SOURCE_PMU, 330249c55878SDavid Wu IOMUX_SOURCE_PMU, 330349c55878SDavid Wu IOMUX_SOURCE_PMU), 330449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 330549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0), 330649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0), 330749c55878SDavid Wu }; 330849c55878SDavid Wu 330913c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1108_pin_ctrl = { 331049c55878SDavid Wu .pin_banks = rv1108_pin_banks, 331149c55878SDavid Wu .nr_banks = ARRAY_SIZE(rv1108_pin_banks), 331213c03cb6SJianqun Xu .nr_pins = 128, 331349c55878SDavid Wu .label = "RV1108-GPIO", 331449c55878SDavid Wu .type = RV1108, 331549c55878SDavid Wu .grf_mux_offset = 0x10, 331649c55878SDavid Wu .pmu_mux_offset = 0x0, 331749c55878SDavid Wu .iomux_recalced = rv1108_mux_recalced_data, 331849c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data), 331949c55878SDavid Wu .pull_calc_reg = rv1108_calc_pull_reg_and_bit, 332049c55878SDavid Wu .drv_calc_reg = rv1108_calc_drv_reg_and_bit, 332149c55878SDavid Wu .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit, 332249c55878SDavid Wu }; 332349c55878SDavid Wu 3324cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = { 3325cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 3326cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 3327cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 3328cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU, 3329cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3330d499d466SJianqun Xu PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1", 3331cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3332cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3333cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3334d499d466SJianqun Xu IOMUX_WIDTH_4BIT, 3335d499d466SJianqun Xu 0x10010, 0x10018, 0x10020, 0x10028), 3336cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 3337cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3338cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3339cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3340cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3341cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 3342cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3343cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3344cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 3345cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT), 3346cf04a17bSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4", 3347cf04a17bSJianqun Xu IOMUX_WIDTH_4BIT, 0, 0, 0), 3348cf04a17bSJianqun Xu }; 3349cf04a17bSJianqun Xu 335013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1126_pin_ctrl = { 3351cf04a17bSJianqun Xu .pin_banks = rv1126_pin_banks, 3352cf04a17bSJianqun Xu .nr_banks = ARRAY_SIZE(rv1126_pin_banks), 335313c03cb6SJianqun Xu .nr_pins = 130, 3354cf04a17bSJianqun Xu .label = "RV1126-GPIO", 3355cf04a17bSJianqun Xu .type = RV1126, 3356cf04a17bSJianqun Xu .grf_mux_offset = 0x10004, /* mux offset from GPIO0_D0 */ 3357cf04a17bSJianqun Xu .pmu_mux_offset = 0x0, 3358d499d466SJianqun Xu .iomux_routes = rv1126_mux_route_data, 3359d499d466SJianqun Xu .niomux_routes = ARRAY_SIZE(rv1126_mux_route_data), 3360cf04a17bSJianqun Xu .iomux_recalced = rv1126_mux_recalced_data, 3361cf04a17bSJianqun Xu .niomux_recalced = ARRAY_SIZE(rv1126_mux_recalced_data), 3362cf04a17bSJianqun Xu .pull_calc_reg = rv1126_calc_pull_reg_and_bit, 3363cf04a17bSJianqun Xu .drv_calc_reg = rv1126_calc_drv_reg_and_bit, 3364cf04a17bSJianqun Xu .schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit, 3365cf04a17bSJianqun Xu }; 3366cf04a17bSJianqun Xu 3367a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = { 3368a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 3369a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3370a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3371a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 3372a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU), 3373a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 3374a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3375a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3376a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3377a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3378a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 3379a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3380a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3381a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3382a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3383a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 3384a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3385a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3386a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3387a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3388a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", 3389a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3390a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3391a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 3392a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 3393a2a3fc8fSJianqun Xu }; 3394a2a3fc8fSJianqun Xu 339513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk1808_pin_ctrl = { 3396a2a3fc8fSJianqun Xu .pin_banks = rk1808_pin_banks, 3397a2a3fc8fSJianqun Xu .nr_banks = ARRAY_SIZE(rk1808_pin_banks), 339813c03cb6SJianqun Xu .nr_pins = 160, 3399a2a3fc8fSJianqun Xu .label = "RK1808-GPIO", 3400a2a3fc8fSJianqun Xu .type = RK1808, 3401a2a3fc8fSJianqun Xu .iomux_routes = rk1808_mux_route_data, 3402a2a3fc8fSJianqun Xu .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data), 3403a2a3fc8fSJianqun Xu .grf_mux_offset = 0x0, 3404a2a3fc8fSJianqun Xu .pmu_mux_offset = 0x0, 3405a2a3fc8fSJianqun Xu .pull_calc_reg = rk1808_calc_pull_reg_and_bit, 3406a2a3fc8fSJianqun Xu .drv_calc_reg = rk1808_calc_drv_reg_and_bit, 3407a2a3fc8fSJianqun Xu .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit, 3408a2a3fc8fSJianqun Xu }; 3409a2a3fc8fSJianqun Xu 341049c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = { 341149c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 341249c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 341349c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 341449c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 341549c55878SDavid Wu }; 341649c55878SDavid Wu 341713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk2928_pin_ctrl = { 341849c55878SDavid Wu .pin_banks = rk2928_pin_banks, 341949c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 342013c03cb6SJianqun Xu .nr_pins = 128, 342149c55878SDavid Wu .label = "RK2928-GPIO", 342249c55878SDavid Wu .type = RK2928, 342349c55878SDavid Wu .grf_mux_offset = 0xa8, 342449c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 342549c55878SDavid Wu }; 342649c55878SDavid Wu 342749c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = { 342849c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 342949c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 343049c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 343149c55878SDavid Wu }; 343249c55878SDavid Wu 343313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3036_pin_ctrl = { 343449c55878SDavid Wu .pin_banks = rk3036_pin_banks, 343549c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3036_pin_banks), 343613c03cb6SJianqun Xu .nr_pins = 96, 343749c55878SDavid Wu .label = "RK3036-GPIO", 343849c55878SDavid Wu .type = RK2928, 343949c55878SDavid Wu .grf_mux_offset = 0xa8, 344049c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 344149c55878SDavid Wu }; 344249c55878SDavid Wu 344349c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = { 344449c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 344549c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 344649c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 344749c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 344849c55878SDavid Wu PIN_BANK(4, 32, "gpio4"), 344949c55878SDavid Wu PIN_BANK(6, 16, "gpio6"), 345049c55878SDavid Wu }; 345149c55878SDavid Wu 345213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066a_pin_ctrl = { 345349c55878SDavid Wu .pin_banks = rk3066a_pin_banks, 345449c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 345513c03cb6SJianqun Xu .nr_pins = 176, 345649c55878SDavid Wu .label = "RK3066a-GPIO", 345749c55878SDavid Wu .type = RK2928, 345849c55878SDavid Wu .grf_mux_offset = 0xa8, 345949c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 346049c55878SDavid Wu }; 346149c55878SDavid Wu 346249c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = { 346349c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 346449c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 346549c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 346649c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 346749c55878SDavid Wu }; 346849c55878SDavid Wu 346913c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066b_pin_ctrl = { 347049c55878SDavid Wu .pin_banks = rk3066b_pin_banks, 347149c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 347213c03cb6SJianqun Xu .nr_pins = 128, 347349c55878SDavid Wu .label = "RK3066b-GPIO", 347449c55878SDavid Wu .type = RK3066B, 347549c55878SDavid Wu .grf_mux_offset = 0x60, 347649c55878SDavid Wu }; 347749c55878SDavid Wu 347849c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = { 347949c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 348049c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 348149c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 348249c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 348349c55878SDavid Wu }; 348449c55878SDavid Wu 348513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3128_pin_ctrl = { 348649c55878SDavid Wu .pin_banks = rk3128_pin_banks, 348749c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3128_pin_banks), 348813c03cb6SJianqun Xu .nr_pins = 128, 348949c55878SDavid Wu .label = "RK3128-GPIO", 349049c55878SDavid Wu .type = RK3128, 349149c55878SDavid Wu .grf_mux_offset = 0xa8, 349249c55878SDavid Wu .iomux_recalced = rk3128_mux_recalced_data, 349349c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data), 349449c55878SDavid Wu .iomux_routes = rk3128_mux_route_data, 349549c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data), 349649c55878SDavid Wu .pull_calc_reg = rk3128_calc_pull_reg_and_bit, 349749c55878SDavid Wu }; 349849c55878SDavid Wu 349949c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = { 350049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0), 350149c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 350249c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 350349c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 350449c55878SDavid Wu }; 350549c55878SDavid Wu 350613c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3188_pin_ctrl = { 350749c55878SDavid Wu .pin_banks = rk3188_pin_banks, 350849c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 350913c03cb6SJianqun Xu .nr_pins = 128, 351049c55878SDavid Wu .label = "RK3188-GPIO", 351149c55878SDavid Wu .type = RK3188, 351249c55878SDavid Wu .grf_mux_offset = 0x60, 351349c55878SDavid Wu .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 351449c55878SDavid Wu }; 351549c55878SDavid Wu 351649c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = { 351749c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 351849c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 351949c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 352049c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 352149c55878SDavid Wu }; 352249c55878SDavid Wu 352313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3228_pin_ctrl = { 352449c55878SDavid Wu .pin_banks = rk3228_pin_banks, 352549c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3228_pin_banks), 352613c03cb6SJianqun Xu .nr_pins = 128, 352749c55878SDavid Wu .label = "RK3228-GPIO", 352849c55878SDavid Wu .type = RK3288, 352949c55878SDavid Wu .grf_mux_offset = 0x0, 353049c55878SDavid Wu .iomux_routes = rk3228_mux_route_data, 353149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data), 353249c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 353349c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 353449c55878SDavid Wu }; 353549c55878SDavid Wu 353649c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = { 353755a89bc6SDavid Wu PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0", 35384bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 35394bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 354055a89bc6SDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 354155a89bc6SDavid Wu IOMUX_UNROUTED, 354255a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 354355a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 354455a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 354555a89bc6SDavid Wu 0, 354655a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 354755a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 354855a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 354955a89bc6SDavid Wu 0 355049c55878SDavid Wu ), 355149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED, 355249c55878SDavid Wu IOMUX_UNROUTED, 355349c55878SDavid Wu IOMUX_UNROUTED, 355449c55878SDavid Wu 0 355549c55878SDavid Wu ), 355649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED), 355749c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT), 355849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, 355949c55878SDavid Wu IOMUX_WIDTH_4BIT, 356049c55878SDavid Wu 0, 356149c55878SDavid Wu 0 356249c55878SDavid Wu ), 356349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED, 356449c55878SDavid Wu 0, 356549c55878SDavid Wu 0, 356649c55878SDavid Wu IOMUX_UNROUTED 356749c55878SDavid Wu ), 356849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED), 356949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0, 357049c55878SDavid Wu 0, 357149c55878SDavid Wu IOMUX_WIDTH_4BIT, 357249c55878SDavid Wu IOMUX_UNROUTED 357349c55878SDavid Wu ), 357449c55878SDavid Wu PIN_BANK(8, 16, "gpio8"), 357549c55878SDavid Wu }; 357649c55878SDavid Wu 357713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3288_pin_ctrl = { 357849c55878SDavid Wu .pin_banks = rk3288_pin_banks, 357949c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3288_pin_banks), 35802f6aff58SJianqun Xu .nr_pins = 264, 358149c55878SDavid Wu .label = "RK3288-GPIO", 358249c55878SDavid Wu .type = RK3288, 358349c55878SDavid Wu .grf_mux_offset = 0x0, 358449c55878SDavid Wu .pmu_mux_offset = 0x84, 358549c55878SDavid Wu .iomux_routes = rk3288_mux_route_data, 358649c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data), 358749c55878SDavid Wu .pull_calc_reg = rk3288_calc_pull_reg_and_bit, 358849c55878SDavid Wu .drv_calc_reg = rk3288_calc_drv_reg_and_bit, 358949c55878SDavid Wu }; 359049c55878SDavid Wu 3591b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = { 3592b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT, 3593b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3594b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3595b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3596b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT, 3597b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3598b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3599b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3600b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT, 3601b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3602b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3603b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3604b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT, 3605b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3606b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3607b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3608b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT, 3609b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3610b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 3611b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 3612b3077611SDavid Wu }; 3613b3077611SDavid Wu 3614b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = { 3615b3077611SDavid Wu .pin_banks = rk3308_pin_banks, 3616b3077611SDavid Wu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 3617e21613fbSJianqun Xu .nr_pins = 160, 3618b3077611SDavid Wu .label = "RK3308-GPIO", 3619b3077611SDavid Wu .type = RK3308, 3620b3077611SDavid Wu .grf_mux_offset = 0x0, 3621b3077611SDavid Wu .iomux_recalced = rk3308_mux_recalced_data, 3622b3077611SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data), 3623b3077611SDavid Wu .iomux_routes = rk3308_mux_route_data, 3624b3077611SDavid Wu .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data), 362513c03cb6SJianqun Xu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 362613c03cb6SJianqun Xu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 362713c03cb6SJianqun Xu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 362813c03cb6SJianqun Xu }; 362913c03cb6SJianqun Xu 363013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = { 363113c03cb6SJianqun Xu .pin_banks = rk3308_pin_banks, 363213c03cb6SJianqun Xu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 363313c03cb6SJianqun Xu .nr_pins = 160, 363413c03cb6SJianqun Xu .label = "RK3308-GPIO", 363513c03cb6SJianqun Xu .type = RK3308, 363613c03cb6SJianqun Xu .grf_mux_offset = 0x0, 363713c03cb6SJianqun Xu .iomux_recalced = rk3308b_mux_recalced_data, 363813c03cb6SJianqun Xu .niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data), 363913c03cb6SJianqun Xu .iomux_routes = rk3308b_mux_route_data, 364013c03cb6SJianqun Xu .niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data), 3641d5517017SDavid Wu .soc_data_init = rk3308b_soc_data_init, 3642b3077611SDavid Wu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 3643b3077611SDavid Wu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 3644b3077611SDavid Wu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 3645b3077611SDavid Wu }; 3646b3077611SDavid Wu 364749c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = { 364849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0), 364949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 365049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 365149c55878SDavid Wu IOMUX_WIDTH_3BIT, 365249c55878SDavid Wu IOMUX_WIDTH_3BIT, 365349c55878SDavid Wu 0), 365449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 365549c55878SDavid Wu IOMUX_WIDTH_3BIT, 365649c55878SDavid Wu IOMUX_WIDTH_3BIT, 365749c55878SDavid Wu 0, 365849c55878SDavid Wu 0), 365949c55878SDavid Wu }; 366049c55878SDavid Wu 366113c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3328_pin_ctrl = { 366249c55878SDavid Wu .pin_banks = rk3328_pin_banks, 366349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3328_pin_banks), 366413c03cb6SJianqun Xu .nr_pins = 128, 366549c55878SDavid Wu .label = "RK3328-GPIO", 366649c55878SDavid Wu .type = RK3288, 366749c55878SDavid Wu .grf_mux_offset = 0x0, 366849c55878SDavid Wu .iomux_recalced = rk3328_mux_recalced_data, 366949c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data), 367049c55878SDavid Wu .iomux_routes = rk3328_mux_route_data, 367149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data), 367249c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 367349c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 367449c55878SDavid Wu .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit, 367549c55878SDavid Wu }; 367649c55878SDavid Wu 367749c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = { 367849c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 367949c55878SDavid Wu IOMUX_SOURCE_PMU, 368049c55878SDavid Wu IOMUX_SOURCE_PMU, 368149c55878SDavid Wu IOMUX_SOURCE_PMU 368249c55878SDavid Wu ), 368349c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 368449c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 368549c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 368649c55878SDavid Wu }; 368749c55878SDavid Wu 368813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3368_pin_ctrl = { 368949c55878SDavid Wu .pin_banks = rk3368_pin_banks, 369049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3368_pin_banks), 369113c03cb6SJianqun Xu .nr_pins = 128, 369249c55878SDavid Wu .label = "RK3368-GPIO", 369349c55878SDavid Wu .type = RK3368, 369449c55878SDavid Wu .grf_mux_offset = 0x0, 369549c55878SDavid Wu .pmu_mux_offset = 0x0, 369649c55878SDavid Wu .pull_calc_reg = rk3368_calc_pull_reg_and_bit, 369749c55878SDavid Wu .drv_calc_reg = rk3368_calc_drv_reg_and_bit, 369849c55878SDavid Wu }; 369949c55878SDavid Wu 370049c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = { 370149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0", 370249c55878SDavid Wu IOMUX_SOURCE_PMU, 370349c55878SDavid Wu IOMUX_SOURCE_PMU, 370449c55878SDavid Wu IOMUX_SOURCE_PMU, 370549c55878SDavid Wu IOMUX_SOURCE_PMU, 370649c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 370749c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 370849c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 370949c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 371049c55878SDavid Wu 0x80, 371149c55878SDavid Wu 0x88, 371249c55878SDavid Wu -1, 371349c55878SDavid Wu -1, 371449c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 371549c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 371649c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 371749c55878SDavid Wu PULL_TYPE_IO_DEFAULT 371849c55878SDavid Wu ), 371949c55878SDavid Wu PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU, 372049c55878SDavid Wu IOMUX_SOURCE_PMU, 372149c55878SDavid Wu IOMUX_SOURCE_PMU, 372249c55878SDavid Wu IOMUX_SOURCE_PMU, 372349c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 372449c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 372549c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 372649c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 372749c55878SDavid Wu 0xa0, 372849c55878SDavid Wu 0xa8, 372949c55878SDavid Wu 0xb0, 373049c55878SDavid Wu 0xb8 373149c55878SDavid Wu ), 373249c55878SDavid Wu PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0, 373349c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 373449c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 373549c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 373649c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 373749c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 373849c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 373949c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY 374049c55878SDavid Wu ), 374149c55878SDavid Wu PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY, 374249c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 374349c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 374449c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 374549c55878SDavid Wu ), 374649c55878SDavid Wu PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0, 374749c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 374849c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 374949c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 375049c55878SDavid Wu ), 375149c55878SDavid Wu }; 375249c55878SDavid Wu 375313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3399_pin_ctrl = { 375449c55878SDavid Wu .pin_banks = rk3399_pin_banks, 375549c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3399_pin_banks), 375613c03cb6SJianqun Xu .nr_pins = 160, 375749c55878SDavid Wu .label = "RK3399-GPIO", 375849c55878SDavid Wu .type = RK3399, 375949c55878SDavid Wu .grf_mux_offset = 0xe000, 376049c55878SDavid Wu .pmu_mux_offset = 0x0, 376149c55878SDavid Wu .grf_drv_offset = 0xe100, 376249c55878SDavid Wu .pmu_drv_offset = 0x80, 376349c55878SDavid Wu .iomux_routes = rk3399_mux_route_data, 376449c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data), 376549c55878SDavid Wu .pull_calc_reg = rk3399_calc_pull_reg_and_bit, 376649c55878SDavid Wu .drv_calc_reg = rk3399_calc_drv_reg_and_bit, 376749c55878SDavid Wu }; 376849c55878SDavid Wu 376949c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = { 377049c55878SDavid Wu { .compatible = "rockchip,px30-pinctrl", 377149c55878SDavid Wu .data = (ulong)&px30_pin_ctrl }, 377249c55878SDavid Wu { .compatible = "rockchip,rv1108-pinctrl", 377349c55878SDavid Wu .data = (ulong)&rv1108_pin_ctrl }, 377492b1d31aSJianqun Xu { .compatible = "rockchip,rv1126-pinctrl-legency", 3775cf04a17bSJianqun Xu .data = (ulong)&rv1126_pin_ctrl }, 3776a2a3fc8fSJianqun Xu { .compatible = "rockchip,rk1808-pinctrl", 3777a2a3fc8fSJianqun Xu .data = (ulong)&rk1808_pin_ctrl }, 377849c55878SDavid Wu { .compatible = "rockchip,rk2928-pinctrl", 377949c55878SDavid Wu .data = (ulong)&rk2928_pin_ctrl }, 378049c55878SDavid Wu { .compatible = "rockchip,rk3036-pinctrl", 378149c55878SDavid Wu .data = (ulong)&rk3036_pin_ctrl }, 378249c55878SDavid Wu { .compatible = "rockchip,rk3066a-pinctrl", 378349c55878SDavid Wu .data = (ulong)&rk3066a_pin_ctrl }, 378449c55878SDavid Wu { .compatible = "rockchip,rk3066b-pinctrl", 378549c55878SDavid Wu .data = (ulong)&rk3066b_pin_ctrl }, 378649c55878SDavid Wu { .compatible = "rockchip,rk3128-pinctrl", 378749c55878SDavid Wu .data = (ulong)&rk3128_pin_ctrl }, 378849c55878SDavid Wu { .compatible = "rockchip,rk3188-pinctrl", 378949c55878SDavid Wu .data = (ulong)&rk3188_pin_ctrl }, 379049c55878SDavid Wu { .compatible = "rockchip,rk3228-pinctrl", 379149c55878SDavid Wu .data = (ulong)&rk3228_pin_ctrl }, 379249c55878SDavid Wu { .compatible = "rockchip,rk3288-pinctrl", 379349c55878SDavid Wu .data = (ulong)&rk3288_pin_ctrl }, 3794b3077611SDavid Wu { .compatible = "rockchip,rk3308-pinctrl", 3795b3077611SDavid Wu .data = (ulong)&rk3308_pin_ctrl }, 379649c55878SDavid Wu { .compatible = "rockchip,rk3328-pinctrl", 379749c55878SDavid Wu .data = (ulong)&rk3328_pin_ctrl }, 379849c55878SDavid Wu { .compatible = "rockchip,rk3368-pinctrl", 379949c55878SDavid Wu .data = (ulong)&rk3368_pin_ctrl }, 380049c55878SDavid Wu { .compatible = "rockchip,rk3399-pinctrl", 380149c55878SDavid Wu .data = (ulong)&rk3399_pin_ctrl }, 380249c55878SDavid Wu {}, 380349c55878SDavid Wu }; 380449c55878SDavid Wu 380549c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = { 380649c55878SDavid Wu .name = "rockchip_pinctrl", 380749c55878SDavid Wu .id = UCLASS_PINCTRL, 380849c55878SDavid Wu .of_match = rockchip_pinctrl_dt_match, 380949c55878SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), 381049c55878SDavid Wu .ops = &rockchip_pinctrl_ops, 381149c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA) 381249c55878SDavid Wu .bind = dm_scan_fdt_dev, 381349c55878SDavid Wu #endif 381449c55878SDavid Wu .probe = rockchip_pinctrl_probe, 381549c55878SDavid Wu }; 3816