mirror of https://github.com/proxmox/mirror_qemu
aspeed/i2c: Enable SLAVE_ADDR_RX_MATCH always
There is no 'slave match interrupt' enable bit in the Interrupt Control Register. Consider it is always enabled and extend the mask value 'bus->regs[intr_ctrl_reg]' with the SLAVE_ADDR_RX_MATCH bit when the interrupt is raised. Signed-off-by: Cédric Le Goater <clg@kaod.org>master
parent
d72a712ce0
commit
33e30f11c7
|
@ -32,15 +32,20 @@
|
||||||
#include "hw/registerfields.h"
|
#include "hw/registerfields.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
|
/* Enable SLAVE_ADDR_RX_MATCH always */
|
||||||
|
#define R_I2CD_INTR_STS_ALWAYS_ENABLE R_I2CD_INTR_STS_SLAVE_ADDR_RX_MATCH_MASK
|
||||||
|
|
||||||
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
|
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
|
||||||
{
|
{
|
||||||
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
|
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
|
||||||
uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
|
uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
|
||||||
uint32_t intr_ctrl_reg = aspeed_i2c_bus_intr_ctrl_offset(bus);
|
uint32_t intr_ctrl_reg = aspeed_i2c_bus_intr_ctrl_offset(bus);
|
||||||
|
uint32_t intr_ctrl_mask = bus->regs[intr_ctrl_reg] |
|
||||||
|
R_I2CD_INTR_STS_ALWAYS_ENABLE;
|
||||||
bool raise_irq;
|
bool raise_irq;
|
||||||
|
|
||||||
if (trace_event_get_state_backends(TRACE_ASPEED_I2C_BUS_RAISE_INTERRUPT)) {
|
if (trace_event_get_state_backends(TRACE_ASPEED_I2C_BUS_RAISE_INTERRUPT)) {
|
||||||
g_autofree char *buf = g_strdup_printf("%s%s%s%s%s%s",
|
g_autofree char *buf = g_strdup_printf("%s%s%s%s%s%s%s",
|
||||||
aspeed_i2c_bus_pkt_mode_en(bus) &&
|
aspeed_i2c_bus_pkt_mode_en(bus) &&
|
||||||
ARRAY_FIELD_EX32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE) ?
|
ARRAY_FIELD_EX32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE) ?
|
||||||
"pktdone|" : "",
|
"pktdone|" : "",
|
||||||
|
@ -50,6 +55,8 @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
|
||||||
"ack|" : "",
|
"ack|" : "",
|
||||||
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ?
|
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ?
|
||||||
"done|" : "",
|
"done|" : "",
|
||||||
|
ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, SLAVE_ADDR_RX_MATCH) ?
|
||||||
|
"slave-match|" : "",
|
||||||
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, NORMAL_STOP) ?
|
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, NORMAL_STOP) ?
|
||||||
"normal|" : "",
|
"normal|" : "",
|
||||||
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, ABNORMAL) ?
|
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, ABNORMAL) ?
|
||||||
|
@ -58,11 +65,11 @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
|
||||||
trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts], buf);
|
trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts], buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
raise_irq = bus->regs[reg_intr_sts] & bus->regs[intr_ctrl_reg];
|
raise_irq = bus->regs[reg_intr_sts] & intr_ctrl_mask ;
|
||||||
|
|
||||||
/* In packet mode we don't mask off INTR_STS */
|
/* In packet mode we don't mask off INTR_STS */
|
||||||
if (!aspeed_i2c_bus_pkt_mode_en(bus)) {
|
if (!aspeed_i2c_bus_pkt_mode_en(bus)) {
|
||||||
bus->regs[reg_intr_sts] &= bus->regs[intr_ctrl_reg];
|
bus->regs[reg_intr_sts] &= intr_ctrl_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (raise_irq) {
|
if (raise_irq) {
|
||||||
|
|
Loading…
Reference in New Issue