@@ -478,6 +478,206 @@ static struct regmap_config lpass_cpu_regmap_config = {
478
478
.cache_type = REGCACHE_FLAT ,
479
479
};
480
480
481
+ static int lpass_hdmi_init_bitfields (struct device * dev , struct regmap * map )
482
+ {
483
+ struct lpass_data * drvdata = dev_get_drvdata (dev );
484
+ struct lpass_variant * v = drvdata -> variant ;
485
+ unsigned int i ;
486
+ struct lpass_hdmi_tx_ctl * tx_ctl ;
487
+ struct regmap_field * legacy_en ;
488
+ struct lpass_vbit_ctrl * vbit_ctl ;
489
+ struct regmap_field * tx_parity ;
490
+ struct lpass_dp_metadata_ctl * meta_ctl ;
491
+ struct lpass_sstream_ctl * sstream_ctl ;
492
+ struct regmap_field * ch_msb ;
493
+ struct regmap_field * ch_lsb ;
494
+ struct lpass_hdmitx_dmactl * tx_dmactl ;
495
+ int rval ;
496
+
497
+ tx_ctl = devm_kzalloc (dev , sizeof (* tx_ctl ), GFP_KERNEL );
498
+ if (!tx_ctl )
499
+ return - ENOMEM ;
500
+
501
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> soft_reset , tx_ctl -> soft_reset );
502
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> force_reset , tx_ctl -> force_reset );
503
+ drvdata -> tx_ctl = tx_ctl ;
504
+
505
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> legacy_en , legacy_en );
506
+ drvdata -> hdmitx_legacy_en = legacy_en ;
507
+
508
+ vbit_ctl = devm_kzalloc (dev , sizeof (* vbit_ctl ), GFP_KERNEL );
509
+ if (!vbit_ctl )
510
+ return - ENOMEM ;
511
+
512
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> replace_vbit , vbit_ctl -> replace_vbit );
513
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> vbit_stream , vbit_ctl -> vbit_stream );
514
+ drvdata -> vbit_ctl = vbit_ctl ;
515
+
516
+
517
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> calc_en , tx_parity );
518
+ drvdata -> hdmitx_parity_calc_en = tx_parity ;
519
+
520
+ meta_ctl = devm_kzalloc (dev , sizeof (* meta_ctl ), GFP_KERNEL );
521
+ if (!meta_ctl )
522
+ return - ENOMEM ;
523
+
524
+ rval = devm_regmap_field_bulk_alloc (dev , map , & meta_ctl -> mute , & v -> mute , 7 );
525
+ if (rval )
526
+ return rval ;
527
+ drvdata -> meta_ctl = meta_ctl ;
528
+
529
+ sstream_ctl = devm_kzalloc (dev , sizeof (* sstream_ctl ), GFP_KERNEL );
530
+ if (!sstream_ctl )
531
+ return - ENOMEM ;
532
+
533
+ rval = devm_regmap_field_bulk_alloc (dev , map , & sstream_ctl -> sstream_en , & v -> sstream_en , 9 );
534
+ if (rval )
535
+ return rval ;
536
+
537
+ drvdata -> sstream_ctl = sstream_ctl ;
538
+
539
+ for (i = 0 ; i < LPASS_MAX_HDMI_DMA_CHANNELS ; i ++ ) {
540
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> msb_bits , ch_msb );
541
+ drvdata -> hdmitx_ch_msb [i ] = ch_msb ;
542
+
543
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> lsb_bits , ch_lsb );
544
+ drvdata -> hdmitx_ch_lsb [i ] = ch_lsb ;
545
+
546
+ tx_dmactl = devm_kzalloc (dev , sizeof (* tx_dmactl ), GFP_KERNEL );
547
+ if (!tx_dmactl )
548
+ return - ENOMEM ;
549
+
550
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> use_hw_chs , tx_dmactl -> use_hw_chs );
551
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> use_hw_usr , tx_dmactl -> use_hw_usr );
552
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> hw_chs_sel , tx_dmactl -> hw_chs_sel );
553
+ QCOM_REGMAP_FIELD_ALLOC (dev , map , v -> hw_usr_sel , tx_dmactl -> hw_usr_sel );
554
+ drvdata -> hdmi_tx_dmactl [i ] = tx_dmactl ;
555
+ }
556
+ return 0 ;
557
+ }
558
+
559
+ static bool lpass_hdmi_regmap_writeable (struct device * dev , unsigned int reg )
560
+ {
561
+ struct lpass_data * drvdata = dev_get_drvdata (dev );
562
+ struct lpass_variant * v = drvdata -> variant ;
563
+ int i ;
564
+
565
+ if (reg == LPASS_HDMI_TX_CTL_ADDR (v ))
566
+ return true;
567
+ if (reg == LPASS_HDMI_TX_LEGACY_ADDR (v ))
568
+ return true;
569
+ if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR (v ))
570
+ return true;
571
+ if (reg == LPASS_HDMI_TX_PARITY_ADDR (v ))
572
+ return true;
573
+ if (reg == LPASS_HDMI_TX_DP_ADDR (v ))
574
+ return true;
575
+ if (reg == LPASS_HDMI_TX_SSTREAM_ADDR (v ))
576
+ return true;
577
+ if (reg == LPASS_HDMITX_APP_IRQEN_REG (v ))
578
+ return true;
579
+ if (reg == LPASS_HDMITX_APP_IRQCLEAR_REG (v ))
580
+ return true;
581
+
582
+ for (i = 0 ; i < v -> hdmi_rdma_channels ; i ++ ) {
583
+ if (reg == LPASS_HDMI_TX_CH_LSB_ADDR (v , i ))
584
+ return true;
585
+ if (reg == LPASS_HDMI_TX_CH_MSB_ADDR (v , i ))
586
+ return true;
587
+ if (reg == LPASS_HDMI_TX_DMA_ADDR (v , i ))
588
+ return true;
589
+ }
590
+
591
+ for (i = 0 ; i < v -> rdma_channels ; ++ i ) {
592
+ if (reg == LPAIF_HDMI_RDMACTL_REG (v , i ))
593
+ return true;
594
+ if (reg == LPAIF_HDMI_RDMABASE_REG (v , i ))
595
+ return true;
596
+ if (reg == LPAIF_HDMI_RDMABUFF_REG (v , i ))
597
+ return true;
598
+ if (reg == LPAIF_HDMI_RDMAPER_REG (v , i ))
599
+ return true;
600
+ }
601
+ return false;
602
+ }
603
+
604
+ static bool lpass_hdmi_regmap_readable (struct device * dev , unsigned int reg )
605
+ {
606
+ struct lpass_data * drvdata = dev_get_drvdata (dev );
607
+ struct lpass_variant * v = drvdata -> variant ;
608
+ int i ;
609
+
610
+ if (reg == LPASS_HDMI_TX_CTL_ADDR (v ))
611
+ return true;
612
+ if (reg == LPASS_HDMI_TX_LEGACY_ADDR (v ))
613
+ return true;
614
+ if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR (v ))
615
+ return true;
616
+
617
+ for (i = 0 ; i < v -> hdmi_rdma_channels ; i ++ ) {
618
+ if (reg == LPASS_HDMI_TX_CH_LSB_ADDR (v , i ))
619
+ return true;
620
+ if (reg == LPASS_HDMI_TX_CH_MSB_ADDR (v , i ))
621
+ return true;
622
+ if (reg == LPASS_HDMI_TX_DMA_ADDR (v , i ))
623
+ return true;
624
+ }
625
+
626
+ if (reg == LPASS_HDMI_TX_PARITY_ADDR (v ))
627
+ return true;
628
+ if (reg == LPASS_HDMI_TX_DP_ADDR (v ))
629
+ return true;
630
+ if (reg == LPASS_HDMI_TX_SSTREAM_ADDR (v ))
631
+ return true;
632
+ if (reg == LPASS_HDMITX_APP_IRQEN_REG (v ))
633
+ return true;
634
+ if (reg == LPASS_HDMITX_APP_IRQSTAT_REG (v ))
635
+ return true;
636
+
637
+ for (i = 0 ; i < v -> rdma_channels ; ++ i ) {
638
+ if (reg == LPAIF_HDMI_RDMACTL_REG (v , i ))
639
+ return true;
640
+ if (reg == LPAIF_HDMI_RDMABASE_REG (v , i ))
641
+ return true;
642
+ if (reg == LPAIF_HDMI_RDMABUFF_REG (v , i ))
643
+ return true;
644
+ if (reg == LPAIF_HDMI_RDMAPER_REG (v , i ))
645
+ return true;
646
+ if (reg == LPAIF_HDMI_RDMACURR_REG (v , i ))
647
+ return true;
648
+ }
649
+
650
+ return false;
651
+ }
652
+
653
+ static bool lpass_hdmi_regmap_volatile (struct device * dev , unsigned int reg )
654
+ {
655
+ struct lpass_data * drvdata = dev_get_drvdata (dev );
656
+ struct lpass_variant * v = drvdata -> variant ;
657
+ int i ;
658
+
659
+ if (reg == LPASS_HDMITX_APP_IRQSTAT_REG (v ))
660
+ return true;
661
+ if (reg == LPASS_HDMI_TX_LEGACY_ADDR (v ))
662
+ return true;
663
+
664
+ for (i = 0 ; i < v -> rdma_channels ; ++ i ) {
665
+ if (reg == LPAIF_HDMI_RDMACURR_REG (v , i ))
666
+ return true;
667
+ }
668
+ return false;
669
+ }
670
+
671
+ struct regmap_config lpass_hdmi_regmap_config = {
672
+ .reg_bits = 32 ,
673
+ .reg_stride = 4 ,
674
+ .val_bits = 32 ,
675
+ .writeable_reg = lpass_hdmi_regmap_writeable ,
676
+ .readable_reg = lpass_hdmi_regmap_readable ,
677
+ .volatile_reg = lpass_hdmi_regmap_volatile ,
678
+ .cache_type = REGCACHE_FLAT ,
679
+ };
680
+
481
681
static unsigned int of_lpass_cpu_parse_sd_lines (struct device * dev ,
482
682
struct device_node * node ,
483
683
const char * name )
@@ -535,13 +735,17 @@ static void of_lpass_cpu_parse_dai_data(struct device *dev,
535
735
dev_err (dev , "valid dai id not found: %d\n" , ret );
536
736
continue ;
537
737
}
538
-
539
- data -> mi2s_playback_sd_mode [id ] =
540
- of_lpass_cpu_parse_sd_lines (dev , node ,
541
- "qcom,playback-sd-lines" );
542
- data -> mi2s_capture_sd_mode [id ] =
543
- of_lpass_cpu_parse_sd_lines (dev , node ,
738
+ if (id == LPASS_DP_RX ) {
739
+ data -> hdmi_port_enable = 1 ;
740
+ dev_err (dev , "HDMI Port is enabled: %d\n" , id );
741
+ } else {
742
+ data -> mi2s_playback_sd_mode [id ] =
743
+ of_lpass_cpu_parse_sd_lines (dev , node ,
744
+ "qcom,playback-sd-lines" );
745
+ data -> mi2s_capture_sd_mode [id ] =
746
+ of_lpass_cpu_parse_sd_lines (dev , node ,
544
747
"qcom,capture-sd-lines" );
748
+ }
545
749
}
546
750
}
547
751
@@ -596,6 +800,27 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
596
800
return PTR_ERR (drvdata -> lpaif_map );
597
801
}
598
802
803
+ if (drvdata -> hdmi_port_enable ) {
804
+ res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "lpass-hdmiif" );
805
+
806
+ drvdata -> hdmiif = devm_ioremap_resource (dev , res );
807
+ if (IS_ERR ((void const __force * )drvdata -> hdmiif )) {
808
+ dev_err (dev , "error mapping reg resource: %ld\n" ,
809
+ PTR_ERR ((void const __force * )drvdata -> hdmiif ));
810
+ return PTR_ERR ((void const __force * )drvdata -> hdmiif );
811
+ }
812
+
813
+ lpass_hdmi_regmap_config .max_register = LPAIF_HDMI_RDMAPER_REG (variant ,
814
+ variant -> hdmi_rdma_channels );
815
+ drvdata -> hdmiif_map = devm_regmap_init_mmio (dev , drvdata -> hdmiif ,
816
+ & lpass_hdmi_regmap_config );
817
+ if (IS_ERR (drvdata -> hdmiif_map )) {
818
+ dev_err (dev , "error initializing regmap: %ld\n" ,
819
+ PTR_ERR (drvdata -> hdmiif_map ));
820
+ return PTR_ERR (drvdata -> hdmiif_map );
821
+ }
822
+ }
823
+
599
824
if (variant -> init ) {
600
825
ret = variant -> init (pdev );
601
826
if (ret ) {
@@ -606,6 +831,9 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
606
831
607
832
for (i = 0 ; i < variant -> num_dai ; i ++ ) {
608
833
dai_id = variant -> dai_driver [i ].id ;
834
+ if (dai_id == LPASS_DP_RX )
835
+ continue ;
836
+
609
837
drvdata -> mi2s_osr_clk [dai_id ] = devm_clk_get (dev ,
610
838
variant -> dai_osr_clk_names [i ]);
611
839
if (IS_ERR (drvdata -> mi2s_osr_clk [dai_id ])) {
@@ -641,6 +869,13 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
641
869
return ret ;
642
870
}
643
871
872
+ if (drvdata -> hdmi_port_enable ) {
873
+ ret = lpass_hdmi_init_bitfields (dev , drvdata -> hdmiif_map );
874
+ if (ret ) {
875
+ dev_err (dev , "%s error hdmi init failed\n" , __func__ );
876
+ return ret ;
877
+ }
878
+ }
644
879
ret = devm_snd_soc_register_component (dev ,
645
880
& lpass_cpu_comp_driver ,
646
881
variant -> dai_driver ,
0 commit comments