@@ -525,7 +525,6 @@ static int axi_jesd204_register_dummy_clk(struct axi_jesd204_tx *jesd,
525
525
struct device_node * np = dev -> of_node ;
526
526
const char * parent_name , * clk_name ;
527
527
struct clk_init_data init ;
528
- struct clk * dummy_clk ;
529
528
int ret ;
530
529
531
530
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,
543
542
544
543
jesd -> dummy_clk .init = & init ;
545
544
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 ;
551
548
552
- return 0 ;
549
+ return devm_of_clk_add_hw_provider ( dev , of_clk_hw_simple_get , & jesd -> dummy_clk ) ;
553
550
}
554
551
555
552
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,
889
886
return axi_jesd204_register_dummy_clk (jesd , dev );
890
887
}
891
888
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
+
892
916
static int axi_jesd204_tx_probe (struct platform_device * pdev )
893
917
{
894
918
struct axi_jesd204_tx * jesd ;
@@ -908,8 +932,6 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
908
932
irq = platform_get_irq (pdev , 0 );
909
933
if (irq < 0 )
910
934
return irq ;
911
- if (irq == 0 )
912
- return - ENXIO ;
913
935
914
936
jesd = devm_kzalloc (& pdev -> dev , sizeof (* jesd ), GFP_KERNEL );
915
937
if (!jesd )
@@ -943,7 +965,7 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
943
965
if (IS_ERR (jesd -> reset_done_gpio ))
944
966
return PTR_ERR (jesd -> reset_done_gpio );
945
967
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" );
947
969
if (IS_ERR (jesd -> axi_clk ))
948
970
return PTR_ERR (jesd -> axi_clk );
949
971
@@ -973,18 +995,19 @@ static int axi_jesd204_tx_probe(struct platform_device *pdev)
973
995
if (IS_ERR (jesd -> sysref_clk ))
974
996
return PTR_ERR (jesd -> sysref_clk );
975
997
976
- ret = clk_prepare_enable (jesd -> axi_clk );
977
- if (ret )
978
- return ret ;
979
-
980
998
jesd -> axi_clk_freq = clk_get_rate (jesd -> axi_clk );
981
999
if (!jesd -> axi_clk_freq )
982
1000
jesd -> axi_clk_freq = 100000000 ; /* 100 MHz */
983
1001
984
1002
if (jesd -> conv2_clk ) {
985
1003
ret = clk_prepare_enable (jesd -> conv2_clk );
986
1004
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 ;
988
1011
}
989
1012
990
1013
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)
1002
1025
} else if (jesd -> encoder >= JESD204_ENCODER_MAX ) {
1003
1026
dev_err (& pdev -> dev , "Invalid encoder value from HDL core %u\n" ,
1004
1027
jesd -> encoder );
1005
- goto err_conv2_clk_disable ;
1028
+ return ret ;
1006
1029
}
1007
1030
1031
+ ret = devm_add_action_or_reset (& pdev -> dev , axi_jesd204_tx_teardown , jesd );
1032
+ if (ret )
1033
+ return ret ;
1034
+
1008
1035
if (!jesd -> jdev ) {
1009
1036
ret = axi_jesd204_init_non_framework (& pdev -> dev , jesd );
1010
1037
if (ret )
1011
- goto err_conv2_clk_disable ;
1038
+ return ret ;
1012
1039
}
1013
1040
1014
1041
writel_relaxed (0xff , jesd -> base + JESD204_TX_REG_IRQ_PENDING );
1015
1042
writel_relaxed (0x00 , jesd -> base + JESD204_TX_REG_IRQ_ENABLE );
1016
1043
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 );
1019
1045
if (ret )
1020
- goto err_uninit_non_framework ;
1046
+ return ret ;
1021
1047
1022
1048
device_create_file (& pdev -> dev , & dev_attr_status );
1023
1049
device_create_file (& pdev -> dev , & dev_attr_encoder );
1024
1050
1025
1051
platform_set_drvdata (pdev , jesd );
1026
1052
1027
- ret = jesd204_fsm_start ( jesd -> jdev , JESD204_LINKS_ALL );
1053
+ ret = devm_add_action_or_reset ( & pdev -> dev , axi_jesd204_tx_rmattr , jesd );
1028
1054
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
+ }
1030
1066
1031
1067
dev_info (& pdev -> dev , "AXI-JESD204-TX (%d.%.2d.%c). Encoder %s, width %u/%u, lanes %d%s." ,
1032
1068
ADI_AXI_PCORE_VER_MAJOR (jesd -> version ), ADI_AXI_PCORE_VER_MINOR (jesd -> version ),
1033
1069
ADI_AXI_PCORE_VER_PATCH (jesd -> version ), jesd204_encoder_str (jesd -> encoder ),
1034
1070
jesd -> data_path_width , jesd -> tpl_data_path_width , jesd -> num_lanes ,
1035
1071
jdev ? ", jesd204-fsm" : "" );
1036
1072
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
-
1077
1073
return 0 ;
1078
1074
}
1079
1075
@@ -1086,7 +1082,6 @@ MODULE_DEVICE_TABLE(of, axi_jesd204_tx_of_match);
1086
1082
1087
1083
static struct platform_driver axi_jesd204_tx_driver = {
1088
1084
.probe = axi_jesd204_tx_probe ,
1089
- .remove = axi_jesd204_tx_remove ,
1090
1085
.driver = {
1091
1086
.name = "axi-jesd204-tx" ,
1092
1087
.of_match_table = axi_jesd204_tx_of_match ,
0 commit comments