aboutsummaryrefslogtreecommitdiffstats
path: root/meta-rcar-gen3-adas/recipes-bsp/u-boot/u-boot/00121-i2c-rcar_i2c-add-16bit-addressing.patch
blob: ccd0dcdb31b02a9ca9e0a989698722ce9f0b42e7 (plain)
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