Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fix from Ingo Molnar:
"ARM/MOXA SoC clocksource driver fixes"

* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
clocksource/drivers/moxart: Plug memory and mapping leaks

+16 -6
+16 -6
drivers/clocksource/moxart_timer.c
··· 161 timer->base = of_iomap(node, 0); 162 if (!timer->base) { 163 pr_err("%s: of_iomap failed\n", node->full_name); 164 - return -ENXIO; 165 } 166 167 irq = irq_of_parse_and_map(node, 0); 168 if (irq <= 0) { 169 pr_err("%s: irq_of_parse_and_map failed\n", node->full_name); 170 - return -EINVAL; 171 } 172 173 clk = of_clk_get(node, 0); 174 if (IS_ERR(clk)) { 175 pr_err("%s: of_clk_get failed\n", node->full_name); 176 - return PTR_ERR(clk); 177 } 178 179 pclk = clk_get_rate(clk); ··· 189 timer->t1_disable_val = ASPEED_TIMER1_DISABLE; 190 } else { 191 pr_err("%s: unknown platform\n", node->full_name); 192 - return -EINVAL; 193 } 194 195 timer->count_per_tick = DIV_ROUND_CLOSEST(pclk, HZ); ··· 212 clocksource_mmio_readl_down); 213 if (ret) { 214 pr_err("%s: clocksource_mmio_init failed\n", node->full_name); 215 - return ret; 216 } 217 218 ret = request_irq(irq, moxart_timer_interrupt, IRQF_TIMER, 219 node->name, &timer->clkevt); 220 if (ret) { 221 pr_err("%s: setup_irq failed\n", node->full_name); 222 - return ret; 223 } 224 225 /* Clear match registers */ ··· 245 clockevents_config_and_register(&timer->clkevt, pclk, 0x4, 0xfffffffe); 246 247 return 0; 248 } 249 CLOCKSOURCE_OF_DECLARE(moxart, "moxa,moxart-timer", moxart_timer_init); 250 CLOCKSOURCE_OF_DECLARE(aspeed, "aspeed,ast2400-timer", moxart_timer_init);
··· 161 timer->base = of_iomap(node, 0); 162 if (!timer->base) { 163 pr_err("%s: of_iomap failed\n", node->full_name); 164 + ret = -ENXIO; 165 + goto out_free; 166 } 167 168 irq = irq_of_parse_and_map(node, 0); 169 if (irq <= 0) { 170 pr_err("%s: irq_of_parse_and_map failed\n", node->full_name); 171 + ret = -EINVAL; 172 + goto out_unmap; 173 } 174 175 clk = of_clk_get(node, 0); 176 if (IS_ERR(clk)) { 177 pr_err("%s: of_clk_get failed\n", node->full_name); 178 + ret = PTR_ERR(clk); 179 + goto out_unmap; 180 } 181 182 pclk = clk_get_rate(clk); ··· 186 timer->t1_disable_val = ASPEED_TIMER1_DISABLE; 187 } else { 188 pr_err("%s: unknown platform\n", node->full_name); 189 + ret = -EINVAL; 190 + goto out_unmap; 191 } 192 193 timer->count_per_tick = DIV_ROUND_CLOSEST(pclk, HZ); ··· 208 clocksource_mmio_readl_down); 209 if (ret) { 210 pr_err("%s: clocksource_mmio_init failed\n", node->full_name); 211 + goto out_unmap; 212 } 213 214 ret = request_irq(irq, moxart_timer_interrupt, IRQF_TIMER, 215 node->name, &timer->clkevt); 216 if (ret) { 217 pr_err("%s: setup_irq failed\n", node->full_name); 218 + goto out_unmap; 219 } 220 221 /* Clear match registers */ ··· 241 clockevents_config_and_register(&timer->clkevt, pclk, 0x4, 0xfffffffe); 242 243 return 0; 244 + 245 + out_unmap: 246 + iounmap(timer->base); 247 + out_free: 248 + kfree(timer); 249 + return ret; 250 } 251 CLOCKSOURCE_OF_DECLARE(moxart, "moxa,moxart-timer", moxart_timer_init); 252 CLOCKSOURCE_OF_DECLARE(aspeed, "aspeed,ast2400-timer", moxart_timer_init);