|
@@ -22,6 +22,7 @@
|
|
#include <linux/usb/r8a66597.h>
|
|
#include <linux/usb/r8a66597.h>
|
|
#include <video/sh_mobile_lcdc.h>
|
|
#include <video/sh_mobile_lcdc.h>
|
|
#include <media/sh_mobile_ceu.h>
|
|
#include <media/sh_mobile_ceu.h>
|
|
|
|
+#include <sound/sh_fsi.h>
|
|
#include <asm/io.h>
|
|
#include <asm/io.h>
|
|
#include <asm/heartbeat.h>
|
|
#include <asm/heartbeat.h>
|
|
#include <asm/sh_eth.h>
|
|
#include <asm/sh_eth.h>
|
|
@@ -255,6 +256,65 @@ static struct platform_device ceu1_device = {
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/* FSI */
|
|
|
|
+/*
|
|
|
|
+ * FSI-A use external clock which came from ak464x.
|
|
|
|
+ * So, we should change parent of fsi
|
|
|
|
+ */
|
|
|
|
+#define FCLKACR 0xa4150008
|
|
|
|
+static void fsimck_init(struct clk *clk)
|
|
|
|
+{
|
|
|
|
+ u32 status = ctrl_inl(clk->enable_reg);
|
|
|
|
+
|
|
|
|
+ /* use external clock */
|
|
|
|
+ status &= ~0x000000ff;
|
|
|
|
+ status |= 0x00000080;
|
|
|
|
+ ctrl_outl(status, clk->enable_reg);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct clk_ops fsimck_clk_ops = {
|
|
|
|
+ .init = fsimck_init,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk fsimcka_clk = {
|
|
|
|
+ .name = "fsimcka_clk",
|
|
|
|
+ .id = -1,
|
|
|
|
+ .ops = &fsimck_clk_ops,
|
|
|
|
+ .enable_reg = (void __iomem *)FCLKACR,
|
|
|
|
+ .rate = 0, /* unknown */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct sh_fsi_platform_info fsi_info = {
|
|
|
|
+ .porta_flags = SH_FSI_BRS_INV |
|
|
|
|
+ SH_FSI_OUT_SLAVE_MODE |
|
|
|
|
+ SH_FSI_IN_SLAVE_MODE |
|
|
|
|
+ SH_FSI_OFMT(PCM) |
|
|
|
|
+ SH_FSI_IFMT(PCM),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct resource fsi_resources[] = {
|
|
|
|
+ [0] = {
|
|
|
|
+ .name = "FSI",
|
|
|
|
+ .start = 0xFE3C0000,
|
|
|
|
+ .end = 0xFE3C021d,
|
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
|
+ },
|
|
|
|
+ [1] = {
|
|
|
|
+ .start = 108,
|
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_device fsi_device = {
|
|
|
|
+ .name = "sh_fsi",
|
|
|
|
+ .id = 0,
|
|
|
|
+ .num_resources = ARRAY_SIZE(fsi_resources),
|
|
|
|
+ .resource = fsi_resources,
|
|
|
|
+ .dev = {
|
|
|
|
+ .platform_data = &fsi_info,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
/* KEYSC in SoC (Needs SW33-2 set to ON) */
|
|
/* KEYSC in SoC (Needs SW33-2 set to ON) */
|
|
static struct sh_keysc_info keysc_info = {
|
|
static struct sh_keysc_info keysc_info = {
|
|
.mode = SH_KEYSC_MODE_1,
|
|
.mode = SH_KEYSC_MODE_1,
|
|
@@ -399,6 +459,7 @@ static struct platform_device *ms7724se_devices[] __initdata = {
|
|
&sh_eth_device,
|
|
&sh_eth_device,
|
|
&sh7724_usb0_host_device,
|
|
&sh7724_usb0_host_device,
|
|
&sh7724_usb1_gadget_device,
|
|
&sh7724_usb1_gadget_device,
|
|
|
|
+ &fsi_device,
|
|
};
|
|
};
|
|
|
|
|
|
#define EEPROM_OP 0xBA206000
|
|
#define EEPROM_OP 0xBA206000
|
|
@@ -466,11 +527,13 @@ static void __init sh_eth_init(void)
|
|
static int __init devices_setup(void)
|
|
static int __init devices_setup(void)
|
|
{
|
|
{
|
|
u16 sw = ctrl_inw(SW4140); /* select camera, monitor */
|
|
u16 sw = ctrl_inw(SW4140); /* select camera, monitor */
|
|
|
|
+ struct clk *fsia_clk;
|
|
|
|
|
|
/* Reset Release */
|
|
/* Reset Release */
|
|
ctrl_outw(ctrl_inw(FPGA_OUT) &
|
|
ctrl_outw(ctrl_inw(FPGA_OUT) &
|
|
~((1 << 1) | /* LAN */
|
|
~((1 << 1) | /* LAN */
|
|
(1 << 6) | /* VIDEO DAC */
|
|
(1 << 6) | /* VIDEO DAC */
|
|
|
|
+ (1 << 7) | /* AK4643 */
|
|
(1 << 12) | /* USB0 */
|
|
(1 << 12) | /* USB0 */
|
|
(1 << 14)), /* RMII */
|
|
(1 << 14)), /* RMII */
|
|
FPGA_OUT);
|
|
FPGA_OUT);
|
|
@@ -609,6 +672,32 @@ static int __init devices_setup(void)
|
|
gpio_request(GPIO_FN_KEYOUT1, NULL);
|
|
gpio_request(GPIO_FN_KEYOUT1, NULL);
|
|
gpio_request(GPIO_FN_KEYOUT0, NULL);
|
|
gpio_request(GPIO_FN_KEYOUT0, NULL);
|
|
|
|
|
|
|
|
+ /* enable FSI */
|
|
|
|
+ gpio_request(GPIO_FN_FSIMCKB, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIMCKA, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIOASD, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIIABCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIIALRCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIOABCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIOALRCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_CLKAUDIOAO, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIIBSD, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIOBSD, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIIBBCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIIBLRCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIOBBCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIOBLRCK, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_CLKAUDIOBO, NULL);
|
|
|
|
+ gpio_request(GPIO_FN_FSIIASD, NULL);
|
|
|
|
+
|
|
|
|
+ /* change parent of FSI A */
|
|
|
|
+ fsia_clk = clk_get(NULL, "fsia_clk");
|
|
|
|
+ clk_register(&fsimcka_clk);
|
|
|
|
+ clk_set_parent(fsia_clk, &fsimcka_clk);
|
|
|
|
+ clk_set_rate(fsia_clk, 11000);
|
|
|
|
+ clk_set_rate(&fsimcka_clk, 11000);
|
|
|
|
+ clk_put(fsia_clk);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* enable SH-Eth
|
|
* enable SH-Eth
|
|
*
|
|
*
|