|
@@ -65,6 +65,18 @@ static unsigned long pcm990_pin_config[] __initdata = {
|
|
|
GPIO31_AC97_SYNC,
|
|
|
};
|
|
|
|
|
|
+static void __iomem *pcm990_cpld_base;
|
|
|
+
|
|
|
+static u8 pcm990_cpld_readb(unsigned int reg)
|
|
|
+{
|
|
|
+ return readb(pcm990_cpld_base + reg);
|
|
|
+}
|
|
|
+
|
|
|
+static void pcm990_cpld_writeb(u8 value, unsigned int reg)
|
|
|
+{
|
|
|
+ writeb(value, pcm990_cpld_base + reg);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* pcm990_lcd_power - control power supply to the LCD
|
|
|
* @on: 0 = switch off, 1 = switch on
|
|
@@ -78,13 +90,13 @@ static void pcm990_lcd_power(int on, struct fb_var_screeninfo *var)
|
|
|
/* enable LCD-Latches
|
|
|
* power on LCD
|
|
|
*/
|
|
|
- __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) =
|
|
|
- PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON;
|
|
|
+ pcm990_cpld_writeb(PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON,
|
|
|
+ PCM990_CTRL_REG3);
|
|
|
} else {
|
|
|
/* disable LCD-Latches
|
|
|
* power off LCD
|
|
|
*/
|
|
|
- __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) = 0x00;
|
|
|
+ pcm990_cpld_writeb(0, PCM990_CTRL_REG3);
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
@@ -243,15 +255,26 @@ static unsigned long pcm990_irq_enabled;
|
|
|
static void pcm990_mask_ack_irq(struct irq_data *d)
|
|
|
{
|
|
|
int pcm990_irq = (d->irq - PCM027_IRQ(0));
|
|
|
- PCM990_INTMSKENA = (pcm990_irq_enabled &= ~(1 << pcm990_irq));
|
|
|
+
|
|
|
+ pcm990_irq_enabled &= ~(1 << pcm990_irq);
|
|
|
+
|
|
|
+ pcm990_cpld_writeb(pcm990_irq_enabled, PCM990_CTRL_INTMSKENA);
|
|
|
}
|
|
|
|
|
|
static void pcm990_unmask_irq(struct irq_data *d)
|
|
|
{
|
|
|
int pcm990_irq = (d->irq - PCM027_IRQ(0));
|
|
|
+ u8 val;
|
|
|
+
|
|
|
/* the irq can be acknowledged only if deasserted, so it's done here */
|
|
|
- PCM990_INTSETCLR |= 1 << pcm990_irq;
|
|
|
- PCM990_INTMSKENA = (pcm990_irq_enabled |= (1 << pcm990_irq));
|
|
|
+
|
|
|
+ pcm990_irq_enabled |= (1 << pcm990_irq);
|
|
|
+
|
|
|
+ val = pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
|
|
|
+ val |= 1 << pcm990_irq;
|
|
|
+ pcm990_cpld_writeb(val, PCM990_CTRL_INTSETCLR);
|
|
|
+
|
|
|
+ pcm990_cpld_writeb(pcm990_irq_enabled, PCM990_CTRL_INTMSKENA);
|
|
|
}
|
|
|
|
|
|
static struct irq_chip pcm990_irq_chip = {
|
|
@@ -261,7 +284,10 @@ static struct irq_chip pcm990_irq_chip = {
|
|
|
|
|
|
static void pcm990_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|
|
{
|
|
|
- unsigned long pending = (~PCM990_INTSETCLR) & pcm990_irq_enabled;
|
|
|
+ unsigned long pending;
|
|
|
+
|
|
|
+ pending = ~pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
|
|
|
+ pending &= pcm990_irq_enabled;
|
|
|
|
|
|
do {
|
|
|
/* clear our parent IRQ */
|
|
@@ -270,7 +296,8 @@ static void pcm990_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|
|
irq = PCM027_IRQ(0) + __ffs(pending);
|
|
|
generic_handle_irq(irq);
|
|
|
}
|
|
|
- pending = (~PCM990_INTSETCLR) & pcm990_irq_enabled;
|
|
|
+ pending = ~pcm990_cpld_readb(PCM990_CTRL_INTSETCLR);
|
|
|
+ pending &= pcm990_irq_enabled;
|
|
|
} while (pending);
|
|
|
}
|
|
|
|
|
@@ -285,8 +312,9 @@ static void __init pcm990_init_irq(void)
|
|
|
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
|
|
}
|
|
|
|
|
|
- PCM990_INTMSKENA = 0x00; /* disable all Interrupts */
|
|
|
- PCM990_INTSETCLR = 0xFF;
|
|
|
+ /* disable all Interrupts */
|
|
|
+ pcm990_cpld_writeb(0x0, PCM990_CTRL_INTMSKENA);
|
|
|
+ pcm990_cpld_writeb(0xff, PCM990_CTRL_INTSETCLR);
|
|
|
|
|
|
irq_set_chained_handler(PCM990_CTRL_INT_IRQ, pcm990_irq_handler);
|
|
|
irq_set_irq_type(PCM990_CTRL_INT_IRQ, PCM990_CTRL_INT_IRQ_EDGE);
|
|
@@ -309,13 +337,16 @@ static int pcm990_mci_init(struct device *dev, irq_handler_t mci_detect_int,
|
|
|
static void pcm990_mci_setpower(struct device *dev, unsigned int vdd)
|
|
|
{
|
|
|
struct pxamci_platform_data *p_d = dev->platform_data;
|
|
|
+ u8 val;
|
|
|
+
|
|
|
+ val = pcm990_cpld_readb(PCM990_CTRL_REG5);
|
|
|
|
|
|
if ((1 << vdd) & p_d->ocr_mask)
|
|
|
- __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5) =
|
|
|
- PCM990_CTRL_MMC2PWR;
|
|
|
+ val |= PCM990_CTRL_MMC2PWR;
|
|
|
else
|
|
|
- __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5) =
|
|
|
- ~PCM990_CTRL_MMC2PWR;
|
|
|
+ val &= ~PCM990_CTRL_MMC2PWR;
|
|
|
+
|
|
|
+ pcm990_cpld_writeb(PCM990_CTRL_MMC2PWR, PCM990_CTRL_REG5);
|
|
|
}
|
|
|
|
|
|
static void pcm990_mci_exit(struct device *dev, void *data)
|
|
@@ -480,23 +511,6 @@ static struct platform_device pcm990_camera[] = {
|
|
|
};
|
|
|
#endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */
|
|
|
|
|
|
-/*
|
|
|
- * enable generic access to the base board control CPLDs U6 and U7
|
|
|
- */
|
|
|
-static struct map_desc pcm990_io_desc[] __initdata = {
|
|
|
- {
|
|
|
- .virtual = PCM990_CTRL_BASE,
|
|
|
- .pfn = __phys_to_pfn(PCM990_CTRL_PHYS),
|
|
|
- .length = PCM990_CTRL_SIZE,
|
|
|
- .type = MT_DEVICE /* CPLD */
|
|
|
- }, {
|
|
|
- .virtual = PCM990_CF_PLD_BASE,
|
|
|
- .pfn = __phys_to_pfn(PCM990_CF_PLD_PHYS),
|
|
|
- .length = PCM990_CF_PLD_SIZE,
|
|
|
- .type = MT_DEVICE /* CPLD */
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
/*
|
|
|
* system init for baseboard usage. Will be called by pcm027 init.
|
|
|
*
|
|
@@ -507,8 +521,11 @@ void __init pcm990_baseboard_init(void)
|
|
|
{
|
|
|
pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm990_pin_config));
|
|
|
|
|
|
- /* register CPLD access */
|
|
|
- iotable_init(ARRAY_AND_SIZE(pcm990_io_desc));
|
|
|
+ pcm990_cpld_base = ioremap(PCM990_CTRL_PHYS, PCM990_CTRL_SIZE);
|
|
|
+ if (!pcm990_cpld_base) {
|
|
|
+ pr_err("pcm990: failed to ioremap cpld\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
/* register CPLD's IRQ controller */
|
|
|
pcm990_init_irq();
|