linux/arch/m32r/platforms/opsput/setup.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/m32r/platforms/opsput/setup.c
   3 *
   4 *  Setup routines for Renesas OPSPUT Board
   5 *
   6 *  Copyright (c) 2002-2005
   7 *      Hiroyuki Kondo, Hirokazu Takata,
   8 *      Hitoshi Yamamoto, Takeo Takahashi, Mamoru Sakugawa
   9 *
  10 *  This file is subject to the terms and conditions of the GNU General
  11 *  Public License.  See the file "COPYING" in the main directory of this
  12 *  archive for more details.
  13 */
  14
  15#include <linux/irq.h>
  16#include <linux/kernel.h>
  17#include <linux/init.h>
  18#include <linux/platform_device.h>
  19
  20#include <asm/system.h>
  21#include <asm/m32r.h>
  22#include <asm/io.h>
  23
  24/*
  25 * OPSP Interrupt Control Unit (Level 1)
  26 */
  27#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))
  28
  29icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
  30
  31static void disable_opsput_irq(unsigned int irq)
  32{
  33        unsigned long port, data;
  34
  35        port = irq2port(irq);
  36        data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;
  37        outl(data, port);
  38}
  39
  40static void enable_opsput_irq(unsigned int irq)
  41{
  42        unsigned long port, data;
  43
  44        port = irq2port(irq);
  45        data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;
  46        outl(data, port);
  47}
  48
  49static void mask_and_ack_opsput(unsigned int irq)
  50{
  51        disable_opsput_irq(irq);
  52}
  53
  54static void end_opsput_irq(unsigned int irq)
  55{
  56        enable_opsput_irq(irq);
  57}
  58
  59static unsigned int startup_opsput_irq(unsigned int irq)
  60{
  61        enable_opsput_irq(irq);
  62        return (0);
  63}
  64
  65static void shutdown_opsput_irq(unsigned int irq)
  66{
  67        unsigned long port;
  68
  69        port = irq2port(irq);
  70        outl(M32R_ICUCR_ILEVEL7, port);
  71}
  72
  73static struct irq_chip opsput_irq_type =
  74{
  75        .typename = "OPSPUT-IRQ",
  76        .startup = startup_opsput_irq,
  77        .shutdown = shutdown_opsput_irq,
  78        .enable = enable_opsput_irq,
  79        .disable = disable_opsput_irq,
  80        .ack = mask_and_ack_opsput,
  81        .end = end_opsput_irq
  82};
  83
  84/*
  85 * Interrupt Control Unit of PLD on OPSPUT (Level 2)
  86 */
  87#define irq2pldirq(x)           ((x) - OPSPUT_PLD_IRQ_BASE)
  88#define pldirq2port(x)          (unsigned long)((int)PLD_ICUCR1 + \
  89                                 (((x) - 1) * sizeof(unsigned short)))
  90
  91typedef struct {
  92        unsigned short icucr;  /* ICU Control Register */
  93} pld_icu_data_t;
  94
  95static pld_icu_data_t pld_icu_data[OPSPUT_NUM_PLD_IRQ];
  96
  97static void disable_opsput_pld_irq(unsigned int irq)
  98{
  99        unsigned long port, data;
 100        unsigned int pldirq;
 101
 102        pldirq = irq2pldirq(irq);
 103//      disable_opsput_irq(M32R_IRQ_INT1);
 104        port = pldirq2port(pldirq);
 105        data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;
 106        outw(data, port);
 107}
 108
 109static void enable_opsput_pld_irq(unsigned int irq)
 110{
 111        unsigned long port, data;
 112        unsigned int pldirq;
 113
 114        pldirq = irq2pldirq(irq);
 115//      enable_opsput_irq(M32R_IRQ_INT1);
 116        port = pldirq2port(pldirq);
 117        data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;
 118        outw(data, port);
 119}
 120
 121static void mask_and_ack_opsput_pld(unsigned int irq)
 122{
 123        disable_opsput_pld_irq(irq);
 124//      mask_and_ack_opsput(M32R_IRQ_INT1);
 125}
 126
 127static void end_opsput_pld_irq(unsigned int irq)
 128{
 129        enable_opsput_pld_irq(irq);
 130        end_opsput_irq(M32R_IRQ_INT1);
 131}
 132
 133static unsigned int startup_opsput_pld_irq(unsigned int irq)
 134{
 135        enable_opsput_pld_irq(irq);
 136        return (0);
 137}
 138
 139static void shutdown_opsput_pld_irq(unsigned int irq)
 140{
 141        unsigned long port;
 142        unsigned int pldirq;
 143
 144        pldirq = irq2pldirq(irq);
 145//      shutdown_opsput_irq(M32R_IRQ_INT1);
 146        port = pldirq2port(pldirq);
 147        outw(PLD_ICUCR_ILEVEL7, port);
 148}
 149
 150static struct irq_chip opsput_pld_irq_type =
 151{
 152        .typename = "OPSPUT-PLD-IRQ",
 153        .startup = startup_opsput_pld_irq,
 154        .shutdown = shutdown_opsput_pld_irq,
 155        .enable = enable_opsput_pld_irq,
 156        .disable = disable_opsput_pld_irq,
 157        .ack = mask_and_ack_opsput_pld,
 158        .end = end_opsput_pld_irq
 159};
 160
 161/*
 162 * Interrupt Control Unit of PLD on OPSPUT-LAN (Level 2)
 163 */
 164#define irq2lanpldirq(x)        ((x) - OPSPUT_LAN_PLD_IRQ_BASE)
 165#define lanpldirq2port(x)       (unsigned long)((int)OPSPUT_LAN_ICUCR1 + \
 166                                 (((x) - 1) * sizeof(unsigned short)))
 167
 168static pld_icu_data_t lanpld_icu_data[OPSPUT_NUM_LAN_PLD_IRQ];
 169
 170static void disable_opsput_lanpld_irq(unsigned int irq)
 171{
 172        unsigned long port, data;
 173        unsigned int pldirq;
 174
 175        pldirq = irq2lanpldirq(irq);
 176        port = lanpldirq2port(pldirq);
 177        data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;
 178        outw(data, port);
 179}
 180
 181static void enable_opsput_lanpld_irq(unsigned int irq)
 182{
 183        unsigned long port, data;
 184        unsigned int pldirq;
 185
 186        pldirq = irq2lanpldirq(irq);
 187        port = lanpldirq2port(pldirq);
 188        data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;
 189        outw(data, port);
 190}
 191
 192static void mask_and_ack_opsput_lanpld(unsigned int irq)
 193{
 194        disable_opsput_lanpld_irq(irq);
 195}
 196
 197static void end_opsput_lanpld_irq(unsigned int irq)
 198{
 199        enable_opsput_lanpld_irq(irq);
 200        end_opsput_irq(M32R_IRQ_INT0);
 201}
 202
 203static unsigned int startup_opsput_lanpld_irq(unsigned int irq)
 204{
 205        enable_opsput_lanpld_irq(irq);
 206        return (0);
 207}
 208
 209static void shutdown_opsput_lanpld_irq(unsigned int irq)
 210{
 211        unsigned long port;
 212        unsigned int pldirq;
 213
 214        pldirq = irq2lanpldirq(irq);
 215        port = lanpldirq2port(pldirq);
 216        outw(PLD_ICUCR_ILEVEL7, port);
 217}
 218
 219static struct irq_chip opsput_lanpld_irq_type =
 220{
 221        .typename = "OPSPUT-PLD-LAN-IRQ",
 222        .startup = startup_opsput_lanpld_irq,
 223        .shutdown = shutdown_opsput_lanpld_irq,
 224        .enable = enable_opsput_lanpld_irq,
 225        .disable = disable_opsput_lanpld_irq,
 226        .ack = mask_and_ack_opsput_lanpld,
 227        .end = end_opsput_lanpld_irq
 228};
 229
 230/*
 231 * Interrupt Control Unit of PLD on OPSPUT-LCD (Level 2)
 232 */
 233#define irq2lcdpldirq(x)        ((x) - OPSPUT_LCD_PLD_IRQ_BASE)
 234#define lcdpldirq2port(x)       (unsigned long)((int)OPSPUT_LCD_ICUCR1 + \
 235                                 (((x) - 1) * sizeof(unsigned short)))
 236
 237static pld_icu_data_t lcdpld_icu_data[OPSPUT_NUM_LCD_PLD_IRQ];
 238
 239static void disable_opsput_lcdpld_irq(unsigned int irq)
 240{
 241        unsigned long port, data;
 242        unsigned int pldirq;
 243
 244        pldirq = irq2lcdpldirq(irq);
 245        port = lcdpldirq2port(pldirq);
 246        data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;
 247        outw(data, port);
 248}
 249
 250static void enable_opsput_lcdpld_irq(unsigned int irq)
 251{
 252        unsigned long port, data;
 253        unsigned int pldirq;
 254
 255        pldirq = irq2lcdpldirq(irq);
 256        port = lcdpldirq2port(pldirq);
 257        data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;
 258        outw(data, port);
 259}
 260
 261static void mask_and_ack_opsput_lcdpld(unsigned int irq)
 262{
 263        disable_opsput_lcdpld_irq(irq);
 264}
 265
 266static void end_opsput_lcdpld_irq(unsigned int irq)
 267{
 268        enable_opsput_lcdpld_irq(irq);
 269        end_opsput_irq(M32R_IRQ_INT2);
 270}
 271
 272static unsigned int startup_opsput_lcdpld_irq(unsigned int irq)
 273{
 274        enable_opsput_lcdpld_irq(irq);
 275        return (0);
 276}
 277
 278static void shutdown_opsput_lcdpld_irq(unsigned int irq)
 279{
 280        unsigned long port;
 281        unsigned int pldirq;
 282
 283        pldirq = irq2lcdpldirq(irq);
 284        port = lcdpldirq2port(pldirq);
 285        outw(PLD_ICUCR_ILEVEL7, port);
 286}
 287
 288static struct irq_chip opsput_lcdpld_irq_type =
 289{
 290        "OPSPUT-PLD-LCD-IRQ",
 291        startup_opsput_lcdpld_irq,
 292        shutdown_opsput_lcdpld_irq,
 293        enable_opsput_lcdpld_irq,
 294        disable_opsput_lcdpld_irq,
 295        mask_and_ack_opsput_lcdpld,
 296        end_opsput_lcdpld_irq
 297};
 298
 299void __init init_IRQ(void)
 300{
 301#if defined(CONFIG_SMC91X)
 302        /* INT#0: LAN controller on OPSPUT-LAN (SMC91C111)*/
 303        irq_desc[OPSPUT_LAN_IRQ_LAN].status = IRQ_DISABLED;
 304        irq_desc[OPSPUT_LAN_IRQ_LAN].chip = &opsput_lanpld_irq_type;
 305        irq_desc[OPSPUT_LAN_IRQ_LAN].action = 0;
 306        irq_desc[OPSPUT_LAN_IRQ_LAN].depth = 1; /* disable nested irq */
 307        lanpld_icu_data[irq2lanpldirq(OPSPUT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02;     /* "H" edge sense */
 308        disable_opsput_lanpld_irq(OPSPUT_LAN_IRQ_LAN);
 309#endif  /* CONFIG_SMC91X */
 310
 311        /* MFT2 : system timer */
 312        irq_desc[M32R_IRQ_MFT2].status = IRQ_DISABLED;
 313        irq_desc[M32R_IRQ_MFT2].chip = &opsput_irq_type;
 314        irq_desc[M32R_IRQ_MFT2].action = 0;
 315        irq_desc[M32R_IRQ_MFT2].depth = 1;
 316        icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;
 317        disable_opsput_irq(M32R_IRQ_MFT2);
 318
 319        /* SIO0 : receive */
 320        irq_desc[M32R_IRQ_SIO0_R].status = IRQ_DISABLED;
 321        irq_desc[M32R_IRQ_SIO0_R].chip = &opsput_irq_type;
 322        irq_desc[M32R_IRQ_SIO0_R].action = 0;
 323        irq_desc[M32R_IRQ_SIO0_R].depth = 1;
 324        icu_data[M32R_IRQ_SIO0_R].icucr = 0;
 325        disable_opsput_irq(M32R_IRQ_SIO0_R);
 326
 327        /* SIO0 : send */
 328        irq_desc[M32R_IRQ_SIO0_S].status = IRQ_DISABLED;
 329        irq_desc[M32R_IRQ_SIO0_S].chip = &opsput_irq_type;
 330        irq_desc[M32R_IRQ_SIO0_S].action = 0;
 331        irq_desc[M32R_IRQ_SIO0_S].depth = 1;
 332        icu_data[M32R_IRQ_SIO0_S].icucr = 0;
 333        disable_opsput_irq(M32R_IRQ_SIO0_S);
 334
 335        /* SIO1 : receive */
 336        irq_desc[M32R_IRQ_SIO1_R].status = IRQ_DISABLED;
 337        irq_desc[M32R_IRQ_SIO1_R].chip = &opsput_irq_type;
 338        irq_desc[M32R_IRQ_SIO1_R].action = 0;
 339        irq_desc[M32R_IRQ_SIO1_R].depth = 1;
 340        icu_data[M32R_IRQ_SIO1_R].icucr = 0;
 341        disable_opsput_irq(M32R_IRQ_SIO1_R);
 342
 343        /* SIO1 : send */
 344        irq_desc[M32R_IRQ_SIO1_S].status = IRQ_DISABLED;
 345        irq_desc[M32R_IRQ_SIO1_S].chip = &opsput_irq_type;
 346        irq_desc[M32R_IRQ_SIO1_S].action = 0;
 347        irq_desc[M32R_IRQ_SIO1_S].depth = 1;
 348        icu_data[M32R_IRQ_SIO1_S].icucr = 0;
 349        disable_opsput_irq(M32R_IRQ_SIO1_S);
 350
 351        /* DMA1 : */
 352        irq_desc[M32R_IRQ_DMA1].status = IRQ_DISABLED;
 353        irq_desc[M32R_IRQ_DMA1].chip = &opsput_irq_type;
 354        irq_desc[M32R_IRQ_DMA1].action = 0;
 355        irq_desc[M32R_IRQ_DMA1].depth = 1;
 356        icu_data[M32R_IRQ_DMA1].icucr = 0;
 357        disable_opsput_irq(M32R_IRQ_DMA1);
 358
 359#ifdef CONFIG_SERIAL_M32R_PLDSIO
 360        /* INT#1: SIO0 Receive on PLD */
 361        irq_desc[PLD_IRQ_SIO0_RCV].status = IRQ_DISABLED;
 362        irq_desc[PLD_IRQ_SIO0_RCV].chip = &opsput_pld_irq_type;
 363        irq_desc[PLD_IRQ_SIO0_RCV].action = 0;
 364        irq_desc[PLD_IRQ_SIO0_RCV].depth = 1;   /* disable nested irq */
 365        pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03;
 366        disable_opsput_pld_irq(PLD_IRQ_SIO0_RCV);
 367
 368        /* INT#1: SIO0 Send on PLD */
 369        irq_desc[PLD_IRQ_SIO0_SND].status = IRQ_DISABLED;
 370        irq_desc[PLD_IRQ_SIO0_SND].chip = &opsput_pld_irq_type;
 371        irq_desc[PLD_IRQ_SIO0_SND].action = 0;
 372        irq_desc[PLD_IRQ_SIO0_SND].depth = 1;   /* disable nested irq */
 373        pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03;
 374        disable_opsput_pld_irq(PLD_IRQ_SIO0_SND);
 375#endif  /* CONFIG_SERIAL_M32R_PLDSIO */
 376
 377        /* INT#1: CFC IREQ on PLD */
 378        irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED;
 379        irq_desc[PLD_IRQ_CFIREQ].chip = &opsput_pld_irq_type;
 380        irq_desc[PLD_IRQ_CFIREQ].action = 0;
 381        irq_desc[PLD_IRQ_CFIREQ].depth = 1;     /* disable nested irq */
 382        pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01;       /* 'L' level sense */
 383        disable_opsput_pld_irq(PLD_IRQ_CFIREQ);
 384
 385        /* INT#1: CFC Insert on PLD */
 386        irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED;
 387        irq_desc[PLD_IRQ_CFC_INSERT].chip = &opsput_pld_irq_type;
 388        irq_desc[PLD_IRQ_CFC_INSERT].action = 0;
 389        irq_desc[PLD_IRQ_CFC_INSERT].depth = 1; /* disable nested irq */
 390        pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00;   /* 'L' edge sense */
 391        disable_opsput_pld_irq(PLD_IRQ_CFC_INSERT);
 392
 393        /* INT#1: CFC Eject on PLD */
 394        irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED;
 395        irq_desc[PLD_IRQ_CFC_EJECT].chip = &opsput_pld_irq_type;
 396        irq_desc[PLD_IRQ_CFC_EJECT].action = 0;
 397        irq_desc[PLD_IRQ_CFC_EJECT].depth = 1;  /* disable nested irq */
 398        pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02;    /* 'H' edge sense */
 399        disable_opsput_pld_irq(PLD_IRQ_CFC_EJECT);
 400
 401        /*
 402         * INT0# is used for LAN, DIO
 403         * We enable it here.
 404         */
 405        icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11;
 406        enable_opsput_irq(M32R_IRQ_INT0);
 407
 408        /*
 409         * INT1# is used for UART, MMC, CF Controller in FPGA.
 410         * We enable it here.
 411         */
 412        icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11;
 413        enable_opsput_irq(M32R_IRQ_INT1);
 414
 415#if defined(CONFIG_USB)
 416        outw(USBCR_OTGS, USBCR);        /* USBCR: non-OTG */
 417
 418    irq_desc[OPSPUT_LCD_IRQ_USB_INT1].status = IRQ_DISABLED;
 419    irq_desc[OPSPUT_LCD_IRQ_USB_INT1].chip = &opsput_lcdpld_irq_type;
 420    irq_desc[OPSPUT_LCD_IRQ_USB_INT1].action = 0;
 421    irq_desc[OPSPUT_LCD_IRQ_USB_INT1].depth = 1;
 422    lcdpld_icu_data[irq2lcdpldirq(OPSPUT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01;    /* "L" level sense */
 423    disable_opsput_lcdpld_irq(OPSPUT_LCD_IRQ_USB_INT1);
 424#endif
 425        /*
 426         * INT2# is used for BAT, USB, AUDIO
 427         * We enable it here.
 428         */
 429        icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01;
 430        enable_opsput_irq(M32R_IRQ_INT2);
 431
 432#if defined(CONFIG_VIDEO_M32R_AR)
 433        /*
 434         * INT3# is used for AR
 435         */
 436        irq_desc[M32R_IRQ_INT3].status = IRQ_DISABLED;
 437        irq_desc[M32R_IRQ_INT3].chip = &opsput_irq_type;
 438        irq_desc[M32R_IRQ_INT3].action = 0;
 439        irq_desc[M32R_IRQ_INT3].depth = 1;
 440        icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
 441        disable_opsput_irq(M32R_IRQ_INT3);
 442#endif /* CONFIG_VIDEO_M32R_AR */
 443}
 444
 445#if defined(CONFIG_SMC91X)
 446
 447#define LAN_IOSTART     0x300
 448#define LAN_IOEND       0x320
 449static struct resource smc91x_resources[] = {
 450        [0] = {
 451                .start  = (LAN_IOSTART),
 452                .end    = (LAN_IOEND),
 453                .flags  = IORESOURCE_MEM,
 454        },
 455        [1] = {
 456                .start  = OPSPUT_LAN_IRQ_LAN,
 457                .end    = OPSPUT_LAN_IRQ_LAN,
 458                .flags  = IORESOURCE_IRQ,
 459        }
 460};
 461
 462static struct platform_device smc91x_device = {
 463        .name           = "smc91x",
 464        .id             = 0,
 465        .num_resources  = ARRAY_SIZE(smc91x_resources),
 466        .resource       = smc91x_resources,
 467};
 468#endif
 469
 470#if defined(CONFIG_FB_S1D13XXX)
 471
 472#include <video/s1d13xxxfb.h>
 473#include <asm/s1d13806.h>
 474
 475static struct s1d13xxxfb_pdata s1d13xxxfb_data = {
 476        .initregs               = s1d13xxxfb_initregs,
 477        .initregssize           = ARRAY_SIZE(s1d13xxxfb_initregs),
 478        .platform_init_video    = NULL,
 479#ifdef CONFIG_PM
 480        .platform_suspend_video = NULL,
 481        .platform_resume_video  = NULL,
 482#endif
 483};
 484
 485static struct resource s1d13xxxfb_resources[] = {
 486        [0] = {
 487                .start  = 0x10600000UL,
 488                .end    = 0x1073FFFFUL,
 489                .flags  = IORESOURCE_MEM,
 490        },
 491        [1] = {
 492                .start  = 0x10400000UL,
 493                .end    = 0x104001FFUL,
 494                .flags  = IORESOURCE_MEM,
 495        }
 496};
 497
 498static struct platform_device s1d13xxxfb_device = {
 499        .name           = S1D_DEVICENAME,
 500        .id             = 0,
 501        .dev            = {
 502                .platform_data  = &s1d13xxxfb_data,
 503        },
 504        .num_resources  = ARRAY_SIZE(s1d13xxxfb_resources),
 505        .resource       = s1d13xxxfb_resources,
 506};
 507#endif
 508
 509static int __init platform_init(void)
 510{
 511#if defined(CONFIG_SMC91X)
 512        platform_device_register(&smc91x_device);
 513#endif
 514#if defined(CONFIG_FB_S1D13XXX)
 515        platform_device_register(&s1d13xxxfb_device);
 516#endif
 517        return 0;
 518}
 519arch_initcall(platform_init);
 520