4646#define AXI_DAC_CNTRL_1_REG 0x0044
4747#define AXI_DAC_CNTRL_1_SYNC BIT(0)
4848#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)
4951#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
5055#define AXI_DAC_DRP_STATUS_REG 0x0074
5156#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)
5271
5372/* DAC Channel controls */
5473#define AXI_DAC_CHAN_CNTRL_1_REG (c ) (0x0400 + (c) * 0x40)
6382#define AXI_DAC_CHAN_CNTRL_7_REG (c ) (0x0418 + (c) * 0x40)
6483#define AXI_DAC_CHAN_CNTRL_7_DATA_SEL GENMASK(3, 0)
6584
85+ #define AXI_DAC_RD_ADDR (x ) (BIT(7) | (x))
86+
6687/* 360 degrees in rad */
6788#define AXI_DAC_2_PI_MEGA 6283190
6889
6990enum {
7091 AXI_DAC_DATA_INTERNAL_TONE ,
7192 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 ;
72100};
73101
74102struct axi_dac_state {
@@ -79,9 +107,11 @@ struct axi_dac_state {
79107 * data/variables.
80108 */
81109 struct mutex lock ;
110+ const struct axi_dac_info * info ;
82111 u64 dac_clk ;
83112 u32 reg_config ;
84113 bool int_tone ;
114+ int dac_clk_rate ;
85115};
86116
87117static 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,
471501 AXI_DAC_CHAN_CNTRL_7_REG (chan ),
472502 AXI_DAC_CHAN_CNTRL_7_DATA_SEL ,
473503 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 );
474509 default :
475510 return - EINVAL ;
476511 }
@@ -528,6 +563,154 @@ static int axi_dac_reg_access(struct iio_backend *back, unsigned int reg,
528563 return regmap_write (st -> regmap , reg , writeval );
529564}
530565
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+
531714static const struct iio_backend_ops axi_dac_generic_ops = {
532715 .enable = axi_dac_enable ,
533716 .disable = axi_dac_disable ,
@@ -541,11 +724,30 @@ static const struct iio_backend_ops axi_dac_generic_ops = {
541724 .debugfs_reg_access = iio_backend_debugfs_ptr (axi_dac_reg_access ),
542725};
543726
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+
544741static const struct iio_backend_info axi_dac_generic = {
545742 .name = "axi-dac" ,
546743 .ops = & axi_dac_generic_ops ,
547744};
548745
746+ static const struct iio_backend_info axi_ad3552r = {
747+ .name = "axi-ad3552r" ,
748+ .ops = & axi_ad3552r_ops ,
749+ };
750+
549751static const struct regmap_config axi_dac_regmap_config = {
550752 .val_bits = 32 ,
551753 .reg_bits = 32 ,
@@ -555,7 +757,6 @@ static const struct regmap_config axi_dac_regmap_config = {
555757
556758static int axi_dac_probe (struct platform_device * pdev )
557759{
558- const unsigned int * expected_ver ;
559760 struct axi_dac_state * st ;
560761 void __iomem * base ;
561762 unsigned int ver ;
@@ -566,14 +767,29 @@ static int axi_dac_probe(struct platform_device *pdev)
566767 if (!st )
567768 return - ENOMEM ;
568769
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 )
571772 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 ;
572784
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+ }
577793
578794 base = devm_platform_ioremap_resource (pdev , 0 );
579795 if (IS_ERR (base ))
@@ -598,12 +814,13 @@ static int axi_dac_probe(struct platform_device *pdev)
598814 if (ret )
599815 return ret ;
600816
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 )) {
602819 dev_err (& pdev -> dev ,
603820 "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 ),
607824 ADI_AXI_PCORE_VER_MAJOR (ver ),
608825 ADI_AXI_PCORE_VER_MINOR (ver ),
609826 ADI_AXI_PCORE_VER_PATCH (ver ));
@@ -629,7 +846,8 @@ static int axi_dac_probe(struct platform_device *pdev)
629846 return ret ;
630847
631848 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 );
633851 if (ret )
634852 return dev_err_probe (& pdev -> dev , ret ,
635853 "failed to register iio backend\n" );
@@ -642,10 +860,20 @@ static int axi_dac_probe(struct platform_device *pdev)
642860 return 0 ;
643861}
644862
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+ };
646873
647874static 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 },
649877 {}
650878};
651879MODULE_DEVICE_TABLE (of , axi_dac_of_match );
0 commit comments