qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [PATCH v2] ssi: change ssi_slave_init to be a realize ops


From: Paolo Bonzini
Subject: Re: [Qemu-arm] [PATCH v2] ssi: change ssi_slave_init to be a realize ops
Date: Wed, 15 Jun 2016 23:25:10 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0


On 15/06/2016 23:16, Cédric Le Goater wrote:
> This enables qemu to handle late inits and report errors. All the SSI
> slave routine names were changed accordingly. Code was modified to
> handle errors when possible (m25p80 and ssi-sd)
> 
> Tested with the m25p80 slave object.
> 
> Suggested-by: Paolo Bonzini <address@hidden>
> Signed-off-by: Cédric Le Goater <address@hidden>
> ---
> 
>  Should apply on top of :
>  
>     m25p80: fix test on blk_pread() return value
>     https://lists.gnu.org/archive/html/qemu-devel/2016-05/msg05574.html
> 
>  Changes since v1 :
> 
>  - added a error_setg() report in ssi_sd_realize()
> 
>  hw/arm/spitz.c       |   12 ++++--------
>  hw/arm/tosa.c        |    5 ++---
>  hw/arm/z2.c          |    6 ++----
>  hw/block/m25p80.c    |   12 +++++-------
>  hw/display/ads7846.c |    5 ++---
>  hw/display/ssd0323.c |    5 ++---
>  hw/misc/max111x.c    |   12 ++++++------
>  hw/sd/ssi-sd.c       |    9 +++++----
>  hw/ssi/ssi.c         |    6 +++---
>  include/hw/ssi/ssi.h |    2 +-
>  10 files changed, 32 insertions(+), 42 deletions(-)
> 
> Index: qemu-ast2400-mainline.git/hw/arm/spitz.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/arm/spitz.c
> +++ qemu-ast2400-mainline.git/hw/arm/spitz.c
> @@ -598,15 +598,13 @@ static uint32_t spitz_lcdtg_transfer(SSI
>      return 0;
>  }
>  
> -static int spitz_lcdtg_init(SSISlave *dev)
> +static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
>  {
>      SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
>  
>      spitz_lcdtg = s;
>      s->bl_power = 0;
>      s->bl_intensity = 0x20;
> -
> -    return 0;
>  }
>  
>  /* SSP devices */
> @@ -666,7 +664,7 @@ static void spitz_adc_temp_on(void *opaq
>          max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
>  }
>  
> -static int corgi_ssp_init(SSISlave *d)
> +static void corgi_ssp_realize(SSISlave *d, Error **errp)
>  {
>      DeviceState *dev = DEVICE(d);
>      CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, d);
> @@ -675,8 +673,6 @@ static int corgi_ssp_init(SSISlave *d)
>      s->bus[0] = ssi_create_bus(dev, "ssi0");
>      s->bus[1] = ssi_create_bus(dev, "ssi1");
>      s->bus[2] = ssi_create_bus(dev, "ssi2");
> -
> -    return 0;
>  }
>  
>  static void spitz_ssp_attach(PXA2xxState *cpu)
> @@ -1121,7 +1117,7 @@ static void corgi_ssp_class_init(ObjectC
>      DeviceClass *dc = DEVICE_CLASS(klass);
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = corgi_ssp_init;
> +    k->realize = corgi_ssp_realize;
>      k->transfer = corgi_ssp_transfer;
>      dc->vmsd = &vmstate_corgi_ssp_regs;
>  }
> @@ -1150,7 +1146,7 @@ static void spitz_lcdtg_class_init(Objec
>      DeviceClass *dc = DEVICE_CLASS(klass);
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = spitz_lcdtg_init;
> +    k->realize = spitz_lcdtg_realize;
>      k->transfer = spitz_lcdtg_transfer;
>      dc->vmsd = &vmstate_spitz_lcdtg_regs;
>  }
> Index: qemu-ast2400-mainline.git/hw/arm/tosa.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/arm/tosa.c
> +++ qemu-ast2400-mainline.git/hw/arm/tosa.c
> @@ -127,10 +127,9 @@ static uint32_t tosa_ssp_tansfer(SSISlav
>      return 0;
>  }
>  
> -static int tosa_ssp_init(SSISlave *dev)
> +static void tosa_ssp_realize(SSISlave *dev, Error **errp)
>  {
>      /* Nothing to do.  */
> -    return 0;
>  }
>  
>  #define TYPE_TOSA_DAC "tosa_dac"
> @@ -283,7 +282,7 @@ static void tosa_ssp_class_init(ObjectCl
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = tosa_ssp_init;
> +    k->realize = tosa_ssp_realize;
>      k->transfer = tosa_ssp_tansfer;
>  }
>  
> Index: qemu-ast2400-mainline.git/hw/arm/z2.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/arm/z2.c
> +++ qemu-ast2400-mainline.git/hw/arm/z2.c
> @@ -151,14 +151,12 @@ static void z2_lcd_cs(void *opaque, int
>      z2_lcd->selected = !level;
>  }
>  
> -static int zipit_lcd_init(SSISlave *dev)
> +static void zipit_lcd_realize(SSISlave *dev, Error **errp)
>  {
>      ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
>      z->selected = 0;
>      z->enabled = 0;
>      z->pos = 0;
> -
> -    return 0;
>  }
>  
>  static VMStateDescription vmstate_zipit_lcd_state = {
> @@ -181,7 +179,7 @@ static void zipit_lcd_class_init(ObjectC
>      DeviceClass *dc = DEVICE_CLASS(klass);
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = zipit_lcd_init;
> +    k->realize = zipit_lcd_realize;
>      k->transfer = zipit_lcd_transfer;
>      dc->vmsd = &vmstate_zipit_lcd_state;
>  }
> Index: qemu-ast2400-mainline.git/hw/block/m25p80.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/block/m25p80.c
> +++ qemu-ast2400-mainline.git/hw/block/m25p80.c
> @@ -28,6 +28,7 @@
>  #include "hw/ssi/ssi.h"
>  #include "qemu/bitops.h"
>  #include "qemu/log.h"
> +#include "qapi/error.h"
>  
>  #ifndef M25P80_ERR_DEBUG
>  #define M25P80_ERR_DEBUG 0
> @@ -878,7 +879,7 @@ static uint32_t m25p80_transfer8(SSISlav
>      return r;
>  }
>  
> -static int m25p80_init(SSISlave *ss)
> +static void m25p80_realize(SSISlave *ss, Error **errp)
>  {
>      DriveInfo *dinfo;
>      Flash *s = M25P80(ss);
> @@ -899,18 +900,15 @@ static int m25p80_init(SSISlave *ss)
>  
>          s->storage = blk_blockalign(s->blk, s->size);
>  
> -        /* FIXME: Move to late init */
>          if (blk_pread(s->blk, 0, s->storage, s->size) != s->size) {
> -            fprintf(stderr, "Failed to initialize SPI flash!\n");
> -            return 1;
> +            error_setg(errp, "failed to read the initial flash content");
> +            return;
>          }
>      } else {
>          DB_PRINT_L(0, "No BDRV - binding to RAM\n");
>          s->storage = blk_blockalign(NULL, s->size);
>          memset(s->storage, 0xFF, s->size);
>      }
> -
> -    return 0;
>  }
>  
>  static void m25p80_reset(DeviceState *d)
> @@ -960,7 +958,7 @@ static void m25p80_class_init(ObjectClas
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>      M25P80Class *mc = M25P80_CLASS(klass);
>  
> -    k->init = m25p80_init;
> +    k->realize = m25p80_realize;
>      k->transfer = m25p80_transfer8;
>      k->set_cs = m25p80_cs;
>      k->cs_polarity = SSI_CS_LOW;
> Index: qemu-ast2400-mainline.git/hw/display/ads7846.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/display/ads7846.c
> +++ qemu-ast2400-mainline.git/hw/display/ads7846.c
> @@ -133,7 +133,7 @@ static const VMStateDescription vmstate_
>      }
>  };
>  
> -static int ads7846_init(SSISlave *d)
> +static void ads7846_realize(SSISlave *d, Error **errp)
>  {
>      DeviceState *dev = DEVICE(d);
>      ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, d);
> @@ -152,14 +152,13 @@ static int ads7846_init(SSISlave *d)
>      ads7846_int_update(s);
>  
>      vmstate_register(NULL, -1, &vmstate_ads7846, s);
> -    return 0;
>  }
>  
>  static void ads7846_class_init(ObjectClass *klass, void *data)
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = ads7846_init;
> +    k->realize = ads7846_realize;
>      k->transfer = ads7846_transfer;
>  }
>  
> Index: qemu-ast2400-mainline.git/hw/display/ssd0323.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/display/ssd0323.c
> +++ qemu-ast2400-mainline.git/hw/display/ssd0323.c
> @@ -361,7 +361,7 @@ static const GraphicHwOps ssd0323_ops =
>      .gfx_update  = ssd0323_update_display,
>  };
>  
> -static int ssd0323_init(SSISlave *d)
> +static void ssd0323_realize(SSISlave *d, Error **errp)
>  {
>      DeviceState *dev = DEVICE(d);
>      ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, d);
> @@ -375,14 +375,13 @@ static int ssd0323_init(SSISlave *d)
>  
>      register_savevm(dev, "ssd0323_oled", -1, 1,
>                      ssd0323_save, ssd0323_load, s);
> -    return 0;
>  }
>  
>  static void ssd0323_class_init(ObjectClass *klass, void *data)
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = ssd0323_init;
> +    k->realize = ssd0323_realize;
>      k->transfer = ssd0323_transfer;
>      k->cs_polarity = SSI_CS_HIGH;
>  }
> Index: qemu-ast2400-mainline.git/hw/misc/max111x.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/misc/max111x.c
> +++ qemu-ast2400-mainline.git/hw/misc/max111x.c
> @@ -147,14 +147,14 @@ static int max111x_init(SSISlave *d, int
>      return 0;
>  }
>  
> -static int max1110_init(SSISlave *dev)
> +static void max1110_realize(SSISlave *dev, Error **errp)
>  {
> -    return max111x_init(dev, 8);
> +    max111x_init(dev, 8);
>  }
>  
> -static int max1111_init(SSISlave *dev)
> +static void max1111_realize(SSISlave *dev, Error **errp)
>  {
> -    return max111x_init(dev, 4);
> +    max111x_init(dev, 4);
>  }
>  
>  void max111x_set_input(DeviceState *dev, int line, uint8_t value)
> @@ -183,7 +183,7 @@ static void max1110_class_init(ObjectCla
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = max1110_init;
> +    k->realize = max1110_realize;
>  }
>  
>  static const TypeInfo max1110_info = {
> @@ -196,7 +196,7 @@ static void max1111_class_init(ObjectCla
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = max1111_init;
> +    k->realize = max1111_realize;
>  }
>  
>  static const TypeInfo max1111_info = {
> Index: qemu-ast2400-mainline.git/hw/sd/ssi-sd.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/sd/ssi-sd.c
> +++ qemu-ast2400-mainline.git/hw/sd/ssi-sd.c
> @@ -15,6 +15,7 @@
>  #include "sysemu/blockdev.h"
>  #include "hw/ssi/ssi.h"
>  #include "hw/sd/sd.h"
> +#include "qapi/error.h"
>  
>  //#define DEBUG_SSI_SD 1
>  
> @@ -249,7 +250,7 @@ static int ssi_sd_load(QEMUFile *f, void
>      return 0;
>  }
>  
> -static int ssi_sd_init(SSISlave *d)
> +static void ssi_sd_realize(SSISlave *d, Error **errp)
>  {
>      DeviceState *dev = DEVICE(d);
>      ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
> @@ -260,17 +261,17 @@ static int ssi_sd_init(SSISlave *d)
>      dinfo = drive_get_next(IF_SD);
>      s->sd = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, true);
>      if (s->sd == NULL) {
> -        return -1;
> +        error_setg(errp, "Device initialization failed.");
> +        return;
>      }
>      register_savevm(dev, "ssi_sd", -1, 1, ssi_sd_save, ssi_sd_load, s);
> -    return 0;
>  }
>  
>  static void ssi_sd_class_init(ObjectClass *klass, void *data)
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
>  
> -    k->init = ssi_sd_init;
> +    k->realize = ssi_sd_realize;
>      k->transfer = ssi_sd_transfer;
>      k->cs_polarity = SSI_CS_LOW;
>  }
> Index: qemu-ast2400-mainline.git/hw/ssi/ssi.c
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/hw/ssi/ssi.c
> +++ qemu-ast2400-mainline.git/hw/ssi/ssi.c
> @@ -54,7 +54,7 @@ static uint32_t ssi_transfer_raw_default
>      return 0;
>  }
>  
> -static int ssi_slave_init(DeviceState *dev)
> +static void ssi_slave_realize(DeviceState *dev, Error **errp)
>  {
>      SSISlave *s = SSI_SLAVE(dev);
>      SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(s);
> @@ -64,7 +64,7 @@ static int ssi_slave_init(DeviceState *d
>          qdev_init_gpio_in_named(dev, ssi_cs_default, SSI_GPIO_CS, 1);
>      }
>  
> -    return ssc->init(s);
> +    ssc->realize(s, errp);
>  }
>  
>  static void ssi_slave_class_init(ObjectClass *klass, void *data)
> @@ -72,7 +72,7 @@ static void ssi_slave_class_init(ObjectC
>      SSISlaveClass *ssc = SSI_SLAVE_CLASS(klass);
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
> -    dc->init = ssi_slave_init;
> +    dc->realize = ssi_slave_realize;
>      dc->bus_type = TYPE_SSI_BUS;
>      if (!ssc->transfer_raw) {
>          ssc->transfer_raw = ssi_transfer_raw_default;
> Index: qemu-ast2400-mainline.git/include/hw/ssi/ssi.h
> ===================================================================
> --- qemu-ast2400-mainline.git.orig/include/hw/ssi/ssi.h
> +++ qemu-ast2400-mainline.git/include/hw/ssi/ssi.h
> @@ -37,7 +37,7 @@ enum SSICSMode {
>  struct SSISlaveClass {
>      DeviceClass parent_class;
>  
> -    int (*init)(SSISlave *dev);
> +    void (*realize)(SSISlave *dev, Error **errp);
>  
>      /* if you have standard or no CS behaviour, just override transfer.
>       * This is called when the device cs is active (true by default).
> 

Reviewed-by: Paolo Bonzini <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]