Commit ac63716d authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown

ASoC: Realtek/Maxim SoundWire codecs: disable pm_runtime on remove

When binding/unbinding codec drivers, the following warnings are
thrown:

[ 107.266879] rt715-sdca sdw:3:025d:0714:01: Unbalanced pm_runtime_enable!
[  306.879700] rt711-sdca sdw:0:025d:0711:01: Unbalanced pm_runtime_enable!

Add a remove callback for all Realtek/Maxim SoundWire codecs and remove this
warning.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRander Wang <rander.wang@intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20220606203752.144159-2-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5871321f
...@@ -862,6 +862,16 @@ static int max98373_sdw_probe(struct sdw_slave *slave, ...@@ -862,6 +862,16 @@ static int max98373_sdw_probe(struct sdw_slave *slave,
return max98373_init(slave, regmap); return max98373_init(slave, regmap);
} }
static int max98373_sdw_remove(struct sdw_slave *slave)
{
struct max98373_priv *max98373 = dev_get_drvdata(&slave->dev);
if (max98373->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0;
}
#if defined(CONFIG_OF) #if defined(CONFIG_OF)
static const struct of_device_id max98373_of_match[] = { static const struct of_device_id max98373_of_match[] = {
{ .compatible = "maxim,max98373", }, { .compatible = "maxim,max98373", },
...@@ -893,7 +903,7 @@ static struct sdw_driver max98373_sdw_driver = { ...@@ -893,7 +903,7 @@ static struct sdw_driver max98373_sdw_driver = {
.pm = &max98373_pm, .pm = &max98373_pm,
}, },
.probe = max98373_sdw_probe, .probe = max98373_sdw_probe,
.remove = NULL, .remove = max98373_sdw_remove,
.ops = &max98373_slave_ops, .ops = &max98373_slave_ops,
.id_table = max98373_id, .id_table = max98373_id,
}; };
......
...@@ -691,6 +691,16 @@ static int rt1308_sdw_probe(struct sdw_slave *slave, ...@@ -691,6 +691,16 @@ static int rt1308_sdw_probe(struct sdw_slave *slave,
return 0; return 0;
} }
static int rt1308_sdw_remove(struct sdw_slave *slave)
{
struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(&slave->dev);
if (rt1308->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0;
}
static const struct sdw_device_id rt1308_id[] = { static const struct sdw_device_id rt1308_id[] = {
SDW_SLAVE_ENTRY_EXT(0x025d, 0x1308, 0x2, 0, 0), SDW_SLAVE_ENTRY_EXT(0x025d, 0x1308, 0x2, 0, 0),
{}, {},
...@@ -750,6 +760,7 @@ static struct sdw_driver rt1308_sdw_driver = { ...@@ -750,6 +760,7 @@ static struct sdw_driver rt1308_sdw_driver = {
.pm = &rt1308_pm, .pm = &rt1308_pm,
}, },
.probe = rt1308_sdw_probe, .probe = rt1308_sdw_probe,
.remove = rt1308_sdw_remove,
.ops = &rt1308_slave_ops, .ops = &rt1308_slave_ops,
.id_table = rt1308_id, .id_table = rt1308_id,
}; };
......
...@@ -676,6 +676,16 @@ static int rt1316_sdw_probe(struct sdw_slave *slave, ...@@ -676,6 +676,16 @@ static int rt1316_sdw_probe(struct sdw_slave *slave,
return rt1316_sdw_init(&slave->dev, regmap, slave); return rt1316_sdw_init(&slave->dev, regmap, slave);
} }
static int rt1316_sdw_remove(struct sdw_slave *slave)
{
struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(&slave->dev);
if (rt1316->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0;
}
static const struct sdw_device_id rt1316_id[] = { static const struct sdw_device_id rt1316_id[] = {
SDW_SLAVE_ENTRY_EXT(0x025d, 0x1316, 0x3, 0x1, 0), SDW_SLAVE_ENTRY_EXT(0x025d, 0x1316, 0x3, 0x1, 0),
{}, {},
...@@ -735,6 +745,7 @@ static struct sdw_driver rt1316_sdw_driver = { ...@@ -735,6 +745,7 @@ static struct sdw_driver rt1316_sdw_driver = {
.pm = &rt1316_pm, .pm = &rt1316_pm,
}, },
.probe = rt1316_sdw_probe, .probe = rt1316_sdw_probe,
.remove = rt1316_sdw_remove,
.ops = &rt1316_slave_ops, .ops = &rt1316_slave_ops,
.id_table = rt1316_id, .id_table = rt1316_id,
}; };
......
...@@ -719,9 +719,12 @@ static int rt5682_sdw_remove(struct sdw_slave *slave) ...@@ -719,9 +719,12 @@ static int rt5682_sdw_remove(struct sdw_slave *slave)
{ {
struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev); struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev);
if (rt5682 && rt5682->hw_init) if (rt5682->hw_init)
cancel_delayed_work_sync(&rt5682->jack_detect_work); cancel_delayed_work_sync(&rt5682->jack_detect_work);
if (rt5682->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0; return 0;
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/soundwire/sdw_type.h> #include <linux/soundwire/sdw_type.h>
#include <linux/soundwire/sdw_registers.h> #include <linux/soundwire/sdw_registers.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <sound/soc.h> #include <sound/soc.h>
#include "rt700.h" #include "rt700.h"
...@@ -463,11 +464,14 @@ static int rt700_sdw_remove(struct sdw_slave *slave) ...@@ -463,11 +464,14 @@ static int rt700_sdw_remove(struct sdw_slave *slave)
{ {
struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev); struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev);
if (rt700 && rt700->hw_init) { if (rt700->hw_init) {
cancel_delayed_work_sync(&rt700->jack_detect_work); cancel_delayed_work_sync(&rt700->jack_detect_work);
cancel_delayed_work_sync(&rt700->jack_btn_check_work); cancel_delayed_work_sync(&rt700->jack_btn_check_work);
} }
if (rt700->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0; return 0;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/soundwire/sdw_registers.h> #include <linux/soundwire/sdw_registers.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h>
#include "rt711-sdca.h" #include "rt711-sdca.h"
#include "rt711-sdca-sdw.h" #include "rt711-sdca-sdw.h"
...@@ -364,11 +365,14 @@ static int rt711_sdca_sdw_remove(struct sdw_slave *slave) ...@@ -364,11 +365,14 @@ static int rt711_sdca_sdw_remove(struct sdw_slave *slave)
{ {
struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev); struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev);
if (rt711 && rt711->hw_init) { if (rt711->hw_init) {
cancel_delayed_work_sync(&rt711->jack_detect_work); cancel_delayed_work_sync(&rt711->jack_detect_work);
cancel_delayed_work_sync(&rt711->jack_btn_check_work); cancel_delayed_work_sync(&rt711->jack_btn_check_work);
} }
if (rt711->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0; return 0;
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/soundwire/sdw_type.h> #include <linux/soundwire/sdw_type.h>
#include <linux/soundwire/sdw_registers.h> #include <linux/soundwire/sdw_registers.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <sound/soc.h> #include <sound/soc.h>
#include "rt711.h" #include "rt711.h"
...@@ -464,12 +465,15 @@ static int rt711_sdw_remove(struct sdw_slave *slave) ...@@ -464,12 +465,15 @@ static int rt711_sdw_remove(struct sdw_slave *slave)
{ {
struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev); struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev);
if (rt711 && rt711->hw_init) { if (rt711->hw_init) {
cancel_delayed_work_sync(&rt711->jack_detect_work); cancel_delayed_work_sync(&rt711->jack_detect_work);
cancel_delayed_work_sync(&rt711->jack_btn_check_work); cancel_delayed_work_sync(&rt711->jack_btn_check_work);
cancel_work_sync(&rt711->calibration_work); cancel_work_sync(&rt711->calibration_work);
} }
if (rt711->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0; return 0;
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/soundwire/sdw_type.h> #include <linux/soundwire/sdw_type.h>
#include <linux/soundwire/sdw_registers.h> #include <linux/soundwire/sdw_registers.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <sound/soc.h> #include <sound/soc.h>
#include "rt715-sdca.h" #include "rt715-sdca.h"
...@@ -193,6 +194,16 @@ static int rt715_sdca_sdw_probe(struct sdw_slave *slave, ...@@ -193,6 +194,16 @@ static int rt715_sdca_sdw_probe(struct sdw_slave *slave,
return rt715_sdca_init(&slave->dev, mbq_regmap, regmap, slave); return rt715_sdca_init(&slave->dev, mbq_regmap, regmap, slave);
} }
static int rt715_sdca_sdw_remove(struct sdw_slave *slave)
{
struct rt715_sdca_priv *rt715 = dev_get_drvdata(&slave->dev);
if (rt715->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0;
}
static const struct sdw_device_id rt715_sdca_id[] = { static const struct sdw_device_id rt715_sdca_id[] = {
SDW_SLAVE_ENTRY_EXT(0x025d, 0x715, 0x3, 0x1, 0), SDW_SLAVE_ENTRY_EXT(0x025d, 0x715, 0x3, 0x1, 0),
SDW_SLAVE_ENTRY_EXT(0x025d, 0x714, 0x3, 0x1, 0), SDW_SLAVE_ENTRY_EXT(0x025d, 0x714, 0x3, 0x1, 0),
...@@ -267,6 +278,7 @@ static struct sdw_driver rt715_sdw_driver = { ...@@ -267,6 +278,7 @@ static struct sdw_driver rt715_sdw_driver = {
.pm = &rt715_pm, .pm = &rt715_pm,
}, },
.probe = rt715_sdca_sdw_probe, .probe = rt715_sdca_sdw_probe,
.remove = rt715_sdca_sdw_remove,
.ops = &rt715_sdca_slave_ops, .ops = &rt715_sdca_slave_ops,
.id_table = rt715_sdca_id, .id_table = rt715_sdca_id,
}; };
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/soundwire/sdw_type.h> #include <linux/soundwire/sdw_type.h>
#include <linux/soundwire/sdw_registers.h> #include <linux/soundwire/sdw_registers.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <sound/soc.h> #include <sound/soc.h>
...@@ -514,6 +515,16 @@ static int rt715_sdw_probe(struct sdw_slave *slave, ...@@ -514,6 +515,16 @@ static int rt715_sdw_probe(struct sdw_slave *slave,
return 0; return 0;
} }
static int rt715_sdw_remove(struct sdw_slave *slave)
{
struct rt715_priv *rt715 = dev_get_drvdata(&slave->dev);
if (rt715->first_hw_init)
pm_runtime_disable(&slave->dev);
return 0;
}
static const struct sdw_device_id rt715_id[] = { static const struct sdw_device_id rt715_id[] = {
SDW_SLAVE_ENTRY_EXT(0x025d, 0x714, 0x2, 0, 0), SDW_SLAVE_ENTRY_EXT(0x025d, 0x714, 0x2, 0, 0),
SDW_SLAVE_ENTRY_EXT(0x025d, 0x715, 0x2, 0, 0), SDW_SLAVE_ENTRY_EXT(0x025d, 0x715, 0x2, 0, 0),
...@@ -575,6 +586,7 @@ static struct sdw_driver rt715_sdw_driver = { ...@@ -575,6 +586,7 @@ static struct sdw_driver rt715_sdw_driver = {
.pm = &rt715_pm, .pm = &rt715_pm,
}, },
.probe = rt715_sdw_probe, .probe = rt715_sdw_probe,
.remove = rt715_sdw_remove,
.ops = &rt715_slave_ops, .ops = &rt715_slave_ops,
.id_table = rt715_id, .id_table = rt715_id,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment