Revision f0495f56
b/hw/twl92230.c | ||
---|---|---|
60 | 60 |
int alm_sec; |
61 | 61 |
int next_comp; |
62 | 62 |
} rtc; |
63 |
uint16_t rtc_next_vmstate; |
|
63 | 64 |
qemu_irq out[4]; |
64 | 65 |
qemu_irq *in; |
65 | 66 |
uint8_t pwrbtn_state; |
... | ... | |
747 | 748 |
return menelaus_read(s, s->reg ++); |
748 | 749 |
} |
749 | 750 |
|
750 |
static void tm_put(QEMUFile *f, struct tm *tm) { |
|
751 |
qemu_put_be16(f, tm->tm_sec); |
|
752 |
qemu_put_be16(f, tm->tm_min); |
|
753 |
qemu_put_be16(f, tm->tm_hour); |
|
754 |
qemu_put_be16(f, tm->tm_mday); |
|
755 |
qemu_put_be16(f, tm->tm_min); |
|
756 |
qemu_put_be16(f, tm->tm_year); |
|
757 |
} |
|
751 |
/* Save restore 32 bit int as uint16_t |
|
752 |
This is a Big hack, but it is how the old state did it. |
|
753 |
Or we broke compatibility in the state, or we can't use struct tm |
|
754 |
*/ |
|
758 | 755 |
|
759 |
static void tm_get(QEMUFile *f, struct tm *tm) { |
|
760 |
tm->tm_sec = qemu_get_be16(f); |
|
761 |
tm->tm_min = qemu_get_be16(f); |
|
762 |
tm->tm_hour = qemu_get_be16(f); |
|
763 |
tm->tm_mday = qemu_get_be16(f); |
|
764 |
tm->tm_min = qemu_get_be16(f); |
|
765 |
tm->tm_year = qemu_get_be16(f); |
|
756 |
static int get_int32_as_uint16(QEMUFile *f, void *pv, size_t size) |
|
757 |
{ |
|
758 |
int *v = pv; |
|
759 |
*v = qemu_get_be16(f); |
|
760 |
return 0; |
|
766 | 761 |
} |
767 | 762 |
|
768 |
static void menelaus_save(QEMUFile *f, void *opaque)
|
|
763 |
static void put_int32_as_uint16(QEMUFile *f, void *pv, size_t size)
|
|
769 | 764 |
{ |
770 |
MenelausState *s = (MenelausState *) opaque; |
|
765 |
int *v = pv; |
|
766 |
qemu_put_be16(f, *v); |
|
767 |
} |
|
771 | 768 |
|
772 |
qemu_put_be32(f, s->firstbyte); |
|
773 |
qemu_put_8s(f, &s->reg); |
|
774 |
|
|
775 |
qemu_put_8s(f, &s->vcore[0]); |
|
776 |
qemu_put_8s(f, &s->vcore[1]); |
|
777 |
qemu_put_8s(f, &s->vcore[2]); |
|
778 |
qemu_put_8s(f, &s->vcore[3]); |
|
779 |
qemu_put_8s(f, &s->vcore[4]); |
|
780 |
qemu_put_8s(f, &s->dcdc[0]); |
|
781 |
qemu_put_8s(f, &s->dcdc[1]); |
|
782 |
qemu_put_8s(f, &s->dcdc[2]); |
|
783 |
qemu_put_8s(f, &s->ldo[0]); |
|
784 |
qemu_put_8s(f, &s->ldo[1]); |
|
785 |
qemu_put_8s(f, &s->ldo[2]); |
|
786 |
qemu_put_8s(f, &s->ldo[3]); |
|
787 |
qemu_put_8s(f, &s->ldo[4]); |
|
788 |
qemu_put_8s(f, &s->ldo[5]); |
|
789 |
qemu_put_8s(f, &s->ldo[6]); |
|
790 |
qemu_put_8s(f, &s->ldo[7]); |
|
791 |
qemu_put_8s(f, &s->sleep[0]); |
|
792 |
qemu_put_8s(f, &s->sleep[1]); |
|
793 |
qemu_put_8s(f, &s->osc); |
|
794 |
qemu_put_8s(f, &s->detect); |
|
795 |
qemu_put_be16s(f, &s->mask); |
|
796 |
qemu_put_be16s(f, &s->status); |
|
797 |
qemu_put_8s(f, &s->dir); |
|
798 |
qemu_put_8s(f, &s->inputs); |
|
799 |
qemu_put_8s(f, &s->outputs); |
|
800 |
qemu_put_8s(f, &s->bbsms); |
|
801 |
qemu_put_8s(f, &s->pull[0]); |
|
802 |
qemu_put_8s(f, &s->pull[1]); |
|
803 |
qemu_put_8s(f, &s->pull[2]); |
|
804 |
qemu_put_8s(f, &s->pull[3]); |
|
805 |
qemu_put_8s(f, &s->mmc_ctrl[0]); |
|
806 |
qemu_put_8s(f, &s->mmc_ctrl[1]); |
|
807 |
qemu_put_8s(f, &s->mmc_ctrl[2]); |
|
808 |
qemu_put_8s(f, &s->mmc_debounce); |
|
809 |
qemu_put_8s(f, &s->rtc.ctrl); |
|
810 |
qemu_put_be16s(f, &s->rtc.comp); |
|
811 |
/* Should be <= 1000 */ |
|
812 |
qemu_put_be16(f, s->rtc.next - qemu_get_clock(rt_clock)); |
|
813 |
tm_put(f, &s->rtc.new); |
|
814 |
tm_put(f, &s->rtc.alm); |
|
815 |
qemu_put_byte(f, s->pwrbtn_state); |
|
769 |
const VMStateInfo vmstate_hack_int32_as_uint16 = { |
|
770 |
.name = "int32_as_uint16", |
|
771 |
.get = get_int32_as_uint16, |
|
772 |
.put = put_int32_as_uint16, |
|
773 |
}; |
|
816 | 774 |
|
817 |
i2c_slave_save(f, &s->i2c); |
|
818 |
} |
|
775 |
#define VMSTATE_UINT16_HACK(_f, _s) \ |
|
776 |
VMSTATE_SINGLE(_f, _s, 0, vmstate_hack_int32_as_uint16, int32_t) |
|
777 |
|
|
778 |
|
|
779 |
static const VMStateDescription vmstate_menelaus_tm = { |
|
780 |
.name = "menelaus_tm", |
|
781 |
.version_id = 0, |
|
782 |
.minimum_version_id = 0, |
|
783 |
.minimum_version_id_old = 0, |
|
784 |
.fields = (VMStateField []) { |
|
785 |
VMSTATE_UINT16_HACK(tm_sec, struct tm), |
|
786 |
VMSTATE_UINT16_HACK(tm_min, struct tm), |
|
787 |
VMSTATE_UINT16_HACK(tm_hour, struct tm), |
|
788 |
VMSTATE_UINT16_HACK(tm_mday, struct tm), |
|
789 |
VMSTATE_UINT16_HACK(tm_min, struct tm), |
|
790 |
VMSTATE_UINT16_HACK(tm_year, struct tm), |
|
791 |
VMSTATE_END_OF_LIST() |
|
792 |
} |
|
793 |
}; |
|
819 | 794 |
|
820 |
static int menelaus_load(QEMUFile *f, void *opaque, int version_id)
|
|
795 |
static void menelaus_pre_save(void *opaque)
|
|
821 | 796 |
{ |
822 |
MenelausState *s = (MenelausState *) opaque; |
|
797 |
MenelausState *s = opaque; |
|
798 |
/* Should be <= 1000 */ |
|
799 |
s->rtc_next_vmstate = s->rtc.next - qemu_get_clock(rt_clock); |
|
800 |
} |
|
823 | 801 |
|
824 |
s->firstbyte = qemu_get_be32(f); |
|
825 |
qemu_get_8s(f, &s->reg); |
|
802 |
static int menelaus_post_load(void *opaque, int version_id) |
|
803 |
{ |
|
804 |
MenelausState *s = opaque; |
|
826 | 805 |
|
827 | 806 |
if (s->rtc.ctrl & 1) /* RTC_EN */ |
828 | 807 |
menelaus_rtc_stop(s); |
829 |
qemu_get_8s(f, &s->vcore[0]); |
|
830 |
qemu_get_8s(f, &s->vcore[1]); |
|
831 |
qemu_get_8s(f, &s->vcore[2]); |
|
832 |
qemu_get_8s(f, &s->vcore[3]); |
|
833 |
qemu_get_8s(f, &s->vcore[4]); |
|
834 |
qemu_get_8s(f, &s->dcdc[0]); |
|
835 |
qemu_get_8s(f, &s->dcdc[1]); |
|
836 |
qemu_get_8s(f, &s->dcdc[2]); |
|
837 |
qemu_get_8s(f, &s->ldo[0]); |
|
838 |
qemu_get_8s(f, &s->ldo[1]); |
|
839 |
qemu_get_8s(f, &s->ldo[2]); |
|
840 |
qemu_get_8s(f, &s->ldo[3]); |
|
841 |
qemu_get_8s(f, &s->ldo[4]); |
|
842 |
qemu_get_8s(f, &s->ldo[5]); |
|
843 |
qemu_get_8s(f, &s->ldo[6]); |
|
844 |
qemu_get_8s(f, &s->ldo[7]); |
|
845 |
qemu_get_8s(f, &s->sleep[0]); |
|
846 |
qemu_get_8s(f, &s->sleep[1]); |
|
847 |
qemu_get_8s(f, &s->osc); |
|
848 |
qemu_get_8s(f, &s->detect); |
|
849 |
qemu_get_be16s(f, &s->mask); |
|
850 |
qemu_get_be16s(f, &s->status); |
|
851 |
qemu_get_8s(f, &s->dir); |
|
852 |
qemu_get_8s(f, &s->inputs); |
|
853 |
qemu_get_8s(f, &s->outputs); |
|
854 |
qemu_get_8s(f, &s->bbsms); |
|
855 |
qemu_get_8s(f, &s->pull[0]); |
|
856 |
qemu_get_8s(f, &s->pull[1]); |
|
857 |
qemu_get_8s(f, &s->pull[2]); |
|
858 |
qemu_get_8s(f, &s->pull[3]); |
|
859 |
qemu_get_8s(f, &s->mmc_ctrl[0]); |
|
860 |
qemu_get_8s(f, &s->mmc_ctrl[1]); |
|
861 |
qemu_get_8s(f, &s->mmc_ctrl[2]); |
|
862 |
qemu_get_8s(f, &s->mmc_debounce); |
|
863 |
qemu_get_8s(f, &s->rtc.ctrl); |
|
864 |
qemu_get_be16s(f, &s->rtc.comp); |
|
865 |
s->rtc.next = qemu_get_be16(f); |
|
866 |
tm_get(f, &s->rtc.new); |
|
867 |
tm_get(f, &s->rtc.alm); |
|
868 |
s->pwrbtn_state = qemu_get_byte(f); |
|
808 |
|
|
809 |
s->rtc.next = s->rtc_next_vmstate; |
|
810 |
|
|
869 | 811 |
menelaus_alm_update(s); |
870 | 812 |
menelaus_update(s); |
871 | 813 |
if (s->rtc.ctrl & 1) /* RTC_EN */ |
872 | 814 |
menelaus_rtc_start(s); |
873 |
|
|
874 |
i2c_slave_load(f, &s->i2c); |
|
875 | 815 |
return 0; |
876 | 816 |
} |
877 | 817 |
|
818 |
static const VMStateDescription vmstate_menelaus = { |
|
819 |
.name = "menelaus", |
|
820 |
.version_id = 0, |
|
821 |
.minimum_version_id = 0, |
|
822 |
.minimum_version_id_old = 0, |
|
823 |
.pre_save = menelaus_pre_save, |
|
824 |
.post_load = menelaus_post_load, |
|
825 |
.fields = (VMStateField []) { |
|
826 |
VMSTATE_INT32(firstbyte, MenelausState), |
|
827 |
VMSTATE_UINT8(reg, MenelausState), |
|
828 |
VMSTATE_UINT8_ARRAY(vcore, MenelausState, 5), |
|
829 |
VMSTATE_UINT8_ARRAY(dcdc, MenelausState, 3), |
|
830 |
VMSTATE_UINT8_ARRAY(ldo, MenelausState, 8), |
|
831 |
VMSTATE_UINT8_ARRAY(sleep, MenelausState, 2), |
|
832 |
VMSTATE_UINT8(osc, MenelausState), |
|
833 |
VMSTATE_UINT8(detect, MenelausState), |
|
834 |
VMSTATE_UINT16(mask, MenelausState), |
|
835 |
VMSTATE_UINT16(status, MenelausState), |
|
836 |
VMSTATE_UINT8(dir, MenelausState), |
|
837 |
VMSTATE_UINT8(inputs, MenelausState), |
|
838 |
VMSTATE_UINT8(outputs, MenelausState), |
|
839 |
VMSTATE_UINT8(bbsms, MenelausState), |
|
840 |
VMSTATE_UINT8_ARRAY(pull, MenelausState, 4), |
|
841 |
VMSTATE_UINT8_ARRAY(mmc_ctrl, MenelausState, 3), |
|
842 |
VMSTATE_UINT8(mmc_debounce, MenelausState), |
|
843 |
VMSTATE_UINT8(rtc.ctrl, MenelausState), |
|
844 |
VMSTATE_UINT16(rtc.comp, MenelausState), |
|
845 |
VMSTATE_UINT16(rtc_next_vmstate, MenelausState), |
|
846 |
VMSTATE_STRUCT(rtc.new, MenelausState, 0, vmstate_menelaus_tm, |
|
847 |
struct tm), |
|
848 |
VMSTATE_STRUCT(rtc.alm, MenelausState, 0, vmstate_menelaus_tm, |
|
849 |
struct tm), |
|
850 |
VMSTATE_UINT8(pwrbtn_state, MenelausState), |
|
851 |
VMSTATE_I2C_SLAVE(i2c, MenelausState), |
|
852 |
VMSTATE_END_OF_LIST() |
|
853 |
} |
|
854 |
}; |
|
855 |
|
|
878 | 856 |
static int twl92230_init(i2c_slave *i2c) |
879 | 857 |
{ |
880 | 858 |
MenelausState *s = FROM_I2C_SLAVE(MenelausState, i2c); |
... | ... | |
887 | 865 |
|
888 | 866 |
menelaus_reset(&s->i2c); |
889 | 867 |
|
890 |
register_savevm("menelaus", -1, 0, menelaus_save, menelaus_load, s);
|
|
868 |
vmstate_register(-1, &vmstate_menelaus, s);
|
|
891 | 869 |
return 0; |
892 | 870 |
} |
893 | 871 |
|
Also available in: Unified diff