]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/i2c/i2c-gpio.c
eeprom: fix eeprom write procedure
[people/ms/u-boot.git] / drivers / i2c / i2c-gpio.c
1 /*
2 * (C) Copyright 2015, Samsung Electronics
3 * Przemyslaw Marczak <p.marczak@samsung.com>
4 *
5 * This file is based on: drivers/i2c/soft-i2c.c,
6 * with added driver-model support and code cleanup.
7 */
8 #include <common.h>
9 #include <errno.h>
10 #include <dm.h>
11 #include <i2c.h>
12 #include <asm/gpio.h>
13
14 #define DEFAULT_UDELAY 5
15 #define RETRIES 0
16 #define I2C_ACK 0
17 #define I2C_NOACK 1
18
19 DECLARE_GLOBAL_DATA_PTR;
20
21 enum {
22 PIN_SDA = 0,
23 PIN_SCL,
24 PIN_COUNT,
25 };
26
27 struct i2c_gpio_bus {
28 /**
29 * udelay - delay [us] between GPIO toggle operations,
30 * which is 1/4 of I2C speed clock period.
31 */
32 int udelay;
33 /* sda, scl */
34 struct gpio_desc gpios[PIN_COUNT];
35 };
36
37 static int i2c_gpio_sda_get(struct gpio_desc *sda)
38 {
39 return dm_gpio_get_value(sda);
40 }
41
42 static void i2c_gpio_sda_set(struct gpio_desc *sda, int bit)
43 {
44 if (bit)
45 dm_gpio_set_dir_flags(sda, GPIOD_IS_IN);
46 else
47 dm_gpio_set_dir_flags(sda, GPIOD_IS_OUT);
48 }
49
50 static void i2c_gpio_scl_set(struct gpio_desc *scl, int bit)
51 {
52 ulong flags = GPIOD_IS_OUT;
53
54 if (bit)
55 flags |= GPIOD_IS_OUT_ACTIVE;
56 dm_gpio_set_dir_flags(scl, flags);
57 }
58
59 static void i2c_gpio_write_bit(struct gpio_desc *scl, struct gpio_desc *sda,
60 int delay, uchar bit)
61 {
62 i2c_gpio_scl_set(scl, 0);
63 udelay(delay);
64 i2c_gpio_sda_set(sda, bit);
65 udelay(delay);
66 i2c_gpio_scl_set(scl, 1);
67 udelay(2 * delay);
68 }
69
70 static int i2c_gpio_read_bit(struct gpio_desc *scl, struct gpio_desc *sda,
71 int delay)
72 {
73 int value;
74
75 i2c_gpio_scl_set(scl, 1);
76 udelay(delay);
77 value = i2c_gpio_sda_get(sda);
78 udelay(delay);
79 i2c_gpio_scl_set(scl, 0);
80 udelay(2 * delay);
81
82 return value;
83 }
84
85 /* START: High -> Low on SDA while SCL is High */
86 static void i2c_gpio_send_start(struct gpio_desc *scl, struct gpio_desc *sda,
87 int delay)
88 {
89 udelay(delay);
90 i2c_gpio_sda_set(sda, 1);
91 udelay(delay);
92 i2c_gpio_scl_set(scl, 1);
93 udelay(delay);
94 i2c_gpio_sda_set(sda, 0);
95 udelay(delay);
96 }
97
98 /* STOP: Low -> High on SDA while SCL is High */
99 static void i2c_gpio_send_stop(struct gpio_desc *scl, struct gpio_desc *sda,
100 int delay)
101 {
102 i2c_gpio_scl_set(scl, 0);
103 udelay(delay);
104 i2c_gpio_sda_set(sda, 0);
105 udelay(delay);
106 i2c_gpio_scl_set(scl, 1);
107 udelay(delay);
108 i2c_gpio_sda_set(sda, 1);
109 udelay(delay);
110 }
111
112 /* ack should be I2C_ACK or I2C_NOACK */
113 static void i2c_gpio_send_ack(struct gpio_desc *scl, struct gpio_desc *sda,
114 int delay, int ack)
115 {
116 i2c_gpio_write_bit(scl, sda, delay, ack);
117 i2c_gpio_scl_set(scl, 0);
118 udelay(delay);
119 }
120
121 /**
122 * Send a reset sequence consisting of 9 clocks with the data signal high
123 * to clock any confused device back into an idle state. Also send a
124 * <stop> at the end of the sequence for belts & suspenders.
125 */
126 static void i2c_gpio_send_reset(struct gpio_desc *scl, struct gpio_desc *sda,
127 int delay)
128 {
129 int j;
130
131 for (j = 0; j < 9; j++)
132 i2c_gpio_write_bit(scl, sda, delay, 1);
133
134 i2c_gpio_send_stop(scl, sda, delay);
135 }
136
137 /* Set sda high with low clock, before reading slave data */
138 static void i2c_gpio_sda_high(struct gpio_desc *scl, struct gpio_desc *sda,
139 int delay)
140 {
141 i2c_gpio_scl_set(scl, 0);
142 udelay(delay);
143 i2c_gpio_sda_set(sda, 1);
144 udelay(delay);
145 }
146
147 /* Send 8 bits and look for an acknowledgement */
148 static int i2c_gpio_write_byte(struct gpio_desc *scl, struct gpio_desc *sda,
149 int delay, uchar data)
150 {
151 int j;
152 int nack;
153
154 for (j = 0; j < 8; j++) {
155 i2c_gpio_write_bit(scl, sda, delay, data & 0x80);
156 data <<= 1;
157 }
158
159 udelay(delay);
160
161 /* Look for an <ACK>(negative logic) and return it */
162 i2c_gpio_sda_high(scl, sda, delay);
163 nack = i2c_gpio_read_bit(scl, sda, delay);
164
165 return nack; /* not a nack is an ack */
166 }
167
168 /**
169 * if ack == I2C_ACK, ACK the byte so can continue reading, else
170 * send I2C_NOACK to end the read.
171 */
172 static uchar i2c_gpio_read_byte(struct gpio_desc *scl, struct gpio_desc *sda,
173 int delay, int ack)
174 {
175 int data;
176 int j;
177
178 i2c_gpio_sda_high(scl, sda, delay);
179 data = 0;
180 for (j = 0; j < 8; j++) {
181 data <<= 1;
182 data |= i2c_gpio_read_bit(scl, sda, delay);
183 }
184 i2c_gpio_send_ack(scl, sda, delay, ack);
185
186 return data;
187 }
188
189 /* send start and the slave chip address */
190 int i2c_send_slave_addr(struct gpio_desc *scl, struct gpio_desc *sda, int delay,
191 uchar chip)
192 {
193 i2c_gpio_send_start(scl, sda, delay);
194
195 if (i2c_gpio_write_byte(scl, sda, delay, chip)) {
196 i2c_gpio_send_stop(scl, sda, delay);
197 return -EIO;
198 }
199
200 return 0;
201 }
202
203 static int i2c_gpio_write_data(struct i2c_gpio_bus *bus, uchar chip,
204 uchar *buffer, int len,
205 bool end_with_repeated_start)
206 {
207 struct gpio_desc *scl = &bus->gpios[PIN_SCL];
208 struct gpio_desc *sda = &bus->gpios[PIN_SDA];
209 unsigned int delay = bus->udelay;
210 int failures = 0;
211
212 debug("%s: chip %x buffer %p len %d\n", __func__, chip, buffer, len);
213
214 if (i2c_send_slave_addr(scl, sda, delay, chip << 1)) {
215 debug("i2c_write, no chip responded %02X\n", chip);
216 return -EIO;
217 }
218
219 while (len-- > 0) {
220 if (i2c_gpio_write_byte(scl, sda, delay, *buffer++))
221 failures++;
222 }
223
224 if (!end_with_repeated_start) {
225 i2c_gpio_send_stop(scl, sda, delay);
226 return failures;
227 }
228
229 if (i2c_send_slave_addr(scl, sda, delay, (chip << 1) | 0x1)) {
230 debug("i2c_write, no chip responded %02X\n", chip);
231 return -EIO;
232 }
233
234 return failures;
235 }
236
237 static int i2c_gpio_read_data(struct i2c_gpio_bus *bus, uchar chip,
238 uchar *buffer, int len)
239 {
240 struct gpio_desc *scl = &bus->gpios[PIN_SCL];
241 struct gpio_desc *sda = &bus->gpios[PIN_SDA];
242 unsigned int delay = bus->udelay;
243
244 debug("%s: chip %x buffer: %p len %d\n", __func__, chip, buffer, len);
245
246 while (len-- > 0)
247 *buffer++ = i2c_gpio_read_byte(scl, sda, delay, len == 0);
248
249 i2c_gpio_send_stop(scl, sda, delay);
250
251 return 0;
252 }
253
254 static int i2c_gpio_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs)
255 {
256 struct i2c_gpio_bus *bus = dev_get_priv(dev);
257 int ret;
258
259 for (; nmsgs > 0; nmsgs--, msg++) {
260 bool next_is_read = nmsgs > 1 && (msg[1].flags & I2C_M_RD);
261
262 if (msg->flags & I2C_M_RD) {
263 ret = i2c_gpio_read_data(bus, msg->addr, msg->buf,
264 msg->len);
265 } else {
266 ret = i2c_gpio_write_data(bus, msg->addr, msg->buf,
267 msg->len, next_is_read);
268 }
269
270 if (ret)
271 return -EREMOTEIO;
272 }
273
274 return 0;
275 }
276
277 static int i2c_gpio_probe(struct udevice *dev, uint chip, uint chip_flags)
278 {
279 struct i2c_gpio_bus *bus = dev_get_priv(dev);
280 struct gpio_desc *scl = &bus->gpios[PIN_SCL];
281 struct gpio_desc *sda = &bus->gpios[PIN_SDA];
282 unsigned int delay = bus->udelay;
283 int ret;
284
285 i2c_gpio_send_start(scl, sda, delay);
286 ret = i2c_gpio_write_byte(scl, sda, delay, (chip << 1) | 0);
287 i2c_gpio_send_stop(scl, sda, delay);
288
289 debug("%s: bus: %d (%s) chip: %x flags: %x ret: %d\n",
290 __func__, dev->seq, dev->name, chip, chip_flags, ret);
291
292 return ret;
293 }
294
295 static int i2c_gpio_set_bus_speed(struct udevice *dev, unsigned int speed_hz)
296 {
297 struct i2c_gpio_bus *bus = dev_get_priv(dev);
298 struct gpio_desc *scl = &bus->gpios[PIN_SCL];
299 struct gpio_desc *sda = &bus->gpios[PIN_SDA];
300
301 bus->udelay = 1000000 / (speed_hz << 2);
302
303 i2c_gpio_send_reset(scl, sda, bus->udelay);
304
305 return 0;
306 }
307
308 static int i2c_gpio_ofdata_to_platdata(struct udevice *dev)
309 {
310 struct i2c_gpio_bus *bus = dev_get_priv(dev);
311 const void *blob = gd->fdt_blob;
312 int node = dev->of_offset;
313 int ret;
314
315 ret = gpio_request_list_by_name(dev, "gpios", bus->gpios,
316 ARRAY_SIZE(bus->gpios), 0);
317 if (ret < 0)
318 goto error;
319
320 bus->udelay = fdtdec_get_int(blob, node, "i2c-gpio,delay-us",
321 DEFAULT_UDELAY);
322
323 return 0;
324 error:
325 error("Can't get %s gpios! Error: %d", dev->name, ret);
326 return ret;
327 }
328
329 static const struct dm_i2c_ops i2c_gpio_ops = {
330 .xfer = i2c_gpio_xfer,
331 .probe_chip = i2c_gpio_probe,
332 .set_bus_speed = i2c_gpio_set_bus_speed,
333 };
334
335 static const struct udevice_id i2c_gpio_ids[] = {
336 { .compatible = "i2c-gpio" },
337 { }
338 };
339
340 U_BOOT_DRIVER(i2c_gpio) = {
341 .name = "i2c-gpio",
342 .id = UCLASS_I2C,
343 .of_match = i2c_gpio_ids,
344 .ofdata_to_platdata = i2c_gpio_ofdata_to_platdata,
345 .priv_auto_alloc_size = sizeof(struct i2c_gpio_bus),
346 .ops = &i2c_gpio_ops,
347 };