0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/clk.h>
0009 #include <linux/clk-provider.h>
0010 #include <linux/delay.h>
0011 #include <linux/mfd/syscon.h>
0012 #include <linux/module.h>
0013 #include <linux/of_address.h>
0014 #include <linux/of_device.h>
0015 #include <linux/of_gpio.h>
0016 #include <linux/pm_runtime.h>
0017 #include <linux/regmap.h>
0018 #include <linux/reset.h>
0019 #include <linux/spinlock.h>
0020 #include <sound/dmaengine_pcm.h>
0021 #include <sound/pcm_params.h>
0022
0023 #include "rockchip_i2s_tdm.h"
0024
0025 #define DRV_NAME "rockchip-i2s-tdm"
0026
0027 #define DEFAULT_MCLK_FS 256
0028 #define CH_GRP_MAX 4
0029 #define MULTIPLEX_CH_MAX 10
0030 #define CLK_PPM_MIN -1000
0031 #define CLK_PPM_MAX 1000
0032
0033 #define TRCM_TXRX 0
0034 #define TRCM_TX 1
0035 #define TRCM_RX 2
0036
0037 struct txrx_config {
0038 u32 addr;
0039 u32 reg;
0040 u32 txonly;
0041 u32 rxonly;
0042 };
0043
0044 struct rk_i2s_soc_data {
0045 u32 softrst_offset;
0046 u32 grf_reg_offset;
0047 u32 grf_shift;
0048 int config_count;
0049 const struct txrx_config *configs;
0050 int (*init)(struct device *dev, u32 addr);
0051 };
0052
0053 struct rk_i2s_tdm_dev {
0054 struct device *dev;
0055 struct clk *hclk;
0056 struct clk *mclk_tx;
0057 struct clk *mclk_rx;
0058
0059 struct clk *mclk_tx_src;
0060
0061 struct clk *mclk_rx_src;
0062
0063
0064
0065
0066
0067
0068
0069
0070 struct clk *mclk_root0;
0071 struct clk *mclk_root1;
0072 struct regmap *regmap;
0073 struct regmap *grf;
0074 struct snd_dmaengine_dai_dma_data capture_dma_data;
0075 struct snd_dmaengine_dai_dma_data playback_dma_data;
0076 struct reset_control *tx_reset;
0077 struct reset_control *rx_reset;
0078 struct rk_i2s_soc_data *soc_data;
0079 bool is_master_mode;
0080 bool io_multiplex;
0081 bool mclk_calibrate;
0082 bool tdm_mode;
0083 unsigned int mclk_rx_freq;
0084 unsigned int mclk_tx_freq;
0085 unsigned int mclk_root0_freq;
0086 unsigned int mclk_root1_freq;
0087 unsigned int mclk_root0_initial_freq;
0088 unsigned int mclk_root1_initial_freq;
0089 unsigned int frame_width;
0090 unsigned int clk_trcm;
0091 unsigned int i2s_sdis[CH_GRP_MAX];
0092 unsigned int i2s_sdos[CH_GRP_MAX];
0093 int clk_ppm;
0094 int refcount;
0095 spinlock_t lock;
0096 bool has_playback;
0097 bool has_capture;
0098 struct snd_soc_dai_driver *dai;
0099 };
0100
0101 static int to_ch_num(unsigned int val)
0102 {
0103 switch (val) {
0104 case I2S_CHN_4:
0105 return 4;
0106 case I2S_CHN_6:
0107 return 6;
0108 case I2S_CHN_8:
0109 return 8;
0110 default:
0111 return 2;
0112 }
0113 }
0114
0115 static void i2s_tdm_disable_unprepare_mclk(struct rk_i2s_tdm_dev *i2s_tdm)
0116 {
0117 clk_disable_unprepare(i2s_tdm->mclk_tx);
0118 clk_disable_unprepare(i2s_tdm->mclk_rx);
0119 if (i2s_tdm->mclk_calibrate) {
0120 clk_disable_unprepare(i2s_tdm->mclk_tx_src);
0121 clk_disable_unprepare(i2s_tdm->mclk_rx_src);
0122 clk_disable_unprepare(i2s_tdm->mclk_root0);
0123 clk_disable_unprepare(i2s_tdm->mclk_root1);
0124 }
0125 }
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137 static int i2s_tdm_prepare_enable_mclk(struct rk_i2s_tdm_dev *i2s_tdm)
0138 {
0139 int ret = 0;
0140
0141 ret = clk_prepare_enable(i2s_tdm->mclk_tx);
0142 if (ret)
0143 goto err_mclk_tx;
0144 ret = clk_prepare_enable(i2s_tdm->mclk_rx);
0145 if (ret)
0146 goto err_mclk_rx;
0147 if (i2s_tdm->mclk_calibrate) {
0148 ret = clk_prepare_enable(i2s_tdm->mclk_tx_src);
0149 if (ret)
0150 goto err_mclk_rx;
0151 ret = clk_prepare_enable(i2s_tdm->mclk_rx_src);
0152 if (ret)
0153 goto err_mclk_rx_src;
0154 ret = clk_prepare_enable(i2s_tdm->mclk_root0);
0155 if (ret)
0156 goto err_mclk_root0;
0157 ret = clk_prepare_enable(i2s_tdm->mclk_root1);
0158 if (ret)
0159 goto err_mclk_root1;
0160 }
0161
0162 return 0;
0163
0164 err_mclk_root1:
0165 clk_disable_unprepare(i2s_tdm->mclk_root0);
0166 err_mclk_root0:
0167 clk_disable_unprepare(i2s_tdm->mclk_rx_src);
0168 err_mclk_rx_src:
0169 clk_disable_unprepare(i2s_tdm->mclk_tx_src);
0170 err_mclk_rx:
0171 clk_disable_unprepare(i2s_tdm->mclk_tx);
0172 err_mclk_tx:
0173 return ret;
0174 }
0175
0176 static int __maybe_unused i2s_tdm_runtime_suspend(struct device *dev)
0177 {
0178 struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
0179
0180 regcache_cache_only(i2s_tdm->regmap, true);
0181 i2s_tdm_disable_unprepare_mclk(i2s_tdm);
0182
0183 clk_disable_unprepare(i2s_tdm->hclk);
0184
0185 return 0;
0186 }
0187
0188 static int __maybe_unused i2s_tdm_runtime_resume(struct device *dev)
0189 {
0190 struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
0191 int ret;
0192
0193 ret = clk_prepare_enable(i2s_tdm->hclk);
0194 if (ret)
0195 goto err_hclk;
0196
0197 ret = i2s_tdm_prepare_enable_mclk(i2s_tdm);
0198 if (ret)
0199 goto err_mclk;
0200
0201 regcache_cache_only(i2s_tdm->regmap, false);
0202 regcache_mark_dirty(i2s_tdm->regmap);
0203
0204 ret = regcache_sync(i2s_tdm->regmap);
0205 if (ret)
0206 goto err_regcache;
0207
0208 return 0;
0209
0210 err_regcache:
0211 i2s_tdm_disable_unprepare_mclk(i2s_tdm);
0212 err_mclk:
0213 clk_disable_unprepare(i2s_tdm->hclk);
0214 err_hclk:
0215 return ret;
0216 }
0217
0218 static inline struct rk_i2s_tdm_dev *to_info(struct snd_soc_dai *dai)
0219 {
0220 return snd_soc_dai_get_drvdata(dai);
0221 }
0222
0223
0224
0225
0226
0227 static void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
0228 {
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247 reset_control_assert(i2s_tdm->tx_reset);
0248 reset_control_assert(i2s_tdm->rx_reset);
0249 udelay(10);
0250 reset_control_deassert(i2s_tdm->tx_reset);
0251 reset_control_deassert(i2s_tdm->rx_reset);
0252 udelay(10);
0253 }
0254
0255 static void rockchip_snd_reset(struct reset_control *rc)
0256 {
0257 reset_control_assert(rc);
0258 udelay(10);
0259 reset_control_deassert(rc);
0260 udelay(10);
0261 }
0262
0263 static void rockchip_snd_xfer_clear(struct rk_i2s_tdm_dev *i2s_tdm,
0264 unsigned int clr)
0265 {
0266 unsigned int xfer_mask = 0;
0267 unsigned int xfer_val = 0;
0268 unsigned int val;
0269 int retry = 10;
0270 bool tx = clr & I2S_CLR_TXC;
0271 bool rx = clr & I2S_CLR_RXC;
0272
0273 if (!(rx || tx))
0274 return;
0275
0276 if (tx) {
0277 xfer_mask = I2S_XFER_TXS_START;
0278 xfer_val = I2S_XFER_TXS_STOP;
0279 }
0280 if (rx) {
0281 xfer_mask |= I2S_XFER_RXS_START;
0282 xfer_val |= I2S_XFER_RXS_STOP;
0283 }
0284
0285 regmap_update_bits(i2s_tdm->regmap, I2S_XFER, xfer_mask, xfer_val);
0286 udelay(150);
0287 regmap_update_bits(i2s_tdm->regmap, I2S_CLR, clr, clr);
0288
0289 regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
0290
0291 while (val) {
0292 udelay(15);
0293 regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
0294 retry--;
0295 if (!retry) {
0296 dev_warn(i2s_tdm->dev, "clear failed, reset %s%s\n",
0297 tx ? "tx" : "", rx ? "rx" : "");
0298 if (rx && tx)
0299 rockchip_snd_xfer_sync_reset(i2s_tdm);
0300 else if (tx)
0301 rockchip_snd_reset(i2s_tdm->tx_reset);
0302 else if (rx)
0303 rockchip_snd_reset(i2s_tdm->rx_reset);
0304 break;
0305 }
0306 }
0307 }
0308
0309 static inline void rockchip_enable_tde(struct regmap *regmap)
0310 {
0311 regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE,
0312 I2S_DMACR_TDE_ENABLE);
0313 }
0314
0315 static inline void rockchip_disable_tde(struct regmap *regmap)
0316 {
0317 regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE,
0318 I2S_DMACR_TDE_DISABLE);
0319 }
0320
0321 static inline void rockchip_enable_rde(struct regmap *regmap)
0322 {
0323 regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE,
0324 I2S_DMACR_RDE_ENABLE);
0325 }
0326
0327 static inline void rockchip_disable_rde(struct regmap *regmap)
0328 {
0329 regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE,
0330 I2S_DMACR_RDE_DISABLE);
0331 }
0332
0333
0334 static void rockchip_snd_txrxctrl(struct snd_pcm_substream *substream,
0335 struct snd_soc_dai *dai, int on)
0336 {
0337 struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
0338 unsigned long flags;
0339
0340 spin_lock_irqsave(&i2s_tdm->lock, flags);
0341 if (on) {
0342 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
0343 rockchip_enable_tde(i2s_tdm->regmap);
0344 else
0345 rockchip_enable_rde(i2s_tdm->regmap);
0346
0347 if (++i2s_tdm->refcount == 1) {
0348 rockchip_snd_xfer_sync_reset(i2s_tdm);
0349 regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
0350 I2S_XFER_TXS_START |
0351 I2S_XFER_RXS_START,
0352 I2S_XFER_TXS_START |
0353 I2S_XFER_RXS_START);
0354 }
0355 } else {
0356 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
0357 rockchip_disable_tde(i2s_tdm->regmap);
0358 else
0359 rockchip_disable_rde(i2s_tdm->regmap);
0360
0361 if (--i2s_tdm->refcount == 0) {
0362 rockchip_snd_xfer_clear(i2s_tdm,
0363 I2S_CLR_TXC | I2S_CLR_RXC);
0364 }
0365 }
0366 spin_unlock_irqrestore(&i2s_tdm->lock, flags);
0367 }
0368
0369 static void rockchip_snd_txctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)
0370 {
0371 if (on) {
0372 rockchip_enable_tde(i2s_tdm->regmap);
0373
0374 regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
0375 I2S_XFER_TXS_START,
0376 I2S_XFER_TXS_START);
0377 } else {
0378 rockchip_disable_tde(i2s_tdm->regmap);
0379
0380 rockchip_snd_xfer_clear(i2s_tdm, I2S_CLR_TXC);
0381 }
0382 }
0383
0384 static void rockchip_snd_rxctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)
0385 {
0386 if (on) {
0387 rockchip_enable_rde(i2s_tdm->regmap);
0388
0389 regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
0390 I2S_XFER_RXS_START,
0391 I2S_XFER_RXS_START);
0392 } else {
0393 rockchip_disable_rde(i2s_tdm->regmap);
0394
0395 rockchip_snd_xfer_clear(i2s_tdm, I2S_CLR_RXC);
0396 }
0397 }
0398
0399 static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
0400 unsigned int fmt)
0401 {
0402 struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai);
0403 unsigned int mask, val, tdm_val, txcr_val, rxcr_val;
0404 int ret;
0405 bool is_tdm = i2s_tdm->tdm_mode;
0406
0407 ret = pm_runtime_resume_and_get(cpu_dai->dev);
0408 if (ret < 0 && ret != -EACCES)
0409 return ret;
0410
0411 mask = I2S_CKR_MSS_MASK;
0412 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
0413 case SND_SOC_DAIFMT_BP_FP:
0414 val = I2S_CKR_MSS_MASTER;
0415 i2s_tdm->is_master_mode = true;
0416 break;
0417 case SND_SOC_DAIFMT_BC_FC:
0418 val = I2S_CKR_MSS_SLAVE;
0419 i2s_tdm->is_master_mode = false;
0420 break;
0421 default:
0422 ret = -EINVAL;
0423 goto err_pm_put;
0424 }
0425
0426 regmap_update_bits(i2s_tdm->regmap, I2S_CKR, mask, val);
0427
0428 mask = I2S_CKR_CKP_MASK | I2S_CKR_TLP_MASK | I2S_CKR_RLP_MASK;
0429 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
0430 case SND_SOC_DAIFMT_NB_NF:
0431 val = I2S_CKR_CKP_NORMAL |
0432 I2S_CKR_TLP_NORMAL |
0433 I2S_CKR_RLP_NORMAL;
0434 break;
0435 case SND_SOC_DAIFMT_NB_IF:
0436 val = I2S_CKR_CKP_NORMAL |
0437 I2S_CKR_TLP_INVERTED |
0438 I2S_CKR_RLP_INVERTED;
0439 break;
0440 case SND_SOC_DAIFMT_IB_NF:
0441 val = I2S_CKR_CKP_INVERTED |
0442 I2S_CKR_TLP_NORMAL |
0443 I2S_CKR_RLP_NORMAL;
0444 break;
0445 case SND_SOC_DAIFMT_IB_IF:
0446 val = I2S_CKR_CKP_INVERTED |
0447 I2S_CKR_TLP_INVERTED |
0448 I2S_CKR_RLP_INVERTED;
0449 break;
0450 default:
0451 ret = -EINVAL;
0452 goto err_pm_put;
0453 }
0454
0455 regmap_update_bits(i2s_tdm->regmap, I2S_CKR, mask, val);
0456
0457 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
0458 case SND_SOC_DAIFMT_RIGHT_J:
0459 txcr_val = I2S_TXCR_IBM_RSJM;
0460 rxcr_val = I2S_RXCR_IBM_RSJM;
0461 break;
0462 case SND_SOC_DAIFMT_LEFT_J:
0463 txcr_val = I2S_TXCR_IBM_LSJM;
0464 rxcr_val = I2S_RXCR_IBM_LSJM;
0465 break;
0466 case SND_SOC_DAIFMT_I2S:
0467 txcr_val = I2S_TXCR_IBM_NORMAL;
0468 rxcr_val = I2S_RXCR_IBM_NORMAL;
0469 break;
0470 case SND_SOC_DAIFMT_DSP_A:
0471 txcr_val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
0472 rxcr_val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
0473 break;
0474 case SND_SOC_DAIFMT_DSP_B:
0475 txcr_val = I2S_TXCR_TFS_PCM;
0476 rxcr_val = I2S_RXCR_TFS_PCM;
0477 break;
0478 default:
0479 ret = -EINVAL;
0480 goto err_pm_put;
0481 }
0482
0483 mask = I2S_TXCR_IBM_MASK | I2S_TXCR_TFS_MASK | I2S_TXCR_PBM_MASK;
0484 regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, mask, txcr_val);
0485
0486 mask = I2S_RXCR_IBM_MASK | I2S_RXCR_TFS_MASK | I2S_RXCR_PBM_MASK;
0487 regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, mask, rxcr_val);
0488
0489 if (is_tdm) {
0490 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
0491 case SND_SOC_DAIFMT_RIGHT_J:
0492 val = I2S_TXCR_TFS_TDM_I2S;
0493 tdm_val = TDM_SHIFT_CTRL(2);
0494 break;
0495 case SND_SOC_DAIFMT_LEFT_J:
0496 val = I2S_TXCR_TFS_TDM_I2S;
0497 tdm_val = TDM_SHIFT_CTRL(1);
0498 break;
0499 case SND_SOC_DAIFMT_I2S:
0500 val = I2S_TXCR_TFS_TDM_I2S;
0501 tdm_val = TDM_SHIFT_CTRL(0);
0502 break;
0503 case SND_SOC_DAIFMT_DSP_A:
0504 val = I2S_TXCR_TFS_TDM_PCM;
0505 tdm_val = TDM_SHIFT_CTRL(0);
0506 break;
0507 case SND_SOC_DAIFMT_DSP_B:
0508 val = I2S_TXCR_TFS_TDM_PCM;
0509 tdm_val = TDM_SHIFT_CTRL(2);
0510 break;
0511 default:
0512 ret = -EINVAL;
0513 goto err_pm_put;
0514 }
0515
0516 tdm_val |= TDM_FSYNC_WIDTH_SEL1(1);
0517 tdm_val |= TDM_FSYNC_WIDTH_HALF_FRAME;
0518
0519 mask = I2S_TXCR_TFS_MASK;
0520 regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, mask, val);
0521 regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, mask, val);
0522
0523 mask = TDM_FSYNC_WIDTH_SEL1_MSK | TDM_FSYNC_WIDTH_SEL0_MSK |
0524 TDM_SHIFT_CTRL_MSK;
0525 regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR,
0526 mask, tdm_val);
0527 regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR,
0528 mask, tdm_val);
0529 }
0530
0531 err_pm_put:
0532 pm_runtime_put(cpu_dai->dev);
0533
0534 return ret;
0535 }
0536
0537 static void rockchip_i2s_tdm_xfer_pause(struct snd_pcm_substream *substream,
0538 struct rk_i2s_tdm_dev *i2s_tdm)
0539 {
0540 int stream;
0541
0542 stream = SNDRV_PCM_STREAM_LAST - substream->stream;
0543 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
0544 rockchip_disable_tde(i2s_tdm->regmap);
0545 else
0546 rockchip_disable_rde(i2s_tdm->regmap);
0547
0548 rockchip_snd_xfer_clear(i2s_tdm, I2S_CLR_TXC | I2S_CLR_RXC);
0549 }
0550
0551 static void rockchip_i2s_tdm_xfer_resume(struct snd_pcm_substream *substream,
0552 struct rk_i2s_tdm_dev *i2s_tdm)
0553 {
0554 int stream;
0555
0556 stream = SNDRV_PCM_STREAM_LAST - substream->stream;
0557 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
0558 rockchip_enable_tde(i2s_tdm->regmap);
0559 else
0560 rockchip_enable_rde(i2s_tdm->regmap);
0561
0562 regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
0563 I2S_XFER_TXS_START |
0564 I2S_XFER_RXS_START,
0565 I2S_XFER_TXS_START |
0566 I2S_XFER_RXS_START);
0567 }
0568
0569 static int rockchip_i2s_tdm_clk_set_rate(struct rk_i2s_tdm_dev *i2s_tdm,
0570 struct clk *clk, unsigned long rate,
0571 int ppm)
0572 {
0573 unsigned long rate_target;
0574 int delta, ret;
0575
0576 if (ppm == i2s_tdm->clk_ppm)
0577 return 0;
0578
0579 if (ppm < 0)
0580 delta = -1;
0581 else
0582 delta = 1;
0583
0584 delta *= (int)div64_u64((u64)rate * (u64)abs(ppm) + 500000,
0585 1000000);
0586
0587 rate_target = rate + delta;
0588
0589 if (!rate_target)
0590 return -EINVAL;
0591
0592 ret = clk_set_rate(clk, rate_target);
0593 if (ret)
0594 return ret;
0595
0596 i2s_tdm->clk_ppm = ppm;
0597
0598 return 0;
0599 }
0600
0601 static int rockchip_i2s_tdm_calibrate_mclk(struct rk_i2s_tdm_dev *i2s_tdm,
0602 struct snd_pcm_substream *substream,
0603 unsigned int lrck_freq)
0604 {
0605 struct clk *mclk_root;
0606 struct clk *mclk_parent;
0607 unsigned int mclk_root_freq;
0608 unsigned int mclk_root_initial_freq;
0609 unsigned int mclk_parent_freq;
0610 unsigned int div, delta;
0611 u64 ppm;
0612 int ret;
0613
0614 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
0615 mclk_parent = i2s_tdm->mclk_tx_src;
0616 else
0617 mclk_parent = i2s_tdm->mclk_rx_src;
0618
0619 switch (lrck_freq) {
0620 case 8000:
0621 case 16000:
0622 case 24000:
0623 case 32000:
0624 case 48000:
0625 case 64000:
0626 case 96000:
0627 case 192000:
0628 mclk_root = i2s_tdm->mclk_root0;
0629 mclk_root_freq = i2s_tdm->mclk_root0_freq;
0630 mclk_root_initial_freq = i2s_tdm->mclk_root0_initial_freq;
0631 mclk_parent_freq = DEFAULT_MCLK_FS * 192000;
0632 break;
0633 case 11025:
0634 case 22050:
0635 case 44100:
0636 case 88200:
0637 case 176400:
0638 mclk_root = i2s_tdm->mclk_root1;
0639 mclk_root_freq = i2s_tdm->mclk_root1_freq;
0640 mclk_root_initial_freq = i2s_tdm->mclk_root1_initial_freq;
0641 mclk_parent_freq = DEFAULT_MCLK_FS * 176400;
0642 break;
0643 default:
0644 dev_err(i2s_tdm->dev, "Invalid LRCK frequency: %u Hz\n",
0645 lrck_freq);
0646 return -EINVAL;
0647 }
0648
0649 ret = clk_set_parent(mclk_parent, mclk_root);
0650 if (ret)
0651 return ret;
0652
0653 ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, mclk_root,
0654 mclk_root_freq, 0);
0655 if (ret)
0656 return ret;
0657
0658 delta = abs(mclk_root_freq % mclk_parent_freq - mclk_parent_freq);
0659 ppm = div64_u64((uint64_t)delta * 1000000, (uint64_t)mclk_root_freq);
0660
0661 if (ppm) {
0662 div = DIV_ROUND_CLOSEST(mclk_root_initial_freq, mclk_parent_freq);
0663 if (!div)
0664 return -EINVAL;
0665
0666 mclk_root_freq = mclk_parent_freq * round_up(div, 2);
0667
0668 ret = clk_set_rate(mclk_root, mclk_root_freq);
0669 if (ret)
0670 return ret;
0671
0672 i2s_tdm->mclk_root0_freq = clk_get_rate(i2s_tdm->mclk_root0);
0673 i2s_tdm->mclk_root1_freq = clk_get_rate(i2s_tdm->mclk_root1);
0674 }
0675
0676 return clk_set_rate(mclk_parent, mclk_parent_freq);
0677 }
0678
0679 static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm,
0680 struct snd_pcm_substream *substream,
0681 struct clk **mclk)
0682 {
0683 unsigned int mclk_freq;
0684 int ret;
0685
0686 if (i2s_tdm->clk_trcm) {
0687 if (i2s_tdm->mclk_tx_freq != i2s_tdm->mclk_rx_freq) {
0688 dev_err(i2s_tdm->dev,
0689 "clk_trcm, tx: %d and rx: %d should be the same\n",
0690 i2s_tdm->mclk_tx_freq,
0691 i2s_tdm->mclk_rx_freq);
0692 return -EINVAL;
0693 }
0694
0695 ret = clk_set_rate(i2s_tdm->mclk_tx, i2s_tdm->mclk_tx_freq);
0696 if (ret)
0697 return ret;
0698
0699 ret = clk_set_rate(i2s_tdm->mclk_rx, i2s_tdm->mclk_rx_freq);
0700 if (ret)
0701 return ret;
0702
0703
0704 *mclk = i2s_tdm->mclk_tx;
0705 } else {
0706 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
0707 *mclk = i2s_tdm->mclk_tx;
0708 mclk_freq = i2s_tdm->mclk_tx_freq;
0709 } else {
0710 *mclk = i2s_tdm->mclk_rx;
0711 mclk_freq = i2s_tdm->mclk_rx_freq;
0712 }
0713
0714 ret = clk_set_rate(*mclk, mclk_freq);
0715 if (ret)
0716 return ret;
0717 }
0718
0719 return 0;
0720 }
0721
0722 static int rockchip_i2s_ch_to_io(unsigned int ch, bool substream_capture)
0723 {
0724 if (substream_capture) {
0725 switch (ch) {
0726 case I2S_CHN_4:
0727 return I2S_IO_6CH_OUT_4CH_IN;
0728 case I2S_CHN_6:
0729 return I2S_IO_4CH_OUT_6CH_IN;
0730 case I2S_CHN_8:
0731 return I2S_IO_2CH_OUT_8CH_IN;
0732 default:
0733 return I2S_IO_8CH_OUT_2CH_IN;
0734 }
0735 } else {
0736 switch (ch) {
0737 case I2S_CHN_4:
0738 return I2S_IO_4CH_OUT_6CH_IN;
0739 case I2S_CHN_6:
0740 return I2S_IO_6CH_OUT_4CH_IN;
0741 case I2S_CHN_8:
0742 return I2S_IO_8CH_OUT_2CH_IN;
0743 default:
0744 return I2S_IO_2CH_OUT_8CH_IN;
0745 }
0746 }
0747 }
0748
0749 static int rockchip_i2s_io_multiplex(struct snd_pcm_substream *substream,
0750 struct snd_soc_dai *dai)
0751 {
0752 struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
0753 int usable_chs = MULTIPLEX_CH_MAX;
0754 unsigned int val = 0;
0755
0756 if (!i2s_tdm->io_multiplex)
0757 return 0;
0758
0759 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
0760 struct snd_pcm_str *playback_str =
0761 &substream->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK];
0762
0763 if (playback_str->substream_opened) {
0764 regmap_read(i2s_tdm->regmap, I2S_TXCR, &val);
0765 val &= I2S_TXCR_CSR_MASK;
0766 usable_chs = MULTIPLEX_CH_MAX - to_ch_num(val);
0767 }
0768
0769 regmap_read(i2s_tdm->regmap, I2S_RXCR, &val);
0770 val &= I2S_RXCR_CSR_MASK;
0771
0772 if (to_ch_num(val) > usable_chs) {
0773 dev_err(i2s_tdm->dev,
0774 "Capture channels (%d) > usable channels (%d)\n",
0775 to_ch_num(val), usable_chs);
0776 return -EINVAL;
0777 }
0778
0779 rockchip_i2s_ch_to_io(val, true);
0780 } else {
0781 struct snd_pcm_str *capture_str =
0782 &substream->pcm->streams[SNDRV_PCM_STREAM_CAPTURE];
0783
0784 if (capture_str->substream_opened) {
0785 regmap_read(i2s_tdm->regmap, I2S_RXCR, &val);
0786 val &= I2S_RXCR_CSR_MASK;
0787 usable_chs = MULTIPLEX_CH_MAX - to_ch_num(val);
0788 }
0789
0790 regmap_read(i2s_tdm->regmap, I2S_TXCR, &val);
0791 val &= I2S_TXCR_CSR_MASK;
0792
0793 if (to_ch_num(val) > usable_chs) {
0794 dev_err(i2s_tdm->dev,
0795 "Playback channels (%d) > usable channels (%d)\n",
0796 to_ch_num(val), usable_chs);
0797 return -EINVAL;
0798 }
0799 }
0800
0801 val <<= i2s_tdm->soc_data->grf_shift;
0802 val |= (I2S_IO_DIRECTION_MASK << i2s_tdm->soc_data->grf_shift) << 16;
0803 regmap_write(i2s_tdm->grf, i2s_tdm->soc_data->grf_reg_offset, val);
0804
0805 return 0;
0806 }
0807
0808 static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
0809 struct snd_soc_dai *dai,
0810 unsigned int div_bclk,
0811 unsigned int div_lrck,
0812 unsigned int fmt)
0813 {
0814 struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
0815 unsigned long flags;
0816
0817 if (!i2s_tdm->clk_trcm)
0818 return 0;
0819
0820 spin_lock_irqsave(&i2s_tdm->lock, flags);
0821 if (i2s_tdm->refcount)
0822 rockchip_i2s_tdm_xfer_pause(substream, i2s_tdm);
0823
0824 regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
0825 I2S_CLKDIV_TXM_MASK | I2S_CLKDIV_RXM_MASK,
0826 I2S_CLKDIV_TXM(div_bclk) | I2S_CLKDIV_RXM(div_bclk));
0827 regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
0828 I2S_CKR_TSD_MASK | I2S_CKR_RSD_MASK,
0829 I2S_CKR_TSD(div_lrck) | I2S_CKR_RSD(div_lrck));
0830
0831 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
0832 regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
0833 I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
0834 fmt);
0835 else
0836 regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
0837 I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
0838 fmt);
0839
0840 if (i2s_tdm->refcount)
0841 rockchip_i2s_tdm_xfer_resume(substream, i2s_tdm);
0842 spin_unlock_irqrestore(&i2s_tdm->lock, flags);
0843
0844 return 0;
0845 }
0846
0847 static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
0848 struct snd_pcm_hw_params *params,
0849 struct snd_soc_dai *dai)
0850 {
0851 struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
0852 struct clk *mclk;
0853 int ret = 0;
0854 unsigned int val = 0;
0855 unsigned int mclk_rate, bclk_rate, div_bclk = 4, div_lrck = 64;
0856
0857 if (i2s_tdm->is_master_mode) {
0858 if (i2s_tdm->mclk_calibrate)
0859 rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream,
0860 params_rate(params));
0861
0862 ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk);
0863 if (ret)
0864 return ret;
0865
0866 mclk_rate = clk_get_rate(mclk);
0867 bclk_rate = i2s_tdm->frame_width * params_rate(params);
0868 if (!bclk_rate)
0869 return -EINVAL;
0870
0871 div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate);
0872 div_lrck = bclk_rate / params_rate(params);
0873 }
0874
0875 switch (params_format(params)) {
0876 case SNDRV_PCM_FORMAT_S8:
0877 val |= I2S_TXCR_VDW(8);
0878 break;
0879 case SNDRV_PCM_FORMAT_S16_LE:
0880 val |= I2S_TXCR_VDW(16);
0881 break;
0882 case SNDRV_PCM_FORMAT_S20_3LE:
0883 val |= I2S_TXCR_VDW(20);
0884 break;
0885 case SNDRV_PCM_FORMAT_S24_LE:
0886 val |= I2S_TXCR_VDW(24);
0887 break;
0888 case SNDRV_PCM_FORMAT_S32_LE:
0889 val |= I2S_TXCR_VDW(32);
0890 break;
0891 default:
0892 return -EINVAL;
0893 }
0894
0895 switch (params_channels(params)) {
0896 case 8:
0897 val |= I2S_CHN_8;
0898 break;
0899 case 6:
0900 val |= I2S_CHN_6;
0901 break;
0902 case 4:
0903 val |= I2S_CHN_4;
0904 break;
0905 case 2:
0906 val |= I2S_CHN_2;
0907 break;
0908 default:
0909 return -EINVAL;
0910 }
0911
0912 if (i2s_tdm->clk_trcm) {
0913 rockchip_i2s_trcm_mode(substream, dai, div_bclk, div_lrck, val);
0914 } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
0915 regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
0916 I2S_CLKDIV_TXM_MASK,
0917 I2S_CLKDIV_TXM(div_bclk));
0918 regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
0919 I2S_CKR_TSD_MASK,
0920 I2S_CKR_TSD(div_lrck));
0921 regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
0922 I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
0923 val);
0924 } else {
0925 regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
0926 I2S_CLKDIV_RXM_MASK,
0927 I2S_CLKDIV_RXM(div_bclk));
0928 regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
0929 I2S_CKR_RSD_MASK,
0930 I2S_CKR_RSD(div_lrck));
0931 regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
0932 I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
0933 val);
0934 }
0935
0936 return rockchip_i2s_io_multiplex(substream, dai);
0937 }
0938
0939 static int rockchip_i2s_tdm_trigger(struct snd_pcm_substream *substream,
0940 int cmd, struct snd_soc_dai *dai)
0941 {
0942 struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
0943
0944 switch (cmd) {
0945 case SNDRV_PCM_TRIGGER_START:
0946 case SNDRV_PCM_TRIGGER_RESUME:
0947 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
0948 if (i2s_tdm->clk_trcm)
0949 rockchip_snd_txrxctrl(substream, dai, 1);
0950 else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
0951 rockchip_snd_rxctrl(i2s_tdm, 1);
0952 else
0953 rockchip_snd_txctrl(i2s_tdm, 1);
0954 break;
0955 case SNDRV_PCM_TRIGGER_SUSPEND:
0956 case SNDRV_PCM_TRIGGER_STOP:
0957 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
0958 if (i2s_tdm->clk_trcm)
0959 rockchip_snd_txrxctrl(substream, dai, 0);
0960 else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
0961 rockchip_snd_rxctrl(i2s_tdm, 0);
0962 else
0963 rockchip_snd_txctrl(i2s_tdm, 0);
0964 break;
0965 default:
0966 return -EINVAL;
0967 }
0968
0969 return 0;
0970 }
0971
0972 static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream,
0973 unsigned int freq, int dir)
0974 {
0975 struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai);
0976
0977
0978 if (i2s_tdm->clk_trcm) {
0979 i2s_tdm->mclk_tx_freq = freq;
0980 i2s_tdm->mclk_rx_freq = freq;
0981 } else {
0982 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
0983 i2s_tdm->mclk_tx_freq = freq;
0984 else
0985 i2s_tdm->mclk_rx_freq = freq;
0986 }
0987
0988 dev_dbg(i2s_tdm->dev, "The target mclk_%s freq is: %d\n",
0989 stream ? "rx" : "tx", freq);
0990
0991 return 0;
0992 }
0993
0994 static int rockchip_i2s_tdm_clk_compensation_info(struct snd_kcontrol *kcontrol,
0995 struct snd_ctl_elem_info *uinfo)
0996 {
0997 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0998 uinfo->count = 1;
0999 uinfo->value.integer.min = CLK_PPM_MIN;
1000 uinfo->value.integer.max = CLK_PPM_MAX;
1001 uinfo->value.integer.step = 1;
1002
1003 return 0;
1004 }
1005
1006 static int rockchip_i2s_tdm_clk_compensation_get(struct snd_kcontrol *kcontrol,
1007 struct snd_ctl_elem_value *ucontrol)
1008 {
1009 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
1010 struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
1011
1012 ucontrol->value.integer.value[0] = i2s_tdm->clk_ppm;
1013
1014 return 0;
1015 }
1016
1017 static int rockchip_i2s_tdm_clk_compensation_put(struct snd_kcontrol *kcontrol,
1018 struct snd_ctl_elem_value *ucontrol)
1019 {
1020 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
1021 struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
1022 int ret = 0, ppm = 0;
1023 int changed = 0;
1024 unsigned long old_rate;
1025
1026 if (ucontrol->value.integer.value[0] < CLK_PPM_MIN ||
1027 ucontrol->value.integer.value[0] > CLK_PPM_MAX)
1028 return -EINVAL;
1029
1030 ppm = ucontrol->value.integer.value[0];
1031
1032 old_rate = clk_get_rate(i2s_tdm->mclk_root0);
1033 ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, i2s_tdm->mclk_root0,
1034 i2s_tdm->mclk_root0_freq, ppm);
1035 if (ret)
1036 return ret;
1037 if (old_rate != clk_get_rate(i2s_tdm->mclk_root0))
1038 changed = 1;
1039
1040 if (clk_is_match(i2s_tdm->mclk_root0, i2s_tdm->mclk_root1))
1041 return changed;
1042
1043 old_rate = clk_get_rate(i2s_tdm->mclk_root1);
1044 ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, i2s_tdm->mclk_root1,
1045 i2s_tdm->mclk_root1_freq, ppm);
1046 if (ret)
1047 return ret;
1048 if (old_rate != clk_get_rate(i2s_tdm->mclk_root1))
1049 changed = 1;
1050
1051 return changed;
1052 }
1053
1054 static struct snd_kcontrol_new rockchip_i2s_tdm_compensation_control = {
1055 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1056 .name = "PCM Clock Compensation in PPM",
1057 .info = rockchip_i2s_tdm_clk_compensation_info,
1058 .get = rockchip_i2s_tdm_clk_compensation_get,
1059 .put = rockchip_i2s_tdm_clk_compensation_put,
1060 };
1061
1062 static int rockchip_i2s_tdm_dai_probe(struct snd_soc_dai *dai)
1063 {
1064 struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
1065
1066 if (i2s_tdm->has_capture)
1067 dai->capture_dma_data = &i2s_tdm->capture_dma_data;
1068 if (i2s_tdm->has_playback)
1069 dai->playback_dma_data = &i2s_tdm->playback_dma_data;
1070
1071 if (i2s_tdm->mclk_calibrate)
1072 snd_soc_add_dai_controls(dai, &rockchip_i2s_tdm_compensation_control, 1);
1073
1074 return 0;
1075 }
1076
1077 static int rockchip_dai_tdm_slot(struct snd_soc_dai *dai,
1078 unsigned int tx_mask, unsigned int rx_mask,
1079 int slots, int slot_width)
1080 {
1081 struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
1082 unsigned int mask, val;
1083
1084 i2s_tdm->tdm_mode = true;
1085 i2s_tdm->frame_width = slots * slot_width;
1086 mask = TDM_SLOT_BIT_WIDTH_MSK | TDM_FRAME_WIDTH_MSK;
1087 val = TDM_SLOT_BIT_WIDTH(slot_width) |
1088 TDM_FRAME_WIDTH(slots * slot_width);
1089 regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR,
1090 mask, val);
1091 regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR,
1092 mask, val);
1093
1094 return 0;
1095 }
1096
1097 static int rockchip_i2s_tdm_set_bclk_ratio(struct snd_soc_dai *dai,
1098 unsigned int ratio)
1099 {
1100 struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
1101
1102 if (ratio < 32 || ratio > 512 || ratio % 2 == 1)
1103 return -EINVAL;
1104
1105 i2s_tdm->frame_width = ratio;
1106
1107 return 0;
1108 }
1109
1110 static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = {
1111 .hw_params = rockchip_i2s_tdm_hw_params,
1112 .set_bclk_ratio = rockchip_i2s_tdm_set_bclk_ratio,
1113 .set_sysclk = rockchip_i2s_tdm_set_sysclk,
1114 .set_fmt = rockchip_i2s_tdm_set_fmt,
1115 .set_tdm_slot = rockchip_dai_tdm_slot,
1116 .trigger = rockchip_i2s_tdm_trigger,
1117 };
1118
1119 static const struct snd_soc_component_driver rockchip_i2s_tdm_component = {
1120 .name = DRV_NAME,
1121 .legacy_dai_naming = 1,
1122 };
1123
1124 static bool rockchip_i2s_tdm_wr_reg(struct device *dev, unsigned int reg)
1125 {
1126 switch (reg) {
1127 case I2S_TXCR:
1128 case I2S_RXCR:
1129 case I2S_CKR:
1130 case I2S_DMACR:
1131 case I2S_INTCR:
1132 case I2S_XFER:
1133 case I2S_CLR:
1134 case I2S_TXDR:
1135 case I2S_TDM_TXCR:
1136 case I2S_TDM_RXCR:
1137 case I2S_CLKDIV:
1138 return true;
1139 default:
1140 return false;
1141 }
1142 }
1143
1144 static bool rockchip_i2s_tdm_rd_reg(struct device *dev, unsigned int reg)
1145 {
1146 switch (reg) {
1147 case I2S_TXCR:
1148 case I2S_RXCR:
1149 case I2S_CKR:
1150 case I2S_DMACR:
1151 case I2S_INTCR:
1152 case I2S_XFER:
1153 case I2S_CLR:
1154 case I2S_TXDR:
1155 case I2S_RXDR:
1156 case I2S_TXFIFOLR:
1157 case I2S_INTSR:
1158 case I2S_RXFIFOLR:
1159 case I2S_TDM_TXCR:
1160 case I2S_TDM_RXCR:
1161 case I2S_CLKDIV:
1162 return true;
1163 default:
1164 return false;
1165 }
1166 }
1167
1168 static bool rockchip_i2s_tdm_volatile_reg(struct device *dev, unsigned int reg)
1169 {
1170 switch (reg) {
1171 case I2S_TXFIFOLR:
1172 case I2S_INTSR:
1173 case I2S_CLR:
1174 case I2S_TXDR:
1175 case I2S_RXDR:
1176 case I2S_RXFIFOLR:
1177 return true;
1178 default:
1179 return false;
1180 }
1181 }
1182
1183 static bool rockchip_i2s_tdm_precious_reg(struct device *dev, unsigned int reg)
1184 {
1185 if (reg == I2S_RXDR)
1186 return true;
1187 return false;
1188 }
1189
1190 static const struct reg_default rockchip_i2s_tdm_reg_defaults[] = {
1191 {0x00, 0x7200000f},
1192 {0x04, 0x01c8000f},
1193 {0x08, 0x00001f1f},
1194 {0x10, 0x001f0000},
1195 {0x14, 0x01f00000},
1196 {0x30, 0x00003eff},
1197 {0x34, 0x00003eff},
1198 {0x38, 0x00000707},
1199 };
1200
1201 static const struct regmap_config rockchip_i2s_tdm_regmap_config = {
1202 .reg_bits = 32,
1203 .reg_stride = 4,
1204 .val_bits = 32,
1205 .max_register = I2S_CLKDIV,
1206 .reg_defaults = rockchip_i2s_tdm_reg_defaults,
1207 .num_reg_defaults = ARRAY_SIZE(rockchip_i2s_tdm_reg_defaults),
1208 .writeable_reg = rockchip_i2s_tdm_wr_reg,
1209 .readable_reg = rockchip_i2s_tdm_rd_reg,
1210 .volatile_reg = rockchip_i2s_tdm_volatile_reg,
1211 .precious_reg = rockchip_i2s_tdm_precious_reg,
1212 .cache_type = REGCACHE_FLAT,
1213 };
1214
1215 static int common_soc_init(struct device *dev, u32 addr)
1216 {
1217 struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
1218 const struct txrx_config *configs = i2s_tdm->soc_data->configs;
1219 u32 reg = 0, val = 0, trcm = i2s_tdm->clk_trcm;
1220 int i;
1221
1222 if (trcm == TRCM_TXRX)
1223 return 0;
1224
1225 for (i = 0; i < i2s_tdm->soc_data->config_count; i++) {
1226 if (addr != configs[i].addr)
1227 continue;
1228 reg = configs[i].reg;
1229 if (trcm == TRCM_TX)
1230 val = configs[i].txonly;
1231 else
1232 val = configs[i].rxonly;
1233
1234 if (reg)
1235 regmap_write(i2s_tdm->grf, reg, val);
1236 }
1237
1238 return 0;
1239 }
1240
1241 static const struct txrx_config px30_txrx_config[] = {
1242 { 0xff060000, 0x184, PX30_I2S0_CLK_TXONLY, PX30_I2S0_CLK_RXONLY },
1243 };
1244
1245 static const struct txrx_config rk1808_txrx_config[] = {
1246 { 0xff7e0000, 0x190, RK1808_I2S0_CLK_TXONLY, RK1808_I2S0_CLK_RXONLY },
1247 };
1248
1249 static const struct txrx_config rk3308_txrx_config[] = {
1250 { 0xff300000, 0x308, RK3308_I2S0_CLK_TXONLY, RK3308_I2S0_CLK_RXONLY },
1251 { 0xff310000, 0x308, RK3308_I2S1_CLK_TXONLY, RK3308_I2S1_CLK_RXONLY },
1252 };
1253
1254 static const struct txrx_config rk3568_txrx_config[] = {
1255 { 0xfe410000, 0x504, RK3568_I2S1_CLK_TXONLY, RK3568_I2S1_CLK_RXONLY },
1256 { 0xfe410000, 0x508, RK3568_I2S1_MCLK_TX_OE, RK3568_I2S1_MCLK_RX_OE },
1257 { 0xfe420000, 0x508, RK3568_I2S2_MCLK_OE, RK3568_I2S2_MCLK_OE },
1258 { 0xfe430000, 0x504, RK3568_I2S3_CLK_TXONLY, RK3568_I2S3_CLK_RXONLY },
1259 { 0xfe430000, 0x508, RK3568_I2S3_MCLK_TXONLY, RK3568_I2S3_MCLK_RXONLY },
1260 { 0xfe430000, 0x508, RK3568_I2S3_MCLK_OE, RK3568_I2S3_MCLK_OE },
1261 };
1262
1263 static const struct txrx_config rv1126_txrx_config[] = {
1264 { 0xff800000, 0x10260, RV1126_I2S0_CLK_TXONLY, RV1126_I2S0_CLK_RXONLY },
1265 };
1266
1267 static struct rk_i2s_soc_data px30_i2s_soc_data = {
1268 .softrst_offset = 0x0300,
1269 .configs = px30_txrx_config,
1270 .config_count = ARRAY_SIZE(px30_txrx_config),
1271 .init = common_soc_init,
1272 };
1273
1274 static struct rk_i2s_soc_data rk1808_i2s_soc_data = {
1275 .softrst_offset = 0x0300,
1276 .configs = rk1808_txrx_config,
1277 .config_count = ARRAY_SIZE(rk1808_txrx_config),
1278 .init = common_soc_init,
1279 };
1280
1281 static struct rk_i2s_soc_data rk3308_i2s_soc_data = {
1282 .softrst_offset = 0x0400,
1283 .grf_reg_offset = 0x0308,
1284 .grf_shift = 5,
1285 .configs = rk3308_txrx_config,
1286 .config_count = ARRAY_SIZE(rk3308_txrx_config),
1287 .init = common_soc_init,
1288 };
1289
1290 static struct rk_i2s_soc_data rk3568_i2s_soc_data = {
1291 .softrst_offset = 0x0400,
1292 .configs = rk3568_txrx_config,
1293 .config_count = ARRAY_SIZE(rk3568_txrx_config),
1294 .init = common_soc_init,
1295 };
1296
1297 static struct rk_i2s_soc_data rv1126_i2s_soc_data = {
1298 .softrst_offset = 0x0300,
1299 .configs = rv1126_txrx_config,
1300 .config_count = ARRAY_SIZE(rv1126_txrx_config),
1301 .init = common_soc_init,
1302 };
1303
1304 static const struct of_device_id rockchip_i2s_tdm_match[] = {
1305 { .compatible = "rockchip,px30-i2s-tdm", .data = &px30_i2s_soc_data },
1306 { .compatible = "rockchip,rk1808-i2s-tdm", .data = &rk1808_i2s_soc_data },
1307 { .compatible = "rockchip,rk3308-i2s-tdm", .data = &rk3308_i2s_soc_data },
1308 { .compatible = "rockchip,rk3568-i2s-tdm", .data = &rk3568_i2s_soc_data },
1309 { .compatible = "rockchip,rv1126-i2s-tdm", .data = &rv1126_i2s_soc_data },
1310 {},
1311 };
1312
1313 static const struct snd_soc_dai_driver i2s_tdm_dai = {
1314 .probe = rockchip_i2s_tdm_dai_probe,
1315 .ops = &rockchip_i2s_tdm_dai_ops,
1316 };
1317
1318 static int rockchip_i2s_tdm_init_dai(struct rk_i2s_tdm_dev *i2s_tdm)
1319 {
1320 struct snd_soc_dai_driver *dai;
1321 struct property *dma_names;
1322 const char *dma_name;
1323 u64 formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |
1324 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |
1325 SNDRV_PCM_FMTBIT_S32_LE);
1326 struct device_node *node = i2s_tdm->dev->of_node;
1327
1328 of_property_for_each_string(node, "dma-names", dma_names, dma_name) {
1329 if (!strcmp(dma_name, "tx"))
1330 i2s_tdm->has_playback = true;
1331 if (!strcmp(dma_name, "rx"))
1332 i2s_tdm->has_capture = true;
1333 }
1334
1335 dai = devm_kmemdup(i2s_tdm->dev, &i2s_tdm_dai,
1336 sizeof(*dai), GFP_KERNEL);
1337 if (!dai)
1338 return -ENOMEM;
1339
1340 if (i2s_tdm->has_playback) {
1341 dai->playback.stream_name = "Playback";
1342 dai->playback.channels_min = 2;
1343 dai->playback.channels_max = 8;
1344 dai->playback.rates = SNDRV_PCM_RATE_8000_192000;
1345 dai->playback.formats = formats;
1346 }
1347
1348 if (i2s_tdm->has_capture) {
1349 dai->capture.stream_name = "Capture";
1350 dai->capture.channels_min = 2;
1351 dai->capture.channels_max = 8;
1352 dai->capture.rates = SNDRV_PCM_RATE_8000_192000;
1353 dai->capture.formats = formats;
1354 }
1355
1356 if (i2s_tdm->clk_trcm != TRCM_TXRX)
1357 dai->symmetric_rate = 1;
1358
1359 i2s_tdm->dai = dai;
1360
1361 return 0;
1362 }
1363
1364 static int rockchip_i2s_tdm_path_check(struct rk_i2s_tdm_dev *i2s_tdm,
1365 int num,
1366 bool is_rx_path)
1367 {
1368 unsigned int *i2s_data;
1369 int i, j;
1370
1371 if (is_rx_path)
1372 i2s_data = i2s_tdm->i2s_sdis;
1373 else
1374 i2s_data = i2s_tdm->i2s_sdos;
1375
1376 for (i = 0; i < num; i++) {
1377 if (i2s_data[i] > CH_GRP_MAX - 1) {
1378 dev_err(i2s_tdm->dev,
1379 "%s path i2s_data[%d]: %d is too high, max is: %d\n",
1380 is_rx_path ? "RX" : "TX",
1381 i, i2s_data[i], CH_GRP_MAX);
1382 return -EINVAL;
1383 }
1384
1385 for (j = 0; j < num; j++) {
1386 if (i == j)
1387 continue;
1388
1389 if (i2s_data[i] == i2s_data[j]) {
1390 dev_err(i2s_tdm->dev,
1391 "%s path invalid routed i2s_data: [%d]%d == [%d]%d\n",
1392 is_rx_path ? "RX" : "TX",
1393 i, i2s_data[i],
1394 j, i2s_data[j]);
1395 return -EINVAL;
1396 }
1397 }
1398 }
1399
1400 return 0;
1401 }
1402
1403 static void rockchip_i2s_tdm_tx_path_config(struct rk_i2s_tdm_dev *i2s_tdm,
1404 int num)
1405 {
1406 int idx;
1407
1408 for (idx = 0; idx < num; idx++) {
1409 regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
1410 I2S_TXCR_PATH_MASK(idx),
1411 I2S_TXCR_PATH(idx, i2s_tdm->i2s_sdos[idx]));
1412 }
1413 }
1414
1415 static void rockchip_i2s_tdm_rx_path_config(struct rk_i2s_tdm_dev *i2s_tdm,
1416 int num)
1417 {
1418 int idx;
1419
1420 for (idx = 0; idx < num; idx++) {
1421 regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
1422 I2S_RXCR_PATH_MASK(idx),
1423 I2S_RXCR_PATH(idx, i2s_tdm->i2s_sdis[idx]));
1424 }
1425 }
1426
1427 static void rockchip_i2s_tdm_path_config(struct rk_i2s_tdm_dev *i2s_tdm,
1428 int num, bool is_rx_path)
1429 {
1430 if (is_rx_path)
1431 rockchip_i2s_tdm_rx_path_config(i2s_tdm, num);
1432 else
1433 rockchip_i2s_tdm_tx_path_config(i2s_tdm, num);
1434 }
1435
1436 static int rockchip_i2s_tdm_get_calibrate_mclks(struct rk_i2s_tdm_dev *i2s_tdm)
1437 {
1438 int num_mclks = 0;
1439
1440 i2s_tdm->mclk_tx_src = devm_clk_get(i2s_tdm->dev, "mclk_tx_src");
1441 if (!IS_ERR(i2s_tdm->mclk_tx_src))
1442 num_mclks++;
1443
1444 i2s_tdm->mclk_rx_src = devm_clk_get(i2s_tdm->dev, "mclk_rx_src");
1445 if (!IS_ERR(i2s_tdm->mclk_rx_src))
1446 num_mclks++;
1447
1448 i2s_tdm->mclk_root0 = devm_clk_get(i2s_tdm->dev, "mclk_root0");
1449 if (!IS_ERR(i2s_tdm->mclk_root0))
1450 num_mclks++;
1451
1452 i2s_tdm->mclk_root1 = devm_clk_get(i2s_tdm->dev, "mclk_root1");
1453 if (!IS_ERR(i2s_tdm->mclk_root1))
1454 num_mclks++;
1455
1456 if (num_mclks < 4 && num_mclks != 0)
1457 return -ENOENT;
1458
1459 if (num_mclks == 4)
1460 i2s_tdm->mclk_calibrate = 1;
1461
1462 return 0;
1463 }
1464
1465 static int rockchip_i2s_tdm_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
1466 struct device_node *np,
1467 bool is_rx_path)
1468 {
1469 char *i2s_tx_path_prop = "rockchip,i2s-tx-route";
1470 char *i2s_rx_path_prop = "rockchip,i2s-rx-route";
1471 char *i2s_path_prop;
1472 unsigned int *i2s_data;
1473 int num, ret = 0;
1474
1475 if (is_rx_path) {
1476 i2s_path_prop = i2s_rx_path_prop;
1477 i2s_data = i2s_tdm->i2s_sdis;
1478 } else {
1479 i2s_path_prop = i2s_tx_path_prop;
1480 i2s_data = i2s_tdm->i2s_sdos;
1481 }
1482
1483 num = of_count_phandle_with_args(np, i2s_path_prop, NULL);
1484 if (num < 0) {
1485 if (num != -ENOENT) {
1486 dev_err(i2s_tdm->dev,
1487 "Failed to read '%s' num: %d\n",
1488 i2s_path_prop, num);
1489 ret = num;
1490 }
1491 return ret;
1492 } else if (num != CH_GRP_MAX) {
1493 dev_err(i2s_tdm->dev,
1494 "The num: %d should be: %d\n", num, CH_GRP_MAX);
1495 return -EINVAL;
1496 }
1497
1498 ret = of_property_read_u32_array(np, i2s_path_prop,
1499 i2s_data, num);
1500 if (ret < 0) {
1501 dev_err(i2s_tdm->dev,
1502 "Failed to read '%s': %d\n",
1503 i2s_path_prop, ret);
1504 return ret;
1505 }
1506
1507 ret = rockchip_i2s_tdm_path_check(i2s_tdm, num, is_rx_path);
1508 if (ret < 0) {
1509 dev_err(i2s_tdm->dev,
1510 "Failed to check i2s data bus: %d\n", ret);
1511 return ret;
1512 }
1513
1514 rockchip_i2s_tdm_path_config(i2s_tdm, num, is_rx_path);
1515
1516 return 0;
1517 }
1518
1519 static int rockchip_i2s_tdm_tx_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
1520 struct device_node *np)
1521 {
1522 return rockchip_i2s_tdm_path_prepare(i2s_tdm, np, 0);
1523 }
1524
1525 static int rockchip_i2s_tdm_rx_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
1526 struct device_node *np)
1527 {
1528 return rockchip_i2s_tdm_path_prepare(i2s_tdm, np, 1);
1529 }
1530
1531 static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
1532 {
1533 struct device_node *node = pdev->dev.of_node;
1534 const struct of_device_id *of_id;
1535 struct rk_i2s_tdm_dev *i2s_tdm;
1536 struct resource *res;
1537 void __iomem *regs;
1538 int ret;
1539
1540 i2s_tdm = devm_kzalloc(&pdev->dev, sizeof(*i2s_tdm), GFP_KERNEL);
1541 if (!i2s_tdm)
1542 return -ENOMEM;
1543
1544 i2s_tdm->dev = &pdev->dev;
1545
1546 of_id = of_match_device(rockchip_i2s_tdm_match, &pdev->dev);
1547 if (!of_id || !of_id->data)
1548 return -EINVAL;
1549
1550 spin_lock_init(&i2s_tdm->lock);
1551 i2s_tdm->soc_data = (struct rk_i2s_soc_data *)of_id->data;
1552
1553 i2s_tdm->frame_width = 64;
1554
1555 i2s_tdm->clk_trcm = TRCM_TXRX;
1556 if (of_property_read_bool(node, "rockchip,trcm-sync-tx-only"))
1557 i2s_tdm->clk_trcm = TRCM_TX;
1558 if (of_property_read_bool(node, "rockchip,trcm-sync-rx-only")) {
1559 if (i2s_tdm->clk_trcm) {
1560 dev_err(i2s_tdm->dev, "invalid trcm-sync configuration\n");
1561 return -EINVAL;
1562 }
1563 i2s_tdm->clk_trcm = TRCM_RX;
1564 }
1565
1566 ret = rockchip_i2s_tdm_init_dai(i2s_tdm);
1567 if (ret)
1568 return ret;
1569
1570 i2s_tdm->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
1571 if (IS_ERR(i2s_tdm->grf))
1572 return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->grf),
1573 "Error in rockchip,grf\n");
1574
1575 i2s_tdm->tx_reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
1576 "tx-m");
1577 if (IS_ERR(i2s_tdm->tx_reset)) {
1578 ret = PTR_ERR(i2s_tdm->tx_reset);
1579 return dev_err_probe(i2s_tdm->dev, ret,
1580 "Error in tx-m reset control\n");
1581 }
1582
1583 i2s_tdm->rx_reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
1584 "rx-m");
1585 if (IS_ERR(i2s_tdm->rx_reset)) {
1586 ret = PTR_ERR(i2s_tdm->rx_reset);
1587 return dev_err_probe(i2s_tdm->dev, ret,
1588 "Error in rx-m reset control\n");
1589 }
1590
1591 i2s_tdm->hclk = devm_clk_get(&pdev->dev, "hclk");
1592 if (IS_ERR(i2s_tdm->hclk)) {
1593 return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->hclk),
1594 "Failed to get clock hclk\n");
1595 }
1596
1597 i2s_tdm->mclk_tx = devm_clk_get(&pdev->dev, "mclk_tx");
1598 if (IS_ERR(i2s_tdm->mclk_tx)) {
1599 return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->mclk_tx),
1600 "Failed to get clock mclk_tx\n");
1601 }
1602
1603 i2s_tdm->mclk_rx = devm_clk_get(&pdev->dev, "mclk_rx");
1604 if (IS_ERR(i2s_tdm->mclk_rx)) {
1605 return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->mclk_rx),
1606 "Failed to get clock mclk_rx\n");
1607 }
1608
1609 i2s_tdm->io_multiplex =
1610 of_property_read_bool(node, "rockchip,io-multiplex");
1611
1612 ret = rockchip_i2s_tdm_get_calibrate_mclks(i2s_tdm);
1613 if (ret)
1614 return dev_err_probe(i2s_tdm->dev, ret,
1615 "mclk-calibrate clocks missing");
1616
1617 regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1618 if (IS_ERR(regs)) {
1619 return dev_err_probe(i2s_tdm->dev, PTR_ERR(regs),
1620 "Failed to get resource IORESOURCE_MEM\n");
1621 }
1622
1623 i2s_tdm->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
1624 &rockchip_i2s_tdm_regmap_config);
1625 if (IS_ERR(i2s_tdm->regmap)) {
1626 return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->regmap),
1627 "Failed to initialise regmap\n");
1628 }
1629
1630 if (i2s_tdm->has_playback) {
1631 i2s_tdm->playback_dma_data.addr = res->start + I2S_TXDR;
1632 i2s_tdm->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
1633 i2s_tdm->playback_dma_data.maxburst = 8;
1634 }
1635
1636 if (i2s_tdm->has_capture) {
1637 i2s_tdm->capture_dma_data.addr = res->start + I2S_RXDR;
1638 i2s_tdm->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
1639 i2s_tdm->capture_dma_data.maxburst = 8;
1640 }
1641
1642 ret = rockchip_i2s_tdm_tx_path_prepare(i2s_tdm, node);
1643 if (ret < 0) {
1644 dev_err(&pdev->dev, "I2S TX path prepare failed: %d\n", ret);
1645 return ret;
1646 }
1647
1648 ret = rockchip_i2s_tdm_rx_path_prepare(i2s_tdm, node);
1649 if (ret < 0) {
1650 dev_err(&pdev->dev, "I2S RX path prepare failed: %d\n", ret);
1651 return ret;
1652 }
1653
1654 dev_set_drvdata(&pdev->dev, i2s_tdm);
1655
1656 ret = clk_prepare_enable(i2s_tdm->hclk);
1657 if (ret) {
1658 return dev_err_probe(i2s_tdm->dev, ret,
1659 "Failed to enable clock hclk\n");
1660 }
1661
1662 ret = i2s_tdm_prepare_enable_mclk(i2s_tdm);
1663 if (ret) {
1664 ret = dev_err_probe(i2s_tdm->dev, ret,
1665 "Failed to enable one or more mclks\n");
1666 goto err_disable_hclk;
1667 }
1668
1669 if (i2s_tdm->mclk_calibrate) {
1670 i2s_tdm->mclk_root0_initial_freq = clk_get_rate(i2s_tdm->mclk_root0);
1671 i2s_tdm->mclk_root1_initial_freq = clk_get_rate(i2s_tdm->mclk_root1);
1672 i2s_tdm->mclk_root0_freq = i2s_tdm->mclk_root0_initial_freq;
1673 i2s_tdm->mclk_root1_freq = i2s_tdm->mclk_root1_initial_freq;
1674 }
1675
1676 pm_runtime_enable(&pdev->dev);
1677
1678 regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_TDL_MASK,
1679 I2S_DMACR_TDL(16));
1680 regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_RDL_MASK,
1681 I2S_DMACR_RDL(16));
1682 regmap_update_bits(i2s_tdm->regmap, I2S_CKR, I2S_CKR_TRCM_MASK,
1683 i2s_tdm->clk_trcm << I2S_CKR_TRCM_SHIFT);
1684
1685 if (i2s_tdm->soc_data && i2s_tdm->soc_data->init)
1686 i2s_tdm->soc_data->init(&pdev->dev, res->start);
1687
1688 ret = devm_snd_soc_register_component(&pdev->dev,
1689 &rockchip_i2s_tdm_component,
1690 i2s_tdm->dai, 1);
1691
1692 if (ret) {
1693 dev_err(&pdev->dev, "Could not register DAI\n");
1694 goto err_suspend;
1695 }
1696
1697 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
1698 if (ret) {
1699 dev_err(&pdev->dev, "Could not register PCM\n");
1700 goto err_suspend;
1701 }
1702
1703 return 0;
1704
1705 err_suspend:
1706 if (!pm_runtime_status_suspended(&pdev->dev))
1707 i2s_tdm_runtime_suspend(&pdev->dev);
1708 pm_runtime_disable(&pdev->dev);
1709
1710 err_disable_hclk:
1711 clk_disable_unprepare(i2s_tdm->hclk);
1712
1713 return ret;
1714 }
1715
1716 static int rockchip_i2s_tdm_remove(struct platform_device *pdev)
1717 {
1718 if (!pm_runtime_status_suspended(&pdev->dev))
1719 i2s_tdm_runtime_suspend(&pdev->dev);
1720
1721 pm_runtime_disable(&pdev->dev);
1722
1723 return 0;
1724 }
1725
1726 static int __maybe_unused rockchip_i2s_tdm_suspend(struct device *dev)
1727 {
1728 struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
1729
1730 regcache_mark_dirty(i2s_tdm->regmap);
1731
1732 return 0;
1733 }
1734
1735 static int __maybe_unused rockchip_i2s_tdm_resume(struct device *dev)
1736 {
1737 struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
1738 int ret;
1739
1740 ret = pm_runtime_resume_and_get(dev);
1741 if (ret < 0)
1742 return ret;
1743 ret = regcache_sync(i2s_tdm->regmap);
1744 pm_runtime_put(dev);
1745
1746 return ret;
1747 }
1748
1749 static const struct dev_pm_ops rockchip_i2s_tdm_pm_ops = {
1750 SET_RUNTIME_PM_OPS(i2s_tdm_runtime_suspend, i2s_tdm_runtime_resume,
1751 NULL)
1752 SET_SYSTEM_SLEEP_PM_OPS(rockchip_i2s_tdm_suspend,
1753 rockchip_i2s_tdm_resume)
1754 };
1755
1756 static struct platform_driver rockchip_i2s_tdm_driver = {
1757 .probe = rockchip_i2s_tdm_probe,
1758 .remove = rockchip_i2s_tdm_remove,
1759 .driver = {
1760 .name = DRV_NAME,
1761 .of_match_table = of_match_ptr(rockchip_i2s_tdm_match),
1762 .pm = &rockchip_i2s_tdm_pm_ops,
1763 },
1764 };
1765 module_platform_driver(rockchip_i2s_tdm_driver);
1766
1767 MODULE_DESCRIPTION("ROCKCHIP I2S/TDM ASoC Interface");
1768 MODULE_AUTHOR("Sugar Zhang <sugar.zhang@rock-chips.com>");
1769 MODULE_LICENSE("GPL v2");
1770 MODULE_ALIAS("platform:" DRV_NAME);
1771 MODULE_DEVICE_TABLE(of, rockchip_i2s_tdm_match);