Skip to content

Commit b1819ae

Browse files
committed
Merge tag 'pinctrl-v6.15-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control fixes from Linus Walleij: "This deals with a crash in the Qualcomm pin controller GPIO parts when using hogs. The first patch to gpiolib makes gpiochip_line_is_valid() NULL-tolerant. The second patch fixes the actual problem" * tag 'pinctrl-v6.15-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: qcom: switch to devm_register_sys_off_handler() gpiolib: don't crash on enabling GPIO HOG pins
2 parents 0e95795 + 41e452e commit b1819ae

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

drivers/gpio/gpiolib.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,12 @@ EXPORT_SYMBOL_GPL(gpiochip_query_valid_mask);
742742
bool gpiochip_line_is_valid(const struct gpio_chip *gc,
743743
unsigned int offset)
744744
{
745+
/*
746+
* hog pins are requested before registering GPIO chip
747+
*/
748+
if (!gc->gpiodev)
749+
return true;
750+
745751
/* No mask means all valid */
746752
if (likely(!gc->gpiodev->valid_mask))
747753
return true;

drivers/pinctrl/qcom/pinctrl-msm.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
* @pctrl: pinctrl handle.
4545
* @chip: gpiochip handle.
4646
* @desc: pin controller descriptor
47-
* @restart_nb: restart notifier block.
4847
* @irq: parent irq for the TLMM irq_chip.
4948
* @intr_target_use_scm: route irq to application cpu using scm calls
5049
* @lock: Spinlock to protect register resources as well
@@ -64,7 +63,6 @@ struct msm_pinctrl {
6463
struct pinctrl_dev *pctrl;
6564
struct gpio_chip chip;
6665
struct pinctrl_desc desc;
67-
struct notifier_block restart_nb;
6866

6967
int irq;
7068

@@ -1471,10 +1469,9 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
14711469
return 0;
14721470
}
14731471

1474-
static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action,
1475-
void *data)
1472+
static int msm_ps_hold_restart(struct sys_off_data *data)
14761473
{
1477-
struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb);
1474+
struct msm_pinctrl *pctrl = data->cb_data;
14781475

14791476
writel(0, pctrl->regs[0] + PS_HOLD_OFFSET);
14801477
mdelay(1000);
@@ -1485,7 +1482,11 @@ static struct msm_pinctrl *poweroff_pctrl;
14851482

14861483
static void msm_ps_hold_poweroff(void)
14871484
{
1488-
msm_ps_hold_restart(&poweroff_pctrl->restart_nb, 0, NULL);
1485+
struct sys_off_data data = {
1486+
.cb_data = poweroff_pctrl,
1487+
};
1488+
1489+
msm_ps_hold_restart(&data);
14891490
}
14901491

14911492
static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
@@ -1495,9 +1496,11 @@ static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
14951496

14961497
for (i = 0; i < pctrl->soc->nfunctions; i++)
14971498
if (!strcmp(func[i].name, "ps_hold")) {
1498-
pctrl->restart_nb.notifier_call = msm_ps_hold_restart;
1499-
pctrl->restart_nb.priority = 128;
1500-
if (register_restart_handler(&pctrl->restart_nb))
1499+
if (devm_register_sys_off_handler(pctrl->dev,
1500+
SYS_OFF_MODE_RESTART,
1501+
128,
1502+
msm_ps_hold_restart,
1503+
pctrl))
15011504
dev_err(pctrl->dev,
15021505
"failed to setup restart handler.\n");
15031506
poweroff_pctrl = pctrl;
@@ -1599,8 +1602,6 @@ void msm_pinctrl_remove(struct platform_device *pdev)
15991602
struct msm_pinctrl *pctrl = platform_get_drvdata(pdev);
16001603

16011604
gpiochip_remove(&pctrl->chip);
1602-
1603-
unregister_restart_handler(&pctrl->restart_nb);
16041605
}
16051606
EXPORT_SYMBOL(msm_pinctrl_remove);
16061607

0 commit comments

Comments
 (0)