]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpio/gpio-langwell.c
Merge tag 'iommu-updates-v3.11' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / gpio / gpio-langwell.c
index 62ef10a641c4250b273263c78e51bd2534ed632a..bfa1af1b519fdf74f30080b5e7701ac641bc999e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Moorestown platform Langwell chip GPIO driver
  *
- * Copyright (c) 2008 - 2009,  Intel Corporation.
+ * Copyright (c) 2008, 2009, 2013, Intel Corporation.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -20,7 +20,6 @@
 /* Supports:
  * Moorestown platform Langwell chip.
  * Medfield platform Penwell chip.
- * Whitney point.
  */
 
 #include <linux/module.h>
@@ -65,7 +64,7 @@ enum GPIO_REG {
 
 struct lnw_gpio {
        struct gpio_chip                chip;
-       void                            *reg_base;
+       void __iomem                    *reg_base;
        spinlock_t                      lock;
        struct pci_dev                  *pdev;
        struct irq_domain               *domain;
@@ -74,15 +73,13 @@ struct lnw_gpio {
 #define to_lnw_priv(chip)      container_of(chip, struct lnw_gpio, chip)
 
 static void __iomem *gpio_reg(struct gpio_chip *chip, unsigned offset,
-                       enum GPIO_REG reg_type)
+                             enum GPIO_REG reg_type)
 {
        struct lnw_gpio *lnw = to_lnw_priv(chip);
        unsigned nreg = chip->ngpio / 32;
        u8 reg = offset / 32;
-       void __iomem *ptr;
 
-       ptr = (void __iomem *)(lnw->reg_base + reg_type * nreg * 4 + reg * 4);
-       return ptr;
+       return lnw->reg_base + reg_type * nreg * 4 + reg * 4;
 }
 
 static void __iomem *gpio_reg_2bit(struct gpio_chip *chip, unsigned offset,
@@ -91,10 +88,8 @@ static void __iomem *gpio_reg_2bit(struct gpio_chip *chip, unsigned offset,
        struct lnw_gpio *lnw = to_lnw_priv(chip);
        unsigned nreg = chip->ngpio / 32;
        u8 reg = offset / 16;
-       void __iomem *ptr;
 
-       ptr = (void __iomem *)(lnw->reg_base + reg_type * nreg * 4 + reg * 4);
-       return ptr;
+       return lnw->reg_base + reg_type * nreg * 4 + reg * 4;
 }
 
 static int lnw_gpio_request(struct gpio_chip *chip, unsigned offset)
@@ -305,11 +300,7 @@ static const struct irq_domain_ops lnw_gpio_irq_ops = {
 
 static int lnw_gpio_runtime_idle(struct device *dev)
 {
-       int err = pm_schedule_suspend(dev, 500);
-
-       if (!err)
-               return 0;
-
+       pm_schedule_suspend(dev, 500);
        return -EBUSY;
 }
 
@@ -318,56 +309,40 @@ static const struct dev_pm_ops lnw_gpio_pm_ops = {
 };
 
 static int lnw_gpio_probe(struct pci_dev *pdev,
-                       const struct pci_device_id *id)
+                         const struct pci_device_id *id)
 {
-       void *base;
-       resource_size_t start, len;
+       void __iomem *base;
        struct lnw_gpio *lnw;
        u32 gpio_base;
        u32 irq_base;
        int retval;
        int ngpio = id->driver_data;
 
-       retval = pci_enable_device(pdev);
+       retval = pcim_enable_device(pdev);
        if (retval)
                return retval;
 
-       retval = pci_request_regions(pdev, "langwell_gpio");
+       retval = pcim_iomap_regions(pdev, 1 << 0 | 1 << 1, pci_name(pdev));
        if (retval) {
-               dev_err(&pdev->dev, "error requesting resources\n");
-               goto err_pci_req_region;
-       }
-       /* get the gpio_base from bar1 */
-       start = pci_resource_start(pdev, 1);
-       len = pci_resource_len(pdev, 1);
-       base = ioremap_nocache(start, len);
-       if (!base) {
-               dev_err(&pdev->dev, "error mapping bar1\n");
-               retval = -EFAULT;
-               goto err_ioremap;
+               dev_err(&pdev->dev, "I/O memory mapping error\n");
+               return retval;
        }
-       irq_base = *(u32 *)base;
-       gpio_base = *((u32 *)base + 1);
+
+       base = pcim_iomap_table(pdev)[1];
+
+       irq_base = readl(base);
+       gpio_base = readl(sizeof(u32) + base);
+
        /* release the IO mapping, since we already get the info from bar1 */
-       iounmap(base);
-       /* get the register base from bar0 */
-       start = pci_resource_start(pdev, 0);
-       len = pci_resource_len(pdev, 0);
-       base = devm_ioremap_nocache(&pdev->dev, start, len);
-       if (!base) {
-               dev_err(&pdev->dev, "error mapping bar0\n");
-               retval = -EFAULT;
-               goto err_ioremap;
-       }
+       pcim_iounmap_regions(pdev, 1 << 1);
 
        lnw = devm_kzalloc(&pdev->dev, sizeof(*lnw), GFP_KERNEL);
        if (!lnw) {
-               dev_err(&pdev->dev, "can't allocate langwell_gpio chip data\n");
-               retval = -ENOMEM;
-               goto err_ioremap;
+               dev_err(&pdev->dev, "can't allocate chip data\n");
+               return -ENOMEM;
        }
 
-       lnw->reg_base = base;
+       lnw->reg_base = pcim_iomap_table(pdev)[0];
        lnw->chip.label = dev_name(&pdev->dev);
        lnw->chip.request = lnw_gpio_request;
        lnw->chip.direction_input = lnw_gpio_direction_input;
@@ -380,18 +355,18 @@ static int lnw_gpio_probe(struct pci_dev *pdev,
        lnw->chip.can_sleep = 0;
        lnw->pdev = pdev;
 
+       spin_lock_init(&lnw->lock);
+
        lnw->domain = irq_domain_add_simple(pdev->dev.of_node, ngpio, irq_base,
                                            &lnw_gpio_irq_ops, lnw);
-       if (!lnw->domain) {
-               retval = -ENOMEM;
-               goto err_ioremap;
-       }
+       if (!lnw->domain)
+               return -ENOMEM;
 
        pci_set_drvdata(pdev, lnw);
        retval = gpiochip_add(&lnw->chip);
        if (retval) {
-               dev_err(&pdev->dev, "langwell gpiochip_add error %d\n", retval);
-               goto err_ioremap;
+               dev_err(&pdev->dev, "gpiochip_add error %d\n", retval);
+               return retval;
        }
 
        lnw_irq_init_hw(lnw);
@@ -399,18 +374,10 @@ static int lnw_gpio_probe(struct pci_dev *pdev,
        irq_set_handler_data(pdev->irq, lnw);
        irq_set_chained_handler(pdev->irq, lnw_irq_handler);
 
-       spin_lock_init(&lnw->lock);
-
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_allow(&pdev->dev);
 
        return 0;
-
-err_ioremap:
-       pci_release_regions(pdev);
-err_pci_req_region:
-       pci_disable_device(pdev);
-       return retval;
 }
 
 static struct pci_driver lnw_gpio_driver = {
@@ -422,88 +389,9 @@ static struct pci_driver lnw_gpio_driver = {
        },
 };
 
-
-static int wp_gpio_probe(struct platform_device *pdev)
-{
-       struct lnw_gpio *lnw;
-       struct gpio_chip *gc;
-       struct resource *rc;
-       int retval = 0;
-
-       rc = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!rc)
-               return -EINVAL;
-
-       lnw = kzalloc(sizeof(struct lnw_gpio), GFP_KERNEL);
-       if (!lnw) {
-               dev_err(&pdev->dev,
-                       "can't allocate whitneypoint_gpio chip data\n");
-               return -ENOMEM;
-       }
-       lnw->reg_base = ioremap_nocache(rc->start, resource_size(rc));
-       if (lnw->reg_base == NULL) {
-               retval = -EINVAL;
-               goto err_kmalloc;
-       }
-       spin_lock_init(&lnw->lock);
-       gc = &lnw->chip;
-       gc->label = dev_name(&pdev->dev);
-       gc->owner = THIS_MODULE;
-       gc->direction_input = lnw_gpio_direction_input;
-       gc->direction_output = lnw_gpio_direction_output;
-       gc->get = lnw_gpio_get;
-       gc->set = lnw_gpio_set;
-       gc->to_irq = NULL;
-       gc->base = 0;
-       gc->ngpio = 64;
-       gc->can_sleep = 0;
-       retval = gpiochip_add(gc);
-       if (retval) {
-               dev_err(&pdev->dev, "whitneypoint gpiochip_add error %d\n",
-                                                               retval);
-               goto err_ioremap;
-       }
-       platform_set_drvdata(pdev, lnw);
-       return 0;
-err_ioremap:
-       iounmap(lnw->reg_base);
-err_kmalloc:
-       kfree(lnw);
-       return retval;
-}
-
-static int wp_gpio_remove(struct platform_device *pdev)
-{
-       struct lnw_gpio *lnw = platform_get_drvdata(pdev);
-       int err;
-       err = gpiochip_remove(&lnw->chip);
-       if (err)
-               dev_err(&pdev->dev, "failed to remove gpio_chip.\n");
-       iounmap(lnw->reg_base);
-       kfree(lnw);
-       platform_set_drvdata(pdev, NULL);
-       return 0;
-}
-
-static struct platform_driver wp_gpio_driver = {
-       .probe          = wp_gpio_probe,
-       .remove         = wp_gpio_remove,
-       .driver         = {
-               .name   = "wp_gpio",
-               .owner  = THIS_MODULE,
-       },
-};
-
 static int __init lnw_gpio_init(void)
 {
-       int ret;
-       ret =  pci_register_driver(&lnw_gpio_driver);
-       if (ret < 0)
-               return ret;
-       ret = platform_driver_register(&wp_gpio_driver);
-       if (ret < 0)
-               pci_unregister_driver(&lnw_gpio_driver);
-       return ret;
+       return pci_register_driver(&lnw_gpio_driver);
 }
 
 device_initcall(lnw_gpio_init);