Skip to content

Commit b0ed046

Browse files
committed
iio: jesd204: axi_jesd204_tx: 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 a4d2f98 commit b0ed046

File tree

1 file changed

+58
-63
lines changed

1 file changed

+58
-63
lines changed

drivers/iio/jesd204/axi_jesd204_tx.c

+58-63
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,6 @@ static int axi_jesd204_register_dummy_clk(struct axi_jesd204_tx *jesd,
525525
struct device_node *np = dev->of_node;
526526
const char *parent_name, *clk_name;
527527
struct clk_init_data init;
528-
struct clk *dummy_clk;
529528
int ret;
530529

531530
ret = of_property_read_string(np, "clock-output-names",
@@ -543,13 +542,11 @@ static int axi_jesd204_register_dummy_clk(struct axi_jesd204_tx *jesd,
543542

544543
jesd->dummy_clk.init = &init;
545544

546-
dummy_clk = devm_clk_register(dev, &jesd->dummy_clk);
547-
if (IS_ERR(dummy_clk))
548-
return PTR_ERR(dummy_clk);
549-
550-
of_clk_add_provider(np, of_clk_src_simple_get, dummy_clk);
545+
ret = devm_clk_hw_register(dev, &jesd->dummy_clk);
546+
if (ret)
547+
return ret;
551548

552-
return 0;
549+
return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &jesd->dummy_clk);
553550
}
554551

555552
static int axi_jesd204_tx_pcore_check(struct axi_jesd204_tx *jesd)
@@ -889,6 +886,33 @@ static int axi_jesd204_init_non_framework(struct device *dev,
889886
return axi_jesd204_register_dummy_clk(jesd, dev);
890887
}
891888

889+
static void axi_jesd204_clk_disable(void *clk)
890+
{
891+
clk_disable_unprepare(clk);
892+
}
893+
894+
static void axi_jesd204_tx_teardown(void *data)
895+
{
896+
struct axi_jesd204_tx *jesd = data;
897+
898+
writel_relaxed(0xff, jesd->base + JESD204_TX_REG_IRQ_PENDING);
899+
writel_relaxed(0x00, jesd->base + JESD204_TX_REG_IRQ_ENABLE);
900+
writel_relaxed(0x1, jesd->base + JESD204_TX_REG_LINK_DISABLE);
901+
}
902+
903+
static void axi_jesd204_tx_rmattr(void *data)
904+
{
905+
struct axi_jesd204_tx *jesd = data;
906+
907+
device_remove_file(jesd->dev, &dev_attr_status);
908+
device_remove_file(jesd->dev, &dev_attr_encoder);
909+
}
910+
911+
static void axi_jesd204_stop_fsm(void *jdev)
912+
{
913+
jesd204_fsm_stop(jdev, JESD204_LINKS_ALL);
914+
}
915+
892916
static int axi_jesd204_tx_probe(struct platform_device *pdev)
893917
{
894918
struct axi_jesd204_tx *jesd;
@@ -908,8 +932,6 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
908932
irq = platform_get_irq(pdev, 0);
909933
if (irq < 0)
910934
return irq;
911-
if (irq == 0)
912-
return -ENXIO;
913935

914936
jesd = devm_kzalloc(&pdev->dev, sizeof(*jesd), GFP_KERNEL);
915937
if (!jesd)
@@ -943,7 +965,7 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
943965
if (IS_ERR(jesd->reset_done_gpio))
944966
return PTR_ERR(jesd->reset_done_gpio);
945967

946-
jesd->axi_clk = devm_clk_get(&pdev->dev, "s_axi_aclk");
968+
jesd->axi_clk = devm_clk_get_enabled(&pdev->dev, "s_axi_aclk");
947969
if (IS_ERR(jesd->axi_clk))
948970
return PTR_ERR(jesd->axi_clk);
949971

@@ -973,18 +995,19 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
973995
if (IS_ERR(jesd->sysref_clk))
974996
return PTR_ERR(jesd->sysref_clk);
975997

976-
ret = clk_prepare_enable(jesd->axi_clk);
977-
if (ret)
978-
return ret;
979-
980998
jesd->axi_clk_freq = clk_get_rate(jesd->axi_clk);
981999
if (!jesd->axi_clk_freq)
9821000
jesd->axi_clk_freq = 100000000; /* 100 MHz */
9831001

9841002
if (jesd->conv2_clk) {
9851003
ret = clk_prepare_enable(jesd->conv2_clk);
9861004
if (ret)
987-
goto err_axi_clk_disable;
1005+
return ret;
1006+
1007+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_clk_disable,
1008+
jesd->conv2_clk);
1009+
if (ret)
1010+
return ret;
9881011
}
9891012

9901013
jesd->num_lanes = readl_relaxed(jesd->base + JESD204_TX_REG_CONF_NUM_LANES);
@@ -1002,78 +1025,51 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
10021025
} else if (jesd->encoder >= JESD204_ENCODER_MAX) {
10031026
dev_err(&pdev->dev, "Invalid encoder value from HDL core %u\n",
10041027
jesd->encoder);
1005-
goto err_conv2_clk_disable;
1028+
return ret;
10061029
}
10071030

