aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKuninori Morimoto <morimoto.kuninori@renesas.com>2009-12-15 00:37:39 -0500
committerPaul Mundt <lethal@linux-sh.org>2009-12-15 08:03:08 -0500
commit1980fdc4df4778741f15f50f715cd790ccbe0a79 (patch)
treee5d0b4d9963fec759502e112937ced5f1b04e32e /arch
parent9aa25d64499161048ff024cde704f912a41fad6f (diff)
sh: mach-ecovec24: Add FSI sound support
Signed-off-by: Kuninori Morimoto <morimoto.kuninori@renesas.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/sh/boards/mach-ecovec24/setup.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c
index 89c5a715d0b6..194aaca22d47 100644
--- a/arch/sh/boards/mach-ecovec24/setup.c
+++ b/arch/sh/boards/mach-ecovec24/setup.c
@@ -27,6 +27,7 @@
27#include <linux/input/sh_keysc.h> 27#include <linux/input/sh_keysc.h>
28#include <linux/mfd/sh_mobile_sdhi.h> 28#include <linux/mfd/sh_mobile_sdhi.h>
29#include <video/sh_mobile_lcdc.h> 29#include <video/sh_mobile_lcdc.h>
30#include <sound/sh_fsi.h>
30#include <media/sh_mobile_ceu.h> 31#include <media/sh_mobile_ceu.h>
31#include <media/tw9910.h> 32#include <media/tw9910.h>
32#include <media/mt9t112.h> 33#include <media/mt9t112.h>
@@ -344,6 +345,12 @@ static struct platform_device ceu1_device = {
344}; 345};
345 346
346/* I2C device */ 347/* I2C device */
348static struct i2c_board_info i2c0_devices[] = {
349 {
350 I2C_BOARD_INFO("da7210", 0x1a),
351 },
352};
353
347static struct i2c_board_info i2c1_devices[] = { 354static struct i2c_board_info i2c1_devices[] = {
348 { 355 {
349 I2C_BOARD_INFO("r2025sd", 0x32), 356 I2C_BOARD_INFO("r2025sd", 0x32),
@@ -679,6 +686,69 @@ static struct platform_device camera_devices[] = {
679 }, 686 },
680}; 687};
681 688
689/* FSI */
690/*
691 * FSI-B use external clock which came from da7210.
692 * So, we should change parent of fsi
693 */
694#define FCLKBCR 0xa415000c
695static void fsimck_init(struct clk *clk)
696{
697 u32 status = ctrl_inl(clk->enable_reg);
698
699 /* use external clock */
700 status &= ~0x000000ff;
701 status |= 0x00000080;
702
703 ctrl_outl(status, clk->enable_reg);
704}
705
706static struct clk_ops fsimck_clk_ops = {
707 .init = fsimck_init,
708};
709
710static struct clk fsimckb_clk = {
711 .name = "fsimckb_clk",
712 .id = -1,
713 .ops = &fsimck_clk_ops,
714 .enable_reg = (void __iomem *)FCLKBCR,
715 .rate = 0, /* unknown */
716};
717
718struct sh_fsi_platform_info fsi_info = {
719 .portb_flags = SH_FSI_BRS_INV |
720 SH_FSI_OUT_SLAVE_MODE |
721 SH_FSI_IN_SLAVE_MODE |
722 SH_FSI_OFMT(I2S) |
723 SH_FSI_IFMT(I2S),
724};
725
726static struct resource fsi_resources[] = {
727 [0] = {
728 .name = "FSI",
729 .start = 0xFE3C0000,
730 .end = 0xFE3C021d,
731 .flags = IORESOURCE_MEM,
732 },
733 [1] = {
734 .start = 108,
735 .flags = IORESOURCE_IRQ,
736 },
737};
738
739static struct platform_device fsi_device = {
740 .name = "sh_fsi",
741 .id = 0,
742 .num_resources = ARRAY_SIZE(fsi_resources),
743 .resource = fsi_resources,
744 .dev = {
745 .platform_data = &fsi_info,
746 },
747 .archdata = {
748 .hwblk_id = HWBLK_SPU, /* FSI needs SPU hwblk */
749 },
750};
751
682static struct platform_device *ecovec_devices[] __initdata = { 752static struct platform_device *ecovec_devices[] __initdata = {
683 &heartbeat_device, 753 &heartbeat_device,
684 &nor_flash_device, 754 &nor_flash_device,
@@ -698,6 +768,7 @@ static struct platform_device *ecovec_devices[] __initdata = {
698 &camera_devices[0], 768 &camera_devices[0],
699 &camera_devices[1], 769 &camera_devices[1],
700 &camera_devices[2], 770 &camera_devices[2],
771 &fsi_device,
701}; 772};
702 773
703#define EEPROM_ADDR 0x50 774#define EEPROM_ADDR 0x50
@@ -753,6 +824,8 @@ extern char ecovec24_sdram_leave_end;
753 824
754static int __init arch_setup(void) 825static int __init arch_setup(void)
755{ 826{
827 struct clk *clk;
828
756 /* register board specific self-refresh code */ 829 /* register board specific self-refresh code */
757 sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF, 830 sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF,
758 &ecovec24_sdram_enter_start, 831 &ecovec24_sdram_enter_start,
@@ -1020,7 +1093,32 @@ static int __init arch_setup(void)
1020 gpio_direction_output(GPIO_PTA3, 0); 1093 gpio_direction_output(GPIO_PTA3, 0);
1021 gpio_direction_output(GPIO_PTA4, 0); 1094 gpio_direction_output(GPIO_PTA4, 0);
1022 1095
1096 /* enable FSI */
1097 gpio_request(GPIO_FN_FSIMCKB, NULL);
1098 gpio_request(GPIO_FN_FSIIBSD, NULL);
1099 gpio_request(GPIO_FN_FSIOBSD, NULL);
1100 gpio_request(GPIO_FN_FSIIBBCK, NULL);
1101 gpio_request(GPIO_FN_FSIIBLRCK, NULL);
1102 gpio_request(GPIO_FN_FSIOBBCK, NULL);
1103 gpio_request(GPIO_FN_FSIOBLRCK, NULL);
1104 gpio_request(GPIO_FN_CLKAUDIOBO, NULL);
1105
1106 /* change parent of FSI B */
1107 clk = clk_get(NULL, "fsib_clk");
1108 clk_register(&fsimckb_clk);
1109 clk_set_parent(clk, &fsimckb_clk);
1110 clk_set_rate(clk, 11000);
1111 clk_set_rate(&fsimckb_clk, 11000);
1112 clk_put(clk);
1113
1114 gpio_request(GPIO_PTU0, NULL);
1115 gpio_direction_output(GPIO_PTU0, 0);
1116 mdelay(20);
1117
1023 /* enable I2C device */ 1118 /* enable I2C device */
1119 i2c_register_board_info(0, i2c0_devices,
1120 ARRAY_SIZE(i2c0_devices));
1121
1024 i2c_register_board_info(1, i2c1_devices, 1122 i2c_register_board_info(1, i2c1_devices,
1025 ARRAY_SIZE(i2c1_devices)); 1123 ARRAY_SIZE(i2c1_devices));
1026 1124