mirror of
https://github.com/qemu/qemu.git
synced 2024-12-12 05:03:42 +08:00
libqos: split I2CAdapter initialization and allocation
Provide *_init functions that populate an I2CAdapter struct without allocating one, and make the existing *_create functions wrap them. Because in the new setup *_create might return a pointer inside the IMXI2C or OMAPI2C struct, create companion *_free functions to go back to the outer pointer. All this is temporary until allocation will be handled entirely by qgraph. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c4f00daa5b
commit
732c919cf0
@ -30,13 +30,6 @@ enum IMXI2CDirection {
|
|||||||
IMX_I2C_WRITE,
|
IMX_I2C_WRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct IMXI2C {
|
|
||||||
I2CAdapter parent;
|
|
||||||
|
|
||||||
uint64_t addr;
|
|
||||||
} IMXI2C;
|
|
||||||
|
|
||||||
|
|
||||||
static void imx_i2c_set_slave_addr(IMXI2C *s, uint8_t addr,
|
static void imx_i2c_set_slave_addr(IMXI2C *s, uint8_t addr,
|
||||||
enum IMXI2CDirection direction)
|
enum IMXI2CDirection direction)
|
||||||
{
|
{
|
||||||
@ -47,7 +40,7 @@ static void imx_i2c_set_slave_addr(IMXI2C *s, uint8_t addr,
|
|||||||
static void imx_i2c_send(I2CAdapter *i2c, uint8_t addr,
|
static void imx_i2c_send(I2CAdapter *i2c, uint8_t addr,
|
||||||
const uint8_t *buf, uint16_t len)
|
const uint8_t *buf, uint16_t len)
|
||||||
{
|
{
|
||||||
IMXI2C *s = (IMXI2C *)i2c;
|
IMXI2C *s = container_of(i2c, IMXI2C, parent);
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
uint16_t size = 0;
|
uint16_t size = 0;
|
||||||
@ -107,7 +100,7 @@ static void imx_i2c_send(I2CAdapter *i2c, uint8_t addr,
|
|||||||
static void imx_i2c_recv(I2CAdapter *i2c, uint8_t addr,
|
static void imx_i2c_recv(I2CAdapter *i2c, uint8_t addr,
|
||||||
uint8_t *buf, uint16_t len)
|
uint8_t *buf, uint16_t len)
|
||||||
{
|
{
|
||||||
IMXI2C *s = (IMXI2C *)i2c;
|
IMXI2C *s = container_of(i2c, IMXI2C, parent);
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
uint16_t size = 0;
|
uint16_t size = 0;
|
||||||
@ -193,16 +186,30 @@ static void imx_i2c_recv(I2CAdapter *i2c, uint8_t addr,
|
|||||||
g_assert((status & I2SR_IBB) == 0);
|
g_assert((status & I2SR_IBB) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void imx_i2c_init(IMXI2C *s, QTestState *qts, uint64_t addr)
|
||||||
|
{
|
||||||
|
s->addr = addr;
|
||||||
|
|
||||||
|
s->parent.send = imx_i2c_send;
|
||||||
|
s->parent.recv = imx_i2c_recv;
|
||||||
|
s->parent.qts = qts;
|
||||||
|
}
|
||||||
|
|
||||||
I2CAdapter *imx_i2c_create(QTestState *qts, uint64_t addr)
|
I2CAdapter *imx_i2c_create(QTestState *qts, uint64_t addr)
|
||||||
{
|
{
|
||||||
IMXI2C *s = g_malloc0(sizeof(*s));
|
IMXI2C *s = g_malloc0(sizeof(*s));
|
||||||
I2CAdapter *i2c = (I2CAdapter *)s;
|
|
||||||
|
|
||||||
s->addr = addr;
|
imx_i2c_init(s, qts, addr);
|
||||||
|
return &s->parent;
|
||||||
i2c->send = imx_i2c_send;
|
}
|
||||||
i2c->recv = imx_i2c_recv;
|
|
||||||
i2c->qts = qts;
|
void imx_i2c_free(I2CAdapter *i2c)
|
||||||
|
{
|
||||||
return i2c;
|
IMXI2C *s;
|
||||||
|
|
||||||
|
if (!i2c) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s = container_of(i2c, IMXI2C, parent);
|
||||||
|
g_free(s);
|
||||||
}
|
}
|
||||||
|
@ -40,12 +40,6 @@ enum OMAPI2CCONBits {
|
|||||||
OMAP_I2C_CON_I2C_EN = 1 << 15,
|
OMAP_I2C_CON_I2C_EN = 1 << 15,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct OMAPI2C {
|
|
||||||
I2CAdapter parent;
|
|
||||||
|
|
||||||
uint64_t addr;
|
|
||||||
} OMAPI2C;
|
|
||||||
|
|
||||||
|
|
||||||
static void omap_i2c_set_slave_addr(OMAPI2C *s, uint8_t addr)
|
static void omap_i2c_set_slave_addr(OMAPI2C *s, uint8_t addr)
|
||||||
{
|
{
|
||||||
@ -59,7 +53,7 @@ static void omap_i2c_set_slave_addr(OMAPI2C *s, uint8_t addr)
|
|||||||
static void omap_i2c_send(I2CAdapter *i2c, uint8_t addr,
|
static void omap_i2c_send(I2CAdapter *i2c, uint8_t addr,
|
||||||
const uint8_t *buf, uint16_t len)
|
const uint8_t *buf, uint16_t len)
|
||||||
{
|
{
|
||||||
OMAPI2C *s = (OMAPI2C *)i2c;
|
OMAPI2C *s = container_of(i2c, OMAPI2C, parent);
|
||||||
uint16_t data;
|
uint16_t data;
|
||||||
|
|
||||||
omap_i2c_set_slave_addr(s, addr);
|
omap_i2c_set_slave_addr(s, addr);
|
||||||
@ -103,7 +97,7 @@ static void omap_i2c_send(I2CAdapter *i2c, uint8_t addr,
|
|||||||
static void omap_i2c_recv(I2CAdapter *i2c, uint8_t addr,
|
static void omap_i2c_recv(I2CAdapter *i2c, uint8_t addr,
|
||||||
uint8_t *buf, uint16_t len)
|
uint8_t *buf, uint16_t len)
|
||||||
{
|
{
|
||||||
OMAPI2C *s = (OMAPI2C *)i2c;
|
OMAPI2C *s = container_of(i2c, OMAPI2C, parent);
|
||||||
uint16_t data, stat;
|
uint16_t data, stat;
|
||||||
uint16_t orig_len = len;
|
uint16_t orig_len = len;
|
||||||
|
|
||||||
@ -161,9 +155,8 @@ static void omap_i2c_recv(I2CAdapter *i2c, uint8_t addr,
|
|||||||
g_assert((data & OMAP_I2C_CON_STP) == 0);
|
g_assert((data & OMAP_I2C_CON_STP) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
I2CAdapter *omap_i2c_create(QTestState *qts, uint64_t addr)
|
void omap_i2c_init(OMAPI2C *s, QTestState *qts, uint64_t addr)
|
||||||
{
|
{
|
||||||
OMAPI2C *s = g_malloc0(sizeof(*s));
|
|
||||||
I2CAdapter *i2c = (I2CAdapter *)s;
|
I2CAdapter *i2c = (I2CAdapter *)s;
|
||||||
uint16_t data;
|
uint16_t data;
|
||||||
|
|
||||||
@ -176,6 +169,23 @@ I2CAdapter *omap_i2c_create(QTestState *qts, uint64_t addr)
|
|||||||
/* verify the mmio address by looking for a known signature */
|
/* verify the mmio address by looking for a known signature */
|
||||||
data = qtest_readw(qts, addr + OMAP_I2C_REV);
|
data = qtest_readw(qts, addr + OMAP_I2C_REV);
|
||||||
g_assert_cmphex(data, ==, 0x34);
|
g_assert_cmphex(data, ==, 0x34);
|
||||||
|
}
|
||||||
return i2c;
|
|
||||||
|
I2CAdapter *omap_i2c_create(QTestState *qts, uint64_t addr)
|
||||||
|
{
|
||||||
|
OMAPI2C *s = g_malloc0(sizeof(*s));
|
||||||
|
|
||||||
|
omap_i2c_init(s, qts, addr);
|
||||||
|
return &s->parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void omap_i2c_free(I2CAdapter *i2c)
|
||||||
|
{
|
||||||
|
OMAPI2C *s;
|
||||||
|
|
||||||
|
if (!i2c) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s = container_of(i2c, OMAPI2C, parent);
|
||||||
|
g_free(s);
|
||||||
}
|
}
|
||||||
|
@ -39,10 +39,26 @@ void i2c_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
|
|||||||
void i2c_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
|
void i2c_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
|
||||||
uint16_t value);
|
uint16_t value);
|
||||||
|
|
||||||
/* libi2c-omap.c */
|
/* i2c-omap.c */
|
||||||
I2CAdapter *omap_i2c_create(QTestState *qts, uint64_t addr);
|
typedef struct OMAPI2C {
|
||||||
|
I2CAdapter parent;
|
||||||
|
|
||||||
/* libi2c-imx.c */
|
uint64_t addr;
|
||||||
|
} OMAPI2C;
|
||||||
|
|
||||||
|
void omap_i2c_init(OMAPI2C *s, QTestState *qts, uint64_t addr);
|
||||||
|
I2CAdapter *omap_i2c_create(QTestState *qts, uint64_t addr);
|
||||||
|
void omap_i2c_free(I2CAdapter *i2c);
|
||||||
|
|
||||||
|
/* i2c-imx.c */
|
||||||
|
typedef struct IMXI2C {
|
||||||
|
I2CAdapter parent;
|
||||||
|
|
||||||
|
uint64_t addr;
|
||||||
|
} IMXI2C;
|
||||||
|
|
||||||
|
void imx_i2c_init(IMXI2C *s, QTestState *qts, uint64_t addr);
|
||||||
I2CAdapter *imx_i2c_create(QTestState *qts, uint64_t addr);
|
I2CAdapter *imx_i2c_create(QTestState *qts, uint64_t addr);
|
||||||
|
void imx_i2c_free(I2CAdapter *i2c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -96,7 +96,7 @@ int main(int argc, char **argv)
|
|||||||
if (s) {
|
if (s) {
|
||||||
qtest_quit(s);
|
qtest_quit(s);
|
||||||
}
|
}
|
||||||
g_free(i2c);
|
omap_i2c_free(i2c);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ int main(int argc, char **argv)
|
|||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
|
||||||
qtest_quit(s);
|
qtest_quit(s);
|
||||||
g_free(i2c);
|
omap_i2c_free(i2c);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user