ppc4xx_i2c: Clean up and improve error logging
Make it more readable by converting register indexes to decimal (avoids lot of superfluous 0x0) and distinguish errors caused by accessing non-existent vs. unimplemented registers. No functional change. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
c8fd8373e4
commit
42a907e839
@ -31,7 +31,7 @@
|
|||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/i2c/ppc4xx_i2c.h"
|
#include "hw/i2c/ppc4xx_i2c.h"
|
||||||
|
|
||||||
#define PPC4xx_I2C_MEM_SIZE 0x12
|
#define PPC4xx_I2C_MEM_SIZE 18
|
||||||
|
|
||||||
#define IIC_CNTL_PT (1 << 0)
|
#define IIC_CNTL_PT (1 << 0)
|
||||||
#define IIC_CNTL_READ (1 << 1)
|
#define IIC_CNTL_READ (1 << 1)
|
||||||
@ -70,7 +70,7 @@ static void ppc4xx_i2c_reset(DeviceState *s)
|
|||||||
i2c->intrmsk = 0;
|
i2c->intrmsk = 0;
|
||||||
i2c->xfrcnt = 0;
|
i2c->xfrcnt = 0;
|
||||||
i2c->xtcntlss = 0;
|
i2c->xtcntlss = 0;
|
||||||
i2c->directcntl = 0x0f;
|
i2c->directcntl = 0xf;
|
||||||
i2c->intr = 0;
|
i2c->intr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr addr, unsigned int size)
|
|||||||
uint64_t ret;
|
uint64_t ret;
|
||||||
|
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x00:
|
case 0:
|
||||||
ret = i2c->mdata;
|
ret = i2c->mdata;
|
||||||
if (ppc4xx_i2c_is_master(i2c)) {
|
if (ppc4xx_i2c_is_master(i2c)) {
|
||||||
ret = 0xff;
|
ret = 0xff;
|
||||||
@ -139,58 +139,62 @@ static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr addr, unsigned int size)
|
|||||||
TYPE_PPC4xx_I2C, __func__);
|
TYPE_PPC4xx_I2C, __func__);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 2:
|
||||||
ret = i2c->sdata;
|
ret = i2c->sdata;
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 4:
|
||||||
ret = i2c->lmadr;
|
ret = i2c->lmadr;
|
||||||
break;
|
break;
|
||||||
case 0x05:
|
case 5:
|
||||||
ret = i2c->hmadr;
|
ret = i2c->hmadr;
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 6:
|
||||||
ret = i2c->cntl;
|
ret = i2c->cntl;
|
||||||
break;
|
break;
|
||||||
case 0x07:
|
case 7:
|
||||||
ret = i2c->mdcntl;
|
ret = i2c->mdcntl;
|
||||||
break;
|
break;
|
||||||
case 0x08:
|
case 8:
|
||||||
ret = i2c->sts;
|
ret = i2c->sts;
|
||||||
break;
|
break;
|
||||||
case 0x09:
|
case 9:
|
||||||
ret = i2c->extsts;
|
ret = i2c->extsts;
|
||||||
break;
|
break;
|
||||||
case 0x0A:
|
case 10:
|
||||||
ret = i2c->lsadr;
|
ret = i2c->lsadr;
|
||||||
break;
|
break;
|
||||||
case 0x0B:
|
case 11:
|
||||||
ret = i2c->hsadr;
|
ret = i2c->hsadr;
|
||||||
break;
|
break;
|
||||||
case 0x0C:
|
case 12:
|
||||||
ret = i2c->clkdiv;
|
ret = i2c->clkdiv;
|
||||||
break;
|
break;
|
||||||
case 0x0D:
|
case 13:
|
||||||
ret = i2c->intrmsk;
|
ret = i2c->intrmsk;
|
||||||
break;
|
break;
|
||||||
case 0x0E:
|
case 14:
|
||||||
ret = i2c->xfrcnt;
|
ret = i2c->xfrcnt;
|
||||||
break;
|
break;
|
||||||
case 0x0F:
|
case 15:
|
||||||
ret = i2c->xtcntlss;
|
ret = i2c->xtcntlss;
|
||||||
break;
|
break;
|
||||||
case 0x10:
|
case 16:
|
||||||
ret = i2c->directcntl;
|
ret = i2c->directcntl;
|
||||||
break;
|
break;
|
||||||
case 0x11:
|
case 17:
|
||||||
ret = i2c->intr;
|
ret = i2c->intr;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
|
if (addr < PPC4xx_I2C_MEM_SIZE) {
|
||||||
HWADDR_PRIx "\n", TYPE_PPC4xx_I2C, __func__, addr);
|
qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%"
|
||||||
|
HWADDR_PRIx "\n", __func__, addr);
|
||||||
|
} else {
|
||||||
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad address 0x%"
|
||||||
|
HWADDR_PRIx "\n", __func__, addr);
|
||||||
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,7 +204,7 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value,
|
|||||||
PPC4xxI2CState *i2c = opaque;
|
PPC4xxI2CState *i2c = opaque;
|
||||||
|
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x00:
|
case 0:
|
||||||
i2c->mdata = value;
|
i2c->mdata = value;
|
||||||
if (!i2c_bus_busy(i2c->bus)) {
|
if (!i2c_bus_busy(i2c->bus)) {
|
||||||
/* assume we start a write transfer */
|
/* assume we start a write transfer */
|
||||||
@ -225,19 +229,19 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 2:
|
||||||
i2c->sdata = value;
|
i2c->sdata = value;
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 4:
|
||||||
i2c->lmadr = value;
|
i2c->lmadr = value;
|
||||||
if (i2c_bus_busy(i2c->bus)) {
|
if (i2c_bus_busy(i2c->bus)) {
|
||||||
i2c_end_transfer(i2c->bus);
|
i2c_end_transfer(i2c->bus);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x05:
|
case 5:
|
||||||
i2c->hmadr = value;
|
i2c->hmadr = value;
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 6:
|
||||||
i2c->cntl = value;
|
i2c->cntl = value;
|
||||||
if (i2c->cntl & IIC_CNTL_PT) {
|
if (i2c->cntl & IIC_CNTL_PT) {
|
||||||
if (i2c->cntl & IIC_CNTL_READ) {
|
if (i2c->cntl & IIC_CNTL_READ) {
|
||||||
@ -263,32 +267,31 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x07:
|
case 7:
|
||||||
i2c->mdcntl = value & 0xDF;
|
i2c->mdcntl = value & 0xdf;
|
||||||
break;
|
break;
|
||||||
case 0x08:
|
case 8:
|
||||||
i2c->sts &= ~(value & 0x0A);
|
i2c->sts &= ~(value & 0xa);
|
||||||
break;
|
break;
|
||||||
case 0x09:
|
case 9:
|
||||||
i2c->extsts &= ~(value & 0x8F);
|
i2c->extsts &= ~(value & 0x8f);
|
||||||
break;
|
break;
|
||||||
case 0x0A:
|
case 10:
|
||||||
i2c->lsadr = value;
|
i2c->lsadr = value;
|
||||||
/*i2c_set_slave_address(i2c->bus, i2c->lsadr);*/
|
|
||||||
break;
|
break;
|
||||||
case 0x0B:
|
case 11:
|
||||||
i2c->hsadr = value;
|
i2c->hsadr = value;
|
||||||
break;
|
break;
|
||||||
case 0x0C:
|
case 12:
|
||||||
i2c->clkdiv = value;
|
i2c->clkdiv = value;
|
||||||
break;
|
break;
|
||||||
case 0x0D:
|
case 13:
|
||||||
i2c->intrmsk = value;
|
i2c->intrmsk = value;
|
||||||
break;
|
break;
|
||||||
case 0x0E:
|
case 14:
|
||||||
i2c->xfrcnt = value & 0x77;
|
i2c->xfrcnt = value & 0x77;
|
||||||
break;
|
break;
|
||||||
case 0x0F:
|
case 15:
|
||||||
if (value & IIC_XTCNTLSS_SRST) {
|
if (value & IIC_XTCNTLSS_SRST) {
|
||||||
/* Is it actually a full reset? U-Boot sets some regs before */
|
/* Is it actually a full reset? U-Boot sets some regs before */
|
||||||
ppc4xx_i2c_reset(DEVICE(i2c));
|
ppc4xx_i2c_reset(DEVICE(i2c));
|
||||||
@ -296,15 +299,20 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value,
|
|||||||
}
|
}
|
||||||
i2c->xtcntlss = value;
|
i2c->xtcntlss = value;
|
||||||
break;
|
break;
|
||||||
case 0x10:
|
case 16:
|
||||||
i2c->directcntl = value & 0x7;
|
i2c->directcntl = value & 0x7;
|
||||||
break;
|
break;
|
||||||
case 0x11:
|
case 17:
|
||||||
i2c->intr = value;
|
i2c->intr = value;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad address at offset 0x%"
|
if (addr < PPC4xx_I2C_MEM_SIZE) {
|
||||||
HWADDR_PRIx "\n", TYPE_PPC4xx_I2C, __func__, addr);
|
qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%"
|
||||||
|
HWADDR_PRIx "\n", __func__, addr);
|
||||||
|
} else {
|
||||||
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad address 0x%"
|
||||||
|
HWADDR_PRIx "\n", __func__, addr);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user