@@ -106,6 +106,12 @@ static unsigned char clk_map_imx8qxp[2][ASRC_CLK_MAP_LEN] = {
106106 },
107107};
108108
109+ static unsigned char clk_map_imx952 [ASRC_CLK_MAP_LEN ] = {
110+ 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0x0 ,
111+ 0x0 , 0x1 , 0x2 , 0x3 , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0x4 , 0x5 , 0x6 , 0x8 , 0xf , 0xf ,
112+ 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0x7 , 0x9 , 0xa , 0xb , 0xc , 0xd , 0xf , 0xf , 0xf , 0xf ,
113+ };
114+
109115/*
110116 * According to RM, the divider range is 1 ~ 8,
111117 * prescaler is power of 2 from 1 ~ 128.
@@ -1078,6 +1084,27 @@ static unsigned int fsl_asrc_get_output_fifo_size(struct fsl_asrc_pair *pair)
10781084 return val >> ASRFSTi_OUTPUT_FIFO_SHIFT ;
10791085}
10801086
1087+ static bool fsl_asrc_m2m_output_ready (struct fsl_asrc_pair * pair )
1088+ {
1089+ struct fsl_asrc * asrc = pair -> asrc ;
1090+ enum asrc_pair_index index = pair -> index ;
1091+ int retry = 1000 ;
1092+ u32 val ;
1093+
1094+ do {
1095+ regmap_read (asrc -> regmap , REG_ASRFST (index ), & val );
1096+ val &= ASRFSTi_OUTPUT_FIFO_MASK ;
1097+ val = val >> ASRFSTi_OUTPUT_FIFO_SHIFT ;
1098+ } while (val < ASRC_M2M_OUTPUTFIFO_WML && -- retry );
1099+
1100+ if (!retry ) {
1101+ pair_warn ("output is not ready\n" );
1102+ return false;
1103+ }
1104+
1105+ return true;
1106+ }
1107+
10811108static int fsl_asrc_m2m_prepare (struct fsl_asrc_pair * pair )
10821109{
10831110 struct fsl_asrc_pair_priv * pair_priv = pair -> private ;
@@ -1275,6 +1302,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
12751302
12761303 asrc_priv -> soc = of_device_get_match_data (& pdev -> dev );
12771304 asrc -> use_edma = asrc_priv -> soc -> use_edma ;
1305+ asrc -> start_before_dma = asrc_priv -> soc -> start_before_dma ;
12781306 asrc -> get_dma_channel = fsl_asrc_get_dma_channel ;
12791307 asrc -> request_pair = fsl_asrc_request_pair ;
12801308 asrc -> release_pair = fsl_asrc_release_pair ;
@@ -1289,6 +1317,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
12891317 asrc -> m2m_get_maxburst = fsl_asrc_m2m_get_maxburst ;
12901318 asrc -> m2m_pair_resume = fsl_asrc_m2m_pair_resume ;
12911319 asrc -> m2m_get_cap = fsl_asrc_m2m_get_cap ;
1320+ asrc -> m2m_output_ready = fsl_asrc_m2m_output_ready ;
12921321
12931322 if (of_device_is_compatible (np , "fsl,imx35-asrc" )) {
12941323 asrc_priv -> clk_map [IN ] = input_clk_map_imx35 ;
@@ -1315,6 +1344,9 @@ static int fsl_asrc_probe(struct platform_device *pdev)
13151344 asrc_priv -> clk_map [IN ] = clk_map_imx8qxp [map_idx ];
13161345 asrc_priv -> clk_map [OUT ] = clk_map_imx8qxp [map_idx ];
13171346 }
1347+ } else if (of_device_is_compatible (np , "fsl,imx952-asrc" )) {
1348+ asrc_priv -> clk_map [IN ] = clk_map_imx952 ;
1349+ asrc_priv -> clk_map [OUT ] = clk_map_imx952 ;
13181350 }
13191351
13201352 asrc -> channel_avail = 10 ;
@@ -1553,11 +1585,18 @@ static const struct fsl_asrc_soc_data fsl_asrc_imx8qxp_data = {
15531585 .channel_bits = 4 ,
15541586};
15551587
1588+ static const struct fsl_asrc_soc_data fsl_asrc_imx952_data = {
1589+ .use_edma = true,
1590+ .channel_bits = 4 ,
1591+ .start_before_dma = true,
1592+ };
1593+
15561594static const struct of_device_id fsl_asrc_ids [] = {
15571595 { .compatible = "fsl,imx35-asrc" , .data = & fsl_asrc_imx35_data },
15581596 { .compatible = "fsl,imx53-asrc" , .data = & fsl_asrc_imx53_data },
15591597 { .compatible = "fsl,imx8qm-asrc" , .data = & fsl_asrc_imx8qm_data },
15601598 { .compatible = "fsl,imx8qxp-asrc" , .data = & fsl_asrc_imx8qxp_data },
1599+ { .compatible = "fsl,imx952-asrc" , .data = & fsl_asrc_imx952_data },
15611600 {}
15621601};
15631602MODULE_DEVICE_TABLE (of , fsl_asrc_ids );
0 commit comments