2020-05-01 09:58:50 -05:00
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2019-04-12 11:08:59 -05:00
//
// This file is provided under a dual BSD/GPLv2 license. When using or
// redistributing this file, you may do so under either license.
//
// Copyright(c) 2018 Intel Corporation. All rights reserved.
//
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
//
# include <linux/acpi.h>
# include <linux/firmware.h>
# include <linux/module.h>
# include <linux/pm_runtime.h>
# include <sound/soc-acpi.h>
# include <sound/soc-acpi-intel-match.h>
# include <sound/sof.h>
2019-05-30 06:50:11 -05:00
# include "../intel/common/soc-intel-quirks.h"
2019-04-12 11:08:59 -05:00
# include "ops.h"
2021-03-01 18:31:20 -06:00
# include "sof-acpi-dev.h"
2019-04-12 11:08:59 -05:00
/* platform specific devices */
# include "intel/shim.h"
static char * fw_path ;
module_param ( fw_path , charp , 0444 ) ;
MODULE_PARM_DESC ( fw_path , " alternate path for SOF firmware. " ) ;
static char * tplg_path ;
module_param ( tplg_path , charp , 0444 ) ;
MODULE_PARM_DESC ( tplg_path , " alternate path for SOF topology. " ) ;
2019-10-08 11:44:37 -05:00
static int sof_acpi_debug ;
module_param_named ( sof_acpi_debug , sof_acpi_debug , int , 0444 ) ;
MODULE_PARM_DESC ( sof_acpi_debug , " SOF ACPI debug options (0x0 all off) " ) ;
# define SOF_ACPI_DISABLE_PM_RUNTIME BIT(0)
2021-03-01 18:31:20 -06:00
const struct dev_pm_ops sof_acpi_pm = {
2019-04-12 11:08:59 -05:00
SET_SYSTEM_SLEEP_PM_OPS ( snd_sof_suspend , snd_sof_resume )
SET_RUNTIME_PM_OPS ( snd_sof_runtime_suspend , snd_sof_runtime_resume ,
2019-07-02 16:24:27 +03:00
snd_sof_runtime_idle )
2019-04-12 11:08:59 -05:00
} ;
2021-03-01 18:31:20 -06:00
EXPORT_SYMBOL_NS ( sof_acpi_pm , SND_SOC_SOF_ACPI_DEV ) ;
2019-04-12 11:08:59 -05:00
static void sof_acpi_probe_complete ( struct device * dev )
{
2020-08-24 15:09:10 -05:00
dev_dbg ( dev , " Completing SOF ACPI probe " ) ;
2019-10-08 11:44:37 -05:00
if ( sof_acpi_debug & SOF_ACPI_DISABLE_PM_RUNTIME )
return ;
2019-04-12 11:08:59 -05:00
/* allow runtime_pm */
pm_runtime_set_autosuspend_delay ( dev , SND_SOF_SUSPEND_DELAY_MS ) ;
pm_runtime_use_autosuspend ( dev ) ;
pm_runtime_enable ( dev ) ;
}
2021-03-01 18:31:20 -06:00
int sof_acpi_probe ( struct platform_device * pdev , const struct sof_dev_desc * desc )
2019-04-12 11:08:59 -05:00
{
struct device * dev = & pdev - > dev ;
struct snd_sof_pdata * sof_pdata ;
2020-11-12 16:38:18 -06:00
dev_dbg ( dev , " ACPI DSP detected " ) ;
2019-04-12 11:08:59 -05:00
sof_pdata = devm_kzalloc ( dev , sizeof ( * sof_pdata ) , GFP_KERNEL ) ;
if ( ! sof_pdata )
return - ENOMEM ;
2021-05-21 12:27:58 +03:00
if ( ! desc - > ops ) {
2019-04-12 11:08:59 -05:00
dev_err ( dev , " error: no matching ACPI descriptor ops \n " ) ;
return - ENODEV ;
}
sof_pdata - > desc = desc ;
sof_pdata - > dev = & pdev - > dev ;
2022-04-14 13:48:06 -05:00
sof_pdata - > fw_filename = desc - > default_fw_filename [ SOF_IPC ] ;
2019-04-12 11:08:59 -05:00
/* alternate fw and tplg filenames ? */
if ( fw_path )
sof_pdata - > fw_filename_prefix = fw_path ;
else
sof_pdata - > fw_filename_prefix =
2022-04-14 13:48:04 -05:00
sof_pdata - > desc - > default_fw_path [ SOF_IPC ] ;
2019-04-12 11:08:59 -05:00
if ( tplg_path )
sof_pdata - > tplg_filename_prefix = tplg_path ;
else
sof_pdata - > tplg_filename_prefix =
2022-04-14 13:48:04 -05:00
sof_pdata - > desc - > default_tplg_path [ SOF_IPC ] ;
2019-04-12 11:08:59 -05:00
2021-04-09 15:09:59 -07:00
/* set callback to be called on successful device probe to enable runtime_pm */
2019-04-12 11:08:59 -05:00
sof_pdata - > sof_probe_complete = sof_acpi_probe_complete ;
2021-04-09 15:09:59 -07:00
/* call sof helper for DSP hardware probe */
return snd_sof_device_probe ( dev , sof_pdata ) ;
2019-04-12 11:08:59 -05:00
}
2021-03-01 18:31:20 -06:00
EXPORT_SYMBOL_NS ( sof_acpi_probe , SND_SOC_SOF_ACPI_DEV ) ;
2019-04-12 11:08:59 -05:00
2021-03-01 18:31:20 -06:00
int sof_acpi_remove ( struct platform_device * pdev )
2019-04-12 11:08:59 -05:00
{
2021-03-01 18:31:20 -06:00
struct device * dev = & pdev - > dev ;
2019-10-08 11:44:37 -05:00
if ( ! ( sof_acpi_debug & SOF_ACPI_DISABLE_PM_RUNTIME ) )
2021-03-01 18:31:20 -06:00
pm_runtime_disable ( dev ) ;
2019-04-12 11:08:59 -05:00
/* call sof helper for DSP hardware remove */
2021-03-01 18:31:20 -06:00
snd_sof_device_remove ( dev ) ;
2019-04-12 11:08:59 -05:00
return 0 ;
}
2021-03-01 18:31:20 -06:00
EXPORT_SYMBOL_NS ( sof_acpi_remove , SND_SOC_SOF_ACPI_DEV ) ;
2019-04-12 11:08:59 -05:00
MODULE_LICENSE ( " Dual BSD/GPL " ) ;