linux/arch/sh/boards/mach-x3proto/setup.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * arch/sh/boards/mach-x3proto/setup.c
   4 *
   5 * Renesas SH-X3 Prototype Board Support.
   6 *
   7 * Copyright (C) 2007 - 2010  Paul Mundt
   8 */
   9#include <linux/init.h>
  10#include <linux/platform_device.h>
  11#include <linux/kernel.h>
  12#include <linux/io.h>
  13#include <linux/smc91x.h>
  14#include <linux/irq.h>
  15#include <linux/interrupt.h>
  16#include <linux/input.h>
  17#include <linux/usb/r8a66597.h>
  18#include <linux/usb/m66592.h>
  19#include <linux/gpio.h>
  20#include <linux/gpio_keys.h>
  21#include <mach/ilsel.h>
  22#include <mach/hardware.h>
  23#include <asm/smp-ops.h>
  24
  25static struct resource heartbeat_resources[] = {
  26        [0] = {
  27                .start  = 0xb8140020,
  28                .end    = 0xb8140020,
  29                .flags  = IORESOURCE_MEM,
  30        },
  31};
  32
  33static struct platform_device heartbeat_device = {
  34        .name           = "heartbeat",
  35        .id             = -1,
  36        .num_resources  = ARRAY_SIZE(heartbeat_resources),
  37        .resource       = heartbeat_resources,
  38};
  39
  40static struct smc91x_platdata smc91x_info = {
  41        .flags  = SMC91X_USE_16BIT | SMC91X_NOWAIT,
  42};
  43
  44static struct resource smc91x_resources[] = {
  45        [0] = {
  46                .start          = 0x18000300,
  47                .end            = 0x18000300 + 0x10 - 1,
  48                .flags          = IORESOURCE_MEM,
  49        },
  50        [1] = {
  51                /* Filled in by ilsel */
  52                .flags          = IORESOURCE_IRQ,
  53        },
  54};
  55
  56static struct platform_device smc91x_device = {
  57        .name           = "smc91x",
  58        .id             = -1,
  59        .resource       = smc91x_resources,
  60        .num_resources  = ARRAY_SIZE(smc91x_resources),
  61        .dev    = {
  62                .platform_data = &smc91x_info,
  63        },
  64};
  65
  66static struct r8a66597_platdata r8a66597_data = {
  67        .xtal = R8A66597_PLATDATA_XTAL_12MHZ,
  68        .vif = 1,
  69};
  70
  71static struct resource r8a66597_usb_host_resources[] = {
  72        [0] = {
  73                .start  = 0x18040000,
  74                .end    = 0x18080000 - 1,
  75                .flags  = IORESOURCE_MEM,
  76        },
  77        [1] = {
  78                /* Filled in by ilsel */
  79                .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
  80        },
  81};
  82
  83static struct platform_device r8a66597_usb_host_device = {
  84        .name           = "r8a66597_hcd",
  85        .id             = -1,
  86        .dev = {
  87                .dma_mask               = NULL,         /* don't use dma */
  88                .coherent_dma_mask      = 0xffffffff,
  89                .platform_data          = &r8a66597_data,
  90        },
  91        .num_resources  = ARRAY_SIZE(r8a66597_usb_host_resources),
  92        .resource       = r8a66597_usb_host_resources,
  93};
  94
  95static struct m66592_platdata usbf_platdata = {
  96        .xtal = M66592_PLATDATA_XTAL_24MHZ,
  97        .vif = 1,
  98};
  99
 100static struct resource m66592_usb_peripheral_resources[] = {
 101        [0] = {
 102                .name   = "m66592_udc",
 103                .start  = 0x18080000,
 104                .end    = 0x180c0000 - 1,
 105                .flags  = IORESOURCE_MEM,
 106        },
 107        [1] = {
 108                .name   = "m66592_udc",
 109                /* Filled in by ilsel */
 110                .flags  = IORESOURCE_IRQ,
 111        },
 112};
 113
 114static struct platform_device m66592_usb_peripheral_device = {
 115        .name           = "m66592_udc",
 116        .id             = -1,
 117        .dev = {
 118                .dma_mask               = NULL,         /* don't use dma */
 119                .coherent_dma_mask      = 0xffffffff,
 120                .platform_data          = &usbf_platdata,
 121        },
 122        .num_resources  = ARRAY_SIZE(m66592_usb_peripheral_resources),
 123        .resource       = m66592_usb_peripheral_resources,
 124};
 125
 126static struct gpio_keys_button baseboard_buttons[NR_BASEBOARD_GPIOS] = {
 127        {
 128                .desc           = "key44",
 129                .code           = KEY_POWER,
 130                .active_low     = 1,
 131                .wakeup         = 1,
 132        }, {
 133                .desc           = "key43",
 134                .code           = KEY_SUSPEND,
 135                .active_low     = 1,
 136                .wakeup         = 1,
 137        }, {
 138                .desc           = "key42",
 139                .code           = KEY_KATAKANAHIRAGANA,
 140                .active_low     = 1,
 141        }, {
 142                .desc           = "key41",
 143                .code           = KEY_SWITCHVIDEOMODE,
 144                .active_low     = 1,
 145        }, {
 146                .desc           = "key34",
 147                .code           = KEY_F12,
 148                .active_low     = 1,
 149        }, {
 150                .desc           = "key33",
 151                .code           = KEY_F11,
 152                .active_low     = 1,
 153        }, {
 154                .desc           = "key32",
 155                .code           = KEY_F10,
 156                .active_low     = 1,
 157        }, {
 158                .desc           = "key31",
 159                .code           = KEY_F9,
 160                .active_low     = 1,
 161        }, {
 162                .desc           = "key24",
 163                .code           = KEY_F8,
 164                .active_low     = 1,
 165        }, {
 166                .desc           = "key23",
 167                .code           = KEY_F7,
 168                .active_low     = 1,
 169        }, {
 170                .desc           = "key22",
 171                .code           = KEY_F6,
 172                .active_low     = 1,
 173        }, {
 174                .desc           = "key21",
 175                .code           = KEY_F5,
 176                .active_low     = 1,
 177        }, {
 178                .desc           = "key14",
 179                .code           = KEY_F4,
 180                .active_low     = 1,
 181        }, {
 182                .desc           = "key13",
 183                .code           = KEY_F3,
 184                .active_low     = 1,
 185        }, {
 186                .desc           = "key12",
 187                .code           = KEY_F2,
 188                .active_low     = 1,
 189        }, {
 190                .desc           = "key11",
 191                .code           = KEY_F1,
 192                .active_low     = 1,
 193        },
 194};
 195
 196static struct gpio_keys_platform_data baseboard_buttons_data = {
 197        .buttons        = baseboard_buttons,
 198        .nbuttons       = ARRAY_SIZE(baseboard_buttons),
 199};
 200
 201static struct platform_device baseboard_buttons_device = {
 202        .name           = "gpio-keys",
 203        .id             = -1,
 204        .dev            = {
 205                .platform_data  = &baseboard_buttons_data,
 206        },
 207};
 208
 209static struct platform_device *x3proto_devices[] __initdata = {
 210        &heartbeat_device,
 211        &smc91x_device,
 212        &r8a66597_usb_host_device,
 213        &m66592_usb_peripheral_device,
 214        &baseboard_buttons_device,
 215};
 216
 217static void __init x3proto_init_irq(void)
 218{
 219        plat_irq_setup_pins(IRQ_MODE_IRL3210);
 220
 221        /* Set ICR0.LVLMODE */
 222        __raw_writel(__raw_readl(0xfe410000) | (1 << 21), 0xfe410000);
 223}
 224
 225static int __init x3proto_devices_setup(void)
 226{
 227        int ret, i;
 228
 229        /*
 230         * IRLs are only needed for ILSEL mappings, so flip over the INTC
 231         * pins at a later point to enable the GPIOs to settle.
 232         */
 233        x3proto_init_irq();
 234
 235        /*
 236         * Now that ILSELs are available, set up the baseboard GPIOs.
 237         */
 238        ret = x3proto_gpio_setup();
 239        if (unlikely(ret))
 240                return ret;
 241
 242        /*
 243         * Propagate dynamic GPIOs for the baseboard button device.
 244         */
 245        for (i = 0; i < ARRAY_SIZE(baseboard_buttons); i++)
 246                baseboard_buttons[i].gpio = x3proto_gpio_chip.base + i;
 247
 248        r8a66597_usb_host_resources[1].start =
 249                r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I);
 250
 251        m66592_usb_peripheral_resources[1].start =
 252                m66592_usb_peripheral_resources[1].end = ilsel_enable(ILSEL_USBP_I);
 253
 254        smc91x_resources[1].start =
 255                smc91x_resources[1].end = ilsel_enable(ILSEL_LAN);
 256
 257        return platform_add_devices(x3proto_devices,
 258                                    ARRAY_SIZE(x3proto_devices));
 259}
 260device_initcall(x3proto_devices_setup);
 261
 262static void __init x3proto_setup(char **cmdline_p)
 263{
 264        register_smp_ops(&shx3_smp_ops);
 265}
 266
 267static struct sh_machine_vector mv_x3proto __initmv = {
 268        .mv_name                = "x3proto",
 269        .mv_setup               = x3proto_setup,
 270};
 271