static void solo_eeprom_cmd(struct solo_dev *solo_dev, int cmd) { int i; solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ACCESS_EN); solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE); for (i = 4 + ADDR_LEN; i >= 0; i--) { int dataval = (cmd & (1 << i)) ? EE_DATA_WRITE : 0; solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE | dataval); solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE | EE_SHIFT_CLK | dataval); } solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE); }
unsigned short solo_eeprom_read(struct solo6010_dev *solo_dev, int loc) { int read_cmd = loc | (EE_READ_CMD << ADDR_LEN); unsigned short retval = 0; int i; solo_eeprom_cmd(solo_dev, read_cmd); for (i = 0; i < 16; i++) { solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE | EE_SHIFT_CLK); retval = (retval << 1) | solo_eeprom_reg_read(solo_dev); solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE); } solo_eeprom_reg_write(solo_dev, ~EE_CS); return retval; }
unsigned int solo_eeprom_ewen(struct solo6010_dev *solo_dev, int w_en) { int ewen_cmd = (w_en ? 0x3f : 0) | (EE_EWEN_CMD << ADDR_LEN); unsigned int retval = 0; int i; solo_eeprom_cmd(solo_dev, ewen_cmd); for (i = 0; i < 16; i++) { solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE | EE_SHIFT_CLK); retval = (retval << 1) | solo_eeprom_reg_read(solo_dev); solo_eeprom_reg_write(solo_dev, SOLO_EEPROM_ENABLE); retval = (retval << 1) | solo_eeprom_reg_read(solo_dev); } solo_eeprom_reg_write(solo_dev, ~EE_CS); retval = (retval << 1) | solo_eeprom_reg_read(solo_dev); return retval; }
int solo_eeprom_write(struct solo6010_dev *solo_dev, int loc, unsigned short data) { int write_cmd = loc | (EE_WRITE_CMD << ADDR_LEN); unsigned int retval; int i; solo_eeprom_cmd(solo_dev, write_cmd); for (i = 15; i >= 0; i--) { unsigned int dataval = (data & (1 << i)) ? EE_WRITE_1 : EE_WRITE_0; solo_eeprom_reg_write(solo_dev, EE_ENB); solo_eeprom_reg_write(solo_dev, EE_ENB | dataval | EE_SHIFT_CLK); } solo_eeprom_reg_write(solo_dev, EE_ENB); solo_eeprom_reg_write(solo_dev, ~EE_CS); solo_eeprom_reg_write(solo_dev, EE_ENB); for (i = retval = 0; i < 10000 && !retval; i++) retval = solo_eeprom_reg_read(solo_dev); solo_eeprom_reg_write(solo_dev, ~EE_CS); return !retval; }