diff options
author | Lionel Xu <Lionel.Xu@freescale.com> | 2010-03-18 21:50:06 +0800 |
---|---|---|
committer | Alejandro Gonzalez <alex.gonzalez@digi.com> | 2010-05-25 11:20:16 +0200 |
commit | 18c5d7491f4fcee0b7d1e5a2b0dc42660e5c67a6 (patch) | |
tree | 650dbfbb01b64c9e9794e24f841b272deae028a8 /arch | |
parent | 6443e51cfc24c968939a9a49c502b6f1564dbdfa (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')
-rw-r--r-- | arch/arm/mach-mx28/device.c | 65 | ||||
-rw-r--r-- | arch/arm/mach-mx28/mx28evk.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-mx28/mx28evk_pins.c | 10 | ||||
-rw-r--r-- | arch/arm/plat-mxs/include/mach/device.h | 4 |
4 files changed, 55 insertions, 25 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) diff --git a/arch/arm/plat-mxs/include/mach/device.h b/arch/arm/plat-mxs/include/mach/device.h index b1908cc513dd..d0844f5e9de2 100644 --- a/arch/arm/plat-mxs/include/mach/device.h +++ b/arch/arm/plat-mxs/include/mach/device.h @@ -145,11 +145,9 @@ struct flexcan_platform_data { }; struct mxs_audio_platform_data { - int saif0_select; - int saif1_select; int intr_id_hp; int ext_ram; - struct clk *saif_clock; + struct clk *saif_mclock; int hp_irq; int (*hp_status) (void); |