|  | @@ -238,3 +238,100 @@ static const int viper_isa_irq_map[] = {
 | 
	
		
			
				|  |  |  	0,		/* ISA irq #13, invalid */
 | 
	
		
			
				|  |  |  	1 << 9,		/* ISA irq #14 */
 | 
	
		
			
				|  |  |  	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,
 | 
	
		
			
				|  |  | +
 |