Revision 1431b6a1 hw/qdev.c
b/hw/qdev.c | ||
---|---|---|
32 | 32 |
|
33 | 33 |
struct DeviceProperty { |
34 | 34 |
const char *name; |
35 |
DevicePropType type; |
|
35 | 36 |
union { |
36 | 37 |
uint64_t i; |
37 | 38 |
void *ptr; |
... | ... | |
119 | 120 |
free(dev); |
120 | 121 |
} |
121 | 122 |
|
122 |
static DeviceProperty *create_prop(DeviceState *dev, const char *name) |
|
123 |
static DeviceProperty *create_prop(DeviceState *dev, const char *name, |
|
124 |
DevicePropType type) |
|
123 | 125 |
{ |
124 | 126 |
DeviceProperty *prop; |
125 | 127 |
|
126 | 128 |
/* TODO: Check for duplicate properties. */ |
127 | 129 |
prop = qemu_mallocz(sizeof(*prop)); |
128 | 130 |
prop->name = qemu_strdup(name); |
131 |
prop->type = type; |
|
129 | 132 |
prop->next = dev->props; |
130 | 133 |
dev->props = prop; |
131 | 134 |
|
... | ... | |
136 | 139 |
{ |
137 | 140 |
DeviceProperty *prop; |
138 | 141 |
|
139 |
prop = create_prop(dev, name); |
|
142 |
prop = create_prop(dev, name, PROP_TYPE_INT);
|
|
140 | 143 |
prop->value.i = value; |
141 | 144 |
} |
142 | 145 |
|
146 |
void qdev_set_prop_dev(DeviceState *dev, const char *name, DeviceState *value) |
|
147 |
{ |
|
148 |
DeviceProperty *prop; |
|
149 |
|
|
150 |
prop = create_prop(dev, name, PROP_TYPE_DEV); |
|
151 |
prop->value.ptr = value; |
|
152 |
} |
|
153 |
|
|
143 | 154 |
void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value) |
144 | 155 |
{ |
145 | 156 |
DeviceProperty *prop; |
146 | 157 |
|
147 |
prop = create_prop(dev, name); |
|
158 |
prop = create_prop(dev, name, PROP_TYPE_INT);
|
|
148 | 159 |
prop->value.ptr = value; |
149 | 160 |
} |
150 | 161 |
|
... | ... | |
173 | 184 |
return dev->parent_bus; |
174 | 185 |
} |
175 | 186 |
|
176 |
static DeviceProperty *find_prop(DeviceState *dev, const char *name) |
|
187 |
static DeviceProperty *find_prop(DeviceState *dev, const char *name, |
|
188 |
DevicePropType type) |
|
177 | 189 |
{ |
178 | 190 |
DeviceProperty *prop; |
179 | 191 |
|
180 | 192 |
for (prop = dev->props; prop; prop = prop->next) { |
181 | 193 |
if (strcmp(prop->name, name) == 0) { |
194 |
assert (prop->type == type); |
|
182 | 195 |
return prop; |
183 | 196 |
} |
184 | 197 |
} |
... | ... | |
189 | 202 |
{ |
190 | 203 |
DeviceProperty *prop; |
191 | 204 |
|
192 |
prop = find_prop(dev, name); |
|
193 |
if (!prop) |
|
205 |
prop = find_prop(dev, name, PROP_TYPE_INT);
|
|
206 |
if (!prop) {
|
|
194 | 207 |
return def; |
208 |
} |
|
195 | 209 |
|
196 | 210 |
return prop->value.i; |
197 | 211 |
} |
... | ... | |
200 | 214 |
{ |
201 | 215 |
DeviceProperty *prop; |
202 | 216 |
|
203 |
prop = find_prop(dev, name); |
|
217 |
prop = find_prop(dev, name, PROP_TYPE_PTR);
|
|
204 | 218 |
assert(prop); |
205 | 219 |
return prop->value.ptr; |
206 | 220 |
} |
207 | 221 |
|
222 |
DeviceState *qdev_get_prop_dev(DeviceState *dev, const char *name) |
|
223 |
{ |
|
224 |
DeviceProperty *prop; |
|
225 |
|
|
226 |
prop = find_prop(dev, name, PROP_TYPE_DEV); |
|
227 |
if (!prop) { |
|
228 |
return NULL; |
|
229 |
} |
|
230 |
return prop->value.ptr; |
|
231 |
} |
|
232 |
|
|
208 | 233 |
void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) |
209 | 234 |
{ |
210 | 235 |
assert(dev->num_gpio_in == 0); |
Also available in: Unified diff