mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
hw/i2c: add asynchronous send
Add an asynchronous version of i2c_send() that requires the slave to explicitly acknowledge on the bus with i2c_ack(). The current master must use the new i2c_start_send_async() to indicate that it wants to do an asynchronous transfer. This allows the i2c core to check if the target slave supports this or not. This approach relies on adding a new enum i2c_event member, which is why a bunch of other devices needs changes in their event handling switches. Signed-off-by: Klaus Jensen <k.jensen@samsung.com> Message-Id: <20220601210831.67259-5-its@irrelevant.dk> Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20220630045133.32251-6-me@pjd.dev> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
37fa5ca426
commit
a78e9839ae
9 changed files with 67 additions and 1 deletions
|
@ -12,6 +12,7 @@
|
|||
enum i2c_event {
|
||||
I2C_START_RECV,
|
||||
I2C_START_SEND,
|
||||
I2C_START_SEND_ASYNC,
|
||||
I2C_FINISH,
|
||||
I2C_NACK /* Masker NACKed a receive byte. */
|
||||
};
|
||||
|
@ -28,6 +29,9 @@ struct I2CSlaveClass {
|
|||
/* Master to slave. Returns non-zero for a NAK, 0 for success. */
|
||||
int (*send)(I2CSlave *s, uint8_t data);
|
||||
|
||||
/* Master to slave (asynchronous). Receiving slave must call i2c_ack(). */
|
||||
void (*send_async)(I2CSlave *s, uint8_t data);
|
||||
|
||||
/*
|
||||
* Slave to master. This cannot fail, the device should always
|
||||
* return something here.
|
||||
|
@ -127,11 +131,23 @@ int i2c_start_recv(I2CBus *bus, uint8_t address);
|
|||
*/
|
||||
int i2c_start_send(I2CBus *bus, uint8_t address);
|
||||
|
||||
/**
|
||||
* i2c_start_send_async: start an asynchronous 'send' transfer on an I2C bus.
|
||||
*
|
||||
* @bus: #I2CBus to be used
|
||||
* @address: address of the slave
|
||||
*
|
||||
* Return: 0 on success, -1 on error
|
||||
*/
|
||||
int i2c_start_send_async(I2CBus *bus, uint8_t address);
|
||||
|
||||
void i2c_end_transfer(I2CBus *bus);
|
||||
void i2c_nack(I2CBus *bus);
|
||||
void i2c_ack(I2CBus *bus);
|
||||
void i2c_bus_master(I2CBus *bus, QEMUBH *bh);
|
||||
void i2c_bus_release(I2CBus *bus);
|
||||
int i2c_send(I2CBus *bus, uint8_t data);
|
||||
int i2c_send_async(I2CBus *bus, uint8_t data);
|
||||
uint8_t i2c_recv(I2CBus *bus);
|
||||
bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool broadcast,
|
||||
I2CNodeList *current_devs);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue