diff options
Diffstat (limited to 'include/hw/i2c/pm_smbus.h')
-rw-r--r-- | include/hw/i2c/pm_smbus.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h new file mode 100644 index 000000000..0d74207ef --- /dev/null +++ b/include/hw/i2c/pm_smbus.h @@ -0,0 +1,56 @@ +#ifndef PM_SMBUS_H +#define PM_SMBUS_H + +#include "exec/memory.h" +#include "hw/i2c/smbus_master.h" + +#define PM_SMBUS_MAX_MSG_SIZE 32 + +typedef struct PMSMBus { + I2CBus *smbus; + MemoryRegion io; + + uint8_t smb_stat; + uint8_t smb_ctl; + uint8_t smb_cmd; + uint8_t smb_addr; + uint8_t smb_data0; + uint8_t smb_data1; + uint8_t smb_data[PM_SMBUS_MAX_MSG_SIZE]; + uint8_t smb_blkdata; + uint8_t smb_auxctl; + uint32_t smb_index; + + /* Set by pm_smbus.c */ + void (*reset)(struct PMSMBus *s); + + /* Set by the user. */ + bool i2c_enable; + void (*set_irq)(struct PMSMBus *s, bool enabled); + void *opaque; + + /* Internally used by pm_smbus. */ + + /* Set on block transfers after the last byte has been read, so the + INTR bit can be set at the right time. */ + bool op_done; + + /* Set during an I2C block read, so we know how to handle data. */ + bool in_i2c_block_read; + + /* Used to work around a bug in AMIBIOS, see smb_transaction_start() */ + bool start_transaction_on_status_read; +} PMSMBus; + +void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk); + +/* + * For backwards compatibility on migration, older versions don't have + * working migration for pm_smbus, this lets us ignore the migrations + * for older machine versions. + */ +bool pm_smbus_vmstate_needed(void); + +extern const VMStateDescription pmsmb_vmstate; + +#endif /* PM_SMBUS_H */ |