|
52 | 52 | #define PADCFG0_GPIROUTNMI BIT(17)
|
53 | 53 | #define PADCFG0_PMODE_SHIFT 10
|
54 | 54 | #define PADCFG0_PMODE_MASK GENMASK(13, 10)
|
| 55 | +#define PADCFG0_PMODE_GPIO 0 |
55 | 56 | #define PADCFG0_GPIORXDIS BIT(9)
|
56 | 57 | #define PADCFG0_GPIOTXDIS BIT(8)
|
57 | 58 | #define PADCFG0_GPIORXSTATE BIT(1)
|
@@ -332,7 +333,7 @@ static void intel_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
|
332 | 333 | cfg1 = readl(intel_get_padcfg(pctrl, pin, PADCFG1));
|
333 | 334 |
|
334 | 335 | mode = (cfg0 & PADCFG0_PMODE_MASK) >> PADCFG0_PMODE_SHIFT;
|
335 |
| - if (!mode) |
| 336 | + if (mode == PADCFG0_PMODE_GPIO) |
336 | 337 | seq_puts(s, "GPIO ");
|
337 | 338 | else
|
338 | 339 | seq_printf(s, "mode %d ", mode);
|
@@ -458,6 +459,11 @@ static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)
|
458 | 459 | writel(value, padcfg0);
|
459 | 460 | }
|
460 | 461 |
|
| 462 | +static int intel_gpio_get_gpio_mode(void __iomem *padcfg0) |
| 463 | +{ |
| 464 | + return (readl(padcfg0) & PADCFG0_PMODE_MASK) >> PADCFG0_PMODE_SHIFT; |
| 465 | +} |
| 466 | + |
461 | 467 | static void intel_gpio_set_gpio_mode(void __iomem *padcfg0)
|
462 | 468 | {
|
463 | 469 | u32 value;
|
@@ -491,7 +497,20 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
491 | 497 | }
|
492 | 498 |
|
493 | 499 | padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
|
| 500 | + |
| 501 | + /* |
| 502 | + * If pin is already configured in GPIO mode, we assume that |
| 503 | + * firmware provides correct settings. In such case we avoid |
| 504 | + * potential glitches on the pin. Otherwise, for the pin in |
| 505 | + * alternative mode, consumer has to supply respective flags. |
| 506 | + */ |
| 507 | + if (intel_gpio_get_gpio_mode(padcfg0) == PADCFG0_PMODE_GPIO) { |
| 508 | + raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
| 509 | + return 0; |
| 510 | + } |
| 511 | + |
494 | 512 | intel_gpio_set_gpio_mode(padcfg0);
|
| 513 | + |
495 | 514 | /* Disable TX buffer and enable RX (this will be input) */
|
496 | 515 | __intel_gpio_set_direction(padcfg0, true);
|
497 | 516 |
|
|
0 commit comments