Linux Audio

Check our new training course

Loading...
v6.13.7
   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 */
  35static 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
  40static 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 */
  49static 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
  55static 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 */
  62static 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
  69static 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 */
  83static 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
  96static 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 */
 113static 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 */
 127static 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 */
 171static 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 */
 214static 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 */
 258static 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 */
 283static 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 */
 304static 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 */
 323static 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 */
 377static 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_USRi_MASK(index), 0);
 521
 522	/* Set the input and output clock sources */
 523	regmap_update_bits(asrc->regmap, REG_ASRCSR,
 524			   ASRCSR_AICSi_MASK(index) | ASRCSR_AOCSi_MASK(index),
 525			   ASRCSR_AICS(index, clk_index[IN]) |
 526			   ASRCSR_AOCS(index, clk_index[OUT]));
 527
 528	/* Calculate the input clock divisors */
 529	indiv = fsl_asrc_cal_asrck_divisor(pair, div[IN]);
 530	outdiv = fsl_asrc_cal_asrck_divisor(pair, div[OUT]);
 531
 532	/* Suppose indiv and outdiv includes prescaler, so add its MASK too */
 533	regmap_update_bits(asrc->regmap, REG_ASRCDR(index),
 534			   ASRCDRi_AOCPi_MASK(index) | ASRCDRi_AICPi_MASK(index) |
 535			   ASRCDRi_AOCDi_MASK(index) | ASRCDRi_AICDi_MASK(index),
 536			   ASRCDRi_AOCP(index, outdiv) | ASRCDRi_AICP(index, indiv));
 537
 538	/* Implement word_width configurations */
 539	regmap_update_bits(asrc->regmap, REG_ASRMCR1(index),
 540			   ASRMCR1i_OW16_MASK | ASRMCR1i_IWD_MASK,
 541			   ASRMCR1i_OW16(output_word_width) |
 542			   ASRMCR1i_IWD(input_word_width));
 543
 544	/* Enable BUFFER STALL */
 545	regmap_update_bits(asrc->regmap, REG_ASRMCR(index),
 546			   ASRMCRi_BUFSTALLi_MASK, ASRMCRi_BUFSTALLi);
 547
 548	/* Set default thresholds for input and output FIFO */
 549	fsl_asrc_set_watermarks(pair, ASRC_INPUTFIFO_THRESHOLD,
 550				ASRC_INPUTFIFO_THRESHOLD);
 551
 552	/* Configure the following only for Ideal Ratio mode */
 553	if (!ideal)
 554		return 0;
 555
 556	/* Clear ASTSx bit to use Ideal Ratio mode */
 557	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 558			   ASRCTR_ATSi_MASK(index), 0);
 559
 560	/* Enable Ideal Ratio mode */
 561	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 562			   ASRCTR_IDRi_MASK(index) | ASRCTR_USRi_MASK(index),
 563			   ASRCTR_IDR(index) | ASRCTR_USR(index));
 564
 565	fsl_asrc_sel_proc(inrate, outrate, &pre_proc, &post_proc);
 566
 567	/* Apply configurations for pre- and post-processing */
 568	regmap_update_bits(asrc->regmap, REG_ASRCFG,
 569			   ASRCFG_PREMODi_MASK(index) |	ASRCFG_POSTMODi_MASK(index),
 570			   ASRCFG_PREMOD(index, pre_proc) |
 571			   ASRCFG_POSTMOD(index, post_proc));
 572
 573	return fsl_asrc_set_ideal_ratio(pair, inrate, outrate);
 574}
 575
 576/**
 577 * fsl_asrc_start_pair - Start the assigned ASRC pair
 578 * @pair: pointer to pair
 579 *
 580 * It enables the assigned pair and makes it stopped at the stall level.
 581 */
 582static void fsl_asrc_start_pair(struct fsl_asrc_pair *pair)
 583{
 584	struct fsl_asrc *asrc = pair->asrc;
 585	enum asrc_pair_index index = pair->index;
 586	int reg, retry = INIT_RETRY_NUM, i;
 587
 588	/* Enable the current pair */
 589	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 590			   ASRCTR_ASRCEi_MASK(index), ASRCTR_ASRCE(index));
 591
 592	/* Wait for status of initialization */
 593	do {
 594		udelay(5);
 595		regmap_read(asrc->regmap, REG_ASRCFG, &reg);
 596		reg &= ASRCFG_INIRQi_MASK(index);
 597	} while (!reg && --retry);
 598
 599	/* NOTE: Doesn't treat initialization timeout as an error */
 600	if (!retry)
 601		pair_warn("initialization isn't finished\n");
 602
 603	/* Make the input fifo to ASRC STALL level */
 604	regmap_read(asrc->regmap, REG_ASRCNCR, &reg);
 605	for (i = 0; i < pair->channels * 4; i++)
 606		regmap_write(asrc->regmap, REG_ASRDI(index), 0);
 607
 608	/* Enable overload interrupt */
 609	regmap_write(asrc->regmap, REG_ASRIER, ASRIER_AOLIE);
 610}
 611
 612/**
 613 * fsl_asrc_stop_pair - Stop the assigned ASRC pair
 614 * @pair: pointer to pair
 615 */
 616static void fsl_asrc_stop_pair(struct fsl_asrc_pair *pair)
 617{
 618	struct fsl_asrc *asrc = pair->asrc;
 619	enum asrc_pair_index index = pair->index;
 620
 621	/* Stop the current pair */
 622	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 623			   ASRCTR_ASRCEi_MASK(index), 0);
 624}
 625
 626/**
 627 * fsl_asrc_get_dma_channel- Get DMA channel according to the pair and direction.
 628 * @pair: pointer to pair
 629 * @dir: DMA direction
 630 */
 631static struct dma_chan *fsl_asrc_get_dma_channel(struct fsl_asrc_pair *pair,
 632						 bool dir)
 633{
 634	struct fsl_asrc *asrc = pair->asrc;
 635	enum asrc_pair_index index = pair->index;
 636	char name[4];
 637
 638	sprintf(name, "%cx%c", dir == IN ? 'r' : 't', index + 'a');
 639
 640	return dma_request_slave_channel(&asrc->pdev->dev, name);
 641}
 642
 643static int fsl_asrc_dai_startup(struct snd_pcm_substream *substream,
 644				struct snd_soc_dai *dai)
 645{
 646	struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai);
 647	struct fsl_asrc_priv *asrc_priv = asrc->private;
 648
 649	/* Odd channel number is not valid for older ASRC (channel_bits==3) */
 650	if (asrc_priv->soc->channel_bits == 3)
 651		snd_pcm_hw_constraint_step(substream->runtime, 0,
 652					   SNDRV_PCM_HW_PARAM_CHANNELS, 2);
 653
 654
 655	return snd_pcm_hw_constraint_list(substream->runtime, 0,
 656			SNDRV_PCM_HW_PARAM_RATE, &fsl_asrc_rate_constraints);
 657}
 658
 659/* Select proper clock source for internal ratio mode */
 660static void fsl_asrc_select_clk(struct fsl_asrc_priv *asrc_priv,
 661				struct fsl_asrc_pair *pair,
 662				int in_rate,
 663				int out_rate)
 664{
 665	struct fsl_asrc_pair_priv *pair_priv = pair->private;
 666	struct asrc_config *config = pair_priv->config;
 667	int rate[2], select_clk[2]; /* Array size 2 means IN and OUT */
 668	int clk_rate, clk_index;
 669	int i, j;
 670
 671	rate[IN] = in_rate;
 672	rate[OUT] = out_rate;
 673
 674	/* Select proper clock source for internal ratio mode */
 675	for (j = 0; j < 2; j++) {
 676		for (i = 0; i < ASRC_CLK_MAP_LEN; i++) {
 677			clk_index = asrc_priv->clk_map[j][i];
 678			clk_rate = clk_get_rate(asrc_priv->asrck_clk[clk_index]);
 679			/* Only match a perfect clock source with no remainder */
 680			if (fsl_asrc_divider_avail(clk_rate, rate[j], NULL))
 681				break;
 682		}
 683
 684		select_clk[j] = i;
 685	}
 686
 687	/* Switch to ideal ratio mode if there is no proper clock source */
 688	if (select_clk[IN] == ASRC_CLK_MAP_LEN || select_clk[OUT] == ASRC_CLK_MAP_LEN) {
 689		select_clk[IN] = INCLK_NONE;
 690		select_clk[OUT] = OUTCLK_ASRCK1_CLK;
 691	}
 692
 693	config->inclk = select_clk[IN];
 694	config->outclk = select_clk[OUT];
 695}
 696
 697static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream,
 698				  struct snd_pcm_hw_params *params,
 699				  struct snd_soc_dai *dai)
 700{
 701	struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai);
 702	struct fsl_asrc_priv *asrc_priv = asrc->private;
 703	struct snd_pcm_runtime *runtime = substream->runtime;
 704	struct fsl_asrc_pair *pair = runtime->private_data;
 705	struct fsl_asrc_pair_priv *pair_priv = pair->private;
 706	unsigned int channels = params_channels(params);
 707	unsigned int rate = params_rate(params);
 708	struct asrc_config config;
 709	int ret;
 710
 711	ret = fsl_asrc_request_pair(channels, pair);
 712	if (ret) {
 713		dev_err(dai->dev, "fail to request asrc pair\n");
 714		return ret;
 715	}
 716
 717	pair_priv->config = &config;
 718
 719	config.pair = pair->index;
 720	config.channel_num = channels;
 721
 722	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 723		config.input_format   = params_format(params);
 724		config.output_format  = asrc->asrc_format;
 725		config.input_sample_rate  = rate;
 726		config.output_sample_rate = asrc->asrc_rate;
 727	} else {
 728		config.input_format   = asrc->asrc_format;
 729		config.output_format  = params_format(params);
 730		config.input_sample_rate  = asrc->asrc_rate;
 731		config.output_sample_rate = rate;
 732	}
 733
 734	fsl_asrc_select_clk(asrc_priv, pair,
 735			    config.input_sample_rate,
 736			    config.output_sample_rate);
 737
 738	ret = fsl_asrc_config_pair(pair, false);
 739	if (ret) {
 740		dev_err(dai->dev, "fail to config asrc pair\n");
 741		return ret;
 742	}
 743
 744	return 0;
 745}
 746
 747static int fsl_asrc_dai_hw_free(struct snd_pcm_substream *substream,
 748				struct snd_soc_dai *dai)
 749{
 750	struct snd_pcm_runtime *runtime = substream->runtime;
 751	struct fsl_asrc_pair *pair = runtime->private_data;
 752
 753	if (pair)
 754		fsl_asrc_release_pair(pair);
 755
 756	return 0;
 757}
 758
 759static int fsl_asrc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 760				struct snd_soc_dai *dai)
 761{
 762	struct snd_pcm_runtime *runtime = substream->runtime;
 763	struct fsl_asrc_pair *pair = runtime->private_data;
 764
 765	switch (cmd) {
 766	case SNDRV_PCM_TRIGGER_START:
 767	case SNDRV_PCM_TRIGGER_RESUME:
 768	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 769		fsl_asrc_start_pair(pair);
 770		break;
 771	case SNDRV_PCM_TRIGGER_STOP:
 772	case SNDRV_PCM_TRIGGER_SUSPEND:
 773	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 774		fsl_asrc_stop_pair(pair);
 775		break;
 776	default:
 777		return -EINVAL;
 778	}
 779
 780	return 0;
 781}
 782
 783static int fsl_asrc_dai_probe(struct snd_soc_dai *dai)
 784{
 785	struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai);
 786
 787	snd_soc_dai_init_dma_data(dai, &asrc->dma_params_tx,
 788				  &asrc->dma_params_rx);
 789
 790	return 0;
 791}
 792
 793static const struct snd_soc_dai_ops fsl_asrc_dai_ops = {
 794	.probe		= fsl_asrc_dai_probe,
 795	.startup	= fsl_asrc_dai_startup,
 796	.hw_params	= fsl_asrc_dai_hw_params,
 797	.hw_free	= fsl_asrc_dai_hw_free,
 798	.trigger	= fsl_asrc_dai_trigger,
 799};
 800
 801#define FSL_ASRC_FORMATS	(SNDRV_PCM_FMTBIT_S24_LE | \
 802				 SNDRV_PCM_FMTBIT_S16_LE | \
 803				 SNDRV_PCM_FMTBIT_S24_3LE)
 804
 805static struct snd_soc_dai_driver fsl_asrc_dai = {
 806	.playback = {
 807		.stream_name = "ASRC-Playback",
 808		.channels_min = 1,
 809		.channels_max = 10,
 810		.rate_min = 5512,
 811		.rate_max = 192000,
 812		.rates = SNDRV_PCM_RATE_KNOT,
 813		.formats = FSL_ASRC_FORMATS |
 814			   SNDRV_PCM_FMTBIT_S8,
 815	},
 816	.capture = {
 817		.stream_name = "ASRC-Capture",
 818		.channels_min = 1,
 819		.channels_max = 10,
 820		.rate_min = 5512,
 821		.rate_max = 192000,
 822		.rates = SNDRV_PCM_RATE_KNOT,
 823		.formats = FSL_ASRC_FORMATS,
 824	},
 825	.ops = &fsl_asrc_dai_ops,
 826};
 827
 828static bool fsl_asrc_readable_reg(struct device *dev, unsigned int reg)
 829{
 830	switch (reg) {
 831	case REG_ASRCTR:
 832	case REG_ASRIER:
 833	case REG_ASRCNCR:
 834	case REG_ASRCFG:
 835	case REG_ASRCSR:
 836	case REG_ASRCDR1:
 837	case REG_ASRCDR2:
 838	case REG_ASRSTR:
 839	case REG_ASRPM1:
 840	case REG_ASRPM2:
 841	case REG_ASRPM3:
 842	case REG_ASRPM4:
 843	case REG_ASRPM5:
 844	case REG_ASRTFR1:
 845	case REG_ASRCCR:
 846	case REG_ASRDOA:
 847	case REG_ASRDOB:
 848	case REG_ASRDOC:
 849	case REG_ASRIDRHA:
 850	case REG_ASRIDRLA:
 851	case REG_ASRIDRHB:
 852	case REG_ASRIDRLB:
 853	case REG_ASRIDRHC:
 854	case REG_ASRIDRLC:
 855	case REG_ASR76K:
 856	case REG_ASR56K:
 857	case REG_ASRMCRA:
 858	case REG_ASRFSTA:
 859	case REG_ASRMCRB:
 860	case REG_ASRFSTB:
 861	case REG_ASRMCRC:
 862	case REG_ASRFSTC:
 863	case REG_ASRMCR1A:
 864	case REG_ASRMCR1B:
 865	case REG_ASRMCR1C:
 866		return true;
 867	default:
 868		return false;
 869	}
 870}
 871
 872static bool fsl_asrc_volatile_reg(struct device *dev, unsigned int reg)
 873{
 874	switch (reg) {
 875	case REG_ASRSTR:
 876	case REG_ASRDIA:
 877	case REG_ASRDIB:
 878	case REG_ASRDIC:
 879	case REG_ASRDOA:
 880	case REG_ASRDOB:
 881	case REG_ASRDOC:
 882	case REG_ASRFSTA:
 883	case REG_ASRFSTB:
 884	case REG_ASRFSTC:
 885	case REG_ASRCFG:
 886		return true;
 887	default:
 888		return false;
 889	}
 890}
 891
 892static bool fsl_asrc_writeable_reg(struct device *dev, unsigned int reg)
 893{
 894	switch (reg) {
 895	case REG_ASRCTR:
 896	case REG_ASRIER:
 897	case REG_ASRCNCR:
 898	case REG_ASRCFG:
 899	case REG_ASRCSR:
 900	case REG_ASRCDR1:
 901	case REG_ASRCDR2:
 902	case REG_ASRSTR:
 903	case REG_ASRPM1:
 904	case REG_ASRPM2:
 905	case REG_ASRPM3:
 906	case REG_ASRPM4:
 907	case REG_ASRPM5:
 908	case REG_ASRTFR1:
 909	case REG_ASRCCR:
 910	case REG_ASRDIA:
 911	case REG_ASRDIB:
 912	case REG_ASRDIC:
 913	case REG_ASRIDRHA:
 914	case REG_ASRIDRLA:
 915	case REG_ASRIDRHB:
 916	case REG_ASRIDRLB:
 917	case REG_ASRIDRHC:
 918	case REG_ASRIDRLC:
 919	case REG_ASR76K:
 920	case REG_ASR56K:
 921	case REG_ASRMCRA:
 922	case REG_ASRMCRB:
 923	case REG_ASRMCRC:
 924	case REG_ASRMCR1A:
 925	case REG_ASRMCR1B:
 926	case REG_ASRMCR1C:
 927		return true;
 928	default:
 929		return false;
 930	}
 931}
 932
 933static struct reg_default fsl_asrc_reg[] = {
 934	{ REG_ASRCTR, 0x0000 }, { REG_ASRIER, 0x0000 },
 935	{ REG_ASRCNCR, 0x0000 }, { REG_ASRCFG, 0x0000 },
 936	{ REG_ASRCSR, 0x0000 }, { REG_ASRCDR1, 0x0000 },
 937	{ REG_ASRCDR2, 0x0000 }, { REG_ASRSTR, 0x0000 },
 938	{ REG_ASRRA, 0x0000 }, { REG_ASRRB, 0x0000 },
 939	{ REG_ASRRC, 0x0000 }, { REG_ASRPM1, 0x0000 },
 940	{ REG_ASRPM2, 0x0000 }, { REG_ASRPM3, 0x0000 },
 941	{ REG_ASRPM4, 0x0000 }, { REG_ASRPM5, 0x0000 },
 942	{ REG_ASRTFR1, 0x0000 }, { REG_ASRCCR, 0x0000 },
 943	{ REG_ASRDIA, 0x0000 }, { REG_ASRDOA, 0x0000 },
 944	{ REG_ASRDIB, 0x0000 }, { REG_ASRDOB, 0x0000 },
 945	{ REG_ASRDIC, 0x0000 }, { REG_ASRDOC, 0x0000 },
 946	{ REG_ASRIDRHA, 0x0000 }, { REG_ASRIDRLA, 0x0000 },
 947	{ REG_ASRIDRHB, 0x0000 }, { REG_ASRIDRLB, 0x0000 },
 948	{ REG_ASRIDRHC, 0x0000 }, { REG_ASRIDRLC, 0x0000 },
 949	{ REG_ASR76K, 0x0A47 }, { REG_ASR56K, 0x0DF3 },
 950	{ REG_ASRMCRA, 0x0000 }, { REG_ASRFSTA, 0x0000 },
 951	{ REG_ASRMCRB, 0x0000 }, { REG_ASRFSTB, 0x0000 },
 952	{ REG_ASRMCRC, 0x0000 }, { REG_ASRFSTC, 0x0000 },
 953	{ REG_ASRMCR1A, 0x0000 }, { REG_ASRMCR1B, 0x0000 },
 954	{ REG_ASRMCR1C, 0x0000 },
 955};
 956
 957static const struct regmap_config fsl_asrc_regmap_config = {
 958	.reg_bits = 32,
 959	.reg_stride = 4,
 960	.val_bits = 32,
 961
 962	.max_register = REG_ASRMCR1C,
 963	.reg_defaults = fsl_asrc_reg,
 964	.num_reg_defaults = ARRAY_SIZE(fsl_asrc_reg),
 965	.readable_reg = fsl_asrc_readable_reg,
 966	.volatile_reg = fsl_asrc_volatile_reg,
 967	.writeable_reg = fsl_asrc_writeable_reg,
 968	.cache_type = REGCACHE_FLAT,
 969};
 970
 971/**
 972 * fsl_asrc_init - Initialize ASRC registers with a default configuration
 973 * @asrc: ASRC context
 974 */
 975static int fsl_asrc_init(struct fsl_asrc *asrc)
 976{
 977	unsigned long ipg_rate;
 978
 979	/* Halt ASRC internal FP when input FIFO needs data for pair A, B, C */
 980	regmap_write(asrc->regmap, REG_ASRCTR, ASRCTR_ASRCEN);
 981
 982	/* Disable interrupt by default */
 983	regmap_write(asrc->regmap, REG_ASRIER, 0x0);
 984
 985	/* Apply recommended settings for parameters from Reference Manual */
 986	regmap_write(asrc->regmap, REG_ASRPM1, 0x7fffff);
 987	regmap_write(asrc->regmap, REG_ASRPM2, 0x255555);
 988	regmap_write(asrc->regmap, REG_ASRPM3, 0xff7280);
 989	regmap_write(asrc->regmap, REG_ASRPM4, 0xff7280);
 990	regmap_write(asrc->regmap, REG_ASRPM5, 0xff7280);
 991
 992	/* Base address for task queue FIFO. Set to 0x7C */
 993	regmap_update_bits(asrc->regmap, REG_ASRTFR1,
 994			   ASRTFR1_TF_BASE_MASK, ASRTFR1_TF_BASE(0xfc));
 995
 996	/*
 997	 * Set the period of the 76KHz and 56KHz sampling clocks based on
 998	 * the ASRC processing clock.
 999	 * On iMX6, ipg_clk = 133MHz, REG_ASR76K = 0x06D6, REG_ASR56K = 0x0947
1000	 */
1001	ipg_rate = clk_get_rate(asrc->ipg_clk);
1002	regmap_write(asrc->regmap, REG_ASR76K, ipg_rate / 76000);
1003	return regmap_write(asrc->regmap, REG_ASR56K, ipg_rate / 56000);
1004}
1005
1006/**
1007 * fsl_asrc_isr- Interrupt handler for ASRC
1008 * @irq: irq number
1009 * @dev_id: ASRC context
1010 */
1011static irqreturn_t fsl_asrc_isr(int irq, void *dev_id)
1012{
1013	struct fsl_asrc *asrc = (struct fsl_asrc *)dev_id;
1014	struct device *dev = &asrc->pdev->dev;
1015	enum asrc_pair_index index;
1016	u32 status;
1017
1018	regmap_read(asrc->regmap, REG_ASRSTR, &status);
1019
1020	/* Clean overload error */
1021	regmap_write(asrc->regmap, REG_ASRSTR, ASRSTR_AOLE);
1022
1023	/*
1024	 * We here use dev_dbg() for all exceptions because ASRC itself does
1025	 * not care if FIFO overflowed or underrun while a warning in the
1026	 * interrupt would result a ridged conversion.
1027	 */
1028	for (index = ASRC_PAIR_A; index < ASRC_PAIR_MAX_NUM; index++) {
1029		if (!asrc->pair[index])
1030			continue;
1031
1032		if (status & ASRSTR_ATQOL) {
1033			asrc->pair[index]->error |= ASRC_TASK_Q_OVERLOAD;
1034			dev_dbg(dev, "ASRC Task Queue FIFO overload\n");
1035		}
1036
1037		if (status & ASRSTR_AOOL(index)) {
1038			asrc->pair[index]->error |= ASRC_OUTPUT_TASK_OVERLOAD;
1039			pair_dbg("Output Task Overload\n");
1040		}
1041
1042		if (status & ASRSTR_AIOL(index)) {
1043			asrc->pair[index]->error |= ASRC_INPUT_TASK_OVERLOAD;
1044			pair_dbg("Input Task Overload\n");
1045		}
1046
1047		if (status & ASRSTR_AODO(index)) {
1048			asrc->pair[index]->error |= ASRC_OUTPUT_BUFFER_OVERFLOW;
1049			pair_dbg("Output Data Buffer has overflowed\n");
1050		}
1051
1052		if (status & ASRSTR_AIDU(index)) {
1053			asrc->pair[index]->error |= ASRC_INPUT_BUFFER_UNDERRUN;
1054			pair_dbg("Input Data Buffer has underflowed\n");
1055		}
1056	}
1057
1058	return IRQ_HANDLED;
1059}
1060
1061static int fsl_asrc_get_fifo_addr(u8 dir, enum asrc_pair_index index)
1062{
1063	return REG_ASRDx(dir, index);
1064}
1065
1066static int fsl_asrc_runtime_resume(struct device *dev);
1067static int fsl_asrc_runtime_suspend(struct device *dev);
1068
1069static int fsl_asrc_probe(struct platform_device *pdev)
1070{
1071	struct device_node *np = pdev->dev.of_node;
1072	struct fsl_asrc_priv *asrc_priv;
1073	struct fsl_asrc *asrc;
1074	struct resource *res;
1075	void __iomem *regs;
1076	int irq, ret, i;
1077	u32 asrc_fmt = 0;
1078	u32 map_idx;
1079	char tmp[16];
1080	u32 width;
1081
1082	asrc = devm_kzalloc(&pdev->dev, sizeof(*asrc), GFP_KERNEL);
1083	if (!asrc)
1084		return -ENOMEM;
1085
1086	asrc_priv = devm_kzalloc(&pdev->dev, sizeof(*asrc_priv), GFP_KERNEL);
1087	if (!asrc_priv)
1088		return -ENOMEM;
1089
1090	asrc->pdev = pdev;
1091	asrc->private = asrc_priv;
1092
1093	/* Get the addresses and IRQ */
1094	regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1095	if (IS_ERR(regs))
1096		return PTR_ERR(regs);
1097
1098	asrc->paddr = res->start;
1099
1100	asrc->regmap = devm_regmap_init_mmio(&pdev->dev, regs, &fsl_asrc_regmap_config);
1101	if (IS_ERR(asrc->regmap)) {
1102		dev_err(&pdev->dev, "failed to init regmap\n");
1103		return PTR_ERR(asrc->regmap);
1104	}
1105
1106	irq = platform_get_irq(pdev, 0);
1107	if (irq < 0)
1108		return irq;
1109
1110	ret = devm_request_irq(&pdev->dev, irq, fsl_asrc_isr, 0,
1111			       dev_name(&pdev->dev), asrc);
1112	if (ret) {
1113		dev_err(&pdev->dev, "failed to claim irq %u: %d\n", irq, ret);
1114		return ret;
1115	}
1116
1117	asrc->mem_clk = devm_clk_get(&pdev->dev, "mem");
1118	if (IS_ERR(asrc->mem_clk)) {
1119		dev_err(&pdev->dev, "failed to get mem clock\n");
1120		return PTR_ERR(asrc->mem_clk);
1121	}
1122
1123	asrc->ipg_clk = devm_clk_get(&pdev->dev, "ipg");
1124	if (IS_ERR(asrc->ipg_clk)) {
1125		dev_err(&pdev->dev, "failed to get ipg clock\n");
1126		return PTR_ERR(asrc->ipg_clk);
1127	}
1128
1129	asrc->spba_clk = devm_clk_get(&pdev->dev, "spba");
1130	if (IS_ERR(asrc->spba_clk))
1131		dev_warn(&pdev->dev, "failed to get spba clock\n");
1132
1133	for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
1134		sprintf(tmp, "asrck_%x", i);
1135		asrc_priv->asrck_clk[i] = devm_clk_get(&pdev->dev, tmp);
1136		if (IS_ERR(asrc_priv->asrck_clk[i])) {
1137			dev_err(&pdev->dev, "failed to get %s clock\n", tmp);
1138			return PTR_ERR(asrc_priv->asrck_clk[i]);
1139		}
1140	}
1141
1142	asrc_priv->soc = of_device_get_match_data(&pdev->dev);
1143	asrc->use_edma = asrc_priv->soc->use_edma;
1144	asrc->get_dma_channel = fsl_asrc_get_dma_channel;
1145	asrc->request_pair = fsl_asrc_request_pair;
1146	asrc->release_pair = fsl_asrc_release_pair;
1147	asrc->get_fifo_addr = fsl_asrc_get_fifo_addr;
1148	asrc->pair_priv_size = sizeof(struct fsl_asrc_pair_priv);
1149
1150	if (of_device_is_compatible(np, "fsl,imx35-asrc")) {
1151		asrc_priv->clk_map[IN] = input_clk_map_imx35;
1152		asrc_priv->clk_map[OUT] = output_clk_map_imx35;
1153	} else if (of_device_is_compatible(np, "fsl,imx53-asrc")) {
1154		asrc_priv->clk_map[IN] = input_clk_map_imx53;
1155		asrc_priv->clk_map[OUT] = output_clk_map_imx53;
1156	} else if (of_device_is_compatible(np, "fsl,imx8qm-asrc") ||
1157		   of_device_is_compatible(np, "fsl,imx8qxp-asrc")) {
1158		ret = of_property_read_u32(np, "fsl,asrc-clk-map", &map_idx);
1159		if (ret) {
1160			dev_err(&pdev->dev, "failed to get clk map index\n");
1161			return ret;
1162		}
1163
1164		if (map_idx > 1) {
1165			dev_err(&pdev->dev, "unsupported clk map index\n");
1166			return -EINVAL;
1167		}
1168		if (of_device_is_compatible(np, "fsl,imx8qm-asrc")) {
1169			asrc_priv->clk_map[IN] = clk_map_imx8qm[map_idx];
1170			asrc_priv->clk_map[OUT] = clk_map_imx8qm[map_idx];
1171		} else {
1172			asrc_priv->clk_map[IN] = clk_map_imx8qxp[map_idx];
1173			asrc_priv->clk_map[OUT] = clk_map_imx8qxp[map_idx];
1174		}
1175	}
1176
1177	asrc->channel_avail = 10;
1178
1179	ret = of_property_read_u32(np, "fsl,asrc-rate",
1180				   &asrc->asrc_rate);
1181	if (ret) {
1182		dev_err(&pdev->dev, "failed to get output rate\n");
1183		return ret;
1184	}
1185
1186	ret = of_property_read_u32(np, "fsl,asrc-format", &asrc_fmt);
1187	asrc->asrc_format = (__force snd_pcm_format_t)asrc_fmt;
1188	if (ret) {
1189		ret = of_property_read_u32(np, "fsl,asrc-width", &width);
1190		if (ret) {
1191			dev_err(&pdev->dev, "failed to decide output format\n");
1192			return ret;
1193		}
1194
1195		switch (width) {
1196		case 16:
1197			asrc->asrc_format = SNDRV_PCM_FORMAT_S16_LE;
1198			break;
1199		case 24:
1200			asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE;
1201			break;
1202		default:
1203			dev_warn(&pdev->dev,
1204				 "unsupported width, use default S24_LE\n");
1205			asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE;
1206			break;
1207		}
1208	}
1209
1210	if (!(FSL_ASRC_FORMATS & pcm_format_to_bits(asrc->asrc_format))) {
1211		dev_warn(&pdev->dev, "unsupported width, use default S24_LE\n");
1212		asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE;
1213	}
1214
1215	platform_set_drvdata(pdev, asrc);
1216	spin_lock_init(&asrc->lock);
1217	pm_runtime_enable(&pdev->dev);
1218	if (!pm_runtime_enabled(&pdev->dev)) {
1219		ret = fsl_asrc_runtime_resume(&pdev->dev);
1220		if (ret)
1221			goto err_pm_disable;
1222	}
1223
1224	ret = pm_runtime_resume_and_get(&pdev->dev);
1225	if (ret < 0)
1226		goto err_pm_get_sync;
1227
1228	ret = fsl_asrc_init(asrc);
1229	if (ret) {
1230		dev_err(&pdev->dev, "failed to init asrc %d\n", ret);
1231		goto err_pm_get_sync;
1232	}
1233
1234	ret = pm_runtime_put_sync(&pdev->dev);
1235	if (ret < 0 && ret != -ENOSYS)
1236		goto err_pm_get_sync;
1237
1238	ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component,
1239					      &fsl_asrc_dai, 1);
1240	if (ret) {
1241		dev_err(&pdev->dev, "failed to register ASoC DAI\n");
1242		goto err_pm_get_sync;
1243	}
1244
1245	return 0;
1246
1247err_pm_get_sync:
1248	if (!pm_runtime_status_suspended(&pdev->dev))
1249		fsl_asrc_runtime_suspend(&pdev->dev);
1250err_pm_disable:
1251	pm_runtime_disable(&pdev->dev);
1252	return ret;
1253}
1254
1255static void fsl_asrc_remove(struct platform_device *pdev)
1256{
1257	pm_runtime_disable(&pdev->dev);
1258	if (!pm_runtime_status_suspended(&pdev->dev))
1259		fsl_asrc_runtime_suspend(&pdev->dev);
1260}
1261
1262static int fsl_asrc_runtime_resume(struct device *dev)
1263{
1264	struct fsl_asrc *asrc = dev_get_drvdata(dev);
1265	struct fsl_asrc_priv *asrc_priv = asrc->private;
1266	int reg, retry = INIT_RETRY_NUM;
1267	int i, ret;
1268	u32 asrctr;
1269
1270	ret = clk_prepare_enable(asrc->mem_clk);
1271	if (ret)
1272		return ret;
1273	ret = clk_prepare_enable(asrc->ipg_clk);
1274	if (ret)
1275		goto disable_mem_clk;
1276	if (!IS_ERR(asrc->spba_clk)) {
1277		ret = clk_prepare_enable(asrc->spba_clk);
1278		if (ret)
1279			goto disable_ipg_clk;
1280	}
1281	for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
1282		ret = clk_prepare_enable(asrc_priv->asrck_clk[i]);
1283		if (ret)
1284			goto disable_asrck_clk;
1285	}
1286
1287	/* Stop all pairs provisionally */
1288	regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
1289	regmap_update_bits(asrc->regmap, REG_ASRCTR,
1290			   ASRCTR_ASRCEi_ALL_MASK, 0);
1291
1292	/* Restore all registers */
1293	regcache_cache_only(asrc->regmap, false);
1294	regcache_mark_dirty(asrc->regmap);
1295	regcache_sync(asrc->regmap);
1296
1297	regmap_update_bits(asrc->regmap, REG_ASRCFG,
1298			   ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
1299			   ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
1300
1301	/* Restart enabled pairs */
1302	regmap_update_bits(asrc->regmap, REG_ASRCTR,
1303			   ASRCTR_ASRCEi_ALL_MASK, asrctr);
1304
1305	/* Wait for status of initialization for all enabled pairs */
1306	do {
1307		udelay(5);
1308		regmap_read(asrc->regmap, REG_ASRCFG, &reg);
1309		reg = (reg >> ASRCFG_INIRQi_SHIFT(0)) & 0x7;
1310	} while ((reg != ((asrctr >> ASRCTR_ASRCEi_SHIFT(0)) & 0x7)) && --retry);
1311
1312	/*
1313	 * NOTE: Doesn't treat initialization timeout as an error
1314	 * Some of the pairs may success, then still can continue.
1315	 */
1316	if (!retry) {
1317		for (i = ASRC_PAIR_A; i < ASRC_PAIR_MAX_NUM; i++) {
1318			if ((asrctr & ASRCTR_ASRCEi_MASK(i)) && !(reg & (1 << i)))
1319				dev_warn(dev, "Pair %c initialization isn't finished\n", 'A' + i);
1320		}
1321	}
1322
1323	return 0;
1324
1325disable_asrck_clk:
1326	for (i--; i >= 0; i--)
1327		clk_disable_unprepare(asrc_priv->asrck_clk[i]);
1328	if (!IS_ERR(asrc->spba_clk))
1329		clk_disable_unprepare(asrc->spba_clk);
1330disable_ipg_clk:
1331	clk_disable_unprepare(asrc->ipg_clk);
1332disable_mem_clk:
1333	clk_disable_unprepare(asrc->mem_clk);
1334	return ret;
1335}
1336
1337static int fsl_asrc_runtime_suspend(struct device *dev)
1338{
1339	struct fsl_asrc *asrc = dev_get_drvdata(dev);
1340	struct fsl_asrc_priv *asrc_priv = asrc->private;
1341	int i;
1342
1343	regmap_read(asrc->regmap, REG_ASRCFG,
1344		    &asrc_priv->regcache_cfg);
1345
1346	regcache_cache_only(asrc->regmap, true);
1347
1348	for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
1349		clk_disable_unprepare(asrc_priv->asrck_clk[i]);
1350	if (!IS_ERR(asrc->spba_clk))
1351		clk_disable_unprepare(asrc->spba_clk);
1352	clk_disable_unprepare(asrc->ipg_clk);
1353	clk_disable_unprepare(asrc->mem_clk);
1354
1355	return 0;
1356}
1357
1358static const struct dev_pm_ops fsl_asrc_pm = {
1359	SET_RUNTIME_PM_OPS(fsl_asrc_runtime_suspend, fsl_asrc_runtime_resume, NULL)
1360	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
1361				pm_runtime_force_resume)
1362};
1363
1364static const struct fsl_asrc_soc_data fsl_asrc_imx35_data = {
1365	.use_edma = false,
1366	.channel_bits = 3,
1367};
1368
1369static const struct fsl_asrc_soc_data fsl_asrc_imx53_data = {
1370	.use_edma = false,
1371	.channel_bits = 4,
1372};
1373
1374static const struct fsl_asrc_soc_data fsl_asrc_imx8qm_data = {
1375	.use_edma = true,
1376	.channel_bits = 4,
1377};
1378
1379static const struct fsl_asrc_soc_data fsl_asrc_imx8qxp_data = {
1380	.use_edma = true,
1381	.channel_bits = 4,
1382};
1383
1384static const struct of_device_id fsl_asrc_ids[] = {
1385	{ .compatible = "fsl,imx35-asrc", .data = &fsl_asrc_imx35_data },
1386	{ .compatible = "fsl,imx53-asrc", .data = &fsl_asrc_imx53_data },
1387	{ .compatible = "fsl,imx8qm-asrc", .data = &fsl_asrc_imx8qm_data },
1388	{ .compatible = "fsl,imx8qxp-asrc", .data = &fsl_asrc_imx8qxp_data },
1389	{}
1390};
1391MODULE_DEVICE_TABLE(of, fsl_asrc_ids);
1392
1393static struct platform_driver fsl_asrc_driver = {
1394	.probe = fsl_asrc_probe,
1395	.remove = fsl_asrc_remove,
1396	.driver = {
1397		.name = "fsl-asrc",
1398		.of_match_table = fsl_asrc_ids,
1399		.pm = &fsl_asrc_pm,
1400	},
1401};
1402module_platform_driver(fsl_asrc_driver);
1403
1404MODULE_DESCRIPTION("Freescale ASRC ASoC driver");
1405MODULE_AUTHOR("Nicolin Chen <nicoleotsuka@gmail.com>");
1406MODULE_ALIAS("platform:fsl-asrc");
1407MODULE_LICENSE("GPL v2");
v6.8
   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 */
  35static 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
  40static 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 */
  49static 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
  55static 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 */
  62static 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
  69static 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 */
  83static 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
  96static 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 */
 113static 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 */
 127static 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 */
 171static 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 */
 214static 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 */
 258static 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 */
 283static 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 */
 304static 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 */
 323static 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 */
 377static 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_USRi_MASK(index), 0);
 521
 522	/* Set the input and output clock sources */
 523	regmap_update_bits(asrc->regmap, REG_ASRCSR,
 524			   ASRCSR_AICSi_MASK(index) | ASRCSR_AOCSi_MASK(index),
 525			   ASRCSR_AICS(index, clk_index[IN]) |
 526			   ASRCSR_AOCS(index, clk_index[OUT]));
 527
 528	/* Calculate the input clock divisors */
 529	indiv = fsl_asrc_cal_asrck_divisor(pair, div[IN]);
 530	outdiv = fsl_asrc_cal_asrck_divisor(pair, div[OUT]);
 531
 532	/* Suppose indiv and outdiv includes prescaler, so add its MASK too */
 533	regmap_update_bits(asrc->regmap, REG_ASRCDR(index),
 534			   ASRCDRi_AOCPi_MASK(index) | ASRCDRi_AICPi_MASK(index) |
 535			   ASRCDRi_AOCDi_MASK(index) | ASRCDRi_AICDi_MASK(index),
 536			   ASRCDRi_AOCP(index, outdiv) | ASRCDRi_AICP(index, indiv));
 537
 538	/* Implement word_width configurations */
 539	regmap_update_bits(asrc->regmap, REG_ASRMCR1(index),
 540			   ASRMCR1i_OW16_MASK | ASRMCR1i_IWD_MASK,
 541			   ASRMCR1i_OW16(output_word_width) |
 542			   ASRMCR1i_IWD(input_word_width));
 543
 544	/* Enable BUFFER STALL */
 545	regmap_update_bits(asrc->regmap, REG_ASRMCR(index),
 546			   ASRMCRi_BUFSTALLi_MASK, ASRMCRi_BUFSTALLi);
 547
 548	/* Set default thresholds for input and output FIFO */
 549	fsl_asrc_set_watermarks(pair, ASRC_INPUTFIFO_THRESHOLD,
 550				ASRC_INPUTFIFO_THRESHOLD);
 551
 552	/* Configure the following only for Ideal Ratio mode */
 553	if (!ideal)
 554		return 0;
 555
 556	/* Clear ASTSx bit to use Ideal Ratio mode */
 557	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 558			   ASRCTR_ATSi_MASK(index), 0);
 559
 560	/* Enable Ideal Ratio mode */
 561	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 562			   ASRCTR_IDRi_MASK(index) | ASRCTR_USRi_MASK(index),
 563			   ASRCTR_IDR(index) | ASRCTR_USR(index));
 564
 565	fsl_asrc_sel_proc(inrate, outrate, &pre_proc, &post_proc);
 566
 567	/* Apply configurations for pre- and post-processing */
 568	regmap_update_bits(asrc->regmap, REG_ASRCFG,
 569			   ASRCFG_PREMODi_MASK(index) |	ASRCFG_POSTMODi_MASK(index),
 570			   ASRCFG_PREMOD(index, pre_proc) |
 571			   ASRCFG_POSTMOD(index, post_proc));
 572
 573	return fsl_asrc_set_ideal_ratio(pair, inrate, outrate);
 574}
 575
 576/**
 577 * fsl_asrc_start_pair - Start the assigned ASRC pair
 578 * @pair: pointer to pair
 579 *
 580 * It enables the assigned pair and makes it stopped at the stall level.
 581 */
 582static void fsl_asrc_start_pair(struct fsl_asrc_pair *pair)
 583{
 584	struct fsl_asrc *asrc = pair->asrc;
 585	enum asrc_pair_index index = pair->index;
 586	int reg, retry = INIT_RETRY_NUM, i;
 587
 588	/* Enable the current pair */
 589	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 590			   ASRCTR_ASRCEi_MASK(index), ASRCTR_ASRCE(index));
 591
 592	/* Wait for status of initialization */
 593	do {
 594		udelay(5);
 595		regmap_read(asrc->regmap, REG_ASRCFG, &reg);
 596		reg &= ASRCFG_INIRQi_MASK(index);
 597	} while (!reg && --retry);
 598
 599	/* NOTE: Doesn't treat initialization timeout as an error */
 600	if (!retry)
 601		pair_warn("initialization isn't finished\n");
 602
 603	/* Make the input fifo to ASRC STALL level */
 604	regmap_read(asrc->regmap, REG_ASRCNCR, &reg);
 605	for (i = 0; i < pair->channels * 4; i++)
 606		regmap_write(asrc->regmap, REG_ASRDI(index), 0);
 607
 608	/* Enable overload interrupt */
 609	regmap_write(asrc->regmap, REG_ASRIER, ASRIER_AOLIE);
 610}
 611
 612/**
 613 * fsl_asrc_stop_pair - Stop the assigned ASRC pair
 614 * @pair: pointer to pair
 615 */
 616static void fsl_asrc_stop_pair(struct fsl_asrc_pair *pair)
 617{
 618	struct fsl_asrc *asrc = pair->asrc;
 619	enum asrc_pair_index index = pair->index;
 620
 621	/* Stop the current pair */
 622	regmap_update_bits(asrc->regmap, REG_ASRCTR,
 623			   ASRCTR_ASRCEi_MASK(index), 0);
 624}
 625
 626/**
 627 * fsl_asrc_get_dma_channel- Get DMA channel according to the pair and direction.
 628 * @pair: pointer to pair
 629 * @dir: DMA direction
 630 */
 631static struct dma_chan *fsl_asrc_get_dma_channel(struct fsl_asrc_pair *pair,
 632						 bool dir)
 633{
 634	struct fsl_asrc *asrc = pair->asrc;
 635	enum asrc_pair_index index = pair->index;
 636	char name[4];
 637
 638	sprintf(name, "%cx%c", dir == IN ? 'r' : 't', index + 'a');
 639
 640	return dma_request_slave_channel(&asrc->pdev->dev, name);
 641}
 642
 643static int fsl_asrc_dai_startup(struct snd_pcm_substream *substream,
 644				struct snd_soc_dai *dai)
 645{
 646	struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai);
 647	struct fsl_asrc_priv *asrc_priv = asrc->private;
 648
 649	/* Odd channel number is not valid for older ASRC (channel_bits==3) */
 650	if (asrc_priv->soc->channel_bits == 3)
 651		snd_pcm_hw_constraint_step(substream->runtime, 0,
 652					   SNDRV_PCM_HW_PARAM_CHANNELS, 2);
 653
 654
 655	return snd_pcm_hw_constraint_list(substream->runtime, 0,
 656			SNDRV_PCM_HW_PARAM_RATE, &fsl_asrc_rate_constraints);
 657}
 658
 659/* Select proper clock source for internal ratio mode */
 660static void fsl_asrc_select_clk(struct fsl_asrc_priv *asrc_priv,
 661				struct fsl_asrc_pair *pair,
 662				int in_rate,
 663				int out_rate)
 664{
 665	struct fsl_asrc_pair_priv *pair_priv = pair->private;
 666	struct asrc_config *config = pair_priv->config;
 667	int rate[2], select_clk[2]; /* Array size 2 means IN and OUT */
 668	int clk_rate, clk_index;
 669	int i, j;
 670
 671	rate[IN] = in_rate;
 672	rate[OUT] = out_rate;
 673
 674	/* Select proper clock source for internal ratio mode */
 675	for (j = 0; j < 2; j++) {
 676		for (i = 0; i < ASRC_CLK_MAP_LEN; i++) {
 677			clk_index = asrc_priv->clk_map[j][i];
 678			clk_rate = clk_get_rate(asrc_priv->asrck_clk[clk_index]);
 679			/* Only match a perfect clock source with no remainder */
 680			if (fsl_asrc_divider_avail(clk_rate, rate[j], NULL))
 681				break;
 682		}
 683
 684		select_clk[j] = i;
 685	}
 686
 687	/* Switch to ideal ratio mode if there is no proper clock source */
 688	if (select_clk[IN] == ASRC_CLK_MAP_LEN || select_clk[OUT] == ASRC_CLK_MAP_LEN) {
 689		select_clk[IN] = INCLK_NONE;
 690		select_clk[OUT] = OUTCLK_ASRCK1_CLK;
 691	}
 692
 693	config->inclk = select_clk[IN];
 694	config->outclk = select_clk[OUT];
 695}
 696
 697static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream,
 698				  struct snd_pcm_hw_params *params,
 699				  struct snd_soc_dai *dai)
 700{
 701	struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai);
 702	struct fsl_asrc_priv *asrc_priv = asrc->private;
 703	struct snd_pcm_runtime *runtime = substream->runtime;
 704	struct fsl_asrc_pair *pair = runtime->private_data;
 705	struct fsl_asrc_pair_priv *pair_priv = pair->private;
 706	unsigned int channels = params_channels(params);
 707	unsigned int rate = params_rate(params);
 708	struct asrc_config config;
 709	int ret;
 710
 711	ret = fsl_asrc_request_pair(channels, pair);
 712	if (ret) {
 713		dev_err(dai->dev, "fail to request asrc pair\n");
 714		return ret;
 715	}
 716
 717	pair_priv->config = &config;
 718
 719	config.pair = pair->index;
 720	config.channel_num = channels;
 721
 722	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 723		config.input_format   = params_format(params);
 724		config.output_format  = asrc->asrc_format;
 725		config.input_sample_rate  = rate;
 726		config.output_sample_rate = asrc->asrc_rate;
 727	} else {
 728		config.input_format   = asrc->asrc_format;
 729		config.output_format  = params_format(params);
 730		config.input_sample_rate  = asrc->asrc_rate;
 731		config.output_sample_rate = rate;
 732	}
 733
 734	fsl_asrc_select_clk(asrc_priv, pair,
 735			    config.input_sample_rate,
 736			    config.output_sample_rate);
 737
 738	ret = fsl_asrc_config_pair(pair, false);
 739	if (ret) {
 740		dev_err(dai->dev, "fail to config asrc pair\n");
 741		return ret;
 742	}
 743
 744	return 0;
 745}
 746
 747static int fsl_asrc_dai_hw_free(struct snd_pcm_substream *substream,
 748				struct snd_soc_dai *dai)
 749{
 750	struct snd_pcm_runtime *runtime = substream->runtime;
 751	struct fsl_asrc_pair *pair = runtime->private_data;
 752
 753	if (pair)
 754		fsl_asrc_release_pair(pair);
 755
 756	return 0;
 757}
 758
 759static int fsl_asrc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 760				struct snd_soc_dai *dai)
 761{
 762	struct snd_pcm_runtime *runtime = substream->runtime;
 763	struct fsl_asrc_pair *pair = runtime->private_data;
 764
 765	switch (cmd) {
 766	case SNDRV_PCM_TRIGGER_START:
 767	case SNDRV_PCM_TRIGGER_RESUME:
 768	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 769		fsl_asrc_start_pair(pair);
 770		break;
 771	case SNDRV_PCM_TRIGGER_STOP:
 772	case SNDRV_PCM_TRIGGER_SUSPEND:
 773	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 774		fsl_asrc_stop_pair(pair);
 775		break;
 776	default:
 777		return -EINVAL;
 778	}
 779
 780	return 0;
 781}
 782
 783static int fsl_asrc_dai_probe(struct snd_soc_dai *dai)
 784{
 785	struct fsl_asrc *asrc = snd_soc_dai_get_drvdata(dai);
 786
 787	snd_soc_dai_init_dma_data(dai, &asrc->dma_params_tx,
 788				  &asrc->dma_params_rx);
 789
 790	return 0;
 791}
 792
 793static const struct snd_soc_dai_ops fsl_asrc_dai_ops = {
 794	.probe		= fsl_asrc_dai_probe,
 795	.startup	= fsl_asrc_dai_startup,
 796	.hw_params	= fsl_asrc_dai_hw_params,
 797	.hw_free	= fsl_asrc_dai_hw_free,
 798	.trigger	= fsl_asrc_dai_trigger,
 799};
 800
 801#define FSL_ASRC_FORMATS	(SNDRV_PCM_FMTBIT_S24_LE | \
 802				 SNDRV_PCM_FMTBIT_S16_LE | \
 803				 SNDRV_PCM_FMTBIT_S24_3LE)
 804
 805static struct snd_soc_dai_driver fsl_asrc_dai = {
 806	.playback = {
 807		.stream_name = "ASRC-Playback",
 808		.channels_min = 1,
 809		.channels_max = 10,
 810		.rate_min = 5512,
 811		.rate_max = 192000,
 812		.rates = SNDRV_PCM_RATE_KNOT,
 813		.formats = FSL_ASRC_FORMATS |
 814			   SNDRV_PCM_FMTBIT_S8,
 815	},
 816	.capture = {
 817		.stream_name = "ASRC-Capture",
 818		.channels_min = 1,
 819		.channels_max = 10,
 820		.rate_min = 5512,
 821		.rate_max = 192000,
 822		.rates = SNDRV_PCM_RATE_KNOT,
 823		.formats = FSL_ASRC_FORMATS,
 824	},
 825	.ops = &fsl_asrc_dai_ops,
 826};
 827
 828static bool fsl_asrc_readable_reg(struct device *dev, unsigned int reg)
 829{
 830	switch (reg) {
 831	case REG_ASRCTR:
 832	case REG_ASRIER:
 833	case REG_ASRCNCR:
 834	case REG_ASRCFG:
 835	case REG_ASRCSR:
 836	case REG_ASRCDR1:
 837	case REG_ASRCDR2:
 838	case REG_ASRSTR:
 839	case REG_ASRPM1:
 840	case REG_ASRPM2:
 841	case REG_ASRPM3:
 842	case REG_ASRPM4:
 843	case REG_ASRPM5:
 844	case REG_ASRTFR1:
 845	case REG_ASRCCR:
 846	case REG_ASRDOA:
 847	case REG_ASRDOB:
 848	case REG_ASRDOC:
 849	case REG_ASRIDRHA:
 850	case REG_ASRIDRLA:
 851	case REG_ASRIDRHB:
 852	case REG_ASRIDRLB:
 853	case REG_ASRIDRHC:
 854	case REG_ASRIDRLC:
 855	case REG_ASR76K:
 856	case REG_ASR56K:
 857	case REG_ASRMCRA:
 858	case REG_ASRFSTA:
 859	case REG_ASRMCRB:
 860	case REG_ASRFSTB:
 861	case REG_ASRMCRC:
 862	case REG_ASRFSTC:
 863	case REG_ASRMCR1A:
 864	case REG_ASRMCR1B:
 865	case REG_ASRMCR1C:
 866		return true;
 867	default:
 868		return false;
 869	}
 870}
 871
 872static bool fsl_asrc_volatile_reg(struct device *dev, unsigned int reg)
 873{
 874	switch (reg) {
 875	case REG_ASRSTR:
 876	case REG_ASRDIA:
 877	case REG_ASRDIB:
 878	case REG_ASRDIC:
 879	case REG_ASRDOA:
 880	case REG_ASRDOB:
 881	case REG_ASRDOC:
 882	case REG_ASRFSTA:
 883	case REG_ASRFSTB:
 884	case REG_ASRFSTC:
 885	case REG_ASRCFG:
 886		return true;
 887	default:
 888		return false;
 889	}
 890}
 891
 892static bool fsl_asrc_writeable_reg(struct device *dev, unsigned int reg)
 893{
 894	switch (reg) {
 895	case REG_ASRCTR:
 896	case REG_ASRIER:
 897	case REG_ASRCNCR:
 898	case REG_ASRCFG:
 899	case REG_ASRCSR:
 900	case REG_ASRCDR1:
 901	case REG_ASRCDR2:
 902	case REG_ASRSTR:
 903	case REG_ASRPM1:
 904	case REG_ASRPM2:
 905	case REG_ASRPM3:
 906	case REG_ASRPM4:
 907	case REG_ASRPM5:
 908	case REG_ASRTFR1:
 909	case REG_ASRCCR:
 910	case REG_ASRDIA:
 911	case REG_ASRDIB:
 912	case REG_ASRDIC:
 913	case REG_ASRIDRHA:
 914	case REG_ASRIDRLA:
 915	case REG_ASRIDRHB:
 916	case REG_ASRIDRLB:
 917	case REG_ASRIDRHC:
 918	case REG_ASRIDRLC:
 919	case REG_ASR76K:
 920	case REG_ASR56K:
 921	case REG_ASRMCRA:
 922	case REG_ASRMCRB:
 923	case REG_ASRMCRC:
 924	case REG_ASRMCR1A:
 925	case REG_ASRMCR1B:
 926	case REG_ASRMCR1C:
 927		return true;
 928	default:
 929		return false;
 930	}
 931}
 932
 933static struct reg_default fsl_asrc_reg[] = {
 934	{ REG_ASRCTR, 0x0000 }, { REG_ASRIER, 0x0000 },
 935	{ REG_ASRCNCR, 0x0000 }, { REG_ASRCFG, 0x0000 },
 936	{ REG_ASRCSR, 0x0000 }, { REG_ASRCDR1, 0x0000 },
 937	{ REG_ASRCDR2, 0x0000 }, { REG_ASRSTR, 0x0000 },
 938	{ REG_ASRRA, 0x0000 }, { REG_ASRRB, 0x0000 },
 939	{ REG_ASRRC, 0x0000 }, { REG_ASRPM1, 0x0000 },
 940	{ REG_ASRPM2, 0x0000 }, { REG_ASRPM3, 0x0000 },
 941	{ REG_ASRPM4, 0x0000 }, { REG_ASRPM5, 0x0000 },
 942	{ REG_ASRTFR1, 0x0000 }, { REG_ASRCCR, 0x0000 },
 943	{ REG_ASRDIA, 0x0000 }, { REG_ASRDOA, 0x0000 },
 944	{ REG_ASRDIB, 0x0000 }, { REG_ASRDOB, 0x0000 },
 945	{ REG_ASRDIC, 0x0000 }, { REG_ASRDOC, 0x0000 },
 946	{ REG_ASRIDRHA, 0x0000 }, { REG_ASRIDRLA, 0x0000 },
 947	{ REG_ASRIDRHB, 0x0000 }, { REG_ASRIDRLB, 0x0000 },
 948	{ REG_ASRIDRHC, 0x0000 }, { REG_ASRIDRLC, 0x0000 },
 949	{ REG_ASR76K, 0x0A47 }, { REG_ASR56K, 0x0DF3 },
 950	{ REG_ASRMCRA, 0x0000 }, { REG_ASRFSTA, 0x0000 },
 951	{ REG_ASRMCRB, 0x0000 }, { REG_ASRFSTB, 0x0000 },
 952	{ REG_ASRMCRC, 0x0000 }, { REG_ASRFSTC, 0x0000 },
 953	{ REG_ASRMCR1A, 0x0000 }, { REG_ASRMCR1B, 0x0000 },
 954	{ REG_ASRMCR1C, 0x0000 },
 955};
 956
 957static const struct regmap_config fsl_asrc_regmap_config = {
 958	.reg_bits = 32,
 959	.reg_stride = 4,
 960	.val_bits = 32,
 961
 962	.max_register = REG_ASRMCR1C,
 963	.reg_defaults = fsl_asrc_reg,
 964	.num_reg_defaults = ARRAY_SIZE(fsl_asrc_reg),
 965	.readable_reg = fsl_asrc_readable_reg,
 966	.volatile_reg = fsl_asrc_volatile_reg,
 967	.writeable_reg = fsl_asrc_writeable_reg,
 968	.cache_type = REGCACHE_FLAT,
 969};
 970
 971/**
 972 * fsl_asrc_init - Initialize ASRC registers with a default configuration
 973 * @asrc: ASRC context
 974 */
 975static int fsl_asrc_init(struct fsl_asrc *asrc)
 976{
 977	unsigned long ipg_rate;
 978
 979	/* Halt ASRC internal FP when input FIFO needs data for pair A, B, C */
 980	regmap_write(asrc->regmap, REG_ASRCTR, ASRCTR_ASRCEN);
 981
 982	/* Disable interrupt by default */
 983	regmap_write(asrc->regmap, REG_ASRIER, 0x0);
 984
 985	/* Apply recommended settings for parameters from Reference Manual */
 986	regmap_write(asrc->regmap, REG_ASRPM1, 0x7fffff);
 987	regmap_write(asrc->regmap, REG_ASRPM2, 0x255555);
 988	regmap_write(asrc->regmap, REG_ASRPM3, 0xff7280);
 989	regmap_write(asrc->regmap, REG_ASRPM4, 0xff7280);
 990	regmap_write(asrc->regmap, REG_ASRPM5, 0xff7280);
 991
 992	/* Base address for task queue FIFO. Set to 0x7C */
 993	regmap_update_bits(asrc->regmap, REG_ASRTFR1,
 994			   ASRTFR1_TF_BASE_MASK, ASRTFR1_TF_BASE(0xfc));
 995
 996	/*
 997	 * Set the period of the 76KHz and 56KHz sampling clocks based on
 998	 * the ASRC processing clock.
 999	 * On iMX6, ipg_clk = 133MHz, REG_ASR76K = 0x06D6, REG_ASR56K = 0x0947
1000	 */
1001	ipg_rate = clk_get_rate(asrc->ipg_clk);
1002	regmap_write(asrc->regmap, REG_ASR76K, ipg_rate / 76000);
1003	return regmap_write(asrc->regmap, REG_ASR56K, ipg_rate / 56000);
1004}
1005
1006/**
1007 * fsl_asrc_isr- Interrupt handler for ASRC
1008 * @irq: irq number
1009 * @dev_id: ASRC context
1010 */
1011static irqreturn_t fsl_asrc_isr(int irq, void *dev_id)
1012{
1013	struct fsl_asrc *asrc = (struct fsl_asrc *)dev_id;
1014	struct device *dev = &asrc->pdev->dev;
1015	enum asrc_pair_index index;
1016	u32 status;
1017
1018	regmap_read(asrc->regmap, REG_ASRSTR, &status);
1019
1020	/* Clean overload error */
1021	regmap_write(asrc->regmap, REG_ASRSTR, ASRSTR_AOLE);
1022
1023	/*
1024	 * We here use dev_dbg() for all exceptions because ASRC itself does
1025	 * not care if FIFO overflowed or underrun while a warning in the
1026	 * interrupt would result a ridged conversion.
1027	 */
1028	for (index = ASRC_PAIR_A; index < ASRC_PAIR_MAX_NUM; index++) {
1029		if (!asrc->pair[index])
1030			continue;
1031
1032		if (status & ASRSTR_ATQOL) {
1033			asrc->pair[index]->error |= ASRC_TASK_Q_OVERLOAD;
1034			dev_dbg(dev, "ASRC Task Queue FIFO overload\n");
1035		}
1036
1037		if (status & ASRSTR_AOOL(index)) {
1038			asrc->pair[index]->error |= ASRC_OUTPUT_TASK_OVERLOAD;
1039			pair_dbg("Output Task Overload\n");
1040		}
1041
1042		if (status & ASRSTR_AIOL(index)) {
1043			asrc->pair[index]->error |= ASRC_INPUT_TASK_OVERLOAD;
1044			pair_dbg("Input Task Overload\n");
1045		}
1046
1047		if (status & ASRSTR_AODO(index)) {
1048			asrc->pair[index]->error |= ASRC_OUTPUT_BUFFER_OVERFLOW;
1049			pair_dbg("Output Data Buffer has overflowed\n");
1050		}
1051
1052		if (status & ASRSTR_AIDU(index)) {
1053			asrc->pair[index]->error |= ASRC_INPUT_BUFFER_UNDERRUN;
1054			pair_dbg("Input Data Buffer has underflowed\n");
1055		}
1056	}
1057
1058	return IRQ_HANDLED;
1059}
1060
1061static int fsl_asrc_get_fifo_addr(u8 dir, enum asrc_pair_index index)
1062{
1063	return REG_ASRDx(dir, index);
1064}
1065
1066static int fsl_asrc_runtime_resume(struct device *dev);
1067static int fsl_asrc_runtime_suspend(struct device *dev);
1068
1069static int fsl_asrc_probe(struct platform_device *pdev)
1070{
1071	struct device_node *np = pdev->dev.of_node;
1072	struct fsl_asrc_priv *asrc_priv;
1073	struct fsl_asrc *asrc;
1074	struct resource *res;
1075	void __iomem *regs;
1076	int irq, ret, i;
1077	u32 asrc_fmt = 0;
1078	u32 map_idx;
1079	char tmp[16];
1080	u32 width;
1081
1082	asrc = devm_kzalloc(&pdev->dev, sizeof(*asrc), GFP_KERNEL);
1083	if (!asrc)
1084		return -ENOMEM;
1085
1086	asrc_priv = devm_kzalloc(&pdev->dev, sizeof(*asrc_priv), GFP_KERNEL);
1087	if (!asrc_priv)
1088		return -ENOMEM;
1089
1090	asrc->pdev = pdev;
1091	asrc->private = asrc_priv;
1092
1093	/* Get the addresses and IRQ */
1094	regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1095	if (IS_ERR(regs))
1096		return PTR_ERR(regs);
1097
1098	asrc->paddr = res->start;
1099
1100	asrc->regmap = devm_regmap_init_mmio(&pdev->dev, regs, &fsl_asrc_regmap_config);
1101	if (IS_ERR(asrc->regmap)) {
1102		dev_err(&pdev->dev, "failed to init regmap\n");
1103		return PTR_ERR(asrc->regmap);
1104	}
1105
1106	irq = platform_get_irq(pdev, 0);
1107	if (irq < 0)
1108		return irq;
1109
1110	ret = devm_request_irq(&pdev->dev, irq, fsl_asrc_isr, 0,
1111			       dev_name(&pdev->dev), asrc);
1112	if (ret) {
1113		dev_err(&pdev->dev, "failed to claim irq %u: %d\n", irq, ret);
1114		return ret;
1115	}
1116
1117	asrc->mem_clk = devm_clk_get(&pdev->dev, "mem");
1118	if (IS_ERR(asrc->mem_clk)) {
1119		dev_err(&pdev->dev, "failed to get mem clock\n");
1120		return PTR_ERR(asrc->mem_clk);
1121	}
1122
1123	asrc->ipg_clk = devm_clk_get(&pdev->dev, "ipg");
1124	if (IS_ERR(asrc->ipg_clk)) {
1125		dev_err(&pdev->dev, "failed to get ipg clock\n");
1126		return PTR_ERR(asrc->ipg_clk);
1127	}
1128
1129	asrc->spba_clk = devm_clk_get(&pdev->dev, "spba");
1130	if (IS_ERR(asrc->spba_clk))
1131		dev_warn(&pdev->dev, "failed to get spba clock\n");
1132
1133	for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
1134		sprintf(tmp, "asrck_%x", i);
1135		asrc_priv->asrck_clk[i] = devm_clk_get(&pdev->dev, tmp);
1136		if (IS_ERR(asrc_priv->asrck_clk[i])) {
1137			dev_err(&pdev->dev, "failed to get %s clock\n", tmp);
1138			return PTR_ERR(asrc_priv->asrck_clk[i]);
1139		}
1140	}
1141
1142	asrc_priv->soc = of_device_get_match_data(&pdev->dev);
1143	asrc->use_edma = asrc_priv->soc->use_edma;
1144	asrc->get_dma_channel = fsl_asrc_get_dma_channel;
1145	asrc->request_pair = fsl_asrc_request_pair;
1146	asrc->release_pair = fsl_asrc_release_pair;
1147	asrc->get_fifo_addr = fsl_asrc_get_fifo_addr;
1148	asrc->pair_priv_size = sizeof(struct fsl_asrc_pair_priv);
1149
1150	if (of_device_is_compatible(np, "fsl,imx35-asrc")) {
1151		asrc_priv->clk_map[IN] = input_clk_map_imx35;
1152		asrc_priv->clk_map[OUT] = output_clk_map_imx35;
1153	} else if (of_device_is_compatible(np, "fsl,imx53-asrc")) {
1154		asrc_priv->clk_map[IN] = input_clk_map_imx53;
1155		asrc_priv->clk_map[OUT] = output_clk_map_imx53;
1156	} else if (of_device_is_compatible(np, "fsl,imx8qm-asrc") ||
1157		   of_device_is_compatible(np, "fsl,imx8qxp-asrc")) {
1158		ret = of_property_read_u32(np, "fsl,asrc-clk-map", &map_idx);
1159		if (ret) {
1160			dev_err(&pdev->dev, "failed to get clk map index\n");
1161			return ret;
1162		}
1163
1164		if (map_idx > 1) {
1165			dev_err(&pdev->dev, "unsupported clk map index\n");
1166			return -EINVAL;
1167		}
1168		if (of_device_is_compatible(np, "fsl,imx8qm-asrc")) {
1169			asrc_priv->clk_map[IN] = clk_map_imx8qm[map_idx];
1170			asrc_priv->clk_map[OUT] = clk_map_imx8qm[map_idx];
1171		} else {
1172			asrc_priv->clk_map[IN] = clk_map_imx8qxp[map_idx];
1173			asrc_priv->clk_map[OUT] = clk_map_imx8qxp[map_idx];
1174		}
1175	}
1176
1177	asrc->channel_avail = 10;
1178
1179	ret = of_property_read_u32(np, "fsl,asrc-rate",
1180				   &asrc->asrc_rate);
1181	if (ret) {
1182		dev_err(&pdev->dev, "failed to get output rate\n");
1183		return ret;
1184	}
1185
1186	ret = of_property_read_u32(np, "fsl,asrc-format", &asrc_fmt);
1187	asrc->asrc_format = (__force snd_pcm_format_t)asrc_fmt;
1188	if (ret) {
1189		ret = of_property_read_u32(np, "fsl,asrc-width", &width);
1190		if (ret) {
1191			dev_err(&pdev->dev, "failed to decide output format\n");
1192			return ret;
1193		}
1194
1195		switch (width) {
1196		case 16:
1197			asrc->asrc_format = SNDRV_PCM_FORMAT_S16_LE;
1198			break;
1199		case 24:
1200			asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE;
1201			break;
1202		default:
1203			dev_warn(&pdev->dev,
1204				 "unsupported width, use default S24_LE\n");
1205			asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE;
1206			break;
1207		}
1208	}
1209
1210	if (!(FSL_ASRC_FORMATS & pcm_format_to_bits(asrc->asrc_format))) {
1211		dev_warn(&pdev->dev, "unsupported width, use default S24_LE\n");
1212		asrc->asrc_format = SNDRV_PCM_FORMAT_S24_LE;
1213	}
1214
1215	platform_set_drvdata(pdev, asrc);
1216	spin_lock_init(&asrc->lock);
1217	pm_runtime_enable(&pdev->dev);
1218	if (!pm_runtime_enabled(&pdev->dev)) {
1219		ret = fsl_asrc_runtime_resume(&pdev->dev);
1220		if (ret)
1221			goto err_pm_disable;
1222	}
1223
1224	ret = pm_runtime_resume_and_get(&pdev->dev);
1225	if (ret < 0)
1226		goto err_pm_get_sync;
1227
1228	ret = fsl_asrc_init(asrc);
1229	if (ret) {
1230		dev_err(&pdev->dev, "failed to init asrc %d\n", ret);
1231		goto err_pm_get_sync;
1232	}
1233
1234	ret = pm_runtime_put_sync(&pdev->dev);
1235	if (ret < 0 && ret != -ENOSYS)
1236		goto err_pm_get_sync;
1237
1238	ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component,
1239					      &fsl_asrc_dai, 1);
1240	if (ret) {
1241		dev_err(&pdev->dev, "failed to register ASoC DAI\n");
1242		goto err_pm_get_sync;
1243	}
1244
1245	return 0;
1246
1247err_pm_get_sync:
1248	if (!pm_runtime_status_suspended(&pdev->dev))
1249		fsl_asrc_runtime_suspend(&pdev->dev);
1250err_pm_disable:
1251	pm_runtime_disable(&pdev->dev);
1252	return ret;
1253}
1254
1255static void fsl_asrc_remove(struct platform_device *pdev)
1256{
1257	pm_runtime_disable(&pdev->dev);
1258	if (!pm_runtime_status_suspended(&pdev->dev))
1259		fsl_asrc_runtime_suspend(&pdev->dev);
1260}
1261
1262static int fsl_asrc_runtime_resume(struct device *dev)
1263{
1264	struct fsl_asrc *asrc = dev_get_drvdata(dev);
1265	struct fsl_asrc_priv *asrc_priv = asrc->private;
1266	int reg, retry = INIT_RETRY_NUM;
1267	int i, ret;
1268	u32 asrctr;
1269
1270	ret = clk_prepare_enable(asrc->mem_clk);
1271	if (ret)
1272		return ret;
1273	ret = clk_prepare_enable(asrc->ipg_clk);
1274	if (ret)
1275		goto disable_mem_clk;
1276	if (!IS_ERR(asrc->spba_clk)) {
1277		ret = clk_prepare_enable(asrc->spba_clk);
1278		if (ret)
1279			goto disable_ipg_clk;
1280	}
1281	for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
1282		ret = clk_prepare_enable(asrc_priv->asrck_clk[i]);
1283		if (ret)
1284			goto disable_asrck_clk;
1285	}
1286
1287	/* Stop all pairs provisionally */
1288	regmap_read(asrc->regmap, REG_ASRCTR, &asrctr);
1289	regmap_update_bits(asrc->regmap, REG_ASRCTR,
1290			   ASRCTR_ASRCEi_ALL_MASK, 0);
1291
1292	/* Restore all registers */
1293	regcache_cache_only(asrc->regmap, false);
1294	regcache_mark_dirty(asrc->regmap);
1295	regcache_sync(asrc->regmap);
1296
1297	regmap_update_bits(asrc->regmap, REG_ASRCFG,
1298			   ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
1299			   ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
1300
1301	/* Restart enabled pairs */
1302	regmap_update_bits(asrc->regmap, REG_ASRCTR,
1303			   ASRCTR_ASRCEi_ALL_MASK, asrctr);
1304
1305	/* Wait for status of initialization for all enabled pairs */
1306	do {
1307		udelay(5);
1308		regmap_read(asrc->regmap, REG_ASRCFG, &reg);
1309		reg = (reg >> ASRCFG_INIRQi_SHIFT(0)) & 0x7;
1310	} while ((reg != ((asrctr >> ASRCTR_ASRCEi_SHIFT(0)) & 0x7)) && --retry);
1311
1312	/*
1313	 * NOTE: Doesn't treat initialization timeout as an error
1314	 * Some of the pairs may success, then still can continue.
1315	 */
1316	if (!retry) {
1317		for (i = ASRC_PAIR_A; i < ASRC_PAIR_MAX_NUM; i++) {
1318			if ((asrctr & ASRCTR_ASRCEi_MASK(i)) && !(reg & (1 << i)))
1319				dev_warn(dev, "Pair %c initialization isn't finished\n", 'A' + i);
1320		}
1321	}
1322
1323	return 0;
1324
1325disable_asrck_clk:
1326	for (i--; i >= 0; i--)
1327		clk_disable_unprepare(asrc_priv->asrck_clk[i]);
1328	if (!IS_ERR(asrc->spba_clk))
1329		clk_disable_unprepare(asrc->spba_clk);
1330disable_ipg_clk:
1331	clk_disable_unprepare(asrc->ipg_clk);
1332disable_mem_clk:
1333	clk_disable_unprepare(asrc->mem_clk);
1334	return ret;
1335}
1336
1337static int fsl_asrc_runtime_suspend(struct device *dev)
1338{
1339	struct fsl_asrc *asrc = dev_get_drvdata(dev);
1340	struct fsl_asrc_priv *asrc_priv = asrc->private;
1341	int i;
1342
1343	regmap_read(asrc->regmap, REG_ASRCFG,
1344		    &asrc_priv->regcache_cfg);
1345
1346	regcache_cache_only(asrc->regmap, true);
1347
1348	for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
1349		clk_disable_unprepare(asrc_priv->asrck_clk[i]);
1350	if (!IS_ERR(asrc->spba_clk))
1351		clk_disable_unprepare(asrc->spba_clk);
1352	clk_disable_unprepare(asrc->ipg_clk);
1353	clk_disable_unprepare(asrc->mem_clk);
1354
1355	return 0;
1356}
1357
1358static const struct dev_pm_ops fsl_asrc_pm = {
1359	SET_RUNTIME_PM_OPS(fsl_asrc_runtime_suspend, fsl_asrc_runtime_resume, NULL)
1360	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
1361				pm_runtime_force_resume)
1362};
1363
1364static const struct fsl_asrc_soc_data fsl_asrc_imx35_data = {
1365	.use_edma = false,
1366	.channel_bits = 3,
1367};
1368
1369static const struct fsl_asrc_soc_data fsl_asrc_imx53_data = {
1370	.use_edma = false,
1371	.channel_bits = 4,
1372};
1373
1374static const struct fsl_asrc_soc_data fsl_asrc_imx8qm_data = {
1375	.use_edma = true,
1376	.channel_bits = 4,
1377};
1378
1379static const struct fsl_asrc_soc_data fsl_asrc_imx8qxp_data = {
1380	.use_edma = true,
1381	.channel_bits = 4,
1382};
1383
1384static const struct of_device_id fsl_asrc_ids[] = {
1385	{ .compatible = "fsl,imx35-asrc", .data = &fsl_asrc_imx35_data },
1386	{ .compatible = "fsl,imx53-asrc", .data = &fsl_asrc_imx53_data },
1387	{ .compatible = "fsl,imx8qm-asrc", .data = &fsl_asrc_imx8qm_data },
1388	{ .compatible = "fsl,imx8qxp-asrc", .data = &fsl_asrc_imx8qxp_data },
1389	{}
1390};
1391MODULE_DEVICE_TABLE(of, fsl_asrc_ids);
1392
1393static struct platform_driver fsl_asrc_driver = {
1394	.probe = fsl_asrc_probe,
1395	.remove_new = fsl_asrc_remove,
1396	.driver = {
1397		.name = "fsl-asrc",
1398		.of_match_table = fsl_asrc_ids,
1399		.pm = &fsl_asrc_pm,
1400	},
1401};
1402module_platform_driver(fsl_asrc_driver);
1403
1404MODULE_DESCRIPTION("Freescale ASRC ASoC driver");
1405MODULE_AUTHOR("Nicolin Chen <nicoleotsuka@gmail.com>");
1406MODULE_ALIAS("platform:fsl-asrc");
1407MODULE_LICENSE("GPL v2");