Skip to content

Commit a8f2d48

Browse files
Leo-YanSuzuki K Poulose
authored andcommitted
coresight: Appropriately disable trace bus clocks
Some CoreSight components have trace bus clocks 'atclk' and are enabled using clk_prepare_enable(). These clocks are not disabled when modules exit. As atclk is optional, use devm_clk_get_optional_enabled() to manage it. The benefit is the driver model layer can automatically disable and release clocks. Check the returned value with IS_ERR() to detect errors but leave the NULL pointer case if the clock is not found. And remove the error handling codes which are no longer needed. Fixes: d1839e6 ("coresight: etm: retrieve and handle atclk") Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com> Reviewed-by: Yeoreum Yun <yeoreum.yun@arm.com> Tested-by: James Clark <james.clark@linaro.org> Signed-off-by: Leo Yan <leo.yan@arm.com> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/20250731-arm_cs_fix_clock_v4-v6-5-1dfe10bb3f6f@arm.com
1 parent 1abc1b2 commit a8f2d48

6 files changed

Lines changed: 34 additions & 74 deletions

File tree

drivers/hwtracing/coresight/coresight-etb10.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -730,12 +730,10 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
730730
if (!drvdata)
731731
return -ENOMEM;
732732

733-
drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */
734-
if (!IS_ERR(drvdata->atclk)) {
735-
ret = clk_prepare_enable(drvdata->atclk);
736-
if (ret)
737-
return ret;
738-
}
733+
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
734+
if (IS_ERR(drvdata->atclk))
735+
return PTR_ERR(drvdata->atclk);
736+
739737
dev_set_drvdata(dev, drvdata);
740738

741739
/* validity for the resource is already checked by the AMBA core */

drivers/hwtracing/coresight/coresight-etm3x-core.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -832,12 +832,9 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
832832

833833
spin_lock_init(&drvdata->spinlock);
834834

835-
drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */
836-
if (!IS_ERR(drvdata->atclk)) {
837-
ret = clk_prepare_enable(drvdata->atclk);
838-
if (ret)
839-
return ret;
840-
}
835+
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
836+
if (IS_ERR(drvdata->atclk))
837+
return PTR_ERR(drvdata->atclk);
841838

842839
drvdata->cpu = coresight_get_cpu(dev);
843840
if (drvdata->cpu < 0)

drivers/hwtracing/coresight/coresight-funnel.c

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ ATTRIBUTE_GROUPS(coresight_funnel);
213213

