1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // Freescale ASRC ALSA SoC Digital Audio Interface (DAI) driver 4 // 5 // Copyright (C) 2014 Freescale Semiconductor, Inc. 6 // 7 // Author: Nicolin Chen <nicoleotsuka@gmail.com> 8 9 #include <linux/clk.h> 10 #include <linux/delay.h> 11 #include <linux/dma-mapping.h> 12 #include <linux/module.h> 13 #include <linux/of_platform.h> 14 #include <linux/dma/imx-dma.h> 15 #include <linux/pm_runtime.h> 16 #include <sound/dmaengine_pcm.h> 17 #include <sound/pcm_params.h> 18 19 #include "fsl_asrc.h" 20 21 #define IDEAL_RATIO_DECIMAL_DEPTH 26 22 #define DIVIDER_NUM 64 23 #define INIT_RETRY_NUM 50 24 25 #define pair_err(fmt, ...) \ 26 dev_err(&asrc->pdev->dev, "Pair %c: " fmt, 'A' + index, ##__VA_ARGS__) 27 28 #define pair_dbg(fmt, ...) \ 29 dev_dbg(&asrc->pdev->dev, "Pair %c: " fmt, 'A' + index, ##__VA_ARGS__) 30 31 #define pair_warn(fmt, ...) \ 32 dev_warn(&asrc->pdev->dev, "Pair %c: " fmt, 'A' + index, ##__VA_ARGS__) 33 34 /* Corresponding to process_option */ 35 static unsigned int supported_asrc_rate[] = { 36 5512, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 37 64000, 88200, 96000, 128000, 176400, 192000, 38 }; 39 40 static struct snd_pcm_hw_constraint_list fsl_asrc_rate_constraints = { 41 .count = ARRAY_SIZE(supported_asrc_rate), 42 .list = supported_asrc_rate, 43 }; 44 45 /* 46 * The following tables map the relationship between asrc_inclk/asrc_outclk in 47 * fsl_asrc.h and the registers of ASRCSR 48 */ 49 static unsigned char input_clk_map_imx35[ASRC_CLK_MAP_LEN] = { 50 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 51 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 52 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 53 }; 54 55 static unsigned char output_clk_map_imx35[ASRC_CLK_MAP_LEN] = { 56 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 57 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 58 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 59 }; 60 61 /* i.MX53 uses the same map for input and output */ 62 static unsigned char input_clk_map_imx53[ASRC_CLK_MAP_LEN] = { 63 /* 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf */ 64 0x0, 0x1, 0x2, 0x7, 0x4, 0x5, 0x6, 0x3, 0x8, 0x9, 0xa, 0xb, 0xc, 0xf, 0xe, 0xd, 65 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 66 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 67 }; 68 69 static unsigned char output_clk_map_imx53[ASRC_CLK_MAP_LEN] = { 70 /* 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf */ 71 0x8, 0x9, 0xa, 0x7, 0xc, 0x5, 0x6, 0xb, 0x0, 0x1, 0x2, 0x3, 0x4, 0xf, 0xe, 0xd, 72 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 73 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 74 }; 75 76 /* 77 * i.MX8QM/i.MX8QXP uses the same map for input and output. 78 * clk_map_imx8qm[0] is for i.MX8QM asrc0 79 * clk_map_imx8qm[1] is for i.MX8QM asrc1 80 * clk_map_imx8qxp[0] is for i.MX8QXP asrc0 81 * clk_map_imx8qxp[1] is for i.MX8QXP asrc1 82 */ 83 static unsigned char clk_map_imx8qm[2][ASRC_CLK_MAP_LEN] = { 84 { 85 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 86 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 87 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 88 }, 89 { 90 0xf, 0xf, 0xf, 0xf, 0xf, 0x7, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 91 0x0, 0x1, 0x2, 0x3, 0xb, 0xc, 0xf, 0xf, 0xd, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 92 0x4, 0x5, 0x6, 0xf, 0x8, 0x9, 0xa, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 93 }, 94 }; 95 96 static unsigned char clk_map_imx8qxp[2][ASRC_CLK_MAP_LEN] = { 97 { 98 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 99 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xf, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xf, 0xf, 100 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 101 }, 102 { 103 0xf, 0xf, 0xf, 0xf, 0xf, 0x7, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 104 0x0, 0x1, 0x2, 0x3, 0x7, 0x8, 0xf, 0xf, 0x9, 0xa, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 105 0xf, 0xf, 0x6, 0xf, 0xf, 0xf, 0xa, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 106 }, 107 }; 108 109 /* 110 * According to RM, the divider range is 1 ~ 8, 111 * prescaler is power of 2 from 1 ~ 128. 112 */ 113 static int asrc_clk_divider[DIVIDER_NUM] = { 114 1, 2, 4, 8, 16, 32, 64, 128, /* divider = 1 */ 115 2, 4, 8, 16, 32, 64, 128, 256, /* divider = 2 */ 116 3, 6, 12, 24, 48, 96, 192, 384, /* divider = 3 */ 117 4, 8, 16, 32, 64, 128, 256, 512, /* divider = 4 */ 118 5, 10, 20, 40, 80, 160, 320, 640, /* divider = 5 */ 119 6, 12, 24, 48, 96, 192, 384, 768, /* divider = 6 */ 120 7, 14, 28, 56, 112, 224, 448, 896, /* divider = 7 */ 121 8, 16, 32, 64, 128, 256, 512, 1024, /* divider = 8 */ 122 }; 123 124 /* 125 * Check if the divider is available for internal ratio mode 126 */ 127 static bool fsl_asrc_divider_avail(int clk_rate, int rate, int *div) 128 { 129 u32 rem, i; 130 u64 n; 131 132 if (div) 133 *div = 0; 134 135 if (clk_rate == 0 || rate == 0) 136 return false; 137 138 n = clk_rate; 139 rem = do_div(n, rate); 140 141 if (div) 142 *div = n; 143 144 if (rem != 0) 145 return false; 146 147 for (i = 0; i < DIVIDER_NUM; i++) { 148 if (n == asrc_clk_divider[i]) 149 break; 150 } 151 152 if (i == DIVIDER_NUM) 153 return false; 154 155 return true; 156 } 157 158 /** 159 * fsl_asrc_sel_proc - Select the pre-processing and post-processing options 160 * @inrate: input sample rate 161 * @outrate: output sample rate 162 * @pre_proc: return value for pre-processing option 163 * @post_proc: return value for post-processing option 164 * 165 * Make sure to exclude following unsupported cases before 166 * calling this function: 167 * 1) inrate > 8.125 * outrate 168 * 2) inrate > 16.125 * outrate 169 * 170 */ 171 static void fsl_asrc_sel_proc(int inrate, int outrate, 172 int *pre_proc, int *post_proc) 173 { 174 bool post_proc_cond2; 175 bool post_proc_cond0; 176 177 /* select pre_proc between [0, 2] */ 178 if (inrate * 8 > 33 * outrate) 179 *pre_proc = 2; 180 else if (inrate * 8 > 15 * outrate) { 181 if (inrate > 152000) 182 *pre_proc = 2; 183 else 184 *pre_proc = 1; 185 } else if (inrate < 76000) 186 *pre_proc = 0; 187 else if (inrate > 152000) 188 *pre_proc = 2; 189 else 190 *pre_proc = 1; 191 192 /* Condition for selection of post-processing */ 193 post_proc_cond2 = (inrate * 15 > outrate * 16 && outrate < 56000) || 194 (inrate > 56000 && outrate < 56000); 195 post_proc_cond0 = inrate * 23 < outrate * 8; 196 197 if (post_proc_cond2) 198 *post_proc = 2; 199 else if (post_proc_cond0) 200 *post_proc = 0; 201 else 202 *post_proc = 1; 203 } 204 205 /** 206 * fsl_asrc_request_pair - Request ASRC pair 207 * @channels: number of channels 208 * @pair: pointer to pair 209 * 210 * It assigns pair by the order of A->C->B because allocation of pair B, 211 * within range [ANCA, ANCA+ANCB-1], depends on the channels of pair A 212 * while pair A and pair C are comparatively independent. 213 */ 214 static int fsl_asrc_request_pair(int channels, struct fsl_asrc_pair *pair) 215 { 216 enum asrc_pair_index index = ASRC_INVALID_PAIR; 217 struct fsl_asrc *asrc = pair->asrc; 218 struct device *dev = &asrc->pdev->dev; 219 unsigned long lock_flags; 220 int i, ret = 0; 221 222 spin_lock_irqsave(&asrc->lock, lock_flags); 223 224 for (i = ASRC_PAIR_A; i < ASRC_PAIR_MAX_NUM; i++) { 225 if (asrc->pair[i] != NULL) 226 continue; 227 228 index = i; 229 230 if (i != ASRC_PAIR_B) 231 break; 232 } 233 234 if (index == ASRC_INVALID_PAIR) { 235 dev_err(dev, "all pairs are busy now\n"); 236 ret = -EBUSY; 237 } else if (asrc->channel_avail < channels) { 238 dev_err(dev, "can't afford required channels: %d\n", channels); 239 ret = -EINVAL; 240 } else { 241 asrc->channel_avail -= channels; 242 asrc->pair[index] = pair; 243 pair->channels = channels; 244 pair->index = index; 245 } 246 247 spin_unlock_irqrestore(&asrc->lock, lock_flags); 248 249 return ret; 250 } 251 252 /** 253 * fsl_asrc_release_pair - Release ASRC pair 254 * @pair: pair to release 255 * 256 * It clears the resource from asrc and releases the occupied channels. 257 */ 258 static void fsl_asrc_release_pair(struct fsl_asrc_pair *pair) 259 { 260 struct fsl_asrc *asrc = pair->asrc; 261 enum asrc_pair_index index = pair->index; 262 unsigned long lock_flags; 263 264 /* Make sure the pair is disabled */ 265 regmap_update_bits(asrc->regmap, REG_ASRCTR, 266 ASRCTR_ASRCEi_MASK(index), 0); 267 268 spin_lock_irqsave(&asrc->lock, lock_flags); 269 270 asrc->channel_avail += pair->channels; 271 asrc->pair[index] = NULL; 272 pair->error = 0; 273 274 spin_unlock_irqrestore(&asrc->lock, lock_flags); 275 } 276 277 /** 278 * fsl_asrc_set_watermarks- configure input and output thresholds 279 * @pair: pointer to pair 280 * @in: input threshold 281 * @out: output threshold 282 */ 283 static void fsl_asrc_set_watermarks(struct fsl_asrc_pair *pair, u32 in, u32 out) 284 { 285 struct fsl_asrc *asrc = pair->asrc; 286 enum asrc_pair_index index = pair->index; 287 288 regmap_update_bits(asrc->regmap, REG_ASRMCR(index), 289 ASRMCRi_EXTTHRSHi_MASK | 290 ASRMCRi_INFIFO_THRESHOLD_MASK | 291 ASRMCRi_OUTFIFO_THRESHOLD_MASK, 292 ASRMCRi_EXTTHRSHi | 293 ASRMCRi_INFIFO_THRESHOLD(in) | 294 ASRMCRi_OUTFIFO_THRESHOLD(out)); 295 } 296 297 /** 298 * fsl_asrc_cal_asrck_divisor - Calculate the total divisor between asrck clock rate and sample rate 299 * @pair: pointer to pair 300 * @div: divider 301 * 302 * It follows the formula clk_rate = samplerate * (2 ^ prescaler) * divider 303 */ 304 static u32 fsl_asrc_cal_asrck_divisor(struct fsl_asrc_pair *pair, u32 div) 305 { 306 u32 ps; 307 308 /* Calculate the divisors: prescaler [2^0, 2^7], divder [1, 8] */ 309 for (ps = 0; div > 8; ps++) 310 div >>= 1; 311 312 return ((div - 1) << ASRCDRi_AxCPi_WIDTH) | ps; 313 } 314 315 /** 316 * fsl_asrc_set_ideal_ratio - Calculate and set the ratio for Ideal Ratio mode only 317 * @pair: pointer to pair 318 * @inrate: input rate 319 * @outrate: output rate 320 * 321 * The ratio is a 32-bit fixed point value with 26 fractional bits. 322 */ 323 static int fsl_asrc_set_ideal_ratio(struct fsl_asrc_pair *pair, 324 int inrate, int outrate) 325 { 326 struct fsl_asrc *asrc = pair->asrc; 327 enum asrc_pair_index index = pair->index; 328 unsigned long ratio; 329 int i; 330 331 if (!outrate) { 332 pair_err("output rate should not be zero\n"); 333 return -EINVAL; 334 } 335 336 /* Calculate the intergal part of the ratio */ 337 ratio = (inrate / outrate) << IDEAL_RATIO_DECIMAL_DEPTH; 338 339 /* ... and then the 26 depth decimal part */ 340 inrate %= outrate; 341 342 for (i = 1; i <= IDEAL_RATIO_DECIMAL_DEPTH; i++) { 343 inrate <<= 1; 344 345 if (inrate < outrate) 346 continue; 347 348 ratio |= 1 << (IDEAL_RATIO_DECIMAL_DEPTH - i); 349 inrate -= outrate; 350 351 if (!inrate) 352 break; 353 } 354 355 regmap_write(asrc->regmap, REG_ASRIDRL(index), ratio); 356 regmap_write(asrc->regmap, REG_ASRIDRH(index), ratio >> 24); 357 358 return 0; 359 } 360 361 /** 362 * fsl_asrc_config_pair - Configure the assigned ASRC pair 363 * @pair: pointer to pair 364 * @use_ideal_rate: boolean configuration 365 * 366 * It configures those ASRC registers according to a configuration instance 367 * of struct asrc_config which includes in/output sample rate, width, channel 368 * and clock settings. 369 * 370 * Note: 371 * The ideal ratio configuration can work with a flexible clock rate setting. 372 * Using IDEAL_RATIO_RATE gives a faster converting speed but overloads ASRC. 373 * For a regular audio playback, the clock rate should not be slower than an 374 * clock rate aligning with the output sample rate; For a use case requiring 375 * faster conversion, set use_ideal_rate to have the faster speed. 376 */ 377 static int fsl_asrc_config_pair(struct fsl_asrc_pair *pair, bool use_ideal_rate) 378 { 379 struct fsl_asrc_pair_priv *pair_priv = pair->private; 380 struct asrc_config *config = pair_priv->config; 381 struct fsl_asrc *asrc = pair->asrc; 382 struct fsl_asrc_priv *asrc_priv = asrc->private; 383 enum asrc_pair_index index = pair->index; 384 enum asrc_word_width input_word_width; 385 enum asrc_word_width output_word_width; 386 u32 inrate, outrate, indiv, outdiv; 387 u32 clk_index[2], div[2]; 388 u64 clk_rate; 389 int in, out, channels; 390 int pre_proc, post_proc; 391 struct clk *clk; 392 bool ideal, div_avail; 393 394 if (!config) { 395 pair_err("invalid pair config\n"); 396 return -EINVAL; 397 } 398 399 /* Validate channels */ 400 if (config->channel_num < 1 || config->channel_num > 10) { 401 pair_err("does not support %d channels\n", config->channel_num); 402 return -EINVAL; 403 } 404 405 switch (snd_pcm_format_width(config->input_format)) { 406 case 8: 407 input_word_width = ASRC_WIDTH_8_BIT; 408 break; 409 case 16: 410 input_word_width = ASRC_WIDTH_16_BIT; 411 break; 412 case 24: 413 input_word_width = ASRC_WIDTH_24_BIT; 414 break; 415 default: 416 pair_err("does not support this input format, %d\n", 417 config->input_format); 418 return -EINVAL; 419 } 420 421 switch (snd_pcm_format_width(config->output_format)) { 422 case 16: 423 output_word_width = ASRC_WIDTH_16_BIT; 424 break; 425 case 24: 426 output_word_width = ASRC_WIDTH_24_BIT; 427 break; 428 default: 429 pair_err("does not support this output format, %d\n", 430 config->output_format); 431 return -EINVAL; 432 } 433 434 inrate = config->input_sample_rate; 435 outrate = config->output_sample_rate; 436 ideal = config->inclk == INCLK_NONE; 437 438 /* Validate input and output sample rates */ 439 for (in = 0; in < ARRAY_SIZE(supported_asrc_rate); in++) 440 if (inrate == supported_asrc_rate[in]) 441 break; 442 443 if (in == ARRAY_SIZE(supported_asrc_rate)) { 444 pair_err("unsupported input sample rate: %dHz\n", inrate); 445 return -EINVAL; 446 } 447 448 for (out = 0; out < ARRAY_SIZE(supported_asrc_rate); out++) 449 if (outrate == supported_asrc_rate[out]) 450 break; 451 452 if (out == ARRAY_SIZE(supported_asrc_rate)) { 453 pair_err("unsupported output sample rate: %dHz\n", outrate); 454 return -EINVAL; 455 } 456 457 if ((outrate >= 5512 && outrate <= 30000) && 458 (outrate > 24 * inrate || inrate > 8 * outrate)) { 459 pair_err("exceed supported ratio range [1/24, 8] for \ 460 inrate/outrate: %d/%d\n", inrate, outrate); 461 return -EINVAL; 462 } 463 464 /* Validate input and output clock sources */ 465 clk_index[IN] = asrc_priv->clk_map[IN][config->inclk]; 466 clk_index[OUT] = asrc_priv->clk_map[OUT][config->outclk]; 467 468 /* We only have output clock for ideal ratio mode */ 469 clk = asrc_priv->asrck_clk[clk_index[ideal ? OUT : IN]]; 470 471 clk_rate = clk_get_rate(clk); 472 div_avail = fsl_asrc_divider_avail(clk_rate, inrate, &div[IN]); 473 474 /* 475 * The divider range is [1, 1024], defined by the hardware. For non- 476 * ideal ratio configuration, clock rate has to be strictly aligned 477 * with the sample rate. For ideal ratio configuration, clock rates 478 * only result in different converting speeds. So remainder does not 479 * matter, as long as we keep the divider within its valid range. 480 */ 481 if (div[IN] == 0 || (!ideal && !div_avail)) { 482 pair_err("failed to support input sample rate %dHz by asrck_%x\n", 483 inrate, clk_index[ideal ? OUT : IN]); 484 return -EINVAL; 485 } 486 487 div[IN] = min_t(u32, 1024, div[IN]); 488 489 clk = asrc_priv->asrck_clk[clk_index[OUT]]; 490 clk_rate = clk_get_rate(clk); 491 if (ideal && use_ideal_rate) 492 div_avail = fsl_asrc_divider_avail(clk_rate, IDEAL_RATIO_RATE, &div[OUT]); 493 else 494 div_avail = fsl_asrc_divider_avail(clk_rate, outrate, &div[OUT]); 495 496 /* Output divider has the same limitation as the input one */ 497 if (div[OUT] == 0 || (!ideal && !div_avail)) { 498 pair_err("failed to support output sample rate %dHz by asrck_%x\n", 499 outrate, clk_index[OUT]); 500 return -EINVAL; 501 } 502 503 div[OUT] = min_t(u32, 1024, div[OUT]); 504 505 /* Set the channel number */ 506 channels = config->channel_num; 507 508 if (asrc_priv->soc->channel_bits < 4) 509 channels /= 2; 510 511 /* Update channels for current pair */ 512 regmap_update_bits(asrc->regmap, REG_ASRCNCR, 513 ASRCNCR_ANCi_MASK(index, asrc_priv->soc->channel_bits), 514 ASRCNCR_ANCi(index, channels, asrc_priv->soc->channel_bits)); 515 516 /* Default setting: Automatic selection for processing mode */ 517 regmap_update_bits(asrc->regmap, REG_ASRCTR, 518 ASRCTR_ATSi_MASK(index), ASRCTR_ATS(index)); 519 regmap_update_bits(asrc->regmap, REG_ASRCTR, 520 ASRCTR_IDRi_MASK(index) | ASRCTR_USRi_MASK(index), 521 ASRCTR_USR(index)); 522 523 /* Set the input and output clock sources */ 524 regmap_update_bits(asrc->regmap, REG_ASRCSR, 525 ASRCSR_AICSi_MASK(index) | ASRCSR_AOCSi_MASK(index), 526 ASRCSR_AICS(index, clk_index[IN]) | 527 ASRCSR_AOCS(index, clk_index[OUT])); 528 529 /* Calculate the input clock divisors */ 530 indiv = fsl_asrc_cal_asrck_divisor(pair, div[IN]); 531 outdiv = fsl_asrc_cal_asrck_divisor(pair, div[OUT]); 532 533 /* Suppose indiv and outdiv includes prescaler, so add its MASK too */ 534 regmap_update_bits(asrc->regmap, REG_ASRCDR(index), 535 ASRCDRi_AOCPi_MASK(index) | ASRCDRi_AICPi_MASK(index) | 536 ASRCDRi_AOCDi_MASK(index) | ASRCDRi_AICDi_MASK(index), 537 ASRCDRi_AOCP(index, outdiv) | ASRCDRi_AICP(index, indiv)); 538 539 /* Implement word_width configurations */ 540 regmap_update_bits(asrc->regmap, REG_ASRMCR1(index), 541 ASRMCR1i_OW16_MASK | ASRMCR1i_IWD_MASK, 542 ASRMCR1i_OW16(output_word_width) | 543 ASRMCR1i_IWD(input_word_width)); 544 545 /* Enable BUFFER STALL */ 546 regmap_update_bits(asrc->regmap, REG_ASRMCR(index), 547 ASRMCRi_BUFSTALLi_MASK, ASRMCRi_BUFSTALLi); 548 549 /* Set default thresholds for input and output FIFO */ 550 fsl_asrc_set_watermarks(pair, ASRC_INPUTFIFO_THRESHOLD, 551 ASRC_INPUTFIFO_THRESHOLD); 552 553 /* Configure the following only for Ideal Ratio mode */ 554 if (!ideal) 555 return 0; 556 557 /* Clear ASTSx bit to use Ideal Ratio mode */ 558 regmap_update_bits(asrc->regmap, REG_ASRCTR, 559 ASRCTR_ATSi_MASK(index), 0); 560 561 /* Enable Ideal Ratio mode */ 562 regmap_update_bits(asrc->regmap, REG_ASRCTR, 563 ASRCTR_IDRi_MASK(index) | ASRCTR_USRi_MASK(index), 564 ASRCTR_IDR(index) | ASRCTR_USR(index)); 565 566 fsl_asrc_sel_proc(inrate, outrate, &pre_proc, &post_proc); 567 568 /* Apply configurations for pre- and post-processing */ 569 regmap_update_bits(asrc->regmap, REG_ASRCFG, 570 ASRCFG_PREMODi_MASK(index) | ASRCFG_POSTMODi_MASK(index), 571 ASRCFG_PREMOD(index, pre_proc) | 572 ASRCFG_POSTMOD(index, post_proc)); 573 574 return fsl_asrc_set_ideal_ratio(pair, inrate, outrate); 575 } 576 577 /** 578 * fsl_asrc_start_pair - Start the assigned ASRC pair 579 * @pair: pointer to pair 580 * 581 * It enables the assigned pair and makes it stopped at the stall level. 582 */ 583 static void fsl_asrc_start_pair(struct fsl_asrc_pair *pair) 584 { 585 struct fsl_asrc *asrc = pair->asrc; 586 enum asrc_pair_index index = pair->index; 587 int reg, retry = INIT_RETRY_NUM, i; 588 589 /* Enable the current pair */ 590 regmap_update_bits(asrc->regmap, REG_ASRCTR, 591 ASRCTR_ASRCEi_MASK(index), ASRCTR_ASRCE(index)); 592 593 /* Wait for status of initialization */ 594 do { 595 udelay(5); 596 regmap_read(asrc->regmap, REG_ASRCFG, ®); 597 reg &= ASRCFG_INIRQi_MASK(index); 598 } while (!reg && --retry); 599 600 /* NOTE: Doesn't treat initialization timeout as an error */ 601 if (!retry) 602 pair_warn("initialization isn't finished\n"); 603 604 /* Make the input fifo to ASRC STALL level */ 605 regmap_read(asrc->regmap, REG_ASRCNCR, ®); 606 for (i = 0; i < pair->channels * 4; i++) 607 regmap_write(asrc->regmap, REG_ASRDI(index), 0); 608 609 /* Enable overload interrupt */ 610 regmap_write(asrc->regmap, REG_ASRIER, ASRIER_AOLIE); 611 } 612 613 /** 614 * fsl_asrc_stop_pair - Stop the assigned ASRC pair 615 * @pair: pointer to pair 616 */ 617 static void fsl_asrc_stop_pair(struct fsl_asrc_pair *pair) 618 { 619 struct fsl_asrc *asrc = pair->asrc; 620 enum asrc_pair_index index = pair->index; 621 622 /* Stop the current pair */ 623 regmap_update_bits(asrc->regmap, REG_ASRCTR, 624 ASRCTR_ASRCEi_MASK(index), 0); 625 } 626 627 /** 628 * fsl_asrc_get_dma_channel- Get DMA channel according to the pair and direction. 629 * @pair: pointer to pair 630 * @dir: DMA direction 631 */ 632 static struct dma_chan *fsl_asrc_get_dma_channel(struct fsl_asrc_pair *pair, 633 bool dir) 634 { 635 struct fsl_asrc *asrc = pair->asrc; 636 enum asrc_pair_index index = pair->index; 637 char name[4]; 638 639 sprintf(name, "%cx%c", dir == IN ? 'r' : 't', index + 'a'); 640 641 return dma_request_slave_channel(&asrc->pdev->dev, name); 642 } 643 644 static int fsl_asrc_dai_startup(struct snd_pcm_substream *substream, 645 struct snd_soc_dai *dai) 646 { 647 struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai); 648 struct fsl_asrc_priv *asrc_priv = asrc->private; 649 650 /* Odd channel number is not valid for older ASRC (channel_bits==3) */ 651 if (asrc_priv->soc->channel_bits == 3) 652 snd_pcm_hw_constraint_step(substream->runtime, 0, 653 SNDRV_PCM_HW_PARAM_CHANNELS, 2); 654 655 656 return snd_pcm_hw_constraint_list(substream->runtime, 0, 657 SNDRV_PCM_HW_PARAM_RATE, &fsl_asrc_rate_constraints); 658 } 659 660 /* Select proper clock source for internal ratio mode */ 661 static void fsl_asrc_select_clk(struct fsl_asrc_priv *asrc_priv, 662 struct fsl_asrc_pair *pair, 663 int in_rate, 664 int out_rate) 665 { 666 struct fsl_asrc_pair_priv *pair_priv = pair->private; 667 struct asrc_config *config = pair_priv->config; 668 int rate[2], select_clk[2]; /* Array size 2 means IN and OUT */ 669 int clk_rate, clk_index; 670 int i, j; 671 672 rate[IN] = in_rate; 673 rate[OUT] = out_rate; 674 675 /* Select proper clock source for internal ratio mode */ 676 for (j = 0; j < 2; j++) { 677 for (i = 0; i < ASRC_CLK_MAP_LEN; i++) { 678 clk_index = asrc_priv->clk_map[j][i]; 679 clk_rate = clk_get_rate(asrc_priv->asrck_clk[clk_index]); 680 /* Only match a perfect clock source with no remainder */ 681 if (fsl_asrc_divider_avail(clk_rate, rate[j], NULL)) 682 break; 683 } 684 685 select_clk[j] = i; 686 } 687 688 /* Switch to ideal ratio mode if there is no proper clock source */ 689 if (select_clk[IN] == ASRC_CLK_MAP_LEN || select_clk[OUT] == ASRC_CLK_MAP_LEN) { 690 select_clk[IN] = INCLK_NONE; 691 select_clk[OUT] = OUTCLK_ASRCK1_CLK; 692 } 693 694 config->inclk = select_clk[IN]; 695 config->outclk = select_clk[OUT]; 696 } 697 698 static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream, 699 struct snd_pcm_hw_params *params, 700 struct snd_soc_dai *dai) 701 { 702 struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai); 703 struct fsl_asrc_priv *asrc_priv = asrc->private; 704 struct snd_pcm_runtime *runtime = substream->runtime; 705 struct fsl_asrc_pair *pair = runtime->private_data; 706 struct fsl_asrc_pair_priv *pair_priv = pair->private; 707 unsigned int channels = params_channels(params); 708 unsigned int rate = params_rate(params); 709 struct asrc_config config; 710 int ret; 711 712 ret = fsl_asrc_request_pair(channels, pair); 713 if (ret) { 714 dev_err(dai->dev, "fail to request asrc pair\n"); 715 return ret; 716 } 717 718 pair_priv->config = &config; 719 720 config.pair = pair->index; 721 config.channel_num = channels; 722 723 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 724 config.input_format = params_format(params); 725 config.output_format = asrc->asrc_format; 726 config.input_sample_rate = rate; 727 config.output_sample_rate = asrc->asrc_rate; 728 } else { 729 config.input_format = asrc->asrc_format; 730 config.output_format = params_format(params); 731 config.input_sample_rate = asrc->asrc_rate; 732 config.output_sample_rate = rate; 733 } 734 735 fsl_asrc_select_clk(asrc_priv, pair, 736 config.input_sample_rate, 737 config.output_sample_rate); 738 739 ret = fsl_asrc_config_pair(pair, false); 740 if (ret) { 741 dev_err(dai->dev, "fail to config asrc pair\n"); 742 return ret; 743 } 744 745 return 0; 746 } 747 748 static int fsl_asrc_dai_hw_free(struct snd_pcm_substream *substream, 749 struct snd_soc_dai *dai) 750 { 751 struct snd_pcm_runtime *runtime = substream->runtime; 752 struct fsl_asrc_pair *pair = runtime->private_data; 753 754 if (pair) 755 fsl_asrc_release_pair(pair); 756 757 return 0; 758 } 759 760 static int fsl_asrc_dai_trigger(struct snd_pcm_substream *substream, int cmd, 761 struct snd_soc_dai *dai) 762 { 763 struct snd_pcm_runtime *runtime = substream->runtime; 764 struct fsl_asrc_pair *pair = runtime->private_data; 765 766 switch (cmd) { 767 case SNDRV_PCM_TRIGGER_START: 768 case SNDRV_PCM_TRIGGER_RESUME: 769 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 770 fsl_asrc_start_pair(pair); 771 break; 772 case SNDRV_PCM_TRIGGER_STOP: 773 case SNDRV_PCM_TRIGGER_SUSPEND: 774 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 775 fsl_asrc_stop_pair(pair); 776 break; 777 default: 778 return -EINVAL; 779 } 780 781 return 0; 782 } 783 784 static int fsl_asrc_dai_probe(struct snd_soc_dai *dai) 785 { 786 struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai); 787 788 snd_soc_dai_init_dma_data(dai, &asrc->dma_params_tx, 789 &asrc->dma_params_rx); 790 791 return 0; 792 } 793 794 static const struct snd_soc_dai_ops fsl_asrc_dai_ops = { 795 .probe = fsl_asrc_dai_probe, 796 .startup = fsl_asrc_dai_startup, 797 .hw_params = fsl_asrc_dai_hw_params, 798 .hw_free = fsl_asrc_dai_hw_free, 799 .trigger = fsl_asrc_dai_trigger, 800 }; 801 802 #define FSL_ASRC_FORMATS (SNDRV_PCM_FMTBIT_S24_LE | \ 803 SNDRV_PCM_FMTBIT_S16_LE | \ 804 SNDRV_PCM_FMTBIT_S24_3LE) 805 806 static struct snd_soc_dai_driver fsl_asrc_dai = { 807 .playback = { 808 .stream_name = "ASRC-Playback", 809 .channels_min = 1, 810 .channels_max = 10, 811 .rate_min = 5512, 812 .rate_max = 192000, 813 .rates = SNDRV_PCM_RATE_KNOT, 814 .formats = FSL_ASRC_FORMATS | 815 SNDRV_PCM_FMTBIT_S8, 816 }, 817 .capture = { 818 .stream_name = "ASRC-Capture", 819 .channels_min = 1, 820 .channels_max = 10, 821 .rate_min = 5512, 822 .rate_max = 192000, 823 .rates = SNDRV_PCM_RATE_KNOT, 824 .formats = FSL_ASRC_FORMATS, 825 }, 826 .ops = &fsl_asrc_dai_ops, 827 }; 828 829 static bool fsl_asrc_readable_reg(struct device *dev, unsigned int reg) 830 { 831 switch (reg) { 832 case REG_ASRCTR: 833 case REG_ASRIER: 834 case REG_ASRCNCR: 835 case REG_ASRCFG: 836 case REG_ASRCSR: 837 case REG_ASRCDR1: 838 case REG_ASRCDR2: 839 case REG_ASRSTR: 840 case REG_ASRPM1: 841 case REG_ASRPM2: 842 case REG_ASRPM3: 843 case REG_ASRPM4: 844 case REG_ASRPM5: 845 case REG_ASRTFR1: 846 case REG_ASRCCR: 847 case REG_ASRDOA: 848 case REG_ASRDOB: 849 case REG_ASRDOC: 850 case REG_ASRIDRHA: 851 case REG_ASRIDRLA: 852 case REG_ASRIDRHB: 853 case REG_ASRIDRLB: 854 case REG_ASRIDRHC: 855 case REG_ASRIDRLC: 856 case REG_ASR76K: 857 case REG_ASR56K: 858 case REG_ASRMCRA: 859 case REG_ASRFSTA: 860 case REG_ASRMCRB: 861 case REG_ASRFSTB: 862 case REG_ASRMCRC: 863 case REG_ASRFSTC: 864 case REG_ASRMCR1A: 865 case REG_ASRMCR1B: 866 case REG_ASRMCR1C: 867 return true; 868 default: 869 return false; 870 } 871 } 872 873 static bool fsl_asrc_volatile_reg(struct device *dev, unsigned int reg) 874 { 875 switch (reg) { 876 case REG_ASRSTR: 877 case REG_ASRDIA: 878 case REG_ASRDIB: 879 case REG_ASRDIC: 880 case REG_ASRDOA: 881 case REG_ASRDOB: 882 case REG_ASRDOC: 883 case REG_ASRFSTA: 884 case REG_ASRFSTB: 885 case REG_ASRFSTC: 886 case REG_ASRCFG: 887 return true; 888 default: 889 return false; 890 } 891 } 892 893 static bool fsl_asrc_writeable_reg(struct device *dev, unsigned int reg) 894 { 895 switch (reg) { 896 case REG_ASRCTR: 897 case REG_ASRIER: 898 case REG_ASRCNCR: 899 case REG_ASRCFG: 900 case REG_ASRCSR: 901 case REG_ASRCDR1: 902 case REG_ASRCDR2: 903 case REG_ASRSTR: 904 case REG_ASRPM1: 905 case REG_ASRPM2: 906 case REG_ASRPM3: 907 case REG_ASRPM4: 908 case REG_ASRPM5: 909 case REG_ASRTFR1: 910 case REG_ASRCCR: 911 case REG_ASRDIA: 912 case REG_ASRDIB: 913 case REG_ASRDIC: 914 case REG_ASRIDRHA: 915 case REG_ASRIDRLA: 916 case REG_ASRIDRHB: 917 case REG_ASRIDRLB: 918 case REG_ASRIDRHC: 919 case REG_ASRIDRLC: 920 case REG_ASR76K: 921 case REG_ASR56K: 922 case REG_ASRMCRA: 923 case REG_ASRMCRB: 924 case REG_ASRMCRC: 925 case REG_ASRMCR1A: 926 case REG_ASRMCR1B: 927 case REG_ASRMCR1C: 928 return true; 929 default: 930 return false; 931 } 932 } 933 934 static struct reg_default fsl_asrc_reg[] = { 935 { REG_ASRCTR, 0x0000 }, { REG_ASRIER, 0x0000 }, 936 { REG_ASRCNCR, 0x0000 }, { REG_ASRCFG, 0x0000 }, 937 { REG_ASRCSR, 0x0000 }, { REG_ASRCDR1, 0x0000 }, 938 { REG_ASRCDR2, 0x0000 }, { REG_ASRSTR, 0x0000 }, 939 { REG_ASRRA, 0x0000 }, { REG_ASRRB, 0x0000 }, 940 { REG_ASRRC, 0x0000 }, { REG_ASRPM1, 0x0000 }, 941 { REG_ASRPM2, 0x0000 }, { REG_ASRPM3, 0x0000 }, 942 { REG_ASRPM4, 0x0000 }, { REG_ASRPM5, 0x0000 }, 943 { REG_ASRTFR1, 0x0000 }, { REG_ASRCCR, 0x0000 }, 944 { REG_ASRDIA, 0x0000 }, { REG_ASRDOA, 0x0000 }, 945 { REG_ASRDIB, 0x0000 }, { REG_ASRDOB, 0x0000 }, 946 { REG_ASRDIC, 0x0000 }, { REG_ASRDOC, 0x0000 }, 947 { REG_ASRIDRHA, 0x0000 }, { REG_ASRIDRLA, 0x0000 }, 948 { REG_ASRIDRHB, 0x0000 }, { REG_ASRIDRLB, 0x0000 }, 949 { REG_ASRIDRHC, 0x0000 }, { REG_ASRIDRLC, 0x0000 }, 950 { REG_ASR76K, 0x0A47 }, { REG_ASR56K, 0x0DF3 }, 951 { REG_ASRMCRA, 0x0000 }, { REG_ASRFSTA, 0x0000 }, 952 { REG_ASRMCRB, 0x0000 }, { REG_ASRFSTB, 0x0000 }, 953 { REG_ASRMCRC, 0x0000 }, { REG_ASRFSTC, 0x0000 }, 954 { REG_ASRMCR1A, 0x0000 }, { REG_ASRMCR1B, 0x0000 }, 955 { REG_ASRMCR1C, 0x0000 }, 956 }; 957 958 static const struct regmap_config fsl_asrc_regmap_config = { 959 .reg_bits = 32, 960 .reg_stride = 4, 961 .val_bits = 32, 962 963 .max_register = REG_ASRMCR1C, 964 .reg_defaults = fsl_asrc_reg, 965 .num_reg_defaults = ARRAY_SIZE(fsl_asrc_reg), 966 .readable_reg = fsl_asrc_readable_reg, 967 .volatile_reg = fsl_asrc_volatile_reg, 968 .writeable_reg = fsl_asrc_writeable_reg, 969 .cache_type = REGCACHE_FLAT, 970 }; 971 972 /** 973 * fsl_asrc_init - Initialize ASRC registers with a default configuration 974 * @asrc: ASRC context 975 */ 976 static int fsl_asrc_init(struct fsl_asrc *asrc) 977 { 978 unsigned long ipg_rate; 979 980 /* Halt ASRC internal FP when input FIFO needs data for pair A, B, C */ 981 regmap_write(asrc->regmap, REG_ASRCTR, ASRCTR_ASRCEN); 982 983 /* Disable interrupt by default */ 984 regmap_write(asrc->regmap, REG_ASRIER, 0x0); 985 986 /* Apply recommended settings for parameters from Reference Manual */ 987 regmap_write(asrc->regmap, REG_ASRPM1, 0x7fffff); 988 regmap_write(asrc->regmap, REG_ASRPM2, 0x255555); 989 regmap_write(asrc->regmap, REG_ASRPM3, 0xff7280); 990 regmap_write(asrc->regmap, REG_ASRPM4, 0xff7280); 991 regmap_write(asrc->regmap, REG_ASRPM5, 0xff7280); 992 993 /* Base address for task queue FIFO. Set to 0x7C */ 994 regmap_update_bits(asrc->regmap, REG_ASRTFR1, 995 ASRTFR1_TF_BASE_MASK, ASRTFR1_TF_BASE(0xfc)); 996 997 /* 998 * Set the period of the 76KHz and 56KHz sampling clocks based on 999 * the ASRC processing clock. 1000 * On iMX6, ipg_clk = 133MHz, REG_ASR76K = 0x06D6, REG_ASR56K = 0x0947 1001 */ 1002 ipg_rate = clk_get_rate(asrc->ipg_clk); 1003 regmap_write(asrc->regmap, REG_ASR76K, ipg_rate / 76000); 1004 return regmap_write(asrc->regmap, REG_ASR56K, ipg_rate / 56000); 1005 } 1006 1007 /** 1008 * fsl_asrc_isr- Interrupt handler for ASRC 1009 * @irq: irq number 1010 * @dev_id: ASRC context 1011 */ 1012 static irqreturn_t fsl_asrc_isr(int irq, void *dev_id) 1013 { 1014 struct fsl_asrc *asrc = (struct fsl_asrc *)dev_id; 1015 struct device *dev = &asrc->pdev->dev; 1016 enum asrc_pair_index index; 1017 u32 status; 1018 1019 regmap_read(asrc->regmap, REG_ASRSTR, &status); 1020 1021 /* Clean overload error */ 1022 regmap_write(asrc->regmap, REG_ASRSTR, ASRSTR_AOLE); 1023 1024 /* 1025 * We here use dev_dbg() for all exceptions because ASRC itself does 1026 * not care if FIFO overflowed or underrun while a warning in the 1027 * interrupt would result a ridged conversion. 1028 */ 1029 for (index = ASRC_PAIR_A; index < ASRC_PAIR_MAX_NUM; index++) { 1030 if (!asrc->pair[index]) 1031 continue; 1032 1033 if (status & ASRSTR_ATQOL) { 1034 asrc->pair[index]->error |= ASRC_TASK_Q_OVERLOAD; 1035 dev_dbg(dev, "ASRC Task Queue FIFO overload\n"); 1036 } 1037 1038 if (status & ASRSTR_AOOL(index)) { 1039 asrc->pair[index]->error |= ASRC_OUTPUT_TASK_OVERLOAD; 1040 pair_dbg("Output Task Overload\n"); 1041 } 1042 1043 if (status & ASRSTR_AIOL(index)) { 1044 asrc->pair[index]->error |= ASRC_INPUT_TASK_OVERLOAD; 1045 pair_dbg("Input Task Overload\n"); 1046 } 1047 1048 if (status & ASRSTR_AODO(index)) { 1049 asrc->pair[index]->error |= ASRC_OUTPUT_BUFFER_OVERFLOW; 1050 pair_dbg("Output Data Buffer has overflowed\n"); 1051 } 1052 1053 if (status & ASRSTR_AIDU(index)) { 1054 asrc->pair[index]->error |= ASRC_INPUT_BUFFER_UNDERRUN; 1055 pair_dbg("Input Data Buffer has underflowed\n"); 1056 } 1057 } 1058 1059 return IRQ_HANDLED; 1060 } 1061 1062 static int fsl_asrc_get_fifo_addr(u8 dir, enum asrc_pair_index index) 1063 { 1064 return REG_ASRDx(dir, index); 1065 } 1066 1067 /* Get sample numbers in FIFO */ 1068 static unsigned int fsl_asrc_get_output_fifo_size(struct fsl_asrc_pair *pair) 1069 { 1070 struct fsl_asrc *asrc = pair->asrc; 1071 enum asrc_pair_index index = pair->index; 1072 u32 val; 1073 1074 regmap_read(asrc->regmap, REG_ASRFST(index), &val); 1075 1076 val &= ASRFSTi_OUTPUT_FIFO_MASK; 1077 1078 return val >> ASRFSTi_OUTPUT_FIFO_SHIFT; 1079 } 1080 1081 static int fsl_asrc_m2m_prepare(struct fsl_asrc_pair *pair) 1082 { 1083 struct fsl_asrc_pair_priv *pair_priv = pair->private; 1084 struct fsl_asrc *asrc = pair->asrc; 1085 struct device *dev = &asrc->pdev->dev; 1086 struct asrc_config config; 1087 int ret; 1088 1089 /* fill config */ 1090 config.pair = pair->index; 1091 config.channel_num = pair->channels; 1092 config.input_sample_rate = pair->rate[IN]; 1093 config.output_sample_rate = pair->rate[OUT]; 1094 config.input_format = pair->sample_format[IN]; 1095 config.output_format = pair->sample_format[OUT]; 1096 config.inclk = INCLK_NONE; 1097 config.outclk = OUTCLK_ASRCK1_CLK; 1098 1099 pair_priv->config = &config; 1100 ret = fsl_asrc_config_pair(pair, true); 1101 if (ret) { 1102 dev_err(dev, "failed to config pair: %d\n", ret); 1103 return ret; 1104 } 1105 1106 pair->first_convert = 1; 1107 1108 return 0; 1109 } 1110 1111 static int fsl_asrc_m2m_start(struct fsl_asrc_pair *pair) 1112 { 1113 if (pair->first_convert) { 1114 fsl_asrc_start_pair(pair); 1115 pair->first_convert = 0; 1116 } 1117 /* 1118 * Clear DMA request during the stall state of ASRC: 1119 * During STALL state, the remaining in input fifo would never be 1120 * smaller than the input threshold while the output fifo would not 1121 * be bigger than output one. Thus the DMA request would be cleared. 1122 */ 1123 fsl_asrc_set_watermarks(pair, ASRC_FIFO_THRESHOLD_MIN, 1124 ASRC_FIFO_THRESHOLD_MAX); 1125 1126 /* Update the real input threshold to raise DMA request */ 1127 fsl_asrc_set_watermarks(pair, ASRC_M2M_INPUTFIFO_WML, 1128 ASRC_M2M_OUTPUTFIFO_WML); 1129 1130 return 0; 1131 } 1132 1133 static int fsl_asrc_m2m_stop(struct fsl_asrc_pair *pair) 1134 { 1135 if (!pair->first_convert) { 1136 fsl_asrc_stop_pair(pair); 1137 pair->first_convert = 1; 1138 } 1139 1140 return 0; 1141 } 1142 1143 /* calculate capture data length according to output data length and sample rate */ 1144 static int fsl_asrc_m2m_calc_out_len(struct fsl_asrc_pair *pair, int input_buffer_length) 1145 { 1146 unsigned int in_width, out_width; 1147 unsigned int channels = pair->channels; 1148 unsigned int in_samples, out_samples; 1149 unsigned int out_length; 1150 1151 in_width = snd_pcm_format_physical_width(pair->sample_format[IN]) / 8; 1152 out_width = snd_pcm_format_physical_width(pair->sample_format[OUT]) / 8; 1153 1154 in_samples = input_buffer_length / in_width / channels; 1155 out_samples = pair->rate[OUT] * in_samples / pair->rate[IN]; 1156 out_length = (out_samples - ASRC_OUTPUT_LAST_SAMPLE) * out_width * channels; 1157 1158 return out_length; 1159 } 1160 1161 static int fsl_asrc_m2m_get_maxburst(u8 dir, struct fsl_asrc_pair *pair) 1162 { 1163 struct fsl_asrc *asrc = pair->asrc; 1164 struct fsl_asrc_priv *asrc_priv = asrc->private; 1165 int wml = (dir == IN) ? ASRC_M2M_INPUTFIFO_WML : ASRC_M2M_OUTPUTFIFO_WML; 1166 1167 if (!asrc_priv->soc->use_edma) 1168 return wml * pair->channels; 1169 else 1170 return 1; 1171 } 1172 1173 static int fsl_asrc_m2m_get_cap(struct fsl_asrc_m2m_cap *cap) 1174 { 1175 cap->fmt_in = FSL_ASRC_FORMATS; 1176 cap->fmt_out = FSL_ASRC_FORMATS | SNDRV_PCM_FMTBIT_S8; 1177 1178 cap->rate_in = supported_asrc_rate; 1179 cap->rate_in_count = ARRAY_SIZE(supported_asrc_rate); 1180 cap->rate_out = supported_asrc_rate; 1181 cap->rate_out_count = ARRAY_SIZE(supported_asrc_rate); 1182 cap->chan_min = 1; 1183 cap->chan_max = 10; 1184 1185 return 0; 1186 } 1187 1188 static int fsl_asrc_m2m_pair_resume(struct fsl_asrc_pair *pair) 1189 { 1190 struct fsl_asrc *asrc = pair->asrc; 1191 int i; 1192 1193 for (i = 0; i < pair->channels * 4; i++) 1194 regmap_write(asrc->regmap, REG_ASRDI(pair->index), 0); 1195 1196 pair->first_convert = 1; 1197 return 0; 1198 } 1199 1200 static int fsl_asrc_runtime_resume(struct device *dev); 1201 static int fsl_asrc_runtime_suspend(struct device *dev); 1202 1203 static int fsl_asrc_probe(struct platform_device *pdev) 1204 { 1205 struct device_node *np = pdev->dev.of_node; 1206 struct fsl_asrc_priv *asrc_priv; 1207 struct fsl_asrc *asrc; 1208 struct resource *res; 1209 void __iomem *regs; 1210 int irq, ret, i; 1211 u32 asrc_fmt = 0; 1212 u32 map_idx; 1213 char tmp[16]; 1214 u32 width; 1215 1216 asrc = devm_kzalloc(&pdev->dev, sizeof(*asrc), GFP_KERNEL); 1217 if (!asrc) 1218 return -ENOMEM; 1219 1220 asrc_priv = devm_kzalloc(&pdev->dev, sizeof(*asrc_priv), GFP_KERNEL); 1221 if (!asrc_priv) 1222 return -ENOMEM; 1223 1224 asrc->pdev = pdev; 1225 asrc->private = asrc_priv; 1226 1227 /* Get the addresses and IRQ */ 1228 regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 1229 if (IS_ERR(regs)) 1230 return PTR_ERR(regs); 1231 1232 asrc->paddr = res->start; 1233 1234 asrc->regmap = devm_regmap_init_mmio(&pdev->dev, regs, &fsl_asrc_regmap_config); 1235 if (IS_ERR(asrc->regmap)) { 1236 dev_err(&pdev->dev, "failed to init regmap\n"); 1237 return PTR_ERR(asrc->regmap); 1238 } 1239 1240 irq = platform_get_irq(pdev, 0); 1241 if (irq < 0) 1242 return irq; 1243 1244 ret = devm_request_irq(&pdev->dev, irq, fsl_asrc_isr, 0, 1245 dev_name(&pdev->dev), asrc); 1246 if (ret) { 1247 dev_err(&pdev->dev, "failed to claim irq %u: %d\n", irq, ret); 1248 return ret; 1249 } 1250 1251 asrc->mem_clk = devm_clk_get(&pdev->dev, "mem"); 1252 if (IS_ERR(asrc->mem_clk)) { 1253 dev_err(&pdev->dev, "failed to get mem clock\n"); 1254 return PTR_ERR(asrc->mem_clk); 1255 } 1256 1257 asrc->ipg_clk = devm_clk_get(&pdev->dev, "ipg"); 1258 if (IS_ERR(asrc->ipg_clk)) { 1259 dev_err(&pdev->dev, "failed to get ipg clock\n"); 1260 return PTR_ERR(asrc->ipg_clk); 1261 } 1262 1263 asrc->spba_clk = devm_clk_get(&pdev->dev, "spba"); 1264 if (IS_ERR(asrc->spba_clk)) 1265 dev_warn(&pdev->dev, "failed to get spba clock\n"); 1266 1267 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) { 1268 sprintf(tmp, "asrck_%x", i); 1269 asrc_priv->asrck_clk[i] = devm_clk_get(&pdev->dev, tmp); 1270 if (IS_ERR(asrc_priv->asrck_clk[i])) { 1271 dev_err(&pdev->dev, "failed to get %s clock\n", tmp); 1272 return PTR_ERR(asrc_priv->asrck_clk[i]); 1273 } 1274 } 1275 1276 asrc_priv->soc = of_device_get_match_data(&pdev->dev); 1277 asrc->use_edma = asrc_priv->soc->use_edma; 1278 asrc->get_dma_channel = fsl_asrc_get_dma_channel; 1279 asrc->request_pair = fsl_asrc_request_pair; 1280 asrc->release_pair = fsl_asrc_release_pair; 1281 asrc->get_fifo_addr = fsl_asrc_get_fifo_addr; 1282 asrc->pair_priv_size = sizeof(struct fsl_asrc_pair_priv); 1283 1284 asrc->m2m_prepare = fsl_asrc_m2m_prepare; 1285 asrc->m2m_start = fsl_asrc_m2m_start; 1286 asrc->m2m_stop = fsl_asrc_m2m_stop; 1287 asrc->get_output_fifo_size = fsl_asrc_get_output_fifo_size; 1288 asrc->m2m_calc_out_len = fsl_asrc_m2m_calc_out_len; 1289 asrc->m2m_get_maxburst = fsl_asrc_m2m_get_maxburst; 1290 asrc->m2m_pair_resume = fsl_asrc_m2m_pair_resume; 1291 asrc->m2m_get_cap = fsl_asrc_m2m_get_cap; 1292 1293 if (of_device_is_compatible(np, "fsl,imx35-asrc")) { 1294 asrc_priv->clk_map[IN] = input_clk_map_imx35; 1295 asrc_priv->clk_map[OUT] = output_clk_map_imx35; 1296 } else if (of_device_is_compatible(np, "fsl,imx53-asrc")) { 1297 asrc_priv->clk_map[IN] = input_clk_map_imx53; 1298 asrc_priv->clk_map[OUT] = output_clk_map_imx53; 1299 } else if (of_device_is_compatible(np, "fsl,imx8qm-asrc") || 1300 of_device_is_compatible(np, "fsl,imx8qxp-asrc")) { 1301 ret = of_property_read_u32(np, "fsl,asrc-clk-map", &map_idx); 1302 if (ret) { 1303 dev_err(&pdev->dev, "failed to get clk map index\n"); 1304 return ret; 1305 } 1306 1307 if (map_idx > 1) { 1308 dev_err(&pdev->dev, "unsupported clk map index\n"); 1309 return -EINVAL; 1310 } 1311 if (of_device_is_compatible(np, "fsl,imx8qm-asrc")) { 1312 asrc_priv->clk_map[IN] = clk_map_imx8qm[map_idx]; 1313 asrc_priv->clk_map[OUT] = clk_map_imx8qm[map_idx]; 1314 } else { 1315 asrc_priv->clk_map[IN] = clk_map_imx8qxp[map_idx]; 1316 asrc_priv->clk_map[OUT] = clk_map_imx8qxp[map_idx]; 1317 } 1318 } 1319 1320 asrc->channel_avail = 10; 1321 1322 ret = of_property_read_u32(np, "fsl,asrc-rate", 1323 &asrc->asrc_rate); 1324 if (ret) { 1325 dev_err(&pdev->dev, "failed to get output rate\n"); 1326 return ret; 1327 } 1328 1329 ret = of_property_read_u32(np, "fsl,asrc-format", &asrc_fmt); 1330 asrc->asrc_format = (__force snd_pcm_format_t)asrc_fmt; 1331 if (ret) { 1332 ret = of_property_read_u32(np, "fsl,asrc-width", &width); 1333 if (ret) { 1334 dev_err(&pdev->dev, "failed to decide output format\n"); 1335 return ret; 1336 } 1337 1338 switch (width) { 1339 case 16: 1340 asrc->asrc_format = SNDRV_PCM_FORMAT_S16_LE; 1341 break; 1342 case 24: 1343 asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE; 1344 break; 1345 default: 1346 dev_warn(&pdev->dev, 1347 "unsupported width, use default S24_LE\n"); 1348 asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE; 1349 break; 1350 } 1351 } 1352 1353 if (!(FSL_ASRC_FORMATS & pcm_format_to_bits(asrc->asrc_format))) { 1354 dev_warn(&pdev->dev, "unsupported width, use default S24_LE\n"); 1355 asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE; 1356 } 1357 1358 platform_set_drvdata(pdev, asrc); 1359 spin_lock_init(&asrc->lock); 1360 pm_runtime_enable(&pdev->dev); 1361 if (!pm_runtime_enabled(&pdev->dev)) { 1362 ret = fsl_asrc_runtime_resume(&pdev->dev); 1363 if (ret) 1364 goto err_pm_disable; 1365 } 1366 1367 ret = pm_runtime_resume_and_get(&pdev->dev); 1368 if (ret < 0) 1369 goto err_pm_get_sync; 1370 1371 ret = fsl_asrc_init(asrc); 1372 if (ret) { 1373 dev_err(&pdev->dev, "failed to init asrc %d\n", ret); 1374 goto err_pm_get_sync; 1375 } 1376 1377 ret = pm_runtime_put_sync(&pdev->dev); 1378 if (ret < 0 && ret != -ENOSYS) 1379 goto err_pm_get_sync; 1380 1381 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component, 1382 &fsl_asrc_dai, 1); 1383 if (ret) { 1384 dev_err(&pdev->dev, "failed to register ASoC DAI\n"); 1385 goto err_pm_get_sync; 1386 } 1387 1388 ret = fsl_asrc_m2m_init(asrc); 1389 if (ret) { 1390 dev_err(&pdev->dev, "failed to init m2m device %d\n", ret); 1391 return ret; 1392 } 1393 1394 return 0; 1395 1396 err_pm_get_sync: 1397 if (!pm_runtime_status_suspended(&pdev->dev)) 1398 fsl_asrc_runtime_suspend(&pdev->dev); 1399 err_pm_disable: 1400 pm_runtime_disable(&pdev->dev); 1401 return ret; 1402 } 1403 1404 static void fsl_asrc_remove(struct platform_device *pdev) 1405 { 1406 struct fsl_asrc *asrc = dev_get_drvdata(&pdev->dev); 1407 1408 fsl_asrc_m2m_exit(asrc); 1409 1410 pm_runtime_disable(&pdev->dev); 1411 if (!pm_runtime_status_suspended(&pdev->dev)) 1412 fsl_asrc_runtime_suspend(&pdev->dev); 1413 } 1414 1415 static int fsl_asrc_runtime_resume(struct device *dev) 1416 { 1417 struct fsl_asrc *asrc = dev_get_drvdata(dev); 1418 struct fsl_asrc_priv *asrc_priv = asrc->private; 1419 int reg, retry = INIT_RETRY_NUM; 1420 int i, ret; 1421 u32 asrctr; 1422 1423 ret = clk_prepare_enable(asrc->mem_clk); 1424 if (ret) 1425 return ret; 1426 ret = clk_prepare_enable(asrc->ipg_clk); 1427 if (ret) 1428 goto disable_mem_clk; 1429 if (!IS_ERR(asrc->spba_clk)) { 1430 ret = clk_prepare_enable(asrc->spba_clk); 1431 if (ret) 1432 goto disable_ipg_clk; 1433 } 1434 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) { 1435 ret = clk_prepare_enable(asrc_priv->asrck_clk[i]); 1436 if (ret) 1437 goto disable_asrck_clk; 1438 } 1439 1440 /* Stop all pairs provisionally */ 1441 regmap_read(asrc->regmap, REG_ASRCTR, &asrctr); 1442 regmap_update_bits(asrc->regmap, REG_ASRCTR, 1443 ASRCTR_ASRCEi_ALL_MASK, 0); 1444 1445 /* Restore all registers */ 1446 regcache_cache_only(asrc->regmap, false); 1447 regcache_mark_dirty(asrc->regmap); 1448 regcache_sync(asrc->regmap); 1449 1450 regmap_update_bits(asrc->regmap, REG_ASRCFG, 1451 ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK | 1452 ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg); 1453 1454 /* Restart enabled pairs */ 1455 regmap_update_bits(asrc->regmap, REG_ASRCTR, 1456 ASRCTR_ASRCEi_ALL_MASK, asrctr); 1457 1458 /* Wait for status of initialization for all enabled pairs */ 1459 do { 1460 udelay(5); 1461 regmap_read(asrc->regmap, REG_ASRCFG, ®); 1462 reg = (reg >> ASRCFG_INIRQi_SHIFT(0)) & 0x7; 1463 } while ((reg != ((asrctr >> ASRCTR_ASRCEi_SHIFT(0)) & 0x7)) && --retry); 1464 1465 /* 1466 * NOTE: Doesn't treat initialization timeout as an error 1467 * Some of the pairs may success, then still can continue. 1468 */ 1469 if (!retry) { 1470 for (i = ASRC_PAIR_A; i < ASRC_PAIR_MAX_NUM; i++) { 1471 if ((asrctr & ASRCTR_ASRCEi_MASK(i)) && !(reg & (1 << i))) 1472 dev_warn(dev, "Pair %c initialization isn't finished\n", 'A' + i); 1473 } 1474 } 1475 1476 return 0; 1477 1478 disable_asrck_clk: 1479 for (i--; i >= 0; i--) 1480 clk_disable_unprepare(asrc_priv->asrck_clk[i]); 1481 if (!IS_ERR(asrc->spba_clk)) 1482 clk_disable_unprepare(asrc->spba_clk); 1483 disable_ipg_clk: 1484 clk_disable_unprepare(asrc->ipg_clk); 1485 disable_mem_clk: 1486 clk_disable_unprepare(asrc->mem_clk); 1487 return ret; 1488 } 1489 1490 static int fsl_asrc_runtime_suspend(struct device *dev) 1491 { 1492 struct fsl_asrc *asrc = dev_get_drvdata(dev); 1493 struct fsl_asrc_priv *asrc_priv = asrc->private; 1494 int i; 1495 1496 regmap_read(asrc->regmap, REG_ASRCFG, 1497 &asrc_priv->regcache_cfg); 1498 1499 regcache_cache_only(asrc->regmap, true); 1500 1501 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) 1502 clk_disable_unprepare(asrc_priv->asrck_clk[i]); 1503 if (!IS_ERR(asrc->spba_clk)) 1504 clk_disable_unprepare(asrc->spba_clk); 1505 clk_disable_unprepare(asrc->ipg_clk); 1506 clk_disable_unprepare(asrc->mem_clk); 1507 1508 return 0; 1509 } 1510 1511 static int fsl_asrc_suspend(struct device *dev) 1512 { 1513 struct fsl_asrc *asrc = dev_get_drvdata(dev); 1514 int ret; 1515 1516 fsl_asrc_m2m_suspend(asrc); 1517 ret = pm_runtime_force_suspend(dev); 1518 return ret; 1519 } 1520 1521 static int fsl_asrc_resume(struct device *dev) 1522 { 1523 struct fsl_asrc *asrc = dev_get_drvdata(dev); 1524 int ret; 1525 1526 ret = pm_runtime_force_resume(dev); 1527 fsl_asrc_m2m_resume(asrc); 1528 return ret; 1529 } 1530 1531 static const struct dev_pm_ops fsl_asrc_pm = { 1532 RUNTIME_PM_OPS(fsl_asrc_runtime_suspend, fsl_asrc_runtime_resume, NULL) 1533 SYSTEM_SLEEP_PM_OPS(fsl_asrc_suspend, fsl_asrc_resume) 1534 }; 1535 1536 static const struct fsl_asrc_soc_data fsl_asrc_imx35_data = { 1537 .use_edma = false, 1538 .channel_bits = 3, 1539 }; 1540 1541 static const struct fsl_asrc_soc_data fsl_asrc_imx53_data = { 1542 .use_edma = false, 1543 .channel_bits = 4, 1544 }; 1545 1546 static const struct fsl_asrc_soc_data fsl_asrc_imx8qm_data = { 1547 .use_edma = true, 1548 .channel_bits = 4, 1549 }; 1550 1551 static const struct fsl_asrc_soc_data fsl_asrc_imx8qxp_data = { 1552 .use_edma = true, 1553 .channel_bits = 4, 1554 }; 1555 1556 static const struct of_device_id fsl_asrc_ids[] = { 1557 { .compatible = "fsl,imx35-asrc", .data = &fsl_asrc_imx35_data }, 1558 { .compatible = "fsl,imx53-asrc", .data = &fsl_asrc_imx53_data }, 1559 { .compatible = "fsl,imx8qm-asrc", .data = &fsl_asrc_imx8qm_data }, 1560 { .compatible = "fsl,imx8qxp-asrc", .data = &fsl_asrc_imx8qxp_data }, 1561 {} 1562 }; 1563 MODULE_DEVICE_TABLE(of, fsl_asrc_ids); 1564 1565 static struct platform_driver fsl_asrc_driver = { 1566 .probe = fsl_asrc_probe, 1567 .remove = fsl_asrc_remove, 1568 .driver = { 1569 .name = "fsl-asrc", 1570 .of_match_table = fsl_asrc_ids, 1571 .pm = pm_ptr(&fsl_asrc_pm), 1572 }, 1573 }; 1574 module_platform_driver(fsl_asrc_driver); 1575 1576 MODULE_DESCRIPTION("Freescale ASRC ASoC driver"); 1577 MODULE_AUTHOR("Nicolin Chen <nicoleotsuka@gmail.com>"); 1578 MODULE_ALIAS("platform:fsl-asrc"); 1579 MODULE_LICENSE("GPL v2"); 1580