ARM: tegra: add AC97 clock to the host controller node
Subsystems (4)
PATCH 1/3 ARM: tegra: add AC97 clock to the host controller node
--
CC: Stephen Warren <[email protected]>
--- arch/arm/boot/dts/tegra20-colibri-512.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/tegra20-colibri-512.dtsi +1 -0
@@ -448,6 +448,7 @@ GPIO_ACTIVE_HIGH>; nvidia,codec-sync-gpio = <&gpio TEGRA_GPIO(P, 0) GPIO_ACTIVE_HIGH>; + clocks = <&tegra_car TEGRA20_CLK_AC97>; }; usb@c5004000 {
Signature · 1 line
1.8.3.1
A message that is not in the archive (sent off-list or not yet received): 1384370243-17178-1-git-send-email-dev-8ppwABl0HbeELgA04lAiVw@public.gmane.org
PATCH 2/3 ASOC: tegra: fix matching of AC97 components
Matching works completely based on the cpu of_node.
---
CC: <alsa-devel-K7yf7f+aM1XWsZ/[email protected]>
CC: Mark Brown <[email protected]>
CC: Stephen Warren <[email protected]>
--- sound/soc/tegra/tegra_wm9712.c | 1 - 1 file changed, 1 deletion(-)
sound/soc/tegra/tegra_wm9712.c +0 -1
@@ -55,7 +55,6 @@ static int tegra_wm9712_init(struct snd_soc_pcm_runtime *rtd)static struct snd_soc_dai_link tegra_wm9712_dai = { .name ="AC97 HiFi" , .stream_name ="AC97 HiFi" , - .cpu_dai_name ="tegra20-ac97" , .codec_dai_name ="wm9712-hifi" , .codec_name ="wm9712-codec" , .init = tegra_wm9712_init,
Signature · 1 line
1.8.3.1
A message that is not in the archive (sent off-list or not yet received): 1384370243-17178-2-git-send-email-dev-8ppwABl0HbeELgA04lAiVw@public.gmane.org
Stephen Warren
Acked-byRe: [PATCH 2/3] ASOC: tegra: fix matching of AC97 components
Quoted 1 line · Lucas Stach
Matching works completely based on the cpu
of_node.
PATCH 3/3 ASOC: tegra: fix AC97 clock handling
In reply to a message not in the archiveThis corrects the Tegra AC97 clock handling to be in line with the devicetree. Audio PLL is controlled by the machine driver, only AC97 host controller clock remains to be independent.
--
CC: Mark Brown <[email protected]>
CC: Stephen Warren <[email protected]>
CC: alsa-devel-K7yf7f+aM1XWsZ/[email protected]
This is basically a v2 of "ASOC: tegra: move AC97 clock defines to the controller node" incorporating the feedback I got from both Stephen and Mark.
--- sound/soc/tegra/tegra20_ac97.c | 32 ++++++++++---------------------- sound/soc/tegra/tegra20_ac97.h | 1 - sound/soc/tegra/tegra_wm9712.c | 17 ++++++++++++++++- 3 files changed, 26 insertions(+), 24 deletions(-)
sound/soc/tegra/tegra20_ac97.c +10 -22
@@ -37,7 +37,6 @@#include <sound/soc.h> #include <sound/dmaengine_pcm.h> -#include "tegra_asoc_utils.h" #include "tegra20_ac97.h" #define DRV_NAME "tegra20-ac97"
@@ -337,7 +336,7 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) regs =devm_ioremap_resource (&pdev->dev, mem);if (IS_ERR (regs)) { ret =PTR_ERR (regs); - goto err_clk_put; + goto err; } ac97->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -345,7 +344,7 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev)if (IS_ERR (ac97->regmap)) {dev_err (&pdev->dev,"regmap init failed\n" ); ret =PTR_ERR (ac97->regmap); - goto err_clk_put; + goto err; } if (of_property_read_u32_array(pdev->dev.of_node,
@@ -353,7 +352,7 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) of_dma, 2) < 0) {dev_err (&pdev->dev,"No DMA resource\n" ); ret = -ENODEV ; - goto err_clk_put; + goto err; } ac97->reset_gpio = of_get_named_gpio(pdev->dev.of_node,
@@ -363,18 +362,18 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) GPIOF_OUT_INIT_HIGH, "codec-reset");if (ret) {dev_err (&pdev->dev,"could not get codec-reset GPIO\n" ); - goto err_clk_put; + goto err; } }else {dev_err (&pdev->dev,"no codec-reset GPIO supplied\n" ); - goto err_clk_put; + goto err; } ac97->sync_gpio =of_get_named_gpio (pdev->dev.of_node,"nvidia,codec-sync-gpio" ,0 );if (!gpio_is_valid (ac97->sync_gpio)) {dev_err (&pdev->dev,"no codec-sync GPIO supplied\n" ); - goto err_clk_put; + goto err; } ac97->capture_dma_data.addr = mem->start +TEGRA20_AC97_FIFO_RX1 ;
@@ -387,24 +386,18 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) ac97->playback_dma_data.maxburst =4 ; ac97->playback_dma_data.slave_id = of_dma[1 ]; - ret =tegra_asoc_utils_init (&ac97->util_data, &pdev->dev); -if (ret) - goto err_clk_put; - - ret =tegra_asoc_utils_set_ac97_rate (&ac97->util_data); -if (ret) - goto err_asoc_utils_fini; + ret =clk_set_rate (ac97->clk_ac97,24576000 ); ret =clk_prepare_enable (ac97->clk_ac97);if (ret) {dev_err (&pdev->dev,"clk_enable failed: %d\n" , ret); - goto err_asoc_utils_fini; + goto err; } ret =snd_soc_set_ac97_ops (&tegra20_ac97_ops);if (ret) {dev_err (&pdev->dev,"Failed to set AC'97 ops: %d\n" , ret); - goto err_asoc_utils_fini; + goto err; } ret = snd_soc_register_component(&pdev->dev, &tegra20_ac97_component,
@@ -412,7 +405,7 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"Could not register DAI: %d\n" , ret); ret = -ENOMEM ; - goto err_asoc_utils_fini; + goto err; } ret =tegra_pcm_platform_register (&pdev->dev);
@@ -428,9 +421,6 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) err_unregister_component:snd_soc_unregister_component (&pdev->dev); -err_asoc_utils_fini: -tegra_asoc_utils_fini (&ac97->util_data); -err_clk_put: err:snd_soc_set_ac97_ops (NULL );return ret;
@@ -443,8 +433,6 @@ static int tegra20_ac97_platform_remove(struct platform_device *pdev)tegra_pcm_platform_unregister (&pdev->dev);snd_soc_unregister_component (&pdev->dev); -tegra_asoc_utils_fini (&ac97->util_data); -clk_disable_unprepare (ac97->clk_ac97);snd_soc_set_ac97_ops (NULL );
sound/soc/tegra/tegra20_ac97.h +0 -1
@@ -90,6 +90,5 @@ struct tegra20_ac97 {struct regmap *regmap;int reset_gpio; int sync_gpio; - struct tegra_asoc_utils_data util_data; };#endif /* __TEGRA20_AC97_H__ */
sound/soc/tegra/tegra_wm9712.c +16 -1
@@ -29,10 +29,13 @@#include <sound/pcm_params.h> #include <sound/soc.h> +#include "tegra_asoc_utils.h" +#define DRV_NAME "tegra-snd-wm9712"struct tegra_wm9712 {struct platform_device *codec; +struct tegra_asoc_utils_data util_data; };static const struct snd_soc_dapm_widget tegra_wm9712_dapm_widgets[] = {
@@ -118,15 +121,25 @@ static int tegra_wm9712_driver_probe(struct platform_device *pdev) tegra_wm9712_dai.platform_of_node = tegra_wm9712_dai.cpu_of_node; + ret =tegra_asoc_utils_init (&machine->util_data, &pdev->dev); +if (ret) + goto codec_unregister; + + ret =tegra_asoc_utils_set_ac97_rate (&machine->util_data); +if (ret) + goto asoc_utils_fini; + ret =snd_soc_register_card (card);if (ret) {dev_err (&pdev->dev,"snd_soc_register_card failed (%d)\n" , ret); - goto codec_unregister; + goto asoc_utils_fini; }return 0 ; +asoc_utils_fini: +tegra_asoc_utils_fini (&machine->util_data); codec_unregister:platform_device_del (machine->codec); codec_put:
@@ -141,6 +154,8 @@ static int tegra_wm9712_driver_remove(struct platform_device *pdev)snd_soc_unregister_card (card); +tegra_asoc_utils_fini (&machine->util_data); +platform_device_unregister (machine->codec);return 0 ;
Signature · 1 line
1.8.3.1
A message that is not in the archive (sent off-list or not yet received): 1384370243-17178-3-git-send-email-dev-8ppwABl0HbeELgA04lAiVw@public.gmane.org
Re: [PATCH 3/3] ASOC: tegra: fix AC97 clock handling
On Wed, Nov 13, 2013 at 08:17:23PM +0100, Lucas Stach wrote:
[...]
Quoted 1 line
sound/soc/tegra/tegra20_ac97.c +0
-0
[...]
sound/soc/tegra/tegra20_ac97.c static int tegra20_ac97_platform_probe(struct platform_device *pdev) · line 389
Quoted 12 lines
sound/soc/tegra/tegra20_ac97.c +1
-7@@ -387,24 +386,18 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) ac97->playback_dma_data.maxburst =4 ; ac97->playback_dma_data.slave_id = of_dma[1 ]; - ret =tegra_asoc_utils_init (&ac97->util_data, &pdev->dev); -if (ret) - goto err_clk_put; - - ret =tegra_asoc_utils_set_ac97_rate (&ac97->util_data); -if (ret) - goto err_asoc_utils_fini; + ret =clk_set_rate (ac97->clk_ac97,24576000 );
I think this needs error checking. Just in case.
Thierry
Stephen Warren
Acked-byRe: [PATCH 3/3] ASOC: tegra: fix AC97 clock handling
In reply to a message not in the archivesound/soc/tegra/tegra20_ac97.c static int tegra20_ac97_platform_probe(struct platform_device *pdev) · line 356
Quoted 13 lines · Lucas Stach
This corrects the Tegra AC97 clock handling to be in line with the devicetree. Audio PLL is controlled by the machine driver, only AC97 host controller clock remains to be independent.
sound/soc/tegra/tegra20_ac97.c +1
-1@@ -353,7 +352,7 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) of_dma, 2) < 0) {dev_err (&pdev->dev,"No DMA resource\n" ); ret = -ENODEV ; - goto err_clk_put; + goto err; }
That's going to conflict (admittedly very slightly) with the patch I sent on Friday to convert to the standard DT DMA bindings[1] since that block of code is removed.
Perhaps you could remove the removal of label err_clk_put from this patch, and keep the rest? Then, I think there won't be any conflict at all. You can send the s/err_clk_put/err/ conversion later; it's logically a separate cleanup anyway, right?
[1] http://www.spinics.net/lists/arm-kernel/msg286785.html
Aside from that and Thierry's comment,
Quoted 12 lines · Lucas Stach
Signed-off-by Lucas Stach <[email protected]>--
CC: Stephen Warren <[email protected]>--- arch/arm/boot/dts/tegra20-colibri-512.dtsi | 1 + 1 file changed, 1 insertion(+)arch/arm/boot/dts/tegra20-colibri-512.dtsi +0
-0
arch/arm/boot/dts/tegra20-colibri-512.dtsi line 454
Quoted 7 lines
arch/arm/boot/dts/tegra20-colibri-512.dtsi +1
-0@@ -448,6 +448,7 @@ GPIO_ACTIVE_HIGH>; nvidia,codec-sync-gpio = <&gpio TEGRA_GPIO(P, 0) GPIO_ACTIVE_HIGH>; + clocks = <&tegra_car TEGRA20_CLK_AC97>; }; usb@c5004000 {
That property already exists in the ac97 node of tegra20.dtsi, so it shouldn't be needed here.
Thierry