linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / arm / common / sa1111.c
index 3f68db8..1475089 100644 (file)
@@ -26,7 +26,6 @@
 #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);
 
 /*
@@ -48,7 +51,6 @@ extern void __init sa1110_mb_enable(void);
  */
 struct sa1111 {
        struct device   *dev;
-       struct clk      *clk;
        unsigned long   phys;
        int             irq;
        spinlock_t      lock;
@@ -449,7 +451,19 @@ static void sa1111_wake(struct sa1111 *sachip)
 
        spin_lock_irqsave(&sachip->lock, flags);
 
-       clk_enable(sachip->clk);
+#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
 
        /*
         * Turn VCO on, and disable PLL Bypass.
@@ -541,11 +555,12 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
        struct sa1111_dev *dev;
        int ret;
 
-       dev = kzalloc(sizeof(struct sa1111_dev), GFP_KERNEL);
+       dev = kmalloc(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);
@@ -620,15 +635,11 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
        unsigned int has_devs, val;
        int i, ret = -ENODEV;
 
-       sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL);
+       sachip = kmalloc(sizeof(struct sa1111), GFP_KERNEL);
        if (!sachip)
                return -ENOMEM;
 
-       sachip->clk = clk_get(me, "GPIO27_CLK");
-       if (!sachip->clk) {
-               ret = PTR_ERR(sachip->clk);
-               goto err_free;
-       }
+       memset(sachip, 0, sizeof(struct sa1111));
 
        spin_lock_init(&sachip->lock);
 
@@ -645,7 +656,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 err_clkput;
+               goto out;
        }
 
        /*
@@ -655,7 +666,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 err_unmap;
+               goto unmap;
        }
 
        printk(KERN_INFO "SA1111 Microprocessor Companion Chip: "
@@ -715,11 +726,9 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
 
        return 0;
 
err_unmap:
+ unmap:
        iounmap(sachip->base);
- err_clkput:
-       clk_put(sachip->clk);
- err_free:
+ out:
        kfree(sachip);
        return ret;
 }
@@ -742,8 +751,6 @@ 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);
@@ -752,7 +759,6 @@ static void __sa1111_remove(struct sa1111 *sachip)
        }
 
        iounmap(sachip->base);
-       clk_put(sachip->clk);
        kfree(sachip);
 }
 
@@ -851,8 +857,6 @@ 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;
@@ -939,8 +943,6 @@ 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);
 }