1f2e4e921SDavid Wu /* SPDX-License-Identifier: GPL-2.0+ */ 2f2e4e921SDavid Wu /* 3f2e4e921SDavid Wu * (C) Copyright 2019 Rockchip Electronics Co., Ltd 4f2e4e921SDavid Wu */ 5f2e4e921SDavid Wu 6f2e4e921SDavid Wu #ifndef __DRIVERS_PINCTRL_ROCKCHIP_H 7f2e4e921SDavid Wu #define __DRIVERS_PINCTRL_ROCKCHIP_H 8f2e4e921SDavid Wu 9b8d3e6ffSJianqun Xu #include <dt-bindings/pinctrl/rockchip.h> 10f2e4e921SDavid Wu #include <linux/types.h> 11f2e4e921SDavid Wu 1236a14c2fSJianqun Xu #define RK_GPIO0_A0 0 1336a14c2fSJianqun Xu #define RK_GPIO0_A1 1 1436a14c2fSJianqun Xu #define RK_GPIO0_A2 2 1536a14c2fSJianqun Xu #define RK_GPIO0_A3 3 1636a14c2fSJianqun Xu #define RK_GPIO0_A4 4 1736a14c2fSJianqun Xu #define RK_GPIO0_A5 5 1836a14c2fSJianqun Xu #define RK_GPIO0_A6 6 1936a14c2fSJianqun Xu #define RK_GPIO0_A7 7 2036a14c2fSJianqun Xu #define RK_GPIO0_B0 8 2136a14c2fSJianqun Xu #define RK_GPIO0_B1 9 2236a14c2fSJianqun Xu #define RK_GPIO0_B2 10 2336a14c2fSJianqun Xu #define RK_GPIO0_B3 11 2436a14c2fSJianqun Xu #define RK_GPIO0_B4 12 2536a14c2fSJianqun Xu #define RK_GPIO0_B5 13 2636a14c2fSJianqun Xu #define RK_GPIO0_B6 14 2736a14c2fSJianqun Xu #define RK_GPIO0_B7 15 2836a14c2fSJianqun Xu #define RK_GPIO0_C0 16 2936a14c2fSJianqun Xu #define RK_GPIO0_C1 17 3036a14c2fSJianqun Xu #define RK_GPIO0_C2 18 3136a14c2fSJianqun Xu #define RK_GPIO0_C3 19 3236a14c2fSJianqun Xu #define RK_GPIO0_C4 20 3336a14c2fSJianqun Xu #define RK_GPIO0_C5 21 3436a14c2fSJianqun Xu #define RK_GPIO0_C6 22 3536a14c2fSJianqun Xu #define RK_GPIO0_C7 23 3636a14c2fSJianqun Xu #define RK_GPIO0_D0 24 3736a14c2fSJianqun Xu #define RK_GPIO0_D1 25 3836a14c2fSJianqun Xu #define RK_GPIO0_D2 26 3936a14c2fSJianqun Xu #define RK_GPIO0_D3 27 4036a14c2fSJianqun Xu #define RK_GPIO0_D4 28 4136a14c2fSJianqun Xu #define RK_GPIO0_D5 29 4236a14c2fSJianqun Xu #define RK_GPIO0_D6 30 4336a14c2fSJianqun Xu #define RK_GPIO0_D7 31 4436a14c2fSJianqun Xu 4536a14c2fSJianqun Xu #define RK_GPIO1_A0 32 4636a14c2fSJianqun Xu #define RK_GPIO1_A1 33 4736a14c2fSJianqun Xu #define RK_GPIO1_A2 34 4836a14c2fSJianqun Xu #define RK_GPIO1_A3 35 4936a14c2fSJianqun Xu #define RK_GPIO1_A4 36 5036a14c2fSJianqun Xu #define RK_GPIO1_A5 37 5136a14c2fSJianqun Xu #define RK_GPIO1_A6 38 5236a14c2fSJianqun Xu #define RK_GPIO1_A7 39 5336a14c2fSJianqun Xu #define RK_GPIO1_B0 40 5436a14c2fSJianqun Xu #define RK_GPIO1_B1 41 5536a14c2fSJianqun Xu #define RK_GPIO1_B2 42 5636a14c2fSJianqun Xu #define RK_GPIO1_B3 43 5736a14c2fSJianqun Xu #define RK_GPIO1_B4 44 5836a14c2fSJianqun Xu #define RK_GPIO1_B5 45 5936a14c2fSJianqun Xu #define RK_GPIO1_B6 46 6036a14c2fSJianqun Xu #define RK_GPIO1_B7 47 6136a14c2fSJianqun Xu #define RK_GPIO1_C0 48 6236a14c2fSJianqun Xu #define RK_GPIO1_C1 49 6336a14c2fSJianqun Xu #define RK_GPIO1_C2 50 6436a14c2fSJianqun Xu #define RK_GPIO1_C3 51 6536a14c2fSJianqun Xu #define RK_GPIO1_C4 52 6636a14c2fSJianqun Xu #define RK_GPIO1_C5 53 6736a14c2fSJianqun Xu #define RK_GPIO1_C6 54 6836a14c2fSJianqun Xu #define RK_GPIO1_C7 55 6936a14c2fSJianqun Xu #define RK_GPIO1_D0 56 7036a14c2fSJianqun Xu #define RK_GPIO1_D1 57 7136a14c2fSJianqun Xu #define RK_GPIO1_D2 58 7236a14c2fSJianqun Xu #define RK_GPIO1_D3 59 7336a14c2fSJianqun Xu #define RK_GPIO1_D4 60 7436a14c2fSJianqun Xu #define RK_GPIO1_D5 61 7536a14c2fSJianqun Xu #define RK_GPIO1_D6 62 7636a14c2fSJianqun Xu #define RK_GPIO1_D7 63 7736a14c2fSJianqun Xu 7836a14c2fSJianqun Xu #define RK_GPIO2_A0 64 7936a14c2fSJianqun Xu #define RK_GPIO2_A1 65 8036a14c2fSJianqun Xu #define RK_GPIO2_A2 66 8136a14c2fSJianqun Xu #define RK_GPIO2_A3 67 8236a14c2fSJianqun Xu #define RK_GPIO2_A4 68 8336a14c2fSJianqun Xu #define RK_GPIO2_A5 69 8436a14c2fSJianqun Xu #define RK_GPIO2_A6 70 8536a14c2fSJianqun Xu #define RK_GPIO2_A7 71 8636a14c2fSJianqun Xu #define RK_GPIO2_B0 72 8736a14c2fSJianqun Xu #define RK_GPIO2_B1 73 8836a14c2fSJianqun Xu #define RK_GPIO2_B2 74 8936a14c2fSJianqun Xu #define RK_GPIO2_B3 75 9036a14c2fSJianqun Xu #define RK_GPIO2_B4 76 9136a14c2fSJianqun Xu #define RK_GPIO2_B5 77 9236a14c2fSJianqun Xu #define RK_GPIO2_B6 78 9336a14c2fSJianqun Xu #define RK_GPIO2_B7 79 9436a14c2fSJianqun Xu #define RK_GPIO2_C0 80 9536a14c2fSJianqun Xu #define RK_GPIO2_C1 81 9636a14c2fSJianqun Xu #define RK_GPIO2_C2 82 9736a14c2fSJianqun Xu #define RK_GPIO2_C3 83 9836a14c2fSJianqun Xu #define RK_GPIO2_C4 84 9936a14c2fSJianqun Xu #define RK_GPIO2_C5 85 10036a14c2fSJianqun Xu #define RK_GPIO2_C6 86 10136a14c2fSJianqun Xu #define RK_GPIO2_C7 87 10236a14c2fSJianqun Xu #define RK_GPIO2_D0 88 10336a14c2fSJianqun Xu #define RK_GPIO2_D1 89 10436a14c2fSJianqun Xu #define RK_GPIO2_D2 90 10536a14c2fSJianqun Xu #define RK_GPIO2_D3 91 10636a14c2fSJianqun Xu #define RK_GPIO2_D4 92 10736a14c2fSJianqun Xu #define RK_GPIO2_D5 93 10836a14c2fSJianqun Xu #define RK_GPIO2_D6 94 10936a14c2fSJianqun Xu #define RK_GPIO2_D7 95 11036a14c2fSJianqun Xu 11136a14c2fSJianqun Xu #define RK_GPIO3_A0 96 11236a14c2fSJianqun Xu #define RK_GPIO3_A1 97 11336a14c2fSJianqun Xu #define RK_GPIO3_A2 98 11436a14c2fSJianqun Xu #define RK_GPIO3_A3 99 11536a14c2fSJianqun Xu #define RK_GPIO3_A4 100 11636a14c2fSJianqun Xu #define RK_GPIO3_A5 101 11736a14c2fSJianqun Xu #define RK_GPIO3_A6 102 11836a14c2fSJianqun Xu #define RK_GPIO3_A7 103 11936a14c2fSJianqun Xu #define RK_GPIO3_B0 104 12036a14c2fSJianqun Xu #define RK_GPIO3_B1 105 12136a14c2fSJianqun Xu #define RK_GPIO3_B2 106 12236a14c2fSJianqun Xu #define RK_GPIO3_B3 107 12336a14c2fSJianqun Xu #define RK_GPIO3_B4 108 12436a14c2fSJianqun Xu #define RK_GPIO3_B5 109 12536a14c2fSJianqun Xu #define RK_GPIO3_B6 110 12636a14c2fSJianqun Xu #define RK_GPIO3_B7 111 12736a14c2fSJianqun Xu #define RK_GPIO3_C0 112 12836a14c2fSJianqun Xu #define RK_GPIO3_C1 113 12936a14c2fSJianqun Xu #define RK_GPIO3_C2 114 13036a14c2fSJianqun Xu #define RK_GPIO3_C3 115 13136a14c2fSJianqun Xu #define RK_GPIO3_C4 116 13236a14c2fSJianqun Xu #define RK_GPIO3_C5 117 13336a14c2fSJianqun Xu #define RK_GPIO3_C6 118 13436a14c2fSJianqun Xu #define RK_GPIO3_C7 119 13536a14c2fSJianqun Xu #define RK_GPIO3_D0 120 13636a14c2fSJianqun Xu #define RK_GPIO3_D1 121 13736a14c2fSJianqun Xu #define RK_GPIO3_D2 122 13836a14c2fSJianqun Xu #define RK_GPIO3_D3 123 13936a14c2fSJianqun Xu #define RK_GPIO3_D4 124 14036a14c2fSJianqun Xu #define RK_GPIO3_D5 125 14136a14c2fSJianqun Xu #define RK_GPIO3_D6 126 14236a14c2fSJianqun Xu #define RK_GPIO3_D7 127 14336a14c2fSJianqun Xu 14436a14c2fSJianqun Xu #define RK_GPIO4_A0 128 14536a14c2fSJianqun Xu #define RK_GPIO4_A1 129 14636a14c2fSJianqun Xu #define RK_GPIO4_A2 130 14736a14c2fSJianqun Xu #define RK_GPIO4_A3 131 14836a14c2fSJianqun Xu #define RK_GPIO4_A4 132 14936a14c2fSJianqun Xu #define RK_GPIO4_A5 133 15036a14c2fSJianqun Xu #define RK_GPIO4_A6 134 15136a14c2fSJianqun Xu #define RK_GPIO4_A7 135 15236a14c2fSJianqun Xu #define RK_GPIO4_B0 136 15336a14c2fSJianqun Xu #define RK_GPIO4_B1 137 15436a14c2fSJianqun Xu #define RK_GPIO4_B2 138 15536a14c2fSJianqun Xu #define RK_GPIO4_B3 139 15636a14c2fSJianqun Xu #define RK_GPIO4_B4 140 15736a14c2fSJianqun Xu #define RK_GPIO4_B5 141 15836a14c2fSJianqun Xu #define RK_GPIO4_B6 142 15936a14c2fSJianqun Xu #define RK_GPIO4_B7 143 16036a14c2fSJianqun Xu #define RK_GPIO4_C0 144 16136a14c2fSJianqun Xu #define RK_GPIO4_C1 145 16236a14c2fSJianqun Xu #define RK_GPIO4_C2 146 16336a14c2fSJianqun Xu #define RK_GPIO4_C3 147 16436a14c2fSJianqun Xu #define RK_GPIO4_C4 148 16536a14c2fSJianqun Xu #define RK_GPIO4_C5 149 16636a14c2fSJianqun Xu #define RK_GPIO4_C6 150 16736a14c2fSJianqun Xu #define RK_GPIO4_C7 151 16836a14c2fSJianqun Xu #define RK_GPIO4_D0 152 16936a14c2fSJianqun Xu #define RK_GPIO4_D1 153 17036a14c2fSJianqun Xu #define RK_GPIO4_D2 154 17136a14c2fSJianqun Xu #define RK_GPIO4_D3 155 17236a14c2fSJianqun Xu #define RK_GPIO4_D4 156 17336a14c2fSJianqun Xu #define RK_GPIO4_D5 157 17436a14c2fSJianqun Xu #define RK_GPIO4_D6 158 17536a14c2fSJianqun Xu #define RK_GPIO4_D7 159 17636a14c2fSJianqun Xu 177b8d3e6ffSJianqun Xu #define RK_GENMASK_VAL(h, l, v) \ 178b8d3e6ffSJianqun Xu (GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l)))) 179b8d3e6ffSJianqun Xu 180f2e4e921SDavid Wu /** 181f2e4e921SDavid Wu * Encode variants of iomux registers into a type variable 182f2e4e921SDavid Wu */ 183f2e4e921SDavid Wu #define IOMUX_GPIO_ONLY BIT(0) 184f2e4e921SDavid Wu #define IOMUX_WIDTH_4BIT BIT(1) 185f2e4e921SDavid Wu #define IOMUX_SOURCE_PMU BIT(2) 186f2e4e921SDavid Wu #define IOMUX_UNROUTED BIT(3) 187f2e4e921SDavid Wu #define IOMUX_WIDTH_3BIT BIT(4) 188b8d3e6ffSJianqun Xu #define IOMUX_8WIDTH_2BIT BIT(5) 189b8d3e6ffSJianqun Xu #define IOMUX_WRITABLE_32BIT BIT(6) 190b8d3e6ffSJianqun Xu #define IOMUX_L_SOURCE_PMU BIT(7) 191f2e4e921SDavid Wu 192f2e4e921SDavid Wu /** 193f2e4e921SDavid Wu * Defined some common pins constants 194f2e4e921SDavid Wu */ 195f2e4e921SDavid Wu #define ROCKCHIP_PULL_BITS_PER_PIN 2 196f2e4e921SDavid Wu #define ROCKCHIP_PULL_PINS_PER_REG 8 197f2e4e921SDavid Wu #define ROCKCHIP_PULL_BANK_STRIDE 16 198f2e4e921SDavid Wu #define ROCKCHIP_DRV_BITS_PER_PIN 2 199f2e4e921SDavid Wu #define ROCKCHIP_DRV_PINS_PER_REG 8 200f2e4e921SDavid Wu #define ROCKCHIP_DRV_BANK_STRIDE 16 201f2e4e921SDavid Wu #define ROCKCHIP_DRV_3BITS_PER_PIN 3 202f2e4e921SDavid Wu 203f2e4e921SDavid Wu /** 204f2e4e921SDavid Wu * @type: iomux variant using IOMUX_* constants 205f2e4e921SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 206f2e4e921SDavid Wu * an initial offset value the relevant source offset can be reset 207f2e4e921SDavid Wu * to a new value for autocalculating the following iomux registers. 208f2e4e921SDavid Wu */ 209f2e4e921SDavid Wu struct rockchip_iomux { 210f2e4e921SDavid Wu int type; 211f2e4e921SDavid Wu int offset; 212f2e4e921SDavid Wu }; 213f2e4e921SDavid Wu 21449b3d5d5SDavid Wu #define DRV_TYPE_IO_MASK GENMASK(31, 16) 21549b3d5d5SDavid Wu #define DRV_TYPE_WRITABLE_32BIT BIT(31) 21649b3d5d5SDavid Wu 217f2e4e921SDavid Wu /** 218f2e4e921SDavid Wu * enum type index corresponding to rockchip_perpin_drv_list arrays index. 219f2e4e921SDavid Wu */ 220f2e4e921SDavid Wu enum rockchip_pin_drv_type { 221f2e4e921SDavid Wu DRV_TYPE_IO_DEFAULT = 0, 222f2e4e921SDavid Wu DRV_TYPE_IO_1V8_OR_3V0, 223f2e4e921SDavid Wu DRV_TYPE_IO_1V8_ONLY, 224f2e4e921SDavid Wu DRV_TYPE_IO_1V8_3V0_AUTO, 225f2e4e921SDavid Wu DRV_TYPE_IO_3V3_ONLY, 226f2e4e921SDavid Wu DRV_TYPE_MAX 227f2e4e921SDavid Wu }; 228f2e4e921SDavid Wu 22949b3d5d5SDavid Wu #define PULL_TYPE_IO_MASK GENMASK(31, 16) 23049b3d5d5SDavid Wu #define PULL_TYPE_WRITABLE_32BIT BIT(31) 23149b3d5d5SDavid Wu 232f2e4e921SDavid Wu /** 233f2e4e921SDavid Wu * enum type index corresponding to rockchip_pull_list arrays index. 234f2e4e921SDavid Wu */ 235f2e4e921SDavid Wu enum rockchip_pin_pull_type { 236f2e4e921SDavid Wu PULL_TYPE_IO_DEFAULT = 0, 237f2e4e921SDavid Wu PULL_TYPE_IO_1V8_ONLY, 238f1155765SSteven Liu PULL_TYPE_IO_1 = 1, 239f2e4e921SDavid Wu PULL_TYPE_MAX 240f2e4e921SDavid Wu }; 241f2e4e921SDavid Wu 242f2e4e921SDavid Wu /** 243b8d3e6ffSJianqun Xu * enum mux route register type, should be invalid/default/topgrf/pmugrf. 244b8d3e6ffSJianqun Xu * INVALID: means do not need to set mux route 245b8d3e6ffSJianqun Xu * DEFAULT: means same regmap as pin iomux 246b8d3e6ffSJianqun Xu * TOPGRF: means mux route setting in topgrf 247b8d3e6ffSJianqun Xu * PMUGRF: means mux route setting in pmugrf 248b8d3e6ffSJianqun Xu */ 249b8d3e6ffSJianqun Xu enum rockchip_pin_route_type { 250b8d3e6ffSJianqun Xu ROUTE_TYPE_DEFAULT = 0, 251b8d3e6ffSJianqun Xu ROUTE_TYPE_TOPGRF = 1, 252b8d3e6ffSJianqun Xu ROUTE_TYPE_PMUGRF = 2, 253b8d3e6ffSJianqun Xu 254b8d3e6ffSJianqun Xu ROUTE_TYPE_INVALID = -1, 255b8d3e6ffSJianqun Xu }; 256b8d3e6ffSJianqun Xu 257b8d3e6ffSJianqun Xu /** 258f2e4e921SDavid Wu * @drv_type: drive strength variant using rockchip_perpin_drv_type 259f2e4e921SDavid Wu * @offset: if initialized to -1 it will be autocalculated, by specifying 260f2e4e921SDavid Wu * an initial offset value the relevant source offset can be reset 261f2e4e921SDavid Wu * to a new value for autocalculating the following drive strength 262f2e4e921SDavid Wu * registers. if used chips own cal_drv func instead to calculate 263f2e4e921SDavid Wu * registers offset, the variant could be ignored. 264f2e4e921SDavid Wu */ 265f2e4e921SDavid Wu struct rockchip_drv { 266f2e4e921SDavid Wu enum rockchip_pin_drv_type drv_type; 267f2e4e921SDavid Wu int offset; 268f2e4e921SDavid Wu }; 269f2e4e921SDavid Wu 270f2e4e921SDavid Wu /** 271f2e4e921SDavid Wu * @priv: common pinctrl private basedata 272f2e4e921SDavid Wu * @pin_base: first pin number 273f2e4e921SDavid Wu * @nr_pins: number of pins in this bank 274f2e4e921SDavid Wu * @name: name of the bank 275f2e4e921SDavid Wu * @bank_num: number of the bank, to account for holes 276f2e4e921SDavid Wu * @iomux: array describing the 4 iomux sources of the bank 277f2e4e921SDavid Wu * @drv: array describing the 4 drive strength sources of the bank 278f2e4e921SDavid Wu * @pull_type: array describing the 4 pull type sources of the bank 279f2e4e921SDavid Wu * @recalced_mask: bits describing the mux recalced pins of per bank 280f2e4e921SDavid Wu * @route_mask: bits describing the routing pins of per bank 281f2e4e921SDavid Wu */ 282f2e4e921SDavid Wu struct rockchip_pin_bank { 283f2e4e921SDavid Wu struct rockchip_pinctrl_priv *priv; 284f2e4e921SDavid Wu u32 pin_base; 285f2e4e921SDavid Wu u8 nr_pins; 286f2e4e921SDavid Wu char *name; 287f2e4e921SDavid Wu u8 bank_num; 288f2e4e921SDavid Wu struct rockchip_iomux iomux[4]; 289f2e4e921SDavid Wu struct rockchip_drv drv[4]; 290f2e4e921SDavid Wu enum rockchip_pin_pull_type pull_type[4]; 291f2e4e921SDavid Wu u32 recalced_mask; 292f2e4e921SDavid Wu u32 route_mask; 293f2e4e921SDavid Wu }; 294f2e4e921SDavid Wu 295f2e4e921SDavid Wu #define PIN_BANK(id, pins, label) \ 296f2e4e921SDavid Wu { \ 297f2e4e921SDavid Wu .bank_num = id, \ 298f2e4e921SDavid Wu .nr_pins = pins, \ 299f2e4e921SDavid Wu .name = label, \ 300f2e4e921SDavid Wu .iomux = { \ 301f2e4e921SDavid Wu { .offset = -1 }, \ 302f2e4e921SDavid Wu { .offset = -1 }, \ 303f2e4e921SDavid Wu { .offset = -1 }, \ 304f2e4e921SDavid Wu { .offset = -1 }, \ 305f2e4e921SDavid Wu }, \ 306f2e4e921SDavid Wu } 307f2e4e921SDavid Wu 308f2e4e921SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 309f2e4e921SDavid Wu { \ 310f2e4e921SDavid Wu .bank_num = id, \ 311f2e4e921SDavid Wu .nr_pins = pins, \ 312f2e4e921SDavid Wu .name = label, \ 313f2e4e921SDavid Wu .iomux = { \ 314f2e4e921SDavid Wu { .type = iom0, .offset = -1 }, \ 315f2e4e921SDavid Wu { .type = iom1, .offset = -1 }, \ 316f2e4e921SDavid Wu { .type = iom2, .offset = -1 }, \ 317f2e4e921SDavid Wu { .type = iom3, .offset = -1 }, \ 318f2e4e921SDavid Wu }, \ 319f2e4e921SDavid Wu } 320f2e4e921SDavid Wu 321b8d3e6ffSJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, \ 322b8d3e6ffSJianqun Xu iom3, offset0, offset1, offset2, \ 323b8d3e6ffSJianqun Xu offset3) \ 324b8d3e6ffSJianqun Xu { \ 325b8d3e6ffSJianqun Xu .bank_num = id, \ 326b8d3e6ffSJianqun Xu .nr_pins = pins, \ 327b8d3e6ffSJianqun Xu .name = label, \ 328b8d3e6ffSJianqun Xu .iomux = { \ 329b8d3e6ffSJianqun Xu { .type = iom0, .offset = offset0 }, \ 330b8d3e6ffSJianqun Xu { .type = iom1, .offset = offset1 }, \ 331b8d3e6ffSJianqun Xu { .type = iom2, .offset = offset2 }, \ 332b8d3e6ffSJianqun Xu { .type = iom3, .offset = offset3 }, \ 333b8d3e6ffSJianqun Xu }, \ 334b8d3e6ffSJianqun Xu } 335b8d3e6ffSJianqun Xu 336f1155765SSteven Liu #define PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(id, pins, label, iom0, \ 337f1155765SSteven Liu iom1, iom2, iom3, \ 338f1155765SSteven Liu offset0, offset1, \ 339f1155765SSteven Liu offset2, offset3, pull0, \ 340f1155765SSteven Liu pull1, pull2, pull3) \ 341f1155765SSteven Liu { \ 342f1155765SSteven Liu .bank_num = id, \ 343f1155765SSteven Liu .nr_pins = pins, \ 344f1155765SSteven Liu .name = label, \ 345f1155765SSteven Liu .iomux = { \ 346f1155765SSteven Liu { .type = iom0, .offset = offset0 }, \ 347f1155765SSteven Liu { .type = iom1, .offset = offset1 }, \ 348f1155765SSteven Liu { .type = iom2, .offset = offset2 }, \ 349f1155765SSteven Liu { .type = iom3, .offset = offset3 }, \ 350f1155765SSteven Liu }, \ 351f1155765SSteven Liu .pull_type[0] = pull0, \ 352f1155765SSteven Liu .pull_type[1] = pull1, \ 353f1155765SSteven Liu .pull_type[2] = pull2, \ 354f1155765SSteven Liu .pull_type[3] = pull3, \ 355f1155765SSteven Liu } 356f1155765SSteven Liu 357f2e4e921SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 358f2e4e921SDavid Wu { \ 359f2e4e921SDavid Wu .bank_num = id, \ 360f2e4e921SDavid Wu .nr_pins = pins, \ 361f2e4e921SDavid Wu .name = label, \ 362f2e4e921SDavid Wu .iomux = { \ 363f2e4e921SDavid Wu { .offset = -1 }, \ 364f2e4e921SDavid Wu { .offset = -1 }, \ 365f2e4e921SDavid Wu { .offset = -1 }, \ 366f2e4e921SDavid Wu { .offset = -1 }, \ 367f2e4e921SDavid Wu }, \ 368f2e4e921SDavid Wu .drv = { \ 369f2e4e921SDavid Wu { .drv_type = type0, .offset = -1 }, \ 370f2e4e921SDavid Wu { .drv_type = type1, .offset = -1 }, \ 371f2e4e921SDavid Wu { .drv_type = type2, .offset = -1 }, \ 372f2e4e921SDavid Wu { .drv_type = type3, .offset = -1 }, \ 373f2e4e921SDavid Wu }, \ 374f2e4e921SDavid Wu } 375f2e4e921SDavid Wu 37636a14c2fSJianqun Xu #define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(id, pins, label, iom0, iom1, \ 37736a14c2fSJianqun Xu iom2, iom3, pull0, pull1, \ 37836a14c2fSJianqun Xu pull2, pull3) \ 37936a14c2fSJianqun Xu { \ 38036a14c2fSJianqun Xu .bank_num = id, \ 38136a14c2fSJianqun Xu .nr_pins = pins, \ 38236a14c2fSJianqun Xu .name = label, \ 38336a14c2fSJianqun Xu .iomux = { \ 38436a14c2fSJianqun Xu { .type = iom0, .offset = -1 }, \ 38536a14c2fSJianqun Xu { .type = iom1, .offset = -1 }, \ 38636a14c2fSJianqun Xu { .type = iom2, .offset = -1 }, \ 38736a14c2fSJianqun Xu { .type = iom3, .offset = -1 }, \ 38836a14c2fSJianqun Xu }, \ 38936a14c2fSJianqun Xu .pull_type[0] = pull0, \ 39036a14c2fSJianqun Xu .pull_type[1] = pull1, \ 39136a14c2fSJianqun Xu .pull_type[2] = pull2, \ 39236a14c2fSJianqun Xu .pull_type[3] = pull3, \ 39336a14c2fSJianqun Xu } 39436a14c2fSJianqun Xu 395f2e4e921SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \ 396f2e4e921SDavid Wu drv2, drv3, pull0, pull1, \ 397f2e4e921SDavid Wu pull2, pull3) \ 398f2e4e921SDavid Wu { \ 399f2e4e921SDavid Wu .bank_num = id, \ 400f2e4e921SDavid Wu .nr_pins = pins, \ 401f2e4e921SDavid Wu .name = label, \ 402f2e4e921SDavid Wu .iomux = { \ 403f2e4e921SDavid Wu { .offset = -1 }, \ 404f2e4e921SDavid Wu { .offset = -1 }, \ 405f2e4e921SDavid Wu { .offset = -1 }, \ 406f2e4e921SDavid Wu { .offset = -1 }, \ 407f2e4e921SDavid Wu }, \ 408f2e4e921SDavid Wu .drv = { \ 409f2e4e921SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 410f2e4e921SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 411f2e4e921SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 412f2e4e921SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 413f2e4e921SDavid Wu }, \ 414f2e4e921SDavid Wu .pull_type[0] = pull0, \ 415f2e4e921SDavid Wu .pull_type[1] = pull1, \ 416f2e4e921SDavid Wu .pull_type[2] = pull2, \ 417f2e4e921SDavid Wu .pull_type[3] = pull3, \ 418f2e4e921SDavid Wu } 419f2e4e921SDavid Wu 420f2e4e921SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \ 421f2e4e921SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 422f2e4e921SDavid Wu drv3, offset0, offset1, \ 423f2e4e921SDavid Wu offset2, offset3) \ 424f2e4e921SDavid Wu { \ 425f2e4e921SDavid Wu .bank_num = id, \ 426f2e4e921SDavid Wu .nr_pins = pins, \ 427f2e4e921SDavid Wu .name = label, \ 428f2e4e921SDavid Wu .iomux = { \ 429f2e4e921SDavid Wu { .type = iom0, .offset = -1 }, \ 430f2e4e921SDavid Wu { .type = iom1, .offset = -1 }, \ 431f2e4e921SDavid Wu { .type = iom2, .offset = -1 }, \ 432f2e4e921SDavid Wu { .type = iom3, .offset = -1 }, \ 433f2e4e921SDavid Wu }, \ 434f2e4e921SDavid Wu .drv = { \ 435f2e4e921SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 436f2e4e921SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 437f2e4e921SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 438f2e4e921SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 439f2e4e921SDavid Wu }, \ 440f2e4e921SDavid Wu } 441f2e4e921SDavid Wu 44249b3d5d5SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1, \ 44349b3d5d5SDavid Wu iom2, iom3, drv0, drv1, drv2, \ 44449b3d5d5SDavid Wu drv3, pull0, pull1, pull2, \ 44549b3d5d5SDavid Wu pull3) \ 44649b3d5d5SDavid Wu { \ 44749b3d5d5SDavid Wu .bank_num = id, \ 44849b3d5d5SDavid Wu .nr_pins = pins, \ 44949b3d5d5SDavid Wu .name = label, \ 45049b3d5d5SDavid Wu .iomux = { \ 45149b3d5d5SDavid Wu { .type = iom0, .offset = -1 }, \ 45249b3d5d5SDavid Wu { .type = iom1, .offset = -1 }, \ 45349b3d5d5SDavid Wu { .type = iom2, .offset = -1 }, \ 45449b3d5d5SDavid Wu { .type = iom3, .offset = -1 }, \ 45549b3d5d5SDavid Wu }, \ 45649b3d5d5SDavid Wu .drv = { \ 45749b3d5d5SDavid Wu { .drv_type = drv0, .offset = -1 }, \ 45849b3d5d5SDavid Wu { .drv_type = drv1, .offset = -1 }, \ 45949b3d5d5SDavid Wu { .drv_type = drv2, .offset = -1 }, \ 46049b3d5d5SDavid Wu { .drv_type = drv3, .offset = -1 }, \ 46149b3d5d5SDavid Wu }, \ 46249b3d5d5SDavid Wu .pull_type[0] = pull0, \ 46349b3d5d5SDavid Wu .pull_type[1] = pull1, \ 46449b3d5d5SDavid Wu .pull_type[2] = pull2, \ 46549b3d5d5SDavid Wu .pull_type[3] = pull3, \ 46649b3d5d5SDavid Wu } 46749b3d5d5SDavid Wu 468f2e4e921SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \ 469f2e4e921SDavid Wu label, iom0, iom1, iom2, \ 470f2e4e921SDavid Wu iom3, drv0, drv1, drv2, \ 471f2e4e921SDavid Wu drv3, offset0, offset1, \ 472f2e4e921SDavid Wu offset2, offset3, pull0, \ 473f2e4e921SDavid Wu pull1, pull2, pull3) \ 474f2e4e921SDavid Wu { \ 475f2e4e921SDavid Wu .bank_num = id, \ 476f2e4e921SDavid Wu .nr_pins = pins, \ 477f2e4e921SDavid Wu .name = label, \ 478f2e4e921SDavid Wu .iomux = { \ 479f2e4e921SDavid Wu { .type = iom0, .offset = -1 }, \ 480f2e4e921SDavid Wu { .type = iom1, .offset = -1 }, \ 481f2e4e921SDavid Wu { .type = iom2, .offset = -1 }, \ 482f2e4e921SDavid Wu { .type = iom3, .offset = -1 }, \ 483f2e4e921SDavid Wu }, \ 484f2e4e921SDavid Wu .drv = { \ 485f2e4e921SDavid Wu { .drv_type = drv0, .offset = offset0 }, \ 486f2e4e921SDavid Wu { .drv_type = drv1, .offset = offset1 }, \ 487f2e4e921SDavid Wu { .drv_type = drv2, .offset = offset2 }, \ 488f2e4e921SDavid Wu { .drv_type = drv3, .offset = offset3 }, \ 489f2e4e921SDavid Wu }, \ 490f2e4e921SDavid Wu .pull_type[0] = pull0, \ 491f2e4e921SDavid Wu .pull_type[1] = pull1, \ 492f2e4e921SDavid Wu .pull_type[2] = pull2, \ 493f2e4e921SDavid Wu .pull_type[3] = pull3, \ 494f2e4e921SDavid Wu } 495f2e4e921SDavid Wu 496b8d3e6ffSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \ 497b8d3e6ffSJianqun Xu { \ 498b8d3e6ffSJianqun Xu .bank_num = ID, \ 499b8d3e6ffSJianqun Xu .pin = PIN, \ 500b8d3e6ffSJianqun Xu .func = FUNC, \ 501b8d3e6ffSJianqun Xu .route_offset = REG, \ 502b8d3e6ffSJianqun Xu .route_val = VAL, \ 503b8d3e6ffSJianqun Xu .route_type = FLAG, \ 504b8d3e6ffSJianqun Xu } 505b8d3e6ffSJianqun Xu 506b8d3e6ffSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL) \ 507b8d3e6ffSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT) 508b8d3e6ffSJianqun Xu 509b8d3e6ffSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL) \ 510b8d3e6ffSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF) 511b8d3e6ffSJianqun Xu 512b8d3e6ffSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL) \ 513b8d3e6ffSJianqun Xu PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF) 514b8d3e6ffSJianqun Xu 51536a14c2fSJianqun Xu #define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P) \ 51636a14c2fSJianqun Xu PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P) 51736a14c2fSJianqun Xu 518*b653b9e8SYe Zhang #define PIN_BANK_IOMUX_4_OFFSET(id, pins, label, offset0, offset1, \ 519*b653b9e8SYe Zhang offset2, offset3) \ 520*b653b9e8SYe Zhang PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, IOMUX_WIDTH_4BIT, \ 521*b653b9e8SYe Zhang IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, \ 522*b653b9e8SYe Zhang IOMUX_WIDTH_4BIT, offset0, offset1, \ 523*b653b9e8SYe Zhang offset2, offset3) 524*b653b9e8SYe Zhang 525f2e4e921SDavid Wu /** 526f2e4e921SDavid Wu * struct rockchip_mux_recalced_data: recalculate a pin iomux data. 527f2e4e921SDavid Wu * @num: bank number. 528f2e4e921SDavid Wu * @pin: pin number. 529f2e4e921SDavid Wu * @reg: register offset. 530f2e4e921SDavid Wu * @bit: index at register. 531f2e4e921SDavid Wu * @mask: mask bit 532f2e4e921SDavid Wu */ 533f2e4e921SDavid Wu struct rockchip_mux_recalced_data { 534f2e4e921SDavid Wu u8 num; 535f2e4e921SDavid Wu u8 pin; 536f2e4e921SDavid Wu u32 reg; 537f2e4e921SDavid Wu u8 bit; 538f2e4e921SDavid Wu u8 mask; 539f2e4e921SDavid Wu }; 540f2e4e921SDavid Wu 541f2e4e921SDavid Wu /** 542f2e4e921SDavid Wu * struct rockchip_mux_route_data: route a pin iomux data. 543f2e4e921SDavid Wu * @bank_num: bank number. 544f2e4e921SDavid Wu * @pin: index at register or used to calc index. 545f2e4e921SDavid Wu * @func: the min pin. 546b8d3e6ffSJianqun Xu * @route_type: the register type. 547f2e4e921SDavid Wu * @route_offset: the max pin. 548f2e4e921SDavid Wu * @route_val: the register offset. 549f2e4e921SDavid Wu */ 550f2e4e921SDavid Wu struct rockchip_mux_route_data { 551f2e4e921SDavid Wu u8 bank_num; 552f2e4e921SDavid Wu u8 pin; 553f2e4e921SDavid Wu u8 func; 554b8d3e6ffSJianqun Xu enum rockchip_pin_route_type route_type : 8; 555f2e4e921SDavid Wu u32 route_offset; 556f2e4e921SDavid Wu u32 route_val; 557f2e4e921SDavid Wu }; 558f2e4e921SDavid Wu 559f2e4e921SDavid Wu /** 560f2e4e921SDavid Wu */ 561f2e4e921SDavid Wu struct rockchip_pin_ctrl { 562f2e4e921SDavid Wu struct rockchip_pin_bank *pin_banks; 563f2e4e921SDavid Wu u32 nr_banks; 564f2e4e921SDavid Wu u32 nr_pins; 565f2e4e921SDavid Wu int grf_mux_offset; 566f2e4e921SDavid Wu int pmu_mux_offset; 567f2e4e921SDavid Wu int grf_drv_offset; 568f2e4e921SDavid Wu int pmu_drv_offset; 569f2e4e921SDavid Wu struct rockchip_mux_recalced_data *iomux_recalced; 570f2e4e921SDavid Wu u32 niomux_recalced; 571f2e4e921SDavid Wu struct rockchip_mux_route_data *iomux_routes; 572f2e4e921SDavid Wu u32 niomux_routes; 573f2e4e921SDavid Wu 5745f55bbd7SDavid Wu int (*set_mux)(struct rockchip_pin_bank *bank, 5755f55bbd7SDavid Wu int pin, int mux); 57605a5688eSDavid Wu int (*set_pull)(struct rockchip_pin_bank *bank, 57705a5688eSDavid Wu int pin_num, int pull); 578681441e6SDavid Wu int (*set_drive)(struct rockchip_pin_bank *bank, 579681441e6SDavid Wu int pin_num, int strength); 5805635c457SDavid Wu int (*set_schmitt)(struct rockchip_pin_bank *bank, 5815635c457SDavid Wu int pin_num, int enable); 582f2e4e921SDavid Wu }; 583f2e4e921SDavid Wu 584f2e4e921SDavid Wu /** 585f2e4e921SDavid Wu */ 586f2e4e921SDavid Wu struct rockchip_pinctrl_priv { 587f2e4e921SDavid Wu struct rockchip_pin_ctrl *ctrl; 588f2e4e921SDavid Wu struct regmap *regmap_base; 589f2e4e921SDavid Wu struct regmap *regmap_pmu; 5903fd22dcdSYe Zhang struct regmap *regmap_ioc1; 5913fd22dcdSYe Zhang struct regmap *regmap_rmio; 592f2e4e921SDavid Wu }; 593f2e4e921SDavid Wu 594f2e4e921SDavid Wu extern const struct pinctrl_ops rockchip_pinctrl_ops; 595f2e4e921SDavid Wu int rockchip_pinctrl_probe(struct udevice *dev); 5965f55bbd7SDavid Wu void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, 5975f55bbd7SDavid Wu int *reg, u8 *bit, int *mask); 5985f55bbd7SDavid Wu int rockchip_get_mux_data(int mux_type, int pin, u8 *bit, int *mask); 599681441e6SDavid Wu int rockchip_translate_drive_value(int type, int strength); 60005a5688eSDavid Wu int rockchip_translate_pull_value(int type, int pull); 601f2e4e921SDavid Wu 602f2e4e921SDavid Wu #endif /* __DRIVERS_PINCTRL_ROCKCHIP_H */ 603