hw/arm/mps2-tz: Use the ARM SBCon two-wire serial bus interface

From 'Application Note AN521', chapter 4.7:

  The SMM implements four SBCon serial modules:

  One SBCon module for use by the Color LCD touch interface.
  One SBCon module to configure the audio controller.
  Two general purpose SBCon modules, that connect to the
  Expansion headers J7 and J8, are intended for use with the
  V2C-Shield1 which provide an I2C interface on the headers.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 20200617072539.32686-15-f4bug@amsat.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Philippe Mathieu-Daudé 2020-06-17 09:25:39 +02:00 committed by Peter Maydell
parent 7b465641ed
commit 2e34818f08

View File

@ -58,6 +58,7 @@
#include "hw/arm/armsse.h" #include "hw/arm/armsse.h"
#include "hw/dma/pl080.h" #include "hw/dma/pl080.h"
#include "hw/ssi/pl022.h" #include "hw/ssi/pl022.h"
#include "hw/i2c/arm_sbcon_i2c.h"
#include "hw/net/lan9118.h" #include "hw/net/lan9118.h"
#include "net/net.h" #include "net/net.h"
#include "hw/core/split-irq.h" #include "hw/core/split-irq.h"
@ -87,7 +88,7 @@ typedef struct {
TZPPC ppc[5]; TZPPC ppc[5];
TZMPC ssram_mpc[3]; TZMPC ssram_mpc[3];
PL022State spi[5]; PL022State spi[5];
UnimplementedDeviceState i2c[4]; ArmSbconI2CState i2c[4];
UnimplementedDeviceState i2s_audio; UnimplementedDeviceState i2s_audio;
UnimplementedDeviceState gpio[4]; UnimplementedDeviceState gpio[4];
UnimplementedDeviceState gfx; UnimplementedDeviceState gfx;
@ -365,6 +366,18 @@ static MemoryRegion *make_spi(MPS2TZMachineState *mms, void *opaque,
return sysbus_mmio_get_region(s, 0); return sysbus_mmio_get_region(s, 0);
} }
static MemoryRegion *make_i2c(MPS2TZMachineState *mms, void *opaque,
const char *name, hwaddr size)
{
ArmSbconI2CState *i2c = opaque;
SysBusDevice *s;
object_initialize_child(OBJECT(mms), name, i2c, TYPE_ARM_SBCON_I2C);
s = SYS_BUS_DEVICE(i2c);
sysbus_realize(s, &error_fatal);
return sysbus_mmio_get_region(s, 0);
}
static void mps2tz_common_init(MachineState *machine) static void mps2tz_common_init(MachineState *machine)
{ {
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine); MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
@ -499,10 +512,10 @@ static void mps2tz_common_init(MachineState *machine)
{ "uart2", make_uart, &mms->uart[2], 0x40202000, 0x1000 }, { "uart2", make_uart, &mms->uart[2], 0x40202000, 0x1000 },
{ "uart3", make_uart, &mms->uart[3], 0x40203000, 0x1000 }, { "uart3", make_uart, &mms->uart[3], 0x40203000, 0x1000 },
{ "uart4", make_uart, &mms->uart[4], 0x40204000, 0x1000 }, { "uart4", make_uart, &mms->uart[4], 0x40204000, 0x1000 },
{ "i2c0", make_unimp_dev, &mms->i2c[0], 0x40207000, 0x1000 }, { "i2c0", make_i2c, &mms->i2c[0], 0x40207000, 0x1000 },
{ "i2c1", make_unimp_dev, &mms->i2c[1], 0x40208000, 0x1000 }, { "i2c1", make_i2c, &mms->i2c[1], 0x40208000, 0x1000 },
{ "i2c2", make_unimp_dev, &mms->i2c[2], 0x4020c000, 0x1000 }, { "i2c2", make_i2c, &mms->i2c[2], 0x4020c000, 0x1000 },
{ "i2c3", make_unimp_dev, &mms->i2c[3], 0x4020d000, 0x1000 }, { "i2c3", make_i2c, &mms->i2c[3], 0x4020d000, 0x1000 },
}, },
}, { }, {
.name = "apb_ppcexp2", .name = "apb_ppcexp2",