46
46
#define AXI_DAC_CNTRL_1_REG 0x0044
47
47
#define AXI_DAC_CNTRL_1_SYNC BIT(0)
48
48
#define AXI_DAC_CNTRL_2_REG 0x0048
49
+ #define AXI_DAC_CNTRL_2_SDR_DDR_N BIT(16)
50
+ #define AXI_DAC_CNTRL_2_SYMB_8B BIT(14)
49
51
#define ADI_DAC_CNTRL_2_R1_MODE BIT(5)
52
+ #define AXI_DAC_CNTRL_2_UNSIGNED_DATA BIT(4)
53
+ #define AXI_DAC_STATUS_1_REG 0x0054
54
+ #define AXI_DAC_STATUS_2_REG 0x0058
50
55
#define AXI_DAC_DRP_STATUS_REG 0x0074
51
56
#define AXI_DAC_DRP_STATUS_DRP_LOCKED BIT(17)
57
+ #define AXI_DAC_CUSTOM_RD_REG 0x0080
58
+ #define AXI_DAC_CUSTOM_WR_REG 0x0084
59
+ #define AXI_DAC_CUSTOM_WR_DATA_8 GENMASK(23, 16)
60
+ #define AXI_DAC_CUSTOM_WR_DATA_16 GENMASK(23, 8)
61
+ #define AXI_DAC_UI_STATUS_REG 0x0088
62
+ #define AXI_DAC_UI_STATUS_IF_BUSY BIT(4)
63
+ #define AXI_DAC_CUSTOM_CTRL_REG 0x008C
64
+ #define AXI_DAC_CUSTOM_CTRL_ADDRESS GENMASK(31, 24)
65
+ #define AXI_DAC_CUSTOM_CTRL_SYNCED_TRANSFER BIT(2)
66
+ #define AXI_DAC_CUSTOM_CTRL_STREAM BIT(1)
67
+ #define AXI_DAC_CUSTOM_CTRL_TRANSFER_DATA BIT(0)
68
+
69
+ #define AXI_DAC_CUSTOM_CTRL_STREAM_ENABLE (AXI_DAC_CUSTOM_CTRL_TRANSFER_DATA | \
70
+ AXI_DAC_CUSTOM_CTRL_STREAM)
52
71
53
72
/* DAC Channel controls */
54
73
#define AXI_DAC_CHAN_CNTRL_1_REG (c ) (0x0400 + (c) * 0x40)
63
82
#define AXI_DAC_CHAN_CNTRL_7_REG (c ) (0x0418 + (c) * 0x40)
64
83
#define AXI_DAC_CHAN_CNTRL_7_DATA_SEL GENMASK(3, 0)
65
84
85
+ #define AXI_DAC_RD_ADDR (x ) (BIT(7) | (x))
86
+
66
87
/* 360 degrees in rad */
67
88
#define AXI_DAC_2_PI_MEGA 6283190
68
89
69
90
enum {
70
91
AXI_DAC_DATA_INTERNAL_TONE ,
71
92
AXI_DAC_DATA_DMA = 2 ,
93
+ AXI_DAC_DATA_INTERNAL_RAMP_16BIT = 11 ,
94
+ };
95
+
96
+ struct axi_dac_info {
97
+ unsigned int version ;
98
+ const struct iio_backend_info * backend_info ;
99
+ bool has_dac_clk ;
72
100
};
73
101
74
102
struct axi_dac_state {
@@ -79,9 +107,11 @@ struct axi_dac_state {
79
107
* data/variables.
80
108
*/
81
109
struct mutex lock ;
110
+ const struct axi_dac_info * info ;
82
111
u64 dac_clk ;
83
112
u32 reg_config ;
84
113
bool int_tone ;
114
+ int dac_clk_rate ;
85
115
};
86
116
87
117
static int axi_dac_enable (struct iio_backend * back )
@@ -471,6 +501,11 @@ static int axi_dac_data_source_set(struct iio_backend *back, unsigned int chan,
471
501
AXI_DAC_CHAN_CNTRL_7_REG (chan ),
472
502
AXI_DAC_CHAN_CNTRL_7_DATA_SEL ,
473
503
AXI_DAC_DATA_DMA );
504
+ case IIO_BACKEND_INTERNAL_RAMP_16BIT :
505
+ return regmap_update_bits (st -> regmap ,
506
+ AXI_DAC_CHAN_CNTRL_7_REG (chan ),
507
+ AXI_DAC_CHAN_CNTRL_7_DATA_SEL ,
508
+ AXI_DAC_DATA_INTERNAL_RAMP_16BIT );
474
509
default :
475
510
return - EINVAL ;
476
511
}
@@ -528,6 +563,154 @@ static int axi_dac_reg_access(struct iio_backend *back, unsigned int reg,
528
563
return regmap_write (st -> regmap , reg , writeval );
529
564
}
530
565
566
+ static int axi_dac_ddr_enable (struct iio_backend * back )
567
+ {
568
+ struct axi_dac_state * st = iio_backend_get_priv (back );
569
+
570
+ return regmap_clear_bits (st -> regmap , AXI_DAC_CNTRL_2_REG ,
571
+ AXI_DAC_CNTRL_2_SDR_DDR_N );
572
+ }
573
+
574
+ static int axi_dac_ddr_disable (struct iio_backend * back )
575
+ {
576
+ struct axi_dac_state * st = iio_backend_get_priv (back );
577
+
578
+ return regmap_set_bits (st -> regmap , AXI_DAC_CNTRL_2_REG ,
579
+ AXI_DAC_CNTRL_2_SDR_DDR_N );
580
+ }
581
+
582
+ static int axi_dac_data_stream_enable (struct iio_backend * back )
583
+ {
584
+ struct axi_dac_state * st = iio_backend_get_priv (back );
585
+
586
+ return regmap_set_bits (st -> regmap , AXI_DAC_CUSTOM_CTRL_REG ,
587
+ AXI_DAC_CUSTOM_CTRL_STREAM_ENABLE );
588
+ }
589
+
590
+ static int axi_dac_data_stream_disable (struct iio_backend * back )
591
+ {
592
+ struct axi_dac_state * st = iio_backend_get_priv (back );
593
+
594
+ return regmap_clear_bits (st -> regmap , AXI_DAC_CUSTOM_CTRL_REG ,
595
+ AXI_DAC_CUSTOM_CTRL_STREAM_ENABLE );
596
+ }
597
+
598
+ static int axi_dac_data_transfer_addr (struct iio_backend * back , u32 address )
599
+ {
600
+ struct axi_dac_state * st = iio_backend_get_priv (back );
601
+
602
+ if (address > FIELD_MAX (AXI_DAC_CUSTOM_CTRL_ADDRESS ))
603
+ return - EINVAL ;
604
+
605
+ /*
606
+ * Sample register address, when the DAC is configured, or stream
607
+ * start address when the FSM is in stream state.
608
+ */
609
+ return regmap_update_bits (st -> regmap , AXI_DAC_CUSTOM_CTRL_REG ,
610
+ AXI_DAC_CUSTOM_CTRL_ADDRESS ,
611
+ FIELD_PREP (AXI_DAC_CUSTOM_CTRL_ADDRESS ,
612
+ address ));
613
+ }
614
+
615
+ static int axi_dac_data_format_set (struct iio_backend * back , unsigned int ch ,
616
+ const struct iio_backend_data_fmt * data )
617
+ {
618
+ struct axi_dac_state * st = iio_backend_get_priv (back );
619
+
620
+ switch (data -> type ) {
621
+ case IIO_BACKEND_DATA_UNSIGNED :
622
+ return regmap_clear_bits (st -> regmap , AXI_DAC_CNTRL_2_REG ,
623
+ AXI_DAC_CNTRL_2_UNSIGNED_DATA );
624
+ default :
625
+ return - EINVAL ;
626
+ }
627
+ }
628
+
629
+ static int __axi_dac_bus_reg_write (struct iio_backend * back , u32 reg ,
630
+ u32 val , size_t data_size )
631
+ {
632
+ struct axi_dac_state * st = iio_backend_get_priv (back );
633
+ int ret ;
634
+ u32 ival ;
635
+
636
+ /*
637
+ * Both AXI_DAC_CNTRL_2_REG and AXI_DAC_CUSTOM_WR_REG need to know
638
+ * the data size. So keeping data size control here only,
639
+ * since data size is mandatory for the current transfer.
640
+ * DDR state handled separately by specific backend calls,
641
+ * generally all raw register writes are SDR.
642
+ */
643
+ if (data_size == sizeof (u16 ))
644
+ ival = FIELD_PREP (AXI_DAC_CUSTOM_WR_DATA_16 , val );
645
+ else
646
+ ival = FIELD_PREP (AXI_DAC_CUSTOM_WR_DATA_8 , val );
647
+
648
+ ret = regmap_write (st -> regmap , AXI_DAC_CUSTOM_WR_REG , ival );
649
+ if (ret )
650
+ return ret ;
651
+
652
+ if (data_size == sizeof (u8 ))
653
+ ret = regmap_set_bits (st -> regmap , AXI_DAC_CNTRL_2_REG ,
654
+ AXI_DAC_CNTRL_2_SYMB_8B );
655
+ else
656
+ ret = regmap_clear_bits (st -> regmap , AXI_DAC_CNTRL_2_REG ,
657
+ AXI_DAC_CNTRL_2_SYMB_8B );
658
+ if (ret )
659
+ return ret ;
660
+
661
+ ret = regmap_update_bits (st -> regmap , AXI_DAC_CUSTOM_CTRL_REG ,
662
+ AXI_DAC_CUSTOM_CTRL_ADDRESS ,
663
+ FIELD_PREP (AXI_DAC_CUSTOM_CTRL_ADDRESS , reg ));
664
+ if (ret )
665
+ return ret ;
666
+
667
+ ret = regmap_update_bits (st -> regmap , AXI_DAC_CUSTOM_CTRL_REG ,
668
+ AXI_DAC_CUSTOM_CTRL_TRANSFER_DATA ,
669
+ AXI_DAC_CUSTOM_CTRL_TRANSFER_DATA );
670
+ if (ret )
671
+ return ret ;
672
+
673
+ ret = regmap_read_poll_timeout (st -> regmap ,
674
+ AXI_DAC_UI_STATUS_REG , ival ,
675
+ FIELD_GET (AXI_DAC_UI_STATUS_IF_BUSY , ival ) == 0 ,
676
+ 10 , 100 * KILO );
677
+ if (ret == - ETIMEDOUT )
678
+ dev_err (st -> dev , "AXI read timeout\n" );
679
+
680
+ /* Cleaning always AXI_DAC_CUSTOM_CTRL_TRANSFER_DATA */
681
+ return regmap_clear_bits (st -> regmap , AXI_DAC_CUSTOM_CTRL_REG ,
682
+ AXI_DAC_CUSTOM_CTRL_TRANSFER_DATA );
683
+ }
684
+
685
+ static int axi_dac_bus_reg_write (struct iio_backend * back , u32 reg ,
686
+ u32 val , size_t data_size )
687
+ {
688
+ struct axi_dac_state * st = iio_backend_get_priv (back );
689
+
690
+ guard (mutex )(& st -> lock );
691
+ return __axi_dac_bus_reg_write (back , reg , val , data_size );
692
+ }
693
+
694
+ static int axi_dac_bus_reg_read (struct iio_backend * back , u32 reg , u32 * val ,
695
+ size_t data_size )
696
+ {
697
+ struct axi_dac_state * st = iio_backend_get_priv (back );
698
+ int ret ;
699
+
700
+ guard (mutex )(& st -> lock );
701
+
702
+ /*
703
+ * SPI, we write with read flag, then we read just at the AXI
704
+ * io address space to get data read.
705
+ */
706
+ ret = __axi_dac_bus_reg_write (back , AXI_DAC_RD_ADDR (reg ), 0 ,
707
+ data_size );
708
+ if (ret )
709
+ return ret ;
710
+
711
+ return regmap_read (st -> regmap , AXI_DAC_CUSTOM_RD_REG , val );
712
+ }
713
+
531
714
static const struct iio_backend_ops axi_dac_generic_ops = {
532
715
.enable = axi_dac_enable ,
533
716
.disable = axi_dac_disable ,
@@ -541,11 +724,30 @@ static const struct iio_backend_ops axi_dac_generic_ops = {
541
724
.debugfs_reg_access = iio_backend_debugfs_ptr (axi_dac_reg_access ),
542
725
};
543
726
727
+ static const struct iio_backend_ops axi_ad3552r_ops = {
728
+ .enable = axi_dac_enable ,
729
+ .disable = axi_dac_disable ,
730
+ .request_buffer = axi_dac_request_buffer ,
731
+ .free_buffer = axi_dac_free_buffer ,
732
+ .data_source_set = axi_dac_data_source_set ,
733
+ .ddr_enable = axi_dac_ddr_enable ,
734
+ .ddr_disable = axi_dac_ddr_disable ,
735
+ .data_stream_enable = axi_dac_data_stream_enable ,
736
+ .data_stream_disable = axi_dac_data_stream_disable ,
737
+ .data_format_set = axi_dac_data_format_set ,
738
+ .data_transfer_addr = axi_dac_data_transfer_addr ,
739
+ };
740
+
544
741
static const struct iio_backend_info axi_dac_generic = {
545
742
.name = "axi-dac" ,
546
743
.ops = & axi_dac_generic_ops ,
547
744
};
548
745
746
+ static const struct iio_backend_info axi_ad3552r = {
747
+ .name = "axi-ad3552r" ,
748
+ .ops = & axi_ad3552r_ops ,
749
+ };
750
+
549
751
static const struct regmap_config axi_dac_regmap_config = {
550
752
.val_bits = 32 ,
551
753
.reg_bits = 32 ,
@@ -555,7 +757,6 @@ static const struct regmap_config axi_dac_regmap_config = {
555
757
556
758
static int axi_dac_probe (struct platform_device * pdev )
557
759
{
558
- const unsigned int * expected_ver ;
559
760
struct axi_dac_state * st ;
560
761
void __iomem * base ;
561
762
unsigned int ver ;
@@ -566,14 +767,29 @@ static int axi_dac_probe(struct platform_device *pdev)
566
767
if (!st )
567
768
return - ENOMEM ;
568
769
569
- expected_ver = device_get_match_data (& pdev -> dev );
570
- if (!expected_ver )
770
+ st -> info = device_get_match_data (& pdev -> dev );
771
+ if (!st -> info )
571
772
return - ENODEV ;
773
+ clk = devm_clk_get_enabled (& pdev -> dev , "s_axi_aclk" );
774
+ if (IS_ERR (clk )) {
775
+ /* Backward compat., old fdt versions without clock-names. */
776
+ clk = devm_clk_get_enabled (& pdev -> dev , NULL );
777
+ if (IS_ERR (clk ))
778
+ return dev_err_probe (& pdev -> dev , PTR_ERR (clk ),
779
+ "failed to get clock\n" );
780
+ }
781
+
782
+ if (st -> info -> has_dac_clk ) {
783
+ struct clk * dac_clk ;
572
784
573
- clk = devm_clk_get_enabled (& pdev -> dev , NULL );
574
- if (IS_ERR (clk ))
575
- return dev_err_probe (& pdev -> dev , PTR_ERR (clk ),
576
- "failed to get clock\n" );
785
+ dac_clk = devm_clk_get_enabled (& pdev -> dev , "dac_clk" );
786
+ if (IS_ERR (dac_clk ))
787
+ return dev_err_probe (& pdev -> dev , PTR_ERR (dac_clk ),
788
+ "failed to get dac_clk clock\n" );
789
+
790
+ /* We only care about the streaming mode rate */
791
+ st -> dac_clk_rate = clk_get_rate (dac_clk ) / 2 ;
792
+ }
577
793
578
794
base = devm_platform_ioremap_resource (pdev , 0 );
579
795
if (IS_ERR (base ))
@@ -598,12 +814,13 @@ static int axi_dac_probe(struct platform_device *pdev)
598
814
if (ret )
599
815
return ret ;
600
816
601
- if (ADI_AXI_PCORE_VER_MAJOR (ver ) != ADI_AXI_PCORE_VER_MAJOR (* expected_ver )) {
817
+ if (ADI_AXI_PCORE_VER_MAJOR (ver ) !=
818
+ ADI_AXI_PCORE_VER_MAJOR (st -> info -> version )) {
602
819
dev_err (& pdev -> dev ,
603
820
"Major version mismatch. Expected %d.%.2d.%c, Reported %d.%.2d.%c\n" ,
604
- ADI_AXI_PCORE_VER_MAJOR (* expected_ver ),
605
- ADI_AXI_PCORE_VER_MINOR (* expected_ver ),
606
- ADI_AXI_PCORE_VER_PATCH (* expected_ver ),
821
+ ADI_AXI_PCORE_VER_MAJOR (st -> info -> version ),
822
+ ADI_AXI_PCORE_VER_MINOR (st -> info -> version ),
823
+ ADI_AXI_PCORE_VER_PATCH (st -> info -> version ),
607
824
ADI_AXI_PCORE_VER_MAJOR (ver ),
608
825
ADI_AXI_PCORE_VER_MINOR (ver ),
609
826
ADI_AXI_PCORE_VER_PATCH (ver ));
@@ -629,7 +846,8 @@ static int axi_dac_probe(struct platform_device *pdev)
629
846
return ret ;
630
847
631
848
mutex_init (& st -> lock );
632
- ret = devm_iio_backend_register (& pdev -> dev , & axi_dac_generic , st );
849
+
850
+ ret = devm_iio_backend_register (& pdev -> dev , st -> info -> backend_info , st );
633
851
if (ret )
634
852
return dev_err_probe (& pdev -> dev , ret ,
635
853
"failed to register iio backend\n" );
@@ -642,10 +860,20 @@ static int axi_dac_probe(struct platform_device *pdev)
642
860
return 0 ;
643
861
}
644
862
645
- static unsigned int axi_dac_9_1_b_info = ADI_AXI_PCORE_VER (9 , 1 , 'b' );
863
+ static const struct axi_dac_info dac_generic = {
864
+ .version = ADI_AXI_PCORE_VER (9 , 1 , 'b' ),
865
+ .backend_info = & axi_dac_generic ,
866
+ };
867
+
868
+ static const struct axi_dac_info dac_ad3552r = {
869
+ .version = ADI_AXI_PCORE_VER (9 , 1 , 'b' ),
870
+ .backend_info = & axi_ad3552r ,
871
+ .has_dac_clk = true,
872
+ };
646
873
647
874
static const struct of_device_id axi_dac_of_match [] = {
648
- { .compatible = "adi,axi-dac-9.1.b" , .data = & axi_dac_9_1_b_info },
875
+ { .compatible = "adi,axi-dac-9.1.b" , .data = & dac_generic },
876
+ { .compatible = "adi,axi-ad3552r" , .data = & dac_ad3552r },
649
877
{}
650
878
};
651
879
MODULE_DEVICE_TABLE (of , axi_dac_of_match );
0 commit comments