summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mx28
diff options
context:
space:
mode:
authorLionel Xu <Lionel.Xu@freescale.com>2010-03-18 21:50:06 +0800
committerAlejandro Gonzalez <alex.gonzalez@digi.com>2010-05-25 11:20:16 +0200
commit18c5d7491f4fcee0b7d1e5a2b0dc42660e5c67a6 (patch)
tree650dbfbb01b64c9e9794e24f841b272deae028a8 /arch/arm/mach-mx28
parent6443e51cfc24c968939a9a49c502b6f1564dbdfa (diff)
ENGR00117751 MX28 ALSA: Support audio record through saif
Support audio record through saif, support playback/record simultaneously Signed-off-by: Lionel Xu <r63889@freescale.com> (cherry picked from commit 18627873f6332e03ebd03691f51937559bbdf03d) Signed-off-by: Alejandro Gonzalez <alex.gonzalez@digi.com>
Diffstat (limited to 'arch/arm/mach-mx28')
-rw-r--r--arch/arm/mach-mx28/device.c65
-rw-r--r--arch/arm/mach-mx28/mx28evk.c1
-rw-r--r--arch/arm/mach-mx28/mx28evk_pins.c10
3 files changed, 54 insertions, 22 deletions
diff --git a/arch/arm/mach-mx28/device.c b/arch/arm/mach-mx28/device.c
index 5b90b6e8892f..9f553acc597d 100644
--- a/arch/arm/mach-mx28/device.c
+++ b/arch/arm/mach-mx28/device.c
@@ -1105,14 +1105,14 @@ static void __init mx28_init_dcp(void)
#endif
#if defined(CONFIG_SND_MXS_SOC_DAI) || defined(CONFIG_SND_MXS_SOC_DAI_MODULE)
-static int audio_clk_init(void)
+static int audio_clk_init(struct clk *clk)
{
- struct clk *saif_clk;
struct clk *pll_clk;
+ struct clk *saif_mclk0;
+ struct clk *saif_mclk1;
int ret = -EINVAL;
- saif_clk = clk_get(NULL, "saif.0");
- if (IS_ERR(saif_clk)) {
- pr_err("%s:failed to get saif_clk\n", __func__);
+ if (IS_ERR(clk)) {
+ pr_err("%s:failed to get clk\n", __func__);
goto err_clk_init;
}
pll_clk = clk_get(NULL, "pll.0");
@@ -1120,18 +1120,32 @@ static int audio_clk_init(void)
pr_err("%s:failed to get pll_clk\n", __func__);
goto err_clk_init;
}
- ret = clk_set_parent(saif_clk, pll_clk);
+ saif_mclk0 = clk_get(NULL, "saif_mclk.0");
+ if (IS_ERR(saif_mclk0)) {
+ pr_err("%s:failed to get saif_mclk\n", __func__);
+ goto err_clk_init;
+ }
+ saif_mclk1 = clk_get(NULL, "saif_mclk.1");
+ if (IS_ERR(saif_mclk1)) {
+ pr_err("%s:failed to get saif_mclk\n", __func__);
+ goto err_clk_init;
+ }
+ ret = clk_set_parent(clk, pll_clk);
if (ret) {
pr_err("%s:failed to set parent clk\n", __func__);
goto err_clk_init;
}
ret = 0;
- /*set a default freq 12M to sgtl5000*/
- clk_set_rate(saif_clk, 12000000);
- clk_enable(saif_clk);
- /*set the saif clk mux*/
- __raw_writel(BF_DIGCTL_CTRL_SAIF_CLKMUX_SEL(0x0), \
+ /*set a default freq of 12M to sgtl5000*/
+ clk_set_rate(clk, 12000000);
+ clk_enable(clk);
+ /*set the saif clk mux, saif0/saif1 both use saif0 clk*/
+ __raw_writel(BF_DIGCTL_CTRL_SAIF_CLKMUX_SEL(0x2), \
IO_ADDRESS(DIGCTL_PHYS_ADDR) + HW_DIGCTL_CTRL);
+
+ /*enable saif0/saif1 clk output*/
+ clk_enable(saif_mclk0);
+ clk_enable(saif_mclk1);
err_clk_init:
return ret;
}
@@ -1139,6 +1153,8 @@ err_clk_init:
static int audio_clk_finit(void)
{
struct clk *saif_clk;
+ struct clk *saif_mclk0;
+ struct clk *saif_mclk1;
int ret = 0;
saif_clk = clk_get(NULL, "saif.0");
if (IS_ERR(saif_clk)) {
@@ -1147,20 +1163,25 @@ static int audio_clk_finit(void)
goto err_clk_finit;
}
clk_disable(saif_clk);
+
+ saif_mclk0 = clk_get(NULL, "saif_mclk.0");
+ if (IS_ERR(saif_mclk0)) {
+ pr_err("%s:failed to get saif_mclk\n", __func__);
+ goto err_clk_finit;
+ }
+ clk_disable(saif_mclk0);
+
+ saif_mclk1 = clk_get(NULL, "saif_mclk.1");
+ if (IS_ERR(saif_mclk1)) {
+ pr_err("%s:failed to get saif_mclk\n", __func__);
+ goto err_clk_finit;
+ }
+ clk_disable(saif_mclk1);
err_clk_finit:
return ret;
}
-static struct mxs_audio_platform_data audio_plat_data = {
-#if defined(CONFIG_SND_MXS_SOC_SAIF0_SELECT)
- .saif0_select = 1,
-#endif
-#if defined(CONFIG_SND_MXS_SOC_SAIF1_SELECT)
- .saif1_select = 1,
-#endif
- .init = audio_clk_init,
- .finit = audio_clk_finit,
-};
+static struct mxs_audio_platform_data audio_plat_data;
#endif
#if defined(CONFIG_SND_SOC_SGTL5000) || defined(CONFIG_SND_SOC_SGTL5000_MODULE)
@@ -1170,6 +1191,8 @@ void __init mx28_init_audio(void)
if (pdev == NULL || IS_ERR(pdev))
return;
mxs_add_device(pdev, 3);
+ audio_plat_data.saif_mclock = clk_get(NULL, "saif.0");
+ audio_clk_init(audio_plat_data.saif_mclock);
pdev->dev.platform_data = &audio_plat_data;
}
#else
diff --git a/arch/arm/mach-mx28/mx28evk.c b/arch/arm/mach-mx28/mx28evk.c
index 9aa3f3d3e855..650d16a4fb0a 100644
--- a/arch/arm/mach-mx28/mx28evk.c
+++ b/arch/arm/mach-mx28/mx28evk.c
@@ -41,7 +41,6 @@ static struct i2c_board_info __initdata mxs_i2c_device[] = {
static void i2c_device_init(void)
{
- mxs_i2c_device[0].platform_data = (void *)clk_get(NULL, "saif_mclk.0");
i2c_register_board_info(0, mxs_i2c_device, ARRAY_SIZE(mxs_i2c_device));
}
diff --git a/arch/arm/mach-mx28/mx28evk_pins.c b/arch/arm/mach-mx28/mx28evk_pins.c
index 8f8591dcda02..3fbb6c51af3c 100644
--- a/arch/arm/mach-mx28/mx28evk_pins.c
+++ b/arch/arm/mach-mx28/mx28evk_pins.c
@@ -691,6 +691,16 @@ static struct pin_desc mx28evk_fixed_pins[] = {
.drive = 1,
.pull = 1,
},
+ {
+ .name = "SAIF1_SDATA0",
+ .id = PINID_SAIF1_SDATA0,
+ .fun = PIN_FUN1,
+ .strength = PAD_12MA,
+ .voltage = PAD_3_3V,
+ .pullup = 1,
+ .drive = 1,
+ .pull = 1,
+ },
#endif
#if defined(CONFIG_SND_SOC_MXS_SPDIF) || \
defined(CONFIG_SND_SOC_MXS_SPDIF_MODULE)