Skip to content

Commit

Permalink
stellaris: Removed SSI mux
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
pete128 committed Oct 10, 2012
1 parent 1e5b31e commit 8120e71
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 78 deletions.
1 change: 1 addition & 0 deletions hw/ssd0323.c
Expand Up @@ -354,6 +354,7 @@ static void ssd0323_class_init(ObjectClass *klass, void *data)

k->init = ssd0323_init;
k->transfer = ssd0323_transfer;
k->cs_polarity = SSI_CS_HIGH;
}

static TypeInfo ssd0323_info = {
Expand Down
1 change: 1 addition & 0 deletions hw/ssi-sd.c
Expand Up @@ -256,6 +256,7 @@ static void ssi_sd_class_init(ObjectClass *klass, void *data)

k->init = ssi_sd_init;
k->transfer = ssi_sd_transfer;
k->cs_polarity = SSI_CS_LOW;
}

static TypeInfo ssi_sd_info = {
Expand Down
94 changes: 16 additions & 78 deletions hw/stellaris.c
Expand Up @@ -1154,58 +1154,6 @@ static int stellaris_adc_init(SysBusDevice *dev)
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. */
static stellaris_board_info stellaris_boards[] = {
{ "LM3S811EVB",
Expand Down Expand Up @@ -1306,19 +1254,25 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
if (board->dc2 & (1 << 4)) {
dev = sysbus_create_simple("pl022", 0x40008000, pic[7]);
if (board->peripherals & BP_OLED_SSI) {
DeviceState *mux;
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");
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");
ssi_create_slave(bus, "ssi-sd");

bus = qdev_get_child_bus(mux, "ssi1");
dev = ssi_create_slave(bus, "ssd0323");
gpio_out[GPIO_C][7] = qdev_get_gpio_in(dev, 0);
sddev = 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),
qdev_get_gpio_in(ssddev, 0));
gpio_out[GPIO_C][7] = qdev_get_gpio_in(ssddev, 1);

/* Make sure the select pin is high. */
qemu_irq_raise(gpio_out[GPIO_D][0]);
Expand Down Expand Up @@ -1395,21 +1349,6 @@ static void stellaris_machine_init(void)

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)
{
SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
Expand Down Expand Up @@ -1457,7 +1396,6 @@ static void stellaris_register_types(void)
type_register_static(&stellaris_i2c_info);
type_register_static(&stellaris_gptm_info);
type_register_static(&stellaris_adc_info);
type_register_static(&stellaris_ssi_bus_info);
}

type_init(stellaris_register_types)

0 comments on commit 8120e71

Please sign in to comment.