40
40
41
41
static const unsigned int interpolation_factors_available [] = {1 , 8 };
42
42
43
+ static const char * const dds_extend_names [] = {
44
+ "TX1_I_F1" , "TX1_I_F2" , "TX1_Q_F1" , "TX1_Q_F2" ,
45
+ "TX2_I_F1" , "TX2_I_F2" , "TX2_Q_F1" , "TX2_Q_F2" ,
46
+ "TX3_I_F1" , "TX3_I_F2" , "TX3_Q_F1" , "TX3_Q_F2" ,
47
+ "TX4_I_F1" , "TX4_I_F2" , "TX4_Q_F1" , "TX4_Q_F2" ,
48
+ "TX5_I_F1" , "TX5_I_F2" , "TX5_Q_F1" , "TX5_Q_F2" ,
49
+ "TX6_I_F1" , "TX6_I_F2" , "TX6_Q_F1" , "TX6_Q_F2" ,
50
+ "TX7_I_F1" , "TX7_I_F2" , "TX7_Q_F1" , "TX7_Q_F2" ,
51
+ "TX8_I_F1" , "TX8_I_F2" , "TX8_Q_F1" , "TX8_Q_F2" ,
52
+ "TX9_I_F1" , "TX9_I_F2" , "TX9_Q_F1" , "TX9_Q_F2" ,
53
+ "TX10_I_F1" , "TX10_I_F2" , "TX10_Q_F1" , "TX10_Q_F2" ,
54
+ "TX11_I_F1" , "TX11_I_F2" , "TX11_Q_F1" , "TX11_Q_F2" ,
55
+ "TX12_I_F1" , "TX12_I_F2" , "TX12_Q_F1" , "TX12_Q_F2" ,
56
+ "TX13_I_F1" , "TX13_I_F2" , "TX13_Q_F1" , "TX13_Q_F2" ,
57
+ "TX14_I_F1" , "TX14_I_F2" , "TX14_Q_F1" , "TX14_Q_F2" ,
58
+ "TX15_I_F1" , "TX15_I_F2" , "TX15_Q_F1" , "TX15_Q_F2" ,
59
+ "TX16_I_F1" , "TX16_I_F2" , "TX16_Q_F1" , "TX16_Q_F2" ,
60
+ "TX17_I_F1" , "TX17_I_F2" , "TX17_Q_F1" , "TX17_Q_F2" ,
61
+ "TX18_I_F1" , "TX18_I_F2" , "TX18_Q_F1" , "TX18_Q_F2" ,
62
+ "TX19_I_F1" , "TX19_I_F2" , "TX19_Q_F1" , "TX19_Q_F2" ,
63
+ "TX20_I_F1" , "TX20_I_F2" , "TX20_Q_F1" , "TX20_Q_F2" ,
64
+ "TX21_I_F1" , "TX21_I_F2" , "TX21_Q_F1" , "TX21_Q_F2" ,
65
+ "TX22_I_F1" , "TX22_I_F2" , "TX22_Q_F1" , "TX22_Q_F2" ,
66
+ "TX23_I_F1" , "TX23_I_F2" , "TX23_Q_F1" , "TX23_Q_F2" ,
67
+ "TX24_I_F1" , "TX24_I_F2" , "TX24_Q_F1" , "TX24_Q_F2" ,
68
+ "TX25_I_F1" , "TX25_I_F2" , "TX25_Q_F1" , "TX25_Q_F2" ,
69
+ "TX26_I_F1" , "TX26_I_F2" , "TX26_Q_F1" , "TX26_Q_F2" ,
70
+ "TX27_I_F1" , "TX27_I_F2" , "TX27_Q_F1" , "TX27_Q_F2" ,
71
+ "TX28_I_F1" , "TX28_I_F2" , "TX28_Q_F1" , "TX28_Q_F2" ,
72
+ "TX29_I_F1" , "TX29_I_F2" , "TX29_Q_F1" , "TX29_Q_F2" ,
73
+ "TX30_I_F1" , "TX30_I_F2" , "TX30_Q_F1" , "TX30_Q_F2" ,
74
+ "TX31_I_F1" , "TX31_I_F2" , "TX31_Q_F1" , "TX31_Q_F2" ,
75
+ "TX32_I_F1" , "TX32_I_F2" , "TX32_Q_F1" , "TX32_Q_F2" ,
76
+ };
77
+
43
78
struct cf_axi_dds_state {
44
79
struct device * dev_spi ;
45
80
struct clk * clk ;
@@ -60,11 +95,12 @@ struct cf_axi_dds_state {
60
95
void __iomem * master_regs ;
61
96
u64 dac_clk ;
62
97
unsigned int ddr_dds_interp_en ;
63
- unsigned int cached_freq [16 ];
98
+ unsigned int cached_freq [AXIDDS_MAX_NUM_DDS_CHAN ];
64
99
unsigned int version ;
65
100
unsigned int have_slave_channels ;
66
101
unsigned int interpolation_factor ;
67
102
struct notifier_block clk_nb ;
103
+ struct cf_axi_dds_chip_info chip_info_generated ;
68
104
};
69
105
70
106
bool cf_axi_dds_dma_fifo_en (struct cf_axi_dds_state * st )
@@ -1388,13 +1424,91 @@ static void dds_converter_put(struct device *conv_dev)
1388
1424
put_device (conv_dev );
1389
1425
}
1390
1426
1427
+ static int cf_axi_dds_setup_chip_info_tbl (struct cf_axi_dds_state * st ,
1428
+ const char * name , bool complex )
1429
+ {
1430
+ u32 i , c , reg , m , n , np ;
1431
+
1432
+ reg = dds_read (st , ADI_REG_TPL_DESCRIPTOR_1 );
1433
+ m = ADI_TO_JESD_M (reg );
1434
+
1435
+ if (m == 0 || m > ARRAY_SIZE (st -> chip_info_generated .channel ))
1436
+ return - EINVAL ;
1437
+
1438
+ reg = dds_read (st , ADI_REG_TPL_DESCRIPTOR_2 );
1439
+ n = ADI_TO_JESD_N (reg );
1440
+ np = ADI_TO_JESD_NP (reg );
1441
+
1442
+ reg = dds_read (st , ADI_REG_CONFIG );
1443
+
1444
+ for (c = 0 , i = 0 ; i < m ; i ++ , c ++ ) {
1445
+ st -> chip_info_generated .channel [c ].type = IIO_VOLTAGE ;
1446
+ st -> chip_info_generated .channel [c ].output = 1 ;
1447
+ st -> chip_info_generated .channel [c ].indexed = 1 ;
1448
+ st -> chip_info_generated .channel [c ].modified = complex ? 1 : 0 ;
1449
+ st -> chip_info_generated .channel [c ].channel =
1450
+ complex ? i / 2 : i ;
1451
+ st -> chip_info_generated .channel [c ].channel2 =
1452
+ (i & 1 ) ? IIO_MOD_Q : IIO_MOD_I ;
1453
+ st -> chip_info_generated .channel [c ].scan_index = i ;
1454
+ st -> chip_info_generated .channel [c ].info_mask_shared_by_type =
1455
+ BIT (IIO_CHAN_INFO_SAMP_FREQ );
1456
+
1457
+ if (!(reg & ADI_IQCORRECTION_DISABLE ))
1458
+ st -> chip_info_generated .channel [c ].info_mask_separate =
1459
+ BIT (IIO_CHAN_INFO_CALIBSCALE ) |
1460
+ BIT (IIO_CHAN_INFO_CALIBPHASE );
1461
+
1462
+ st -> chip_info_generated .channel [c ].scan_type .realbits = n ;
1463
+ st -> chip_info_generated .channel [c ].scan_type .storagebits = np ;
1464
+ st -> chip_info_generated .channel [c ].scan_type .sign = 's' ;
1465
+ }
1466
+
1467
+ if (!(reg & ADI_DDS_DISABLE )) {
1468
+ for (i = 0 ; i < 2 * m ; i ++ , c ++ ) {
1469
+ if (c > ARRAY_SIZE (st -> chip_info_generated .channel ))
1470
+ return - EINVAL ;
1471
+ st -> chip_info_generated .channel [c ].type =
1472
+ IIO_ALTVOLTAGE ;
1473
+ st -> chip_info_generated .channel [c ].output = 1 ;
1474
+ st -> chip_info_generated .channel [c ].indexed = 1 ;
1475
+ st -> chip_info_generated .channel [c ].channel = i ;
1476
+ st -> chip_info_generated .channel [c ].scan_index = -1 ;
1477
+ st -> chip_info_generated .channel
1478
+ [c ].info_mask_shared_by_type =
1479
+ BIT (IIO_CHAN_INFO_SAMP_FREQ );
1480
+ st -> chip_info_generated .channel [c ].info_mask_separate =
1481
+ BIT (IIO_CHAN_INFO_RAW ) |
1482
+ BIT (IIO_CHAN_INFO_SCALE ) |
1483
+ BIT (IIO_CHAN_INFO_PHASE ) |
1484
+ BIT (IIO_CHAN_INFO_FREQUENCY );
1485
+
1486
+ st -> chip_info_generated .channel [c ].ext_info =
1487
+ cf_axi_dds_ext_info ;
1488
+ if (i < ARRAY_SIZE (dds_extend_names ))
1489
+ st -> chip_info_generated .channel [
1490
+ c ].extend_name = dds_extend_names [i ];
1491
+ }
1492
+ }
1493
+
1494
+ st -> chip_info_generated .num_channels = c ;
1495
+ st -> chip_info_generated .num_dp_disable_channels = m ;
1496
+ st -> chip_info_generated .num_dds_channels = i ;
1497
+ st -> chip_info_generated .num_buf_channels = m ;
1498
+ st -> chip_info_generated .name = name ;
1499
+
1500
+ return 0 ;
1501
+ }
1502
+
1391
1503
struct axidds_core_info {
1392
1504
unsigned int version ;
1393
1505
bool standalone ;
1394
1506
bool rate_format_skip_en ;
1507
+ bool complex_modified ;
1395
1508
struct cf_axi_dds_chip_info * chip_info ;
1396
1509
unsigned int data_format ;
1397
1510
unsigned int rate ;
1511
+ const char * name ;
1398
1512
};
1399
1513
1400
1514
static const struct axidds_core_info ad9122_6_00_a_info = {
@@ -1558,7 +1672,19 @@ static int cf_axi_dds_probe(struct platform_device *pdev)
1558
1672
st -> clk_nb .notifier_call = cf_axi_dds_rate_change ;
1559
1673
clk_notifier_register (st -> clk , & st -> clk_nb );
1560
1674
1561
- st -> chip_info = info -> chip_info ;
1675
+ if (info -> chip_info ) {
1676
+ st -> chip_info = info -> chip_info ;
1677
+ } else {
1678
+ ret = cf_axi_dds_setup_chip_info_tbl (st , info -> name ,
1679
+ info -> complex_modified );
1680
+ if (ret ) {
1681
+ dev_err (& pdev -> dev ,
1682
+ "Invalid number of converters identified" );
1683
+ goto err_iio_device_free ;
1684
+ }
1685
+
1686
+ st -> chip_info = & st -> chip_info_generated ;
1687
+ }
1562
1688
} else {
1563
1689
st -> dev_spi = dds_converter_find (& pdev -> dev );
1564
1690
if (IS_ERR (st -> dev_spi )) {
@@ -1712,7 +1838,6 @@ static int cf_axi_dds_probe(struct platform_device *pdev)
1712
1838
if (IS_ERR (st -> interpolation_gpio ))
1713
1839
dev_err (& pdev -> dev , "interpolation gpio error\n" );
1714
1840
}
1715
-
1716
1841
}
1717
1842
1718
1843
st -> enable = true;
0 commit comments