Add an i.MX25 specific CCM driver
v6 cover Add an i.MX25 specific CCM driver
i.MX25 SOC has a different CCM device than i.MX31.
Qemu i.MX25 emulation was built with i.MX31 CCM driver. This allows Linux to work on top of the i.MX25 emultion but this is not correct.
Furthermore, other SOC we could emulate like i.MX6 have yet a different implementation of the CCM device.
So we split the i.MX31 into a generic base class and a specific i.MX31 class.
We then add an i.MX25 specific CCM Device and have the i.MX25 SOC use it.
Jean-Christophe Dubois (5):
i.MX: Fix i.MX31 default/reset configuration.
i.MX: rename i.MX CCM get_clock() function and CLK ID enum names i.MX: Split the CCM class into an abstact base class and a concrete
class.
i.MX: Add an i.MX25 specific CCM class/instance.
i.MX: move i.MX31 CCM object to register array.
hw/arm/fsl-imx25.c | 6 +- hw/arm/fsl-imx31.c | 6 +- hw/misc/Makefile.objs | 2 + hw/misc/imx25_ccm.c | 341 ++++++++++++++++++++++++++++++++++++++++ hw/misc/imx31_ccm.c | 374 ++++++++++++++++++++++++++++++++++++++++++++ hw/misc/imx_ccm.c | 231 +++------------------------ hw/timer/imx_epit.c | 20 ++- hw/timer/imx_gpt.c | 16 +- include/hw/arm/fsl-imx25.h | 4 +- include/hw/arm/fsl-imx31.h | 4 +- include/hw/misc/imx25_ccm.h | 79 ++++++++++ include/hw/misc/imx31_ccm.h | 88 +++++++++++ include/hw/misc/imx_ccm.h | 75 ++++----- include/hw/timer/imx_epit.h | 5 +- include/hw/timer/imx_gpt.h | 5 +- 15 files changed, 966 insertions(+), 290 deletions(-) create mode 100644 hw/misc/imx25_ccm.c create mode 100644 hw/misc/imx31_ccm.c create mode 100644 include/hw/misc/imx25_ccm.h create mode 100644 include/hw/misc/imx31_ccm.h
Signature · 1 line
2.5.0
PATCH v6 1/5 i.MX: Fix i.MX31 default/reset configuration.
Linux on i.MX31/KZM is expecting the CCM to use the CKIH ref clock instead of the CKIL plus the FPM multiplier.
We change the CCMR reg reset value to match linux expected config.
This allow the CCM to provide a 39MHz clk (as expected by linux) instead of the actual 50MHz.
With this change the "sleep 60" command on linux is time accurate with "real world time".
---
Changes since v1:
* Not present
Changes since v2:
* Not present
Changes since v3:
* Not present
Changes since v4:
* Not present
Changes since v4:
* No change
hw/misc/imx_ccm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
hw/misc/imx_ccm.c +1 -1
@@ -123,7 +123,7 @@ static void imx_ccm_reset(DeviceState *dev) {IMXCCMState *s =IMX_CCM (dev); - s->ccmr =0x074b0b7b ; + s->ccmr =0x074b0b7d ; s->pdr0 =0xff870b48 ; s->pdr1 =0x49fcfe7f ; s->mpctl =PLL_PD (1 ) |PLL_MFD (0 ) |PLL_MFI (6 ) |PLL_MFN (0 );
Signature · 1 line
2.5.0
PATCH v6 2/5 i.MX: rename i.MX CCM get_clock() function and CLK ID enum names
In reply to Jean-Christophe DuboisThis is to prepare for CCM code refactoring.
This is just a bit of function and enum values renaming.
We also remove some useless intermediate variables.
---
Changes since v1:
* Not present
Changes since v2:
* Not present
Changes since v3:
* None
Changes since v4:
* None
Changes since v5:
* None
hw/misc/imx_ccm.c | 8 ++++---- hw/timer/imx_epit.c | 20 +++++++++----------- hw/timer/imx_gpt.c | 16 ++++++++-------- include/hw/misc/imx_ccm.h | 8 ++++---- 4 files changed, 25 insertions(+), 27 deletions(-)
hw/misc/imx_ccm.c +4 -4
@@ -49,18 +49,18 @@ static const VMStateDescription vmstate_imx_ccm = { .post_load = imx_ccm_post_load, }; -uint32_t imx_clock_frequency (DeviceState *dev,IMXClk clock) +uint32_t imx_ccm_get_clock_frequency (DeviceState *dev,IMXClk clock) {IMXCCMState *s =IMX_CCM (dev);switch (clock) {case NOCLK :return 0 ; -case MCU : +case CLK_MCU :return s->mcu_clk_freq; -case HSP : +case CLK_HSP :return s->hsp_clk_freq; -case IPG : +case CLK_IPG :return s->ipg_clk_freq;case CLK_32k:return CKIL_FREQ ;
hw/timer/imx_epit.c +9 -11
@@ -51,9 +51,9 @@ static char const *imx_epit_reg_name(uint32_t reg)* These are typical. */ static const IMXClk imx_epit_clocks[] = { -0 ,/* 00 disabled */ -IPG ,/* 01 ipg_clk, ~532MHz */ -IPG ,/* 10 ipg_clk_highfreq */ +NOCLK ,/* 00 disabled */ +CLK_IPG ,/* 01 ipg_clk, ~532MHz */ +CLK_IPG ,/* 10 ipg_clk_highfreq */ CLK_32k,/* 11 ipg_clk_32k -- ~32kHz */ };
@@ -73,20 +73,18 @@ static void imx_epit_set_freq(IMXEPITState *s) {uint32_t clksrc;uint32_t prescaler; -uint32_t freq; clksrc =extract32 (s->cr,CR_CLKSRC_SHIFT ,2 ); prescaler =1 +extract32 (s->cr,CR_PRESCALE_SHIFT ,12 ); - freq =imx_clock_frequency (s->ccm, imx_epit_clocks[clksrc]) / prescaler; + s->freq =imx_ccm_get_clock_frequency (s->ccm, + imx_epit_clocks[clksrc]) / prescaler; - s->freq = freq; +DPRINTF ("Setting ptimer frequency to %u\n" , s->freq); -DPRINTF ("Setting ptimer frequency to %u\n" , freq); - -if (freq) { -ptimer_set_freq (s->timer_reload, freq); -ptimer_set_freq (s->timer_cmp, freq); +if (s->freq) { +ptimer_set_freq (s->timer_reload, s->freq); +ptimer_set_freq (s->timer_cmp, s->freq); } }
hw/timer/imx_gpt.c +8 -8
@@ -81,8 +81,8 @@ static const VMStateDescription vmstate_imx_timer_gpt = {static const IMXClk imx_gpt_clocks[] = {NOCLK ,/* 000 No clock source */ -IPG ,/* 001 ipg_clk, 532MHz*/ -IPG ,/* 010 ipg_clk_highfreq */ +CLK_IPG ,/* 001 ipg_clk, 532MHz*/ +CLK_IPG ,/* 010 ipg_clk_highfreq */ NOCLK ,/* 011 not defined */ CLK_32k,/* 100 ipg_clk_32k */ NOCLK ,/* 101 not defined */
@@ -93,14 +93,14 @@ static const IMXClk imx_gpt_clocks[] = {static void imx_gpt_set_freq (IMXGPTState *s) {uint32_t clksrc =extract32 (s->cr,GPT_CR_CLKSRC_SHIFT ,3 ); -uint32_t freq =imx_clock_frequency (s->ccm, imx_gpt_clocks[clksrc]) - / (1 + s->pr); - s->freq = freq; -DPRINTF ("Setting clksrc %d to frequency %d\n" , clksrc, freq); + s->freq =imx_ccm_get_clock_frequency (s->ccm, + imx_gpt_clocks[clksrc]) / (1 + s->pr); -if (freq) { -ptimer_set_freq (s->timer, freq); +DPRINTF ("Setting clksrc %d to frequency %d\n" , clksrc, s->freq); + +if (s->freq) { +ptimer_set_freq (s->timer, s->freq); } }
include/hw/misc/imx_ccm.h +4 -4
@@ -80,12 +80,12 @@ typedef struct IMXCCMState {typedef enum {NOCLK , -MCU , -HSP , -IPG , +CLK_MCU , +CLK_HSP , +CLK_IPG , CLK_32k }IMXClk ; -uint32_t imx_clock_frequency (DeviceState *s,IMXClk clock); +uint32_t imx_ccm_get_clock_frequency (DeviceState *s,IMXClk clock);#endif /* IMX_CCM_H */
Signature · 1 line
2.5.0
PATCH v6 3/5 i.MX: Split the CCM class into an abstact base class and a concrete class.
In reply to Jean-Christophe DuboisThe IMX_CCM class is now the base abstract class that is used by EPIT and GPT timer implementation.
IMX31_CCM class is the concrete class implementing CCM for i.MX31 SOC.
For now the i.MX25 continues to use the i.MX31 CCM implementation.
An i.MX25 specific CCM will be introduced in a later patch.
We also rework initialization to stop using deprecated sysbus device init
---
Changes since v1:
* None
Changes since v2:
* We moved to an inheritance QOM scheme
Changes since v3:
* Rework logging based on comment on i.MX25 CCM patch.
* Change abstract class function parameter to abstract class type instead of DEVICE type.
* EPIT and GPT timers use abstract class instead of DEVICE class.
Changes sinve v4:
* improve debug logging.
* make IPG clk dependent on HCLK clk.
Changes since v5:
* None
hw/arm/fsl-imx25.c | 6 +- hw/arm/fsl-imx31.c | 6 +- hw/misc/Makefile.objs | 1 + hw/misc/imx31_ccm.c | 392 ++++++++++++++++++++++++++++++++++++++++++++ hw/misc/imx_ccm.c | 231 +++----------------------- include/hw/arm/fsl-imx25.h | 4 +- include/hw/arm/fsl-imx31.h | 4 +- include/hw/misc/imx31_ccm.h | 66 ++++++++ include/hw/misc/imx_ccm.h | 69 +++----- include/hw/timer/imx_epit.h | 5 +- include/hw/timer/imx_gpt.h | 5 +- 11 files changed, 521 insertions(+), 268 deletions(-) create mode 100644 hw/misc/imx31_ccm.c create mode 100644 include/hw/misc/imx31_ccm.h
hw/arm/fsl-imx25.c +3 -3
@@ -38,7 +38,7 @@ static void fsl_imx25_init(Object *obj)object_initialize (&s->avic,sizeof (s->avic),TYPE_IMX_AVIC );qdev_set_parent_bus (DEVICE (&s->avic),sysbus_get_default ()); -object_initialize (&s->ccm,sizeof (s->ccm),TYPE_IMX_CCM ); +object_initialize (&s->ccm,sizeof (s->ccm),TYPE_IMX31_CCM );qdev_set_parent_bus (DEVICE (&s->ccm),sysbus_get_default ());for (i =0 ; i <FSL_IMX25_NUM_UARTS ; i++) {
@@ -150,7 +150,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp) { FSL_IMX25_GPT4_ADDR, FSL_IMX25_GPT4_IRQ } }; - s->gpt[i].ccm =DEVICE (&s->ccm); + s->gpt[i].ccm =IMX_CCM (&s->ccm);object_property_set_bool (OBJECT (&s->gpt[i]), true,"realized" , &err);if (err) {
@@ -173,7 +173,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp) { FSL_IMX25_EPIT2_ADDR, FSL_IMX25_EPIT2_IRQ } }; - s->epit[i].ccm =DEVICE (&s->ccm); + s->epit[i].ccm =IMX_CCM (&s->ccm);object_property_set_bool (OBJECT (&s->epit[i]), true,"realized" , &err);if (err) {
hw/arm/fsl-imx31.c +3 -3
@@ -35,7 +35,7 @@ static void fsl_imx31_init(Object *obj)object_initialize (&s->avic,sizeof (s->avic),TYPE_IMX_AVIC );qdev_set_parent_bus (DEVICE (&s->avic),sysbus_get_default ()); -object_initialize (&s->ccm,sizeof (s->ccm),TYPE_IMX_CCM ); +object_initialize (&s->ccm,sizeof (s->ccm),TYPE_IMX31_CCM );qdev_set_parent_bus (DEVICE (&s->ccm),sysbus_get_default ());for (i =0 ; i <FSL_IMX31_NUM_UARTS ; i++) {
@@ -128,7 +128,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp) serial_table[i].irq)); } - s->gpt.ccm =DEVICE (&s->ccm); + s->gpt.ccm =IMX_CCM (&s->ccm);object_property_set_bool (OBJECT (&s->gpt), true,"realized" , &err);if (err) {
@@ -150,7 +150,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp) { FSL_IMX31_EPIT2_ADDR, FSL_IMX31_EPIT2_IRQ }, }; - s->epit[i].ccm =DEVICE (&s->ccm); + s->epit[i].ccm =IMX_CCM (&s->ccm);object_property_set_bool (OBJECT (&s->epit[i]), true,"realized" , &err);if (err) {
hw/misc/Makefile.objs +1 -0
@@ -26,6 +26,7 @@ obj-$(CONFIG_NSERIES) += cbus.o obj-$(CONFIG_ECCMEMCTL) += eccmemctl.o obj-$(CONFIG_EXYNOS4) += exynos4210_pmu.o obj-$(CONFIG_IMX) += imx_ccm.o +obj-$(CONFIG_IMX) += imx31_ccm.o obj-$(CONFIG_MILKYMIST) += milkymist-hpdmc.o obj-$(CONFIG_MILKYMIST) += milkymist-pfpu.o obj-$(CONFIG_MAINSTONE) += mst_fpga.o
hw/misc/imx31_ccm.c new file +392 -0
392 lines not on this page · raw message
hw/misc/imx_ccm.c +22 -209
274 lines not on this page · raw message
include/hw/arm/fsl-imx25.h +2 -2
@@ -19,7 +19,7 @@#include "hw/arm/arm.h" #include "hw/intc/imx_avic.h" -#include "hw/misc/imx_ccm.h" +#include "hw/misc/imx31_ccm.h" #include "hw/char/imx_serial.h" #include "hw/timer/imx_gpt.h" #include "hw/timer/imx_epit.h"
@@ -44,7 +44,7 @@ typedef struct FslIMX25State {/*< public >*/ ARMCPU cpu;IMXAVICState avic; -IMXCCMState ccm; +IMX31CCMState ccm;IMXSerialState uart[FSL_IMX25_NUM_UARTS ];IMXGPTState gpt[FSL_IMX25_NUM_GPTS ];IMXEPITState epit[FSL_IMX25_NUM_EPITS ];
include/hw/arm/fsl-imx31.h +2 -2
@@ -19,7 +19,7 @@#include "hw/arm/arm.h" #include "hw/intc/imx_avic.h" -#include "hw/misc/imx_ccm.h" +#include "hw/misc/imx31_ccm.h" #include "hw/char/imx_serial.h" #include "hw/timer/imx_gpt.h" #include "hw/timer/imx_epit.h"
@@ -42,7 +42,7 @@ typedef struct FslIMX31State {/*< public >*/ ARMCPU cpu;IMXAVICState avic; -IMXCCMState ccm; +IMX31CCMState ccm;IMXSerialState uart[FSL_IMX31_NUM_UARTS ];IMXGPTState gpt;IMXEPITState epit[FSL_IMX31_NUM_EPITS ];
include/hw/misc/imx31_ccm.h new file +66 -0
66 lines not on this page · raw message
include/hw/misc/imx_ccm.h +24 -45
101 lines not on this page · raw message
include/hw/timer/imx_epit.h +3 -2
@@ -31,6 +31,7 @@#include "hw/sysbus.h" #include "hw/ptimer.h" +#include "hw/misc/imx_ccm.h" /* * EPIT: Enhanced periodic interrupt timer
@@ -63,8 +64,8 @@ typedef struct IMXEPITState{/*< public >*/ ptimer_state *timer_reload;ptimer_state *timer_cmp; -MemoryRegion iomem; -DeviceState *ccm; +MemoryRegion iomem; +IMXCCMState *ccm;uint32_t cr;uint32_t sr;
include/hw/timer/imx_gpt.h +3 -2
@@ -31,6 +31,7 @@#include "hw/sysbus.h" #include "hw/ptimer.h" +#include "hw/misc/imx_ccm.h" /* * GPT : General purpose timer
@@ -82,8 +83,8 @@ typedef struct IMXGPTState{/*< public >*/ ptimer_state *timer; -MemoryRegion iomem; -DeviceState *ccm; +MemoryRegion iomem; +IMXCCMState *ccm;uint32_t cr;uint32_t pr;
Signature · 1 line
2.5.0
PATCH v6 4/5 i.MX: Add an i.MX25 specific CCM class/instance.
In reply to Jean-Christophe DuboisWith this CCM, i.MX25 timer is accurate with "real world time".
Reviewed-by Peter Crosthwaite <[email protected]>
---
Changes since v1:
* rework loging to match other i.MX drivers
Changes since v2:
* We moved to an inheritance QOM scheme
Changes since v3:
* Rework logging based on comments.
Changes since v4:
* Improve debug logging.
Changes since v5:
* move object state to uint32 array.
hw/arm/fsl-imx25.c | 2 +- hw/misc/Makefile.objs | 1 + hw/misc/imx25_ccm.c | 341 ++++++++++++++++++++++++++++++++++++++++++++ include/hw/arm/fsl-imx25.h | 4 +- include/hw/misc/imx25_ccm.h | 79 ++++++++++ 5 files changed, 424 insertions(+), 3 deletions(-) create mode 100644 hw/misc/imx25_ccm.c create mode 100644 include/hw/misc/imx25_ccm.h
hw/arm/fsl-imx25.c +1 -1
@@ -38,7 +38,7 @@ static void fsl_imx25_init(Object *obj)object_initialize (&s->avic,sizeof (s->avic),TYPE_IMX_AVIC );qdev_set_parent_bus (DEVICE (&s->avic),sysbus_get_default ()); -object_initialize (&s->ccm,sizeof (s->ccm),TYPE_IMX31_CCM ); +object_initialize (&s->ccm,sizeof (s->ccm),TYPE_IMX25_CCM );qdev_set_parent_bus (DEVICE (&s->ccm),sysbus_get_default ());for (i =0 ; i <FSL_IMX25_NUM_UARTS ; i++) {
hw/misc/Makefile.objs +1 -0
@@ -27,6 +27,7 @@ obj-$(CONFIG_ECCMEMCTL) += eccmemctl.o obj-$(CONFIG_EXYNOS4) += exynos4210_pmu.o obj-$(CONFIG_IMX) += imx_ccm.o obj-$(CONFIG_IMX) += imx31_ccm.o +obj-$(CONFIG_IMX) += imx25_ccm.o obj-$(CONFIG_MILKYMIST) += milkymist-hpdmc.o obj-$(CONFIG_MILKYMIST) += milkymist-pfpu.o obj-$(CONFIG_MAINSTONE) += mst_fpga.o
hw/misc/imx25_ccm.c new file +341 -0
341 lines not on this page · raw message
include/hw/arm/fsl-imx25.h +2 -2
@@ -19,7 +19,7 @@#include "hw/arm/arm.h" #include "hw/intc/imx_avic.h" -#include "hw/misc/imx31_ccm.h" +#include "hw/misc/imx25_ccm.h" #include "hw/char/imx_serial.h" #include "hw/timer/imx_gpt.h" #include "hw/timer/imx_epit.h"
@@ -44,7 +44,7 @@ typedef struct FslIMX25State {/*< public >*/ ARMCPU cpu;IMXAVICState avic; -IMX31CCMState ccm; +IMX25CCMState ccm;IMXSerialState uart[FSL_IMX25_NUM_UARTS ];IMXGPTState gpt[FSL_IMX25_NUM_GPTS ];IMXEPITState epit[FSL_IMX25_NUM_EPITS ];
include/hw/misc/imx25_ccm.h new file +79 -0
79 lines not on this page · raw message
Signature · 1 line
2.5.0
PATCH v6 5/5 i.MX: move i.MX31 CCM object to register array.
In reply to Jean-Christophe DuboisWith this i.MX25 and i.MX31 to have close implementation.
Moreover all i.MX31 CCM registers are now present
---
Changes since v1:
* Not present
Changes since v2:
* Not present
Changes since v3:
* Not present
Changes since v4:
* Not present
Changes since v5:
* Not present
hw/misc/imx31_ccm.c | 188 ++++++++++++++++++++------------------------ include/hw/misc/imx31_ccm.h | 38 +++++++-- 2 files changed, 115 insertions(+), 111 deletions(-)
hw/misc/imx31_ccm.c +85 -103
@@ -29,77 +29,73 @@static char const *imx31_ccm_reg_name (uint32_t reg) { +static char unknown[20 ]; +switch (reg) { -case 0 : +case IMX31_CCM_CCMR_REG :return "CCMR" ; -case 1 : +case IMX31_CCM_PDR0_REG :return "PDR0" ; -case 2 : +case IMX31_CCM_PDR1_REG :return "PDR1" ; -case 3 : +case IMX31_CCM_RCSR_REG :return "RCSR" ; -case 4 : +case IMX31_CCM_MPCTL_REG :return "MPCTL" ; -case 5 : +case IMX31_CCM_UPCTL_REG :return "UPCTL" ; -case 6 : +case IMX31_CCM_SPCTL_REG :return "SPCTL" ; -case 7 : +case IMX31_CCM_COSR_REG :return "COSR" ; -case 8 : +case IMX31_CCM_CGR0_REG :return "CGR0" ; -case 9 : +case IMX31_CCM_CGR1_REG :return "CGR1" ; -case 10 : +case IMX31_CCM_CGR2_REG :return "CGR2" ; -case 11 : +case IMX31_CCM_WIMR_REG :return "WIMR" ; -case 12 : +case IMX31_CCM_LDC_REG :return "LDC" ; -case 13 : +case IMX31_CCM_DCVR0_REG :return "DCVR0" ; -case 14 : +case IMX31_CCM_DCVR1_REG :return "DCVR1" ; -case 15 : +case IMX31_CCM_DCVR2_REG :return "DCVR2" ; -case 16 : +case IMX31_CCM_DCVR3_REG :return "DCVR3" ; -case 17 : +case IMX31_CCM_LTR0_REG :return "LTR0" ; -case 18 : +case IMX31_CCM_LTR1_REG :return "LTR1" ; -case 19 : +case IMX31_CCM_LTR2_REG :return "LTR2" ; -case 20 : +case IMX31_CCM_LTR3_REG :return "LTR3" ; -case 21 : +case IMX31_CCM_LTBR0_REG :return "LTBR0" ; -case 22 : +case IMX31_CCM_LTBR1_REG :return "LTBR1" ; -case 23 : +case IMX31_CCM_PMCR0_REG :return "PMCR0" ; -case 24 : +case IMX31_CCM_PMCR1_REG :return "PMCR1" ; -case 25 : +case IMX31_CCM_PDR2_REG :return "PDR2" ;default : -return "???" ; +sprintf (unknown,"[%d ?]" , reg); +return unknown; } }static const VMStateDescription vmstate_imx31_ccm = { .name =TYPE_IMX31_CCM , - .version_id =1 , - .minimum_version_id =1 , + .version_id =2 , + .minimum_version_id =2 , .fields = (VMStateField []) { -VMSTATE_UINT32 (ccmr, IMX31CCMState), -VMSTATE_UINT32 (pdr0, IMX31CCMState), -VMSTATE_UINT32 (pdr1, IMX31CCMState), -VMSTATE_UINT32 (mpctl, IMX31CCMState), -VMSTATE_UINT32 (spctl, IMX31CCMState), -VMSTATE_UINT32_ARRAY (cgr, IMX31CCMState,3 ), -VMSTATE_UINT32 (pmcr0, IMX31CCMState), -VMSTATE_UINT32 (pmcr1, IMX31CCMState), +VMSTATE_UINT32_ARRAY (reg, IMX31CCMState,IMX31_CCM_MAX_REG ),VMSTATE_END_OF_LIST () }, };
@@ -109,10 +105,10 @@ static uint32_t imx31_ccm_get_pll_ref_clk(IMXCCMState *dev)uint32_t freq =0 ;IMX31CCMState *s =IMX31_CCM (dev); -if ((s->ccmr &CCMR_PRCS ) ==2 ) { -if (s->ccmr &CCMR_FPME ) { +if ((s->reg[IMX31_CCM_CCMR_REG ] &CCMR_PRCS ) ==2 ) { +if (s->reg[IMX31_CCM_CCMR_REG ] &CCMR_FPME ) { freq =CKIL_FREQ ; -if (s->ccmr &CCMR_FPMF ) { +if (s->reg[IMX31_CCM_CCMR_REG ] &CCMR_FPMF ) { freq *=1024 ; } }
@@ -130,7 +126,8 @@ static uint32_t imx31_ccm_get_mpll_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx_ccm_calc_pll (s->mpctl,imx31_ccm_get_pll_ref_clk (dev)); + freq =imx_ccm_calc_pll (s->reg[IMX31_CCM_MPCTL_REG ], +imx31_ccm_get_pll_ref_clk (dev));DPRINTF ("freq = %d\n" , freq);
@@ -142,7 +139,8 @@ static uint32_t imx31_ccm_get_mcu_main_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); -if ((s->ccmr &CCMR_MDS ) || !(s->ccmr &CCMR_MPE )) { +if ((s->reg[IMX31_CCM_CCMR_REG ] &CCMR_MDS ) || + !(s->reg[IMX31_CCM_CCMR_REG ] &CCMR_MPE )) { freq =imx31_ccm_get_pll_ref_clk (dev); }else { freq =imx31_ccm_get_mpll_clk (dev);
@@ -158,7 +156,8 @@ static uint32_t imx31_ccm_get_mcu_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_mcu_main_clk (dev) / (1 +EXTRACT (s->pdr0,MCU )); + freq =imx31_ccm_get_mcu_main_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],MCU ));DPRINTF ("freq = %d\n" , freq);
@@ -170,7 +169,8 @@ static uint32_t imx31_ccm_get_hsp_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_mcu_main_clk (dev) / (1 +EXTRACT (s->pdr0,HSP )); + freq =imx31_ccm_get_mcu_main_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],HSP ));DPRINTF ("freq = %d\n" , freq);
@@ -182,7 +182,8 @@ static uint32_t imx31_ccm_get_hclk_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_mcu_main_clk (dev) / (1 +EXTRACT (s->pdr0,MAX )); + freq =imx31_ccm_get_mcu_main_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],MAX ));DPRINTF ("freq = %d\n" , freq);
@@ -194,7 +195,8 @@ static uint32_t imx31_ccm_get_ipg_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_hclk_clk (dev) / (1 +EXTRACT (s->pdr0,IPG )); + freq =imx31_ccm_get_hclk_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],IPG ));DPRINTF ("freq = %d\n" , freq);
@@ -237,14 +239,24 @@ static void imx31_ccm_reset(DeviceState *dev)DPRINTF ("()\n" ); - s->ccmr =0x074b0b7d ; - s->pdr0 =0xff870b48 ; - s->pdr1 =0x49fcfe7f ; - s->mpctl =0x04001800 ; - s->cgr[0 ] = s->cgr[1 ] = s->cgr[2 ] =0xffffffff ; - s->spctl =0x04043001 ; - s->pmcr0 =0x80209828 ; - s->pmcr1 =0x00aa0000 ; +memset (s->reg,0 ,sizeof (uint32_t ) *IMX31_CCM_MAX_REG ); + + s->reg[IMX31_CCM_CCMR_REG ] =0x074b0b7d ; + s->reg[IMX31_CCM_PDR0_REG ] =0xff870b48 ; + s->reg[IMX31_CCM_PDR1_REG ] =0x49fcfe7f ; + s->reg[IMX31_CCM_RCSR_REG ] =0x007f0000 ; + s->reg[IMX31_CCM_MPCTL_REG ] =0x04001800 ; + s->reg[IMX31_CCM_UPCTL_REG ] =0x04051c03 ; + s->reg[IMX31_CCM_SPCTL_REG ] =0x04043001 ; + s->reg[IMX31_CCM_COSR_REG ] =0x00000280 ; + s->reg[IMX31_CCM_CGR0_REG ] =0xffffffff ; + s->reg[IMX31_CCM_CGR1_REG ] =0xffffffff ; + s->reg[IMX31_CCM_CGR2_REG ] =0xffffffff ; + s->reg[IMX31_CCM_WIMR_REG ] =0xffffffff ; + s->reg[IMX31_CCM_LTR1_REG ] =0x00004040 ; + s->reg[IMX31_CCM_PMCR0_REG ] =0x80209828 ; + s->reg[IMX31_CCM_PMCR1_REG ] =0x00aa0000 ; + s->reg[IMX31_CCM_PDR2_REG ] =0x00000285 ; }static uint64_t imx31_ccm_read (void *opaque,hwaddr offset,unsigned size)
@@ -252,41 +264,11 @@ static uint64_t imx31_ccm_read(void *opaque, hwaddr offset, unsigned size)uint32 value =0 ;IMX31CCMState *s = (IMX31CCMState *)opaque; -switch (offset >>2 ) { -case 0 :/* CCMR */ - value = s->ccmr; -break ; -case 1 : - value = s->pdr0; -break ; -case 2 : - value = s->pdr1; -break ; -case 4 : - value = s->mpctl; -break ; -case 6 : - value = s->spctl; -break ; -case 8 : - value = s->cgr[0 ]; -break ; -case 9 : - value = s->cgr[1 ]; -break ; -case 10 : - value = s->cgr[2 ]; -break ; -case 18 :/* LTR1 */ - value =0x00004040 ; -break ; -case 23 : - value = s->pmcr0; -break ; -default : +if ((offset >>2 ) <IMX31_CCM_MAX_REG ) { + value = s->reg[offset >>2 ]; + }else {qemu_log_mask (LOG_GUEST_ERROR ,"[%s]%s: Bad register at offset 0x%" HWADDR_PRIx"\n" ,TYPE_IMX31_CCM , __func__, offset); -break ; } DPRINTF("reg[%s] => 0x%" PRIx32 "\n", imx31_ccm_reg_name(offset >> 2),
@@ -304,29 +286,29 @@ static void imx31_ccm_write(void *opaque, hwaddr offset, uint64_t value, (uint32_t)value);switch (offset >>2 ) { -case 0 : - s->ccmr =CCMR_FPMF | (value &0x3b6fdfff ); +case IMX31_CCM_CCMR_REG : + s->reg[IMX31_CCM_CCMR_REG ] =CCMR_FPMF | (value &0x3b6fdfff );break ; -case 1 : - s->pdr0 = value &0xff9f3fff ; +case IMX31_CCM_PDR0_REG : + s->reg[IMX31_CCM_PDR0_REG ] = value &0xff9f3fff ;break ; -case 2 : - s->pdr1 = value; +case IMX31_CCM_PDR1_REG : + s->reg[IMX31_CCM_PDR1_REG ] = value;break ; -case 4 : - s->mpctl = value &0xbfff3fff ; +case IMX31_CCM_MPCTL_REG : + s->reg[IMX31_CCM_MPCTL_REG ] = value &0xbfff3fff ;break ; -case 6 : - s->spctl = value &0xbfff3fff ; +case IMX31_CCM_SPCTL_REG : + s->reg[IMX31_CCM_SPCTL_REG ] = value &0xbfff3fff ;break ; -case 8 : - s->cgr[0 ] = value; +case IMX31_CCM_CGR0_REG : + s->reg[IMX31_CCM_CGR0_REG ] = value;break ; -case 9 : - s->cgr[1 ] = value; +case IMX31_CCM_CGR1_REG : + s->reg[IMX31_CCM_CGR1_REG ] = value;break ; -case 10 : - s->cgr[2 ] = value; +case IMX31_CCM_CGR2_REG : + s->reg[IMX31_CCM_CGR2_REG ] = value;break ;default : qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
include/hw/misc/imx31_ccm.h +30 -8
@@ -13,6 +13,34 @@#include "hw/misc/imx_ccm.h" +#define IMX31_CCM_CCMR_REG 0 +#define IMX31_CCM_PDR0_REG 1 +#define IMX31_CCM_PDR1_REG 2 +#define IMX31_CCM_RCSR_REG 3 +#define IMX31_CCM_MPCTL_REG 4 +#define IMX31_CCM_UPCTL_REG 5 +#define IMX31_CCM_SPCTL_REG 6 +#define IMX31_CCM_COSR_REG 7 +#define IMX31_CCM_CGR0_REG 8 +#define IMX31_CCM_CGR1_REG 9 +#define IMX31_CCM_CGR2_REG 10 +#define IMX31_CCM_WIMR_REG 11 +#define IMX31_CCM_LDC_REG 12 +#define IMX31_CCM_DCVR0_REG 13 +#define IMX31_CCM_DCVR1_REG 14 +#define IMX31_CCM_DCVR2_REG 15 +#define IMX31_CCM_DCVR3_REG 16 +#define IMX31_CCM_LTR0_REG 17 +#define IMX31_CCM_LTR1_REG 18 +#define IMX31_CCM_LTR2_REG 19 +#define IMX31_CCM_LTR3_REG 20 +#define IMX31_CCM_LTBR0_REG 21 +#define IMX31_CCM_LTBR1_REG 22 +#define IMX31_CCM_PMCR0_REG 23 +#define IMX31_CCM_PMCR1_REG 24 +#define IMX31_CCM_PDR2_REG 25 +#define IMX31_CCM_MAX_REG 26 +/* CCMR */ #define CCMR_FPME (1<<0)#define CCMR_MPE (1<<3)
@@ -53,14 +81,8 @@ typedef struct IMX31CCMState {/* <public> */ MemoryRegion iomem; -uint32_t ccmr; -uint32_t pdr0; -uint32_t pdr1; -uint32_t mpctl; -uint32_t spctl; -uint32_t cgr[3 ]; -uint32_t pmcr0; - uint32_t pmcr1; + uint32_t reg[IMX31_CCM_MAX_REG]; + } IMX31CCMState;#endif /* IMX31_CCM_H */
Signature · 1 line
2.5.0
Re: [Qemu-devel] [PATCH v6 5/5] i.MX: move i.MX31 CCM object to register array.
Quoted 2 lines · Jean-Christophe Dubois
With this i.MX25 and i.MX31 to have close implementation.
"will have closer implementations".
Otherwise,
Peter, do you want to just amend the grammar in the queue?
Regards,
Peter
Quoted 396 lines
Moreover all i.MX31 CCM registers are now present
Signed-off-by Jean-Christophe Dubois <[email protected]>---
Changes since v1:
* Not presentChanges since v2:
* Not presentChanges since v3:
* Not presentChanges since v4:
* Not presentChanges since v5:
* Not presenthw/misc/imx31_ccm.c | 188 ++++++++++++++++++++------------------------ include/hw/misc/imx31_ccm.h | 38 +++++++-- 2 files changed, 115 insertions(+), 111 deletions(-)hw/misc/imx31_ccm.c +85
-103@@ -29,77 +29,73 @@static char const *imx31_ccm_reg_name (uint32_t reg) { +static char unknown[20 ]; +switch (reg) { -case 0 : +case IMX31_CCM_CCMR_REG :return "CCMR" ; -case 1 : +case IMX31_CCM_PDR0_REG :return "PDR0" ; -case 2 : +case IMX31_CCM_PDR1_REG :return "PDR1" ; -case 3 : +case IMX31_CCM_RCSR_REG :return "RCSR" ; -case 4 : +case IMX31_CCM_MPCTL_REG :return "MPCTL" ; -case 5 : +case IMX31_CCM_UPCTL_REG :return "UPCTL" ; -case 6 : +case IMX31_CCM_SPCTL_REG :return "SPCTL" ; -case 7 : +case IMX31_CCM_COSR_REG :return "COSR" ; -case 8 : +case IMX31_CCM_CGR0_REG :return "CGR0" ; -case 9 : +case IMX31_CCM_CGR1_REG :return "CGR1" ; -case 10 : +case IMX31_CCM_CGR2_REG :return "CGR2" ; -case 11 : +case IMX31_CCM_WIMR_REG :return "WIMR" ; -case 12 : +case IMX31_CCM_LDC_REG :return "LDC" ; -case 13 : +case IMX31_CCM_DCVR0_REG :return "DCVR0" ; -case 14 : +case IMX31_CCM_DCVR1_REG :return "DCVR1" ; -case 15 : +case IMX31_CCM_DCVR2_REG :return "DCVR2" ; -case 16 : +case IMX31_CCM_DCVR3_REG :return "DCVR3" ; -case 17 : +case IMX31_CCM_LTR0_REG :return "LTR0" ; -case 18 : +case IMX31_CCM_LTR1_REG :return "LTR1" ; -case 19 : +case IMX31_CCM_LTR2_REG :return "LTR2" ; -case 20 : +case IMX31_CCM_LTR3_REG :return "LTR3" ; -case 21 : +case IMX31_CCM_LTBR0_REG :return "LTBR0" ; -case 22 : +case IMX31_CCM_LTBR1_REG :return "LTBR1" ; -case 23 : +case IMX31_CCM_PMCR0_REG :return "PMCR0" ; -case 24 : +case IMX31_CCM_PMCR1_REG :return "PMCR1" ; -case 25 : +case IMX31_CCM_PDR2_REG :return "PDR2" ;default : -return "???" ; +sprintf (unknown,"[%d ?]" , reg); +return unknown; } }static const VMStateDescription vmstate_imx31_ccm = { .name =TYPE_IMX31_CCM , - .version_id =1 , - .minimum_version_id =1 , + .version_id =2 , + .minimum_version_id =2 , .fields = (VMStateField []) { -VMSTATE_UINT32 (ccmr, IMX31CCMState), -VMSTATE_UINT32 (pdr0, IMX31CCMState), -VMSTATE_UINT32 (pdr1, IMX31CCMState), -VMSTATE_UINT32 (mpctl, IMX31CCMState), -VMSTATE_UINT32 (spctl, IMX31CCMState), -VMSTATE_UINT32_ARRAY (cgr, IMX31CCMState,3 ), -VMSTATE_UINT32 (pmcr0, IMX31CCMState), -VMSTATE_UINT32 (pmcr1, IMX31CCMState), +VMSTATE_UINT32_ARRAY (reg, IMX31CCMState,IMX31_CCM_MAX_REG ),VMSTATE_END_OF_LIST () }, };@@ -109,10 +105,10 @@ static uint32_t imx31_ccm_get_pll_ref_clk(IMXCCMState *dev)uint32_t freq =0 ;IMX31CCMState *s =IMX31_CCM (dev); -if ((s->ccmr &CCMR_PRCS ) ==2 ) { -if (s->ccmr &CCMR_FPME ) { +if ((s->reg[IMX31_CCM_CCMR_REG ] &CCMR_PRCS ) ==2 ) { +if (s->reg[IMX31_CCM_CCMR_REG ] &CCMR_FPME ) { freq =CKIL_FREQ ; -if (s->ccmr &CCMR_FPMF ) { +if (s->reg[IMX31_CCM_CCMR_REG ] &CCMR_FPMF ) { freq *=1024 ; } }@@ -130,7 +126,8 @@ static uint32_t imx31_ccm_get_mpll_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx_ccm_calc_pll (s->mpctl,imx31_ccm_get_pll_ref_clk (dev)); + freq =imx_ccm_calc_pll (s->reg[IMX31_CCM_MPCTL_REG ], +imx31_ccm_get_pll_ref_clk (dev));DPRINTF ("freq = %d\n" , freq);@@ -142,7 +139,8 @@ static uint32_t imx31_ccm_get_mcu_main_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); -if ((s->ccmr &CCMR_MDS ) || !(s->ccmr &CCMR_MPE )) { +if ((s->reg[IMX31_CCM_CCMR_REG ] &CCMR_MDS ) || + !(s->reg[IMX31_CCM_CCMR_REG ] &CCMR_MPE )) { freq =imx31_ccm_get_pll_ref_clk (dev); }else { freq =imx31_ccm_get_mpll_clk (dev);@@ -158,7 +156,8 @@ static uint32_t imx31_ccm_get_mcu_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_mcu_main_clk (dev) / (1 +EXTRACT (s->pdr0,MCU )); + freq =imx31_ccm_get_mcu_main_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],MCU ));DPRINTF ("freq = %d\n" , freq);@@ -170,7 +169,8 @@ static uint32_t imx31_ccm_get_hsp_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_mcu_main_clk (dev) / (1 +EXTRACT (s->pdr0,HSP )); + freq =imx31_ccm_get_mcu_main_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],HSP ));DPRINTF ("freq = %d\n" , freq);@@ -182,7 +182,8 @@ static uint32_t imx31_ccm_get_hclk_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_mcu_main_clk (dev) / (1 +EXTRACT (s->pdr0,MAX )); + freq =imx31_ccm_get_mcu_main_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],MAX ));DPRINTF ("freq = %d\n" , freq);@@ -194,7 +195,8 @@ static uint32_t imx31_ccm_get_ipg_clk(IMXCCMState *dev)uint32_t freq;IMX31CCMState *s =IMX31_CCM (dev); - freq =imx31_ccm_get_hclk_clk (dev) / (1 +EXTRACT (s->pdr0,IPG )); + freq =imx31_ccm_get_hclk_clk (dev) + / (1 +EXTRACT (s->reg[IMX31_CCM_PDR0_REG ],IPG ));DPRINTF ("freq = %d\n" , freq);@@ -237,14 +239,24 @@ static void imx31_ccm_reset(DeviceState *dev)DPRINTF ("()\n" ); - s->ccmr =0x074b0b7d ; - s->pdr0 =0xff870b48 ; - s->pdr1 =0x49fcfe7f ; - s->mpctl =0x04001800 ; - s->cgr[0 ] = s->cgr[1 ] = s->cgr[2 ] =0xffffffff ; - s->spctl =0x04043001 ; - s->pmcr0 =0x80209828 ; - s->pmcr1 =0x00aa0000 ; +memset (s->reg,0 ,sizeof (uint32_t ) *IMX31_CCM_MAX_REG ); + + s->reg[IMX31_CCM_CCMR_REG ] =0x074b0b7d ; + s->reg[IMX31_CCM_PDR0_REG ] =0xff870b48 ; + s->reg[IMX31_CCM_PDR1_REG ] =0x49fcfe7f ; + s->reg[IMX31_CCM_RCSR_REG ] =0x007f0000 ; + s->reg[IMX31_CCM_MPCTL_REG ] =0x04001800 ; + s->reg[IMX31_CCM_UPCTL_REG ] =0x04051c03 ; + s->reg[IMX31_CCM_SPCTL_REG ] =0x04043001 ; + s->reg[IMX31_CCM_COSR_REG ] =0x00000280 ; + s->reg[IMX31_CCM_CGR0_REG ] =0xffffffff ; + s->reg[IMX31_CCM_CGR1_REG ] =0xffffffff ; + s->reg[IMX31_CCM_CGR2_REG ] =0xffffffff ; + s->reg[IMX31_CCM_WIMR_REG ] =0xffffffff ; + s->reg[IMX31_CCM_LTR1_REG ] =0x00004040 ; + s->reg[IMX31_CCM_PMCR0_REG ] =0x80209828 ; + s->reg[IMX31_CCM_PMCR1_REG ] =0x00aa0000 ; + s->reg[IMX31_CCM_PDR2_REG ] =0x00000285 ; }static uint64_t imx31_ccm_read (void *opaque,hwaddr offset,unsigned size)@@ -252,41 +264,11 @@ static uint64_t imx31_ccm_read(void *opaque, hwaddr offset, unsigned size)uint32 value =0 ;IMX31CCMState *s = (IMX31CCMState *)opaque; -switch (offset >>2 ) { -case 0 :/* CCMR */ - value = s->ccmr; -break ; -case 1 : - value = s->pdr0; -break ; -case 2 : - value = s->pdr1; -break ; -case 4 : - value = s->mpctl; -break ; -case 6 : - value = s->spctl; -break ; -case 8 : - value = s->cgr[0 ]; -break ; -case 9 : - value = s->cgr[1 ]; -break ; -case 10 : - value = s->cgr[2 ]; -break ; -case 18 :/* LTR1 */ - value =0x00004040 ; -break ; -case 23 : - value = s->pmcr0; -break ; -default : +if ((offset >>2 ) <IMX31_CCM_MAX_REG ) { + value = s->reg[offset >>2 ]; + }else {qemu_log_mask (LOG_GUEST_ERROR ,"[%s]%s: Bad register at offset 0x%" HWADDR_PRIx"\n" ,TYPE_IMX31_CCM , __func__, offset); -break ; } DPRINTF("reg[%s] => 0x%" PRIx32 "\n", imx31_ccm_reg_name(offset >> 2),@@ -304,29 +286,29 @@ static void imx31_ccm_write(void *opaque, hwaddr offset, uint64_t value, (uint32_t)value);switch (offset >>2 ) { -case 0 : - s->ccmr =CCMR_FPMF | (value &0x3b6fdfff ); +case IMX31_CCM_CCMR_REG : + s->reg[IMX31_CCM_CCMR_REG ] =CCMR_FPMF | (value &0x3b6fdfff );break ; -case 1 : - s->pdr0 = value &0xff9f3fff ; +case IMX31_CCM_PDR0_REG : + s->reg[IMX31_CCM_PDR0_REG ] = value &0xff9f3fff ;break ; -case 2 : - s->pdr1 = value; +case IMX31_CCM_PDR1_REG : + s->reg[IMX31_CCM_PDR1_REG ] = value;break ; -case 4 : - s->mpctl = value &0xbfff3fff ; +case IMX31_CCM_MPCTL_REG : + s->reg[IMX31_CCM_MPCTL_REG ] = value &0xbfff3fff ;break ; -case 6 : - s->spctl = value &0xbfff3fff ; +case IMX31_CCM_SPCTL_REG : + s->reg[IMX31_CCM_SPCTL_REG ] = value &0xbfff3fff ;break ; -case 8 : - s->cgr[0 ] = value; +case IMX31_CCM_CGR0_REG : + s->reg[IMX31_CCM_CGR0_REG ] = value;break ; -case 9 : - s->cgr[1 ] = value; +case IMX31_CCM_CGR1_REG : + s->reg[IMX31_CCM_CGR1_REG ] = value;break ; -case 10 : - s->cgr[2 ] = value; +case IMX31_CCM_CGR2_REG : + s->reg[IMX31_CCM_CGR2_REG ] = value;break ;default : qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"include/hw/misc/imx31_ccm.h +30
-8@@ -13,6 +13,34 @@#include "hw/misc/imx_ccm.h" +#define IMX31_CCM_CCMR_REG 0 +#define IMX31_CCM_PDR0_REG 1 +#define IMX31_CCM_PDR1_REG 2 +#define IMX31_CCM_RCSR_REG 3 +#define IMX31_CCM_MPCTL_REG 4 +#define IMX31_CCM_UPCTL_REG 5 +#define IMX31_CCM_SPCTL_REG 6 +#define IMX31_CCM_COSR_REG 7 +#define IMX31_CCM_CGR0_REG 8 +#define IMX31_CCM_CGR1_REG 9 +#define IMX31_CCM_CGR2_REG 10 +#define IMX31_CCM_WIMR_REG 11 +#define IMX31_CCM_LDC_REG 12 +#define IMX31_CCM_DCVR0_REG 13 +#define IMX31_CCM_DCVR1_REG 14 +#define IMX31_CCM_DCVR2_REG 15 +#define IMX31_CCM_DCVR3_REG 16 +#define IMX31_CCM_LTR0_REG 17 +#define IMX31_CCM_LTR1_REG 18 +#define IMX31_CCM_LTR2_REG 19 +#define IMX31_CCM_LTR3_REG 20 +#define IMX31_CCM_LTBR0_REG 21 +#define IMX31_CCM_LTBR1_REG 22 +#define IMX31_CCM_PMCR0_REG 23 +#define IMX31_CCM_PMCR1_REG 24 +#define IMX31_CCM_PDR2_REG 25 +#define IMX31_CCM_MAX_REG 26 +/* CCMR */ #define CCMR_FPME (1<<0)#define CCMR_MPE (1<<3)@@ -53,14 +81,8 @@ typedef struct IMX31CCMState {/* <public> */ MemoryRegion iomem; -uint32_t ccmr; -uint32_t pdr0; -uint32_t pdr1; -uint32_t mpctl; -uint32_t spctl; -uint32_t cgr[3 ]; -uint32_t pmcr0; - uint32_t pmcr1; + uint32_t reg[IMX31_CCM_MAX_REG]; + } IMX31CCMState;#endif /* IMX31_CCM_H */ Signature · 1 line
2.5.0
Re: [Qemu-arm] [PATCH v6 5/5] i.MX: move i.MX31 CCM object to register array.
Quoted 11 lines · pcrost
Quoted 2 lines · Jean-Christophe Dubois
With this i.MX25 and i.MX31 to have close implementation.
"will have closer implementations".
Otherwise,
Reviewed-by Peter Crosthwaite <[email protected]>Peter, do you want to just amend the grammar in the queue?
Yes, I've just applied to target-arm.next with that tweak to the commit message.
thanks
-- PMM
Quoted 13 lines · Jean-Christophe Dubois
i.MX25 SOC has a different CCM device than i.MX31.
Qemu i.MX25 emulation was built with i.MX31 CCM driver. This allows Linux to work on top of the i.MX25 emultion but this is not correct.
Furthermore, other SOC we could emulate like i.MX6 have yet a different implementation of the CCM device.
So we split the i.MX31 into a generic base class and a specific i.MX31 class.
We then add an i.MX25 specific CCM Device and have the i.MX25 SOC use it.
Quoted 7 lines
Jean-Christophe Dubois (5):
i.MX: Fix i.MX31 default/reset configuration.
i.MX: rename i.MX CCMget_clock()function and CLK ID enum names i.MX: Split the CCM class into an abstact base class and a concrete
class.
i.MX: Add an i.MX25 specific CCM class/instance.
i.MX: move i.MX31 CCM object to register array.
At Peter C's suggestion I've applied 1-4 to target-arm.next; 5 is still awaiting Peter's review.
thanks
-- PMM