xref: /dpdk/drivers/raw/ifpga/base/opae_at24_eeprom.c (revision 06710448c98efbc8986866f7bde6f6df1f5316c1)
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