Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-mackerel.c
Go to the documentation of this file.
1 /*
2  * mackerel board support
3  *
4  * Copyright (C) 2010 Renesas Solutions Corp.
5  * Kuninori Morimoto <[email protected]>
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>
39 #include <linux/mtd/mtd.h>
40 #include <linux/mtd/partitions.h>
41 #include <linux/mtd/physmap.h>
42 #include <linux/mtd/sh_flctl.h>
43 #include <linux/pm_clock.h>
44 #include <linux/regulator/fixed.h>
46 #include <linux/smsc911x.h>
47 #include <linux/sh_intc.h>
48 #include <linux/tca6416_keypad.h>
50 #include <linux/dma-mapping.h>
51 
52 #include <video/sh_mobile_hdmi.h>
53 #include <video/sh_mobile_lcdc.h>
54 #include <media/sh_mobile_ceu.h>
55 #include <media/soc_camera.h>
57 #include <sound/sh_fsi.h>
58 #include <sound/simple_card.h>
59 
60 #include <mach/common.h>
61 #include <mach/irqs.h>
62 #include <mach/sh7372.h>
63 
64 #include <asm/mach/arch.h>
65 #include <asm/mach-types.h>
66 
67 #include "sh-gpio.h"
68 
69 /*
70  * Address Interface BusWidth note
71  * ------------------------------------------------------------------
72  * 0x0000_0000 NOR Flash ROM (MCP) 16bit SW7 : bit1 = ON
73  * 0x0800_0000 user area -
74  * 0x1000_0000 NOR Flash ROM (MCP) 16bit SW7 : bit1 = OFF
75  * 0x1400_0000 Ether (LAN9220) 16bit
76  * 0x1600_0000 user area - cannot use with NAND
77  * 0x1800_0000 user area -
78  * 0x1A00_0000 -
79  * 0x4000_0000 LPDDR2-SDRAM (POP) 32bit
80  */
81 
82 /*
83  * CPU mode
84  *
85  * SW4 | Boot Area| Master | Remarks
86  * 1 | 2 | 3 | 4 | 5 | 6 | 8 | | Processor|
87  * ----+-----+-----+-----+-----+-----+-----+----------+----------+--------------
88  * ON | ON | OFF | ON | ON | OFF | OFF | External | System | External ROM
89  * ON | ON | ON | ON | ON | OFF | OFF | External | System | ROM Debug
90  * ON | ON | X | ON | OFF | OFF | OFF | Built-in | System | ROM Debug
91  * X | OFF | X | X | X | X | OFF | Built-in | System | MaskROM
92  * OFF | X | X | X | X | X | OFF | Built-in | System | MaskROM
93  * X | X | X | OFF | X | X | OFF | Built-in | System | MaskROM
94  * OFF | ON | OFF | X | X | OFF | ON | External | System | Standalone
95  * ON | OFF | OFF | X | X | OFF | ON | External | Realtime | Standalone
96 */
97 
98 /*
99  * NOR Flash ROM
100  *
101  * SW1 | SW2 | SW7 | NOR Flash ROM
102  * bit1 | bit1 bit2 | bit1 | Memory allocation
103  * ------+------------+------+------------------
104  * OFF | ON OFF | ON | Area 0
105  * OFF | ON OFF | OFF | Area 4
106  */
107 
108 /*
109  * SMSC 9220
110  *
111  * SW1 SMSC 9220
112  * -----------------------
113  * ON access disable
114  * OFF access enable
115  */
116 
117 /*
118  * NAND Flash ROM
119  *
120  * SW1 | SW2 | SW7 | NAND Flash ROM
121  * bit1 | bit1 bit2 | bit2 | Memory allocation
122  * ------+------------+------+------------------
123  * OFF | ON OFF | ON | FCE 0
124  * OFF | ON OFF | OFF | FCE 1
125  */
126 
127 /*
128  * External interrupt pin settings
129  *
130  * IRQX | pin setting | device | level
131  * ------+--------------------+--------------------+-------
132  * IRQ0 | ICR1A.IRQ0SA=0010 | SDHI2 card detect | Low
133  * IRQ6 | ICR1A.IRQ6SA=0011 | Ether(LAN9220) | High
134  * IRQ7 | ICR1A.IRQ7SA=0010 | LCD Touch Panel | Low
135  * IRQ8 | ICR2A.IRQ8SA=0010 | MMC/SD card detect | Low
136  * IRQ9 | ICR2A.IRQ9SA=0010 | KEY(TCA6408) | Low
137  * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345) | High
138  * IRQ22 | ICR4A.IRQ22SA=0011 | Sensor(AK8975) | High
139  */
140 
141 /*
142  * USB
143  *
144  * USB0 : CN22 : Function
145  * USB1 : CN31 : Function/Host *1
146  *
147  * J30 (for CN31) *1
148  * ----------+---------------+-------------
149  * 1-2 short | VBUS 5V | Host
150  * open | external VBUS | Function
151  *
152  * CAUTION
153  *
154  * renesas_usbhs driver can use external interrupt mode
155  * (which come from USB-PHY) or autonomy mode (it use own interrupt)
156  * for detecting connection/disconnection when Function.
157  * USB will be power OFF while it has been disconnecting
158  * if external interrupt mode, and it is always power ON if autonomy mode,
159  *
160  * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0",
161  * because Touchscreen is using IRQ7-PORT40.
162  * It is impossible to use IRQ7 demux on this board.
163  */
164 
165 /*
166  * SDHI0 (CN12)
167  *
168  * SW56 : OFF
169  *
170  */
171 
172 /* MMC /SDHI1 (CN7)
173  *
174  * I/O voltage : 1.8v
175  *
176  * Power voltage : 1.8v or 3.3v
177  * J22 : select power voltage *1
178  * 1-2 pin : 1.8v
179  * 2-3 pin : 3.3v
180  *
181  * *1
182  * Please change J22 depends the card to be used.
183  * MMC's OCR field set to support either voltage for the card inserted.
184  *
185  * SW1 | SW33
186  * | bit1 | bit2 | bit3 | bit4
187  * -------------+------+------+------+-------
188  * MMC0 OFF | OFF | X | ON | X (Use MMCIF)
189  * SDHI1 OFF | ON | X | OFF | X (Use MFD_SH_MOBILE_SDHI)
190  *
191  */
192 
193 /*
194  * SDHI2 (CN23)
195  *
196  * microSD card sloct
197  *
198  */
199 
200 /*
201  * FSI - AK4642
202  *
203  * it needs amixer settings for playing
204  *
205  * amixer set "Headphone" on
206  * amixer set "HPOUTL Mixer DACH" on
207  * amixer set "HPOUTR Mixer DACH" on
208  */
209 
210 /* Fixed 3.3V and 1.8V regulators to be used by multiple devices */
211 static struct regulator_consumer_supply fixed1v8_power_consumers[] =
212 {
213  /*
214  * J22 on mackerel switches mmcif.0 and sdhi.1 between 1.8V and 3.3V
215  * Since we cannot support both voltages, we support the default 1.8V
216  */
217  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
218  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
219  REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
220  REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"),
221 };
222 
223 static struct regulator_consumer_supply fixed3v3_power_consumers[] =
224 {
225  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
226  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
227  REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.2"),
228  REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.2"),
229 };
230 
231 /* Dummy supplies, where voltage doesn't matter */
232 static struct regulator_consumer_supply dummy_supplies[] = {
233  REGULATOR_SUPPLY("vddvario", "smsc911x"),
234  REGULATOR_SUPPLY("vdd33a", "smsc911x"),
235 };
236 
237 /* MTD */
238 static struct mtd_partition nor_flash_partitions[] = {
239  {
240  .name = "loader",
241  .offset = 0x00000000,
242  .size = 512 * 1024,
243  .mask_flags = MTD_WRITEABLE,
244  },
245  {
246  .name = "bootenv",
247  .offset = MTDPART_OFS_APPEND,
248  .size = 512 * 1024,
249  .mask_flags = MTD_WRITEABLE,
250  },
251  {
252  .name = "kernel_ro",
253  .offset = MTDPART_OFS_APPEND,
254  .size = 8 * 1024 * 1024,
255  .mask_flags = MTD_WRITEABLE,
256  },
257  {
258  .name = "kernel",
259  .offset = MTDPART_OFS_APPEND,
260  .size = 8 * 1024 * 1024,
261  },
262  {
263  .name = "data",
264  .offset = MTDPART_OFS_APPEND,
265  .size = MTDPART_SIZ_FULL,
266  },
267 };
268 
269 static struct physmap_flash_data nor_flash_data = {
270  .width = 2,
271  .parts = nor_flash_partitions,
272  .nr_parts = ARRAY_SIZE(nor_flash_partitions),
273 };
274 
275 static struct resource nor_flash_resources[] = {
276  [0] = {
277  .start = 0x20000000, /* CS0 shadow instead of regular CS0 */
278  .end = 0x28000000 - 1, /* needed by USB MASK ROM boot */
279  .flags = IORESOURCE_MEM,
280  }
281 };
282 
283 static struct platform_device nor_flash_device = {
284  .name = "physmap-flash",
285  .dev = {
286  .platform_data = &nor_flash_data,
287  },
288  .num_resources = ARRAY_SIZE(nor_flash_resources),
289  .resource = nor_flash_resources,
290 };
291 
292 /* SMSC */
293 static struct resource smc911x_resources[] = {
294  {
295  .start = 0x14000000,
296  .end = 0x16000000 - 1,
297  .flags = IORESOURCE_MEM,
298  }, {
299  .start = evt2irq(0x02c0) /* IRQ6A */,
301  },
302 };
303 
304 static struct smsc911x_platform_config smsc911x_info = {
306  .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
307  .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
308 };
309 
310 static struct platform_device smc911x_device = {
311  .name = "smsc911x",
312  .id = -1,
313  .num_resources = ARRAY_SIZE(smc911x_resources),
314  .resource = smc911x_resources,
315  .dev = {
316  .platform_data = &smsc911x_info,
317  },
318 };
319 
320 /* MERAM */
321 static struct sh_mobile_meram_info mackerel_meram_info = {
322  .addr_mode = SH_MOBILE_MERAM_MODE1,
323 };
324 
325 static struct resource meram_resources[] = {
326  [0] = {
327  .name = "regs",
328  .start = 0xe8000000,
329  .end = 0xe807ffff,
330  .flags = IORESOURCE_MEM,
331  },
332  [1] = {
333  .name = "meram",
334  .start = 0xe8080000,
335  .end = 0xe81fffff,
336  .flags = IORESOURCE_MEM,
337  },
338 };
339 
340 static struct platform_device meram_device = {
341  .name = "sh_mobile_meram",
342  .id = 0,
343  .num_resources = ARRAY_SIZE(meram_resources),
344  .resource = meram_resources,
345  .dev = {
346  .platform_data = &mackerel_meram_info,
347  },
348 };
349 
350 /* LCDC */
351 static struct fb_videomode mackerel_lcdc_modes[] = {
352  {
353  .name = "WVGA Panel",
354  .xres = 800,
355  .yres = 480,
356  .left_margin = 220,
357  .right_margin = 110,
358  .hsync_len = 70,
359  .upper_margin = 20,
360  .lower_margin = 5,
361  .vsync_len = 5,
362  .sync = 0,
363  },
364 };
365 
366 static int mackerel_set_brightness(int brightness)
367 {
368  gpio_set_value(GPIO_PORT31, brightness);
369 
370  return 0;
371 }
372 
373 static int mackerel_get_brightness(void)
374 {
375  return gpio_get_value(GPIO_PORT31);
376 }
377 
378 static const struct sh_mobile_meram_cfg lcd_meram_cfg = {
379  .icb[0] = {
380  .meram_size = 0x40,
381  },
382  .icb[1] = {
383  .meram_size = 0x40,
384  },
385 };
386 
387 static struct sh_mobile_lcdc_info lcdc_info = {
388  .meram_dev = &mackerel_meram_info,
389  .clock_source = LCDC_CLK_BUS,
390  .ch[0] = {
391  .chan = LCDC_CHAN_MAINLCD,
392  .fourcc = V4L2_PIX_FMT_RGB565,
393  .lcd_modes = mackerel_lcdc_modes,
394  .num_modes = ARRAY_SIZE(mackerel_lcdc_modes),
395  .interface_type = RGB24,
396  .clock_divider = 3,
397  .flags = 0,
398  .panel_cfg = {
399  .width = 152,
400  .height = 91,
401  },
402  .bl_info = {
403  .name = "sh_mobile_lcdc_bl",
404  .max_brightness = 1,
405  .set_brightness = mackerel_set_brightness,
406  .get_brightness = mackerel_get_brightness,
407  },
408  .meram_cfg = &lcd_meram_cfg,
409  }
410 };
411 
412 static struct resource lcdc_resources[] = {
413  [0] = {
414  .name = "LCDC",
415  .start = 0xfe940000,
416  .end = 0xfe943fff,
417  .flags = IORESOURCE_MEM,
418  },
419  [1] = {
420  .start = intcs_evt2irq(0x580),
421  .flags = IORESOURCE_IRQ,
422  },
423 };
424 
425 static struct platform_device lcdc_device = {
426  .name = "sh_mobile_lcdc_fb",
427  .num_resources = ARRAY_SIZE(lcdc_resources),
428  .resource = lcdc_resources,
429  .dev = {
430  .platform_data = &lcdc_info,
431  .coherent_dma_mask = ~0,
432  },
433 };
434 
435 /* HDMI */
436 static struct sh_mobile_hdmi_info hdmi_info = {
437  .flags = HDMI_SND_SRC_SPDIF,
438 };
439 
440 static struct resource hdmi_resources[] = {
441  [0] = {
442  .name = "HDMI",
443  .start = 0xe6be0000,
444  .end = 0xe6be00ff,
445  .flags = IORESOURCE_MEM,
446  },
447  [1] = {
448  /* There's also an HDMI interrupt on INTCS @ 0x18e0 */
449  .start = evt2irq(0x17e0),
450  .flags = IORESOURCE_IRQ,
451  },
452 };
453 
454 static struct platform_device hdmi_device = {
455  .name = "sh-mobile-hdmi",
456  .num_resources = ARRAY_SIZE(hdmi_resources),
457  .resource = hdmi_resources,
458  .id = -1,
459  .dev = {
460  .platform_data = &hdmi_info,
461  },
462 };
463 
464 static const struct sh_mobile_meram_cfg hdmi_meram_cfg = {
465  .icb[0] = {
466  .meram_size = 0x100,
467  },
468  .icb[1] = {
469  .meram_size = 0x100,
470  },
471 };
472 
473 static struct sh_mobile_lcdc_info hdmi_lcdc_info = {
474  .meram_dev = &mackerel_meram_info,
475  .clock_source = LCDC_CLK_EXTERNAL,
476  .ch[0] = {
477  .chan = LCDC_CHAN_MAINLCD,
478  .fourcc = V4L2_PIX_FMT_RGB565,
479  .interface_type = RGB24,
480  .clock_divider = 1,
481  .flags = LCDC_FLAGS_DWPOL,
482  .meram_cfg = &hdmi_meram_cfg,
483  .tx_dev = &hdmi_device,
484  }
485 };
486 
487 static struct resource hdmi_lcdc_resources[] = {
488  [0] = {
489  .name = "LCDC1",
490  .start = 0xfe944000,
491  .end = 0xfe947fff,
492  .flags = IORESOURCE_MEM,
493  },
494  [1] = {
495  .start = intcs_evt2irq(0x1780),
496  .flags = IORESOURCE_IRQ,
497  },
498 };
499 
500 static struct platform_device hdmi_lcdc_device = {
501  .name = "sh_mobile_lcdc_fb",
502  .num_resources = ARRAY_SIZE(hdmi_lcdc_resources),
503  .resource = hdmi_lcdc_resources,
504  .id = 1,
505  .dev = {
506  .platform_data = &hdmi_lcdc_info,
507  .coherent_dma_mask = ~0,
508  },
509 };
510 
511 static struct asoc_simple_dai_init_info fsi2_hdmi_init_info = {
512  .cpu_daifmt = SND_SOC_DAIFMT_CBM_CFM,
513 };
514 
515 static struct asoc_simple_card_info fsi2_hdmi_info = {
516  .name = "HDMI",
517  .card = "FSI2B-HDMI",
518  .cpu_dai = "fsib-dai",
519  .codec = "sh-mobile-hdmi",
520  .platform = "sh_fsi2",
521  .codec_dai = "sh_mobile_hdmi-hifi",
522  .init = &fsi2_hdmi_init_info,
523 };
524 
525 static struct platform_device fsi_hdmi_device = {
526  .name = "asoc-simple-card",
527  .id = 1,
528  .dev = {
529  .platform_data = &fsi2_hdmi_info,
530  },
531 };
532 
533 static void __init hdmi_init_pm_clock(void)
534 {
535  struct clk *hdmi_ick = clk_get(&hdmi_device.dev, "ick");
536  int ret;
537  long rate;
538 
539  if (IS_ERR(hdmi_ick)) {
540  ret = PTR_ERR(hdmi_ick);
541  pr_err("Cannot get HDMI ICK: %d\n", ret);
542  goto out;
543  }
544 
546  if (ret < 0) {
547  pr_err("Cannot set PLLC2 parent: %d, %d users\n",
548  ret, sh7372_pllc2_clk.usecount);
549  goto out;
550  }
551 
552  pr_debug("PLLC2 initial frequency %lu\n",
554 
555  rate = clk_round_rate(&sh7372_pllc2_clk, 594000000);
556  if (rate < 0) {
557  pr_err("Cannot get suitable rate: %ld\n", rate);
558  ret = rate;
559  goto out;
560  }
561 
562  ret = clk_set_rate(&sh7372_pllc2_clk, rate);
563  if (ret < 0) {
564  pr_err("Cannot set rate %ld: %d\n", rate, ret);
565  goto out;
566  }
567 
568  pr_debug("PLLC2 set frequency %lu\n", rate);
569 
570  ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk);
571  if (ret < 0)
572  pr_err("Cannot set HDMI parent: %d\n", ret);
573 
574 out:
575  if (!IS_ERR(hdmi_ick))
576  clk_put(hdmi_ick);
577 }
578 
579 /* USBHS0 is connected to CN22 which takes a USB Mini-B plug
580  *
581  * The sh7372 SoC has IRQ7 set aside for USBHS0 hotplug,
582  * but on this particular board IRQ7 is already used by
583  * the touch screen. This leaves us with software polling.
584  */
585 #define USBHS0_POLL_INTERVAL (HZ * 5)
586 
587 struct usbhs_private {
593 };
594 
595 #define usbhs_get_priv(pdev) \
596  container_of(renesas_usbhs_get_info(pdev), \
597  struct usbhs_private, info)
598 
599 #define usbhs_is_connected(priv) \
600  (!((1 << 7) & __raw_readw(priv->usbcrcaddr)))
601 
602 static int usbhs_get_vbus(struct platform_device *pdev)
603 {
604  return usbhs_is_connected(usbhs_get_priv(pdev));
605 }
606 
607 static void usbhs_phy_reset(struct platform_device *pdev)
608 {
609  struct usbhs_private *priv = usbhs_get_priv(pdev);
610 
611  /* init phy */
612  __raw_writew(0x8a0a, priv->usbcrcaddr);
613 }
614 
615 static int usbhs0_get_id(struct platform_device *pdev)
616 {
617  return USBHS_GADGET;
618 }
619 
620 static void usbhs0_work_function(struct work_struct *work)
621 {
622  struct usbhs_private *priv = container_of(work, struct usbhs_private,
623  work.work);
624 
627 }
628 
629 static int usbhs0_hardware_init(struct platform_device *pdev)
630 {
631  struct usbhs_private *priv = usbhs_get_priv(pdev);
632 
633  priv->pdev = pdev;
634  INIT_DELAYED_WORK(&priv->work, usbhs0_work_function);
636  return 0;
637 }
638 
639 static void usbhs0_hardware_exit(struct platform_device *pdev)
640 {
641  struct usbhs_private *priv = usbhs_get_priv(pdev);
642 
644 }
645 
646 static struct usbhs_private usbhs0_private = {
647  .usbcrcaddr = IOMEM(0xe605810c), /* USBCR2 */
648  .info = {
649  .platform_callback = {
650  .hardware_init = usbhs0_hardware_init,
651  .hardware_exit = usbhs0_hardware_exit,
652  .phy_reset = usbhs_phy_reset,
653  .get_id = usbhs0_get_id,
654  .get_vbus = usbhs_get_vbus,
655  },
656  .driver_param = {
657  .buswait_bwait = 4,
658  .d0_tx_id = SHDMA_SLAVE_USB0_TX,
659  .d1_rx_id = SHDMA_SLAVE_USB0_RX,
660  },
661  },
662 };
663 
664 static struct resource usbhs0_resources[] = {
665  [0] = {
666  .name = "USBHS0",
667  .start = 0xe6890000,
668  .end = 0xe68900e6 - 1,
669  .flags = IORESOURCE_MEM,
670  },
671  [1] = {
672  .start = evt2irq(0x1ca0) /* USB0_USB0I0 */,
673  .flags = IORESOURCE_IRQ,
674  },
675 };
676 
677 static struct platform_device usbhs0_device = {
678  .name = "renesas_usbhs",
679  .id = 0,
680  .dev = {
681  .platform_data = &usbhs0_private.info,
682  },
683  .num_resources = ARRAY_SIZE(usbhs0_resources),
684  .resource = usbhs0_resources,
685 };
686 
687 /* USBHS1 is connected to CN31 which takes a USB Mini-AB plug
688  *
689  * Use J30 to select between Host and Function. This setting
690  * can however not be detected by software. Hotplug of USBHS1
691  * is provided via IRQ8.
692  *
693  * Current USB1 works as "USB Host".
694  * - set J30 "short"
695  *
696  * If you want to use it as "USB gadget",
697  * - J30 "open"
698  * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET
699  * - add .get_vbus = usbhs_get_vbus in usbhs1_private
700  * - check usbhs0_device(pio)/usbhs1_device(irq) order in mackerel_devices.
701  */
702 #define IRQ8 evt2irq(0x0300)
703 #define USB_PHY_MODE (1 << 4)
704 #define USB_PHY_INT_EN ((1 << 3) | (1 << 2))
705 #define USB_PHY_ON (1 << 1)
706 #define USB_PHY_OFF (1 << 0)
707 #define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF)
708 
709 static irqreturn_t usbhs1_interrupt(int irq, void *data)
710 {
711  struct platform_device *pdev = data;
712  struct usbhs_private *priv = usbhs_get_priv(pdev);
713 
714  dev_dbg(&pdev->dev, "%s\n", __func__);
715 
717 
718  /* clear status */
720  priv->usbphyaddr);
721 
722  return IRQ_HANDLED;
723 }
724 
725 static int usbhs1_hardware_init(struct platform_device *pdev)
726 {
727  struct usbhs_private *priv = usbhs_get_priv(pdev);
728  int ret;
729 
730  /* clear interrupt status */
732 
733  ret = request_irq(IRQ8, usbhs1_interrupt, IRQF_TRIGGER_HIGH,
734  dev_name(&pdev->dev), pdev);
735  if (ret) {
736  dev_err(&pdev->dev, "request_irq err\n");
737  return ret;
738  }
739 
740  /* enable USB phy interrupt */
742 
743  return 0;
744 }
745 
746 static void usbhs1_hardware_exit(struct platform_device *pdev)
747 {
748  struct usbhs_private *priv = usbhs_get_priv(pdev);
749 
750  /* clear interrupt status */
752 
753  free_irq(IRQ8, pdev);
754 }
755 
756 static int usbhs1_get_id(struct platform_device *pdev)
757 {
758  return USBHS_HOST;
759 }
760 
761 static u32 usbhs1_pipe_cfg[] = {
778 };
779 
780 static struct usbhs_private usbhs1_private = {
781  .usbphyaddr = IOMEM(0xe60581e2), /* USBPHY1INTAP */
782  .usbcrcaddr = IOMEM(0xe6058130), /* USBCR4 */
783  .info = {
784  .platform_callback = {
785  .hardware_init = usbhs1_hardware_init,
786  .hardware_exit = usbhs1_hardware_exit,
787  .get_id = usbhs1_get_id,
788  .phy_reset = usbhs_phy_reset,
789  },
790  .driver_param = {
791  .buswait_bwait = 4,
792  .has_otg = 1,
793  .pipe_type = usbhs1_pipe_cfg,
794  .pipe_size = ARRAY_SIZE(usbhs1_pipe_cfg),
795  .d0_tx_id = SHDMA_SLAVE_USB1_TX,
796  .d1_rx_id = SHDMA_SLAVE_USB1_RX,
797  },
798  },
799 };
800 
801 static struct resource usbhs1_resources[] = {
802  [0] = {
803  .name = "USBHS1",
804  .start = 0xe68b0000,
805  .end = 0xe68b00e6 - 1,
806  .flags = IORESOURCE_MEM,
807  },
808  [1] = {
809  .start = evt2irq(0x1ce0) /* USB1_USB1I0 */,
810  .flags = IORESOURCE_IRQ,
811  },
812 };
813 
814 static struct platform_device usbhs1_device = {
815  .name = "renesas_usbhs",
816  .id = 1,
817  .dev = {
818  .platform_data = &usbhs1_private.info,
819  },
820  .num_resources = ARRAY_SIZE(usbhs1_resources),
821  .resource = usbhs1_resources,
822 };
823 
824 /* LED */
825 static struct gpio_led mackerel_leds[] = {
826  {
827  .name = "led0",
828  .gpio = GPIO_PORT0,
829  .default_state = LEDS_GPIO_DEFSTATE_ON,
830  },
831  {
832  .name = "led1",
833  .gpio = GPIO_PORT1,
834  .default_state = LEDS_GPIO_DEFSTATE_ON,
835  },
836  {
837  .name = "led2",
838  .gpio = GPIO_PORT2,
839  .default_state = LEDS_GPIO_DEFSTATE_ON,
840  },
841  {
842  .name = "led3",
843  .gpio = GPIO_PORT159,
844  .default_state = LEDS_GPIO_DEFSTATE_ON,
845  }
846 };
847 
848 static struct gpio_led_platform_data mackerel_leds_pdata = {
849  .leds = mackerel_leds,
850  .num_leds = ARRAY_SIZE(mackerel_leds),
851 };
852 
853 static struct platform_device leds_device = {
854  .name = "leds-gpio",
855  .id = 0,
856  .dev = {
857  .platform_data = &mackerel_leds_pdata,
858  },
859 };
860 
861 /* FSI */
862 #define IRQ_FSI evt2irq(0x1840)
863 static int __fsi_set_round_rate(struct clk *clk, long rate, int enable)
864 {
865  int ret;
866 
867  if (rate <= 0)
868  return 0;
869 
870  if (!enable) {
871  clk_disable(clk);
872  return 0;
873  }
874 
875  ret = clk_set_rate(clk, clk_round_rate(clk, rate));
876  if (ret < 0)
877  return ret;
878 
879  return clk_enable(clk);
880 }
881 
882 static int fsi_b_set_rate(struct device *dev, int rate, int enable)
883 {
884  struct clk *fsib_clk;
885  struct clk *fdiv_clk = &sh7372_fsidivb_clk;
886  long fsib_rate = 0;
887  long fdiv_rate = 0;
888  int ackmd_bpfmd;
889  int ret;
890 
891  /* clock start */
892  switch (rate) {
893  case 44100:
894  fsib_rate = rate * 256;
895  ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64;
896  break;
897  case 48000:
898  fsib_rate = 85428000; /* around 48kHz x 256 x 7 */
899  fdiv_rate = rate * 256;
900  ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64;
901  break;
902  default:
903  pr_err("unsupported rate in FSI2 port B\n");
904  return -EINVAL;
905  }
906 
907  /* FSI B setting */
908  fsib_clk = clk_get(dev, "ickb");
909  if (IS_ERR(fsib_clk))
910  return -EIO;
911 
912  /* fsib */
913  ret = __fsi_set_round_rate(fsib_clk, fsib_rate, enable);
914  if (ret < 0)
915  goto fsi_set_rate_end;
916 
917  /* FSI DIV */
918  ret = __fsi_set_round_rate(fdiv_clk, fdiv_rate, enable);
919  if (ret < 0) {
920  /* disable FSI B */
921  if (enable)
922  __fsi_set_round_rate(fsib_clk, fsib_rate, 0);
923  goto fsi_set_rate_end;
924  }
925 
926  ret = ackmd_bpfmd;
927 
928 fsi_set_rate_end:
929  clk_put(fsib_clk);
930  return ret;
931 }
932 
933 static struct sh_fsi_platform_info fsi_info = {
934  .port_a = {
935  .flags = SH_FSI_BRS_INV,
936  .tx_id = SHDMA_SLAVE_FSIA_TX,
937  .rx_id = SHDMA_SLAVE_FSIA_RX,
938  },
939  .port_b = {
940  .flags = SH_FSI_BRS_INV |
944  .set_rate = fsi_b_set_rate,
945  }
946 };
947 
948 static struct resource fsi_resources[] = {
949  [0] = {
950  /* we need 0xFE1F0000 to access DMA
951  * instead of 0xFE3C0000 */
952  .name = "FSI",
953  .start = 0xFE1F0000,
954  .end = 0xFE1F0400 - 1,
955  .flags = IORESOURCE_MEM,
956  },
957  [1] = {
958  .start = IRQ_FSI,
959  .flags = IORESOURCE_IRQ,
960  },
961 };
962 
963 static struct platform_device fsi_device = {
964  .name = "sh_fsi2",
965  .id = -1,
966  .num_resources = ARRAY_SIZE(fsi_resources),
967  .resource = fsi_resources,
968  .dev = {
969  .platform_data = &fsi_info,
970  },
971 };
972 
973 static struct asoc_simple_dai_init_info fsi2_ak4643_init_info = {
974  .fmt = SND_SOC_DAIFMT_LEFT_J,
975  .codec_daifmt = SND_SOC_DAIFMT_CBM_CFM,
976  .cpu_daifmt = SND_SOC_DAIFMT_CBS_CFS,
977  .sysclk = 11289600,
978 };
979 
980 static struct asoc_simple_card_info fsi2_ak4643_info = {
981  .name = "AK4643",
982  .card = "FSI2A-AK4643",
983  .cpu_dai = "fsia-dai",
984  .codec = "ak4642-codec.0-0013",
985  .platform = "sh_fsi2",
986  .codec_dai = "ak4642-hifi",
987  .init = &fsi2_ak4643_init_info,
988 };
989 
990 static struct platform_device fsi_ak4643_device = {
991  .name = "asoc-simple-card",
992  .dev = {
993  .platform_data = &fsi2_ak4643_info,
994  },
995 };
996 
997 /* FLCTL */
998 static struct mtd_partition nand_partition_info[] = {
999  {
1000  .name = "system",
1001  .offset = 0,
1002  .size = 128 * 1024 * 1024,
1003  },
1004  {
1005  .name = "userdata",
1006  .offset = MTDPART_OFS_APPEND,
1007  .size = 256 * 1024 * 1024,
1008  },
1009  {
1010  .name = "cache",
1011  .offset = MTDPART_OFS_APPEND,
1012  .size = 128 * 1024 * 1024,
1013  },
1014 };
1015 
1016 static struct resource nand_flash_resources[] = {
1017  [0] = {
1018  .start = 0xe6a30000,
1019  .end = 0xe6a3009b,
1020  .flags = IORESOURCE_MEM,
1021  }
1022 };
1023 
1024 static struct sh_flctl_platform_data nand_flash_data = {
1025  .parts = nand_partition_info,
1026  .nr_parts = ARRAY_SIZE(nand_partition_info),
1027  .flcmncr_val = CLK_16B_12L_4H | TYPESEL_SET
1028  | SHBUSSEL | SEL_16BIT | SNAND_E,
1029  .use_holden = 1,
1030 };
1031 
1032 static struct platform_device nand_flash_device = {
1033  .name = "sh_flctl",
1034  .resource = nand_flash_resources,
1035  .num_resources = ARRAY_SIZE(nand_flash_resources),
1036  .dev = {
1037  .platform_data = &nand_flash_data,
1038  },
1039 };
1040 
1041 /*
1042  * The card detect pin of the top SD/MMC slot (CN7) is active low and is
1043  * connected to GPIO A22 of SH7372 (GPIO_PORT41).
1044  */
1045 static int slot_cn7_get_cd(struct platform_device *pdev)
1046 {
1047  return !gpio_get_value(GPIO_PORT41);
1048 }
1049 
1050 /* SDHI0 */
1051 static struct sh_mobile_sdhi_info sdhi0_info = {
1052  .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
1053  .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
1054  .tmio_flags = TMIO_MMC_USE_GPIO_CD,
1055  .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
1056  .cd_gpio = GPIO_PORT172,
1057 };
1058 
1059 static struct resource sdhi0_resources[] = {
1060  [0] = {
1061  .name = "SDHI0",
1062  .start = 0xe6850000,
1063  .end = 0xe68500ff,
1064  .flags = IORESOURCE_MEM,
1065  },
1066  [1] = {
1067  .start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */,
1068  .flags = IORESOURCE_IRQ,
1069  },
1070  [2] = {
1071  .start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,
1072  .flags = IORESOURCE_IRQ,
1073  },
1074  [3] = {
1075  .start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,
1076  .flags = IORESOURCE_IRQ,
1077  },
1078 };
1079 
1080 static struct platform_device sdhi0_device = {
1081  .name = "sh_mobile_sdhi",
1082  .num_resources = ARRAY_SIZE(sdhi0_resources),
1083  .resource = sdhi0_resources,
1084  .id = 0,
1085  .dev = {
1086  .platform_data = &sdhi0_info,
1087  },
1088 };
1089 
1090 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1091 /* SDHI1 */
1092 static struct sh_mobile_sdhi_info sdhi1_info = {
1093  .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
1094  .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
1095  .tmio_ocr_mask = MMC_VDD_165_195,
1096  .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
1097  .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
1099  .get_cd = slot_cn7_get_cd,
1100 };
1101 
1102 static struct resource sdhi1_resources[] = {
1103  [0] = {
1104  .name = "SDHI1",
1105  .start = 0xe6860000,
1106  .end = 0xe68600ff,
1107  .flags = IORESOURCE_MEM,
1108  },
1109  [1] = {
1111  .start = evt2irq(0x0e80), /* SDHI1_SDHI1I0 */
1112  .flags = IORESOURCE_IRQ,
1113  },
1114  [2] = {
1115  .name = SH_MOBILE_SDHI_IRQ_SDCARD,
1116  .start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */
1117  .flags = IORESOURCE_IRQ,
1118  },
1119  [3] = {
1120  .name = SH_MOBILE_SDHI_IRQ_SDIO,
1121  .start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */
1122  .flags = IORESOURCE_IRQ,
1123  },
1124 };
1125 
1126 static struct platform_device sdhi1_device = {
1127  .name = "sh_mobile_sdhi",
1128  .num_resources = ARRAY_SIZE(sdhi1_resources),
1129  .resource = sdhi1_resources,
1130  .id = 1,
1131  .dev = {
1132  .platform_data = &sdhi1_info,
1133  },
1134 };
1135 #endif
1136 
1137 /*
1138  * The card detect pin of the top SD/MMC slot (CN23) is active low and is
1139  * connected to GPIO SCIFB_SCK of SH7372 (GPIO_PORT162).
1140  */
1141 static int slot_cn23_get_cd(struct platform_device *pdev)
1142 {
1143  return !gpio_get_value(GPIO_PORT162);
1144 }
1145 
1146 /* SDHI2 */
1147 static struct sh_mobile_sdhi_info sdhi2_info = {
1148  .dma_slave_tx = SHDMA_SLAVE_SDHI2_TX,
1149  .dma_slave_rx = SHDMA_SLAVE_SDHI2_RX,
1150  .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
1151  .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
1153  .get_cd = slot_cn23_get_cd,
1154 };
1155 
1156 static struct resource sdhi2_resources[] = {
1157  [0] = {
1158  .name = "SDHI2",
1159  .start = 0xe6870000,
1160  .end = 0xe68700ff,
1161  .flags = IORESOURCE_MEM,
1162  },
1163  [1] = {
1165  .start = evt2irq(0x1200), /* SDHI2_SDHI2I0 */
1166  .flags = IORESOURCE_IRQ,
1167  },
1168  [2] = {
1169  .name = SH_MOBILE_SDHI_IRQ_SDCARD,
1170  .start = evt2irq(0x1220), /* SDHI2_SDHI2I1 */
1171  .flags = IORESOURCE_IRQ,
1172  },
1173  [3] = {
1174  .name = SH_MOBILE_SDHI_IRQ_SDIO,
1175  .start = evt2irq(0x1240), /* SDHI2_SDHI2I2 */
1176  .flags = IORESOURCE_IRQ,
1177  },
1178 };
1179 
1180 static struct platform_device sdhi2_device = {
1181  .name = "sh_mobile_sdhi",
1182  .num_resources = ARRAY_SIZE(sdhi2_resources),
1183  .resource = sdhi2_resources,
1184  .id = 2,
1185  .dev = {
1186  .platform_data = &sdhi2_info,
1187  },
1188 };
1189 
1190 /* SH_MMCIF */
1191 static struct resource sh_mmcif_resources[] = {
1192  [0] = {
1193  .name = "MMCIF",
1194  .start = 0xE6BD0000,
1195  .end = 0xE6BD00FF,
1196  .flags = IORESOURCE_MEM,
1197  },
1198  [1] = {
1199  /* MMC ERR */
1200  .start = evt2irq(0x1ac0),
1201  .flags = IORESOURCE_IRQ,
1202  },
1203  [2] = {
1204  /* MMC NOR */
1205  .start = evt2irq(0x1ae0),
1206  .flags = IORESOURCE_IRQ,
1207  },
1208 };
1209 
1210 static struct sh_mmcif_plat_data sh_mmcif_plat = {
1211  .sup_pclk = 0,
1213  .caps = MMC_CAP_4_BIT_DATA |
1216  .get_cd = slot_cn7_get_cd,
1217  .slave_id_tx = SHDMA_SLAVE_MMCIF_TX,
1218  .slave_id_rx = SHDMA_SLAVE_MMCIF_RX,
1219 };
1220 
1221 static struct platform_device sh_mmcif_device = {
1222  .name = "sh_mmcif",
1223  .id = 0,
1224  .dev = {
1225  .dma_mask = NULL,
1226  .coherent_dma_mask = 0xffffffff,
1227  .platform_data = &sh_mmcif_plat,
1228  },
1229  .num_resources = ARRAY_SIZE(sh_mmcif_resources),
1230  .resource = sh_mmcif_resources,
1231 };
1232 
1233 
1234 static int mackerel_camera_add(struct soc_camera_device *icd);
1235 static void mackerel_camera_del(struct soc_camera_device *icd);
1236 
1237 static int camera_set_capture(struct soc_camera_platform_info *info,
1238  int enable)
1239 {
1240  return 0; /* camera sensor always enabled */
1241 }
1242 
1243 static struct soc_camera_platform_info camera_info = {
1244  .format_name = "UYVY",
1245  .format_depth = 16,
1246  .format = {
1247  .code = V4L2_MBUS_FMT_UYVY8_2X8,
1248  .colorspace = V4L2_COLORSPACE_SMPTE170M,
1249  .field = V4L2_FIELD_NONE,
1250  .width = 640,
1251  .height = 480,
1252  },
1256  .mbus_type = V4L2_MBUS_PARALLEL,
1257  .set_capture = camera_set_capture,
1258 };
1259 
1260 static struct soc_camera_link camera_link = {
1261  .bus_id = 0,
1262  .add_device = mackerel_camera_add,
1263  .del_device = mackerel_camera_del,
1264  .module_name = "soc_camera_platform",
1265  .priv = &camera_info,
1266 };
1267 
1268 static struct platform_device *camera_device;
1269 
1270 static void mackerel_camera_release(struct device *dev)
1271 {
1272  soc_camera_platform_release(&camera_device);
1273 }
1274 
1275 static int mackerel_camera_add(struct soc_camera_device *icd)
1276 {
1277  return soc_camera_platform_add(icd, &camera_device, &camera_link,
1278  mackerel_camera_release, 0);
1279 }
1280 
1281 static void mackerel_camera_del(struct soc_camera_device *icd)
1282 {
1283  soc_camera_platform_del(icd, camera_device, &camera_link);
1284 }
1285 
1286 static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
1288  .max_width = 8188,
1289  .max_height = 8188,
1290 };
1291 
1292 static struct resource ceu_resources[] = {
1293  [0] = {
1294  .name = "CEU",
1295  .start = 0xfe910000,
1296  .end = 0xfe91009f,
1297  .flags = IORESOURCE_MEM,
1298  },
1299  [1] = {
1300  .start = intcs_evt2irq(0x880),
1301  .flags = IORESOURCE_IRQ,
1302  },
1303  [2] = {
1304  /* place holder for contiguous memory */
1305  },
1306 };
1307 
1308 static struct platform_device ceu_device = {
1309  .name = "sh_mobile_ceu",
1310  .id = 0, /* "ceu0" clock */
1311  .num_resources = ARRAY_SIZE(ceu_resources),
1312  .resource = ceu_resources,
1313  .dev = {
1314  .platform_data = &sh_mobile_ceu_info,
1315  .coherent_dma_mask = 0xffffffff,
1316  },
1317 };
1318 
1319 static struct platform_device mackerel_camera = {
1320  .name = "soc-camera-pdrv",
1321  .id = 0,
1322  .dev = {
1323  .platform_data = &camera_link,
1324  },
1325 };
1326 
1327 static struct platform_device *mackerel_devices[] __initdata = {
1328  &nor_flash_device,
1329  &smc911x_device,
1330  &lcdc_device,
1331  &usbhs0_device,
1332  &usbhs1_device,
1333  &leds_device,
1334  &fsi_device,
1335  &fsi_ak4643_device,
1336  &fsi_hdmi_device,
1337  &nand_flash_device,
1338  &sdhi0_device,
1339 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1340  &sdhi1_device,
1341 #endif
1342  &sdhi2_device,
1343  &sh_mmcif_device,
1344  &ceu_device,
1345  &mackerel_camera,
1346  &hdmi_device,
1347  &hdmi_lcdc_device,
1348  &meram_device,
1349 };
1350 
1351 /* Keypad Initialization */
1352 #define KEYPAD_BUTTON(ev_type, ev_code, act_low) \
1353 { \
1354  .type = ev_type, \
1355  .code = ev_code, \
1356  .active_low = act_low, \
1357 }
1358 
1359 #define KEYPAD_BUTTON_LOW(event_code) KEYPAD_BUTTON(EV_KEY, event_code, 1)
1360 
1361 static struct tca6416_button mackerel_gpio_keys[] = {
1366 };
1367 
1368 static struct tca6416_keys_platform_data mackerel_tca6416_keys_info = {
1369  .buttons = mackerel_gpio_keys,
1370  .nbuttons = ARRAY_SIZE(mackerel_gpio_keys),
1371  .rep = 1,
1372  .use_polling = 0,
1373  .pinmask = 0x000F,
1374 };
1375 
1376 /* I2C */
1377 #define IRQ7 evt2irq(0x02e0)
1378 #define IRQ9 evt2irq(0x0320)
1379 
1380 static struct i2c_board_info i2c0_devices[] = {
1381  {
1382  I2C_BOARD_INFO("ak4643", 0x13),
1383  },
1384  /* Keypad */
1385  {
1386  I2C_BOARD_INFO("tca6408-keys", 0x20),
1387  .platform_data = &mackerel_tca6416_keys_info,
1388  .irq = IRQ9,
1389  },
1390  /* Touchscreen */
1391  {
1392  I2C_BOARD_INFO("st1232-ts", 0x55),
1393  .irq = IRQ7,
1394  },
1395 };
1396 
1397 #define IRQ21 evt2irq(0x32a0)
1398 
1399 static struct i2c_board_info i2c1_devices[] = {
1400  /* Accelerometer */
1401  {
1402  I2C_BOARD_INFO("adxl34x", 0x53),
1403  .irq = IRQ21,
1404  },
1405 };
1406 
1407 #define GPIO_PORT9CR IOMEM(0xE6051009)
1408 #define GPIO_PORT10CR IOMEM(0xE605100A)
1409 #define GPIO_PORT167CR IOMEM(0xE60520A7)
1410 #define GPIO_PORT168CR IOMEM(0xE60520A8)
1411 #define SRCR4 IOMEM(0xe61580bc)
1412 #define USCCR1 IOMEM(0xE6058144)
1413 static void __init mackerel_init(void)
1414 {
1415  struct pm_domain_device domain_devices[] = {
1416  { "A4LC", &lcdc_device, },
1417  { "A4LC", &hdmi_lcdc_device, },
1418  { "A4LC", &meram_device, },
1419  { "A4MP", &fsi_device, },
1420  { "A3SP", &usbhs0_device, },
1421  { "A3SP", &usbhs1_device, },
1422  { "A3SP", &nand_flash_device, },
1423  { "A3SP", &sh_mmcif_device, },
1424  { "A3SP", &sdhi0_device, },
1425 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1426  { "A3SP", &sdhi1_device, },
1427 #endif
1428  { "A3SP", &sdhi2_device, },
1429  { "A4R", &ceu_device, },
1430  };
1431  u32 srcr4;
1432  struct clk *clk;
1433 
1434  regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
1435  ARRAY_SIZE(fixed1v8_power_consumers), 1800000);
1436  regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers,
1437  ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
1438  regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies));
1439 
1440  /* External clock source */
1441  clk_set_rate(&sh7372_dv_clki_clk, 27000000);
1442 
1444 
1445  /* enable SCIFA0 */
1448 
1449  /* enable SMSC911X */
1452 
1453  /* LCDC */
1480 
1481  gpio_request(GPIO_PORT31, NULL); /* backlight */
1482  gpio_direction_output(GPIO_PORT31, 0); /* off by default */
1483 
1484  gpio_request(GPIO_PORT151, NULL); /* LCDDON */
1486 
1487  /* USBHS0 */
1489  gpio_request_pulldown(GPIO_PORT168CR); /* VBUS0_0 pull down */
1490 
1491  /* USBHS1 */
1493  gpio_request_pulldown(GPIO_PORT167CR); /* VBUS0_1 pull down */
1495 
1496  /* enable FSI2 port A (ak4643) */
1502  gpio_direction_output(GPIO_PORT161, 0); /* slave */
1503 
1506  gpio_direction_none(GPIO_PORT9CR); /* FSIAOBT needs no direction */
1507  gpio_direction_none(GPIO_PORT10CR); /* FSIAOLR needs no direction */
1508 
1509  intc_set_priority(IRQ_FSI, 3); /* irq priority FSI(3) > SMSC911X(2) */
1510 
1511  /* setup FSI2 port B (HDMI) */
1513  __raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
1514 
1515  /* set SPU2 clock to 119.6 MHz */
1516  clk = clk_get(NULL, "spu_clk");
1517  if (!IS_ERR(clk)) {
1518  clk_set_rate(clk, clk_round_rate(clk, 119600000));
1519  clk_put(clk);
1520  }
1521 
1522  /* enable Keypad */
1525 
1526  /* enable Touchscreen */
1529 
1530  /* enable Accelerometer */
1533 
1534  /* enable SDHI0 */
1542 
1543  /* SDHI0 PORT172 card-detect IRQ26 */
1545 
1546 #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1547  /* enable SDHI1 */
1554 #endif
1555  /* card detect pin for MMC slot (CN7) */
1558 
1559  /* enable SDHI2 */
1566 
1567  /* card detect pin for microSD slot (CN23) */
1570 
1571  /* MMCIF */
1582 
1583  /* FLCTL */
1606 
1607  /* enable GPS module (GT-720F) */
1610 
1611  /* CEU */
1625 
1626  /* HDMI */
1629 
1630  /* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
1631  srcr4 = __raw_readl(SRCR4);
1632  __raw_writel(srcr4 | (1 << 13), SRCR4);
1633  udelay(50);
1634  __raw_writel(srcr4 & ~(1 << 13), SRCR4);
1635 
1636  i2c_register_board_info(0, i2c0_devices,
1637  ARRAY_SIZE(i2c0_devices));
1638  i2c_register_board_info(1, i2c1_devices,
1639  ARRAY_SIZE(i2c1_devices));
1640 
1642 
1643  platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices));
1644 
1645  rmobile_add_devices_to_domains(domain_devices,
1646  ARRAY_SIZE(domain_devices));
1647 
1648  hdmi_init_pm_clock();
1649  sh7372_pm_init();
1650  pm_clk_add(&fsi_device.dev, "spu2");
1651  pm_clk_add(&hdmi_lcdc_device.dev, "hdmi");
1652 }
1653 
1654 MACHINE_START(MACKEREL, "mackerel")
1655  .map_io = sh7372_map_io,
1657  .init_irq = sh7372_init_irq,
1659  .init_machine = mackerel_init,
1660  .init_late = sh7372_pm_init_late,
1661  .timer = &shmobile_timer,