| /* | 
 |  * Clock migration structure | 
 |  * | 
 |  * Copyright GreenSocs 2019-2020 | 
 |  * | 
 |  * Authors: | 
 |  *  Damien Hedde | 
 |  * | 
 |  * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
 |  * See the COPYING file in the top-level directory. | 
 |  */ | 
 |  | 
 | #include "qemu/osdep.h" | 
 | #include "migration/vmstate.h" | 
 | #include "hw/clock.h" | 
 |  | 
 | static bool muldiv_needed(void *opaque) | 
 | { | 
 |     Clock *clk = opaque; | 
 |  | 
 |     return clk->multiplier != 1 || clk->divider != 1; | 
 | } | 
 |  | 
 | static int clock_pre_load(void *opaque) | 
 | { | 
 |     Clock *clk = opaque; | 
 |     /* | 
 |      * The initial out-of-reset settings of the Clock might have been | 
 |      * configured by the device to be different from what we set | 
 |      * in clock_initfn(), so we must here set the default values to | 
 |      * be used if they are not in the inbound migration state. | 
 |      */ | 
 |     clk->multiplier = 1; | 
 |     clk->divider = 1; | 
 |  | 
 |     return 0; | 
 | } | 
 |  | 
 | const VMStateDescription vmstate_muldiv = { | 
 |     .name = "clock/muldiv", | 
 |     .version_id = 1, | 
 |     .minimum_version_id = 1, | 
 |     .needed = muldiv_needed, | 
 |     .fields = (const VMStateField[]) { | 
 |         VMSTATE_UINT32(multiplier, Clock), | 
 |         VMSTATE_UINT32(divider, Clock), | 
 |         VMSTATE_END_OF_LIST() | 
 |     }, | 
 | }; | 
 |  | 
 | const VMStateDescription vmstate_clock = { | 
 |     .name = "clock", | 
 |     .version_id = 0, | 
 |     .minimum_version_id = 0, | 
 |     .pre_load = clock_pre_load, | 
 |     .fields = (const VMStateField[]) { | 
 |         VMSTATE_UINT64(period, Clock), | 
 |         VMSTATE_END_OF_LIST() | 
 |     }, | 
 |     .subsections = (const VMStateDescription * const []) { | 
 |         &vmstate_muldiv, | 
 |         NULL | 
 |     }, | 
 | }; |