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; }