Commit acdf3f93 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pinctrl-v4.18-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl

Pull pin control fixes from Linus Walleij:
 "Some fallout in the pin control subsystem in the first week after the
  merge window, some minor fixes so I'd like to get it to you ASAP.

   - fix a serious kernel panic on the Mediatek driver with the external
     interrupt controller.

   - fix an uninitialized compiler warning in the owl (actions) driver.

   - allocation failure in the pinctrl-single driver.

   - pointer overwrite problem in the i.MX driver.

   - fix a small compiler warning"

* tag 'pinctrl-v4.18-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl:
  pinctrl: mt7622: fix a kernel panic when pio don't work as EINT controller
  pinctrl: actions: Fix uninitialized error in owl_pin_config_set()
  pinctrl: single: Add allocation failure checking of saved_vals
  pinctrl: devicetree: Fix pctldev pointer overwrite
  pinctrl: mediatek: remove redundant return value check of platform_get_resource()
parents 303f311e 5f591543
...@@ -333,7 +333,7 @@ static int owl_pin_config_set(struct pinctrl_dev *pctrldev, ...@@ -333,7 +333,7 @@ static int owl_pin_config_set(struct pinctrl_dev *pctrldev,
unsigned long flags; unsigned long flags;
unsigned int param; unsigned int param;
u32 reg, bit, width, arg; u32 reg, bit, width, arg;
int ret, i; int ret = 0, i;
info = &pctrl->soc->padinfo[pin]; info = &pctrl->soc->padinfo[pin];
......
...@@ -101,10 +101,11 @@ struct pinctrl_dev *of_pinctrl_get(struct device_node *np) ...@@ -101,10 +101,11 @@ struct pinctrl_dev *of_pinctrl_get(struct device_node *np)
} }
static int dt_to_map_one_config(struct pinctrl *p, static int dt_to_map_one_config(struct pinctrl *p,
struct pinctrl_dev *pctldev, struct pinctrl_dev *hog_pctldev,
const char *statename, const char *statename,
struct device_node *np_config) struct device_node *np_config)
{ {
struct pinctrl_dev *pctldev = NULL;
struct device_node *np_pctldev; struct device_node *np_pctldev;
const struct pinctrl_ops *ops; const struct pinctrl_ops *ops;
int ret; int ret;
...@@ -123,8 +124,10 @@ static int dt_to_map_one_config(struct pinctrl *p, ...@@ -123,8 +124,10 @@ static int dt_to_map_one_config(struct pinctrl *p,
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
/* If we're creating a hog we can use the passed pctldev */ /* If we're creating a hog we can use the passed pctldev */
if (pctldev && (np_pctldev == p->dev->of_node)) if (hog_pctldev && (np_pctldev == p->dev->of_node)) {
pctldev = hog_pctldev;
break; break;
}
pctldev = get_pinctrl_dev_from_of_node(np_pctldev); pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
if (pctldev) if (pctldev)
break; break;
......
...@@ -1459,6 +1459,9 @@ static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset) ...@@ -1459,6 +1459,9 @@ static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
struct mtk_pinctrl *hw = gpiochip_get_data(chip); struct mtk_pinctrl *hw = gpiochip_get_data(chip);
unsigned long eint_n; unsigned long eint_n;
if (!hw->eint)
return -ENOTSUPP;
eint_n = offset; eint_n = offset;
return mtk_eint_find_irq(hw->eint, eint_n); return mtk_eint_find_irq(hw->eint, eint_n);
...@@ -1471,7 +1474,8 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset, ...@@ -1471,7 +1474,8 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
unsigned long eint_n; unsigned long eint_n;
u32 debounce; u32 debounce;
if (pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE) if (!hw->eint ||
pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE)
return -ENOTSUPP; return -ENOTSUPP;
debounce = pinconf_to_config_argument(config); debounce = pinconf_to_config_argument(config);
......
...@@ -1000,11 +1000,6 @@ static int mtk_eint_init(struct mtk_pinctrl *pctl, struct platform_device *pdev) ...@@ -1000,11 +1000,6 @@ static int mtk_eint_init(struct mtk_pinctrl *pctl, struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "Unable to get eint resource\n");
return -ENODEV;
}
pctl->eint->base = devm_ioremap_resource(&pdev->dev, res); pctl->eint->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(pctl->eint->base)) if (IS_ERR(pctl->eint->base))
return PTR_ERR(pctl->eint->base); return PTR_ERR(pctl->eint->base);
......
...@@ -1590,8 +1590,11 @@ static int pcs_save_context(struct pcs_device *pcs) ...@@ -1590,8 +1590,11 @@ static int pcs_save_context(struct pcs_device *pcs)
mux_bytes = pcs->width / BITS_PER_BYTE; mux_bytes = pcs->width / BITS_PER_BYTE;
if (!pcs->saved_vals) if (!pcs->saved_vals) {
pcs->saved_vals = devm_kzalloc(pcs->dev, pcs->size, GFP_ATOMIC); pcs->saved_vals = devm_kzalloc(pcs->dev, pcs->size, GFP_ATOMIC);
if (!pcs->saved_vals)
return -ENOMEM;
}
switch (pcs->width) { switch (pcs->width) {
case 64: case 64:
...@@ -1651,8 +1654,13 @@ static int pinctrl_single_suspend(struct platform_device *pdev, ...@@ -1651,8 +1654,13 @@ static int pinctrl_single_suspend(struct platform_device *pdev,
if (!pcs) if (!pcs)
return -EINVAL; return -EINVAL;
if (pcs->flags & PCS_CONTEXT_LOSS_OFF) if (pcs->flags & PCS_CONTEXT_LOSS_OFF) {
pcs_save_context(pcs); int ret;
ret = pcs_save_context(pcs);
if (ret < 0)
return ret;
}
return pinctrl_force_sleep(pcs->pctl); return pinctrl_force_sleep(pcs->pctl);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment