4 * Copyright (C) 2011 Renesas Solutions Corp.
5 * Copyright (C) 2011 Magnus Damm
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.
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.
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
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/interrupt.h>
24 #include <linux/irq.h>
25 #include <linux/platform_device.h>
26 #include <linux/delay.h>
28 #include <linux/gpio.h>
29 #include <linux/dma-mapping.h>
30 #include <linux/regulator/fixed.h>
31 #include <linux/regulator/machine.h>
32 #include <linux/smsc911x.h>
33 #include <linux/spi/spi.h>
34 #include <linux/spi/sh_hspi.h>
35 #include <linux/mmc/sh_mobile_sdhi.h>
36 #include <linux/mfd/tmio.h>
37 #include <linux/usb/otg.h>
38 #include <linux/usb/ehci_pdriver.h>
39 #include <linux/usb/ohci_pdriver.h>
40 #include <linux/pm_runtime.h>
41 #include <mach/hardware.h>
42 #include <mach/r8a7779.h>
43 #include <mach/common.h>
44 #include <mach/irqs.h>
45 #include <asm/mach-types.h>
46 #include <asm/mach/arch.h>
47 #include <asm/hardware/gic.h>
48 #include <asm/traps.h>
50 /* Fixed 3.3V regulator to be used by SDHI0 */
51 static struct regulator_consumer_supply fixed3v3_power_consumers
[] = {
52 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
53 REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
56 /* Dummy supplies, where voltage doesn't matter */
57 static struct regulator_consumer_supply dummy_supplies
[] = {
58 REGULATOR_SUPPLY("vddvario", "smsc911x"),
59 REGULATOR_SUPPLY("vdd33a", "smsc911x"),
63 static struct resource smsc911x_resources
[] = {
65 .start
= 0x18000000, /* ExCS0 */
66 .end
= 0x180000ff, /* A1->A7 */
67 .flags
= IORESOURCE_MEM
,
70 .start
= gic_spi(28), /* IRQ 1 */
71 .flags
= IORESOURCE_IRQ
,
75 static struct smsc911x_platform_config smsc911x_platdata
= {
76 .flags
= SMSC911X_USE_32BIT
, /* 32-bit SW on 16-bit HW bus */
77 .phy_interface
= PHY_INTERFACE_MODE_MII
,
78 .irq_polarity
= SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
79 .irq_type
= SMSC911X_IRQ_TYPE_PUSH_PULL
,
82 static struct platform_device eth_device
= {
86 .platform_data
= &smsc911x_platdata
,
88 .resource
= smsc911x_resources
,
89 .num_resources
= ARRAY_SIZE(smsc911x_resources
),
92 static struct resource sdhi0_resources
[] = {
97 .flags
= IORESOURCE_MEM
,
100 .start
= gic_spi(104),
101 .flags
= IORESOURCE_IRQ
,
105 static struct sh_mobile_sdhi_info sdhi0_platform_data
= {
106 .tmio_flags
= TMIO_MMC_WRPROTECT_DISABLE
| TMIO_MMC_HAS_IDLE_WAIT
,
107 .tmio_caps
= MMC_CAP_SD_HIGHSPEED
,
110 static struct platform_device sdhi0_device
= {
111 .name
= "sh_mobile_sdhi",
112 .num_resources
= ARRAY_SIZE(sdhi0_resources
),
113 .resource
= sdhi0_resources
,
116 .platform_data
= &sdhi0_platform_data
,
121 static struct resource thermal_resources
[] = {
124 .end
= 0xFFC48038 - 1,
125 .flags
= IORESOURCE_MEM
,
129 static struct platform_device thermal_device
= {
130 .name
= "rcar_thermal",
131 .resource
= thermal_resources
,
132 .num_resources
= ARRAY_SIZE(thermal_resources
),
136 static struct resource hspi_resources
[] = {
139 .end
= 0xFFFC7018 - 1,
140 .flags
= IORESOURCE_MEM
,
144 static struct platform_device hspi_device
= {
147 .resource
= hspi_resources
,
148 .num_resources
= ARRAY_SIZE(hspi_resources
),
152 static struct resource usb_phy_resources
[] = {
155 .end
= 0xffe70900 - 1,
156 .flags
= IORESOURCE_MEM
,
160 .end
= 0xfff70900 - 1,
161 .flags
= IORESOURCE_MEM
,
165 static struct platform_device usb_phy_device
= {
166 .name
= "rcar_usb_phy",
167 .resource
= usb_phy_resources
,
168 .num_resources
= ARRAY_SIZE(usb_phy_resources
),
171 static struct platform_device
*marzen_devices
[] __initdata
= {
180 static struct usb_phy
*phy
;
181 static int usb_power_on(struct platform_device
*pdev
)
186 pm_runtime_enable(&pdev
->dev
);
187 pm_runtime_get_sync(&pdev
->dev
);
194 static void usb_power_off(struct platform_device
*pdev
)
199 usb_phy_shutdown(phy
);
201 pm_runtime_put_sync(&pdev
->dev
);
202 pm_runtime_disable(&pdev
->dev
);
205 static struct usb_ehci_pdata ehcix_pdata
= {
206 .power_on
= usb_power_on
,
207 .power_off
= usb_power_off
,
208 .power_suspend
= usb_power_off
,
211 static struct resource ehci0_resources
[] = {
214 .end
= 0xffe70400 - 1,
215 .flags
= IORESOURCE_MEM
,
218 .start
= gic_spi(44),
219 .flags
= IORESOURCE_IRQ
,
223 static struct platform_device ehci0_device
= {
224 .name
= "ehci-platform",
227 .dma_mask
= &ehci0_device
.dev
.coherent_dma_mask
,
228 .coherent_dma_mask
= 0xffffffff,
229 .platform_data
= &ehcix_pdata
,
231 .num_resources
= ARRAY_SIZE(ehci0_resources
),
232 .resource
= ehci0_resources
,
235 static struct resource ehci1_resources
[] = {
238 .end
= 0xfff70400 - 1,
239 .flags
= IORESOURCE_MEM
,
242 .start
= gic_spi(45),
243 .flags
= IORESOURCE_IRQ
,
247 static struct platform_device ehci1_device
= {
248 .name
= "ehci-platform",
251 .dma_mask
= &ehci1_device
.dev
.coherent_dma_mask
,
252 .coherent_dma_mask
= 0xffffffff,
253 .platform_data
= &ehcix_pdata
,
255 .num_resources
= ARRAY_SIZE(ehci1_resources
),
256 .resource
= ehci1_resources
,
259 static struct usb_ohci_pdata ohcix_pdata
= {
260 .power_on
= usb_power_on
,
261 .power_off
= usb_power_off
,
262 .power_suspend
= usb_power_off
,
265 static struct resource ohci0_resources
[] = {
268 .end
= 0xffe70800 - 1,
269 .flags
= IORESOURCE_MEM
,
272 .start
= gic_spi(44),
273 .flags
= IORESOURCE_IRQ
,
277 static struct platform_device ohci0_device
= {
278 .name
= "ohci-platform",
281 .dma_mask
= &ohci0_device
.dev
.coherent_dma_mask
,
282 .coherent_dma_mask
= 0xffffffff,
283 .platform_data
= &ohcix_pdata
,
285 .num_resources
= ARRAY_SIZE(ohci0_resources
),
286 .resource
= ohci0_resources
,
289 static struct resource ohci1_resources
[] = {
292 .end
= 0xfff70800 - 1,
293 .flags
= IORESOURCE_MEM
,
296 .start
= gic_spi(45),
297 .flags
= IORESOURCE_IRQ
,
301 static struct platform_device ohci1_device
= {
302 .name
= "ohci-platform",
305 .dma_mask
= &ohci1_device
.dev
.coherent_dma_mask
,
306 .coherent_dma_mask
= 0xffffffff,
307 .platform_data
= &ohcix_pdata
,
309 .num_resources
= ARRAY_SIZE(ohci1_resources
),
310 .resource
= ohci1_resources
,
313 static struct platform_device
*marzen_late_devices
[] __initdata
= {
320 void __init
marzen_init_late(void)
323 phy
= usb_get_phy(USB_PHY_TYPE_USB2
);
325 shmobile_init_late();
326 platform_add_devices(marzen_late_devices
,
327 ARRAY_SIZE(marzen_late_devices
));
330 static void __init
marzen_init(void)
332 regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers
,
333 ARRAY_SIZE(fixed3v3_power_consumers
), 3300000);
334 regulator_register_fixed(1, dummy_supplies
,
335 ARRAY_SIZE(dummy_supplies
));
337 r8a7779_pinmux_init();
339 /* SCIF2 (CN18: DEBUG0) */
340 gpio_request(GPIO_FN_TX2_C
, NULL
);
341 gpio_request(GPIO_FN_RX2_C
, NULL
);
343 /* SCIF4 (CN19: DEBUG1) */
344 gpio_request(GPIO_FN_TX4
, NULL
);
345 gpio_request(GPIO_FN_RX4
, NULL
);
348 gpio_request(GPIO_FN_EX_CS0
, NULL
); /* nCS */
349 gpio_request(GPIO_FN_IRQ1_B
, NULL
); /* IRQ + PME */
352 gpio_request(GPIO_FN_SD0_CLK
, NULL
);
353 gpio_request(GPIO_FN_SD0_CMD
, NULL
);
354 gpio_request(GPIO_FN_SD0_DAT0
, NULL
);
355 gpio_request(GPIO_FN_SD0_DAT1
, NULL
);
356 gpio_request(GPIO_FN_SD0_DAT2
, NULL
);
357 gpio_request(GPIO_FN_SD0_DAT3
, NULL
);
358 gpio_request(GPIO_FN_SD0_CD
, NULL
);
359 gpio_request(GPIO_FN_SD0_WP
, NULL
);
362 gpio_request(GPIO_FN_HSPI_CLK0
, NULL
);
363 gpio_request(GPIO_FN_HSPI_CS0
, NULL
);
364 gpio_request(GPIO_FN_HSPI_TX0
, NULL
);
365 gpio_request(GPIO_FN_HSPI_RX0
, NULL
);
368 gpio_request(GPIO_FN_USB_OVC0
, NULL
);
369 gpio_request(GPIO_FN_USB_OVC1
, NULL
);
370 gpio_request(GPIO_FN_USB_OVC2
, NULL
);
373 gpio_request(GPIO_FN_USB_PENC2
, NULL
);
375 r8a7779_add_standard_devices();
376 platform_add_devices(marzen_devices
, ARRAY_SIZE(marzen_devices
));
379 MACHINE_START(MARZEN
, "marzen")
380 .smp
= smp_ops(r8a7779_smp_ops
),
381 .map_io
= r8a7779_map_io
,
382 .init_early
= r8a7779_add_early_devices
,
383 .nr_irqs
= NR_IRQS_LEGACY
,
384 .init_irq
= r8a7779_init_irq
,
385 .handle_irq
= gic_handle_irq
,
386 .init_machine
= marzen_init
,
387 .init_late
= marzen_init_late
,
388 .timer
= &shmobile_timer
,