Revision 0ff596d0 hw/acpi.c

b/hw/acpi.c
35 35
    uint8_t apms;
36 36
    QEMUTimer *tmr_timer;
37 37
    int64_t tmr_overflow_time;
38
    SMBusDevice *smb_dev[128];
38
    i2c_bus *smbus;
39 39
    uint8_t smb_stat;
40 40
    uint8_t smb_ctl;
41 41
    uint8_t smb_cmd;
......
63 63
#define SMBHSTDAT1 0x06
64 64
#define SMBBLKDAT 0x07
65 65

  
66
/* Note: only used for piix4_smbus_register_device */
67
static PIIX4PMState *piix4_pm_state;
68

  
69 66
static uint32_t get_pmtmr(PIIX4PMState *s)
70 67
{
71 68
    uint32_t d;
......
258 255
    uint8_t read = s->smb_addr & 0x01;
259 256
    uint8_t cmd = s->smb_cmd;
260 257
    uint8_t addr = s->smb_addr >> 1;
261
    SMBusDevice *dev = s->smb_dev[addr];
258
    i2c_bus *bus = s->smbus;
262 259

  
263 260
#ifdef DEBUG
264 261
    printf("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
265 262
#endif
266
    if (!dev) goto error;
267

  
268 263
    switch(prot) {
269 264
    case 0x0:
270
        if (!dev->quick_cmd) goto error;
271
        (*dev->quick_cmd)(dev, read);
265
        smbus_quick_command(bus, addr, read);
272 266
        break;
273 267
    case 0x1:
274 268
        if (read) {
275
            if (!dev->receive_byte) goto error;
276
            s->smb_data0 = (*dev->receive_byte)(dev);
277
        }
278
        else {
279
            if (!dev->send_byte) goto error;
280
            (*dev->send_byte)(dev, cmd);
269
            s->smb_data0 = smbus_receive_byte(bus, addr);
270
        } else {
271
            smbus_send_byte(bus, addr, cmd);
281 272
        }
282 273
        break;
283 274
    case 0x2:
284 275
        if (read) {
285
            if (!dev->read_byte) goto error;
286
            s->smb_data0 = (*dev->read_byte)(dev, cmd);
287
        }
288
        else {
289
            if (!dev->write_byte) goto error;
290
            (*dev->write_byte)(dev, cmd, s->smb_data0);
276
            s->smb_data0 = smbus_read_byte(bus, addr, cmd);
277
        } else {
278
            smbus_write_byte(bus, addr, cmd, s->smb_data0);
291 279
        }
292 280
        break;
293 281
    case 0x3:
294 282
        if (read) {
295 283
            uint16_t val;
296
            if (!dev->read_word) goto error;
297
            val = (*dev->read_word)(dev, cmd);
284
            val = smbus_read_word(bus, addr, cmd);
298 285
            s->smb_data0 = val;
299 286
            s->smb_data1 = val >> 8;
300
        }
301
        else {
302
            if (!dev->write_word) goto error;
303
            (*dev->write_word)(dev, cmd, (s->smb_data1 << 8) | s->smb_data0);
287
        } else {
288
            smbus_write_word(bus, addr, cmd, (s->smb_data1 << 8) | s->smb_data0);
304 289
        }
305 290
        break;
306 291
    case 0x5:
307 292
        if (read) {
308
            if (!dev->read_block) goto error;
309
            s->smb_data0 = (*dev->read_block)(dev, cmd, s->smb_data);
310
        }
311
        else {
312
            if (!dev->write_block) goto error;
313
            (*dev->write_block)(dev, cmd, s->smb_data0, s->smb_data);
293
            s->smb_data0 = smbus_read_block(bus, addr, cmd, s->smb_data);
294
        } else {
295
            smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0);
314 296
        }
315 297
        break;
316 298
    default:
......
469 451
    return 0;
470 452
}
471 453

  
472
void piix4_pm_init(PCIBus *bus, int devfn)
454
i2c_bus *piix4_pm_init(PCIBus *bus, int devfn)
473 455
{
474 456
    PIIX4PMState *s;
475 457
    uint8_t *pci_conf;
......
514 496
    s->tmr_timer = qemu_new_timer(vm_clock, pm_tmr_timer, s);
515 497

  
516 498
    register_savevm("piix4_pm", 0, 1, pm_save, pm_load, s);
517
    piix4_pm_state = s;
518
}
519 499

  
520
void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr)
521
{
522
    piix4_pm_state->smb_dev[addr] = dev;
500
    s->smbus = i2c_init_bus();
501
    return s->smbus;
523 502
}

Also available in: Unified diff