1031+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_tx_teardown, jesd);
1032+
if (ret)
1033+
return ret;
1034+
10081035
if (!jesd->jdev) {
10091036
ret = axi_jesd204_init_non_framework(&pdev->dev, jesd);
10101037
if (ret)
1011-
goto err_conv2_clk_disable;
1038+
return ret;
10121039
}
10131040

10141041
writel_relaxed(0xff, jesd->base + JESD204_TX_REG_IRQ_PENDING);
10151042
writel_relaxed(0x00, jesd->base + JESD204_TX_REG_IRQ_ENABLE);
10161043

1017-
ret = request_irq(irq, axi_jesd204_tx_irq, 0, dev_name(&pdev->dev),
1018-
jesd);
1044+
ret = devm_request_irq(&pdev->dev, irq, axi_jesd204_tx_irq, 0, dev_name(&pdev->dev), jesd);
10191045
if (ret)
1020-
goto err_uninit_non_framework;
1046+
return ret;
10211047

10221048
device_create_file(&pdev->dev, &dev_attr_status);
10231049
device_create_file(&pdev->dev, &dev_attr_encoder);
10241050

10251051
platform_set_drvdata(pdev, jesd);
10261052

1027-
ret = jesd204_fsm_start(jesd->jdev, JESD204_LINKS_ALL);
1053+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_tx_rmattr, jesd);
10281054
if (ret)
1029-
goto err_remove_debugfs;
1055+
return ret;
1056+
1057+
if (jesd->jdev) {
1058+
ret = jesd204_fsm_start(jesd->jdev, JESD204_LINKS_ALL);
1059+
if (ret)
1060+
return ret;
1061+
1062+
ret = devm_add_action_or_reset(&pdev->dev, axi_jesd204_stop_fsm, jesd->jdev);
1063+
if (ret)
1064+
return ret;
1065+
}
10301066

10311067
dev_info(&pdev->dev, "AXI-JESD204-TX (%d.%.2d.%c). Encoder %s, width %u/%u, lanes %d%s.",
10321068
ADI_AXI_PCORE_VER_MAJOR(jesd->version), ADI_AXI_PCORE_VER_MINOR(jesd->version),
10331069
ADI_AXI_PCORE_VER_PATCH(jesd->version), jesd204_encoder_str(jesd->encoder),
10341070
jesd->data_path_width, jesd->tpl_data_path_width, jesd->num_lanes,
10351071
jdev ? ", jesd204-fsm" : "");
10361072

1037-
return 0;
1038-
err_remove_debugfs:
1039-
device_remove_file(&pdev->dev, &dev_attr_status);
1040-
device_remove_file(&pdev->dev, &dev_attr_encoder);
1041-
free_irq(irq, jesd);
1042-
err_uninit_non_framework:
1043-
if (!jesd->jdev)
1044-
of_clk_del_provider(pdev->dev.of_node);
1045-
err_conv2_clk_disable:
1046-
clk_disable_unprepare(jesd->conv2_clk);
1047-
err_axi_clk_disable:
1048-
clk_disable_unprepare(jesd->axi_clk);
1049-
1050-
return ret;
1051-
}
1052-
1053-
static int axi_jesd204_tx_remove(struct platform_device *pdev)
1054-
{
1055-
struct axi_jesd204_tx *jesd = platform_get_drvdata(pdev);
1056-
int irq = platform_get_irq(pdev, 0);
1057-
1058-
if (jesd->jdev)
1059-
jesd204_fsm_stop(jesd->jdev, JESD204_LINKS_ALL);
1060-
1061-
device_remove_file(&pdev->dev, &dev_attr_status);
1062-
device_remove_file(&pdev->dev, &dev_attr_encoder);
1063-
1064-
free_irq(irq, jesd);
1065-
1066-
if (!jesd->jdev)
1067-
of_clk_del_provider(pdev->dev.of_node);
1068-
1069-
writel_relaxed(0xff, jesd->base + JESD204_TX_REG_IRQ_PENDING);
1070-
writel_relaxed(0x00, jesd->base + JESD204_TX_REG_IRQ_ENABLE);
1071-
1072-
writel_relaxed(0x1, jesd->base + JESD204_TX_REG_LINK_DISABLE);
1073-
1074-
clk_disable_unprepare(jesd->conv2_clk);
1075-
clk_disable_unprepare(jesd->axi_clk);
1076-
10771073
return 0;
10781074
}
10791075

@@ -1086,7 +1082,6 @@ MODULE_DEVICE_TABLE(of, axi_jesd204_tx_of_match);
10861082

10871083
static struct platform_driver axi_jesd204_tx_driver = {
10881084
.probe = axi_jesd204_tx_probe,
1089-
.remove = axi_jesd204_tx_remove,
10901085
.driver = {
10911086
.name = "axi-jesd204-tx",
10921087
.of_match_table = axi_jesd204_tx_of_match,

0 commit comments

Comments
 (0)