From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Mario Limonciello <mario.limonciello@amd.com>,
Jarkko Nikula <jarkko.nikula@linux.intel.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Wolfram Sang <wsa@kernel.org>,
linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>,
Jan Dabros <jsd@semihalf.com>, Andi Shyti <andi.shyti@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>
Subject: [PATCH v4 18/24] i2c: designware: Consolidate PM ops
Date: Mon, 20 Nov 2023 16:42:00 +0200 [thread overview]
Message-ID: <20231120144641.1660574-19-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20231120144641.1660574-1-andriy.shevchenko@linux.intel.com>
We have the same (*) PM ops in the PCI and plaform drivers.
Instead, consolidate that PM ops under exported variable and
deduplicate them.
*)
With the subtle ACPI and P-Unit behaviour differences in PCI case.
But this is not a problem as for ACPI we need to take care of the
P-Unit semaphore anyway and calling PM ops for ACPI makes sense as
it might provide specific operation regions in (however there are
no known devices on market that are using it with PCI enabled I2C).
Note, the clocks are not in use in the PCI case.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/i2c/busses/i2c-designware-common.c | 62 ++++++++++++++++++++
drivers/i2c/busses/i2c-designware-core.h | 5 +-
drivers/i2c/busses/i2c-designware-pcidrv.c | 44 +-------------
drivers/i2c/busses/i2c-designware-platdrv.c | 64 +--------------------
4 files changed, 69 insertions(+), 106 deletions(-)
diff --git a/drivers/i2c/busses/i2c-designware-common.c b/drivers/i2c/busses/i2c-designware-common.c
index 5b1a597cb5dd..7c877e380605 100644
--- a/drivers/i2c/busses/i2c-designware-common.c
+++ b/drivers/i2c/busses/i2c-designware-common.c
@@ -21,6 +21,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/pm.h>
#include <linux/pm_runtime.h>
#include <linux/property.h>
#include <linux/regmap.h>
@@ -713,5 +714,66 @@ void i2c_dw_disable(struct dw_i2c_dev *dev)
}
EXPORT_SYMBOL_GPL(i2c_dw_disable);
+static int i2c_dw_prepare(struct device *device)
+{
+ /*
+ * If the ACPI companion device object is present for this device,
+ * it may be accessed during suspend and resume of other devices via
+ * I2C operation regions, so tell the PM core and middle layers to
+ * avoid skipping system suspend/resume callbacks for it in that case.
+ */
+ return !has_acpi_companion(device);
+}
+
+static int i2c_dw_runtime_suspend(struct device *device)
+{
+ struct dw_i2c_dev *dev = dev_get_drvdata(device);
+
+ if (dev->shared_with_punit)
+ return 0;
+
+ i2c_dw_disable(dev);
+ i2c_dw_prepare_clk(dev, false);
+
+ return 0;
+}
+
+static int i2c_dw_suspend(struct device *device)
+{
+ struct dw_i2c_dev *dev = dev_get_drvdata(device);
+
+ i2c_mark_adapter_suspended(&dev->adapter);
+
+ return i2c_dw_runtime_suspend(device);
+}
+
+static int i2c_dw_runtime_resume(struct device *device)
+{
+ struct dw_i2c_dev *dev = dev_get_drvdata(device);
+
+ if (!dev->shared_with_punit)
+ i2c_dw_prepare_clk(dev, true);
+
+ dev->init(dev);
+
+ return 0;
+}
+
+static int i2c_dw_resume(struct device *device)
+{
+ struct dw_i2c_dev *dev = dev_get_drvdata(device);
+
+ i2c_dw_runtime_resume(device);
+ i2c_mark_adapter_resumed(&dev->adapter);
+
+ return 0;
+}
+
+EXPORT_GPL_DEV_PM_OPS(i2c_dw_dev_pm_ops) = {
+ .prepare = pm_sleep_ptr(i2c_dw_prepare),
+ LATE_SYSTEM_SLEEP_PM_OPS(i2c_dw_suspend, i2c_dw_resume)
+ RUNTIME_PM_OPS(i2c_dw_runtime_suspend, i2c_dw_runtime_resume, NULL)
+};
+
MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter core");
MODULE_LICENSE("GPL");
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
index 52667d670363..f6ebf86dcc6f 100644
--- a/drivers/i2c/busses/i2c-designware-core.h
+++ b/drivers/i2c/busses/i2c-designware-core.h
@@ -15,6 +15,7 @@
#include <linux/dev_printk.h>
#include <linux/errno.h>
#include <linux/i2c.h>
+#include <linux/pm.h>
#include <linux/regmap.h>
#include <linux/types.h>
@@ -337,7 +338,8 @@ int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev);
int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev);
int i2c_dw_set_fifo_size(struct dw_i2c_dev *dev);
u32 i2c_dw_func(struct i2c_adapter *adap);
-void i2c_dw_disable(struct dw_i2c_dev *dev);
+
+extern const struct dev_pm_ops i2c_dw_dev_pm_ops;
static inline void __i2c_dw_enable(struct dw_i2c_dev *dev)
{
@@ -352,6 +354,7 @@ static inline void __i2c_dw_disable_nowait(struct dw_i2c_dev *dev)
}
void __i2c_dw_disable(struct dw_i2c_dev *dev);
+void i2c_dw_disable(struct dw_i2c_dev *dev);
extern void i2c_dw_configure_master(struct dw_i2c_dev *dev);
extern int i2c_dw_probe_master(struct dw_i2c_dev *dev);
diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c
index 20571812d150..df47ba04c9ee 100644
--- a/drivers/i2c/busses/i2c-designware-pcidrv.c
+++ b/drivers/i2c/busses/i2c-designware-pcidrv.c
@@ -19,6 +19,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
+#include <linux/pm.h>
#include <linux/pm_runtime.h>
#include <linux/power_supply.h>
#include <linux/sched.h>
@@ -194,47 +195,6 @@ static struct dw_pci_controller dw_pci_controllers[] = {
},
};
-static int __maybe_unused i2c_dw_pci_runtime_suspend(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- i2c_dw_disable(i_dev);
- return 0;
-}
-
-static int __maybe_unused i2c_dw_pci_suspend(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- i2c_mark_adapter_suspended(&i_dev->adapter);
-
- return i2c_dw_pci_runtime_suspend(dev);
-}
-
-static int __maybe_unused i2c_dw_pci_runtime_resume(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- return i_dev->init(i_dev);
-}
-
-static int __maybe_unused i2c_dw_pci_resume(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
- int ret;
-
- ret = i2c_dw_pci_runtime_resume(dev);
-
- i2c_mark_adapter_resumed(&i_dev->adapter);
-
- return ret;
-}
-
-static const struct dev_pm_ops i2c_dw_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(i2c_dw_pci_suspend, i2c_dw_pci_resume)
- SET_RUNTIME_PM_OPS(i2c_dw_pci_runtime_suspend, i2c_dw_pci_runtime_resume, NULL)
-};
-
static const struct property_entry dgpu_properties[] = {
/* USB-C doesn't power the system */
PROPERTY_ENTRY_U8("scope", POWER_SUPPLY_SCOPE_DEVICE),
@@ -402,7 +362,7 @@ static struct pci_driver dw_i2c_driver = {
.probe = i2c_dw_pci_probe,
.remove = i2c_dw_pci_remove,
.driver = {
- .pm = &i2c_dw_pm_ops,
+ .pm = pm_ptr(&i2c_dw_dev_pm_ops),
},
.id_table = i2c_designware_pci_ids,
};
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 9b249d27841d..d9a64006a3d6 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -29,7 +29,6 @@
#include <linux/reset.h>
#include <linux/sched.h>
#include <linux/slab.h>
-#include <linux/suspend.h>
#include <linux/units.h>
#include "i2c-designware-core.h"
@@ -349,67 +348,6 @@ static void dw_i2c_plat_remove(struct platform_device *pdev)
pm_runtime_put_sync(&pdev->dev);
}
-static int dw_i2c_plat_prepare(struct device *dev)
-{
- /*
- * If the ACPI companion device object is present for this device, it
- * may be accessed during suspend and resume of other devices via I2C
- * operation regions, so tell the PM core and middle layers to avoid
- * skipping system suspend/resume callbacks for it in that case.
- */
- return !has_acpi_companion(dev);
-}
-
-static int dw_i2c_plat_runtime_suspend(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- if (i_dev->shared_with_punit)
- return 0;
-
- i2c_dw_disable(i_dev);
- i2c_dw_prepare_clk(i_dev, false);
-
- return 0;
-}
-
-static int dw_i2c_plat_suspend(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- i2c_mark_adapter_suspended(&i_dev->adapter);
-
- return dw_i2c_plat_runtime_suspend(dev);
-}
-
-static int dw_i2c_plat_runtime_resume(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- if (!i_dev->shared_with_punit)
- i2c_dw_prepare_clk(i_dev, true);
-
- i_dev->init(i_dev);
-
- return 0;
-}
-
-static int dw_i2c_plat_resume(struct device *dev)
-{
- struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
-
- dw_i2c_plat_runtime_resume(dev);
- i2c_mark_adapter_resumed(&i_dev->adapter);
-
- return 0;
-}
-
-static const struct dev_pm_ops dw_i2c_dev_pm_ops = {
- .prepare = pm_sleep_ptr(dw_i2c_plat_prepare),
- LATE_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
- RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend, dw_i2c_plat_runtime_resume, NULL)
-};
-
static const struct of_device_id dw_i2c_of_match[] = {
{ .compatible = "snps,designware-i2c", },
{ .compatible = "mscc,ocelot-i2c", .data = (void *)MODEL_MSCC_OCELOT },
@@ -451,7 +389,7 @@ static struct platform_driver dw_i2c_driver = {
.name = "i2c_designware",
.of_match_table = dw_i2c_of_match,
.acpi_match_table = dw_i2c_acpi_match,
- .pm = pm_ptr(&dw_i2c_dev_pm_ops),
+ .pm = pm_ptr(&i2c_dw_dev_pm_ops),
},
.id_table = dw_i2c_platform_ids,
};
--
2.43.0.rc1.1.gbec44491f096
next prev parent reply other threads:[~2023-11-20 14:47 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-20 14:41 [PATCH v4 00/24] i2c: designware: code consolidation & cleanups Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 01/24] i2c: designware: Fix PM calls order in dw_i2c_plat_probe() Andy Shevchenko
2023-11-26 21:48 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 02/24] i2c: designware: Fix reset call " Andy Shevchenko
2023-11-26 21:57 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 03/24] i2c: designware: Let PCI core to take care about interrupt vectors Andy Shevchenko
2023-11-26 22:03 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 04/24] i2c: designware: Fix lock probe call order in dw_i2c_plat_probe() Andy Shevchenko
2023-11-26 22:23 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 05/24] i2c: designware: Replace a while-loop by for-loop Andy Shevchenko
2023-11-26 22:27 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 06/24] i2c: designware: Save pointer to semaphore callbacks instead of index Andy Shevchenko
2023-11-26 22:38 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 07/24] i2c: designware: Add missing 'c' into PCI IDs variable name Andy Shevchenko
2023-11-27 23:54 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 08/24] i2c: designware: Replace MODULE_ALIAS() with MODULE_DEVICE_TABLE() Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 09/24] i2c: designware: Unify terminator in device ID tables Andy Shevchenko
2023-11-27 23:56 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 10/24] i2c: designware: Always provide " Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 11/24] i2c: designware: Drop return value from i2c_dw_acpi_configure() Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 12/24] i2c: designware: Drop return value from dw_i2c_of_configure() Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 13/24] i2c: designware: Rename dw_i2c_of_configure() -> i2c_dw_of_configure() Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 14/24] i2c: designware: Consolidate firmware parsing and configuring code Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 15/24] i2c: designware: Unify the firmware type checks Andy Shevchenko
2023-11-20 14:41 ` [PATCH v4 16/24] i2c: designware: Move exports to I2C_DW namespaces Andy Shevchenko
2023-11-28 17:48 ` Andi Shyti
2023-11-20 14:41 ` [PATCH v4 17/24] i2c: designware: Remove ->disable() callback Andy Shevchenko
2023-11-29 0:47 ` Andi Shyti
2023-11-20 14:42 ` Andy Shevchenko [this message]
2023-11-29 23:08 ` [PATCH v4 18/24] i2c: designware: Consolidate PM ops Andi Shyti
2023-11-20 14:42 ` [PATCH v4 19/24] i2c: designware: Uninline i2c_dw_probe() Andy Shevchenko
2023-11-29 23:21 ` Andi Shyti
2023-11-30 13:28 ` Andy Shevchenko
2023-12-03 22:06 ` Andi Shyti
2023-11-20 14:42 ` [PATCH v4 20/24] i2c: designware: Propagate firmware node Andy Shevchenko
2023-11-29 23:09 ` Andi Shyti
2023-11-20 14:42 ` [PATCH v4 21/24] i2c: designware: Use pci_get_drvdata() Andy Shevchenko
2023-11-29 23:10 ` Andi Shyti
2023-11-20 14:42 ` [PATCH v4 22/24] i2c: designware: Use temporary variable for struct device Andy Shevchenko
2023-11-29 23:12 ` Andi Shyti
2023-11-20 14:42 ` [PATCH v4 23/24] i2c: designware: Get rid of redundant 'else' Andy Shevchenko
2023-11-20 14:42 ` [PATCH v4 24/24] i2c: designware: Fix spelling and other issues in the comments Andy Shevchenko
2023-11-29 23:20 ` Andi Shyti
2023-11-21 14:30 ` [PATCH v4 00/24] i2c: designware: code consolidation & cleanups Jarkko Nikula
2023-11-21 16:08 ` Serge Semin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231120144641.1660574-19-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=andi.shyti@kernel.org \
--cc=herbert@gondor.apana.org.au \
--cc=jarkko.nikula@linux.intel.com \
--cc=jsd@semihalf.com \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=mika.westerberg@linux.intel.com \
--cc=p.zabel@pengutronix.de \
--cc=wsa@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox