From dee7082307f9254baa7057ce17b404bbfe9ca241 Mon Sep 17 00:00:00 2001 From: Sitong Date: Mon, 19 Sep 2022 18:08:21 +0800 Subject: [PATCH] asoc: use virt_sndcard_ctl node for sndcard status update In automotive hypervisor SSR case, csd2 need a while to handle resource, hence receiving virtual SSR event doesn't mean PVM is ready for audio usecase. AudioReach should wait for more precise events from PVM csd2. Expose an ioctl node for updating sndcard status via gsl virtualization. Change-Id: Ia5d1110dea970070706937c3bf5e42e1ccb1942f --- asoc/gvm_auto_spf_dummy.c | 43 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/asoc/gvm_auto_spf_dummy.c b/asoc/gvm_auto_spf_dummy.c index b5e248ed5830..07f0e9aaf0d7 100644 --- a/asoc/gvm_auto_spf_dummy.c +++ b/asoc/gvm_auto_spf_dummy.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -30,8 +31,6 @@ #include #include #include "msm_dailink.h" -#include -#include #include @@ -827,29 +826,42 @@ void msm_common_set_pdata(struct snd_soc_card *card, pdata->common_pdata = common_pdata; } -static int auto_spf_dummy_ssr_cb(struct notifier_block *this, - unsigned long code, - void *data) +#define AUTO_VIRT_SNDCARD_ONLINE 0 +#define AUTO_VIRT_SNDCARD_OFFLINE 1 + +static long virt_sndcard_ioctl(struct file *f, + unsigned int cmd, unsigned long arg) { + int ret = 0; struct snd_soc_card *card = platform_get_drvdata(spdev); - switch (code) { - case SUBSYS_BEFORE_SHUTDOWN: + switch (cmd) { + case AUTO_VIRT_SNDCARD_OFFLINE: snd_soc_card_change_online_state(card, 0); // change sndcard status to OFFLINE dev_info(&spdev->dev, "ssr restart, mark sndcard offline\n"); break; - case SUBSYS_AFTER_POWERUP: + case AUTO_VIRT_SNDCARD_ONLINE: snd_soc_card_change_online_state(card, 1); // change sndcard status to ONLINE dev_info(&spdev->dev, "ssr complete, mark sndcard online\n"); break; default: + pr_err("%s: ioctl not found\n", __func__); + ret = -EFAULT; break; } - return 0; + + return ret; } -static struct notifier_block auto_spf_dummy_ssr_notifier = { - .notifier_call = auto_spf_dummy_ssr_cb, +static const struct file_operations virt_sndcard_ctl_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = virt_sndcard_ioctl, +}; + +static struct miscdevice virt_sndcard_ctl_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = "virt_sndcard_ctl", + .fops = &virt_sndcard_ctl_fops, }; static int msm_asoc_machine_probe(struct platform_device *pdev) @@ -915,8 +927,11 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) spdev = pdev; - subsys_notif_register_notifier("adsp", &auto_spf_dummy_ssr_notifier); - dev_info(&pdev->dev, "Audio driver register for SSR complete\n"); + ret = misc_register(&virt_sndcard_ctl_misc); + if (ret) { + pr_err("Audio virtual sndcard ctrl register fail, ret=%d\n", ret); + } + dev_info(&pdev->dev, "Audio virtual sndcard ctrl register complete\n"); return 0; err: @@ -926,7 +941,7 @@ err: static int msm_asoc_machine_remove(struct platform_device *pdev) { - + misc_deregister(&virt_sndcard_ctl_misc); return 0; }