esp32: refactor drivers to use three-stage reset instead of legacy reset
This commit is contained in:
@@ -309,9 +309,9 @@ static void uart_rx_timeout_timer_cb(void* opaque)
|
||||
esp32_uart_update_irq(s);
|
||||
}
|
||||
|
||||
static void esp32_uart_reset(DeviceState *dev)
|
||||
static void esp32_uart_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
ESP32UARTState *s = ESP32_UART(dev);
|
||||
ESP32UARTState *s = ESP32_UART(obj);
|
||||
|
||||
memset(s->reg, 0, sizeof(s->reg));
|
||||
s->reg[R_UART_RXD_CNT] = 0;
|
||||
@@ -379,12 +379,13 @@ static void esp32_uart_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ESP32UARTClass *class = ESP32_UART_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
/* Populate the virtual attributes and methods here (if any) */
|
||||
class->uart_write = uart_write;
|
||||
class->uart_read = uart_read;
|
||||
|
||||
dc->legacy_reset = esp32_uart_reset;
|
||||
rc->phases.hold = esp32_uart_reset_hold;
|
||||
dc->realize = esp32_uart_realize;
|
||||
device_class_set_props(dc, esp32_uart_properties);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ static const MemoryRegionOps uart_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_gpio_reset(DeviceState *dev)
|
||||
static void esp32_gpio_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -79,8 +79,9 @@ static Property esp32_gpio_properties[] = {
|
||||
static void esp32_gpio_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_gpio_reset;
|
||||
rc->phases.hold = esp32_gpio_reset_hold;
|
||||
dc->realize = esp32_gpio_realize;
|
||||
device_class_set_props(dc, esp32_gpio_properties);
|
||||
}
|
||||
|
||||
+4
-4
@@ -8,9 +8,9 @@
|
||||
static void esp32_i2c_do_transaction(Esp32I2CState * s);
|
||||
static void esp32_i2c_update_irq(Esp32I2CState * s);
|
||||
|
||||
static void esp32_i2c_reset(DeviceState * dev)
|
||||
static void esp32_i2c_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32I2CState * s = Esp32_I2C(dev);
|
||||
Esp32I2CState * s = Esp32_I2C(obj);
|
||||
|
||||
fifo8_reset(&s->rx_fifo);
|
||||
fifo8_reset(&s->tx_fifo);
|
||||
@@ -263,8 +263,8 @@ static void esp32_i2c_init(Object * obj)
|
||||
|
||||
static void esp32_i2c_class_init(ObjectClass * klass, void * data)
|
||||
{
|
||||
DeviceClass * dc = DEVICE_CLASS(klass);
|
||||
dc->legacy_reset = esp32_i2c_reset;
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
rc->phases.hold = esp32_i2c_reset_hold;
|
||||
}
|
||||
|
||||
static const TypeInfo esp32_i2c_type_info = {
|
||||
|
||||
+4
-5
@@ -90,9 +90,9 @@ static const MemoryRegionOps esp32_aes_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_aes_reset(DeviceState *dev)
|
||||
static void esp32_aes_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32AesState *s = ESP32_AES(dev);
|
||||
Esp32AesState *s = ESP32_AES(obj);
|
||||
s->aes_idle_reg = 0;
|
||||
}
|
||||
|
||||
@@ -108,9 +108,8 @@ static void esp32_aes_init(Object *obj)
|
||||
|
||||
static void esp32_aes_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_aes_reset;
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
rc->phases.hold = esp32_aes_reset_hold;
|
||||
}
|
||||
|
||||
static const TypeInfo esp32_aes_info = {
|
||||
|
||||
@@ -364,9 +364,9 @@ static const MemoryRegionOps esp32_cache_ill_trap_ops = {
|
||||
.write = esp32_cache_ill_write,
|
||||
};
|
||||
|
||||
static void esp32_dport_reset(DeviceState *dev)
|
||||
static void esp32_dport_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32DportState *s = ESP32_DPORT(dev);
|
||||
Esp32DportState *s = ESP32_DPORT(obj);
|
||||
|
||||
s->appcpu_boot_addr = 0;
|
||||
s->appcpu_clkgate_state = false;
|
||||
@@ -454,8 +454,9 @@ static Property esp32_dport_properties[] = {
|
||||
static void esp32_dport_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_dport_reset;
|
||||
rc->phases.hold = esp32_dport_reset_hold;
|
||||
dc->realize = esp32_dport_realize;
|
||||
device_class_set_props(dc, esp32_dport_properties);
|
||||
}
|
||||
|
||||
@@ -242,17 +242,16 @@ static void esp32_flash_encryption_init(Object *obj)
|
||||
sysbus_init_mmio(sbd, &s->iomem);
|
||||
}
|
||||
|
||||
static void esp32_flash_encryption_reset(DeviceState *dev)
|
||||
static void esp32_flash_encryption_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32FlashEncryptionState *s = ESP32_FLASH_ENCRYPTION(dev);
|
||||
Esp32FlashEncryptionState *s = ESP32_FLASH_ENCRYPTION(obj);
|
||||
s->encryption_done = false;
|
||||
}
|
||||
|
||||
static void esp32_flash_encryption_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_flash_encryption_reset;
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
rc->phases.hold = esp32_flash_encryption_reset_hold;
|
||||
}
|
||||
|
||||
static const TypeInfo esp32_flash_encryption_info = {
|
||||
|
||||
+4
-5
@@ -319,9 +319,9 @@ static const MemoryRegionOps esp32_rsa_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_rsa_reset(DeviceState *dev)
|
||||
static void esp32_rsa_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32RsaState *s = ESP32_RSA(dev);
|
||||
Esp32RsaState *s = ESP32_RSA(obj);
|
||||
|
||||
esp32_rsa_clean_mem(s);
|
||||
|
||||
@@ -344,9 +344,8 @@ static void esp32_rsa_init(Object *obj)
|
||||
|
||||
static void esp32_rsa_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_rsa_reset;
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
rc->phases.hold = esp32_rsa_reset_hold;
|
||||
}
|
||||
|
||||
static const TypeInfo esp32_rsa_info = {
|
||||
|
||||
@@ -177,9 +177,9 @@ static const MemoryRegionOps esp32_rtc_cntl_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_rtc_cntl_reset(DeviceState *dev)
|
||||
static void esp32_rtc_cntl_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32RtcCntlState *s = ESP32_RTC_CNTL(dev);
|
||||
Esp32RtcCntlState *s = ESP32_RTC_CNTL(obj);
|
||||
|
||||
s->time_base_ns = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||
}
|
||||
@@ -222,8 +222,9 @@ static Property esp32_rtc_cntl_properties[] = {
|
||||
static void esp32_rtc_cntl_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_rtc_cntl_reset;
|
||||
rc->phases.hold = esp32_rtc_cntl_reset_hold;
|
||||
dc->realize = esp32_rtc_cntl_realize;
|
||||
device_class_set_props(dc, esp32_rtc_cntl_properties);
|
||||
}
|
||||
|
||||
@@ -237,9 +237,9 @@ static const MemoryRegionOps esp32_efuse_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_efuse_reset(DeviceState *dev)
|
||||
static void esp32_efuse_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32EfuseState *s = ESP32_EFUSE(dev);
|
||||
Esp32EfuseState *s = ESP32_EFUSE(obj);
|
||||
esp32_efuse_read_op(s);
|
||||
}
|
||||
|
||||
@@ -285,8 +285,9 @@ static Property esp32_efuse_properties[] = {
|
||||
static void esp32_efuse_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_efuse_reset;
|
||||
rc->phases.hold = esp32_efuse_reset_hold;
|
||||
dc->realize = esp32_efuse_realize;
|
||||
device_class_set_props(dc, esp32_efuse_properties);
|
||||
}
|
||||
|
||||
+4
-3
@@ -307,9 +307,9 @@ static const MemoryRegionOps esp32_spi_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_spi_reset(DeviceState *dev)
|
||||
static void esp32_spi_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32SpiState *s = ESP32_SPI(dev);
|
||||
Esp32SpiState *s = ESP32_SPI(obj);
|
||||
s->pin_reg = 0x6;
|
||||
s->user1_reg = FIELD_DP32(0, SPI_USER1, ADDR_BITLEN, 23);
|
||||
s->user1_reg = FIELD_DP32(s->user1_reg, SPI_USER1, DUMMY_CYCLELEN, 7);
|
||||
@@ -343,8 +343,9 @@ static Property esp32_spi_properties[] = {
|
||||
static void esp32_spi_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_spi_reset;
|
||||
rc->phases.hold = esp32_spi_reset_hold;
|
||||
dc->realize = esp32_spi_realize;
|
||||
device_class_set_props(dc, esp32_spi_properties);
|
||||
}
|
||||
|
||||
@@ -181,10 +181,9 @@ static const MemoryRegionOps esp32_frc_timer_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_frc_timer_reset(DeviceState *dev)
|
||||
static void esp32_frc_timer_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32FrcTimerState *s = ESP32_FRC_TIMER(dev);
|
||||
|
||||
Esp32FrcTimerState *s = ESP32_FRC_TIMER(obj);
|
||||
s->prescaler = 1;
|
||||
}
|
||||
|
||||
@@ -223,8 +222,9 @@ static Property esp32_frc_timer_properties[] = {
|
||||
static void esp32_frc_timer_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_frc_timer_reset;
|
||||
rc->phases.hold = esp32_frc_timer_reset_hold;
|
||||
dc->realize = esp32_frc_timer_realize;
|
||||
device_class_set_props(dc, esp32_frc_timer_properties);
|
||||
}
|
||||
|
||||
@@ -301,9 +301,9 @@ static void esp32_timg_wdt_reset(Esp32TimgWdtState* ws)
|
||||
}
|
||||
}
|
||||
|
||||
static void esp32_timg_reset(DeviceState *dev)
|
||||
static void esp32_timg_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32TimgState *s = ESP32_TIMG(dev);
|
||||
Esp32TimgState *s = ESP32_TIMG(obj);
|
||||
s->rtc_cal_max = 1;
|
||||
s->rtc_cal_clk_sel = ESP32_TIMG_CAL_8MD256;
|
||||
s->rtc_cal_ready = 0;
|
||||
@@ -642,8 +642,9 @@ static Property esp32_timg_properties[] = {
|
||||
static void esp32_timg_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_timg_reset;
|
||||
rc->phases.hold = esp32_timg_reset_hold;
|
||||
dc->realize = esp32_timg_realize;
|
||||
device_class_set_props(dc, esp32_timg_properties);
|
||||
}
|
||||
|
||||
@@ -73,9 +73,9 @@ static const MemoryRegionOps esp_intmatrix_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void esp32_intmatrix_reset(DeviceState *dev)
|
||||
static void esp32_intmatrix_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
Esp32IntMatrixState *s = ESP32_INTMATRIX(dev);
|
||||
Esp32IntMatrixState *s = ESP32_INTMATRIX(obj);
|
||||
memset(s->irq_map, INTMATRIX_UNINT_VALUE, sizeof(s->irq_map));
|
||||
for (int i = 0; i < ESP32_CPU_COUNT; ++i) {
|
||||
if (s->outputs[i] == NULL) {
|
||||
@@ -97,7 +97,7 @@ static void esp32_intmatrix_realize(DeviceState *dev, Error **errp)
|
||||
s->outputs[i] = xtensa_get_extints(&s->cpu[i]->env);
|
||||
}
|
||||
}
|
||||
esp32_intmatrix_reset(dev);
|
||||
esp32_intmatrix_reset_hold(OBJECT(dev), RESET_TYPE_COLD);
|
||||
}
|
||||
|
||||
static void esp32_intmatrix_init(Object *obj)
|
||||
@@ -121,8 +121,9 @@ static Property esp32_intmatrix_properties[] = {
|
||||
static void esp32_intmatrix_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
dc->legacy_reset = esp32_intmatrix_reset;
|
||||
rc->phases.hold = esp32_intmatrix_reset_hold;
|
||||
dc->realize = esp32_intmatrix_realize;
|
||||
device_class_set_props(dc, esp32_intmatrix_properties);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user