@@ -61,10 +61,13 @@ static void jz4740_restart(char *command)
61
61
#define JZ_REG_RTC_HIBERNATE 0x20
62
62
#define JZ_REG_RTC_WAKEUP_FILTER 0x24
63
63
#define JZ_REG_RTC_RESET_COUNTER 0x28
64
+ #define JZ_REG_RTC_WENR 0x3C
64
65
65
66
#define JZ_RTC_CTRL_WRDY BIT(7)
66
67
#define JZ_RTC_WAKEUP_FILTER_MASK 0x0000FFE0
67
68
#define JZ_RTC_RESET_COUNTER_MASK 0x00000FE0
69
+ #define JZ_RTC_WENR_PAT 0x0000A55A
70
+ #define JZ_RTC_WENR_WEN BIT(31)
68
71
69
72
static inline void jz4740_rtc_wait_ready (void __iomem * rtc_base )
70
73
{
@@ -75,6 +78,22 @@ static inline void jz4740_rtc_wait_ready(void __iomem *rtc_base)
75
78
} while (!(ctrl & JZ_RTC_CTRL_WRDY ));
76
79
}
77
80
81
+ static inline void jz4740_rtc_reg_write (void __iomem * rtc_base , size_t reg ,
82
+ uint32_t val )
83
+ {
84
+ if (config_enabled (CONFIG_MACH_JZ4780 )) {
85
+ jz4740_rtc_wait_ready (rtc_base );
86
+ writel (JZ_RTC_WENR_PAT , rtc_base + JZ_REG_RTC_WENR );
87
+ jz4740_rtc_wait_ready (rtc_base );
88
+
89
+ while (!(readl (rtc_base + JZ_REG_RTC_WENR ) & JZ_RTC_WENR_WEN ))
90
+ ;
91
+ }
92
+
93
+ jz4740_rtc_wait_ready (rtc_base );
94
+ writel (val , rtc_base + reg );
95
+ }
96
+
78
97
static void jz4740_power_off (void )
79
98
{
80
99
void __iomem * rtc_base = ioremap (JZ4740_RTC_BASE_ADDR , 0x38 );
@@ -98,8 +117,8 @@ static void jz4740_power_off(void)
98
117
wakeup_filter_ticks &= JZ_RTC_WAKEUP_FILTER_MASK ;
99
118
else
100
119
wakeup_filter_ticks = JZ_RTC_WAKEUP_FILTER_MASK ;
101
- jz4740_rtc_wait_ready (rtc_base );
102
- writel ( wakeup_filter_ticks , rtc_base + JZ_REG_RTC_WAKEUP_FILTER );
120
+ jz4740_rtc_reg_write (rtc_base , JZ_REG_RTC_WAKEUP_FILTER ,
121
+ wakeup_filter_ticks );
103
122
104
123
/*
105
124
* Set reset pin low-level assertion time after wakeup: 60 ms.
@@ -110,11 +129,10 @@ static void jz4740_power_off(void)
110
129
reset_counter_ticks &= JZ_RTC_RESET_COUNTER_MASK ;
111
130
else
112
131
reset_counter_ticks = JZ_RTC_RESET_COUNTER_MASK ;
113
- jz4740_rtc_wait_ready (rtc_base );
114
- writel ( reset_counter_ticks , rtc_base + JZ_REG_RTC_RESET_COUNTER );
132
+ jz4740_rtc_reg_write (rtc_base , JZ_REG_RTC_RESET_COUNTER ,
133
+ reset_counter_ticks );
115
134
116
- jz4740_rtc_wait_ready (rtc_base );
117
- writel (1 , rtc_base + JZ_REG_RTC_HIBERNATE );
135
+ jz4740_rtc_reg_write (rtc_base , JZ_REG_RTC_HIBERNATE , 1 );
118
136
119
137
jz4740_halt ();
120
138
}
0 commit comments