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 -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEFp3rbAvDxGAT0sefEacuoBRx13IFAl4UZxEACgkQEacuoBRx 13LPnhAAyrG/Vnm3UN7bs/W8hM+D4Jt/yFTcvrh+/Ua7DFYCIvptAsiGR4Y+hmdI Dq2J4kZw7TaL2vw8/WQ3Ij6NHBIcqnVzT8x8Id6S2WNb3jqEmuzUpGLXpUEIi+U1 SUXT8amyNAJVlVdAXOk79zAsWML6AMkats38JR5d18Nf4+CNzjdu/2GL80MtRQLa CJ2X99A2BzcUed5/YwOIYwapK6IzFmPYwLyXcJr/WDY14rqWjKJtax5djml1Xrfb FyLdUPUC9GRD9/IQmJJTcL2LM2078yqaKbqzqiZ/SVQka3HS4K95N6LiZUt5RBt5 vmBMXF09qXwGsUYo6VHSDQfRxp9wsw0ukfrapVK2ytRInWPTLbGbrXKrm6uA/FuW IYMsjtrLYuxAQNt67kahW2/+zlm63kRUdtmt9QHFMgNA8MESbJf0ds2X8seDyGhq Eh8+hOm1I20lbAkW2VksJn1b+e2GEszhgyUEZSv0Ew9xwiOa11SRnWjicNql0TUR zbViz9HRnB1QNNFpwYEJz4Ke38URdC9QT9H91u8BWPo6emopRm0KamxWag62WjCE vy4uJJUp2L8uMJQ/3JqjxCUyOkZ0afnJwCdysNbZqNs19g3JpjIbIHV8wxXA53Aq IX9PDVhq+AEa+o3wHwvB4xGY903IC9iGyEzeb8rOmiaDH/zgGng= =ia2k -----END PGP SIGNATURE----- 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
This commit is contained in:
Коммит
2cb81261a9
|
@ -19,7 +19,6 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
|
@ -586,11 +585,18 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
|
|||
|
||||
kona_gpio->gpio_chip = template_chip;
|
||||
chip = &kona_gpio->gpio_chip;
|
||||
kona_gpio->num_bank = of_irq_count(dev->of_node);
|
||||
if (kona_gpio->num_bank == 0) {
|
||||
ret = platform_irq_count(pdev);
|
||||
if (!ret) {
|
||||
dev_err(dev, "Couldn't determine # GPIO banks\n");
|
||||
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) {
|
||||
dev_err(dev, "Too many GPIO banks configured (max=%d)\n",
|
||||
GPIO_MAX_BANK_NUM);
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
#include <linux/irqdomain.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pwm.h>
|
||||
|
@ -1102,7 +1101,11 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
|
|||
soc_variant = MVEBU_GPIO_SOC_VARIANT_ORION;
|
||||
|
||||
/* 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),
|
||||
GFP_KERNEL);
|
||||
|
|
|
@ -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,
|
||||
NULL, pca953x_irq_handler,
|
||||
IRQF_TRIGGER_LOW | IRQF_ONESHOT |
|
||||
IRQF_SHARED,
|
||||
IRQF_ONESHOT | IRQF_SHARED,
|
||||
dev_name(&client->dev), chip);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "failed to request irq %d\n",
|
||||
|
@ -861,8 +860,6 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id pca953x_dt_ids[];
|
||||
|
||||
static int pca953x_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *i2c_id)
|
||||
{
|
||||
|
|
|
@ -244,7 +244,6 @@ static struct platform_driver sama5d2_piobu_driver = {
|
|||
|
||||
module_platform_driver(sama5d2_piobu_driver);
|
||||
|
||||
MODULE_VERSION("1.0");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("SAMA5D2 PIOBU controller driver");
|
||||
MODULE_AUTHOR("Andrei Stefanescu <andrei.stefanescu@microchip.com>");
|
||||
|
|
|
@ -243,4 +243,3 @@ static struct platform_driver tb10x_gpio_driver = {
|
|||
module_platform_driver(tb10x_gpio_driver);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("tb10x gpio.");
|
||||
MODULE_VERSION("0.0.1");
|
||||
|
|
|
@ -96,12 +96,12 @@ struct tegra_gpio_info {
|
|||
static inline void tegra_gpio_writel(struct tegra_gpio_info *tgi,
|
||||
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)
|
||||
{
|
||||
return __raw_readl(tgi->regs + reg);
|
||||
return readl_relaxed(tgi->regs + reg);
|
||||
}
|
||||
|
||||
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)
|
|||
static int tegra_gpio_resume(struct device *dev)
|
||||
{
|
||||
struct tegra_gpio_info *tgi = dev_get_drvdata(dev);
|
||||
unsigned long flags;
|
||||
unsigned int b, p;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
for (b = 0; b < tgi->bank_count; b++) {
|
||||
struct tegra_gpio_bank *bank = &tgi->bank_info[b];
|
||||
|
||||
|
@ -448,17 +445,14 @@ static int tegra_gpio_resume(struct device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_gpio_suspend(struct device *dev)
|
||||
{
|
||||
struct tegra_gpio_info *tgi = dev_get_drvdata(dev);
|
||||
unsigned long flags;
|
||||
unsigned int b, p;
|
||||
|
||||
local_irq_save(flags);
|
||||
for (b = 0; b < tgi->bank_count; b++) {
|
||||
struct tegra_gpio_bank *bank = &tgi->bank_info[b];
|
||||
|
||||
|
@ -488,7 +482,7 @@ static int tegra_gpio_suspend(struct device *dev)
|
|||
GPIO_INT_ENB(tgi, gpio));
|
||||
}
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
unsigned int gpio = d->hwirq;
|
||||
u32 port, bit, mask;
|
||||
int err;
|
||||
|
||||
err = irq_set_irq_wake(bank->irq, enable);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
port = GPIO_PORT(gpio);
|
||||
bit = GPIO_BIT(gpio);
|
||||
|
@ -507,7 +506,7 @@ static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable)
|
|||
else
|
||||
bank->wake_enb[port] &= ~mask;
|
||||
|
||||
return irq_set_irq_wake(bank->irq, enable);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -557,7 +556,7 @@ static inline void tegra_gpio_debuginit(struct tegra_gpio_info *tgi)
|
|||
#endif
|
||||
|
||||
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)
|
||||
|
|
|
@ -140,7 +140,7 @@ EXPORT_SYMBOL_GPL(gpio_to_desc);
|
|||
* in the given chip for the specified hardware number.
|
||||
*/
|
||||
struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip,
|
||||
u16 hwnum)
|
||||
unsigned int hwnum)
|
||||
{
|
||||
struct gpio_device *gdev = chip->gpiodev;
|
||||
|
||||
|
@ -669,14 +669,13 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
|
|||
/* Request each GPIO */
|
||||
for (i = 0; i < handlereq.lines; i++) {
|
||||
u32 offset = handlereq.lineoffsets[i];
|
||||
struct gpio_desc *desc;
|
||||
struct gpio_desc *desc = gpiochip_get_desc(gdev->chip, offset);
|
||||
|
||||
if (offset >= gdev->ngpio) {
|
||||
ret = -EINVAL;
|
||||
if (IS_ERR(desc)) {
|
||||
ret = PTR_ERR(desc);
|
||||
goto out_free_descs;
|
||||
}
|
||||
|
||||
desc = &gdev->descs[offset];
|
||||
ret = gpiod_request(desc, lh->label);
|
||||
if (ret)
|
||||
goto out_free_descs;
|
||||
|
@ -1001,8 +1000,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
|
|||
lflags = eventreq.handleflags;
|
||||
eflags = eventreq.eventflags;
|
||||
|
||||
if (offset >= gdev->ngpio)
|
||||
return -EINVAL;
|
||||
desc = gpiochip_get_desc(gdev->chip, offset);
|
||||
if (IS_ERR(desc))
|
||||
return PTR_ERR(desc);
|
||||
|
||||
/* Return an error if a unknown flag is set */
|
||||
if ((lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) ||
|
||||
|
@ -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);
|
||||
if (ret)
|
||||
goto out_free_label;
|
||||
|
@ -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)))
|
||||
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) {
|
||||
strncpy(lineinfo.name, desc->name,
|
||||
sizeof(lineinfo.name));
|
||||
|
@ -1435,7 +1435,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
|
|||
|
||||
if (chip->ngpio > FASTPATH_NGPIO)
|
||||
chip_warn(chip, "line cnt %u is greater than fast path cnt %u\n",
|
||||
chip->ngpio, FASTPATH_NGPIO);
|
||||
chip->ngpio, FASTPATH_NGPIO);
|
||||
|
||||
gdev->label = kstrdup_const(chip->label ?: "unknown", GFP_KERNEL);
|
||||
if (!gdev->label) {
|
||||
|
@ -2977,7 +2977,8 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
|
|||
* A pointer to the GPIO descriptor, or an ERR_PTR()-encoded negative error
|
||||
* 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,
|
||||
enum gpio_lookup_flags lflags,
|
||||
enum gpiod_flags dflags)
|
||||
|
@ -3029,7 +3030,16 @@ EXPORT_SYMBOL_GPL(gpiochip_free_own_desc);
|
|||
* 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)
|
||||
{
|
||||
unsigned long config;
|
||||
|
@ -3047,7 +3057,7 @@ static int gpio_set_config(struct gpio_chip *gc, unsigned offset,
|
|||
}
|
||||
|
||||
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)
|
||||
|
@ -3281,15 +3291,9 @@ int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
|
|||
|
||||
VALIDATE_DESC(desc);
|
||||
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);
|
||||
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);
|
||||
|
||||
|
@ -3323,7 +3327,7 @@ int gpiod_set_transitory(struct gpio_desc *desc, bool transitory)
|
|||
packed = pinconf_to_config_packed(PIN_CONFIG_PERSIST_STATE,
|
||||
!transitory);
|
||||
gpio = gpio_chip_hwgpio(desc);
|
||||
rc = chip->set_config(chip, gpio, packed);
|
||||
rc = gpio_do_set_config(chip, gpio, packed);
|
||||
if (rc == -ENOTSUPP) {
|
||||
dev_dbg(&desc->gdev->dev, "Persistence not supported for GPIO %d\n",
|
||||
gpio);
|
||||
|
|
|
@ -80,7 +80,8 @@ struct gpio_array {
|
|||
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,
|
||||
unsigned int array_size,
|
||||
struct gpio_desc **desc_array,
|
||||
|
|
|
@ -715,7 +715,8 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
|
|||
|
||||
#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,
|
||||
enum gpio_lookup_flags lflags,
|
||||
enum gpiod_flags dflags);
|
||||
|
|
Загрузка…
Ссылка в новой задаче