aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2010-05-24 02:50:44 -0400
committerPaul Mundt <lethal@linux-sh.org>2010-05-31 00:24:23 -0400
commitcb9215e1fa13860fa8fbe9941a59fcbc45781373 (patch)
tree3cc7aadf0ba24e6083187e9e29c5462935f2bd79
parent69bf6f451febe8dd07ccedf0ba3279c0f3f7fc3a (diff)
ARM: mach-shmobile: ap4evb: Add FSI2 support
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r--arch/arm/mach-shmobile/board-ap4evb.c135
-rw-r--r--arch/arm/mach-shmobile/clock-sh7372.c4
2 files changed, 135 insertions, 4 deletions
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c
index 5c41b958e022..8fb51f5157f9 100644
--- a/arch/arm/mach-shmobile/board-ap4evb.c
+++ b/arch/arm/mach-shmobile/board-ap4evb.c
@@ -32,11 +32,15 @@
32#include <linux/i2c/tsc2007.h> 32#include <linux/i2c/tsc2007.h>
33#include <linux/io.h> 33#include <linux/io.h>
34#include <linux/smsc911x.h> 34#include <linux/smsc911x.h>
35#include <linux/sh_intc.h>
36#include <linux/sh_clk.h>
35#include <linux/gpio.h> 37#include <linux/gpio.h>
36#include <linux/input.h> 38#include <linux/input.h>
37#include <linux/input/sh_keysc.h> 39#include <linux/input/sh_keysc.h>
38#include <linux/usb/r8a66597.h> 40#include <linux/usb/r8a66597.h>
39 41
42#include <sound/sh_fsi.h>
43
40#include <video/sh_mobile_lcdc.h> 44#include <video/sh_mobile_lcdc.h>
41#include <video/sh_mipi_dsi.h> 45#include <video/sh_mipi_dsi.h>
42 46
@@ -113,6 +117,13 @@
113 * S39: bit2: off 117 * S39: bit2: off
114 */ 118 */
115 119
120/*
121 * FSI/FSMI
122 *
123 * SW41 : ON : SH-Mobile AP4 Audio Mode
124 * : OFF : Bluetooth Audio Mode
125 */
126
116/* MTD */ 127/* MTD */
117static struct mtd_partition nor_flash_partitions[] = { 128static struct mtd_partition nor_flash_partitions[] = {
118 { 129 {
@@ -373,6 +384,60 @@ static struct platform_device mipidsi0_device = {
373 }, 384 },
374}; 385};
375 386
387/* FSI */
388#define IRQ_FSI evt2irq(0x1840)
389#define FSIACKCR 0xE6150018
390static void fsiackcr_init(struct clk *clk)
391{
392 u32 status = __raw_readl(clk->enable_reg);
393
394 /* use external clock */
395 status &= ~0x000000ff;
396 status |= 0x00000080;
397 __raw_writel(status, clk->enable_reg);
398}
399
400static struct clk_ops fsiackcr_clk_ops = {
401 .init = fsiackcr_init,
402};
403
404static struct clk fsiackcr_clk = {
405 .ops = &fsiackcr_clk_ops,
406 .enable_reg = (void __iomem *)FSIACKCR,
407 .rate = 0, /* unknown */
408};
409
410struct sh_fsi_platform_info fsi_info = {
411 .porta_flags = SH_FSI_BRS_INV |
412 SH_FSI_OUT_SLAVE_MODE |
413 SH_FSI_IN_SLAVE_MODE |
414 SH_FSI_OFMT(PCM) |
415 SH_FSI_IFMT(PCM),
416};
417
418static struct resource fsi_resources[] = {
419 [0] = {
420 .name = "FSI",
421 .start = 0xFE3C0000,
422 .end = 0xFE3C0400 - 1,
423 .flags = IORESOURCE_MEM,
424 },
425 [1] = {
426 .start = IRQ_FSI,
427 .flags = IORESOURCE_IRQ,
428 },
429};
430
431static struct platform_device fsi_device = {
432 .name = "sh_fsi2",
433 .id = 0,
434 .num_resources = ARRAY_SIZE(fsi_resources),
435 .resource = fsi_resources,
436 .dev = {
437 .platform_data = &fsi_info,
438 },
439};
440
376static struct platform_device *ap4evb_devices[] __initdata = { 441static struct platform_device *ap4evb_devices[] __initdata = {
377 &nor_flash_device, 442 &nor_flash_device,
378 &smc911x_device, 443 &smc911x_device,
@@ -381,6 +446,7 @@ static struct platform_device *ap4evb_devices[] __initdata = {
381 &usb1_host_device, 446 &usb1_host_device,
382 &lcdc_device, 447 &lcdc_device,
383 &mipidsi0_device, 448 &mipidsi0_device,
449 &fsi_device,
384}; 450};
385 451
386/* TouchScreen (Needs SW3 set to OFF) */ 452/* TouchScreen (Needs SW3 set to OFF) */
@@ -391,6 +457,12 @@ struct tsc2007_platform_data tsc2007_info = {
391}; 457};
392 458
393/* I2C */ 459/* I2C */
460static struct i2c_board_info i2c0_devices[] = {
461 {
462 I2C_BOARD_INFO("ak4643", 0x13),
463 },
464};
465
394static struct i2c_board_info i2c1_devices[] = { 466static struct i2c_board_info i2c1_devices[] = {
395 { 467 {
396 I2C_BOARD_INFO("r2025sd", 0x32), 468 I2C_BOARD_INFO("r2025sd", 0x32),
@@ -463,8 +535,27 @@ eclkdsitxget:
463 535
464device_initcall(ap4evb_init_display_clk); 536device_initcall(ap4evb_init_display_clk);
465 537
538/*
539 * FIXME !!
540 *
541 * gpio_no_direction is quick_hack.
542 *
543 * current gpio frame work doesn't have
544 * the method to control only pull up/down/free.
545 * this function should be replaced by correct gpio function
546 */
547static void __init gpio_no_direction(u32 addr)
548{
549 __raw_writeb(0x00, addr);
550}
551
552#define GPIO_PORT9CR 0xE6051009
553#define GPIO_PORT10CR 0xE605100A
554
466static void __init ap4evb_init(void) 555static void __init ap4evb_init(void)
467{ 556{
557 struct clk *clk;
558
468 sh7372_pinmux_init(); 559 sh7372_pinmux_init();
469 560
470 /* enable SCIFA0 */ 561 /* enable SCIFA0 */
@@ -529,9 +620,6 @@ static void __init ap4evb_init(void)
529 gpio_request(GPIO_FN_IRQ28_123, NULL); 620 gpio_request(GPIO_FN_IRQ28_123, NULL);
530 set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW); 621 set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW);
531 622
532 i2c_register_board_info(1, i2c1_devices,
533 ARRAY_SIZE(i2c1_devices));
534
535 /* USB enable */ 623 /* USB enable */
536 gpio_request(GPIO_FN_VBUS0_1, NULL); 624 gpio_request(GPIO_FN_VBUS0_1, NULL);
537 gpio_request(GPIO_FN_IDIN_1_18, NULL); 625 gpio_request(GPIO_FN_IDIN_1_18, NULL);
@@ -543,6 +631,47 @@ static void __init ap4evb_init(void)
543 /* setup USB phy */ 631 /* setup USB phy */
544 __raw_writew(0x8a0a, 0xE6058130); /* USBCR2 */ 632 __raw_writew(0x8a0a, 0xE6058130); /* USBCR2 */
545 633
634 /* enable FSI2 */
635 gpio_request(GPIO_FN_FSIAIBT, NULL);
636 gpio_request(GPIO_FN_FSIAILR, NULL);
637 gpio_request(GPIO_FN_FSIAISLD, NULL);
638 gpio_request(GPIO_FN_FSIAOSLD, NULL);
639 gpio_request(GPIO_PORT161, NULL);
640 gpio_direction_output(GPIO_PORT161, 0); /* slave */
641
642 gpio_request(GPIO_PORT9, NULL);
643 gpio_request(GPIO_PORT10, NULL);
644 gpio_no_direction(GPIO_PORT9CR); /* FSIAOBT needs no direction */
645 gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */
646
647 /* set SPU2 clock to 119.6 MHz */
648 clk = clk_get(NULL, "spu_clk");
649 if (!IS_ERR_VALUE(clk)) {
650 clk_set_rate(clk, clk_round_rate(clk, 119600000));
651 clk_put(clk);
652 }
653
654 /* change parent of FSI A */
655 clk = clk_get(NULL, "fsia_clk");
656 if (!IS_ERR_VALUE(clk)) {
657 clk_register(&fsiackcr_clk);
658 clk_set_parent(clk, &fsiackcr_clk);
659 clk_put(clk);
660 }
661
662 /*
663 * set irq priority, to avoid sound chopping
664 * when NFS rootfs is used
665 * FSI(3) > SMSC911X(2)
666 */
667 intc_set_priority(IRQ_FSI, 3);
668
669 i2c_register_board_info(0, i2c0_devices,
670 ARRAY_SIZE(i2c0_devices));
671
672 i2c_register_board_info(1, i2c1_devices,
673 ARRAY_SIZE(i2c1_devices));
674
546 sh7372_add_standard_devices(); 675 sh7372_add_standard_devices();
547 676
548 platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices)); 677 platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices));
diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c
index f2f9a4ad53a4..1364072934b4 100644
--- a/arch/arm/mach-shmobile/clock-sh7372.c
+++ b/arch/arm/mach-shmobile/clock-sh7372.c
@@ -246,7 +246,7 @@ enum { MSTP001,
246 MSTP106, MSTP101, MSTP100, 246 MSTP106, MSTP101, MSTP100,
247 MSTP223, 247 MSTP223,
248 MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, 248 MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
249 MSTP329, MSTP323, MSTP322, MSTP314, MSTP313, 249 MSTP329, MSTP328, MSTP323, MSTP322, MSTP314, MSTP313,
250 MSTP415, MSTP410, MSTP411, MSTP406, MSTP403, 250 MSTP415, MSTP410, MSTP411, MSTP406, MSTP403,
251 MSTP_NR }; 251 MSTP_NR };
252 252
@@ -274,6 +274,7 @@ static struct clk mstp_clks[MSTP_NR] = {
274 [MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */ 274 [MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */
275 [MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */ 275 [MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */
276 [MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */ 276 [MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */
277 [MSTP328] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR3, 28, CLK_ENABLE_ON_INIT), /* FSIA */
277 [MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */ 278 [MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */
278 [MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */ 279 [MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */
279 [MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */ 280 [MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */
@@ -356,6 +357,7 @@ static struct clk_lookup lookups[] = {
356 CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */ 357 CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */
357 CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */ 358 CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */
358 CLKDEV_CON_ID("cmt1", &mstp_clks[MSTP329]), /* CMT10 */ 359 CLKDEV_CON_ID("cmt1", &mstp_clks[MSTP329]), /* CMT10 */
360 CLKDEV_DEV_ID("sh_fsi", &mstp_clks[MSTP328]), /* FSI */
359 CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */ 361 CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */
360 CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP323]), /* USB0 */ 362 CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP323]), /* USB0 */
361 CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP323]), /* USB0 */ 363 CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP323]), /* USB0 */