52
52
#define CX_SRC 0x814
53
53
#define CX_DST 0x818
54
54
#define CX_CFG 0x81c
55
- #define AXI_CFG 0x820
56
- #define AXI_CFG_DEFAULT 0x201201
57
55
58
56
#define CX_LLI_CHAIN_EN 0x2
59
57
#define CX_CFG_EN 0x1
@@ -113,9 +111,18 @@ struct k3_dma_dev {
113
111
struct dma_pool * pool ;
114
112
u32 dma_channels ;
115
113
u32 dma_requests ;
114
+ u32 dma_channel_mask ;
116
115
unsigned int irq ;
117
116
};
118
117
118
+
119
+ #define K3_FLAG_NOCLK BIT(1)
120
+
121
+ struct k3dma_soc_data {
122
+ unsigned long flags ;
123
+ };
124
+
125
+
119
126
#define to_k3_dma (dmadev ) container_of(dmadev, struct k3_dma_dev, slave)
120
127
121
128
static int k3_dma_config_write (struct dma_chan * chan ,
@@ -161,7 +168,6 @@ static void k3_dma_set_desc(struct k3_dma_phy *phy, struct k3_desc_hw *hw)
161
168
writel_relaxed (hw -> count , phy -> base + CX_CNT0 );
162
169
writel_relaxed (hw -> saddr , phy -> base + CX_SRC );
163
170
writel_relaxed (hw -> daddr , phy -> base + CX_DST );
164
- writel_relaxed (AXI_CFG_DEFAULT , phy -> base + AXI_CFG );
165
171
writel_relaxed (hw -> config , phy -> base + CX_CFG );
166
172
}
167
173
@@ -314,6 +320,9 @@ static void k3_dma_tasklet(unsigned long arg)
314
320
/* check new channel request in d->chan_pending */
315
321
spin_lock_irq (& d -> lock );
316
322
for (pch = 0 ; pch < d -> dma_channels ; pch ++ ) {
323
+ if (!(d -> dma_channel_mask & (1 << pch )))
324
+ continue ;
325
+
317
326
p = & d -> phy [pch ];
318
327
319
328
if (p -> vchan == NULL && !list_empty (& d -> chan_pending )) {
@@ -331,6 +340,9 @@ static void k3_dma_tasklet(unsigned long arg)
331
340
spin_unlock_irq (& d -> lock );
332
341
333
342
for (pch = 0 ; pch < d -> dma_channels ; pch ++ ) {
343
+ if (!(d -> dma_channel_mask & (1 << pch )))
344
+ continue ;
345
+
334
346
if (pch_alloc & (1 << pch )) {
335
347
p = & d -> phy [pch ];
336
348
c = p -> vchan ;
@@ -790,8 +802,21 @@ static int k3_dma_transfer_resume(struct dma_chan *chan)
790
802
return 0 ;
791
803
}
792
804
805
+ static const struct k3dma_soc_data k3_v1_dma_data = {
806
+ .flags = 0 ,
807
+ };
808
+
809
+ static const struct k3dma_soc_data asp_v1_dma_data = {
810
+ .flags = K3_FLAG_NOCLK ,
811
+ };
812
+
793
813
static const struct of_device_id k3_pdma_dt_ids [] = {
794
- { .compatible = "hisilicon,k3-dma-1.0" , },
814
+ { .compatible = "hisilicon,k3-dma-1.0" ,
815
+ .data = & k3_v1_dma_data
816
+ },
817
+ { .compatible = "hisilicon,hisi-pcm-asp-dma-1.0" ,
818
+ .data = & asp_v1_dma_data
819
+ },
795
820
{}
796
821
};
797
822
MODULE_DEVICE_TABLE (of , k3_pdma_dt_ids );
@@ -810,6 +835,7 @@ static struct dma_chan *k3_of_dma_simple_xlate(struct of_phandle_args *dma_spec,
810
835
811
836
static int k3_dma_probe (struct platform_device * op )
812
837
{
838
+ const struct k3dma_soc_data * soc_data ;
813
839
struct k3_dma_dev * d ;
814
840
const struct of_device_id * of_id ;
815
841
struct resource * iores ;
@@ -823,6 +849,10 @@ static int k3_dma_probe(struct platform_device *op)
823
849
if (!d )
824
850
return - ENOMEM ;
825
851
852
+ soc_data = device_get_match_data (& op -> dev );
853
+ if (!soc_data )
854
+ return - EINVAL ;
855
+
826
856
d -> base = devm_ioremap_resource (& op -> dev , iores );
827
857
if (IS_ERR (d -> base ))
828
858
return PTR_ERR (d -> base );
@@ -833,12 +863,21 @@ static int k3_dma_probe(struct platform_device *op)
833
863
"dma-channels" , & d -> dma_channels );
834
864
of_property_read_u32 ((& op -> dev )-> of_node ,
835
865
"dma-requests" , & d -> dma_requests );
866
+ ret = of_property_read_u32 ((& op -> dev )-> of_node ,
867
+ "dma-channel-mask" , & d -> dma_channel_mask );
868
+ if (ret ) {
869
+ dev_warn (& op -> dev ,
870
+ "dma-channel-mask doesn't exist, considering all as available.\n" );
871
+ d -> dma_channel_mask = (u32 )~0UL ;
872
+ }
836
873
}
837
874
838
- d -> clk = devm_clk_get (& op -> dev , NULL );
839
- if (IS_ERR (d -> clk )) {
840
- dev_err (& op -> dev , "no dma clk\n" );
841
- return PTR_ERR (d -> clk );
875
+ if (!(soc_data -> flags & K3_FLAG_NOCLK )) {
876
+ d -> clk = devm_clk_get (& op -> dev , NULL );
877
+ if (IS_ERR (d -> clk )) {
878
+ dev_err (& op -> dev , "no dma clk\n" );
879
+ return PTR_ERR (d -> clk );
880
+ }
842
881
}
843
882
844
883
irq = platform_get_irq (op , 0 );
@@ -862,8 +901,12 @@ static int k3_dma_probe(struct platform_device *op)
862
901
return - ENOMEM ;
863
902
864
903
for (i = 0 ; i < d -> dma_channels ; i ++ ) {
865
- struct k3_dma_phy * p = & d -> phy [i ];
904
+ struct k3_dma_phy * p ;
905
+
906
+ if (!(d -> dma_channel_mask & BIT (i )))
907
+ continue ;
866
908
909
+ p = & d -> phy [i ];
867
910
p -> idx = i ;
868
911
p -> base = d -> base + i * 0x40 ;
869
912
}
0 commit comments