Skip to content

Commit bc20f2f

Browse files
committed
iio: jesd204: axi_jesd204_rx: use managed resource in probe
Make use of devm_* variants and devm_add_action_or_reset() for automatically release the resources allocated in probe. Hence the driver .remove() hook can be removed. The goal was to keep the same order when releasing the resource as we had with the .remove() hook. Also note the move to the advised devm_clk_hw_register() so that we can also make use of devm_of_clk_add_hw_provider(). While at, remove the unneeded check on irq being 0. Signed-off-by: Nuno Sa <[email protected]>
1 parent b0ed046 commit bc20f2f

File tree

1 file changed

+56
-56
lines changed

1 file changed

+56
-56
lines changed

drivers/iio/jesd204/axi_jesd204_rx.c

+56-56
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,6 @@ static int axi_jesd204_register_dummy_clk(struct axi_jesd204_rx *jesd,
758758
struct device_node *np = dev->of_node;
759759
const char *parent_name, *clk_name;
760760
struct clk_init_data init;
761-
struct clk *dummy_clk;
762761
int ret;
763762

764763
ret = of_property_read_string(np, "clock-output-names",
@@ -776,13 +775,11 @@ static int axi_jesd204_register_dummy_clk(struct axi_jesd204_rx *jesd,
776775

777776
jesd->dummy_clk.init = &init;
778777

779-
dummy_clk = devm_clk_register(dev, &jesd->dummy_clk);
780-
if (IS_ERR(dummy_clk))
781-
return PTR_ERR(dummy_clk);
782-
783-
of_clk_add_provider(np, of_clk_src_simple_get, dummy_clk);
778+
ret = devm_clk_hw_register(dev, &jesd->dummy_clk);
779+
if (ret)
780+
return ret;
784781

785-
return 0;
782+
return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &jesd->dummy_clk);
786783
}
787784

788785
static int axi_jesd204_rx_pcore_check(struct axi_jesd204_rx *jesd)
@@ -1154,6 +1151,32 @@ static void axi_jesd204_rx_create_remove_devattrs(struct device *dev,
11541151
}
11551152
}
11561153

1154+
static void axi_jesd204_clk_disable(void *clk)
1155+
{
1156+
clk_disable_unprepare(clk);
1157+
}
1158+
1159+
static void axi_jesd204_rx_teardown(void *data)
1160+
{
1161+
struct axi_jesd204_rx *jesd = data;
1162+
1163+
writel_relaxed(0xff, jesd->base + JESD204_RX_REG_IRQ_PENDING);
1164+
writel_relaxed(0x00, jesd->base + JESD204_RX_REG_IRQ_ENABLE);
1165+
writel_relaxed(0x1, jesd->base + JESD204_RX_REG_LINK_DISABLE);
1166+
}
1167+
1168+
static void axi_jesd204_rx_rmattr(void *data)
1169+
{
1170+
struct axi_jesd204_rx *jesd = data;
1171+
1172+
axi_jesd204_rx_create_remove_devattrs(jesd->dev, jesd, false);
1173+
}
1174+
1175+
static void axi_jesd204_stop_fsm(void *jdev)
1176+
{
1177+
jesd204_fsm_stop(jdev, JESD204_LINKS_ALL);
1178+
}
1179+
11571180
static int axi_jesd204_rx_probe(struct platform_device *pdev)
11581181
{
11591182
struct axi_jesd204_rx *jesd;
@@ -1172,8 +1195,6 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
11721195
irq = platform_get_irq(pdev, 0);
11731196
if (irq < 0)
11741197
return irq;
1175-
if (irq == 0)
1176-
return -ENXIO;
11771198

11781199
jesd = devm_kzalloc(&pdev->dev, sizeof(*jesd), GFP_KERNEL);
11791200
if (!jesd)
@@ -1207,7 +1228,7 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
12071228
if (IS_ERR(jesd->reset_done_gpio))
12081229
return PTR_ERR(jesd->reset_done_gpio);
12091230

1210-
jesd->axi_clk = devm_clk_get(&pdev->dev, "s_axi_aclk");
1231+
jesd->axi_clk = devm_clk_get_enabled(&pdev->dev, "s_axi_aclk");
12111232
if (IS_ERR(jesd->axi_clk))
12121233
return PTR_ERR(jesd->axi_clk);
12131234

@@ -1237,18 +1258,19 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
12371258
if (IS_ERR(jesd->sysref_clk))
12381259
return PTR_ERR(jesd->sysref_clk);
12391260

1240-
ret = clk_prepare_enable(jesd->axi_clk);
1241-
if (ret)
1242-
return ret;
1243-
12441261
jesd->axi_clk_freq = clk_get_rate(jesd->axi_clk);
12451262
if (!jesd->axi_clk_freq)
12461263
jesd->axi_clk_freq = 100000000; /* 100 MHz */
12471264

12481265
if (jesd->conv2_clk) {
12491266
ret = clk_prepare_enable(jesd->conv2_clk);
12501267
if (ret)
1251-
goto err_axi_clk_disable;
1268+
return ret;
1269+
1270+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_clk_disable,
1271+
jesd->conv2_clk);
1272+
if (ret)
1273+
return ret;
12521274
}
12531275

