@@ -758,7 +758,6 @@ static int axi_jesd204_register_dummy_clk(struct axi_jesd204_rx *jesd,
758
758
struct device_node * np = dev -> of_node ;
759
759
const char * parent_name , * clk_name ;
760
760
struct clk_init_data init ;
761
- struct clk * dummy_clk ;
762
761
int ret ;
763
762
764
763
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,
776
775
777
776
jesd -> dummy_clk .init = & init ;
778
777
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 ;
784
781
785
- return 0 ;
782
+ return devm_of_clk_add_hw_provider ( dev , of_clk_hw_simple_get , & jesd -> dummy_clk ) ;
786
783
}
787
784
788
785
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,
1154
1151
}
1155
1152
}
1156
1153
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
+
1157
1180
static int axi_jesd204_rx_probe (struct platform_device * pdev )
1158
1181
{
1159
1182
struct axi_jesd204_rx * jesd ;
@@ -1172,8 +1195,6 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
1172
1195
irq = platform_get_irq (pdev , 0 );
1173
1196
if (irq < 0 )
1174
1197
return irq ;
1175
- if (irq == 0 )
1176
- return - ENXIO ;
1177
1198
1178
1199
jesd = devm_kzalloc (& pdev -> dev , sizeof (* jesd ), GFP_KERNEL );
1179
1200
if (!jesd )
@@ -1207,7 +1228,7 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
1207
1228
if (IS_ERR (jesd -> reset_done_gpio ))
1208
1229
return PTR_ERR (jesd -> reset_done_gpio );
1209
1230
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" );
1211
1232
if (IS_ERR (jesd -> axi_clk ))
1212
1233
return PTR_ERR (jesd -> axi_clk );
1213
1234
@@ -1237,18 +1258,19 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
1237
1258
if (IS_ERR (jesd -> sysref_clk ))
1238
1259
return PTR_ERR (jesd -> sysref_clk );
1239
1260
1240
- ret = clk_prepare_enable (jesd -> axi_clk );
1241
- if (ret )
1242
- return ret ;
1243
-
1244
1261
jesd -> axi_clk_freq = clk_get_rate (jesd -> axi_clk );
1245
1262
if (!jesd -> axi_clk_freq )
1246
1263
jesd -> axi_clk_freq = 100000000 ; /* 100 MHz */
1247
1264
1248
1265
if (jesd -> conv2_clk ) {
1249
1266
ret = clk_prepare_enable (jesd -> conv2_clk );
1250
1267
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 ;
1252
1274
}
1253
1275
1254
1276
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)
1266
1288
} else if (jesd -> encoder >= JESD204_ENCODER_MAX ) {
1267
1289
dev_err (& pdev -> dev , "Invalid encoder value from HDL core %u\n" ,
1268
1290
jesd -> encoder );
1269
- goto err_conv2_clk_disable ;
1291
+ return ret ;
1270
1292
}
1271
1293
1294
+ ret = devm_add_action_or_reset (& pdev -> dev , axi_jesd204_rx_teardown , jesd );
1295
+ if (ret )
1296
+ return ret ;
1297
+
1272
1298
if (!jesd -> jdev ) {
1273
1299
ret = axi_jesd204_init_non_framework (& pdev -> dev , jesd );
1274
1300
if (ret )
1275
- goto err_conv2_clk_disable ;
1301
+ return ret ;
1276
1302
}
1277
1303
1278
1304
writel_relaxed (0xff , jesd -> base + JESD204_RX_REG_IRQ_PENDING );
@@ -1286,7 +1312,7 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
1286
1312
IRQF_ONESHOT , dev_name (& pdev -> dev ),
1287
1313
jesd );
1288
1314
if (ret )
1289
- goto err_uninit_non_framework ;
1315
+ return ret ;
1290
1316
1291
1317
disable_irq (irq );
1292
1318
@@ -1300,9 +1326,19 @@ static int axi_jesd204_rx_probe(struct platform_device *pdev)
1300
1326
1301
1327
axi_jesd204_rx_create_remove_devattrs (& pdev -> dev , jesd , true);
1302
1328
1303
- ret = jesd204_fsm_start ( jesd -> jdev , JESD204_LINKS_ALL );
1329
+ ret = devm_add_action_or_reset ( & pdev -> dev , axi_jesd204_rx_rmattr , jesd );
1304
1330
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
+ }
1306
1342
1307
1343
dev_info (& pdev -> dev , "AXI-JESD204-RX (%d.%.2d.%c). Encoder %s, width %u/%u, lanes %d%s." ,
1308
1344
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)
1311
1347
jdev ? ", jesd204-fsm" : "" );
1312
1348
1313
1349
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 ;
1349
1350
}
1350
1351
1351
1352
static const struct of_device_id axi_jesd204_rx_of_match [] = {
@@ -1357,7 +1358,6 @@ MODULE_DEVICE_TABLE(of, axi_jesd204_rx_of_match);
1357
1358
1358
1359
static struct platform_driver axi_jesd204_rx_driver = {
1359
1360
.probe = axi_jesd204_rx_probe ,
1360
- .remove = axi_jesd204_rx_remove ,
1361
1361
.driver = {
1362
1362
.name = "axi-jesd204-rx" ,
1363
1363
.of_match_table = axi_jesd204_rx_of_match ,
0 commit comments