2 * mackerel board support
4 * Copyright (C) 2010 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
8 * Copyright (C) 2010 Magnus Damm
9 * Copyright (C) 2008 Yoshihiro Shimoda
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.
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.
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
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>
32 #include <linux/mtd/mtd.h>
33 #include <linux/mtd/partitions.h>
34 #include <linux/mtd/physmap.h>
35 #include <linux/smsc911x.h>
37 #include <video/sh_mobile_lcdc.h>
39 #include <mach/common.h>
40 #include <mach/sh7372.h>
42 #include <asm/mach/arch.h>
43 #include <asm/mach/time.h>
44 #include <asm/mach/map.h>
45 #include <asm/mach-types.h>
48 * Address Interface BusWidth note
49 * ------------------------------------------------------------------
50 * 0x0000_0000 NOR Flash ROM (MCP) 16bit SW7 : bit1 = ON
51 * 0x0800_0000 user area -
52 * 0x1000_0000 NOR Flash ROM (MCP) 16bit SW7 : bit1 = OFF
53 * 0x1400_0000 Ether (LAN9220) 16bit
54 * 0x1600_0000 user area - cannot use with NAND
55 * 0x1800_0000 user area -
57 * 0x4000_0000 LPDDR2-SDRAM (POP) 32bit
61 static struct mtd_partition nor_flash_partitions
[] = {
66 .mask_flags
= MTD_WRITEABLE
,
70 .offset
= MTDPART_OFS_APPEND
,
72 .mask_flags
= MTD_WRITEABLE
,
76 .offset
= MTDPART_OFS_APPEND
,
77 .size
= 8 * 1024 * 1024,
78 .mask_flags
= MTD_WRITEABLE
,
82 .offset
= MTDPART_OFS_APPEND
,
83 .size
= 8 * 1024 * 1024,
87 .offset
= MTDPART_OFS_APPEND
,
88 .size
= MTDPART_SIZ_FULL
,
92 static struct physmap_flash_data nor_flash_data
= {
94 .parts
= nor_flash_partitions
,
95 .nr_parts
= ARRAY_SIZE(nor_flash_partitions
),
98 static struct resource nor_flash_resources
[] = {
101 .end
= 0x08000000 - 1,
102 .flags
= IORESOURCE_MEM
,
106 static struct platform_device nor_flash_device
= {
107 .name
= "physmap-flash",
109 .platform_data
= &nor_flash_data
,
111 .num_resources
= ARRAY_SIZE(nor_flash_resources
),
112 .resource
= nor_flash_resources
,
116 static struct resource smc911x_resources
[] = {
119 .end
= 0x16000000 - 1,
120 .flags
= IORESOURCE_MEM
,
122 .start
= evt2irq(0x02c0) /* IRQ6A */,
123 .flags
= IORESOURCE_IRQ
| IORESOURCE_IRQ_LOWLEVEL
,
127 static struct smsc911x_platform_config smsc911x_info
= {
128 .flags
= SMSC911X_USE_16BIT
| SMSC911X_SAVE_MAC_ADDRESS
,
129 .irq_polarity
= SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
130 .irq_type
= SMSC911X_IRQ_TYPE_PUSH_PULL
,
133 static struct platform_device smc911x_device
= {
136 .num_resources
= ARRAY_SIZE(smc911x_resources
),
137 .resource
= smc911x_resources
,
139 .platform_data
= &smsc911x_info
,
144 static struct fb_videomode mackerel_lcdc_modes
[] = {
146 .name
= "WVGA Panel",
159 static struct sh_mobile_lcdc_info lcdc_info
= {
160 .clock_source
= LCDC_CLK_BUS
,
162 .chan
= LCDC_CHAN_MAINLCD
,
164 .lcd_cfg
= mackerel_lcdc_modes
,
165 .num_cfg
= ARRAY_SIZE(mackerel_lcdc_modes
),
166 .interface_type
= RGB24
,
169 .lcd_size_cfg
.width
= 152,
170 .lcd_size_cfg
.height
= 91,
174 static struct resource lcdc_resources
[] = {
179 .flags
= IORESOURCE_MEM
,
182 .start
= intcs_evt2irq(0x580),
183 .flags
= IORESOURCE_IRQ
,
187 static struct platform_device lcdc_device
= {
188 .name
= "sh_mobile_lcdc_fb",
189 .num_resources
= ARRAY_SIZE(lcdc_resources
),
190 .resource
= lcdc_resources
,
192 .platform_data
= &lcdc_info
,
193 .coherent_dma_mask
= ~0,
197 static struct platform_device
*mackerel_devices
[] __initdata
= {
203 static struct map_desc mackerel_io_desc
[] __initdata
= {
204 /* create a 1:1 entity map for 0xe6xxxxxx
205 * used by CPGA, INTC and PFC.
208 .virtual = 0xe6000000,
209 .pfn
= __phys_to_pfn(0xe6000000),
211 .type
= MT_DEVICE_NONSHARED
215 static void __init
mackerel_map_io(void)
217 iotable_init(mackerel_io_desc
, ARRAY_SIZE(mackerel_io_desc
));
219 /* setup early devices and console here as well */
220 sh7372_add_early_devices();
221 shmobile_setup_console();
224 static void __init
mackerel_init(void)
226 sh7372_pinmux_init();
229 gpio_request(GPIO_FN_SCIFA0_TXD
, NULL
);
230 gpio_request(GPIO_FN_SCIFA0_RXD
, NULL
);
232 /* enable SMSC911X */
233 gpio_request(GPIO_FN_CS5A
, NULL
);
234 gpio_request(GPIO_FN_IRQ6_39
, NULL
);
237 gpio_request(GPIO_FN_LCDD17
, NULL
);
238 gpio_request(GPIO_FN_LCDD16
, NULL
);
239 gpio_request(GPIO_FN_LCDD15
, NULL
);
240 gpio_request(GPIO_FN_LCDD14
, NULL
);
241 gpio_request(GPIO_FN_LCDD13
, NULL
);
242 gpio_request(GPIO_FN_LCDD12
, NULL
);
243 gpio_request(GPIO_FN_LCDD11
, NULL
);
244 gpio_request(GPIO_FN_LCDD10
, NULL
);
245 gpio_request(GPIO_FN_LCDD9
, NULL
);
246 gpio_request(GPIO_FN_LCDD8
, NULL
);
247 gpio_request(GPIO_FN_LCDD7
, NULL
);
248 gpio_request(GPIO_FN_LCDD6
, NULL
);
249 gpio_request(GPIO_FN_LCDD5
, NULL
);
250 gpio_request(GPIO_FN_LCDD4
, NULL
);
251 gpio_request(GPIO_FN_LCDD3
, NULL
);
252 gpio_request(GPIO_FN_LCDD2
, NULL
);
253 gpio_request(GPIO_FN_LCDD1
, NULL
);
254 gpio_request(GPIO_FN_LCDD0
, NULL
);
255 gpio_request(GPIO_FN_LCDDISP
, NULL
);
256 gpio_request(GPIO_FN_LCDDCK
, NULL
);
258 gpio_request(GPIO_PORT31
, NULL
); /* backlight */
259 gpio_direction_output(GPIO_PORT31
, 1);
261 gpio_request(GPIO_PORT151
, NULL
); /* LCDDON */
262 gpio_direction_output(GPIO_PORT151
, 1);
265 sh7372_add_standard_devices();
267 platform_add_devices(mackerel_devices
, ARRAY_SIZE(mackerel_devices
));
270 static void __init
mackerel_timer_init(void)
273 shmobile_timer
.init();
276 static struct sys_timer mackerel_timer
= {
277 .init
= mackerel_timer_init
,
280 MACHINE_START(MACKEREL
, "mackerel")
281 .map_io
= mackerel_map_io
,
282 .init_irq
= sh7372_init_irq
,
283 .init_machine
= mackerel_init
,
284 .timer
= &mackerel_timer
,