Skip to content

Commit 91946cc

Browse files
committed
pinctrl: intel: Add __intel_gpio_get_direction() helper
Add __intel_gpio_get_direction() helper which provides all possible physical states of the pad. With that done, update current users and make the respective checks consistent. While at it, make the style of anonymous enum kernel documentation consistent. Acked-by: Mika Westerberg <[email protected]> Signed-off-by: Andy Shevchenko <[email protected]>
1 parent 8c4a51f commit 91946cc

File tree

1 file changed

+42
-6
lines changed

1 file changed

+42
-6
lines changed

drivers/pinctrl/intel/pinctrl-intel.c

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@
7070
#define PADCFG0_PMODE_SHIFT 10
7171
#define PADCFG0_PMODE_MASK GENMASK(13, 10)
7272
#define PADCFG0_PMODE_GPIO 0
73+
#define PADCFG0_GPIODIS_SHIFT 8
74+
#define PADCFG0_GPIODIS_MASK GENMASK(9, 8)
75+
#define PADCFG0_GPIODIS_NONE 0
76+
#define PADCFG0_GPIODIS_OUTPUT 1
77+
#define PADCFG0_GPIODIS_INPUT 2
78+
#define PADCFG0_GPIODIS_FULL 3
7379
#define PADCFG0_GPIORXDIS BIT(9)
7480
#define PADCFG0_GPIOTXDIS BIT(8)
7581
#define PADCFG0_GPIORXSTATE BIT(1)
@@ -212,7 +218,6 @@ static bool intel_pad_acpi_mode(struct intel_pinctrl *pctrl, unsigned int pin)
212218

213219
/**
214220
* enum - Locking variants of the pad configuration
215-
*
216221
* @PAD_UNLOCKED: pad is fully controlled by the configuration registers
217222
* @PAD_LOCKED: pad configuration registers, except TX state, are locked
218223
* @PAD_LOCKED_TX: pad configuration TX state is locked
@@ -429,6 +434,36 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,
429434
return 0;
430435
}
431436

437+
/**
438+
* enum - Possible pad physical connections
439+
* @PAD_CONNECT_NONE: pad is fully disconnected
440+
* @PAD_CONNECT_INPUT: pad is in input only mode
441+
* @PAD_CONNECT_OUTPUT: pad is in output only mode
442+
* @PAD_CONNECT_FULL: pad is fully connected
443+
*/
444+
enum {
445+
PAD_CONNECT_NONE = 0,
446+
PAD_CONNECT_INPUT = 1,
447+
PAD_CONNECT_OUTPUT = 2,
448+
PAD_CONNECT_FULL = PAD_CONNECT_INPUT | PAD_CONNECT_OUTPUT,
449+
};
450+
451+
static int __intel_gpio_get_direction(u32 value)
452+
{
453+
switch ((value & PADCFG0_GPIODIS_MASK) >> PADCFG0_GPIODIS_SHIFT) {
454+
case PADCFG0_GPIODIS_FULL:
455+
return PAD_CONNECT_NONE;
456+
case PADCFG0_GPIODIS_OUTPUT:
457+
return PAD_CONNECT_INPUT;
458+
case PADCFG0_GPIODIS_INPUT:
459+
return PAD_CONNECT_OUTPUT;
460+
case PADCFG0_GPIODIS_NONE:
461+
return PAD_CONNECT_FULL;
462+
default:
463+
return -ENOTSUPP;
464+
};
465+
}
466+
432467
static u32 __intel_gpio_set_direction(u32 value, bool input, bool output)
433468
{
434469
if (input)
@@ -937,7 +972,7 @@ static int intel_gpio_get(struct gpio_chip *chip, unsigned int offset)
937972
return -EINVAL;
938973

939974
padcfg0 = readl(reg);
940-
if (!(padcfg0 & PADCFG0_GPIOTXDIS))
975+
if (__intel_gpio_get_direction(padcfg0) & PAD_CONNECT_OUTPUT)
941976
return !!(padcfg0 & PADCFG0_GPIOTXSTATE);
942977

943978
return !!(padcfg0 & PADCFG0_GPIORXSTATE);
@@ -990,10 +1025,10 @@ static int intel_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
9901025
if (padcfg0 & PADCFG0_PMODE_MASK)
9911026
return -EINVAL;
9921027

993-
if (padcfg0 & PADCFG0_GPIOTXDIS)
994-
return GPIO_LINE_DIRECTION_IN;
1028+
if (__intel_gpio_get_direction(padcfg0) & PAD_CONNECT_OUTPUT)
1029+
return GPIO_LINE_DIRECTION_OUT;
9951030

996-
return GPIO_LINE_DIRECTION_OUT;
1031+
return GPIO_LINE_DIRECTION_IN;
9971032
}
9981033

9991034
static int intel_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
@@ -1690,7 +1725,8 @@ EXPORT_SYMBOL_NS_GPL(intel_pinctrl_get_soc_data, PINCTRL_INTEL);
16901725

16911726
static bool __intel_gpio_is_direct_irq(u32 value)
16921727
{
1693-
return (value & PADCFG0_GPIROUTIOXAPIC) && (value & PADCFG0_GPIOTXDIS) &&
1728+
return (value & PADCFG0_GPIROUTIOXAPIC) &&
1729+
(__intel_gpio_get_direction(value) == PAD_CONNECT_INPUT) &&
16941730
(__intel_gpio_get_gpio_mode(value) == PADCFG0_PMODE_GPIO);
16951731
}
16961732

0 commit comments

Comments
 (0)