Skip to content

Commit 75c78a4

Browse files
committed
Merge tag 'pinctrl-v7.0-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control fixes from Linus Walleij: - Implement .get_direction() in the spmi-gpio gpio_chip Recent changes makes this start to print warnings and it's not nice, let's just fix it - Clamp the return value of gpio_get() in the Renesas RZA1 driver - Add the GPIO_GENERIC dependency to the STM32 HDP driver - Modify the Mediatek driver to accept devices that do not use external interrupts (EINT) at all - Fix flag propagation in the Sunxi driver, so that we can fix an issue with uninitialized pins in a follow-up patch using said flags * tag 'pinctrl-v7.0-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: sunxi: fix gpiochip_lock_as_irq() failure when pinmux is unknown pinctrl: sunxi: pass down flags to pinctrl routines pinctrl: mediatek: common: Fix probe failure for devices without EINT pinctrl: stm32: fix HDP driver dependency on GPIO_GENERIC pinctrl: renesas: rza1: Normalize return value of gpio_get() pinctrl: qcom: spmi-gpio: implement .get_direction() pinctrl: renesas: rzt2h: Fix invalid wait context pinctrl: renesas: rzt2h: Fix device node leak in rzt2h_gpio_register()
2 parents dabb83e + 70f8915 commit 75c78a4

7 files changed

Lines changed: 67 additions & 23 deletions

File tree

drivers/pinctrl/mediatek/pinctrl-mtk-common.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,9 +1135,12 @@ int mtk_pctrl_init(struct platform_device *pdev,
11351135
goto chip_error;
11361136
}
11371137

1138-
ret = mtk_eint_init(pctl, pdev);
1139-
if (ret)
1140-
goto chip_error;
1138+
/* Only initialize EINT if we have EINT pins */
1139+
if (data->eint_hw.ap_num > 0) {
1140+
ret = mtk_eint_init(pctl, pdev);
1141+
if (ret)
1142+
goto chip_error;
1143+
}
11411144

11421145
return 0;
11431146

drivers/pinctrl/qcom/pinctrl-spmi-gpio.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,21 @@ static const struct pinconf_ops pmic_gpio_pinconf_ops = {
723723
.pin_config_group_dbg_show = pmic_gpio_config_dbg_show,
724724
};
725725

726+
static int pmic_gpio_get_direction(struct gpio_chip *chip, unsigned pin)
727+
{
728+
struct pmic_gpio_state *state = gpiochip_get_data(chip);
729+
struct pmic_gpio_pad *pad;
730+
731+
pad = state->ctrl->desc->pins[pin].drv_data;
732+
733+
if (!pad->is_enabled || pad->analog_pass ||
734+
(!pad->input_enabled && !pad->output_enabled))
735+
return -EINVAL;
736+
737+
/* Make sure the state is aligned on what pmic_gpio_get() returns */
738+
return pad->input_enabled ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
739+
}
740+
726741
static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
727742
{
728743
struct pmic_gpio_state *state = gpiochip_get_data(chip);
@@ -801,6 +816,7 @@ static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
801816
}
802817

