root/arch/sh/kernel/cpu/sh4a/setup-sh7734.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. plat_early_device_setup
  2. plat_irq_setup
  3. plat_irq_setup_pins

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * arch/sh/kernel/cpu/sh4a/setup-sh7734.c
   4  *
   5  * SH7734 Setup
   6  *
   7  * Copyright (C) 2011,2012 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
   8  * Copyright (C) 2011,2012 Renesas Solutions Corp.
   9  */
  10 
  11 #include <linux/platform_device.h>
  12 #include <linux/init.h>
  13 #include <linux/serial.h>
  14 #include <linux/mm.h>
  15 #include <linux/dma-mapping.h>
  16 #include <linux/serial_sci.h>
  17 #include <linux/sh_timer.h>
  18 #include <linux/io.h>
  19 #include <asm/clock.h>
  20 #include <asm/irq.h>
  21 #include <cpu/sh7734.h>
  22 
  23 /* SCIF */
  24 static struct plat_sci_port scif0_platform_data = {
  25         .scscr          = SCSCR_REIE,
  26         .type           = PORT_SCIF,
  27         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
  28 };
  29 
  30 static struct resource scif0_resources[] = {
  31         DEFINE_RES_MEM(0xffe40000, 0x100),
  32         DEFINE_RES_IRQ(evt2irq(0x8c0)),
  33 };
  34 
  35 static struct platform_device scif0_device = {
  36         .name           = "sh-sci",
  37         .id             = 0,
  38         .resource       = scif0_resources,
  39         .num_resources  = ARRAY_SIZE(scif0_resources),
  40         .dev            = {
  41                 .platform_data  = &scif0_platform_data,
  42         },
  43 };
  44 
  45 static struct plat_sci_port scif1_platform_data = {
  46         .scscr          = SCSCR_REIE,
  47         .type           = PORT_SCIF,
  48         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
  49 };
  50 
  51 static struct resource scif1_resources[] = {
  52         DEFINE_RES_MEM(0xffe41000, 0x100),
  53         DEFINE_RES_IRQ(evt2irq(0x8e0)),
  54 };
  55 
  56 static struct platform_device scif1_device = {
  57         .name           = "sh-sci",
  58         .id             = 1,
  59         .resource       = scif1_resources,
  60         .num_resources  = ARRAY_SIZE(scif1_resources),
  61         .dev            = {
  62                 .platform_data = &scif1_platform_data,
  63         },
  64 };
  65 
  66 static struct plat_sci_port scif2_platform_data = {
  67         .scscr          = SCSCR_REIE,
  68         .type           = PORT_SCIF,
  69         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
  70 };
  71 
  72 static struct resource scif2_resources[] = {
  73         DEFINE_RES_MEM(0xffe42000, 0x100),
  74         DEFINE_RES_IRQ(evt2irq(0x900)),
  75 };
  76 
  77 static struct platform_device scif2_device = {
  78         .name           = "sh-sci",
  79         .id             = 2,
  80         .resource       = scif2_resources,
  81         .num_resources  = ARRAY_SIZE(scif2_resources),
  82         .dev            = {
  83                 .platform_data = &scif2_platform_data,
  84         },
  85 };
  86 
  87 static struct plat_sci_port scif3_platform_data = {
  88         .scscr          = SCSCR_REIE | SCSCR_TOIE,
  89         .type           = PORT_SCIF,
  90         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
  91 };
  92 
  93 static struct resource scif3_resources[] = {
  94         DEFINE_RES_MEM(0xffe43000, 0x100),
  95         DEFINE_RES_IRQ(evt2irq(0x920)),
  96 };
  97 
  98 static struct platform_device scif3_device = {
  99         .name           = "sh-sci",
 100         .id             = 3,
 101         .resource       = scif3_resources,
 102         .num_resources  = ARRAY_SIZE(scif3_resources),
 103         .dev            = {
 104                 .platform_data  = &scif3_platform_data,
 105         },
 106 };
 107 
 108 static struct plat_sci_port scif4_platform_data = {
 109         .scscr          = SCSCR_REIE,
 110         .type           = PORT_SCIF,
 111         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
 112 };
 113 
 114 static struct resource scif4_resources[] = {
 115         DEFINE_RES_MEM(0xffe44000, 0x100),
 116         DEFINE_RES_IRQ(evt2irq(0x940)),
 117 };
 118 
 119 static struct platform_device scif4_device = {
 120         .name           = "sh-sci",
 121         .id             = 4,
 122         .resource       = scif4_resources,
 123         .num_resources  = ARRAY_SIZE(scif4_resources),
 124         .dev            = {
 125                 .platform_data  = &scif4_platform_data,
 126         },
 127 };
 128 
 129 static struct plat_sci_port scif5_platform_data = {
 130         .scscr          = SCSCR_REIE,
 131         .type           = PORT_SCIF,
 132         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
 133 };
 134 
 135 static struct resource scif5_resources[] = {
 136         DEFINE_RES_MEM(0xffe43000, 0x100),
 137         DEFINE_RES_IRQ(evt2irq(0x960)),
 138 };
 139 
 140 static struct platform_device scif5_device = {
 141         .name           = "sh-sci",
 142         .id             = 5,
 143         .resource       = scif5_resources,
 144         .num_resources  = ARRAY_SIZE(scif5_resources),
 145         .dev            = {
 146                 .platform_data  = &scif5_platform_data,
 147         },
 148 };
 149 
 150 /* RTC */
 151 static struct resource rtc_resources[] = {
 152         [0] = {
 153                 .name   = "rtc",
 154                 .start  = 0xFFFC5000,
 155                 .end    = 0xFFFC5000 + 0x26 - 1,
 156                 .flags  = IORESOURCE_IO,
 157         },
 158         [1] = {
 159                 .start  = evt2irq(0xC00),
 160                 .flags  = IORESOURCE_IRQ,
 161         },
 162 };
 163 
 164 static struct platform_device rtc_device = {
 165         .name           = "sh-rtc",
 166         .id             = -1,
 167         .num_resources  = ARRAY_SIZE(rtc_resources),
 168         .resource       = rtc_resources,
 169 };
 170 
 171 /* I2C 0 */
 172 static struct resource i2c0_resources[] = {
 173         [0] = {
 174                 .name   = "IIC0",
 175                 .start  = 0xFFC70000,
 176                 .end    = 0xFFC7000A - 1,
 177                 .flags  = IORESOURCE_MEM,
 178         },
 179         [1] = {
 180                 .start  = evt2irq(0x860),
 181                 .flags  = IORESOURCE_IRQ,
 182         },
 183 };
 184 
 185 static struct platform_device i2c0_device = {
 186         .name           = "i2c-sh7734",
 187         .id             = 0,
 188         .num_resources  = ARRAY_SIZE(i2c0_resources),
 189         .resource       = i2c0_resources,
 190 };
 191 
 192 /* TMU */
 193 static struct sh_timer_config tmu0_platform_data = {
 194         .channels_mask = 7,
 195 };
 196 
 197 static struct resource tmu0_resources[] = {
 198         DEFINE_RES_MEM(0xffd80000, 0x30),
 199         DEFINE_RES_IRQ(evt2irq(0x400)),
 200         DEFINE_RES_IRQ(evt2irq(0x420)),
 201         DEFINE_RES_IRQ(evt2irq(0x440)),
 202 };
 203 
 204 static struct platform_device tmu0_device = {
 205         .name           = "sh-tmu",
 206         .id             = 0,
 207         .dev = {
 208                 .platform_data  = &tmu0_platform_data,
 209         },
 210         .resource       = tmu0_resources,
 211         .num_resources  = ARRAY_SIZE(tmu0_resources),
 212 };
 213 
 214 static struct sh_timer_config tmu1_platform_data = {
 215         .channels_mask = 7,
 216 };
 217 
 218 static struct resource tmu1_resources[] = {
 219         DEFINE_RES_MEM(0xffd81000, 0x30),
 220         DEFINE_RES_IRQ(evt2irq(0x480)),
 221         DEFINE_RES_IRQ(evt2irq(0x4a0)),
 222         DEFINE_RES_IRQ(evt2irq(0x4c0)),
 223 };
 224 
 225 static struct platform_device tmu1_device = {
 226         .name           = "sh-tmu",
 227         .id             = 1,
 228         .dev = {
 229                 .platform_data  = &tmu1_platform_data,
 230         },
 231         .resource       = tmu1_resources,
 232         .num_resources  = ARRAY_SIZE(tmu1_resources),
 233 };
 234 
 235 static struct sh_timer_config tmu2_platform_data = {
 236         .channels_mask = 7,
 237 };
 238 
 239 static struct resource tmu2_resources[] = {
 240         DEFINE_RES_MEM(0xffd82000, 0x30),
 241         DEFINE_RES_IRQ(evt2irq(0x500)),
 242         DEFINE_RES_IRQ(evt2irq(0x520)),
 243         DEFINE_RES_IRQ(evt2irq(0x540)),
 244 };
 245 
 246 static struct platform_device tmu2_device = {
 247         .name           = "sh-tmu",
 248         .id             = 2,
 249         .dev = {
 250                 .platform_data  = &tmu2_platform_data,
 251         },
 252         .resource       = tmu2_resources,
 253         .num_resources  = ARRAY_SIZE(tmu2_resources),
 254 };
 255 
 256 static struct platform_device *sh7734_devices[] __initdata = {
 257         &scif0_device,
 258         &scif1_device,
 259         &scif2_device,
 260         &scif3_device,
 261         &scif4_device,
 262         &scif5_device,
 263         &tmu0_device,
 264         &tmu1_device,
 265         &tmu2_device,
 266         &rtc_device,
 267 };
 268 
 269 static struct platform_device *sh7734_early_devices[] __initdata = {
 270         &scif0_device,
 271         &scif1_device,
 272         &scif2_device,
 273         &scif3_device,
 274         &scif4_device,
 275         &scif5_device,
 276         &tmu0_device,
 277         &tmu1_device,
 278         &tmu2_device,
 279 };
 280 
 281 void __init plat_early_device_setup(void)
 282 {
 283         early_platform_add_devices(sh7734_early_devices,
 284                 ARRAY_SIZE(sh7734_early_devices));
 285 }
 286 
 287 #define GROUP 0
 288 enum {
 289         UNUSED = 0,
 290 
 291         /* interrupt sources */
 292 
 293         IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
 294         IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
 295         IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
 296         IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
 297 
 298         IRQ0, IRQ1, IRQ2, IRQ3,
 299         DU,
 300         TMU00, TMU10, TMU20, TMU21,
 301         TMU30, TMU40, TMU50, TMU51,
 302         TMU60, TMU70, TMU80,
 303         RESET_WDT,
 304         USB,
 305         HUDI,
 306         SHDMAC,
 307         SSI0, SSI1,     SSI2, SSI3,
 308         VIN0,
 309         RGPVG,
 310         _2DG,
 311         MMC,
 312         HSPI,
 313         LBSCATA,
 314         I2C0,
 315         RCAN0,
 316         MIMLB,
 317         SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
 318         LBSCDMAC0, LBSCDMAC1, LBSCDMAC2,
 319         RCAN1,
 320         SDHI0, SDHI1,
 321         IEBUS,
 322         HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22, HPBDMAC23_25_27_28,
 323         RTC,
 324         VIN1,
 325         LCDC,
 326         SRC0, SRC1,
 327         GETHER,
 328         SDHI2,
 329         GPIO0_3, GPIO4_5,
 330         STIF0, STIF1,
 331         ADMAC,
 332         HIF,
 333         FLCTL,
 334         ADC,
 335         MTU2,
 336         RSPI,
 337         QSPI,
 338         HSCIF,
 339         VEU3F_VE3,
 340 
 341         /* Group */
 342         /* Mask */
 343         STIF_M,
 344         GPIO_M,
 345         HPBDMAC_M,
 346         LBSCDMAC_M,
 347         RCAN_M,
 348         SRC_M,
 349         SCIF_M,
 350         LCDC_M,
 351         _2DG_M,
 352         VIN_M,
 353         TMU_3_M,
 354         TMU_0_M,
 355 
 356         /* Priority */
 357         RCAN_P,
 358         LBSCDMAC_P,
 359 
 360         /* Common */
 361         SDHI,
 362         SSI,
 363         SPI,
 364 };
 365 
 366 static struct intc_vect vectors[] __initdata = {
 367         INTC_VECT(DU, 0x3E0),
 368         INTC_VECT(TMU00, 0x400),
 369         INTC_VECT(TMU10, 0x420),
 370         INTC_VECT(TMU20, 0x440),
 371         INTC_VECT(TMU30, 0x480),
 372         INTC_VECT(TMU40, 0x4A0),
 373         INTC_VECT(TMU50, 0x4C0),
 374         INTC_VECT(TMU51, 0x4E0),
 375         INTC_VECT(TMU60, 0x500),
 376         INTC_VECT(TMU70, 0x520),
 377         INTC_VECT(TMU80, 0x540),
 378         INTC_VECT(RESET_WDT, 0x560),
 379         INTC_VECT(USB, 0x580),
 380         INTC_VECT(HUDI, 0x600),
 381         INTC_VECT(SHDMAC, 0x620),
 382         INTC_VECT(SSI0, 0x6C0),
 383         INTC_VECT(SSI1, 0x6E0),
 384         INTC_VECT(SSI2, 0x700),
 385         INTC_VECT(SSI3, 0x720),
 386         INTC_VECT(VIN0, 0x740),
 387         INTC_VECT(RGPVG, 0x760),
 388         INTC_VECT(_2DG, 0x780),
 389         INTC_VECT(MMC, 0x7A0),
 390         INTC_VECT(HSPI, 0x7E0),
 391         INTC_VECT(LBSCATA, 0x840),
 392         INTC_VECT(I2C0, 0x860),
 393         INTC_VECT(RCAN0, 0x880),
 394         INTC_VECT(SCIF0, 0x8A0),
 395         INTC_VECT(SCIF1, 0x8C0),
 396         INTC_VECT(SCIF2, 0x900),
 397         INTC_VECT(SCIF3, 0x920),
 398         INTC_VECT(SCIF4, 0x940),
 399         INTC_VECT(SCIF5, 0x960),
 400         INTC_VECT(LBSCDMAC0, 0x9E0),
 401         INTC_VECT(LBSCDMAC1, 0xA00),
 402         INTC_VECT(LBSCDMAC2, 0xA20),
 403         INTC_VECT(RCAN1, 0xA60),
 404         INTC_VECT(SDHI0, 0xAE0),
 405         INTC_VECT(SDHI1, 0xB00),
 406         INTC_VECT(IEBUS, 0xB20),
 407         INTC_VECT(HPBDMAC0_3, 0xB60),
 408         INTC_VECT(HPBDMAC4_10, 0xB80),
 409         INTC_VECT(HPBDMAC11_18, 0xBA0),
 410         INTC_VECT(HPBDMAC19_22, 0xBC0),
 411         INTC_VECT(HPBDMAC23_25_27_28, 0xBE0),
 412         INTC_VECT(RTC, 0xC00),
 413         INTC_VECT(VIN1, 0xC20),
 414         INTC_VECT(LCDC, 0xC40),
 415         INTC_VECT(SRC0, 0xC60),
 416         INTC_VECT(SRC1, 0xC80),
 417         INTC_VECT(GETHER, 0xCA0),
 418         INTC_VECT(SDHI2, 0xCC0),
 419         INTC_VECT(GPIO0_3, 0xCE0),
 420         INTC_VECT(GPIO4_5, 0xD00),
 421         INTC_VECT(STIF0, 0xD20),
 422         INTC_VECT(STIF1, 0xD40),
 423         INTC_VECT(ADMAC, 0xDA0),
 424         INTC_VECT(HIF, 0xDC0),
 425         INTC_VECT(FLCTL, 0xDE0),
 426         INTC_VECT(ADC, 0xE00),
 427         INTC_VECT(MTU2, 0xE20),
 428         INTC_VECT(RSPI, 0xE40),
 429         INTC_VECT(QSPI, 0xE60),
 430         INTC_VECT(HSCIF, 0xFC0),
 431         INTC_VECT(VEU3F_VE3, 0xF40),
 432 };
 433 
 434 static struct intc_group groups[] __initdata = {
 435         /* Common */
 436         INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2),
 437         INTC_GROUP(SPI, HSPI, RSPI, QSPI),
 438         INTC_GROUP(SSI, SSI0, SSI1, SSI2, SSI3),
 439 
 440         /* Mask group */
 441         INTC_GROUP(STIF_M, STIF0, STIF1), /* 22 */
 442         INTC_GROUP(GPIO_M, GPIO0_3, GPIO4_5), /* 21 */
 443         INTC_GROUP(HPBDMAC_M, HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18,
 444                         HPBDMAC19_22, HPBDMAC23_25_27_28), /* 19 */
 445         INTC_GROUP(LBSCDMAC_M, LBSCDMAC0, LBSCDMAC1, LBSCDMAC2), /* 18 */
 446         INTC_GROUP(RCAN_M, RCAN0, RCAN1, IEBUS), /* 17 */
 447         INTC_GROUP(SRC_M, SRC0, SRC1), /* 16 */
 448         INTC_GROUP(SCIF_M, SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
 449                         HSCIF), /* 14 */
 450         INTC_GROUP(LCDC_M, LCDC, MIMLB), /* 13 */
 451         INTC_GROUP(_2DG_M, _2DG, RGPVG), /* 12 */
 452         INTC_GROUP(VIN_M, VIN0, VIN1), /* 10 */
 453         INTC_GROUP(TMU_3_M, TMU30, TMU40, TMU50, TMU51,
 454                         TMU60, TMU60, TMU70, TMU80), /* 2 */
 455         INTC_GROUP(TMU_0_M, TMU00, TMU10, TMU20, TMU21), /* 1 */
 456 
 457         /* Priority group*/
 458         INTC_GROUP(RCAN_P, RCAN0, RCAN1), /* INT2PRI5 */
 459         INTC_GROUP(LBSCDMAC_P, LBSCDMAC0, LBSCDMAC1), /* INT2PRI5 */
 460 };
 461 
 462 static struct intc_mask_reg mask_registers[] __initdata = {
 463         { 0xFF804040, 0xFF804044, 32, /* INT2MSKRG / INT2MSKCR */
 464           { 0,
 465                 VEU3F_VE3,
 466                 SDHI, /* SDHI 0-2 */
 467                 ADMAC,
 468                 FLCTL,
 469                 RESET_WDT,
 470                 HIF,
 471                 ADC,
 472                 MTU2,
 473                 STIF_M, /* STIF 0,1 */
 474                 GPIO_M, /* GPIO 0-5*/
 475                 GETHER,
 476                 HPBDMAC_M, /* HPBDMAC 0_3 - 23_25_27_28 */
 477                 LBSCDMAC_M, /* LBSCDMAC 0 - 2 */
 478                 RCAN_M, /* RCAN, IEBUS */
 479                 SRC_M,  /* SRC 0,1 */
 480                 LBSCATA,
 481                 SCIF_M, /* SCIF 0-5, HSCIF */
 482                 LCDC_M, /* LCDC, MIMLB */
 483                 _2DG_M, /* 2DG, RGPVG */
 484                 SPI, /* HSPI, RSPI, QSPI */
 485                 VIN_M,  /* VIN0, 1 */
 486                 SSI,    /* SSI 0-3 */
 487                 USB,
 488                 SHDMAC,
 489                 HUDI,
 490                 MMC,
 491                 RTC,
 492                 I2C0, /* I2C */ /* I2C 0, 1*/
 493                 TMU_3_M, /* TMU30 - TMU80 */
 494                 TMU_0_M, /* TMU00 - TMU21 */
 495                 DU } },
 496 };
 497 
 498 static struct intc_prio_reg prio_registers[] __initdata = {
 499         { 0xFF804000, 0, 32, 8, /* INT2PRI0 */
 500                 { DU, TMU00, TMU10, TMU20 } },
 501         { 0xFF804004, 0, 32, 8, /* INT2PRI1 */
 502                 { TMU30, TMU60, RTC, SDHI } },
 503         { 0xFF804008, 0, 32, 8, /* INT2PRI2 */
 504                 { HUDI, SHDMAC, USB, SSI } },
 505         { 0xFF80400C, 0, 32, 8, /* INT2PRI3 */
 506                 { VIN0, SPI, _2DG, LBSCATA } },
 507         { 0xFF804010, 0, 32, 8, /* INT2PRI4 */
 508                 { SCIF0, SCIF3, HSCIF, LCDC } },
 509         { 0xFF804014, 0, 32, 8, /* INT2PRI5 */
 510                 { RCAN_P, LBSCDMAC_P, LBSCDMAC2, MMC } },
 511         { 0xFF804018, 0, 32, 8, /* INT2PRI6 */
 512                 { HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22 } },
 513         { 0xFF80401C, 0, 32, 8, /* INT2PRI7 */
 514                 { HPBDMAC23_25_27_28, I2C0, SRC0, SRC1 } },
 515         { 0xFF804020, 0, 32, 8, /* INT2PRI8 */
 516                 { 0 /* ADIF */, VIN1, RESET_WDT, HIF } },
 517         { 0xFF804024, 0, 32, 8, /* INT2PRI9 */
 518                 { ADMAC, FLCTL, GPIO0_3, GPIO4_5 } },
 519         { 0xFF804028, 0, 32, 8, /* INT2PRI10 */
 520                 { STIF0, STIF1, VEU3F_VE3, GETHER } },
 521         { 0xFF80402C, 0, 32, 8, /* INT2PRI11 */
 522                 { MTU2, RGPVG, MIMLB, IEBUS } },
 523 };
 524 
 525 static DECLARE_INTC_DESC(intc_desc, "sh7734", vectors, groups,
 526         mask_registers, prio_registers, NULL);
 527 
 528 /* Support for external interrupt pins in IRQ mode */
 529 
 530 static struct intc_vect irq3210_vectors[] __initdata = {
 531         INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
 532         INTC_VECT(IRQ2, 0x2C0), INTC_VECT(IRQ3, 0x300),
 533 };
 534 
 535 static struct intc_sense_reg irq3210_sense_registers[] __initdata = {
 536         { 0xFF80201C, 32, 2, /* ICR1 */
 537         { IRQ0, IRQ1, IRQ2, IRQ3, } },
 538 };
 539 
 540 static struct intc_mask_reg irq3210_ack_registers[] __initdata = {
 541         { 0xFF802024, 0, 32, /* INTREQ */
 542         { IRQ0, IRQ1, IRQ2, IRQ3, } },
 543 };
 544 
 545 static struct intc_mask_reg irq3210_mask_registers[] __initdata = {
 546         { 0xFF802044, 0xFF802064, 32, /* INTMSK0 / INTMSKCLR0 */
 547         { IRQ0, IRQ1, IRQ2, IRQ3, } },
 548 };
 549 
 550 static struct intc_prio_reg irq3210_prio_registers[] __initdata = {
 551         { 0xFF802010, 0, 32, 4, /* INTPRI */
 552         { IRQ0, IRQ1, IRQ2, IRQ3, } },
 553 };
 554 
 555 static DECLARE_INTC_DESC_ACK(intc_desc_irq3210, "sh7734-irq3210",
 556         irq3210_vectors, NULL,
 557         irq3210_mask_registers, irq3210_prio_registers,
 558         irq3210_sense_registers, irq3210_ack_registers);
 559 
 560 /* External interrupt pins in IRL mode */
 561 
 562 static struct intc_vect vectors_irl3210[] __initdata = {
 563         INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
 564         INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
 565         INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
 566         INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
 567         INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
 568         INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
 569         INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
 570         INTC_VECT(IRL0_HHHL, 0x3c0),
 571 };
 572 
 573 static DECLARE_INTC_DESC(intc_desc_irl3210, "sh7734-irl3210",
 574         vectors_irl3210, NULL, mask_registers, NULL, NULL);
 575 
 576 #define INTC_ICR0               0xFF802000
 577 #define INTC_INTMSK0    0xFF802044
 578 #define INTC_INTMSK1    0xFF802048
 579 #define INTC_INTMSKCLR0 0xFF802064
 580 #define INTC_INTMSKCLR1 0xFF802068
 581 
 582 void __init plat_irq_setup(void)
 583 {
 584         /* disable IRQ3-0 */
 585         __raw_writel(0xF0000000, INTC_INTMSK0);
 586 
 587         /* disable IRL3-0 */
 588         __raw_writel(0x80000000, INTC_INTMSK1);
 589 
 590         /* select IRL mode for IRL3-0 */
 591         __raw_writel(__raw_readl(INTC_ICR0) & ~0x00800000, INTC_ICR0);
 592 
 593         /* disable holding function, ie enable "SH-4 Mode (LVLMODE)" */
 594         __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
 595 
 596         register_intc_controller(&intc_desc);
 597 }
 598 
 599 void __init plat_irq_setup_pins(int mode)
 600 {
 601         switch (mode) {
 602         case IRQ_MODE_IRQ3210:
 603                 /* select IRQ mode for IRL3-0 */
 604                 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
 605                 register_intc_controller(&intc_desc_irq3210);
 606                 break;
 607         case IRQ_MODE_IRL3210:
 608                 /* enable IRL0-3 but don't provide any masking */
 609                 __raw_writel(0x80000000, INTC_INTMSKCLR1);
 610                 __raw_writel(0xf0000000, INTC_INTMSKCLR0);
 611                 break;
 612         case IRQ_MODE_IRL3210_MASK:
 613                 /* enable IRL0-3 and mask using cpu intc controller */
 614                 __raw_writel(0x80000000, INTC_INTMSKCLR0);
 615                 register_intc_controller(&intc_desc_irl3210);
 616                 break;
 617         default:
 618                 BUG();
 619         }
 620 }

/* [<][>][^][v][top][bottom][index][help] */