12541276
jesd->num_lanes = readl_relaxed(jesd->base + JESD204_RX_REG_SYNTH_NUM_LANES);
@@ -1266,13 +1288,17 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
12661288
} else if (jesd->encoder >= JESD204_ENCODER_MAX) {
12671289
dev_err(&pdev->dev, "Invalid encoder value from HDL core %u\n",
12681290
jesd->encoder);
1269-
goto err_conv2_clk_disable;
1291+
return ret;
12701292
}
12711293

1294+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_rx_teardown, jesd);
1295+
if (ret)
1296+
return ret;
1297+
12721298
if (!jesd->jdev) {
12731299
ret = axi_jesd204_init_non_framework(&pdev->dev, jesd);
12741300
if (ret)
1275-
goto err_conv2_clk_disable;
1301+
return ret;
12761302
}
12771303

12781304
writel_relaxed(0xff, jesd->base + JESD204_RX_REG_IRQ_PENDING);
@@ -1286,7 +1312,7 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
12861312
IRQF_ONESHOT, dev_name(&pdev->dev),
12871313
jesd);
12881314
if (ret)
1289-
goto err_uninit_non_framework;
1315+
return ret;
12901316

12911317
disable_irq(irq);
12921318

@@ -1300,9 +1326,19 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
13001326

13011327
axi_jesd204_rx_create_remove_devattrs(&pdev->dev, jesd, true);
13021328

1303-
ret = jesd204_fsm_start(jesd->jdev, JESD204_LINKS_ALL);
1329+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_rx_rmattr, jesd);
13041330
if (ret)
1305-
goto err_remove_debugfs;
1331+
return ret;
1332+
1333+
if (jesd->jdev) {
1334+
ret = jesd204_fsm_start(jesd->jdev, JESD204_LINKS_ALL);
1335+
if (ret)
1336+
return ret;
1337+
1338+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_stop_fsm, jesd->jdev);
1339+
if (ret)
1340+
return ret;
1341+
}
13061342

13071343
dev_info(&pdev->dev, "AXI-JESD204-RX (%d.%.2d.%c). Encoder %s, width %u/%u, lanes %d%s.",
13081344
ADI_AXI_PCORE_VER_MAJOR(jesd->version), ADI_AXI_PCORE_VER_MINOR(jesd->version),
@@ -1311,41 +1347,6 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
13111347
jdev ? ", jesd204-fsm" : "");
13121348

13131349
return 0;
1314-
1315-
err_remove_debugfs:
1316-
axi_jesd204_rx_create_remove_devattrs(&pdev->dev, jesd, false);
1317-
err_uninit_non_framework:
1318-
if (!jesd->jdev)
1319-
of_clk_del_provider(pdev->dev.of_node);
1320-
err_conv2_clk_disable:
1321-
clk_disable_unprepare(jesd->conv2_clk);
1322-
err_axi_clk_disable:
1323-
clk_disable_unprepare(jesd->axi_clk);
1324-
1325-
return ret;
1326-
}
1327-
1328-
static int axi_jesd204_rx_remove(struct platform_device *pdev)
1329-
{
1330-
struct axi_jesd204_rx *jesd = platform_get_drvdata(pdev);
1331-
1332-
if (jesd->jdev)
1333-
jesd204_fsm_stop(jesd->jdev, JESD204_LINKS_ALL);
1334-
1335-
axi_jesd204_rx_create_remove_devattrs(&pdev->dev, jesd, false);
1336-
1337-
if (!jesd->jdev)
1338-
of_clk_del_provider(pdev->dev.of_node);
1339-
1340-
writel_relaxed(0xff, jesd->base + JESD204_RX_REG_IRQ_PENDING);
1341-
writel_relaxed(0x00, jesd->base + JESD204_RX_REG_IRQ_ENABLE);
1342-
1343-
writel_relaxed(0x1, jesd->base + JESD204_RX_REG_LINK_DISABLE);
1344-
1345-
clk_disable_unprepare(jesd->conv2_clk);
1346-
clk_disable_unprepare(jesd->axi_clk);
1347-
1348-
return 0;
13491350
}
13501351

13511352
static const struct of_device_id axi_jesd204_rx_of_match[] = {
@@ -1357,7 +1358,6 @@ MODULE_DEVICE_TABLE(of, axi_jesd204_rx_of_match);
13571358

13581359
static struct platform_driver axi_jesd204_rx_driver = {
13591360
.probe = axi_jesd204_rx_probe,
1360-
.remove = axi_jesd204_rx_remove,
13611361
.driver = {
13621362
.name = "axi-jesd204-rx",
13631363
.of_match_table = axi_jesd204_rx_of_match,

0 commit comments

Comments
 (0)