|
@@ -238,3 +238,100 @@ static const int viper_isa_irq_map[] = {
|
|
0, /* ISA irq #13, invalid */
|
|
0, /* ISA irq #13, invalid */
|
|
1 << 9, /* ISA irq #14 */
|
|
1 << 9, /* ISA irq #14 */
|
|
1 << 10, /* ISA irq #15 */
|
|
1 << 10, /* ISA irq #15 */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static inline int viper_irq_to_bitmask(unsigned int irq)
|
|
|
|
+{
|
|
|
|
+ return viper_isa_irq_map[irq - PXA_ISA_IRQ(0)];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline int viper_bit_to_irq(int bit)
|
|
|
|
+{
|
|
|
|
+ return viper_isa_irqs[bit] + PXA_ISA_IRQ(0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void viper_ack_irq(struct irq_data *d)
|
|
|
|
+{
|
|
|
|
+ int viper_irq = viper_irq_to_bitmask(d->irq);
|
|
|
|
+
|
|
|
|
+ if (viper_irq & 0xff)
|
|
|
|
+ VIPER_LO_IRQ_STATUS = viper_irq;
|
|
|
|
+ else
|
|
|
|
+ VIPER_HI_IRQ_STATUS = (viper_irq >> 8);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void viper_mask_irq(struct irq_data *d)
|
|
|
|
+{
|
|
|
|
+ viper_irq_enabled_mask &= ~(viper_irq_to_bitmask(d->irq));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void viper_unmask_irq(struct irq_data *d)
|
|
|
|
+{
|
|
|
|
+ viper_irq_enabled_mask |= viper_irq_to_bitmask(d->irq);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline unsigned long viper_irq_pending(void)
|
|
|
|
+{
|
|
|
|
+ return (VIPER_HI_IRQ_STATUS << 8 | VIPER_LO_IRQ_STATUS) &
|
|
|
|
+ viper_irq_enabled_mask;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void viper_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|
|
|
+{
|
|
|
|
+ unsigned long pending;
|
|
|
|
+
|
|
|
|
+ pending = viper_irq_pending();
|
|
|
|
+ do {
|
|
|
|
+ /* we're in a chained irq handler,
|
|
|
|
+ * so ack the interrupt by hand */
|
|
|
|
+ desc->irq_data.chip->irq_ack(&desc->irq_data);
|
|
|
|
+
|
|
|
|
+ if (likely(pending)) {
|
|
|
|
+ irq = viper_bit_to_irq(__ffs(pending));
|
|
|
|
+ generic_handle_irq(irq);
|
|
|
|
+ }
|
|
|
|
+ pending = viper_irq_pending();
|
|
|
|
+ } while (pending);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct irq_chip viper_irq_chip = {
|
|
|
|
+ .name = "ISA",
|
|
|
|
+ .irq_ack = viper_ack_irq,
|
|
|
|
+ .irq_mask = viper_mask_irq,
|
|
|
|
+ .irq_unmask = viper_unmask_irq
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void __init viper_init_irq(void)
|
|
|
|
+{
|
|
|
|
+ int level;
|
|
|
|
+ int isa_irq;
|
|
|
|
+
|
|
|
|
+ pxa25x_init_irq();
|
|
|
|
+
|
|
|
|
+ /* setup ISA IRQs */
|
|
|
|
+ for (level = 0; level < ARRAY_SIZE(viper_isa_irqs); level++) {
|
|
|
|
+ isa_irq = viper_bit_to_irq(level);
|
|
|
|
+ irq_set_chip_and_handler(isa_irq, &viper_irq_chip,
|
|
|
|
+ handle_edge_irq);
|
|
|
|
+ set_irq_flags(isa_irq, IRQF_VALID | IRQF_PROBE);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ irq_set_chained_handler(gpio_to_irq(VIPER_CPLD_GPIO),
|
|
|
|
+ viper_irq_handler);
|
|
|
|
+ irq_set_irq_type(gpio_to_irq(VIPER_CPLD_GPIO), IRQ_TYPE_EDGE_BOTH);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Flat Panel */
|
|
|
|
+static struct pxafb_mode_info fb_mode_info[] = {
|
|
|
|
+ {
|
|
|
|
+ .pixclock = 157500,
|
|
|
|
+
|
|
|
|
+ .xres = 320,
|
|
|
|
+ .yres = 240,
|
|
|
|
+
|
|
|
|
+ .bpp = 16,
|
|
|
|
+
|
|
|
|
+ .hsync_len = 63,
|
|
|
|
+ .left_margin = 7,
|
|
|
|
+ .right_margin = 13,
|
|
|
|
+
|