aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-intel-mid.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-01-21 12:40:46 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-21 13:09:12 -0500
commit8e5096607280d4e103389bfe8f8b7decbf538ff6 (patch)
tree60352a466e96c7b36d41263d7590ee79e0aaff35 /drivers/gpio/gpio-intel-mid.c
parent02d0a752460ea5dab34ce36c9ddc9c682e846a0d (diff)
parentde755c330512364d3396c7da0c20b1c20b3b08b2 (diff)
Merge tag 'gpio-v3.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull GPIO tree bulk changes from Linus Walleij: "A big set this merge window, as we have much going on in this subsystem. The changes to other subsystems (notably a slew of ARM machines as I am doing away with their custom APIs) have all been ACKed to the extent possible. Major changes this time: - Some core improvements and cleanups to the new GPIO descriptor API. This seems to be working now so we can start the exodus to this API, moving gradually away from the global GPIO numberspace. - Incremental improvements to the ACPI GPIO core, and move the few GPIO ACPI clients we have to the GPIO descriptor API right *now* before we go any further. We actually managed to contain this *before* we started to litter the kernel with yet another hackish global numberspace for the ACPI GPIOs, which is a big win. - The RFkill GPIO driver and all platforms using it have been migrated to use the GPIO descriptors rather than fixed number assignments. Tegra machine has been migrated as part of this. - New drivers for MOXA ART, Xtensa GPIO32 and SMSC SCH311x. Those should be really good examples of how I expect a nice GPIO driver to look these days. - Do away with custom GPIO implementations on a major part of the ARM machines: ks8695, lpc32xx, mv78xx0. Make a first step towards the same in the horribly convoluted Samsung S3C include forest. We expect to continue to clean this up as we move forward. - Flag GPIO lines used for IRQ on adnp, bcm-kona, em, intel-mid and lynxpoint. This makes the GPIOlib core aware that a certain GPIO line is used for IRQs and can then enforce some semantics such as disallowing a GPIO line marked as in use for IRQ to be switched to output mode. - Drop all use of irq_set_chip_and_handler_name(). The name provided in these cases were just unhelpful tags like "mux" or "demux". - Extend the MCP23s08 driver to handle interrupts. - Minor incremental improvements for rcar, lynxpoint, em 74x164 and msm drivers. - Some non-urgent bug fixes here and there, duplicate #includes and that usual kind of cleanups" Fix up broken Kconfig file manually to make this all compile. * tag 'gpio-v3.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: (71 commits) gpio: mcp23s08: fix casting caused build warning gpio: mcp23s08: depend on OF_GPIO gpio: mcp23s08: Add irq functionality for i2c chips ARM: S5P[v210|c100|64x0]: Fix build error gpio: pxa: clamp gpio get value to [0,1] ARM: s3c24xx: explicit dependency on <plat/gpio-cfg.h> ARM: S3C[24|64]xx: move includes back under <mach/> scope Documentation / ACPI: update to GPIO descriptor API gpio / ACPI: get rid of acpi_gpio.h gpio / ACPI: register to ACPI events automatically mmc: sdhci-acpi: convert to use GPIO descriptor API ARM: s3c24xx: fix build error gpio: f7188x: set can_sleep attribute gpio: samsung: Update documentation gpio: samsung: Remove hardware.h inclusion gpio: xtensa: depend on HAVE_XTENSA_GPIO32 gpio: clps711x: Enable driver compilation with COMPILE_TEST gpio: clps711x: Use of_match_ptr() net: rfkill: gpio: convert to descriptor-based GPIO interface leds: s3c24xx: Fix build failure ...
Diffstat (limited to 'drivers/gpio/gpio-intel-mid.c')
-rw-r--r--drivers/gpio/gpio-intel-mid.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c
index be803af658ac..d1b50ef5fab8 100644
--- a/drivers/gpio/gpio-intel-mid.c
+++ b/drivers/gpio/gpio-intel-mid.c
@@ -235,11 +235,33 @@ static void intel_mid_irq_mask(struct irq_data *d)
235{ 235{
236} 236}
237 237
238static unsigned int intel_mid_irq_startup(struct irq_data *d)
239{
240 struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
241
242 if (gpio_lock_as_irq(&priv->chip, irqd_to_hwirq(d)))
243 dev_err(priv->chip.dev,
244 "unable to lock HW IRQ %lu for IRQ\n",
245 irqd_to_hwirq(d));
246 intel_mid_irq_unmask(d);
247 return 0;
248}
249
250static void intel_mid_irq_shutdown(struct irq_data *d)
251{
252 struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
253
254 intel_mid_irq_mask(d);
255 gpio_unlock_as_irq(&priv->chip, irqd_to_hwirq(d));
256}
257
238static struct irq_chip intel_mid_irqchip = { 258static struct irq_chip intel_mid_irqchip = {
239 .name = "INTEL_MID-GPIO", 259 .name = "INTEL_MID-GPIO",
240 .irq_mask = intel_mid_irq_mask, 260 .irq_mask = intel_mid_irq_mask,
241 .irq_unmask = intel_mid_irq_unmask, 261 .irq_unmask = intel_mid_irq_unmask,
242 .irq_set_type = intel_mid_irq_type, 262 .irq_set_type = intel_mid_irq_type,
263 .irq_startup = intel_mid_irq_startup,
264 .irq_shutdown = intel_mid_irq_shutdown,
243}; 265};
244 266
245static const struct intel_mid_gpio_ddata gpio_lincroft = { 267static const struct intel_mid_gpio_ddata gpio_lincroft = {
@@ -275,7 +297,7 @@ static const struct intel_mid_gpio_ddata gpio_tangier = {
275 .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE, 297 .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE,
276}; 298};
277 299
278static DEFINE_PCI_DEVICE_TABLE(intel_gpio_ids) = { 300static const struct pci_device_id intel_gpio_ids[] = {
279 { 301 {
280 /* Lincroft */ 302 /* Lincroft */
281 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080f), 303 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080f),
@@ -358,8 +380,7 @@ static int intel_gpio_irq_map(struct irq_domain *d, unsigned int irq,
358{ 380{
359 struct intel_mid_gpio *priv = d->host_data; 381 struct intel_mid_gpio *priv = d->host_data;
360 382
361 irq_set_chip_and_handler_name(irq, &intel_mid_irqchip, 383 irq_set_chip_and_handler(irq, &intel_mid_irqchip, handle_simple_irq);
362 handle_simple_irq, "demux");
363 irq_set_chip_data(irq, priv); 384 irq_set_chip_data(irq, priv);
364 irq_set_irq_type(irq, IRQ_TYPE_NONE); 385 irq_set_irq_type(irq, IRQ_TYPE_NONE);
365 386
@@ -418,6 +439,7 @@ static int intel_gpio_probe(struct pci_dev *pdev,
418 439
419 priv->reg_base = pcim_iomap_table(pdev)[0]; 440 priv->reg_base = pcim_iomap_table(pdev)[0];
420 priv->chip.label = dev_name(&pdev->dev); 441 priv->chip.label = dev_name(&pdev->dev);
442 priv->chip.dev = &pdev->dev;
421 priv->chip.request = intel_gpio_request; 443 priv->chip.request = intel_gpio_request;
422 priv->chip.direction_input = intel_gpio_direction_input; 444 priv->chip.direction_input = intel_gpio_direction_input;
423 priv->chip.direction_output = intel_gpio_direction_output; 445 priv->chip.direction_output = intel_gpio_direction_output;
@@ -426,7 +448,7 @@ static int intel_gpio_probe(struct pci_dev *pdev,
426 priv->chip.to_irq = intel_gpio_to_irq; 448 priv->chip.to_irq = intel_gpio_to_irq;
427 priv->chip.base = gpio_base; 449 priv->chip.base = gpio_base;
428 priv->chip.ngpio = ddata->ngpio; 450 priv->chip.ngpio = ddata->ngpio;
429 priv->chip.can_sleep = 0; 451 priv->chip.can_sleep = false;
430 priv->pdev = pdev; 452 priv->pdev = pdev;
431 453
432 spin_lock_init(&priv->lock); 454 spin_lock_init(&priv->lock);