Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
setup.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009 Renesas Solutions Corp.
3  *
4  * Kuninori Morimoto <[email protected]>
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License. See the file "COPYING" in the main directory of this archive
8  * for more details.
9  */
10 
11 #include <linux/init.h>
12 #include <linux/device.h>
13 #include <linux/platform_device.h>
14 #include <linux/mmc/host.h>
15 #include <linux/mmc/sh_mmcif.h>
17 #include <linux/mtd/physmap.h>
18 #include <linux/gpio.h>
19 #include <linux/interrupt.h>
20 #include <linux/io.h>
21 #include <linux/delay.h>
22 #include <linux/regulator/fixed.h>
24 #include <linux/usb/r8a66597.h>
26 #include <linux/i2c.h>
27 #include <linux/i2c/tsc2007.h>
28 #include <linux/spi/spi.h>
29 #include <linux/spi/sh_msiof.h>
30 #include <linux/spi/mmc_spi.h>
31 #include <linux/input.h>
32 #include <linux/input/sh_keysc.h>
33 #include <linux/sh_eth.h>
34 #include <linux/sh_intc.h>
35 #include <linux/videodev2.h>
36 #include <video/sh_mobile_lcdc.h>
37 #include <sound/sh_fsi.h>
38 #include <sound/simple_card.h>
39 #include <media/sh_mobile_ceu.h>
40 #include <media/soc_camera.h>
41 #include <media/tw9910.h>
42 #include <media/mt9t112.h>
43 #include <asm/heartbeat.h>
44 #include <asm/clock.h>
45 #include <asm/suspend.h>
46 #include <cpu/sh7724.h>
47 
48 /*
49  * Address Interface BusWidth
50  *-----------------------------------------
51  * 0x0000_0000 uboot 16bit
52  * 0x0004_0000 Linux romImage 16bit
53  * 0x0014_0000 MTD for Linux 16bit
54  * 0x0400_0000 Internal I/O 16/32bit
55  * 0x0800_0000 DRAM 32bit
56  * 0x1800_0000 MFI 16bit
57  */
58 
59 /* SWITCH
60  *------------------------------
61  * DS2[1] = FlashROM write protect ON : write protect
62  * OFF : No write protect
63  * DS2[2] = RMII / TS, SCIF ON : RMII
64  * OFF : TS, SCIF3
65  * DS2[3] = Camera / Video ON : Camera
66  * OFF : NTSC/PAL (IN)
67  * DS2[5] = NTSC_OUT Clock ON : On board OSC
68  * OFF : SH7724 DV_CLK
69  * DS2[6-7] = MMC / SD ON-OFF : SD
70  * OFF-ON : MMC
71  */
72 
73 /* Heartbeat */
74 static unsigned char led_pos[] = { 0, 1, 2, 3 };
75 
76 static struct heartbeat_data heartbeat_data = {
77  .nr_bits = 4,
78  .bit_pos = led_pos,
79 };
80 
81 static struct resource heartbeat_resource = {
82  .start = 0xA405012C, /* PTG */
83  .end = 0xA405012E - 1,
85 };
86 
87 static struct platform_device heartbeat_device = {
88  .name = "heartbeat",
89  .id = -1,
90  .dev = {
91  .platform_data = &heartbeat_data,
92  },
93  .num_resources = 1,
94  .resource = &heartbeat_resource,
95 };
96 
97 /* MTD */
98 static struct mtd_partition nor_flash_partitions[] = {
99  {
100  .name = "boot loader",
101  .offset = 0,
102  .size = (5 * 1024 * 1024),
103  .mask_flags = MTD_WRITEABLE, /* force read-only */
104  }, {
105  .name = "free-area",
106  .offset = MTDPART_OFS_APPEND,
107  .size = MTDPART_SIZ_FULL,
108  },
109 };
110 
111 static struct physmap_flash_data nor_flash_data = {
112  .width = 2,
113  .parts = nor_flash_partitions,
114  .nr_parts = ARRAY_SIZE(nor_flash_partitions),
115 };
116 
117 static struct resource nor_flash_resources[] = {
118  [0] = {
119  .name = "NOR Flash",
120  .start = 0x00000000,
121  .end = 0x03ffffff,
122  .flags = IORESOURCE_MEM,
123  }
124 };
125 
126 static struct platform_device nor_flash_device = {
127  .name = "physmap-flash",
128  .resource = nor_flash_resources,
129  .num_resources = ARRAY_SIZE(nor_flash_resources),
130  .dev = {
131  .platform_data = &nor_flash_data,
132  },
133 };
134 
135 /* SH Eth */
136 #define SH_ETH_ADDR (0xA4600000)
137 static struct resource sh_eth_resources[] = {
138  [0] = {
139  .start = SH_ETH_ADDR,
140  .end = SH_ETH_ADDR + 0x1FC,
141  .flags = IORESOURCE_MEM,
142  },
143  [1] = {
144  .start = evt2irq(0xd60),
146  },
147 };
148 
149 static struct sh_eth_plat_data sh_eth_plat = {
150  .phy = 0x1f, /* SMSC LAN8700 */
151  .edmac_endian = EDMAC_LITTLE_ENDIAN,
152  .register_type = SH_ETH_REG_FAST_SH4,
153  .phy_interface = PHY_INTERFACE_MODE_MII,
154  .ether_link_active_low = 1
155 };
156 
157 static struct platform_device sh_eth_device = {
158  .name = "sh-eth",
159  .id = 0,
160  .dev = {
161  .platform_data = &sh_eth_plat,
162  },
163  .num_resources = ARRAY_SIZE(sh_eth_resources),
164  .resource = sh_eth_resources,
165 };
166 
167 /* USB0 host */
168 static void usb0_port_power(int port, int power)
169 {
170  gpio_set_value(GPIO_PTB4, power);
171 }
172 
173 static struct r8a66597_platdata usb0_host_data = {
174  .on_chip = 1,
175  .port_power = usb0_port_power,
176 };
177 
178 static struct resource usb0_host_resources[] = {
179  [0] = {
180  .start = 0xa4d80000,
181  .end = 0xa4d80124 - 1,
182  .flags = IORESOURCE_MEM,
183  },
184  [1] = {
185  .start = evt2irq(0xa20),
186  .end = evt2irq(0xa20),
187  .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
188  },
189 };
190 
191 static struct platform_device usb0_host_device = {
192  .name = "r8a66597_hcd",
193  .id = 0,
194  .dev = {
195  .dma_mask = NULL, /* not use dma */
196  .coherent_dma_mask = 0xffffffff,
197  .platform_data = &usb0_host_data,
198  },
199  .num_resources = ARRAY_SIZE(usb0_host_resources),
200  .resource = usb0_host_resources,
201 };
202 
203 /* USB1 host/function */
204 static void usb1_port_power(int port, int power)
205 {
206  gpio_set_value(GPIO_PTB5, power);
207 }
208 
209 static struct r8a66597_platdata usb1_common_data = {
210  .on_chip = 1,
211  .port_power = usb1_port_power,
212 };
213 
214 static struct resource usb1_common_resources[] = {
215  [0] = {
216  .start = 0xa4d90000,
217  .end = 0xa4d90124 - 1,
218  .flags = IORESOURCE_MEM,
219  },
220  [1] = {
221  .start = evt2irq(0xa40),
222  .end = evt2irq(0xa40),
223  .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
224  },
225 };
226 
227 static struct platform_device usb1_common_device = {
228  /* .name will be added in arch_setup */
229  .id = 1,
230  .dev = {
231  .dma_mask = NULL, /* not use dma */
232  .coherent_dma_mask = 0xffffffff,
233  .platform_data = &usb1_common_data,
234  },
235  .num_resources = ARRAY_SIZE(usb1_common_resources),
236  .resource = usb1_common_resources,
237 };
238 
239 /*
240  * USBHS
241  */
242 static int usbhs_get_id(struct platform_device *pdev)
243 {
244  return gpio_get_value(GPIO_PTB3);
245 }
246 
247 static void usbhs_phy_reset(struct platform_device *pdev)
248 {
249  /* enable vbus if HOST */
252 }
253 
254 static struct renesas_usbhs_platform_info usbhs_info = {
255  .platform_callback = {
256  .get_id = usbhs_get_id,
257  .phy_reset = usbhs_phy_reset,
258  },
259  .driver_param = {
260  .buswait_bwait = 4,
261  .detection_delay = 5,
262  .d0_tx_id = SHDMA_SLAVE_USB1D0_TX,
263  .d0_rx_id = SHDMA_SLAVE_USB1D0_RX,
264  .d1_tx_id = SHDMA_SLAVE_USB1D1_TX,
265  .d1_rx_id = SHDMA_SLAVE_USB1D1_RX,
266  },
267 };
268 
269 static struct resource usbhs_resources[] = {
270  [0] = {
271  .start = 0xa4d90000,
272  .end = 0xa4d90124 - 1,
273  .flags = IORESOURCE_MEM,
274  },
275  [1] = {
276  .start = evt2irq(0xa40),
277  .end = evt2irq(0xa40),
278  .flags = IORESOURCE_IRQ,
279  },
280 };
281 
282 static struct platform_device usbhs_device = {
283  .name = "renesas_usbhs",
284  .id = 1,
285  .dev = {
286  .dma_mask = NULL, /* not use dma */
287  .coherent_dma_mask = 0xffffffff,
288  .platform_data = &usbhs_info,
289  },
290  .num_resources = ARRAY_SIZE(usbhs_resources),
291  .resource = usbhs_resources,
292 };
293 
294 /* LCDC */
295 static const struct fb_videomode ecovec_lcd_modes[] = {
296  {
297  .name = "Panel",
298  .xres = 800,
299  .yres = 480,
300  .left_margin = 220,
301  .right_margin = 110,
302  .hsync_len = 70,
303  .upper_margin = 20,
304  .lower_margin = 5,
305  .vsync_len = 5,
306  .sync = 0, /* hsync and vsync are active low */
307  },
308 };
309 
310 static const struct fb_videomode ecovec_dvi_modes[] = {
311  {
312  .name = "DVI",
313  .xres = 1280,
314  .yres = 720,
315  .left_margin = 220,
316  .right_margin = 110,
317  .hsync_len = 40,
318  .upper_margin = 20,
319  .lower_margin = 5,
320  .vsync_len = 5,
321  .sync = 0, /* hsync and vsync are active low */
322  },
323 };
324 
325 static int ecovec24_set_brightness(int brightness)
326 {
327  gpio_set_value(GPIO_PTR1, brightness);
328 
329  return 0;
330 }
331 
332 static int ecovec24_get_brightness(void)
333 {
334  return gpio_get_value(GPIO_PTR1);
335 }
336 
337 static struct sh_mobile_lcdc_info lcdc_info = {
338  .ch[0] = {
339  .interface_type = RGB18,
340  .chan = LCDC_CHAN_MAINLCD,
341  .fourcc = V4L2_PIX_FMT_RGB565,
342  .panel_cfg = { /* 7.0 inch */
343  .width = 152,
344  .height = 91,
345  },
346  .bl_info = {
347  .name = "sh_mobile_lcdc_bl",
348  .max_brightness = 1,
349  .set_brightness = ecovec24_set_brightness,
350  .get_brightness = ecovec24_get_brightness,
351  },
352  }
353 };
354 
355 static struct resource lcdc_resources[] = {
356  [0] = {
357  .name = "LCDC",
358  .start = 0xfe940000,
359  .end = 0xfe942fff,
360  .flags = IORESOURCE_MEM,
361  },
362  [1] = {
363  .start = evt2irq(0xf40),
364  .flags = IORESOURCE_IRQ,
365  },
366 };
367 
368 static struct platform_device lcdc_device = {
369  .name = "sh_mobile_lcdc_fb",
370  .num_resources = ARRAY_SIZE(lcdc_resources),
371  .resource = lcdc_resources,
372  .dev = {
373  .platform_data = &lcdc_info,
374  },
375 };
376 
377 /* CEU0 */
378 static struct sh_mobile_ceu_info sh_mobile_ceu0_info = {
379  .flags = SH_CEU_FLAG_USE_8BIT_BUS,
380 };
381 
382 static struct resource ceu0_resources[] = {
383  [0] = {
384  .name = "CEU0",
385  .start = 0xfe910000,
386  .end = 0xfe91009f,
387  .flags = IORESOURCE_MEM,
388  },
389  [1] = {
390  .start = evt2irq(0x880),
391  .flags = IORESOURCE_IRQ,
392  },
393  [2] = {
394  /* place holder for contiguous memory */
395  },
396 };
397 
398 static struct platform_device ceu0_device = {
399  .name = "sh_mobile_ceu",
400  .id = 0, /* "ceu0" clock */
401  .num_resources = ARRAY_SIZE(ceu0_resources),
402  .resource = ceu0_resources,
403  .dev = {
404  .platform_data = &sh_mobile_ceu0_info,
405  },
406 };
407 
408 /* CEU1 */
409 static struct sh_mobile_ceu_info sh_mobile_ceu1_info = {
410  .flags = SH_CEU_FLAG_USE_8BIT_BUS,
411 };
412 
413 static struct resource ceu1_resources[] = {
414  [0] = {
415  .name = "CEU1",
416  .start = 0xfe914000,
417  .end = 0xfe91409f,
418  .flags = IORESOURCE_MEM,
419  },
420  [1] = {
421  .start = evt2irq(0x9e0),
422  .flags = IORESOURCE_IRQ,
423  },
424  [2] = {
425  /* place holder for contiguous memory */
426  },
427 };
428 
429 static struct platform_device ceu1_device = {
430  .name = "sh_mobile_ceu",
431  .id = 1, /* "ceu1" clock */
432  .num_resources = ARRAY_SIZE(ceu1_resources),
433  .resource = ceu1_resources,
434  .dev = {
435  .platform_data = &sh_mobile_ceu1_info,
436  },
437 };
438 
439 /* I2C device */
440 static struct i2c_board_info i2c0_devices[] = {
441  {
442  I2C_BOARD_INFO("da7210", 0x1a),
443  },
444 };
445 
446 static struct i2c_board_info i2c1_devices[] = {
447  {
448  I2C_BOARD_INFO("r2025sd", 0x32),
449  },
450  {
451  I2C_BOARD_INFO("lis3lv02d", 0x1c),
452  .irq = evt2irq(0x620),
453  }
454 };
455 
456 /* KEYSC */
457 static struct sh_keysc_info keysc_info = {
458  .mode = SH_KEYSC_MODE_1,
459  .scan_timing = 3,
460  .delay = 50,
461  .kycr2_delay = 100,
462  .keycodes = { KEY_1, 0, 0, 0, 0,
463  KEY_2, 0, 0, 0, 0,
464  KEY_3, 0, 0, 0, 0,
465  KEY_4, 0, 0, 0, 0,
466  KEY_5, 0, 0, 0, 0,
467  KEY_6, 0, 0, 0, 0, },
468 };
469 
470 static struct resource keysc_resources[] = {
471  [0] = {
472  .name = "KEYSC",
473  .start = 0x044b0000,
474  .end = 0x044b000f,
475  .flags = IORESOURCE_MEM,
476  },
477  [1] = {
478  .start = evt2irq(0xbe0),
479  .flags = IORESOURCE_IRQ,
480  },
481 };
482 
483 static struct platform_device keysc_device = {
484  .name = "sh_keysc",
485  .id = 0, /* keysc0 clock */
486  .num_resources = ARRAY_SIZE(keysc_resources),
487  .resource = keysc_resources,
488  .dev = {
489  .platform_data = &keysc_info,
490  },
491 };
492 
493 /* TouchScreen */
494 #define IRQ0 evt2irq(0x600)
495 
496 static int ts_get_pendown_state(void)
497 {
498  int val = 0;
502 
503  val = gpio_get_value(GPIO_PTZ0);
504 
507 
508  return val ? 0 : 1;
509 }
510 
511 static int ts_init(void)
512 {
514  return 0;
515 }
516 
517 static struct tsc2007_platform_data tsc2007_info = {
518  .model = 2007,
519  .x_plate_ohms = 180,
520  .get_pendown_state = ts_get_pendown_state,
521  .init_platform_hw = ts_init,
522 };
523 
524 static struct i2c_board_info ts_i2c_clients = {
525  I2C_BOARD_INFO("tsc2007", 0x48),
526  .type = "tsc2007",
527  .platform_data = &tsc2007_info,
528  .irq = IRQ0,
529 };
530 
531 static struct regulator_consumer_supply cn12_power_consumers[] =
532 {
533  REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
534  REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"),
535  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
536  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
537 };
538 
539 static struct regulator_init_data cn12_power_init_data = {
540  .constraints = {
541  .valid_ops_mask = REGULATOR_CHANGE_STATUS,
542  },
543  .num_consumer_supplies = ARRAY_SIZE(cn12_power_consumers),
544  .consumer_supplies = cn12_power_consumers,
545 };
546 
547 static struct fixed_voltage_config cn12_power_info = {
548  .supply_name = "CN12 SD/MMC Vdd",
549  .microvolts = 3300000,
550  .gpio = GPIO_PTB7,
551  .enable_high = 1,
552  .init_data = &cn12_power_init_data,
553 };
554 
555 static struct platform_device cn12_power = {
556  .name = "reg-fixed-voltage",
557  .id = 0,
558  .dev = {
559  .platform_data = &cn12_power_info,
560  },
561 };
562 
563 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
564 /* SDHI0 */
565 static struct regulator_consumer_supply sdhi0_power_consumers[] =
566 {
567  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
568  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
569 };
570 
571 static struct regulator_init_data sdhi0_power_init_data = {
572  .constraints = {
573  .valid_ops_mask = REGULATOR_CHANGE_STATUS,
574  },
575  .num_consumer_supplies = ARRAY_SIZE(sdhi0_power_consumers),
576  .consumer_supplies = sdhi0_power_consumers,
577 };
578 
579 static struct fixed_voltage_config sdhi0_power_info = {
580  .supply_name = "CN11 SD/MMC Vdd",
581  .microvolts = 3300000,
582  .gpio = GPIO_PTB6,
583  .enable_high = 1,
584  .init_data = &sdhi0_power_init_data,
585 };
586 
587 static struct platform_device sdhi0_power = {
588  .name = "reg-fixed-voltage",
589  .id = 1,
590  .dev = {
591  .platform_data = &sdhi0_power_info,
592  },
593 };
594 
595 static void sdhi0_set_pwr(struct platform_device *pdev, int state)
596 {
597  static int power_gpio = -EINVAL;
598 
599  if (power_gpio < 0) {
600  int ret = gpio_request(GPIO_PTB6, NULL);
601  if (!ret) {
602  power_gpio = GPIO_PTB6;
603  gpio_direction_output(power_gpio, 0);
604  }
605  }
606 
607  /*
608  * Toggle the GPIO regardless, whether we managed to grab it above or
609  * the fixed regulator driver did.
610  */
611  gpio_set_value(GPIO_PTB6, state);
612 }
613 
614 static int sdhi0_get_cd(struct platform_device *pdev)
615 {
616  return !gpio_get_value(GPIO_PTY7);
617 }
618 
619 static struct sh_mobile_sdhi_info sdhi0_info = {
621  .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
622  .set_pwr = sdhi0_set_pwr,
625  .get_cd = sdhi0_get_cd,
626 };
627 
628 static struct resource sdhi0_resources[] = {
629  [0] = {
630  .name = "SDHI0",
631  .start = 0x04ce0000,
632  .end = 0x04ce00ff,
633  .flags = IORESOURCE_MEM,
634  },
635  [1] = {
636  .start = evt2irq(0xe80),
637  .flags = IORESOURCE_IRQ,
638  },
639 };
640 
641 static struct platform_device sdhi0_device = {
642  .name = "sh_mobile_sdhi",
643  .num_resources = ARRAY_SIZE(sdhi0_resources),
644  .resource = sdhi0_resources,
645  .id = 0,
646  .dev = {
647  .platform_data = &sdhi0_info,
648  },
649 };
650 
651 static void cn12_set_pwr(struct platform_device *pdev, int state)
652 {
653  static int power_gpio = -EINVAL;
654 
655  if (power_gpio < 0) {
656  int ret = gpio_request(GPIO_PTB7, NULL);
657  if (!ret) {
658  power_gpio = GPIO_PTB7;
659  gpio_direction_output(power_gpio, 0);
660  }
661  }
662 
663  /*
664  * Toggle the GPIO regardless, whether we managed to grab it above or
665  * the fixed regulator driver did.
666  */
667  gpio_set_value(GPIO_PTB7, state);
668 }
669 
670 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
671 /* SDHI1 */
672 static int sdhi1_get_cd(struct platform_device *pdev)
673 {
674  return !gpio_get_value(GPIO_PTW7);
675 }
676 
677 static struct sh_mobile_sdhi_info sdhi1_info = {
679  .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
682  .set_pwr = cn12_set_pwr,
683  .get_cd = sdhi1_get_cd,
684 };
685 
686 static struct resource sdhi1_resources[] = {
687  [0] = {
688  .name = "SDHI1",
689  .start = 0x04cf0000,
690  .end = 0x04cf00ff,
691  .flags = IORESOURCE_MEM,
692  },
693  [1] = {
694  .start = evt2irq(0x4e0),
695  .flags = IORESOURCE_IRQ,
696  },
697 };
698 
699 static struct platform_device sdhi1_device = {
700  .name = "sh_mobile_sdhi",
701  .num_resources = ARRAY_SIZE(sdhi1_resources),
702  .resource = sdhi1_resources,
703  .id = 1,
704  .dev = {
705  .platform_data = &sdhi1_info,
706  },
707 };
708 #endif /* CONFIG_MMC_SH_MMCIF */
709 
710 #else
711 
712 /* MMC SPI */
713 static int mmc_spi_get_ro(struct device *dev)
714 {
715  return gpio_get_value(GPIO_PTY6);
716 }
717 
718 static int mmc_spi_get_cd(struct device *dev)
719 {
720  return !gpio_get_value(GPIO_PTY7);
721 }
722 
723 static void mmc_spi_setpower(struct device *dev, unsigned int maskval)
724 {
725  gpio_set_value(GPIO_PTB6, maskval ? 1 : 0);
726 }
727 
728 static struct mmc_spi_platform_data mmc_spi_info = {
729  .get_ro = mmc_spi_get_ro,
730  .get_cd = mmc_spi_get_cd,
731  .caps = MMC_CAP_NEEDS_POLL,
732  .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */
733  .setpower = mmc_spi_setpower,
734 };
735 
736 static struct spi_board_info spi_bus[] = {
737  {
738  .modalias = "mmc_spi",
739  .platform_data = &mmc_spi_info,
740  .max_speed_hz = 5000000,
741  .mode = SPI_MODE_0,
742  .controller_data = (void *) GPIO_PTM4,
743  },
744 };
745 
746 /* MSIOF0 */
747 static struct sh_msiof_spi_info msiof0_data = {
748  .num_chipselect = 1,
749 };
750 
751 static struct resource msiof0_resources[] = {
752  [0] = {
753  .name = "MSIOF0",
754  .start = 0xa4c40000,
755  .end = 0xa4c40063,
756  .flags = IORESOURCE_MEM,
757  },
758  [1] = {
759  .start = evt2irq(0xc80),
760  .flags = IORESOURCE_IRQ,
761  },
762 };
763 
764 static struct platform_device msiof0_device = {
765  .name = "spi_sh_msiof",
766  .id = 0, /* MSIOF0 */
767  .dev = {
768  .platform_data = &msiof0_data,
769  },
770  .num_resources = ARRAY_SIZE(msiof0_resources),
771  .resource = msiof0_resources,
772 };
773 
774 #endif
775 
776 /* I2C Video/Camera */
777 static struct i2c_board_info i2c_camera[] = {
778  {
779  I2C_BOARD_INFO("tw9910", 0x45),
780  },
781  {
782  /* 1st camera */
783  I2C_BOARD_INFO("mt9t112", 0x3c),
784  },
785  {
786  /* 2nd camera */
787  I2C_BOARD_INFO("mt9t112", 0x3c),
788  },
789 };
790 
791 /* tw9910 */
792 static int tw9910_power(struct device *dev, int mode)
793 {
794  int val = mode ? 0 : 1;
795 
797  if (mode)
798  mdelay(100);
799 
800  return 0;
801 }
802 
803 static struct tw9910_video_info tw9910_info = {
804  .buswidth = SOCAM_DATAWIDTH_8,
805  .mpout = TW9910_MPO_FIELD,
806 };
807 
808 static struct soc_camera_link tw9910_link = {
809  .i2c_adapter_id = 0,
810  .bus_id = 1,
811  .power = tw9910_power,
812  .board_info = &i2c_camera[0],
813  .priv = &tw9910_info,
814 };
815 
816 /* mt9t112 */
817 static int mt9t112_power1(struct device *dev, int mode)
818 {
819  gpio_set_value(GPIO_PTA3, mode);
820  if (mode)
821  mdelay(100);
822 
823  return 0;
824 }
825 
826 static struct mt9t112_camera_info mt9t112_info1 = {
828  .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */
829 };
830 
831 static struct soc_camera_link mt9t112_link1 = {
832  .i2c_adapter_id = 0,
833  .power = mt9t112_power1,
834  .bus_id = 0,
835  .board_info = &i2c_camera[1],
836  .priv = &mt9t112_info1,
837 };
838 
839 static int mt9t112_power2(struct device *dev, int mode)
840 {
841  gpio_set_value(GPIO_PTA4, mode);
842  if (mode)
843  mdelay(100);
844 
845  return 0;
846 }
847 
848 static struct mt9t112_camera_info mt9t112_info2 = {
850  .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */
851 };
852 
853 static struct soc_camera_link mt9t112_link2 = {
854  .i2c_adapter_id = 1,
855  .power = mt9t112_power2,
856  .bus_id = 1,
857  .board_info = &i2c_camera[2],
858  .priv = &mt9t112_info2,
859 };
860 
861 static struct platform_device camera_devices[] = {
862  {
863  .name = "soc-camera-pdrv",
864  .id = 0,
865  .dev = {
866  .platform_data = &tw9910_link,
867  },
868  },
869  {
870  .name = "soc-camera-pdrv",
871  .id = 1,
872  .dev = {
873  .platform_data = &mt9t112_link1,
874  },
875  },
876  {
877  .name = "soc-camera-pdrv",
878  .id = 2,
879  .dev = {
880  .platform_data = &mt9t112_link2,
881  },
882  },
883 };
884 
885 /* FSI */
886 static struct sh_fsi_platform_info fsi_info = {
887  .port_b = {
888  .flags = SH_FSI_BRS_INV,
889  },
890 };
891 
892 static struct resource fsi_resources[] = {
893  [0] = {
894  .name = "FSI",
895  .start = 0xFE3C0000,
896  .end = 0xFE3C021d,
897  .flags = IORESOURCE_MEM,
898  },
899  [1] = {
900  .start = evt2irq(0xf80),
901  .flags = IORESOURCE_IRQ,
902  },
903 };
904 
905 static struct platform_device fsi_device = {
906  .name = "sh_fsi",
907  .id = 0,
908  .num_resources = ARRAY_SIZE(fsi_resources),
909  .resource = fsi_resources,
910  .dev = {
911  .platform_data = &fsi_info,
912  },
913 };
914 
915 static struct asoc_simple_dai_init_info fsi_da7210_init_info = {
916  .fmt = SND_SOC_DAIFMT_I2S,
917  .codec_daifmt = SND_SOC_DAIFMT_CBM_CFM,
918  .cpu_daifmt = SND_SOC_DAIFMT_CBS_CFS,
919 };
920 
921 static struct asoc_simple_card_info fsi_da7210_info = {
922  .name = "DA7210",
923  .card = "FSIB-DA7210",
924  .cpu_dai = "fsib-dai",
925  .codec = "da7210.0-001a",
926  .platform = "sh_fsi.0",
927  .codec_dai = "da7210-hifi",
928  .init = &fsi_da7210_init_info,
929 };
930 
931 static struct platform_device fsi_da7210_device = {
932  .name = "asoc-simple-card",
933  .dev = {
934  .platform_data = &fsi_da7210_info,
935  },
936 };
937 
938 
939 /* IrDA */
940 static struct resource irda_resources[] = {
941  [0] = {
942  .name = "IrDA",
943  .start = 0xA45D0000,
944  .end = 0xA45D0049,
945  .flags = IORESOURCE_MEM,
946  },
947  [1] = {
948  .start = evt2irq(0x480),
949  .flags = IORESOURCE_IRQ,
950  },
951 };
952 
953 static struct platform_device irda_device = {
954  .name = "sh_sir",
955  .num_resources = ARRAY_SIZE(irda_resources),
956  .resource = irda_resources,
957 };
958 
959 #include <media/ak881x.h>
960 #include <media/sh_vou.h>
961 
962 static struct ak881x_pdata ak881x_pdata = {
964 };
965 
966 static struct i2c_board_info ak8813 = {
967  I2C_BOARD_INFO("ak8813", 0x20),
968  .platform_data = &ak881x_pdata,
969 };
970 
971 static struct sh_vou_pdata sh_vou_pdata = {
974  .board_info = &ak8813,
975  .i2c_adap = 0,
976 };
977 
978 static struct resource sh_vou_resources[] = {
979  [0] = {
980  .start = 0xfe960000,
981  .end = 0xfe962043,
982  .flags = IORESOURCE_MEM,
983  },
984  [1] = {
985  .start = evt2irq(0x8e0),
986  .flags = IORESOURCE_IRQ,
987  },
988 };
989 
990 static struct platform_device vou_device = {
991  .name = "sh-vou",
992  .id = -1,
993  .num_resources = ARRAY_SIZE(sh_vou_resources),
994  .resource = sh_vou_resources,
995  .dev = {
996  .platform_data = &sh_vou_pdata,
997  },
998 };
999 
1000 #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE)
1001 /* SH_MMCIF */
1002 static void mmcif_down_pwr(struct platform_device *pdev)
1003 {
1004  cn12_set_pwr(pdev, 0);
1005 }
1006 
1007 static struct resource sh_mmcif_resources[] = {
1008  [0] = {
1009  .name = "SH_MMCIF",
1010  .start = 0xA4CA0000,
1011  .end = 0xA4CA00FF,
1012  .flags = IORESOURCE_MEM,
1013  },
1014  [1] = {
1015  /* MMC2I */
1016  .start = evt2irq(0x5a0),
1017  .flags = IORESOURCE_IRQ,
1018  },
1019  [2] = {
1020  /* MMC3I */
1021  .start = evt2irq(0x5c0),
1022  .flags = IORESOURCE_IRQ,
1023  },
1024 };
1025 
1026 static struct sh_mmcif_plat_data sh_mmcif_plat = {
1027  .set_pwr = cn12_set_pwr,
1028  .down_pwr = mmcif_down_pwr,
1029  .sup_pclk = 0, /* SH7724: Max Pclk/2 */
1030  .caps = MMC_CAP_4_BIT_DATA |
1033  .ocr = MMC_VDD_32_33 | MMC_VDD_33_34,
1034 };
1035 
1036 static struct platform_device sh_mmcif_device = {
1037  .name = "sh_mmcif",
1038  .id = 0,
1039  .dev = {
1040  .platform_data = &sh_mmcif_plat,
1041  },
1042  .num_resources = ARRAY_SIZE(sh_mmcif_resources),
1043  .resource = sh_mmcif_resources,
1044 };
1045 #endif
1046 
1047 static struct platform_device *ecovec_devices[] __initdata = {
1048  &heartbeat_device,
1049  &nor_flash_device,
1050  &sh_eth_device,
1051  &usb0_host_device,
1052  &usb1_common_device,
1053  &usbhs_device,
1054  &lcdc_device,
1055  &ceu0_device,
1056  &ceu1_device,
1057  &keysc_device,
1058  &cn12_power,
1059 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
1060  &sdhi0_power,
1061  &sdhi0_device,
1062 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1063  &sdhi1_device,
1064 #endif
1065 #else
1066  &msiof0_device,
1067 #endif
1068  &camera_devices[0],
1069  &camera_devices[1],
1070  &camera_devices[2],
1071  &fsi_device,
1072  &fsi_da7210_device,
1073  &irda_device,
1074  &vou_device,
1075 #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE)
1076  &sh_mmcif_device,
1077 #endif
1078 };
1079 
1080 #ifdef CONFIG_I2C
1081 #define EEPROM_ADDR 0x50
1082 static u8 mac_read(struct i2c_adapter *a, u8 command)
1083 {
1084  struct i2c_msg msg[2];
1085  u8 buf;
1086  int ret;
1087 
1088  msg[0].addr = EEPROM_ADDR;
1089  msg[0].flags = 0;
1090  msg[0].len = 1;
1091  msg[0].buf = &command;
1092 
1093  msg[1].addr = EEPROM_ADDR;
1094  msg[1].flags = I2C_M_RD;
1095  msg[1].len = 1;
1096  msg[1].buf = &buf;
1097 
1098  ret = i2c_transfer(a, msg, 2);
1099  if (ret < 0) {
1100  printk(KERN_ERR "error %d\n", ret);
1101  buf = 0xff;
1102  }
1103 
1104  return buf;
1105 }
1106 
1107 static void __init sh_eth_init(struct sh_eth_plat_data *pd)
1108 {
1109  struct i2c_adapter *a = i2c_get_adapter(1);
1110  int i;
1111 
1112  if (!a) {
1113  pr_err("can not get I2C 1\n");
1114  return;
1115  }
1116 
1117  /* read MAC address from EEPROM */
1118  for (i = 0; i < sizeof(pd->mac_addr); i++) {
1119  pd->mac_addr[i] = mac_read(a, 0x10 + i);
1120  msleep(10);
1121  }
1122 
1123  i2c_put_adapter(a);
1124 }
1125 #else
1126 static void __init sh_eth_init(struct sh_eth_plat_data *pd)
1127 {
1128  pr_err("unable to read sh_eth MAC address\n");
1129 }
1130 #endif
1131 
1132 #define PORT_HIZA 0xA4050158
1133 #define IODRIVEA 0xA405018A
1134 
1135 extern char ecovec24_sdram_enter_start;
1136 extern char ecovec24_sdram_enter_end;
1137 extern char ecovec24_sdram_leave_start;
1138 extern char ecovec24_sdram_leave_end;
1139 
1140 static int __init arch_setup(void)
1141 {
1142  struct clk *clk;
1143  bool cn12_enabled = false;
1144 
1145  /* register board specific self-refresh code */
1148  &ecovec24_sdram_enter_start,
1149  &ecovec24_sdram_enter_end,
1150  &ecovec24_sdram_leave_start,
1151  &ecovec24_sdram_leave_end);
1152 
1153  /* enable STATUS0, STATUS2 and PDSTATUS */
1157 
1158  /* enable SCIFA0 */
1161 
1162  /* enable debug LED */
1171  __raw_writew((__raw_readw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA);
1172 
1173  /* enable SH-Eth */
1176  mdelay(20);
1177 
1189 
1190  /* enable USB */
1191  __raw_writew(0x0000, 0xA4D80000);
1192  __raw_writew(0x0000, 0xA4D90000);
1199  __raw_writew(0x0600, 0xa40501d4);
1200  __raw_writew(0x0600, 0xa4050192);
1201 
1202  if (gpio_get_value(GPIO_PTB3)) {
1203  printk(KERN_INFO "USB1 function is selected\n");
1204  usb1_common_device.name = "r8a66597_udc";
1205  } else {
1206  printk(KERN_INFO "USB1 host is selected\n");
1207  usb1_common_device.name = "r8a66597_hcd";
1208  }
1209 
1210  /* enable LCDC */
1242 
1251 
1252  /* I/O buffer drive ability is high */
1253  __raw_writew((__raw_readw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA);
1254 
1255  if (gpio_get_value(GPIO_PTE6)) {
1256  /* DVI */
1257  lcdc_info.clock_source = LCDC_CLK_EXTERNAL;
1258  lcdc_info.ch[0].clock_divider = 1;
1259  lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes;
1260  lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes);
1261 
1264  } else {
1265  /* Panel */
1266  lcdc_info.clock_source = LCDC_CLK_PERIPHERAL;
1267  lcdc_info.ch[0].clock_divider = 2;
1268  lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes;
1269  lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes);
1270 
1272 
1273  /* FIXME
1274  *
1275  * LCDDON control is needed for Panel,
1276  * but current sh_mobile_lcdc driver doesn't control it.
1277  * It is temporary correspondence
1278  */
1281 
1282  /* enable TouchScreen */
1283  i2c_register_board_info(0, &ts_i2c_clients, 1);
1285  }
1286 
1287  /* enable CEU0 */
1308  platform_resource_setup_memory(&ceu0_device, "ceu0", 4 << 20);
1309 
1310  /* enable CEU1 */
1323  platform_resource_setup_memory(&ceu1_device, "ceu1", 4 << 20);
1324 
1325  /* enable KEYSC */
1333 
1334  /* enable user debug switch */
1343 
1344  /* SD-card slot CN11 */
1345  /* Card-detect, used on CN11, either with SDHI0 or with SPI */
1348 
1349 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
1350  /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */
1358 #else
1359  /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */
1363  gpio_request(GPIO_PTM4, NULL); /* software CS control of TSYNC pin */
1364  gpio_direction_output(GPIO_PTM4, 1); /* active low CS */
1365  gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */
1366  gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */
1367  gpio_request(GPIO_PTY6, NULL); /* write protect */
1369 
1370  spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
1371 #endif
1372 
1373  /* MMC/SD-card slot CN12 */
1374 #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE)
1375  /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */
1386 
1387  cn12_enabled = true;
1388 #elif defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
1389  /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */
1397 
1398  /* Card-detect, used on CN12 with SDHI1 */
1401 
1402  cn12_enabled = true;
1403 #endif
1404 
1405  if (cn12_enabled)
1406  /* I/O buffer drive ability is high for CN12 */
1407  __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000,
1408  IODRIVEA);
1409 
1410  /* enable Video */
1413 
1414  /* enable Camera */
1419 
1420  /* enable FSI */
1429 
1430  /* set SPU2 clock to 83.4 MHz */
1431  clk = clk_get(NULL, "spu_clk");
1432  if (!IS_ERR(clk)) {
1433  clk_set_rate(clk, clk_round_rate(clk, 83333333));
1434  clk_put(clk);
1435  }
1436 
1437  /* change parent of FSI B */
1438  clk = clk_get(NULL, "fsib_clk");
1439  if (!IS_ERR(clk)) {
1440  /* 48kHz dummy clock was used to make sure 1/1 divide */
1443  clk_set_rate(clk, 48000);
1444  clk_put(clk);
1445  }
1446 
1449  mdelay(20);
1450 
1451  /* enable motion sensor */
1454 
1455  /* set VPU clock to 166 MHz */
1456  clk = clk_get(NULL, "vpu_clk");
1457  if (!IS_ERR(clk)) {
1458  clk_set_rate(clk, clk_round_rate(clk, 166000000));
1459  clk_put(clk);
1460  }
1461 
1462  /* enable IrDA */
1467 
1468  /* enable I2C device */
1469  i2c_register_board_info(0, i2c0_devices,
1470  ARRAY_SIZE(i2c0_devices));
1471 
1472  i2c_register_board_info(1, i2c1_devices,
1473  ARRAY_SIZE(i2c1_devices));
1474 
1475 #if defined(CONFIG_VIDEO_SH_VOU) || defined(CONFIG_VIDEO_SH_VOU_MODULE)
1476  /* VOU */
1489 
1490  /* AK8813 power / reset sequence */
1493  /* Reset */
1495  /* Power down */
1497 
1498  udelay(10);
1499 
1500  /* Power up, reset */
1502 
1503  udelay(10);
1504 
1505  /* Remove reset */
1507 #endif
1508 
1509  return platform_add_devices(ecovec_devices,
1510  ARRAY_SIZE(ecovec_devices));
1511 }
1512 arch_initcall(arch_setup);
1513 
1514 static int __init devices_setup(void)
1515 {
1516  sh_eth_init(&sh_eth_plat);
1517  return 0;
1518 }
1519 device_initcall(devices_setup);
1520 
1521 static struct sh_machine_vector mv_ecovec __initmv = {
1522  .mv_name = "R0P7724 (EcoVec)",
1523 };