Loading sound/soc/rockchip/rk3399_gru_sound.c +133 −26 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <linux/of_gpio.h> #include <linux/delay.h> #include <linux/spi/spi.h> #include <linux/i2c.h> #include <linux/input.h> #include <sound/core.h> #include <sound/jack.h> Loading @@ -47,18 +48,7 @@ static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = { SND_SOC_DAPM_SPK("Speakers", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Int Mic", NULL), }; static const struct snd_soc_dapm_route rockchip_dapm_routes[] = { /* Input Lines */ {"MIC", NULL, "Headset Mic"}, {"DMIC1L", NULL, "Int Mic"}, {"DMIC1R", NULL, "Int Mic"}, /* Output Lines */ {"Headphones", NULL, "HPL"}, {"Headphones", NULL, "HPR"}, {"Speakers", NULL, "Speaker"}, SND_SOC_DAPM_LINE("HDMI", NULL), }; static const struct snd_kcontrol_new rockchip_controls[] = { Loading @@ -66,6 +56,7 @@ static const struct snd_kcontrol_new rockchip_controls[] = { SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Int Mic"), SOC_DAPM_PIN_SWITCH("HDMI"), }; static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream, Loading Loading @@ -314,8 +305,6 @@ static struct snd_soc_card rockchip_sound_card = { .owner = THIS_MODULE, .dapm_widgets = rockchip_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), .dapm_routes = rockchip_dapm_routes, .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), .controls = rockchip_controls, .num_controls = ARRAY_SIZE(rockchip_controls), }; Loading @@ -329,15 +318,6 @@ enum { DAILINK_RT5514_DSP, }; static const char * const dailink_compat[] = { [DAILINK_CDNDP] = "rockchip,rk3399-cdn-dp", [DAILINK_DA7219] = "dlg,da7219", [DAILINK_DMIC] = "dmic-codec", [DAILINK_MAX98357A] = "maxim,max98357a", [DAILINK_RT5514] = "realtek,rt5514-i2c", [DAILINK_RT5514_DSP] = "realtek,rt5514-spi", }; static const struct snd_soc_dai_link rockchip_dais[] = { [DAILINK_CDNDP] = { .name = "DP", Loading Loading @@ -391,12 +371,116 @@ static const struct snd_soc_dai_link rockchip_dais[] = { }, }; static const struct snd_soc_dapm_route rockchip_sound_cdndp_routes[] = { /* Output */ {"HDMI", NULL, "TX"}, }; static const struct snd_soc_dapm_route rockchip_sound_da7219_routes[] = { /* Output */ {"Headphones", NULL, "HPL"}, {"Headphones", NULL, "HPR"}, /* Input */ {"MIC", NULL, "Headset Mic"}, }; static const struct snd_soc_dapm_route rockchip_sound_dmic_routes[] = { /* Input */ {"DMic", NULL, "Int Mic"}, }; static const struct snd_soc_dapm_route rockchip_sound_max98357a_routes[] = { /* Output */ {"Speakers", NULL, "Speaker"}, }; static const struct snd_soc_dapm_route rockchip_sound_rt5514_routes[] = { /* Input */ {"DMIC1L", NULL, "Int Mic"}, {"DMIC1R", NULL, "Int Mic"}, }; struct rockchip_sound_route { const struct snd_soc_dapm_route *routes; int num_routes; }; static const struct rockchip_sound_route rockchip_routes[] = { [DAILINK_CDNDP] = { .routes = rockchip_sound_cdndp_routes, .num_routes = ARRAY_SIZE(rockchip_sound_cdndp_routes), }, [DAILINK_DA7219] = { .routes = rockchip_sound_da7219_routes, .num_routes = ARRAY_SIZE(rockchip_sound_da7219_routes), }, [DAILINK_DMIC] = { .routes = rockchip_sound_dmic_routes, .num_routes = ARRAY_SIZE(rockchip_sound_dmic_routes), }, [DAILINK_MAX98357A] = { .routes = rockchip_sound_max98357a_routes, .num_routes = ARRAY_SIZE(rockchip_sound_max98357a_routes), }, [DAILINK_RT5514] = { .routes = rockchip_sound_rt5514_routes, .num_routes = ARRAY_SIZE(rockchip_sound_rt5514_routes), }, [DAILINK_RT5514_DSP] = {}, }; struct dailink_match_data { const char *compatible; struct bus_type *bus_type; }; static const struct dailink_match_data dailink_match[] = { [DAILINK_CDNDP] = { .compatible = "rockchip,rk3399-cdn-dp", }, [DAILINK_DA7219] = { .compatible = "dlg,da7219", }, [DAILINK_DMIC] = { .compatible = "dmic-codec", }, [DAILINK_MAX98357A] = { .compatible = "maxim,max98357a", }, [DAILINK_RT5514] = { .compatible = "realtek,rt5514", .bus_type = &i2c_bus_type, }, [DAILINK_RT5514_DSP] = { .compatible = "realtek,rt5514", .bus_type = &spi_bus_type, }, }; static int of_dev_node_match(struct device *dev, void *data) { return dev->of_node == data; } static int rockchip_sound_codec_node_match(struct device_node *np_codec) { struct device *dev; int i; for (i = 0; i < ARRAY_SIZE(dailink_compat); i++) { if (of_device_is_compatible(np_codec, dailink_compat[i])) for (i = 0; i < ARRAY_SIZE(dailink_match); i++) { if (!of_device_is_compatible(np_codec, dailink_match[i].compatible)) continue; if (dailink_match[i].bus_type) { dev = bus_find_device(dailink_match[i].bus_type, NULL, np_codec, of_dev_node_match); if (!dev) continue; put_device(dev); } return i; } return -1; Loading @@ -408,16 +492,28 @@ static int rockchip_sound_of_parse_dais(struct device *dev, struct device_node *np_cpu, *np_cpu0, *np_cpu1; struct device_node *np_codec; struct snd_soc_dai_link *dai; struct snd_soc_dapm_route *routes; int i, index; int num_routes; card->dai_link = devm_kzalloc(dev, sizeof(rockchip_dais), GFP_KERNEL); if (!card->dai_link) return -ENOMEM; num_routes = 0; for (i = 0; i < ARRAY_SIZE(rockchip_routes); i++) num_routes += rockchip_routes[i].num_routes; routes = devm_kzalloc(dev, num_routes * sizeof(*routes), GFP_KERNEL); if (!routes) return -ENOMEM; card->dapm_routes = routes; np_cpu0 = of_parse_phandle(dev->of_node, "rockchip,cpu", 0); np_cpu1 = of_parse_phandle(dev->of_node, "rockchip,cpu", 1); card->num_dapm_routes = 0; card->num_links = 0; for (i = 0; i < ARRAY_SIZE(rockchip_dais); i++) { np_codec = of_parse_phandle(dev->of_node, Loading Loading @@ -445,6 +541,17 @@ static int rockchip_sound_of_parse_dais(struct device *dev, dai->codec_of_node = np_codec; dai->platform_of_node = np_cpu; dai->cpu_of_node = np_cpu; if (card->num_dapm_routes + rockchip_routes[index].num_routes > num_routes) { dev_err(dev, "Too many routes\n"); return -EINVAL; } memcpy(routes + card->num_dapm_routes, rockchip_routes[index].routes, rockchip_routes[index].num_routes * sizeof(*routes)); card->num_dapm_routes += rockchip_routes[index].num_routes; } return 0; Loading Loading
sound/soc/rockchip/rk3399_gru_sound.c +133 −26 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <linux/of_gpio.h> #include <linux/delay.h> #include <linux/spi/spi.h> #include <linux/i2c.h> #include <linux/input.h> #include <sound/core.h> #include <sound/jack.h> Loading @@ -47,18 +48,7 @@ static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = { SND_SOC_DAPM_SPK("Speakers", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Int Mic", NULL), }; static const struct snd_soc_dapm_route rockchip_dapm_routes[] = { /* Input Lines */ {"MIC", NULL, "Headset Mic"}, {"DMIC1L", NULL, "Int Mic"}, {"DMIC1R", NULL, "Int Mic"}, /* Output Lines */ {"Headphones", NULL, "HPL"}, {"Headphones", NULL, "HPR"}, {"Speakers", NULL, "Speaker"}, SND_SOC_DAPM_LINE("HDMI", NULL), }; static const struct snd_kcontrol_new rockchip_controls[] = { Loading @@ -66,6 +56,7 @@ static const struct snd_kcontrol_new rockchip_controls[] = { SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Int Mic"), SOC_DAPM_PIN_SWITCH("HDMI"), }; static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream, Loading Loading @@ -314,8 +305,6 @@ static struct snd_soc_card rockchip_sound_card = { .owner = THIS_MODULE, .dapm_widgets = rockchip_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets), .dapm_routes = rockchip_dapm_routes, .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes), .controls = rockchip_controls, .num_controls = ARRAY_SIZE(rockchip_controls), }; Loading @@ -329,15 +318,6 @@ enum { DAILINK_RT5514_DSP, }; static const char * const dailink_compat[] = { [DAILINK_CDNDP] = "rockchip,rk3399-cdn-dp", [DAILINK_DA7219] = "dlg,da7219", [DAILINK_DMIC] = "dmic-codec", [DAILINK_MAX98357A] = "maxim,max98357a", [DAILINK_RT5514] = "realtek,rt5514-i2c", [DAILINK_RT5514_DSP] = "realtek,rt5514-spi", }; static const struct snd_soc_dai_link rockchip_dais[] = { [DAILINK_CDNDP] = { .name = "DP", Loading Loading @@ -391,12 +371,116 @@ static const struct snd_soc_dai_link rockchip_dais[] = { }, }; static const struct snd_soc_dapm_route rockchip_sound_cdndp_routes[] = { /* Output */ {"HDMI", NULL, "TX"}, }; static const struct snd_soc_dapm_route rockchip_sound_da7219_routes[] = { /* Output */ {"Headphones", NULL, "HPL"}, {"Headphones", NULL, "HPR"}, /* Input */ {"MIC", NULL, "Headset Mic"}, }; static const struct snd_soc_dapm_route rockchip_sound_dmic_routes[] = { /* Input */ {"DMic", NULL, "Int Mic"}, }; static const struct snd_soc_dapm_route rockchip_sound_max98357a_routes[] = { /* Output */ {"Speakers", NULL, "Speaker"}, }; static const struct snd_soc_dapm_route rockchip_sound_rt5514_routes[] = { /* Input */ {"DMIC1L", NULL, "Int Mic"}, {"DMIC1R", NULL, "Int Mic"}, }; struct rockchip_sound_route { const struct snd_soc_dapm_route *routes; int num_routes; }; static const struct rockchip_sound_route rockchip_routes[] = { [DAILINK_CDNDP] = { .routes = rockchip_sound_cdndp_routes, .num_routes = ARRAY_SIZE(rockchip_sound_cdndp_routes), }, [DAILINK_DA7219] = { .routes = rockchip_sound_da7219_routes, .num_routes = ARRAY_SIZE(rockchip_sound_da7219_routes), }, [DAILINK_DMIC] = { .routes = rockchip_sound_dmic_routes, .num_routes = ARRAY_SIZE(rockchip_sound_dmic_routes), }, [DAILINK_MAX98357A] = { .routes = rockchip_sound_max98357a_routes, .num_routes = ARRAY_SIZE(rockchip_sound_max98357a_routes), }, [DAILINK_RT5514] = { .routes = rockchip_sound_rt5514_routes, .num_routes = ARRAY_SIZE(rockchip_sound_rt5514_routes), }, [DAILINK_RT5514_DSP] = {}, }; struct dailink_match_data { const char *compatible; struct bus_type *bus_type; }; static const struct dailink_match_data dailink_match[] = { [DAILINK_CDNDP] = { .compatible = "rockchip,rk3399-cdn-dp", }, [DAILINK_DA7219] = { .compatible = "dlg,da7219", }, [DAILINK_DMIC] = { .compatible = "dmic-codec", }, [DAILINK_MAX98357A] = { .compatible = "maxim,max98357a", }, [DAILINK_RT5514] = { .compatible = "realtek,rt5514", .bus_type = &i2c_bus_type, }, [DAILINK_RT5514_DSP] = { .compatible = "realtek,rt5514", .bus_type = &spi_bus_type, }, }; static int of_dev_node_match(struct device *dev, void *data) { return dev->of_node == data; } static int rockchip_sound_codec_node_match(struct device_node *np_codec) { struct device *dev; int i; for (i = 0; i < ARRAY_SIZE(dailink_compat); i++) { if (of_device_is_compatible(np_codec, dailink_compat[i])) for (i = 0; i < ARRAY_SIZE(dailink_match); i++) { if (!of_device_is_compatible(np_codec, dailink_match[i].compatible)) continue; if (dailink_match[i].bus_type) { dev = bus_find_device(dailink_match[i].bus_type, NULL, np_codec, of_dev_node_match); if (!dev) continue; put_device(dev); } return i; } return -1; Loading @@ -408,16 +492,28 @@ static int rockchip_sound_of_parse_dais(struct device *dev, struct device_node *np_cpu, *np_cpu0, *np_cpu1; struct device_node *np_codec; struct snd_soc_dai_link *dai; struct snd_soc_dapm_route *routes; int i, index; int num_routes; card->dai_link = devm_kzalloc(dev, sizeof(rockchip_dais), GFP_KERNEL); if (!card->dai_link) return -ENOMEM; num_routes = 0; for (i = 0; i < ARRAY_SIZE(rockchip_routes); i++) num_routes += rockchip_routes[i].num_routes; routes = devm_kzalloc(dev, num_routes * sizeof(*routes), GFP_KERNEL); if (!routes) return -ENOMEM; card->dapm_routes = routes; np_cpu0 = of_parse_phandle(dev->of_node, "rockchip,cpu", 0); np_cpu1 = of_parse_phandle(dev->of_node, "rockchip,cpu", 1); card->num_dapm_routes = 0; card->num_links = 0; for (i = 0; i < ARRAY_SIZE(rockchip_dais); i++) { np_codec = of_parse_phandle(dev->of_node, Loading Loading @@ -445,6 +541,17 @@ static int rockchip_sound_of_parse_dais(struct device *dev, dai->codec_of_node = np_codec; dai->platform_of_node = np_cpu; dai->cpu_of_node = np_cpu; if (card->num_dapm_routes + rockchip_routes[index].num_routes > num_routes) { dev_err(dev, "Too many routes\n"); return -EINVAL; } memcpy(routes + card->num_dapm_routes, rockchip_routes[index].routes, rockchip_routes[index].num_routes * sizeof(*routes)); card->num_dapm_routes += rockchip_routes[index].num_routes; } return 0; Loading