|
@@ -522,3 +522,116 @@ static struct intc_mask_reg intcs_mask_registers[] = {
|
|
|
{ 0, 0, VOU, CTI,
|
|
|
JPU, 0, LCRC, LCDC0 } },
|
|
|
/* IMR5SA / IMCR5SA */ /*KEYSC/RTDMAC2/RTDMAC1*/
|
|
|
+ /* IMR6SA / IMCR6SA */ /*MSIOF/SGX540*/
|
|
|
+ { /* IMR7SA / IMCR7SA */ 0xffd2019c, 0xffd201dc, 8,
|
|
|
+ { 0, TMU0_2, TMU0_1, TMU0_0,
|
|
|
+ 0, 0, 0, 0 } },
|
|
|
+ { /* IMR8SA / IMCR8SA */ 0xffd201a0, 0xffd201e0, 8,
|
|
|
+ { 0, 0, 0, 0,
|
|
|
+ CEU20, 0, 0, 0 } },
|
|
|
+ { /* IMR9SA / IMCR9SA */ 0xffd201a4, 0xffd201e4, 8,
|
|
|
+ { 0, 0/*RWDT0*/, 0/*CMT2*/, CMT0,
|
|
|
+ 0, 0, 0, 0 } },
|
|
|
+ /* IMR10SA / IMCR10SA */ /*IPMMU*/
|
|
|
+ { /* IMR11SA / IMCR11SA */ 0xffd201ac, 0xffd201ec, 8,
|
|
|
+ { IIC0_DTEI, IIC0_WAITI, IIC0_TACKI, IIC0_ALI,
|
|
|
+ 0, _2DG_BRK_INT, LMB, 0 } },
|
|
|
+ /* IMR12SA / IMCR12SA */
|
|
|
+ /* IMR13SA / IMCR13SA */
|
|
|
+ /* IMR0SA3 / IMCR0SA3 */ /*RTDMAC2(1)/RTDMAC2(2)*/
|
|
|
+ /* IMR1SA3 / IMCR1SA3 */
|
|
|
+ /* IMR2SA3 / IMCR2SA3 */
|
|
|
+ /* IMR3SA3 / IMCR3SA3 */
|
|
|
+ { /* IMR4SA3 / IMCR4SA3 */ 0xffd50190, 0xffd501d0, 8,
|
|
|
+ { 0, 0, 0, 0,
|
|
|
+ LCDC1, 0, 0, 0 } },
|
|
|
+ /* IMR5SA3 / IMCR5SA3 */ /* SPU2/FSI/FMSI */
|
|
|
+ { /* IMR6SA3 / IMCR6SA3 */ 0xffd50198, 0xffd501d8, 8,
|
|
|
+ { TMU1_0, TMU1_1, TMU1_2, 0,
|
|
|
+ CMT4, DISP, DSRV, 0 } },
|
|
|
+ { /* IMR7SA3 / IMCR7SA3 */ 0xffd5019c, 0xffd501dc, 8,
|
|
|
+ { 0/*MFIS2*/, CPORTS2R, 0, 0,
|
|
|
+ 0, 0, 0, 0 } },
|
|
|
+ { /* INTAMASK */ 0xffd20104, 0, 16,
|
|
|
+ { 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 */
|
|
|
+static struct intc_prio_reg intcs_prio_registers[] = {
|
|
|
+ { 0xffd20000, 0, 16, 4, /* IPRAS */ { CTI, VOU, 0/*2DDMAC*/, ICB } },
|
|
|
+ { 0xffd20004, 0, 16, 4, /* IPRBS */ { JPU, LCDC0, 0, LCRC } },
|
|
|
+ /* IPRCS */ /*BBIF2*/
|
|
|
+ /* IPRDS */
|
|
|
+ { 0xffd20010, 0, 16, 4, /* IPRES */ { 0/*RTDMAC(1)*/, VPU5HA2,
|
|
|
+ 0/*MFI*/, VPU5F } },
|
|
|
+ { 0xffd20014, 0, 16, 4, /* IPRFS */ { 0/*KEYSC*/, 0/*RTDMAC(2)*/,
|
|
|
+ 0/*CMT2*/, CMT0 } },
|
|
|
+ { 0xffd20018, 0, 16, 4, /* IPRGS */ { TMU0_0, TMU0_1,
|
|
|
+ TMU0_2, _2DG1 } },
|
|
|
+ { 0xffd2001c, 0, 16, 4, /* IPRHS */ { 0, 0/*STPRO*/, 0/*STPRO*/,
|
|
|
+ _2DG_BRK_INT/*FIXME*/ } },
|
|
|
+ { 0xffd20020, 0, 16, 4, /* IPRIS */ { 0, 0/*MSIOF*/, 0, IIC0 } },
|
|
|
+ { 0xffd20024, 0, 16, 4, /* IPRJS */ { CEU20, 0/*SGX540*/, 0, 0 } },
|
|
|
+ { 0xffd20028, 0, 16, 4, /* IPRKS */ { VIO6C, 0, LMB, 0 } },
|
|
|
+ { 0xffd2002c, 0, 16, 4, /* IPRLS */ { 0/*IPMMU*/, 0, CEU21, 0 } },
|
|
|
+ /* IPRMS */ /*RWDT0*/
|
|
|
+ /* IPRAS3 */ /*RTDMAC2(1)*/
|
|
|
+ /* IPRBS3 */ /*RTDMAC2(2)*/
|
|
|
+ /* IPRCS3 */
|
|
|
+ /* IPRDS3 */
|
|
|
+ /* IPRES3 */
|
|
|
+ /* IPRFS3 */
|
|
|
+ /* IPRGS3 */
|
|
|
+ /* IPRHS3 */
|
|
|
+ /* IPRIS3 */
|
|
|
+ { 0xffd50024, 0, 16, 4, /* IPRJS3 */ { LCDC1, 0, 0, 0 } },
|
|
|
+ /* IPRKS3 */ /*SPU2/FSI/FMSi*/
|
|
|
+ /* IPRLS3 */
|
|
|
+ { 0xffd50030, 0, 16, 4, /* IPRMS3 */ { TMU1, 0, 0, 0 } },
|
|
|
+ { 0xffd50034, 0, 16, 4, /* IPRNS3 */ { CMT4, DISP, DSRV, 0 } },
|
|
|
+ { 0xffd50038, 0, 16, 4, /* IPROS3 */ { 0/*MFIS2*/, CPORTS2R, 0, 0 } },
|
|
|
+ /* IPRPS3 */
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource intcs_resources[] __initdata = {
|
|
|
+ [0] = {
|
|
|
+ .start = 0xffd20000,
|
|
|
+ .end = 0xffd201ff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = 0xffd50000,
|
|
|
+ .end = 0xffd501ff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct intc_desc intcs_desc __initdata = {
|
|
|
+ .name = "r8a7740-intcs",
|
|
|
+ .resource = intcs_resources,
|
|
|
+ .num_resources = ARRAY_SIZE(intcs_resources),
|
|
|
+ .hw = INTC_HW_DESC(intcs_vectors, intcs_groups, intcs_mask_registers,
|
|
|
+ intcs_prio_registers, NULL, NULL),
|
|
|
+};
|
|
|
+
|
|
|
+static void intcs_demux(unsigned int irq, struct irq_desc *desc)
|
|
|
+{
|
|
|
+ void __iomem *reg = (void *)irq_get_handler_data(irq);
|
|
|
+ unsigned int evtcodeas = ioread32(reg);
|
|
|
+
|
|
|
+ generic_handle_irq(intcs_evt2irq(evtcodeas));
|
|
|
+}
|
|
|
+
|
|
|
+void __init r8a7740_init_irq(void)
|
|
|
+{
|
|
|
+ void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
|
|
|
+
|
|
|
+ register_intc_controller(&intca_desc);
|
|
|
+ register_intc_controller(&intca_irq_pins_desc);
|
|
|
+ register_intc_controller(&intcs_desc);
|
|
|
+
|
|
|
+ /* demux using INTEVTSA */
|
|
|
+ irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa);
|
|
|
+ irq_set_chained_handler(evt2irq(0xf80), intcs_demux);
|
|
|
+}
|