From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198

---
 kernel/sound/soc/rockchip/rockchip_multicodecs.c |   49 +++++++++++++++++++++++++++++++++----------------
 1 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/kernel/sound/soc/rockchip/rockchip_multicodecs.c b/kernel/sound/soc/rockchip/rockchip_multicodecs.c
index f7982ad..e4b0a15 100644
--- a/kernel/sound/soc/rockchip/rockchip_multicodecs.c
+++ b/kernel/sound/soc/rockchip/rockchip_multicodecs.c
@@ -456,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));
 		}
 	}
 
@@ -590,7 +587,7 @@
 	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,";
 
@@ -722,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);
 		}
 
@@ -745,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;
 		}
 
@@ -754,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;
 		}
 	}
@@ -779,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[] = {
@@ -817,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