2 * S5PC1XX Power Management Unit controller,
3 * Maxim MAX17040 Fuel Gauge,
4 * Maxim MAX8998 Battery Charger and Real Time Clock.
6 * Copyright (c) 2009 Samsung Electronics.
7 * Contributed by Dmitry Zhurikhin <zhur@ispras.ru>
8 * Vladimir Monakhov <vladimir.monakhov@ispras.ru>
15 #include "qemu-timer.h"
18 #define S5PC110_PMU_SFR_SIZE 0x8000
21 typedef struct S5pc1xxPMUState {
27 uint32_t eint_wakeup_mask;
33 uint32_t stop_mem_cfg;
39 uint32_t clamp_stable;
41 uint32_t blk_pwr_stat;
42 uint32_t body_bias_con;
43 uint32_t ion_skew_con;
44 uint32_t ion_skew_mon;
45 uint32_t ioff_skew_con;
46 uint32_t ioff_skew_mon;
50 uint32_t hdmi_control;
51 uint32_t usb_phy_control;
53 uint32_t mipi_dphy_control;
55 uint32_t ps_hold_control;
67 static uint32_t s5pc1xx_pmu_read(void *opaque, target_phys_addr_t offset)
69 S5pc1xxPMUState *s = (S5pc1xxPMUState *)opaque;
70 target_phys_addr_t test_offset = offset + 0x8000;
73 hw_error("s5pc1xx.pmu: bad read offset " TARGET_FMT_plx "\n", offset);
76 switch (test_offset) {
84 return s->eint_wakeup_mask;
86 return s->wakeup_mask;
96 return s->stop_mem_cfg;
102 return s->osc_stable;
104 return s->pwr_stable;
106 return s->mtc_stable;
108 return s->clamp_stable;
110 return s->wakeup_stat;
112 return s->blk_pwr_stat;
114 return s->body_bias_con;
116 return s->ion_skew_con;
118 return s->ion_skew_mon;
120 return s->ioff_skew_con;
122 return s->ioff_skew_mon;
128 return s->mie_control;
130 return s->hdmi_control;
132 return s->usb_phy_control;
134 return s->dac_control;
136 return s->mipi_dphy_control;
138 return s->adc_control;
140 return s->ps_hold_control;
158 hw_error("s5pc1xx.pmu: bad read offset " TARGET_FMT_plx "\n", offset);
162 static void s5pc1xx_pmu_write(void *opaque, target_phys_addr_t offset,
165 S5pc1xxPMUState *s = (S5pc1xxPMUState *)opaque;
166 target_phys_addr_t test_offset = offset + 0x8000;
168 /* TODO: Check if writing any values should change emulation flow */
171 hw_error("s5pc1xx.pmu: bad write offset " TARGET_FMT_plx "\n", offset);
174 switch (test_offset) {
182 s->eint_wakeup_mask = val;
185 s->wakeup_mask = val;
200 s->stop_mem_cfg = val;
218 s->clamp_stable = val;
221 s->wakeup_stat = val;
224 s->body_bias_con = val;
227 s->ion_skew_con = val;
230 s->ioff_skew_con = val;
236 s->mie_control = val;
239 s->hdmi_control = val;
242 s->usb_phy_control = val;
245 s->dac_control = val;
248 s->mipi_dphy_control = val;
251 s->adc_control = val;
254 s->ps_hold_control = val;
255 if ((val & (1 << 8)) == 0) {
256 qemu_system_shutdown_request();
283 case 0xA000: /* rst_stat */
284 case 0xC204: /* blk_pwr_stat */
285 case 0xC314: /* ion_skew_mon */
286 case 0xC324: /* ioff_skew_mon */
287 case 0xE100: /* om_stat */
288 hw_error("s5pc1xx.pmu: bad write offset " TARGET_FMT_plx "\n", offset);
291 hw_error("s5pc1xx.pmu: bad write offset " TARGET_FMT_plx "\n", offset);
295 static CPUReadMemoryFunc * const s5pc1xx_pmu_readfn[] = {
301 static CPUWriteMemoryFunc * const s5pc1xx_pmu_writefn[] = {
307 static void s5pc1xx_pmu_save(QEMUFile *f, void *opaque)
309 S5pc1xxPMUState *s = (S5pc1xxPMUState *)opaque;
311 qemu_put_be32s(f, &s->osc_con);
312 qemu_put_be32s(f, &s->rst_stat);
313 qemu_put_be32s(f, &s->pwr_cfg);
314 qemu_put_be32s(f, &s->eint_wakeup_mask);
315 qemu_put_be32s(f, &s->wakeup_mask);
316 qemu_put_be32s(f, &s->pwr_mode);
317 qemu_put_be32s(f, &s->normal_cfg);
318 qemu_put_be32s(f, &s->idle_cfg);
319 qemu_put_be32s(f, &s->stop_cfg);
320 qemu_put_be32s(f, &s->stop_mem_cfg);
321 qemu_put_be32s(f, &s->sleep_cfg);
322 qemu_put_be32s(f, &s->osc_freq);
323 qemu_put_be32s(f, &s->osc_stable);
324 qemu_put_be32s(f, &s->pwr_stable);
325 qemu_put_be32s(f, &s->mtc_stable);
326 qemu_put_be32s(f, &s->clamp_stable);
327 qemu_put_be32s(f, &s->wakeup_stat);
328 qemu_put_be32s(f, &s->blk_pwr_stat);
329 qemu_put_be32s(f, &s->body_bias_con);
330 qemu_put_be32s(f, &s->ion_skew_con);
331 qemu_put_be32s(f, &s->ion_skew_mon);
332 qemu_put_be32s(f, &s->ioff_skew_con);
333 qemu_put_be32s(f, &s->ioff_skew_mon);
334 qemu_put_be32s(f, &s->others);
335 qemu_put_be32s(f, &s->om_stat);
336 qemu_put_be32s(f, &s->mie_control);
337 qemu_put_be32s(f, &s->hdmi_control);
338 qemu_put_be32s(f, &s->usb_phy_control);
339 qemu_put_be32s(f, &s->dac_control);
340 qemu_put_be32s(f, &s->mipi_dphy_control);
341 qemu_put_be32s(f, &s->adc_control);
342 qemu_put_be32s(f, &s->ps_hold_control);
343 qemu_put_be32s(f, &s->inform0);
344 qemu_put_be32s(f, &s->inform1);
345 qemu_put_be32s(f, &s->inform2);
346 qemu_put_be32s(f, &s->inform3);
347 qemu_put_be32s(f, &s->inform4);
348 qemu_put_be32s(f, &s->inform5);
349 qemu_put_be32s(f, &s->inform6);
350 qemu_put_be32s(f, &s->inform7);
353 static int s5pc1xx_pmu_load(QEMUFile *f, void *opaque, int version_id)
355 S5pc1xxPMUState *s = (S5pc1xxPMUState *)opaque;
357 if (version_id != 1) {
361 qemu_get_be32s(f, &s->osc_con);
362 qemu_get_be32s(f, &s->rst_stat);
363 qemu_get_be32s(f, &s->pwr_cfg);
364 qemu_get_be32s(f, &s->eint_wakeup_mask);
365 qemu_get_be32s(f, &s->wakeup_mask);
366 qemu_get_be32s(f, &s->pwr_mode);
367 qemu_get_be32s(f, &s->normal_cfg);
368 qemu_get_be32s(f, &s->idle_cfg);
369 qemu_get_be32s(f, &s->stop_cfg);
370 qemu_get_be32s(f, &s->stop_mem_cfg);
371 qemu_get_be32s(f, &s->sleep_cfg);
372 qemu_get_be32s(f, &s->osc_freq);
373 qemu_get_be32s(f, &s->osc_stable);
374 qemu_get_be32s(f, &s->pwr_stable);
375 qemu_get_be32s(f, &s->mtc_stable);
376 qemu_get_be32s(f, &s->clamp_stable);
377 qemu_get_be32s(f, &s->wakeup_stat);
378 qemu_get_be32s(f, &s->blk_pwr_stat);
379 qemu_get_be32s(f, &s->body_bias_con);
380 qemu_get_be32s(f, &s->ion_skew_con);
381 qemu_get_be32s(f, &s->ion_skew_mon);
382 qemu_get_be32s(f, &s->ioff_skew_con);
383 qemu_get_be32s(f, &s->ioff_skew_mon);
384 qemu_get_be32s(f, &s->others);
385 qemu_get_be32s(f, &s->om_stat);
386 qemu_get_be32s(f, &s->mie_control);
387 qemu_get_be32s(f, &s->hdmi_control);
388 qemu_get_be32s(f, &s->usb_phy_control);
389 qemu_get_be32s(f, &s->dac_control);
390 qemu_get_be32s(f, &s->mipi_dphy_control);
391 qemu_get_be32s(f, &s->adc_control);
392 qemu_get_be32s(f, &s->ps_hold_control);
393 qemu_get_be32s(f, &s->inform0);
394 qemu_get_be32s(f, &s->inform1);
395 qemu_get_be32s(f, &s->inform2);
396 qemu_get_be32s(f, &s->inform3);
397 qemu_get_be32s(f, &s->inform4);
398 qemu_get_be32s(f, &s->inform5);
399 qemu_get_be32s(f, &s->inform6);
400 qemu_get_be32s(f, &s->inform7);
405 static void s5pc1xx_pmu_reset(void *opaque)
407 S5pc1xxPMUState *s = (S5pc1xxPMUState *)opaque;
409 s->osc_con = 0x00000003;
410 s->rst_stat = 0x00000001;
411 s->normal_cfg = 0xFFFFFFBF;
412 s->idle_cfg = 0x60000000;
413 s->stop_cfg = 0x96000000;
414 s->stop_mem_cfg = 0x000000FF;
415 s->osc_freq = 0x0000000F;
416 s->osc_stable = 0x000FFFFF;
417 s->mtc_stable = 0xFFFFFFFF;
418 s->clamp_stable = 0x03FF03FF;
419 s->blk_pwr_stat = 0x000000BF;
420 s->body_bias_con = 0x00000606;
421 s->mie_control = 0x00000001;
422 s->hdmi_control = 0x00960000;
423 s->dac_control = 0x00000001;
424 s->ps_hold_control = 0x00005301;
427 static int s5pc1xx_pmu_init(SysBusDevice *dev)
429 S5pc1xxPMUState *s = FROM_SYSBUS(S5pc1xxPMUState, dev);
433 cpu_register_io_memory(s5pc1xx_pmu_readfn, s5pc1xx_pmu_writefn, s, DEVICE_NATIVE_ENDIAN);
434 sysbus_init_mmio(dev, S5PC110_PMU_SFR_SIZE, iomemtype);
436 s5pc1xx_pmu_reset(s);
438 qemu_register_reset(s5pc1xx_pmu_reset, s);
439 register_savevm(&dev->qdev, "s5pc1xx.pmu", -1, 1,
440 s5pc1xx_pmu_save, s5pc1xx_pmu_load, s);
446 /* Maxim MAX17040 Fuel Gauge */
448 #define MAX17040_VCELL_MSB 0x02
449 #define MAX17040_VCELL_LSB 0x03
450 #define MAX17040_SOC_MSB 0x04
451 #define MAX17040_SOC_LSB 0x05
452 #define MAX17040_MODE_MSB 0x06
453 #define MAX17040_MODE_LSB 0x07
454 #define MAX17040_VER_MSB 0x08
455 #define MAX17040_VER_LSB 0x09
456 #define MAX17040_RCOMP_MSB 0x0C
457 #define MAX17040_RCOMP_LSB 0x0D
458 #define MAX17040_CMD_MSB 0xFE
459 #define MAX17040_CMD_LSB 0xFF
461 #define MAX17040_DELAY 1000
462 #define MAX17040_BATTERY_FULL 95
463 #define MAX17040_BATTERY_CHARGE 40
466 typedef struct MAX17040State {
467 SMBusDevice smbusdev;
477 static void max17040_reset(void *opaque)
479 MAX17040State *s = (MAX17040State *)opaque;
481 s->charge = MAX17040_BATTERY_CHARGE << 8;
489 static void max17040_write_data(SMBusDevice *dev, uint8_t cmd,
490 uint8_t *buf, int len)
492 MAX17040State *s = (MAX17040State *)dev;
494 uint16_t *reg = NULL;
497 case MAX17040_VCELL_LSB:
499 case MAX17040_VCELL_MSB:
502 case MAX17040_SOC_LSB:
504 case MAX17040_SOC_MSB:
507 case MAX17040_MODE_LSB:
509 case MAX17040_MODE_MSB:
512 case MAX17040_VER_LSB:
514 case MAX17040_VER_MSB:
517 case MAX17040_RCOMP_LSB:
519 case MAX17040_RCOMP_MSB:
522 case MAX17040_CMD_LSB:
524 case MAX17040_CMD_MSB:
528 hw_error("max17040: bad write offset 0x%x\n", cmd);
531 if (len > 2 - shift) {
532 hw_error("max17040: bad write length %d\n", len);
535 for (i = 0; i < len; i++) {
536 *((uint8_t *)reg + i + shift) = buf[i];
540 static uint8_t max17040_read_data(SMBusDevice *dev, uint8_t cmd, int n)
542 MAX17040State *s = (MAX17040State *)dev;
547 //bypass => todo check!!
548 //hw_error("max17040: bad read length %d\n", n);
552 case MAX17040_VCELL_MSB:
554 case MAX17040_VCELL_LSB:
557 case MAX17040_SOC_MSB:
559 case MAX17040_SOC_LSB:
562 case MAX17040_MODE_MSB:
564 case MAX17040_MODE_LSB:
567 case MAX17040_VER_MSB:
569 case MAX17040_VER_LSB:
572 case MAX17040_RCOMP_MSB:
574 case MAX17040_RCOMP_LSB:
577 case MAX17040_CMD_MSB:
579 case MAX17040_CMD_LSB:
583 hw_error("max17040: bad read offset 0x%x\n", cmd);
586 return ((val >> (shift * 8)) & 0xFF);
589 static void max17040_save(QEMUFile *f, void *opaque)
591 MAX17040State *s = (MAX17040State *)opaque;
593 qemu_put_be16s(f, &s->charge);
594 qemu_put_be16s(f, &s->vcell);
595 qemu_put_be16s(f, &s->mode);
596 qemu_put_be16s(f, &s->ver);
597 qemu_put_be16s(f, &s->rcomp);
598 qemu_put_be16s(f, &s->cmd);
601 static int max17040_load(QEMUFile *f, void *opaque, int version_id)
603 MAX17040State *s = (MAX17040State *)opaque;
605 if (version_id != 1) {
609 qemu_get_be16s(f, &s->charge);
610 qemu_get_be16s(f, &s->vcell);
611 qemu_get_be16s(f, &s->mode);
612 qemu_get_be16s(f, &s->ver);
613 qemu_get_be16s(f, &s->rcomp);
614 qemu_get_be16s(f, &s->cmd);
619 DeviceState *max17040_init(i2c_bus *bus, int addr)
621 DeviceState *dev = qdev_create((BusState *)bus, "max17040");
622 qdev_init_nofail(dev);
623 i2c_set_slave_address((i2c_slave *)dev, addr);
627 static int max17040_init1(SMBusDevice *dev)
629 MAX17040State *s = (MAX17040State *) dev;
631 qemu_register_reset(max17040_reset, s);
632 register_savevm(&dev->i2c.qdev, "max17040", -1, 1,
633 max17040_save, max17040_load, s);
637 static SMBusDeviceInfo max17040_info = {
638 .i2c.qdev.name = "max17040",
639 .i2c.qdev.size = sizeof(MAX17040State),
640 .init = max17040_init1,
641 .write_data = max17040_write_data,
642 .read_data = max17040_read_data
646 /* Maxim MAX8998 Battery Charger */
648 #define MAX8998_REG_IRQ1 0
649 #define MAX8998_REG_IRQ2 1
650 #define MAX8998_REG_IRQ3 2
651 #define MAX8998_REG_IRQ4 3
652 #define MAX8998_REG_IRQM1 4
653 #define MAX8998_REG_IRQM2 5
654 #define MAX8998_REG_IRQM3 6
655 #define MAX8998_REG_IRQM4 7
656 #define MAX8998_REG_STATUS1 8
657 #define MAX8998_REG_STATUS2 9
658 #define MAX8998_REG_STATUSM1 10
659 #define MAX8998_REG_STATUSM2 11
660 #define MAX8998_REG_CHGR1 12
661 #define MAX8998_REG_CHGR2 13
662 #define MAX8998_REG_LDO_ACTIVE_DISCHARGE1 14
663 #define MAX8998_REG_LDO_ACTIVE_DISCHARGE2 15
664 #define MAX8998_REG_BUCK_ACTIVE_DISCHARGE3 16
665 #define MAX8998_REG_ONOFF1 17
666 #define MAX8998_REG_ONOFF2 18
667 #define MAX8998_REG_ONOFF3 19
668 #define MAX8998_REG_ONOFF4 20
669 #define MAX8998_REG_BUCK1_DVSARM1 21
670 #define MAX8998_REG_BUCK1_DVSARM2 22
671 #define MAX8998_REG_BUCK1_DVSARM3 23
672 #define MAX8998_REG_BUCK1_DVSARM4 24
673 #define MAX8998_REG_BUCK2_DVSINT1 25
674 #define MAX8998_REG_BUCK2_DVSINT2 26
675 #define MAX8998_REG_BUCK3 27
676 #define MAX8998_REG_BUCK4 28
677 #define MAX8998_REG_LDO2_LDO3 29
678 #define MAX8998_REG_LDO4 30
679 #define MAX8998_REG_LDO5 31
680 #define MAX8998_REG_LDO6 32
681 #define MAX8998_REG_LDO7 33
682 #define MAX8998_REG_LDO8_LDO9 34
683 #define MAX8998_REG_LDO10_LDO11 35
684 #define MAX8998_REG_LDO12 36
685 #define MAX8998_REG_LDO13 37
686 #define MAX8998_REG_LDO14 38
687 #define MAX8998_REG_LDO15 39
688 #define MAX8998_REG_LDO16 40
689 #define MAX8998_REG_LDO17 41
690 #define MAX8998_REG_BKCHR 42
691 #define MAX8998_REG_LBCNFG1 43
692 #define MAX8998_REG_LBCNFG2 44
695 typedef struct MAX8998State {
696 SMBusDevice smbusdev;
703 uint16_t ldo_active_discharge;
704 uint8_t buck_active_discharge;
706 uint32_t buck1_dvsarm;
707 uint16_t buck2_dvsint;
710 uint32_t ldo23_4_5_6;
711 uint32_t ldo7_89_1011_12;
712 uint32_t ldo13_14_15_16;
718 static void max8998_reset(void *opaque)
720 MAX8998State *s = (MAX8998State *)opaque;
727 s->ldo_active_discharge = 0;
728 s->buck_active_discharge = 0;
735 s->ldo7_89_1011_12 = 0;
736 s->ldo13_14_15_16 = 0;
742 static uint8_t *max8998_get_reg_addr(MAX8998State *s, uint8_t cmd)
748 case MAX8998_REG_IRQ4:
749 case MAX8998_REG_IRQM4:
750 case MAX8998_REG_STATUS2:
751 case MAX8998_REG_STATUSM2:
752 case MAX8998_REG_CHGR2:
753 case MAX8998_REG_LDO_ACTIVE_DISCHARGE2:
754 case MAX8998_REG_BUCK_ACTIVE_DISCHARGE3:
755 case MAX8998_REG_ONOFF4:
756 case MAX8998_REG_BUCK1_DVSARM4:
757 case MAX8998_REG_BUCK2_DVSINT2:
758 case MAX8998_REG_BUCK3:
759 case MAX8998_REG_BUCK4:
760 case MAX8998_REG_LDO6:
761 case MAX8998_REG_LDO12:
762 case MAX8998_REG_LDO16:
763 case MAX8998_REG_LDO17:
764 case MAX8998_REG_BKCHR:
765 case MAX8998_REG_LBCNFG2:
767 case MAX8998_REG_IRQ3:
768 case MAX8998_REG_IRQM3:
769 case MAX8998_REG_STATUS1:
770 case MAX8998_REG_STATUSM1:
771 case MAX8998_REG_CHGR1:
772 case MAX8998_REG_LDO_ACTIVE_DISCHARGE1:
773 case MAX8998_REG_ONOFF3:
774 case MAX8998_REG_BUCK1_DVSARM3:
775 case MAX8998_REG_BUCK2_DVSINT1:
776 case MAX8998_REG_LDO5:
777 case MAX8998_REG_LDO10_LDO11:
778 case MAX8998_REG_LDO15:
779 case MAX8998_REG_LBCNFG1:
782 case MAX8998_REG_IRQ2:
783 case MAX8998_REG_IRQM2:
784 case MAX8998_REG_ONOFF2:
785 case MAX8998_REG_BUCK1_DVSARM2:
786 case MAX8998_REG_LDO4:
787 case MAX8998_REG_LDO8_LDO9:
788 case MAX8998_REG_LDO14:
791 case MAX8998_REG_IRQ1:
792 case MAX8998_REG_IRQM1:
793 case MAX8998_REG_ONOFF1:
794 case MAX8998_REG_BUCK1_DVSARM1:
795 case MAX8998_REG_LDO2_LDO3:
796 case MAX8998_REG_LDO7:
797 case MAX8998_REG_LDO13:
801 hw_error("max8998: bad write offset 0x%x\n", cmd);
805 case MAX8998_REG_IRQ1:
806 case MAX8998_REG_IRQ2:
807 case MAX8998_REG_IRQ3:
808 case MAX8998_REG_IRQ4:
809 reg = (uint8_t *)&s->irq;
811 case MAX8998_REG_IRQM1:
812 case MAX8998_REG_IRQM2:
813 case MAX8998_REG_IRQM3:
814 case MAX8998_REG_IRQM4:
815 reg = (uint8_t *)&s->irqm;
817 case MAX8998_REG_STATUS1:
818 case MAX8998_REG_STATUS2:
819 reg = (uint8_t *)&s->status;
821 case MAX8998_REG_STATUSM1:
822 case MAX8998_REG_STATUSM2:
823 reg = (uint8_t *)&s->statusm;
825 case MAX8998_REG_CHGR1:
826 case MAX8998_REG_CHGR2:
827 reg = (uint8_t *)&s->chgr;
829 case MAX8998_REG_LDO_ACTIVE_DISCHARGE1:
830 case MAX8998_REG_LDO_ACTIVE_DISCHARGE2:
831 reg = (uint8_t *)&s->ldo_active_discharge;
833 case MAX8998_REG_BUCK_ACTIVE_DISCHARGE3:
834 reg = (uint8_t *)&s->buck_active_discharge;
836 case MAX8998_REG_ONOFF1:
837 case MAX8998_REG_ONOFF2:
838 case MAX8998_REG_ONOFF3:
839 case MAX8998_REG_ONOFF4:
840 reg = (uint8_t *)&s->onoff;
842 case MAX8998_REG_BUCK1_DVSARM1:
843 case MAX8998_REG_BUCK1_DVSARM2:
844 case MAX8998_REG_BUCK1_DVSARM3:
845 case MAX8998_REG_BUCK1_DVSARM4:
846 reg = (uint8_t *)&s->buck1_dvsarm;
848 case MAX8998_REG_BUCK2_DVSINT1:
849 case MAX8998_REG_BUCK2_DVSINT2:
850 reg = (uint8_t *)&s->buck2_dvsint;
852 case MAX8998_REG_BUCK3:
853 reg = (uint8_t *)&s->buck3;
855 case MAX8998_REG_BUCK4:
856 reg = (uint8_t *)&s->buck4;
858 case MAX8998_REG_LDO2_LDO3:
859 case MAX8998_REG_LDO4:
860 case MAX8998_REG_LDO5:
861 case MAX8998_REG_LDO6:
862 reg = (uint8_t *)&s->ldo23_4_5_6;
864 case MAX8998_REG_LDO7:
865 case MAX8998_REG_LDO8_LDO9:
866 case MAX8998_REG_LDO10_LDO11:
867 case MAX8998_REG_LDO12:
868 reg = (uint8_t *)&s->ldo7_89_1011_12;
870 case MAX8998_REG_LDO13:
871 case MAX8998_REG_LDO14:
872 case MAX8998_REG_LDO15:
873 case MAX8998_REG_LDO16:
874 reg = (uint8_t *)&s->ldo13_14_15_16;
876 case MAX8998_REG_LDO17:
877 reg = (uint8_t *)&s->ldo17;
879 case MAX8998_REG_BKCHR:
880 reg = (uint8_t *)&s->bkchr;
882 case MAX8998_REG_LBCNFG1:
883 case MAX8998_REG_LBCNFG2:
884 reg = (uint8_t *)&s->lbcnfg;
887 hw_error("max8998: bad write offset 0x%x\n", cmd);
890 return (reg + shift);
893 static void max8998_write_data(SMBusDevice *dev, uint8_t cmd,
894 uint8_t *buf, int len)
896 MAX8998State *s = (MAX8998State *)dev;
899 hw_error("max8998: bad write length %d\n", len);
902 *(max8998_get_reg_addr(s, cmd)) = buf[0];
905 static uint8_t max8998_read_data(SMBusDevice *dev, uint8_t cmd, int n)
907 MAX8998State *s = (MAX8998State *)dev;
909 if (n > 0 && cmd != MAX8998_REG_IRQ1) {
910 hw_error("max8998: bad read length %d\n", n);
913 return *(max8998_get_reg_addr(s, cmd) + n);
916 static void max8998_save(QEMUFile *f, void *opaque)
918 MAX8998State *s = (MAX8998State *)opaque;
920 qemu_put_be32s(f, &s->irq);
921 qemu_put_be32s(f, &s->irqm);
922 qemu_put_be16s(f, &s->status);
923 qemu_put_be16s(f, &s->statusm);
924 qemu_put_be16s(f, &s->chgr);
925 qemu_put_be16s(f, &s->ldo_active_discharge);
926 qemu_put_8s (f, &s->buck_active_discharge);
927 qemu_put_be32s(f, &s->onoff);
928 qemu_put_be32s(f, &s->buck1_dvsarm);
929 qemu_put_be16s(f, &s->buck2_dvsint);
930 qemu_put_8s (f, &s->buck3);
931 qemu_put_8s (f, &s->buck4);
932 qemu_put_be32s(f, &s->ldo23_4_5_6);
933 qemu_put_be32s(f, &s->ldo7_89_1011_12);
934 qemu_put_be32s(f, &s->ldo13_14_15_16);
935 qemu_put_8s (f, &s->ldo17);
936 qemu_put_8s (f, &s->bkchr);
937 qemu_put_be16s(f, &s->lbcnfg);
940 static int max8998_load(QEMUFile *f, void *opaque, int version_id)
942 MAX8998State *s = (MAX8998State *)opaque;
944 if (version_id != 1) {
948 qemu_get_be32s(f, &s->irq);
949 qemu_get_be32s(f, &s->irqm);
950 qemu_get_be16s(f, &s->status);
951 qemu_get_be16s(f, &s->statusm);
952 qemu_get_be16s(f, &s->chgr);
953 qemu_get_be16s(f, &s->ldo_active_discharge);
954 qemu_get_8s (f, &s->buck_active_discharge);
955 qemu_get_be32s(f, &s->onoff);
956 qemu_get_be32s(f, &s->buck1_dvsarm);
957 qemu_get_be16s(f, &s->buck2_dvsint);
958 qemu_get_8s (f, &s->buck3);
959 qemu_get_8s (f, &s->buck4);
960 qemu_get_be32s(f, &s->ldo23_4_5_6);
961 qemu_get_be32s(f, &s->ldo7_89_1011_12);
962 qemu_get_be32s(f, &s->ldo13_14_15_16);
963 qemu_get_8s (f, &s->ldo17);
964 qemu_get_8s (f, &s->bkchr);
965 qemu_get_be16s(f, &s->lbcnfg);
970 DeviceState *max8998_init(i2c_bus *bus, int addr)
972 DeviceState *dev = qdev_create((BusState *)bus, "max8998");
973 qdev_init_nofail(dev);
974 i2c_set_slave_address((i2c_slave *)dev, addr);
978 static int max8998_init1(SMBusDevice *dev)
980 MAX8998State *s = (MAX8998State *) dev;
982 qemu_register_reset(max8998_reset, s);
983 register_savevm(&dev->i2c.qdev, "max8998", -1, 1,
984 max8998_save, max8998_load, s);
988 static SMBusDeviceInfo max8998_info = {
989 .i2c.qdev.name = "max8998",
990 .i2c.qdev.size = sizeof(MAX8998State),
991 .init = max8998_init1,
992 .write_data = max8998_write_data,
993 .read_data = max8998_read_data
997 /* Maxim MAX8998 Real Time Clock */
999 /* MX8998 RTC I2C MAP */
1000 #define RTC_SEC 0x0 /* second 00-59 */
1001 #define RTC_MIN 0x1 /* minute 00-59 */
1002 #define RTC_HR 0x2 /* hour AM/PM 1-12 or 00-23 */
1003 #define RTC_DAY 0x3 /* weekday 1-7 */
1004 #define RTC_DATE 0x4 /* date 01-31 */
1005 #define RTC_MT 0x5 /* month 01-12 */
1006 #define RTC_YEAR 0x6 /* year 00-99 */
1007 #define RTC_CEN 0x7 /* century 00-99 */
1009 #define RTC_CON 0x1A
1010 #define RTC_EN 0x01 /* RTC control enable */
1012 #define MAX8998_REG(x, y) (0x8 * y + x)
1015 #define MAX8998_RTC 0
1017 #define MAX8998_ALRM0 1
1019 #define MAX8998_ALRM1 2
1021 #define MAX8998_ALRM0_CONF 0x18
1022 #define MAX8998_ALRM1_CONF 0x19
1024 #define MAX8998_ALRM_ON 0x77
1025 #define MAX8998_ALRM_OFF 0x0
1028 typedef struct MAX8998RTCState {
1029 SMBusDevice smbusdev;
1031 uint8_t regs[RTC_CON + 1];
1033 /* seconds update */
1034 QEMUTimer *seconds_timer;
1035 struct tm current_tm;
1038 static void max8998_rtc_seconds_update(void *opaque);
1040 /* Set default values for all fields */
1041 static void max8998_rtc_reset(void *opaque)
1043 MAX8998RTCState *s = (MAX8998RTCState *)opaque;
1046 /* stop seconds timer */
1047 s->regs[RTC_CON] = 0x0;
1048 max8998_rtc_seconds_update(s);
1050 for (i = RTC_SEC; i <= RTC_CEN; i++) {
1051 s->regs[MAX8998_REG(i, MAX8998_RTC)] = 0;
1053 /* get time from host */
1054 qemu_get_timedate(&s->current_tm, 0);
1056 /* start seconds timer */
1057 s->regs[RTC_CON] |= RTC_EN;
1058 max8998_rtc_seconds_update(s);
1061 /* Get days in month. Month is between 0 and 11 */
1062 static int get_days_in_month(int month, int year)
1065 static const int days_tab[12] = {
1066 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
1069 if ((unsigned)month >= 12) {
1072 d = days_tab[month];
1074 if ((year % 4) == 0) {
1081 /* Update 'struct tm' to the next second */
1082 static void max8998_rtc_next_second(struct tm *tm)
1087 if ((unsigned)tm->tm_sec >= 60) {
1090 if ((unsigned)tm->tm_min >= 60) {
1093 if ((unsigned)tm->tm_hour >= 24) {
1097 if ((unsigned)tm->tm_wday >= 8) {
1100 days_in_month = get_days_in_month(tm->tm_mon, tm->tm_year);
1102 if (tm->tm_mday < 1) {
1104 } else if (tm->tm_mday > days_in_month) {
1107 if (tm->tm_mon >= 12) {
1117 /* Using of qemu_timer to increase seconds */
1118 static void max8998_rtc_seconds_update(void *opaque)
1120 MAX8998RTCState *s = (MAX8998RTCState *)opaque;
1121 uint64_t next_seconds_time;
1123 if (s->regs[RTC_CON] & RTC_EN) {
1124 max8998_rtc_next_second(&(s->current_tm));
1125 next_seconds_time = qemu_get_clock(vm_clock) + get_ticks_per_sec();
1126 qemu_mod_timer(s->seconds_timer, next_seconds_time);
1128 qemu_del_timer(s->seconds_timer);
1132 /* Convert time from bcd */
1133 static void max8998_rtc_set_time(MAX8998RTCState *s)
1135 struct tm *tm = &(s->current_tm);
1137 tm->tm_sec = from_bcd(s->regs[RTC_SEC]);
1138 tm->tm_min = from_bcd(s->regs[RTC_MIN]);
1139 tm->tm_hour = from_bcd(s->regs[RTC_HR] & 0x3f);
1140 tm->tm_mday = from_bcd(s->regs[RTC_DATE]);
1141 tm->tm_mon = from_bcd(s->regs[RTC_MT]);
1142 tm->tm_year = from_bcd(s->regs[RTC_YEAR]) +
1143 from_bcd(s->regs[RTC_CEN]) * 100 - 1900;
1144 tm->tm_wday = s->regs[RTC_DAY]; /* one decimal digit */
1147 /* Convert time to bcd */
1148 static void max8998_rtc_read_time(MAX8998RTCState *s)
1150 const struct tm *tm = &(s->current_tm);
1152 s->regs[RTC_SEC] = to_bcd(tm->tm_sec);
1153 s->regs[RTC_MIN] = to_bcd(tm->tm_min);
1154 s->regs[RTC_HR] = to_bcd(tm->tm_hour);
1155 s->regs[RTC_DATE] = to_bcd(tm->tm_mday);
1156 s->regs[RTC_MT] = to_bcd(tm->tm_mon);
1157 s->regs[RTC_YEAR] = to_bcd(tm->tm_year % 100);
1158 s->regs[RTC_CEN] = to_bcd((tm->tm_year + 1900) / 100);
1159 s->regs[RTC_DAY] = tm->tm_wday; /* one decimal digit */
1162 /* Write RTC MAX8998 by I2C through SMBus */
1163 static void max8998_rtc_write(SMBusDevice *dev, uint8_t cmd,
1164 uint8_t *buf, int len)
1166 MAX8998RTCState *s = (MAX8998RTCState *)dev;
1167 uint8_t *reg = NULL;
1171 case MAX8998_REG(RTC_SEC, MAX8998_RTC) ...
1172 MAX8998_REG(RTC_CEN, MAX8998_RTC):
1173 case MAX8998_ALRM0_CONF:
1174 case MAX8998_ALRM1_CONF:
1175 reg = &s->regs[cmd];
1178 /* TODO: Implement alarm support */
1179 case MAX8998_REG(RTC_SEC, MAX8998_ALRM0) ...
1180 MAX8998_REG(RTC_CEN, MAX8998_ALRM1):
1184 hw_error("max8998-rtc: bad write offset 0x%x\n", cmd);
1187 for (i = 0; i < len; i++) {
1188 *((uint8_t *)reg + i) = buf[i];
1191 if (cmd <= MAX8998_REG(RTC_CEN, MAX8998_RTC)) {
1192 max8998_rtc_set_time(s);
1196 /* Read RTC MAX8998 by I2C through SMBus */
1197 static uint8_t max8998_rtc_read(SMBusDevice *dev, uint8_t cmd, int n)
1199 MAX8998RTCState *s = (MAX8998RTCState *)dev;
1203 hw_error("max8998-rtc: bad read length %d\n", n);
1207 case MAX8998_REG(RTC_SEC, MAX8998_RTC) ...
1208 MAX8998_REG(RTC_CEN, MAX8998_RTC):
1209 max8998_rtc_read_time(s);
1210 case MAX8998_ALRM0_CONF:
1211 case MAX8998_ALRM1_CONF:
1215 /* TODO: Implement alarm support */
1216 case MAX8998_REG(RTC_SEC, MAX8998_ALRM0) ...
1217 MAX8998_REG(RTC_CEN, MAX8998_ALRM1):
1221 hw_error("max8998-rtc: bad read offset 0x%x\n", cmd);
1224 return (val & 0xFF);
1227 static void max8998_rtc_save(QEMUFile *f, void *opaque)
1229 MAX8998RTCState *s = (MAX8998RTCState *)opaque;
1231 max8998_rtc_read_time(s);
1233 qemu_put_buffer(f, s->regs, sizeof(s->regs));
1234 qemu_put_timer(f, s->seconds_timer);
1237 static int max8998_rtc_load(QEMUFile *f, void *opaque, int version_id)
1239 MAX8998RTCState *s = (MAX8998RTCState *)opaque;
1241 if (version_id != 1) {
1245 qemu_get_buffer(f, s->regs, sizeof(s->regs));
1247 qemu_get_timedate(&s->current_tm, 0);
1248 max8998_rtc_read_time(s);
1250 qemu_get_timer(f, s->seconds_timer);
1255 DeviceState *max8998_rtc_init(i2c_bus *bus, int addr)
1257 DeviceState *dev = qdev_create((BusState *)bus, "max8998-rtc");
1258 qdev_init_nofail(dev);
1259 i2c_set_slave_address((i2c_slave *)dev, addr);
1263 static int max8998_rtc_init1(SMBusDevice *dev)
1265 MAX8998RTCState *s = (MAX8998RTCState *) dev;
1267 s->seconds_timer = qemu_new_timer(vm_clock, max8998_rtc_seconds_update, s);
1269 /* initialize values */
1270 max8998_rtc_reset(s);
1272 qemu_register_reset(max8998_rtc_reset, s);
1273 register_savevm(&dev->i2c.qdev, "max8998-rtc", -1, 1,
1274 max8998_rtc_save, max8998_rtc_load, s);
1279 static SMBusDeviceInfo max8998_rtc_info = {
1280 .i2c.qdev.name = "max8998-rtc",
1281 .i2c.qdev.size = sizeof(MAX8998RTCState),
1282 .init = max8998_rtc_init1,
1283 .write_data = max8998_rtc_write,
1284 .read_data = max8998_rtc_read
1287 static void s5pc1xx_pmu_register_devices(void)
1289 sysbus_register_dev("s5pc1xx.pmu", sizeof(S5pc1xxPMUState), s5pc1xx_pmu_init);
1290 smbus_register_device(&max17040_info);
1291 smbus_register_device(&max8998_info);
1292 smbus_register_device(&max8998_rtc_info);
1295 device_init(s5pc1xx_pmu_register_devices)