Merge branch 'clockevents/4.14' of http://git.linaro.org/people/daniel.lezcano/linux into timers/core

Pull clockevent updates from Daniel Lezcano:

- Add the new imx-tpm driver (Dong Aisheng)
- Remove DT deprecated binding for Renesas (Magnus Damm)
- Remove error message on memory allocation (Markus Elfring)
- Convert clocksource drivers to use %pOF

+321 -57
+28
Documentation/devicetree/bindings/timer/nxp,tpm-timer.txt
···
··· 1 + NXP Low Power Timer/Pulse Width Modulation Module (TPM) 2 + 3 + The Timer/PWM Module (TPM) supports input capture, output compare, 4 + and the generation of PWM signals to control electric motor and power 5 + management applications. The counter, compare and capture registers 6 + are clocked by an asynchronous clock that can remain enabled in low 7 + power modes. TPM can support global counter bus where one TPM drives 8 + the counter bus for the others, provided bit width is the same. 9 + 10 + Required properties: 11 + 12 + - compatible : should be "fsl,imx7ulp-tpm" 13 + - reg : Specifies base physical address and size of the register sets 14 + for the clock event device and clock source device. 15 + - interrupts : Should be the clock event device interrupt. 16 + - clocks : The clocks provided by the SoC to drive the timer, must contain 17 + an entry for each entry in clock-names. 18 + - clock-names : Must include the following entries: "igp" and "per". 19 + 20 + Example: 21 + tpm5: tpm@40260000 { 22 + compatible = "fsl,imx7ulp-tpm"; 23 + reg = <0x40260000 0x1000>; 24 + interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>; 25 + clocks = <&clks IMX7ULP_CLK_NIC1_BUS_DIV>, 26 + <&clks IMX7ULP_CLK_LPTPM5>; 27 + clock-names = "ipg", "per"; 28 + };
+32 -41
Documentation/devicetree/bindings/timer/renesas,cmt.txt
··· 12 Required Properties: 13 14 - compatible: must contain one or more of the following: 15 - - "renesas,cmt-32-r8a7740" for the r8a7740 32-bit CMT 16 - (CMT0) 17 - - "renesas,cmt-32-sh7372" for the sh7372 32-bit CMT 18 - (CMT0) 19 - - "renesas,cmt-32-sh73a0" for the sh73a0 32-bit CMT 20 - (CMT0) 21 - - "renesas,cmt-32" for all 32-bit CMT without fast clock support 22 - (CMT0 on sh7372, sh73a0 and r8a7740) 23 - This is a fallback for the above renesas,cmt-32-* entries. 24 - 25 - - "renesas,cmt-32-fast-r8a7740" for the r8a7740 32-bit CMT with fast 26 - clock support (CMT[234]) 27 - - "renesas,cmt-32-fast-sh7372" for the sh7372 32-bit CMT with fast 28 - clock support (CMT[234]) 29 - - "renesas,cmt-32-fast-sh73a0" for the sh73A0 32-bit CMT with fast 30 - clock support (CMT[234]) 31 - - "renesas,cmt-32-fast" for all 32-bit CMT with fast clock support 32 - (CMT[234] on sh7372, sh73a0 and r8a7740) 33 - This is a fallback for the above renesas,cmt-32-fast-* entries. 34 - 35 - - "renesas,cmt-48-sh7372" for the sh7372 48-bit CMT 36 - (CMT1) 37 - "renesas,cmt-48-sh73a0" for the sh73A0 48-bit CMT 38 (CMT1) 39 - "renesas,cmt-48-r8a7740" for the r8a7740 48-bit CMT 40 (CMT1) 41 - "renesas,cmt-48" for all non-second generation 48-bit CMT 42 - (CMT1 on sh7372, sh73a0 and r8a7740) 43 This is a fallback for the above renesas,cmt-48-* entries. 44 45 - - "renesas,cmt-48-r8a73a4" for the r8a73a4 48-bit CMT 46 - (CMT[01]) 47 - - "renesas,cmt-48-r8a7790" for the r8a7790 48-bit CMT 48 - (CMT[01]) 49 - - "renesas,cmt-48-r8a7791" for the r8a7791 48-bit CMT 50 - (CMT[01]) 51 - - "renesas,cmt-48-gen2" for all second generation 48-bit CMT 52 - (CMT[01] on r8a73a4, r8a7790 and r8a7791) 53 - This is a fallback for the renesas,cmt-48-r8a73a4, 54 - renesas,cmt-48-r8a7790 and renesas,cmt-48-r8a7791 entries. 55 56 - reg: base address and length of the registers block for the timer module. 57 - interrupts: interrupt-specifier for the timer, one per channel. ··· 42 in clock-names. 43 - clock-names: must contain "fck" for the functional clock. 44 45 - - renesas,channels-mask: bitmask of the available channels. 46 47 - 48 - Example: R8A7790 (R-Car H2) CMT0 node 49 - 50 - CMT0 on R8A7790 implements hardware channels 5 and 6 only and names 51 - them channels 0 and 1 in the documentation. 52 53 cmt0: timer@ffca0000 { 54 - compatible = "renesas,cmt-48-r8a7790", "renesas,cmt-48-gen2"; 55 reg = <0 0xffca0000 0 0x1004>; 56 interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>, 57 <0 142 IRQ_TYPE_LEVEL_HIGH>; 58 clocks = <&mstp1_clks R8A7790_CLK_CMT0>; 59 clock-names = "fck"; 60 61 - renesas,channels-mask = <0x60>; 62 };
··· 12 Required Properties: 13 14 - compatible: must contain one or more of the following: 15 - "renesas,cmt-48-sh73a0" for the sh73A0 48-bit CMT 16 (CMT1) 17 - "renesas,cmt-48-r8a7740" for the r8a7740 48-bit CMT 18 (CMT1) 19 - "renesas,cmt-48" for all non-second generation 48-bit CMT 20 + (CMT1 on sh73a0 and r8a7740) 21 This is a fallback for the above renesas,cmt-48-* entries. 22 23 + - "renesas,cmt0-r8a73a4" for the 32-bit CMT0 device included in r8a73a4. 24 + - "renesas,cmt1-r8a73a4" for the 48-bit CMT1 device included in r8a73a4. 25 + - "renesas,cmt0-r8a7790" for the 32-bit CMT0 device included in r8a7790. 26 + - "renesas,cmt1-r8a7790" for the 48-bit CMT1 device included in r8a7790. 27 + - "renesas,cmt0-r8a7791" for the 32-bit CMT0 device included in r8a7791. 28 + - "renesas,cmt1-r8a7791" for the 48-bit CMT1 device included in r8a7791. 29 + - "renesas,cmt0-r8a7793" for the 32-bit CMT0 device included in r8a7793. 30 + - "renesas,cmt1-r8a7793" for the 48-bit CMT1 device included in r8a7793. 31 + - "renesas,cmt0-r8a7794" for the 32-bit CMT0 device included in r8a7794. 32 + - "renesas,cmt1-r8a7794" for the 48-bit CMT1 device included in r8a7794. 33 + 34 + - "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2. 35 + - "renesas,rcar-gen2-cmt1" for 48-bit CMT1 devices included in R-Car Gen2. 36 + These are fallbacks for r8a73a4 and all the R-Car Gen2 37 + entries listed above. 38 39 - reg: base address and length of the registers block for the timer module. 40 - interrupts: interrupt-specifier for the timer, one per channel. ··· 59 in clock-names. 60 - clock-names: must contain "fck" for the functional clock. 61 62 63 + Example: R8A7790 (R-Car H2) CMT0 and CMT1 nodes 64 65 cmt0: timer@ffca0000 { 66 + compatible = "renesas,cmt0-r8a7790", "renesas,rcar-gen2-cmt0"; 67 reg = <0 0xffca0000 0 0x1004>; 68 interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>, 69 <0 142 IRQ_TYPE_LEVEL_HIGH>; 70 clocks = <&mstp1_clks R8A7790_CLK_CMT0>; 71 clock-names = "fck"; 72 + }; 73 74 + cmt1: timer@e6130000 { 75 + compatible = "renesas,cmt1-r8a7790", "renesas,rcar-gen2-cmt1"; 76 + reg = <0 0xe6130000 0 0x1004>; 77 + interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>, 78 + <0 121 IRQ_TYPE_LEVEL_HIGH>, 79 + <0 122 IRQ_TYPE_LEVEL_HIGH>, 80 + <0 123 IRQ_TYPE_LEVEL_HIGH>, 81 + <0 124 IRQ_TYPE_LEVEL_HIGH>, 82 + <0 125 IRQ_TYPE_LEVEL_HIGH>, 83 + <0 126 IRQ_TYPE_LEVEL_HIGH>, 84 + <0 127 IRQ_TYPE_LEVEL_HIGH>; 85 + clocks = <&mstp3_clks R8A7790_CLK_CMT1>; 86 + clock-names = "fck"; 87 };
+8
drivers/clocksource/Kconfig
··· 598 depends on ARM && CLKDEV_LOOKUP 599 select CLKSRC_MMIO 600 601 config CLKSRC_ST_LPC 602 bool "Low power clocksource found in the LPC" if COMPILE_TEST 603 select TIMER_OF if OF
··· 598 depends on ARM && CLKDEV_LOOKUP 599 select CLKSRC_MMIO 600 601 + config CLKSRC_IMX_TPM 602 + bool "Clocksource using i.MX TPM" if COMPILE_TEST 603 + depends on ARM && CLKDEV_LOOKUP && GENERIC_CLOCKEVENTS 604 + select CLKSRC_MMIO 605 + help 606 + Enable this option to use IMX Timer/PWM Module (TPM) timer as 607 + clocksource. 608 + 609 config CLKSRC_ST_LPC 610 bool "Low power clocksource found in the LPC" if COMPILE_TEST 611 select TIMER_OF if OF
+1
drivers/clocksource/Makefile
··· 67 obj-$(CONFIG_CLKSRC_MIPS_GIC) += mips-gic-timer.o 68 obj-$(CONFIG_CLKSRC_TANGO_XTAL) += tango_xtal.o 69 obj-$(CONFIG_CLKSRC_IMX_GPT) += timer-imx-gpt.o 70 obj-$(CONFIG_ASM9260_TIMER) += asm9260_timer.o 71 obj-$(CONFIG_H8300_TMR8) += h8300_timer8.o 72 obj-$(CONFIG_H8300_TMR16) += h8300_timer16.o
··· 67 obj-$(CONFIG_CLKSRC_MIPS_GIC) += mips-gic-timer.o 68 obj-$(CONFIG_CLKSRC_TANGO_XTAL) += tango_xtal.o 69 obj-$(CONFIG_CLKSRC_IMX_GPT) += timer-imx-gpt.o 70 + obj-$(CONFIG_CLKSRC_IMX_TPM) += timer-imx-tpm.o 71 obj-$(CONFIG_ASM9260_TIMER) += asm9260_timer.o 72 obj-$(CONFIG_H8300_TMR8) += h8300_timer8.o 73 obj-$(CONFIG_H8300_TMR16) += h8300_timer16.o
-1
drivers/clocksource/bcm2835_timer.c
··· 114 115 timer = kzalloc(sizeof(*timer), GFP_KERNEL); 116 if (!timer) { 117 - pr_err("Can't allocate timer struct\n"); 118 ret = -ENOMEM; 119 goto err_iounmap; 120 }
··· 114 115 timer = kzalloc(sizeof(*timer), GFP_KERNEL); 116 if (!timer) { 117 ret = -ENOMEM; 118 goto err_iounmap; 119 }
+3 -3
drivers/clocksource/tango_xtal.c
··· 26 27 xtal_in_cnt = of_iomap(np, 0); 28 if (xtal_in_cnt == NULL) { 29 - pr_err("%s: invalid address\n", np->full_name); 30 return -ENXIO; 31 } 32 33 clk = of_clk_get(np, 0); 34 if (IS_ERR(clk)) { 35 - pr_err("%s: invalid clock\n", np->full_name); 36 return PTR_ERR(clk); 37 } 38 ··· 43 ret = clocksource_mmio_init(xtal_in_cnt, "tango-xtal", xtal_freq, 350, 44 32, clocksource_mmio_readl_up); 45 if (ret) { 46 - pr_err("%s: registration failed\n", np->full_name); 47 return ret; 48 } 49
··· 26 27 xtal_in_cnt = of_iomap(np, 0); 28 if (xtal_in_cnt == NULL) { 29 + pr_err("%pOF: invalid address\n", np); 30 return -ENXIO; 31 } 32 33 clk = of_clk_get(np, 0); 34 if (IS_ERR(clk)) { 35 + pr_err("%pOF: invalid clock\n", np); 36 return PTR_ERR(clk); 37 } 38 ··· 43 ret = clocksource_mmio_init(xtal_in_cnt, "tango-xtal", xtal_freq, 350, 44 32, clocksource_mmio_readl_up); 45 if (ret) { 46 + pr_err("%pOF: registration failed\n", np); 47 return ret; 48 } 49
+239
drivers/clocksource/timer-imx-tpm.c
···
··· 1 + /* 2 + * Copyright 2016 Freescale Semiconductor, Inc. 3 + * Copyright 2017 NXP 4 + * 5 + * This program is free software; you can redistribute it and/or 6 + * modify it under the terms of the GNU General Public License 7 + * as published by the Free Software Foundation; either version 2 8 + * of the License, or (at your option) any later version. 9 + */ 10 + 11 + #include <linux/clk.h> 12 + #include <linux/clockchips.h> 13 + #include <linux/clocksource.h> 14 + #include <linux/delay.h> 15 + #include <linux/interrupt.h> 16 + #include <linux/of_address.h> 17 + #include <linux/of_irq.h> 18 + #include <linux/sched_clock.h> 19 + 20 + #define TPM_SC 0x10 21 + #define TPM_SC_CMOD_INC_PER_CNT (0x1 << 3) 22 + #define TPM_SC_CMOD_DIV_DEFAULT 0x3 23 + #define TPM_CNT 0x14 24 + #define TPM_MOD 0x18 25 + #define TPM_STATUS 0x1c 26 + #define TPM_STATUS_CH0F BIT(0) 27 + #define TPM_C0SC 0x20 28 + #define TPM_C0SC_CHIE BIT(6) 29 + #define TPM_C0SC_MODE_SHIFT 2 30 + #define TPM_C0SC_MODE_MASK 0x3c 31 + #define TPM_C0SC_MODE_SW_COMPARE 0x4 32 + #define TPM_C0V 0x24 33 + 34 + static void __iomem *timer_base; 35 + static struct clock_event_device clockevent_tpm; 36 + 37 + static inline void tpm_timer_disable(void) 38 + { 39 + unsigned int val; 40 + 41 + /* channel disable */ 42 + val = readl(timer_base + TPM_C0SC); 43 + val &= ~(TPM_C0SC_MODE_MASK | TPM_C0SC_CHIE); 44 + writel(val, timer_base + TPM_C0SC); 45 + } 46 + 47 + static inline void tpm_timer_enable(void) 48 + { 49 + unsigned int val; 50 + 51 + /* channel enabled in sw compare mode */ 52 + val = readl(timer_base + TPM_C0SC); 53 + val |= (TPM_C0SC_MODE_SW_COMPARE << TPM_C0SC_MODE_SHIFT) | 54 + TPM_C0SC_CHIE; 55 + writel(val, timer_base + TPM_C0SC); 56 + } 57 + 58 + static inline void tpm_irq_acknowledge(void) 59 + { 60 + writel(TPM_STATUS_CH0F, timer_base + TPM_STATUS); 61 + } 62 + 63 + static struct delay_timer tpm_delay_timer; 64 + 65 + static inline unsigned long tpm_read_counter(void) 66 + { 67 + return readl(timer_base + TPM_CNT); 68 + } 69 + 70 + static unsigned long tpm_read_current_timer(void) 71 + { 72 + return tpm_read_counter(); 73 + } 74 + 75 + static u64 notrace tpm_read_sched_clock(void) 76 + { 77 + return tpm_read_counter(); 78 + } 79 + 80 + static int __init tpm_clocksource_init(unsigned long rate) 81 + { 82 + tpm_delay_timer.read_current_timer = &tpm_read_current_timer; 83 + tpm_delay_timer.freq = rate; 84 + register_current_timer_delay(&tpm_delay_timer); 85 + 86 + sched_clock_register(tpm_read_sched_clock, 32, rate); 87 + 88 + return clocksource_mmio_init(timer_base + TPM_CNT, "imx-tpm", 89 + rate, 200, 32, clocksource_mmio_readl_up); 90 + } 91 + 92 + static int tpm_set_next_event(unsigned long delta, 93 + struct clock_event_device *evt) 94 + { 95 + unsigned long next, now; 96 + 97 + next = tpm_read_counter(); 98 + next += delta; 99 + writel(next, timer_base + TPM_C0V); 100 + now = tpm_read_counter(); 101 + 102 + /* 103 + * NOTE: We observed in a very small probability, the bus fabric 104 + * contention between GPU and A7 may results a few cycles delay 105 + * of writing CNT registers which may cause the min_delta event got 106 + * missed, so we need add a ETIME check here in case it happened. 107 + */ 108 + return (int)((next - now) <= 0) ? -ETIME : 0; 109 + } 110 + 111 + static int tpm_set_state_oneshot(struct clock_event_device *evt) 112 + { 113 + tpm_timer_enable(); 114 + 115 + return 0; 116 + } 117 + 118 + static int tpm_set_state_shutdown(struct clock_event_device *evt) 119 + { 120 + tpm_timer_disable(); 121 + 122 + return 0; 123 + } 124 + 125 + static irqreturn_t tpm_timer_interrupt(int irq, void *dev_id) 126 + { 127 + struct clock_event_device *evt = dev_id; 128 + 129 + tpm_irq_acknowledge(); 130 + 131 + evt->event_handler(evt); 132 + 133 + return IRQ_HANDLED; 134 + } 135 + 136 + static struct clock_event_device clockevent_tpm = { 137 + .name = "i.MX7ULP TPM Timer", 138 + .features = CLOCK_EVT_FEAT_ONESHOT, 139 + .set_state_oneshot = tpm_set_state_oneshot, 140 + .set_next_event = tpm_set_next_event, 141 + .set_state_shutdown = tpm_set_state_shutdown, 142 + .rating = 200, 143 + }; 144 + 145 + static int __init tpm_clockevent_init(unsigned long rate, int irq) 146 + { 147 + int ret; 148 + 149 + ret = request_irq(irq, tpm_timer_interrupt, IRQF_TIMER | IRQF_IRQPOLL, 150 + "i.MX7ULP TPM Timer", &clockevent_tpm); 151 + 152 + clockevent_tpm.cpumask = cpumask_of(0); 153 + clockevent_tpm.irq = irq; 154 + clockevents_config_and_register(&clockevent_tpm, 155 + rate, 300, 0xfffffffe); 156 + 157 + return ret; 158 + } 159 + 160 + static int __init tpm_timer_init(struct device_node *np) 161 + { 162 + struct clk *ipg, *per; 163 + int irq, ret; 164 + u32 rate; 165 + 166 + timer_base = of_iomap(np, 0); 167 + if (!timer_base) { 168 + pr_err("tpm: failed to get base address\n"); 169 + return -ENXIO; 170 + } 171 + 172 + irq = irq_of_parse_and_map(np, 0); 173 + if (!irq) { 174 + pr_err("tpm: failed to get irq\n"); 175 + ret = -ENOENT; 176 + goto err_iomap; 177 + } 178 + 179 + ipg = of_clk_get_by_name(np, "ipg"); 180 + per = of_clk_get_by_name(np, "per"); 181 + if (IS_ERR(ipg) || IS_ERR(per)) { 182 + pr_err("tpm: failed to get igp or per clk\n"); 183 + ret = -ENODEV; 184 + goto err_clk_get; 185 + } 186 + 187 + /* enable clk before accessing registers */ 188 + ret = clk_prepare_enable(ipg); 189 + if (ret) { 190 + pr_err("tpm: ipg clock enable failed (%d)\n", ret); 191 + goto err_clk_get; 192 + } 193 + 194 + ret = clk_prepare_enable(per); 195 + if (ret) { 196 + pr_err("tpm: per clock enable failed (%d)\n", ret); 197 + goto err_per_clk_enable; 198 + } 199 + 200 + /* 201 + * Initialize tpm module to a known state 202 + * 1) Counter disabled 203 + * 2) TPM counter operates in up counting mode 204 + * 3) Timer Overflow Interrupt disabled 205 + * 4) Channel0 disabled 206 + * 5) DMA transfers disabled 207 + */ 208 + writel(0, timer_base + TPM_SC); 209 + writel(0, timer_base + TPM_CNT); 210 + writel(0, timer_base + TPM_C0SC); 211 + 212 + /* increase per cnt, div 8 by default */ 213 + writel(TPM_SC_CMOD_INC_PER_CNT | TPM_SC_CMOD_DIV_DEFAULT, 214 + timer_base + TPM_SC); 215 + 216 + /* set MOD register to maximum for free running mode */ 217 + writel(0xffffffff, timer_base + TPM_MOD); 218 + 219 + rate = clk_get_rate(per) >> 3; 220 + ret = tpm_clocksource_init(rate); 221 + if (ret) 222 + goto err_per_clk_enable; 223 + 224 + ret = tpm_clockevent_init(rate, irq); 225 + if (ret) 226 + goto err_per_clk_enable; 227 + 228 + return 0; 229 + 230 + err_per_clk_enable: 231 + clk_disable_unprepare(ipg); 232 + err_clk_get: 233 + clk_put(per); 234 + clk_put(ipg); 235 + err_iomap: 236 + iounmap(timer_base); 237 + return ret; 238 + } 239 + TIMER_OF_DECLARE(imx7ulp, "fsl,imx7ulp-tpm", tpm_timer_init);
+5 -6
drivers/clocksource/timer-of.c
··· 52 of_irq->irq = irq_of_parse_and_map(np, of_irq->index); 53 } 54 if (!of_irq->irq) { 55 - pr_err("Failed to map interrupt for %s\n", np->full_name); 56 return -EINVAL; 57 } 58 ··· 63 of_irq->flags ? of_irq->flags : IRQF_TIMER, 64 np->full_name, clkevt); 65 if (ret) { 66 - pr_err("Failed to request irq %d for %s\n", of_irq->irq, 67 - np->full_name); 68 return ret; 69 } 70 ··· 87 of_clk->clk = of_clk->name ? of_clk_get_by_name(np, of_clk->name) : 88 of_clk_get(np, of_clk->index); 89 if (IS_ERR(of_clk->clk)) { 90 - pr_err("Failed to get clock for %s\n", np->full_name); 91 return PTR_ERR(of_clk->clk); 92 } 93 94 ret = clk_prepare_enable(of_clk->clk); 95 if (ret) { 96 - pr_err("Failed for enable clock for %s\n", np->full_name); 97 goto out_clk_put; 98 } 99 100 of_clk->rate = clk_get_rate(of_clk->clk); 101 if (!of_clk->rate) { 102 ret = -EINVAL; 103 - pr_err("Failed to get clock rate for %s\n", np->full_name); 104 goto out_clk_disable; 105 } 106
··· 52 of_irq->irq = irq_of_parse_and_map(np, of_irq->index); 53 } 54 if (!of_irq->irq) { 55 + pr_err("Failed to map interrupt for %pOF\n", np); 56 return -EINVAL; 57 } 58 ··· 63 of_irq->flags ? of_irq->flags : IRQF_TIMER, 64 np->full_name, clkevt); 65 if (ret) { 66 + pr_err("Failed to request irq %d for %pOF\n", of_irq->irq, np); 67 return ret; 68 } 69 ··· 88 of_clk->clk = of_clk->name ? of_clk_get_by_name(np, of_clk->name) : 89 of_clk_get(np, of_clk->index); 90 if (IS_ERR(of_clk->clk)) { 91 + pr_err("Failed to get clock for %pOF\n", np); 92 return PTR_ERR(of_clk->clk); 93 } 94 95 ret = clk_prepare_enable(of_clk->clk); 96 if (ret) { 97 + pr_err("Failed for enable clock for %pOF\n", np); 98 goto out_clk_put; 99 } 100 101 of_clk->rate = clk_get_rate(of_clk->clk); 102 if (!of_clk->rate) { 103 ret = -EINVAL; 104 + pr_err("Failed to get clock rate for %pOF\n", np); 105 goto out_clk_disable; 106 } 107
+1 -2
drivers/clocksource/timer-probe.c
··· 40 41 ret = init_func_ret(np); 42 if (ret) { 43 - pr_err("Failed to initialize '%s': %d\n", 44 - of_node_full_name(np), ret); 45 continue; 46 } 47
··· 40 41 ret = init_func_ret(np); 42 if (ret) { 43 + pr_err("Failed to initialize '%pOF': %d\n", np, ret); 44 continue; 45 } 46
+4 -4
drivers/clocksource/timer-stm32.c
··· 138 irq = irq_of_parse_and_map(np, 0); 139 if (!irq) { 140 ret = -EINVAL; 141 - pr_err("%s: failed to get irq.\n", np->full_name); 142 goto err_get_irq; 143 } 144 ··· 168 ret = request_irq(irq, stm32_clock_event_handler, IRQF_TIMER, 169 "stm32 clockevent", data); 170 if (ret) { 171 - pr_err("%s: failed to request irq.\n", np->full_name); 172 goto err_get_irq; 173 } 174 175 - pr_info("%s: STM32 clockevent driver initialized (%d bits)\n", 176 - np->full_name, bits); 177 178 return ret; 179
··· 138 irq = irq_of_parse_and_map(np, 0); 139 if (!irq) { 140 ret = -EINVAL; 141 + pr_err("%pOF: failed to get irq.\n", np); 142 goto err_get_irq; 143 } 144 ··· 168 ret = request_irq(irq, stm32_clock_event_handler, IRQF_TIMER, 169 "stm32 clockevent", data); 170 if (ret) { 171 + pr_err("%pOF: failed to request irq.\n", np); 172 goto err_get_irq; 173 } 174 175 + pr_info("%pOF: STM32 clockevent driver initialized (%d bits)\n", 176 + np, bits); 177 178 return ret; 179