Patchwork [06/14] stellaris: Removed SSI mux

login
register
mail settings
Submitter Peter A. G. Crosthwaite
Date Oct. 5, 2012, 12:08 a.m.
Message ID <1349395739-26502-7-git-send-email-peter.crosthwaite@xilinx.com>
Download mbox | patch
Permalink /patch/189381/
State New
Headers show

Comments

Peter A. G. Crosthwaite - Oct. 5, 2012, 12:08 a.m.
From: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com>

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>
---
 hw/ssd0323.c   |    1 +
 hw/ssi-sd.c    |    1 +
 hw/stellaris.c |   98 ++++++++++----------------------------------------------
 3 files changed, 19 insertions(+), 81 deletions(-)
Peter Maydell - Oct. 5, 2012, 12:34 p.m.
On 5 October 2012 01:08, Peter Crosthwaite
<peter.crosthwaite@petalogix.com> wrote:
> From: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com>
>
> 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>
> ---
>  hw/ssd0323.c   |    1 +
>  hw/ssi-sd.c    |    1 +
>  hw/stellaris.c |   98 ++++++++++----------------------------------------------
>  3 files changed, 19 insertions(+), 81 deletions(-)
>
> diff --git a/hw/ssd0323.c b/hw/ssd0323.c
> index 5d05a35..9c42d64 100644
> --- a/hw/ssd0323.c
> +++ b/hw/ssd0323.c
> @@ -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 = {
> diff --git a/hw/ssi-sd.c b/hw/ssi-sd.c
> index cbbc645..c5505ee 100644
> --- a/hw/ssi-sd.c
> +++ b/hw/ssi-sd.c
> @@ -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 = {
> diff --git a/hw/stellaris.c b/hw/stellaris.c
> index a7b68f4..acb297b 100644
> --- a/hw/stellaris.c
> +++ b/hw/stellaris.c
> @@ -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",
> @@ -1306,29 +1254,33 @@ 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;
> -            qemu_irq select_pin;
>
> +            /* 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");
> -            select_pin = qdev_get_gpio_in(mux, 0);
> +
> +            dev = ssi_create_slave(bus, "ssi-sd");
>              if (gpio_dev[GPIO_D]) {
> -                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0, select_pin);
> +                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0,
> +                                        qdev_get_gpio_in(dev, 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");
> +            if (gpio_dev[GPIO_D]) {
> +                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0,
> +                                        qdev_get_gpio_in(dev, 0));
> +            }

...this seems to be trying to wire up two devices to the same
GPIO output ?

-- PMM
Peter A. G. Crosthwaite - Oct. 5, 2012, 2:14 p.m.
On Fri, Oct 5, 2012 at 10:34 PM, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 5 October 2012 01:08, Peter Crosthwaite
> <peter.crosthwaite@petalogix.com> wrote:
>> From: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com>
>>
>> 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>
>> +            dev = ssi_create_slave(bus, "ssi-sd");
>>              if (gpio_dev[GPIO_D]) {
>> -                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0, select_pin);
>> +                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0,
>> +                                        qdev_get_gpio_in(dev, 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");
>> +            if (gpio_dev[GPIO_D]) {
>> +                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0,
>> +                                        qdev_get_gpio_in(dev, 0));
>> +            }
>
> ...this seems to be trying to wire up two devices to the same
> GPIO output ?
>

Reimplemented using qemu_irq_split()

Regards,
Peter

> -- PMM

Patch

diff --git a/hw/ssd0323.c b/hw/ssd0323.c
index 5d05a35..9c42d64 100644
--- a/hw/ssd0323.c
+++ b/hw/ssd0323.c
@@ -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 = {
diff --git a/hw/ssi-sd.c b/hw/ssi-sd.c
index cbbc645..c5505ee 100644
--- a/hw/ssi-sd.c
+++ b/hw/ssi-sd.c
@@ -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 = {
diff --git a/hw/stellaris.c b/hw/stellaris.c
index a7b68f4..acb297b 100644
--- a/hw/stellaris.c
+++ b/hw/stellaris.c
@@ -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",
@@ -1306,29 +1254,33 @@  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;
-            qemu_irq select_pin;
 
+            /* 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");
-            select_pin = qdev_get_gpio_in(mux, 0);
+
+            dev = ssi_create_slave(bus, "ssi-sd");
             if (gpio_dev[GPIO_D]) {
-                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0, select_pin);
+                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0,
+                                        qdev_get_gpio_in(dev, 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");
+            if (gpio_dev[GPIO_D]) {
+                qdev_connect_gpio_out(gpio_dev[GPIO_D], 0,
+                                        qdev_get_gpio_in(dev, 0));
+            }
             if (gpio_dev[GPIO_C]) {
                 qdev_connect_gpio_out(gpio_dev[GPIO_C], 7,
-                                        qdev_get_gpio_in(dev, 0));
+                                        qdev_get_gpio_in(dev, 1));
             }
-
-            /* Make sure the select pin is high.  */
-            qemu_irq_raise(select_pin);
         }
     }
     if (board->dc4 & (1 << 28)) {
@@ -1393,21 +1345,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);
@@ -1455,7 +1392,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)