* [PATCH] i2c: rk3x: support master_xfer_atomic
@ 2020-06-23 12:06 John Keeping
2020-07-03 10:08 ` Heiko Stuebner
2020-07-04 6:46 ` Wolfram Sang
0 siblings, 2 replies; 3+ messages in thread
From: John Keeping @ 2020-06-23 12:06 UTC (permalink / raw)
To: Heiko Stuebner
Cc: John Keeping, linux-arm-kernel, linux-rockchip, linux-i2c, linux-kernel
Enable i2c transactions in irq disabled contexts like poweroff where the
PMIC is connected via i2c.
Signed-off-by: John Keeping <john@metanate.com>
---
drivers/i2c/busses/i2c-rk3x.c | 39 +++++++++++++++++++++++++++++++----
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c
index 15324bfbc6cb..8e3cc85d1921 100644
--- a/drivers/i2c/busses/i2c-rk3x.c
+++ b/drivers/i2c/busses/i2c-rk3x.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
+#include <linux/iopoll.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/platform_device.h>
@@ -1040,8 +1041,21 @@ static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num)
return ret;
}
-static int rk3x_i2c_xfer(struct i2c_adapter *adap,
- struct i2c_msg *msgs, int num)
+static int rk3x_i2c_wait_xfer_poll(struct rk3x_i2c *i2c)
+{
+ ktime_t timeout = ktime_add_ms(ktime_get(), WAIT_TIMEOUT);
+
+ while (READ_ONCE(i2c->busy) &&
+ ktime_compare(ktime_get(), timeout) < 0) {
+ udelay(5);
+ rk3x_i2c_irq(0, i2c);
+ }
+
+ return !i2c->busy;
+}
+
+static int rk3x_i2c_xfer_common(struct i2c_adapter *adap,
+ struct i2c_msg *msgs, int num, bool polling)
{
struct rk3x_i2c *i2c = (struct rk3x_i2c *)adap->algo_data;
unsigned long timeout, flags;
@@ -1075,8 +1089,12 @@ static int rk3x_i2c_xfer(struct i2c_adapter *adap,
rk3x_i2c_start(i2c);
- timeout = wait_event_timeout(i2c->wait, !i2c->busy,
- msecs_to_jiffies(WAIT_TIMEOUT));
+ if (!polling) {
+ timeout = wait_event_timeout(i2c->wait, !i2c->busy,
+ msecs_to_jiffies(WAIT_TIMEOUT));
+ } else {
+ timeout = rk3x_i2c_wait_xfer_poll(i2c);
+ }
spin_lock_irqsave(&i2c->lock, flags);
@@ -1110,6 +1128,18 @@ static int rk3x_i2c_xfer(struct i2c_adapter *adap,
return ret < 0 ? ret : num;
}
+static int rk3x_i2c_xfer(struct i2c_adapter *adap,
+ struct i2c_msg *msgs, int num)
+{
+ return rk3x_i2c_xfer_common(adap, msgs, num, false);
+}
+
+static int rk3x_i2c_xfer_polling(struct i2c_adapter *adap,
+ struct i2c_msg *msgs, int num)
+{
+ return rk3x_i2c_xfer_common(adap, msgs, num, true);
+}
+
static __maybe_unused int rk3x_i2c_resume(struct device *dev)
{
struct rk3x_i2c *i2c = dev_get_drvdata(dev);
@@ -1126,6 +1156,7 @@ static u32 rk3x_i2c_func(struct i2c_adapter *adap)
static const struct i2c_algorithm rk3x_i2c_algorithm = {
.master_xfer = rk3x_i2c_xfer,
+ .master_xfer_atomic = rk3x_i2c_xfer_polling,
.functionality = rk3x_i2c_func,
};
--
2.27.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] i2c: rk3x: support master_xfer_atomic
2020-06-23 12:06 [PATCH] i2c: rk3x: support master_xfer_atomic John Keeping
@ 2020-07-03 10:08 ` Heiko Stuebner
2020-07-04 6:46 ` Wolfram Sang
1 sibling, 0 replies; 3+ messages in thread
From: Heiko Stuebner @ 2020-07-03 10:08 UTC (permalink / raw)
To: John Keeping; +Cc: linux-arm-kernel, linux-rockchip, linux-i2c, linux-kernel
Am Dienstag, 23. Juni 2020, 14:06:46 CEST schrieb John Keeping:
> Enable i2c transactions in irq disabled contexts like poweroff where the
> PMIC is connected via i2c.
>
> Signed-off-by: John Keeping <john@metanate.com>
on a rk3288:
Tested-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> ---
> drivers/i2c/busses/i2c-rk3x.c | 39 +++++++++++++++++++++++++++++++----
> 1 file changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c
> index 15324bfbc6cb..8e3cc85d1921 100644
> --- a/drivers/i2c/busses/i2c-rk3x.c
> +++ b/drivers/i2c/busses/i2c-rk3x.c
> @@ -10,6 +10,7 @@
> #include <linux/module.h>
> #include <linux/i2c.h>
> #include <linux/interrupt.h>
> +#include <linux/iopoll.h>
> #include <linux/errno.h>
> #include <linux/err.h>
> #include <linux/platform_device.h>
> @@ -1040,8 +1041,21 @@ static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num)
> return ret;
> }
>
> -static int rk3x_i2c_xfer(struct i2c_adapter *adap,
> - struct i2c_msg *msgs, int num)
> +static int rk3x_i2c_wait_xfer_poll(struct rk3x_i2c *i2c)
> +{
> + ktime_t timeout = ktime_add_ms(ktime_get(), WAIT_TIMEOUT);
> +
> + while (READ_ONCE(i2c->busy) &&
> + ktime_compare(ktime_get(), timeout) < 0) {
> + udelay(5);
> + rk3x_i2c_irq(0, i2c);
> + }
> +
> + return !i2c->busy;
> +}
> +
> +static int rk3x_i2c_xfer_common(struct i2c_adapter *adap,
> + struct i2c_msg *msgs, int num, bool polling)
> {
> struct rk3x_i2c *i2c = (struct rk3x_i2c *)adap->algo_data;
> unsigned long timeout, flags;
> @@ -1075,8 +1089,12 @@ static int rk3x_i2c_xfer(struct i2c_adapter *adap,
>
> rk3x_i2c_start(i2c);
>
> - timeout = wait_event_timeout(i2c->wait, !i2c->busy,
> - msecs_to_jiffies(WAIT_TIMEOUT));
> + if (!polling) {
> + timeout = wait_event_timeout(i2c->wait, !i2c->busy,
> + msecs_to_jiffies(WAIT_TIMEOUT));
> + } else {
> + timeout = rk3x_i2c_wait_xfer_poll(i2c);
> + }
>
> spin_lock_irqsave(&i2c->lock, flags);
>
> @@ -1110,6 +1128,18 @@ static int rk3x_i2c_xfer(struct i2c_adapter *adap,
> return ret < 0 ? ret : num;
> }
>
> +static int rk3x_i2c_xfer(struct i2c_adapter *adap,
> + struct i2c_msg *msgs, int num)
> +{
> + return rk3x_i2c_xfer_common(adap, msgs, num, false);
> +}
> +
> +static int rk3x_i2c_xfer_polling(struct i2c_adapter *adap,
> + struct i2c_msg *msgs, int num)
> +{
> + return rk3x_i2c_xfer_common(adap, msgs, num, true);
> +}
> +
> static __maybe_unused int rk3x_i2c_resume(struct device *dev)
> {
> struct rk3x_i2c *i2c = dev_get_drvdata(dev);
> @@ -1126,6 +1156,7 @@ static u32 rk3x_i2c_func(struct i2c_adapter *adap)
>
> static const struct i2c_algorithm rk3x_i2c_algorithm = {
> .master_xfer = rk3x_i2c_xfer,
> + .master_xfer_atomic = rk3x_i2c_xfer_polling,
> .functionality = rk3x_i2c_func,
> };
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] i2c: rk3x: support master_xfer_atomic
2020-06-23 12:06 [PATCH] i2c: rk3x: support master_xfer_atomic John Keeping
2020-07-03 10:08 ` Heiko Stuebner
@ 2020-07-04 6:46 ` Wolfram Sang
1 sibling, 0 replies; 3+ messages in thread
From: Wolfram Sang @ 2020-07-04 6:46 UTC (permalink / raw)
To: John Keeping
Cc: Heiko Stuebner, linux-arm-kernel, linux-rockchip, linux-i2c,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 258 bytes --]
On Tue, Jun 23, 2020 at 01:06:46PM +0100, John Keeping wrote:
> Enable i2c transactions in irq disabled contexts like poweroff where the
> PMIC is connected via i2c.
>
> Signed-off-by: John Keeping <john@metanate.com>
Applied to for-next, thanks!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-07-04 6:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-23 12:06 [PATCH] i2c: rk3x: support master_xfer_atomic John Keeping
2020-07-03 10:08 ` Heiko Stuebner
2020-07-04 6:46 ` Wolfram Sang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).