mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-15 15:52:57 +00:00
stellaris: Removed SSI mux
Removed the explicit SSI mux and wired the CS line directly up to the SSI devices. Signed-off-by: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com>
This commit is contained in:
parent
1e5b31e6bd
commit
8120e7144b
@ -354,6 +354,7 @@ static void ssd0323_class_init(ObjectClass *klass, void *data)
|
|||||||
|
|
||||||
k->init = ssd0323_init;
|
k->init = ssd0323_init;
|
||||||
k->transfer = ssd0323_transfer;
|
k->transfer = ssd0323_transfer;
|
||||||
|
k->cs_polarity = SSI_CS_HIGH;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TypeInfo ssd0323_info = {
|
static TypeInfo ssd0323_info = {
|
||||||
|
@ -256,6 +256,7 @@ static void ssi_sd_class_init(ObjectClass *klass, void *data)
|
|||||||
|
|
||||||
k->init = ssi_sd_init;
|
k->init = ssi_sd_init;
|
||||||
k->transfer = ssi_sd_transfer;
|
k->transfer = ssi_sd_transfer;
|
||||||
|
k->cs_polarity = SSI_CS_LOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TypeInfo ssi_sd_info = {
|
static TypeInfo ssi_sd_info = {
|
||||||
|
@ -1154,58 +1154,6 @@ static int stellaris_adc_init(SysBusDevice *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Some boards have both an OLED controller and SD card connected to
|
|
||||||
the same SSI port, with the SD card chip select connected to a
|
|
||||||
GPIO pin. Technically the OLED chip select is connected to the SSI
|
|
||||||
Fss pin. We do not bother emulating that as both devices should
|
|
||||||
never be selected simultaneously, and our OLED controller ignores stray
|
|
||||||
0xff commands that occur when deselecting the SD card. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
SSISlave ssidev;
|
|
||||||
qemu_irq irq;
|
|
||||||
int current_dev;
|
|
||||||
SSIBus *bus[2];
|
|
||||||
} stellaris_ssi_bus_state;
|
|
||||||
|
|
||||||
static void stellaris_ssi_bus_select(void *opaque, int irq, int level)
|
|
||||||
{
|
|
||||||
stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
|
|
||||||
|
|
||||||
s->current_dev = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t stellaris_ssi_bus_transfer(SSISlave *dev, uint32_t val)
|
|
||||||
{
|
|
||||||
stellaris_ssi_bus_state *s = FROM_SSI_SLAVE(stellaris_ssi_bus_state, dev);
|
|
||||||
|
|
||||||
return ssi_transfer(s->bus[s->current_dev], val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_stellaris_ssi_bus = {
|
|
||||||
.name = "stellaris_ssi_bus",
|
|
||||||
.version_id = 2,
|
|
||||||
.minimum_version_id = 2,
|
|
||||||
.minimum_version_id_old = 2,
|
|
||||||
.fields = (VMStateField[]) {
|
|
||||||
VMSTATE_SSI_SLAVE(ssidev, stellaris_ssi_bus_state),
|
|
||||||
VMSTATE_INT32(current_dev, stellaris_ssi_bus_state),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int stellaris_ssi_bus_init(SSISlave *dev)
|
|
||||||
{
|
|
||||||
stellaris_ssi_bus_state *s = FROM_SSI_SLAVE(stellaris_ssi_bus_state, dev);
|
|
||||||
|
|
||||||
s->bus[0] = ssi_create_bus(&dev->qdev, "ssi0");
|
|
||||||
s->bus[1] = ssi_create_bus(&dev->qdev, "ssi1");
|
|
||||||
qdev_init_gpio_in(&dev->qdev, stellaris_ssi_bus_select, 1);
|
|
||||||
|
|
||||||
vmstate_register(&dev->qdev, -1, &vmstate_stellaris_ssi_bus, s);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Board init. */
|
/* Board init. */
|
||||||
static stellaris_board_info stellaris_boards[] = {
|
static stellaris_board_info stellaris_boards[] = {
|
||||||
{ "LM3S811EVB",
|
{ "LM3S811EVB",
|
||||||
@ -1306,19 +1254,25 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
|
|||||||
if (board->dc2 & (1 << 4)) {
|
if (board->dc2 & (1 << 4)) {
|
||||||
dev = sysbus_create_simple("pl022", 0x40008000, pic[7]);
|
dev = sysbus_create_simple("pl022", 0x40008000, pic[7]);
|
||||||
if (board->peripherals & BP_OLED_SSI) {
|
if (board->peripherals & BP_OLED_SSI) {
|
||||||
DeviceState *mux;
|
|
||||||
void *bus;
|
void *bus;
|
||||||
|
DeviceState *sddev;
|
||||||
|
DeviceState *ssddev;
|
||||||
|
|
||||||
|
/* Some boards have both an OLED controller and SD card connected to
|
||||||
|
* the same SSI port, with the SD card chip select connected to a
|
||||||
|
* GPIO pin. Technically the OLED chip select is connected to the
|
||||||
|
* SSI Fss pin. We do not bother emulating that as both devices
|
||||||
|
* should never be selected simultaneously, and our OLED controller
|
||||||
|
* ignores stray 0xff commands that occur when deselecting the SD
|
||||||
|
* card.
|
||||||
|
*/
|
||||||
bus = qdev_get_child_bus(dev, "ssi");
|
bus = qdev_get_child_bus(dev, "ssi");
|
||||||
mux = ssi_create_slave(bus, "evb6965-ssi");
|
|
||||||
gpio_out[GPIO_D][0] = qdev_get_gpio_in(mux, 0);
|
|
||||||
|
|
||||||
bus = qdev_get_child_bus(mux, "ssi0");
|
sddev = ssi_create_slave(bus, "ssi-sd");
|
||||||
ssi_create_slave(bus, "ssi-sd");
|
ssddev = ssi_create_slave(bus, "ssd0323");
|
||||||
|
gpio_out[GPIO_D][0] = qemu_irq_split(qdev_get_gpio_in(sddev, 0),
|
||||||
bus = qdev_get_child_bus(mux, "ssi1");
|
qdev_get_gpio_in(ssddev, 0));
|
||||||
dev = ssi_create_slave(bus, "ssd0323");
|
gpio_out[GPIO_C][7] = qdev_get_gpio_in(ssddev, 1);
|
||||||
gpio_out[GPIO_C][7] = qdev_get_gpio_in(dev, 0);
|
|
||||||
|
|
||||||
/* Make sure the select pin is high. */
|
/* Make sure the select pin is high. */
|
||||||
qemu_irq_raise(gpio_out[GPIO_D][0]);
|
qemu_irq_raise(gpio_out[GPIO_D][0]);
|
||||||
@ -1395,21 +1349,6 @@ static void stellaris_machine_init(void)
|
|||||||
|
|
||||||
machine_init(stellaris_machine_init);
|
machine_init(stellaris_machine_init);
|
||||||
|
|
||||||
static void stellaris_ssi_bus_class_init(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
|
|
||||||
|
|
||||||
k->init = stellaris_ssi_bus_init;
|
|
||||||
k->transfer = stellaris_ssi_bus_transfer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static TypeInfo stellaris_ssi_bus_info = {
|
|
||||||
.name = "evb6965-ssi",
|
|
||||||
.parent = TYPE_SSI_SLAVE,
|
|
||||||
.instance_size = sizeof(stellaris_ssi_bus_state),
|
|
||||||
.class_init = stellaris_ssi_bus_class_init,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void stellaris_i2c_class_init(ObjectClass *klass, void *data)
|
static void stellaris_i2c_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
|
SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
|
||||||
@ -1457,7 +1396,6 @@ static void stellaris_register_types(void)
|
|||||||
type_register_static(&stellaris_i2c_info);
|
type_register_static(&stellaris_i2c_info);
|
||||||
type_register_static(&stellaris_gptm_info);
|
type_register_static(&stellaris_gptm_info);
|
||||||
type_register_static(&stellaris_adc_info);
|
type_register_static(&stellaris_adc_info);
|
||||||
type_register_static(&stellaris_ssi_bus_info);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(stellaris_register_types)
|
type_init(stellaris_register_types)
|
||||||
|
Loading…
Reference in New Issue
Block a user