Skip to content

Commit 82a040a

Browse files
committed
Merge tag 'pinctrl-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control fixes from Linus Walleij: "Some pin control fixes for v6.6 which have been stacking up in my tree. Dmitry's fix to some locking in the core is the most substantial, that was a really neat fix. The rest is the usual assorted spray of minor driver fixes. - Drop some minor code causing warnings in the Lantiq driver - Fix out of bounds write in the Nuvoton driver - Fix lost IRQs with CONFIG_PM in the Starfive driver - Fix a locking issue in find_pinctrl() - Revert a regressive Tegra debug patch - Fix the Renesas RZN1 pin muxing" * tag 'pinctrl-v6.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: renesas: rzn1: Enable missing PINMUX Revert "pinctrl: tegra: Add support to display pin function" pinctrl: avoid unsafe code pattern in find_pinctrl() pinctrl: starfive: jh7110: Add system pm ops to save and restore context pinctrl: starfive: jh7110: Fix failure to set irq after CONFIG_PM is enabled pinctrl: nuvoton: wpcm450: fix out of bounds write pinctrl: lantiq: Remove unsued declaration ltq_pinctrl_unregister()
2 parents 4016448 + f055ff2 commit 82a040a

File tree

11 files changed

+68
-32
lines changed

11 files changed

+68
-32
lines changed

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20493,6 +20493,7 @@ F: include/dt-bindings/clock/starfive?jh71*.h
2049320493
STARFIVE JH71X0 PINCTRL DRIVERS
2049420494
M: Emil Renner Berthing <[email protected]>
2049520495
M: Jianlong Huang <[email protected]>
20496+
M: Hal Feng <[email protected]>
2049620497
2049720498
S: Maintained
2049820499
F: Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml

drivers/pinctrl/core.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,17 +1022,20 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
10221022

