mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-21 01:05:24 -04:00
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()
This commit is contained in:
@@ -20493,6 +20493,7 @@ F: include/dt-bindings/clock/starfive?jh71*.h
|
||||
STARFIVE JH71X0 PINCTRL DRIVERS
|
||||
M: Emil Renner Berthing <kernel@esmil.dk>
|
||||
M: Jianlong Huang <jianlong.huang@starfivetech.com>
|
||||
M: Hal Feng <hal.feng@starfivetech.com>
|
||||
L: linux-gpio@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml
|
||||
|
||||
@@ -1022,17 +1022,20 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
|
||||
|
||||
static struct pinctrl *find_pinctrl(struct device *dev)
|
||||
{
|
||||
struct pinctrl *p;
|
||||
struct pinctrl *entry, *p = NULL;
|
||||
|
||||
mutex_lock(&pinctrl_list_mutex);
|
||||
list_for_each_entry(p, &pinctrl_list, node)
|
||||
if (p->dev == dev) {
|
||||
mutex_unlock(&pinctrl_list_mutex);
|
||||
return p;
|
||||
|
||||
list_for_each_entry(entry, &pinctrl_list, node) {
|
||||
if (entry->dev == dev) {
|
||||
p = entry;
|
||||
kref_get(&p->users);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&pinctrl_list_mutex);
|
||||
return NULL;
|
||||
return p;
|
||||
}
|
||||
|
||||
static void pinctrl_free(struct pinctrl *p, bool inlist);
|
||||
@@ -1140,7 +1143,6 @@ struct pinctrl *pinctrl_get(struct device *dev)
|
||||
p = find_pinctrl(dev);
|
||||
if (p) {
|
||||
dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
|
||||
kref_get(&p->users);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
@@ -1062,13 +1062,13 @@ static int wpcm450_gpio_register(struct platform_device *pdev,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
gpio = &pctrl->gpio_bank[reg];
|
||||
gpio->pctrl = pctrl;
|
||||
|
||||
if (reg >= WPCM450_NUM_BANKS)
|
||||
return dev_err_probe(dev, -EINVAL,
|
||||
"GPIO index %d out of range!\n", reg);
|
||||
|
||||
gpio = &pctrl->gpio_bank[reg];
|
||||
gpio->pctrl = pctrl;
|
||||
|
||||
bank = &wpcm450_banks[reg];
|
||||
gpio->bank = bank;
|
||||
|
||||
|
||||
@@ -198,5 +198,4 @@ enum ltq_pin {
|
||||
|
||||
extern int ltq_pinctrl_register(struct platform_device *pdev,
|
||||
struct ltq_pinmux_info *info);
|
||||
extern int ltq_pinctrl_unregister(struct platform_device *pdev);
|
||||
#endif /* __PINCTRL_LANTIQ_H */
|
||||
|
||||
@@ -235,6 +235,7 @@ config PINCTRL_RZN1
|
||||
depends on OF
|
||||
depends on ARCH_RZN1 || COMPILE_TEST
|
||||
select GENERIC_PINCONF
|
||||
select PINMUX
|
||||
help
|
||||
This selects pinctrl driver for Renesas RZ/N1 devices.
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
#define JH7110_AON_NGPIO 4
|
||||
#define JH7110_AON_GC_BASE 64
|
||||
|
||||
#define JH7110_AON_REGS_NUM 37
|
||||
|
||||
/* registers */
|
||||
#define JH7110_AON_DOEN 0x0
|
||||
#define JH7110_AON_DOUT 0x4
|
||||
@@ -145,6 +147,7 @@ static const struct jh7110_pinctrl_soc_info jh7110_aon_pinctrl_info = {
|
||||
.gpi_mask = GENMASK(3, 0),
|
||||
.gpioin_reg_base = JH7110_AON_GPIOIN,
|
||||
.irq_reg = &jh7110_aon_irq_reg,
|
||||
.nsaved_regs = JH7110_AON_REGS_NUM,
|
||||
.jh7110_set_one_pin_mux = jh7110_aon_set_one_pin_mux,
|
||||
.jh7110_get_padcfg_base = jh7110_aon_get_padcfg_base,
|
||||
.jh7110_gpio_irq_handler = jh7110_aon_irq_handler,
|
||||
@@ -165,6 +168,7 @@ static struct platform_driver jh7110_aon_pinctrl_driver = {
|
||||
.driver = {
|
||||
.name = "starfive-jh7110-aon-pinctrl",
|
||||
.of_match_table = jh7110_aon_pinctrl_of_match,
|
||||
.pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops),
|
||||
},
|
||||
};
|
||||
module_platform_driver(jh7110_aon_pinctrl_driver);
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
#define JH7110_SYS_NGPIO 64
|
||||
#define JH7110_SYS_GC_BASE 0
|
||||
|
||||
#define JH7110_SYS_REGS_NUM 174
|
||||
|
||||
/* registers */
|
||||
#define JH7110_SYS_DOEN 0x000
|
||||
#define JH7110_SYS_DOUT 0x040
|
||||
@@ -417,6 +419,7 @@ static const struct jh7110_pinctrl_soc_info jh7110_sys_pinctrl_info = {
|
||||
.gpi_mask = GENMASK(6, 0),
|
||||
.gpioin_reg_base = JH7110_SYS_GPIOIN,
|
||||
.irq_reg = &jh7110_sys_irq_reg,
|
||||
.nsaved_regs = JH7110_SYS_REGS_NUM,
|
||||
.jh7110_set_one_pin_mux = jh7110_sys_set_one_pin_mux,
|
||||
.jh7110_get_padcfg_base = jh7110_sys_get_padcfg_base,
|
||||
.jh7110_gpio_irq_handler = jh7110_sys_irq_handler,
|
||||
@@ -437,6 +440,7 @@ static struct platform_driver jh7110_sys_pinctrl_driver = {
|
||||
.driver = {
|
||||
.name = "starfive-jh7110-sys-pinctrl",
|
||||
.of_match_table = jh7110_sys_pinctrl_of_match,
|
||||
.pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops),
|
||||
},
|
||||
};
|
||||
module_platform_driver(jh7110_sys_pinctrl_driver);
|
||||
|
||||
@@ -872,6 +872,13 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
|
||||
if (!sfp)
|
||||
return -ENOMEM;
|
||||
|
||||
#if IS_ENABLED(CONFIG_PM_SLEEP)
|
||||
sfp->saved_regs = devm_kcalloc(dev, info->nsaved_regs,
|
||||
sizeof(*sfp->saved_regs), GFP_KERNEL);
|
||||
if (!sfp->saved_regs)
|
||||
return -ENOMEM;
|
||||
#endif
|
||||
|
||||
sfp->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(sfp->base))
|
||||
return PTR_ERR(sfp->base);
|
||||
@@ -967,14 +974,45 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "could not register gpiochip\n");
|
||||
|
||||
irq_domain_set_pm_device(sfp->gc.irq.domain, dev);
|
||||
|
||||
dev_info(dev, "StarFive GPIO chip registered %d GPIOs\n", sfp->gc.ngpio);
|
||||
|
||||
return pinctrl_enable(sfp->pctl);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(jh7110_pinctrl_probe);
|
||||
|
||||
static int jh7110_pinctrl_suspend(struct device *dev)
|
||||
{
|
||||
struct jh7110_pinctrl *sfp = dev_get_drvdata(dev);
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
|
||||
raw_spin_lock_irqsave(&sfp->lock, flags);
|
||||
for (i = 0 ; i < sfp->info->nsaved_regs ; i++)
|
||||
sfp->saved_regs[i] = readl_relaxed(sfp->base + 4 * i);
|
||||
|
||||
raw_spin_unlock_irqrestore(&sfp->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int jh7110_pinctrl_resume(struct device *dev)
|
||||
{
|
||||
struct jh7110_pinctrl *sfp = dev_get_drvdata(dev);
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
|
||||
raw_spin_lock_irqsave(&sfp->lock, flags);
|
||||
for (i = 0 ; i < sfp->info->nsaved_regs ; i++)
|
||||
writel_relaxed(sfp->saved_regs[i], sfp->base + 4 * i);
|
||||
|
||||
raw_spin_unlock_irqrestore(&sfp->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct dev_pm_ops jh7110_pinctrl_pm_ops = {
|
||||
LATE_SYSTEM_SLEEP_PM_OPS(jh7110_pinctrl_suspend, jh7110_pinctrl_resume)
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(jh7110_pinctrl_pm_ops);
|
||||
|
||||
MODULE_DESCRIPTION("Pinctrl driver for the StarFive JH7110 SoC");
|
||||
MODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>");
|
||||
MODULE_AUTHOR("Jianlong Huang <jianlong.huang@starfivetech.com>");
|
||||
|
||||
@@ -21,6 +21,7 @@ struct jh7110_pinctrl {
|
||||
/* register read/write mutex */
|
||||
struct mutex mutex;
|
||||
const struct jh7110_pinctrl_soc_info *info;
|
||||
u32 *saved_regs;
|
||||
};
|
||||
|
||||
struct jh7110_gpio_irq_reg {
|
||||
@@ -50,6 +51,8 @@ struct jh7110_pinctrl_soc_info {
|
||||
|
||||
const struct jh7110_gpio_irq_reg *irq_reg;
|
||||
|
||||
unsigned int nsaved_regs;
|
||||
|
||||
/* generic pinmux */
|
||||
int (*jh7110_set_one_pin_mux)(struct jh7110_pinctrl *sfp,
|
||||
unsigned int pin,
|
||||
@@ -66,5 +69,6 @@ void jh7110_set_gpiomux(struct jh7110_pinctrl *sfp, unsigned int pin,
|
||||
unsigned int din, u32 dout, u32 doen);
|
||||
int jh7110_pinctrl_probe(struct platform_device *pdev);
|
||||
struct jh7110_pinctrl *jh7110_from_irq_desc(struct irq_desc *desc);
|
||||
extern const struct dev_pm_ops jh7110_pinctrl_pm_ops;
|
||||
|
||||
#endif /* __PINCTRL_STARFIVE_JH7110_H__ */
|
||||
|
||||
@@ -96,7 +96,6 @@ static const struct cfg_param {
|
||||
{"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING},
|
||||
{"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING},
|
||||
{"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE},
|
||||
{"nvidia,function", TEGRA_PINCONF_PARAM_FUNCTION},
|
||||
};
|
||||
|
||||
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,
|
||||
*bit = g->drvtype_bit;
|
||||
*width = 2;
|
||||
break;
|
||||
case TEGRA_PINCONF_PARAM_FUNCTION:
|
||||
*bank = g->mux_bank;
|
||||
*reg = g->mux_reg;
|
||||
*bit = g->mux_bit;
|
||||
*width = 2;
|
||||
break;
|
||||
default:
|
||||
dev_err(pmx->dev, "Invalid config param %04x\n", param);
|
||||
return -ENOTSUPP;
|
||||
@@ -640,16 +633,8 @@ static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
|
||||
val >>= bit;
|
||||
val &= (1 << width) - 1;
|
||||
|
||||
if (cfg_params[i].param == TEGRA_PINCONF_PARAM_FUNCTION) {
|
||||
u8 idx = pmx->soc->groups[group].funcs[val];
|
||||
|
||||
seq_printf(s, "\n\t%s=%s",
|
||||
strip_prefix(cfg_params[i].property),
|
||||
pmx->functions[idx].name);
|
||||
} else {
|
||||
seq_printf(s, "\n\t%s=%u",
|
||||
strip_prefix(cfg_params[i].property), val);
|
||||
}
|
||||
seq_printf(s, "\n\t%s=%u",
|
||||
strip_prefix(cfg_params[i].property), val);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,8 +54,6 @@ enum tegra_pinconf_param {
|
||||
TEGRA_PINCONF_PARAM_SLEW_RATE_RISING,
|
||||
/* argument: Integer, range is HW-dependant */
|
||||
TEGRA_PINCONF_PARAM_DRIVE_TYPE,
|
||||
/* argument: pinmux settings */
|
||||
TEGRA_PINCONF_PARAM_FUNCTION,
|
||||
};
|
||||
|
||||
enum tegra_pinconf_pull {
|
||||
|
||||
Reference in New Issue
Block a user