diff options
Diffstat (limited to 'arch/arm/mach-shmobile/intc-sh7372.c')
| -rw-r--r-- | arch/arm/mach-shmobile/intc-sh7372.c | 260 | 
1 files changed, 160 insertions, 100 deletions
diff --git a/arch/arm/mach-shmobile/intc-sh7372.c b/arch/arm/mach-shmobile/intc-sh7372.c index 4cd3cae38e7..a91caad7db7 100644 --- a/arch/arm/mach-shmobile/intc-sh7372.c +++ b/arch/arm/mach-shmobile/intc-sh7372.c @@ -19,22 +19,19 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/interrupt.h> +#include <linux/module.h>  #include <linux/irq.h>  #include <linux/io.h>  #include <linux/sh_intc.h> +#include <mach/intc.h> +#include <mach/irqs.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  enum {  	UNUSED_INTCA = 0, -	ENABLED, -	DISABLED,  	/* interrupt sources INTCA */ -	IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, -	IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A, -	IRQ16A, IRQ17A, IRQ18A, IRQ19A, IRQ20A, IRQ21A, IRQ22A, IRQ23A, -	IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A,  	DIRC,  	CRYPT_STD,  	IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1, @@ -49,14 +46,14 @@ enum {  	MSIOF2, MSIOF1,  	SCIFA4, SCIFA5, SCIFB,  	FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, -	SDHI0, -	SDHI1, +	SDHI0_SDHI0I0, SDHI0_SDHI0I1, SDHI0_SDHI0I2, SDHI0_SDHI0I3, +	SDHI1_SDHI1I0, SDHI1_SDHI1I1, SDHI1_SDHI1I2,  	IRREM,  	IRDA,  	TPU0,  	TTI20,  	DDM, -	SDHI2, +	SDHI2_SDHI2I0, SDHI2_SDHI2I1, SDHI2_SDHI2I2, SDHI2_SDHI2I3,  	RWDT0,  	DMAC1_1_DEI0, DMAC1_1_DEI1, DMAC1_1_DEI2, DMAC1_1_DEI3,  	DMAC1_2_DEI4, DMAC1_2_DEI5, DMAC1_2_DADERR, @@ -84,26 +81,10 @@ enum {  	/* interrupt groups INTCA */  	DMAC1_1, DMAC1_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT, -	AP_ARM1, AP_ARM2, SPU2, FLCTL, IIC1 +	AP_ARM1, AP_ARM2, SPU2, FLCTL, IIC1, SDHI0, SDHI1, SDHI2  };  static struct intc_vect intca_vectors[] __initdata = { -	INTC_VECT(IRQ0A, 0x0200), INTC_VECT(IRQ1A, 0x0220), -	INTC_VECT(IRQ2A, 0x0240), INTC_VECT(IRQ3A, 0x0260), -	INTC_VECT(IRQ4A, 0x0280), INTC_VECT(IRQ5A, 0x02a0), -	INTC_VECT(IRQ6A, 0x02c0), INTC_VECT(IRQ7A, 0x02e0), -	INTC_VECT(IRQ8A, 0x0300), INTC_VECT(IRQ9A, 0x0320), -	INTC_VECT(IRQ10A, 0x0340), INTC_VECT(IRQ11A, 0x0360), -	INTC_VECT(IRQ12A, 0x0380), INTC_VECT(IRQ13A, 0x03a0), -	INTC_VECT(IRQ14A, 0x03c0), INTC_VECT(IRQ15A, 0x03e0), -	INTC_VECT(IRQ16A, 0x3200), INTC_VECT(IRQ17A, 0x3220), -	INTC_VECT(IRQ18A, 0x3240), INTC_VECT(IRQ19A, 0x3260), -	INTC_VECT(IRQ20A, 0x3280), INTC_VECT(IRQ31A, 0x32a0), -	INTC_VECT(IRQ22A, 0x32c0), INTC_VECT(IRQ23A, 0x32e0), -	INTC_VECT(IRQ24A, 0x3300), INTC_VECT(IRQ25A, 0x3320), -	INTC_VECT(IRQ26A, 0x3340), INTC_VECT(IRQ27A, 0x3360), -	INTC_VECT(IRQ28A, 0x3380), INTC_VECT(IRQ29A, 0x33a0), -	INTC_VECT(IRQ30A, 0x33c0), INTC_VECT(IRQ31A, 0x33e0),  	INTC_VECT(DIRC, 0x0560),  	INTC_VECT(CRYPT_STD, 0x0700),  	INTC_VECT(IIC1_ALI1, 0x0780), INTC_VECT(IIC1_TACKI1, 0x07a0), @@ -125,17 +106,17 @@ static struct intc_vect intca_vectors[] __initdata = {  	INTC_VECT(SCIFB, 0x0d60),  	INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0),  	INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), -	INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20), -	INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60), -	INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0), -	INTC_VECT(SDHI1, 0x0ec0), +	INTC_VECT(SDHI0_SDHI0I0, 0x0e00), INTC_VECT(SDHI0_SDHI0I1, 0x0e20), +	INTC_VECT(SDHI0_SDHI0I2, 0x0e40), INTC_VECT(SDHI0_SDHI0I3, 0x0e60), +	INTC_VECT(SDHI1_SDHI1I0, 0x0e80), INTC_VECT(SDHI1_SDHI1I1, 0x0ea0), +	INTC_VECT(SDHI1_SDHI1I2, 0x0ec0),  	INTC_VECT(IRREM, 0x0f60),  	INTC_VECT(IRDA, 0x0480),  	INTC_VECT(TPU0, 0x04a0),  	INTC_VECT(TTI20, 0x1100),  	INTC_VECT(DDM, 0x1140), -	INTC_VECT(SDHI2, 0x1200), INTC_VECT(SDHI2, 0x1220), -	INTC_VECT(SDHI2, 0x1240), INTC_VECT(SDHI2, 0x1260), +	INTC_VECT(SDHI2_SDHI2I0, 0x1200), INTC_VECT(SDHI2_SDHI2I1, 0x1220), +	INTC_VECT(SDHI2_SDHI2I2, 0x1240), INTC_VECT(SDHI2_SDHI2I3, 0x1260),  	INTC_VECT(RWDT0, 0x1280),  	INTC_VECT(DMAC1_1_DEI0, 0x2000), INTC_VECT(DMAC1_1_DEI1, 0x2020),  	INTC_VECT(DMAC1_1_DEI2, 0x2040), INTC_VECT(DMAC1_1_DEI3, 0x2060), @@ -195,19 +176,16 @@ static struct intc_group intca_groups[] __initdata = {  	INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI,  		   FLCTL_FLTREQ0I, FLCTL_FLTREQ1I),  	INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), +	INTC_GROUP(SDHI0, SDHI0_SDHI0I0, SDHI0_SDHI0I1, +		   SDHI0_SDHI0I2, SDHI0_SDHI0I3), +	INTC_GROUP(SDHI1, SDHI1_SDHI1I0, SDHI1_SDHI1I1, +		   SDHI1_SDHI1I2), +	INTC_GROUP(SDHI2, SDHI2_SDHI2I0, SDHI2_SDHI2I1, +		   SDHI2_SDHI2I2, SDHI2_SDHI2I3),  	INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM),  };  static struct intc_mask_reg intca_mask_registers[] __initdata = { -	{ 0xe6900040, 0xe6900060, 8, /* INTMSK00A / INTMSKCLR00A */ -	  { IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A } }, -	{ 0xe6900044, 0xe6900064, 8, /* INTMSK10A / INTMSKCLR10A */ -	  { IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A } }, -	{ 0xe6900048, 0xe6900068, 8, /* INTMSK20A / INTMSKCLR20A */ -	  { IRQ16A, IRQ17A, IRQ18A, IRQ19A, IRQ20A, IRQ21A, IRQ22A, IRQ23A } }, -	{ 0xe690004c, 0xe690006c, 8, /* INTMSK30A / INTMSKCLR30A */ -	  { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, -  	{ 0xe6940080, 0xe69400c0, 8, /* IMR0A / IMCR0A */  	  { DMAC2_1_DEI3, DMAC2_1_DEI2, DMAC2_1_DEI1, DMAC2_1_DEI0,  	    AP_ARM_IRQPMU, 0, AP_ARM_COMMTX, AP_ARM_COMMRX } }, @@ -230,10 +208,10 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = {  	  { SCIFB, SCIFA5, SCIFA4, MSIOF1,  	    0, 0, MSIOF2, 0 } },  	{ 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ -	  { DISABLED, DISABLED, ENABLED, ENABLED, +	  { SDHI0_SDHI0I3, SDHI0_SDHI0I2, SDHI0_SDHI0I1, SDHI0_SDHI0I0,  	    FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } },  	{ 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ -	  { 0, DISABLED, ENABLED, ENABLED, +	  { 0, SDHI1_SDHI1I2, SDHI1_SDHI1I1, SDHI1_SDHI1I0,  	    TTI20, USBHSDMAC0_USHDMI, 0, 0 } },  	{ 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */  	  { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, @@ -248,7 +226,7 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = {  	  { 0, 0, TPU0, 0,  	    0, 0, 0, 0 } },  	{ 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ -	  { DISABLED, DISABLED, ENABLED, ENABLED, +	  { SDHI2_SDHI2I3, SDHI2_SDHI2I2, SDHI2_SDHI2I1, SDHI2_SDHI2I0,  	    0, CMT3, 0, RWDT0 } },  	{ 0xe6950080, 0xe69500c0, 8, /* IMR0A3 / IMCR0A3 */  	  { SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, 0, @@ -278,15 +256,6 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = {  };  static struct intc_prio_reg intca_prio_registers[] __initdata = { -	{ 0xe6900010, 0, 32, 4, /* INTPRI00A */ -	  { IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A } }, -	{ 0xe6900014, 0, 32, 4, /* INTPRI10A */ -	  { IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A } }, -	{ 0xe6900018, 0, 32, 4, /* INTPRI20A */ -	  { IRQ16A, IRQ17A, IRQ18A, IRQ19A, IRQ20A, IRQ21A, IRQ22A, IRQ23A } }, -	{ 0xe690001c, 0, 32, 4, /* INTPRI30A */ -	  { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, -  	{ 0xe6940000, 0, 16, 4, /* IPRAA */ { DMAC3_1, DMAC3_2, CMT2, 0 } },  	{ 0xe6940004, 0, 16, 4, /* IPRBA */ { IRDA, 0, BBIF1, BBIF2 } },  	{ 0xe6940008, 0, 16, 4, /* IPRCA */ { 0, CRYPT_STD, @@ -332,41 +301,20 @@ static struct intc_prio_reg intca_prio_registers[] __initdata = {  	{ 0xe6950050, 0, 16, 4, /* IPRUA3 */ { USBHSDMAC1_USHDMI, 0, 0, 0 } },  }; -static struct intc_sense_reg intca_sense_registers[] __initdata = { -	{ 0xe6900000, 32, 4, /* ICR1A */ -	  { IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A } }, -	{ 0xe6900004, 32, 4, /* ICR2A */ -	  { IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A } }, -	{ 0xe6900008, 32, 4, /* ICR3A */ -	  { IRQ16A, IRQ17A, IRQ18A, IRQ19A, IRQ20A, IRQ21A, IRQ22A, IRQ23A } }, -	{ 0xe690000c, 32, 4, /* ICR4A */ -	  { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, -}; +static DECLARE_INTC_DESC(intca_desc, "sh7372-intca", +			 intca_vectors, intca_groups, +			 intca_mask_registers, intca_prio_registers, +			 NULL); -static struct intc_mask_reg intca_ack_registers[] __initdata = { -	{ 0xe6900020, 0, 8, /* INTREQ00A */ -	  { IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A } }, -	{ 0xe6900024, 0, 8, /* INTREQ10A */ -	  { IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A } }, -	{ 0xe6900028, 0, 8, /* INTREQ20A */ -	  { IRQ16A, IRQ17A, IRQ18A, IRQ19A, IRQ20A, IRQ21A, IRQ22A, IRQ23A } }, -	{ 0xe690002c, 0, 8, /* INTREQ30A */ -	  { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, -}; +INTC_IRQ_PINS_16(intca_irq_pins_lo, 0xe6900000, +		 INTC_VECT, "sh7372-intca-irq-lo"); -static struct intc_desc intca_desc __initdata = { -	.name = "sh7372-intca", -	.force_enable = ENABLED, -	.force_disable = DISABLED, -	.hw = INTC_HW_DESC(intca_vectors, intca_groups, -			   intca_mask_registers, intca_prio_registers, -			   intca_sense_registers, intca_ack_registers), -}; +INTC_IRQ_PINS_16H(intca_irq_pins_hi, 0xe6900000, +		 INTC_VECT, "sh7372-intca-irq-hi");  enum {  	UNUSED_INTCS = 0, - -	INTCS, +	ENABLED_INTCS,  	/* interrupt sources INTCS */ @@ -378,7 +326,7 @@ enum {  	/* BBIF2 */  	VPU,  	TSIF1, -	_3DG_SGX530, +	/* 3DG */  	_2DDMAC,  	IIC2_ALI2, IIC2_TACKI2, IIC2_WAITI2, IIC2_DTEI2,  	IPMMU_IPMMUR, IPMMU_IPMMUR2, @@ -413,7 +361,7 @@ enum {  	CMT4,  	DSITX1_DSITX1_0,  	DSITX1_DSITX1_1, -	/* MFIS2 */ +	MFIS2_INTCS, /* Priority always enabled using ENABLED_INTCS */  	CPORTS2R,  	/* CEC */  	JPU6E, @@ -435,7 +383,7 @@ static struct intc_vect intcs_vectors[] = {  	/* BBIF2 */  	INTCS_VECT(VPU, 0x980),  	INTCS_VECT(TSIF1, 0x9a0), -	INTCS_VECT(_3DG_SGX530, 0x9e0), +	/* 3DG */  	INTCS_VECT(_2DDMAC, 0xa00),  	INTCS_VECT(IIC2_ALI2, 0xa80), INTCS_VECT(IIC2_TACKI2, 0xaa0),  	INTCS_VECT(IIC2_WAITI2, 0xac0), INTCS_VECT(IIC2_DTEI2, 0xae0), @@ -477,12 +425,10 @@ static struct intc_vect intcs_vectors[] = {  	INTCS_VECT(CMT4, 0x1980),  	INTCS_VECT(DSITX1_DSITX1_0, 0x19a0),  	INTCS_VECT(DSITX1_DSITX1_1, 0x19c0), -	/* MFIS2 */ +	INTCS_VECT(MFIS2_INTCS, 0x1a00),  	INTCS_VECT(CPORTS2R, 0x1a20),  	/* CEC */  	INTCS_VECT(JPU6E, 0x1a80), - -	INTC_VECT(INTCS, 0xf80),  };  static struct intc_group intcs_groups[] __initdata = { @@ -520,7 +466,7 @@ static struct intc_mask_reg intcs_mask_registers[] = {  	    RTDMAC_1_DEI3, RTDMAC_1_DEI2, RTDMAC_1_DEI1, RTDMAC_1_DEI0 } },  	{ 0xffd20198, 0xffd201d8, 8, /* IMR6SA / IMCR6SA */  	  { 0, 0, MSIOF, 0, -	    _3DG_SGX530, 0, 0, 0 } }, +	    0, 0, 0, 0 } },  	{ 0xffd2019c, 0xffd201dc, 8, /* IMR7SA / IMCR7SA */  	  { 0, TMU_TUNI2, TMU_TUNI1, TMU_TUNI0,  	    0, 0, 0, 0 } }, @@ -543,11 +489,8 @@ static struct intc_mask_reg intcs_mask_registers[] = {  	  { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0,  	    CMT4, DSITX1_DSITX1_0, DSITX1_DSITX1_1, 0 } },  	{ 0xffd5019c, 0xffd501dc, 8, /* IMR7SA3 / IMCR7SA3 */ -	  { 0, CPORTS2R, 0, 0, +	  { MFIS2_INTCS, CPORTS2R, 0, 0,  	    JPU6E, 0, 0, 0 } }, -	{ 0xffd20104, 0, 16, /* INTAMASK */ -	  { 0, 0, 0, 0, 0, 0, 0, 0, -	    0, 0, 0, 0, 0, 0, 0, INTCS } },  };  /* Priority is needed for INTCA to receive the INTCS interrupt */ @@ -560,7 +503,6 @@ static struct intc_prio_reg intcs_prio_registers[] = {  					      TMU_TUNI2, TSIF1 } },  	{ 0xffd2001c, 0, 16, 4, /* IPRHS */ { 0, 0, VEU, BEU } },  	{ 0xffd20020, 0, 16, 4, /* IPRIS */ { 0, MSIOF, TSIF0, IIC0 } }, -	{ 0xffd20024, 0, 16, 4, /* IPRJS */ { 0, _3DG_SGX530, 0, 0 } },  	{ 0xffd20028, 0, 16, 4, /* IPRKS */ { 0, 0, LMB, 0 } },  	{ 0xffd2002c, 0, 16, 4, /* IPRLS */ { IPMMU, 0, 0, 0 } },  	{ 0xffd20030, 0, 16, 4, /* IPRMS */ { IIC2, 0, 0, 0 } }, @@ -571,7 +513,8 @@ static struct intc_prio_reg intcs_prio_registers[] = {  	{ 0xffd50030, 0, 16, 4, /* IPRMS3 */ { TMU1, 0, 0, 0 } },  	{ 0xffd50034, 0, 16, 4, /* IPRNS3 */ { CMT4, DSITX1_DSITX1_0,  					       DSITX1_DSITX1_1, 0 } }, -	{ 0xffd50038, 0, 16, 4, /* IPROS3 */ { 0, CPORTS2R, 0, 0 } }, +	{ 0xffd50038, 0, 16, 4, /* IPROS3 */ { ENABLED_INTCS, CPORTS2R, +					       0, 0 } },  	{ 0xffd5003c, 0, 16, 4, /* IPRPS3 */ { JPU6E, 0, 0, 0 } },  }; @@ -590,6 +533,8 @@ static struct resource intcs_resources[] __initdata = {  static struct intc_desc intcs_desc __initdata = {  	.name = "sh7372-intcs", +	.force_enable = ENABLED_INTCS, +	.skip_syscore_suspend = true,  	.resource = intcs_resources,  	.num_resources = ARRAY_SIZE(intcs_resources),  	.hw = INTC_HW_DESC(intcs_vectors, intcs_groups, intcs_mask_registers, @@ -598,20 +543,135 @@ static struct intc_desc intcs_desc __initdata = {  static void intcs_demux(unsigned int irq, struct irq_desc *desc)  { -	void __iomem *reg = (void *)get_irq_data(irq); +	void __iomem *reg = (void *)irq_get_handler_data(irq);  	unsigned int evtcodeas = ioread32(reg);  	generic_handle_irq(intcs_evt2irq(evtcodeas));  } +static void __iomem *intcs_ffd2; +static void __iomem *intcs_ffd5; +  void __init sh7372_init_irq(void)  { -	void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE); +	void __iomem *intevtsa; +	int n; + +	intcs_ffd2 = ioremap_nocache(0xffd20000, PAGE_SIZE); +	intevtsa = intcs_ffd2 + 0x100; +	intcs_ffd5 = ioremap_nocache(0xffd50000, PAGE_SIZE);  	register_intc_controller(&intca_desc); +	register_intc_controller(&intca_irq_pins_lo_desc); +	register_intc_controller(&intca_irq_pins_hi_desc);  	register_intc_controller(&intcs_desc); +	/* setup dummy cascade chip for INTCS */ +	n = evt2irq(0xf80); +	irq_alloc_desc_at(n, numa_node_id()); +	irq_set_chip_and_handler_name(n, &dummy_irq_chip, +				      handle_level_irq, "level"); +	set_irq_flags(n, IRQF_VALID); /* yuck */ +  	/* demux using INTEVTSA */ -	set_irq_data(evt2irq(0xf80), (void *)intevtsa); -	set_irq_chained_handler(evt2irq(0xf80), intcs_demux); +	irq_set_handler_data(n, (void *)intevtsa); +	irq_set_chained_handler(n, intcs_demux); + +	/* unmask INTCS in INTAMASK */ +	iowrite16(0, intcs_ffd2 + 0x104); +} + +static unsigned short ffd2[0x200]; +static unsigned short ffd5[0x100]; + +void sh7372_intcs_suspend(void) +{ +	int k; + +	for (k = 0x00; k <= 0x30; k += 4) +		ffd2[k] = __raw_readw(intcs_ffd2 + k); + +	for (k = 0x80; k <= 0xb0; k += 4) +		ffd2[k] = __raw_readb(intcs_ffd2 + k); + +	for (k = 0x180; k <= 0x188; k += 4) +		ffd2[k] = __raw_readb(intcs_ffd2 + k); + +	for (k = 0x00; k <= 0x3c; k += 4) +		ffd5[k] = __raw_readw(intcs_ffd5 + k); + +	for (k = 0x80; k <= 0x9c; k += 4) +		ffd5[k] = __raw_readb(intcs_ffd5 + k); +} + +void sh7372_intcs_resume(void) +{ +	int k; + +	for (k = 0x00; k <= 0x30; k += 4) +		__raw_writew(ffd2[k], intcs_ffd2 + k); + +	for (k = 0x80; k <= 0xb0; k += 4) +		__raw_writeb(ffd2[k], intcs_ffd2 + k); + +	for (k = 0x180; k <= 0x188; k += 4) +		__raw_writeb(ffd2[k], intcs_ffd2 + k); + +	for (k = 0x00; k <= 0x3c; k += 4) +		__raw_writew(ffd5[k], intcs_ffd5 + k); + +	for (k = 0x80; k <= 0x9c; k += 4) +		__raw_writeb(ffd5[k], intcs_ffd5 + k); +} + +#define E694_BASE IOMEM(0xe6940000) +#define E695_BASE IOMEM(0xe6950000) + +static unsigned short e694[0x200]; +static unsigned short e695[0x200]; + +void sh7372_intca_suspend(void) +{ +	int k; + +	for (k = 0x00; k <= 0x38; k += 4) +		e694[k] = __raw_readw(E694_BASE + k); + +	for (k = 0x80; k <= 0xb4; k += 4) +		e694[k] = __raw_readb(E694_BASE + k); + +	for (k = 0x180; k <= 0x1b4; k += 4) +		e694[k] = __raw_readb(E694_BASE + k); + +	for (k = 0x00; k <= 0x50; k += 4) +		e695[k] = __raw_readw(E695_BASE + k); + +	for (k = 0x80; k <= 0xa8; k += 4) +		e695[k] = __raw_readb(E695_BASE + k); + +	for (k = 0x180; k <= 0x1a8; k += 4) +		e695[k] = __raw_readb(E695_BASE + k); +} + +void sh7372_intca_resume(void) +{ +	int k; + +	for (k = 0x00; k <= 0x38; k += 4) +		__raw_writew(e694[k], E694_BASE + k); + +	for (k = 0x80; k <= 0xb4; k += 4) +		__raw_writeb(e694[k], E694_BASE + k); + +	for (k = 0x180; k <= 0x1b4; k += 4) +		__raw_writeb(e694[k], E694_BASE + k); + +	for (k = 0x00; k <= 0x50; k += 4) +		__raw_writew(e695[k], E695_BASE + k); + +	for (k = 0x80; k <= 0xa8; k += 4) +		__raw_writeb(e695[k], E695_BASE + k); + +	for (k = 0x180; k <= 0x1a8; k += 4) +		__raw_writeb(e695[k], E695_BASE + k);  }  | 
