This is a first set of GPIO fixes for the v4.2 series, all
hitting individual drivers and nothing else. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJVqPoCAAoJEEEQszewGV1zccEP/2bGViiPxrlBV2plLlteE4sT 7zujWF3v1rkRZ1jr6tDafAthxtaL8WBY6O3rDWAVCZiVYATsYBGoh/Rg9EFwaKZ/ 6i5aqVFqAo9aNOFVmKabjUs8YESRTB4Wo1Ccuju/n4PkL7sGM+fBuZw5R6J7R+GU TpXMulHI4mDVjHuZWeUJ+GRnp6xmaTv5/PR1p1NC7D7zFulk6h4ZPYXJUhX8fhwC 6Pp0bgH8JEvlzphDLHziX41jSEz8Pr3vWk0WJTYCisdsNl6oklfCMBcCOgluZmgO 7v32RmxqXqBevhDgzd7sUUGjntmATb9kS4ZIcW6awX9Ia7TK55iG/pEd5pHfXAVV j79ViWfWxWLH2kVPiBTKSe+nCtMSg8hEj5RtPxTkBdUOL4BBgAigyY1DW4OgKPv5 YOHiG0FN9UT/tNH8EmUNtnUW8k4a6LpLN+r+3Tgjbz1xgVcd/5wGlEzDm+TVnyMf RBojHUDYI0taE/KpGl7RkhcKZoDNsrYK/M+pKw5DTD8Ca/hfjMoLvqAs0uKzWjc7 HDTtTTjAqFICNnf+yAaAKcjjpEp7r8xaj0c/cBIItIqG79vjLd+VnUvonjVzuTGP icysBdY5J2+NWBgWeVotopGhGs4NOYNIDQjzUwBLUBFcAVzvhsvTRc9LoncZq5Bn SWHIW/sZZ8hnWETNoz6q =mTd/ -----END PGP SIGNATURE----- Merge tag 'gpio-v4.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio Pull GPIO fixes from Linus Walleij: "This is a first set of GPIO fixes for the v4.2 series, all hitting individual drivers and nothing else (except for a documentation oneliner. I intended to send a request earlier but life intervened)" * tag 'gpio-v4.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: gpio: pca953x: fix nested irqs rescheduling gpio: omap: prevent module from being unloaded while in use gpio: max732x: Add missing dev reference to gpiochip gpio/xilinx: Use correct address when setting initial values. gpio: zynq: Fix problem with unbalanced pm_runtime_enable gpio: omap: add missed spin_unlock_irqrestore in omap_gpio_irq_type gpio: brcmstb: fix null ptr dereference in driver remove gpio: Remove double "base" in comment
This commit is contained in:
commit
9bca4df258
@ -87,6 +87,15 @@ static int brcmstb_gpio_remove(struct platform_device *pdev)
|
|||||||
struct brcmstb_gpio_bank *bank;
|
struct brcmstb_gpio_bank *bank;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!priv) {
|
||||||
|
dev_err(&pdev->dev, "called %s without drvdata!\n", __func__);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can lose return values below, but we report all errors, and it's
|
||||||
|
* more important to actually perform all of the steps.
|
||||||
|
*/
|
||||||
list_for_each(pos, &priv->bank_list) {
|
list_for_each(pos, &priv->bank_list) {
|
||||||
bank = list_entry(pos, struct brcmstb_gpio_bank, node);
|
bank = list_entry(pos, struct brcmstb_gpio_bank, node);
|
||||||
ret = bgpio_remove(&bank->bgc);
|
ret = bgpio_remove(&bank->bgc);
|
||||||
@ -143,6 +152,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
|
|||||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||||
if (!priv)
|
if (!priv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
platform_set_drvdata(pdev, priv);
|
||||||
|
INIT_LIST_HEAD(&priv->bank_list);
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
reg_base = devm_ioremap_resource(dev, res);
|
reg_base = devm_ioremap_resource(dev, res);
|
||||||
@ -153,7 +164,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
|
|||||||
priv->reg_base = reg_base;
|
priv->reg_base = reg_base;
|
||||||
priv->pdev = pdev;
|
priv->pdev = pdev;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&priv->bank_list);
|
|
||||||
if (brcmstb_gpio_sanity_check_banks(dev, np, res))
|
if (brcmstb_gpio_sanity_check_banks(dev, np, res))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -221,8 +231,6 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
|
|||||||
dev_info(dev, "Registered %d banks (GPIO(s): %d-%d)\n",
|
dev_info(dev, "Registered %d banks (GPIO(s): %d-%d)\n",
|
||||||
priv->num_banks, priv->gpio_base, gpio_base - 1);
|
priv->num_banks, priv->gpio_base, gpio_base - 1);
|
||||||
|
|
||||||
platform_set_drvdata(pdev, priv);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -603,6 +603,7 @@ static int max732x_setup_gpio(struct max732x_chip *chip,
|
|||||||
gc->base = gpio_start;
|
gc->base = gpio_start;
|
||||||
gc->ngpio = port;
|
gc->ngpio = port;
|
||||||
gc->label = chip->client->name;
|
gc->label = chip->client->name;
|
||||||
|
gc->dev = &chip->client->dev;
|
||||||
gc->owner = THIS_MODULE;
|
gc->owner = THIS_MODULE;
|
||||||
|
|
||||||
return port;
|
return port;
|
||||||
|
@ -500,8 +500,10 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
|
|||||||
|
|
||||||
spin_lock_irqsave(&bank->lock, flags);
|
spin_lock_irqsave(&bank->lock, flags);
|
||||||
retval = omap_set_gpio_triggering(bank, offset, type);
|
retval = omap_set_gpio_triggering(bank, offset, type);
|
||||||
if (retval)
|
if (retval) {
|
||||||
|
spin_unlock_irqrestore(&bank->lock, flags);
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
omap_gpio_init_irq(bank, offset);
|
omap_gpio_init_irq(bank, offset);
|
||||||
if (!omap_gpio_is_input(bank, offset)) {
|
if (!omap_gpio_is_input(bank, offset)) {
|
||||||
spin_unlock_irqrestore(&bank->lock, flags);
|
spin_unlock_irqrestore(&bank->lock, flags);
|
||||||
@ -1185,6 +1187,7 @@ static int omap_gpio_probe(struct platform_device *pdev)
|
|||||||
bank->irq = res->start;
|
bank->irq = res->start;
|
||||||
bank->dev = dev;
|
bank->dev = dev;
|
||||||
bank->chip.dev = dev;
|
bank->chip.dev = dev;
|
||||||
|
bank->chip.owner = THIS_MODULE;
|
||||||
bank->dbck_flag = pdata->dbck_flag;
|
bank->dbck_flag = pdata->dbck_flag;
|
||||||
bank->stride = pdata->bank_stride;
|
bank->stride = pdata->bank_stride;
|
||||||
bank->width = pdata->bank_width;
|
bank->width = pdata->bank_width;
|
||||||
|
@ -570,6 +570,10 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
|
|||||||
"could not connect irqchip to gpiochip\n");
|
"could not connect irqchip to gpiochip\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gpiochip_set_chained_irqchip(&chip->gpio_chip,
|
||||||
|
&pca953x_irq_chip,
|
||||||
|
client->irq, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -220,9 +220,9 @@ static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc)
|
|||||||
if (!chip->gpio_width[1])
|
if (!chip->gpio_width[1])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xgpio_writereg(mm_gc->regs + XGPIO_DATA_OFFSET + XGPIO_TRI_OFFSET,
|
xgpio_writereg(mm_gc->regs + XGPIO_DATA_OFFSET + XGPIO_CHANNEL_OFFSET,
|
||||||
chip->gpio_state[1]);
|
chip->gpio_state[1]);
|
||||||
xgpio_writereg(mm_gc->regs + XGPIO_TRI_OFFSET + XGPIO_TRI_OFFSET,
|
xgpio_writereg(mm_gc->regs + XGPIO_TRI_OFFSET + XGPIO_CHANNEL_OFFSET,
|
||||||
chip->gpio_dir[1]);
|
chip->gpio_dir[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,6 +757,7 @@ static int zynq_gpio_remove(struct platform_device *pdev)
|
|||||||
gpiochip_remove(&gpio->chip);
|
gpiochip_remove(&gpio->chip);
|
||||||
clk_disable_unprepare(gpio->clk);
|
clk_disable_unprepare(gpio->clk);
|
||||||
device_set_wakeup_capable(&pdev->dev, 0);
|
device_set_wakeup_capable(&pdev->dev, 0);
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ struct seq_file;
|
|||||||
* @base: identifies the first GPIO number handled by this chip;
|
* @base: identifies the first GPIO number handled by this chip;
|
||||||
* or, if negative during registration, requests dynamic ID allocation.
|
* or, if negative during registration, requests dynamic ID allocation.
|
||||||
* DEPRECATION: providing anything non-negative and nailing the base
|
* DEPRECATION: providing anything non-negative and nailing the base
|
||||||
* base offset of GPIO chips is deprecated. Please pass -1 as base to
|
* offset of GPIO chips is deprecated. Please pass -1 as base to
|
||||||
* let gpiolib select the chip base in all possible cases. We want to
|
* let gpiolib select the chip base in all possible cases. We want to
|
||||||
* get rid of the static GPIO number space in the long run.
|
* get rid of the static GPIO number space in the long run.
|
||||||
* @ngpio: the number of GPIOs handled by this controller; the last GPIO
|
* @ngpio: the number of GPIOs handled by this controller; the last GPIO
|
||||||
|
Loading…
Reference in New Issue
Block a user