Commit 2cb81261 authored by Linus Walleij's avatar Linus Walleij

Merge tag 'gpio-updates-for-v5.6-part1' of...

Merge tag 'gpio-updates-for-v5.6-part1' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into devel

gpio updates for v5.6

- improvements in the gpio-pca953x driver
- use platform_irq_count() in gpio-mvebu and gpio-bcm-kona
- remove unneeded MODULE_VERSION() usage in the gpio directory
- irq-related improvements in gpio-tegra driver
- several improvements for the core subsystem code: fix confusing indentation,
  fix int type casting, unduplicate code in several places
parents 227caae5 2a2cabd8
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_irq.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqdomain.h> #include <linux/irqdomain.h>
#include <linux/irqchip/chained_irq.h> #include <linux/irqchip/chained_irq.h>
...@@ -586,11 +585,18 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev) ...@@ -586,11 +585,18 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
kona_gpio->gpio_chip = template_chip; kona_gpio->gpio_chip = template_chip;
chip = &kona_gpio->gpio_chip; chip = &kona_gpio->gpio_chip;
kona_gpio->num_bank = of_irq_count(dev->of_node); ret = platform_irq_count(pdev);
if (kona_gpio->num_bank == 0) { if (!ret) {
dev_err(dev, "Couldn't determine # GPIO banks\n"); dev_err(dev, "Couldn't determine # GPIO banks\n");
return -ENOENT; return -ENOENT;
} else if (ret < 0) {
if (ret != -EPROBE_DEFER)
dev_err(dev, "Couldn't determine GPIO banks: (%pe)\n",
ERR_PTR(ret));
return ret;
} }
kona_gpio->num_bank = ret;
if (kona_gpio->num_bank > GPIO_MAX_BANK_NUM) { if (kona_gpio->num_bank > GPIO_MAX_BANK_NUM) {
dev_err(dev, "Too many GPIO banks configured (max=%d)\n", dev_err(dev, "Too many GPIO banks configured (max=%d)\n",
GPIO_MAX_BANK_NUM); GPIO_MAX_BANK_NUM);
......
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
#include <linux/irqdomain.h> #include <linux/irqdomain.h>
#include <linux/mfd/syscon.h> #include <linux/mfd/syscon.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_irq.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pwm.h> #include <linux/pwm.h>
...@@ -1102,7 +1101,11 @@ static int mvebu_gpio_probe(struct platform_device *pdev) ...@@ -1102,7 +1101,11 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
soc_variant = MVEBU_GPIO_SOC_VARIANT_ORION; soc_variant = MVEBU_GPIO_SOC_VARIANT_ORION;
/* Some gpio controllers do not provide irq support */ /* Some gpio controllers do not provide irq support */
have_irqs = of_irq_count(np) != 0; err = platform_irq_count(pdev);
if (err < 0)
return err;
have_irqs = err != 0;
mvchip = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_gpio_chip), mvchip = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_gpio_chip),
GFP_KERNEL); GFP_KERNEL);
......
...@@ -770,8 +770,7 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, int irq_base) ...@@ -770,8 +770,7 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, int irq_base)
ret = devm_request_threaded_irq(&client->dev, client->irq, ret = devm_request_threaded_irq(&client->dev, client->irq,
NULL, pca953x_irq_handler, NULL, pca953x_irq_handler,
IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_ONESHOT | IRQF_SHARED,
IRQF_SHARED,
dev_name(&client->dev), chip); dev_name(&client->dev), chip);
if (ret) { if (ret) {
dev_err(&client->dev, "failed to request irq %d\n", dev_err(&client->dev, "failed to request irq %d\n",
...@@ -861,8 +860,6 @@ static int device_pca957x_init(struct pca953x_chip *chip, u32 invert) ...@@ -861,8 +860,6 @@ static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
return ret; return ret;
} }
static const struct of_device_id pca953x_dt_ids[];
static int pca953x_probe(struct i2c_client *client, static int pca953x_probe(struct i2c_client *client,
const struct i2c_device_id *i2c_id) const struct i2c_device_id *i2c_id)
{ {
......
...@@ -244,7 +244,6 @@ static struct platform_driver sama5d2_piobu_driver = { ...@@ -244,7 +244,6 @@ static struct platform_driver sama5d2_piobu_driver = {
module_platform_driver(sama5d2_piobu_driver); module_platform_driver(sama5d2_piobu_driver);
MODULE_VERSION("1.0");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("SAMA5D2 PIOBU controller driver"); MODULE_DESCRIPTION("SAMA5D2 PIOBU controller driver");
MODULE_AUTHOR("Andrei Stefanescu <andrei.stefanescu@microchip.com>"); MODULE_AUTHOR("Andrei Stefanescu <andrei.stefanescu@microchip.com>");
...@@ -243,4 +243,3 @@ static struct platform_driver tb10x_gpio_driver = { ...@@ -243,4 +243,3 @@ static struct platform_driver tb10x_gpio_driver = {
module_platform_driver(tb10x_gpio_driver); module_platform_driver(tb10x_gpio_driver);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("tb10x gpio."); MODULE_DESCRIPTION("tb10x gpio.");
MODULE_VERSION("0.0.1");
...@@ -96,12 +96,12 @@ struct tegra_gpio_info { ...@@ -96,12 +96,12 @@ struct tegra_gpio_info {
static inline void tegra_gpio_writel(struct tegra_gpio_info *tgi, static inline void tegra_gpio_writel(struct tegra_gpio_info *tgi,
u32 val, u32 reg) u32 val, u32 reg)
{ {
__raw_writel(val, tgi->regs + reg); writel_relaxed(val, tgi->regs + reg);
} }
static inline u32 tegra_gpio_readl(struct tegra_gpio_info *tgi, u32 reg) static inline u32 tegra_gpio_readl(struct tegra_gpio_info *tgi, u32 reg)
{ {
return __raw_readl(tgi->regs + reg); return readl_relaxed(tgi->regs + reg);
} }
static unsigned int tegra_gpio_compose(unsigned int bank, unsigned int port, static unsigned int tegra_gpio_compose(unsigned int bank, unsigned int port,
...@@ -416,11 +416,8 @@ static void tegra_gpio_irq_handler(struct irq_desc *desc) ...@@ -416,11 +416,8 @@ static void tegra_gpio_irq_handler(struct irq_desc *desc)
static int tegra_gpio_resume(struct device *dev) static int tegra_gpio_resume(struct device *dev)
{ {
struct tegra_gpio_info *tgi = dev_get_drvdata(dev); struct tegra_gpio_info *tgi = dev_get_drvdata(dev);
unsigned long flags;
unsigned int b, p; unsigned int b, p;
local_irq_save(flags);
for (b = 0; b < tgi->bank_count; b++) { for (b = 0; b < tgi->bank_count; b++) {
struct tegra_gpio_bank *bank = &tgi->bank_info[b]; struct tegra_gpio_bank *bank = &tgi->bank_info[b];
...@@ -448,17 +445,14 @@ static int tegra_gpio_resume(struct device *dev) ...@@ -448,17 +445,14 @@ static int tegra_gpio_resume(struct device *dev)
} }
} }
local_irq_restore(flags);
return 0; return 0;
} }
static int tegra_gpio_suspend(struct device *dev) static int tegra_gpio_suspend(struct device *dev)
{ {
struct tegra_gpio_info *tgi = dev_get_drvdata(dev); struct tegra_gpio_info *tgi = dev_get_drvdata(dev);
unsigned long flags;
unsigned int b, p; unsigned int b, p;
local_irq_save(flags);
for (b = 0; b < tgi->bank_count; b++) { for (b = 0; b < tgi->bank_count; b++) {
struct tegra_gpio_bank *bank = &tgi->bank_info[b]; struct tegra_gpio_bank *bank = &tgi->bank_info[b];
...@@ -488,7 +482,7 @@ static int tegra_gpio_suspend(struct device *dev) ...@@ -488,7 +482,7 @@ static int tegra_gpio_suspend(struct device *dev)
GPIO_INT_ENB(tgi, gpio)); GPIO_INT_ENB(tgi, gpio));
} }
} }
local_irq_restore(flags);
return 0; return 0;
} }
...@@ -497,6 +491,11 @@ static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable) ...@@ -497,6 +491,11 @@ static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable)
struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d); struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d);
unsigned int gpio = d->hwirq; unsigned int gpio = d->hwirq;
u32 port, bit, mask; u32 port, bit, mask;
int err;
err = irq_set_irq_wake(bank->irq, enable);
if (err)
return err;
port = GPIO_PORT(gpio); port = GPIO_PORT(gpio);
bit = GPIO_BIT(gpio); bit = GPIO_BIT(gpio);
...@@ -507,7 +506,7 @@ static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable) ...@@ -507,7 +506,7 @@ static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable)
else else
bank->wake_enb[port] &= ~mask; bank->wake_enb[port] &= ~mask;
return irq_set_irq_wake(bank->irq, enable); return 0;
} }
#endif #endif
...@@ -557,7 +556,7 @@ static inline void tegra_gpio_debuginit(struct tegra_gpio_info *tgi) ...@@ -557,7 +556,7 @@ static inline void tegra_gpio_debuginit(struct tegra_gpio_info *tgi)
#endif #endif
static const struct dev_pm_ops tegra_gpio_pm_ops = { static const struct dev_pm_ops tegra_gpio_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(tegra_gpio_suspend, tegra_gpio_resume) SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(tegra_gpio_suspend, tegra_gpio_resume)
}; };
static int tegra_gpio_probe(struct platform_device *pdev) static int tegra_gpio_probe(struct platform_device *pdev)
......
...@@ -140,7 +140,7 @@ EXPORT_SYMBOL_GPL(gpio_to_desc); ...@@ -140,7 +140,7 @@ EXPORT_SYMBOL_GPL(gpio_to_desc);
* in the given chip for the specified hardware number. * in the given chip for the specified hardware number.
*/ */
struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip,
u16 hwnum) unsigned int hwnum)
{ {
struct gpio_device *gdev = chip->gpiodev; struct gpio_device *gdev = chip->gpiodev;
...@@ -669,14 +669,13 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) ...@@ -669,14 +669,13 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
/* Request each GPIO */ /* Request each GPIO */
for (i = 0; i < handlereq.lines; i++) { for (i = 0; i < handlereq.lines; i++) {
u32 offset = handlereq.lineoffsets[i]; u32 offset = handlereq.lineoffsets[i];
struct gpio_desc *desc; struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset);
if (offset >= gdev->ngpio) { if (IS_ERR(desc)) {
ret = -EINVAL; ret = PTR_ERR(desc);
goto out_free_descs; goto out_free_descs;
} }
desc = &gdev->descs[offset];
ret = gpiod_request(desc, lh->label); ret = gpiod_request(desc, lh->label);
if (ret) if (ret)
goto out_free_descs; goto out_free_descs;
...@@ -1001,8 +1000,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) ...@@ -1001,8 +1000,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
lflags = eventreq.handleflags; lflags = eventreq.handleflags;
eflags = eventreq.eventflags; eflags = eventreq.eventflags;
if (offset >= gdev->ngpio) desc = gpiochip_get_desc(gdev->chip, offset);
return -EINVAL; if (IS_ERR(desc))
return PTR_ERR(desc);
/* Return an error if a unknown flag is set */ /* Return an error if a unknown flag is set */
if ((lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) || if ((lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) ||
...@@ -1040,7 +1040,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) ...@@ -1040,7 +1040,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
} }
} }
desc = &gdev->descs[offset];
ret = gpiod_request(desc, le->label); ret = gpiod_request(desc, le->label);
if (ret) if (ret)
goto out_free_label; goto out_free_label;
...@@ -1167,10 +1166,11 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -1167,10 +1166,11 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
if (copy_from_user(&lineinfo, ip, sizeof(lineinfo))) if (copy_from_user(&lineinfo, ip, sizeof(lineinfo)))
return -EFAULT; return -EFAULT;
if (lineinfo.line_offset >= gdev->ngpio)
return -EINVAL;
desc = &gdev->descs[lineinfo.line_offset]; desc = gpiochip_get_desc(chip, lineinfo.line_offset);
if (IS_ERR(desc))
return PTR_ERR(desc);
if (desc->name) { if (desc->name) {
strncpy(lineinfo.name, desc->name, strncpy(lineinfo.name, desc->name,
sizeof(lineinfo.name)); sizeof(lineinfo.name));
...@@ -2977,7 +2977,8 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested); ...@@ -2977,7 +2977,8 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
* A pointer to the GPIO descriptor, or an ERR_PTR()-encoded negative error * A pointer to the GPIO descriptor, or an ERR_PTR()-encoded negative error
* code on failure. * code on failure.
*/ */
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum, struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip,
unsigned int hwnum,
const char *label, const char *label,
enum gpio_lookup_flags lflags, enum gpio_lookup_flags lflags,
enum gpiod_flags dflags) enum gpiod_flags dflags)
...@@ -3029,7 +3030,16 @@ EXPORT_SYMBOL_GPL(gpiochip_free_own_desc); ...@@ -3029,7 +3030,16 @@ EXPORT_SYMBOL_GPL(gpiochip_free_own_desc);
* rely on gpio_request() having been called beforehand. * rely on gpio_request() having been called beforehand.
*/ */
static int gpio_set_config(struct gpio_chip *gc, unsigned offset, static int gpio_do_set_config(struct gpio_chip *gc, unsigned int offset,
enum pin_config_param mode)
{
if (!gc->set_config)
return -ENOTSUPP;
return gc->set_config(gc, offset, mode);
}
static int gpio_set_config(struct gpio_chip *gc, unsigned int offset,
enum pin_config_param mode) enum pin_config_param mode)
{ {
unsigned long config; unsigned long config;
...@@ -3047,7 +3057,7 @@ static int gpio_set_config(struct gpio_chip *gc, unsigned offset, ...@@ -3047,7 +3057,7 @@ static int gpio_set_config(struct gpio_chip *gc, unsigned offset,
} }
config = PIN_CONF_PACKED(mode, arg); config = PIN_CONF_PACKED(mode, arg);
return gc->set_config ? gc->set_config(gc, offset, config) : -ENOTSUPP; return gpio_do_set_config(gc, offset, mode);
} }
static int gpio_set_bias(struct gpio_chip *chip, struct gpio_desc *desc) static int gpio_set_bias(struct gpio_chip *chip, struct gpio_desc *desc)
...@@ -3281,15 +3291,9 @@ int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) ...@@ -3281,15 +3291,9 @@ int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
VALIDATE_DESC(desc); VALIDATE_DESC(desc);
chip = desc->gdev->chip; chip = desc->gdev->chip;
if (!chip->set || !chip->set_config) {
gpiod_dbg(desc,
"%s: missing set() or set_config() operations\n",
__func__);
return -ENOTSUPP;
}
config = pinconf_to_config_packed(PIN_CONFIG_INPUT_DEBOUNCE, debounce); config = pinconf_to_config_packed(PIN_CONFIG_INPUT_DEBOUNCE, debounce);
return chip->set_config(chip, gpio_chip_hwgpio(desc), config); return gpio_do_set_config(chip, gpio_chip_hwgpio(desc), config);
} }
EXPORT_SYMBOL_GPL(gpiod_set_debounce); EXPORT_SYMBOL_GPL(gpiod_set_debounce);
...@@ -3323,7 +3327,7 @@ int gpiod_set_transitory(struct gpio_desc *desc, bool transitory) ...@@ -3323,7 +3327,7 @@ int gpiod_set_transitory(struct gpio_desc *desc, bool transitory)
packed = pinconf_to_config_packed(PIN_CONFIG_PERSIST_STATE, packed = pinconf_to_config_packed(PIN_CONFIG_PERSIST_STATE,
!transitory); !transitory);
gpio = gpio_chip_hwgpio(desc); gpio = gpio_chip_hwgpio(desc);
rc = chip->set_config(chip, gpio, packed); rc = gpio_do_set_config(chip, gpio, packed);
if (rc == -ENOTSUPP) { if (rc == -ENOTSUPP) {
dev_dbg(&desc->gdev->dev, "Persistence not supported for GPIO %d\n", dev_dbg(&desc->gdev->dev, "Persistence not supported for GPIO %d\n",
gpio); gpio);
......
...@@ -80,7 +80,8 @@ struct gpio_array { ...@@ -80,7 +80,8 @@ struct gpio_array {
unsigned long invert_mask[]; unsigned long invert_mask[];
}; };
struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum); struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip,
unsigned int hwnum);
int gpiod_get_array_value_complex(bool raw, bool can_sleep, int gpiod_get_array_value_complex(bool raw, bool can_sleep,
unsigned int array_size, unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
......
...@@ -715,7 +715,8 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip) ...@@ -715,7 +715,8 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
#endif /* CONFIG_PINCTRL */ #endif /* CONFIG_PINCTRL */
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum, struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip,
unsigned int hwnum,
const char *label, const char *label,
enum gpio_lookup_flags lflags, enum gpio_lookup_flags lflags,
enum gpiod_flags dflags); enum gpiod_flags dflags);
......
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