Commit 7182e897 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'gpio-updates-for-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux

Pull gpio updates from Bartosz Golaszewski:
 "We have lots of small changes all over the place, but no huge reworks
  or new drivers:

   - use ioread()/iowrite() interfaces instead of raw inb()/outb() in
     drivers

   - make irqchips immutable due to the new warning popping up when
     drivers try to modify the irqchip structures

   - add new compatibles to dt-bindings for realtek-otto, renesas-rcar
     and pca95xx

   - add support for new models to gpio-rcar, gpio-pca953x &
     gpio-realtek-otto

   - allow parsing of GPIO hogs represented as children nodes of
     gpio-uniphier

   - define a set of common GPIO consumer strings in dt-bindings

   - shrink code in gpio-ml-ioh by using more devres interfaces

   - pass arguments to devm_kcalloc() in correct order in gpio-sim

   - add new helpers for iterating over GPIO firmware nodes and
     descriptors to gpiolib core and use it in several drivers

 ...
parents f1f88bb5 5a7cb9f3
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/gpio/gpio-consumer-common.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Common GPIO lines
maintainers:
- Bartosz Golaszewski <brgl@bgdev.pl>
- Linus Walleij <linus.walleij@linaro.org>
description:
Pay attention to using proper GPIO flag (e.g. GPIO_ACTIVE_LOW) for the GPIOs
using inverted signal (e.g. RESETN).
select: true
properties:
enable-gpios:
maxItems: 1
description:
GPIO connected to the enable control pin.
reset-gpios:
description:
GPIO (or GPIOs for power sequence) connected to the device reset pin
(e.g. RESET or RESETN).
powerdown-gpios:
maxItems: 1
description:
GPIO connected to the power down pin (hardware power down or power cut,
e.g. PD or PWDN).
pwdn-gpios:
maxItems: 1
description: Use powerdown-gpios
deprecated: true
wakeup-gpios:
maxItems: 1
description:
GPIO connected to the pin waking up the device from suspend or other
power-saving modes.
allOf:
- if:
properties:
compatible:
contains:
enum:
- mmc-pwrseq-simple
then:
properties:
reset-gpios:
minItems: 1
maxItems: 32
else:
properties:
reset-gpios:
maxItems: 1
additionalProperties: true
...@@ -30,6 +30,7 @@ properties: ...@@ -30,6 +30,7 @@ properties:
- maxim,max7325 - maxim,max7325
- maxim,max7326 - maxim,max7326
- maxim,max7327 - maxim,max7327
- nxp,pca6408
- nxp,pca6416 - nxp,pca6416
- nxp,pca9505 - nxp,pca9505
- nxp,pca9506 - nxp,pca9506
......
...@@ -28,10 +28,11 @@ properties: ...@@ -28,10 +28,11 @@ properties:
- enum: - enum:
- realtek,rtl8380-gpio - realtek,rtl8380-gpio
- realtek,rtl8390-gpio - realtek,rtl8390-gpio
- realtek,rtl9300-gpio
- realtek,rtl9310-gpio
- const: realtek,otto-gpio - const: realtek,otto-gpio
reg: reg: true
maxItems: 1
"#gpio-cells": "#gpio-cells":
const: 2 const: 2
...@@ -50,6 +51,23 @@ properties: ...@@ -50,6 +51,23 @@ properties:
interrupts: interrupts:
maxItems: 1 maxItems: 1
if:
properties:
compatible:
contains:
const: realtek,rtl9300-gpio
then:
properties:
reg:
items:
- description: GPIO and interrupt control
- description: interrupt CPU map
else:
properties:
reg:
items:
- description: GPIO and interrupt control
required: required:
- compatible - compatible
- reg - reg
...@@ -74,5 +92,17 @@ examples: ...@@ -74,5 +92,17 @@ examples:
interrupt-parent = <&rtlintc>; interrupt-parent = <&rtlintc>;
interrupts = <23>; interrupts = <23>;
}; };
- |
gpio@3300 {
compatible = "realtek,rtl9300-gpio", "realtek,otto-gpio";
reg = <0x3300 0x1c>, <0x3338 0x8>;
gpio-controller;
#gpio-cells = <2>;
ngpios = <24>;
interrupt-controller;
#interrupt-cells = <2>;
interrupt-parent = <&rtlintc>;
interrupts = <13>;
};
... ...
...@@ -51,6 +51,11 @@ properties: ...@@ -51,6 +51,11 @@ properties:
- items: - items:
- const: renesas,gpio-r8a779a0 # R-Car V3U - const: renesas,gpio-r8a779a0 # R-Car V3U
- items:
- enum:
- renesas,gpio-r8a779f0 # R-Car S4-8
- const: renesas,rcar-gen4-gpio # R-Car Gen4
reg: reg:
maxItems: 1 maxItems: 1
......
...@@ -52,6 +52,23 @@ properties: ...@@ -52,6 +52,23 @@ properties:
<child-interrupt-base parent-interrupt-base length> triplets. <child-interrupt-base parent-interrupt-base length> triplets.
$ref: /schemas/types.yaml#/definitions/uint32-matrix $ref: /schemas/types.yaml#/definitions/uint32-matrix
patternProperties:
"^.+-hog(-[0-9]+)?$":
type: object
properties:
gpio-hog: true
gpios: true
input: true
output-high: true
output-low: true
line-name: true
required:
- gpio-hog
- gpios
additionalProperties: false
required: required:
- compatible - compatible
- reg - reg
......
...@@ -472,11 +472,10 @@ static int __init da830_evm_ui_expander_setup(struct i2c_client *client, ...@@ -472,11 +472,10 @@ static int __init da830_evm_ui_expander_setup(struct i2c_client *client,
return 0; return 0;
} }
static int da830_evm_ui_expander_teardown(struct i2c_client *client, int gpio, static void da830_evm_ui_expander_teardown(struct i2c_client *client, int gpio,
unsigned ngpio, void *context) unsigned ngpio, void *context)
{ {
gpio_free(gpio + 6); gpio_free(gpio + 6);
return 0;
} }
static struct pcf857x_platform_data __initdata da830_evm_ui_expander_info = { static struct pcf857x_platform_data __initdata da830_evm_ui_expander_info = {
......
...@@ -365,14 +365,13 @@ evm_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) ...@@ -365,14 +365,13 @@ evm_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
return status; return status;
} }
static int static void
evm_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) evm_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
{ {
if (evm_led_dev) { if (evm_led_dev) {
platform_device_unregister(evm_led_dev); platform_device_unregister(evm_led_dev);
evm_led_dev = NULL; evm_led_dev = NULL;
} }
return 0;
} }
static struct pcf857x_platform_data pcf_data_u2 = { static struct pcf857x_platform_data pcf_data_u2 = {
...@@ -427,7 +426,7 @@ evm_u18_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) ...@@ -427,7 +426,7 @@ evm_u18_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
return 0; return 0;
} }
static int static void
evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
{ {
gpio_free(gpio + 1); gpio_free(gpio + 1);
...@@ -438,7 +437,6 @@ evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) ...@@ -438,7 +437,6 @@ evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
device_remove_file(&client->dev, &dev_attr_user_sw); device_remove_file(&client->dev, &dev_attr_user_sw);
gpio_free(sw_gpio); gpio_free(sw_gpio);
} }
return 0;
} }
static struct pcf857x_platform_data pcf_data_u18 = { static struct pcf857x_platform_data pcf_data_u18 = {
...@@ -487,7 +485,7 @@ evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) ...@@ -487,7 +485,7 @@ evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
return 0; return 0;
} }
static int static void
evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
{ {
gpio_free(gpio + 7); gpio_free(gpio + 7);
...@@ -497,7 +495,6 @@ evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) ...@@ -497,7 +495,6 @@ evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
gpio_free(gpio + 2); gpio_free(gpio + 2);
gpio_free(gpio + 1); gpio_free(gpio + 1);
gpio_free(gpio + 0); gpio_free(gpio + 0);
return 0;
} }
static struct pcf857x_platform_data pcf_data_u35 = { static struct pcf857x_platform_data pcf_data_u35 = {
......
...@@ -314,15 +314,13 @@ static int evm_pcf_setup(struct i2c_client *client, int gpio, ...@@ -314,15 +314,13 @@ static int evm_pcf_setup(struct i2c_client *client, int gpio,
return evm_led_setup(client, gpio+4, 4, c); return evm_led_setup(client, gpio+4, 4, c);
} }
static int evm_pcf_teardown(struct i2c_client *client, int gpio, static void evm_pcf_teardown(struct i2c_client *client, int gpio,
unsigned int ngpio, void *c) unsigned int ngpio, void *c)
{ {
BUG_ON(ngpio < 8); BUG_ON(ngpio < 8);
evm_sw_teardown(client, gpio, 4, c); evm_sw_teardown(client, gpio, 4, c);
evm_led_teardown(client, gpio+4, 4, c); evm_led_teardown(client, gpio+4, 4, c);
return 0;
} }
static struct pcf857x_platform_data pcf_data = { static struct pcf857x_platform_data pcf_data = {
......
...@@ -353,8 +353,8 @@ config GPIO_IOP ...@@ -353,8 +353,8 @@ config GPIO_IOP
config GPIO_IXP4XX config GPIO_IXP4XX
bool "Intel IXP4xx GPIO" bool "Intel IXP4xx GPIO"
depends on ARM # For <asm/mach-types.h>
depends on ARCH_IXP4XX depends on ARCH_IXP4XX
depends on OF
select GPIO_GENERIC select GPIO_GENERIC
select GPIOLIB_IRQCHIP select GPIOLIB_IRQCHIP
select IRQ_DOMAIN_HIERARCHY select IRQ_DOMAIN_HIERARCHY
...@@ -363,6 +363,7 @@ config GPIO_IXP4XX ...@@ -363,6 +363,7 @@ config GPIO_IXP4XX
IXP4xx series of chips. IXP4xx series of chips.
If unsure, say N. If unsure, say N.
config GPIO_LOGICVC config GPIO_LOGICVC
tristate "Xylon LogiCVC GPIO support" tristate "Xylon LogiCVC GPIO support"
depends on MFD_SYSCON && OF depends on MFD_SYSCON && OF
...@@ -674,10 +675,10 @@ config GPIO_UNIPHIER ...@@ -674,10 +675,10 @@ config GPIO_UNIPHIER
config GPIO_VF610 config GPIO_VF610
def_bool y def_bool y
depends on ARCH_MXC && SOC_VF610 depends on ARCH_MXC
select GPIOLIB_IRQCHIP select GPIOLIB_IRQCHIP
help help
Say yes here to support Vybrid vf610 GPIOs. Say yes here to support i.MX or Vybrid vf610 GPIOs.
config GPIO_VISCONTI config GPIO_VISCONTI
tristate "Toshiba Visconti GPIO support" tristate "Toshiba Visconti GPIO support"
......
...@@ -49,7 +49,7 @@ struct dio48e_gpio { ...@@ -49,7 +49,7 @@ struct dio48e_gpio {
unsigned char out_state[6]; unsigned char out_state[6];
unsigned char control[2]; unsigned char control[2];
raw_spinlock_t lock; raw_spinlock_t lock;
unsigned int base; void __iomem *base;
unsigned char irq_mask; unsigned char irq_mask;
}; };
...@@ -70,7 +70,7 @@ static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned int offs ...@@ -70,7 +70,7 @@ static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned int offs
struct dio48e_gpio *const dio48egpio = gpiochip_get_data(chip); struct dio48e_gpio *const dio48egpio = gpiochip_get_data(chip);
const unsigned int io_port = offset / 8; const unsigned int io_port = offset / 8;
const unsigned int control_port = io_port / 3; const unsigned int control_port = io_port / 3;
const unsigned int control_addr = dio48egpio->base + 3 + control_port * 4; void __iomem *const control_addr = dio48egpio->base + 3 + control_port * 4;
unsigned long flags; unsigned long flags;
unsigned int control; unsigned int control;
...@@ -95,9 +95,9 @@ static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned int offs ...@@ -95,9 +95,9 @@ static int dio48e_gpio_direction_input(struct gpio_chip *chip, unsigned int offs
} }
control = BIT(7) | dio48egpio->control[control_port]; control = BIT(7) | dio48egpio->control[control_port];
outb(control, control_addr); iowrite8(control, control_addr);
control &= ~BIT(7); control &= ~BIT(7);
outb(control, control_addr); iowrite8(control, control_addr);
raw_spin_unlock_irqrestore(&dio48egpio->lock, flags); raw_spin_unlock_irqrestore(&dio48egpio->lock, flags);
...@@ -111,7 +111,7 @@ static int dio48e_gpio_direction_output(struct gpio_chip *chip, unsigned int off ...@@ -111,7 +111,7 @@ static int dio48e_gpio_direction_output(struct gpio_chip *chip, unsigned int off
const unsigned int io_port = offset / 8; const unsigned int io_port = offset / 8;
const unsigned int control_port = io_port / 3; const unsigned int control_port = io_port / 3;
const unsigned int mask = BIT(offset % 8); const unsigned int mask = BIT(offset % 8);
const unsigned int control_addr = dio48egpio->base + 3 + control_port * 4; void __iomem *const control_addr = dio48egpio->base + 3 + control_port * 4;
const unsigned int out_port = (io_port > 2) ? io_port + 1 : io_port; const unsigned int out_port = (io_port > 2) ? io_port + 1 : io_port;
unsigned long flags; unsigned long flags;
unsigned int control; unsigned int control;
...@@ -142,12 +142,12 @@ static int dio48e_gpio_direction_output(struct gpio_chip *chip, unsigned int off ...@@ -142,12 +142,12 @@ static int dio48e_gpio_direction_output(struct gpio_chip *chip, unsigned int off
dio48egpio->out_state[io_port] &= ~mask; dio48egpio->out_state[io_port] &= ~mask;
control = BIT(7) | dio48egpio->control[control_port]; control = BIT(7) | dio48egpio->control[control_port];
outb(control, control_addr); iowrite8(control, control_addr);
outb(dio48egpio->out_state[io_port], dio48egpio->base + out_port); iowrite8(dio48egpio->out_state[io_port], dio48egpio->base + out_port);
control &= ~BIT(7); control &= ~BIT(7);
outb(control, control_addr); iowrite8(control, control_addr);
raw_spin_unlock_irqrestore(&dio48egpio->lock, flags); raw_spin_unlock_irqrestore(&dio48egpio->lock, flags);
...@@ -171,7 +171,7 @@ static int dio48e_gpio_get(struct gpio_chip *chip, unsigned int offset) ...@@ -171,7 +171,7 @@ static int dio48e_gpio_get(struct gpio_chip *chip, unsigned int offset)
return -EINVAL; return -EINVAL;
} }
port_state = inb(dio48egpio->base + in_port); port_state = ioread8(dio48egpio->base + in_port);
raw_spin_unlock_irqrestore(&dio48egpio->lock, flags); raw_spin_unlock_irqrestore(&dio48egpio->lock, flags);
...@@ -186,7 +186,7 @@ static int dio48e_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, ...@@ -186,7 +186,7 @@ static int dio48e_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
struct dio48e_gpio *const dio48egpio = gpiochip_get_data(chip); struct dio48e_gpio *const dio48egpio = gpiochip_get_data(chip);
unsigned long offset; unsigned long offset;
unsigned long gpio_mask; unsigned long gpio_mask;
unsigned int port_addr; void __iomem *port_addr;
unsigned long port_state; unsigned long port_state;
/* clear bits array to a clean slate */ /* clear bits array to a clean slate */
...@@ -194,7 +194,7 @@ static int dio48e_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, ...@@ -194,7 +194,7 @@ static int dio48e_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) { for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) {
port_addr = dio48egpio->base + ports[offset / 8]; port_addr = dio48egpio->base + ports[offset / 8];
port_state = inb(port_addr) & gpio_mask; port_state = ioread8(port_addr) & gpio_mask;
bitmap_set_value8(bits, port_state, offset); bitmap_set_value8(bits, port_state, offset);
} }
...@@ -217,7 +217,7 @@ static void dio48e_gpio_set(struct gpio_chip *chip, unsigned int offset, int val ...@@ -217,7 +217,7 @@ static void dio48e_gpio_set(struct gpio_chip *chip, unsigned int offset, int val
else else
dio48egpio->out_state[port] &= ~mask; dio48egpio->out_state[port] &= ~mask;
outb(dio48egpio->out_state[port], dio48egpio->base + out_port); iowrite8(dio48egpio->out_state[port], dio48egpio->base + out_port);
raw_spin_unlock_irqrestore(&dio48egpio->lock, flags); raw_spin_unlock_irqrestore(&dio48egpio->lock, flags);
} }
...@@ -229,7 +229,7 @@ static void dio48e_gpio_set_multiple(struct gpio_chip *chip, ...@@ -229,7 +229,7 @@ static void dio48e_gpio_set_multiple(struct gpio_chip *chip,
unsigned long offset; unsigned long offset;
unsigned long gpio_mask; unsigned long gpio_mask;
size_t index; size_t index;
unsigned int port_addr; void __iomem *port_addr;
unsigned long bitmask; unsigned long bitmask;
unsigned long flags; unsigned long flags;
...@@ -244,7 +244,7 @@ static void dio48e_gpio_set_multiple(struct gpio_chip *chip, ...@@ -244,7 +244,7 @@ static void dio48e_gpio_set_multiple(struct gpio_chip *chip,
/* update output state data and set device gpio register */ /* update output state data and set device gpio register */
dio48egpio->out_state[index] &= ~gpio_mask; dio48egpio->out_state[index] &= ~gpio_mask;
dio48egpio->out_state[index] |= bitmask; dio48egpio->out_state[index] |= bitmask;
outb(dio48egpio->out_state[index], port_addr); iowrite8(dio48egpio->out_state[index], port_addr);
raw_spin_unlock_irqrestore(&dio48egpio->lock, flags); raw_spin_unlock_irqrestore(&dio48egpio->lock, flags);
} }
...@@ -274,7 +274,7 @@ static void dio48e_irq_mask(struct irq_data *data) ...@@ -274,7 +274,7 @@ static void dio48e_irq_mask(struct irq_data *data)
if (!dio48egpio->irq_mask) if (!dio48egpio->irq_mask)
/* disable interrupts */ /* disable interrupts */
inb(dio48egpio->base + 0xB); ioread8(dio48egpio->base + 0xB);
raw_spin_unlock_irqrestore(&dio48egpio->lock, flags); raw_spin_unlock_irqrestore(&dio48egpio->lock, flags);
} }
...@@ -294,8 +294,8 @@ static void dio48e_irq_unmask(struct irq_data *data) ...@@ -294,8 +294,8 @@ static void dio48e_irq_unmask(struct irq_data *data)
if (!dio48egpio->irq_mask) { if (!dio48egpio->irq_mask) {
/* enable interrupts */ /* enable interrupts */
outb(0x00, dio48egpio->base + 0xF); iowrite8(0x00, dio48egpio->base + 0xF);
outb(0x00, dio48egpio->base + 0xB); iowrite8(0x00, dio48egpio->base + 0xB);
} }
if (offset == 19) if (offset == 19)
...@@ -341,7 +341,7 @@ static irqreturn_t dio48e_irq_handler(int irq, void *dev_id) ...@@ -341,7 +341,7 @@ static irqreturn_t dio48e_irq_handler(int irq, void *dev_id)
raw_spin_lock(&dio48egpio->lock); raw_spin_lock(&dio48egpio->lock);
outb(0x00, dio48egpio->base + 0xF); iowrite8(0x00, dio48egpio->base + 0xF);
raw_spin_unlock(&dio48egpio->lock); raw_spin_unlock(&dio48egpio->lock);
...@@ -373,7 +373,7 @@ static int dio48e_irq_init_hw(struct gpio_chip *gc) ...@@ -373,7 +373,7 @@ static int dio48e_irq_init_hw(struct gpio_chip *gc)
struct dio48e_gpio *const dio48egpio = gpiochip_get_data(gc); struct dio48e_gpio *const dio48egpio = gpiochip_get_data(gc);
/* Disable IRQ by default */ /* Disable IRQ by default */
inb(dio48egpio->base + 0xB); ioread8(dio48egpio->base + 0xB);
return 0; return 0;
} }
...@@ -395,6 +395,10 @@ static int dio48e_probe(struct device *dev, unsigned int id) ...@@ -395,6 +395,10 @@ static int dio48e_probe(struct device *dev, unsigned int id)
return -EBUSY; return -EBUSY;
} }
dio48egpio->base = devm_ioport_map(dev, base[id], DIO48E_EXTENT);
if (!dio48egpio->base)
return -ENOMEM;
dio48egpio->chip.label = name; dio48egpio->chip.label = name;
dio48egpio->chip.parent = dev; dio48egpio->chip.parent = dev;
dio48egpio->chip.owner = THIS_MODULE; dio48egpio->chip.owner = THIS_MODULE;
...@@ -408,7 +412,6 @@ static int dio48e_probe(struct device *dev, unsigned int id) ...@@ -408,7 +412,6 @@ static int dio48e_probe(struct device *dev, unsigned int id)
dio48egpio->chip.get_multiple = dio48e_gpio_get_multiple; dio48egpio->chip.get_multiple = dio48e_gpio_get_multiple;
dio48egpio->chip.set = dio48e_gpio_set; dio48egpio->chip.set = dio48e_gpio_set;
dio48egpio->chip.set_multiple = dio48e_gpio_set_multiple; dio48egpio->chip.set_multiple = dio48e_gpio_set_multiple;
dio48egpio->base = base[id];
girq = &dio48egpio->chip.irq; girq = &dio48egpio->chip.irq;
girq->chip = &dio48e_irqchip; girq->chip = &dio48e_irqchip;
...@@ -423,16 +426,16 @@ static int dio48e_probe(struct device *dev, unsigned int id) ...@@ -423,16 +426,16 @@ static int dio48e_probe(struct device *dev, unsigned int id)
raw_spin_lock_init(&dio48egpio->lock); raw_spin_lock_init(&dio48egpio->lock);
/* initialize all GPIO as output */ /* initialize all GPIO as output */
outb(0x80, base[id] + 3); iowrite8(0x80, dio48egpio->base + 3);
outb(0x00, base[id]); iowrite8(0x00, dio48egpio->base);
outb(0x00, base[id] + 1); iowrite8(0x00, dio48egpio->base + 1);
outb(0x00, base[id] + 2); iowrite8(0x00, dio48egpio->base + 2);
outb(0x00, base[id] + 3); iowrite8(0x00, dio48egpio->base + 3);
outb(0x80, base[id] + 7); iowrite8(0x80, dio48egpio->base + 7);
outb(0x00, base[id] + 4); iowrite8(0x00, dio48egpio->base + 4);
outb(0x00, base[id] + 5); iowrite8(0x00, dio48egpio->base + 5);
outb(0x00, base[id] + 6); iowrite8(0x00, dio48egpio->base + 6);
outb(0x00, base[id] + 7); iowrite8(0x00, dio48egpio->base + 7);
err = devm_gpiochip_add_data(dev, &dio48egpio->chip, dio48egpio); err = devm_gpiochip_add_data(dev, &dio48egpio->chip, dio48egpio);
if (err) { if (err) {
......
...@@ -47,7 +47,7 @@ struct idi_48_gpio { ...@@ -47,7 +47,7 @@ struct idi_48_gpio {
raw_spinlock_t lock; raw_spinlock_t lock;
spinlock_t ack_lock; spinlock_t ack_lock;
unsigned char irq_mask[6]; unsigned char irq_mask[6];
unsigned base; void __iomem *base;
unsigned char cos_enb; unsigned char cos_enb;
}; };
...@@ -66,15 +66,15 @@ static int idi_48_gpio_get(struct gpio_chip *chip, unsigned offset) ...@@ -66,15 +66,15 @@ static int idi_48_gpio_get(struct gpio_chip *chip, unsigned offset)
struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip); struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip);
unsigned i; unsigned i;
static const unsigned int register_offset[6] = { 0, 1, 2, 4, 5, 6 }; static const unsigned int register_offset[6] = { 0, 1, 2, 4, 5, 6 };
unsigned base_offset; void __iomem *port_addr;
unsigned mask; unsigned mask;
for (i = 0; i < 48; i += 8) for (i = 0; i < 48; i += 8)
if (offset < i + 8) { if (offset < i + 8) {
base_offset = register_offset[i / 8]; port_addr = idi48gpio->base + register_offset[i / 8];
mask = BIT(offset - i); mask = BIT(offset - i);
return !!(inb(idi48gpio->base + base_offset) & mask); return !!(ioread8(port_addr) & mask);
} }
/* The following line should never execute since offset < 48 */ /* The following line should never execute since offset < 48 */
...@@ -88,7 +88,7 @@ static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, ...@@ -88,7 +88,7 @@ static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
unsigned long offset; unsigned long offset;
unsigned long gpio_mask; unsigned long gpio_mask;
static const size_t ports[] = { 0, 1, 2, 4, 5, 6 }; static const size_t ports[] = { 0, 1, 2, 4, 5, 6 };
unsigned int port_addr; void __iomem *port_addr;
unsigned long port_state; unsigned long port_state;
/* clear bits array to a clean slate */ /* clear bits array to a clean slate */
...@@ -96,7 +96,7 @@ static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, ...@@ -96,7 +96,7 @@ static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) { for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) {
port_addr = idi48gpio->base + ports[offset / 8]; port_addr = idi48gpio->base + ports[offset / 8];
port_state = inb(port_addr) & gpio_mask; port_state = ioread8(port_addr) & gpio_mask;
bitmap_set_value8(bits, port_state, offset); bitmap_set_value8(bits, port_state, offset);
} }
...@@ -130,7 +130,7 @@ static void idi_48_irq_mask(struct irq_data *data) ...@@ -130,7 +130,7 @@ static void idi_48_irq_mask(struct irq_data *data)
raw_spin_lock_irqsave(&idi48gpio->lock, flags); raw_spin_lock_irqsave(&idi48gpio->lock, flags);
outb(idi48gpio->cos_enb, idi48gpio->base + 7); iowrite8(idi48gpio->cos_enb, idi48gpio->base + 7);
raw_spin_unlock_irqrestore(&idi48gpio->lock, flags); raw_spin_unlock_irqrestore(&idi48gpio->lock, flags);
} }
...@@ -163,7 +163,7 @@ static void idi_48_irq_unmask(struct irq_data *data) ...@@ -163,7 +163,7 @@ static void idi_48_irq_unmask(struct irq_data *data)
raw_spin_lock_irqsave(&idi48gpio->lock, flags); raw_spin_lock_irqsave(&idi48gpio->lock, flags);
outb(idi48gpio->cos_enb, idi48gpio->base + 7); iowrite8(idi48gpio->cos_enb, idi48gpio->base + 7);
raw_spin_unlock_irqrestore(&idi48gpio->lock, flags); raw_spin_unlock_irqrestore(&idi48gpio->lock, flags);
} }
...@@ -204,7 +204,7 @@ static irqreturn_t idi_48_irq_handler(int irq, void *dev_id) ...@@ -204,7 +204,7 @@ static irqreturn_t idi_48_irq_handler(int irq, void *dev_id)
raw_spin_lock(&idi48gpio->lock); raw_spin_lock(&idi48gpio->lock);
cos_status = inb(idi48gpio->base + 7); cos_status = ioread8(idi48gpio->base + 7);
raw_spin_unlock(&idi48gpio->lock); raw_spin_unlock(&idi48gpio->lock);
...@@ -250,8 +250,8 @@ static int idi_48_irq_init_hw(struct gpio_chip *gc) ...@@ -250,8 +250,8 @@ static int idi_48_irq_init_hw(struct gpio_chip *gc)
struct idi_48_gpio *const idi48gpio = gpiochip_get_data(gc); struct idi_48_gpio *const idi48gpio = gpiochip_get_data(gc);
/* Disable IRQ by default */ /* Disable IRQ by default */
outb(0, idi48gpio->base + 7); iowrite8(0, idi48gpio->base + 7);
inb(idi48gpio->base + 7); ioread8(idi48gpio->base + 7);
return 0; return 0;
} }
...@@ -273,6 +273,10 @@ static int idi_48_probe(struct device *dev, unsigned int id) ...@@ -273,6 +273,10 @@ static int idi_48_probe(struct device *dev, unsigned int id)
return -EBUSY; return -EBUSY;
} }
idi48gpio->base = devm_ioport_map(dev, base[id], IDI_48_EXTENT);
if (!idi48gpio->base)
return -ENOMEM;
idi48gpio->chip.label = name; idi48gpio->chip.label = name;
idi48gpio->chip.parent = dev; idi48gpio->chip.parent = dev;
idi48gpio->chip.owner = THIS_MODULE; idi48gpio->chip.owner = THIS_MODULE;
...@@ -283,7 +287,6 @@ static int idi_48_probe(struct device *dev, unsigned int id) ...@@ -283,7 +287,6 @@ static int idi_48_probe(struct device *dev, unsigned int id)
idi48gpio->chip.direction_input = idi_48_gpio_direction_input; idi48gpio->chip.direction_input = idi_48_gpio_direction_input;
idi48gpio->chip.get = idi_48_gpio_get; idi48gpio->chip.get = idi_48_gpio_get;
idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple; idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple;
idi48gpio->base = base[id];
girq = &idi48gpio->chip.irq; girq = &idi48gpio->chip.irq;
girq->chip = &idi_48_irqchip; girq->chip = &idi_48_irqchip;
......
...@@ -44,7 +44,7 @@ struct idio_16_gpio { ...@@ -44,7 +44,7 @@ struct idio_16_gpio {
struct gpio_chip chip; struct gpio_chip chip;
raw_spinlock_t lock; raw_spinlock_t lock;
unsigned long irq_mask; unsigned long irq_mask;
unsigned int base; void __iomem *base;
unsigned int out_state; unsigned int out_state;
}; };
...@@ -79,9 +79,9 @@ static int idio_16_gpio_get(struct gpio_chip *chip, unsigned int offset) ...@@ -79,9 +79,9 @@ static int idio_16_gpio_get(struct gpio_chip *chip, unsigned int offset)
return -EINVAL; return -EINVAL;
if (offset < 24) if (offset < 24)
return !!(inb(idio16gpio->base + 1) & mask); return !!(ioread8(idio16gpio->base + 1) & mask);
return !!(inb(idio16gpio->base + 5) & (mask>>8)); return !!(ioread8(idio16gpio->base + 5) & (mask>>8));
} }
static int idio_16_gpio_get_multiple(struct gpio_chip *chip, static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
...@@ -91,9 +91,9 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip, ...@@ -91,9 +91,9 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
*bits = 0; *bits = 0;
if (*mask & GENMASK(23, 16)) if (*mask & GENMASK(23, 16))
*bits |= (unsigned long)inb(idio16gpio->base + 1) << 16; *bits |= (unsigned long)ioread8(idio16gpio->base + 1) << 16;
if (*mask & GENMASK(31, 24)) if (*mask & GENMASK(31, 24))
*bits |= (unsigned long)inb(idio16gpio->base + 5) << 24; *bits |= (unsigned long)ioread8(idio16gpio->base + 5) << 24;
return 0; return 0;
} }
...@@ -116,9 +116,9 @@ static void idio_16_gpio_set(struct gpio_chip *chip, unsigned int offset, ...@@ -116,9 +116,9 @@ static void idio_16_gpio_set(struct gpio_chip *chip, unsigned int offset,
idio16gpio->out_state &= ~mask; idio16gpio->out_state &= ~mask;
if (offset > 7) if (offset > 7)
outb(idio16gpio->out_state >> 8, idio16gpio->base + 4); iowrite8(idio16gpio->out_state >> 8, idio16gpio->base + 4);
else else
outb(idio16gpio->out_state, idio16gpio->base); iowrite8(idio16gpio->out_state, idio16gpio->base);
raw_spin_unlock_irqrestore(&idio16gpio->lock, flags); raw_spin_unlock_irqrestore(&idio16gpio->lock, flags);
} }
...@@ -135,9 +135,9 @@ static void idio_16_gpio_set_multiple(struct gpio_chip *chip, ...@@ -135,9 +135,9 @@ static void idio_16_gpio_set_multiple(struct gpio_chip *chip,
idio16gpio->out_state |= *mask & *bits; idio16gpio->out_state |= *mask & *bits;
if (*mask & 0xFF) if (*mask & 0xFF)
outb(idio16gpio->out_state, idio16gpio->base); iowrite8(idio16gpio->out_state, idio16gpio->base);
if ((*mask >> 8) & 0xFF) if ((*mask >> 8) & 0xFF)
outb(idio16gpio->out_state >> 8, idio16gpio->base + 4); iowrite8(idio16gpio->out_state >> 8, idio16gpio->base + 4);
raw_spin_unlock_irqrestore(&idio16gpio->lock, flags); raw_spin_unlock_irqrestore(&idio16gpio->lock, flags);
} }
...@@ -158,7 +158,7 @@ static void idio_16_irq_mask(struct irq_data *data) ...@@ -158,7 +158,7 @@ static void idio_16_irq_mask(struct irq_data *data)
if (!idio16gpio->irq_mask) { if (!idio16gpio->irq_mask) {
raw_spin_lock_irqsave(&idio16gpio->lock, flags); raw_spin_lock_irqsave(&idio16gpio->lock, flags);
outb(0, idio16gpio->base + 2); iowrite8(0, idio16gpio->base + 2);
raw_spin_unlock_irqrestore(&idio16gpio->lock, flags); raw_spin_unlock_irqrestore(&idio16gpio->lock, flags);
} }
...@@ -177,7 +177,7 @@ static void idio_16_irq_unmask(struct irq_data *data) ...@@ -177,7 +177,7 @@ static void idio_16_irq_unmask(struct irq_data *data)
if (!prev_irq_mask) { if (!prev_irq_mask) {
raw_spin_lock_irqsave(&idio16gpio->lock, flags); raw_spin_lock_irqsave(&idio16gpio->lock, flags);
inb(idio16gpio->base + 2); ioread8(idio16gpio->base + 2);
raw_spin_unlock_irqrestore(&idio16gpio->lock, flags); raw_spin_unlock_irqrestore(&idio16gpio->lock, flags);
} }
...@@ -212,7 +212,7 @@ static irqreturn_t idio_16_irq_handler(int irq, void *dev_id) ...@@ -212,7 +212,7 @@ static irqreturn_t idio_16_irq_handler(int irq, void *dev_id)
raw_spin_lock(&idio16gpio->lock); raw_spin_lock(&idio16gpio->lock);
outb(0, idio16gpio->base + 1); iowrite8(0, idio16gpio->base + 1);
raw_spin_unlock(&idio16gpio->lock); raw_spin_unlock(&idio16gpio->lock);
...@@ -232,8 +232,8 @@ static int idio_16_irq_init_hw(struct gpio_chip *gc) ...@@ -232,8 +232,8 @@ static int idio_16_irq_init_hw(struct gpio_chip *gc)
struct idio_16_gpio *const idio16gpio = gpiochip_get_data(gc); struct idio_16_gpio *const idio16gpio = gpiochip_get_data(gc);
/* Disable IRQ by default */ /* Disable IRQ by default */
outb(0, idio16gpio->base + 2); iowrite8(0, idio16gpio->base + 2);
outb(0, idio16gpio->base + 1); iowrite8(0, idio16gpio->base + 1);
return 0; return 0;
} }
...@@ -255,6 +255,10 @@ static int idio_16_probe(struct device *dev, unsigned int id) ...@@ -255,6 +255,10 @@ static int idio_16_probe(struct device *dev, unsigned int id)
return -EBUSY; return -EBUSY;
} }
idio16gpio->base = devm_ioport_map(dev, base[id], IDIO_16_EXTENT);
if (!idio16gpio->base)
return -ENOMEM;
idio16gpio->chip.label = name; idio16gpio->chip.label = name;
idio16gpio->chip.parent = dev; idio16gpio->chip.parent = dev;
idio16gpio->chip.owner = THIS_MODULE; idio16gpio->chip.owner = THIS_MODULE;
...@@ -268,7 +272,6 @@ static int idio_16_probe(struct device *dev, unsigned int id) ...@@ -268,7 +272,6 @@ static int idio_16_probe(struct device *dev, unsigned int id)
idio16gpio->chip.get_multiple = idio_16_gpio_get_multiple; idio16gpio->chip.get_multiple = idio_16_gpio_get_multiple;
idio16gpio->chip.set = idio_16_gpio_set; idio16gpio->chip.set = idio_16_gpio_set;
idio16gpio->chip.set_multiple = idio_16_gpio_set_multiple; idio16gpio->chip.set_multiple = idio_16_gpio_set_multiple;
idio16gpio->base = base[id];
idio16gpio->out_state = 0xFFFF; idio16gpio->out_state = 0xFFFF;
girq = &idio16gpio->chip.irq; girq = &idio16gpio->chip.irq;
......
...@@ -36,19 +36,19 @@ static int pt_gpio_request(struct gpio_chip *gc, unsigned offset) ...@@ -36,19 +36,19 @@ static int pt_gpio_request(struct gpio_chip *gc, unsigned offset)
dev_dbg(gc->parent, "pt_gpio_request offset=%x\n", offset); dev_dbg(gc->parent, "pt_gpio_request offset=%x\n", offset);
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
using_pins = readl(pt_gpio->reg_base + PT_SYNC_REG); using_pins = readl(pt_gpio->reg_base + PT_SYNC_REG);
if (using_pins & BIT(offset)) { if (using_pins & BIT(offset)) {
dev_warn(gc->parent, "PT GPIO pin %x reconfigured\n", dev_warn(gc->parent, "PT GPIO pin %x reconfigured\n",
offset); offset);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
return -EINVAL; return -EINVAL;
} }
writel(using_pins | BIT(offset), pt_gpio->reg_base + PT_SYNC_REG); writel(using_pins | BIT(offset), pt_gpio->reg_base + PT_SYNC_REG);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
return 0; return 0;
} }
...@@ -59,13 +59,13 @@ static void pt_gpio_free(struct gpio_chip *gc, unsigned offset) ...@@ -59,13 +59,13 @@ static void pt_gpio_free(struct gpio_chip *gc, unsigned offset)
unsigned long flags; unsigned long flags;
u32 using_pins; u32 using_pins;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
using_pins = readl(pt_gpio->reg_base + PT_SYNC_REG); using_pins = readl(pt_gpio->reg_base + PT_SYNC_REG);
using_pins &= ~BIT(offset); using_pins &= ~BIT(offset);
writel(using_pins, pt_gpio->reg_base + PT_SYNC_REG); writel(using_pins, pt_gpio->reg_base + PT_SYNC_REG);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
dev_dbg(gc->parent, "pt_gpio_free offset=%x\n", offset); dev_dbg(gc->parent, "pt_gpio_free offset=%x\n", offset);
} }
......
...@@ -92,9 +92,9 @@ brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank) ...@@ -92,9 +92,9 @@ brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank)
unsigned long status; unsigned long status;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&bank->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&bank->gc.bgpio_lock, flags);
status = __brcmstb_gpio_get_active_irqs(bank); status = __brcmstb_gpio_get_active_irqs(bank);
spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags);
return status; return status;
} }
...@@ -114,14 +114,14 @@ static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank, ...@@ -114,14 +114,14 @@ static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank,
u32 imask; u32 imask;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
imask = gc->read_reg(priv->reg_base + GIO_MASK(bank->id)); imask = gc->read_reg(priv->reg_base + GIO_MASK(bank->id));
if (enable) if (enable)
imask |= mask; imask |= mask;
else else
imask &= ~mask; imask &= ~mask;
gc->write_reg(priv->reg_base + GIO_MASK(bank->id), imask); gc->write_reg(priv->reg_base + GIO_MASK(bank->id), imask);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
} }
static int brcmstb_gpio_to_irq(struct gpio_chip *gc, unsigned offset) static int brcmstb_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
...@@ -204,7 +204,7 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -204,7 +204,7 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
return -EINVAL; return -EINVAL;
} }
spin_lock_irqsave(&bank->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&bank->gc.bgpio_lock, flags);
iedge_config = bank->gc.read_reg(priv->reg_base + iedge_config = bank->gc.read_reg(priv->reg_base +
GIO_EC(bank->id)) & ~mask; GIO_EC(bank->id)) & ~mask;
...@@ -220,7 +220,7 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -220,7 +220,7 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
bank->gc.write_reg(priv->reg_base + GIO_LEVEL(bank->id), bank->gc.write_reg(priv->reg_base + GIO_LEVEL(bank->id),
ilevel | level); ilevel | level);
spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags);
return 0; return 0;
} }
......
...@@ -41,12 +41,12 @@ static int cdns_gpio_request(struct gpio_chip *chip, unsigned int offset) ...@@ -41,12 +41,12 @@ static int cdns_gpio_request(struct gpio_chip *chip, unsigned int offset)
struct cdns_gpio_chip *cgpio = gpiochip_get_data(chip); struct cdns_gpio_chip *cgpio = gpiochip_get_data(chip);
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&chip->bgpio_lock, flags); raw_spin_lock_irqsave(&chip->bgpio_lock, flags);
iowrite32(ioread32(cgpio->regs + CDNS_GPIO_BYPASS_MODE) & ~BIT(offset), iowrite32(ioread32(cgpio->regs + CDNS_GPIO_BYPASS_MODE) & ~BIT(offset),
cgpio->regs + CDNS_GPIO_BYPASS_MODE); cgpio->regs + CDNS_GPIO_BYPASS_MODE);
spin_unlock_irqrestore(&chip->bgpio_lock, flags); raw_spin_unlock_irqrestore(&chip->bgpio_lock, flags);
return 0; return 0;
} }
...@@ -55,13 +55,13 @@ static void cdns_gpio_free(struct gpio_chip *chip, unsigned int offset) ...@@ -55,13 +55,13 @@ static void cdns_gpio_free(struct gpio_chip *chip, unsigned int offset)
struct cdns_gpio_chip *cgpio = gpiochip_get_data(chip); struct cdns_gpio_chip *cgpio = gpiochip_get_data(chip);
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&chip->bgpio_lock, flags); raw_spin_lock_irqsave(&chip->bgpio_lock, flags);
iowrite32(ioread32(cgpio->regs + CDNS_GPIO_BYPASS_MODE) | iowrite32(ioread32(cgpio->regs + CDNS_GPIO_BYPASS_MODE) |
(BIT(offset) & cgpio->bypass_orig), (BIT(offset) & cgpio->bypass_orig),
cgpio->regs + CDNS_GPIO_BYPASS_MODE); cgpio->regs + CDNS_GPIO_BYPASS_MODE);
spin_unlock_irqrestore(&chip->bgpio_lock, flags); raw_spin_unlock_irqrestore(&chip->bgpio_lock, flags);
} }
static void cdns_gpio_irq_mask(struct irq_data *d) static void cdns_gpio_irq_mask(struct irq_data *d)
...@@ -90,7 +90,7 @@ static int cdns_gpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -90,7 +90,7 @@ static int cdns_gpio_irq_set_type(struct irq_data *d, unsigned int type)
u32 mask = BIT(d->hwirq); u32 mask = BIT(d->hwirq);
int ret = 0; int ret = 0;
spin_lock_irqsave(&chip->bgpio_lock, flags); raw_spin_lock_irqsave(&chip->bgpio_lock, flags);
int_value = ioread32(cgpio->regs + CDNS_GPIO_IRQ_VALUE) & ~mask; int_value = ioread32(cgpio->regs + CDNS_GPIO_IRQ_VALUE) & ~mask;
int_type = ioread32(cgpio->regs + CDNS_GPIO_IRQ_TYPE) & ~mask; int_type = ioread32(cgpio->regs + CDNS_GPIO_IRQ_TYPE) & ~mask;
...@@ -115,7 +115,7 @@ static int cdns_gpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -115,7 +115,7 @@ static int cdns_gpio_irq_set_type(struct irq_data *d, unsigned int type)
iowrite32(int_type, cgpio->regs + CDNS_GPIO_IRQ_TYPE); iowrite32(int_type, cgpio->regs + CDNS_GPIO_IRQ_TYPE);
err_irq_type: err_irq_type:
spin_unlock_irqrestore(&chip->bgpio_lock, flags); raw_spin_unlock_irqrestore(&chip->bgpio_lock, flags);
return ret; return ret;
} }
......
...@@ -95,7 +95,6 @@ struct dwapb_context { ...@@ -95,7 +95,6 @@ struct dwapb_context {
#endif #endif
struct dwapb_gpio_port_irqchip { struct dwapb_gpio_port_irqchip {
struct irq_chip irqchip;
unsigned int nr_irqs; unsigned int nr_irqs;
unsigned int irq[DWAPB_MAX_GPIOS]; unsigned int irq[DWAPB_MAX_GPIOS];
}; };
...@@ -243,35 +242,41 @@ static void dwapb_irq_ack(struct irq_data *d) ...@@ -243,35 +242,41 @@ static void dwapb_irq_ack(struct irq_data *d)
u32 val = BIT(irqd_to_hwirq(d)); u32 val = BIT(irqd_to_hwirq(d));
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
dwapb_write(gpio, GPIO_PORTA_EOI, val); dwapb_write(gpio, GPIO_PORTA_EOI, val);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
} }
static void dwapb_irq_mask(struct irq_data *d) static void dwapb_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 dwapb_gpio *gpio = to_dwapb_gpio(gc); struct dwapb_gpio *gpio = to_dwapb_gpio(gc);
irq_hw_number_t hwirq = irqd_to_hwirq(d);
unsigned long flags; unsigned long flags;
u32 val; u32 val;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
val = dwapb_read(gpio, GPIO_INTMASK) | BIT(irqd_to_hwirq(d)); val = dwapb_read(gpio, GPIO_INTMASK) | BIT(hwirq);
dwapb_write(gpio, GPIO_INTMASK, val); dwapb_write(gpio, GPIO_INTMASK, val);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
gpiochip_disable_irq(gc, hwirq);
} }
static void dwapb_irq_unmask(struct irq_data *d) static void dwapb_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 dwapb_gpio *gpio = to_dwapb_gpio(gc); struct dwapb_gpio *gpio = to_dwapb_gpio(gc);
irq_hw_number_t hwirq = irqd_to_hwirq(d);
unsigned long flags; unsigned long flags;
u32 val; u32 val;
spin_lock_irqsave(&gc->bgpio_lock, flags); gpiochip_enable_irq(gc, hwirq);
val = dwapb_read(gpio, GPIO_INTMASK) & ~BIT(irqd_to_hwirq(d));
raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
val = dwapb_read(gpio, GPIO_INTMASK) & ~BIT(hwirq);
dwapb_write(gpio, GPIO_INTMASK, val); dwapb_write(gpio, GPIO_INTMASK, val);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
} }
static void dwapb_irq_enable(struct irq_data *d) static void dwapb_irq_enable(struct irq_data *d)
...@@ -281,11 +286,11 @@ static void dwapb_irq_enable(struct irq_data *d) ...@@ -281,11 +286,11 @@ static void dwapb_irq_enable(struct irq_data *d)
unsigned long flags; unsigned long flags;
u32 val; u32 val;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
val = dwapb_read(gpio, GPIO_INTEN); val = dwapb_read(gpio, GPIO_INTEN);
val |= BIT(irqd_to_hwirq(d)); val |= BIT(irqd_to_hwirq(d));
dwapb_write(gpio, GPIO_INTEN, val); dwapb_write(gpio, GPIO_INTEN, val);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
} }
static void dwapb_irq_disable(struct irq_data *d) static void dwapb_irq_disable(struct irq_data *d)
...@@ -295,11 +300,11 @@ static void dwapb_irq_disable(struct irq_data *d) ...@@ -295,11 +300,11 @@ static void dwapb_irq_disable(struct irq_data *d)
unsigned long flags; unsigned long flags;
u32 val; u32 val;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
val = dwapb_read(gpio, GPIO_INTEN); val = dwapb_read(gpio, GPIO_INTEN);
val &= ~BIT(irqd_to_hwirq(d)); val &= ~BIT(irqd_to_hwirq(d));
dwapb_write(gpio, GPIO_INTEN, val); dwapb_write(gpio, GPIO_INTEN, val);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
} }
static int dwapb_irq_set_type(struct irq_data *d, u32 type) static int dwapb_irq_set_type(struct irq_data *d, u32 type)
...@@ -309,7 +314,7 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type) ...@@ -309,7 +314,7 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type)
irq_hw_number_t bit = irqd_to_hwirq(d); irq_hw_number_t bit = irqd_to_hwirq(d);
unsigned long level, polarity, flags; unsigned long level, polarity, flags;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
level = dwapb_read(gpio, GPIO_INTTYPE_LEVEL); level = dwapb_read(gpio, GPIO_INTTYPE_LEVEL);
polarity = dwapb_read(gpio, GPIO_INT_POLARITY); polarity = dwapb_read(gpio, GPIO_INT_POLARITY);
...@@ -344,7 +349,7 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type) ...@@ -344,7 +349,7 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type)
dwapb_write(gpio, GPIO_INTTYPE_LEVEL, level); dwapb_write(gpio, GPIO_INTTYPE_LEVEL, level);
if (type != IRQ_TYPE_EDGE_BOTH) if (type != IRQ_TYPE_EDGE_BOTH)
dwapb_write(gpio, GPIO_INT_POLARITY, polarity); dwapb_write(gpio, GPIO_INT_POLARITY, polarity);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
return 0; return 0;
} }
...@@ -364,8 +369,23 @@ static int dwapb_irq_set_wake(struct irq_data *d, unsigned int enable) ...@@ -364,8 +369,23 @@ static int dwapb_irq_set_wake(struct irq_data *d, unsigned int enable)
return 0; return 0;
} }
#else
#define dwapb_irq_set_wake NULL
#endif #endif
static const struct irq_chip dwapb_irq_chip = {
.name = DWAPB_DRIVER_NAME,
.irq_ack = dwapb_irq_ack,
.irq_mask = dwapb_irq_mask,
.irq_unmask = dwapb_irq_unmask,
.irq_set_type = dwapb_irq_set_type,
.irq_enable = dwapb_irq_enable,
.irq_disable = dwapb_irq_disable,
.irq_set_wake = dwapb_irq_set_wake,
.flags = IRQCHIP_IMMUTABLE,
GPIOCHIP_IRQ_RESOURCE_HELPERS,
};
static int dwapb_gpio_set_debounce(struct gpio_chip *gc, static int dwapb_gpio_set_debounce(struct gpio_chip *gc,
unsigned offset, unsigned debounce) unsigned offset, unsigned debounce)
{ {
...@@ -374,7 +394,7 @@ static int dwapb_gpio_set_debounce(struct gpio_chip *gc, ...@@ -374,7 +394,7 @@ static int dwapb_gpio_set_debounce(struct gpio_chip *gc,
unsigned long flags, val_deb; unsigned long flags, val_deb;
unsigned long mask = BIT(offset); unsigned long mask = BIT(offset);
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
val_deb = dwapb_read(gpio, GPIO_PORTA_DEBOUNCE); val_deb = dwapb_read(gpio, GPIO_PORTA_DEBOUNCE);
if (debounce) if (debounce)
...@@ -383,7 +403,7 @@ static int dwapb_gpio_set_debounce(struct gpio_chip *gc, ...@@ -383,7 +403,7 @@ static int dwapb_gpio_set_debounce(struct gpio_chip *gc,
val_deb &= ~mask; val_deb &= ~mask;
dwapb_write(gpio, GPIO_PORTA_DEBOUNCE, val_deb); dwapb_write(gpio, GPIO_PORTA_DEBOUNCE, val_deb);
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
return 0; return 0;
} }
...@@ -439,16 +459,6 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, ...@@ -439,16 +459,6 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
girq->default_type = IRQ_TYPE_NONE; girq->default_type = IRQ_TYPE_NONE;
port->pirq = pirq; port->pirq = pirq;
pirq->irqchip.name = DWAPB_DRIVER_NAME;
pirq->irqchip.irq_ack = dwapb_irq_ack;
pirq->irqchip.irq_mask = dwapb_irq_mask;
pirq->irqchip.irq_unmask = dwapb_irq_unmask;
pirq->irqchip.irq_set_type = dwapb_irq_set_type;
pirq->irqchip.irq_enable = dwapb_irq_enable;
pirq->irqchip.irq_disable = dwapb_irq_disable;
#ifdef CONFIG_PM_SLEEP
pirq->irqchip.irq_set_wake = dwapb_irq_set_wake;
#endif
/* /*
* Intel ACPI-based platforms mostly have the DesignWare APB GPIO * Intel ACPI-based platforms mostly have the DesignWare APB GPIO
...@@ -475,7 +485,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, ...@@ -475,7 +485,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
girq->parent_handler = dwapb_irq_handler; girq->parent_handler = dwapb_irq_handler;
} }
girq->chip = &pirq->irqchip; gpio_irq_chip_set_chip(girq, &dwapb_irq_chip);
return; return;
...@@ -738,7 +748,7 @@ static int dwapb_gpio_suspend(struct device *dev) ...@@ -738,7 +748,7 @@ static int dwapb_gpio_suspend(struct device *dev)
unsigned long flags; unsigned long flags;
int i; int i;
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
for (i = 0; i < gpio->nr_ports; i++) { for (i = 0; i < gpio->nr_ports; i++) {
unsigned int offset; unsigned int offset;
unsigned int idx = gpio->ports[i].idx; unsigned int idx = gpio->ports[i].idx;
...@@ -765,7 +775,7 @@ static int dwapb_gpio_suspend(struct device *dev) ...@@ -765,7 +775,7 @@ static int dwapb_gpio_suspend(struct device *dev)
dwapb_write(gpio, GPIO_INTMASK, ~ctx->wake_en); dwapb_write(gpio, GPIO_INTMASK, ~ctx->wake_en);
} }
} }
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
clk_bulk_disable_unprepare(DWAPB_NR_CLOCKS, gpio->clks); clk_bulk_disable_unprepare(DWAPB_NR_CLOCKS, gpio->clks);
...@@ -785,7 +795,7 @@ static int dwapb_gpio_resume(struct device *dev) ...@@ -785,7 +795,7 @@ static int dwapb_gpio_resume(struct device *dev)
return err; return err;
} }
spin_lock_irqsave(&gc->bgpio_lock, flags); raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
for (i = 0; i < gpio->nr_ports; i++) { for (i = 0; i < gpio->nr_ports; i++) {
unsigned int offset; unsigned int offset;
unsigned int idx = gpio->ports[i].idx; unsigned int idx = gpio->ports[i].idx;
...@@ -812,7 +822,7 @@ static int dwapb_gpio_resume(struct device *dev) ...@@ -812,7 +822,7 @@ static int dwapb_gpio_resume(struct device *dev)
dwapb_write(gpio, GPIO_PORTA_EOI, 0xffffffff); dwapb_write(gpio, GPIO_PORTA_EOI, 0xffffffff);
} }
} }
spin_unlock_irqrestore(&gc->bgpio_lock, flags); raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
return 0; return 0;
} }
......
...@@ -315,8 +315,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev) ...@@ -315,8 +315,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev)
return 0; return 0;
dis_clk: dis_clk:
if (!IS_ERR(g->clk)) clk_disable_unprepare(g->clk);
clk_disable_unprepare(g->clk);
return ret; return ret;
} }
...@@ -324,8 +324,8 @@ static int ftgpio_gpio_remove(struct platform_device *pdev) ...@@ -324,8 +324,8 @@ static int ftgpio_gpio_remove(struct platform_device *pdev)
{ {
struct ftgpio_gpio *g = platform_get_drvdata(pdev); struct ftgpio_gpio *g = platform_get_drvdata(pdev);
if (!IS_ERR(g->clk)) clk_disable_unprepare(g->clk);
clk_disable_unprepare(g->clk);
return 0; return 0;
} }
......
...@@ -42,7 +42,7 @@ struct gpiomm_gpio { ...@@ -42,7 +42,7 @@ struct gpiomm_gpio {
unsigned char out_state[6]; unsigned char out_state[6];
unsigned char control[2]; unsigned char control[2];
spinlock_t lock; spinlock_t lock;
unsigned int base; void __iomem *base;
}; };
static int gpiomm_gpio_get_direction(struct gpio_chip *chip, static int gpiomm_gpio_get_direction(struct gpio_chip *chip,
...@@ -64,7 +64,6 @@ static int gpiomm_gpio_direction_input(struct gpio_chip *chip, ...@@ -64,7 +64,6 @@ static int gpiomm_gpio_direction_input(struct gpio_chip *chip,
struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip);
const unsigned int io_port = offset / 8; const unsigned int io_port = offset / 8;
const unsigned int control_port = io_port / 3; const unsigned int control_port = io_port / 3;
const unsigned int control_addr = gpiommgpio->base + 3 + control_port*4;
unsigned long flags; unsigned long flags;
unsigned int control; unsigned int control;
...@@ -89,7 +88,7 @@ static int gpiomm_gpio_direction_input(struct gpio_chip *chip, ...@@ -89,7 +88,7 @@ static int gpiomm_gpio_direction_input(struct gpio_chip *chip,
} }
control = BIT(7) | gpiommgpio->control[control_port]; control = BIT(7) | gpiommgpio->control[control_port];
outb(control, control_addr); iowrite8(control, gpiommgpio->base + 3 + control_port*4);
spin_unlock_irqrestore(&gpiommgpio->lock, flags); spin_unlock_irqrestore(&gpiommgpio->lock, flags);
...@@ -103,7 +102,6 @@ static int gpiomm_gpio_direction_output(struct gpio_chip *chip, ...@@ -103,7 +102,6 @@ static int gpiomm_gpio_direction_output(struct gpio_chip *chip,
const unsigned int io_port = offset / 8; const unsigned int io_port = offset / 8;
const unsigned int control_port = io_port / 3; const unsigned int control_port = io_port / 3;
const unsigned int mask = BIT(offset % 8); const unsigned int mask = BIT(offset % 8);
const unsigned int control_addr = gpiommgpio->base + 3 + control_port*4;
const unsigned int out_port = (io_port > 2) ? io_port + 1 : io_port; const unsigned int out_port = (io_port > 2) ? io_port + 1 : io_port;
unsigned long flags; unsigned long flags;
unsigned int control; unsigned int control;
...@@ -134,9 +132,9 @@ static int gpiomm_gpio_direction_output(struct gpio_chip *chip, ...@@ -134,9 +132,9 @@ static int gpiomm_gpio_direction_output(struct gpio_chip *chip,
gpiommgpio->out_state[io_port] &= ~mask; gpiommgpio->out_state[io_port] &= ~mask;
control = BIT(7) | gpiommgpio->control[control_port]; control = BIT(7) | gpiommgpio->control[control_port];
outb(control, control_addr); iowrite8(control, gpiommgpio->base + 3 + control_port*4);
outb(gpiommgpio->out_state[io_port], gpiommgpio->base + out_port); iowrite8(gpiommgpio->out_state[io_port], gpiommgpio->base + out_port);
spin_unlock_irqrestore(&gpiommgpio->lock, flags); spin_unlock_irqrestore(&gpiommgpio->lock, flags);
...@@ -160,7 +158,7 @@ static int gpiomm_gpio_get(struct gpio_chip *chip, unsigned int offset) ...@@ -160,7 +158,7 @@ static int gpiomm_gpio_get(struct gpio_chip *chip, unsigned int offset)
return -EINVAL; return -EINVAL;
} }
port_state = inb(gpiommgpio->base + in_port); port_state = ioread8(gpiommgpio->base + in_port);
spin_unlock_irqrestore(&gpiommgpio->lock, flags); spin_unlock_irqrestore(&gpiommgpio->lock, flags);
...@@ -175,7 +173,7 @@ static int gpiomm_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, ...@@ -175,7 +173,7 @@ static int gpiomm_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip);
unsigned long offset; unsigned long offset;
unsigned long gpio_mask; unsigned long gpio_mask;
unsigned int port_addr; void __iomem *port_addr;
unsigned long port_state; unsigned long port_state;
/* clear bits array to a clean slate */ /* clear bits array to a clean slate */
...@@ -183,7 +181,7 @@ static int gpiomm_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, ...@@ -183,7 +181,7 @@ static int gpiomm_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) { for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) {
port_addr = gpiommgpio->base + ports[offset / 8]; port_addr = gpiommgpio->base + ports[offset / 8];
port_state = inb(port_addr) & gpio_mask; port_state = ioread8(port_addr) & gpio_mask;
bitmap_set_value8(bits, port_state, offset); bitmap_set_value8(bits, port_state, offset);
} }
...@@ -207,7 +205,7 @@ static void gpiomm_gpio_set(struct gpio_chip *chip, unsigned int offset, ...@@ -207,7 +205,7 @@ static void gpiomm_gpio_set(struct gpio_chip *chip, unsigned int offset,
else else
gpiommgpio->out_state[port] &= ~mask; gpiommgpio->out_state[port] &= ~mask;
outb(gpiommgpio->out_state[port], gpiommgpio->base + out_port); iowrite8(gpiommgpio->out_state[port], gpiommgpio->base + out_port);
spin_unlock_irqrestore(&gpiommgpio->lock, flags); spin_unlock_irqrestore(&gpiommgpio->lock, flags);
} }
...@@ -219,7 +217,7 @@ static void gpiomm_gpio_set_multiple(struct gpio_chip *chip, ...@@ -219,7 +217,7 @@ static void gpiomm_gpio_set_multiple(struct gpio_chip *chip,
unsigned long offset; unsigned long offset;
unsigned long gpio_mask; unsigned long gpio_mask;
size_t index; size_t index;
unsigned int port_addr; void __iomem *port_addr;
unsigned long bitmask; unsigned long bitmask;
unsigned long flags; unsigned long flags;
...@@ -234,7 +232,7 @@ static void gpiomm_gpio_set_multiple(struct gpio_chip *chip, ...@@ -234,7 +232,7 @@ static void gpiomm_gpio_set_multiple(struct gpio_chip *chip,
/* update output state data and set device gpio register */ /* update output state data and set device gpio register */
gpiommgpio->out_state[index] &= ~gpio_mask; gpiommgpio->out_state[index] &= ~gpio_mask;
gpiommgpio->out_state[index] |= bitmask; gpiommgpio->out_state[index] |= bitmask;
outb(gpiommgpio->out_state[index], port_addr); iowrite8(gpiommgpio->out_state[index], port_addr);
spin_unlock_irqrestore(&gpiommgpio->lock, flags); spin_unlock_irqrestore(&gpiommgpio->lock, flags);
} }
...@@ -268,6 +266,10 @@ static int gpiomm_probe(struct device *dev, unsigned int id) ...@@ -268,6 +266,10 @@ static int gpiomm_probe(struct device *dev, unsigned int id)
return -EBUSY; return -EBUSY;
} }
gpiommgpio->base = devm_ioport_map(dev, base[id], GPIOMM_EXTENT);
if (!gpiommgpio->base)
return -ENOMEM;
gpiommgpio->chip.label = name; gpiommgpio->chip.label = name;
gpiommgpio->chip.parent = dev; gpiommgpio->chip.parent = dev;
gpiommgpio->chip.owner = THIS_MODULE; gpiommgpio->chip.owner = THIS_MODULE;
...@@ -281,7 +283,6 @@ static int gpiomm_probe(struct device *dev, unsigned int id) ...@@ -281,7 +283,6 @@ static int gpiomm_probe(struct device *dev, unsigned int id)
gpiommgpio->chip.get_multiple = gpiomm_gpio_get_multiple; gpiommgpio->chip.get_multiple = gpiomm_gpio_get_multiple;
gpiommgpio->chip.set = gpiomm_gpio_set; gpiommgpio->chip.set = gpiomm_gpio_set;
gpiommgpio->chip.set_multiple = gpiomm_gpio_set_multiple; gpiommgpio->chip.set_multiple = gpiomm_gpio_set_multiple;
gpiommgpio->base = base[id];
spin_lock_init(&gpiommgpio->lock); spin_lock_init(&gpiommgpio->lock);
...@@ -292,14 +293,14 @@ static int gpiomm_probe(struct device *dev, unsigned int id) ...@@ -292,14 +293,14 @@ static int gpiomm_probe(struct device *dev, unsigned int id)
} }
/* initialize all GPIO as output */ /* initialize all GPIO as output */
outb(0x80, base[id] + 3); iowrite8(0x80, gpiommgpio->base + 3);
outb(0x00, base[id]); iowrite8(0x00, gpiommgpio->base);
outb(0x00, base[id] + 1); iowrite8(0x00, gpiommgpio->base + 1);
outb(0x00, base[id] + 2); iowrite8(0x00, gpiommgpio->base + 2);
outb(0x80, base[id] + 7); iowrite8(0x80, gpiommgpio->base + 7);
outb(0x00, base[id] + 4); iowrite8(0x00, gpiommgpio->base + 4);
outb(0x00, base[id] + 5); iowrite8(0x00, gpiommgpio->base + 5);
outb(0x00, base[id] + 6); iowrite8(0x00, gpiommgpio->base + 6);
return 0; return 0;
} }
......
...@@ -145,7 +145,7 @@ static int grgpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -145,7 +145,7 @@ static int grgpio_irq_set_type(struct irq_data *d, unsigned int type)
return -EINVAL; return -EINVAL;
} }
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
ipol = priv->gc.read_reg(priv->regs + GRGPIO_IPOL) & ~mask; ipol = priv->gc.read_reg(priv->regs + GRGPIO_IPOL) & ~mask;
iedge = priv->gc.read_reg(priv->regs + GRGPIO_IEDGE) & ~mask; iedge = priv->gc.read_reg(priv->regs + GRGPIO_IEDGE) & ~mask;
...@@ -153,7 +153,7 @@ static int grgpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -153,7 +153,7 @@ static int grgpio_irq_set_type(struct irq_data *d, unsigned int type)
priv->gc.write_reg(priv->regs + GRGPIO_IPOL, ipol | pol); priv->gc.write_reg(priv->regs + GRGPIO_IPOL, ipol | pol);
priv->gc.write_reg(priv->regs + GRGPIO_IEDGE, iedge | edge); priv->gc.write_reg(priv->regs + GRGPIO_IEDGE, iedge | edge);
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
return 0; return 0;
} }
...@@ -164,11 +164,11 @@ static void grgpio_irq_mask(struct irq_data *d) ...@@ -164,11 +164,11 @@ static void grgpio_irq_mask(struct irq_data *d)
int offset = d->hwirq; int offset = d->hwirq;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
grgpio_set_imask(priv, offset, 0); grgpio_set_imask(priv, offset, 0);
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
} }
static void grgpio_irq_unmask(struct irq_data *d) static void grgpio_irq_unmask(struct irq_data *d)
...@@ -177,11 +177,11 @@ static void grgpio_irq_unmask(struct irq_data *d) ...@@ -177,11 +177,11 @@ static void grgpio_irq_unmask(struct irq_data *d)
int offset = d->hwirq; int offset = d->hwirq;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
grgpio_set_imask(priv, offset, 1); grgpio_set_imask(priv, offset, 1);
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
} }
static struct irq_chip grgpio_irq_chip = { static struct irq_chip grgpio_irq_chip = {
...@@ -199,7 +199,7 @@ static irqreturn_t grgpio_irq_handler(int irq, void *dev) ...@@ -199,7 +199,7 @@ static irqreturn_t grgpio_irq_handler(int irq, void *dev)
int i; int i;
int match = 0; int match = 0;
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
/* /*
* For each gpio line, call its interrupt handler if it its underlying * For each gpio line, call its interrupt handler if it its underlying
...@@ -215,7 +215,7 @@ static irqreturn_t grgpio_irq_handler(int irq, void *dev) ...@@ -215,7 +215,7 @@ static irqreturn_t grgpio_irq_handler(int irq, void *dev)
} }
} }
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
if (!match) if (!match)
dev_warn(priv->dev, "No gpio line matched irq %d\n", irq); dev_warn(priv->dev, "No gpio line matched irq %d\n", irq);
...@@ -247,13 +247,13 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq, ...@@ -247,13 +247,13 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq,
dev_dbg(priv->dev, "Mapping irq %d for gpio line %d\n", dev_dbg(priv->dev, "Mapping irq %d for gpio line %d\n",
irq, offset); irq, offset);
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
/* Request underlying irq if not already requested */ /* Request underlying irq if not already requested */
lirq->irq = irq; lirq->irq = irq;
uirq = &priv->uirqs[lirq->index]; uirq = &priv->uirqs[lirq->index];
if (uirq->refcnt == 0) { if (uirq->refcnt == 0) {
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
ret = request_irq(uirq->uirq, grgpio_irq_handler, 0, ret = request_irq(uirq->uirq, grgpio_irq_handler, 0,
dev_name(priv->dev), priv); dev_name(priv->dev), priv);
if (ret) { if (ret) {
...@@ -262,11 +262,11 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq, ...@@ -262,11 +262,11 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq,
uirq->uirq); uirq->uirq);
return ret; return ret;
} }
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
} }
uirq->refcnt++; uirq->refcnt++;
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
/* Setup irq */ /* Setup irq */
irq_set_chip_data(irq, priv); irq_set_chip_data(irq, priv);
...@@ -290,7 +290,7 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq) ...@@ -290,7 +290,7 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq)
irq_set_chip_and_handler(irq, NULL, NULL); irq_set_chip_and_handler(irq, NULL, NULL);
irq_set_chip_data(irq, NULL); irq_set_chip_data(irq, NULL);
spin_lock_irqsave(&priv->gc.bgpio_lock, flags); raw_spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
/* Free underlying irq if last user unmapped */ /* Free underlying irq if last user unmapped */
index = -1; index = -1;
...@@ -309,13 +309,13 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq) ...@@ -309,13 +309,13 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq)
uirq = &priv->uirqs[lirq->index]; uirq = &priv->uirqs[lirq->index];
uirq->refcnt--; uirq->refcnt--;
if (uirq->refcnt == 0) { if (uirq->refcnt == 0) {
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
free_irq(uirq->uirq, priv); free_irq(uirq->uirq, priv);
return; return;
} }
} }
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
} }
static const struct irq_domain_ops grgpio_irq_domain_ops = { static const struct irq_domain_ops grgpio_irq_domain_ops = {
......
...@@ -65,7 +65,7 @@ static void hlwd_gpio_irqhandler(struct irq_desc *desc) ...@@ -65,7 +65,7 @@ static void hlwd_gpio_irqhandler(struct irq_desc *desc)
int hwirq; int hwirq;
u32 emulated_pending; u32 emulated_pending;
spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags); raw_spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags);
pending = ioread32be(hlwd->regs + HW_GPIOB_INTFLAG); pending = ioread32be(hlwd->regs + HW_GPIOB_INTFLAG);
pending &= ioread32be(hlwd->regs + HW_GPIOB_INTMASK); pending &= ioread32be(hlwd->regs + HW_GPIOB_INTMASK);
...@@ -93,7 +93,7 @@ static void hlwd_gpio_irqhandler(struct irq_desc *desc) ...@@ -93,7 +93,7 @@ static void hlwd_gpio_irqhandler(struct irq_desc *desc)
/* Mark emulated interrupts as pending */ /* Mark emulated interrupts as pending */
pending |= rising | falling; pending |= rising | falling;
} }
spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags);
chained_irq_enter(chip, desc); chained_irq_enter(chip, desc);
...@@ -118,11 +118,11 @@ static void hlwd_gpio_irq_mask(struct irq_data *data) ...@@ -118,11 +118,11 @@ static void hlwd_gpio_irq_mask(struct irq_data *data)
unsigned long flags; unsigned long flags;
u32 mask; u32 mask;
spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags); raw_spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags);
mask = ioread32be(hlwd->regs + HW_GPIOB_INTMASK); mask = ioread32be(hlwd->regs + HW_GPIOB_INTMASK);
mask &= ~BIT(data->hwirq); mask &= ~BIT(data->hwirq);
iowrite32be(mask, hlwd->regs + HW_GPIOB_INTMASK); iowrite32be(mask, hlwd->regs + HW_GPIOB_INTMASK);
spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags);
} }
static void hlwd_gpio_irq_unmask(struct irq_data *data) static void hlwd_gpio_irq_unmask(struct irq_data *data)
...@@ -132,11 +132,11 @@ static void hlwd_gpio_irq_unmask(struct irq_data *data) ...@@ -132,11 +132,11 @@ static void hlwd_gpio_irq_unmask(struct irq_data *data)
unsigned long flags; unsigned long flags;
u32 mask; u32 mask;
spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags); raw_spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags);
mask = ioread32be(hlwd->regs + HW_GPIOB_INTMASK); mask = ioread32be(hlwd->regs + HW_GPIOB_INTMASK);
mask |= BIT(data->hwirq); mask |= BIT(data->hwirq);
iowrite32be(mask, hlwd->regs + HW_GPIOB_INTMASK); iowrite32be(mask, hlwd->regs + HW_GPIOB_INTMASK);
spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags);
} }
static void hlwd_gpio_irq_enable(struct irq_data *data) static void hlwd_gpio_irq_enable(struct irq_data *data)
...@@ -173,7 +173,7 @@ static int hlwd_gpio_irq_set_type(struct irq_data *data, unsigned int flow_type) ...@@ -173,7 +173,7 @@ static int hlwd_gpio_irq_set_type(struct irq_data *data, unsigned int flow_type)
unsigned long flags; unsigned long flags;
u32 level; u32 level;
spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags); raw_spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags);
hlwd->edge_emulation &= ~BIT(data->hwirq); hlwd->edge_emulation &= ~BIT(data->hwirq);
...@@ -194,11 +194,11 @@ static int hlwd_gpio_irq_set_type(struct irq_data *data, unsigned int flow_type) ...@@ -194,11 +194,11 @@ static int hlwd_gpio_irq_set_type(struct irq_data *data, unsigned int flow_type)
hlwd_gpio_irq_setup_emulation(hlwd, data->hwirq, flow_type); hlwd_gpio_irq_setup_emulation(hlwd, data->hwirq, flow_type);
break; break;
default: default:
spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags);
return -EINVAL; return -EINVAL;
} }
spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags); raw_spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags);
return 0; return 0;
} }
......
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