mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
i2c:smbus: Simplify write operation
There were two different write functions and the SMBus code kept track of the command. Keeping track of the command wasn't useful, in fact it wasn't quite correct for the eeprom_smbus code. And there is no need for two write functions. Just have one write function and the first byte in the buffer is the command. Signed-off-by: Corey Minyard <cminyard@mvista.com>
This commit is contained in:
parent
905cec6d11
commit
9cf27d74a8
3 changed files with 34 additions and 59 deletions
|
@ -45,16 +45,6 @@ static void eeprom_quick_cmd(SMBusDevice *dev, uint8_t read)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void eeprom_send_byte(SMBusDevice *dev, uint8_t val)
|
||||
{
|
||||
SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *) dev;
|
||||
#ifdef DEBUG
|
||||
printf("eeprom_send_byte: addr=0x%02x val=0x%02x\n",
|
||||
dev->i2c.address, val);
|
||||
#endif
|
||||
eeprom->offset = val;
|
||||
}
|
||||
|
||||
static uint8_t eeprom_receive_byte(SMBusDevice *dev)
|
||||
{
|
||||
SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *) dev;
|
||||
|
@ -67,34 +57,30 @@ static uint8_t eeprom_receive_byte(SMBusDevice *dev)
|
|||
return val;
|
||||
}
|
||||
|
||||
static void eeprom_write_data(SMBusDevice *dev, uint8_t cmd, uint8_t *buf, int len)
|
||||
static int eeprom_write_data(SMBusDevice *dev, uint8_t *buf, uint8_t len)
|
||||
{
|
||||
SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *) dev;
|
||||
int n;
|
||||
uint8_t *data = eeprom->data;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("eeprom_write_byte: addr=0x%02x cmd=0x%02x val=0x%02x\n",
|
||||
dev->i2c.address, cmd, buf[0]);
|
||||
dev->i2c.address, buf[0], buf[1]);
|
||||
#endif
|
||||
/* A page write operation is not a valid SMBus command.
|
||||
It is a block write without a length byte. Fortunately we
|
||||
get the full block anyway. */
|
||||
/* TODO: Should this set the current location? */
|
||||
if (cmd + len > 256)
|
||||
n = 256 - cmd;
|
||||
else
|
||||
n = len;
|
||||
memcpy(eeprom->data + cmd, buf, n);
|
||||
len -= n;
|
||||
if (len)
|
||||
memcpy(eeprom->data, buf + n, len);
|
||||
/* len is guaranteed to be > 0 */
|
||||
eeprom->offset = buf[0];
|
||||
buf++;
|
||||
len--;
|
||||
|
||||
for (; len > 0; len--) {
|
||||
data[eeprom->offset] = *buf++;
|
||||
eeprom->offset = (eeprom->offset + 1) % 256;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint8_t eeprom_read_data(SMBusDevice *dev, uint8_t cmd, int n)
|
||||
static uint8_t eeprom_read_data(SMBusDevice *dev, int n)
|
||||
{
|
||||
SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *) dev;
|
||||
/* If this is the first byte then set the current position. */
|
||||
if (n == 0)
|
||||
eeprom->offset = cmd;
|
||||
/* As with writes, we implement block reads without the
|
||||
SMBus length byte. */
|
||||
return eeprom_receive_byte(dev);
|
||||
|
@ -119,7 +105,6 @@ static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
|
|||
|
||||
dc->realize = smbus_eeprom_realize;
|
||||
sc->quick_cmd = eeprom_quick_cmd;
|
||||
sc->send_byte = eeprom_send_byte;
|
||||
sc->receive_byte = eeprom_receive_byte;
|
||||
sc->write_data = eeprom_write_data;
|
||||
sc->read_data = eeprom_read_data;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue