diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-29 17:32:49 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-29 17:32:49 -0400 |
commit | e1ce697db67421cc7e9a1cc1312149f3a4e08c93 (patch) | |
tree | c5da8bdc569e57665807d28b7351503f80221da3 /drivers | |
parent | af17b3aa1fea3a87d81b499b3039a4b76a668d87 (diff) | |
parent | 090bcfd5d1b631ef0f6f46de19ae5a8d0cbfd6a0 (diff) |
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Thomas writes:
"Three small fixes for clocksource drivers:
- Proper error handling in the Atmel PIT driver
- Add CLOCK_SOURCE_SUSPEND_NONSTOP for TI SoCs so suspend works again
- Fix the next event function for Facebook Backpack-CMM BMC chips so
usleep(100) doesnt sleep several milliseconds"
* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
clocksource/drivers/timer-atmel-pit: Properly handle error cases
clocksource/drivers/fttmr010: Fix set_next_event handler
clocksource/drivers/ti-32k: Add CLOCK_SOURCE_SUSPEND_NONSTOP flag for non-am43 SoCs
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clocksource/timer-atmel-pit.c | 20 | ||||
-rw-r--r-- | drivers/clocksource/timer-fttmr010.c | 18 | ||||
-rw-r--r-- | drivers/clocksource/timer-ti-32k.c | 3 |
3 files changed, 28 insertions, 13 deletions
diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c index ec8a4376f74f..2fab18fae4fc 100644 --- a/drivers/clocksource/timer-atmel-pit.c +++ b/drivers/clocksource/timer-atmel-pit.c | |||
@@ -180,26 +180,29 @@ static int __init at91sam926x_pit_dt_init(struct device_node *node) | |||
180 | data->base = of_iomap(node, 0); | 180 | data->base = of_iomap(node, 0); |
181 | if (!data->base) { | 181 | if (!data->base) { |
182 | pr_err("Could not map PIT address\n"); | 182 | pr_err("Could not map PIT address\n"); |
183 | return -ENXIO; | 183 | ret = -ENXIO; |
184 | goto exit; | ||
184 | } | 185 | } |
185 | 186 | ||
186 | data->mck = of_clk_get(node, 0); | 187 | data->mck = of_clk_get(node, 0); |
187 | if (IS_ERR(data->mck)) { | 188 | if (IS_ERR(data->mck)) { |
188 | pr_err("Unable to get mck clk\n"); | 189 | pr_err("Unable to get mck clk\n"); |
189 | return PTR_ERR(data->mck); | 190 | ret = PTR_ERR(data->mck); |
191 | goto exit; | ||
190 | } | 192 | } |
191 | 193 | ||
192 | ret = clk_prepare_enable(data->mck); | 194 | ret = clk_prepare_enable(data->mck); |
193 | if (ret) { | 195 | if (ret) { |
194 | pr_err("Unable to enable mck\n"); | 196 | pr_err("Unable to enable mck\n"); |
195 | return ret; | 197 | goto exit; |
196 | } | 198 | } |
197 | 199 | ||
198 | /* Get the interrupts property */ | 200 | /* Get the interrupts property */ |
199 | data->irq = irq_of_parse_and_map(node, 0); | 201 | data->irq = irq_of_parse_and_map(node, 0); |
200 | if (!data->irq) { | 202 | if (!data->irq) { |
201 | pr_err("Unable to get IRQ from DT\n"); | 203 | pr_err("Unable to get IRQ from DT\n"); |
202 | return -EINVAL; | 204 | ret = -EINVAL; |
205 | goto exit; | ||
203 | } | 206 | } |
204 | 207 | ||
205 | /* | 208 | /* |
@@ -227,7 +230,7 @@ static int __init at91sam926x_pit_dt_init(struct device_node *node) | |||
227 | ret = clocksource_register_hz(&data->clksrc, pit_rate); | 230 | ret = clocksource_register_hz(&data->clksrc, pit_rate); |
228 | if (ret) { | 231 | if (ret) { |
229 | pr_err("Failed to register clocksource\n"); | 232 | pr_err("Failed to register clocksource\n"); |
230 | return ret; | 233 | goto exit; |
231 | } | 234 | } |
232 | 235 | ||
233 | /* Set up irq handler */ | 236 | /* Set up irq handler */ |
@@ -236,7 +239,8 @@ static int __init at91sam926x_pit_dt_init(struct device_node *node) | |||
236 | "at91_tick", data); | 239 | "at91_tick", data); |
237 | if (ret) { | 240 | if (ret) { |
238 | pr_err("Unable to setup IRQ\n"); | 241 | pr_err("Unable to setup IRQ\n"); |
239 | return ret; | 242 | clocksource_unregister(&data->clksrc); |
243 | goto exit; | ||
240 | } | 244 | } |
241 | 245 | ||
242 | /* Set up and register clockevents */ | 246 | /* Set up and register clockevents */ |
@@ -254,6 +258,10 @@ static int __init at91sam926x_pit_dt_init(struct device_node *node) | |||
254 | clockevents_register_device(&data->clkevt); | 258 | clockevents_register_device(&data->clkevt); |
255 | 259 | ||
256 | return 0; | 260 | return 0; |
261 | |||
262 | exit: | ||
263 | kfree(data); | ||
264 | return ret; | ||
257 | } | 265 | } |
258 | TIMER_OF_DECLARE(at91sam926x_pit, "atmel,at91sam9260-pit", | 266 | TIMER_OF_DECLARE(at91sam926x_pit, "atmel,at91sam9260-pit", |
259 | at91sam926x_pit_dt_init); | 267 | at91sam926x_pit_dt_init); |
diff --git a/drivers/clocksource/timer-fttmr010.c b/drivers/clocksource/timer-fttmr010.c index c020038ebfab..cf93f6419b51 100644 --- a/drivers/clocksource/timer-fttmr010.c +++ b/drivers/clocksource/timer-fttmr010.c | |||
@@ -130,13 +130,17 @@ static int fttmr010_timer_set_next_event(unsigned long cycles, | |||
130 | cr &= ~fttmr010->t1_enable_val; | 130 | cr &= ~fttmr010->t1_enable_val; |
131 | writel(cr, fttmr010->base + TIMER_CR); | 131 | writel(cr, fttmr010->base + TIMER_CR); |
132 | 132 | ||
133 | /* Setup the match register forward/backward in time */ | 133 | if (fttmr010->count_down) { |
134 | cr = readl(fttmr010->base + TIMER1_COUNT); | 134 | /* |
135 | if (fttmr010->count_down) | 135 | * ASPEED Timer Controller will load TIMER1_LOAD register |
136 | cr -= cycles; | 136 | * into TIMER1_COUNT register when the timer is re-enabled. |
137 | else | 137 | */ |
138 | cr += cycles; | 138 | writel(cycles, fttmr010->base + TIMER1_LOAD); |
139 | writel(cr, fttmr010->base + TIMER1_MATCH1); | 139 | } else { |
140 | /* Setup the match register forward in time */ | ||
141 | cr = readl(fttmr010->base + TIMER1_COUNT); | ||
142 | writel(cr + cycles, fttmr010->base + TIMER1_MATCH1); | ||
143 | } | ||
140 | 144 | ||
141 | /* Start */ | 145 | /* Start */ |
142 | cr = readl(fttmr010->base + TIMER_CR); | 146 | cr = readl(fttmr010->base + TIMER_CR); |
diff --git a/drivers/clocksource/timer-ti-32k.c b/drivers/clocksource/timer-ti-32k.c index 29e2e1a78a43..6949a9113dbb 100644 --- a/drivers/clocksource/timer-ti-32k.c +++ b/drivers/clocksource/timer-ti-32k.c | |||
@@ -97,6 +97,9 @@ static int __init ti_32k_timer_init(struct device_node *np) | |||
97 | return -ENXIO; | 97 | return -ENXIO; |
98 | } | 98 | } |
99 | 99 | ||
100 | if (!of_machine_is_compatible("ti,am43")) | ||
101 | ti_32k_timer.cs.flags |= CLOCK_SOURCE_SUSPEND_NONSTOP; | ||
102 | |||
100 | ti_32k_timer.counter = ti_32k_timer.base; | 103 | ti_32k_timer.counter = ti_32k_timer.base; |
101 | 104 | ||
102 | /* | 105 | /* |