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/delay.h>
25 #include <linux/kernel.h>
26 #include <linux/init.h>
27 #include <linux/interrupt.h>
28 #include <linux/irq.h>
29 #include <linux/platform_device.h>
30 #include <linux/gpio.h>
31 #include <linux/input.h>
32 #include <linux/io.h>
33 #include <linux/i2c.h>
34 #include <linux/leds.h>
35 #include <linux/mfd/tmio.h>
36 #include <linux/mmc/host.h>
37 #include <linux/mmc/sh_mmcif.h>
38 #include <linux/mmc/sh_mobile_sdhi.h>
39 #include <linux/mtd/mtd.h>
40 #include <linux/mtd/partitions.h>
41 #include <linux/mtd/physmap.h>
42 #include <linux/pm_clock.h>
43 #include <linux/smsc911x.h>
44 #include <linux/sh_intc.h>
45 #include <linux/tca6416_keypad.h>
46 #include <linux/usb/renesas_usbhs.h>
47 #include <linux/dma-mapping.h>
48 
49 #include <video/sh_mobile_hdmi.h>
50 #include <video/sh_mobile_lcdc.h>
51 #include <media/sh_mobile_ceu.h>
52 #include <media/soc_camera.h>
53 #include <media/soc_camera_platform.h>
54 #include <sound/sh_fsi.h>
55 
56 #include <mach/common.h>
57 #include <mach/sh7372.h>
58 
59 #include <asm/mach/arch.h>
60 #include <asm/mach/time.h>
61 #include <asm/mach/map.h>
62 #include <asm/mach-types.h>
63 
64 /*
65  * Address	Interface		BusWidth	note
66  * ------------------------------------------------------------------
67  * 0x0000_0000	NOR Flash ROM (MCP)	16bit		SW7 : bit1 = ON
68  * 0x0800_0000	user area		-
69  * 0x1000_0000	NOR Flash ROM (MCP)	16bit		SW7 : bit1 = OFF
70  * 0x1400_0000	Ether (LAN9220)		16bit
71  * 0x1600_0000	user area		-		cannot use with NAND
72  * 0x1800_0000	user area		-
73  * 0x1A00_0000	-
74  * 0x4000_0000	LPDDR2-SDRAM (POP)	32bit
75  */
76 
77 /*
78  * CPU mode
79  *
80  * SW4                                     | Boot Area| Master   | Remarks
81  *  1  | 2   | 3   | 4   | 5   | 6   | 8   |          | Processor|
82  * ----+-----+-----+-----+-----+-----+-----+----------+----------+--------------
83  * ON  | ON  | OFF | ON  | ON  | OFF | OFF | External | System   | External ROM
84  * ON  | ON  | ON  | ON  | ON  | OFF | OFF | External | System   | ROM Debug
85  * ON  | ON  | X   | ON  | OFF | OFF | OFF | Built-in | System   | ROM Debug
86  * X   | OFF | X   | X   | X   | X   | OFF | Built-in | System   | MaskROM
87  * OFF | X   | X   | X   | X   | X   | OFF | Built-in | System   | MaskROM
88  * X   | X   | X   | OFF | X   | X   | OFF | Built-in | System   | MaskROM
89  * OFF | ON  | OFF | X   | X   | OFF | ON  | External | System   | Standalone
90  * ON  | OFF | OFF | X   | X   | OFF | ON  | External | Realtime | Standalone
91 */
92 
93 /*
94  * NOR Flash ROM
95  *
96  *  SW1  |     SW2    | SW7  | NOR Flash ROM
97  *  bit1 | bit1  bit2 | bit1 | Memory allocation
98  * ------+------------+------+------------------
99  *  OFF  | ON     OFF | ON   |    Area 0
100  *  OFF  | ON     OFF | OFF  |    Area 4
101  */
102 
103 /*
104  * SMSC 9220
105  *
106  *  SW1		SMSC 9220
107  * -----------------------
108  *  ON		access disable
109  *  OFF		access enable
110  */
111 
112 /*
113  * NAND Flash ROM
114  *
115  *  SW1  |     SW2    | SW7  | NAND Flash ROM
116  *  bit1 | bit1  bit2 | bit2 | Memory allocation
117  * ------+------------+------+------------------
118  *  OFF  | ON     OFF | ON   |    FCE 0
119  *  OFF  | ON     OFF | OFF  |    FCE 1
120  */
121 
122 /*
123  * External interrupt pin settings
124  *
125  * IRQX  | pin setting        | device             | level
126  * ------+--------------------+--------------------+-------
127  * IRQ0  | ICR1A.IRQ0SA=0010  | SDHI2 card detect  | Low
128  * IRQ6  | ICR1A.IRQ6SA=0011  | Ether(LAN9220)     | High
129  * IRQ7  | ICR1A.IRQ7SA=0010  | LCD Touch Panel    | Low
130  * IRQ8  | ICR2A.IRQ8SA=0010  | MMC/SD card detect | Low
131  * IRQ9  | ICR2A.IRQ9SA=0010  | KEY(TCA6408)       | Low
132  * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345)    | High
133  * IRQ22 | ICR4A.IRQ22SA=0011 | Sensor(AK8975)     | High
134  */
135 
136 /*
137  * USB
138  *
139  * USB0 : CN22 : Function
140  * USB1 : CN31 : Function/Host *1
141  *
142  * J30 (for CN31) *1
143  * ----------+---------------+-------------
144  * 1-2 short | VBUS 5V       | Host
145  * open      | external VBUS | Function
146  *
147  * CAUTION
148  *
149  * renesas_usbhs driver can use external interrupt mode
150  * (which come from USB-PHY) or autonomy mode (it use own interrupt)
151  * for detecting connection/disconnection when Function.
152  * USB will be power OFF while it has been disconnecting
153  * if external interrupt mode, and it is always power ON if autonomy mode,
154  *
155  * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0",
156  * because Touchscreen is using IRQ7-PORT40.
157  * It is impossible to use IRQ7 demux on this board.
158  */
159 
160 /*
161  * SDHI0 (CN12)
162  *
163  * SW56 : OFF
164  *
165  */
166 
167 /* MMC /SDHI1 (CN7)
168  *
169  * I/O voltage : 1.8v
170  *
171  * Power voltage : 1.8v or 3.3v
172  *  J22 : select power voltage *1
173  *	1-2 pin : 1.8v
174  *	2-3 pin : 3.3v
175  *
176  * *1
177  * Please change J22 depends the card to be used.
178  * MMC's OCR field set to support either voltage for the card inserted.
179  *
180  *	SW1	|	SW33
181  *		| bit1 | bit2 | bit3 | bit4
182  * -------------+------+------+------+-------
183  * MMC0   OFF	|  OFF |   X  |  ON  |  X       (Use MMCIF)
184  * SDHI1  OFF	|  ON  |   X  |  OFF |  X       (Use MFD_SH_MOBILE_SDHI)
185  *
186  */
187 
188 /*
189  * SDHI2 (CN23)
190  *
191  * microSD card sloct
192  *
193  */
194 
195 /*
196  * FSI - AK4642
197  *
198  * it needs amixer settings for playing
199  *
200  * amixer set "Headphone" on
201  * amixer set "HPOUTL Mixer DACH" on
202  * amixer set "HPOUTR Mixer DACH" on
203  */
204 
205 /*
206  * FIXME !!
207  *
208  * gpio_no_direction
209  * gpio_pull_down
210  * are quick_hack.
211  *
212  * current gpio frame work doesn't have
213  * the method to control only pull up/down/free.
214  * this function should be replaced by correct gpio function
215  */
gpio_no_direction(u32 addr)216 static void __init gpio_no_direction(u32 addr)
217 {
218 	__raw_writeb(0x00, addr);
219 }
220 
gpio_pull_down(u32 addr)221 static void __init gpio_pull_down(u32 addr)
222 {
223 	u8 data = __raw_readb(addr);
224 
225 	data &= 0x0F;
226 	data |= 0xA0;
227 
228 	__raw_writeb(data, addr);
229 }
230 
231 /* MTD */
232 static struct mtd_partition nor_flash_partitions[] = {
233 	{
234 		.name		= "loader",
235 		.offset		= 0x00000000,
236 		.size		= 512 * 1024,
237 		.mask_flags	= MTD_WRITEABLE,
238 	},
239 	{
240 		.name		= "bootenv",
241 		.offset		= MTDPART_OFS_APPEND,
242 		.size		= 512 * 1024,
243 		.mask_flags	= MTD_WRITEABLE,
244 	},
245 	{
246 		.name		= "kernel_ro",
247 		.offset		= MTDPART_OFS_APPEND,
248 		.size		= 8 * 1024 * 1024,
249 		.mask_flags	= MTD_WRITEABLE,
250 	},
251 	{
252 		.name		= "kernel",
253 		.offset		= MTDPART_OFS_APPEND,
254 		.size		= 8 * 1024 * 1024,
255 	},
256 	{
257 		.name		= "data",
258 		.offset		= MTDPART_OFS_APPEND,
259 		.size		= MTDPART_SIZ_FULL,
260 	},
261 };
262 
263 static struct physmap_flash_data nor_flash_data = {
264 	.width		= 2,
265 	.parts		= nor_flash_partitions,
266 	.nr_parts	= ARRAY_SIZE(nor_flash_partitions),
267 };
268 
269 static struct resource nor_flash_resources[] = {
270 	[0]	= {
271 		.start	= 0x20000000, /* CS0 shadow instead of regular CS0 */
272 		.end	= 0x28000000 - 1, /* needed by USB MASK ROM boot */
273 		.flags	= IORESOURCE_MEM,
274 	}
275 };
276 
277 static struct platform_device nor_flash_device = {
278 	.name		= "physmap-flash",
279 	.dev		= {
280 		.platform_data	= &nor_flash_data,
281 	},
282 	.num_resources	= ARRAY_SIZE(nor_flash_resources),
283 	.resource	= nor_flash_resources,
284 };
285 
286 /* SMSC */
287 static struct resource smc911x_resources[] = {
288 	{
289 		.start	= 0x14000000,
290 		.end	= 0x16000000 - 1,
291 		.flags	= IORESOURCE_MEM,
292 	}, {
293 		.start	= evt2irq(0x02c0) /* IRQ6A */,
294 		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
295 	},
296 };
297 
298 static struct smsc911x_platform_config smsc911x_info = {
299 	.flags		= SMSC911X_USE_16BIT | SMSC911X_SAVE_MAC_ADDRESS,
300 	.irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
301 	.irq_type       = SMSC911X_IRQ_TYPE_PUSH_PULL,
302 };
303 
304 static struct platform_device smc911x_device = {
305 	.name           = "smsc911x",
306 	.id             = -1,
307 	.num_resources  = ARRAY_SIZE(smc911x_resources),
308 	.resource       = smc911x_resources,
309 	.dev            = {
310 		.platform_data = &smsc911x_info,
311 	},
312 };
313 
314 /* MERAM */
315 static struct sh_mobile_meram_info mackerel_meram_info = {
316 	.addr_mode	= SH_MOBILE_MERAM_MODE1,
317 };
318 
319 static struct resource meram_resources[] = {
320 	[0] = {
321 		.name	= "MERAM",
322 		.start	= 0xe8000000,
323 		.end	= 0xe81fffff,
324 		.flags	= IORESOURCE_MEM,
325 	},
326 };
327 
328 static struct platform_device meram_device = {
329 	.name		= "sh_mobile_meram",
330 	.id		= 0,
331 	.num_resources	= ARRAY_SIZE(meram_resources),
332 	.resource	= meram_resources,
333 	.dev		= {
334 		.platform_data = &mackerel_meram_info,
335 	},
336 };
337 
338 /* LCDC */
339 static struct fb_videomode mackerel_lcdc_modes[] = {
340 	{
341 		.name		= "WVGA Panel",
342 		.xres		= 800,
343 		.yres		= 480,
344 		.left_margin	= 220,
345 		.right_margin	= 110,
346 		.hsync_len	= 70,
347 		.upper_margin	= 20,
348 		.lower_margin	= 5,
349 		.vsync_len	= 5,
350 		.sync		= 0,
351 	},
352 };
353 
mackerel_set_brightness(void * board_data,int brightness)354 static int mackerel_set_brightness(void *board_data, int brightness)
355 {
356 	gpio_set_value(GPIO_PORT31, brightness);
357 
358 	return 0;
359 }
360 
mackerel_get_brightness(void * board_data)361 static int mackerel_get_brightness(void *board_data)
362 {
363 	return gpio_get_value(GPIO_PORT31);
364 }
365 
366 static struct sh_mobile_meram_cfg lcd_meram_cfg = {
367 	.icb[0] = {
368 		.marker_icb     = 28,
369 		.cache_icb      = 24,
370 		.meram_offset   = 0x0,
371 		.meram_size     = 0x40,
372 	},
373 	.icb[1] = {
374 		.marker_icb     = 29,
375 		.cache_icb      = 25,
376 		.meram_offset   = 0x40,
377 		.meram_size     = 0x40,
378 	},
379 };
380 
381 static struct sh_mobile_lcdc_info lcdc_info = {
382 	.meram_dev = &mackerel_meram_info,
383 	.clock_source = LCDC_CLK_BUS,
384 	.ch[0] = {
385 		.chan = LCDC_CHAN_MAINLCD,
386 		.fourcc = V4L2_PIX_FMT_RGB565,
387 		.lcd_cfg = mackerel_lcdc_modes,
388 		.num_cfg = ARRAY_SIZE(mackerel_lcdc_modes),
389 		.interface_type		= RGB24,
390 		.clock_divider		= 3,
391 		.flags			= 0,
392 		.lcd_size_cfg.width	= 152,
393 		.lcd_size_cfg.height	= 91,
394 		.board_cfg = {
395 			.set_brightness = mackerel_set_brightness,
396 			.get_brightness = mackerel_get_brightness,
397 		},
398 		.bl_info = {
399 			.name = "sh_mobile_lcdc_bl",
400 			.max_brightness = 1,
401 		},
402 		.meram_cfg = &lcd_meram_cfg,
403 	}
404 };
405 
406 static struct resource lcdc_resources[] = {
407 	[0] = {
408 		.name	= "LCDC",
409 		.start	= 0xfe940000,
410 		.end	= 0xfe943fff,
411 		.flags	= IORESOURCE_MEM,
412 	},
413 	[1] = {
414 		.start	= intcs_evt2irq(0x580),
415 		.flags	= IORESOURCE_IRQ,
416 	},
417 };
418 
419 static struct platform_device lcdc_device = {
420 	.name		= "sh_mobile_lcdc_fb",
421 	.num_resources	= ARRAY_SIZE(lcdc_resources),
422 	.resource	= lcdc_resources,
423 	.dev	= {
424 		.platform_data	= &lcdc_info,
425 		.coherent_dma_mask = ~0,
426 	},
427 };
428 
429 static struct sh_mobile_meram_cfg hdmi_meram_cfg = {
430 	.icb[0] = {
431 		.marker_icb     = 30,
432 		.cache_icb      = 26,
433 		.meram_offset   = 0x80,
434 		.meram_size     = 0x100,
435 	},
436 	.icb[1] = {
437 		.marker_icb     = 31,
438 		.cache_icb      = 27,
439 		.meram_offset   = 0x180,
440 		.meram_size     = 0x100,
441 	},
442 };
443 /* HDMI */
444 static struct sh_mobile_lcdc_info hdmi_lcdc_info = {
445 	.meram_dev = &mackerel_meram_info,
446 	.clock_source = LCDC_CLK_EXTERNAL,
447 	.ch[0] = {
448 		.chan = LCDC_CHAN_MAINLCD,
449 		.fourcc = V4L2_PIX_FMT_RGB565,
450 		.interface_type = RGB24,
451 		.clock_divider = 1,
452 		.flags = LCDC_FLAGS_DWPOL,
453 		.meram_cfg = &hdmi_meram_cfg,
454 	}
455 };
456 
457 static struct resource hdmi_lcdc_resources[] = {
458 	[0] = {
459 		.name	= "LCDC1",
460 		.start	= 0xfe944000,
461 		.end	= 0xfe947fff,
462 		.flags	= IORESOURCE_MEM,
463 	},
464 	[1] = {
465 		.start	= intcs_evt2irq(0x1780),
466 		.flags	= IORESOURCE_IRQ,
467 	},
468 };
469 
470 static struct platform_device hdmi_lcdc_device = {
471 	.name		= "sh_mobile_lcdc_fb",
472 	.num_resources	= ARRAY_SIZE(hdmi_lcdc_resources),
473 	.resource	= hdmi_lcdc_resources,
474 	.id		= 1,
475 	.dev	= {
476 		.platform_data	= &hdmi_lcdc_info,
477 		.coherent_dma_mask = ~0,
478 	},
479 };
480 
481 static struct sh_mobile_hdmi_info hdmi_info = {
482 	.lcd_chan	= &hdmi_lcdc_info.ch[0],
483 	.lcd_dev	= &hdmi_lcdc_device.dev,
484 	.flags		= HDMI_SND_SRC_SPDIF,
485 };
486 
487 static struct resource hdmi_resources[] = {
488 	[0] = {
489 		.name	= "HDMI",
490 		.start	= 0xe6be0000,
491 		.end	= 0xe6be00ff,
492 		.flags	= IORESOURCE_MEM,
493 	},
494 	[1] = {
495 		/* There's also an HDMI interrupt on INTCS @ 0x18e0 */
496 		.start	= evt2irq(0x17e0),
497 		.flags	= IORESOURCE_IRQ,
498 	},
499 };
500 
501 static struct platform_device hdmi_device = {
502 	.name		= "sh-mobile-hdmi",
503 	.num_resources	= ARRAY_SIZE(hdmi_resources),
504 	.resource	= hdmi_resources,
505 	.id             = -1,
506 	.dev	= {
507 		.platform_data	= &hdmi_info,
508 	},
509 };
510 
511 static struct platform_device fsi_hdmi_device = {
512 	.name		= "sh_fsi2_b_hdmi",
513 };
514 
hdmi_init_pm_clock(void)515 static void __init hdmi_init_pm_clock(void)
516 {
517 	struct clk *hdmi_ick = clk_get(&hdmi_device.dev, "ick");
518 	int ret;
519 	long rate;
520 
521 	if (IS_ERR(hdmi_ick)) {
522 		ret = PTR_ERR(hdmi_ick);
523 		pr_err("Cannot get HDMI ICK: %d\n", ret);
524 		goto out;
525 	}
526 
527 	ret = clk_set_parent(&sh7372_pllc2_clk, &sh7372_dv_clki_div2_clk);
528 	if (ret < 0) {
529 		pr_err("Cannot set PLLC2 parent: %d, %d users\n",
530 		       ret, sh7372_pllc2_clk.usecount);
531 		goto out;
532 	}
533 
534 	pr_debug("PLLC2 initial frequency %lu\n",
535 		 clk_get_rate(&sh7372_pllc2_clk));
536 
537 	rate = clk_round_rate(&sh7372_pllc2_clk, 594000000);
538 	if (rate < 0) {
539 		pr_err("Cannot get suitable rate: %ld\n", rate);
540 		ret = rate;
541 		goto out;
542 	}
543 
544 	ret = clk_set_rate(&sh7372_pllc2_clk, rate);
545 	if (ret < 0) {
546 		pr_err("Cannot set rate %ld: %d\n", rate, ret);
547 		goto out;
548 	}
549 
550 	pr_debug("PLLC2 set frequency %lu\n", rate);
551 
552 	ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk);
553 	if (ret < 0)
554 		pr_err("Cannot set HDMI parent: %d\n", ret);
555 
556 out:
557 	if (!IS_ERR(hdmi_ick))
558 		clk_put(hdmi_ick);
559 }
560 
561 /* USBHS0 is connected to CN22 which takes a USB Mini-B plug
562  *
563  * The sh7372 SoC has IRQ7 set aside for USBHS0 hotplug,
564  * but on this particular board IRQ7 is already used by
565  * the touch screen. This leaves us with software polling.
566  */
567 #define USBHS0_POLL_INTERVAL (HZ * 5)
568 
569 struct usbhs_private {
570 	unsigned int usbphyaddr;
571 	unsigned int usbcrcaddr;
572 	struct renesas_usbhs_platform_info info;
573 	struct delayed_work work;
574 	struct platform_device *pdev;
575 };
576 
577 #define usbhs_get_priv(pdev)				\
578 	container_of(renesas_usbhs_get_info(pdev),	\
579 		     struct usbhs_private, info)
580 
581 #define usbhs_is_connected(priv)			\
582 	(!((1 << 7) & __raw_readw(priv->usbcrcaddr)))
583 
usbhs_get_vbus(struct platform_device * pdev)584 static int usbhs_get_vbus(struct platform_device *pdev)
585 {
586 	return usbhs_is_connected(usbhs_get_priv(pdev));
587 }
588 
usbhs_phy_reset(struct platform_device * pdev)589 static void usbhs_phy_reset(struct platform_device *pdev)
590 {
591 	struct usbhs_private *priv = usbhs_get_priv(pdev);
592 
593 	/* init phy */
594 	__raw_writew(0x8a0a, priv->usbcrcaddr);
595 }
596 
usbhs0_get_id(struct platform_device * pdev)597 static int usbhs0_get_id(struct platform_device *pdev)
598 {
599 	return USBHS_GADGET;
600 }
601 
usbhs0_work_function(struct work_struct * work)602 static void usbhs0_work_function(struct work_struct *work)
603 {
604 	struct usbhs_private *priv = container_of(work, struct usbhs_private,
605 						  work.work);
606 
607 	renesas_usbhs_call_notify_hotplug(priv->pdev);
608 	schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL);
609 }
610 
usbhs0_hardware_init(struct platform_device * pdev)611 static int usbhs0_hardware_init(struct platform_device *pdev)
612 {
613 	struct usbhs_private *priv = usbhs_get_priv(pdev);
614 
615 	priv->pdev = pdev;
616 	INIT_DELAYED_WORK(&priv->work, usbhs0_work_function);
617 	schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL);
618 	return 0;
619 }
620 
usbhs0_hardware_exit(struct platform_device * pdev)621 static void usbhs0_hardware_exit(struct platform_device *pdev)
622 {
623 	struct usbhs_private *priv = usbhs_get_priv(pdev);
624 
625 	cancel_delayed_work_sync(&priv->work);
626 }
627 
628 static struct usbhs_private usbhs0_private = {
629 	.usbcrcaddr	= 0xe605810c,		/* USBCR2 */
630 	.info = {
631 		.platform_callback = {
632 			.hardware_init	= usbhs0_hardware_init,
633 			.hardware_exit	= usbhs0_hardware_exit,
634 			.phy_reset	= usbhs_phy_reset,
635 			.get_id		= usbhs0_get_id,
636 			.get_vbus	= usbhs_get_vbus,
637 		},
638 		.driver_param = {
639 			.buswait_bwait	= 4,
640 			.d0_tx_id	= SHDMA_SLAVE_USB0_TX,
641 			.d1_rx_id	= SHDMA_SLAVE_USB0_RX,
642 		},
643 	},
644 };
645 
646 static struct resource usbhs0_resources[] = {
647 	[0] = {
648 		.name	= "USBHS0",
649 		.start	= 0xe6890000,
650 		.end	= 0xe68900e6 - 1,
651 		.flags	= IORESOURCE_MEM,
652 	},
653 	[1] = {
654 		.start	= evt2irq(0x1ca0) /* USB0_USB0I0 */,
655 		.flags	= IORESOURCE_IRQ,
656 	},
657 };
658 
659 static struct platform_device usbhs0_device = {
660 	.name	= "renesas_usbhs",
661 	.id	= 0,
662 	.dev = {
663 		.platform_data		= &usbhs0_private.info,
664 	},
665 	.num_resources	= ARRAY_SIZE(usbhs0_resources),
666 	.resource	= usbhs0_resources,
667 };
668 
669 /* USBHS1 is connected to CN31 which takes a USB Mini-AB plug
670  *
671  * Use J30 to select between Host and Function. This setting
672  * can however not be detected by software. Hotplug of USBHS1
673  * is provided via IRQ8.
674  *
675  * Current USB1 works as "USB Host".
676  *  - set J30 "short"
677  *
678  * If you want to use it as "USB gadget",
679  *  - J30 "open"
680  *  - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET
681  *  - add .get_vbus = usbhs_get_vbus in usbhs1_private
682  */
683 #define IRQ8 evt2irq(0x0300)
684 #define USB_PHY_MODE		(1 << 4)
685 #define USB_PHY_INT_EN		((1 << 3) | (1 << 2))
686 #define USB_PHY_ON		(1 << 1)
687 #define USB_PHY_OFF		(1 << 0)
688 #define USB_PHY_INT_CLR		(USB_PHY_ON | USB_PHY_OFF)
689 
usbhs1_interrupt(int irq,void * data)690 static irqreturn_t usbhs1_interrupt(int irq, void *data)
691 {
692 	struct platform_device *pdev = data;
693 	struct usbhs_private *priv = usbhs_get_priv(pdev);
694 
695 	dev_dbg(&pdev->dev, "%s\n", __func__);
696 
697 	renesas_usbhs_call_notify_hotplug(pdev);
698 
699 	/* clear status */
700 	__raw_writew(__raw_readw(priv->usbphyaddr) | USB_PHY_INT_CLR,
701 		     priv->usbphyaddr);
702 
703 	return IRQ_HANDLED;
704 }
705 
usbhs1_hardware_init(struct platform_device * pdev)706 static int usbhs1_hardware_init(struct platform_device *pdev)
707 {
708 	struct usbhs_private *priv = usbhs_get_priv(pdev);
709 	int ret;
710 
711 	/* clear interrupt status */
712 	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
713 
714 	ret = request_irq(IRQ8, usbhs1_interrupt, IRQF_TRIGGER_HIGH,
715 			  dev_name(&pdev->dev), pdev);
716 	if (ret) {
717 		dev_err(&pdev->dev, "request_irq err\n");
718 		return ret;
719 	}
720 
721 	/* enable USB phy interrupt */
722 	__raw_writew(USB_PHY_MODE | USB_PHY_INT_EN, priv->usbphyaddr);
723 
724 	return 0;
725 }
726 
usbhs1_hardware_exit(struct platform_device * pdev)727 static void usbhs1_hardware_exit(struct platform_device *pdev)
728 {
729 	struct usbhs_private *priv = usbhs_get_priv(pdev);
730 
731 	/* clear interrupt status */
732 	__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
733 
734 	free_irq(IRQ8, pdev);
735 }
736 
usbhs1_get_id(struct platform_device * pdev)737 static int usbhs1_get_id(struct platform_device *pdev)
738 {
739 	return USBHS_HOST;
740 }
741 
742 static u32 usbhs1_pipe_cfg[] = {
743 	USB_ENDPOINT_XFER_CONTROL,
744 	USB_ENDPOINT_XFER_ISOC,
745 	USB_ENDPOINT_XFER_ISOC,
746 	USB_ENDPOINT_XFER_BULK,
747 	USB_ENDPOINT_XFER_BULK,
748 	USB_ENDPOINT_XFER_BULK,
749 	USB_ENDPOINT_XFER_INT,
750 	USB_ENDPOINT_XFER_INT,
751 	USB_ENDPOINT_XFER_INT,
752 	USB_ENDPOINT_XFER_BULK,
753 	USB_ENDPOINT_XFER_BULK,
754 	USB_ENDPOINT_XFER_BULK,
755 	USB_ENDPOINT_XFER_BULK,
756 	USB_ENDPOINT_XFER_BULK,
757 	USB_ENDPOINT_XFER_BULK,
758 	USB_ENDPOINT_XFER_BULK,
759 };
760 
761 static struct usbhs_private usbhs1_private = {
762 	.usbphyaddr	= 0xe60581e2,		/* USBPHY1INTAP */
763 	.usbcrcaddr	= 0xe6058130,		/* USBCR4 */
764 	.info = {
765 		.platform_callback = {
766 			.hardware_init	= usbhs1_hardware_init,
767 			.hardware_exit	= usbhs1_hardware_exit,
768 			.get_id		= usbhs1_get_id,
769 			.phy_reset	= usbhs_phy_reset,
770 		},
771 		.driver_param = {
772 			.buswait_bwait	= 4,
773 			.has_otg	= 1,
774 			.pipe_type	= usbhs1_pipe_cfg,
775 			.pipe_size	= ARRAY_SIZE(usbhs1_pipe_cfg),
776 			.d0_tx_id	= SHDMA_SLAVE_USB1_TX,
777 			.d1_rx_id	= SHDMA_SLAVE_USB1_RX,
778 		},
779 	},
780 };
781 
782 static struct resource usbhs1_resources[] = {
783 	[0] = {
784 		.name	= "USBHS1",
785 		.start	= 0xe68b0000,
786 		.end	= 0xe68b00e6 - 1,
787 		.flags	= IORESOURCE_MEM,
788 	},
789 	[1] = {
790 		.start	= evt2irq(0x1ce0) /* USB1_USB1I0 */,
791 		.flags	= IORESOURCE_IRQ,
792 	},
793 };
794 
795 static struct platform_device usbhs1_device = {
796 	.name	= "renesas_usbhs",
797 	.id	= 1,
798 	.dev = {
799 		.platform_data		= &usbhs1_private.info,
800 	},
801 	.num_resources	= ARRAY_SIZE(usbhs1_resources),
802 	.resource	= usbhs1_resources,
803 };
804 
805 /* LED */
806 static struct gpio_led mackerel_leds[] = {
807 	{
808 		.name		= "led0",
809 		.gpio		= GPIO_PORT0,
810 		.default_state	= LEDS_GPIO_DEFSTATE_ON,
811 	},
812 	{
813 		.name		= "led1",
814 		.gpio		= GPIO_PORT1,
815 		.default_state	= LEDS_GPIO_DEFSTATE_ON,
816 	},
817 	{
818 		.name		= "led2",
819 		.gpio		= GPIO_PORT2,
820 		.default_state	= LEDS_GPIO_DEFSTATE_ON,
821 	},
822 	{
823 		.name		= "led3",
824 		.gpio		= GPIO_PORT159,
825 		.default_state	= LEDS_GPIO_DEFSTATE_ON,
826 	}
827 };
828 
829 static struct gpio_led_platform_data mackerel_leds_pdata = {
830 	.leds = mackerel_leds,
831 	.num_leds = ARRAY_SIZE(mackerel_leds),
832 };
833 
834 static struct platform_device leds_device = {
835 	.name = "leds-gpio",
836 	.id = 0,
837 	.dev = {
838 		.platform_data  = &mackerel_leds_pdata,
839 	},
840 };
841 
842 /* FSI */
843 #define IRQ_FSI evt2irq(0x1840)
__fsi_set_round_rate(struct clk * clk,long rate,int enable)844 static int __fsi_set_round_rate(struct clk *clk, long rate, int enable)
845 {
846 	int ret;
847 
848 	if (rate <= 0)
849 		return 0;
850 
851 	if (!enable) {
852 		clk_disable(clk);
853 		return 0;
854 	}
855 
856 	ret = clk_set_rate(clk, clk_round_rate(clk, rate));
857 	if (ret < 0)
858 		return ret;
859 
860 	return clk_enable(clk);
861 }
862 
fsi_set_rate(struct device * dev,int is_porta,int rate,int enable)863 static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable)
864 {
865 	struct clk *fsib_clk;
866 	struct clk *fdiv_clk = &sh7372_fsidivb_clk;
867 	long fsib_rate = 0;
868 	long fdiv_rate = 0;
869 	int ackmd_bpfmd;
870 	int ret;
871 
872 	/* FSIA is slave mode. nothing to do here */
873 	if (is_porta)
874 		return 0;
875 
876 	/* clock start */
877 	switch (rate) {
878 	case 44100:
879 		fsib_rate	= rate * 256;
880 		ackmd_bpfmd	= SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64;
881 		break;
882 	case 48000:
883 		fsib_rate	= 85428000; /* around 48kHz x 256 x 7 */
884 		fdiv_rate	= rate * 256;
885 		ackmd_bpfmd	= SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64;
886 		break;
887 	default:
888 		pr_err("unsupported rate in FSI2 port B\n");
889 		return -EINVAL;
890 	}
891 
892 	/* FSI B setting */
893 	fsib_clk = clk_get(dev, "ickb");
894 	if (IS_ERR(fsib_clk))
895 		return -EIO;
896 
897 	/* fsib */
898 	ret = __fsi_set_round_rate(fsib_clk, fsib_rate, enable);
899 	if (ret < 0)
900 		goto fsi_set_rate_end;
901 
902 	/* FSI DIV */
903 	ret = __fsi_set_round_rate(fdiv_clk, fdiv_rate, enable);
904 	if (ret < 0) {
905 		/* disable FSI B */
906 		if (enable)
907 			__fsi_set_round_rate(fsib_clk, fsib_rate, 0);
908 		goto fsi_set_rate_end;
909 	}
910 
911 	ret = ackmd_bpfmd;
912 
913 fsi_set_rate_end:
914 	clk_put(fsib_clk);
915 	return ret;
916 }
917 
918 static struct sh_fsi_platform_info fsi_info = {
919 	.porta_flags =	SH_FSI_BRS_INV,
920 
921 	.portb_flags =	SH_FSI_BRS_INV	|
922 			SH_FSI_BRM_INV	|
923 			SH_FSI_LRS_INV	|
924 			SH_FSI_FMT_SPDIF,
925 
926 	.set_rate = fsi_set_rate,
927 };
928 
929 static struct resource fsi_resources[] = {
930 	[0] = {
931 		.name	= "FSI",
932 		.start	= 0xFE3C0000,
933 		.end	= 0xFE3C0400 - 1,
934 		.flags	= IORESOURCE_MEM,
935 	},
936 	[1] = {
937 		.start  = IRQ_FSI,
938 		.flags  = IORESOURCE_IRQ,
939 	},
940 };
941 
942 static struct platform_device fsi_device = {
943 	.name		= "sh_fsi2",
944 	.id		= -1,
945 	.num_resources	= ARRAY_SIZE(fsi_resources),
946 	.resource	= fsi_resources,
947 	.dev	= {
948 		.platform_data	= &fsi_info,
949 	},
950 };
951 
952 static struct fsi_ak4642_info fsi2_ak4643_info = {
953 	.name		= "AK4643",
954 	.card		= "FSI2A-AK4643",
955 	.cpu_dai	= "fsia-dai",
956 	.codec		= "ak4642-codec.0-0013",
957 	.platform	= "sh_fsi2",
958 	.id		= FSI_PORT_A,
959 };
960 
961 static struct platform_device fsi_ak4643_device = {
962 	.name	= "fsi-ak4642-audio",
963 	.dev	= {
964 		.platform_data	= &fsi2_ak4643_info,
965 	},
966 };
967 
968 /*
969  * The card detect pin of the top SD/MMC slot (CN7) is active low and is
970  * connected to GPIO A22 of SH7372 (GPIO_PORT41).
971  */
slot_cn7_get_cd(struct platform_device * pdev)972 static int slot_cn7_get_cd(struct platform_device *pdev)
973 {
974 	return !gpio_get_value(GPIO_PORT41);
975 }
976 
977 /* SDHI0 */
mackerel_sdhi0_gpio_cd(int irq,void * arg)978 static irqreturn_t mackerel_sdhi0_gpio_cd(int irq, void *arg)
979 {
980 	struct device *dev = arg;
981 	struct sh_mobile_sdhi_info *info = dev->platform_data;
982 	struct tmio_mmc_data *pdata = info->pdata;
983 
984 	tmio_mmc_cd_wakeup(pdata);
985 
986 	return IRQ_HANDLED;
987 }
988 
989 static struct sh_mobile_sdhi_info sdhi0_info = {
990 	.dma_slave_tx	= SHDMA_SLAVE_SDHI0_TX,
991 	.dma_slave_rx	= SHDMA_SLAVE_SDHI0_RX,
992 	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
993 };
994 
995 static struct resource sdhi0_resources[] = {
996 	[0] = {
997 		.name	= "SDHI0",
998 		.start	= 0xe6850000,
999 		.end	= 0xe68500ff,
1000 		.flags	= IORESOURCE_MEM,
1001 	},
1002 	[1] = {
1003 		.start	= evt2irq(0x0e00) /* SDHI0_SDHI0I0 */,
1004 		.flags	= IORESOURCE_IRQ,
1005 	},
1006 	[2] = {
1007 		.start	= evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,
1008 		.flags	= IORESOURCE_IRQ,
1009 	},
1010 	[3] = {
1011 		.start	= evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,
1012 		.flags	= IORESOURCE_IRQ,
1013 	},
1014 };
1015 
1016 static struct platform_device sdhi0_device = {
1017 	.name		= "sh_mobile_sdhi",
1018 	.num_resources	= ARRAY_SIZE(sdhi0_resources),
1019 	.resource	= sdhi0_resources,
1020 	.id		= 0,
1021 	.dev	= {
1022 		.platform_data	= &sdhi0_info,
1023 	},
1024 };
1025 
1026 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1027 /* SDHI1 */
1028 static struct sh_mobile_sdhi_info sdhi1_info = {
1029 	.dma_slave_tx	= SHDMA_SLAVE_SDHI1_TX,
1030 	.dma_slave_rx	= SHDMA_SLAVE_SDHI1_RX,
1031 	.tmio_ocr_mask	= MMC_VDD_165_195,
1032 	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE,
1033 	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
1034 			  MMC_CAP_NEEDS_POLL,
1035 	.get_cd		= slot_cn7_get_cd,
1036 };
1037 
1038 static struct resource sdhi1_resources[] = {
1039 	[0] = {
1040 		.name	= "SDHI1",
1041 		.start	= 0xe6860000,
1042 		.end	= 0xe68600ff,
1043 		.flags	= IORESOURCE_MEM,
1044 	},
1045 	[1] = {
1046 		.name	= SH_MOBILE_SDHI_IRQ_CARD_DETECT,
1047 		.start	= evt2irq(0x0e80), /* SDHI1_SDHI1I0 */
1048 		.flags	= IORESOURCE_IRQ,
1049 	},
1050 	[2] = {
1051 		.name	= SH_MOBILE_SDHI_IRQ_SDCARD,
1052 		.start	= evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */
1053 		.flags	= IORESOURCE_IRQ,
1054 	},
1055 	[3] = {
1056 		.name	= SH_MOBILE_SDHI_IRQ_SDIO,
1057 		.start	= evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */
1058 		.flags	= IORESOURCE_IRQ,
1059 	},
1060 };
1061 
1062 static struct platform_device sdhi1_device = {
1063 	.name		= "sh_mobile_sdhi",
1064 	.num_resources	= ARRAY_SIZE(sdhi1_resources),
1065 	.resource	= sdhi1_resources,
1066 	.id		= 1,
1067 	.dev	= {
1068 		.platform_data	= &sdhi1_info,
1069 	},
1070 };
1071 #endif
1072 
1073 /*
1074  * The card detect pin of the top SD/MMC slot (CN23) is active low and is
1075  * connected to GPIO SCIFB_SCK of SH7372 (GPIO_PORT162).
1076  */
slot_cn23_get_cd(struct platform_device * pdev)1077 static int slot_cn23_get_cd(struct platform_device *pdev)
1078 {
1079 	return !gpio_get_value(GPIO_PORT162);
1080 }
1081 
1082 /* SDHI2 */
1083 static struct sh_mobile_sdhi_info sdhi2_info = {
1084 	.dma_slave_tx	= SHDMA_SLAVE_SDHI2_TX,
1085 	.dma_slave_rx	= SHDMA_SLAVE_SDHI2_RX,
1086 	.tmio_flags	= TMIO_MMC_WRPROTECT_DISABLE,
1087 	.tmio_caps	= MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
1088 			  MMC_CAP_NEEDS_POLL,
1089 	.get_cd		= slot_cn23_get_cd,
1090 };
1091 
1092 static struct resource sdhi2_resources[] = {
1093 	[0] = {
1094 		.name	= "SDHI2",
1095 		.start	= 0xe6870000,
1096 		.end	= 0xe68700ff,
1097 		.flags	= IORESOURCE_MEM,
1098 	},
1099 	[1] = {
1100 		.name	= SH_MOBILE_SDHI_IRQ_CARD_DETECT,
1101 		.start	= evt2irq(0x1200), /* SDHI2_SDHI2I0 */
1102 		.flags	= IORESOURCE_IRQ,
1103 	},
1104 	[2] = {
1105 		.name	= SH_MOBILE_SDHI_IRQ_SDCARD,
1106 		.start	= evt2irq(0x1220), /* SDHI2_SDHI2I1 */
1107 		.flags	= IORESOURCE_IRQ,
1108 	},
1109 	[3] = {
1110 		.name	= SH_MOBILE_SDHI_IRQ_SDIO,
1111 		.start	= evt2irq(0x1240), /* SDHI2_SDHI2I2 */
1112 		.flags	= IORESOURCE_IRQ,
1113 	},
1114 };
1115 
1116 static struct platform_device sdhi2_device = {
1117 	.name	= "sh_mobile_sdhi",
1118 	.num_resources	= ARRAY_SIZE(sdhi2_resources),
1119 	.resource	= sdhi2_resources,
1120 	.id		= 2,
1121 	.dev	= {
1122 		.platform_data	= &sdhi2_info,
1123 	},
1124 };
1125 
1126 /* SH_MMCIF */
1127 static struct resource sh_mmcif_resources[] = {
1128 	[0] = {
1129 		.name	= "MMCIF",
1130 		.start	= 0xE6BD0000,
1131 		.end	= 0xE6BD00FF,
1132 		.flags	= IORESOURCE_MEM,
1133 	},
1134 	[1] = {
1135 		/* MMC ERR */
1136 		.start	= evt2irq(0x1ac0),
1137 		.flags	= IORESOURCE_IRQ,
1138 	},
1139 	[2] = {
1140 		/* MMC NOR */
1141 		.start	= evt2irq(0x1ae0),
1142 		.flags	= IORESOURCE_IRQ,
1143 	},
1144 };
1145 
1146 static struct sh_mmcif_plat_data sh_mmcif_plat = {
1147 	.sup_pclk	= 0,
1148 	.ocr		= MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
1149 	.caps		= MMC_CAP_4_BIT_DATA |
1150 			  MMC_CAP_8_BIT_DATA |
1151 			  MMC_CAP_NEEDS_POLL,
1152 	.get_cd		= slot_cn7_get_cd,
1153 	.slave_id_tx	= SHDMA_SLAVE_MMCIF_TX,
1154 	.slave_id_rx	= SHDMA_SLAVE_MMCIF_RX,
1155 };
1156 
1157 static struct platform_device sh_mmcif_device = {
1158 	.name		= "sh_mmcif",
1159 	.id		= 0,
1160 	.dev		= {
1161 		.dma_mask		= NULL,
1162 		.coherent_dma_mask	= 0xffffffff,
1163 		.platform_data		= &sh_mmcif_plat,
1164 	},
1165 	.num_resources	= ARRAY_SIZE(sh_mmcif_resources),
1166 	.resource	= sh_mmcif_resources,
1167 };
1168 
1169 
1170 static int mackerel_camera_add(struct soc_camera_device *icd);
1171 static void mackerel_camera_del(struct soc_camera_device *icd);
1172 
camera_set_capture(struct soc_camera_platform_info * info,int enable)1173 static int camera_set_capture(struct soc_camera_platform_info *info,
1174 			      int enable)
1175 {
1176 	return 0; /* camera sensor always enabled */
1177 }
1178 
1179 static struct soc_camera_platform_info camera_info = {
1180 	.format_name = "UYVY",
1181 	.format_depth = 16,
1182 	.format = {
1183 		.code = V4L2_MBUS_FMT_UYVY8_2X8,
1184 		.colorspace = V4L2_COLORSPACE_SMPTE170M,
1185 		.field = V4L2_FIELD_NONE,
1186 		.width = 640,
1187 		.height = 480,
1188 	},
1189 	.mbus_param = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER |
1190 	V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_HIGH |
1191 	V4L2_MBUS_DATA_ACTIVE_HIGH,
1192 	.mbus_type = V4L2_MBUS_PARALLEL,
1193 	.set_capture = camera_set_capture,
1194 };
1195 
1196 static struct soc_camera_link camera_link = {
1197 	.bus_id		= 0,
1198 	.add_device	= mackerel_camera_add,
1199 	.del_device	= mackerel_camera_del,
1200 	.module_name	= "soc_camera_platform",
1201 	.priv		= &camera_info,
1202 };
1203 
1204 static struct platform_device *camera_device;
1205 
mackerel_camera_release(struct device * dev)1206 static void mackerel_camera_release(struct device *dev)
1207 {
1208 	soc_camera_platform_release(&camera_device);
1209 }
1210 
mackerel_camera_add(struct soc_camera_device * icd)1211 static int mackerel_camera_add(struct soc_camera_device *icd)
1212 {
1213 	return soc_camera_platform_add(icd, &camera_device, &camera_link,
1214 				       mackerel_camera_release, 0);
1215 }
1216 
mackerel_camera_del(struct soc_camera_device * icd)1217 static void mackerel_camera_del(struct soc_camera_device *icd)
1218 {
1219 	soc_camera_platform_del(icd, camera_device, &camera_link);
1220 }
1221 
1222 static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
1223 	.flags = SH_CEU_FLAG_USE_8BIT_BUS,
1224 };
1225 
1226 static struct resource ceu_resources[] = {
1227 	[0] = {
1228 		.name	= "CEU",
1229 		.start	= 0xfe910000,
1230 		.end	= 0xfe91009f,
1231 		.flags	= IORESOURCE_MEM,
1232 	},
1233 	[1] = {
1234 		.start  = intcs_evt2irq(0x880),
1235 		.flags  = IORESOURCE_IRQ,
1236 	},
1237 	[2] = {
1238 		/* place holder for contiguous memory */
1239 	},
1240 };
1241 
1242 static struct platform_device ceu_device = {
1243 	.name		= "sh_mobile_ceu",
1244 	.id             = 0, /* "ceu0" clock */
1245 	.num_resources	= ARRAY_SIZE(ceu_resources),
1246 	.resource	= ceu_resources,
1247 	.dev		= {
1248 		.platform_data		= &sh_mobile_ceu_info,
1249 		.coherent_dma_mask	= 0xffffffff,
1250 	},
1251 };
1252 
1253 static struct platform_device mackerel_camera = {
1254 	.name	= "soc-camera-pdrv",
1255 	.id	= 0,
1256 	.dev	= {
1257 		.platform_data = &camera_link,
1258 	},
1259 };
1260 
1261 static struct platform_device *mackerel_devices[] __initdata = {
1262 	&nor_flash_device,
1263 	&smc911x_device,
1264 	&lcdc_device,
1265 	&usbhs1_device,
1266 	&usbhs0_device,
1267 	&leds_device,
1268 	&fsi_device,
1269 	&fsi_ak4643_device,
1270 	&fsi_hdmi_device,
1271 	&sdhi0_device,
1272 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1273 	&sdhi1_device,
1274 #endif
1275 	&sdhi2_device,
1276 	&sh_mmcif_device,
1277 	&ceu_device,
1278 	&mackerel_camera,
1279 	&hdmi_lcdc_device,
1280 	&hdmi_device,
1281 	&meram_device,
1282 };
1283 
1284 /* Keypad Initialization */
1285 #define KEYPAD_BUTTON(ev_type, ev_code, act_low) \
1286 {								\
1287 	.type		= ev_type,				\
1288 	.code		= ev_code,				\
1289 	.active_low	= act_low,				\
1290 }
1291 
1292 #define KEYPAD_BUTTON_LOW(event_code) KEYPAD_BUTTON(EV_KEY, event_code, 1)
1293 
1294 static struct tca6416_button mackerel_gpio_keys[] = {
1295 	KEYPAD_BUTTON_LOW(KEY_HOME),
1296 	KEYPAD_BUTTON_LOW(KEY_MENU),
1297 	KEYPAD_BUTTON_LOW(KEY_BACK),
1298 	KEYPAD_BUTTON_LOW(KEY_POWER),
1299 };
1300 
1301 static struct tca6416_keys_platform_data mackerel_tca6416_keys_info = {
1302 	.buttons	= mackerel_gpio_keys,
1303 	.nbuttons	= ARRAY_SIZE(mackerel_gpio_keys),
1304 	.rep		= 1,
1305 	.use_polling	= 0,
1306 	.pinmask	= 0x000F,
1307 };
1308 
1309 /* I2C */
1310 #define IRQ7 evt2irq(0x02e0)
1311 #define IRQ9 evt2irq(0x0320)
1312 
1313 static struct i2c_board_info i2c0_devices[] = {
1314 	{
1315 		I2C_BOARD_INFO("ak4643", 0x13),
1316 	},
1317 	/* Keypad */
1318 	{
1319 		I2C_BOARD_INFO("tca6408-keys", 0x20),
1320 		.platform_data = &mackerel_tca6416_keys_info,
1321 		.irq = IRQ9,
1322 	},
1323 	/* Touchscreen */
1324 	{
1325 		I2C_BOARD_INFO("st1232-ts", 0x55),
1326 		.irq = IRQ7,
1327 	},
1328 };
1329 
1330 #define IRQ21 evt2irq(0x32a0)
1331 
1332 static struct i2c_board_info i2c1_devices[] = {
1333 	/* Accelerometer */
1334 	{
1335 		I2C_BOARD_INFO("adxl34x", 0x53),
1336 		.irq = IRQ21,
1337 	},
1338 };
1339 
1340 static struct map_desc mackerel_io_desc[] __initdata = {
1341 	/* create a 1:1 entity map for 0xe6xxxxxx
1342 	 * used by CPGA, INTC and PFC.
1343 	 */
1344 	{
1345 		.virtual	= 0xe6000000,
1346 		.pfn		= __phys_to_pfn(0xe6000000),
1347 		.length		= 256 << 20,
1348 		.type		= MT_DEVICE_NONSHARED
1349 	},
1350 };
1351 
mackerel_map_io(void)1352 static void __init mackerel_map_io(void)
1353 {
1354 	iotable_init(mackerel_io_desc, ARRAY_SIZE(mackerel_io_desc));
1355 	/* DMA memory at 0xff200000 - 0xffdfffff. The default 2MB size isn't
1356 	 * enough to allocate the frame buffer memory.
1357 	 */
1358 	init_consistent_dma_size(12 << 20);
1359 
1360 	/* setup early devices and console here as well */
1361 	sh7372_add_early_devices();
1362 	shmobile_setup_console();
1363 }
1364 
1365 #define GPIO_PORT9CR	0xE6051009
1366 #define GPIO_PORT10CR	0xE605100A
1367 #define GPIO_PORT167CR	0xE60520A7
1368 #define GPIO_PORT168CR	0xE60520A8
1369 #define SRCR4		0xe61580bc
1370 #define USCCR1		0xE6058144
mackerel_init(void)1371 static void __init mackerel_init(void)
1372 {
1373 	u32 srcr4;
1374 	struct clk *clk;
1375 	int ret;
1376 
1377 	sh7372_pinmux_init();
1378 
1379 	/* enable SCIFA0 */
1380 	gpio_request(GPIO_FN_SCIFA0_TXD, NULL);
1381 	gpio_request(GPIO_FN_SCIFA0_RXD, NULL);
1382 
1383 	/* enable SMSC911X */
1384 	gpio_request(GPIO_FN_CS5A,	NULL);
1385 	gpio_request(GPIO_FN_IRQ6_39,	NULL);
1386 
1387 	/* LCDC */
1388 	gpio_request(GPIO_FN_LCDD23,   NULL);
1389 	gpio_request(GPIO_FN_LCDD22,   NULL);
1390 	gpio_request(GPIO_FN_LCDD21,   NULL);
1391 	gpio_request(GPIO_FN_LCDD20,   NULL);
1392 	gpio_request(GPIO_FN_LCDD19,   NULL);
1393 	gpio_request(GPIO_FN_LCDD18,   NULL);
1394 	gpio_request(GPIO_FN_LCDD17,   NULL);
1395 	gpio_request(GPIO_FN_LCDD16,   NULL);
1396 	gpio_request(GPIO_FN_LCDD15,   NULL);
1397 	gpio_request(GPIO_FN_LCDD14,   NULL);
1398 	gpio_request(GPIO_FN_LCDD13,   NULL);
1399 	gpio_request(GPIO_FN_LCDD12,   NULL);
1400 	gpio_request(GPIO_FN_LCDD11,   NULL);
1401 	gpio_request(GPIO_FN_LCDD10,   NULL);
1402 	gpio_request(GPIO_FN_LCDD9,    NULL);
1403 	gpio_request(GPIO_FN_LCDD8,    NULL);
1404 	gpio_request(GPIO_FN_LCDD7,    NULL);
1405 	gpio_request(GPIO_FN_LCDD6,    NULL);
1406 	gpio_request(GPIO_FN_LCDD5,    NULL);
1407 	gpio_request(GPIO_FN_LCDD4,    NULL);
1408 	gpio_request(GPIO_FN_LCDD3,    NULL);
1409 	gpio_request(GPIO_FN_LCDD2,    NULL);
1410 	gpio_request(GPIO_FN_LCDD1,    NULL);
1411 	gpio_request(GPIO_FN_LCDD0,    NULL);
1412 	gpio_request(GPIO_FN_LCDDISP,  NULL);
1413 	gpio_request(GPIO_FN_LCDDCK,   NULL);
1414 
1415 	gpio_request(GPIO_PORT31, NULL); /* backlight */
1416 	gpio_direction_output(GPIO_PORT31, 0); /* off by default */
1417 
1418 	gpio_request(GPIO_PORT151, NULL); /* LCDDON */
1419 	gpio_direction_output(GPIO_PORT151, 1);
1420 
1421 	/* USBHS0 */
1422 	gpio_request(GPIO_FN_VBUS0_0, NULL);
1423 	gpio_pull_down(GPIO_PORT168CR); /* VBUS0_0 pull down */
1424 
1425 	/* USBHS1 */
1426 	gpio_request(GPIO_FN_VBUS0_1, NULL);
1427 	gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */
1428 	gpio_request(GPIO_FN_IDIN_1_113, NULL);
1429 
1430 	/* enable FSI2 port A (ak4643) */
1431 	gpio_request(GPIO_FN_FSIAIBT,	NULL);
1432 	gpio_request(GPIO_FN_FSIAILR,	NULL);
1433 	gpio_request(GPIO_FN_FSIAISLD,	NULL);
1434 	gpio_request(GPIO_FN_FSIAOSLD,	NULL);
1435 	gpio_request(GPIO_PORT161,	NULL);
1436 	gpio_direction_output(GPIO_PORT161, 0); /* slave */
1437 
1438 	gpio_request(GPIO_PORT9,  NULL);
1439 	gpio_request(GPIO_PORT10, NULL);
1440 	gpio_no_direction(GPIO_PORT9CR);  /* FSIAOBT needs no direction */
1441 	gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */
1442 
1443 	intc_set_priority(IRQ_FSI, 3); /* irq priority FSI(3) > SMSC911X(2) */
1444 
1445 	/* setup FSI2 port B (HDMI) */
1446 	gpio_request(GPIO_FN_FSIBCK, NULL);
1447 	__raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
1448 
1449 	/* set SPU2 clock to 119.6 MHz */
1450 	clk = clk_get(NULL, "spu_clk");
1451 	if (!IS_ERR(clk)) {
1452 		clk_set_rate(clk, clk_round_rate(clk, 119600000));
1453 		clk_put(clk);
1454 	}
1455 
1456 	/* enable Keypad */
1457 	gpio_request(GPIO_FN_IRQ9_42,	NULL);
1458 	irq_set_irq_type(IRQ9, IRQ_TYPE_LEVEL_HIGH);
1459 
1460 	/* enable Touchscreen */
1461 	gpio_request(GPIO_FN_IRQ7_40,	NULL);
1462 	irq_set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW);
1463 
1464 	/* enable Accelerometer */
1465 	gpio_request(GPIO_FN_IRQ21,	NULL);
1466 	irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH);
1467 
1468 	/* enable SDHI0 */
1469 	gpio_request(GPIO_FN_SDHICD0, NULL);
1470 	gpio_request(GPIO_FN_SDHIWP0, NULL);
1471 	gpio_request(GPIO_FN_SDHICMD0, NULL);
1472 	gpio_request(GPIO_FN_SDHICLK0, NULL);
1473 	gpio_request(GPIO_FN_SDHID0_3, NULL);
1474 	gpio_request(GPIO_FN_SDHID0_2, NULL);
1475 	gpio_request(GPIO_FN_SDHID0_1, NULL);
1476 	gpio_request(GPIO_FN_SDHID0_0, NULL);
1477 
1478 	ret = request_irq(evt2irq(0x3340), mackerel_sdhi0_gpio_cd,
1479 			  IRQF_TRIGGER_FALLING, "sdhi0 cd", &sdhi0_device.dev);
1480 	if (!ret)
1481 		sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD;
1482 	else
1483 		pr_err("Cannot get IRQ #%d: %d\n", evt2irq(0x3340), ret);
1484 
1485 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1486 	/* enable SDHI1 */
1487 	gpio_request(GPIO_FN_SDHICMD1, NULL);
1488 	gpio_request(GPIO_FN_SDHICLK1, NULL);
1489 	gpio_request(GPIO_FN_SDHID1_3, NULL);
1490 	gpio_request(GPIO_FN_SDHID1_2, NULL);
1491 	gpio_request(GPIO_FN_SDHID1_1, NULL);
1492 	gpio_request(GPIO_FN_SDHID1_0, NULL);
1493 #endif
1494 	/* card detect pin for MMC slot (CN7) */
1495 	gpio_request(GPIO_PORT41, NULL);
1496 	gpio_direction_input(GPIO_PORT41);
1497 
1498 	/* enable SDHI2 */
1499 	gpio_request(GPIO_FN_SDHICMD2, NULL);
1500 	gpio_request(GPIO_FN_SDHICLK2, NULL);
1501 	gpio_request(GPIO_FN_SDHID2_3, NULL);
1502 	gpio_request(GPIO_FN_SDHID2_2, NULL);
1503 	gpio_request(GPIO_FN_SDHID2_1, NULL);
1504 	gpio_request(GPIO_FN_SDHID2_0, NULL);
1505 
1506 	/* card detect pin for microSD slot (CN23) */
1507 	gpio_request(GPIO_PORT162, NULL);
1508 	gpio_direction_input(GPIO_PORT162);
1509 
1510 	/* MMCIF */
1511 	gpio_request(GPIO_FN_MMCD0_0, NULL);
1512 	gpio_request(GPIO_FN_MMCD0_1, NULL);
1513 	gpio_request(GPIO_FN_MMCD0_2, NULL);
1514 	gpio_request(GPIO_FN_MMCD0_3, NULL);
1515 	gpio_request(GPIO_FN_MMCD0_4, NULL);
1516 	gpio_request(GPIO_FN_MMCD0_5, NULL);
1517 	gpio_request(GPIO_FN_MMCD0_6, NULL);
1518 	gpio_request(GPIO_FN_MMCD0_7, NULL);
1519 	gpio_request(GPIO_FN_MMCCMD0, NULL);
1520 	gpio_request(GPIO_FN_MMCCLK0, NULL);
1521 
1522 	/* enable GPS module (GT-720F) */
1523 	gpio_request(GPIO_FN_SCIFA2_TXD1, NULL);
1524 	gpio_request(GPIO_FN_SCIFA2_RXD1, NULL);
1525 
1526 	/* CEU */
1527 	gpio_request(GPIO_FN_VIO_CLK, NULL);
1528 	gpio_request(GPIO_FN_VIO_VD, NULL);
1529 	gpio_request(GPIO_FN_VIO_HD, NULL);
1530 	gpio_request(GPIO_FN_VIO_FIELD, NULL);
1531 	gpio_request(GPIO_FN_VIO_CKO, NULL);
1532 	gpio_request(GPIO_FN_VIO_D7, NULL);
1533 	gpio_request(GPIO_FN_VIO_D6, NULL);
1534 	gpio_request(GPIO_FN_VIO_D5, NULL);
1535 	gpio_request(GPIO_FN_VIO_D4, NULL);
1536 	gpio_request(GPIO_FN_VIO_D3, NULL);
1537 	gpio_request(GPIO_FN_VIO_D2, NULL);
1538 	gpio_request(GPIO_FN_VIO_D1, NULL);
1539 	gpio_request(GPIO_FN_VIO_D0, NULL);
1540 
1541 	/* HDMI */
1542 	gpio_request(GPIO_FN_HDMI_HPD, NULL);
1543 	gpio_request(GPIO_FN_HDMI_CEC, NULL);
1544 
1545 	/* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
1546 	srcr4 = __raw_readl(SRCR4);
1547 	__raw_writel(srcr4 | (1 << 13), SRCR4);
1548 	udelay(50);
1549 	__raw_writel(srcr4 & ~(1 << 13), SRCR4);
1550 
1551 	i2c_register_board_info(0, i2c0_devices,
1552 				ARRAY_SIZE(i2c0_devices));
1553 	i2c_register_board_info(1, i2c1_devices,
1554 				ARRAY_SIZE(i2c1_devices));
1555 
1556 	sh7372_add_standard_devices();
1557 
1558 	platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices));
1559 
1560 	sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device);
1561 	sh7372_add_device_to_domain(&sh7372_a4lc, &hdmi_lcdc_device);
1562 	sh7372_add_device_to_domain(&sh7372_a4lc, &meram_device);
1563 	sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device);
1564 	sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs0_device);
1565 	sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs1_device);
1566 	sh7372_add_device_to_domain(&sh7372_a3sp, &sh_mmcif_device);
1567 	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi0_device);
1568 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1569 	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi1_device);
1570 #endif
1571 	sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi2_device);
1572 	sh7372_add_device_to_domain(&sh7372_a4r, &ceu_device);
1573 
1574 	hdmi_init_pm_clock();
1575 	sh7372_pm_init();
1576 	pm_clk_add(&fsi_device.dev, "spu2");
1577 	pm_clk_add(&hdmi_lcdc_device.dev, "hdmi");
1578 }
1579 
mackerel_timer_init(void)1580 static void __init mackerel_timer_init(void)
1581 {
1582 	sh7372_clock_init();
1583 	shmobile_timer.init();
1584 
1585 	/* External clock source */
1586 	clk_set_rate(&sh7372_dv_clki_clk, 27000000);
1587 }
1588 
1589 static struct sys_timer mackerel_timer = {
1590 	.init		= mackerel_timer_init,
1591 };
1592 
1593 MACHINE_START(MACKEREL, "mackerel")
1594 	.map_io		= mackerel_map_io,
1595 	.init_irq	= sh7372_init_irq,
1596 	.handle_irq	= shmobile_handle_irq_intc,
1597 	.init_machine	= mackerel_init,
1598 	.timer		= &mackerel_timer,
1599 MACHINE_END
1600