From c641b5afa76e631162c373926ce0637d7f58284a Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Mon, 9 Dec 2019 16:32:08 +0800 Subject: [PATCH] Soundwire: register intel sdw master driver with driver_register() dev->power.no_pm_callbacks flag is used to check if there is pm ops for the device. Pm callback function will not be invoked if there is no pm ops. Currently the flag is true for sdw-master devices which is incorrect since we do have pm ops in intel_sdw_driver. As a result, intel_suspend() which is the suspend callback function of intel-sdw driver may not be invoked in system suspend. With driver_register() and setting md->dev.driver before device_register(), dev->power.no_pm_callbacks flag will be set to the correct value (false) by device_pm_check_callbacks() which will be triggered by device_register(). Signed-off-by: Bard Liao --- drivers/soundwire/intel.c | 2 ++ drivers/soundwire/intel_init.c | 10 ++++++++++ drivers/soundwire/master.c | 3 +-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 6a786c2c781f58..43bd3eee53e539 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "cadence_master.h" #include "bus.h" #include "intel.h" @@ -1654,6 +1655,7 @@ struct sdw_md_driver intel_sdw_driver = { .name = "intel-sdw", .owner = THIS_MODULE, .pm = &intel_pm, + .bus = &sdw_bus_type, }, .probe = intel_master_probe, .startup = intel_master_startup, diff --git a/drivers/soundwire/intel_init.c b/drivers/soundwire/intel_init.c index b3f9ca2382e3f0..dc04a22da6fe0d 100644 --- a/drivers/soundwire/intel_init.c +++ b/drivers/soundwire/intel_init.c @@ -185,6 +185,7 @@ static struct sdw_intel_ctx struct sdw_master_device *md; u32 link_mask; int count; + int err; int i; if (!res) @@ -218,6 +219,12 @@ static struct sdw_intel_ctx INIT_LIST_HEAD(&ctx->link_list); + err = driver_register(&intel_sdw_driver.driver); + if (err) { + dev_err(&adev->dev, "failed to register sdw master driver\n"); + goto register_err; + } + /* Create SDW Master devices */ for (i = 0; i < count; i++, link++) { if (link_mask && !(link_mask & BIT(i))) @@ -252,6 +259,8 @@ static struct sdw_intel_ctx err: sdw_intel_cleanup(ctx); link_err: + driver_unregister(&intel_sdw_driver.driver); +register_err: kfree(ctx); return NULL; } @@ -395,6 +404,7 @@ EXPORT_SYMBOL(sdw_intel_startup); void sdw_intel_exit(struct sdw_intel_ctx *ctx) { sdw_intel_cleanup(ctx); + driver_unregister(&intel_sdw_driver.driver); kfree(ctx); } EXPORT_SYMBOL(sdw_intel_exit); diff --git a/drivers/soundwire/master.c b/drivers/soundwire/master.c index d23111d43fd6f3..44f70ea67ae3ae 100644 --- a/drivers/soundwire/master.c +++ b/drivers/soundwire/master.c @@ -46,6 +46,7 @@ struct sdw_master_device *sdw_md_add(struct sdw_md_driver *driver, md->dev.type = &sdw_md_type; md->dev.dma_mask = md->dev.parent->dma_mask; dev_set_name(&md->dev, "sdw-master-%d", md->link_id); + md->dev.driver = &driver->driver; ret = device_register(&md->dev); if (ret) { @@ -57,8 +58,6 @@ struct sdw_master_device *sdw_md_add(struct sdw_md_driver *driver, put_device(&md->dev); } - md->dev.driver = &driver->driver; - return md; } EXPORT_SYMBOL(sdw_md_add);