0001
0002
0003
0004
0005
0006 #include <linux/io.h>
0007 #include <linux/of_device.h>
0008 #include <linux/clk.h>
0009 #include <linux/mfd/syscon.h>
0010 #include <linux/platform_device.h>
0011 #include <linux/bitfield.h>
0012 #include <linux/regmap.h>
0013 #include <linux/slab.h>
0014 #include <linux/pinctrl/pinctrl.h>
0015 #include <linux/pinctrl/pinmux.h>
0016 #include <linux/pinctrl/pinconf.h>
0017 #include <linux/pinctrl/pinconf-generic.h>
0018
0019 #include <dt-bindings/pinctrl/k210-fpioa.h>
0020
0021 #include "core.h"
0022 #include "pinconf.h"
0023 #include "pinctrl-utils.h"
0024
0025
0026
0027
0028
0029 #define K210_PC_DRIVE_MASK GENMASK(11, 8)
0030 #define K210_PC_DRIVE_SHIFT 8
0031 #define K210_PC_DRIVE_0 (0 << K210_PC_DRIVE_SHIFT)
0032 #define K210_PC_DRIVE_1 (1 << K210_PC_DRIVE_SHIFT)
0033 #define K210_PC_DRIVE_2 (2 << K210_PC_DRIVE_SHIFT)
0034 #define K210_PC_DRIVE_3 (3 << K210_PC_DRIVE_SHIFT)
0035 #define K210_PC_DRIVE_4 (4 << K210_PC_DRIVE_SHIFT)
0036 #define K210_PC_DRIVE_5 (5 << K210_PC_DRIVE_SHIFT)
0037 #define K210_PC_DRIVE_6 (6 << K210_PC_DRIVE_SHIFT)
0038 #define K210_PC_DRIVE_7 (7 << K210_PC_DRIVE_SHIFT)
0039 #define K210_PC_DRIVE_MAX 7
0040 #define K210_PC_MODE_MASK GENMASK(23, 12)
0041
0042
0043
0044
0045
0046 #define K210_PC_OE BIT(12)
0047 #define K210_PC_OE_INV BIT(13)
0048 #define K210_PC_DO_OE BIT(14)
0049 #define K210_PC_DO_INV BIT(15)
0050 #define K210_PC_PU BIT(16)
0051 #define K210_PC_PD BIT(17)
0052
0053 #define K210_PC_SL BIT(19)
0054
0055 #define K210_PC_IE BIT(20)
0056 #define K210_PC_IE_INV BIT(21)
0057 #define K210_PC_DI_INV BIT(22)
0058 #define K210_PC_ST BIT(23)
0059 #define K210_PC_DI BIT(31)
0060
0061 #define K210_PC_BIAS_MASK (K210_PC_PU & K210_PC_PD)
0062
0063 #define K210_PC_MODE_IN (K210_PC_IE | K210_PC_ST)
0064 #define K210_PC_MODE_OUT (K210_PC_DRIVE_7 | K210_PC_OE)
0065 #define K210_PC_MODE_I2C (K210_PC_MODE_IN | K210_PC_SL | \
0066 K210_PC_OE | K210_PC_PU)
0067 #define K210_PC_MODE_SCCB (K210_PC_MODE_I2C | \
0068 K210_PC_OE_INV | K210_PC_IE_INV)
0069 #define K210_PC_MODE_SPI (K210_PC_MODE_IN | K210_PC_IE_INV | \
0070 K210_PC_MODE_OUT | K210_PC_OE_INV)
0071 #define K210_PC_MODE_GPIO (K210_PC_MODE_IN | K210_PC_MODE_OUT)
0072
0073 #define K210_PG_FUNC GENMASK(7, 0)
0074 #define K210_PG_DO BIT(8)
0075 #define K210_PG_PIN GENMASK(22, 16)
0076
0077
0078
0079
0080
0081
0082
0083 struct k210_fpioa {
0084 u32 pins[48];
0085 u32 tie_en[8];
0086 u32 tie_val[8];
0087 };
0088
0089 struct k210_fpioa_data {
0090
0091 struct device *dev;
0092 struct pinctrl_dev *pctl;
0093
0094 struct k210_fpioa __iomem *fpioa;
0095 struct regmap *sysctl_map;
0096 u32 power_offset;
0097 struct clk *clk;
0098 struct clk *pclk;
0099 };
0100
0101 #define K210_PIN_NAME(i) ("IO_" #i)
0102 #define K210_PIN(i) [(i)] = PINCTRL_PIN((i), K210_PIN_NAME(i))
0103
0104 static const struct pinctrl_pin_desc k210_pins[] = {
0105 K210_PIN(0), K210_PIN(1), K210_PIN(2),
0106 K210_PIN(3), K210_PIN(4), K210_PIN(5),
0107 K210_PIN(6), K210_PIN(7), K210_PIN(8),
0108 K210_PIN(9), K210_PIN(10), K210_PIN(11),
0109 K210_PIN(12), K210_PIN(13), K210_PIN(14),
0110 K210_PIN(15), K210_PIN(16), K210_PIN(17),
0111 K210_PIN(18), K210_PIN(19), K210_PIN(20),
0112 K210_PIN(21), K210_PIN(22), K210_PIN(23),
0113 K210_PIN(24), K210_PIN(25), K210_PIN(26),
0114 K210_PIN(27), K210_PIN(28), K210_PIN(29),
0115 K210_PIN(30), K210_PIN(31), K210_PIN(32),
0116 K210_PIN(33), K210_PIN(34), K210_PIN(35),
0117 K210_PIN(36), K210_PIN(37), K210_PIN(38),
0118 K210_PIN(39), K210_PIN(40), K210_PIN(41),
0119 K210_PIN(42), K210_PIN(43), K210_PIN(44),
0120 K210_PIN(45), K210_PIN(46), K210_PIN(47)
0121 };
0122
0123 #define K210_NPINS ARRAY_SIZE(k210_pins)
0124
0125
0126
0127
0128
0129
0130
0131
0132 static const char *const k210_group_names[] = {
0133
0134 K210_PIN_NAME(0), K210_PIN_NAME(1), K210_PIN_NAME(2),
0135 K210_PIN_NAME(3), K210_PIN_NAME(4), K210_PIN_NAME(5),
0136 K210_PIN_NAME(6), K210_PIN_NAME(7), K210_PIN_NAME(8),
0137 K210_PIN_NAME(9), K210_PIN_NAME(10), K210_PIN_NAME(11),
0138 K210_PIN_NAME(12), K210_PIN_NAME(13), K210_PIN_NAME(14),
0139 K210_PIN_NAME(15), K210_PIN_NAME(16), K210_PIN_NAME(17),
0140 K210_PIN_NAME(18), K210_PIN_NAME(19), K210_PIN_NAME(20),
0141 K210_PIN_NAME(21), K210_PIN_NAME(22), K210_PIN_NAME(23),
0142 K210_PIN_NAME(24), K210_PIN_NAME(25), K210_PIN_NAME(26),
0143 K210_PIN_NAME(27), K210_PIN_NAME(28), K210_PIN_NAME(29),
0144 K210_PIN_NAME(30), K210_PIN_NAME(31), K210_PIN_NAME(32),
0145 K210_PIN_NAME(33), K210_PIN_NAME(34), K210_PIN_NAME(35),
0146 K210_PIN_NAME(36), K210_PIN_NAME(37), K210_PIN_NAME(38),
0147 K210_PIN_NAME(39), K210_PIN_NAME(40), K210_PIN_NAME(41),
0148 K210_PIN_NAME(42), K210_PIN_NAME(43), K210_PIN_NAME(44),
0149 K210_PIN_NAME(45), K210_PIN_NAME(46), K210_PIN_NAME(47),
0150 [48] = "A0", [49] = "A1", [50] = "A2",
0151 [51] = "B3", [52] = "B4", [53] = "B5",
0152 [54] = "C6", [55] = "C7"
0153 };
0154
0155 #define K210_NGROUPS ARRAY_SIZE(k210_group_names)
0156
0157 enum k210_pinctrl_mode_id {
0158 K210_PC_DEFAULT_DISABLED,
0159 K210_PC_DEFAULT_IN,
0160 K210_PC_DEFAULT_IN_TIE,
0161 K210_PC_DEFAULT_OUT,
0162 K210_PC_DEFAULT_I2C,
0163 K210_PC_DEFAULT_SCCB,
0164 K210_PC_DEFAULT_SPI,
0165 K210_PC_DEFAULT_GPIO,
0166 K210_PC_DEFAULT_INT13,
0167 };
0168
0169 #define K210_PC_DEFAULT(mode) \
0170 [K210_PC_DEFAULT_##mode] = K210_PC_MODE_##mode
0171
0172 static const u32 k210_pinconf_mode_id_to_mode[] = {
0173 [K210_PC_DEFAULT_DISABLED] = 0,
0174 K210_PC_DEFAULT(IN),
0175 [K210_PC_DEFAULT_IN_TIE] = K210_PC_MODE_IN,
0176 K210_PC_DEFAULT(OUT),
0177 K210_PC_DEFAULT(I2C),
0178 K210_PC_DEFAULT(SCCB),
0179 K210_PC_DEFAULT(SPI),
0180 K210_PC_DEFAULT(GPIO),
0181 [K210_PC_DEFAULT_INT13] = K210_PC_MODE_IN | K210_PC_PU,
0182 };
0183
0184 #undef DEFAULT
0185
0186
0187
0188
0189 struct k210_pcf_info {
0190 char name[15];
0191 u8 mode_id;
0192 };
0193
0194 #define K210_FUNC(id, mode) \
0195 [K210_PCF_##id] = { \
0196 .name = #id, \
0197 .mode_id = K210_PC_DEFAULT_##mode \
0198 }
0199
0200 static const struct k210_pcf_info k210_pcf_infos[] = {
0201 K210_FUNC(JTAG_TCLK, IN),
0202 K210_FUNC(JTAG_TDI, IN),
0203 K210_FUNC(JTAG_TMS, IN),
0204 K210_FUNC(JTAG_TDO, OUT),
0205 K210_FUNC(SPI0_D0, SPI),
0206 K210_FUNC(SPI0_D1, SPI),
0207 K210_FUNC(SPI0_D2, SPI),
0208 K210_FUNC(SPI0_D3, SPI),
0209 K210_FUNC(SPI0_D4, SPI),
0210 K210_FUNC(SPI0_D5, SPI),
0211 K210_FUNC(SPI0_D6, SPI),
0212 K210_FUNC(SPI0_D7, SPI),
0213 K210_FUNC(SPI0_SS0, OUT),
0214 K210_FUNC(SPI0_SS1, OUT),
0215 K210_FUNC(SPI0_SS2, OUT),
0216 K210_FUNC(SPI0_SS3, OUT),
0217 K210_FUNC(SPI0_ARB, IN_TIE),
0218 K210_FUNC(SPI0_SCLK, OUT),
0219 K210_FUNC(UARTHS_RX, IN),
0220 K210_FUNC(UARTHS_TX, OUT),
0221 K210_FUNC(RESV6, IN),
0222 K210_FUNC(RESV7, IN),
0223 K210_FUNC(CLK_SPI1, OUT),
0224 K210_FUNC(CLK_I2C1, OUT),
0225 K210_FUNC(GPIOHS0, GPIO),
0226 K210_FUNC(GPIOHS1, GPIO),
0227 K210_FUNC(GPIOHS2, GPIO),
0228 K210_FUNC(GPIOHS3, GPIO),
0229 K210_FUNC(GPIOHS4, GPIO),
0230 K210_FUNC(GPIOHS5, GPIO),
0231 K210_FUNC(GPIOHS6, GPIO),
0232 K210_FUNC(GPIOHS7, GPIO),
0233 K210_FUNC(GPIOHS8, GPIO),
0234 K210_FUNC(GPIOHS9, GPIO),
0235 K210_FUNC(GPIOHS10, GPIO),
0236 K210_FUNC(GPIOHS11, GPIO),
0237 K210_FUNC(GPIOHS12, GPIO),
0238 K210_FUNC(GPIOHS13, GPIO),
0239 K210_FUNC(GPIOHS14, GPIO),
0240 K210_FUNC(GPIOHS15, GPIO),
0241 K210_FUNC(GPIOHS16, GPIO),
0242 K210_FUNC(GPIOHS17, GPIO),
0243 K210_FUNC(GPIOHS18, GPIO),
0244 K210_FUNC(GPIOHS19, GPIO),
0245 K210_FUNC(GPIOHS20, GPIO),
0246 K210_FUNC(GPIOHS21, GPIO),
0247 K210_FUNC(GPIOHS22, GPIO),
0248 K210_FUNC(GPIOHS23, GPIO),
0249 K210_FUNC(GPIOHS24, GPIO),
0250 K210_FUNC(GPIOHS25, GPIO),
0251 K210_FUNC(GPIOHS26, GPIO),
0252 K210_FUNC(GPIOHS27, GPIO),
0253 K210_FUNC(GPIOHS28, GPIO),
0254 K210_FUNC(GPIOHS29, GPIO),
0255 K210_FUNC(GPIOHS30, GPIO),
0256 K210_FUNC(GPIOHS31, GPIO),
0257 K210_FUNC(GPIO0, GPIO),
0258 K210_FUNC(GPIO1, GPIO),
0259 K210_FUNC(GPIO2, GPIO),
0260 K210_FUNC(GPIO3, GPIO),
0261 K210_FUNC(GPIO4, GPIO),
0262 K210_FUNC(GPIO5, GPIO),
0263 K210_FUNC(GPIO6, GPIO),
0264 K210_FUNC(GPIO7, GPIO),
0265 K210_FUNC(UART1_RX, IN),
0266 K210_FUNC(UART1_TX, OUT),
0267 K210_FUNC(UART2_RX, IN),
0268 K210_FUNC(UART2_TX, OUT),
0269 K210_FUNC(UART3_RX, IN),
0270 K210_FUNC(UART3_TX, OUT),
0271 K210_FUNC(SPI1_D0, SPI),
0272 K210_FUNC(SPI1_D1, SPI),
0273 K210_FUNC(SPI1_D2, SPI),
0274 K210_FUNC(SPI1_D3, SPI),
0275 K210_FUNC(SPI1_D4, SPI),
0276 K210_FUNC(SPI1_D5, SPI),
0277 K210_FUNC(SPI1_D6, SPI),
0278 K210_FUNC(SPI1_D7, SPI),
0279 K210_FUNC(SPI1_SS0, OUT),
0280 K210_FUNC(SPI1_SS1, OUT),
0281 K210_FUNC(SPI1_SS2, OUT),
0282 K210_FUNC(SPI1_SS3, OUT),
0283 K210_FUNC(SPI1_ARB, IN_TIE),
0284 K210_FUNC(SPI1_SCLK, OUT),
0285 K210_FUNC(SPI2_D0, SPI),
0286 K210_FUNC(SPI2_SS, IN),
0287 K210_FUNC(SPI2_SCLK, IN),
0288 K210_FUNC(I2S0_MCLK, OUT),
0289 K210_FUNC(I2S0_SCLK, OUT),
0290 K210_FUNC(I2S0_WS, OUT),
0291 K210_FUNC(I2S0_IN_D0, IN),
0292 K210_FUNC(I2S0_IN_D1, IN),
0293 K210_FUNC(I2S0_IN_D2, IN),
0294 K210_FUNC(I2S0_IN_D3, IN),
0295 K210_FUNC(I2S0_OUT_D0, OUT),
0296 K210_FUNC(I2S0_OUT_D1, OUT),
0297 K210_FUNC(I2S0_OUT_D2, OUT),
0298 K210_FUNC(I2S0_OUT_D3, OUT),
0299 K210_FUNC(I2S1_MCLK, OUT),
0300 K210_FUNC(I2S1_SCLK, OUT),
0301 K210_FUNC(I2S1_WS, OUT),
0302 K210_FUNC(I2S1_IN_D0, IN),
0303 K210_FUNC(I2S1_IN_D1, IN),
0304 K210_FUNC(I2S1_IN_D2, IN),
0305 K210_FUNC(I2S1_IN_D3, IN),
0306 K210_FUNC(I2S1_OUT_D0, OUT),
0307 K210_FUNC(I2S1_OUT_D1, OUT),
0308 K210_FUNC(I2S1_OUT_D2, OUT),
0309 K210_FUNC(I2S1_OUT_D3, OUT),
0310 K210_FUNC(I2S2_MCLK, OUT),
0311 K210_FUNC(I2S2_SCLK, OUT),
0312 K210_FUNC(I2S2_WS, OUT),
0313 K210_FUNC(I2S2_IN_D0, IN),
0314 K210_FUNC(I2S2_IN_D1, IN),
0315 K210_FUNC(I2S2_IN_D2, IN),
0316 K210_FUNC(I2S2_IN_D3, IN),
0317 K210_FUNC(I2S2_OUT_D0, OUT),
0318 K210_FUNC(I2S2_OUT_D1, OUT),
0319 K210_FUNC(I2S2_OUT_D2, OUT),
0320 K210_FUNC(I2S2_OUT_D3, OUT),
0321 K210_FUNC(RESV0, DISABLED),
0322 K210_FUNC(RESV1, DISABLED),
0323 K210_FUNC(RESV2, DISABLED),
0324 K210_FUNC(RESV3, DISABLED),
0325 K210_FUNC(RESV4, DISABLED),
0326 K210_FUNC(RESV5, DISABLED),
0327 K210_FUNC(I2C0_SCLK, I2C),
0328 K210_FUNC(I2C0_SDA, I2C),
0329 K210_FUNC(I2C1_SCLK, I2C),
0330 K210_FUNC(I2C1_SDA, I2C),
0331 K210_FUNC(I2C2_SCLK, I2C),
0332 K210_FUNC(I2C2_SDA, I2C),
0333 K210_FUNC(DVP_XCLK, OUT),
0334 K210_FUNC(DVP_RST, OUT),
0335 K210_FUNC(DVP_PWDN, OUT),
0336 K210_FUNC(DVP_VSYNC, IN),
0337 K210_FUNC(DVP_HSYNC, IN),
0338 K210_FUNC(DVP_PCLK, IN),
0339 K210_FUNC(DVP_D0, IN),
0340 K210_FUNC(DVP_D1, IN),
0341 K210_FUNC(DVP_D2, IN),
0342 K210_FUNC(DVP_D3, IN),
0343 K210_FUNC(DVP_D4, IN),
0344 K210_FUNC(DVP_D5, IN),
0345 K210_FUNC(DVP_D6, IN),
0346 K210_FUNC(DVP_D7, IN),
0347 K210_FUNC(SCCB_SCLK, SCCB),
0348 K210_FUNC(SCCB_SDA, SCCB),
0349 K210_FUNC(UART1_CTS, IN),
0350 K210_FUNC(UART1_DSR, IN),
0351 K210_FUNC(UART1_DCD, IN),
0352 K210_FUNC(UART1_RI, IN),
0353 K210_FUNC(UART1_SIR_IN, IN),
0354 K210_FUNC(UART1_DTR, OUT),
0355 K210_FUNC(UART1_RTS, OUT),
0356 K210_FUNC(UART1_OUT2, OUT),
0357 K210_FUNC(UART1_OUT1, OUT),
0358 K210_FUNC(UART1_SIR_OUT, OUT),
0359 K210_FUNC(UART1_BAUD, OUT),
0360 K210_FUNC(UART1_RE, OUT),
0361 K210_FUNC(UART1_DE, OUT),
0362 K210_FUNC(UART1_RS485_EN, OUT),
0363 K210_FUNC(UART2_CTS, IN),
0364 K210_FUNC(UART2_DSR, IN),
0365 K210_FUNC(UART2_DCD, IN),
0366 K210_FUNC(UART2_RI, IN),
0367 K210_FUNC(UART2_SIR_IN, IN),
0368 K210_FUNC(UART2_DTR, OUT),
0369 K210_FUNC(UART2_RTS, OUT),
0370 K210_FUNC(UART2_OUT2, OUT),
0371 K210_FUNC(UART2_OUT1, OUT),
0372 K210_FUNC(UART2_SIR_OUT, OUT),
0373 K210_FUNC(UART2_BAUD, OUT),
0374 K210_FUNC(UART2_RE, OUT),
0375 K210_FUNC(UART2_DE, OUT),
0376 K210_FUNC(UART2_RS485_EN, OUT),
0377 K210_FUNC(UART3_CTS, IN),
0378 K210_FUNC(UART3_DSR, IN),
0379 K210_FUNC(UART3_DCD, IN),
0380 K210_FUNC(UART3_RI, IN),
0381 K210_FUNC(UART3_SIR_IN, IN),
0382 K210_FUNC(UART3_DTR, OUT),
0383 K210_FUNC(UART3_RTS, OUT),
0384 K210_FUNC(UART3_OUT2, OUT),
0385 K210_FUNC(UART3_OUT1, OUT),
0386 K210_FUNC(UART3_SIR_OUT, OUT),
0387 K210_FUNC(UART3_BAUD, OUT),
0388 K210_FUNC(UART3_RE, OUT),
0389 K210_FUNC(UART3_DE, OUT),
0390 K210_FUNC(UART3_RS485_EN, OUT),
0391 K210_FUNC(TIMER0_TOGGLE1, OUT),
0392 K210_FUNC(TIMER0_TOGGLE2, OUT),
0393 K210_FUNC(TIMER0_TOGGLE3, OUT),
0394 K210_FUNC(TIMER0_TOGGLE4, OUT),
0395 K210_FUNC(TIMER1_TOGGLE1, OUT),
0396 K210_FUNC(TIMER1_TOGGLE2, OUT),
0397 K210_FUNC(TIMER1_TOGGLE3, OUT),
0398 K210_FUNC(TIMER1_TOGGLE4, OUT),
0399 K210_FUNC(TIMER2_TOGGLE1, OUT),
0400 K210_FUNC(TIMER2_TOGGLE2, OUT),
0401 K210_FUNC(TIMER2_TOGGLE3, OUT),
0402 K210_FUNC(TIMER2_TOGGLE4, OUT),
0403 K210_FUNC(CLK_SPI2, OUT),
0404 K210_FUNC(CLK_I2C2, OUT),
0405 K210_FUNC(INTERNAL0, OUT),
0406 K210_FUNC(INTERNAL1, OUT),
0407 K210_FUNC(INTERNAL2, OUT),
0408 K210_FUNC(INTERNAL3, OUT),
0409 K210_FUNC(INTERNAL4, OUT),
0410 K210_FUNC(INTERNAL5, OUT),
0411 K210_FUNC(INTERNAL6, OUT),
0412 K210_FUNC(INTERNAL7, OUT),
0413 K210_FUNC(INTERNAL8, OUT),
0414 K210_FUNC(INTERNAL9, IN),
0415 K210_FUNC(INTERNAL10, IN),
0416 K210_FUNC(INTERNAL11, IN),
0417 K210_FUNC(INTERNAL12, IN),
0418 K210_FUNC(INTERNAL13, INT13),
0419 K210_FUNC(INTERNAL14, I2C),
0420 K210_FUNC(INTERNAL15, IN),
0421 K210_FUNC(INTERNAL16, IN),
0422 K210_FUNC(INTERNAL17, IN),
0423 K210_FUNC(CONSTANT, DISABLED),
0424 K210_FUNC(INTERNAL18, IN),
0425 K210_FUNC(DEBUG0, OUT),
0426 K210_FUNC(DEBUG1, OUT),
0427 K210_FUNC(DEBUG2, OUT),
0428 K210_FUNC(DEBUG3, OUT),
0429 K210_FUNC(DEBUG4, OUT),
0430 K210_FUNC(DEBUG5, OUT),
0431 K210_FUNC(DEBUG6, OUT),
0432 K210_FUNC(DEBUG7, OUT),
0433 K210_FUNC(DEBUG8, OUT),
0434 K210_FUNC(DEBUG9, OUT),
0435 K210_FUNC(DEBUG10, OUT),
0436 K210_FUNC(DEBUG11, OUT),
0437 K210_FUNC(DEBUG12, OUT),
0438 K210_FUNC(DEBUG13, OUT),
0439 K210_FUNC(DEBUG14, OUT),
0440 K210_FUNC(DEBUG15, OUT),
0441 K210_FUNC(DEBUG16, OUT),
0442 K210_FUNC(DEBUG17, OUT),
0443 K210_FUNC(DEBUG18, OUT),
0444 K210_FUNC(DEBUG19, OUT),
0445 K210_FUNC(DEBUG20, OUT),
0446 K210_FUNC(DEBUG21, OUT),
0447 K210_FUNC(DEBUG22, OUT),
0448 K210_FUNC(DEBUG23, OUT),
0449 K210_FUNC(DEBUG24, OUT),
0450 K210_FUNC(DEBUG25, OUT),
0451 K210_FUNC(DEBUG26, OUT),
0452 K210_FUNC(DEBUG27, OUT),
0453 K210_FUNC(DEBUG28, OUT),
0454 K210_FUNC(DEBUG29, OUT),
0455 K210_FUNC(DEBUG30, OUT),
0456 K210_FUNC(DEBUG31, OUT),
0457 };
0458
0459 #define PIN_CONFIG_OUTPUT_INVERT (PIN_CONFIG_END + 1)
0460 #define PIN_CONFIG_INPUT_INVERT (PIN_CONFIG_END + 2)
0461
0462 static const struct pinconf_generic_params k210_pinconf_custom_params[] = {
0463 { "output-polarity-invert", PIN_CONFIG_OUTPUT_INVERT, 1 },
0464 { "input-polarity-invert", PIN_CONFIG_INPUT_INVERT, 1 },
0465 };
0466
0467
0468
0469
0470 static const int k210_pinconf_drive_strength[] = {
0471 [0] = 11200,
0472 [1] = 16800,
0473 [2] = 22300,
0474 [3] = 27800,
0475 [4] = 33300,
0476 [5] = 38700,
0477 [6] = 44100,
0478 [7] = 49500,
0479 };
0480
0481 static int k210_pinconf_get_drive(unsigned int max_strength_ua)
0482 {
0483 int i;
0484
0485 for (i = K210_PC_DRIVE_MAX; i >= 0; i--) {
0486 if (k210_pinconf_drive_strength[i] <= max_strength_ua)
0487 return i;
0488 }
0489
0490 return -EINVAL;
0491 }
0492
0493 static void k210_pinmux_set_pin_function(struct pinctrl_dev *pctldev,
0494 u32 pin, u32 func)
0495 {
0496 struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0497 const struct k210_pcf_info *info = &k210_pcf_infos[func];
0498 u32 mode = k210_pinconf_mode_id_to_mode[info->mode_id];
0499 u32 val = func | mode;
0500
0501 dev_dbg(pdata->dev, "set pin %u function %s (%u) -> 0x%08x\n",
0502 pin, info->name, func, val);
0503
0504 writel(val, &pdata->fpioa->pins[pin]);
0505 }
0506
0507 static int k210_pinconf_set_param(struct pinctrl_dev *pctldev,
0508 unsigned int pin,
0509 unsigned int param, unsigned int arg)
0510 {
0511 struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0512 u32 val = readl(&pdata->fpioa->pins[pin]);
0513 int drive;
0514
0515 dev_dbg(pdata->dev, "set pin %u param %u, arg 0x%x\n",
0516 pin, param, arg);
0517
0518 switch (param) {
0519 case PIN_CONFIG_BIAS_DISABLE:
0520 val &= ~K210_PC_BIAS_MASK;
0521 break;
0522 case PIN_CONFIG_BIAS_PULL_DOWN:
0523 if (!arg)
0524 return -EINVAL;
0525 val |= K210_PC_PD;
0526 break;
0527 case PIN_CONFIG_BIAS_PULL_UP:
0528 if (!arg)
0529 return -EINVAL;
0530 val |= K210_PC_PU;
0531 break;
0532 case PIN_CONFIG_DRIVE_STRENGTH:
0533 arg *= 1000;
0534 fallthrough;
0535 case PIN_CONFIG_DRIVE_STRENGTH_UA:
0536 drive = k210_pinconf_get_drive(arg);
0537 if (drive < 0)
0538 return drive;
0539 val &= ~K210_PC_DRIVE_MASK;
0540 val |= FIELD_PREP(K210_PC_DRIVE_MASK, drive);
0541 break;
0542 case PIN_CONFIG_INPUT_ENABLE:
0543 if (arg)
0544 val |= K210_PC_IE;
0545 else
0546 val &= ~K210_PC_IE;
0547 break;
0548 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
0549 if (arg)
0550 val |= K210_PC_ST;
0551 else
0552 val &= ~K210_PC_ST;
0553 break;
0554 case PIN_CONFIG_OUTPUT:
0555 k210_pinmux_set_pin_function(pctldev, pin, K210_PCF_CONSTANT);
0556 val = readl(&pdata->fpioa->pins[pin]);
0557 val |= K210_PC_MODE_OUT;
0558 if (!arg)
0559 val |= K210_PC_DO_INV;
0560 break;
0561 case PIN_CONFIG_OUTPUT_ENABLE:
0562 if (arg)
0563 val |= K210_PC_OE;
0564 else
0565 val &= ~K210_PC_OE;
0566 break;
0567 case PIN_CONFIG_SLEW_RATE:
0568 if (arg)
0569 val |= K210_PC_SL;
0570 else
0571 val &= ~K210_PC_SL;
0572 break;
0573 case PIN_CONFIG_OUTPUT_INVERT:
0574 if (arg)
0575 val |= K210_PC_DO_INV;
0576 else
0577 val &= ~K210_PC_DO_INV;
0578 break;
0579 case PIN_CONFIG_INPUT_INVERT:
0580 if (arg)
0581 val |= K210_PC_DI_INV;
0582 else
0583 val &= ~K210_PC_DI_INV;
0584 break;
0585 default:
0586 return -EINVAL;
0587 }
0588
0589 writel(val, &pdata->fpioa->pins[pin]);
0590
0591 return 0;
0592 }
0593
0594 static int k210_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
0595 unsigned long *configs, unsigned int num_configs)
0596 {
0597 unsigned int param, arg;
0598 int i, ret;
0599
0600 if (WARN_ON(pin >= K210_NPINS))
0601 return -EINVAL;
0602
0603 for (i = 0; i < num_configs; i++) {
0604 param = pinconf_to_config_param(configs[i]);
0605 arg = pinconf_to_config_argument(configs[i]);
0606 ret = k210_pinconf_set_param(pctldev, pin, param, arg);
0607 if (ret)
0608 return ret;
0609 }
0610
0611 return 0;
0612 }
0613
0614 static void k210_pinconf_dbg_show(struct pinctrl_dev *pctldev,
0615 struct seq_file *s, unsigned int pin)
0616 {
0617 struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0618
0619 seq_printf(s, "%#x", readl(&pdata->fpioa->pins[pin]));
0620 }
0621
0622 static int k210_pinconf_group_set(struct pinctrl_dev *pctldev,
0623 unsigned int selector, unsigned long *configs,
0624 unsigned int num_configs)
0625 {
0626 struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0627 unsigned int param, arg;
0628 u32 bit;
0629 int i;
0630
0631
0632 if (selector < K210_NPINS)
0633 return -EINVAL;
0634
0635
0636 for (i = 0; i < num_configs; i++) {
0637 param = pinconf_to_config_param(configs[i]);
0638 if (param != PIN_CONFIG_POWER_SOURCE)
0639 return -EINVAL;
0640
0641 arg = pinconf_to_config_argument(configs[i]);
0642 bit = BIT(selector - K210_NPINS);
0643 regmap_update_bits(pdata->sysctl_map,
0644 pdata->power_offset,
0645 bit, arg ? bit : 0);
0646 }
0647
0648 return 0;
0649 }
0650
0651 static void k210_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
0652 struct seq_file *s,
0653 unsigned int selector)
0654 {
0655 struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0656 int ret;
0657 u32 val;
0658
0659 if (selector < K210_NPINS)
0660 return k210_pinconf_dbg_show(pctldev, s, selector);
0661
0662 ret = regmap_read(pdata->sysctl_map, pdata->power_offset, &val);
0663 if (ret) {
0664 dev_err(pdata->dev, "Failed to read power reg\n");
0665 return;
0666 }
0667
0668 seq_printf(s, "%s: %s V", k210_group_names[selector],
0669 val & BIT(selector - K210_NPINS) ? "1.8" : "3.3");
0670 }
0671
0672 static const struct pinconf_ops k210_pinconf_ops = {
0673 .is_generic = true,
0674 .pin_config_set = k210_pinconf_set,
0675 .pin_config_group_set = k210_pinconf_group_set,
0676 .pin_config_dbg_show = k210_pinconf_dbg_show,
0677 .pin_config_group_dbg_show = k210_pinconf_group_dbg_show,
0678 };
0679
0680 static int k210_pinmux_get_function_count(struct pinctrl_dev *pctldev)
0681 {
0682 return ARRAY_SIZE(k210_pcf_infos);
0683 }
0684
0685 static const char *k210_pinmux_get_function_name(struct pinctrl_dev *pctldev,
0686 unsigned int selector)
0687 {
0688 return k210_pcf_infos[selector].name;
0689 }
0690
0691 static int k210_pinmux_get_function_groups(struct pinctrl_dev *pctldev,
0692 unsigned int selector,
0693 const char * const **groups,
0694 unsigned int * const num_groups)
0695 {
0696
0697 *groups = k210_group_names;
0698 *num_groups = K210_NPINS;
0699
0700 return 0;
0701 }
0702
0703 static int k210_pinmux_set_mux(struct pinctrl_dev *pctldev,
0704 unsigned int function,
0705 unsigned int group)
0706 {
0707
0708 if (group >= K210_NPINS)
0709 return -EINVAL;
0710
0711 k210_pinmux_set_pin_function(pctldev, group, function);
0712
0713 return 0;
0714 }
0715
0716 static const struct pinmux_ops k210_pinmux_ops = {
0717 .get_functions_count = k210_pinmux_get_function_count,
0718 .get_function_name = k210_pinmux_get_function_name,
0719 .get_function_groups = k210_pinmux_get_function_groups,
0720 .set_mux = k210_pinmux_set_mux,
0721 .strict = true,
0722 };
0723
0724 static int k210_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
0725 {
0726 return K210_NGROUPS;
0727 }
0728
0729 static const char *k210_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
0730 unsigned int group)
0731 {
0732 return k210_group_names[group];
0733 }
0734
0735 static int k210_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
0736 unsigned int group,
0737 const unsigned int **pins,
0738 unsigned int *npins)
0739 {
0740 if (group >= K210_NPINS) {
0741 *pins = NULL;
0742 *npins = 0;
0743 return 0;
0744 }
0745
0746 *pins = &k210_pins[group].number;
0747 *npins = 1;
0748
0749 return 0;
0750 }
0751
0752 static void k210_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
0753 struct seq_file *s, unsigned int offset)
0754 {
0755 seq_printf(s, "%s", dev_name(pctldev->dev));
0756 }
0757
0758 static int k210_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
0759 struct device_node *np,
0760 struct pinctrl_map **map,
0761 unsigned int *reserved_maps,
0762 unsigned int *num_maps)
0763 {
0764 struct property *prop;
0765 const __be32 *p;
0766 int ret, pinmux_groups;
0767 u32 pinmux_group;
0768 unsigned long *configs = NULL;
0769 unsigned int num_configs = 0;
0770 unsigned int reserve = 0;
0771
0772 ret = of_property_count_strings(np, "groups");
0773 if (!ret)
0774 return pinconf_generic_dt_subnode_to_map(pctldev, np, map,
0775 reserved_maps, num_maps,
0776 PIN_MAP_TYPE_CONFIGS_GROUP);
0777
0778 pinmux_groups = of_property_count_u32_elems(np, "pinmux");
0779 if (pinmux_groups <= 0) {
0780
0781 return 0;
0782 }
0783
0784 ret = pinconf_generic_parse_dt_config(np, pctldev, &configs,
0785 &num_configs);
0786 if (ret < 0) {
0787 dev_err(pctldev->dev, "%pOF: could not parse node property\n",
0788 np);
0789 return ret;
0790 }
0791
0792 reserve = pinmux_groups * (1 + num_configs);
0793 ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps,
0794 reserve);
0795 if (ret < 0)
0796 goto exit;
0797
0798 of_property_for_each_u32(np, "pinmux", prop, p, pinmux_group) {
0799 const char *group_name, *func_name;
0800 u32 pin = FIELD_GET(K210_PG_PIN, pinmux_group);
0801 u32 func = FIELD_GET(K210_PG_FUNC, pinmux_group);
0802
0803 if (pin >= K210_NPINS) {
0804 ret = -EINVAL;
0805 goto exit;
0806 }
0807
0808 group_name = k210_group_names[pin];
0809 func_name = k210_pcf_infos[func].name;
0810
0811 dev_dbg(pctldev->dev, "Pinmux %s: pin %u func %s\n",
0812 np->name, pin, func_name);
0813
0814 ret = pinctrl_utils_add_map_mux(pctldev, map, reserved_maps,
0815 num_maps, group_name,
0816 func_name);
0817 if (ret < 0) {
0818 dev_err(pctldev->dev, "%pOF add mux map failed %d\n",
0819 np, ret);
0820 goto exit;
0821 }
0822
0823 if (num_configs) {
0824 ret = pinctrl_utils_add_map_configs(pctldev, map,
0825 reserved_maps, num_maps, group_name,
0826 configs, num_configs,
0827 PIN_MAP_TYPE_CONFIGS_PIN);
0828 if (ret < 0) {
0829 dev_err(pctldev->dev,
0830 "%pOF add configs map failed %d\n",
0831 np, ret);
0832 goto exit;
0833 }
0834 }
0835 }
0836
0837 ret = 0;
0838
0839 exit:
0840 kfree(configs);
0841 return ret;
0842 }
0843
0844 static int k210_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
0845 struct device_node *np_config,
0846 struct pinctrl_map **map,
0847 unsigned int *num_maps)
0848 {
0849 unsigned int reserved_maps;
0850 struct device_node *np;
0851 int ret;
0852
0853 reserved_maps = 0;
0854 *map = NULL;
0855 *num_maps = 0;
0856
0857 ret = k210_pinctrl_dt_subnode_to_map(pctldev, np_config, map,
0858 &reserved_maps, num_maps);
0859 if (ret < 0)
0860 goto err;
0861
0862 for_each_available_child_of_node(np_config, np) {
0863 ret = k210_pinctrl_dt_subnode_to_map(pctldev, np, map,
0864 &reserved_maps, num_maps);
0865 if (ret < 0)
0866 goto err;
0867 }
0868 return 0;
0869
0870 err:
0871 pinctrl_utils_free_map(pctldev, *map, *num_maps);
0872 return ret;
0873 }
0874
0875
0876 static const struct pinctrl_ops k210_pinctrl_ops = {
0877 .get_groups_count = k210_pinctrl_get_groups_count,
0878 .get_group_name = k210_pinctrl_get_group_name,
0879 .get_group_pins = k210_pinctrl_get_group_pins,
0880 .pin_dbg_show = k210_pinctrl_pin_dbg_show,
0881 .dt_node_to_map = k210_pinctrl_dt_node_to_map,
0882 .dt_free_map = pinconf_generic_dt_free_map,
0883 };
0884
0885 static struct pinctrl_desc k210_pinctrl_desc = {
0886 .name = "k210-pinctrl",
0887 .pins = k210_pins,
0888 .npins = K210_NPINS,
0889 .pctlops = &k210_pinctrl_ops,
0890 .pmxops = &k210_pinmux_ops,
0891 .confops = &k210_pinconf_ops,
0892 .custom_params = k210_pinconf_custom_params,
0893 .num_custom_params = ARRAY_SIZE(k210_pinconf_custom_params),
0894 };
0895
0896 static void k210_fpioa_init_ties(struct k210_fpioa_data *pdata)
0897 {
0898 struct k210_fpioa __iomem *fpioa = pdata->fpioa;
0899 u32 val;
0900 int i, j;
0901
0902 dev_dbg(pdata->dev, "Init pin ties\n");
0903
0904
0905 for (i = 0; i < ARRAY_SIZE(fpioa->tie_en); i++) {
0906 val = 0;
0907 for (j = 0; j < 32; j++) {
0908 if (k210_pcf_infos[i * 32 + j].mode_id ==
0909 K210_PC_DEFAULT_IN_TIE) {
0910 dev_dbg(pdata->dev,
0911 "tie_en function %d (%s)\n",
0912 i * 32 + j,
0913 k210_pcf_infos[i * 32 + j].name);
0914 val |= BIT(j);
0915 }
0916 }
0917
0918
0919 writel(val, &fpioa->tie_val[i]);
0920 writel(val, &fpioa->tie_en[i]);
0921 }
0922 }
0923
0924 static int k210_fpioa_probe(struct platform_device *pdev)
0925 {
0926 struct device *dev = &pdev->dev;
0927 struct device_node *np = dev->of_node;
0928 struct k210_fpioa_data *pdata;
0929 int ret;
0930
0931 dev_info(dev, "K210 FPIOA pin controller\n");
0932
0933 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
0934 if (!pdata)
0935 return -ENOMEM;
0936
0937 pdata->dev = dev;
0938 platform_set_drvdata(pdev, pdata);
0939
0940 pdata->fpioa = devm_platform_ioremap_resource(pdev, 0);
0941 if (IS_ERR(pdata->fpioa))
0942 return PTR_ERR(pdata->fpioa);
0943
0944 pdata->clk = devm_clk_get(dev, "ref");
0945 if (IS_ERR(pdata->clk))
0946 return PTR_ERR(pdata->clk);
0947
0948 ret = clk_prepare_enable(pdata->clk);
0949 if (ret)
0950 return ret;
0951
0952 pdata->pclk = devm_clk_get_optional(dev, "pclk");
0953 if (!IS_ERR(pdata->pclk)) {
0954 ret = clk_prepare_enable(pdata->pclk);
0955 if (ret)
0956 goto disable_clk;
0957 }
0958
0959 pdata->sysctl_map =
0960 syscon_regmap_lookup_by_phandle_args(np,
0961 "canaan,k210-sysctl-power",
0962 1, &pdata->power_offset);
0963 if (IS_ERR(pdata->sysctl_map)) {
0964 ret = PTR_ERR(pdata->sysctl_map);
0965 goto disable_pclk;
0966 }
0967
0968 k210_fpioa_init_ties(pdata);
0969
0970 pdata->pctl = pinctrl_register(&k210_pinctrl_desc, dev, (void *)pdata);
0971 if (IS_ERR(pdata->pctl)) {
0972 ret = PTR_ERR(pdata->pctl);
0973 goto disable_pclk;
0974 }
0975
0976 return 0;
0977
0978 disable_pclk:
0979 clk_disable_unprepare(pdata->pclk);
0980 disable_clk:
0981 clk_disable_unprepare(pdata->clk);
0982
0983 return ret;
0984 }
0985
0986 static const struct of_device_id k210_fpioa_dt_ids[] = {
0987 { .compatible = "canaan,k210-fpioa" },
0988 { },
0989 };
0990
0991 static struct platform_driver k210_fpioa_driver = {
0992 .probe = k210_fpioa_probe,
0993 .driver = {
0994 .name = "k210-fpioa",
0995 .of_match_table = k210_fpioa_dt_ids,
0996 },
0997 };
0998 builtin_platform_driver(k210_fpioa_driver);