803818
static const struct gpio_chip pmic_gpio_gpio_template = {
819+
.get_direction = pmic_gpio_get_direction,
804820
.direction_input = pmic_gpio_direction_input,
805821
.direction_output = pmic_gpio_direction_output,
806822
.get = pmic_gpio_get,

drivers/pinctrl/renesas/pinctrl-rza1.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ static inline unsigned int rza1_get_bit(struct rza1_port *port,
589589
{
590590
void __iomem *mem = RZA1_ADDR(port->base, reg, port->id);
591591

592-
return ioread16(mem) & BIT(bit);
592+
return !!(ioread16(mem) & BIT(bit));
593593
}
594594

595595
/**

drivers/pinctrl/renesas/pinctrl-rzt2h.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ struct rzt2h_pinctrl {
8585
struct gpio_chip gpio_chip;
8686
struct pinctrl_gpio_range gpio_range;
8787
DECLARE_BITMAP(used_irqs, RZT2H_INTERRUPTS_NUM);
88-
spinlock_t lock; /* lock read/write registers */
88+
raw_spinlock_t lock; /* lock read/write registers */
8989
struct mutex mutex; /* serialize adding groups and functions */
9090
bool safety_port_enabled;
9191
atomic_t wakeup_path;
@@ -145,7 +145,7 @@ static void rzt2h_pinctrl_set_pfc_mode(struct rzt2h_pinctrl *pctrl,
145145
u64 reg64;
146146
u16 reg16;
147147

148-
guard(spinlock_irqsave)(&pctrl->lock);
148+
guard(raw_spinlock_irqsave)(&pctrl->lock);
149149

150150
/* Set pin to 'Non-use (Hi-Z input protection)' */
151151
reg16 = rzt2h_pinctrl_readw(pctrl, port, PM(port));
@@ -474,7 +474,7 @@ static int rzt2h_gpio_request(struct gpio_chip *chip, unsigned int offset)
474474
if (ret)
475475
return ret;
476476

477-
guard(spinlock_irqsave)(&pctrl->lock);
477+
guard(raw_spinlock_irqsave)(&pctrl->lock);
478478

479479
/* Select GPIO mode in PMC Register */
480480
rzt2h_pinctrl_set_gpio_en(pctrl, port, bit, true);
@@ -487,7 +487,7 @@ static void rzt2h_gpio_set_direction(struct rzt2h_pinctrl *pctrl, u32 port,
487487
{
488488
u16 reg;
489489

490-
guard(spinlock_irqsave)(&pctrl->lock);
490+
guard(raw_spinlock_irqsave)(&pctrl->lock);
491491

492492
reg = rzt2h_pinctrl_readw(pctrl, port, PM(port));
493493
reg &= ~PM_PIN_MASK(bit);
@@ -509,7 +509,7 @@ static int rzt2h_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
509509
if (ret)
510510
return ret;
511511

512-
guard(spinlock_irqsave)(&pctrl->lock);
512+
guard(raw_spinlock_irqsave)(&pctrl->lock);
513513

514514
if (rzt2h_pinctrl_readb(pctrl, port, PMC(port)) & BIT(bit)) {
515515
/*
@@ -547,7 +547,7 @@ static int rzt2h_gpio_set(struct gpio_chip *chip, unsigned int offset,
547547
u8 bit = RZT2H_PIN_ID_TO_PIN(offset);
548548
u8 reg;
549549

550-
guard(spinlock_irqsave)(&pctrl->lock);
550+
guard(raw_spinlock_irqsave)(&pctrl->lock);
551551

552552
reg = rzt2h_pinctrl_readb(pctrl, port, P(port));
553553
if (value)
@@ -833,6 +833,7 @@ static int rzt2h_gpio_register(struct rzt2h_pinctrl *pctrl)
833833
if (ret)
834834
return dev_err_probe(dev, ret, "Unable to parse gpio-ranges\n");
835835

836+
of_node_put(of_args.np);
836837
if (of_args.args[0] != 0 || of_args.args[1] != 0 ||
837838
of_args.args[2] != pctrl->data->n_port_pins)
838839
return dev_err_probe(dev, -EINVAL,
@@ -964,7 +965,7 @@ static int rzt2h_pinctrl_probe(struct platform_device *pdev)
964965
if (ret)
965966
return ret;
966967

967-
spin_lock_init(&pctrl->lock);
968+
raw_spin_lock_init(&pctrl->lock);
968969
mutex_init(&pctrl->mutex);
969970
platform_set_drvdata(pdev, pctrl);
970971

drivers/pinctrl/stm32/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ config PINCTRL_STM32_HDP
6565
select PINMUX
6666
select GENERIC_PINCONF
6767
select GPIOLIB
68+
select GPIO_GENERIC
6869
help
6970
The Hardware Debug Port allows the observation of internal signals.
7071
It uses configurable multiplexer to route signals in a dedicated observation register.

drivers/pinctrl/sunxi/pinctrl-sunxi.c

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl,
157157
const char *pin_name,
158158
const char *func_name)
159159
{
160+
unsigned long variant = pctl->flags & SUNXI_PINCTRL_VARIANT_MASK;
160161
int i;
161162

162163
for (i = 0; i < pctl->desc->npins; i++) {
@@ -168,7 +169,7 @@ sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl,
168169
while (func->name) {
169170
if (!strcmp(func->name, func_name) &&
170171
(!func->variant ||
171-
func->variant & pctl->variant))
172+
func->variant & variant))
172173
return func;
173174

174175
func++;
@@ -209,14 +210,16 @@ sunxi_pinctrl_desc_find_function_by_pin_and_mux(struct sunxi_pinctrl *pctl,
209210
const u16 pin_num,
210211
const u8 muxval)
211212
{
213+
unsigned long variant = pctl->flags & SUNXI_PINCTRL_VARIANT_MASK;
214+
212215
for (unsigned int i = 0; i < pctl->desc->npins; i++) {
213216
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
214217
struct sunxi_desc_function *func = pin->functions;
215218

216219
if (pin->pin.number != pin_num)
217220
continue;
218221

219-
if (pin->variant && !(pctl->variant & pin->variant))
222+
if (pin->variant && !(variant & pin->variant))
220223
continue;
221224

222225
while (func->name) {
@@ -1089,15 +1092,31 @@ static int sunxi_pinctrl_irq_request_resources(struct irq_data *d)
10891092
{
10901093
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
10911094
struct sunxi_desc_function *func;
1095+
unsigned int offset;
1096+
u32 reg, shift, mask;
1097+
u8 disabled_mux, muxval;
10921098
int ret;
10931099

10941100
func = sunxi_pinctrl_desc_find_function_by_pin(pctl,
10951101
pctl->irq_array[d->hwirq], "irq");
10961102
if (!func)
10971103
return -EINVAL;
10981104

1099-
ret = gpiochip_lock_as_irq(pctl->chip,
1100-
pctl->irq_array[d->hwirq] - pctl->desc->pin_base);
1105+
offset = pctl->irq_array[d->hwirq] - pctl->desc->pin_base;
1106+
sunxi_mux_reg(pctl, offset, &reg, &shift, &mask);
1107+
muxval = (readl(pctl->membase + reg) & mask) >> shift;
1108+
1109+
/* Change muxing to GPIO INPUT mode if at reset value */
1110+
if (pctl->flags & SUNXI_PINCTRL_NEW_REG_LAYOUT)
1111+
disabled_mux = SUN4I_FUNC_DISABLED_NEW;
1112+
else
1113+
disabled_mux = SUN4I_FUNC_DISABLED_OLD;
1114+
1115+
if (muxval == disabled_mux)
1116+
sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq],
1117+
SUN4I_FUNC_INPUT);
1118+
1119+
ret = gpiochip_lock_as_irq(pctl->chip, offset);
11011120
if (ret) {
11021121
dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n",
11031122
irqd_to_hwirq(d));
@@ -1338,6 +1357,7 @@ static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl,
13381357
static int sunxi_pinctrl_build_state(struct platform_device *pdev)
13391358
{
13401359
struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev);
1360+
unsigned long variant = pctl->flags & SUNXI_PINCTRL_VARIANT_MASK;
13411361
void *ptr;
13421362
int i;
13431363

@@ -1362,7 +1382,7 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
13621382
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
13631383
struct sunxi_pinctrl_group *group = pctl->groups + pctl->ngroups;
13641384

1365-
if (pin->variant && !(pctl->variant & pin->variant))
1385+
if (pin->variant && !(variant & pin->variant))
13661386
continue;
13671387

13681388
group->name = pin->pin.name;
@@ -1387,11 +1407,11 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
13871407
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
13881408
struct sunxi_desc_function *func;
13891409

1390-
if (pin->variant && !(pctl->variant & pin->variant))
1410+
if (pin->variant && !(variant & pin->variant))
13911411
continue;
13921412

13931413
for (func = pin->functions; func->name; func++) {
1394-
if (func->variant && !(pctl->variant & func->variant))
1414+
if (func->variant && !(variant & func->variant))
13951415
continue;
13961416

13971417
/* Create interrupt mapping while we're at it */
@@ -1419,14 +1439,14 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
14191439
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
14201440
struct sunxi_desc_function *func;
14211441

1422-
if (pin->variant && !(pctl->variant & pin->variant))
1442+
if (pin->variant && !(variant & pin->variant))
14231443
continue;
14241444

14251445
for (func = pin->functions; func->name; func++) {
14261446
struct sunxi_pinctrl_function *func_item;
14271447
const char **func_grp;
14281448

1429-
if (func->variant && !(pctl->variant & func->variant))
1449+
if (func->variant && !(variant & func->variant))
14301450
continue;
14311451

14321452
func_item = sunxi_pinctrl_find_function_by_name(pctl,
@@ -1568,7 +1588,7 @@ int sunxi_pinctrl_init_with_flags(struct platform_device *pdev,
15681588

15691589
pctl->dev = &pdev->dev;
15701590
pctl->desc = desc;
1571-
pctl->variant = flags & SUNXI_PINCTRL_VARIANT_MASK;
1591+
pctl->flags = flags;
15721592
if (flags & SUNXI_PINCTRL_NEW_REG_LAYOUT) {
15731593
pctl->bank_mem_size = D1_BANK_MEM_SIZE;
15741594
pctl->pull_regs_offset = D1_PULL_REGS_OFFSET;
@@ -1604,8 +1624,9 @@ int sunxi_pinctrl_init_with_flags(struct platform_device *pdev,
16041624

16051625
for (i = 0, pin_idx = 0; i < pctl->desc->npins; i++) {
16061626
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1627+
unsigned long variant = pctl->flags & SUNXI_PINCTRL_VARIANT_MASK;
16071628

1608-
if (pin->variant && !(pctl->variant & pin->variant))
1629+
if (pin->variant && !(variant & pin->variant))
16091630
continue;
16101631

16111632
pins[pin_idx++] = pin->pin;

drivers/pinctrl/sunxi/pinctrl-sunxi.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@
8686

8787
#define SUN4I_FUNC_INPUT 0
8888
#define SUN4I_FUNC_IRQ 6
89+
#define SUN4I_FUNC_DISABLED_OLD 7
90+
#define SUN4I_FUNC_DISABLED_NEW 15
8991

9092
#define SUNXI_PINCTRL_VARIANT_MASK GENMASK(7, 0)
9193
#define SUNXI_PINCTRL_NEW_REG_LAYOUT BIT(8)
@@ -174,7 +176,7 @@ struct sunxi_pinctrl {
174176
unsigned *irq_array;
175177
raw_spinlock_t lock;
176178
struct pinctrl_dev *pctl_dev;
177-
unsigned long variant;
179+
unsigned long flags;
178180
u32 bank_mem_size;
179181
u32 pull_regs_offset;
180182
u32 dlevel_field_width;

0 commit comments

Comments
 (0)