@@ -1067,6 +1067,7 @@ static int cs35l41_hda_bind(struct device *dev, struct device *master, void *mas
{
struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
struct hda_component *comps = master_data;
+ unsigned int sleep_flags;
int ret = 0;
if (!comps || cs35l41->index < 0 || cs35l41->index >= HDA_MAX_COMPONENTS)
@@ -1106,6 +1107,11 @@ static int cs35l41_hda_bind(struct device *dev, struct device *master, void *mas
mutex_unlock(&cs35l41->fw_mutex);
+ sleep_flags = lock_system_sleep();
+ if (!device_link_add(&comps->codec->core.dev, cs35l41->dev, DL_FLAG_STATELESS))
+ dev_warn(dev, "Unable to create device link\n");
+ unlock_system_sleep(sleep_flags);
+
pm_runtime_mark_last_busy(dev);
pm_runtime_put_autosuspend(dev);
@@ -1116,9 +1122,14 @@ static void cs35l41_hda_unbind(struct device *dev, struct device *master, void *
{
struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev);
struct hda_component *comps = master_data;
+ unsigned int sleep_flags;
- if (comps[cs35l41->index].dev == dev)
+ if (comps[cs35l41->index].dev == dev) {
memset(&comps[cs35l41->index], 0, sizeof(*comps));
+ sleep_flags = lock_system_sleep();
+ device_link_remove(&comps->codec->core.dev, cs35l41->dev);
+ unlock_system_sleep(sleep_flags);
+ }
}
static const struct component_ops cs35l41_hda_comp_ops = {