#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);
/*
*/
struct sa1111 {
struct device *dev;
- struct clk *clk;
unsigned long phys;
int irq;
spinlock_t lock;
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.
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);
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);
sachip->base = ioremap(mem->start, PAGE_SIZE * 2);
if (!sachip->base) {
ret = -ENOMEM;
- goto err_clkput;
+ goto out;
}
/*
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: "
return 0;
- err_unmap:
+ unmap:
iounmap(sachip->base);
- err_clkput:
- clk_put(sachip->clk);
- err_free:
+ out:
kfree(sachip);
return ret;
}
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);
}
iounmap(sachip->base);
- clk_put(sachip->clk);
kfree(sachip);
}
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;
if (!mem)
return -EINVAL;
irq = platform_get_irq(pdev, 0);
- if (irq < 0)
- return -ENXIO;
return __sa1111_probe(&pdev->dev, mem, irq);
}