1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2020 Sean Anderson <seanga2@gmail.com>
9 #include <dm/pinctrl.h>
10 #include <dt-bindings/pinctrl/k210-pinctrl.h>
15 #include <linux/err.h>
16 #include <linux/bitfield.h>
17 #include <linux/bitops.h>
20 * The K210 only implements 8 drive levels, even though there is register space
23 #define K210_PC_DRIVE_MASK GENMASK(11, 8)
24 #define K210_PC_DRIVE_SHIFT 8
25 #define K210_PC_DRIVE_0 (0 << K210_PC_DRIVE_SHIFT)
26 #define K210_PC_DRIVE_1 (1 << K210_PC_DRIVE_SHIFT)
27 #define K210_PC_DRIVE_2 (2 << K210_PC_DRIVE_SHIFT)
28 #define K210_PC_DRIVE_3 (3 << K210_PC_DRIVE_SHIFT)
29 #define K210_PC_DRIVE_4 (4 << K210_PC_DRIVE_SHIFT)
30 #define K210_PC_DRIVE_5 (5 << K210_PC_DRIVE_SHIFT)
31 #define K210_PC_DRIVE_6 (6 << K210_PC_DRIVE_SHIFT)
32 #define K210_PC_DRIVE_7 (7 << K210_PC_DRIVE_SHIFT)
33 #define K210_PC_DRIVE_MAX 7
35 #define K210_PC_MODE_MASK GENMASK(23, 12)
37 * output enabled == PC_OE & (PC_OE_INV ^ FUNCTION_OE) where FUNCTION_OE is a
38 * physical signal from the function
40 #define K210_PC_OE BIT(12) /* Output Enable */
41 #define K210_PC_OE_INV BIT(13) /* INVert function-controlled Output Enable */
42 #define K210_PC_DO_OE BIT(14) /* set Data Out to the Output Enable signal */
43 #define K210_PC_DO_INV BIT(15) /* INVert final Data Output */
44 #define K210_PC_PU BIT(16) /* Pull Up */
45 #define K210_PC_PD BIT(17) /* Pull Down */
46 /* Strong pull up not implemented on K210 */
47 #define K210_PC_SL BIT(19) /* reduce SLew rate to prevent overshoot */
48 /* Same semantics as OE above */
49 #define K210_PC_IE BIT(20) /* Input Enable */
50 #define K210_PC_IE_INV BIT(21) /* INVert function-controlled Input Enable */
51 #define K210_PC_DI_INV BIT(22) /* INVert Data Input */
52 #define K210_PC_ST BIT(23) /* Schmitt Trigger */
53 #define K210_PC_DI BIT(31) /* raw Data Input */
54 #define K210_PC_BIAS_MASK (K210_PC_PU & K210_PC_PD)
56 #define K210_PC_MODE_IN (K210_PC_IE | K210_PC_ST)
57 #define K210_PC_MODE_OUT (K210_PC_DRIVE_7 | K210_PC_OE)
58 #define K210_PC_MODE_I2C (K210_PC_MODE_IN | K210_PC_IE_INV | K210_PC_SL | \
59 K210_PC_OE | K210_PC_OE_INV | K210_PC_PU)
60 #define K210_PC_MODE_SPI (K210_PC_MODE_IN | K210_PC_IE_INV | \
61 K210_PC_MODE_OUT | K210_PC_OE_INV)
62 #define K210_PC_MODE_GPIO (K210_PC_MODE_IN | K210_PC_MODE_OUT)
64 #define K210_PG_FUNC GENMASK(7, 0)
65 #define K210_PG_DO BIT(8)
66 #define K210_PG_PIN GENMASK(22, 16)
68 #define PIN_CONFIG_OUTPUT_INVERT (PIN_CONFIG_END + 1)
69 #define PIN_CONFIG_INPUT_INVERT (PIN_CONFIG_END + 2)
79 struct k210_fpioa __iomem *fpioa; /* FPIOA register */
80 struct regmap *sysctl; /* Sysctl regmap */
81 u32 power_offset; /* Power bank register offset */
84 #ifdef CONFIG_CMD_PINMUX
85 static const char k210_pc_pin_names[][6] = {
139 static int k210_pc_get_pins_count(struct udevice *dev)
141 return ARRAY_SIZE(k210_pc_pin_names);
144 static const char *k210_pc_get_pin_name(struct udevice *dev, unsigned selector)
146 return k210_pc_pin_names[selector];
148 #endif /* CONFIG_CMD_PINMUX */
150 /* These are just power domains */
151 static const char k210_pc_group_names[][3] = {
162 static int k210_pc_get_groups_count(struct udevice *dev)
164 return ARRAY_SIZE(k210_pc_group_names);
167 static const char *k210_pc_get_group_name(struct udevice *dev,
170 return k210_pc_group_names[selector];
173 enum k210_pc_mode_id {
174 K210_PC_DEFAULT_DISABLED,
176 K210_PC_DEFAULT_IN_TIE,
180 K210_PC_DEFAULT_GPIO,
181 K210_PC_DEFAULT_INT13,
184 static const u32 k210_pc_mode_id_to_mode[] = {
185 #define DEFAULT(mode) \
186 [K210_PC_DEFAULT_##mode] = K210_PC_MODE_##mode
187 [K210_PC_DEFAULT_DISABLED] = 0,
189 [K210_PC_DEFAULT_IN_TIE] = K210_PC_MODE_IN,
194 [K210_PC_DEFAULT_INT13] = K210_PC_MODE_IN | K210_PC_PU,
198 /* This saves around 2K vs having a pointer+mode */
199 struct k210_pcf_info {
200 #ifdef CONFIG_CMD_PINMUX
206 static const struct k210_pcf_info k210_pcf_infos[] = {
207 #ifdef CONFIG_CMD_PINMUX
208 #define FUNC(id, mode) \
209 [K210_PCF_##id] = { \
211 .mode_id = K210_PC_DEFAULT_##mode \
214 #define FUNC(id, mode) \
215 [K210_PCF_##id] = { \
216 .mode_id = K210_PC_DEFAULT_##mode \
235 FUNC(SPI0_ARB, IN_TIE),
236 FUNC(SPI0_SCLK, OUT),
238 FUNC(UARTHS_TX, OUT),
253 FUNC(GPIOHS10, GPIO),
254 FUNC(GPIOHS11, GPIO),
255 FUNC(GPIOHS12, GPIO),
256 FUNC(GPIOHS13, GPIO),
257 FUNC(GPIOHS14, GPIO),
258 FUNC(GPIOHS15, GPIO),
259 FUNC(GPIOHS16, GPIO),
260 FUNC(GPIOHS17, GPIO),
261 FUNC(GPIOHS18, GPIO),
262 FUNC(GPIOHS19, GPIO),
263 FUNC(GPIOHS20, GPIO),
264 FUNC(GPIOHS21, GPIO),
265 FUNC(GPIOHS22, GPIO),
266 FUNC(GPIOHS23, GPIO),
267 FUNC(GPIOHS24, GPIO),
268 FUNC(GPIOHS25, GPIO),
269 FUNC(GPIOHS26, GPIO),
270 FUNC(GPIOHS27, GPIO),
271 FUNC(GPIOHS28, GPIO),
272 FUNC(GPIOHS29, GPIO),
273 FUNC(GPIOHS30, GPIO),
274 FUNC(GPIOHS31, GPIO),
301 FUNC(SPI1_ARB, IN_TIE),
302 FUNC(SPI1_SCLK, OUT),
306 FUNC(I2S0_MCLK, OUT),
307 FUNC(I2S0_SCLK, OUT),
309 FUNC(I2S0_IN_D0, IN),
310 FUNC(I2S0_IN_D1, IN),
311 FUNC(I2S0_IN_D2, IN),
312 FUNC(I2S0_IN_D3, IN),
313 FUNC(I2S0_OUT_D0, OUT),
314 FUNC(I2S0_OUT_D1, OUT),
315 FUNC(I2S0_OUT_D2, OUT),
316 FUNC(I2S0_OUT_D3, OUT),
317 FUNC(I2S1_MCLK, OUT),
318 FUNC(I2S1_SCLK, OUT),
320 FUNC(I2S1_IN_D0, IN),
321 FUNC(I2S1_IN_D1, IN),
322 FUNC(I2S1_IN_D2, IN),
323 FUNC(I2S1_IN_D3, IN),
324 FUNC(I2S1_OUT_D0, OUT),
325 FUNC(I2S1_OUT_D1, OUT),
326 FUNC(I2S1_OUT_D2, OUT),
327 FUNC(I2S1_OUT_D3, OUT),
328 FUNC(I2S2_MCLK, OUT),
329 FUNC(I2S2_SCLK, OUT),
331 FUNC(I2S2_IN_D0, IN),
332 FUNC(I2S2_IN_D1, IN),
333 FUNC(I2S2_IN_D2, IN),
334 FUNC(I2S2_IN_D3, IN),
335 FUNC(I2S2_OUT_D0, OUT),
336 FUNC(I2S2_OUT_D1, OUT),
337 FUNC(I2S2_OUT_D2, OUT),
338 FUNC(I2S2_OUT_D3, OUT),
339 FUNC(RESV0, DISABLED),
340 FUNC(RESV1, DISABLED),
341 FUNC(RESV2, DISABLED),
342 FUNC(RESV3, DISABLED),
343 FUNC(RESV4, DISABLED),
344 FUNC(RESV5, DISABLED),
345 FUNC(I2C0_SCLK, I2C),
347 FUNC(I2C1_SCLK, I2C),
349 FUNC(I2C2_SCLK, I2C),
365 FUNC(SCCB_SCLK, I2C),
371 FUNC(UART1_SIR_IN, IN),
372 FUNC(UART1_DTR, OUT),
373 FUNC(UART1_RTS, OUT),
374 FUNC(UART1_OUT2, OUT),
375 FUNC(UART1_OUT1, OUT),
376 FUNC(UART1_SIR_OUT, OUT),
377 FUNC(UART1_BAUD, OUT),
380 FUNC(UART1_RS485_EN, OUT),
385 FUNC(UART2_SIR_IN, IN),
386 FUNC(UART2_DTR, OUT),
387 FUNC(UART2_RTS, OUT),
388 FUNC(UART2_OUT2, OUT),
389 FUNC(UART2_OUT1, OUT),
390 FUNC(UART2_SIR_OUT, OUT),
391 FUNC(UART2_BAUD, OUT),
394 FUNC(UART2_RS485_EN, OUT),
399 FUNC(UART3_SIR_IN, IN),
400 FUNC(UART3_DTR, OUT),
401 FUNC(UART3_RTS, OUT),
402 FUNC(UART3_OUT2, OUT),
403 FUNC(UART3_OUT1, OUT),
404 FUNC(UART3_SIR_OUT, OUT),
405 FUNC(UART3_BAUD, OUT),
408 FUNC(UART3_RS485_EN, OUT),
409 FUNC(TIMER0_TOGGLE1, OUT),
410 FUNC(TIMER0_TOGGLE2, OUT),
411 FUNC(TIMER0_TOGGLE3, OUT),
412 FUNC(TIMER0_TOGGLE4, OUT),
413 FUNC(TIMER1_TOGGLE1, OUT),
414 FUNC(TIMER1_TOGGLE2, OUT),
415 FUNC(TIMER1_TOGGLE3, OUT),
416 FUNC(TIMER1_TOGGLE4, OUT),
417 FUNC(TIMER2_TOGGLE1, OUT),
418 FUNC(TIMER2_TOGGLE2, OUT),
419 FUNC(TIMER2_TOGGLE3, OUT),
420 FUNC(TIMER2_TOGGLE4, OUT),
423 FUNC(INTERNAL0, OUT),
424 FUNC(INTERNAL1, OUT),
425 FUNC(INTERNAL2, OUT),
426 FUNC(INTERNAL3, OUT),
427 FUNC(INTERNAL4, OUT),
428 FUNC(INTERNAL5, OUT),
429 FUNC(INTERNAL6, OUT),
430 FUNC(INTERNAL7, OUT),
431 FUNC(INTERNAL8, OUT),
433 FUNC(INTERNAL10, IN),
434 FUNC(INTERNAL11, IN),
435 FUNC(INTERNAL12, IN),
436 FUNC(INTERNAL13, INT13),
437 FUNC(INTERNAL14, I2C),
438 FUNC(INTERNAL15, IN),
439 FUNC(INTERNAL16, IN),
440 FUNC(INTERNAL17, IN),
441 FUNC(CONSTANT, DISABLED),
442 FUNC(INTERNAL18, IN),
478 static int k210_pc_pinmux_set(struct udevice *dev, u32 pinmux_group)
480 unsigned pin = FIELD_GET(K210_PG_PIN, pinmux_group);
481 bool do_oe = FIELD_GET(K210_PG_DO, pinmux_group);
482 unsigned func = FIELD_GET(K210_PG_FUNC, pinmux_group);
483 struct k210_pc_priv *priv = dev_get_priv(dev);
484 const struct k210_pcf_info *info = &k210_pcf_infos[func];
485 u32 mode = k210_pc_mode_id_to_mode[info->mode_id];
486 u32 val = func | mode | (do_oe ? K210_PC_DO_OE : 0);
488 debug("%s(%.8x): IO_%.2u = %3u | %.8x\n", __func__, pinmux_group, pin,
491 writel(val, &priv->fpioa->pins[pin]);
495 /* Max drive strength in uA */
496 static const int k210_pc_drive_strength[] = {
507 static int k210_pc_get_drive(unsigned max_strength_ua)
511 for (i = K210_PC_DRIVE_MAX; i; i--)
512 if (k210_pc_drive_strength[i] < max_strength_ua)
518 static int k210_pc_pinconf_set(struct udevice *dev, unsigned pin_selector,
519 unsigned param, unsigned argument)
521 struct k210_pc_priv *priv = dev_get_priv(dev);
522 u32 val = readl(&priv->fpioa->pins[pin_selector]);
525 case PIN_CONFIG_BIAS_DISABLE:
526 val &= ~K210_PC_BIAS_MASK;
528 case PIN_CONFIG_BIAS_PULL_DOWN:
534 case PIN_CONFIG_BIAS_PULL_UP:
540 case PIN_CONFIG_DRIVE_STRENGTH:
542 case PIN_CONFIG_DRIVE_STRENGTH_UA: {
543 int drive = k210_pc_get_drive(argument);
545 if (IS_ERR_VALUE(drive))
547 val &= ~K210_PC_DRIVE_MASK;
548 val |= FIELD_PREP(K210_PC_DRIVE_MASK, drive);
551 case PIN_CONFIG_INPUT_ENABLE:
557 case PIN_CONFIG_INPUT_SCHMITT:
559 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
565 case PIN_CONFIG_OUTPUT:
566 k210_pc_pinmux_set(dev,
567 K210_FPIOA(pin_selector, K210_PCF_CONSTANT));
568 val = readl(&priv->fpioa->pins[pin_selector]);
569 val |= K210_PC_MODE_OUT;
572 val |= K210_PC_DO_INV;
574 case PIN_CONFIG_OUTPUT_ENABLE:
580 case PIN_CONFIG_SLEW_RATE:
586 case PIN_CONFIG_OUTPUT_INVERT:
588 val |= K210_PC_DO_INV;
590 val &= ~K210_PC_DO_INV;
592 case PIN_CONFIG_INPUT_INVERT:
594 val |= K210_PC_DI_INV;
596 val &= ~K210_PC_DI_INV;
602 writel(val, &priv->fpioa->pins[pin_selector]);
606 static int k210_pc_pinconf_group_set(struct udevice *dev,
607 unsigned group_selector, unsigned param,
610 struct k210_pc_priv *priv = dev_get_priv(dev);
612 if (param == PIN_CONFIG_POWER_SOURCE) {
613 u32 bit = BIT(group_selector);
615 regmap_update_bits(priv->sysctl, priv->power_offset, bit,
624 #ifdef CONFIG_CMD_PINMUX
625 static int k210_pc_get_pin_muxing(struct udevice *dev, unsigned int selector,
628 struct k210_pc_priv *priv = dev_get_priv(dev);
629 u32 val = readl(&priv->fpioa->pins[selector]);
630 const struct k210_pcf_info *info = &k210_pcf_infos[val & K210_PCF_MASK];
632 strncpy(buf, info->name, min((size_t)size, sizeof(info->name)));
637 static const struct pinconf_param k210_pc_pinconf_params[] = {
638 { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
639 { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
640 { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
641 { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, U32_MAX },
642 { "drive-strength-ua", PIN_CONFIG_DRIVE_STRENGTH_UA, U32_MAX },
643 { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
644 { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
645 { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
646 { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
647 { "power-source", PIN_CONFIG_POWER_SOURCE, K210_PC_POWER_1V8 },
648 { "output-low", PIN_CONFIG_OUTPUT, 0 },
649 { "output-high", PIN_CONFIG_OUTPUT, 1 },
650 { "output-enable", PIN_CONFIG_OUTPUT_ENABLE, 1 },
651 { "output-disable", PIN_CONFIG_OUTPUT_ENABLE, 0 },
652 { "slew-rate", PIN_CONFIG_SLEW_RATE, 1 },
653 { "output-polarity-invert", PIN_CONFIG_OUTPUT_INVERT, 1},
654 { "input-polarity-invert", PIN_CONFIG_INPUT_INVERT, 1},
657 static const struct pinctrl_ops k210_pc_pinctrl_ops = {
658 #ifdef CONFIG_CMD_PINMUX
659 .get_pins_count = k210_pc_get_pins_count,
660 .get_pin_name = k210_pc_get_pin_name,
662 .get_groups_count = k210_pc_get_groups_count,
663 .get_group_name = k210_pc_get_group_name,
664 .pinmux_property_set = k210_pc_pinmux_set,
665 .pinconf_num_params = ARRAY_SIZE(k210_pc_pinconf_params),
666 .pinconf_params = k210_pc_pinconf_params,
667 .pinconf_set = k210_pc_pinconf_set,
668 .pinconf_group_set = k210_pc_pinconf_group_set,
669 .set_state = pinctrl_generic_set_state,
670 #ifdef CONFIG_CMD_PINMUX
671 .get_pin_muxing = k210_pc_get_pin_muxing,
675 static int k210_pc_probe(struct udevice *dev)
678 struct k210_pc_priv *priv = dev_get_priv(dev);
680 priv->fpioa = dev_read_addr_ptr(dev);
684 ret = clk_get_by_index(dev, 0, &priv->clk);
688 ret = clk_enable(&priv->clk);
689 if (ret && ret != -ENOSYS && ret != -ENOTSUPP)
692 priv->sysctl = syscon_regmap_lookup_by_phandle(dev, "kendryte,sysctl");
693 if (IS_ERR(priv->sysctl)) {
698 ret = dev_read_u32(dev, "kendryte,power-offset", &priv->power_offset);
702 debug("%s: fpioa = %p sysctl = %p power offset = %x\n", __func__,
703 priv->fpioa, (void *)priv->sysctl->ranges[0].start,
706 /* Init input ties */
707 for (i = 0; i < ARRAY_SIZE(priv->fpioa->tie_en); i++) {
710 for (j = 0; j < 32; j++)
711 if (k210_pcf_infos[i * 32 + j].mode_id ==
712 K210_PC_DEFAULT_IN_TIE)
714 writel(val, &priv->fpioa->tie_en[i]);
715 writel(val, &priv->fpioa->tie_val[i]);
721 clk_free(&priv->clk);
725 static const struct udevice_id k210_pc_ids[] = {
726 { .compatible = "kendryte,k210-fpioa" },
730 U_BOOT_DRIVER(pinctrl_k210) = {
731 .name = "pinctrl_k210",
732 .id = UCLASS_PINCTRL,
733 .of_match = k210_pc_ids,
734 .probe = k210_pc_probe,
735 .priv_auto_alloc_size = sizeof(struct k210_pc_priv),
736 .ops = &k210_pc_pinctrl_ops,