]> git.karo-electronics.de Git - mv-sheeva.git/blob - arch/arm/mach-shmobile/board-mackerel.c
f9418e72900bdf89bfb8d267f5f3dc3c980724a3
[mv-sheeva.git] / arch / arm / mach-shmobile / board-mackerel.c
1 /*
2  * mackerel board support
3  *
4  * Copyright (C) 2010 Renesas Solutions Corp.
5  * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6  *
7  * based on ap4evb
8  * Copyright (C) 2010  Magnus Damm
9  * Copyright (C) 2008  Yoshihiro Shimoda
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; version 2 of the License.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23  */
24 #include <linux/kernel.h>
25 #include <linux/init.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/platform_device.h>
29 #include <linux/gpio.h>
30 #include <linux/input.h>
31 #include <linux/io.h>
32 #include <linux/mtd/mtd.h>
33 #include <linux/mtd/partitions.h>
34 #include <linux/mtd/physmap.h>
35 #include <linux/smsc911x.h>
36 #include <linux/usb/r8a66597.h>
37
38 #include <video/sh_mobile_lcdc.h>
39
40 #include <mach/common.h>
41 #include <mach/sh7372.h>
42
43 #include <asm/mach/arch.h>
44 #include <asm/mach/time.h>
45 #include <asm/mach/map.h>
46 #include <asm/mach-types.h>
47
48 /*
49  * Address      Interface               BusWidth        note
50  * ------------------------------------------------------------------
51  * 0x0000_0000  NOR Flash ROM (MCP)     16bit           SW7 : bit1 = ON
52  * 0x0800_0000  user area               -
53  * 0x1000_0000  NOR Flash ROM (MCP)     16bit           SW7 : bit1 = OFF
54  * 0x1400_0000  Ether (LAN9220)         16bit
55  * 0x1600_0000  user area               -               cannot use with NAND
56  * 0x1800_0000  user area               -
57  * 0x1A00_0000  -
58  * 0x4000_0000  LPDDR2-SDRAM (POP)      32bit
59  */
60
61 /*
62  * CPU mode
63  *
64  * SW4                                     | Boot Area| Master   | Remarks
65  *  1  | 2   | 3   | 4   | 5   | 6   | 8   |          | Processor|
66  * ----+-----+-----+-----+-----+-----+-----+----------+----------+--------------
67  * ON  | ON  | OFF | ON  | ON  | OFF | OFF | External | System   | External ROM
68  * ON  | ON  | ON  | ON  | ON  | OFF | OFF | External | System   | ROM Debug
69  * ON  | ON  | X   | ON  | OFF | OFF | OFF | Built-in | System   | ROM Debug
70  * X   | OFF | X   | X   | X   | X   | OFF | Built-in | System   | MaskROM
71  * OFF | X   | X   | X   | X   | X   | OFF | Built-in | System   | MaskROM
72  * X   | X   | X   | OFF | X   | X   | OFF | Built-in | System   | MaskROM
73  * OFF | ON  | OFF | X   | X   | OFF | ON  | External | System   | Standalone
74  * ON  | OFF | OFF | X   | X   | OFF | ON  | External | Realtime | Standalone
75 */
76
77 /*
78  * NOR Flash ROM
79  *
80  *  SW1  |     SW2    | SW7  | NOR Flash ROM
81  *  bit1 | bit1  bit2 | bit1 | Memory allocation
82  * ------+------------+------+------------------
83  *  OFF  | ON     OFF | ON   |    Area 0
84  *  OFF  | ON     OFF | OFF  |    Area 4
85  */
86
87 /*
88  * SMSC 9220
89  *
90  *  SW1         SMSC 9220
91  * -----------------------
92  *  ON          access disable
93  *  OFF         access enable
94  */
95
96 /*
97  * NAND Flash ROM
98  *
99  *  SW1  |     SW2    | SW7  | NAND Flash ROM
100  *  bit1 | bit1  bit2 | bit2 | Memory allocation
101  * ------+------------+------+------------------
102  *  OFF  | ON     OFF | ON   |    FCE 0
103  *  OFF  | ON     OFF | OFF  |    FCE 1
104  */
105
106 /*
107  * External interrupt pin settings
108  *
109  * IRQX  | pin setting        | device             | level
110  * ------+--------------------+--------------------+-------
111  * IRQ0  | ICR1A.IRQ0SA=0010  | SDHI2 card detect  | Low
112  * IRQ6  | ICR1A.IRQ6SA=0011  | Ether(LAN9220)     | High
113  * IRQ7  | ICR1A.IRQ7SA=0010  | LCD Tuch Panel     | Low
114  * IRQ8  | ICR2A.IRQ8SA=0010  | MMC/SD card detect | Low
115  * IRQ9  | ICR2A.IRQ9SA=0010  | KEY(TCA6408)       | Low
116  * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345)    | High
117  * IRQ22 | ICR4A.IRQ22SA=0011 | Sensor(AK8975)     | High
118  */
119
120 /*
121  * USB
122  *
123  * USB0 : CN22 : Function
124  * USB1 : CN31 : Function/Host *1
125  *
126  * J30 (for CN31) *1
127  * ----------+---------------+-------------
128  * 1-2 short | VBUS 5V       | Host
129  * open      | external VBUS | Function
130  *
131  * *1
132  * CN31 is used as Host in Linux.
133  */
134
135 /* MTD */
136 static struct mtd_partition nor_flash_partitions[] = {
137         {
138                 .name           = "loader",
139                 .offset         = 0x00000000,
140                 .size           = 512 * 1024,
141                 .mask_flags     = MTD_WRITEABLE,
142         },
143         {
144                 .name           = "bootenv",
145                 .offset         = MTDPART_OFS_APPEND,
146                 .size           = 512 * 1024,
147                 .mask_flags     = MTD_WRITEABLE,
148         },
149         {
150                 .name           = "kernel_ro",
151                 .offset         = MTDPART_OFS_APPEND,
152                 .size           = 8 * 1024 * 1024,
153                 .mask_flags     = MTD_WRITEABLE,
154         },
155         {
156                 .name           = "kernel",
157                 .offset         = MTDPART_OFS_APPEND,
158                 .size           = 8 * 1024 * 1024,
159         },
160         {
161                 .name           = "data",
162                 .offset         = MTDPART_OFS_APPEND,
163                 .size           = MTDPART_SIZ_FULL,
164         },
165 };
166
167 static struct physmap_flash_data nor_flash_data = {
168         .width          = 2,
169         .parts          = nor_flash_partitions,
170         .nr_parts       = ARRAY_SIZE(nor_flash_partitions),
171 };
172
173 static struct resource nor_flash_resources[] = {
174         [0]     = {
175                 .start  = 0x00000000,
176                 .end    = 0x08000000 - 1,
177                 .flags  = IORESOURCE_MEM,
178         }
179 };
180
181 static struct platform_device nor_flash_device = {
182         .name           = "physmap-flash",
183         .dev            = {
184                 .platform_data  = &nor_flash_data,
185         },
186         .num_resources  = ARRAY_SIZE(nor_flash_resources),
187         .resource       = nor_flash_resources,
188 };
189
190 /* SMSC */
191 static struct resource smc911x_resources[] = {
192         {
193                 .start  = 0x14000000,
194                 .end    = 0x16000000 - 1,
195                 .flags  = IORESOURCE_MEM,
196         }, {
197                 .start  = evt2irq(0x02c0) /* IRQ6A */,
198                 .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
199         },
200 };
201
202 static struct smsc911x_platform_config smsc911x_info = {
203         .flags          = SMSC911X_USE_16BIT | SMSC911X_SAVE_MAC_ADDRESS,
204         .irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
205         .irq_type       = SMSC911X_IRQ_TYPE_PUSH_PULL,
206 };
207
208 static struct platform_device smc911x_device = {
209         .name           = "smsc911x",
210         .id             = -1,
211         .num_resources  = ARRAY_SIZE(smc911x_resources),
212         .resource       = smc911x_resources,
213         .dev            = {
214                 .platform_data = &smsc911x_info,
215         },
216 };
217
218 /* LCDC */
219 static struct fb_videomode mackerel_lcdc_modes[] = {
220         {
221                 .name           = "WVGA Panel",
222                 .xres           = 800,
223                 .yres           = 480,
224                 .left_margin    = 220,
225                 .right_margin   = 110,
226                 .hsync_len      = 70,
227                 .upper_margin   = 20,
228                 .lower_margin   = 5,
229                 .vsync_len      = 5,
230                 .sync           = 0,
231         },
232 };
233
234 static struct sh_mobile_lcdc_info lcdc_info = {
235         .clock_source = LCDC_CLK_BUS,
236         .ch[0] = {
237                 .chan = LCDC_CHAN_MAINLCD,
238                 .bpp = 16,
239                 .lcd_cfg = mackerel_lcdc_modes,
240                 .num_cfg = ARRAY_SIZE(mackerel_lcdc_modes),
241                 .interface_type         = RGB24,
242                 .clock_divider          = 2,
243                 .flags                  = 0,
244                 .lcd_size_cfg.width     = 152,
245                 .lcd_size_cfg.height    = 91,
246         }
247 };
248
249 static struct resource lcdc_resources[] = {
250         [0] = {
251                 .name   = "LCDC",
252                 .start  = 0xfe940000,
253                 .end    = 0xfe943fff,
254                 .flags  = IORESOURCE_MEM,
255         },
256         [1] = {
257                 .start  = intcs_evt2irq(0x580),
258                 .flags  = IORESOURCE_IRQ,
259         },
260 };
261
262 static struct platform_device lcdc_device = {
263         .name           = "sh_mobile_lcdc_fb",
264         .num_resources  = ARRAY_SIZE(lcdc_resources),
265         .resource       = lcdc_resources,
266         .dev    = {
267                 .platform_data  = &lcdc_info,
268                 .coherent_dma_mask = ~0,
269         },
270 };
271
272 /* USB1 (Host) */
273 static void usb1_host_port_power(int port, int power)
274 {
275         if (!power) /* only power-on is supported for now */
276                 return;
277
278         /* set VBOUT/PWEN and EXTLP1 in DVSTCTR */
279         __raw_writew(__raw_readw(0xE68B0008) | 0x600, 0xE68B0008);
280 }
281
282 static struct r8a66597_platdata usb1_host_data = {
283         .on_chip        = 1,
284         .port_power     = usb1_host_port_power,
285 };
286
287 static struct resource usb1_host_resources[] = {
288         [0] = {
289                 .name   = "USBHS",
290                 .start  = 0xE68B0000,
291                 .end    = 0xE68B00E6 - 1,
292                 .flags  = IORESOURCE_MEM,
293         },
294         [1] = {
295                 .start  = evt2irq(0x1ce0) /* USB1_USB1I0 */,
296                 .flags  = IORESOURCE_IRQ,
297         },
298 };
299
300 static struct platform_device usb1_host_device = {
301         .name   = "r8a66597_hcd",
302         .id     = 1,
303         .dev = {
304                 .dma_mask               = NULL,         /*  not use dma */
305                 .coherent_dma_mask      = 0xffffffff,
306                 .platform_data          = &usb1_host_data,
307         },
308         .num_resources  = ARRAY_SIZE(usb1_host_resources),
309         .resource       = usb1_host_resources,
310 };
311
312 static struct platform_device *mackerel_devices[] __initdata = {
313         &nor_flash_device,
314         &smc911x_device,
315         &lcdc_device,
316         &usb1_host_device,
317 };
318
319 static struct map_desc mackerel_io_desc[] __initdata = {
320         /* create a 1:1 entity map for 0xe6xxxxxx
321          * used by CPGA, INTC and PFC.
322          */
323         {
324                 .virtual        = 0xe6000000,
325                 .pfn            = __phys_to_pfn(0xe6000000),
326                 .length         = 256 << 20,
327                 .type           = MT_DEVICE_NONSHARED
328         },
329 };
330
331 static void __init mackerel_map_io(void)
332 {
333         iotable_init(mackerel_io_desc, ARRAY_SIZE(mackerel_io_desc));
334
335         /* setup early devices and console here as well */
336         sh7372_add_early_devices();
337         shmobile_setup_console();
338 }
339
340 static void __init mackerel_init(void)
341 {
342         sh7372_pinmux_init();
343
344         /* enable SCIFA0 */
345         gpio_request(GPIO_FN_SCIFA0_TXD, NULL);
346         gpio_request(GPIO_FN_SCIFA0_RXD, NULL);
347
348         /* enable SMSC911X */
349         gpio_request(GPIO_FN_CS5A,      NULL);
350         gpio_request(GPIO_FN_IRQ6_39,   NULL);
351
352         /* LCDC */
353         gpio_request(GPIO_FN_LCDD23,   NULL);
354         gpio_request(GPIO_FN_LCDD22,   NULL);
355         gpio_request(GPIO_FN_LCDD21,   NULL);
356         gpio_request(GPIO_FN_LCDD20,   NULL);
357         gpio_request(GPIO_FN_LCDD19,   NULL);
358         gpio_request(GPIO_FN_LCDD18,   NULL);
359         gpio_request(GPIO_FN_LCDD17,   NULL);
360         gpio_request(GPIO_FN_LCDD16,   NULL);
361         gpio_request(GPIO_FN_LCDD15,   NULL);
362         gpio_request(GPIO_FN_LCDD14,   NULL);
363         gpio_request(GPIO_FN_LCDD13,   NULL);
364         gpio_request(GPIO_FN_LCDD12,   NULL);
365         gpio_request(GPIO_FN_LCDD11,   NULL);
366         gpio_request(GPIO_FN_LCDD10,   NULL);
367         gpio_request(GPIO_FN_LCDD9,    NULL);
368         gpio_request(GPIO_FN_LCDD8,    NULL);
369         gpio_request(GPIO_FN_LCDD7,    NULL);
370         gpio_request(GPIO_FN_LCDD6,    NULL);
371         gpio_request(GPIO_FN_LCDD5,    NULL);
372         gpio_request(GPIO_FN_LCDD4,    NULL);
373         gpio_request(GPIO_FN_LCDD3,    NULL);
374         gpio_request(GPIO_FN_LCDD2,    NULL);
375         gpio_request(GPIO_FN_LCDD1,    NULL);
376         gpio_request(GPIO_FN_LCDD0,    NULL);
377         gpio_request(GPIO_FN_LCDDISP,  NULL);
378         gpio_request(GPIO_FN_LCDDCK,   NULL);
379
380         gpio_request(GPIO_PORT31, NULL); /* backlight */
381         gpio_direction_output(GPIO_PORT31, 1);
382
383         gpio_request(GPIO_PORT151, NULL); /* LCDDON */
384         gpio_direction_output(GPIO_PORT151, 1);
385
386         /* USB enable */
387         gpio_request(GPIO_FN_VBUS0_1,    NULL);
388         gpio_request(GPIO_FN_IDIN_1_18,  NULL);
389         gpio_request(GPIO_FN_PWEN_1_115, NULL);
390         gpio_request(GPIO_FN_OVCN_1_114, NULL);
391         gpio_request(GPIO_FN_EXTLP_1,    NULL);
392         gpio_request(GPIO_FN_OVCN2_1,    NULL);
393
394         /* setup USB phy */
395         __raw_writew(0x8a0a, 0xE6058130);       /* USBCR2 */
396
397
398         sh7372_add_standard_devices();
399
400         platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices));
401 }
402
403 static void __init mackerel_timer_init(void)
404 {
405         sh7372_clock_init();
406         shmobile_timer.init();
407 }
408
409 static struct sys_timer mackerel_timer = {
410         .init           = mackerel_timer_init,
411 };
412
413 MACHINE_START(MACKEREL, "mackerel")
414         .map_io         = mackerel_map_io,
415         .init_irq       = sh7372_init_irq,
416         .init_machine   = mackerel_init,
417         .timer          = &mackerel_timer,
418 MACHINE_END