A set of fixes for the v5.5 series:
- Fix the build for the Xtensa driver. - Make sure to set up the parent device for mpc8xxx. - Clarify the look-up error message. - Fix the usage of the line direction in the mockup device. - Fix a type warning on the Aspeed driver. - Remove the pointless __exit annotation on the xgs-iproc which is causing a compilation problem. - Fix up emultation of open drain outputs .get_direction() - Fix the IRQ callbacks on the PCA953xx to use bitops and work properly. - Fix the Kconfig on the Tegra driver. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEElDRnuGcz/wPCXQWMQRCzN7AZXXMFAl4D6rAACgkQQRCzN7AZ XXNEnQ/9Gb19jq7YEEIh3oGhZoMErlD/+ZIyP82ejggVbhi4aRnGJHeaZSNPFJKK 5mvncpJdgONdGym6MNT4pDVLGRqyHe2FgTAEhjpBBVqS9unnTU9obem6EoY+ur5a EFt2LjTz9Yntg3mkjFJJwtdozAYSr+8SpAepsxzuUnjFpeUzaEMaTmMxmKsUcPbD X2KO8rTxPHUAn/9TqfP2ywNQh3tLTU9O2coPS4O7VnWiG+AvqTTnubWrsIktNrB/ On30lEfxjQkzUZtHdSmvNg79BAhd436rcGB686dleiJEmp9MvtvVLxE01Ehf3bZl IX0tndAxUhnUDOyI6vrW9AdL/S9nG3VM03Z/YPx8e4UHlMSU6OyPqKZOPXTjTIJr jpuXqz+LqhqeZdAO7HBdQm1yUZhv9W2Hw46hchZJyabDBoQ4UG/y1E7sMe2TlpaK 2xFjagtNpAQbSVMsA1Bzh6z2J1LWo/8J+xuQv28gBpjT9rMTYBRIkIXJKyuWN2tF QXHW9tejiRY560IhRVVj4ckswvZiizT5ZGQPxwS/Piw9+41ELFRjcONyOqMO6aGl TxtUqvZauWpVcLMvoRCjweTWBdJDXgJXzFl7vw+3znmgLctrIuLDe+7MuNBZlHI7 +VFteHW/rv/WucepM5BhAgWTM/G08xm8o2/zuS2xKSjQKF71NeM= =eZNi -----END PGP SIGNATURE----- Merge tag 'gpio-v5.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio Pull GPIO fixes from Linus Walleij: "A set of fixes for the v5.5 series: - Fix the build for the Xtensa driver. - Make sure to set up the parent device for mpc8xxx. - Clarify the look-up error message. - Fix the usage of the line direction in the mockup device. - Fix a type warning on the Aspeed driver. - Remove the pointless __exit annotation on the xgs-iproc which is causing a compilation problem. - Fix up emultation of open drain outputs .get_direction() - Fix the IRQ callbacks on the PCA953xx to use bitops and work properly. - Fix the Kconfig on the Tegra driver" * tag 'gpio-v5.5-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: gpio: tegra186: Allow building on Tegra194-only configurations gpio: pca953x: Switch to bitops in IRQ callbacks gpiolib: fix up emulated open drain outputs MAINTAINERS: Append missed file to the database gpio: xgs-iproc: remove __exit annotation for iproc_gpio_remove gpio: aspeed: avoid return type warning gpio: mockup: Fix usage of new GPIO_LINE_DIRECTION gpio: Fix error message on out-of-range GPIO in lookup table gpio: mpc8xxx: Add platform device to gpiochip->parent gpio: xtensa: fix driver build
This commit is contained in:
commit
a305bd7c9c
|
@ -7034,6 +7034,7 @@ L: linux-acpi@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/firmware-guide/acpi/gpio-properties.rst
|
F: Documentation/firmware-guide/acpi/gpio-properties.rst
|
||||||
F: drivers/gpio/gpiolib-acpi.c
|
F: drivers/gpio/gpiolib-acpi.c
|
||||||
|
F: drivers/gpio/gpiolib-acpi.h
|
||||||
|
|
||||||
GPIO IR Transmitter
|
GPIO IR Transmitter
|
||||||
M: Sean Young <sean@mess.org>
|
M: Sean Young <sean@mess.org>
|
||||||
|
|
|
@ -553,8 +553,8 @@ config GPIO_TEGRA
|
||||||
|
|
||||||
config GPIO_TEGRA186
|
config GPIO_TEGRA186
|
||||||
tristate "NVIDIA Tegra186 GPIO support"
|
tristate "NVIDIA Tegra186 GPIO support"
|
||||||
default ARCH_TEGRA_186_SOC
|
default ARCH_TEGRA_186_SOC || ARCH_TEGRA_194_SOC
|
||||||
depends on ARCH_TEGRA_186_SOC || COMPILE_TEST
|
depends on ARCH_TEGRA_186_SOC || ARCH_TEGRA_194_SOC || COMPILE_TEST
|
||||||
depends on OF_GPIO
|
depends on OF_GPIO
|
||||||
select GPIOLIB_IRQCHIP
|
select GPIOLIB_IRQCHIP
|
||||||
select IRQ_DOMAIN_HIERARCHY
|
select IRQ_DOMAIN_HIERARCHY
|
||||||
|
|
|
@ -107,7 +107,7 @@ static void __iomem *bank_reg(struct aspeed_sgpio *gpio,
|
||||||
return gpio->base + bank->irq_regs + GPIO_IRQ_STATUS;
|
return gpio->base + bank->irq_regs + GPIO_IRQ_STATUS;
|
||||||
default:
|
default:
|
||||||
/* acturally if code runs to here, it's an error case */
|
/* acturally if code runs to here, it's an error case */
|
||||||
BUG_ON(1);
|
BUG();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,7 @@ static int gpio_mockup_get_direction(struct gpio_chip *gc, unsigned int offset)
|
||||||
int direction;
|
int direction;
|
||||||
|
|
||||||
mutex_lock(&chip->lock);
|
mutex_lock(&chip->lock);
|
||||||
direction = !chip->lines[offset].dir;
|
direction = chip->lines[offset].dir;
|
||||||
mutex_unlock(&chip->lock);
|
mutex_unlock(&chip->lock);
|
||||||
|
|
||||||
return direction;
|
return direction;
|
||||||
|
@ -395,7 +395,7 @@ static int gpio_mockup_probe(struct platform_device *pdev)
|
||||||
struct gpio_chip *gc;
|
struct gpio_chip *gc;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
const char *name;
|
const char *name;
|
||||||
int rv, base;
|
int rv, base, i;
|
||||||
u16 ngpio;
|
u16 ngpio;
|
||||||
|
|
||||||
dev = &pdev->dev;
|
dev = &pdev->dev;
|
||||||
|
@ -447,6 +447,9 @@ static int gpio_mockup_probe(struct platform_device *pdev)
|
||||||
if (!chip->lines)
|
if (!chip->lines)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for (i = 0; i < gc->ngpio; i++)
|
||||||
|
chip->lines[i].dir = GPIO_LINE_DIRECTION_IN;
|
||||||
|
|
||||||
if (device_property_read_bool(dev, "named-gpio-lines")) {
|
if (device_property_read_bool(dev, "named-gpio-lines")) {
|
||||||
rv = gpio_mockup_name_lines(dev, chip);
|
rv = gpio_mockup_name_lines(dev, chip);
|
||||||
if (rv)
|
if (rv)
|
||||||
|
|
|
@ -346,6 +346,7 @@ static int mpc8xxx_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
gc = &mpc8xxx_gc->gc;
|
gc = &mpc8xxx_gc->gc;
|
||||||
|
gc->parent = &pdev->dev;
|
||||||
|
|
||||||
if (of_property_read_bool(np, "little-endian")) {
|
if (of_property_read_bool(np, "little-endian")) {
|
||||||
ret = bgpio_init(gc, &pdev->dev, 4,
|
ret = bgpio_init(gc, &pdev->dev, 4,
|
||||||
|
|
|
@ -568,16 +568,18 @@ static void pca953x_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
chip->irq_mask[d->hwirq / BANK_SZ] &= ~BIT(d->hwirq % BANK_SZ);
|
clear_bit(hwirq, chip->irq_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pca953x_irq_unmask(struct irq_data *d)
|
static void pca953x_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
chip->irq_mask[d->hwirq / BANK_SZ] |= BIT(d->hwirq % BANK_SZ);
|
set_bit(hwirq, chip->irq_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pca953x_irq_set_wake(struct irq_data *d, unsigned int on)
|
static int pca953x_irq_set_wake(struct irq_data *d, unsigned int on)
|
||||||
|
@ -635,8 +637,7 @@ static int pca953x_irq_set_type(struct irq_data *d, unsigned int type)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
int bank_nb = d->hwirq / BANK_SZ;
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
u8 mask = BIT(d->hwirq % BANK_SZ);
|
|
||||||
|
|
||||||
if (!(type & IRQ_TYPE_EDGE_BOTH)) {
|
if (!(type & IRQ_TYPE_EDGE_BOTH)) {
|
||||||
dev_err(&chip->client->dev, "irq %d: unsupported type %d\n",
|
dev_err(&chip->client->dev, "irq %d: unsupported type %d\n",
|
||||||
|
@ -644,15 +645,8 @@ static int pca953x_irq_set_type(struct irq_data *d, unsigned int type)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type & IRQ_TYPE_EDGE_FALLING)
|
assign_bit(hwirq, chip->irq_trig_fall, type & IRQ_TYPE_EDGE_FALLING);
|
||||||
chip->irq_trig_fall[bank_nb] |= mask;
|
assign_bit(hwirq, chip->irq_trig_raise, type & IRQ_TYPE_EDGE_RISING);
|
||||||
else
|
|
||||||
chip->irq_trig_fall[bank_nb] &= ~mask;
|
|
||||||
|
|
||||||
if (type & IRQ_TYPE_EDGE_RISING)
|
|
||||||
chip->irq_trig_raise[bank_nb] |= mask;
|
|
||||||
else
|
|
||||||
chip->irq_trig_raise[bank_nb] &= ~mask;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -661,10 +655,10 @@ static void pca953x_irq_shutdown(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
u8 mask = BIT(d->hwirq % BANK_SZ);
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
chip->irq_trig_raise[d->hwirq / BANK_SZ] &= ~mask;
|
clear_bit(hwirq, chip->irq_trig_raise);
|
||||||
chip->irq_trig_fall[d->hwirq / BANK_SZ] &= ~mask;
|
clear_bit(hwirq, chip->irq_trig_fall);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pending)
|
static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pending)
|
||||||
|
|
|
@ -280,7 +280,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __exit iproc_gpio_remove(struct platform_device *pdev)
|
static int iproc_gpio_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct iproc_gpio_chip *chip;
|
struct iproc_gpio_chip *chip;
|
||||||
|
|
||||||
|
|
|
@ -44,15 +44,14 @@ static inline unsigned long enable_cp(unsigned long *cpenable)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
RSR_CPENABLE(*cpenable);
|
*cpenable = xtensa_get_sr(cpenable);
|
||||||
WSR_CPENABLE(*cpenable | BIT(XCHAL_CP_ID_XTIOP));
|
xtensa_set_sr(*cpenable | BIT(XCHAL_CP_ID_XTIOP), cpenable);
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void disable_cp(unsigned long flags, unsigned long cpenable)
|
static inline void disable_cp(unsigned long flags, unsigned long cpenable)
|
||||||
{
|
{
|
||||||
WSR_CPENABLE(cpenable);
|
xtensa_set_sr(cpenable, cpenable);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,14 @@ int gpiod_get_direction(struct gpio_desc *desc)
|
||||||
chip = gpiod_to_chip(desc);
|
chip = gpiod_to_chip(desc);
|
||||||
offset = gpio_chip_hwgpio(desc);
|
offset = gpio_chip_hwgpio(desc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Open drain emulation using input mode may incorrectly report
|
||||||
|
* input here, fix that up.
|
||||||
|
*/
|
||||||
|
if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) &&
|
||||||
|
test_bit(FLAG_IS_OUT, &desc->flags))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!chip->get_direction)
|
if (!chip->get_direction)
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
||||||
|
@ -4472,8 +4480,9 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
|
||||||
|
|
||||||
if (chip->ngpio <= p->chip_hwnum) {
|
if (chip->ngpio <= p->chip_hwnum) {
|
||||||
dev_err(dev,
|
dev_err(dev,
|
||||||
"requested GPIO %d is out of range [0..%d] for chip %s\n",
|
"requested GPIO %u (%u) is out of range [0..%u] for chip %s\n",
|
||||||
idx, chip->ngpio, chip->label);
|
idx, p->chip_hwnum, chip->ngpio - 1,
|
||||||
|
chip->label);
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue