19
19
20
20
#include "trace.h"
21
21
22
+ static const uint32_t ccm_mask [CCM_MAX ] = {
23
+ [CCM_CCR ] = 0xf01fef80 ,
24
+ [CCM_CCDR ] = 0xfffeffff ,
25
+ [CCM_CSR ] = 0xffffffff ,
26
+ [CCM_CCSR ] = 0xfffffef2 ,
27
+ [CCM_CACRR ] = 0xfffffff8 ,
28
+ [CCM_CBCDR ] = 0xc1f8e000 ,
29
+ [CCM_CBCMR ] = 0xfc03cfff ,
30
+ [CCM_CSCMR1 ] = 0x80700000 ,
31
+ [CCM_CSCMR2 ] = 0xe01ff003 ,
32
+ [CCM_CSCDR1 ] = 0xfe00c780 ,
33
+ [CCM_CS1CDR ] = 0xfe00fe00 ,
34
+ [CCM_CS2CDR ] = 0xf8007000 ,
35
+ [CCM_CDCDR ] = 0xf00fffff ,
36
+ [CCM_CHSCCDR ] = 0xfffc01ff ,
37
+ [CCM_CSCDR2 ] = 0xfe0001ff ,
38
+ [CCM_CSCDR3 ] = 0xffffc1ff ,
39
+ [CCM_CDHIPR ] = 0xffffffff ,
40
+ [CCM_CTOR ] = 0x00000000 ,
41
+ [CCM_CLPCR ] = 0xf39ff01c ,
42
+ [CCM_CISR ] = 0xfb85ffbe ,
43
+ [CCM_CIMR ] = 0xfb85ffbf ,
44
+ [CCM_CCOSR ] = 0xfe00fe00 ,
45
+ [CCM_CGPR ] = 0xfffc3fea ,
46
+ [CCM_CCGR0 ] = 0x00000000 ,
47
+ [CCM_CCGR1 ] = 0x00000000 ,
48
+ [CCM_CCGR2 ] = 0x00000000 ,
49
+ [CCM_CCGR3 ] = 0x00000000 ,
50
+ [CCM_CCGR4 ] = 0x00000000 ,
51
+ [CCM_CCGR5 ] = 0x00000000 ,
52
+ [CCM_CCGR6 ] = 0x00000000 ,
53
+ [CCM_CMEOR ] = 0xafffff1f ,
54
+ };
55
+
56
+ static const uint32_t analog_mask [CCM_ANALOG_MAX ] = {
57
+ [CCM_ANALOG_PLL_ARM ] = 0xfff60f80 ,
58
+ [CCM_ANALOG_PLL_USB1 ] = 0xfffe0fbc ,
59
+ [CCM_ANALOG_PLL_USB2 ] = 0xfffe0fbc ,
60
+ [CCM_ANALOG_PLL_SYS ] = 0xfffa0ffe ,
61
+ [CCM_ANALOG_PLL_SYS_SS ] = 0x00000000 ,
62
+ [CCM_ANALOG_PLL_SYS_NUM ] = 0xc0000000 ,
63
+ [CCM_ANALOG_PLL_SYS_DENOM ] = 0xc0000000 ,
64
+ [CCM_ANALOG_PLL_AUDIO ] = 0xffe20f80 ,
65
+ [CCM_ANALOG_PLL_AUDIO_NUM ] = 0xc0000000 ,
66
+ [CCM_ANALOG_PLL_AUDIO_DENOM ] = 0xc0000000 ,
67
+ [CCM_ANALOG_PLL_VIDEO ] = 0xffe20f80 ,
68
+ [CCM_ANALOG_PLL_VIDEO_NUM ] = 0xc0000000 ,
69
+ [CCM_ANALOG_PLL_VIDEO_DENOM ] = 0xc0000000 ,
70
+ [CCM_ANALOG_PLL_ENET ] = 0xffc20ff0 ,
71
+ [CCM_ANALOG_PFD_480 ] = 0x40404040 ,
72
+ [CCM_ANALOG_PFD_528 ] = 0x40404040 ,
73
+ [PMU_MISC0 ] = 0x01fe8306 ,
74
+ [PMU_MISC1 ] = 0x07fcede0 ,
75
+ [PMU_MISC2 ] = 0x005f5f5f ,
76
+ };
77
+
22
78
static const char * imx6ul_ccm_reg_name (uint32_t reg )
23
79
{
24
80
static char unknown [20 ];
@@ -596,11 +652,8 @@ static void imx6ul_ccm_write(void *opaque, hwaddr offset, uint64_t value,
596
652
597
653
trace_ccm_write_reg (imx6ul_ccm_reg_name (index ), (uint32_t )value );
598
654
599
- /*
600
- * We will do a better implementation later. In particular some bits
601
- * cannot be written to.
602
- */
603
- s -> ccm [index ] = (uint32_t )value ;
655
+ s -> ccm [index ] = (s -> ccm [index ] & ccm_mask [index ]) |
656
+ ((uint32_t )value & ~ccm_mask [index ]);
604
657
}
605
658
606
659
static uint64_t imx6ul_analog_read (void * opaque , hwaddr offset , unsigned size )
@@ -737,7 +790,7 @@ static void imx6ul_analog_write(void *opaque, hwaddr offset, uint64_t value,
737
790
* the REG_NAME register. So we change the value of the
738
791
* REG_NAME register, setting bits passed in the value.
739
792
*/
740
- s -> analog [index - 1 ] |= value ;
793
+ s -> analog [index - 1 ] |= ( value & ~ analog_mask [ index - 1 ]) ;
741
794
break ;
742
795
case CCM_ANALOG_PLL_ARM_CLR :
743
796
case CCM_ANALOG_PLL_USB1_CLR :
@@ -762,7 +815,7 @@ static void imx6ul_analog_write(void *opaque, hwaddr offset, uint64_t value,
762
815
* the REG_NAME register. So we change the value of the
763
816
* REG_NAME register, unsetting bits passed in the value.
764
817
*/
765
- s -> analog [index - 2 ] &= ~value ;
818
+ s -> analog [index - 2 ] &= ~( value & ~ analog_mask [ index - 2 ]) ;
766
819
break ;
767
820
case CCM_ANALOG_PLL_ARM_TOG :
768
821
case CCM_ANALOG_PLL_USB1_TOG :
@@ -787,14 +840,11 @@ static void imx6ul_analog_write(void *opaque, hwaddr offset, uint64_t value,
787
840
* the REG_NAME register. So we change the value of the
788
841
* REG_NAME register, toggling bits passed in the value.
789
842
*/
790
- s -> analog [index - 3 ] ^= value ;
843
+ s -> analog [index - 3 ] ^= ( value & ~ analog_mask [ index - 3 ]) ;
791
844
break ;
792
845
default :
793
- /*
794
- * We will do a better implementation later. In particular some bits
795
- * cannot be written to.
796
- */
797
- s -> analog [index ] = value ;
846
+ s -> analog [index ] = (s -> analog [index ] & analog_mask [index ]) |
847
+ (value & ~analog_mask [index ]);
798
848
break ;
799
849
}
800
850
}
0 commit comments