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 } 88