1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2019 Intel Corporation
3 */
4
5 #include "opae_osdep.h"
6 #include "opae_i2c.h"
7 #include "opae_at24_eeprom.h"
8
9 #define AT24_READ_RETRY 10
10
at24_eeprom_read_and_try(struct altera_i2c_dev * dev,unsigned int slave_addr,u32 offset,u8 * buf,u32 len)11 static int at24_eeprom_read_and_try(struct altera_i2c_dev *dev,
12 unsigned int slave_addr,
13 u32 offset, u8 *buf, u32 len)
14 {
15 int i;
16 int ret = 0;
17
18 for (i = 0; i < AT24_READ_RETRY; i++) {
19 ret = i2c_read16(dev, slave_addr, offset,
20 buf, len);
21 if (ret == 0)
22 break;
23
24 opae_udelay(100);
25 }
26
27 return ret;
28 }
29
at24_eeprom_read(struct altera_i2c_dev * dev,unsigned int slave_addr,u32 offset,u8 * buf,int count)30 int at24_eeprom_read(struct altera_i2c_dev *dev, unsigned int slave_addr,
31 u32 offset, u8 *buf, int count)
32 {
33 int len;
34 int status;
35 int read_count = 0;
36
37 if (!count)
38 return count;
39
40 if (count > AT24C512_IO_LIMIT)
41 len = AT24C512_IO_LIMIT;
42 else
43 len = count;
44
45 while (count) {
46 status = at24_eeprom_read_and_try(dev, slave_addr, offset,
47 buf, len);
48 if (status)
49 break;
50
51 buf += len;
52 offset += len;
53 count -= len;
54 read_count += len;
55 }
56
57 return read_count;
58 }
59
at24_eeprom_write(struct altera_i2c_dev * dev,unsigned int slave_addr,u32 offset,u8 * buf,int count)60 int at24_eeprom_write(struct altera_i2c_dev *dev, unsigned int slave_addr,
61 u32 offset, u8 *buf, int count)
62 {
63 int len;
64 int status;
65 int write_count = 0;
66
67 if (!count)
68 return count;
69
70 if (count > AT24C512_PAGE_SIZE)
71 len = AT24C512_PAGE_SIZE;
72 else
73 len = count;
74
75 while (count) {
76 status = i2c_write16(dev, slave_addr, offset, buf, len);
77 if (status)
78 break;
79
80 buf += len;
81 offset += len;
82 count -= len;
83 write_count += len;
84 }
85
86 return write_count;
87 }
88