X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Farm%2Fcommon%2Fsa1111.c;h=1475089f9b4265f7b2c9dc86696dea0a4970c027;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=3f68db84e5e6c488920258f0911c4378cb35ccc2;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 3f68db84e..1475089f9 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #include @@ -37,6 +36,10 @@ #include +#ifdef CONFIG_ARCH_PXA +#include +#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); }