149c55878SDavid Wu /* 249c55878SDavid Wu * (C) Copyright 2018 Rockchip Electronics Co., Ltd 349c55878SDavid Wu * 449c55878SDavid Wu * SPDX-License-Identifier: GPL-2.0+ 549c55878SDavid Wu */ 649c55878SDavid Wu 749c55878SDavid Wu #include <common.h> 849c55878SDavid Wu #include <dm.h> 949c55878SDavid Wu #include <dm/pinctrl.h> 102208cfa9SKever Yang #include <dm/ofnode.h> 1149c55878SDavid Wu #include <regmap.h> 1249c55878SDavid Wu #include <syscon.h> 1349c55878SDavid Wu 1449c55878SDavid Wu #define MAX_ROCKCHIP_GPIO_PER_BANK 32 1549c55878SDavid Wu #define RK_FUNC_GPIO 0 1687f0ac57SDavid Wu #define MAX_ROCKCHIP_PINS_ENTRIES 30 1749c55878SDavid Wu 1849c55878SDavid Wu enum rockchip_pinctrl_type { 1949c55878SDavid Wu PX30, 2049c55878SDavid Wu RV1108, 21*a2a3fc8fSJianqun Xu RK1808, 2249c55878SDavid Wu RK2928, 2349c55878SDavid Wu RK3066B, 2449c55878SDavid Wu RK3128, 2549c55878SDavid Wu RK3188, 2649c55878SDavid Wu RK3288, 27b3077611SDavid Wu RK3308, 2849c55878SDavid Wu RK3368, 2949c55878SDavid Wu RK3399, 3049c55878SDavid Wu }; 3149c55878SDavid Wu 3249c55878SDavid Wu /** 3349c55878SDavid Wu * Encode variants of iomux registers into a type variable 3449c55878SDavid Wu */ 3549c55878SDavid Wu #define IOMUX_GPIO_ONLY BIT(0) 3649c55878SDavid Wu #define IOMUX_WIDTH_4BIT BIT(1) 3749c55878SDavid Wu #define IOMUX_SOURCE_PMU BIT(2) 3849c55878SDavid Wu #define IOMUX_UNROUTED BIT(3) 3949c55878SDavid Wu #define IOMUX_WIDTH_3BIT BIT(4) 40b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT BIT(5) 414bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT BIT(6) 4249c55878SDavid Wu 4349c55878SDavid Wu /** 4449c55878SDavid Wu * @type: iomux variant using IOMUX_* constants 4549c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 4649c55878SDavid Wu * an initial offset value the relevant source offset can be reset 4749c55878SDavid Wu * to a new value for autocalculating the following iomux registers. 4849c55878SDavid Wu */ 4949c55878SDavid Wu struct rockchip_iomux { 5049c55878SDavid Wu int type; 5149c55878SDavid Wu int offset; 5249c55878SDavid Wu }; 5349c55878SDavid Wu 5455a89bc6SDavid Wu #define DRV_TYPE_IO_MASK GENMASK(31, 16) 5555a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT BIT(31) 5655a89bc6SDavid Wu 5749c55878SDavid Wu /** 5849c55878SDavid Wu * enum type index corresponding to rockchip_perpin_drv_list arrays index. 5949c55878SDavid Wu */ 6049c55878SDavid Wu enum rockchip_pin_drv_type { 6149c55878SDavid Wu DRV_TYPE_IO_DEFAULT = 0, 6249c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 6349c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 6449c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 6549c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 6649c55878SDavid Wu DRV_TYPE_MAX 6749c55878SDavid Wu }; 6849c55878SDavid Wu 6955a89bc6SDavid Wu #define PULL_TYPE_IO_MASK GENMASK(31, 16) 7055a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT BIT(31) 7155a89bc6SDavid Wu 7249c55878SDavid Wu /** 7349c55878SDavid Wu * enum type index corresponding to rockchip_pull_list arrays index. 7449c55878SDavid Wu */ 7549c55878SDavid Wu enum rockchip_pin_pull_type { 7649c55878SDavid Wu PULL_TYPE_IO_DEFAULT = 0, 7749c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 7849c55878SDavid Wu PULL_TYPE_MAX 7949c55878SDavid Wu }; 8049c55878SDavid Wu 8149c55878SDavid Wu /** 8249c55878SDavid Wu * @drv_type: drive strength variant using rockchip_perpin_drv_type 8349c55878SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 8449c55878SDavid Wu * an initial offset value the relevant source offset can be reset 8549c55878SDavid Wu * to a new value for autocalculating the following drive strength 8649c55878SDavid Wu * registers. if used chips own cal_drv func instead to calculate 8749c55878SDavid Wu * registers offset, the variant could be ignored. 8849c55878SDavid Wu */ 8949c55878SDavid Wu struct rockchip_drv { 9049c55878SDavid Wu enum rockchip_pin_drv_type drv_type; 9149c55878SDavid Wu int offset; 9249c55878SDavid Wu }; 9349c55878SDavid Wu 9449c55878SDavid Wu /** 9549c55878SDavid Wu * @priv: common pinctrl private basedata 9649c55878SDavid Wu * @pin_base: first pin number 9749c55878SDavid Wu * @nr_pins: number of pins in this bank 9849c55878SDavid Wu * @name: name of the bank 9949c55878SDavid Wu * @bank_num: number of the bank, to account for holes 10049c55878SDavid Wu * @iomux: array describing the 4 iomux sources of the bank 10149c55878SDavid Wu * @drv: array describing the 4 drive strength sources of the bank 10249c55878SDavid Wu * @pull_type: array describing the 4 pull type sources of the bank 10349c55878SDavid Wu * @recalced_mask: bits describing the mux recalced pins of per bank 10449c55878SDavid Wu * @route_mask: bits describing the routing pins of per bank 10549c55878SDavid Wu */ 10649c55878SDavid Wu struct rockchip_pin_bank { 10749c55878SDavid Wu struct rockchip_pinctrl_priv *priv; 10849c55878SDavid Wu u32 pin_base; 10949c55878SDavid Wu u8 nr_pins; 11049c55878SDavid Wu char *name; 11149c55878SDavid Wu u8 bank_num; 11249c55878SDavid Wu struct rockchip_iomux iomux[4]; 11349c55878SDavid Wu struct rockchip_drv drv[4]; 11449c55878SDavid Wu enum rockchip_pin_pull_type pull_type[4]; 11549c55878SDavid Wu u32 recalced_mask; 11649c55878SDavid Wu u32 route_mask; 11749c55878SDavid Wu }; 11849c55878SDavid Wu 11949c55878SDavid Wu #define PIN_BANK(id, pins, label) \ 12049c55878SDavid Wu { \ 12149c55878SDavid Wu .bank_num = id, \ 12249c55878SDavid Wu .nr_pins = pins, \ 12349c55878SDavid Wu .name = label, \ 12449c55878SDavid Wu .iomux = { \ 12549c55878SDavid Wu { .offset = -1 }, \ 12649c55878SDavid Wu { .offset = -1 }, \ 12749c55878SDavid Wu { .offset = -1 }, \ 12849c55878SDavid Wu { .offset = -1 }, \ 12949c55878SDavid Wu }, \ 13049c55878SDavid Wu } 13149c55878SDavid Wu 13249c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 13349c55878SDavid Wu { \ 13449c55878SDavid Wu .bank_num = id, \ 13549c55878SDavid Wu .nr_pins = pins, \ 13649c55878SDavid Wu .name = label, \ 13749c55878SDavid Wu .iomux = { \ 13849c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 13949c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 14049c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 14149c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 14249c55878SDavid Wu }, \ 14349c55878SDavid Wu } 14449c55878SDavid Wu 14549c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 14649c55878SDavid Wu { \ 14749c55878SDavid Wu .bank_num = id, \ 14849c55878SDavid Wu .nr_pins = pins, \ 14949c55878SDavid Wu .name = label, \ 15049c55878SDavid Wu .iomux = { \ 15149c55878SDavid Wu { .offset = -1 }, \ 15249c55878SDavid Wu { .offset = -1 }, \ 15349c55878SDavid Wu { .offset = -1 }, \ 15449c55878SDavid Wu { .offset = -1 }, \ 15549c55878SDavid Wu }, \ 15649c55878SDavid Wu .drv = { \ 15749c55878SDavid Wu { .drv_type = type0, .offset = -1 }, \ 15849c55878SDavid Wu { .drv_type = type1, .offset = -1 }, \ 15949c55878SDavid Wu { .drv_type = type2, .offset = -1 }, \ 16049c55878SDavid Wu { .drv_type = type3, .offset = -1 }, \ 16149c55878SDavid Wu }, \ 16249c55878SDavid Wu } 16349c55878SDavid Wu 16449c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \ 16549c55878SDavid Wu drv2, drv3, pull0, pull1, \ 16649c55878SDavid Wu pull2, pull3) \ 16749c55878SDavid Wu { \ 16849c55878SDavid Wu .bank_num = id, \ 16949c55878SDavid Wu .nr_pins = pins, \ 17049c55878SDavid Wu .name = label, \ 17149c55878SDavid Wu .iomux = { \ 17249c55878SDavid Wu { .offset = -1 }, \ 17349c55878SDavid Wu { .offset = -1 }, \ 17449c55878SDavid Wu { .offset = -1 }, \ 17549c55878SDavid Wu { .offset = -1 }, \ 17649c55878SDavid Wu }, \ 17749c55878SDavid Wu .drv = { \ 17849c55878SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 17949c55878SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 18049c55878SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 18149c55878SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 18249c55878SDavid Wu }, \ 18349c55878SDavid Wu .pull_type[0] = pull0, \ 18449c55878SDavid Wu .pull_type[1] = pull1, \ 18549c55878SDavid Wu .pull_type[2] = pull2, \ 18649c55878SDavid Wu .pull_type[3] = pull3, \ 18749c55878SDavid Wu } 18849c55878SDavid Wu 18949c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \ 19049c55878SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 19149c55878SDavid Wu drv3, offset0, offset1, \ 19249c55878SDavid Wu offset2, offset3) \ 19349c55878SDavid Wu { \ 19449c55878SDavid Wu .bank_num = id, \ 19549c55878SDavid Wu .nr_pins = pins, \ 19649c55878SDavid Wu .name = label, \ 19749c55878SDavid Wu .iomux = { \ 19849c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 19949c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 20049c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 20149c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 20249c55878SDavid Wu }, \ 20349c55878SDavid Wu .drv = { \ 20449c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 20549c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 20649c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 20749c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 20849c55878SDavid Wu }, \ 20949c55878SDavid Wu } 21049c55878SDavid Wu 21155a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1, \ 21255a89bc6SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 21355a89bc6SDavid Wu drv3, pull0, pull1, pull2, \ 21455a89bc6SDavid Wu pull3) \ 21555a89bc6SDavid Wu { \ 21655a89bc6SDavid Wu .bank_num = id, \ 21755a89bc6SDavid Wu .nr_pins = pins, \ 21855a89bc6SDavid Wu .name = label, \ 21955a89bc6SDavid Wu .iomux = { \ 22055a89bc6SDavid Wu { .type = iom0, .offset = -1 }, \ 22155a89bc6SDavid Wu { .type = iom1, .offset = -1 }, \ 22255a89bc6SDavid Wu { .type = iom2, .offset = -1 }, \ 22355a89bc6SDavid Wu { .type = iom3, .offset = -1 }, \ 22455a89bc6SDavid Wu }, \ 22555a89bc6SDavid Wu .drv = { \ 22655a89bc6SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 22755a89bc6SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 22855a89bc6SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 22955a89bc6SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 23055a89bc6SDavid Wu }, \ 23155a89bc6SDavid Wu .pull_type[0] = pull0, \ 23255a89bc6SDavid Wu .pull_type[1] = pull1, \ 23355a89bc6SDavid Wu .pull_type[2] = pull2, \ 23455a89bc6SDavid Wu .pull_type[3] = pull3, \ 23555a89bc6SDavid Wu } 23655a89bc6SDavid Wu 23749c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \ 23849c55878SDavid Wu label, iom0, iom1, iom2, \ 23949c55878SDavid Wu iom3, drv0, drv1, drv2, \ 24049c55878SDavid Wu drv3, offset0, offset1, \ 24149c55878SDavid Wu offset2, offset3, pull0, \ 24249c55878SDavid Wu pull1, pull2, pull3) \ 24349c55878SDavid Wu { \ 24449c55878SDavid Wu .bank_num = id, \ 24549c55878SDavid Wu .nr_pins = pins, \ 24649c55878SDavid Wu .name = label, \ 24749c55878SDavid Wu .iomux = { \ 24849c55878SDavid Wu { .type = iom0, .offset = -1 }, \ 24949c55878SDavid Wu { .type = iom1, .offset = -1 }, \ 25049c55878SDavid Wu { .type = iom2, .offset = -1 }, \ 25149c55878SDavid Wu { .type = iom3, .offset = -1 }, \ 25249c55878SDavid Wu }, \ 25349c55878SDavid Wu .drv = { \ 25449c55878SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 25549c55878SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 25649c55878SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 25749c55878SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 25849c55878SDavid Wu }, \ 25949c55878SDavid Wu .pull_type[0] = pull0, \ 26049c55878SDavid Wu .pull_type[1] = pull1, \ 26149c55878SDavid Wu .pull_type[2] = pull2, \ 26249c55878SDavid Wu .pull_type[3] = pull3, \ 26349c55878SDavid Wu } 26449c55878SDavid Wu 26549c55878SDavid Wu /** 26649c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 26749c55878SDavid Wu * @num: bank number. 26849c55878SDavid Wu * @pin: pin number. 26949c55878SDavid Wu * @bit: index at register. 27049c55878SDavid Wu * @reg: register offset. 27149c55878SDavid Wu * @mask: mask bit 27249c55878SDavid Wu */ 27349c55878SDavid Wu struct rockchip_mux_recalced_data { 27449c55878SDavid Wu u8 num; 27549c55878SDavid Wu u8 pin; 27649c55878SDavid Wu u32 reg; 27749c55878SDavid Wu u8 bit; 27849c55878SDavid Wu u8 mask; 27949c55878SDavid Wu }; 28049c55878SDavid Wu 28149c55878SDavid Wu /** 28249c55878SDavid Wu * struct rockchip_mux_recalced_data: represent a pin iomux data. 28349c55878SDavid Wu * @bank_num: bank number. 28449c55878SDavid Wu * @pin: index at register or used to calc index. 28549c55878SDavid Wu * @func: the min pin. 28649c55878SDavid Wu * @route_offset: the max pin. 28749c55878SDavid Wu * @route_val: the register offset. 28849c55878SDavid Wu */ 28949c55878SDavid Wu struct rockchip_mux_route_data { 29049c55878SDavid Wu u8 bank_num; 29149c55878SDavid Wu u8 pin; 29249c55878SDavid Wu u8 func; 29349c55878SDavid Wu u32 route_offset; 29449c55878SDavid Wu u32 route_val; 29549c55878SDavid Wu }; 29649c55878SDavid Wu 29749c55878SDavid Wu /** 29849c55878SDavid Wu */ 29949c55878SDavid Wu struct rockchip_pin_ctrl { 30049c55878SDavid Wu struct rockchip_pin_bank *pin_banks; 30149c55878SDavid Wu u32 nr_banks; 30249c55878SDavid Wu u32 nr_pins; 30349c55878SDavid Wu char *label; 30449c55878SDavid Wu enum rockchip_pinctrl_type type; 30549c55878SDavid Wu int grf_mux_offset; 30649c55878SDavid Wu int pmu_mux_offset; 30749c55878SDavid Wu int grf_drv_offset; 30849c55878SDavid Wu int pmu_drv_offset; 30949c55878SDavid Wu struct rockchip_mux_recalced_data *iomux_recalced; 31049c55878SDavid Wu u32 niomux_recalced; 31149c55878SDavid Wu struct rockchip_mux_route_data *iomux_routes; 31249c55878SDavid Wu u32 niomux_routes; 31349c55878SDavid Wu 31449c55878SDavid Wu void (*pull_calc_reg)(struct rockchip_pin_bank *bank, 31549c55878SDavid Wu int pin_num, struct regmap **regmap, 31649c55878SDavid Wu int *reg, u8 *bit); 31749c55878SDavid Wu void (*drv_calc_reg)(struct rockchip_pin_bank *bank, 31849c55878SDavid Wu int pin_num, struct regmap **regmap, 31949c55878SDavid Wu int *reg, u8 *bit); 32049c55878SDavid Wu int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank, 32149c55878SDavid Wu int pin_num, struct regmap **regmap, 32249c55878SDavid Wu int *reg, u8 *bit); 32349c55878SDavid Wu }; 32449c55878SDavid Wu 32549c55878SDavid Wu /** 32649c55878SDavid Wu */ 32749c55878SDavid Wu struct rockchip_pinctrl_priv { 32849c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 32949c55878SDavid Wu struct regmap *regmap_base; 33049c55878SDavid Wu struct regmap *regmap_pmu; 33149c55878SDavid Wu 33249c55878SDavid Wu }; 33349c55878SDavid Wu 33449c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin) 33549c55878SDavid Wu { 33649c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 33749c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 33849c55878SDavid Wu 33949c55878SDavid Wu if (bank >= ctrl->nr_banks) { 34049c55878SDavid Wu debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks); 34149c55878SDavid Wu return -EINVAL; 34249c55878SDavid Wu } 34349c55878SDavid Wu 34449c55878SDavid Wu if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) { 34549c55878SDavid Wu debug("pin conf pin %d >= %d\n", pin, 34649c55878SDavid Wu MAX_ROCKCHIP_GPIO_PER_BANK); 34749c55878SDavid Wu return -EINVAL; 34849c55878SDavid Wu } 34949c55878SDavid Wu 35049c55878SDavid Wu return 0; 35149c55878SDavid Wu } 35249c55878SDavid Wu 35349c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = { 35449c55878SDavid Wu { 35549c55878SDavid Wu .num = 1, 35649c55878SDavid Wu .pin = 0, 35749c55878SDavid Wu .reg = 0x418, 35849c55878SDavid Wu .bit = 0, 35949c55878SDavid Wu .mask = 0x3 36049c55878SDavid Wu }, { 36149c55878SDavid Wu .num = 1, 36249c55878SDavid Wu .pin = 1, 36349c55878SDavid Wu .reg = 0x418, 36449c55878SDavid Wu .bit = 2, 36549c55878SDavid Wu .mask = 0x3 36649c55878SDavid Wu }, { 36749c55878SDavid Wu .num = 1, 36849c55878SDavid Wu .pin = 2, 36949c55878SDavid Wu .reg = 0x418, 37049c55878SDavid Wu .bit = 4, 37149c55878SDavid Wu .mask = 0x3 37249c55878SDavid Wu }, { 37349c55878SDavid Wu .num = 1, 37449c55878SDavid Wu .pin = 3, 37549c55878SDavid Wu .reg = 0x418, 37649c55878SDavid Wu .bit = 6, 37749c55878SDavid Wu .mask = 0x3 37849c55878SDavid Wu }, { 37949c55878SDavid Wu .num = 1, 38049c55878SDavid Wu .pin = 4, 38149c55878SDavid Wu .reg = 0x418, 38249c55878SDavid Wu .bit = 8, 38349c55878SDavid Wu .mask = 0x3 38449c55878SDavid Wu }, { 38549c55878SDavid Wu .num = 1, 38649c55878SDavid Wu .pin = 5, 38749c55878SDavid Wu .reg = 0x418, 38849c55878SDavid Wu .bit = 10, 38949c55878SDavid Wu .mask = 0x3 39049c55878SDavid Wu }, { 39149c55878SDavid Wu .num = 1, 39249c55878SDavid Wu .pin = 6, 39349c55878SDavid Wu .reg = 0x418, 39449c55878SDavid Wu .bit = 12, 39549c55878SDavid Wu .mask = 0x3 39649c55878SDavid Wu }, { 39749c55878SDavid Wu .num = 1, 39849c55878SDavid Wu .pin = 7, 39949c55878SDavid Wu .reg = 0x418, 40049c55878SDavid Wu .bit = 14, 40149c55878SDavid Wu .mask = 0x3 40249c55878SDavid Wu }, { 40349c55878SDavid Wu .num = 1, 40449c55878SDavid Wu .pin = 8, 40549c55878SDavid Wu .reg = 0x41c, 40649c55878SDavid Wu .bit = 0, 40749c55878SDavid Wu .mask = 0x3 40849c55878SDavid Wu }, { 40949c55878SDavid Wu .num = 1, 41049c55878SDavid Wu .pin = 9, 41149c55878SDavid Wu .reg = 0x41c, 41249c55878SDavid Wu .bit = 2, 41349c55878SDavid Wu .mask = 0x3 41449c55878SDavid Wu }, 41549c55878SDavid Wu }; 41649c55878SDavid Wu 41749c55878SDavid Wu static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { 41849c55878SDavid Wu { 41949c55878SDavid Wu .num = 2, 42049c55878SDavid Wu .pin = 20, 42149c55878SDavid Wu .reg = 0xe8, 42249c55878SDavid Wu .bit = 0, 42349c55878SDavid Wu .mask = 0x7 42449c55878SDavid Wu }, { 42549c55878SDavid Wu .num = 2, 42649c55878SDavid Wu .pin = 21, 42749c55878SDavid Wu .reg = 0xe8, 42849c55878SDavid Wu .bit = 4, 42949c55878SDavid Wu .mask = 0x7 43049c55878SDavid Wu }, { 43149c55878SDavid Wu .num = 2, 43249c55878SDavid Wu .pin = 22, 43349c55878SDavid Wu .reg = 0xe8, 43449c55878SDavid Wu .bit = 8, 43549c55878SDavid Wu .mask = 0x7 43649c55878SDavid Wu }, { 43749c55878SDavid Wu .num = 2, 43849c55878SDavid Wu .pin = 23, 43949c55878SDavid Wu .reg = 0xe8, 44049c55878SDavid Wu .bit = 12, 44149c55878SDavid Wu .mask = 0x7 44249c55878SDavid Wu }, { 44349c55878SDavid Wu .num = 2, 44449c55878SDavid Wu .pin = 24, 44549c55878SDavid Wu .reg = 0xd4, 44649c55878SDavid Wu .bit = 12, 44749c55878SDavid Wu .mask = 0x7 44849c55878SDavid Wu }, 44949c55878SDavid Wu }; 45049c55878SDavid Wu 451b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { 452b3077611SDavid Wu { 453b3077611SDavid Wu .num = 1, 454b3077611SDavid Wu .pin = 14, 455b3077611SDavid Wu .reg = 0x28, 456b3077611SDavid Wu .bit = 12, 457b3077611SDavid Wu .mask = 0x7 458b3077611SDavid Wu }, { 459b3077611SDavid Wu .num = 1, 460b3077611SDavid Wu .pin = 15, 461b3077611SDavid Wu .reg = 0x2c, 462b3077611SDavid Wu .bit = 0, 463b3077611SDavid Wu .mask = 0x3 464b3077611SDavid Wu }, { 465b3077611SDavid Wu .num = 1, 466b3077611SDavid Wu .pin = 18, 467b3077611SDavid Wu .reg = 0x30, 468b3077611SDavid Wu .bit = 4, 469b3077611SDavid Wu .mask = 0x7 470b3077611SDavid Wu }, { 471b3077611SDavid Wu .num = 1, 472b3077611SDavid Wu .pin = 19, 473b3077611SDavid Wu .reg = 0x30, 474b3077611SDavid Wu .bit = 8, 475b3077611SDavid Wu .mask = 0x7 476b3077611SDavid Wu }, { 477b3077611SDavid Wu .num = 1, 478b3077611SDavid Wu .pin = 20, 479b3077611SDavid Wu .reg = 0x30, 480b3077611SDavid Wu .bit = 12, 481b3077611SDavid Wu .mask = 0x7 482b3077611SDavid Wu }, { 483b3077611SDavid Wu .num = 1, 484b3077611SDavid Wu .pin = 21, 485b3077611SDavid Wu .reg = 0x34, 486b3077611SDavid Wu .bit = 0, 487b3077611SDavid Wu .mask = 0x7 488b3077611SDavid Wu }, { 489b3077611SDavid Wu .num = 1, 490b3077611SDavid Wu .pin = 22, 491b3077611SDavid Wu .reg = 0x34, 492b3077611SDavid Wu .bit = 4, 493b3077611SDavid Wu .mask = 0x7 494b3077611SDavid Wu }, { 495b3077611SDavid Wu .num = 1, 496b3077611SDavid Wu .pin = 23, 497b3077611SDavid Wu .reg = 0x34, 498b3077611SDavid Wu .bit = 8, 499b3077611SDavid Wu .mask = 0x7 500b3077611SDavid Wu }, { 501b3077611SDavid Wu .num = 3, 502b3077611SDavid Wu .pin = 12, 503b3077611SDavid Wu .reg = 0x68, 504b3077611SDavid Wu .bit = 8, 505b3077611SDavid Wu .mask = 0x7 506b3077611SDavid Wu }, { 507b3077611SDavid Wu .num = 3, 508b3077611SDavid Wu .pin = 13, 509b3077611SDavid Wu .reg = 0x68, 510b3077611SDavid Wu .bit = 12, 511b3077611SDavid Wu .mask = 0x7 512b3077611SDavid Wu }, 513b3077611SDavid Wu }; 514b3077611SDavid Wu 51549c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = { 51649c55878SDavid Wu { 51749c55878SDavid Wu .num = 2, 51849c55878SDavid Wu .pin = 12, 51949c55878SDavid Wu .reg = 0x24, 52049c55878SDavid Wu .bit = 8, 52149c55878SDavid Wu .mask = 0x3 52249c55878SDavid Wu }, { 52349c55878SDavid Wu .num = 2, 52449c55878SDavid Wu .pin = 15, 52549c55878SDavid Wu .reg = 0x28, 52649c55878SDavid Wu .bit = 0, 52749c55878SDavid Wu .mask = 0x7 52849c55878SDavid Wu }, { 52949c55878SDavid Wu .num = 2, 53049c55878SDavid Wu .pin = 23, 53149c55878SDavid Wu .reg = 0x30, 53249c55878SDavid Wu .bit = 14, 53349c55878SDavid Wu .mask = 0x3 53449c55878SDavid Wu }, 53549c55878SDavid Wu }; 53649c55878SDavid Wu 53749c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, 53849c55878SDavid Wu int *reg, u8 *bit, int *mask) 53949c55878SDavid Wu { 54049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 54149c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 54249c55878SDavid Wu struct rockchip_mux_recalced_data *data; 54349c55878SDavid Wu int i; 54449c55878SDavid Wu 54549c55878SDavid Wu for (i = 0; i < ctrl->niomux_recalced; i++) { 54649c55878SDavid Wu data = &ctrl->iomux_recalced[i]; 54749c55878SDavid Wu if (data->num == bank->bank_num && 54849c55878SDavid Wu data->pin == pin) 54949c55878SDavid Wu break; 55049c55878SDavid Wu } 55149c55878SDavid Wu 55249c55878SDavid Wu if (i >= ctrl->niomux_recalced) 55349c55878SDavid Wu return; 55449c55878SDavid Wu 55549c55878SDavid Wu *reg = data->reg; 55649c55878SDavid Wu *mask = data->mask; 55749c55878SDavid Wu *bit = data->bit; 55849c55878SDavid Wu } 55949c55878SDavid Wu 56049c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = { 56149c55878SDavid Wu { 56249c55878SDavid Wu /* cif-d2m0 */ 56349c55878SDavid Wu .bank_num = 2, 56449c55878SDavid Wu .pin = 0, 56549c55878SDavid Wu .func = 1, 56649c55878SDavid Wu .route_offset = 0x184, 56749c55878SDavid Wu .route_val = BIT(16 + 7), 56849c55878SDavid Wu }, { 56949c55878SDavid Wu /* cif-d2m1 */ 57049c55878SDavid Wu .bank_num = 3, 57149c55878SDavid Wu .pin = 3, 57249c55878SDavid Wu .func = 3, 57349c55878SDavid Wu .route_offset = 0x184, 57449c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 57549c55878SDavid Wu }, { 57649c55878SDavid Wu /* pdm-m0 */ 57749c55878SDavid Wu .bank_num = 3, 57849c55878SDavid Wu .pin = 22, 57949c55878SDavid Wu .func = 2, 58049c55878SDavid Wu .route_offset = 0x184, 58149c55878SDavid Wu .route_val = BIT(16 + 8), 58249c55878SDavid Wu }, { 58349c55878SDavid Wu /* pdm-m1 */ 58449c55878SDavid Wu .bank_num = 2, 58549c55878SDavid Wu .pin = 22, 58649c55878SDavid Wu .func = 1, 58749c55878SDavid Wu .route_offset = 0x184, 58849c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 58949c55878SDavid Wu }, { 59049c55878SDavid Wu /* uart2-rxm0 */ 59149c55878SDavid Wu .bank_num = 1, 592793770dfSDavid Wu .pin = 27, 59349c55878SDavid Wu .func = 2, 59449c55878SDavid Wu .route_offset = 0x184, 595793770dfSDavid Wu .route_val = BIT(16 + 10), 59649c55878SDavid Wu }, { 59749c55878SDavid Wu /* uart2-rxm1 */ 59849c55878SDavid Wu .bank_num = 2, 59949c55878SDavid Wu .pin = 14, 60049c55878SDavid Wu .func = 2, 60149c55878SDavid Wu .route_offset = 0x184, 602793770dfSDavid Wu .route_val = BIT(16 + 10) | BIT(10), 60349c55878SDavid Wu }, { 60449c55878SDavid Wu /* uart3-rxm0 */ 60549c55878SDavid Wu .bank_num = 0, 60649c55878SDavid Wu .pin = 17, 60749c55878SDavid Wu .func = 2, 60849c55878SDavid Wu .route_offset = 0x184, 609793770dfSDavid Wu .route_val = BIT(16 + 9), 61049c55878SDavid Wu }, { 61149c55878SDavid Wu /* uart3-rxm1 */ 61249c55878SDavid Wu .bank_num = 1, 613793770dfSDavid Wu .pin = 15, 61449c55878SDavid Wu .func = 2, 61549c55878SDavid Wu .route_offset = 0x184, 616793770dfSDavid Wu .route_val = BIT(16 + 9) | BIT(9), 61749c55878SDavid Wu }, 61849c55878SDavid Wu }; 61949c55878SDavid Wu 620*a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = { 621*a2a3fc8fSJianqun Xu { 622*a2a3fc8fSJianqun Xu /* i2c2m0_sda */ 623*a2a3fc8fSJianqun Xu .bank_num = 3, 624*a2a3fc8fSJianqun Xu .pin = 12, 625*a2a3fc8fSJianqun Xu .func = 2, 626*a2a3fc8fSJianqun Xu .route_offset = 0x190, 627*a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3), 628*a2a3fc8fSJianqun Xu }, { 629*a2a3fc8fSJianqun Xu /* i2c2m1_sda */ 630*a2a3fc8fSJianqun Xu .bank_num = 1, 631*a2a3fc8fSJianqun Xu .pin = 13, 632*a2a3fc8fSJianqun Xu .func = 2, 633*a2a3fc8fSJianqun Xu .route_offset = 0x190, 634*a2a3fc8fSJianqun Xu .route_val = BIT(16 + 3) | BIT(3), 635*a2a3fc8fSJianqun Xu }, { 636*a2a3fc8fSJianqun Xu /* uart2_rxm0 */ 637*a2a3fc8fSJianqun Xu .bank_num = 4, 638*a2a3fc8fSJianqun Xu .pin = 3, 639*a2a3fc8fSJianqun Xu .func = 2, 640*a2a3fc8fSJianqun Xu .route_offset = 0x190, 641*a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15), 642*a2a3fc8fSJianqun Xu }, { 643*a2a3fc8fSJianqun Xu /* uart2_rxm1 */ 644*a2a3fc8fSJianqun Xu .bank_num = 2, 645*a2a3fc8fSJianqun Xu .pin = 25, 646*a2a3fc8fSJianqun Xu .func = 2, 647*a2a3fc8fSJianqun Xu .route_offset = 0x190, 648*a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15), 649*a2a3fc8fSJianqun Xu }, { 650*a2a3fc8fSJianqun Xu /* uart2_rxm2 */ 651*a2a3fc8fSJianqun Xu .bank_num = 3, 652*a2a3fc8fSJianqun Xu .pin = 4, 653*a2a3fc8fSJianqun Xu .func = 2, 654*a2a3fc8fSJianqun Xu .route_offset = 0x190, 655*a2a3fc8fSJianqun Xu .route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15), 656*a2a3fc8fSJianqun Xu }, 657*a2a3fc8fSJianqun Xu }; 658*a2a3fc8fSJianqun Xu 65949c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = { 66049c55878SDavid Wu { 66149c55878SDavid Wu /* spi-0 */ 66249c55878SDavid Wu .bank_num = 1, 66349c55878SDavid Wu .pin = 10, 66449c55878SDavid Wu .func = 1, 66549c55878SDavid Wu .route_offset = 0x144, 66649c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4), 66749c55878SDavid Wu }, { 66849c55878SDavid Wu /* spi-1 */ 66949c55878SDavid Wu .bank_num = 1, 67049c55878SDavid Wu .pin = 27, 67149c55878SDavid Wu .func = 3, 67249c55878SDavid Wu .route_offset = 0x144, 67349c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3), 67449c55878SDavid Wu }, { 67549c55878SDavid Wu /* spi-2 */ 67649c55878SDavid Wu .bank_num = 0, 67749c55878SDavid Wu .pin = 13, 67849c55878SDavid Wu .func = 2, 67949c55878SDavid Wu .route_offset = 0x144, 68049c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4), 68149c55878SDavid Wu }, { 68249c55878SDavid Wu /* i2s-0 */ 68349c55878SDavid Wu .bank_num = 1, 68449c55878SDavid Wu .pin = 5, 68549c55878SDavid Wu .func = 1, 68649c55878SDavid Wu .route_offset = 0x144, 68749c55878SDavid Wu .route_val = BIT(16 + 5), 68849c55878SDavid Wu }, { 68949c55878SDavid Wu /* i2s-1 */ 69049c55878SDavid Wu .bank_num = 0, 69149c55878SDavid Wu .pin = 14, 69249c55878SDavid Wu .func = 1, 69349c55878SDavid Wu .route_offset = 0x144, 69449c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 69549c55878SDavid Wu }, { 69649c55878SDavid Wu /* emmc-0 */ 69749c55878SDavid Wu .bank_num = 1, 69849c55878SDavid Wu .pin = 22, 69949c55878SDavid Wu .func = 2, 70049c55878SDavid Wu .route_offset = 0x144, 70149c55878SDavid Wu .route_val = BIT(16 + 6), 70249c55878SDavid Wu }, { 70349c55878SDavid Wu /* emmc-1 */ 70449c55878SDavid Wu .bank_num = 2, 70549c55878SDavid Wu .pin = 4, 70649c55878SDavid Wu .func = 2, 70749c55878SDavid Wu .route_offset = 0x144, 70849c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 70949c55878SDavid Wu }, 71049c55878SDavid Wu }; 71149c55878SDavid Wu 71249c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = { 71349c55878SDavid Wu { 71449c55878SDavid Wu /* pwm0-0 */ 71549c55878SDavid Wu .bank_num = 0, 71649c55878SDavid Wu .pin = 26, 71749c55878SDavid Wu .func = 1, 71849c55878SDavid Wu .route_offset = 0x50, 71949c55878SDavid Wu .route_val = BIT(16), 72049c55878SDavid Wu }, { 72149c55878SDavid Wu /* pwm0-1 */ 72249c55878SDavid Wu .bank_num = 3, 72349c55878SDavid Wu .pin = 21, 72449c55878SDavid Wu .func = 1, 72549c55878SDavid Wu .route_offset = 0x50, 72649c55878SDavid Wu .route_val = BIT(16) | BIT(0), 72749c55878SDavid Wu }, { 72849c55878SDavid Wu /* pwm1-0 */ 72949c55878SDavid Wu .bank_num = 0, 73049c55878SDavid Wu .pin = 27, 73149c55878SDavid Wu .func = 1, 73249c55878SDavid Wu .route_offset = 0x50, 73349c55878SDavid Wu .route_val = BIT(16 + 1), 73449c55878SDavid Wu }, { 73549c55878SDavid Wu /* pwm1-1 */ 73649c55878SDavid Wu .bank_num = 0, 73749c55878SDavid Wu .pin = 30, 73849c55878SDavid Wu .func = 2, 73949c55878SDavid Wu .route_offset = 0x50, 74049c55878SDavid Wu .route_val = BIT(16 + 1) | BIT(1), 74149c55878SDavid Wu }, { 74249c55878SDavid Wu /* pwm2-0 */ 74349c55878SDavid Wu .bank_num = 0, 74449c55878SDavid Wu .pin = 28, 74549c55878SDavid Wu .func = 1, 74649c55878SDavid Wu .route_offset = 0x50, 74749c55878SDavid Wu .route_val = BIT(16 + 2), 74849c55878SDavid Wu }, { 74949c55878SDavid Wu /* pwm2-1 */ 75049c55878SDavid Wu .bank_num = 1, 75149c55878SDavid Wu .pin = 12, 75249c55878SDavid Wu .func = 2, 75349c55878SDavid Wu .route_offset = 0x50, 75449c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 75549c55878SDavid Wu }, { 75649c55878SDavid Wu /* pwm3-0 */ 75749c55878SDavid Wu .bank_num = 3, 75849c55878SDavid Wu .pin = 26, 75949c55878SDavid Wu .func = 1, 76049c55878SDavid Wu .route_offset = 0x50, 76149c55878SDavid Wu .route_val = BIT(16 + 3), 76249c55878SDavid Wu }, { 76349c55878SDavid Wu /* pwm3-1 */ 76449c55878SDavid Wu .bank_num = 1, 76549c55878SDavid Wu .pin = 11, 76649c55878SDavid Wu .func = 2, 76749c55878SDavid Wu .route_offset = 0x50, 76849c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 76949c55878SDavid Wu }, { 77049c55878SDavid Wu /* sdio-0_d0 */ 77149c55878SDavid Wu .bank_num = 1, 77249c55878SDavid Wu .pin = 1, 77349c55878SDavid Wu .func = 1, 77449c55878SDavid Wu .route_offset = 0x50, 77549c55878SDavid Wu .route_val = BIT(16 + 4), 77649c55878SDavid Wu }, { 77749c55878SDavid Wu /* sdio-1_d0 */ 77849c55878SDavid Wu .bank_num = 3, 77949c55878SDavid Wu .pin = 2, 78049c55878SDavid Wu .func = 1, 78149c55878SDavid Wu .route_offset = 0x50, 78249c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 78349c55878SDavid Wu }, { 78449c55878SDavid Wu /* spi-0_rx */ 78549c55878SDavid Wu .bank_num = 0, 78649c55878SDavid Wu .pin = 13, 78749c55878SDavid Wu .func = 2, 78849c55878SDavid Wu .route_offset = 0x50, 78949c55878SDavid Wu .route_val = BIT(16 + 5), 79049c55878SDavid Wu }, { 79149c55878SDavid Wu /* spi-1_rx */ 79249c55878SDavid Wu .bank_num = 2, 79349c55878SDavid Wu .pin = 0, 79449c55878SDavid Wu .func = 2, 79549c55878SDavid Wu .route_offset = 0x50, 79649c55878SDavid Wu .route_val = BIT(16 + 5) | BIT(5), 79749c55878SDavid Wu }, { 79849c55878SDavid Wu /* emmc-0_cmd */ 79949c55878SDavid Wu .bank_num = 1, 80049c55878SDavid Wu .pin = 22, 80149c55878SDavid Wu .func = 2, 80249c55878SDavid Wu .route_offset = 0x50, 80349c55878SDavid Wu .route_val = BIT(16 + 7), 80449c55878SDavid Wu }, { 80549c55878SDavid Wu /* emmc-1_cmd */ 80649c55878SDavid Wu .bank_num = 2, 80749c55878SDavid Wu .pin = 4, 80849c55878SDavid Wu .func = 2, 80949c55878SDavid Wu .route_offset = 0x50, 81049c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 81149c55878SDavid Wu }, { 81249c55878SDavid Wu /* uart2-0_rx */ 81349c55878SDavid Wu .bank_num = 1, 81449c55878SDavid Wu .pin = 19, 81549c55878SDavid Wu .func = 2, 81649c55878SDavid Wu .route_offset = 0x50, 81749c55878SDavid Wu .route_val = BIT(16 + 8), 81849c55878SDavid Wu }, { 81949c55878SDavid Wu /* uart2-1_rx */ 82049c55878SDavid Wu .bank_num = 1, 82149c55878SDavid Wu .pin = 10, 82249c55878SDavid Wu .func = 2, 82349c55878SDavid Wu .route_offset = 0x50, 82449c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 82549c55878SDavid Wu }, { 82649c55878SDavid Wu /* uart1-0_rx */ 82749c55878SDavid Wu .bank_num = 1, 82849c55878SDavid Wu .pin = 10, 82949c55878SDavid Wu .func = 1, 83049c55878SDavid Wu .route_offset = 0x50, 83149c55878SDavid Wu .route_val = BIT(16 + 11), 83249c55878SDavid Wu }, { 83349c55878SDavid Wu /* uart1-1_rx */ 83449c55878SDavid Wu .bank_num = 3, 83549c55878SDavid Wu .pin = 13, 83649c55878SDavid Wu .func = 1, 83749c55878SDavid Wu .route_offset = 0x50, 83849c55878SDavid Wu .route_val = BIT(16 + 11) | BIT(11), 83949c55878SDavid Wu }, 84049c55878SDavid Wu }; 84149c55878SDavid Wu 84249c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = { 84349c55878SDavid Wu { 84449c55878SDavid Wu /* edphdmi_cecinoutt1 */ 84549c55878SDavid Wu .bank_num = 7, 84649c55878SDavid Wu .pin = 16, 84749c55878SDavid Wu .func = 2, 84849c55878SDavid Wu .route_offset = 0x264, 84949c55878SDavid Wu .route_val = BIT(16 + 12) | BIT(12), 85049c55878SDavid Wu }, { 85149c55878SDavid Wu /* edphdmi_cecinout */ 85249c55878SDavid Wu .bank_num = 7, 85349c55878SDavid Wu .pin = 23, 85449c55878SDavid Wu .func = 4, 85549c55878SDavid Wu .route_offset = 0x264, 85649c55878SDavid Wu .route_val = BIT(16 + 12), 85749c55878SDavid Wu }, 85849c55878SDavid Wu }; 85949c55878SDavid Wu 860b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = { 861b3077611SDavid Wu { 862b3077611SDavid Wu /* uart2_rxm0 */ 863b3077611SDavid Wu .bank_num = 1, 864b3077611SDavid Wu .pin = 22, 865b3077611SDavid Wu .func = 2, 866b3077611SDavid Wu .route_offset = 0x314, 867b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3), 868b3077611SDavid Wu }, { 869b3077611SDavid Wu /* uart2_rxm1 */ 870b3077611SDavid Wu .bank_num = 4, 871b3077611SDavid Wu .pin = 26, 872b3077611SDavid Wu .func = 2, 873b3077611SDavid Wu .route_offset = 0x314, 874b3077611SDavid Wu .route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2), 875b3077611SDavid Wu }, { 876b3077611SDavid Wu /* i2c3_sdam0 */ 877b3077611SDavid Wu .bank_num = 0, 878b3077611SDavid Wu .pin = 23, 879b3077611SDavid Wu .func = 2, 880b3077611SDavid Wu .route_offset = 0x314, 881b3077611SDavid Wu .route_val = BIT(16 + 4), 882b3077611SDavid Wu }, { 883b3077611SDavid Wu /* i2c3_sdam1 */ 884b3077611SDavid Wu .bank_num = 3, 885b3077611SDavid Wu .pin = 12, 886b3077611SDavid Wu .func = 2, 887b3077611SDavid Wu .route_offset = 0x314, 888b3077611SDavid Wu .route_val = BIT(16 + 4) | BIT(4), 889b3077611SDavid Wu }, 890b3077611SDavid Wu }; 891b3077611SDavid Wu 89249c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = { 89349c55878SDavid Wu { 89449c55878SDavid Wu /* uart2dbg_rxm0 */ 89549c55878SDavid Wu .bank_num = 1, 89649c55878SDavid Wu .pin = 1, 89749c55878SDavid Wu .func = 2, 89849c55878SDavid Wu .route_offset = 0x50, 89949c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1), 90049c55878SDavid Wu }, { 90149c55878SDavid Wu /* uart2dbg_rxm1 */ 90249c55878SDavid Wu .bank_num = 2, 90349c55878SDavid Wu .pin = 1, 90449c55878SDavid Wu .func = 1, 90549c55878SDavid Wu .route_offset = 0x50, 90649c55878SDavid Wu .route_val = BIT(16) | BIT(16 + 1) | BIT(0), 90749c55878SDavid Wu }, { 90849c55878SDavid Wu /* gmac-m1_rxd0 */ 90949c55878SDavid Wu .bank_num = 1, 91049c55878SDavid Wu .pin = 11, 91149c55878SDavid Wu .func = 2, 91249c55878SDavid Wu .route_offset = 0x50, 91349c55878SDavid Wu .route_val = BIT(16 + 2) | BIT(2), 91449c55878SDavid Wu }, { 91549c55878SDavid Wu /* gmac-m1-optimized_rxd3 */ 91649c55878SDavid Wu .bank_num = 1, 91749c55878SDavid Wu .pin = 14, 91849c55878SDavid Wu .func = 2, 91949c55878SDavid Wu .route_offset = 0x50, 92049c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(10), 92149c55878SDavid Wu }, { 92249c55878SDavid Wu /* pdm_sdi0m0 */ 92349c55878SDavid Wu .bank_num = 2, 92449c55878SDavid Wu .pin = 19, 92549c55878SDavid Wu .func = 2, 92649c55878SDavid Wu .route_offset = 0x50, 92749c55878SDavid Wu .route_val = BIT(16 + 3), 92849c55878SDavid Wu }, { 92949c55878SDavid Wu /* pdm_sdi0m1 */ 93049c55878SDavid Wu .bank_num = 1, 93149c55878SDavid Wu .pin = 23, 93249c55878SDavid Wu .func = 3, 93349c55878SDavid Wu .route_offset = 0x50, 93449c55878SDavid Wu .route_val = BIT(16 + 3) | BIT(3), 93549c55878SDavid Wu }, { 93649c55878SDavid Wu /* spi_rxdm2 */ 93749c55878SDavid Wu .bank_num = 3, 93849c55878SDavid Wu .pin = 2, 93949c55878SDavid Wu .func = 4, 94049c55878SDavid Wu .route_offset = 0x50, 94149c55878SDavid Wu .route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5), 94249c55878SDavid Wu }, { 94349c55878SDavid Wu /* i2s2_sdim0 */ 94449c55878SDavid Wu .bank_num = 1, 94549c55878SDavid Wu .pin = 24, 94649c55878SDavid Wu .func = 1, 94749c55878SDavid Wu .route_offset = 0x50, 94849c55878SDavid Wu .route_val = BIT(16 + 6), 94949c55878SDavid Wu }, { 95049c55878SDavid Wu /* i2s2_sdim1 */ 95149c55878SDavid Wu .bank_num = 3, 95249c55878SDavid Wu .pin = 2, 95349c55878SDavid Wu .func = 6, 95449c55878SDavid Wu .route_offset = 0x50, 95549c55878SDavid Wu .route_val = BIT(16 + 6) | BIT(6), 95649c55878SDavid Wu }, { 95749c55878SDavid Wu /* card_iom1 */ 95849c55878SDavid Wu .bank_num = 2, 95949c55878SDavid Wu .pin = 22, 96049c55878SDavid Wu .func = 3, 96149c55878SDavid Wu .route_offset = 0x50, 96249c55878SDavid Wu .route_val = BIT(16 + 7) | BIT(7), 96349c55878SDavid Wu }, { 96449c55878SDavid Wu /* tsp_d5m1 */ 96549c55878SDavid Wu .bank_num = 2, 96649c55878SDavid Wu .pin = 16, 96749c55878SDavid Wu .func = 3, 96849c55878SDavid Wu .route_offset = 0x50, 96949c55878SDavid Wu .route_val = BIT(16 + 8) | BIT(8), 97049c55878SDavid Wu }, { 97149c55878SDavid Wu /* cif_data5m1 */ 97249c55878SDavid Wu .bank_num = 2, 97349c55878SDavid Wu .pin = 16, 97449c55878SDavid Wu .func = 4, 97549c55878SDavid Wu .route_offset = 0x50, 97649c55878SDavid Wu .route_val = BIT(16 + 9) | BIT(9), 97749c55878SDavid Wu }, 97849c55878SDavid Wu }; 97949c55878SDavid Wu 98049c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = { 98149c55878SDavid Wu { 98249c55878SDavid Wu /* uart2dbga_rx */ 98349c55878SDavid Wu .bank_num = 4, 98449c55878SDavid Wu .pin = 8, 98549c55878SDavid Wu .func = 2, 98649c55878SDavid Wu .route_offset = 0xe21c, 98749c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11), 98849c55878SDavid Wu }, { 98949c55878SDavid Wu /* uart2dbgb_rx */ 99049c55878SDavid Wu .bank_num = 4, 99149c55878SDavid Wu .pin = 16, 99249c55878SDavid Wu .func = 2, 99349c55878SDavid Wu .route_offset = 0xe21c, 99449c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10), 99549c55878SDavid Wu }, { 99649c55878SDavid Wu /* uart2dbgc_rx */ 99749c55878SDavid Wu .bank_num = 4, 99849c55878SDavid Wu .pin = 19, 99949c55878SDavid Wu .func = 1, 100049c55878SDavid Wu .route_offset = 0xe21c, 100149c55878SDavid Wu .route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11), 100249c55878SDavid Wu }, { 100349c55878SDavid Wu /* pcie_clkreqn */ 100449c55878SDavid Wu .bank_num = 2, 100549c55878SDavid Wu .pin = 26, 100649c55878SDavid Wu .func = 2, 100749c55878SDavid Wu .route_offset = 0xe21c, 100849c55878SDavid Wu .route_val = BIT(16 + 14), 100949c55878SDavid Wu }, { 101049c55878SDavid Wu /* pcie_clkreqnb */ 101149c55878SDavid Wu .bank_num = 4, 101249c55878SDavid Wu .pin = 24, 101349c55878SDavid Wu .func = 1, 101449c55878SDavid Wu .route_offset = 0xe21c, 101549c55878SDavid Wu .route_val = BIT(16 + 14) | BIT(14), 101649c55878SDavid Wu }, 101749c55878SDavid Wu }; 101849c55878SDavid Wu 101949c55878SDavid Wu static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, 102049c55878SDavid Wu int mux, u32 *reg, u32 *value) 102149c55878SDavid Wu { 102249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 102349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 102449c55878SDavid Wu struct rockchip_mux_route_data *data; 102549c55878SDavid Wu int i; 102649c55878SDavid Wu 102749c55878SDavid Wu for (i = 0; i < ctrl->niomux_routes; i++) { 102849c55878SDavid Wu data = &ctrl->iomux_routes[i]; 102949c55878SDavid Wu if ((data->bank_num == bank->bank_num) && 103049c55878SDavid Wu (data->pin == pin) && (data->func == mux)) 103149c55878SDavid Wu break; 103249c55878SDavid Wu } 103349c55878SDavid Wu 103449c55878SDavid Wu if (i >= ctrl->niomux_routes) 103549c55878SDavid Wu return false; 103649c55878SDavid Wu 103749c55878SDavid Wu *reg = data->route_offset; 103849c55878SDavid Wu *value = data->route_val; 103949c55878SDavid Wu 104049c55878SDavid Wu return true; 104149c55878SDavid Wu } 104249c55878SDavid Wu 104349c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) 104449c55878SDavid Wu { 104549c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 104649c55878SDavid Wu int iomux_num = (pin / 8); 104749c55878SDavid Wu struct regmap *regmap; 104849c55878SDavid Wu unsigned int val; 104949c55878SDavid Wu int reg, ret, mask, mux_type; 105049c55878SDavid Wu u8 bit; 105149c55878SDavid Wu 105249c55878SDavid Wu if (iomux_num > 3) 105349c55878SDavid Wu return -EINVAL; 105449c55878SDavid Wu 105549c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 105649c55878SDavid Wu debug("pin %d is unrouted\n", pin); 105749c55878SDavid Wu return -EINVAL; 105849c55878SDavid Wu } 105949c55878SDavid Wu 106049c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 106149c55878SDavid Wu return RK_FUNC_GPIO; 106249c55878SDavid Wu 106349c55878SDavid Wu regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 106449c55878SDavid Wu ? priv->regmap_pmu : priv->regmap_base; 106549c55878SDavid Wu 106649c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 106749c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 106849c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 106949c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 107049c55878SDavid Wu if ((pin % 8) >= 4) 107149c55878SDavid Wu reg += 0x4; 107249c55878SDavid Wu bit = (pin % 4) * 4; 107349c55878SDavid Wu mask = 0xf; 107449c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 107549c55878SDavid Wu if ((pin % 8) >= 5) 107649c55878SDavid Wu reg += 0x4; 107749c55878SDavid Wu bit = (pin % 8 % 5) * 3; 107849c55878SDavid Wu mask = 0x7; 107949c55878SDavid Wu } else { 108049c55878SDavid Wu bit = (pin % 8) * 2; 108149c55878SDavid Wu mask = 0x3; 108249c55878SDavid Wu } 108349c55878SDavid Wu 108449c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 108549c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 108649c55878SDavid Wu 108749c55878SDavid Wu ret = regmap_read(regmap, reg, &val); 108849c55878SDavid Wu if (ret) 108949c55878SDavid Wu return ret; 109049c55878SDavid Wu 109149c55878SDavid Wu return ((val >> bit) & mask); 109249c55878SDavid Wu } 109349c55878SDavid Wu 109449c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, 109549c55878SDavid Wu int index) 109649c55878SDavid Wu { struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 109749c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 109849c55878SDavid Wu 109949c55878SDavid Wu return rockchip_get_mux(&ctrl->pin_banks[banknum], index); 110049c55878SDavid Wu } 110149c55878SDavid Wu 110249c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank, 110349c55878SDavid Wu int pin, int mux) 110449c55878SDavid Wu { 110549c55878SDavid Wu int iomux_num = (pin / 8); 110649c55878SDavid Wu 110749c55878SDavid Wu if (iomux_num > 3) 110849c55878SDavid Wu return -EINVAL; 110949c55878SDavid Wu 111049c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 111149c55878SDavid Wu debug("pin %d is unrouted\n", pin); 111249c55878SDavid Wu return -EINVAL; 111349c55878SDavid Wu } 111449c55878SDavid Wu 111549c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 111649c55878SDavid Wu if (mux != IOMUX_GPIO_ONLY) { 111749c55878SDavid Wu debug("pin %d only supports a gpio mux\n", pin); 111849c55878SDavid Wu return -ENOTSUPP; 111949c55878SDavid Wu } 112049c55878SDavid Wu } 112149c55878SDavid Wu 112249c55878SDavid Wu return 0; 112349c55878SDavid Wu } 112449c55878SDavid Wu 112549c55878SDavid Wu /* 112649c55878SDavid Wu * Set a new mux function for a pin. 112749c55878SDavid Wu * 112849c55878SDavid Wu * The register is divided into the upper and lower 16 bit. When changing 112949c55878SDavid Wu * a value, the previous register value is not read and changed. Instead 113049c55878SDavid Wu * it seems the changed bits are marked in the upper 16 bit, while the 113149c55878SDavid Wu * changed value gets set in the same offset in the lower 16 bit. 113249c55878SDavid Wu * All pin settings seem to be 2 bit wide in both the upper and lower 113349c55878SDavid Wu * parts. 113449c55878SDavid Wu * @bank: pin bank to change 113549c55878SDavid Wu * @pin: pin to change 113649c55878SDavid Wu * @mux: new mux function to set 113749c55878SDavid Wu */ 113849c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) 113949c55878SDavid Wu { 114049c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 114149c55878SDavid Wu int iomux_num = (pin / 8); 114249c55878SDavid Wu struct regmap *regmap; 114349c55878SDavid Wu int reg, ret, mask, mux_type; 114449c55878SDavid Wu u8 bit; 114549c55878SDavid Wu u32 data, route_reg, route_val; 114649c55878SDavid Wu 114749c55878SDavid Wu ret = rockchip_verify_mux(bank, pin, mux); 114849c55878SDavid Wu if (ret < 0) 114949c55878SDavid Wu return ret; 115049c55878SDavid Wu 115149c55878SDavid Wu if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) 115249c55878SDavid Wu return 0; 115349c55878SDavid Wu 115449c55878SDavid Wu debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); 115549c55878SDavid Wu 115649c55878SDavid Wu regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) 115749c55878SDavid Wu ? priv->regmap_pmu : priv->regmap_base; 115849c55878SDavid Wu 115949c55878SDavid Wu /* get basic quadrupel of mux registers and the correct reg inside */ 116049c55878SDavid Wu mux_type = bank->iomux[iomux_num].type; 116149c55878SDavid Wu reg = bank->iomux[iomux_num].offset; 116249c55878SDavid Wu if (mux_type & IOMUX_WIDTH_4BIT) { 116349c55878SDavid Wu if ((pin % 8) >= 4) 116449c55878SDavid Wu reg += 0x4; 116549c55878SDavid Wu bit = (pin % 4) * 4; 116649c55878SDavid Wu mask = 0xf; 116749c55878SDavid Wu } else if (mux_type & IOMUX_WIDTH_3BIT) { 116849c55878SDavid Wu if ((pin % 8) >= 5) 116949c55878SDavid Wu reg += 0x4; 117049c55878SDavid Wu bit = (pin % 8 % 5) * 3; 117149c55878SDavid Wu mask = 0x7; 117249c55878SDavid Wu } else { 117349c55878SDavid Wu bit = (pin % 8) * 2; 117449c55878SDavid Wu mask = 0x3; 117549c55878SDavid Wu } 117649c55878SDavid Wu 117749c55878SDavid Wu if (bank->recalced_mask & BIT(pin)) 117849c55878SDavid Wu rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 117949c55878SDavid Wu 118049c55878SDavid Wu if (bank->route_mask & BIT(pin)) { 118149c55878SDavid Wu if (rockchip_get_mux_route(bank, pin, mux, &route_reg, 118249c55878SDavid Wu &route_val)) { 118349c55878SDavid Wu ret = regmap_write(regmap, route_reg, route_val); 118449c55878SDavid Wu if (ret) 118549c55878SDavid Wu return ret; 118649c55878SDavid Wu } 118749c55878SDavid Wu } 118849c55878SDavid Wu 11894bafc2daSDavid Wu if (mux_type & IOMUX_WRITABLE_32BIT) { 11908bf1bc66SDavid Wu regmap_read(regmap, reg, &data); 11914bafc2daSDavid Wu data &= ~(mask << bit); 11924bafc2daSDavid Wu } else { 119349c55878SDavid Wu data = (mask << (bit + 16)); 11944bafc2daSDavid Wu } 11958bf1bc66SDavid Wu 119649c55878SDavid Wu data |= (mux & mask) << bit; 119749c55878SDavid Wu ret = regmap_write(regmap, reg, data); 119849c55878SDavid Wu 119949c55878SDavid Wu return ret; 120049c55878SDavid Wu } 120149c55878SDavid Wu 120249c55878SDavid Wu #define PX30_PULL_PMU_OFFSET 0x10 120349c55878SDavid Wu #define PX30_PULL_GRF_OFFSET 0x60 120449c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN 2 120549c55878SDavid Wu #define PX30_PULL_PINS_PER_REG 8 120649c55878SDavid Wu #define PX30_PULL_BANK_STRIDE 16 120749c55878SDavid Wu 120849c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 120949c55878SDavid Wu int pin_num, struct regmap **regmap, 121049c55878SDavid Wu int *reg, u8 *bit) 121149c55878SDavid Wu { 121249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 121349c55878SDavid Wu 121449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 121549c55878SDavid Wu if (bank->bank_num == 0) { 121649c55878SDavid Wu *regmap = priv->regmap_pmu; 121749c55878SDavid Wu *reg = PX30_PULL_PMU_OFFSET; 121849c55878SDavid Wu } else { 121949c55878SDavid Wu *regmap = priv->regmap_base; 122049c55878SDavid Wu *reg = PX30_PULL_GRF_OFFSET; 122149c55878SDavid Wu 122249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 122349c55878SDavid Wu *reg -= 0x10; 122449c55878SDavid Wu *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; 122549c55878SDavid Wu } 122649c55878SDavid Wu 122749c55878SDavid Wu *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4); 122849c55878SDavid Wu *bit = (pin_num % PX30_PULL_PINS_PER_REG); 122949c55878SDavid Wu *bit *= PX30_PULL_BITS_PER_PIN; 123049c55878SDavid Wu } 123149c55878SDavid Wu 123249c55878SDavid Wu #define PX30_DRV_PMU_OFFSET 0x20 123349c55878SDavid Wu #define PX30_DRV_GRF_OFFSET 0xf0 123449c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN 2 123549c55878SDavid Wu #define PX30_DRV_PINS_PER_REG 8 123649c55878SDavid Wu #define PX30_DRV_BANK_STRIDE 16 123749c55878SDavid Wu 123849c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 123949c55878SDavid Wu int pin_num, struct regmap **regmap, 124049c55878SDavid Wu int *reg, u8 *bit) 124149c55878SDavid Wu { 124249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 124349c55878SDavid Wu 124449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 124549c55878SDavid Wu if (bank->bank_num == 0) { 124649c55878SDavid Wu *regmap = priv->regmap_pmu; 124749c55878SDavid Wu *reg = PX30_DRV_PMU_OFFSET; 124849c55878SDavid Wu } else { 124949c55878SDavid Wu *regmap = priv->regmap_base; 125049c55878SDavid Wu *reg = PX30_DRV_GRF_OFFSET; 125149c55878SDavid Wu 125249c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 125349c55878SDavid Wu *reg -= 0x10; 125449c55878SDavid Wu *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; 125549c55878SDavid Wu } 125649c55878SDavid Wu 125749c55878SDavid Wu *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4); 125849c55878SDavid Wu *bit = (pin_num % PX30_DRV_PINS_PER_REG); 125949c55878SDavid Wu *bit *= PX30_DRV_BITS_PER_PIN; 126049c55878SDavid Wu } 126149c55878SDavid Wu 126249c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET 0x38 126349c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET 0xc0 126449c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG 16 126549c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE 16 126649c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG 8 126749c55878SDavid Wu 126849c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 126949c55878SDavid Wu int pin_num, 127049c55878SDavid Wu struct regmap **regmap, 127149c55878SDavid Wu int *reg, u8 *bit) 127249c55878SDavid Wu { 127349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 127449c55878SDavid Wu int pins_per_reg; 127549c55878SDavid Wu 127649c55878SDavid Wu if (bank->bank_num == 0) { 127749c55878SDavid Wu *regmap = priv->regmap_pmu; 127849c55878SDavid Wu *reg = PX30_SCHMITT_PMU_OFFSET; 127949c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 128049c55878SDavid Wu } else { 128149c55878SDavid Wu *regmap = priv->regmap_base; 128249c55878SDavid Wu *reg = PX30_SCHMITT_GRF_OFFSET; 128349c55878SDavid Wu pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 128449c55878SDavid Wu *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE; 128549c55878SDavid Wu } 128649c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 128749c55878SDavid Wu *bit = pin_num % pins_per_reg; 128849c55878SDavid Wu 128949c55878SDavid Wu return 0; 129049c55878SDavid Wu } 129149c55878SDavid Wu 129249c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET 0x10 129349c55878SDavid Wu #define RV1108_PULL_OFFSET 0x110 129449c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG 8 129549c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN 2 129649c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE 16 129749c55878SDavid Wu 129849c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 129949c55878SDavid Wu int pin_num, struct regmap **regmap, 130049c55878SDavid Wu int *reg, u8 *bit) 130149c55878SDavid Wu { 130249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 130349c55878SDavid Wu 130449c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 130549c55878SDavid Wu if (bank->bank_num == 0) { 130649c55878SDavid Wu *regmap = priv->regmap_pmu; 130749c55878SDavid Wu *reg = RV1108_PULL_PMU_OFFSET; 130849c55878SDavid Wu } else { 130949c55878SDavid Wu *reg = RV1108_PULL_OFFSET; 131049c55878SDavid Wu *regmap = priv->regmap_base; 131149c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 131249c55878SDavid Wu *reg -= 0x10; 131349c55878SDavid Wu *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE; 131449c55878SDavid Wu } 131549c55878SDavid Wu 131649c55878SDavid Wu *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4); 131749c55878SDavid Wu *bit = (pin_num % RV1108_PULL_PINS_PER_REG); 131849c55878SDavid Wu *bit *= RV1108_PULL_BITS_PER_PIN; 131949c55878SDavid Wu } 132049c55878SDavid Wu 132149c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET 0x20 132249c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET 0x210 132349c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN 2 132449c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG 8 132549c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE 16 132649c55878SDavid Wu 132749c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 132849c55878SDavid Wu int pin_num, struct regmap **regmap, 132949c55878SDavid Wu int *reg, u8 *bit) 133049c55878SDavid Wu { 133149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 133249c55878SDavid Wu 133349c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 133449c55878SDavid Wu if (bank->bank_num == 0) { 133549c55878SDavid Wu *regmap = priv->regmap_pmu; 133649c55878SDavid Wu *reg = RV1108_DRV_PMU_OFFSET; 133749c55878SDavid Wu } else { 133849c55878SDavid Wu *regmap = priv->regmap_base; 133949c55878SDavid Wu *reg = RV1108_DRV_GRF_OFFSET; 134049c55878SDavid Wu 134149c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 134249c55878SDavid Wu *reg -= 0x10; 134349c55878SDavid Wu *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE; 134449c55878SDavid Wu } 134549c55878SDavid Wu 134649c55878SDavid Wu *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4); 134749c55878SDavid Wu *bit = pin_num % RV1108_DRV_PINS_PER_REG; 134849c55878SDavid Wu *bit *= RV1108_DRV_BITS_PER_PIN; 134949c55878SDavid Wu } 135049c55878SDavid Wu 135149c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET 0x30 135249c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET 0x388 135349c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE 8 135449c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG 16 135549c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG 8 135649c55878SDavid Wu 135749c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 135849c55878SDavid Wu int pin_num, 135949c55878SDavid Wu struct regmap **regmap, 136049c55878SDavid Wu int *reg, u8 *bit) 136149c55878SDavid Wu { 136249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 136349c55878SDavid Wu int pins_per_reg; 136449c55878SDavid Wu 136549c55878SDavid Wu if (bank->bank_num == 0) { 136649c55878SDavid Wu *regmap = priv->regmap_pmu; 136749c55878SDavid Wu *reg = RV1108_SCHMITT_PMU_OFFSET; 136849c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG; 136949c55878SDavid Wu } else { 137049c55878SDavid Wu *regmap = priv->regmap_base; 137149c55878SDavid Wu *reg = RV1108_SCHMITT_GRF_OFFSET; 137249c55878SDavid Wu pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG; 137349c55878SDavid Wu *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE; 137449c55878SDavid Wu } 137549c55878SDavid Wu *reg += ((pin_num / pins_per_reg) * 4); 137649c55878SDavid Wu *bit = pin_num % pins_per_reg; 137749c55878SDavid Wu 137849c55878SDavid Wu return 0; 137949c55878SDavid Wu } 138049c55878SDavid Wu 1381*a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET 0x10 1382*a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET 0x80 1383*a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG 8 1384*a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN 2 1385*a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE 16 1386*a2a3fc8fSJianqun Xu 1387*a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1388*a2a3fc8fSJianqun Xu int pin_num, 1389*a2a3fc8fSJianqun Xu struct regmap **regmap, 1390*a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1391*a2a3fc8fSJianqun Xu { 1392*a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1393*a2a3fc8fSJianqun Xu 1394*a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1395*a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1396*a2a3fc8fSJianqun Xu *reg = RK1808_PULL_PMU_OFFSET; 1397*a2a3fc8fSJianqun Xu } else { 1398*a2a3fc8fSJianqun Xu *reg = RK1808_PULL_GRF_OFFSET; 1399*a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1400*a2a3fc8fSJianqun Xu } 1401*a2a3fc8fSJianqun Xu 1402*a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4); 1403*a2a3fc8fSJianqun Xu *bit = (pin_num % RK1808_PULL_PINS_PER_REG); 1404*a2a3fc8fSJianqun Xu *bit *= RK1808_PULL_BITS_PER_PIN; 1405*a2a3fc8fSJianqun Xu } 1406*a2a3fc8fSJianqun Xu 1407*a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET 0x20 1408*a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET 0x140 1409*a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN 2 1410*a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG 8 1411*a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE 16 1412*a2a3fc8fSJianqun Xu 1413*a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1414*a2a3fc8fSJianqun Xu int pin_num, 1415*a2a3fc8fSJianqun Xu struct regmap **regmap, 1416*a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1417*a2a3fc8fSJianqun Xu { 1418*a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1419*a2a3fc8fSJianqun Xu 1420*a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1421*a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1422*a2a3fc8fSJianqun Xu *reg = RK1808_DRV_PMU_OFFSET; 1423*a2a3fc8fSJianqun Xu } else { 1424*a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1425*a2a3fc8fSJianqun Xu *reg = RK1808_DRV_GRF_OFFSET; 1426*a2a3fc8fSJianqun Xu } 1427*a2a3fc8fSJianqun Xu 1428*a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4); 1429*a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_DRV_PINS_PER_REG; 1430*a2a3fc8fSJianqun Xu *bit *= RK1808_DRV_BITS_PER_PIN; 1431*a2a3fc8fSJianqun Xu } 1432*a2a3fc8fSJianqun Xu 1433*a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET 0x0040 1434*a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET 0x0100 1435*a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE 16 1436*a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG 8 1437*a2a3fc8fSJianqun Xu 1438*a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 1439*a2a3fc8fSJianqun Xu int pin_num, 1440*a2a3fc8fSJianqun Xu struct regmap **regmap, 1441*a2a3fc8fSJianqun Xu int *reg, u8 *bit) 1442*a2a3fc8fSJianqun Xu { 1443*a2a3fc8fSJianqun Xu struct rockchip_pinctrl_priv *priv = bank->priv; 1444*a2a3fc8fSJianqun Xu 1445*a2a3fc8fSJianqun Xu if (bank->bank_num == 0) { 1446*a2a3fc8fSJianqun Xu *regmap = priv->regmap_pmu; 1447*a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_PMU_OFFSET; 1448*a2a3fc8fSJianqun Xu } else { 1449*a2a3fc8fSJianqun Xu *regmap = priv->regmap_base; 1450*a2a3fc8fSJianqun Xu *reg = RK1808_SCHMITT_GRF_OFFSET; 1451*a2a3fc8fSJianqun Xu *reg += (bank->bank_num - 1) * RK1808_SCHMITT_BANK_STRIDE; 1452*a2a3fc8fSJianqun Xu } 1453*a2a3fc8fSJianqun Xu *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4); 1454*a2a3fc8fSJianqun Xu *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG; 1455*a2a3fc8fSJianqun Xu 1456*a2a3fc8fSJianqun Xu return 0; 1457*a2a3fc8fSJianqun Xu } 1458*a2a3fc8fSJianqun Xu 145949c55878SDavid Wu #define RK2928_PULL_OFFSET 0x118 146049c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG 16 146149c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE 8 146249c55878SDavid Wu 146349c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 146449c55878SDavid Wu int pin_num, struct regmap **regmap, 146549c55878SDavid Wu int *reg, u8 *bit) 146649c55878SDavid Wu { 146749c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 146849c55878SDavid Wu 146949c55878SDavid Wu *regmap = priv->regmap_base; 147049c55878SDavid Wu *reg = RK2928_PULL_OFFSET; 147149c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 147249c55878SDavid Wu *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; 147349c55878SDavid Wu 147449c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 147549c55878SDavid Wu }; 147649c55878SDavid Wu 147749c55878SDavid Wu #define RK3128_PULL_OFFSET 0x118 147849c55878SDavid Wu 147949c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 148049c55878SDavid Wu int pin_num, struct regmap **regmap, 148149c55878SDavid Wu int *reg, u8 *bit) 148249c55878SDavid Wu { 148349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 148449c55878SDavid Wu 148549c55878SDavid Wu *regmap = priv->regmap_base; 148649c55878SDavid Wu *reg = RK3128_PULL_OFFSET; 148749c55878SDavid Wu *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 148849c55878SDavid Wu *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4); 148949c55878SDavid Wu 149049c55878SDavid Wu *bit = pin_num % RK2928_PULL_PINS_PER_REG; 149149c55878SDavid Wu } 149249c55878SDavid Wu 149349c55878SDavid Wu #define RK3188_PULL_OFFSET 0x164 149449c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN 2 149549c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG 8 149649c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE 16 149749c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET 0x64 149849c55878SDavid Wu 149949c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 150049c55878SDavid Wu int pin_num, struct regmap **regmap, 150149c55878SDavid Wu int *reg, u8 *bit) 150249c55878SDavid Wu { 150349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 150449c55878SDavid Wu 150549c55878SDavid Wu /* The first 12 pins of the first bank are located elsewhere */ 150649c55878SDavid Wu if (bank->bank_num == 0 && pin_num < 12) { 150749c55878SDavid Wu *regmap = priv->regmap_pmu; 150849c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 150949c55878SDavid Wu 151049c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 151149c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 151249c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 151349c55878SDavid Wu } else { 151449c55878SDavid Wu *regmap = priv->regmap_base; 151549c55878SDavid Wu *reg = RK3188_PULL_OFFSET; 151649c55878SDavid Wu 151749c55878SDavid Wu /* correct the offset, as it is the 2nd pull register */ 151849c55878SDavid Wu *reg -= 4; 151949c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 152049c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 152149c55878SDavid Wu 152249c55878SDavid Wu /* 152349c55878SDavid Wu * The bits in these registers have an inverse ordering 152449c55878SDavid Wu * with the lowest pin being in bits 15:14 and the highest 152549c55878SDavid Wu * pin in bits 1:0 152649c55878SDavid Wu */ 152749c55878SDavid Wu *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); 152849c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 152949c55878SDavid Wu } 153049c55878SDavid Wu } 153149c55878SDavid Wu 153249c55878SDavid Wu #define RK3288_PULL_OFFSET 0x140 153349c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 153449c55878SDavid Wu int pin_num, struct regmap **regmap, 153549c55878SDavid Wu int *reg, u8 *bit) 153649c55878SDavid Wu { 153749c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 153849c55878SDavid Wu 153949c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 154049c55878SDavid Wu if (bank->bank_num == 0) { 154149c55878SDavid Wu *regmap = priv->regmap_pmu; 154249c55878SDavid Wu *reg = RK3188_PULL_PMU_OFFSET; 154349c55878SDavid Wu 154449c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 154549c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 154649c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 154749c55878SDavid Wu } else { 154849c55878SDavid Wu *regmap = priv->regmap_base; 154949c55878SDavid Wu *reg = RK3288_PULL_OFFSET; 155049c55878SDavid Wu 155149c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 155249c55878SDavid Wu *reg -= 0x10; 155349c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 155449c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 155549c55878SDavid Wu 155649c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 155749c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 155849c55878SDavid Wu } 155949c55878SDavid Wu } 156049c55878SDavid Wu 156149c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET 0x70 156249c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET 0x1c0 156349c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN 2 156449c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG 8 156549c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE 16 156649c55878SDavid Wu 156749c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 156849c55878SDavid Wu int pin_num, struct regmap **regmap, 156949c55878SDavid Wu int *reg, u8 *bit) 157049c55878SDavid Wu { 157149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 157249c55878SDavid Wu 157349c55878SDavid Wu /* The first 24 pins of the first bank are located in PMU */ 157449c55878SDavid Wu if (bank->bank_num == 0) { 157549c55878SDavid Wu *regmap = priv->regmap_pmu; 157649c55878SDavid Wu *reg = RK3288_DRV_PMU_OFFSET; 157749c55878SDavid Wu 157849c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 157949c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 158049c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 158149c55878SDavid Wu } else { 158249c55878SDavid Wu *regmap = priv->regmap_base; 158349c55878SDavid Wu *reg = RK3288_DRV_GRF_OFFSET; 158449c55878SDavid Wu 158549c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 158649c55878SDavid Wu *reg -= 0x10; 158749c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 158849c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 158949c55878SDavid Wu 159049c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 159149c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 159249c55878SDavid Wu } 159349c55878SDavid Wu } 159449c55878SDavid Wu 159549c55878SDavid Wu #define RK3228_PULL_OFFSET 0x100 159649c55878SDavid Wu 159749c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 159849c55878SDavid Wu int pin_num, struct regmap **regmap, 159949c55878SDavid Wu int *reg, u8 *bit) 160049c55878SDavid Wu { 160149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 160249c55878SDavid Wu 160349c55878SDavid Wu *regmap = priv->regmap_base; 160449c55878SDavid Wu *reg = RK3228_PULL_OFFSET; 160549c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 160649c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 160749c55878SDavid Wu 160849c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 160949c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 161049c55878SDavid Wu } 161149c55878SDavid Wu 161249c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET 0x200 161349c55878SDavid Wu 161449c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 161549c55878SDavid Wu int pin_num, struct regmap **regmap, 161649c55878SDavid Wu int *reg, u8 *bit) 161749c55878SDavid Wu { 161849c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 161949c55878SDavid Wu 162049c55878SDavid Wu *regmap = priv->regmap_base; 162149c55878SDavid Wu *reg = RK3228_DRV_GRF_OFFSET; 162249c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 162349c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 162449c55878SDavid Wu 162549c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 162649c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 162749c55878SDavid Wu } 162849c55878SDavid Wu 1629b3077611SDavid Wu #define RK3308_PULL_OFFSET 0xa0 1630b3077611SDavid Wu 1631b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 1632b3077611SDavid Wu int pin_num, struct regmap **regmap, 1633b3077611SDavid Wu int *reg, u8 *bit) 1634b3077611SDavid Wu { 1635b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 1636b3077611SDavid Wu 1637b3077611SDavid Wu *regmap = priv->regmap_base; 1638b3077611SDavid Wu *reg = RK3308_PULL_OFFSET; 1639b3077611SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 1640b3077611SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 1641b3077611SDavid Wu 1642b3077611SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 1643b3077611SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 1644b3077611SDavid Wu } 1645b3077611SDavid Wu 1646b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET 0x100 1647b3077611SDavid Wu 1648b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 1649b3077611SDavid Wu int pin_num, struct regmap **regmap, 1650b3077611SDavid Wu int *reg, u8 *bit) 1651b3077611SDavid Wu { 1652b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 1653b3077611SDavid Wu 1654b3077611SDavid Wu *regmap = priv->regmap_base; 1655b3077611SDavid Wu *reg = RK3308_DRV_GRF_OFFSET; 1656b3077611SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 1657b3077611SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 1658b3077611SDavid Wu 1659b3077611SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 1660b3077611SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 1661b3077611SDavid Wu } 1662b3077611SDavid Wu 1663b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG 8 1664b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE 16 1665b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET 0x1a0 1666b3077611SDavid Wu 1667b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 1668b3077611SDavid Wu int pin_num, 1669b3077611SDavid Wu struct regmap **regmap, 1670b3077611SDavid Wu int *reg, u8 *bit) 1671b3077611SDavid Wu { 1672b3077611SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 1673b3077611SDavid Wu 1674b3077611SDavid Wu *regmap = priv->regmap_base; 1675b3077611SDavid Wu *reg = RK3308_SCHMITT_GRF_OFFSET; 1676b3077611SDavid Wu 1677b3077611SDavid Wu *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE; 1678b3077611SDavid Wu *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4); 1679b3077611SDavid Wu *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG; 1680b3077611SDavid Wu 1681b3077611SDavid Wu return 0; 1682b3077611SDavid Wu } 1683b3077611SDavid Wu 168449c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET 0x100 168549c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET 0x10 168649c55878SDavid Wu 168749c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 168849c55878SDavid Wu int pin_num, struct regmap **regmap, 168949c55878SDavid Wu int *reg, u8 *bit) 169049c55878SDavid Wu { 169149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 169249c55878SDavid Wu 169349c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 169449c55878SDavid Wu if (bank->bank_num == 0) { 169549c55878SDavid Wu *regmap = priv->regmap_pmu; 169649c55878SDavid Wu *reg = RK3368_PULL_PMU_OFFSET; 169749c55878SDavid Wu 169849c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 169949c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 170049c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 170149c55878SDavid Wu } else { 170249c55878SDavid Wu *regmap = priv->regmap_base; 170349c55878SDavid Wu *reg = RK3368_PULL_GRF_OFFSET; 170449c55878SDavid Wu 170549c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 170649c55878SDavid Wu *reg -= 0x10; 170749c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 170849c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 170949c55878SDavid Wu 171049c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 171149c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 171249c55878SDavid Wu } 171349c55878SDavid Wu } 171449c55878SDavid Wu 171549c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET 0x20 171649c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET 0x200 171749c55878SDavid Wu 171849c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 171949c55878SDavid Wu int pin_num, struct regmap **regmap, 172049c55878SDavid Wu int *reg, u8 *bit) 172149c55878SDavid Wu { 172249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 172349c55878SDavid Wu 172449c55878SDavid Wu /* The first 32 pins of the first bank are located in PMU */ 172549c55878SDavid Wu if (bank->bank_num == 0) { 172649c55878SDavid Wu *regmap = priv->regmap_pmu; 172749c55878SDavid Wu *reg = RK3368_DRV_PMU_OFFSET; 172849c55878SDavid Wu 172949c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 173049c55878SDavid Wu *bit = pin_num % RK3288_DRV_PINS_PER_REG; 173149c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 173249c55878SDavid Wu } else { 173349c55878SDavid Wu *regmap = priv->regmap_base; 173449c55878SDavid Wu *reg = RK3368_DRV_GRF_OFFSET; 173549c55878SDavid Wu 173649c55878SDavid Wu /* correct the offset, as we're starting with the 2nd bank */ 173749c55878SDavid Wu *reg -= 0x10; 173849c55878SDavid Wu *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 173949c55878SDavid Wu *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4); 174049c55878SDavid Wu 174149c55878SDavid Wu *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 174249c55878SDavid Wu *bit *= RK3288_DRV_BITS_PER_PIN; 174349c55878SDavid Wu } 174449c55878SDavid Wu } 174549c55878SDavid Wu 174649c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET 0xe040 174749c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET 0x40 174849c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN 3 174949c55878SDavid Wu 175049c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 175149c55878SDavid Wu int pin_num, struct regmap **regmap, 175249c55878SDavid Wu int *reg, u8 *bit) 175349c55878SDavid Wu { 175449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 175549c55878SDavid Wu 175649c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 175749c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) { 175849c55878SDavid Wu *regmap = priv->regmap_pmu; 175949c55878SDavid Wu *reg = RK3399_PULL_PMU_OFFSET; 176049c55878SDavid Wu 176149c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 176249c55878SDavid Wu 176349c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 176449c55878SDavid Wu *bit = pin_num % RK3188_PULL_PINS_PER_REG; 176549c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 176649c55878SDavid Wu } else { 176749c55878SDavid Wu *regmap = priv->regmap_base; 176849c55878SDavid Wu *reg = RK3399_PULL_GRF_OFFSET; 176949c55878SDavid Wu 177049c55878SDavid Wu /* correct the offset, as we're starting with the 3rd bank */ 177149c55878SDavid Wu *reg -= 0x20; 177249c55878SDavid Wu *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 177349c55878SDavid Wu *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 177449c55878SDavid Wu 177549c55878SDavid Wu *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 177649c55878SDavid Wu *bit *= RK3188_PULL_BITS_PER_PIN; 177749c55878SDavid Wu } 177849c55878SDavid Wu } 177949c55878SDavid Wu 178049c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, 178149c55878SDavid Wu int pin_num, struct regmap **regmap, 178249c55878SDavid Wu int *reg, u8 *bit) 178349c55878SDavid Wu { 178449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 178549c55878SDavid Wu int drv_num = (pin_num / 8); 178649c55878SDavid Wu 178749c55878SDavid Wu /* The bank0:16 and bank1:32 pins are located in PMU */ 178849c55878SDavid Wu if ((bank->bank_num == 0) || (bank->bank_num == 1)) 178949c55878SDavid Wu *regmap = priv->regmap_pmu; 179049c55878SDavid Wu else 179149c55878SDavid Wu *regmap = priv->regmap_base; 179249c55878SDavid Wu 179349c55878SDavid Wu *reg = bank->drv[drv_num].offset; 179449c55878SDavid Wu if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 179549c55878SDavid Wu (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)) 179649c55878SDavid Wu *bit = (pin_num % 8) * 3; 179749c55878SDavid Wu else 179849c55878SDavid Wu *bit = (pin_num % 8) * 2; 179949c55878SDavid Wu } 180049c55878SDavid Wu 180149c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = { 180249c55878SDavid Wu { 2, 4, 8, 12, -1, -1, -1, -1 }, 180349c55878SDavid Wu { 3, 6, 9, 12, -1, -1, -1, -1 }, 180449c55878SDavid Wu { 5, 10, 15, 20, -1, -1, -1, -1 }, 180549c55878SDavid Wu { 4, 6, 8, 10, 12, 14, 16, 18 }, 180649c55878SDavid Wu { 4, 7, 10, 13, 16, 19, 22, 26 } 180749c55878SDavid Wu }; 180849c55878SDavid Wu 180949c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, 181049c55878SDavid Wu int pin_num, int strength) 181149c55878SDavid Wu { 181249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 181349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 181449c55878SDavid Wu struct regmap *regmap; 181549c55878SDavid Wu int reg, ret, i; 181649c55878SDavid Wu u32 data, rmask_bits, temp; 181749c55878SDavid Wu u8 bit; 181855a89bc6SDavid Wu int drv_type = bank->drv[pin_num / 8].drv_type & DRV_TYPE_IO_MASK; 181949c55878SDavid Wu 182049c55878SDavid Wu debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num, 182149c55878SDavid Wu pin_num, strength); 182249c55878SDavid Wu 182349c55878SDavid Wu ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 182449c55878SDavid Wu 182549c55878SDavid Wu ret = -EINVAL; 182649c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { 182749c55878SDavid Wu if (rockchip_perpin_drv_list[drv_type][i] == strength) { 182849c55878SDavid Wu ret = i; 182949c55878SDavid Wu break; 183049c55878SDavid Wu } else if (rockchip_perpin_drv_list[drv_type][i] < 0) { 183149c55878SDavid Wu ret = rockchip_perpin_drv_list[drv_type][i]; 183249c55878SDavid Wu break; 183349c55878SDavid Wu } 183449c55878SDavid Wu } 183549c55878SDavid Wu 183649c55878SDavid Wu if (ret < 0) { 183749c55878SDavid Wu debug("unsupported driver strength %d\n", strength); 183849c55878SDavid Wu return ret; 183949c55878SDavid Wu } 184049c55878SDavid Wu 184149c55878SDavid Wu switch (drv_type) { 184249c55878SDavid Wu case DRV_TYPE_IO_1V8_3V0_AUTO: 184349c55878SDavid Wu case DRV_TYPE_IO_3V3_ONLY: 184449c55878SDavid Wu rmask_bits = RK3399_DRV_3BITS_PER_PIN; 184549c55878SDavid Wu switch (bit) { 184649c55878SDavid Wu case 0 ... 12: 184749c55878SDavid Wu /* regular case, nothing to do */ 184849c55878SDavid Wu break; 184949c55878SDavid Wu case 15: 185049c55878SDavid Wu /* 185149c55878SDavid Wu * drive-strength offset is special, as it is spread 185249c55878SDavid Wu * over 2 registers, the bit data[15] contains bit 0 185349c55878SDavid Wu * of the value while temp[1:0] contains bits 2 and 1 185449c55878SDavid Wu */ 185549c55878SDavid Wu data = (ret & 0x1) << 15; 185649c55878SDavid Wu temp = (ret >> 0x1) & 0x3; 185749c55878SDavid Wu 185849c55878SDavid Wu data |= BIT(31); 185949c55878SDavid Wu ret = regmap_write(regmap, reg, data); 186049c55878SDavid Wu if (ret) 186149c55878SDavid Wu return ret; 186249c55878SDavid Wu 186349c55878SDavid Wu temp |= (0x3 << 16); 186449c55878SDavid Wu reg += 0x4; 186549c55878SDavid Wu ret = regmap_write(regmap, reg, temp); 186649c55878SDavid Wu 186749c55878SDavid Wu return ret; 186849c55878SDavid Wu case 18 ... 21: 186949c55878SDavid Wu /* setting fully enclosed in the second register */ 187049c55878SDavid Wu reg += 4; 187149c55878SDavid Wu bit -= 16; 187249c55878SDavid Wu break; 187349c55878SDavid Wu default: 187449c55878SDavid Wu debug("unsupported bit: %d for pinctrl drive type: %d\n", 187549c55878SDavid Wu bit, drv_type); 187649c55878SDavid Wu return -EINVAL; 187749c55878SDavid Wu } 187849c55878SDavid Wu break; 187949c55878SDavid Wu case DRV_TYPE_IO_DEFAULT: 188049c55878SDavid Wu case DRV_TYPE_IO_1V8_OR_3V0: 188149c55878SDavid Wu case DRV_TYPE_IO_1V8_ONLY: 188249c55878SDavid Wu rmask_bits = RK3288_DRV_BITS_PER_PIN; 188349c55878SDavid Wu break; 188449c55878SDavid Wu default: 188549c55878SDavid Wu debug("unsupported pinctrl drive type: %d\n", 188649c55878SDavid Wu drv_type); 188749c55878SDavid Wu return -EINVAL; 188849c55878SDavid Wu } 188949c55878SDavid Wu 189055a89bc6SDavid Wu if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) { 189155a89bc6SDavid Wu regmap_read(regmap, reg, &data); 189255a89bc6SDavid Wu data &= ~(((1 << rmask_bits) - 1) << bit); 189355a89bc6SDavid Wu } else { 189449c55878SDavid Wu /* enable the write to the equivalent lower bits */ 189549c55878SDavid Wu data = ((1 << rmask_bits) - 1) << (bit + 16); 189655a89bc6SDavid Wu } 189749c55878SDavid Wu 189855a89bc6SDavid Wu data |= (ret << bit); 189949c55878SDavid Wu ret = regmap_write(regmap, reg, data); 190049c55878SDavid Wu return ret; 190149c55878SDavid Wu } 190249c55878SDavid Wu 190349c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = { 190449c55878SDavid Wu { 190549c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 190649c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP, 190749c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 190849c55878SDavid Wu PIN_CONFIG_BIAS_BUS_HOLD 190949c55878SDavid Wu }, 191049c55878SDavid Wu { 191149c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 191249c55878SDavid Wu PIN_CONFIG_BIAS_PULL_DOWN, 191349c55878SDavid Wu PIN_CONFIG_BIAS_DISABLE, 191449c55878SDavid Wu PIN_CONFIG_BIAS_PULL_UP 191549c55878SDavid Wu }, 191649c55878SDavid Wu }; 191749c55878SDavid Wu 191849c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank, 191949c55878SDavid Wu int pin_num, int pull) 192049c55878SDavid Wu { 192149c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 192249c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 192349c55878SDavid Wu struct regmap *regmap; 192449c55878SDavid Wu int reg, ret, i, pull_type; 192549c55878SDavid Wu u8 bit; 192649c55878SDavid Wu u32 data; 192749c55878SDavid Wu 192849c55878SDavid Wu debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num, 192949c55878SDavid Wu pin_num, pull); 193049c55878SDavid Wu 193149c55878SDavid Wu /* rk3066b does support any pulls */ 193249c55878SDavid Wu if (ctrl->type == RK3066B) 193349c55878SDavid Wu return pull ? -EINVAL : 0; 193449c55878SDavid Wu 193549c55878SDavid Wu ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 193649c55878SDavid Wu 193749c55878SDavid Wu switch (ctrl->type) { 193849c55878SDavid Wu case RK2928: 193949c55878SDavid Wu case RK3128: 194049c55878SDavid Wu data = BIT(bit + 16); 194149c55878SDavid Wu if (pull == PIN_CONFIG_BIAS_DISABLE) 194249c55878SDavid Wu data |= BIT(bit); 194349c55878SDavid Wu ret = regmap_write(regmap, reg, data); 194449c55878SDavid Wu break; 194549c55878SDavid Wu case PX30: 194649c55878SDavid Wu case RV1108: 1947*a2a3fc8fSJianqun Xu case RK1808: 194849c55878SDavid Wu case RK3188: 194949c55878SDavid Wu case RK3288: 1950b3077611SDavid Wu case RK3308: 195149c55878SDavid Wu case RK3368: 195249c55878SDavid Wu case RK3399: 195355a89bc6SDavid Wu pull_type = bank->pull_type[pin_num / 8] & PULL_TYPE_IO_MASK; 195449c55878SDavid Wu ret = -EINVAL; 195549c55878SDavid Wu for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); 195649c55878SDavid Wu i++) { 195749c55878SDavid Wu if (rockchip_pull_list[pull_type][i] == pull) { 195849c55878SDavid Wu ret = i; 195949c55878SDavid Wu break; 196049c55878SDavid Wu } 196149c55878SDavid Wu } 196249c55878SDavid Wu 196349c55878SDavid Wu if (ret < 0) { 196449c55878SDavid Wu debug("unsupported pull setting %d\n", pull); 196549c55878SDavid Wu return ret; 196649c55878SDavid Wu } 196749c55878SDavid Wu 196855a89bc6SDavid Wu if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) { 196955a89bc6SDavid Wu regmap_read(regmap, reg, &data); 197055a89bc6SDavid Wu data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit); 197155a89bc6SDavid Wu } else { 197249c55878SDavid Wu /* enable the write to the equivalent lower bits */ 197349c55878SDavid Wu data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); 197455a89bc6SDavid Wu } 197549c55878SDavid Wu 197655a89bc6SDavid Wu data |= (ret << bit); 197749c55878SDavid Wu ret = regmap_write(regmap, reg, data); 197849c55878SDavid Wu break; 197949c55878SDavid Wu default: 198049c55878SDavid Wu debug("unsupported pinctrl type\n"); 198149c55878SDavid Wu return -EINVAL; 198249c55878SDavid Wu } 198349c55878SDavid Wu 198449c55878SDavid Wu return ret; 198549c55878SDavid Wu } 198649c55878SDavid Wu 198749c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN 1 198849c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG 16 198949c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE 8 199049c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET 0x380 199149c55878SDavid Wu 199249c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, 199349c55878SDavid Wu int pin_num, 199449c55878SDavid Wu struct regmap **regmap, 199549c55878SDavid Wu int *reg, u8 *bit) 199649c55878SDavid Wu { 199749c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 199849c55878SDavid Wu 199949c55878SDavid Wu *regmap = priv->regmap_base; 200049c55878SDavid Wu *reg = RK3328_SCHMITT_GRF_OFFSET; 200149c55878SDavid Wu 200249c55878SDavid Wu *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE; 200349c55878SDavid Wu *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4); 200449c55878SDavid Wu *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG; 200549c55878SDavid Wu 200649c55878SDavid Wu return 0; 200749c55878SDavid Wu } 200849c55878SDavid Wu 200949c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank, 201049c55878SDavid Wu int pin_num, int enable) 201149c55878SDavid Wu { 201249c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 201349c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 201449c55878SDavid Wu struct regmap *regmap; 201549c55878SDavid Wu int reg, ret; 201649c55878SDavid Wu u8 bit; 201749c55878SDavid Wu u32 data; 201849c55878SDavid Wu 201949c55878SDavid Wu debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num, 202049c55878SDavid Wu pin_num, enable); 202149c55878SDavid Wu 202249c55878SDavid Wu ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 202349c55878SDavid Wu if (ret) 202449c55878SDavid Wu return ret; 202549c55878SDavid Wu 202649c55878SDavid Wu /* enable the write to the equivalent lower bits */ 202749c55878SDavid Wu data = BIT(bit + 16) | (enable << bit); 202849c55878SDavid Wu 202949c55878SDavid Wu return regmap_write(regmap, reg, data); 203049c55878SDavid Wu } 203149c55878SDavid Wu 203249c55878SDavid Wu /* 203349c55878SDavid Wu * Pinconf_ops handling 203449c55878SDavid Wu */ 203549c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, 203649c55878SDavid Wu unsigned int pull) 203749c55878SDavid Wu { 203849c55878SDavid Wu switch (ctrl->type) { 203949c55878SDavid Wu case RK2928: 204049c55878SDavid Wu case RK3128: 204149c55878SDavid Wu return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || 204249c55878SDavid Wu pull == PIN_CONFIG_BIAS_DISABLE); 204349c55878SDavid Wu case RK3066B: 204449c55878SDavid Wu return pull ? false : true; 204549c55878SDavid Wu case PX30: 204649c55878SDavid Wu case RV1108: 2047*a2a3fc8fSJianqun Xu case RK1808: 204849c55878SDavid Wu case RK3188: 204949c55878SDavid Wu case RK3288: 2050b3077611SDavid Wu case RK3308: 205149c55878SDavid Wu case RK3368: 205249c55878SDavid Wu case RK3399: 205349c55878SDavid Wu return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 205449c55878SDavid Wu } 205549c55878SDavid Wu 205649c55878SDavid Wu return false; 205749c55878SDavid Wu } 205849c55878SDavid Wu 205949c55878SDavid Wu /* set the pin config settings for a specified pin */ 206049c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank, 206149c55878SDavid Wu u32 pin, u32 param, u32 arg) 206249c55878SDavid Wu { 206349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = bank->priv; 206449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 206549c55878SDavid Wu int rc; 206649c55878SDavid Wu 206749c55878SDavid Wu switch (param) { 206849c55878SDavid Wu case PIN_CONFIG_BIAS_DISABLE: 206949c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 207049c55878SDavid Wu if (rc) 207149c55878SDavid Wu return rc; 207249c55878SDavid Wu break; 207349c55878SDavid Wu 207449c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_UP: 207549c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_DOWN: 207649c55878SDavid Wu case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 207749c55878SDavid Wu case PIN_CONFIG_BIAS_BUS_HOLD: 207849c55878SDavid Wu if (!rockchip_pinconf_pull_valid(ctrl, param)) 207949c55878SDavid Wu return -ENOTSUPP; 208049c55878SDavid Wu 208149c55878SDavid Wu if (!arg) 208249c55878SDavid Wu return -EINVAL; 208349c55878SDavid Wu 208449c55878SDavid Wu rc = rockchip_set_pull(bank, pin, param); 208549c55878SDavid Wu if (rc) 208649c55878SDavid Wu return rc; 208749c55878SDavid Wu break; 208849c55878SDavid Wu 208949c55878SDavid Wu case PIN_CONFIG_DRIVE_STRENGTH: 209049c55878SDavid Wu if (!ctrl->drv_calc_reg) 209149c55878SDavid Wu return -ENOTSUPP; 209249c55878SDavid Wu 209349c55878SDavid Wu rc = rockchip_set_drive_perpin(bank, pin, arg); 209449c55878SDavid Wu if (rc < 0) 209549c55878SDavid Wu return rc; 209649c55878SDavid Wu break; 209749c55878SDavid Wu 209849c55878SDavid Wu case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 209949c55878SDavid Wu if (!ctrl->schmitt_calc_reg) 210049c55878SDavid Wu return -ENOTSUPP; 210149c55878SDavid Wu 210249c55878SDavid Wu rc = rockchip_set_schmitt(bank, pin, arg); 210349c55878SDavid Wu if (rc < 0) 210449c55878SDavid Wu return rc; 210549c55878SDavid Wu break; 210649c55878SDavid Wu 210749c55878SDavid Wu default: 210849c55878SDavid Wu break; 210949c55878SDavid Wu } 211049c55878SDavid Wu 211149c55878SDavid Wu return 0; 211249c55878SDavid Wu } 211349c55878SDavid Wu 211449c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = { 211549c55878SDavid Wu { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, 211649c55878SDavid Wu { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 }, 211749c55878SDavid Wu { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 }, 211849c55878SDavid Wu { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 }, 211949c55878SDavid Wu { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 }, 212049c55878SDavid Wu { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 }, 212149c55878SDavid Wu { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 }, 212249c55878SDavid Wu { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 }, 212349c55878SDavid Wu { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 }, 212449c55878SDavid Wu }; 212549c55878SDavid Wu 212649c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property, 212749c55878SDavid Wu u32 *default_value) 212849c55878SDavid Wu { 212949c55878SDavid Wu const struct pinconf_param *p, *end; 213049c55878SDavid Wu 213149c55878SDavid Wu p = rockchip_conf_params; 213249c55878SDavid Wu end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param); 213349c55878SDavid Wu 213449c55878SDavid Wu /* See if this pctldev supports this parameter */ 213549c55878SDavid Wu for (; p < end; p++) { 213649c55878SDavid Wu if (!strcmp(property, p->property)) { 213749c55878SDavid Wu *default_value = p->default_value; 213849c55878SDavid Wu return p->param; 213949c55878SDavid Wu } 214049c55878SDavid Wu } 214149c55878SDavid Wu 214249c55878SDavid Wu *default_value = 0; 214349c55878SDavid Wu return -EPERM; 214449c55878SDavid Wu } 214549c55878SDavid Wu 214649c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev, 214749c55878SDavid Wu struct udevice *config) 214849c55878SDavid Wu { 214949c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 215049c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = priv->ctrl; 215149c55878SDavid Wu u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4]; 215249c55878SDavid Wu u32 bank, pin, mux, conf, arg, default_val; 215349c55878SDavid Wu int ret, count, i; 215449c55878SDavid Wu const char *prop_name; 215549c55878SDavid Wu const void *value; 21562208cfa9SKever Yang int prop_len, param; 21572208cfa9SKever Yang const u32 *data; 21582208cfa9SKever Yang ofnode node; 21592208cfa9SKever Yang #ifdef CONFIG_OF_LIVE 21602208cfa9SKever Yang const struct device_node *np; 21612208cfa9SKever Yang struct property *pp; 21622208cfa9SKever Yang #else 21632208cfa9SKever Yang int property_offset, pcfg_node; 21642208cfa9SKever Yang const void *blob = gd->fdt_blob; 21652208cfa9SKever Yang #endif 21662208cfa9SKever Yang data = dev_read_prop(config, "rockchip,pins", &count); 216749c55878SDavid Wu if (count < 0) { 216887f0ac57SDavid Wu debug("%s: bad array size %d\n", __func__, count); 216949c55878SDavid Wu return -EINVAL; 217049c55878SDavid Wu } 217149c55878SDavid Wu 217287f0ac57SDavid Wu count /= sizeof(u32); 217349c55878SDavid Wu if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) { 217449c55878SDavid Wu debug("%s: unsupported pins array count %d\n", 217549c55878SDavid Wu __func__, count); 217649c55878SDavid Wu return -EINVAL; 217749c55878SDavid Wu } 217849c55878SDavid Wu 217987f0ac57SDavid Wu for (i = 0; i < count; i++) 218087f0ac57SDavid Wu cells[i] = fdt32_to_cpu(data[i]); 218187f0ac57SDavid Wu 218249c55878SDavid Wu for (i = 0; i < (count >> 2); i++) { 218349c55878SDavid Wu bank = cells[4 * i + 0]; 218449c55878SDavid Wu pin = cells[4 * i + 1]; 218549c55878SDavid Wu mux = cells[4 * i + 2]; 218649c55878SDavid Wu conf = cells[4 * i + 3]; 218749c55878SDavid Wu 218849c55878SDavid Wu ret = rockchip_verify_config(dev, bank, pin); 218949c55878SDavid Wu if (ret) 219049c55878SDavid Wu return ret; 219149c55878SDavid Wu 219249c55878SDavid Wu ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux); 219349c55878SDavid Wu if (ret) 219449c55878SDavid Wu return ret; 219549c55878SDavid Wu 21962208cfa9SKever Yang node = ofnode_get_by_phandle(conf); 21972208cfa9SKever Yang if (!ofnode_valid(node)) 219849c55878SDavid Wu return -ENODEV; 21992208cfa9SKever Yang #ifdef CONFIG_OF_LIVE 22002208cfa9SKever Yang np = ofnode_to_np(node); 22012208cfa9SKever Yang for (pp = np->properties; pp; pp = pp->next) { 22022208cfa9SKever Yang prop_name = pp->name; 22032208cfa9SKever Yang prop_len = pp->length; 22042208cfa9SKever Yang value = pp->value; 22052208cfa9SKever Yang #else 22062208cfa9SKever Yang pcfg_node = ofnode_to_offset(node); 220749c55878SDavid Wu fdt_for_each_property_offset(property_offset, blob, pcfg_node) { 220849c55878SDavid Wu value = fdt_getprop_by_offset(blob, property_offset, 220949c55878SDavid Wu &prop_name, &prop_len); 221049c55878SDavid Wu if (!value) 221149c55878SDavid Wu return -ENOENT; 22122208cfa9SKever Yang #endif 221349c55878SDavid Wu param = rockchip_pinconf_prop_name_to_param(prop_name, 221449c55878SDavid Wu &default_val); 221549c55878SDavid Wu if (param < 0) 221649c55878SDavid Wu break; 221749c55878SDavid Wu 221849c55878SDavid Wu if (prop_len >= sizeof(fdt32_t)) 221949c55878SDavid Wu arg = fdt32_to_cpu(*(fdt32_t *)value); 222049c55878SDavid Wu else 222149c55878SDavid Wu arg = default_val; 222249c55878SDavid Wu 222349c55878SDavid Wu ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin, 222449c55878SDavid Wu param, arg); 222549c55878SDavid Wu if (ret) { 222649c55878SDavid Wu debug("%s: rockchip_pinconf_set fail: %d\n", 222749c55878SDavid Wu __func__, ret); 222849c55878SDavid Wu return ret; 222949c55878SDavid Wu } 223049c55878SDavid Wu } 223149c55878SDavid Wu } 223249c55878SDavid Wu 223349c55878SDavid Wu return 0; 223449c55878SDavid Wu } 223549c55878SDavid Wu 223649c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = { 223749c55878SDavid Wu .set_state = rockchip_pinctrl_set_state, 223849c55878SDavid Wu .get_gpio_mux = rockchip_pinctrl_get_gpio_mux, 223949c55878SDavid Wu }; 224049c55878SDavid Wu 224149c55878SDavid Wu /* retrieve the soc specific data */ 224249c55878SDavid Wu static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct udevice *dev) 224349c55878SDavid Wu { 224449c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 224549c55878SDavid Wu struct rockchip_pin_ctrl *ctrl = 224649c55878SDavid Wu (struct rockchip_pin_ctrl *)dev_get_driver_data(dev); 224749c55878SDavid Wu struct rockchip_pin_bank *bank; 224849c55878SDavid Wu int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; 224949c55878SDavid Wu 225049c55878SDavid Wu grf_offs = ctrl->grf_mux_offset; 225149c55878SDavid Wu pmu_offs = ctrl->pmu_mux_offset; 225249c55878SDavid Wu drv_pmu_offs = ctrl->pmu_drv_offset; 225349c55878SDavid Wu drv_grf_offs = ctrl->grf_drv_offset; 225449c55878SDavid Wu bank = ctrl->pin_banks; 225549c55878SDavid Wu 225649c55878SDavid Wu for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { 225749c55878SDavid Wu int bank_pins = 0; 225849c55878SDavid Wu 225949c55878SDavid Wu bank->priv = priv; 226049c55878SDavid Wu bank->pin_base = ctrl->nr_pins; 226149c55878SDavid Wu ctrl->nr_pins += bank->nr_pins; 226249c55878SDavid Wu 226349c55878SDavid Wu /* calculate iomux and drv offsets */ 226449c55878SDavid Wu for (j = 0; j < 4; j++) { 226549c55878SDavid Wu struct rockchip_iomux *iom = &bank->iomux[j]; 226649c55878SDavid Wu struct rockchip_drv *drv = &bank->drv[j]; 226749c55878SDavid Wu int inc; 226849c55878SDavid Wu 226949c55878SDavid Wu if (bank_pins >= bank->nr_pins) 227049c55878SDavid Wu break; 227149c55878SDavid Wu 227249c55878SDavid Wu /* preset iomux offset value, set new start value */ 227349c55878SDavid Wu if (iom->offset >= 0) { 227449c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 227549c55878SDavid Wu pmu_offs = iom->offset; 227649c55878SDavid Wu else 227749c55878SDavid Wu grf_offs = iom->offset; 227849c55878SDavid Wu } else { /* set current iomux offset */ 227949c55878SDavid Wu iom->offset = (iom->type & IOMUX_SOURCE_PMU) ? 228049c55878SDavid Wu pmu_offs : grf_offs; 228149c55878SDavid Wu } 228249c55878SDavid Wu 228349c55878SDavid Wu /* preset drv offset value, set new start value */ 228449c55878SDavid Wu if (drv->offset >= 0) { 228549c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 228649c55878SDavid Wu drv_pmu_offs = drv->offset; 228749c55878SDavid Wu else 228849c55878SDavid Wu drv_grf_offs = drv->offset; 228949c55878SDavid Wu } else { /* set current drv offset */ 229049c55878SDavid Wu drv->offset = (iom->type & IOMUX_SOURCE_PMU) ? 229149c55878SDavid Wu drv_pmu_offs : drv_grf_offs; 229249c55878SDavid Wu } 229349c55878SDavid Wu 229449c55878SDavid Wu debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n", 229549c55878SDavid Wu i, j, iom->offset, drv->offset); 229649c55878SDavid Wu 229749c55878SDavid Wu /* 229849c55878SDavid Wu * Increase offset according to iomux width. 229949c55878SDavid Wu * 4bit iomux'es are spread over two registers. 230049c55878SDavid Wu */ 230149c55878SDavid Wu inc = (iom->type & (IOMUX_WIDTH_4BIT | 230288a1f7ffSDavid Wu IOMUX_WIDTH_3BIT | 230388a1f7ffSDavid Wu IOMUX_8WIDTH_2BIT)) ? 8 : 4; 230449c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 230549c55878SDavid Wu pmu_offs += inc; 230649c55878SDavid Wu else 230749c55878SDavid Wu grf_offs += inc; 230849c55878SDavid Wu 230949c55878SDavid Wu /* 231049c55878SDavid Wu * Increase offset according to drv width. 231149c55878SDavid Wu * 3bit drive-strenth'es are spread over two registers. 231249c55878SDavid Wu */ 231349c55878SDavid Wu if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 231449c55878SDavid Wu (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) 231549c55878SDavid Wu inc = 8; 231649c55878SDavid Wu else 231749c55878SDavid Wu inc = 4; 231849c55878SDavid Wu 231949c55878SDavid Wu if (iom->type & IOMUX_SOURCE_PMU) 232049c55878SDavid Wu drv_pmu_offs += inc; 232149c55878SDavid Wu else 232249c55878SDavid Wu drv_grf_offs += inc; 232349c55878SDavid Wu 232449c55878SDavid Wu bank_pins += 8; 232549c55878SDavid Wu } 232649c55878SDavid Wu 232749c55878SDavid Wu /* calculate the per-bank recalced_mask */ 232849c55878SDavid Wu for (j = 0; j < ctrl->niomux_recalced; j++) { 232949c55878SDavid Wu int pin = 0; 233049c55878SDavid Wu 233149c55878SDavid Wu if (ctrl->iomux_recalced[j].num == bank->bank_num) { 233249c55878SDavid Wu pin = ctrl->iomux_recalced[j].pin; 233349c55878SDavid Wu bank->recalced_mask |= BIT(pin); 233449c55878SDavid Wu } 233549c55878SDavid Wu } 233649c55878SDavid Wu 233749c55878SDavid Wu /* calculate the per-bank route_mask */ 233849c55878SDavid Wu for (j = 0; j < ctrl->niomux_routes; j++) { 233949c55878SDavid Wu int pin = 0; 234049c55878SDavid Wu 234149c55878SDavid Wu if (ctrl->iomux_routes[j].bank_num == bank->bank_num) { 234249c55878SDavid Wu pin = ctrl->iomux_routes[j].pin; 234349c55878SDavid Wu bank->route_mask |= BIT(pin); 234449c55878SDavid Wu } 234549c55878SDavid Wu } 234649c55878SDavid Wu } 234749c55878SDavid Wu 234849c55878SDavid Wu return ctrl; 234949c55878SDavid Wu } 235049c55878SDavid Wu 235149c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev) 235249c55878SDavid Wu { 235349c55878SDavid Wu struct rockchip_pinctrl_priv *priv = dev_get_priv(dev); 235449c55878SDavid Wu struct rockchip_pin_ctrl *ctrl; 235549c55878SDavid Wu struct udevice *syscon; 235649c55878SDavid Wu struct regmap *regmap; 235749c55878SDavid Wu int ret = 0; 235849c55878SDavid Wu 235949c55878SDavid Wu /* get rockchip grf syscon phandle */ 236049c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf", 236149c55878SDavid Wu &syscon); 236249c55878SDavid Wu if (ret) { 236349c55878SDavid Wu debug("unable to find rockchip,grf syscon device (%d)\n", ret); 236449c55878SDavid Wu return ret; 236549c55878SDavid Wu } 236649c55878SDavid Wu 236749c55878SDavid Wu /* get grf-reg base address */ 236849c55878SDavid Wu regmap = syscon_get_regmap(syscon); 236949c55878SDavid Wu if (!regmap) { 237049c55878SDavid Wu debug("unable to find rockchip grf regmap\n"); 237149c55878SDavid Wu return -ENODEV; 237249c55878SDavid Wu } 237349c55878SDavid Wu priv->regmap_base = regmap; 237449c55878SDavid Wu 237549c55878SDavid Wu /* option: get pmu-reg base address */ 237649c55878SDavid Wu ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu", 237749c55878SDavid Wu &syscon); 237849c55878SDavid Wu if (!ret) { 237949c55878SDavid Wu /* get pmugrf-reg base address */ 238049c55878SDavid Wu regmap = syscon_get_regmap(syscon); 238149c55878SDavid Wu if (!regmap) { 238249c55878SDavid Wu debug("unable to find rockchip pmu regmap\n"); 238349c55878SDavid Wu return -ENODEV; 238449c55878SDavid Wu } 238549c55878SDavid Wu priv->regmap_pmu = regmap; 238649c55878SDavid Wu } 238749c55878SDavid Wu 238849c55878SDavid Wu ctrl = rockchip_pinctrl_get_soc_data(dev); 238949c55878SDavid Wu if (!ctrl) { 239049c55878SDavid Wu debug("driver data not available\n"); 239149c55878SDavid Wu return -EINVAL; 239249c55878SDavid Wu } 239349c55878SDavid Wu 239449c55878SDavid Wu priv->ctrl = ctrl; 239549c55878SDavid Wu return 0; 239649c55878SDavid Wu } 239749c55878SDavid Wu 239849c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = { 239949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 240049c55878SDavid Wu IOMUX_SOURCE_PMU, 240149c55878SDavid Wu IOMUX_SOURCE_PMU, 240249c55878SDavid Wu IOMUX_SOURCE_PMU 240349c55878SDavid Wu ), 240449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, 240549c55878SDavid Wu IOMUX_WIDTH_4BIT, 240649c55878SDavid Wu IOMUX_WIDTH_4BIT, 240749c55878SDavid Wu IOMUX_WIDTH_4BIT 240849c55878SDavid Wu ), 240949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, 241049c55878SDavid Wu IOMUX_WIDTH_4BIT, 241149c55878SDavid Wu IOMUX_WIDTH_4BIT, 241249c55878SDavid Wu IOMUX_WIDTH_4BIT 241349c55878SDavid Wu ), 241449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, 241549c55878SDavid Wu IOMUX_WIDTH_4BIT, 241649c55878SDavid Wu IOMUX_WIDTH_4BIT, 241749c55878SDavid Wu IOMUX_WIDTH_4BIT 241849c55878SDavid Wu ), 241949c55878SDavid Wu }; 242049c55878SDavid Wu 242149c55878SDavid Wu static struct rockchip_pin_ctrl px30_pin_ctrl = { 242249c55878SDavid Wu .pin_banks = px30_pin_banks, 242349c55878SDavid Wu .nr_banks = ARRAY_SIZE(px30_pin_banks), 242449c55878SDavid Wu .label = "PX30-GPIO", 242549c55878SDavid Wu .type = PX30, 242649c55878SDavid Wu .grf_mux_offset = 0x0, 242749c55878SDavid Wu .pmu_mux_offset = 0x0, 242849c55878SDavid Wu .iomux_routes = px30_mux_route_data, 242949c55878SDavid Wu .niomux_routes = ARRAY_SIZE(px30_mux_route_data), 243049c55878SDavid Wu .pull_calc_reg = px30_calc_pull_reg_and_bit, 243149c55878SDavid Wu .drv_calc_reg = px30_calc_drv_reg_and_bit, 243249c55878SDavid Wu .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, 243349c55878SDavid Wu }; 243449c55878SDavid Wu 243549c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = { 243649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 243749c55878SDavid Wu IOMUX_SOURCE_PMU, 243849c55878SDavid Wu IOMUX_SOURCE_PMU, 243949c55878SDavid Wu IOMUX_SOURCE_PMU), 244049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 244149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0), 244249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0), 244349c55878SDavid Wu }; 244449c55878SDavid Wu 244549c55878SDavid Wu static struct rockchip_pin_ctrl rv1108_pin_ctrl = { 244649c55878SDavid Wu .pin_banks = rv1108_pin_banks, 244749c55878SDavid Wu .nr_banks = ARRAY_SIZE(rv1108_pin_banks), 244849c55878SDavid Wu .label = "RV1108-GPIO", 244949c55878SDavid Wu .type = RV1108, 245049c55878SDavid Wu .grf_mux_offset = 0x10, 245149c55878SDavid Wu .pmu_mux_offset = 0x0, 245249c55878SDavid Wu .iomux_recalced = rv1108_mux_recalced_data, 245349c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data), 245449c55878SDavid Wu .pull_calc_reg = rv1108_calc_pull_reg_and_bit, 245549c55878SDavid Wu .drv_calc_reg = rv1108_calc_drv_reg_and_bit, 245649c55878SDavid Wu .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit, 245749c55878SDavid Wu }; 245849c55878SDavid Wu 2459*a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = { 2460*a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 2461*a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 2462*a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 2463*a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU, 2464*a2a3fc8fSJianqun Xu IOMUX_SOURCE_PMU), 2465*a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 2466*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2467*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2468*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2469*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2470*a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 2471*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2472*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2473*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2474*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2475*a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 2476*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2477*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2478*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2479*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2480*a2a3fc8fSJianqun Xu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", 2481*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2482*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2483*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT, 2484*a2a3fc8fSJianqun Xu IOMUX_WIDTH_4BIT), 2485*a2a3fc8fSJianqun Xu }; 2486*a2a3fc8fSJianqun Xu 2487*a2a3fc8fSJianqun Xu static struct rockchip_pin_ctrl rk1808_pin_ctrl = { 2488*a2a3fc8fSJianqun Xu .pin_banks = rk1808_pin_banks, 2489*a2a3fc8fSJianqun Xu .nr_banks = ARRAY_SIZE(rk1808_pin_banks), 2490*a2a3fc8fSJianqun Xu .label = "RK1808-GPIO", 2491*a2a3fc8fSJianqun Xu .type = RK1808, 2492*a2a3fc8fSJianqun Xu .iomux_routes = rk1808_mux_route_data, 2493*a2a3fc8fSJianqun Xu .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data), 2494*a2a3fc8fSJianqun Xu .grf_mux_offset = 0x0, 2495*a2a3fc8fSJianqun Xu .pmu_mux_offset = 0x0, 2496*a2a3fc8fSJianqun Xu .pull_calc_reg = rk1808_calc_pull_reg_and_bit, 2497*a2a3fc8fSJianqun Xu .drv_calc_reg = rk1808_calc_drv_reg_and_bit, 2498*a2a3fc8fSJianqun Xu .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit, 2499*a2a3fc8fSJianqun Xu }; 2500*a2a3fc8fSJianqun Xu 250149c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = { 250249c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 250349c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 250449c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 250549c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 250649c55878SDavid Wu }; 250749c55878SDavid Wu 250849c55878SDavid Wu static struct rockchip_pin_ctrl rk2928_pin_ctrl = { 250949c55878SDavid Wu .pin_banks = rk2928_pin_banks, 251049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 251149c55878SDavid Wu .label = "RK2928-GPIO", 251249c55878SDavid Wu .type = RK2928, 251349c55878SDavid Wu .grf_mux_offset = 0xa8, 251449c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 251549c55878SDavid Wu }; 251649c55878SDavid Wu 251749c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = { 251849c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 251949c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 252049c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 252149c55878SDavid Wu }; 252249c55878SDavid Wu 252349c55878SDavid Wu static struct rockchip_pin_ctrl rk3036_pin_ctrl = { 252449c55878SDavid Wu .pin_banks = rk3036_pin_banks, 252549c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3036_pin_banks), 252649c55878SDavid Wu .label = "RK3036-GPIO", 252749c55878SDavid Wu .type = RK2928, 252849c55878SDavid Wu .grf_mux_offset = 0xa8, 252949c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 253049c55878SDavid Wu }; 253149c55878SDavid Wu 253249c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = { 253349c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 253449c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 253549c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 253649c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 253749c55878SDavid Wu PIN_BANK(4, 32, "gpio4"), 253849c55878SDavid Wu PIN_BANK(6, 16, "gpio6"), 253949c55878SDavid Wu }; 254049c55878SDavid Wu 254149c55878SDavid Wu static struct rockchip_pin_ctrl rk3066a_pin_ctrl = { 254249c55878SDavid Wu .pin_banks = rk3066a_pin_banks, 254349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 254449c55878SDavid Wu .label = "RK3066a-GPIO", 254549c55878SDavid Wu .type = RK2928, 254649c55878SDavid Wu .grf_mux_offset = 0xa8, 254749c55878SDavid Wu .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 254849c55878SDavid Wu }; 254949c55878SDavid Wu 255049c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = { 255149c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 255249c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 255349c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 255449c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 255549c55878SDavid Wu }; 255649c55878SDavid Wu 255749c55878SDavid Wu static struct rockchip_pin_ctrl rk3066b_pin_ctrl = { 255849c55878SDavid Wu .pin_banks = rk3066b_pin_banks, 255949c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 256049c55878SDavid Wu .label = "RK3066b-GPIO", 256149c55878SDavid Wu .type = RK3066B, 256249c55878SDavid Wu .grf_mux_offset = 0x60, 256349c55878SDavid Wu }; 256449c55878SDavid Wu 256549c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = { 256649c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 256749c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 256849c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 256949c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 257049c55878SDavid Wu }; 257149c55878SDavid Wu 257249c55878SDavid Wu static struct rockchip_pin_ctrl rk3128_pin_ctrl = { 257349c55878SDavid Wu .pin_banks = rk3128_pin_banks, 257449c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3128_pin_banks), 257549c55878SDavid Wu .label = "RK3128-GPIO", 257649c55878SDavid Wu .type = RK3128, 257749c55878SDavid Wu .grf_mux_offset = 0xa8, 257849c55878SDavid Wu .iomux_recalced = rk3128_mux_recalced_data, 257949c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data), 258049c55878SDavid Wu .iomux_routes = rk3128_mux_route_data, 258149c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data), 258249c55878SDavid Wu .pull_calc_reg = rk3128_calc_pull_reg_and_bit, 258349c55878SDavid Wu }; 258449c55878SDavid Wu 258549c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = { 258649c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0), 258749c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 258849c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 258949c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 259049c55878SDavid Wu }; 259149c55878SDavid Wu 259249c55878SDavid Wu static struct rockchip_pin_ctrl rk3188_pin_ctrl = { 259349c55878SDavid Wu .pin_banks = rk3188_pin_banks, 259449c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 259549c55878SDavid Wu .label = "RK3188-GPIO", 259649c55878SDavid Wu .type = RK3188, 259749c55878SDavid Wu .grf_mux_offset = 0x60, 259849c55878SDavid Wu .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 259949c55878SDavid Wu }; 260049c55878SDavid Wu 260149c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = { 260249c55878SDavid Wu PIN_BANK(0, 32, "gpio0"), 260349c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 260449c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 260549c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 260649c55878SDavid Wu }; 260749c55878SDavid Wu 260849c55878SDavid Wu static struct rockchip_pin_ctrl rk3228_pin_ctrl = { 260949c55878SDavid Wu .pin_banks = rk3228_pin_banks, 261049c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3228_pin_banks), 261149c55878SDavid Wu .label = "RK3228-GPIO", 261249c55878SDavid Wu .type = RK3288, 261349c55878SDavid Wu .grf_mux_offset = 0x0, 261449c55878SDavid Wu .iomux_routes = rk3228_mux_route_data, 261549c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data), 261649c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 261749c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 261849c55878SDavid Wu }; 261949c55878SDavid Wu 262049c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = { 262155a89bc6SDavid Wu PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0", 26224bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 26234bafc2daSDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 262455a89bc6SDavid Wu IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 262555a89bc6SDavid Wu IOMUX_UNROUTED, 262655a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 262755a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 262855a89bc6SDavid Wu DRV_TYPE_WRITABLE_32BIT, 262955a89bc6SDavid Wu 0, 263055a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 263155a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 263255a89bc6SDavid Wu PULL_TYPE_WRITABLE_32BIT, 263355a89bc6SDavid Wu 0 263449c55878SDavid Wu ), 263549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED, 263649c55878SDavid Wu IOMUX_UNROUTED, 263749c55878SDavid Wu IOMUX_UNROUTED, 263849c55878SDavid Wu 0 263949c55878SDavid Wu ), 264049c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED), 264149c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT), 264249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, 264349c55878SDavid Wu IOMUX_WIDTH_4BIT, 264449c55878SDavid Wu 0, 264549c55878SDavid Wu 0 264649c55878SDavid Wu ), 264749c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED, 264849c55878SDavid Wu 0, 264949c55878SDavid Wu 0, 265049c55878SDavid Wu IOMUX_UNROUTED 265149c55878SDavid Wu ), 265249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED), 265349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0, 265449c55878SDavid Wu 0, 265549c55878SDavid Wu IOMUX_WIDTH_4BIT, 265649c55878SDavid Wu IOMUX_UNROUTED 265749c55878SDavid Wu ), 265849c55878SDavid Wu PIN_BANK(8, 16, "gpio8"), 265949c55878SDavid Wu }; 266049c55878SDavid Wu 266149c55878SDavid Wu static struct rockchip_pin_ctrl rk3288_pin_ctrl = { 266249c55878SDavid Wu .pin_banks = rk3288_pin_banks, 266349c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3288_pin_banks), 266449c55878SDavid Wu .label = "RK3288-GPIO", 266549c55878SDavid Wu .type = RK3288, 266649c55878SDavid Wu .grf_mux_offset = 0x0, 266749c55878SDavid Wu .pmu_mux_offset = 0x84, 266849c55878SDavid Wu .iomux_routes = rk3288_mux_route_data, 266949c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data), 267049c55878SDavid Wu .pull_calc_reg = rk3288_calc_pull_reg_and_bit, 267149c55878SDavid Wu .drv_calc_reg = rk3288_calc_drv_reg_and_bit, 267249c55878SDavid Wu }; 267349c55878SDavid Wu 2674b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = { 2675b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT, 2676b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2677b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2678b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 2679b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT, 2680b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2681b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2682b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 2683b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT, 2684b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2685b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2686b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 2687b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT, 2688b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2689b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2690b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 2691b3077611SDavid Wu PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT, 2692b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2693b3077611SDavid Wu IOMUX_8WIDTH_2BIT, 2694b3077611SDavid Wu IOMUX_8WIDTH_2BIT), 2695b3077611SDavid Wu }; 2696b3077611SDavid Wu 2697b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = { 2698b3077611SDavid Wu .pin_banks = rk3308_pin_banks, 2699b3077611SDavid Wu .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 2700b3077611SDavid Wu .label = "RK3308-GPIO", 2701b3077611SDavid Wu .type = RK3308, 2702b3077611SDavid Wu .grf_mux_offset = 0x0, 2703b3077611SDavid Wu .iomux_recalced = rk3308_mux_recalced_data, 2704b3077611SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data), 2705b3077611SDavid Wu .iomux_routes = rk3308_mux_route_data, 2706b3077611SDavid Wu .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data), 2707b3077611SDavid Wu .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 2708b3077611SDavid Wu .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 2709b3077611SDavid Wu .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 2710b3077611SDavid Wu }; 2711b3077611SDavid Wu 271249c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = { 271349c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0), 271449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0), 271549c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 271649c55878SDavid Wu IOMUX_WIDTH_3BIT, 271749c55878SDavid Wu IOMUX_WIDTH_3BIT, 271849c55878SDavid Wu 0), 271949c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 272049c55878SDavid Wu IOMUX_WIDTH_3BIT, 272149c55878SDavid Wu IOMUX_WIDTH_3BIT, 272249c55878SDavid Wu 0, 272349c55878SDavid Wu 0), 272449c55878SDavid Wu }; 272549c55878SDavid Wu 272649c55878SDavid Wu static struct rockchip_pin_ctrl rk3328_pin_ctrl = { 272749c55878SDavid Wu .pin_banks = rk3328_pin_banks, 272849c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3328_pin_banks), 272949c55878SDavid Wu .label = "RK3328-GPIO", 273049c55878SDavid Wu .type = RK3288, 273149c55878SDavid Wu .grf_mux_offset = 0x0, 273249c55878SDavid Wu .iomux_recalced = rk3328_mux_recalced_data, 273349c55878SDavid Wu .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data), 273449c55878SDavid Wu .iomux_routes = rk3328_mux_route_data, 273549c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data), 273649c55878SDavid Wu .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 273749c55878SDavid Wu .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 273849c55878SDavid Wu .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit, 273949c55878SDavid Wu }; 274049c55878SDavid Wu 274149c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = { 274249c55878SDavid Wu PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, 274349c55878SDavid Wu IOMUX_SOURCE_PMU, 274449c55878SDavid Wu IOMUX_SOURCE_PMU, 274549c55878SDavid Wu IOMUX_SOURCE_PMU 274649c55878SDavid Wu ), 274749c55878SDavid Wu PIN_BANK(1, 32, "gpio1"), 274849c55878SDavid Wu PIN_BANK(2, 32, "gpio2"), 274949c55878SDavid Wu PIN_BANK(3, 32, "gpio3"), 275049c55878SDavid Wu }; 275149c55878SDavid Wu 275249c55878SDavid Wu static struct rockchip_pin_ctrl rk3368_pin_ctrl = { 275349c55878SDavid Wu .pin_banks = rk3368_pin_banks, 275449c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3368_pin_banks), 275549c55878SDavid Wu .label = "RK3368-GPIO", 275649c55878SDavid Wu .type = RK3368, 275749c55878SDavid Wu .grf_mux_offset = 0x0, 275849c55878SDavid Wu .pmu_mux_offset = 0x0, 275949c55878SDavid Wu .pull_calc_reg = rk3368_calc_pull_reg_and_bit, 276049c55878SDavid Wu .drv_calc_reg = rk3368_calc_drv_reg_and_bit, 276149c55878SDavid Wu }; 276249c55878SDavid Wu 276349c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = { 276449c55878SDavid Wu PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0", 276549c55878SDavid Wu IOMUX_SOURCE_PMU, 276649c55878SDavid Wu IOMUX_SOURCE_PMU, 276749c55878SDavid Wu IOMUX_SOURCE_PMU, 276849c55878SDavid Wu IOMUX_SOURCE_PMU, 276949c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 277049c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 277149c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 277249c55878SDavid Wu DRV_TYPE_IO_DEFAULT, 277349c55878SDavid Wu 0x80, 277449c55878SDavid Wu 0x88, 277549c55878SDavid Wu -1, 277649c55878SDavid Wu -1, 277749c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 277849c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 277949c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 278049c55878SDavid Wu PULL_TYPE_IO_DEFAULT 278149c55878SDavid Wu ), 278249c55878SDavid Wu PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU, 278349c55878SDavid Wu IOMUX_SOURCE_PMU, 278449c55878SDavid Wu IOMUX_SOURCE_PMU, 278549c55878SDavid Wu IOMUX_SOURCE_PMU, 278649c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 278749c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 278849c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 278949c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 279049c55878SDavid Wu 0xa0, 279149c55878SDavid Wu 0xa8, 279249c55878SDavid Wu 0xb0, 279349c55878SDavid Wu 0xb8 279449c55878SDavid Wu ), 279549c55878SDavid Wu PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0, 279649c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 279749c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 279849c55878SDavid Wu DRV_TYPE_IO_1V8_ONLY, 279949c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 280049c55878SDavid Wu PULL_TYPE_IO_DEFAULT, 280149c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY, 280249c55878SDavid Wu PULL_TYPE_IO_1V8_ONLY 280349c55878SDavid Wu ), 280449c55878SDavid Wu PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY, 280549c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 280649c55878SDavid Wu DRV_TYPE_IO_3V3_ONLY, 280749c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 280849c55878SDavid Wu ), 280949c55878SDavid Wu PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0, 281049c55878SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 281149c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 281249c55878SDavid Wu DRV_TYPE_IO_1V8_OR_3V0 281349c55878SDavid Wu ), 281449c55878SDavid Wu }; 281549c55878SDavid Wu 281649c55878SDavid Wu static struct rockchip_pin_ctrl rk3399_pin_ctrl = { 281749c55878SDavid Wu .pin_banks = rk3399_pin_banks, 281849c55878SDavid Wu .nr_banks = ARRAY_SIZE(rk3399_pin_banks), 281949c55878SDavid Wu .label = "RK3399-GPIO", 282049c55878SDavid Wu .type = RK3399, 282149c55878SDavid Wu .grf_mux_offset = 0xe000, 282249c55878SDavid Wu .pmu_mux_offset = 0x0, 282349c55878SDavid Wu .grf_drv_offset = 0xe100, 282449c55878SDavid Wu .pmu_drv_offset = 0x80, 282549c55878SDavid Wu .iomux_routes = rk3399_mux_route_data, 282649c55878SDavid Wu .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data), 282749c55878SDavid Wu .pull_calc_reg = rk3399_calc_pull_reg_and_bit, 282849c55878SDavid Wu .drv_calc_reg = rk3399_calc_drv_reg_and_bit, 282949c55878SDavid Wu }; 283049c55878SDavid Wu 283149c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = { 283249c55878SDavid Wu { .compatible = "rockchip,px30-pinctrl", 283349c55878SDavid Wu .data = (ulong)&px30_pin_ctrl }, 283449c55878SDavid Wu { .compatible = "rockchip,rv1108-pinctrl", 283549c55878SDavid Wu .data = (ulong)&rv1108_pin_ctrl }, 2836*a2a3fc8fSJianqun Xu { .compatible = "rockchip,rk1808-pinctrl", 2837*a2a3fc8fSJianqun Xu .data = (ulong)&rk1808_pin_ctrl }, 283849c55878SDavid Wu { .compatible = "rockchip,rk2928-pinctrl", 283949c55878SDavid Wu .data = (ulong)&rk2928_pin_ctrl }, 284049c55878SDavid Wu { .compatible = "rockchip,rk3036-pinctrl", 284149c55878SDavid Wu .data = (ulong)&rk3036_pin_ctrl }, 284249c55878SDavid Wu { .compatible = "rockchip,rk3066a-pinctrl", 284349c55878SDavid Wu .data = (ulong)&rk3066a_pin_ctrl }, 284449c55878SDavid Wu { .compatible = "rockchip,rk3066b-pinctrl", 284549c55878SDavid Wu .data = (ulong)&rk3066b_pin_ctrl }, 284649c55878SDavid Wu { .compatible = "rockchip,rk3128-pinctrl", 284749c55878SDavid Wu .data = (ulong)&rk3128_pin_ctrl }, 284849c55878SDavid Wu { .compatible = "rockchip,rk3188-pinctrl", 284949c55878SDavid Wu .data = (ulong)&rk3188_pin_ctrl }, 285049c55878SDavid Wu { .compatible = "rockchip,rk3228-pinctrl", 285149c55878SDavid Wu .data = (ulong)&rk3228_pin_ctrl }, 285249c55878SDavid Wu { .compatible = "rockchip,rk3288-pinctrl", 285349c55878SDavid Wu .data = (ulong)&rk3288_pin_ctrl }, 2854b3077611SDavid Wu { .compatible = "rockchip,rk3308-pinctrl", 2855b3077611SDavid Wu .data = (ulong)&rk3308_pin_ctrl }, 285649c55878SDavid Wu { .compatible = "rockchip,rk3328-pinctrl", 285749c55878SDavid Wu .data = (ulong)&rk3328_pin_ctrl }, 285849c55878SDavid Wu { .compatible = "rockchip,rk3368-pinctrl", 285949c55878SDavid Wu .data = (ulong)&rk3368_pin_ctrl }, 286049c55878SDavid Wu { .compatible = "rockchip,rk3399-pinctrl", 286149c55878SDavid Wu .data = (ulong)&rk3399_pin_ctrl }, 286249c55878SDavid Wu {}, 286349c55878SDavid Wu }; 286449c55878SDavid Wu 286549c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = { 286649c55878SDavid Wu .name = "rockchip_pinctrl", 286749c55878SDavid Wu .id = UCLASS_PINCTRL, 286849c55878SDavid Wu .of_match = rockchip_pinctrl_dt_match, 286949c55878SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), 287049c55878SDavid Wu .ops = &rockchip_pinctrl_ops, 287149c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA) 287249c55878SDavid Wu .bind = dm_scan_fdt_dev, 287349c55878SDavid Wu #endif 287449c55878SDavid Wu .probe = rockchip_pinctrl_probe, 287549c55878SDavid Wu }; 2876