214214
static int funnel_probe(struct device *dev, struct resource *res)
215215
{
216-
int ret;
217216
void __iomem *base;
218217
struct coresight_platform_data *pdata = NULL;
219218
struct funnel_drvdata *drvdata;
@@ -231,12 +230,9 @@ static int funnel_probe(struct device *dev, struct resource *res)
231230
if (!drvdata)
232231
return -ENOMEM;
233232

234-
drvdata->atclk = devm_clk_get(dev, "atclk"); /* optional */
235-
if (!IS_ERR(drvdata->atclk)) {
236-
ret = clk_prepare_enable(drvdata->atclk);
237-
if (ret)
238-
return ret;
239-
}
233+
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
234+
if (IS_ERR(drvdata->atclk))
235+
return PTR_ERR(drvdata->atclk);
240236

241237
drvdata->pclk = coresight_get_enable_apb_pclk(dev);
242238
if (IS_ERR(drvdata->pclk))
@@ -248,10 +244,8 @@ static int funnel_probe(struct device *dev, struct resource *res)
248244
*/
249245
if (res) {
250246
base = devm_ioremap_resource(dev, res);
251-
if (IS_ERR(base)) {
252-
ret = PTR_ERR(base);
253-
goto out_disable_clk;
254-
}
247+
if (IS_ERR(base))
248+
return PTR_ERR(base);
255249
drvdata->base = base;
256250
desc.groups = coresight_funnel_groups;
257251
desc.access = CSDEV_ACCESS_IOMEM(base);
@@ -261,10 +255,9 @@ static int funnel_probe(struct device *dev, struct resource *res)
261255
dev_set_drvdata(dev, drvdata);
262256

263257
pdata = coresight_get_platform_data(dev);
264-
if (IS_ERR(pdata)) {
265-
ret = PTR_ERR(pdata);
266-
goto out_disable_clk;
267-
}
258+
if (IS_ERR(pdata))
259+
return PTR_ERR(pdata);
260+
268261
dev->platform_data = pdata;
269262

270263
raw_spin_lock_init(&drvdata->spinlock);
@@ -274,17 +267,10 @@ static int funnel_probe(struct device *dev, struct resource *res)
274267
desc.pdata = pdata;
275268
desc.dev = dev;
276269
drvdata->csdev = coresight_register(&desc);
277-
if (IS_ERR(drvdata->csdev)) {
278-
ret = PTR_ERR(drvdata->csdev);
279-
goto out_disable_clk;
280-
}
270+
if (IS_ERR(drvdata->csdev))
271+
return PTR_ERR(drvdata->csdev);
281272

282-
ret = 0;
283-
284-
out_disable_clk:
285-
if (ret && !IS_ERR_OR_NULL(drvdata->atclk))
286-
clk_disable_unprepare(drvdata->atclk);
287-
return ret;
273+
return 0;
288274
}
289275

290276
static int funnel_remove(struct device *dev)

drivers/hwtracing/coresight/coresight-replicator.c

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ static const struct attribute_group *replicator_groups[] = {
219219

220220
static int replicator_probe(struct device *dev, struct resource *res)
221221
{
222-
int ret = 0;
223222
struct coresight_platform_data *pdata = NULL;
224223
struct replicator_drvdata *drvdata;
225224
struct coresight_desc desc = { 0 };
@@ -238,12 +237,9 @@ static int replicator_probe(struct device *dev, struct resource *res)
238237
if (!drvdata)
239238
return -ENOMEM;
240239

241-
drvdata->atclk = devm_clk_get(dev, "atclk"); /* optional */
242-
if (!IS_ERR(drvdata->atclk)) {
243-
ret = clk_prepare_enable(drvdata->atclk);
244-
if (ret)
245-
return ret;
246-
}
240+
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
241+
if (IS_ERR(drvdata->atclk))
242+
return PTR_ERR(drvdata->atclk);
247243

248244
drvdata->pclk = coresight_get_enable_apb_pclk(dev);
249245
if (IS_ERR(drvdata->pclk))
@@ -255,10 +251,8 @@ static int replicator_probe(struct device *dev, struct resource *res)
255251
*/
256252
if (res) {
257253
base = devm_ioremap_resource(dev, res);
258-
if (IS_ERR(base)) {
259-
ret = PTR_ERR(base);
260-
goto out_disable_clk;
261-
}
254+
if (IS_ERR(base))
255+
return PTR_ERR(base);
262256
drvdata->base = base;
263257
desc.groups = replicator_groups;
264258
desc.access = CSDEV_ACCESS_IOMEM(base);
@@ -272,10 +266,8 @@ static int replicator_probe(struct device *dev, struct resource *res)
272266
dev_set_drvdata(dev, drvdata);
273267

274268
pdata = coresight_get_platform_data(dev);
275-
if (IS_ERR(pdata)) {
276-
ret = PTR_ERR(pdata);
277-
goto out_disable_clk;
278-
}
269+
if (IS_ERR(pdata))
270+
return PTR_ERR(pdata);
279271
dev->platform_data = pdata;
280272

281273
raw_spin_lock_init(&drvdata->spinlock);
@@ -286,17 +278,11 @@ static int replicator_probe(struct device *dev, struct resource *res)
286278
desc.dev = dev;
287279

288280
drvdata->csdev = coresight_register(&desc);
289-
if (IS_ERR(drvdata->csdev)) {
290-
ret = PTR_ERR(drvdata->csdev);
291-
goto out_disable_clk;
292-
}
281+
if (IS_ERR(drvdata->csdev))
282+
return PTR_ERR(drvdata->csdev);
293283

294284
replicator_reset(drvdata);
295-
296-
out_disable_clk:
297-
if (ret && !IS_ERR_OR_NULL(drvdata->atclk))
298-
clk_disable_unprepare(drvdata->atclk);
299-
return ret;
285+
return 0;
300286
}
301287

302288
static int replicator_remove(struct device *dev)

drivers/hwtracing/coresight/coresight-stm.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -842,12 +842,9 @@ static int __stm_probe(struct device *dev, struct resource *res)
842842
if (!drvdata)
843843
return -ENOMEM;
844844

845-
drvdata->atclk = devm_clk_get(dev, "atclk"); /* optional */
846-
if (!IS_ERR(drvdata->atclk)) {
847-
ret = clk_prepare_enable(drvdata->atclk);
848-
if (ret)
849-
return ret;
850-
}
845+
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
846+
if (IS_ERR(drvdata->atclk))
847+
return PTR_ERR(drvdata->atclk);
851848

852849
drvdata->pclk = coresight_get_enable_apb_pclk(dev);
853850
if (IS_ERR(drvdata->pclk))

drivers/hwtracing/coresight/coresight-tpiu.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ static const struct coresight_ops tpiu_cs_ops = {
128128

129129
static int __tpiu_probe(struct device *dev, struct resource *res)
130130
{
131-
int ret;
132131
void __iomem *base;
133132
struct coresight_platform_data *pdata = NULL;
134133
struct tpiu_drvdata *drvdata;
@@ -144,12 +143,9 @@ static int __tpiu_probe(struct device *dev, struct resource *res)
144143

145144
spin_lock_init(&drvdata->spinlock);
146145

147-
drvdata->atclk = devm_clk_get(dev, "atclk"); /* optional */
148-
if (!IS_ERR(drvdata->atclk)) {
149-
ret = clk_prepare_enable(drvdata->atclk);
150-
if (ret)
151-
return ret;
152-
}
146+
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
147+
if (IS_ERR(drvdata->atclk))
148+
return PTR_ERR(drvdata->atclk);
153149

154150
drvdata->pclk = coresight_get_enable_apb_pclk(dev);
155151
if (IS_ERR(drvdata->pclk))

0 commit comments

Comments
 (0)