diff --git a/dsp/adsp-loader.c b/dsp/adsp-loader.c index cc995db906..5afd48cd8d 100644 --- a/dsp/adsp-loader.c +++ b/dsp/adsp-loader.c @@ -26,12 +26,17 @@ #define Q6_PIL_GET_DELAY_MS 100 #define BOOT_CMD 1 +#define SSR_RESET_CMD 1 #define IMAGE_UNLOAD_CMD 0 static ssize_t adsp_boot_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count); +static ssize_t adsp_ssr_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count); + struct adsp_loader_private { void *pil_h; struct kobject *boot_adsp_obj; @@ -41,8 +46,12 @@ struct adsp_loader_private { static struct kobj_attribute adsp_boot_attribute = __ATTR(boot, 0220, NULL, adsp_boot_store); +static struct kobj_attribute adsp_ssr_attribute = + __ATTR(ssr, 0220, NULL, adsp_ssr_store); + static struct attribute *attrs[] = { &adsp_boot_attribute.attr, + &adsp_ssr_attribute.attr, NULL, }; @@ -151,6 +160,46 @@ static void adsp_loader_do(struct platform_device *pdev) schedule_work(&adsp_ldr_work); } +static ssize_t adsp_ssr_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, + size_t count) +{ + int ssr_command = 0; + struct subsys_device *adsp_dev = NULL; + struct platform_device *pdev = adsp_private; + struct adsp_loader_private *priv = NULL; + int rc; + + dev_dbg(&pdev->dev, "%s: going to call adsp ssr\n ", __func__); + + if (kstrtoint(buf, 10, &ssr_command) < 0) + return -EINVAL; + + if (ssr_command != SSR_RESET_CMD) + return -EINVAL; + + priv = platform_get_drvdata(pdev); + if (!priv) + return -EINVAL; + + adsp_dev = (struct subsys_device *)priv->pil_h; + if (!adsp_dev) + return -EINVAL; + + dev_err(&pdev->dev, "requesting for ADSP restart\n"); + + /* subsystem_restart_dev has worker queue to handle */ + rc = subsystem_restart_dev(adsp_dev); + if (rc) { + dev_err(&pdev->dev, "subsystem_restart_dev failed\n"); + return rc; + } + + dev_dbg(&pdev->dev, "ADSP restarted\n"); + return count; +} + static ssize_t adsp_boot_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf,