Hi Linus,
On 02/17/2018 11:00 AM, Linus Walleij wrote:
> This adds the SiI9022 and EDID I2C devices to the ARM Versatile
> Express machine, and selects the two I2C devices necessary in the
> arm-softmmy.mak configuration so everything will build smoothly.
>
> I am implementing proper handling of the graphics in the Linux
> kernel and adding proper emulation of SiI9022 and EDID makes the
> driver probe as nicely as before, retrieveing the resolutions
> supported by the "QEMU monitor" and overall just working nice.
>
> The assignment of the SiI9022 at address 0x39 and the EDID
> DDC I2C at address 0x50 is not strictly correct: the DDC I2C
> is there all the time but in the actual component it only
> appears once activated inside the SiI9022, so ideally it should
> be added and removed to the bus by the SiI9022. However for this
> purpose it works fine to just have it around.
This seems easier to just do it now rather than postpone :)
In your patch #2:
static void sii9022_realize(DeviceState *dev, Error **errp)
{
I2CBus *bus;
bus = I2C_BUS(qdev_get_parent_bus(dev));
i2c_create_slave(bus, TYPE_I2CDDC, 0x50);
}
static void sii9022_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
...
dc->realize = sii9022_realize;
}
>
> Signed-off-by: Linus Walleij
> ---
> default-configs/arm-softmmu.mak | 2 ++
> hw/arm/vexpress.c | 7 ++-
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
> index ca34cf446242..54f855d07206 100644
> --- a/default-configs/arm-softmmu.mak
> +++ b/default-configs/arm-softmmu.mak
> @@ -21,6 +21,8 @@ CONFIG_STELLARIS_INPUT=y
> CONFIG_STELLARIS_ENET=y
> CONFIG_SSD0303=y
> CONFIG_SSD0323=y
> +CONFIG_DDC=y
> +CONFIG_SII9022=y
> CONFIG_ADS7846=y
> CONFIG_MAX111X=y
> CONFIG_SSI=y
> diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
> index dc5928ae1ab5..d6c912c97684 100644
> --- a/hw/arm/vexpress.c
> +++ b/hw/arm/vexpress.c
> @@ -29,6 +29,7 @@
> #include "hw/arm/arm.h"
> #include "hw/arm/primecell.h"
> #include "hw/devices.h"
> +#include "hw/i2c/i2c.h"
> #include "net/net.h"
> #include "sysemu/sysemu.h"
> #include "hw/boards.h"
> @@ -537,6 +538,7 @@ static void vexpress_common_init(MachineState *machine)
> uint32_t sys_id;
> DriveInfo *dinfo;
> pflash_t *pflash0;
> +I2CBus *i2c;
> ram_addr_t vram_size, sram_size;
> MemoryRegion *sysmem = get_system_memory();
> MemoryRegion *vram = g_new(MemoryRegion, 1);
> @@ -628,7 +630,10 @@ static void vexpress_common_init(MachineState *machine)
> sysbus_create_simple("sp804", map[VE_TIMER01], pic[2]);
> sysbus_create_simple("sp804", map[VE_TIMER23], pic[3]);
>
> -/* VE_SERIALDVI: not modelled */
> +dev = sysbus_create_simple("versatile_i2c", map[VE_SERIALDVI], NULL);
> +i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
> +i2c_create_slave(i2c, "sii9022", 0x39);
> +i2c_create_slave(i2c, "i2c-ddc", 0x50);
>
> sysbus_create_simple("pl031", map[VE_RTC], pic[4]); /* RTC */
>
>