From: Ajay Gupta <ajaykuee@gmail.com>
To: heikki.krogerus@linux.intel.com, wsa@the-dreams.de
Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org,
Ajay Gupta <ajayg@nvidia.com>
Subject: [PATCH v2 3/5] usb: typec: ucsi: ccg: enable runtime pm support
Date: Mon, 20 May 2019 11:37:48 -0700 [thread overview]
Message-ID: <20190520183750.2932-4-ajayg@nvidia.com> (raw)
In-Reply-To: <20190520183750.2932-1-ajayg@nvidia.com>
From: Ajay Gupta <ajayg@nvidia.com>
The change enables runtime pm support to UCSI CCG driver.
ucsi_send_command() is used in resume path and so exported
ucsi_send_command() symbol in ucsi.c for modular build.
Signed-off-by: Ajay Gupta <ajayg@nvidia.com>
---
Changes from v1->v2 : None
drivers/usb/typec/ucsi/ucsi.c | 1 +
drivers/usb/typec/ucsi/ucsi_ccg.c | 60 +++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 7850b851cecd..e9454134d399 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -206,6 +206,7 @@ int ucsi_send_command(struct ucsi *ucsi, struct ucsi_control *ctrl,
return ret;
}
+EXPORT_SYMBOL_GPL(ucsi_send_command);
/* -------------------------------------------------------------------------- */
diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c
index 9d46aa9e4e35..cc7094ecda2d 100644
--- a/drivers/usb/typec/ucsi/ucsi_ccg.c
+++ b/drivers/usb/typec/ucsi/ucsi_ccg.c
@@ -14,6 +14,8 @@
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/pm_runtime.h>
#include <asm/unaligned.h>
#include "ucsi.h"
@@ -210,6 +212,7 @@ static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len)
if (quirks && quirks->max_read_len)
max_read_len = quirks->max_read_len;
+ pm_runtime_get_sync(uc->dev);
while (rem_len > 0) {
msgs[1].buf = &data[len - rem_len];
rlen = min_t(u16, rem_len, max_read_len);
@@ -218,12 +221,14 @@ static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len)
status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
if (status < 0) {
dev_err(uc->dev, "i2c_transfer failed %d\n", status);
+ pm_runtime_put_sync(uc->dev);
return status;
}
rab += rlen;
rem_len -= rlen;
}
+ pm_runtime_put_sync(uc->dev);
return 0;
}
@@ -249,13 +254,16 @@ static int ccg_write(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len)
msgs[0].len = len + sizeof(rab);
msgs[0].buf = buf;
+ pm_runtime_get_sync(uc->dev);
status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
if (status < 0) {
dev_err(uc->dev, "i2c_transfer failed %d\n", status);
+ pm_runtime_put_sync(uc->dev);
kfree(buf);
return status;
}
+ pm_runtime_put_sync(uc->dev);
kfree(buf);
return 0;
}
@@ -1134,6 +1142,10 @@ static int ucsi_ccg_probe(struct i2c_client *client,
if (status)
dev_err(uc->dev, "cannot create sysfs group: %d\n", status);
+ pm_runtime_set_active(uc->dev);
+ pm_runtime_enable(uc->dev);
+ pm_runtime_idle(uc->dev);
+
return 0;
}
@@ -1143,6 +1155,7 @@ static int ucsi_ccg_remove(struct i2c_client *client)
cancel_work_sync(&uc->work);
ucsi_unregister_ppm(uc->ucsi);
+ pm_runtime_disable(uc->dev);
free_irq(uc->irq, uc);
sysfs_remove_group(&uc->dev->kobj, &ucsi_ccg_attr_group);
@@ -1155,9 +1168,56 @@ static const struct i2c_device_id ucsi_ccg_device_id[] = {
};
MODULE_DEVICE_TABLE(i2c, ucsi_ccg_device_id);
+static int ucsi_ccg_suspend(struct device *dev)
+{
+ return 0;
+}
+
+static int ucsi_ccg_resume(struct device *dev)
+{
+ struct i2c_client *client = to_i2c_client(dev);
+ struct ucsi_ccg *uc = i2c_get_clientdata(client);
+ struct ucsi *ucsi = uc->ucsi;
+ struct ucsi_control c;
+ int ret;
+
+ /* restore UCSI notification enable mask */
+ UCSI_CMD_SET_NTFY_ENABLE(c, UCSI_ENABLE_NTFY_ALL);
+ ret = ucsi_send_command(ucsi, &c, NULL, 0);
+ if (ret < 0) {
+ dev_err(uc->dev, "%s: failed to set notification enable - %d\n",
+ __func__, ret);
+ }
+ return 0;
+}
+
+static int ucsi_ccg_runtime_suspend(struct device *dev)
+{
+ return 0;
+}
+
+static int ucsi_ccg_runtime_resume(struct device *dev)
+{
+ return 0;
+}
+
+static int ucsi_ccg_runtime_idle(struct device *dev)
+{
+ return 0;
+}
+
+static const struct dev_pm_ops ucsi_ccg_pm = {
+ .suspend = ucsi_ccg_suspend,
+ .resume = ucsi_ccg_resume,
+ .runtime_suspend = ucsi_ccg_runtime_suspend,
+ .runtime_resume = ucsi_ccg_runtime_resume,
+ .runtime_idle = ucsi_ccg_runtime_idle,
+};
+
static struct i2c_driver ucsi_ccg_driver = {
.driver = {
.name = "ucsi_ccg",
+ .pm = &ucsi_ccg_pm,
},
.probe = ucsi_ccg_probe,
.remove = ucsi_ccg_remove,
--
2.17.1
next prev parent reply other threads:[~2019-05-20 18:39 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-20 18:37 [PATCH v2 0/5] usb: typec: ucsi: ccg: add runtime pm support Ajay Gupta
2019-05-20 18:37 ` [PATCH v2 1/5] i2c: nvidia-gpu: refactor master_xfer Ajay Gupta
2019-05-20 18:37 ` [PATCH v2 2/5] i2c: nvidia-gpu: add runtime pm support Ajay Gupta
2019-05-20 18:37 ` Ajay Gupta [this message]
2019-05-21 13:37 ` [PATCH v2 3/5] usb: typec: ucsi: ccg: enable " Heikki Krogerus
2019-05-21 13:49 ` Heikki Krogerus
2019-05-21 17:44 ` Ajay Gupta
2019-05-22 11:12 ` Heikki Krogerus
2019-05-20 18:37 ` [PATCH v2 4/5] i2c: nvidia-gpu: resume ccgx i2c client Ajay Gupta
2019-05-20 18:37 ` [PATCH v2 5/5] usb: typec: ucsi: ccg: add runtime pm workaround Ajay Gupta
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=20190520183750.2932-4-ajayg@nvidia.com \
--to=ajaykuee@gmail.com \
--cc=ajayg@nvidia.com \
--cc=heikki.krogerus@linux.intel.com \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=wsa@the-dreams.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.