2011-02-25 23:01:19 -08:00
# include <linux/platform_device.h>
2012-03-28 18:30:03 +01:00
# include <asm/cpu_type.h>
2007-07-21 19:18:57 -07:00
2011-04-18 11:25:44 +00:00
struct irq_bucket {
struct irq_bucket * next ;
unsigned int real_irq ;
unsigned int irq ;
unsigned int pil ;
} ;
2012-05-14 15:14:36 +02:00
# define SUN4M_HARD_INT(x) (0x000000001 << (x))
# define SUN4M_SOFT_INT(x) (0x000010000 << (x))
2011-04-18 11:25:44 +00:00
# define SUN4D_MAX_BOARD 10
# define SUN4D_MAX_IRQ ((SUN4D_MAX_BOARD + 2) << 5)
/* Map between the irq identifier used in hw to the
* irq_bucket . The map is sufficient large to hold
* the sun4d hw identifiers .
*/
extern struct irq_bucket * irq_map [ SUN4D_MAX_IRQ ] ;
2011-02-25 23:02:11 -08:00
/* sun4m specific type definitions */
/* This maps direct to CPU specific interrupt registers */
struct sun4m_irq_percpu {
u32 pending ;
u32 clear ;
u32 set ;
} ;
/* This maps direct to global interrupt registers */
struct sun4m_irq_global {
u32 pending ;
u32 mask ;
u32 mask_clear ;
u32 mask_set ;
u32 interrupt_target ;
} ;
extern struct sun4m_irq_percpu __iomem * sun4m_irq_percpu [ SUN4M_NCPUS ] ;
extern struct sun4m_irq_global __iomem * sun4m_irq_global ;
2012-04-04 21:49:26 +02:00
/* The following definitions describe the individual platform features: */
# define FEAT_L10_CLOCKSOURCE (1 << 0) /* L10 timer is used as a clocksource */
# define FEAT_L10_CLOCKEVENT (1 << 1) /* L10 timer is used as a clockevent */
# define FEAT_L14_ONESHOT (1 << 2) /* L14 timer clockevent can oneshot */
2011-02-25 23:00:19 -08:00
/*
2012-04-04 13:21:13 +02:00
* Platform specific configuration
2011-02-25 23:00:19 -08:00
* The individual platforms assign their platform
* specifics in their init functions .
*/
2012-04-04 13:21:13 +02:00
struct sparc_config {
2012-04-04 21:49:26 +02:00
void ( * init_timers ) ( void ) ;
2011-02-25 23:01:19 -08:00
unsigned int ( * build_device_irq ) ( struct platform_device * op ,
unsigned int real_irq ) ;
2012-04-04 21:49:26 +02:00
/* generic clockevent features - see FEAT_* above */
int features ;
/* clock rate used for clock event timer */
int clock_rate ;
/* one period for clock source timer */
unsigned int cs_period ;
/* function to obtain offsett for cs period */
unsigned int ( * get_cycles_offset ) ( void ) ;
2012-05-14 17:30:35 +02:00
void ( * clear_clock_irq ) ( void ) ;
void ( * load_profile_irq ) ( int cpu , unsigned int limit ) ;
2011-02-25 23:00:19 -08:00
} ;
2012-04-04 13:21:13 +02:00
extern struct sparc_config sparc_config ;
2011-02-25 23:00:19 -08:00
2011-04-18 11:25:44 +00:00
unsigned int irq_alloc ( unsigned int real_irq , unsigned int pil ) ;
void irq_link ( unsigned int irq ) ;
void irq_unlink ( unsigned int irq ) ;
void handler_irq ( unsigned int pil , struct pt_regs * regs ) ;
2011-02-25 23:00:19 -08:00
2012-05-14 15:14:36 +02:00
unsigned long leon_get_irqmask ( unsigned int irq ) ;
2007-07-21 19:18:57 -07:00
2014-04-21 21:39:24 +02:00
/* irq_32.c */
void sparc_floppy_irq ( int irq , void * dev_id , struct pt_regs * regs ) ;
2014-04-21 21:39:22 +02:00
/* sun4m_irq.c */
void sun4m_nmi ( struct pt_regs * regs ) ;
2014-04-21 21:39:23 +02:00
/* sun4d_irq.c */
void sun4d_handler_irq ( unsigned int pil , struct pt_regs * regs ) ;
2012-05-14 15:14:36 +02:00
# ifdef CONFIG_SMP
2011-05-02 00:08:54 +00:00
/* All SUN4D IPIs are sent on this IRQ, may be shared with hard IRQs */
2011-08-29 00:16:28 +02:00
# define SUN4D_IPI_IRQ 13
2011-05-02 00:08:54 +00:00
extern void sun4d_ipi_interrupt ( void ) ;
2007-07-21 19:18:57 -07:00
# endif