Remove obsolete #include <linux/config.h>
[sfrench/cifs-2.6.git] / arch / arm / common / sa1111.c
index d0d6e6d2d649e9887813fc6f3e08debb292e2b81..fe06a36a21302a73cf1d5cd89a2056fc4f8d9fcc 100644 (file)
@@ -14,7 +14,6 @@
  * All initialization functions provided here are intended to be called
  * from machine specific code with proper arguments when required.
  */
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -26,6 +25,7 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/dma-mapping.h>
+#include <linux/clk.h>
 
 #include <asm/hardware.h>
 #include <asm/mach-types.h>
 
 #include <asm/hardware/sa1111.h>
 
-#ifdef CONFIG_ARCH_PXA
-#include <asm/arch/pxa-regs.h>
-#endif
-
 extern void __init sa1110_mb_enable(void);
 
 /*
@@ -51,6 +47,7 @@ extern void __init sa1110_mb_enable(void);
  */
 struct sa1111 {
        struct device   *dev;
+       struct clk      *clk;
        unsigned long   phys;
        int             irq;
        spinlock_t      lock;
@@ -451,19 +448,7 @@ static void sa1111_wake(struct sa1111 *sachip)
 
        spin_lock_irqsave(&sachip->lock, flags);
 
-#ifdef CONFIG_ARCH_SA1100
-       /*
-        * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
-        * (SA-1110 Developer's Manual, section 9.1.2.1)
-        */
-       GAFR |= GPIO_32_768kHz;
-       GPDR |= GPIO_32_768kHz;
-       TUCR = TUCR_3_6864MHz;
-#elif CONFIG_ARCH_PXA
-       pxa_gpio_mode(GPIO11_3_6MHz_MD);
-#else
-#error missing clock setup
-#endif
+       clk_enable(sachip->clk);
 
        /*
         * Turn VCO on, and disable PLL Bypass.
@@ -555,12 +540,11 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
        struct sa1111_dev *dev;
        int ret;
 
-       dev = kmalloc(sizeof(struct sa1111_dev), GFP_KERNEL);
+       dev = kzalloc(sizeof(struct sa1111_dev), GFP_KERNEL);
        if (!dev) {
                ret = -ENOMEM;
                goto out;
        }
-       memset(dev, 0, sizeof(struct sa1111_dev));
 
        snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id),
                 "%4.4lx", info->offset);
@@ -635,11 +619,15 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
        unsigned int has_devs, val;
        int i, ret = -ENODEV;
 
-       sachip = kmalloc(sizeof(struct sa1111), GFP_KERNEL);
+       sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL);
        if (!sachip)
                return -ENOMEM;
 
-       memset(sachip, 0, sizeof(struct sa1111));
+       sachip->clk = clk_get(me, "GPIO27_CLK");
+       if (!sachip->clk) {
+               ret = PTR_ERR(sachip->clk);
+               goto err_free;
+       }
 
        spin_lock_init(&sachip->lock);
 
@@ -656,7 +644,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
        sachip->base = ioremap(mem->start, PAGE_SIZE * 2);
        if (!sachip->base) {
                ret = -ENOMEM;
-               goto out;
+               goto err_clkput;
        }
 
        /*
@@ -666,7 +654,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
        if ((id & SKID_ID_MASK) != SKID_SA1111_ID) {
                printk(KERN_DEBUG "SA1111 not detected: ID = %08lx\n", id);
                ret = -ENODEV;
-               goto unmap;
+               goto err_unmap;
        }
 
        printk(KERN_INFO "SA1111 Microprocessor Companion Chip: "
@@ -726,9 +714,11 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
 
        return 0;
 
- unmap:
err_unmap:
        iounmap(sachip->base);
- out:
+ err_clkput:
+       clk_put(sachip->clk);
+ err_free:
        kfree(sachip);
        return ret;
 }
@@ -751,6 +741,8 @@ static void __sa1111_remove(struct sa1111 *sachip)
        sa1111_writel(0, irqbase + SA1111_WAKEEN0);
        sa1111_writel(0, irqbase + SA1111_WAKEEN1);
 
+       clk_disable(sachip->clk);
+
        if (sachip->irq != NO_IRQ) {
                set_irq_chained_handler(sachip->irq, NULL);
                set_irq_data(sachip->irq, NULL);
@@ -759,6 +751,7 @@ static void __sa1111_remove(struct sa1111 *sachip)
        }
 
        iounmap(sachip->base);
+       clk_put(sachip->clk);
        kfree(sachip);
 }
 
@@ -857,6 +850,8 @@ static int sa1111_suspend(struct platform_device *dev, pm_message_t state)
        sa1111_writel(0, sachip->base + SA1111_SKPWM0);
        sa1111_writel(0, sachip->base + SA1111_SKPWM1);
 
+       clk_disable(sachip->clk);
+
        spin_unlock_irqrestore(&sachip->lock, flags);
 
        return 0;
@@ -943,6 +938,8 @@ static int sa1111_probe(struct platform_device *pdev)
        if (!mem)
                return -EINVAL;
        irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               return -ENXIO;
 
        return __sa1111_probe(&pdev->dev, mem, irq);
 }
@@ -1247,14 +1244,14 @@ static int sa1111_bus_remove(struct device *dev)
 struct bus_type sa1111_bus_type = {
        .name           = "sa1111-rab",
        .match          = sa1111_match,
+       .probe          = sa1111_bus_probe,
+       .remove         = sa1111_bus_remove,
        .suspend        = sa1111_bus_suspend,
        .resume         = sa1111_bus_resume,
 };
 
 int sa1111_driver_register(struct sa1111_driver *driver)
 {
-       driver->drv.probe = sa1111_bus_probe;
-       driver->drv.remove = sa1111_bus_remove;
        driver->drv.bus = &sa1111_bus_type;
        return driver_register(&driver->drv);
 }