root/sound/soc/rockchip/rockchip_i2s.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. i2s_runtime_suspend
  2. i2s_runtime_resume
  3. to_info
  4. rockchip_snd_txctrl
  5. rockchip_snd_rxctrl
  6. rockchip_i2s_set_fmt
  7. rockchip_i2s_hw_params
  8. rockchip_i2s_trigger
  9. rockchip_i2s_set_sysclk
  10. rockchip_i2s_dai_probe
  11. rockchip_i2s_wr_reg
  12. rockchip_i2s_rd_reg
  13. rockchip_i2s_volatile_reg
  14. rockchip_i2s_precious_reg
  15. rockchip_i2s_probe
  16. rockchip_i2s_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /* sound/soc/rockchip/rockchip_i2s.c
   3  *
   4  * ALSA SoC Audio Layer - Rockchip I2S Controller driver
   5  *
   6  * Copyright (c) 2014 Rockchip Electronics Co. Ltd.
   7  * Author: Jianqun <jay.xu@rock-chips.com>
   8  */
   9 
  10 #include <linux/module.h>
  11 #include <linux/mfd/syscon.h>
  12 #include <linux/delay.h>
  13 #include <linux/of_gpio.h>
  14 #include <linux/of_device.h>
  15 #include <linux/clk.h>
  16 #include <linux/pm_runtime.h>
  17 #include <linux/regmap.h>
  18 #include <sound/pcm_params.h>
  19 #include <sound/dmaengine_pcm.h>
  20 
  21 #include "rockchip_i2s.h"
  22 #include "rockchip_pcm.h"
  23 
  24 #define DRV_NAME "rockchip-i2s"
  25 
  26 struct rk_i2s_pins {
  27         u32 reg_offset;
  28         u32 shift;
  29 };
  30 
  31 struct rk_i2s_dev {
  32         struct device *dev;
  33 
  34         struct clk *hclk;
  35         struct clk *mclk;
  36 
  37         struct snd_dmaengine_dai_dma_data capture_dma_data;
  38         struct snd_dmaengine_dai_dma_data playback_dma_data;
  39 
  40         struct regmap *regmap;
  41         struct regmap *grf;
  42 
  43 /*
  44  * Used to indicate the tx/rx status.
  45  * I2S controller hopes to start the tx and rx together,
  46  * also to stop them when they are both try to stop.
  47 */
  48         bool tx_start;
  49         bool rx_start;
  50         bool is_master_mode;
  51         const struct rk_i2s_pins *pins;
  52 };
  53 
  54 static int i2s_runtime_suspend(struct device *dev)
  55 {
  56         struct rk_i2s_dev *i2s = dev_get_drvdata(dev);
  57 
  58         regcache_cache_only(i2s->regmap, true);
  59         clk_disable_unprepare(i2s->mclk);
  60 
  61         return 0;
  62 }
  63 
  64 static int i2s_runtime_resume(struct device *dev)
  65 {
  66         struct rk_i2s_dev *i2s = dev_get_drvdata(dev);
  67         int ret;
  68 
  69         ret = clk_prepare_enable(i2s->mclk);
  70         if (ret) {
  71                 dev_err(i2s->dev, "clock enable failed %d\n", ret);
  72                 return ret;
  73         }
  74 
  75         regcache_cache_only(i2s->regmap, false);
  76         regcache_mark_dirty(i2s->regmap);
  77 
  78         ret = regcache_sync(i2s->regmap);
  79         if (ret)
  80                 clk_disable_unprepare(i2s->mclk);
  81 
  82         return ret;
  83 }
  84 
  85 static inline struct rk_i2s_dev *to_info(struct snd_soc_dai *dai)
  86 {
  87         return snd_soc_dai_get_drvdata(dai);
  88 }
  89 
  90 static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
  91 {
  92         unsigned int val = 0;
  93         int retry = 10;
  94 
  95         if (on) {
  96                 regmap_update_bits(i2s->regmap, I2S_DMACR,
  97                                    I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE);
  98 
  99                 regmap_update_bits(i2s->regmap, I2S_XFER,
 100                                    I2S_XFER_TXS_START | I2S_XFER_RXS_START,
 101                                    I2S_XFER_TXS_START | I2S_XFER_RXS_START);
 102 
 103                 i2s->tx_start = true;
 104         } else {
 105                 i2s->tx_start = false;
 106 
 107                 regmap_update_bits(i2s->regmap, I2S_DMACR,
 108                                    I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE);
 109 
 110                 if (!i2s->rx_start) {
 111                         regmap_update_bits(i2s->regmap, I2S_XFER,
 112                                            I2S_XFER_TXS_START |
 113                                            I2S_XFER_RXS_START,
 114                                            I2S_XFER_TXS_STOP |
 115                                            I2S_XFER_RXS_STOP);
 116 
 117                         udelay(150);
 118                         regmap_update_bits(i2s->regmap, I2S_CLR,
 119                                            I2S_CLR_TXC | I2S_CLR_RXC,
 120                                            I2S_CLR_TXC | I2S_CLR_RXC);
 121 
 122                         regmap_read(i2s->regmap, I2S_CLR, &val);
 123 
 124                         /* Should wait for clear operation to finish */
 125                         while (val) {
 126                                 regmap_read(i2s->regmap, I2S_CLR, &val);
 127                                 retry--;
 128                                 if (!retry) {
 129                                         dev_warn(i2s->dev, "fail to clear\n");
 130                                         break;
 131                                 }
 132                         }
 133                 }
 134         }
 135 }
 136 
 137 static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
 138 {
 139         unsigned int val = 0;
 140         int retry = 10;
 141 
 142         if (on) {
 143                 regmap_update_bits(i2s->regmap, I2S_DMACR,
 144                                    I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE);
 145 
 146                 regmap_update_bits(i2s->regmap, I2S_XFER,
 147                                    I2S_XFER_TXS_START | I2S_XFER_RXS_START,
 148                                    I2S_XFER_TXS_START | I2S_XFER_RXS_START);
 149 
 150                 i2s->rx_start = true;
 151         } else {
 152                 i2s->rx_start = false;
 153 
 154                 regmap_update_bits(i2s->regmap, I2S_DMACR,
 155                                    I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE);
 156 
 157                 if (!i2s->tx_start) {
 158                         regmap_update_bits(i2s->regmap, I2S_XFER,
 159                                            I2S_XFER_TXS_START |
 160                                            I2S_XFER_RXS_START,
 161                                            I2S_XFER_TXS_STOP |
 162                                            I2S_XFER_RXS_STOP);
 163 
 164                         udelay(150);
 165                         regmap_update_bits(i2s->regmap, I2S_CLR,
 166                                            I2S_CLR_TXC | I2S_CLR_RXC,
 167                                            I2S_CLR_TXC | I2S_CLR_RXC);
 168 
 169                         regmap_read(i2s->regmap, I2S_CLR, &val);
 170 
 171                         /* Should wait for clear operation to finish */
 172                         while (val) {
 173                                 regmap_read(i2s->regmap, I2S_CLR, &val);
 174                                 retry--;
 175                                 if (!retry) {
 176                                         dev_warn(i2s->dev, "fail to clear\n");
 177                                         break;
 178                                 }
 179                         }
 180                 }
 181         }
 182 }
 183 
 184 static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 185                                 unsigned int fmt)
 186 {
 187         struct rk_i2s_dev *i2s = to_info(cpu_dai);
 188         unsigned int mask = 0, val = 0;
 189 
 190         mask = I2S_CKR_MSS_MASK;
 191         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 192         case SND_SOC_DAIFMT_CBS_CFS:
 193                 /* Set source clock in Master mode */
 194                 val = I2S_CKR_MSS_MASTER;
 195                 i2s->is_master_mode = true;
 196                 break;
 197         case SND_SOC_DAIFMT_CBM_CFM:
 198                 val = I2S_CKR_MSS_SLAVE;
 199                 i2s->is_master_mode = false;
 200                 break;
 201         default:
 202                 return -EINVAL;
 203         }
 204 
 205         regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
 206 
 207         mask = I2S_CKR_CKP_MASK;
 208         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 209         case SND_SOC_DAIFMT_NB_NF:
 210                 val = I2S_CKR_CKP_NEG;
 211                 break;
 212         case SND_SOC_DAIFMT_IB_NF:
 213                 val = I2S_CKR_CKP_POS;
 214                 break;
 215         default:
 216                 return -EINVAL;
 217         }
 218 
 219         regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
 220 
 221         mask = I2S_TXCR_IBM_MASK | I2S_TXCR_TFS_MASK | I2S_TXCR_PBM_MASK;
 222         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 223         case SND_SOC_DAIFMT_RIGHT_J:
 224                 val = I2S_TXCR_IBM_RSJM;
 225                 break;
 226         case SND_SOC_DAIFMT_LEFT_J:
 227                 val = I2S_TXCR_IBM_LSJM;
 228                 break;
 229         case SND_SOC_DAIFMT_I2S:
 230                 val = I2S_TXCR_IBM_NORMAL;
 231                 break;
 232         case SND_SOC_DAIFMT_DSP_A: /* PCM no delay mode */
 233                 val = I2S_TXCR_TFS_PCM;
 234                 break;
 235         case SND_SOC_DAIFMT_DSP_B: /* PCM delay 1 mode */
 236                 val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
 237                 break;
 238         default:
 239                 return -EINVAL;
 240         }
 241 
 242         regmap_update_bits(i2s->regmap, I2S_TXCR, mask, val);
 243 
 244         mask = I2S_RXCR_IBM_MASK | I2S_RXCR_TFS_MASK | I2S_RXCR_PBM_MASK;
 245         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 246         case SND_SOC_DAIFMT_RIGHT_J:
 247                 val = I2S_RXCR_IBM_RSJM;
 248                 break;
 249         case SND_SOC_DAIFMT_LEFT_J:
 250                 val = I2S_RXCR_IBM_LSJM;
 251                 break;
 252         case SND_SOC_DAIFMT_I2S:
 253                 val = I2S_RXCR_IBM_NORMAL;
 254                 break;
 255         case SND_SOC_DAIFMT_DSP_A: /* PCM no delay mode */
 256                 val = I2S_RXCR_TFS_PCM;
 257                 break;
 258         case SND_SOC_DAIFMT_DSP_B: /* PCM delay 1 mode */
 259                 val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
 260                 break;
 261         default:
 262                 return -EINVAL;
 263         }
 264 
 265         regmap_update_bits(i2s->regmap, I2S_RXCR, mask, val);
 266 
 267         return 0;
 268 }
 269 
 270 static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
 271                                   struct snd_pcm_hw_params *params,
 272                                   struct snd_soc_dai *dai)
 273 {
 274         struct rk_i2s_dev *i2s = to_info(dai);
 275         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 276         unsigned int val = 0;
 277         unsigned int mclk_rate, bclk_rate, div_bclk, div_lrck;
 278 
 279         if (i2s->is_master_mode) {
 280                 mclk_rate = clk_get_rate(i2s->mclk);
 281                 bclk_rate = 2 * 32 * params_rate(params);
 282                 if (bclk_rate && mclk_rate % bclk_rate)
 283                         return -EINVAL;
 284 
 285                 div_bclk = mclk_rate / bclk_rate;
 286                 div_lrck = bclk_rate / params_rate(params);
 287                 regmap_update_bits(i2s->regmap, I2S_CKR,
 288                                    I2S_CKR_MDIV_MASK,
 289                                    I2S_CKR_MDIV(div_bclk));
 290 
 291                 regmap_update_bits(i2s->regmap, I2S_CKR,
 292                                    I2S_CKR_TSD_MASK |
 293                                    I2S_CKR_RSD_MASK,
 294                                    I2S_CKR_TSD(div_lrck) |
 295                                    I2S_CKR_RSD(div_lrck));
 296         }
 297 
 298         switch (params_format(params)) {
 299         case SNDRV_PCM_FORMAT_S8:
 300                 val |= I2S_TXCR_VDW(8);
 301                 break;
 302         case SNDRV_PCM_FORMAT_S16_LE:
 303                 val |= I2S_TXCR_VDW(16);
 304                 break;
 305         case SNDRV_PCM_FORMAT_S20_3LE:
 306                 val |= I2S_TXCR_VDW(20);
 307                 break;
 308         case SNDRV_PCM_FORMAT_S24_LE:
 309                 val |= I2S_TXCR_VDW(24);
 310                 break;
 311         case SNDRV_PCM_FORMAT_S32_LE:
 312                 val |= I2S_TXCR_VDW(32);
 313                 break;
 314         default:
 315                 return -EINVAL;
 316         }
 317 
 318         switch (params_channels(params)) {
 319         case 8:
 320                 val |= I2S_CHN_8;
 321                 break;
 322         case 6:
 323                 val |= I2S_CHN_6;
 324                 break;
 325         case 4:
 326                 val |= I2S_CHN_4;
 327                 break;
 328         case 2:
 329                 val |= I2S_CHN_2;
 330                 break;
 331         default:
 332                 dev_err(i2s->dev, "invalid channel: %d\n",
 333                         params_channels(params));
 334                 return -EINVAL;
 335         }
 336 
 337         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
 338                 regmap_update_bits(i2s->regmap, I2S_RXCR,
 339                                    I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
 340                                    val);
 341         else
 342                 regmap_update_bits(i2s->regmap, I2S_TXCR,
 343                                    I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
 344                                    val);
 345 
 346         if (!IS_ERR(i2s->grf) && i2s->pins) {
 347                 regmap_read(i2s->regmap, I2S_TXCR, &val);
 348                 val &= I2S_TXCR_CSR_MASK;
 349 
 350                 switch (val) {
 351                 case I2S_CHN_4:
 352                         val = I2S_IO_4CH_OUT_6CH_IN;
 353                         break;
 354                 case I2S_CHN_6:
 355                         val = I2S_IO_6CH_OUT_4CH_IN;
 356                         break;
 357                 case I2S_CHN_8:
 358                         val = I2S_IO_8CH_OUT_2CH_IN;
 359                         break;
 360                 default:
 361                         val = I2S_IO_2CH_OUT_8CH_IN;
 362                         break;
 363                 }
 364 
 365                 val <<= i2s->pins->shift;
 366                 val |= (I2S_IO_DIRECTION_MASK << i2s->pins->shift) << 16;
 367                 regmap_write(i2s->grf, i2s->pins->reg_offset, val);
 368         }
 369 
 370         regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDL_MASK,
 371                            I2S_DMACR_TDL(16));
 372         regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDL_MASK,
 373                            I2S_DMACR_RDL(16));
 374 
 375         val = I2S_CKR_TRCM_TXRX;
 376         if (dai->driver->symmetric_rates && rtd->dai_link->symmetric_rates)
 377                 val = I2S_CKR_TRCM_TXONLY;
 378 
 379         regmap_update_bits(i2s->regmap, I2S_CKR,
 380                            I2S_CKR_TRCM_MASK,
 381                            val);
 382         return 0;
 383 }
 384 
 385 static int rockchip_i2s_trigger(struct snd_pcm_substream *substream,
 386                                 int cmd, struct snd_soc_dai *dai)
 387 {
 388         struct rk_i2s_dev *i2s = to_info(dai);
 389         int ret = 0;
 390 
 391         switch (cmd) {
 392         case SNDRV_PCM_TRIGGER_START:
 393         case SNDRV_PCM_TRIGGER_RESUME:
 394         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 395                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
 396                         rockchip_snd_rxctrl(i2s, 1);
 397                 else
 398                         rockchip_snd_txctrl(i2s, 1);
 399                 break;
 400         case SNDRV_PCM_TRIGGER_SUSPEND:
 401         case SNDRV_PCM_TRIGGER_STOP:
 402         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 403                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
 404                         rockchip_snd_rxctrl(i2s, 0);
 405                 else
 406                         rockchip_snd_txctrl(i2s, 0);
 407                 break;
 408         default:
 409                 ret = -EINVAL;
 410                 break;
 411         }
 412 
 413         return ret;
 414 }
 415 
 416 static int rockchip_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id,
 417                                    unsigned int freq, int dir)
 418 {
 419         struct rk_i2s_dev *i2s = to_info(cpu_dai);
 420         int ret;
 421 
 422         if (freq == 0)
 423                 return 0;
 424 
 425         ret = clk_set_rate(i2s->mclk, freq);
 426         if (ret)
 427                 dev_err(i2s->dev, "Fail to set mclk %d\n", ret);
 428 
 429         return ret;
 430 }
 431 
 432 static int rockchip_i2s_dai_probe(struct snd_soc_dai *dai)
 433 {
 434         struct rk_i2s_dev *i2s = snd_soc_dai_get_drvdata(dai);
 435 
 436         dai->capture_dma_data = &i2s->capture_dma_data;
 437         dai->playback_dma_data = &i2s->playback_dma_data;
 438 
 439         return 0;
 440 }
 441 
 442 static const struct snd_soc_dai_ops rockchip_i2s_dai_ops = {
 443         .hw_params = rockchip_i2s_hw_params,
 444         .set_sysclk = rockchip_i2s_set_sysclk,
 445         .set_fmt = rockchip_i2s_set_fmt,
 446         .trigger = rockchip_i2s_trigger,
 447 };
 448 
 449 static struct snd_soc_dai_driver rockchip_i2s_dai = {
 450         .probe = rockchip_i2s_dai_probe,
 451         .playback = {
 452                 .stream_name = "Playback",
 453                 .channels_min = 2,
 454                 .channels_max = 8,
 455                 .rates = SNDRV_PCM_RATE_8000_192000,
 456                 .formats = (SNDRV_PCM_FMTBIT_S8 |
 457                             SNDRV_PCM_FMTBIT_S16_LE |
 458                             SNDRV_PCM_FMTBIT_S20_3LE |
 459                             SNDRV_PCM_FMTBIT_S24_LE |
 460                             SNDRV_PCM_FMTBIT_S32_LE),
 461         },
 462         .capture = {
 463                 .stream_name = "Capture",
 464                 .channels_min = 2,
 465                 .channels_max = 2,
 466                 .rates = SNDRV_PCM_RATE_8000_192000,
 467                 .formats = (SNDRV_PCM_FMTBIT_S8 |
 468                             SNDRV_PCM_FMTBIT_S16_LE |
 469                             SNDRV_PCM_FMTBIT_S20_3LE |
 470                             SNDRV_PCM_FMTBIT_S24_LE |
 471                             SNDRV_PCM_FMTBIT_S32_LE),
 472         },
 473         .ops = &rockchip_i2s_dai_ops,
 474         .symmetric_rates = 1,
 475 };
 476 
 477 static const struct snd_soc_component_driver rockchip_i2s_component = {
 478         .name = DRV_NAME,
 479 };
 480 
 481 static bool rockchip_i2s_wr_reg(struct device *dev, unsigned int reg)
 482 {
 483         switch (reg) {
 484         case I2S_TXCR:
 485         case I2S_RXCR:
 486         case I2S_CKR:
 487         case I2S_DMACR:
 488         case I2S_INTCR:
 489         case I2S_XFER:
 490         case I2S_CLR:
 491         case I2S_TXDR:
 492                 return true;
 493         default:
 494                 return false;
 495         }
 496 }
 497 
 498 static bool rockchip_i2s_rd_reg(struct device *dev, unsigned int reg)
 499 {
 500         switch (reg) {
 501         case I2S_TXCR:
 502         case I2S_RXCR:
 503         case I2S_CKR:
 504         case I2S_DMACR:
 505         case I2S_INTCR:
 506         case I2S_XFER:
 507         case I2S_CLR:
 508         case I2S_TXDR:
 509         case I2S_RXDR:
 510         case I2S_FIFOLR:
 511         case I2S_INTSR:
 512                 return true;
 513         default:
 514                 return false;
 515         }
 516 }
 517 
 518 static bool rockchip_i2s_volatile_reg(struct device *dev, unsigned int reg)
 519 {
 520         switch (reg) {
 521         case I2S_INTSR:
 522         case I2S_CLR:
 523         case I2S_FIFOLR:
 524         case I2S_TXDR:
 525         case I2S_RXDR:
 526                 return true;
 527         default:
 528                 return false;
 529         }
 530 }
 531 
 532 static bool rockchip_i2s_precious_reg(struct device *dev, unsigned int reg)
 533 {
 534         switch (reg) {
 535         case I2S_RXDR:
 536                 return true;
 537         default:
 538                 return false;
 539         }
 540 }
 541 
 542 static const struct reg_default rockchip_i2s_reg_defaults[] = {
 543         {0x00, 0x0000000f},
 544         {0x04, 0x0000000f},
 545         {0x08, 0x00071f1f},
 546         {0x10, 0x001f0000},
 547         {0x14, 0x01f00000},
 548 };
 549 
 550 static const struct regmap_config rockchip_i2s_regmap_config = {
 551         .reg_bits = 32,
 552         .reg_stride = 4,
 553         .val_bits = 32,
 554         .max_register = I2S_RXDR,
 555         .reg_defaults = rockchip_i2s_reg_defaults,
 556         .num_reg_defaults = ARRAY_SIZE(rockchip_i2s_reg_defaults),
 557         .writeable_reg = rockchip_i2s_wr_reg,
 558         .readable_reg = rockchip_i2s_rd_reg,
 559         .volatile_reg = rockchip_i2s_volatile_reg,
 560         .precious_reg = rockchip_i2s_precious_reg,
 561         .cache_type = REGCACHE_FLAT,
 562 };
 563 
 564 static const struct rk_i2s_pins rk3399_i2s_pins = {
 565         .reg_offset = 0xe220,
 566         .shift = 11,
 567 };
 568 
 569 static const struct of_device_id rockchip_i2s_match[] = {
 570         { .compatible = "rockchip,rk3066-i2s", },
 571         { .compatible = "rockchip,rk3188-i2s", },
 572         { .compatible = "rockchip,rk3288-i2s", },
 573         { .compatible = "rockchip,rk3399-i2s", .data = &rk3399_i2s_pins },
 574         {},
 575 };
 576 
 577 static int rockchip_i2s_probe(struct platform_device *pdev)
 578 {
 579         struct device_node *node = pdev->dev.of_node;
 580         const struct of_device_id *of_id;
 581         struct rk_i2s_dev *i2s;
 582         struct snd_soc_dai_driver *soc_dai;
 583         struct resource *res;
 584         void __iomem *regs;
 585         int ret;
 586         int val;
 587 
 588         i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL);
 589         if (!i2s)
 590                 return -ENOMEM;
 591 
 592         i2s->dev = &pdev->dev;
 593 
 594         i2s->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
 595         if (!IS_ERR(i2s->grf)) {
 596                 of_id = of_match_device(rockchip_i2s_match, &pdev->dev);
 597                 if (!of_id || !of_id->data)
 598                         return -EINVAL;
 599 
 600                 i2s->pins = of_id->data;
 601         }
 602 
 603         /* try to prepare related clocks */
 604         i2s->hclk = devm_clk_get(&pdev->dev, "i2s_hclk");
 605         if (IS_ERR(i2s->hclk)) {
 606                 dev_err(&pdev->dev, "Can't retrieve i2s bus clock\n");
 607                 return PTR_ERR(i2s->hclk);
 608         }
 609         ret = clk_prepare_enable(i2s->hclk);
 610         if (ret) {
 611                 dev_err(i2s->dev, "hclock enable failed %d\n", ret);
 612                 return ret;
 613         }
 614 
 615         i2s->mclk = devm_clk_get(&pdev->dev, "i2s_clk");
 616         if (IS_ERR(i2s->mclk)) {
 617                 dev_err(&pdev->dev, "Can't retrieve i2s master clock\n");
 618                 return PTR_ERR(i2s->mclk);
 619         }
 620 
 621         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 622         regs = devm_ioremap_resource(&pdev->dev, res);
 623         if (IS_ERR(regs))
 624                 return PTR_ERR(regs);
 625 
 626         i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
 627                                             &rockchip_i2s_regmap_config);
 628         if (IS_ERR(i2s->regmap)) {
 629                 dev_err(&pdev->dev,
 630                         "Failed to initialise managed register map\n");
 631                 return PTR_ERR(i2s->regmap);
 632         }
 633 
 634         i2s->playback_dma_data.addr = res->start + I2S_TXDR;
 635         i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 636         i2s->playback_dma_data.maxburst = 4;
 637 
 638         i2s->capture_dma_data.addr = res->start + I2S_RXDR;
 639         i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 640         i2s->capture_dma_data.maxburst = 4;
 641 
 642         dev_set_drvdata(&pdev->dev, i2s);
 643 
 644         pm_runtime_enable(&pdev->dev);
 645         if (!pm_runtime_enabled(&pdev->dev)) {
 646                 ret = i2s_runtime_resume(&pdev->dev);
 647                 if (ret)
 648                         goto err_pm_disable;
 649         }
 650 
 651         soc_dai = devm_kmemdup(&pdev->dev, &rockchip_i2s_dai,
 652                                sizeof(*soc_dai), GFP_KERNEL);
 653         if (!soc_dai) {
 654                 ret = -ENOMEM;
 655                 goto err_pm_disable;
 656         }
 657 
 658         if (!of_property_read_u32(node, "rockchip,playback-channels", &val)) {
 659                 if (val >= 2 && val <= 8)
 660                         soc_dai->playback.channels_max = val;
 661         }
 662 
 663         if (!of_property_read_u32(node, "rockchip,capture-channels", &val)) {
 664                 if (val >= 2 && val <= 8)
 665                         soc_dai->capture.channels_max = val;
 666         }
 667 
 668         ret = devm_snd_soc_register_component(&pdev->dev,
 669                                               &rockchip_i2s_component,
 670                                               soc_dai, 1);
 671 
 672         if (ret) {
 673                 dev_err(&pdev->dev, "Could not register DAI\n");
 674                 goto err_suspend;
 675         }
 676 
 677         ret = rockchip_pcm_platform_register(&pdev->dev);
 678         if (ret) {
 679                 dev_err(&pdev->dev, "Could not register PCM\n");
 680                 goto err_suspend;
 681         }
 682 
 683         return 0;
 684 
 685 err_suspend:
 686         if (!pm_runtime_status_suspended(&pdev->dev))
 687                 i2s_runtime_suspend(&pdev->dev);
 688 err_pm_disable:
 689         pm_runtime_disable(&pdev->dev);
 690 
 691         return ret;
 692 }
 693 
 694 static int rockchip_i2s_remove(struct platform_device *pdev)
 695 {
 696         struct rk_i2s_dev *i2s = dev_get_drvdata(&pdev->dev);
 697 
 698         pm_runtime_disable(&pdev->dev);
 699         if (!pm_runtime_status_suspended(&pdev->dev))
 700                 i2s_runtime_suspend(&pdev->dev);
 701 
 702         clk_disable_unprepare(i2s->hclk);
 703 
 704         return 0;
 705 }
 706 
 707 static const struct dev_pm_ops rockchip_i2s_pm_ops = {
 708         SET_RUNTIME_PM_OPS(i2s_runtime_suspend, i2s_runtime_resume,
 709                            NULL)
 710 };
 711 
 712 static struct platform_driver rockchip_i2s_driver = {
 713         .probe = rockchip_i2s_probe,
 714         .remove = rockchip_i2s_remove,
 715         .driver = {
 716                 .name = DRV_NAME,
 717                 .of_match_table = of_match_ptr(rockchip_i2s_match),
 718                 .pm = &rockchip_i2s_pm_ops,
 719         },
 720 };
 721 module_platform_driver(rockchip_i2s_driver);
 722 
 723 MODULE_DESCRIPTION("ROCKCHIP IIS ASoC Interface");
 724 MODULE_AUTHOR("jianqun <jay.xu@rock-chips.com>");
 725 MODULE_LICENSE("GPL v2");
 726 MODULE_ALIAS("platform:" DRV_NAME);
 727 MODULE_DEVICE_TABLE(of, rockchip_i2s_match);

/* [<][>][^][v][top][bottom][index][help] */