replace packed attributes
[dpdk.git] / drivers / raw / ifpga / base / opae_at24_eeprom.c
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
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
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
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 }