diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/pc_q35.c | 1 | ||||
-rw-r--r-- | hw/ppc405_boards.c | 1 | ||||
-rw-r--r-- | hw/spapr.c | 7 | ||||
-rw-r--r-- | hw/spapr_vio.c | 29 | ||||
-rw-r--r-- | hw/tmp105.c | 77 | ||||
-rw-r--r-- | hw/tmp105.h | 64 | ||||
-rw-r--r-- | hw/tmp105_regs.h | 50 | ||||
-rw-r--r-- | hw/usb/dev-storage.c | 2 |
8 files changed, 129 insertions, 102 deletions
diff --git a/hw/pc_q35.c b/hw/pc_q35.c index 52d9976..d82353e 100644 --- a/hw/pc_q35.c +++ b/hw/pc_q35.c @@ -214,6 +214,7 @@ static QEMUMachine pc_q35_machine = { .desc = "Standard PC (Q35 + ICH9, 2009)", .init = pc_q35_init, .max_cpus = 255, + DEFAULT_MACHINE_OPTIONS, }; static void pc_q35_machine_init(void) diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c index 45ed376..cf371db 100644 --- a/hw/ppc405_boards.c +++ b/hw/ppc405_boards.c @@ -362,6 +362,7 @@ static QEMUMachine ref405ep_machine = { .name = "ref405ep", .desc = "ref405ep", .init = ref405ep_init, + DEFAULT_MACHINE_OPTIONS, }; /*****************************************************************************/ @@ -328,14 +328,11 @@ static void *spapr_create_fdt_skel(const char *cpu_model, continue; } - if (asprintf(&nodename, "%s@%x", modelname, index) < 0) { - fprintf(stderr, "Allocation failure\n"); - exit(1); - } + nodename = g_strdup_printf("%s@%x", modelname, index); _FDT((fdt_begin_node(fdt, nodename))); - free(nodename); + g_free(nodename); _FDT((fdt_property_cell(fdt, "reg", index))); _FDT((fdt_property_string(fdt, "device_type", "cpu"))); diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c index 3a1a486..2054219 100644 --- a/hw/spapr_vio.c +++ b/hw/spapr_vio.c @@ -80,9 +80,7 @@ static char *vio_format_dev_name(VIOsPAPRDevice *dev) char *name; /* Device tree style name device@reg */ - if (asprintf(&name, "%s@%x", pc->dt_name, dev->reg) < 0) { - return NULL; - } + name = g_strdup_printf("%s@%x", pc->dt_name, dev->reg); return name; } @@ -101,12 +99,8 @@ static int vio_make_devnode(VIOsPAPRDevice *dev, } dt_name = vio_format_dev_name(dev); - if (!dt_name) { - return -ENOMEM; - } - node_off = fdt_add_subnode(fdt, vdevice_off, dt_name); - free(dt_name); + g_free(dt_name); if (node_off < 0) { return node_off; } @@ -444,9 +438,6 @@ static int spapr_vio_busdev_init(DeviceState *qdev) /* Don't overwrite ids assigned on the command line */ if (!dev->qdev.id) { id = vio_format_dev_name(dev); - if (!id) { - return -1; - } dev->qdev.id = id; } @@ -646,20 +637,12 @@ int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus) } name = vio_format_dev_name(dev); - if (!name) { - return -ENOMEM; - } - - if (asprintf(&path, "/vdevice/%s", name) < 0) { - path = NULL; - ret = -ENOMEM; - goto out; - } + path = g_strdup_printf("/vdevice/%s", name); ret = fdt_setprop_string(fdt, offset, "linux,stdout-path", path); -out: - free(name); - free(path); + + g_free(name); + g_free(path); return ret; } diff --git a/hw/tmp105.c b/hw/tmp105.c index 0ade4eb..3ad2d2f 100644 --- a/hw/tmp105.c +++ b/hw/tmp105.c @@ -21,20 +21,7 @@ #include "hw.h" #include "i2c.h" #include "tmp105.h" - -typedef struct { - I2CSlave i2c; - uint8_t len; - uint8_t buf[2]; - qemu_irq pin; - - uint8_t pointer; - uint8_t config; - int16_t temperature; - int16_t limit[2]; - int faults; - uint8_t alarm; -} TMP105State; +#include "qapi/visitor.h" static void tmp105_interrupt_update(TMP105State *s) { @@ -65,15 +52,30 @@ static void tmp105_alarm_update(TMP105State *s) tmp105_interrupt_update(s); } +static void tmp105_get_temperature(Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + TMP105State *s = TMP105(obj); + int64_t value = s->temperature; + + visit_type_int(v, &value, name, errp); +} + /* Units are 0.001 centigrades relative to 0 C. */ -void tmp105_set(I2CSlave *i2c, int temp) +static void tmp105_set_temperature(Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) { - TMP105State *s = (TMP105State *) i2c; + TMP105State *s = TMP105(obj); + int64_t temp; + visit_type_int(v, &temp, name, errp); + if (error_is_set(errp)) { + return; + } if (temp >= 128000 || temp < -128000) { - fprintf(stderr, "%s: values is out of range (%i.%03i C)\n", - __FUNCTION__, temp / 1000, temp % 1000); - exit(-1); + error_setg(errp, "value %" PRId64 ".%03" PRIu64 " °C is out of range", + temp / 1000, temp % 1000); + return; } s->temperature = ((int16_t) (temp * 0x800 / 128000)) << 4; @@ -141,23 +143,27 @@ static void tmp105_write(TMP105State *s) static int tmp105_rx(I2CSlave *i2c) { - TMP105State *s = (TMP105State *) i2c; + TMP105State *s = TMP105(i2c); - if (s->len < 2) + if (s->len < 2) { return s->buf[s->len ++]; - else + } else { return 0xff; + } } static int tmp105_tx(I2CSlave *i2c, uint8_t data) { - TMP105State *s = (TMP105State *) i2c; + TMP105State *s = TMP105(i2c); - if (!s->len ++) + if (s->len == 0) { s->pointer = data; - else { - if (s->len <= 2) + s->len++; + } else { + if (s->len <= 2) { s->buf[s->len - 1] = data; + } + s->len++; tmp105_write(s); } @@ -166,10 +172,11 @@ static int tmp105_tx(I2CSlave *i2c, uint8_t data) static void tmp105_event(I2CSlave *i2c, enum i2c_event event) { - TMP105State *s = (TMP105State *) i2c; + TMP105State *s = TMP105(i2c); - if (event == I2C_START_RECV) + if (event == I2C_START_RECV) { tmp105_read(s); + } s->len = 0; } @@ -205,7 +212,7 @@ static const VMStateDescription vmstate_tmp105 = { static void tmp105_reset(I2CSlave *i2c) { - TMP105State *s = (TMP105State *) i2c; + TMP105State *s = TMP105(i2c); s->temperature = 0; s->pointer = 0; @@ -218,7 +225,7 @@ static void tmp105_reset(I2CSlave *i2c) static int tmp105_init(I2CSlave *i2c) { - TMP105State *s = FROM_I2C_SLAVE(TMP105State, i2c); + TMP105State *s = TMP105(i2c); qdev_init_gpio_out(&i2c->qdev, &s->pin, 1); @@ -227,6 +234,13 @@ static int tmp105_init(I2CSlave *i2c) return 0; } +static void tmp105_initfn(Object *obj) +{ + object_property_add(obj, "temperature", "int", + tmp105_get_temperature, + tmp105_set_temperature, NULL, NULL, NULL); +} + static void tmp105_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -240,9 +254,10 @@ static void tmp105_class_init(ObjectClass *klass, void *data) } static const TypeInfo tmp105_info = { - .name = "tmp105", + .name = TYPE_TMP105, .parent = TYPE_I2C_SLAVE, .instance_size = sizeof(TMP105State), + .instance_init = tmp105_initfn, .class_init = tmp105_class_init, }; diff --git a/hw/tmp105.h b/hw/tmp105.h index 51eff4b..d218919 100644 --- a/hw/tmp105.h +++ b/hw/tmp105.h @@ -15,53 +15,33 @@ #define QEMU_TMP105_H #include "i2c.h" +#include "tmp105_regs.h" -/** - * TMP105Reg: - * @TMP105_REG_TEMPERATURE: Temperature register - * @TMP105_REG_CONFIG: Configuration register - * @TMP105_REG_T_LOW: Low temperature register (also known as T_hyst) - * @TMP105_REG_T_HIGH: High temperature register (also known as T_OS) - * - * The following temperature sensors are - * compatible with the TMP105 registers: - * - adt75 - * - ds1775 - * - ds75 - * - lm75 - * - lm75a - * - max6625 - * - max6626 - * - mcp980x - * - stds75 - * - tcn75 - * - tmp100 - * - tmp101 - * - tmp105 - * - tmp175 - * - tmp275 - * - tmp75 - **/ -typedef enum TMP105Reg { - TMP105_REG_TEMPERATURE = 0, - TMP105_REG_CONFIG, - TMP105_REG_T_LOW, - TMP105_REG_T_HIGH, -} TMP105Reg; +#define TYPE_TMP105 "tmp105" +#define TMP105(obj) OBJECT_CHECK(TMP105State, (obj), TYPE_TMP105) /** - * tmp105_set: - * @i2c: dispatcher to TMP105 hardware model - * @temp: temperature with 0.001 centigrades units in the range -40 C to +125 C - * - * Sets the temperature of the TMP105 hardware model. + * TMP105State: + * @config: Bits 5 and 6 (value 32 and 64) determine the precision of the + * temperature. See Table 8 in the data sheet. * - * Bits 5 and 6 (value 32 and 64) in the register indexed by TMP105_REG_CONFIG - * determine the precision of the temperature. See Table 8 in the data sheet. - * - * @see_also: I2C_SLAVE macro * @see_also: http://www.ti.com/lit/gpn/tmp105 */ -void tmp105_set(I2CSlave *i2c, int temp); +typedef struct TMP105State { + /*< private >*/ + I2CSlave i2c; + /*< public >*/ + + uint8_t len; + uint8_t buf[2]; + qemu_irq pin; + + uint8_t pointer; + uint8_t config; + int16_t temperature; + int16_t limit[2]; + int faults; + uint8_t alarm; +} TMP105State; #endif diff --git a/hw/tmp105_regs.h b/hw/tmp105_regs.h new file mode 100644 index 0000000..9b55aba --- /dev/null +++ b/hw/tmp105_regs.h @@ -0,0 +1,50 @@ +/* + * Texas Instruments TMP105 Temperature Sensor I2C messages + * + * Browse the data sheet: + * + * http://www.ti.com/lit/gpn/tmp105 + * + * Copyright (C) 2012 Alex Horn <alex.horn@cs.ox.ac.uk> + * Copyright (C) 2008-2012 Andrzej Zaborowski <balrogg@gmail.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + */ +#ifndef QEMU_TMP105_MSGS_H +#define QEMU_TMP105_MSGS_H + +/** + * TMP105Reg: + * @TMP105_REG_TEMPERATURE: Temperature register + * @TMP105_REG_CONFIG: Configuration register + * @TMP105_REG_T_LOW: Low temperature register (also known as T_hyst) + * @TMP105_REG_T_HIGH: High temperature register (also known as T_OS) + * + * The following temperature sensors are + * compatible with the TMP105 registers: + * - adt75 + * - ds1775 + * - ds75 + * - lm75 + * - lm75a + * - max6625 + * - max6626 + * - mcp980x + * - stds75 + * - tcn75 + * - tmp100 + * - tmp101 + * - tmp105 + * - tmp175 + * - tmp275 + * - tmp75 + **/ +typedef enum TMP105Reg { + TMP105_REG_TEMPERATURE = 0, + TMP105_REG_CONFIG, + TMP105_REG_T_LOW, + TMP105_REG_T_HIGH, +} TMP105Reg; + +#endif diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index 1b87352..b839798 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -427,7 +427,7 @@ static void usb_msd_handle_data(USBDevice *dev, USBPacket *p) scsi_req_print(s->req); #endif scsi_req_enqueue(s->req); - if (s->req && s->req->cmd.xfer != SCSI_XFER_NONE) { + if (s->req->cmd.xfer != SCSI_XFER_NONE) { scsi_req_continue(s->req); } break; |