Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d4da27a

Browse files
committed
Merge pull request torvalds#59 from aejsmith/ci20-v3.18-poweroff
Fix power off code
2 parents 677ac02 + 26a37dd commit d4da27a

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

arch/mips/jz4740/reset.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,13 @@ static void jz4740_restart(char *command)
6161
#define JZ_REG_RTC_HIBERNATE 0x20
6262
#define JZ_REG_RTC_WAKEUP_FILTER 0x24
6363
#define JZ_REG_RTC_RESET_COUNTER 0x28
64+
#define JZ_REG_RTC_WENR 0x3C
6465

6566
#define JZ_RTC_CTRL_WRDY BIT(7)
6667
#define JZ_RTC_WAKEUP_FILTER_MASK 0x0000FFE0
6768
#define JZ_RTC_RESET_COUNTER_MASK 0x00000FE0
69+
#define JZ_RTC_WENR_PAT 0x0000A55A
70+
#define JZ_RTC_WENR_WEN BIT(31)
6871

6972
static inline void jz4740_rtc_wait_ready(void __iomem *rtc_base)
7073
{
@@ -75,6 +78,22 @@ static inline void jz4740_rtc_wait_ready(void __iomem *rtc_base)
7578
} while (!(ctrl & JZ_RTC_CTRL_WRDY));
7679
}
7780

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+
7897
static void jz4740_power_off(void)
7998
{
8099
void __iomem *rtc_base = ioremap(JZ4740_RTC_BASE_ADDR, 0x38);
@@ -98,8 +117,8 @@ static void jz4740_power_off(void)
98117
wakeup_filter_ticks &= JZ_RTC_WAKEUP_FILTER_MASK;
99118
else
100119
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);
103122

104123
/*
105124
* Set reset pin low-level assertion time after wakeup: 60 ms.
@@ -110,11 +129,10 @@ static void jz4740_power_off(void)
110129
reset_counter_ticks &= JZ_RTC_RESET_COUNTER_MASK;
111130
else
112131
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);
115134

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);
118136

119137
jz4740_halt();
120138
}

0 commit comments

Comments
 (0)