linux/arch/arm/mach-shmobile/board-armadillo800eva.c
<<
>>
Prefs
   1/*
   2 * armadillo 800 eva board support
   3 *
   4 * Copyright (C) 2012 Renesas Solutions Corp.
   5 * Copyright (C) 2012 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; version 2 of the License.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  19 *
  20 */
  21
  22#include <linux/clk.h>
  23#include <linux/delay.h>
  24#include <linux/err.h>
  25#include <linux/kernel.h>
  26#include <linux/input.h>
  27#include <linux/platform_data/st1232_pdata.h>
  28#include <linux/irq.h>
  29#include <linux/platform_device.h>
  30#include <linux/gpio.h>
  31#include <linux/gpio_keys.h>
  32#include <linux/regulator/driver.h>
  33#include <linux/pinctrl/machine.h>
  34#include <linux/platform_data/pwm-renesas-tpu.h>
  35#include <linux/pwm_backlight.h>
  36#include <linux/regulator/fixed.h>
  37#include <linux/regulator/gpio-regulator.h>
  38#include <linux/regulator/machine.h>
  39#include <linux/sh_eth.h>
  40#include <linux/videodev2.h>
  41#include <linux/usb/renesas_usbhs.h>
  42#include <linux/mfd/tmio.h>
  43#include <linux/mmc/host.h>
  44#include <linux/mmc/sh_mmcif.h>
  45#include <linux/mmc/sh_mobile_sdhi.h>
  46#include <linux/i2c-gpio.h>
  47#include <linux/reboot.h>
  48#include <mach/common.h>
  49#include <mach/irqs.h>
  50#include <mach/r8a7740.h>
  51#include <media/mt9t112.h>
  52#include <media/sh_mobile_ceu.h>
  53#include <media/soc_camera.h>
  54#include <asm/page.h>
  55#include <asm/mach-types.h>
  56#include <asm/mach/arch.h>
  57#include <asm/mach/map.h>
  58#include <asm/mach/time.h>
  59#include <asm/hardware/cache-l2x0.h>
  60#include <video/sh_mobile_lcdc.h>
  61#include <video/sh_mobile_hdmi.h>
  62#include <sound/sh_fsi.h>
  63#include <sound/simple_card.h>
  64
  65#include "sh-gpio.h"
  66
  67/*
  68 * CON1         Camera Module
  69 * CON2         Extension Bus
  70 * CON3         HDMI Output
  71 * CON4         Composite Video Output
  72 * CON5         H-UDI JTAG
  73 * CON6         ARM JTAG
  74 * CON7         SD1
  75 * CON8         SD2
  76 * CON9         RTC BackUp
  77 * CON10        Monaural Mic Input
  78 * CON11        Stereo Headphone Output
  79 * CON12        Audio Line Output(L)
  80 * CON13        Audio Line Output(R)
  81 * CON14        AWL13 Module
  82 * CON15        Extension
  83 * CON16        LCD1
  84 * CON17        LCD2
  85 * CON19        Power Input
  86 * CON20        USB1
  87 * CON21        USB2
  88 * CON22        Serial
  89 * CON23        LAN
  90 * CON24        USB3
  91 * LED1         Camera LED(Yellow)
  92 * LED2         Power LED (Green)
  93 * ED3-LED6     User LED(Yellow)
  94 * LED7         LAN link LED(Green)
  95 * LED8         LAN activity LED(Yellow)
  96 */
  97
  98/*
  99 * DipSwitch
 100 *
 101 *                    SW1
 102 *
 103 * -12345678-+---------------+----------------------------
 104 *  1        | boot          | hermit
 105 *  0        | boot          | OS auto boot
 106 * -12345678-+---------------+----------------------------
 107 *   00      | boot device   | eMMC
 108 *   10      | boot device   | SDHI0 (CON7)
 109 *   01      | boot device   | -
 110 *   11      | boot device   | Extension Buss (CS0)
 111 * -12345678-+---------------+----------------------------
 112 *     0     | Extension Bus | D8-D15 disable, eMMC enable
 113 *     1     | Extension Bus | D8-D15 enable,  eMMC disable
 114 * -12345678-+---------------+----------------------------
 115 *      0    | SDHI1         | COM8 disable, COM14 enable
 116 *      1    | SDHI1         | COM8 enable,  COM14 disable
 117 * -12345678-+---------------+----------------------------
 118 *       0   | USB0          | COM20 enable,  COM24 disable
 119 *       1   | USB0          | COM20 disable, COM24 enable
 120 * -12345678-+---------------+----------------------------
 121 *        00 | JTAG          | SH-X2
 122 *        10 | JTAG          | ARM
 123 *        01 | JTAG          | -
 124 *        11 | JTAG          | Boundary Scan
 125 *-----------+---------------+----------------------------
 126 */
 127
 128/*
 129 * FSI-WM8978
 130 *
 131 * this command is required when playback.
 132 *
 133 * # amixer set "Headphone" 50
 134 *
 135 * this command is required when capture.
 136 *
 137 * # amixer set "Input PGA" 15
 138 * # amixer set "Left Input Mixer MicP" on
 139 * # amixer set "Left Input Mixer MicN" on
 140 * # amixer set "Right Input Mixer MicN" on
 141 * # amixer set "Right Input Mixer MicP" on
 142 */
 143
 144/*
 145 * USB function
 146 *
 147 * When you use USB Function,
 148 * set SW1.6 ON, and connect cable to CN24.
 149 *
 150 * USBF needs workaround on R8A7740 chip.
 151 * These are a little bit complex.
 152 * see
 153 *      usbhsf_power_ctrl()
 154 */
 155#define IRQ7            irq_pin(7)
 156#define USBCR1          IOMEM(0xe605810a)
 157#define USBH            0xC6700000
 158#define USBH_USBCTR     0x10834
 159
 160struct usbhsf_private {
 161        struct clk *phy;
 162        struct clk *usb24;
 163        struct clk *pci;
 164        struct clk *func;
 165        struct clk *host;
 166        void __iomem *usbh_base;
 167        struct renesas_usbhs_platform_info info;
 168};
 169
 170#define usbhsf_get_priv(pdev)                           \
 171        container_of(renesas_usbhs_get_info(pdev),      \
 172                     struct usbhsf_private, info)
 173
 174static int usbhsf_get_id(struct platform_device *pdev)
 175{
 176        return USBHS_GADGET;
 177}
 178
 179static int usbhsf_power_ctrl(struct platform_device *pdev,
 180                              void __iomem *base, int enable)
 181{
 182        struct usbhsf_private *priv = usbhsf_get_priv(pdev);
 183
 184        /*
 185         * Work around for USB Function.
 186         * It needs USB host clock, and settings
 187         */
 188        if (enable) {
 189                /*
 190                 * enable all the related usb clocks
 191                 * for usb workaround
 192                 */
 193                clk_enable(priv->usb24);
 194                clk_enable(priv->pci);
 195                clk_enable(priv->host);
 196                clk_enable(priv->func);
 197                clk_enable(priv->phy);
 198
 199                /*
 200                 * set USBCR1
 201                 *
 202                 * Port1 is driven by USB function,
 203                 * Port2 is driven by USB HOST
 204                 * One HOST (Port1 or Port2 is HOST)
 205                 * USB PLL input clock = 24MHz
 206                 */
 207                __raw_writew(0xd750, USBCR1);
 208                mdelay(1);
 209
 210                /*
 211                 * start USB Host
 212                 */
 213                __raw_writel(0x0000000c, priv->usbh_base + USBH_USBCTR);
 214                __raw_writel(0x00000008, priv->usbh_base + USBH_USBCTR);
 215                mdelay(10);
 216
 217                /*
 218                 * USB PHY Power ON
 219                 */
 220                __raw_writew(0xd770, USBCR1);
 221                __raw_writew(0x4000, base + 0x102); /* USBF :: SUSPMODE */
 222
 223        } else {
 224                __raw_writel(0x0000010f, priv->usbh_base + USBH_USBCTR);
 225                __raw_writew(0xd7c0, USBCR1); /* GPIO */
 226
 227                clk_disable(priv->phy);
 228                clk_disable(priv->func);        /* usb work around */
 229                clk_disable(priv->host);        /* usb work around */
 230                clk_disable(priv->pci);         /* usb work around */
 231                clk_disable(priv->usb24);       /* usb work around */
 232        }
 233
 234        return 0;
 235}
 236
 237static int usbhsf_get_vbus(struct platform_device *pdev)
 238{
 239        return gpio_get_value(209);
 240}
 241
 242static irqreturn_t usbhsf_interrupt(int irq, void *data)
 243{
 244        struct platform_device *pdev = data;
 245
 246        renesas_usbhs_call_notify_hotplug(pdev);
 247
 248        return IRQ_HANDLED;
 249}
 250
 251static int usbhsf_hardware_exit(struct platform_device *pdev)
 252{
 253        struct usbhsf_private *priv = usbhsf_get_priv(pdev);
 254
 255        if (!IS_ERR(priv->phy))
 256                clk_put(priv->phy);
 257        if (!IS_ERR(priv->usb24))
 258                clk_put(priv->usb24);
 259        if (!IS_ERR(priv->pci))
 260                clk_put(priv->pci);
 261        if (!IS_ERR(priv->host))
 262                clk_put(priv->host);
 263        if (!IS_ERR(priv->func))
 264                clk_put(priv->func);
 265        if (priv->usbh_base)
 266                iounmap(priv->usbh_base);
 267
 268        priv->phy       = NULL;
 269        priv->usb24     = NULL;
 270        priv->pci       = NULL;
 271        priv->host      = NULL;
 272        priv->func      = NULL;
 273        priv->usbh_base = NULL;
 274
 275        free_irq(IRQ7, pdev);
 276
 277        return 0;
 278}
 279
 280static int usbhsf_hardware_init(struct platform_device *pdev)
 281{
 282        struct usbhsf_private *priv = usbhsf_get_priv(pdev);
 283        int ret;
 284
 285        priv->phy       = clk_get(&pdev->dev, "phy");
 286        priv->usb24     = clk_get(&pdev->dev, "usb24");
 287        priv->pci       = clk_get(&pdev->dev, "pci");
 288        priv->func      = clk_get(&pdev->dev, "func");
 289        priv->host      = clk_get(&pdev->dev, "host");
 290        priv->usbh_base = ioremap_nocache(USBH, 0x20000);
 291
 292        if (IS_ERR(priv->phy)           ||
 293            IS_ERR(priv->usb24)         ||
 294            IS_ERR(priv->pci)           ||
 295            IS_ERR(priv->host)          ||
 296            IS_ERR(priv->func)          ||
 297            !priv->usbh_base) {
 298                dev_err(&pdev->dev, "USB clock setting failed\n");
 299                usbhsf_hardware_exit(pdev);
 300                return -EIO;
 301        }
 302
 303        ret = request_irq(IRQ7, usbhsf_interrupt, IRQF_TRIGGER_NONE,
 304                          dev_name(&pdev->dev), pdev);
 305        if (ret) {
 306                dev_err(&pdev->dev, "request_irq err\n");
 307                return ret;
 308        }
 309        irq_set_irq_type(IRQ7, IRQ_TYPE_EDGE_BOTH);
 310
 311        /* usb24 use 1/1 of parent clock (= usb24s = 24MHz) */
 312        clk_set_rate(priv->usb24,
 313                     clk_get_rate(clk_get_parent(priv->usb24)));
 314
 315        return 0;
 316}
 317
 318static struct usbhsf_private usbhsf_private = {
 319        .info = {
 320                .platform_callback = {
 321                        .get_id         = usbhsf_get_id,
 322                        .get_vbus       = usbhsf_get_vbus,
 323                        .hardware_init  = usbhsf_hardware_init,
 324                        .hardware_exit  = usbhsf_hardware_exit,
 325                        .power_ctrl     = usbhsf_power_ctrl,
 326                },
 327                .driver_param = {
 328                        .buswait_bwait          = 5,
 329                        .detection_delay        = 5,
 330                        .d0_rx_id       = SHDMA_SLAVE_USBHS_RX,
 331                        .d1_tx_id       = SHDMA_SLAVE_USBHS_TX,
 332                },
 333        }
 334};
 335
 336static struct resource usbhsf_resources[] = {
 337        {
 338                .name   = "USBHS",
 339                .start  = 0xe6890000,
 340                .end    = 0xe6890104 - 1,
 341                .flags  = IORESOURCE_MEM,
 342        },
 343        {
 344                .start  = gic_spi(51),
 345                .flags  = IORESOURCE_IRQ,
 346        },
 347};
 348
 349static struct platform_device usbhsf_device = {
 350        .name   = "renesas_usbhs",
 351        .dev = {
 352                .platform_data = &usbhsf_private.info,
 353        },
 354        .id = -1,
 355        .num_resources  = ARRAY_SIZE(usbhsf_resources),
 356        .resource       = usbhsf_resources,
 357};
 358
 359/* Ether */
 360static struct sh_eth_plat_data sh_eth_platdata = {
 361        .phy                    = 0x00, /* LAN8710A */
 362        .edmac_endian           = EDMAC_LITTLE_ENDIAN,
 363        .phy_interface          = PHY_INTERFACE_MODE_MII,
 364};
 365
 366static struct resource sh_eth_resources[] = {
 367        {
 368                .start  = 0xe9a00000,
 369                .end    = 0xe9a00800 - 1,
 370                .flags  = IORESOURCE_MEM,
 371        }, {
 372                .start  = 0xe9a01800,
 373                .end    = 0xe9a02000 - 1,
 374                .flags  = IORESOURCE_MEM,
 375        }, {
 376                .start  = gic_spi(110),
 377                .flags  = IORESOURCE_IRQ,
 378        },
 379};
 380
 381static struct platform_device sh_eth_device = {
 382        .name = "r8a7740-gether",
 383        .id = -1,
 384        .dev = {
 385                .platform_data = &sh_eth_platdata,
 386        },
 387        .resource = sh_eth_resources,
 388        .num_resources = ARRAY_SIZE(sh_eth_resources),
 389};
 390
 391/* PWM */
 392static struct resource pwm_resources[] = {
 393        [0] = {
 394                .start = 0xe6600000,
 395                .end = 0xe66000ff,
 396                .flags = IORESOURCE_MEM,
 397        },
 398};
 399
 400static struct tpu_pwm_platform_data pwm_device_data = {
 401        .channels[2] = {
 402                .polarity = PWM_POLARITY_INVERSED,
 403        }
 404};
 405
 406static struct platform_device pwm_device = {
 407        .name = "renesas-tpu-pwm",
 408        .id = -1,
 409        .dev = {
 410                .platform_data = &pwm_device_data,
 411        },
 412        .num_resources = ARRAY_SIZE(pwm_resources),
 413        .resource = pwm_resources,
 414};
 415
 416static struct pwm_lookup pwm_lookup[] = {
 417        PWM_LOOKUP("renesas-tpu-pwm", 2, "pwm-backlight.0", NULL),
 418};
 419
 420/* LCDC and backlight */
 421static struct platform_pwm_backlight_data pwm_backlight_data = {
 422        .lth_brightness = 50,
 423        .max_brightness = 255,
 424        .dft_brightness = 255,
 425        .pwm_period_ns = 33333, /* 30kHz */
 426};
 427
 428static struct platform_device pwm_backlight_device = {
 429        .name = "pwm-backlight",
 430        .dev = {
 431                .platform_data = &pwm_backlight_data,
 432        },
 433};
 434
 435static struct fb_videomode lcdc0_mode = {
 436        .name           = "AMPIER/AM-800480",
 437        .xres           = 800,
 438        .yres           = 480,
 439        .left_margin    = 88,
 440        .right_margin   = 40,
 441        .hsync_len      = 128,
 442        .upper_margin   = 20,
 443        .lower_margin   = 5,
 444        .vsync_len      = 5,
 445        .sync           = 0,
 446};
 447
 448static struct sh_mobile_lcdc_info lcdc0_info = {
 449        .clock_source   = LCDC_CLK_BUS,
 450        .ch[0] = {
 451                .chan           = LCDC_CHAN_MAINLCD,
 452                .fourcc         = V4L2_PIX_FMT_RGB565,
 453                .interface_type = RGB24,
 454                .clock_divider  = 5,
 455                .flags          = 0,
 456                .lcd_modes      = &lcdc0_mode,
 457                .num_modes      = 1,
 458                .panel_cfg = {
 459                        .width  = 111,
 460                        .height = 68,
 461                },
 462        },
 463};
 464
 465static struct resource lcdc0_resources[] = {
 466        [0] = {
 467                .name   = "LCD0",
 468                .start  = 0xfe940000,
 469                .end    = 0xfe943fff,
 470                .flags  = IORESOURCE_MEM,
 471        },
 472        [1] = {
 473                .start  = gic_spi(177),
 474                .flags  = IORESOURCE_IRQ,
 475        },
 476};
 477
 478static struct platform_device lcdc0_device = {
 479        .name           = "sh_mobile_lcdc_fb",
 480        .num_resources  = ARRAY_SIZE(lcdc0_resources),
 481        .resource       = lcdc0_resources,
 482        .id             = 0,
 483        .dev    = {
 484                .platform_data  = &lcdc0_info,
 485                .coherent_dma_mask = ~0,
 486        },
 487};
 488
 489/*
 490 * LCDC1/HDMI
 491 */
 492static struct sh_mobile_hdmi_info hdmi_info = {
 493        .flags          = HDMI_OUTPUT_PUSH_PULL |
 494                          HDMI_OUTPUT_POLARITY_HI |
 495                          HDMI_32BIT_REG |
 496                          HDMI_HAS_HTOP1 |
 497                          HDMI_SND_SRC_SPDIF,
 498};
 499
 500static struct resource hdmi_resources[] = {
 501        [0] = {
 502                .name   = "HDMI",
 503                .start  = 0xe6be0000,
 504                .end    = 0xe6be03ff,
 505                .flags  = IORESOURCE_MEM,
 506        },
 507        [1] = {
 508                .start  = gic_spi(131),
 509                .flags  = IORESOURCE_IRQ,
 510        },
 511        [2] = {
 512                .name   = "HDMI emma3pf",
 513                .start  = 0xe6be4000,
 514                .end    = 0xe6be43ff,
 515                .flags  = IORESOURCE_MEM,
 516        },
 517};
 518
 519static struct platform_device hdmi_device = {
 520        .name           = "sh-mobile-hdmi",
 521        .num_resources  = ARRAY_SIZE(hdmi_resources),
 522        .resource       = hdmi_resources,
 523        .id             = -1,
 524        .dev    = {
 525                .platform_data  = &hdmi_info,
 526        },
 527};
 528
 529static const struct fb_videomode lcdc1_mode = {
 530        .name           = "HDMI 720p",
 531        .xres           = 1280,
 532        .yres           = 720,
 533        .pixclock       = 13468,
 534        .left_margin    = 220,
 535        .right_margin   = 110,
 536        .hsync_len      = 40,
 537        .upper_margin   = 20,
 538        .lower_margin   = 5,
 539        .vsync_len      = 5,
 540        .refresh        = 60,
 541        .sync           = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
 542};
 543
 544static struct sh_mobile_lcdc_info hdmi_lcdc_info = {
 545        .clock_source   = LCDC_CLK_PERIPHERAL, /* HDMI clock */
 546        .ch[0] = {
 547                .chan                   = LCDC_CHAN_MAINLCD,
 548                .fourcc                 = V4L2_PIX_FMT_RGB565,
 549                .interface_type         = RGB24,
 550                .clock_divider          = 1,
 551                .flags                  = LCDC_FLAGS_DWPOL,
 552                .lcd_modes              = &lcdc1_mode,
 553                .num_modes              = 1,
 554                .tx_dev                 = &hdmi_device,
 555                .panel_cfg = {
 556                        .width  = 1280,
 557                        .height = 720,
 558                },
 559        },
 560};
 561
 562static struct resource hdmi_lcdc_resources[] = {
 563        [0] = {
 564                .name   = "LCDC1",
 565                .start  = 0xfe944000,
 566                .end    = 0xfe948000 - 1,
 567                .flags  = IORESOURCE_MEM,
 568        },
 569        [1] = {
 570                .start  = gic_spi(178),
 571                .flags  = IORESOURCE_IRQ,
 572        },
 573};
 574
 575static struct platform_device hdmi_lcdc_device = {
 576        .name           = "sh_mobile_lcdc_fb",
 577        .num_resources  = ARRAY_SIZE(hdmi_lcdc_resources),
 578        .resource       = hdmi_lcdc_resources,
 579        .id             = 1,
 580        .dev    = {
 581                .platform_data  = &hdmi_lcdc_info,
 582                .coherent_dma_mask = ~0,
 583        },
 584};
 585
 586/* GPIO KEY */
 587#define GPIO_KEY(c, g, d, ...) \
 588        { .code = c, .gpio = g, .desc = d, .active_low = 1, __VA_ARGS__ }
 589
 590static struct gpio_keys_button gpio_buttons[] = {
 591        GPIO_KEY(KEY_POWER,     99,     "SW3", .wakeup = 1),
 592        GPIO_KEY(KEY_BACK,      100,    "SW4"),
 593        GPIO_KEY(KEY_MENU,      97,     "SW5"),
 594        GPIO_KEY(KEY_HOME,      98,     "SW6"),
 595};
 596
 597static struct gpio_keys_platform_data gpio_key_info = {
 598        .buttons        = gpio_buttons,
 599        .nbuttons       = ARRAY_SIZE(gpio_buttons),
 600};
 601
 602static struct platform_device gpio_keys_device = {
 603        .name   = "gpio-keys",
 604        .id     = -1,
 605        .dev    = {
 606                .platform_data  = &gpio_key_info,
 607        },
 608};
 609
 610/* Fixed 3.3V regulator to be used by SDHI1, MMCIF */
 611static struct regulator_consumer_supply fixed3v3_power_consumers[] = {
 612        REGULATOR_SUPPLY("vmmc", "sh_mmcif"),
 613        REGULATOR_SUPPLY("vqmmc", "sh_mmcif"),
 614};
 615
 616/* Fixed 3.3V regulator to be used by SDHI0 */
 617static struct regulator_consumer_supply vcc_sdhi0_consumers[] = {
 618        REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
 619};
 620
 621static struct regulator_init_data vcc_sdhi0_init_data = {
 622        .constraints = {
 623                .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 624        },
 625        .num_consumer_supplies  = ARRAY_SIZE(vcc_sdhi0_consumers),
 626        .consumer_supplies      = vcc_sdhi0_consumers,
 627};
 628
 629static struct fixed_voltage_config vcc_sdhi0_info = {
 630        .supply_name = "SDHI0 Vcc",
 631        .microvolts = 3300000,
 632        .gpio = 75,
 633        .enable_high = 1,
 634        .init_data = &vcc_sdhi0_init_data,
 635};
 636
 637static struct platform_device vcc_sdhi0 = {
 638        .name = "reg-fixed-voltage",
 639        .id   = 1,
 640        .dev  = {
 641                .platform_data = &vcc_sdhi0_info,
 642        },
 643};
 644
 645/* 1.8 / 3.3V SDHI0 VccQ regulator */
 646static struct regulator_consumer_supply vccq_sdhi0_consumers[] = {
 647        REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
 648};
 649
 650static struct regulator_init_data vccq_sdhi0_init_data = {
 651        .constraints = {
 652                .input_uV       = 3300000,
 653                .min_uV         = 1800000,
 654                .max_uV         = 3300000,
 655                .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
 656                                  REGULATOR_CHANGE_STATUS,
 657        },
 658        .num_consumer_supplies  = ARRAY_SIZE(vccq_sdhi0_consumers),
 659        .consumer_supplies      = vccq_sdhi0_consumers,
 660};
 661
 662static struct gpio vccq_sdhi0_gpios[] = {
 663        {17, GPIOF_OUT_INIT_LOW, "vccq-sdhi0" },
 664};
 665
 666static struct gpio_regulator_state vccq_sdhi0_states[] = {
 667        { .value = 3300000, .gpios = (0 << 0) },
 668        { .value = 1800000, .gpios = (1 << 0) },
 669};
 670
 671static struct gpio_regulator_config vccq_sdhi0_info = {
 672        .supply_name = "vqmmc",
 673
 674        .enable_gpio = 74,
 675        .enable_high = 1,
 676        .enabled_at_boot = 0,
 677
 678        .gpios = vccq_sdhi0_gpios,
 679        .nr_gpios = ARRAY_SIZE(vccq_sdhi0_gpios),
 680
 681        .states = vccq_sdhi0_states,
 682        .nr_states = ARRAY_SIZE(vccq_sdhi0_states),
 683
 684        .type = REGULATOR_VOLTAGE,
 685        .init_data = &vccq_sdhi0_init_data,
 686};
 687
 688static struct platform_device vccq_sdhi0 = {
 689        .name = "gpio-regulator",
 690        .id   = -1,
 691        .dev  = {
 692                .platform_data = &vccq_sdhi0_info,
 693        },
 694};
 695
 696/* Fixed 3.3V regulator to be used by SDHI1 */
 697static struct regulator_consumer_supply vcc_sdhi1_consumers[] = {
 698        REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
 699};
 700
 701static struct regulator_init_data vcc_sdhi1_init_data = {
 702        .constraints = {
 703                .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 704        },
 705        .num_consumer_supplies  = ARRAY_SIZE(vcc_sdhi1_consumers),
 706        .consumer_supplies      = vcc_sdhi1_consumers,
 707};
 708
 709static struct fixed_voltage_config vcc_sdhi1_info = {
 710        .supply_name = "SDHI1 Vcc",
 711        .microvolts = 3300000,
 712        .gpio = 16,
 713        .enable_high = 1,
 714        .init_data = &vcc_sdhi1_init_data,
 715};
 716
 717static struct platform_device vcc_sdhi1 = {
 718        .name = "reg-fixed-voltage",
 719        .id   = 2,
 720        .dev  = {
 721                .platform_data = &vcc_sdhi1_info,
 722        },
 723};
 724
 725/* SDHI0 */
 726static struct sh_mobile_sdhi_info sdhi0_info = {
 727        .dma_slave_tx   = SHDMA_SLAVE_SDHI0_TX,
 728        .dma_slave_rx   = SHDMA_SLAVE_SDHI0_RX,
 729        .tmio_caps      = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
 730                          MMC_CAP_POWER_OFF_CARD,
 731        .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
 732        .cd_gpio        = 167,
 733};
 734
 735static struct resource sdhi0_resources[] = {
 736        {
 737                .name   = "SDHI0",
 738                .start  = 0xe6850000,
 739                .end    = 0xe6850100 - 1,
 740                .flags  = IORESOURCE_MEM,
 741        },
 742        /*
 743         * no SH_MOBILE_SDHI_IRQ_CARD_DETECT here
 744         */
 745        {
 746                .name   = SH_MOBILE_SDHI_IRQ_SDCARD,
 747                .start  = gic_spi(118),
 748                .flags  = IORESOURCE_IRQ,
 749        },
 750        {
 751                .name   = SH_MOBILE_SDHI_IRQ_SDIO,
 752                .start  = gic_spi(119),
 753                .flags  = IORESOURCE_IRQ,
 754        },
 755};
 756
 757static struct platform_device sdhi0_device = {
 758        .name           = "sh_mobile_sdhi",
 759        .id             = 0,
 760        .dev            = {
 761                .platform_data  = &sdhi0_info,
 762        },
 763        .num_resources  = ARRAY_SIZE(sdhi0_resources),
 764        .resource       = sdhi0_resources,
 765};
 766
 767/* SDHI1 */
 768static struct sh_mobile_sdhi_info sdhi1_info = {
 769        .dma_slave_tx   = SHDMA_SLAVE_SDHI1_TX,
 770        .dma_slave_rx   = SHDMA_SLAVE_SDHI1_RX,
 771        .tmio_caps      = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
 772                          MMC_CAP_POWER_OFF_CARD,
 773        .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
 774        /* Port72 cannot generate IRQs, will be used in polling mode. */
 775        .cd_gpio        = 72,
 776};
 777
 778static struct resource sdhi1_resources[] = {
 779        [0] = {
 780                .name   = "SDHI1",
 781                .start  = 0xe6860000,
 782                .end    = 0xe6860100 - 1,
 783                .flags  = IORESOURCE_MEM,
 784        },
 785        [1] = {
 786                .start  = gic_spi(121),
 787                .flags  = IORESOURCE_IRQ,
 788        },
 789        [2] = {
 790                .start  = gic_spi(122),
 791                .flags  = IORESOURCE_IRQ,
 792        },
 793        [3] = {
 794                .start  = gic_spi(123),
 795                .flags  = IORESOURCE_IRQ,
 796        },
 797};
 798
 799static struct platform_device sdhi1_device = {
 800        .name           = "sh_mobile_sdhi",
 801        .id             = 1,
 802        .dev            = {
 803                .platform_data  = &sdhi1_info,
 804        },
 805        .num_resources  = ARRAY_SIZE(sdhi1_resources),
 806        .resource       = sdhi1_resources,
 807};
 808
 809static const struct pinctrl_map eva_sdhi1_pinctrl_map[] = {
 810        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
 811                                  "sdhi1_data4", "sdhi1"),
 812        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
 813                                  "sdhi1_ctrl", "sdhi1"),
 814        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
 815                                  "sdhi1_cd", "sdhi1"),
 816        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
 817                                  "sdhi1_wp", "sdhi1"),
 818};
 819
 820/* MMCIF */
 821static struct sh_mmcif_plat_data sh_mmcif_plat = {
 822        .sup_pclk       = 0,
 823        .caps           = MMC_CAP_4_BIT_DATA |
 824                          MMC_CAP_8_BIT_DATA |
 825                          MMC_CAP_NONREMOVABLE,
 826        .slave_id_tx    = SHDMA_SLAVE_MMCIF_TX,
 827        .slave_id_rx    = SHDMA_SLAVE_MMCIF_RX,
 828};
 829
 830static struct resource sh_mmcif_resources[] = {
 831        [0] = {
 832                .name   = "MMCIF",
 833                .start  = 0xe6bd0000,
 834                .end    = 0xe6bd0100 - 1,
 835                .flags  = IORESOURCE_MEM,
 836        },
 837        [1] = {
 838                /* MMC ERR */
 839                .start  = gic_spi(56),
 840                .flags  = IORESOURCE_IRQ,
 841        },
 842        [2] = {
 843                /* MMC NOR */
 844                .start  = gic_spi(57),
 845                .flags  = IORESOURCE_IRQ,
 846        },
 847};
 848
 849static struct platform_device sh_mmcif_device = {
 850        .name           = "sh_mmcif",
 851        .id             = -1,
 852        .dev            = {
 853                .platform_data  = &sh_mmcif_plat,
 854        },
 855        .num_resources  = ARRAY_SIZE(sh_mmcif_resources),
 856        .resource       = sh_mmcif_resources,
 857};
 858
 859/* Camera */
 860static int mt9t111_power(struct device *dev, int mode)
 861{
 862        struct clk *mclk = clk_get(NULL, "video1");
 863
 864        if (IS_ERR(mclk)) {
 865                dev_err(dev, "can't get video1 clock\n");
 866                return -EINVAL;
 867        }
 868
 869        if (mode) {
 870                /* video1 (= CON1 camera) expect 24MHz */
 871                clk_set_rate(mclk, clk_round_rate(mclk, 24000000));
 872                clk_enable(mclk);
 873                gpio_set_value(158, 1);
 874        } else {
 875                gpio_set_value(158, 0);
 876                clk_disable(mclk);
 877        }
 878
 879        clk_put(mclk);
 880
 881        return 0;
 882}
 883
 884static struct i2c_board_info i2c_camera_mt9t111 = {
 885        I2C_BOARD_INFO("mt9t112", 0x3d),
 886};
 887
 888static struct mt9t112_camera_info mt9t111_info = {
 889        .divider = { 16, 0, 0, 7, 0, 10, 14, 7, 7 },
 890};
 891
 892static struct soc_camera_link mt9t111_link = {
 893        .i2c_adapter_id = 0,
 894        .bus_id         = 0,
 895        .board_info     = &i2c_camera_mt9t111,
 896        .power          = mt9t111_power,
 897        .priv           = &mt9t111_info,
 898};
 899
 900static struct platform_device camera_device = {
 901        .name   = "soc-camera-pdrv",
 902        .id     = 0,
 903        .dev    = {
 904                .platform_data = &mt9t111_link,
 905        },
 906};
 907
 908/* CEU0 */
 909static struct sh_mobile_ceu_info sh_mobile_ceu0_info = {
 910        .flags = SH_CEU_FLAG_LOWER_8BIT,
 911};
 912
 913static struct resource ceu0_resources[] = {
 914        [0] = {
 915                .name   = "CEU",
 916                .start  = 0xfe910000,
 917                .end    = 0xfe91009f,
 918                .flags  = IORESOURCE_MEM,
 919        },
 920        [1] = {
 921                .start  = gic_spi(160),
 922                .flags  = IORESOURCE_IRQ,
 923        },
 924        [2] = {
 925                /* place holder for contiguous memory */
 926        },
 927};
 928
 929static struct platform_device ceu0_device = {
 930        .name           = "sh_mobile_ceu",
 931        .id             = 0,
 932        .num_resources  = ARRAY_SIZE(ceu0_resources),
 933        .resource       = ceu0_resources,
 934        .dev    = {
 935                .platform_data          = &sh_mobile_ceu0_info,
 936                .coherent_dma_mask      = 0xffffffff,
 937        },
 938};
 939
 940/* FSI */
 941static struct sh_fsi_platform_info fsi_info = {
 942        /* FSI-WM8978 */
 943        .port_a = {
 944                .tx_id = SHDMA_SLAVE_FSIA_TX,
 945        },
 946        /* FSI-HDMI */
 947        .port_b = {
 948                .flags          = SH_FSI_FMT_SPDIF |
 949                                  SH_FSI_ENABLE_STREAM_MODE |
 950                                  SH_FSI_CLK_CPG,
 951                .tx_id          = SHDMA_SLAVE_FSIB_TX,
 952        }
 953};
 954
 955static struct resource fsi_resources[] = {
 956        [0] = {
 957                .name   = "FSI",
 958                .start  = 0xfe1f0000,
 959                .end    = 0xfe1f8400 - 1,
 960                .flags  = IORESOURCE_MEM,
 961        },
 962        [1] = {
 963                .start  = gic_spi(9),
 964                .flags  = IORESOURCE_IRQ,
 965        },
 966};
 967
 968static struct platform_device fsi_device = {
 969        .name           = "sh_fsi2",
 970        .id             = -1,
 971        .num_resources  = ARRAY_SIZE(fsi_resources),
 972        .resource       = fsi_resources,
 973        .dev    = {
 974                .platform_data  = &fsi_info,
 975        },
 976};
 977
 978/* FSI-WM8978 */
 979static struct asoc_simple_card_info fsi_wm8978_info = {
 980        .name           = "wm8978",
 981        .card           = "FSI2A-WM8978",
 982        .codec          = "wm8978.0-001a",
 983        .platform       = "sh_fsi2",
 984        .daifmt         = SND_SOC_DAIFMT_I2S,
 985        .cpu_dai = {
 986                .name   = "fsia-dai",
 987                .fmt    = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_IB_NF,
 988        },
 989        .codec_dai = {
 990                .name   = "wm8978-hifi",
 991                .fmt    = SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_NB_NF,
 992                .sysclk = 12288000,
 993        },
 994};
 995
 996static struct platform_device fsi_wm8978_device = {
 997        .name   = "asoc-simple-card",
 998        .id     = 0,
 999        .dev    = {
1000                .platform_data  = &fsi_wm8978_info,
1001        },
1002};
1003
1004/* FSI-HDMI */
1005static struct asoc_simple_card_info fsi2_hdmi_info = {
1006        .name           = "HDMI",
1007        .card           = "FSI2B-HDMI",
1008        .codec          = "sh-mobile-hdmi",
1009        .platform       = "sh_fsi2",
1010        .cpu_dai = {
1011                .name   = "fsib-dai",
1012                .fmt    = SND_SOC_DAIFMT_CBM_CFM,
1013        },
1014        .codec_dai = {
1015                .name = "sh_mobile_hdmi-hifi",
1016        },
1017};
1018
1019static struct platform_device fsi_hdmi_device = {
1020        .name   = "asoc-simple-card",
1021        .id     = 1,
1022        .dev    = {
1023                .platform_data  = &fsi2_hdmi_info,
1024        },
1025};
1026
1027/* RTC: RTC connects i2c-gpio. */
1028static struct i2c_gpio_platform_data i2c_gpio_data = {
1029        .sda_pin        = 208,
1030        .scl_pin        = 91,
1031        .udelay         = 5, /* 100 kHz */
1032};
1033
1034static struct platform_device i2c_gpio_device = {
1035        .name = "i2c-gpio",
1036        .id = 2,
1037        .dev = {
1038                .platform_data = &i2c_gpio_data,
1039        },
1040};
1041
1042/* I2C */
1043static struct st1232_pdata st1232_i2c0_pdata = {
1044        .reset_gpio = 166,
1045};
1046
1047static struct i2c_board_info i2c0_devices[] = {
1048        {
1049                I2C_BOARD_INFO("st1232-ts", 0x55),
1050                .irq = irq_pin(10),
1051                .platform_data = &st1232_i2c0_pdata,
1052        },
1053        {
1054                I2C_BOARD_INFO("wm8978", 0x1a),
1055        },
1056};
1057
1058static struct i2c_board_info i2c2_devices[] = {
1059        {
1060                I2C_BOARD_INFO("s35390a", 0x30),
1061                .type = "s35390a",
1062        },
1063};
1064
1065/*
1066 * board devices
1067 */
1068static struct platform_device *eva_devices[] __initdata = {
1069        &lcdc0_device,
1070        &pwm_device,
1071        &pwm_backlight_device,
1072        &gpio_keys_device,
1073        &sh_eth_device,
1074        &vcc_sdhi0,
1075        &vccq_sdhi0,
1076        &sdhi0_device,
1077        &sh_mmcif_device,
1078        &hdmi_device,
1079        &hdmi_lcdc_device,
1080        &camera_device,
1081        &ceu0_device,
1082        &fsi_device,
1083        &fsi_wm8978_device,
1084        &fsi_hdmi_device,
1085        &i2c_gpio_device,
1086};
1087
1088static const struct pinctrl_map eva_pinctrl_map[] = {
1089        /* CEU0 */
1090        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
1091                                  "ceu0_data_0_7", "ceu0"),
1092        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
1093                                  "ceu0_clk_0", "ceu0"),
1094        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
1095                                  "ceu0_sync", "ceu0"),
1096        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
1097                                  "ceu0_field", "ceu0"),
1098        /* FSIA */
1099        PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
1100                                  "fsia_sclk_in", "fsia"),
1101        PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
1102                                  "fsia_mclk_out", "fsia"),
1103        PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
1104                                  "fsia_data_in_1", "fsia"),
1105        PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
1106                                  "fsia_data_out_0", "fsia"),
1107        /* FSIB */
1108        PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.1", "pfc-r8a7740",
1109                                  "fsib_mclk_in", "fsib"),
1110        /* GETHER */
1111        PIN_MAP_MUX_GROUP_DEFAULT("r8a7740-gether", "pfc-r8a7740",
1112                                  "gether_mii", "gether"),
1113        PIN_MAP_MUX_GROUP_DEFAULT("r8a7740-gether", "pfc-r8a7740",
1114                                  "gether_int", "gether"),
1115        /* HDMI */
1116        PIN_MAP_MUX_GROUP_DEFAULT("sh-mobile-hdmi", "pfc-r8a7740",
1117                                  "hdmi", "hdmi"),
1118        /* LCD0 */
1119        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
1120                                  "lcd0_data24_0", "lcd0"),
1121        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
1122                                  "lcd0_lclk_1", "lcd0"),
1123        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
1124                                  "lcd0_sync", "lcd0"),
1125        /* MMCIF */
1126        PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a7740",
1127                                  "mmc0_data8_1", "mmc0"),
1128        PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a7740",
1129                                  "mmc0_ctrl_1", "mmc0"),
1130        /* SCIFA1 */
1131        PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.1", "pfc-r8a7740",
1132                                  "scifa1_data", "scifa1"),
1133        /* SDHI0 */
1134        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
1135                                  "sdhi0_data4", "sdhi0"),
1136        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
1137                                  "sdhi0_ctrl", "sdhi0"),
1138        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
1139                                  "sdhi0_wp", "sdhi0"),
1140        /* ST1232 */
1141        PIN_MAP_MUX_GROUP_DEFAULT("0-0055", "pfc-r8a7740",
1142                                  "intc_irq10", "intc"),
1143        /* TPU0 */
1144        PIN_MAP_MUX_GROUP_DEFAULT("renesas-tpu-pwm", "pfc-r8a7740",
1145                                  "tpu0_to2_1", "tpu0"),
1146        /* USBHS */
1147        PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7740",
1148                                  "intc_irq7_1", "intc"),
1149};
1150
1151static void __init eva_clock_init(void)
1152{
1153        struct clk *system      = clk_get(NULL, "system_clk");
1154        struct clk *xtal1       = clk_get(NULL, "extal1");
1155        struct clk *usb24s      = clk_get(NULL, "usb24s");
1156        struct clk *fsibck      = clk_get(NULL, "fsibck");
1157
1158        if (IS_ERR(system)      ||
1159            IS_ERR(xtal1)       ||
1160            IS_ERR(usb24s)      ||
1161            IS_ERR(fsibck)) {
1162                pr_err("armadillo800eva board clock init failed\n");
1163                goto clock_error;
1164        }
1165
1166        /* armadillo 800 eva extal1 is 24MHz */
1167        clk_set_rate(xtal1, 24000000);
1168
1169        /* usb24s use extal1 (= system) clock (= 24MHz) */
1170        clk_set_parent(usb24s, system);
1171
1172        /* FSIBCK is 12.288MHz, and it is parent of FSI-B */
1173        clk_set_rate(fsibck, 12288000);
1174
1175clock_error:
1176        if (!IS_ERR(system))
1177                clk_put(system);
1178        if (!IS_ERR(xtal1))
1179                clk_put(xtal1);
1180        if (!IS_ERR(usb24s))
1181                clk_put(usb24s);
1182        if (!IS_ERR(fsibck))
1183                clk_put(fsibck);
1184}
1185
1186/*
1187 * board init
1188 */
1189#define GPIO_PORT7CR    IOMEM(0xe6050007)
1190#define GPIO_PORT8CR    IOMEM(0xe6050008)
1191static void __init eva_init(void)
1192{
1193        struct platform_device *usb = NULL;
1194
1195        regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
1196                                     ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
1197
1198        pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map));
1199        pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
1200
1201        r8a7740_pinmux_init();
1202        r8a7740_meram_workaround();
1203
1204        /* LCDC0 */
1205        gpio_request_one(61, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
1206
1207        /* GETHER */
1208        gpio_request_one(18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */
1209
1210        /* USB */
1211        gpio_request_one(159, GPIOF_IN, NULL); /* USB_DEVICE_MODE */
1212
1213        if (gpio_get_value(159)) {
1214                /* USB Host */
1215        } else {
1216                /* USB Func */
1217                /*
1218                 * The USBHS interrupt handlers needs to read the IRQ pin value
1219                 * (HI/LOW) to diffentiate USB connection and disconnection
1220                 * events (usbhsf_get_vbus()). We thus need to select both the
1221                 * intc_irq7_1 pin group and GPIO 209 here.
1222                 */
1223                gpio_request_one(209, GPIOF_IN, NULL);
1224
1225                platform_device_register(&usbhsf_device);
1226                usb = &usbhsf_device;
1227        }
1228
1229        /* CON1/CON15 Camera */
1230        gpio_request_one(173, GPIOF_OUT_INIT_LOW, NULL);  /* STANDBY */
1231        gpio_request_one(172, GPIOF_OUT_INIT_HIGH, NULL); /* RST */
1232        /* see mt9t111_power() */
1233        gpio_request_one(158, GPIOF_OUT_INIT_LOW, NULL);  /* CAM_PON */
1234
1235        /* FSI-WM8978 */
1236        gpio_request(7, NULL);
1237        gpio_request(8, NULL);
1238        gpio_direction_none(GPIO_PORT7CR); /* FSIAOBT needs no direction */
1239        gpio_direction_none(GPIO_PORT8CR); /* FSIAOLR needs no direction */
1240
1241        /*
1242         * CAUTION
1243         *
1244         * DBGMD/LCDC0/FSIA MUX
1245         * DBGMD_SELECT_B should be set after setting PFC Function.
1246         */
1247        gpio_request_one(176, GPIOF_OUT_INIT_HIGH, NULL);
1248
1249        /*
1250         * We can switch CON8/CON14 by SW1.5,
1251         * but it needs after DBGMD_SELECT_B
1252         */
1253        gpio_request_one(6, GPIOF_IN, NULL);
1254        if (gpio_get_value(6)) {
1255                /* CON14 enable */
1256        } else {
1257                /* CON8 (SDHI1) enable */
1258                pinctrl_register_mappings(eva_sdhi1_pinctrl_map,
1259                                          ARRAY_SIZE(eva_sdhi1_pinctrl_map));
1260
1261                platform_device_register(&vcc_sdhi1);
1262                platform_device_register(&sdhi1_device);
1263        }
1264
1265
1266#ifdef CONFIG_CACHE_L2X0
1267        /* Early BRESP enable, Shared attribute override enable, 32K*8way */
1268        l2x0_init(IOMEM(0xf0002000), 0x40440000, 0x82000fff);
1269#endif
1270
1271        i2c_register_board_info(0, i2c0_devices, ARRAY_SIZE(i2c0_devices));
1272        i2c_register_board_info(2, i2c2_devices, ARRAY_SIZE(i2c2_devices));
1273
1274        r8a7740_add_standard_devices();
1275
1276        platform_add_devices(eva_devices,
1277                             ARRAY_SIZE(eva_devices));
1278
1279        rmobile_add_device_to_domain("A4LC", &lcdc0_device);
1280        rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device);
1281        if (usb)
1282                rmobile_add_device_to_domain("A3SP", usb);
1283
1284        r8a7740_pm_init();
1285}
1286
1287static void __init eva_earlytimer_init(void)
1288{
1289        r8a7740_clock_init(MD_CK0 | MD_CK2);
1290        shmobile_earlytimer_init();
1291
1292        /* the rate of extal1 clock must be set before late_time_init */
1293        eva_clock_init();
1294}
1295
1296static void __init eva_add_early_devices(void)
1297{
1298        r8a7740_add_early_devices();
1299}
1300
1301#define RESCNT2 IOMEM(0xe6188020)
1302static void eva_restart(enum reboot_mode mode, const char *cmd)
1303{
1304        /* Do soft power on reset */
1305        writel((1 << 31), RESCNT2);
1306}
1307
1308static const char *eva_boards_compat_dt[] __initdata = {
1309        "renesas,armadillo800eva",
1310        NULL,
1311};
1312
1313DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva")
1314        .map_io         = r8a7740_map_io,
1315        .init_early     = eva_add_early_devices,
1316        .init_irq       = r8a7740_init_irq_of,
1317        .init_machine   = eva_init,
1318        .init_late      = shmobile_init_late,
1319        .init_time      = eva_earlytimer_init,
1320        .dt_compat      = eva_boards_compat_dt,
1321        .restart        = eva_restart,
1322MACHINE_END
1323