Unverified Commit f6fdf773 authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: imx-card: several improvement and fixes

Merge series from Shengjiu Wang <shengjiu.wang@nxp.com>:

Several improvement and fixes for AK codecs supported on i.MX platfroms
parents 3b247eea 39693418
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ struct imx_card_data {

static struct imx_akcodec_fs_mul ak4458_fs_mul[] = {
	/* Normal, < 32kHz */
	{ .rmin = 8000,   .rmax = 24000,  .wmin = 1024, .wmax = 1024, },
	{ .rmin = 8000,   .rmax = 24000,  .wmin = 256,  .wmax = 1024, },
	/* Normal, 32kHz */
	{ .rmin = 32000,  .rmax = 32000,  .wmin = 256,  .wmax = 1024, },
	/* Normal */
@@ -151,8 +151,8 @@ static struct imx_akcodec_fs_mul ak4497_fs_mul[] = {
	 * Table 7      - mapping multiplier and speed mode
	 * Tables 8 & 9 - mapping speed mode and LRCK fs
	 */
	{ .rmin = 8000,   .rmax = 32000,  .wmin = 1024, .wmax = 1024, }, /* Normal, <= 32kHz */
	{ .rmin = 44100,  .rmax = 48000,  .wmin = 512,  .wmax = 512, }, /* Normal */
	{ .rmin = 8000,   .rmax = 32000,  .wmin = 256,  .wmax = 1024, }, /* Normal, <= 32kHz */
	{ .rmin = 44100,  .rmax = 48000,  .wmin = 256,  .wmax = 512, }, /* Normal */
	{ .rmin = 88200,  .rmax = 96000,  .wmin = 256,  .wmax = 256, }, /* Double */
	{ .rmin = 176400, .rmax = 192000, .wmin = 128,  .wmax = 128, }, /* Quad */
	{ .rmin = 352800, .rmax = 384000, .wmin = 128,  .wmax = 128, }, /* Oct */
@@ -164,7 +164,7 @@ static struct imx_akcodec_fs_mul ak4497_fs_mul[] = {
 * (Table 4 from datasheet)
 */
static struct imx_akcodec_fs_mul ak5558_fs_mul[] = {
	{ .rmin = 8000,   .rmax = 32000,  .wmin = 1024, .wmax = 1024, },
	{ .rmin = 8000,   .rmax = 32000,  .wmin = 512,  .wmax = 1024, },
	{ .rmin = 44100,  .rmax = 48000,  .wmin = 512,  .wmax = 512, },
	{ .rmin = 88200,  .rmax = 96000,  .wmin = 256,  .wmax = 256, },
	{ .rmin = 176400, .rmax = 192000, .wmin = 128,  .wmax = 128, },
@@ -247,13 +247,14 @@ static bool codec_is_akcodec(unsigned int type)
}

static unsigned long akcodec_get_mclk_rate(struct snd_pcm_substream *substream,
					   struct snd_pcm_hw_params *params)
					   struct snd_pcm_hw_params *params,
					   int slots, int slot_width)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct imx_card_data *data = snd_soc_card_get_drvdata(rtd->card);
	const struct imx_card_plat_data *plat_data = data->plat_data;
	struct dai_link_data *link_data = &data->link_data[rtd->num];
	unsigned int width = link_data->slots * link_data->slot_width;
	unsigned int width = slots * slot_width;
	unsigned int rate = params_rate(params);
	int i;

@@ -349,7 +350,7 @@ static int imx_aif_hw_params(struct snd_pcm_substream *substream,

	/* Set MCLK freq */
	if (codec_is_akcodec(plat_data->type))
		mclk_freq = akcodec_get_mclk_rate(substream, params);
		mclk_freq = akcodec_get_mclk_rate(substream, params, slots, slot_width);
	else
		mclk_freq = params_rate(params) * slots * slot_width;
	/* Use the maximum freq from DSD512 (512*44100 = 22579200) */
@@ -553,8 +554,23 @@ static int imx_card_parse_of(struct imx_card_data *data)
			link_data->cpu_sysclk_id = FSL_SAI_CLK_MAST1;

			/* sai may support mclk/bclk = 1 */
			if (of_find_property(np, "fsl,mclk-equal-bclk", NULL))
			if (of_find_property(np, "fsl,mclk-equal-bclk", NULL)) {
				link_data->one2one_ratio = true;
			} else {
				int i;

				/*
				 * i.MX8MQ don't support one2one ratio, then
				 * with ak4497 only 16bit case is supported.
				 */
				for (i = 0; i < ARRAY_SIZE(ak4497_fs_mul); i++) {
					if (ak4497_fs_mul[i].rmin == 705600 &&
					    ak4497_fs_mul[i].rmax == 768000) {
						ak4497_fs_mul[i].wmin = 32;
						ak4497_fs_mul[i].wmax = 32;
					}
				}
			}
		}

		link->cpus->of_node = args.np;