From: sugar Date: Sun, 28 Sep 2014 13:48:20 +0000 (+0800) Subject: Audio: spdif: add spdif card or not according dts define. X-Git-Tag: firefly_0821_release~4636 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=423f8a40571445f02357846565187bfa19eab830;p=firefly-linux-kernel-4.4.55.git Audio: spdif: add spdif card or not according dts define. --- diff --git a/arch/arm/boot/dts/rk3128-box.dts b/arch/arm/boot/dts/rk3128-box.dts index 4bfd4993fcbd..13e0f244cffe 100755 --- a/arch/arm/boot/dts/rk3128-box.dts +++ b/arch/arm/boot/dts/rk3128-box.dts @@ -42,6 +42,17 @@ status = "okay"; }; + + rockchip-spdif-card { + compatible = "rockchip-spdif-card"; + dais { + dai0 { + audio-codec = <&codec_hdmi_spdif>; + i2s-controller = <&spdif>; + }; + }; + }; + usb_control { compatible = "rockchip,rk3126-usb-control"; host_drv_gpio = <&gpio3 GPIO_C4 GPIO_ACTIVE_LOW>; @@ -68,7 +79,6 @@ ) >; }; - }; diff --git a/arch/arm/configs/rockchip_defconfig b/arch/arm/configs/rockchip_defconfig index 898cbd122aae..063d836bf20b 100644 --- a/arch/arm/configs/rockchip_defconfig +++ b/arch/arm/configs/rockchip_defconfig @@ -432,6 +432,7 @@ CONFIG_SND_USB_AUDIO=y CONFIG_SND_SOC=y CONFIG_SND_RK_SOC=y CONFIG_SND_RK_SOC_HDMI_I2S=y +CONFIG_SND_RK_SOC_SPDIF_CARD=y CONFIG_SND_RK_SOC_RT5631=y CONFIG_SND_RK_SOC_RT3224=y CONFIG_SND_RK_SOC_RK312X=y diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig index dd645b7a43c6..4e8bca178590 100755 --- a/sound/soc/rockchip/Kconfig +++ b/sound/soc/rockchip/Kconfig @@ -33,7 +33,7 @@ choice endchoice endif #SND_RK_SOC && RK_HDMI -config SND_RK_SOC_CARD_SPDIF +config SND_RK_SOC_SPDIF_CARD tristate "SoC spdif card support for rockchip" depends on !SND_RK_SOC_HDMI_SPDIF select SND_RK_SOC_SPDIF diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile index a544bfb98d17..de591807a553 100755 --- a/sound/soc/rockchip/Makefile +++ b/sound/soc/rockchip/Makefile @@ -37,6 +37,7 @@ snd-soc-rk2928-objs := rk2928-card.o snd-soc-es8323-objs := rk_es8323.o snd-soc-rk3026-objs := rk_rk3026.o snd-soc-rk3190-objs := rk_rk3190.o +snd-soc-spdif-card-objs := rk_spdif_card.o snd-soc-hdmi-i2s-objs := rk_hdmi_i2s.o snd-soc-hdmi-spdif-objs := rk_hdmi_spdif.o snd-soc-rt5512-objs := rk_rt5512.o @@ -58,6 +59,7 @@ obj-$(CONFIG_SND_RK_SOC_RT5616) += snd-soc-rt5616.o obj-$(CONFIG_SND_RK_SOC_RK1000) += snd-soc-rk1000.o obj-$(CONFIG_SND_RK_SOC_RK3036) += snd-soc-rk3036.o obj-$(CONFIG_SND_RK_SOC_RK312X) += snd-soc-rk312x.o +obj-$(CONFIG_SND_RK_SOC_SPDIF_CARD) += snd-soc-spdif-card.o obj-$(CONFIG_SND_RK_SOC_CS42L52) += snd-soc-cs42l52.o obj-$(CONFIG_SND_RK_SOC_AIC3111) += snd-soc-aic3111.o obj-$(CONFIG_SND_RK_SOC_AIC3262) += snd-soc-aic3262.o @@ -69,6 +71,5 @@ obj-$(CONFIG_SND_RK_SOC_RK3026) += snd-soc-rk3026.o obj-$(CONFIG_SND_RK_SOC_RK3190) += snd-soc-rk3190.o obj-$(CONFIG_SND_RK_SOC_RT5512) += snd-soc-rt5512.o obj-$(CONFIG_SND_RK_SOC_CX2070X) += snd-soc-cx2070x.o -obj-$(CONFIG_SND_RK_SOC_CARD_SPDIF) += snd-soc-hdmi-spdif.o obj-$(CONFIG_SND_RK_SOC_HDMI_I2S) += snd-soc-hdmi-i2s.o obj-$(CONFIG_SND_RK_SOC_HDMI_SPDIF) += snd-soc-hdmi-spdif.o diff --git a/sound/soc/rockchip/rk_spdif_card.c b/sound/soc/rockchip/rk_spdif_card.c new file mode 100755 index 000000000000..8baae9629d24 --- /dev/null +++ b/sound/soc/rockchip/rk_spdif_card.c @@ -0,0 +1,136 @@ +/* + * rk_spdif_card.c -- spdif card for rockchip + * + * Copyright 2014 rockchip Co. Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "card_info.h" +#include "rk_pcm.h" + +static int rk_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + unsigned long pll_out, rclk_rate; + int ret, ratio; + + switch (params_rate(params)) { + case 44100: + pll_out = 11289600; + break; + case 32000: + pll_out = 8192000; + break; + case 48000: + pll_out = 12288000; + break; + case 96000: + pll_out = 24576000; + break; + default: + pr_err("rk_spdif: params not support\n"); + return -EINVAL; + } + + ratio = 256; + rclk_rate = params_rate(params) * ratio; + + /* Set audio source clock rates */ + ret = snd_soc_dai_set_sysclk(cpu_dai, 0, + rclk_rate, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + return ret; +} + +static struct snd_soc_ops rk_spdif_ops = { + .hw_params = rk_hw_params, +}; + +static struct snd_soc_dai_link rk_dai = { + .name = "SPDIF", + .stream_name = "SPDIF PCM Playback", + .codec_dai_name = "rk-hdmi-spdif-hifi", + .ops = &rk_spdif_ops, +}; + +static struct snd_soc_card rockchip_spdif_card = { + .name = "RK-SPDIF-CARD", + .dai_link = &rk_dai, + .num_links = 1, +}; + +static int rockchip_spdif_card_probe(struct platform_device *pdev) +{ + int ret; + struct snd_soc_card *card = &rockchip_spdif_card; + + card->dev = &pdev->dev; + + ret = rockchip_of_get_sound_card_info_(card, false); + if (ret) { + pr_err("%s() get sound card info failed:%d\n", + __func__, ret); + return ret; + } + + ret = snd_soc_register_card(card); + + if (ret) + pr_err("%s() register card failed:%d\n", + __func__, ret); + + return ret; +} + +static int rockchip_spdif_card_remove(struct platform_device *pdev) +{ + struct snd_soc_card *card = platform_get_drvdata(pdev); + + snd_soc_unregister_card(card); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id rockchip_spdif_card_of_match[] = { + { .compatible = "rockchip-spdif-card"}, + {}, +}; +MODULE_DEVICE_TABLE(of, rockchip_spdif_card_of_match); +#endif /* CONFIG_OF */ + +static struct platform_driver rockchip_spdif_card_driver = { + .driver = { + .name = "rockchip-spdif-card", + .owner = THIS_MODULE, + .pm = &snd_soc_pm_ops, + .of_match_table = of_match_ptr(rockchip_spdif_card_of_match), + }, + .probe = rockchip_spdif_card_probe, + .remove = rockchip_spdif_card_remove, +}; + +module_platform_driver(rockchip_spdif_card_driver); + +MODULE_AUTHOR("hzb, "); +MODULE_DESCRIPTION("ALSA SoC RK S/PDIF"); +MODULE_LICENSE("GPL");