From 151fecfb72a0d602dfe79790602ef64b4e241574 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 19 Feb 2024 01:51:07 +0000
Subject: [PATCH] export RK_PA3
---
kernel/sound/soc/rockchip/rockchip_multicodecs.c | 79 +++++++++++++++++++++++++++------------
1 files changed, 54 insertions(+), 25 deletions(-)
diff --git a/kernel/sound/soc/rockchip/rockchip_multicodecs.c b/kernel/sound/soc/rockchip/rockchip_multicodecs.c
index 8b1cb5f..e4b0a15 100644
--- a/kernel/sound/soc/rockchip/rockchip_multicodecs.c
+++ b/kernel/sound/soc/rockchip/rockchip_multicodecs.c
@@ -336,8 +336,8 @@
static int rk_multicodecs_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;
+ struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
struct snd_soc_dai *codec_dai;
struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card);
unsigned int mclk;
@@ -345,8 +345,7 @@
mclk = params_rate(params) * mc_data->mclk_fs;
- for (i = 0; i < rtd->num_codecs; i++) {
- codec_dai = rtd->codec_dais[i];
+ for_each_rtd_codec_dais(rtd, i, codec_dai) {
ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk,
SND_SOC_CLOCK_IN);
if (ret && ret != -ENOTSUPP) {
@@ -437,8 +436,7 @@
int i;
/* set jack for the first successful one */
- for (i = 0; i < rtd->num_codecs; i++) {
- codec_dai = rtd->codec_dais[i];
+ for_each_rtd_codec_dais(rtd, i, codec_dai) {
ret = snd_soc_component_set_jack(codec_dai->component,
jack_headset, NULL);
if (ret >= 0)
@@ -458,9 +456,6 @@
dev_err(card->dev, "Failed to request headset detect irq");
return ret;
}
-
- queue_delayed_work(system_power_efficient_wq,
- &mc_data->handler, msecs_to_jiffies(50));
}
}
@@ -584,13 +579,15 @@
struct snd_soc_card *card;
struct device_node *np = pdev->dev.of_node;
struct snd_soc_dai_link *link;
+ struct snd_soc_dai_link_component *cpus;
+ struct snd_soc_dai_link_component *platforms;
struct snd_soc_dai_link_component *codecs;
struct multicodecs_data *mc_data;
struct of_phandle_args args;
struct device_node *node;
struct input_dev *input;
u32 val;
- int count, value;
+ int count, value, irq;
int ret = 0, i = 0, idx = 0;
const char *prefix = "rockchip,";
@@ -602,6 +599,14 @@
mc_data = devm_kzalloc(&pdev->dev, sizeof(*mc_data), GFP_KERNEL);
if (!mc_data)
+ return -ENOMEM;
+
+ cpus = devm_kzalloc(&pdev->dev, sizeof(*cpus), GFP_KERNEL);
+ if (!cpus)
+ return -ENOMEM;
+
+ platforms = devm_kzalloc(&pdev->dev, sizeof(*platforms), GFP_KERNEL);
+ if (!platforms)
return -ENOMEM;
card = &mc_data->snd_card;
@@ -617,6 +622,10 @@
link->stream_name = link->name;
link->init = rk_dailink_init;
link->ops = &rk_ops;
+ link->cpus = cpus;
+ link->platforms = platforms;
+ link->num_cpus = 1;
+ link->num_platforms = 1;
link->ignore_pmdown_time = 1;
card->dai_link = link;
@@ -673,11 +682,11 @@
/* Only reference the codecs[0].of_node which maybe as master. */
rk_multicodecs_parse_daifmt(np, codecs[0].of_node, mc_data, prefix);
- link->cpu_of_node = of_parse_phandle(np, "rockchip,cpu", 0);
- if (!link->cpu_of_node)
+ link->cpus->of_node = of_parse_phandle(np, "rockchip,cpu", 0);
+ if (!link->cpus->of_node)
return -ENODEV;
- link->platform_of_node = link->cpu_of_node;
+ link->platforms->of_node = link->cpus->of_node;
mc_data->mclk_fs = DEFAULT_MCLK_FS;
if (!of_property_read_u32(np, "rockchip,mclk-fs", &val))
@@ -710,7 +719,7 @@
input = devm_input_allocate_device(&pdev->dev);
if (IS_ERR(input)) {
- dev_err(&pdev->dev, "failed to allocate input device\n");
+ dev_err(&pdev->dev, "Failed to allocate input device\n");
return PTR_ERR(input);
}
@@ -733,7 +742,7 @@
mc_data->input = input;
ret = mc_keys_setup_polling(mc_data, mc_keys_poll);
if (ret) {
- dev_err(&pdev->dev, "Unable to set up polling: %d\n", ret);
+ dev_err(&pdev->dev, "Failed to set up polling: %d\n", ret);
return ret;
}
@@ -742,7 +751,7 @@
ret = input_register_device(mc_data->input);
if (ret) {
- dev_err(&pdev->dev, "Unable to register input device: %d\n", ret);
+ dev_err(&pdev->dev, "Failed to register input device: %d\n", ret);
return ret;
}
}
@@ -767,33 +776,51 @@
mc_data->extcon = devm_extcon_dev_allocate(&pdev->dev, headset_extcon_cable);
if (IS_ERR(mc_data->extcon)) {
- dev_err(&pdev->dev, "allocate extcon failed\n");
+ dev_err(&pdev->dev, "Failed to allocate extcon\n");
return PTR_ERR(mc_data->extcon);
}
ret = devm_extcon_dev_register(&pdev->dev, mc_data->extcon);
if (ret) {
- dev_err(&pdev->dev, "failed to register extcon: %d\n", ret);
+ dev_err(&pdev->dev, "Failed to register extcon: %d\n", ret);
return ret;
}
- ret = snd_soc_of_parse_audio_routing(card, "rockchip,audio-routing");
- if (ret < 0)
- dev_warn(&pdev->dev, "Audio routing invalid/unspecified\n");
+ snd_soc_of_parse_audio_routing(card, "rockchip,audio-routing");
snd_soc_card_set_drvdata(card, mc_data);
+ platform_set_drvdata(pdev, card);
ret = devm_snd_soc_register_card(&pdev->dev, card);
- if (ret == -EPROBE_DEFER)
- return -EPROBE_DEFER;
if (ret) {
- dev_err(&pdev->dev, "card register failed %d\n", ret);
+ dev_err(&pdev->dev, "Failed to register card: %d\n", ret);
return ret;
}
- platform_set_drvdata(pdev, card);
+ irq = gpiod_to_irq(mc_data->hp_det_gpio);
+ if (irq >= 0)
+ queue_delayed_work(system_power_efficient_wq,
+ &mc_data->handler, msecs_to_jiffies(50));
return ret;
+}
+
+static int rk_multicodec_remove(struct platform_device *pdev)
+{
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+ struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(card);
+
+ cancel_delayed_work_sync(&mc_data->handler);
+
+ return 0;
+}
+
+static void rk_multicodec_shutdown(struct platform_device *pdev)
+{
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+ struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(card);
+
+ cancel_delayed_work_sync(&mc_data->handler);
}
static const struct of_device_id rockchip_multicodecs_of_match[] = {
@@ -805,6 +832,8 @@
static struct platform_driver rockchip_multicodecs_driver = {
.probe = rk_multicodecs_probe,
+ .remove = rk_multicodec_remove,
+ .shutdown = rk_multicodec_shutdown,
.driver = {
.name = DRV_NAME,
.pm = &snd_soc_pm_ops,
--
Gitblit v1.6.2