10231023
static struct pinctrl *find_pinctrl(struct device *dev)
10241024
{
1025-
struct pinctrl *p;
1025+
struct pinctrl *entry, *p = NULL;
10261026

10271027
mutex_lock(&pinctrl_list_mutex);
1028-
list_for_each_entry(p, &pinctrl_list, node)
1029-
if (p->dev == dev) {
1030-
mutex_unlock(&pinctrl_list_mutex);
1031-
return p;
1028+
1029+
list_for_each_entry(entry, &pinctrl_list, node) {
1030+
if (entry->dev == dev) {
1031+
p = entry;
1032+
kref_get(&p->users);
1033+
break;
10321034
}
1035+
}
10331036

10341037
mutex_unlock(&pinctrl_list_mutex);
1035-
return NULL;
1038+
return p;
10361039
}
10371040

10381041
static void pinctrl_free(struct pinctrl *p, bool inlist);
@@ -1140,7 +1143,6 @@ struct pinctrl *pinctrl_get(struct device *dev)
11401143
p = find_pinctrl(dev);
11411144
if (p) {
11421145
dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
1143-
kref_get(&p->users);
11441146
return p;
11451147
}
11461148

drivers/pinctrl/nuvoton/pinctrl-wpcm450.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,13 +1062,13 @@ static int wpcm450_gpio_register(struct platform_device *pdev,
10621062
if (ret < 0)
10631063
return ret;
10641064

1065-
gpio = &pctrl->gpio_bank[reg];
1066-
gpio->pctrl = pctrl;
1067-
10681065
if (reg >= WPCM450_NUM_BANKS)
10691066
return dev_err_probe(dev, -EINVAL,
10701067
"GPIO index %d out of range!\n", reg);
10711068

1069+
gpio = &pctrl->gpio_bank[reg];
1070+
gpio->pctrl = pctrl;
1071+
10721072
bank = &wpcm450_banks[reg];
10731073
gpio->bank = bank;
10741074

drivers/pinctrl/pinctrl-lantiq.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,5 +198,4 @@ enum ltq_pin {
198198

199199
extern int ltq_pinctrl_register(struct platform_device *pdev,
200200
struct ltq_pinmux_info *info);
201-
extern int ltq_pinctrl_unregister(struct platform_device *pdev);
202201
#endif /* __PINCTRL_LANTIQ_H */

drivers/pinctrl/renesas/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ config PINCTRL_RZN1
235235
depends on OF
236236
depends on ARCH_RZN1 || COMPILE_TEST
237237
select GENERIC_PINCONF
238+
select PINMUX
238239
help
239240
This selects pinctrl driver for Renesas RZ/N1 devices.
240241

drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#define JH7110_AON_NGPIO 4
3232
#define JH7110_AON_GC_BASE 64
3333

34+
#define JH7110_AON_REGS_NUM 37
35+
3436
/* registers */
3537
#define JH7110_AON_DOEN 0x0
3638
#define JH7110_AON_DOUT 0x4
@@ -145,6 +147,7 @@ static const struct jh7110_pinctrl_soc_info jh7110_aon_pinctrl_info = {
145147
.gpi_mask = GENMASK(3, 0),
146148
.gpioin_reg_base = JH7110_AON_GPIOIN,
147149
.irq_reg = &jh7110_aon_irq_reg,
150+
.nsaved_regs = JH7110_AON_REGS_NUM,
148151
.jh7110_set_one_pin_mux = jh7110_aon_set_one_pin_mux,
149152
.jh7110_get_padcfg_base = jh7110_aon_get_padcfg_base,
150153
.jh7110_gpio_irq_handler = jh7110_aon_irq_handler,
@@ -165,6 +168,7 @@ static struct platform_driver jh7110_aon_pinctrl_driver = {
165168
.driver = {
166169
.name = "starfive-jh7110-aon-pinctrl",
167170
.of_match_table = jh7110_aon_pinctrl_of_match,
171+
.pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops),
168172
},
169173
};
170174
module_platform_driver(jh7110_aon_pinctrl_driver);

drivers/pinctrl/starfive/pinctrl-starfive-jh7110-sys.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#define JH7110_SYS_NGPIO 64
3232
#define JH7110_SYS_GC_BASE 0
3333

34+
#define JH7110_SYS_REGS_NUM 174
35+
3436
/* registers */
3537
#define JH7110_SYS_DOEN 0x000
3638
#define JH7110_SYS_DOUT 0x040
@@ -417,6 +419,7 @@ static const struct jh7110_pinctrl_soc_info jh7110_sys_pinctrl_info = {
417419
.gpi_mask = GENMASK(6, 0),
418420
.gpioin_reg_base = JH7110_SYS_GPIOIN,
419421
.irq_reg = &jh7110_sys_irq_reg,
422+
.nsaved_regs = JH7110_SYS_REGS_NUM,
420423
.jh7110_set_one_pin_mux = jh7110_sys_set_one_pin_mux,
421424
.jh7110_get_padcfg_base = jh7110_sys_get_padcfg_base,
422425
.jh7110_gpio_irq_handler = jh7110_sys_irq_handler,
@@ -437,6 +440,7 @@ static struct platform_driver jh7110_sys_pinctrl_driver = {
437440
.driver = {
438441
.name = "starfive-jh7110-sys-pinctrl",
439442
.of_match_table = jh7110_sys_pinctrl_of_match,
443+
.pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops),
440444
},
441445
};
442446
module_platform_driver(jh7110_sys_pinctrl_driver);

drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,13 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
872872
if (!sfp)
873873
return -ENOMEM;
874874

875+
#if IS_ENABLED(CONFIG_PM_SLEEP)
876+
sfp->saved_regs = devm_kcalloc(dev, info->nsaved_regs,
877+
sizeof(*sfp->saved_regs), GFP_KERNEL);
878+
if (!sfp->saved_regs)
879+
return -ENOMEM;
880+
#endif
881+
875882
sfp->base = devm_platform_ioremap_resource(pdev, 0);
876883
if (IS_ERR(sfp->base))
877884
return PTR_ERR(sfp->base);
@@ -967,14 +974,45 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
967974
if (ret)
968975
return dev_err_probe(dev, ret, "could not register gpiochip\n");
969976

970-
irq_domain_set_pm_device(sfp->gc.irq.domain, dev);
971-
972977
dev_info(dev, "StarFive GPIO chip registered %d GPIOs\n", sfp->gc.ngpio);
973978

974979
return pinctrl_enable(sfp->pctl);
975980
}
976981
EXPORT_SYMBOL_GPL(jh7110_pinctrl_probe);
977982

983+
static int jh7110_pinctrl_suspend(struct device *dev)
984+
{
985+
struct jh7110_pinctrl *sfp = dev_get_drvdata(dev);
986+
unsigned long flags;
987+
unsigned int i;
988+
989+
raw_spin_lock_irqsave(&sfp->lock, flags);
990+
for (i = 0 ; i < sfp->info->nsaved_regs ; i++)
991+
sfp->saved_regs[i] = readl_relaxed(sfp->base + 4 * i);
992+
993+
raw_spin_unlock_irqrestore(&sfp->lock, flags);
994+
return 0;
995+
}
996+
997+
static int jh7110_pinctrl_resume(struct device *dev)
998+
{
999+
struct jh7110_pinctrl *sfp = dev_get_drvdata(dev);
1000+
unsigned long flags;
1001+
unsigned int i;
1002+
1003+
raw_spin_lock_irqsave(&sfp->lock, flags);
1004+
for (i = 0 ; i < sfp->info->nsaved_regs ; i++)
1005+
writel_relaxed(sfp->saved_regs[i], sfp->base + 4 * i);
1006+
1007+
raw_spin_unlock_irqrestore(&sfp->lock, flags);
1008+
return 0;
1009+
}
1010+
1011+
const struct dev_pm_ops jh7110_pinctrl_pm_ops = {
1012+
LATE_SYSTEM_SLEEP_PM_OPS(jh7110_pinctrl_suspend, jh7110_pinctrl_resume)
1013+
};
1014+
EXPORT_SYMBOL_GPL(jh7110_pinctrl_pm_ops);
1015+
9781016
MODULE_DESCRIPTION("Pinctrl driver for the StarFive JH7110 SoC");
9791017
MODULE_AUTHOR("Emil Renner Berthing <[email protected]>");
9801018
MODULE_AUTHOR("Jianlong Huang <[email protected]>");

drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct jh7110_pinctrl {
2121
/* register read/write mutex */
2222
struct mutex mutex;
2323
const struct jh7110_pinctrl_soc_info *info;
24+
u32 *saved_regs;
2425
};
2526

2627
struct jh7110_gpio_irq_reg {
@@ -50,6 +51,8 @@ struct jh7110_pinctrl_soc_info {
5051

5152
const struct jh7110_gpio_irq_reg *irq_reg;
5253

54+
unsigned int nsaved_regs;
55+
5356
/* generic pinmux */
5457
int (*jh7110_set_one_pin_mux)(struct jh7110_pinctrl *sfp,
5558
unsigned int pin,
@@ -66,5 +69,6 @@ void jh7110_set_gpiomux(struct jh7110_pinctrl *sfp, unsigned int pin,
6669
unsigned int din, u32 dout, u32 doen);
6770
int jh7110_pinctrl_probe(struct platform_device *pdev);
6871
struct jh7110_pinctrl *jh7110_from_irq_desc(struct irq_desc *desc);
72+
extern const struct dev_pm_ops jh7110_pinctrl_pm_ops;
6973

7074
#endif /* __PINCTRL_STARFIVE_JH7110_H__ */

drivers/pinctrl/tegra/pinctrl-tegra.c

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ static const struct cfg_param {
9696
{"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING},
9797
{"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING},
9898
{"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE},
99-
{"nvidia,function", TEGRA_PINCONF_PARAM_FUNCTION},
10099
};
101100

102101
static int tegra_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
@@ -471,12 +470,6 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx,
471470
*bit = g->drvtype_bit;
472471
*width = 2;
473472
break;
474-
case TEGRA_PINCONF_PARAM_FUNCTION:
475-
*bank = g->mux_bank;
476-
*reg = g->mux_reg;
477-
*bit = g->mux_bit;
478-
*width = 2;
479-
break;
480473
default:
481474
dev_err(pmx->dev, "Invalid config param %04x\n", param);
482475
return -ENOTSUPP;
@@ -640,16 +633,8 @@ static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
640633
val >>= bit;
641634
val &= (1 << width) - 1;
642635

643-
if (cfg_params[i].param == TEGRA_PINCONF_PARAM_FUNCTION) {
644-
u8 idx = pmx->soc->groups[group].funcs[val];
645-
646-
seq_printf(s, "\n\t%s=%s",
647-
strip_prefix(cfg_params[i].property),
648-
pmx->functions[idx].name);
649-
} else {
650-
seq_printf(s, "\n\t%s=%u",
651-
strip_prefix(cfg_params[i].property), val);
652-
}
636+
seq_printf(s, "\n\t%s=%u",
637+
strip_prefix(cfg_params[i].property), val);
653638
}
654639
}
655640

0 commit comments

Comments
 (0)