| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Zumeng Chen <zumeng.chen@gmail.com> |
| Date: Wed, 4 Jul 2018 12:35:29 +0800 |
| Subject: mfd: ti_am335x_tscadc: Fix struct clk memory leak |
| |
| From: Zumeng Chen <zumeng.chen@gmail.com> |
| |
| [ Upstream commit c2b1509c77a99a0dcea0a9051ca743cb88385f50 ] |
| |
| Use devm_elk_get() to let Linux manage struct clk memory to avoid the following |
| memory leakage report: |
| |
| unreferenced object 0xdd75efc0 (size 64): |
| comm "systemd-udevd", pid 186, jiffies 4294945126 (age 1195.750s) |
| hex dump (first 32 bytes): |
| 61 64 63 5f 74 73 63 5f 66 63 6b 00 00 00 00 00 adc_tsc_fck..... |
| 00 00 00 00 92 03 00 00 00 00 00 00 00 00 00 00 ................ |
| backtrace: |
| [<c0a15260>] kmemleak_alloc+0x40/0x74 |
| [<c0287a10>] __kmalloc_track_caller+0x198/0x388 |
| [<c0255610>] kstrdup+0x40/0x5c |
| [<c025565c>] kstrdup_const+0x30/0x3c |
| [<c0636630>] __clk_create_clk+0x60/0xac |
| [<c0630918>] clk_get_sys+0x74/0x144 |
| [<c0630cdc>] clk_get+0x5c/0x68 |
| [<bf0ac540>] ti_tscadc_probe+0x260/0x468 [ti_am335x_tscadc] |
| [<c06f3c0c>] platform_drv_probe+0x60/0xac |
| [<c06f1abc>] driver_probe_device+0x214/0x2dc |
| [<c06f1c18>] __driver_attach+0x94/0xc0 |
| [<c06efe2c>] bus_for_each_dev+0x90/0xa0 |
| [<c06f1470>] driver_attach+0x28/0x30 |
| [<c06f1030>] bus_add_driver+0x184/0x1ec |
| [<c06f2b74>] driver_register+0xb0/0xf0 |
| [<c06f3b4c>] __platform_driver_register+0x40/0x54 |
| |
| Signed-off-by: Zumeng Chen <zumeng.chen@gmail.com> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/mfd/ti_am335x_tscadc.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/mfd/ti_am335x_tscadc.c |
| +++ b/drivers/mfd/ti_am335x_tscadc.c |
| @@ -210,14 +210,13 @@ static int ti_tscadc_probe(struct platfo |
| * The TSC_ADC_SS controller design assumes the OCP clock is |
| * at least 6x faster than the ADC clock. |
| */ |
| - clk = clk_get(&pdev->dev, "adc_tsc_fck"); |
| + clk = devm_clk_get(&pdev->dev, "adc_tsc_fck"); |
| if (IS_ERR(clk)) { |
| dev_err(&pdev->dev, "failed to get TSC fck\n"); |
| err = PTR_ERR(clk); |
| goto err_disable_clk; |
| } |
| clock_rate = clk_get_rate(clk); |
| - clk_put(clk); |
| tscadc->clk_div = clock_rate / ADC_CLK; |
| |
| /* TSCADC_CLKDIV needs to be configured to the value minus 1 */ |