Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// Driver for Microchip S/PDIF RX Controller
   4//
   5// Copyright (C) 2020 Microchip Technology Inc. and its subsidiaries
   6//
   7// Author: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
   8
   9#include <linux/clk.h>
  10#include <linux/io.h>
  11#include <linux/module.h>
  12#include <linux/pm_runtime.h>
  13#include <linux/regmap.h>
  14#include <linux/spinlock.h>
  15
  16#include <sound/dmaengine_pcm.h>
  17#include <sound/pcm_params.h>
  18#include <sound/soc.h>
  19
  20/*
  21 * ---- S/PDIF Receiver Controller Register map ----
  22 */
  23#define SPDIFRX_CR			0x00	/* Control Register */
  24#define SPDIFRX_MR			0x04	/* Mode Register */
  25
  26#define SPDIFRX_IER			0x10	/* Interrupt Enable Register */
  27#define SPDIFRX_IDR			0x14	/* Interrupt Disable Register */
  28#define SPDIFRX_IMR			0x18	/* Interrupt Mask Register */
  29#define SPDIFRX_ISR			0x1c	/* Interrupt Status Register */
  30#define SPDIFRX_RSR			0x20	/* Status Register */
  31#define SPDIFRX_RHR			0x24	/* Holding Register */
  32
  33#define SPDIFRX_CHSR(channel, reg)	\
  34	(0x30 + (channel) * 0x30 + (reg) * 4)	/* Channel x Status Registers */
  35
  36#define SPDIFRX_CHUD(channel, reg)	\
  37	(0x48 + (channel) * 0x30 + (reg) * 4)	/* Channel x User Data Registers */
  38
  39#define SPDIFRX_WPMR			0xE4	/* Write Protection Mode Register */
  40#define SPDIFRX_WPSR			0xE8	/* Write Protection Status Register */
  41
  42#define SPDIFRX_VERSION			0xFC	/* Version Register */
  43
  44/*
  45 * ---- Control Register (Write-only) ----
  46 */
  47#define SPDIFRX_CR_SWRST		BIT(0)	/* Software Reset */
  48
  49/*
  50 * ---- Mode Register (Read/Write) ----
  51 */
  52/* Receive Enable */
  53#define SPDIFRX_MR_RXEN_MASK		GENMASK(0, 0)
  54#define SPDIFRX_MR_RXEN_DISABLE		(0 << 0)	/* SPDIF Receiver Disabled */
  55#define SPDIFRX_MR_RXEN_ENABLE		(1 << 0)	/* SPDIF Receiver Enabled */
  56
  57/* Validity Bit Mode */
  58#define SPDIFRX_MR_VBMODE_MASK		GENAMSK(1, 1)
  59#define SPDIFRX_MR_VBMODE_ALWAYS_LOAD \
  60	(0 << 1)	/* Load sample regardless of validity bit value */
  61#define SPDIFRX_MR_VBMODE_DISCARD_IF_VB1 \
  62	(1 << 1)	/* Load sample only if validity bit is 0 */
  63
  64/* Data Word Endian Mode */
  65#define SPDIFRX_MR_ENDIAN_MASK		GENMASK(2, 2)
  66#define SPDIFRX_MR_ENDIAN_LITTLE	(0 << 2)	/* Little Endian Mode */
  67#define SPDIFRX_MR_ENDIAN_BIG		(1 << 2)	/* Big Endian Mode */
  68
  69/* Parity Bit Mode */
  70#define SPDIFRX_MR_PBMODE_MASK		GENMASK(3, 3)
  71#define SPDIFRX_MR_PBMODE_PARCHECK	(0 << 3)	/* Parity Check Enabled */
  72#define SPDIFRX_MR_PBMODE_NOPARCHECK	(1 << 3)	/* Parity Check Disabled */
  73
  74/* Sample Data Width */
  75#define SPDIFRX_MR_DATAWIDTH_MASK	GENMASK(5, 4)
  76#define SPDIFRX_MR_DATAWIDTH(width) \
  77	(((6 - (width) / 4) << 4) & SPDIFRX_MR_DATAWIDTH_MASK)
  78
  79/* Packed Data Mode in Receive Holding Register */
  80#define SPDIFRX_MR_PACK_MASK		GENMASK(7, 7)
  81#define SPDIFRX_MR_PACK_DISABLED	(0 << 7)
  82#define SPDIFRX_MR_PACK_ENABLED		(1 << 7)
  83
  84/* Start of Block Bit Mode */
  85#define SPDIFRX_MR_SBMODE_MASK		GENMASK(8, 8)
  86#define SPDIFRX_MR_SBMODE_ALWAYS_LOAD	(0 << 8)
  87#define SPDIFRX_MR_SBMODE_DISCARD	(1 << 8)
  88
  89/* Consecutive Preamble Error Threshold Automatic Restart */
  90#define SPDIFRX_MR_AUTORST_MASK			GENMASK(24, 24)
  91#define SPDIFRX_MR_AUTORST_NOACTION		(0 << 24)
  92#define SPDIFRX_MR_AUTORST_UNLOCK_ON_PRE_ERR	(1 << 24)
  93
  94/*
  95 * ---- Interrupt Enable/Disable/Mask/Status Register (Write/Read-only) ----
  96 */
  97#define SPDIFRX_IR_RXRDY			BIT(0)
  98#define SPDIFRX_IR_LOCKED			BIT(1)
  99#define SPDIFRX_IR_LOSS				BIT(2)
 100#define SPDIFRX_IR_BLOCKEND			BIT(3)
 101#define SPDIFRX_IR_SFE				BIT(4)
 102#define SPDIFRX_IR_PAR_ERR			BIT(5)
 103#define SPDIFRX_IR_OVERRUN			BIT(6)
 104#define SPDIFRX_IR_RXFULL			BIT(7)
 105#define SPDIFRX_IR_CSC(ch)			BIT((ch) + 8)
 106#define SPDIFRX_IR_SECE				BIT(10)
 107#define SPDIFRX_IR_BLOCKST			BIT(11)
 108#define SPDIFRX_IR_NRZ_ERR			BIT(12)
 109#define SPDIFRX_IR_PRE_ERR			BIT(13)
 110#define SPDIFRX_IR_CP_ERR			BIT(14)
 111
 112/*
 113 * ---- Receiver Status Register (Read/Write) ----
 114 */
 115/* Enable Status */
 116#define SPDIFRX_RSR_ULOCK			BIT(0)
 117#define SPDIFRX_RSR_BADF			BIT(1)
 118#define SPDIFRX_RSR_LOWF			BIT(2)
 119#define SPDIFRX_RSR_NOSIGNAL			BIT(3)
 120#define SPDIFRX_RSR_IFS_MASK			GENMASK(27, 16)
 121#define SPDIFRX_RSR_IFS(reg)			\
 122	(((reg) & SPDIFRX_RSR_IFS_MASK) >> 16)
 123
 124/*
 125 *  ---- Version Register (Read-only) ----
 126 */
 127#define SPDIFRX_VERSION_MASK		GENMASK(11, 0)
 128#define SPDIFRX_VERSION_MFN_MASK	GENMASK(18, 16)
 129#define SPDIFRX_VERSION_MFN(reg)	(((reg) & SPDIFRX_VERSION_MFN_MASK) >> 16)
 130
 131static bool mchp_spdifrx_readable_reg(struct device *dev, unsigned int reg)
 132{
 133	switch (reg) {
 134	case SPDIFRX_MR:
 135	case SPDIFRX_IMR:
 136	case SPDIFRX_ISR:
 137	case SPDIFRX_RSR:
 138	case SPDIFRX_CHSR(0, 0):
 139	case SPDIFRX_CHSR(0, 1):
 140	case SPDIFRX_CHSR(0, 2):
 141	case SPDIFRX_CHSR(0, 3):
 142	case SPDIFRX_CHSR(0, 4):
 143	case SPDIFRX_CHSR(0, 5):
 144	case SPDIFRX_CHUD(0, 0):
 145	case SPDIFRX_CHUD(0, 1):
 146	case SPDIFRX_CHUD(0, 2):
 147	case SPDIFRX_CHUD(0, 3):
 148	case SPDIFRX_CHUD(0, 4):
 149	case SPDIFRX_CHUD(0, 5):
 150	case SPDIFRX_CHSR(1, 0):
 151	case SPDIFRX_CHSR(1, 1):
 152	case SPDIFRX_CHSR(1, 2):
 153	case SPDIFRX_CHSR(1, 3):
 154	case SPDIFRX_CHSR(1, 4):
 155	case SPDIFRX_CHSR(1, 5):
 156	case SPDIFRX_CHUD(1, 0):
 157	case SPDIFRX_CHUD(1, 1):
 158	case SPDIFRX_CHUD(1, 2):
 159	case SPDIFRX_CHUD(1, 3):
 160	case SPDIFRX_CHUD(1, 4):
 161	case SPDIFRX_CHUD(1, 5):
 162	case SPDIFRX_WPMR:
 163	case SPDIFRX_WPSR:
 164	case SPDIFRX_VERSION:
 165		return true;
 166	default:
 167		return false;
 168	}
 169}
 170
 171static bool mchp_spdifrx_writeable_reg(struct device *dev, unsigned int reg)
 172{
 173	switch (reg) {
 174	case SPDIFRX_CR:
 175	case SPDIFRX_MR:
 176	case SPDIFRX_IER:
 177	case SPDIFRX_IDR:
 178	case SPDIFRX_WPMR:
 179		return true;
 180	default:
 181		return false;
 182	}
 183}
 184
 185static bool mchp_spdifrx_precious_reg(struct device *dev, unsigned int reg)
 186{
 187	switch (reg) {
 188	case SPDIFRX_ISR:
 189	case SPDIFRX_RHR:
 190		return true;
 191	default:
 192		return false;
 193	}
 194}
 195
 196static bool mchp_spdifrx_volatile_reg(struct device *dev, unsigned int reg)
 197{
 198	switch (reg) {
 199	case SPDIFRX_IMR:
 200	case SPDIFRX_ISR:
 201	case SPDIFRX_RSR:
 202	case SPDIFRX_CHSR(0, 0):
 203	case SPDIFRX_CHSR(0, 1):
 204	case SPDIFRX_CHSR(0, 2):
 205	case SPDIFRX_CHSR(0, 3):
 206	case SPDIFRX_CHSR(0, 4):
 207	case SPDIFRX_CHSR(0, 5):
 208	case SPDIFRX_CHUD(0, 0):
 209	case SPDIFRX_CHUD(0, 1):
 210	case SPDIFRX_CHUD(0, 2):
 211	case SPDIFRX_CHUD(0, 3):
 212	case SPDIFRX_CHUD(0, 4):
 213	case SPDIFRX_CHUD(0, 5):
 214	case SPDIFRX_CHSR(1, 0):
 215	case SPDIFRX_CHSR(1, 1):
 216	case SPDIFRX_CHSR(1, 2):
 217	case SPDIFRX_CHSR(1, 3):
 218	case SPDIFRX_CHSR(1, 4):
 219	case SPDIFRX_CHSR(1, 5):
 220	case SPDIFRX_CHUD(1, 0):
 221	case SPDIFRX_CHUD(1, 1):
 222	case SPDIFRX_CHUD(1, 2):
 223	case SPDIFRX_CHUD(1, 3):
 224	case SPDIFRX_CHUD(1, 4):
 225	case SPDIFRX_CHUD(1, 5):
 226	case SPDIFRX_VERSION:
 227		return true;
 228	default:
 229		return false;
 230	}
 231}
 232
 233static const struct regmap_config mchp_spdifrx_regmap_config = {
 234	.reg_bits = 32,
 235	.reg_stride = 4,
 236	.val_bits = 32,
 237	.max_register = SPDIFRX_VERSION,
 238	.readable_reg = mchp_spdifrx_readable_reg,
 239	.writeable_reg = mchp_spdifrx_writeable_reg,
 240	.precious_reg = mchp_spdifrx_precious_reg,
 241	.volatile_reg = mchp_spdifrx_volatile_reg,
 242	.cache_type = REGCACHE_FLAT,
 243};
 244
 245#define SPDIFRX_GCLK_RATIO_MIN	(12 * 64)
 246
 247#define SPDIFRX_CS_BITS		192
 248#define SPDIFRX_UD_BITS		192
 249
 250#define SPDIFRX_CHANNELS	2
 251
 252/**
 253 * struct mchp_spdifrx_ch_stat: MCHP SPDIFRX channel status
 254 * @data: channel status bits
 255 * @done: completion to signal channel status bits acquisition done
 256 */
 257struct mchp_spdifrx_ch_stat {
 258	unsigned char data[SPDIFRX_CS_BITS / 8];
 259	struct completion done;
 260};
 261
 262/**
 263 * struct mchp_spdifrx_user_data: MCHP SPDIFRX user data
 264 * @data: user data bits
 265 * @done: completion to signal user data bits acquisition done
 266 */
 267struct mchp_spdifrx_user_data {
 268	unsigned char data[SPDIFRX_UD_BITS / 8];
 269	struct completion done;
 270};
 271
 272/**
 273 * struct mchp_spdifrx_mixer_control: MCHP SPDIFRX mixer control data structure
 274 * @ch_stat: array of channel statuses
 275 * @user_data: array of user data
 276 * @ulock: ulock bit status
 277 * @badf: badf bit status
 278 * @signal: signal bit status
 279 */
 280struct mchp_spdifrx_mixer_control {
 281	struct mchp_spdifrx_ch_stat ch_stat[SPDIFRX_CHANNELS];
 282	struct mchp_spdifrx_user_data user_data[SPDIFRX_CHANNELS];
 283	bool ulock;
 284	bool badf;
 285	bool signal;
 286};
 287
 288/**
 289 * struct mchp_spdifrx_dev: MCHP SPDIFRX device data structure
 290 * @capture: DAI DMA configuration data
 291 * @control: mixer controls
 292 * @mlock: mutex to protect concurency b/w configuration and control APIs
 293 * @dev: struct device
 294 * @regmap: regmap for this device
 295 * @pclk: peripheral clock
 296 * @gclk: generic clock
 297 * @trigger_enabled: true if enabled though trigger() ops
 298 */
 299struct mchp_spdifrx_dev {
 300	struct snd_dmaengine_dai_dma_data	capture;
 301	struct mchp_spdifrx_mixer_control	control;
 302	struct mutex				mlock;
 303	struct device				*dev;
 304	struct regmap				*regmap;
 305	struct clk				*pclk;
 306	struct clk				*gclk;
 307	unsigned int				trigger_enabled;
 308};
 309
 310static void mchp_spdifrx_channel_status_read(struct mchp_spdifrx_dev *dev,
 311					     int channel)
 312{
 313	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 314	u8 *ch_stat = &ctrl->ch_stat[channel].data[0];
 315	u32 val;
 316	int i;
 317
 318	for (i = 0; i < ARRAY_SIZE(ctrl->ch_stat[channel].data) / 4; i++) {
 319		regmap_read(dev->regmap, SPDIFRX_CHSR(channel, i), &val);
 320		*ch_stat++ = val & 0xFF;
 321		*ch_stat++ = (val >> 8) & 0xFF;
 322		*ch_stat++ = (val >> 16) & 0xFF;
 323		*ch_stat++ = (val >> 24) & 0xFF;
 324	}
 325}
 326
 327static void mchp_spdifrx_channel_user_data_read(struct mchp_spdifrx_dev *dev,
 328						int channel)
 329{
 330	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 331	u8 *user_data = &ctrl->user_data[channel].data[0];
 332	u32 val;
 333	int i;
 334
 335	for (i = 0; i < ARRAY_SIZE(ctrl->user_data[channel].data) / 4; i++) {
 336		regmap_read(dev->regmap, SPDIFRX_CHUD(channel, i), &val);
 337		*user_data++ = val & 0xFF;
 338		*user_data++ = (val >> 8) & 0xFF;
 339		*user_data++ = (val >> 16) & 0xFF;
 340		*user_data++ = (val >> 24) & 0xFF;
 341	}
 342}
 343
 344static irqreturn_t mchp_spdif_interrupt(int irq, void *dev_id)
 345{
 346	struct mchp_spdifrx_dev *dev = dev_id;
 347	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 348	u32 sr, imr, pending;
 349	irqreturn_t ret = IRQ_NONE;
 350	int ch;
 351
 352	regmap_read(dev->regmap, SPDIFRX_ISR, &sr);
 353	regmap_read(dev->regmap, SPDIFRX_IMR, &imr);
 354	pending = sr & imr;
 355	dev_dbg(dev->dev, "ISR: %#x, IMR: %#x, pending: %#x\n", sr, imr,
 356		pending);
 357
 358	if (!pending)
 359		return IRQ_NONE;
 360
 361	if (pending & SPDIFRX_IR_BLOCKEND) {
 362		for (ch = 0; ch < SPDIFRX_CHANNELS; ch++) {
 363			mchp_spdifrx_channel_user_data_read(dev, ch);
 364			complete(&ctrl->user_data[ch].done);
 365		}
 366		regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND);
 367		ret = IRQ_HANDLED;
 368	}
 369
 370	for (ch = 0; ch < SPDIFRX_CHANNELS; ch++) {
 371		if (pending & SPDIFRX_IR_CSC(ch)) {
 372			mchp_spdifrx_channel_status_read(dev, ch);
 373			complete(&ctrl->ch_stat[ch].done);
 374			regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(ch));
 375			ret = IRQ_HANDLED;
 376		}
 377	}
 378
 379	if (pending & SPDIFRX_IR_OVERRUN) {
 380		dev_warn(dev->dev, "Overrun detected\n");
 381		ret = IRQ_HANDLED;
 382	}
 383
 384	return ret;
 385}
 386
 387static int mchp_spdifrx_trigger(struct snd_pcm_substream *substream, int cmd,
 388				struct snd_soc_dai *dai)
 389{
 390	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 391	int ret = 0;
 392
 393	switch (cmd) {
 394	case SNDRV_PCM_TRIGGER_START:
 395	case SNDRV_PCM_TRIGGER_RESUME:
 396	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 397		mutex_lock(&dev->mlock);
 398		/* Enable overrun interrupts */
 399		regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_OVERRUN);
 400
 401		/* Enable receiver. */
 402		regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
 403				   SPDIFRX_MR_RXEN_ENABLE);
 404		dev->trigger_enabled = true;
 405		mutex_unlock(&dev->mlock);
 406		break;
 407	case SNDRV_PCM_TRIGGER_STOP:
 408	case SNDRV_PCM_TRIGGER_SUSPEND:
 409	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 410		mutex_lock(&dev->mlock);
 411		/* Disable overrun interrupts */
 412		regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_OVERRUN);
 413
 414		/* Disable receiver. */
 415		regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
 416				   SPDIFRX_MR_RXEN_DISABLE);
 417		dev->trigger_enabled = false;
 418		mutex_unlock(&dev->mlock);
 419		break;
 420	default:
 421		ret = -EINVAL;
 422	}
 423
 424	return ret;
 425}
 426
 427static int mchp_spdifrx_hw_params(struct snd_pcm_substream *substream,
 428				  struct snd_pcm_hw_params *params,
 429				  struct snd_soc_dai *dai)
 430{
 431	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 432	u32 mr = 0;
 433	int ret;
 434
 435	dev_dbg(dev->dev, "%s() rate=%u format=%#x width=%u channels=%u\n",
 436		__func__, params_rate(params), params_format(params),
 437		params_width(params), params_channels(params));
 438
 439	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 440		dev_err(dev->dev, "Playback is not supported\n");
 441		return -EINVAL;
 442	}
 443
 444	if (params_channels(params) != SPDIFRX_CHANNELS) {
 445		dev_err(dev->dev, "unsupported number of channels: %d\n",
 446			params_channels(params));
 447		return -EINVAL;
 448	}
 449
 450	switch (params_format(params)) {
 451	case SNDRV_PCM_FORMAT_S16_BE:
 452	case SNDRV_PCM_FORMAT_S20_3BE:
 453	case SNDRV_PCM_FORMAT_S24_3BE:
 454	case SNDRV_PCM_FORMAT_S24_BE:
 455		mr |= SPDIFRX_MR_ENDIAN_BIG;
 456		fallthrough;
 457	case SNDRV_PCM_FORMAT_S16_LE:
 458	case SNDRV_PCM_FORMAT_S20_3LE:
 459	case SNDRV_PCM_FORMAT_S24_3LE:
 460	case SNDRV_PCM_FORMAT_S24_LE:
 461		mr |= SPDIFRX_MR_DATAWIDTH(params_width(params));
 462		break;
 463	default:
 464		dev_err(dev->dev, "unsupported PCM format: %d\n",
 465			params_format(params));
 466		return -EINVAL;
 467	}
 468
 469	mutex_lock(&dev->mlock);
 470	if (dev->trigger_enabled) {
 471		dev_err(dev->dev, "PCM already running\n");
 472		ret = -EBUSY;
 473		goto unlock;
 474	}
 475
 476	/* GCLK is enabled by runtime PM. */
 477	clk_disable_unprepare(dev->gclk);
 478
 479	ret = clk_set_min_rate(dev->gclk, params_rate(params) *
 480					  SPDIFRX_GCLK_RATIO_MIN + 1);
 481	if (ret) {
 482		dev_err(dev->dev,
 483			"unable to set gclk min rate: rate %u * ratio %u + 1\n",
 484			params_rate(params), SPDIFRX_GCLK_RATIO_MIN);
 485		/* Restore runtime PM state. */
 486		clk_prepare_enable(dev->gclk);
 487		goto unlock;
 488	}
 489	ret = clk_prepare_enable(dev->gclk);
 490	if (ret) {
 491		dev_err(dev->dev, "unable to enable gclk: %d\n", ret);
 492		goto unlock;
 493	}
 494
 495	dev_dbg(dev->dev, "GCLK range min set to %d\n",
 496		params_rate(params) * SPDIFRX_GCLK_RATIO_MIN + 1);
 497
 498	ret = regmap_write(dev->regmap, SPDIFRX_MR, mr);
 499
 500unlock:
 501	mutex_unlock(&dev->mlock);
 502
 503	return ret;
 504}
 505
 506#define MCHP_SPDIF_RATES	SNDRV_PCM_RATE_8000_192000
 507
 508#define MCHP_SPDIF_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE |	\
 509				 SNDRV_PCM_FMTBIT_U16_BE |	\
 510				 SNDRV_PCM_FMTBIT_S20_3LE |	\
 511				 SNDRV_PCM_FMTBIT_S20_3BE |	\
 512				 SNDRV_PCM_FMTBIT_S24_3LE |	\
 513				 SNDRV_PCM_FMTBIT_S24_3BE |	\
 514				 SNDRV_PCM_FMTBIT_S24_LE |	\
 515				 SNDRV_PCM_FMTBIT_S24_BE	\
 516				)
 517
 518static int mchp_spdifrx_info(struct snd_kcontrol *kcontrol,
 519			     struct snd_ctl_elem_info *uinfo)
 520{
 521	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
 522	uinfo->count = 1;
 523
 524	return 0;
 525}
 526
 527static int mchp_spdifrx_cs_get(struct mchp_spdifrx_dev *dev,
 528			       int channel,
 529			       struct snd_ctl_elem_value *uvalue)
 530{
 531	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 532	struct mchp_spdifrx_ch_stat *ch_stat = &ctrl->ch_stat[channel];
 533	int ret = 0;
 534
 535	mutex_lock(&dev->mlock);
 536
 537	ret = pm_runtime_resume_and_get(dev->dev);
 538	if (ret < 0)
 539		goto unlock;
 540
 541	/*
 542	 * We may reach this point with both clocks enabled but the receiver
 543	 * still disabled. To void waiting for completion and return with
 544	 * timeout check the dev->trigger_enabled.
 545	 *
 546	 * To retrieve data:
 547	 * - if the receiver is enabled CSC IRQ will update the data in software
 548	 *   caches (ch_stat->data)
 549	 * - otherwise we just update it here the software caches with latest
 550	 *   available information and return it; in this case we don't need
 551	 *   spin locking as the IRQ is disabled and will not be raised from
 552	 *   anywhere else.
 553	 */
 554
 555	if (dev->trigger_enabled) {
 556		reinit_completion(&ch_stat->done);
 557		regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_CSC(channel));
 558		/* Check for new data available */
 559		ret = wait_for_completion_interruptible_timeout(&ch_stat->done,
 560								msecs_to_jiffies(100));
 561		/* Valid stream might not be present */
 562		if (ret <= 0) {
 563			dev_dbg(dev->dev, "channel status for channel %d timeout\n",
 564				channel);
 565			regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(channel));
 566			ret = ret ? : -ETIMEDOUT;
 567			goto pm_runtime_put;
 568		} else {
 569			ret = 0;
 570		}
 571	} else {
 572		/* Update software cache with latest channel status. */
 573		mchp_spdifrx_channel_status_read(dev, channel);
 574	}
 575
 576	memcpy(uvalue->value.iec958.status, ch_stat->data,
 577	       sizeof(ch_stat->data));
 578
 579pm_runtime_put:
 580	pm_runtime_mark_last_busy(dev->dev);
 581	pm_runtime_put_autosuspend(dev->dev);
 582unlock:
 583	mutex_unlock(&dev->mlock);
 584	return ret;
 585}
 586
 587static int mchp_spdifrx_cs1_get(struct snd_kcontrol *kcontrol,
 588				struct snd_ctl_elem_value *uvalue)
 589{
 590	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 591	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 592
 593	return mchp_spdifrx_cs_get(dev, 0, uvalue);
 594}
 595
 596static int mchp_spdifrx_cs2_get(struct snd_kcontrol *kcontrol,
 597				struct snd_ctl_elem_value *uvalue)
 598{
 599	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 600	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 601
 602	return mchp_spdifrx_cs_get(dev, 1, uvalue);
 603}
 604
 605static int mchp_spdifrx_cs_mask(struct snd_kcontrol *kcontrol,
 606				struct snd_ctl_elem_value *uvalue)
 607{
 608	memset(uvalue->value.iec958.status, 0xff,
 609	       sizeof(uvalue->value.iec958.status));
 610
 611	return 0;
 612}
 613
 614static int mchp_spdifrx_subcode_ch_get(struct mchp_spdifrx_dev *dev,
 615				       int channel,
 616				       struct snd_ctl_elem_value *uvalue)
 617{
 618	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 619	struct mchp_spdifrx_user_data *user_data = &ctrl->user_data[channel];
 620	int ret = 0;
 621
 622	mutex_lock(&dev->mlock);
 623
 624	ret = pm_runtime_resume_and_get(dev->dev);
 625	if (ret < 0)
 626		goto unlock;
 627
 628	/*
 629	 * We may reach this point with both clocks enabled but the receiver
 630	 * still disabled. To void waiting for completion to just timeout we
 631	 * check here the dev->trigger_enabled flag.
 632	 *
 633	 * To retrieve data:
 634	 * - if the receiver is enabled we need to wait for blockend IRQ to read
 635	 *   data to and update it for us in software caches
 636	 * - otherwise reading the SPDIFRX_CHUD() registers is enough.
 637	 */
 638
 639	if (dev->trigger_enabled) {
 640		reinit_completion(&user_data->done);
 641		regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_BLOCKEND);
 642		ret = wait_for_completion_interruptible_timeout(&user_data->done,
 643								msecs_to_jiffies(100));
 644		/* Valid stream might not be present. */
 645		if (ret <= 0) {
 646			dev_dbg(dev->dev, "user data for channel %d timeout\n",
 647				channel);
 648			regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND);
 649			ret = ret ? : -ETIMEDOUT;
 650			goto pm_runtime_put;
 651		} else {
 652			ret = 0;
 653		}
 654	} else {
 655		/* Update software cache with last available data. */
 656		mchp_spdifrx_channel_user_data_read(dev, channel);
 657	}
 658
 659	memcpy(uvalue->value.iec958.subcode, user_data->data,
 660	       sizeof(user_data->data));
 661
 662pm_runtime_put:
 663	pm_runtime_mark_last_busy(dev->dev);
 664	pm_runtime_put_autosuspend(dev->dev);
 665unlock:
 666	mutex_unlock(&dev->mlock);
 667	return ret;
 668}
 669
 670static int mchp_spdifrx_subcode_ch1_get(struct snd_kcontrol *kcontrol,
 671					struct snd_ctl_elem_value *uvalue)
 672{
 673	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 674	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 675
 676	return mchp_spdifrx_subcode_ch_get(dev, 0, uvalue);
 677}
 678
 679static int mchp_spdifrx_subcode_ch2_get(struct snd_kcontrol *kcontrol,
 680					struct snd_ctl_elem_value *uvalue)
 681{
 682	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 683	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 684
 685	return mchp_spdifrx_subcode_ch_get(dev, 1, uvalue);
 686}
 687
 688static int mchp_spdifrx_boolean_info(struct snd_kcontrol *kcontrol,
 689				     struct snd_ctl_elem_info *uinfo)
 690{
 691	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
 692	uinfo->count = 1;
 693	uinfo->value.integer.min = 0;
 694	uinfo->value.integer.max = 1;
 695
 696	return 0;
 697}
 698
 699static int mchp_spdifrx_ulock_get(struct snd_kcontrol *kcontrol,
 700				  struct snd_ctl_elem_value *uvalue)
 701{
 702	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 703	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 704	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 705	u32 val;
 706	int ret;
 707	bool ulock_old = ctrl->ulock;
 708
 709	mutex_lock(&dev->mlock);
 710
 711	ret = pm_runtime_resume_and_get(dev->dev);
 712	if (ret < 0)
 713		goto unlock;
 714
 715	/*
 716	 * The RSR.ULOCK has wrong value if both pclk and gclk are enabled
 717	 * and the receiver is disabled. Thus we take into account the
 718	 * dev->trigger_enabled here to return a real status.
 719	 */
 720	if (dev->trigger_enabled) {
 721		regmap_read(dev->regmap, SPDIFRX_RSR, &val);
 722		ctrl->ulock = !(val & SPDIFRX_RSR_ULOCK);
 723	} else {
 724		ctrl->ulock = 0;
 725	}
 726
 727	uvalue->value.integer.value[0] = ctrl->ulock;
 728
 729	pm_runtime_mark_last_busy(dev->dev);
 730	pm_runtime_put_autosuspend(dev->dev);
 731unlock:
 732	mutex_unlock(&dev->mlock);
 733
 734	return ulock_old != ctrl->ulock;
 735}
 736
 737static int mchp_spdifrx_badf_get(struct snd_kcontrol *kcontrol,
 738				 struct snd_ctl_elem_value *uvalue)
 739{
 740	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 741	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 742	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 743	u32 val;
 744	int ret;
 745	bool badf_old = ctrl->badf;
 746
 747	mutex_lock(&dev->mlock);
 748
 749	ret = pm_runtime_resume_and_get(dev->dev);
 750	if (ret < 0)
 751		goto unlock;
 752
 753	/*
 754	 * The RSR.ULOCK has wrong value if both pclk and gclk are enabled
 755	 * and the receiver is disabled. Thus we take into account the
 756	 * dev->trigger_enabled here to return a real status.
 757	 */
 758	if (dev->trigger_enabled) {
 759		regmap_read(dev->regmap, SPDIFRX_RSR, &val);
 760		ctrl->badf = !!(val & SPDIFRX_RSR_BADF);
 761	} else {
 762		ctrl->badf = 0;
 763	}
 764
 765	pm_runtime_mark_last_busy(dev->dev);
 766	pm_runtime_put_autosuspend(dev->dev);
 767unlock:
 768	mutex_unlock(&dev->mlock);
 769
 770	uvalue->value.integer.value[0] = ctrl->badf;
 771
 772	return badf_old != ctrl->badf;
 773}
 774
 775static int mchp_spdifrx_signal_get(struct snd_kcontrol *kcontrol,
 776				   struct snd_ctl_elem_value *uvalue)
 777{
 778	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 779	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 780	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 781	u32 val = ~0U, loops = 10;
 782	int ret;
 783	bool signal_old = ctrl->signal;
 784
 785	mutex_lock(&dev->mlock);
 786
 787	ret = pm_runtime_resume_and_get(dev->dev);
 788	if (ret < 0)
 789		goto unlock;
 790
 791	/*
 792	 * To get the signal we need to have receiver enabled. This
 793	 * could be enabled also from trigger() function thus we need to
 794	 * take care of not disabling the receiver when it runs.
 795	 */
 796	if (!dev->trigger_enabled) {
 797		regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
 798				   SPDIFRX_MR_RXEN_ENABLE);
 799
 800		/* Wait for RSR.ULOCK bit. */
 801		while (--loops) {
 802			regmap_read(dev->regmap, SPDIFRX_RSR, &val);
 803			if (!(val & SPDIFRX_RSR_ULOCK))
 804				break;
 805			usleep_range(100, 150);
 806		}
 807
 808		regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
 809				   SPDIFRX_MR_RXEN_DISABLE);
 810	} else {
 811		regmap_read(dev->regmap, SPDIFRX_RSR, &val);
 812	}
 813
 814	pm_runtime_mark_last_busy(dev->dev);
 815	pm_runtime_put_autosuspend(dev->dev);
 816
 817unlock:
 818	mutex_unlock(&dev->mlock);
 819
 820	if (!(val & SPDIFRX_RSR_ULOCK))
 821		ctrl->signal = !(val & SPDIFRX_RSR_NOSIGNAL);
 822	else
 823		ctrl->signal = 0;
 824	uvalue->value.integer.value[0] = ctrl->signal;
 825
 826	return signal_old != ctrl->signal;
 827}
 828
 829static int mchp_spdifrx_rate_info(struct snd_kcontrol *kcontrol,
 830				  struct snd_ctl_elem_info *uinfo)
 831{
 832	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 833	uinfo->count = 1;
 834	uinfo->value.integer.min = 0;
 835	uinfo->value.integer.max = 192000;
 836
 837	return 0;
 838}
 839
 840static int mchp_spdifrx_rate_get(struct snd_kcontrol *kcontrol,
 841				 struct snd_ctl_elem_value *ucontrol)
 842{
 843	struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
 844	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 845	unsigned long rate;
 846	u32 val;
 847	int ret;
 848
 849	mutex_lock(&dev->mlock);
 850
 851	ret = pm_runtime_resume_and_get(dev->dev);
 852	if (ret < 0)
 853		goto unlock;
 854
 855	/*
 856	 * The RSR.ULOCK has wrong value if both pclk and gclk are enabled
 857	 * and the receiver is disabled. Thus we take into account the
 858	 * dev->trigger_enabled here to return a real status.
 859	 */
 860	if (dev->trigger_enabled) {
 861		regmap_read(dev->regmap, SPDIFRX_RSR, &val);
 862		/* If the receiver is not locked, ISF data is invalid. */
 863		if (val & SPDIFRX_RSR_ULOCK || !(val & SPDIFRX_RSR_IFS_MASK)) {
 864			ucontrol->value.integer.value[0] = 0;
 865			goto pm_runtime_put;
 866		}
 867	} else {
 868		/* Reveicer is not locked, IFS data is invalid. */
 869		ucontrol->value.integer.value[0] = 0;
 870		goto pm_runtime_put;
 871	}
 872
 873	rate = clk_get_rate(dev->gclk);
 874
 875	ucontrol->value.integer.value[0] = rate / (32 * SPDIFRX_RSR_IFS(val));
 876
 877pm_runtime_put:
 878	pm_runtime_mark_last_busy(dev->dev);
 879	pm_runtime_put_autosuspend(dev->dev);
 880unlock:
 881	mutex_unlock(&dev->mlock);
 882	return ret;
 883}
 884
 885static struct snd_kcontrol_new mchp_spdifrx_ctrls[] = {
 886	/* Channel status controller */
 887	{
 888		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 889		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT)
 890			" Channel 1",
 891		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 892			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 893		.info = mchp_spdifrx_info,
 894		.get = mchp_spdifrx_cs1_get,
 895	},
 896	{
 897		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 898		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT)
 899			" Channel 2",
 900		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 901			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 902		.info = mchp_spdifrx_info,
 903		.get = mchp_spdifrx_cs2_get,
 904	},
 905	{
 906		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 907		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK),
 908		.access = SNDRV_CTL_ELEM_ACCESS_READ,
 909		.info = mchp_spdifrx_info,
 910		.get = mchp_spdifrx_cs_mask,
 911	},
 912	/* User bits controller */
 913	{
 914		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 915		.name = "IEC958 Subcode Capture Default Channel 1",
 916		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 917			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 918		.info = mchp_spdifrx_info,
 919		.get = mchp_spdifrx_subcode_ch1_get,
 920	},
 921	{
 922		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 923		.name = "IEC958 Subcode Capture Default Channel 2",
 924		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 925			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 926		.info = mchp_spdifrx_info,
 927		.get = mchp_spdifrx_subcode_ch2_get,
 928	},
 929	/* Lock status */
 930	{
 931		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 932		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE) "Unlocked",
 933		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 934			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 935		.info = mchp_spdifrx_boolean_info,
 936		.get = mchp_spdifrx_ulock_get,
 937	},
 938	/* Bad format */
 939	{
 940		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 941		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE)"Bad Format",
 942		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 943			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 944		.info = mchp_spdifrx_boolean_info,
 945		.get = mchp_spdifrx_badf_get,
 946	},
 947	/* Signal */
 948	{
 949		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 950		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE) "Signal",
 951		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 952			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 953		.info = mchp_spdifrx_boolean_info,
 954		.get = mchp_spdifrx_signal_get,
 955	},
 956	/* Sampling rate */
 957	{
 958		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 959		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE) "Rate",
 960		.access = SNDRV_CTL_ELEM_ACCESS_READ |
 961			SNDRV_CTL_ELEM_ACCESS_VOLATILE,
 962		.info = mchp_spdifrx_rate_info,
 963		.get = mchp_spdifrx_rate_get,
 964	},
 965};
 966
 967static int mchp_spdifrx_dai_probe(struct snd_soc_dai *dai)
 968{
 969	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
 970	struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
 971	int ch;
 972
 973	snd_soc_dai_init_dma_data(dai, NULL, &dev->capture);
 974
 975	/* Software reset the IP */
 976	regmap_write(dev->regmap, SPDIFRX_CR, SPDIFRX_CR_SWRST);
 977
 978	/* Default configuration */
 979	regmap_write(dev->regmap, SPDIFRX_MR,
 980		     SPDIFRX_MR_VBMODE_DISCARD_IF_VB1 |
 981		     SPDIFRX_MR_SBMODE_DISCARD |
 982		     SPDIFRX_MR_AUTORST_NOACTION |
 983		     SPDIFRX_MR_PACK_DISABLED);
 984
 985	for (ch = 0; ch < SPDIFRX_CHANNELS; ch++) {
 986		init_completion(&ctrl->ch_stat[ch].done);
 987		init_completion(&ctrl->user_data[ch].done);
 988	}
 989
 990	/* Add controls */
 991	snd_soc_add_dai_controls(dai, mchp_spdifrx_ctrls,
 992				 ARRAY_SIZE(mchp_spdifrx_ctrls));
 993
 994	return 0;
 995}
 996
 997static int mchp_spdifrx_dai_remove(struct snd_soc_dai *dai)
 998{
 999	struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
1000
1001	/* Disable interrupts */
1002	regmap_write(dev->regmap, SPDIFRX_IDR, GENMASK(14, 0));
1003
1004	return 0;
1005}
1006
1007static const struct snd_soc_dai_ops mchp_spdifrx_dai_ops = {
1008	.probe		= mchp_spdifrx_dai_probe,
1009	.remove		= mchp_spdifrx_dai_remove,
1010	.trigger	= mchp_spdifrx_trigger,
1011	.hw_params	= mchp_spdifrx_hw_params,
1012};
1013
1014static struct snd_soc_dai_driver mchp_spdifrx_dai = {
1015	.name = "mchp-spdifrx",
1016	.capture = {
1017		.stream_name = "Capture",
1018		.channels_min = SPDIFRX_CHANNELS,
1019		.channels_max = SPDIFRX_CHANNELS,
1020		.rates = MCHP_SPDIF_RATES,
1021		.formats = MCHP_SPDIF_FORMATS,
1022	},
1023	.ops = &mchp_spdifrx_dai_ops,
1024};
1025
1026static const struct snd_soc_component_driver mchp_spdifrx_component = {
1027	.name			= "mchp-spdifrx",
1028	.legacy_dai_naming	= 1,
1029};
1030
1031static const struct of_device_id mchp_spdifrx_dt_ids[] = {
1032	{
1033		.compatible = "microchip,sama7g5-spdifrx",
1034	},
1035	{ /* sentinel */ }
1036};
1037MODULE_DEVICE_TABLE(of, mchp_spdifrx_dt_ids);
1038
1039static int mchp_spdifrx_runtime_suspend(struct device *dev)
1040{
1041	struct mchp_spdifrx_dev *spdifrx = dev_get_drvdata(dev);
1042
1043	regcache_cache_only(spdifrx->regmap, true);
1044	clk_disable_unprepare(spdifrx->gclk);
1045	clk_disable_unprepare(spdifrx->pclk);
1046
1047	return 0;
1048}
1049
1050static int mchp_spdifrx_runtime_resume(struct device *dev)
1051{
1052	struct mchp_spdifrx_dev *spdifrx = dev_get_drvdata(dev);
1053	int ret;
1054
1055	ret = clk_prepare_enable(spdifrx->pclk);
1056	if (ret)
1057		return ret;
1058
1059	ret = clk_prepare_enable(spdifrx->gclk);
1060	if (ret)
1061		goto disable_pclk;
1062
1063	regcache_cache_only(spdifrx->regmap, false);
1064	regcache_mark_dirty(spdifrx->regmap);
1065	ret = regcache_sync(spdifrx->regmap);
1066	if (ret) {
1067		regcache_cache_only(spdifrx->regmap, true);
1068		clk_disable_unprepare(spdifrx->gclk);
1069disable_pclk:
1070		clk_disable_unprepare(spdifrx->pclk);
1071	}
1072
1073	return ret;
1074}
1075
1076static const struct dev_pm_ops mchp_spdifrx_pm_ops = {
1077	RUNTIME_PM_OPS(mchp_spdifrx_runtime_suspend, mchp_spdifrx_runtime_resume,
1078		       NULL)
1079};
1080
1081static int mchp_spdifrx_probe(struct platform_device *pdev)
1082{
1083	struct mchp_spdifrx_dev *dev;
1084	struct resource *mem;
1085	struct regmap *regmap;
1086	void __iomem *base;
1087	int irq;
1088	int err;
1089	u32 vers;
1090
1091	/* Get memory for driver data. */
1092	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
1093	if (!dev)
1094		return -ENOMEM;
1095
1096	/* Map I/O registers. */
1097	base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem);
1098	if (IS_ERR(base))
1099		return PTR_ERR(base);
1100
1101	regmap = devm_regmap_init_mmio(&pdev->dev, base,
1102				       &mchp_spdifrx_regmap_config);
1103	if (IS_ERR(regmap))
1104		return PTR_ERR(regmap);
1105
1106	/* Request IRQ. */
1107	irq = platform_get_irq(pdev, 0);
1108	if (irq < 0)
1109		return irq;
1110
1111	err = devm_request_irq(&pdev->dev, irq, mchp_spdif_interrupt, 0,
1112			       dev_name(&pdev->dev), dev);
1113	if (err)
1114		return err;
1115
1116	/* Get the peripheral clock */
1117	dev->pclk = devm_clk_get(&pdev->dev, "pclk");
1118	if (IS_ERR(dev->pclk)) {
1119		err = PTR_ERR(dev->pclk);
1120		dev_err(&pdev->dev, "failed to get the peripheral clock: %d\n",
1121			err);
1122		return err;
1123	}
1124
1125	/* Get the generated clock */
1126	dev->gclk = devm_clk_get(&pdev->dev, "gclk");
1127	if (IS_ERR(dev->gclk)) {
1128		err = PTR_ERR(dev->gclk);
1129		dev_err(&pdev->dev,
1130			"failed to get the PMC generated clock: %d\n", err);
1131		return err;
1132	}
1133
1134	/*
1135	 * Signal control need a valid rate on gclk. hw_params() configures
1136	 * it propertly but requesting signal before any hw_params() has been
1137	 * called lead to invalid value returned for signal. Thus, configure
1138	 * gclk at a valid rate, here, in initialization, to simplify the
1139	 * control path.
1140	 */
1141	clk_set_min_rate(dev->gclk, 48000 * SPDIFRX_GCLK_RATIO_MIN + 1);
1142
1143	mutex_init(&dev->mlock);
1144
1145	dev->dev = &pdev->dev;
1146	dev->regmap = regmap;
1147	platform_set_drvdata(pdev, dev);
1148
1149	pm_runtime_enable(dev->dev);
1150	if (!pm_runtime_enabled(dev->dev)) {
1151		err = mchp_spdifrx_runtime_resume(dev->dev);
1152		if (err)
1153			goto pm_runtime_disable;
1154	}
1155
1156	dev->capture.addr	= (dma_addr_t)mem->start + SPDIFRX_RHR;
1157	dev->capture.maxburst	= 1;
1158
1159	err = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
1160	if (err) {
1161		dev_err(&pdev->dev, "failed to register PCM: %d\n", err);
1162		goto pm_runtime_suspend;
1163	}
1164
1165	err = devm_snd_soc_register_component(&pdev->dev,
1166					      &mchp_spdifrx_component,
1167					      &mchp_spdifrx_dai, 1);
1168	if (err) {
1169		dev_err(&pdev->dev, "fail to register dai\n");
1170		goto pm_runtime_suspend;
1171	}
1172
1173	regmap_read(regmap, SPDIFRX_VERSION, &vers);
1174	dev_info(&pdev->dev, "hw version: %#lx\n", vers & SPDIFRX_VERSION_MASK);
1175
1176	return 0;
1177
1178pm_runtime_suspend:
1179	if (!pm_runtime_status_suspended(dev->dev))
1180		mchp_spdifrx_runtime_suspend(dev->dev);
1181pm_runtime_disable:
1182	pm_runtime_disable(dev->dev);
1183	return err;
1184}
1185
1186static void mchp_spdifrx_remove(struct platform_device *pdev)
1187{
1188	struct mchp_spdifrx_dev *dev = platform_get_drvdata(pdev);
1189
1190	pm_runtime_disable(dev->dev);
1191	if (!pm_runtime_status_suspended(dev->dev))
1192		mchp_spdifrx_runtime_suspend(dev->dev);
1193}
1194
1195static struct platform_driver mchp_spdifrx_driver = {
1196	.probe	= mchp_spdifrx_probe,
1197	.remove = mchp_spdifrx_remove,
1198	.driver	= {
1199		.name	= "mchp_spdifrx",
1200		.of_match_table = mchp_spdifrx_dt_ids,
1201		.pm	= pm_ptr(&mchp_spdifrx_pm_ops),
1202	},
1203};
1204
1205module_platform_driver(mchp_spdifrx_driver);
1206
1207MODULE_AUTHOR("Codrin Ciubotariu <codrin.ciubotariu@microchip.com>");
1208MODULE_DESCRIPTION("Microchip S/PDIF RX Controller Driver");
1209MODULE_LICENSE("GPL v2");