1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
From ae18804d5b0542066b92d6f269748cd0e860b37f Mon Sep 17 00:00:00 2001
From: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
Date: Fri, 16 Feb 2018 22:13:02 +0300
Subject: [PATCH] i2c: rcar_i2c: add 16bit addressing
This adds 16bit addressing for RCAR I2C
Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
---
drivers/i2c/rcar_i2c.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/drivers/i2c/rcar_i2c.c b/drivers/i2c/rcar_i2c.c
index 90ad116..017ae0b 100644
--- a/drivers/i2c/rcar_i2c.c
+++ b/drivers/i2c/rcar_i2c.c
@@ -88,9 +88,21 @@ static void rcar_i2c_raw_rw_finish(struct rcar_i2c *dev)
}
static int
-rcar_i2c_raw_write(struct rcar_i2c *dev, u8 chip, uint addr, u8 *val, int size)
+rcar_i2c_raw_write(struct rcar_i2c *dev, u8 chip, uint addr, int alen, u8 *val, int size)
{
- rcar_i2c_raw_rw_common(dev, chip, addr);
+ if (alen == sizeof(u8)) {
+ rcar_i2c_raw_rw_common(dev, chip, addr);
+ } else {
+ rcar_i2c_raw_rw_common(dev, chip, addr >> 8);
+
+ /* set send date */
+ writel(addr & 0xff, &dev->icrxdtxd);
+ /* start SCLclk */
+ writel(~MSR_MDE, &dev->icmsr);
+
+ while (!(readl(&dev->icmsr) & MSR_MDE))
+ udelay(10);
+ }
/* set send date */
writel(*val, &dev->icrxdtxd);
@@ -111,11 +123,23 @@ rcar_i2c_raw_write(struct rcar_i2c *dev, u8 chip, uint addr, u8 *val, int size)
}
static u8
-rcar_i2c_raw_read(struct rcar_i2c *dev, u8 chip, uint addr)
+rcar_i2c_raw_read(struct rcar_i2c *dev, u8 chip, uint addr, int alen)
{
u8 ret;
- rcar_i2c_raw_rw_common(dev, chip, addr);
+ if (alen == sizeof(u8)) {
+ rcar_i2c_raw_rw_common(dev, chip, addr);
+ } else {
+ rcar_i2c_raw_rw_common(dev, chip, addr >> 8);
+
+ /* set send date */
+ writel(addr & 0xff, &dev->icrxdtxd);
+ /* start SCLclk */
+ writel(~MSR_MDE, &dev->icmsr);
+
+ while (!(readl(&dev->icmsr) & MSR_MDE))
+ udelay(10);
+ }
/* set slave address, receive */
writel((chip << 1) | 1, &dev->icmar);
@@ -236,7 +260,7 @@ static int rcar_i2c_read(struct i2c_adapter *adap, uint8_t chip,
int i;
for (i = 0; i < len; i++)
- data[i] = rcar_i2c_raw_read(dev, chip, addr + i);
+ data[i] = rcar_i2c_raw_read(dev, chip, addr + i, alen);
return 0;
}
@@ -245,7 +269,8 @@ static int rcar_i2c_write(struct i2c_adapter *adap, uint8_t chip, uint addr,
int alen, u8 *data, int len)
{
struct rcar_i2c *dev = (struct rcar_i2c *)i2c_dev[adap->hwadapnr];
- return rcar_i2c_raw_write(dev, chip, addr, data, len);
+
+ return rcar_i2c_raw_write(dev, chip, addr, alen, data, len);
}
static int
--
1.9.1
|