]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm/mach-shmobile/board-marzen.c
Merge tag 'pm+acpi-3.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[karo-tx-linux.git] / arch / arm / mach-shmobile / board-marzen.c
1 /*
2  * marzen board support
3  *
4  * Copyright (C) 2011  Renesas Solutions Corp.
5  * Copyright (C) 2011  Magnus Damm
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 #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>
27 #include <linux/io.h>
28 #include <linux/leds.h>
29 #include <linux/dma-mapping.h>
30 #include <linux/pinctrl/machine.h>
31 #include <linux/platform_data/gpio-rcar.h>
32 #include <linux/regulator/fixed.h>
33 #include <linux/regulator/machine.h>
34 #include <linux/smsc911x.h>
35 #include <linux/spi/spi.h>
36 #include <linux/spi/sh_hspi.h>
37 #include <linux/mmc/host.h>
38 #include <linux/mmc/sh_mobile_sdhi.h>
39 #include <linux/mfd/tmio.h>
40 #include <mach/hardware.h>
41 #include <mach/r8a7779.h>
42 #include <mach/common.h>
43 #include <mach/irqs.h>
44 #include <asm/mach-types.h>
45 #include <asm/mach/arch.h>
46 #include <asm/traps.h>
47
48 /* Fixed 3.3V regulator to be used by SDHI0 */
49 static struct regulator_consumer_supply fixed3v3_power_consumers[] = {
50         REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
51         REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
52 };
53
54 /* Dummy supplies, where voltage doesn't matter */
55 static struct regulator_consumer_supply dummy_supplies[] = {
56         REGULATOR_SUPPLY("vddvario", "smsc911x"),
57         REGULATOR_SUPPLY("vdd33a", "smsc911x"),
58 };
59
60 static struct rcar_phy_platform_data usb_phy_platform_data __initdata;
61
62 /* SMSC LAN89218 */
63 static struct resource smsc911x_resources[] = {
64         [0] = {
65                 .start          = 0x18000000, /* ExCS0 */
66                 .end            = 0x180000ff, /* A1->A7 */
67                 .flags          = IORESOURCE_MEM,
68         },
69         [1] = {
70                 .start          = irq_pin(1), /* IRQ 1 */
71                 .flags          = IORESOURCE_IRQ,
72         },
73 };
74
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,
80 };
81
82 static struct platform_device eth_device = {
83         .name           = "smsc911x",
84         .id             = -1,
85         .dev  = {
86                 .platform_data = &smsc911x_platdata,
87         },
88         .resource       = smsc911x_resources,
89         .num_resources  = ARRAY_SIZE(smsc911x_resources),
90 };
91
92 static struct resource sdhi0_resources[] = {
93         [0] = {
94                 .name   = "sdhi0",
95                 .start  = 0xffe4c000,
96                 .end    = 0xffe4c0ff,
97                 .flags  = IORESOURCE_MEM,
98         },
99         [1] = {
100                 .start  = gic_iid(0x88),
101                 .flags  = IORESOURCE_IRQ,
102         },
103 };
104
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,
108 };
109
110 static struct platform_device sdhi0_device = {
111         .name = "sh_mobile_sdhi",
112         .num_resources = ARRAY_SIZE(sdhi0_resources),
113         .resource = sdhi0_resources,
114         .id = 0,
115         .dev = {
116                 .platform_data = &sdhi0_platform_data,
117         }
118 };
119
120 /* Thermal */
121 static struct resource thermal_resources[] = {
122         [0] = {
123                 .start          = 0xFFC48000,
124                 .end            = 0xFFC48038 - 1,
125                 .flags          = IORESOURCE_MEM,
126         },
127 };
128
129 static struct platform_device thermal_device = {
130         .name           = "rcar_thermal",
131         .resource       = thermal_resources,
132         .num_resources  = ARRAY_SIZE(thermal_resources),
133 };
134
135 /* HSPI */
136 static struct resource hspi_resources[] = {
137         [0] = {
138                 .start          = 0xFFFC7000,
139                 .end            = 0xFFFC7018 - 1,
140                 .flags          = IORESOURCE_MEM,
141         },
142 };
143
144 static struct platform_device hspi_device = {
145         .name   = "sh-hspi",
146         .id     = 0,
147         .resource       = hspi_resources,
148         .num_resources  = ARRAY_SIZE(hspi_resources),
149 };
150
151 /* LEDS */
152 static struct gpio_led marzen_leds[] = {
153         {
154                 .name           = "led2",
155                 .gpio           = RCAR_GP_PIN(4, 29),
156                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
157         }, {
158                 .name           = "led3",
159                 .gpio           = RCAR_GP_PIN(4, 30),
160                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
161         }, {
162                 .name           = "led4",
163                 .gpio           = RCAR_GP_PIN(4, 31),
164                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
165         },
166 };
167
168 static struct gpio_led_platform_data marzen_leds_pdata = {
169         .leds           = marzen_leds,
170         .num_leds       = ARRAY_SIZE(marzen_leds),
171 };
172
173 static struct platform_device leds_device = {
174         .name   = "leds-gpio",
175         .id     = 0,
176         .dev    = {
177                 .platform_data  = &marzen_leds_pdata,
178         },
179 };
180
181 static struct platform_device *marzen_devices[] __initdata = {
182         &eth_device,
183         &sdhi0_device,
184         &thermal_device,
185         &hspi_device,
186         &leds_device,
187 };
188
189 static const struct pinctrl_map marzen_pinctrl_map[] = {
190         /* HSPI0 */
191         PIN_MAP_MUX_GROUP_DEFAULT("sh-hspi.0", "pfc-r8a7779",
192                                   "hspi0", "hspi0"),
193         /* SCIF2 (CN18: DEBUG0) */
194         PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-r8a7779",
195                                   "scif2_data_c", "scif2"),
196         /* SCIF4 (CN19: DEBUG1) */
197         PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-r8a7779",
198                                   "scif4_data", "scif4"),
199         /* SDHI0 */
200         PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
201                                   "sdhi0_data4", "sdhi0"),
202         PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
203                                   "sdhi0_ctrl", "sdhi0"),
204         PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
205                                   "sdhi0_cd", "sdhi0"),
206         PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
207                                   "sdhi0_wp", "sdhi0"),
208         /* SMSC */
209         PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a7779",
210                                   "intc_irq1_b", "intc"),
211         PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a7779",
212                                   "lbsc_ex_cs0", "lbsc"),
213         /* USB0 */
214         PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.0", "pfc-r8a7779",
215                                   "usb0", "usb0"),
216         /* USB1 */
217         PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.0", "pfc-r8a7779",
218                                   "usb1", "usb1"),
219         /* USB2 */
220         PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.1", "pfc-r8a7779",
221                                   "usb2", "usb2"),
222 };
223
224 static void __init marzen_init(void)
225 {
226         regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
227                                 ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
228         regulator_register_fixed(1, dummy_supplies,
229                                 ARRAY_SIZE(dummy_supplies));
230
231         pinctrl_register_mappings(marzen_pinctrl_map,
232                                   ARRAY_SIZE(marzen_pinctrl_map));
233         r8a7779_pinmux_init();
234         r8a7779_init_irq_extpin(1); /* IRQ1 as individual interrupt */
235
236         r8a7779_add_standard_devices();
237         r8a7779_add_usb_phy_device(&usb_phy_platform_data);
238         platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices));
239 }
240
241 MACHINE_START(MARZEN, "marzen")
242         .smp            = smp_ops(r8a7779_smp_ops),
243         .map_io         = r8a7779_map_io,
244         .init_early     = r8a7779_add_early_devices,
245         .nr_irqs        = NR_IRQS_LEGACY,
246         .init_irq       = r8a7779_init_irq,
247         .init_machine   = marzen_init,
248         .init_late      = r8a7779_init_late,
249         .init_time      = r8a7779_earlytimer_init,
250 MACHINE_END