root/sound/soc/sh/rcar/ssi.c

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

DEFINITIONS

This source file includes following definitions.
  1. rsnd_ssi_use_busif
  2. rsnd_ssi_status_clear
  3. rsnd_ssi_status_get
  4. rsnd_ssi_status_check
  5. rsnd_ssi_multi_slaves
  6. rsnd_ssi_run_mods
  7. rsnd_ssi_multi_slaves_runtime
  8. rsnd_rdai_width_to_swl
  9. rsnd_ssi_clk_query
  10. rsnd_ssi_master_clk_start
  11. rsnd_ssi_master_clk_stop
  12. rsnd_ssi_config_init
  13. rsnd_ssi_register_setup
  14. rsnd_ssi_init
  15. rsnd_ssi_quit
  16. rsnd_ssi_hw_params
  17. rsnd_ssi_start
  18. rsnd_ssi_stop
  19. rsnd_ssi_irq
  20. __rsnd_ssi_interrupt
  21. rsnd_ssi_interrupt
  22. rsnd_ssi_get_status
  23. rsnd_ssi_parent_attach
  24. rsnd_ssi_pcm_new
  25. rsnd_ssi_common_probe
  26. rsnd_ssi_common_remove
  27. rsnd_ssi_pio_interrupt
  28. rsnd_ssi_pio_init
  29. rsnd_ssi_pio_pointer
  30. rsnd_ssi_prepare
  31. rsnd_ssi_dma_probe
  32. rsnd_ssi_fallback
  33. rsnd_ssi_dma_req
  34. rsnd_ssi_is_dma_mode
  35. rsnd_ssi_connect
  36. rsnd_parse_connect_ssi
  37. rsnd_ssi_mod_get
  38. __rsnd_ssi_is_pin_sharing
  39. rsnd_ssi_probe
  40. rsnd_ssi_remove

   1 // SPDX-License-Identifier: GPL-2.0
   2 //
   3 // Renesas R-Car SSIU/SSI support
   4 //
   5 // Copyright (C) 2013 Renesas Solutions Corp.
   6 // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
   7 //
   8 // Based on fsi.c
   9 // Kuninori Morimoto <morimoto.kuninori@renesas.com>
  10 
  11 /*
  12  * you can enable below define if you don't need
  13  * SSI interrupt status debug message when debugging
  14  * see rsnd_dbg_irq_status()
  15  *
  16  * #define RSND_DEBUG_NO_IRQ_STATUS 1
  17  */
  18 
  19 #include <sound/simple_card_utils.h>
  20 #include <linux/delay.h>
  21 #include "rsnd.h"
  22 #define RSND_SSI_NAME_SIZE 16
  23 
  24 /*
  25  * SSICR
  26  */
  27 #define FORCE           (1 << 31)       /* Fixed */
  28 #define DMEN            (1 << 28)       /* DMA Enable */
  29 #define UIEN            (1 << 27)       /* Underflow Interrupt Enable */
  30 #define OIEN            (1 << 26)       /* Overflow Interrupt Enable */
  31 #define IIEN            (1 << 25)       /* Idle Mode Interrupt Enable */
  32 #define DIEN            (1 << 24)       /* Data Interrupt Enable */
  33 #define CHNL_4          (1 << 22)       /* Channels */
  34 #define CHNL_6          (2 << 22)       /* Channels */
  35 #define CHNL_8          (3 << 22)       /* Channels */
  36 #define DWL_MASK        (7 << 19)       /* Data Word Length mask */
  37 #define DWL_8           (0 << 19)       /* Data Word Length */
  38 #define DWL_16          (1 << 19)       /* Data Word Length */
  39 #define DWL_18          (2 << 19)       /* Data Word Length */
  40 #define DWL_20          (3 << 19)       /* Data Word Length */
  41 #define DWL_22          (4 << 19)       /* Data Word Length */
  42 #define DWL_24          (5 << 19)       /* Data Word Length */
  43 #define DWL_32          (6 << 19)       /* Data Word Length */
  44 
  45 /*
  46  * System word length
  47  */
  48 #define SWL_16          (1 << 16)       /* R/W System Word Length */
  49 #define SWL_24          (2 << 16)       /* R/W System Word Length */
  50 #define SWL_32          (3 << 16)       /* R/W System Word Length */
  51 
  52 #define SCKD            (1 << 15)       /* Serial Bit Clock Direction */
  53 #define SWSD            (1 << 14)       /* Serial WS Direction */
  54 #define SCKP            (1 << 13)       /* Serial Bit Clock Polarity */
  55 #define SWSP            (1 << 12)       /* Serial WS Polarity */
  56 #define SDTA            (1 << 10)       /* Serial Data Alignment */
  57 #define PDTA            (1 <<  9)       /* Parallel Data Alignment */
  58 #define DEL             (1 <<  8)       /* Serial Data Delay */
  59 #define CKDV(v)         (v <<  4)       /* Serial Clock Division Ratio */
  60 #define TRMD            (1 <<  1)       /* Transmit/Receive Mode Select */
  61 #define EN              (1 <<  0)       /* SSI Module Enable */
  62 
  63 /*
  64  * SSISR
  65  */
  66 #define UIRQ            (1 << 27)       /* Underflow Error Interrupt Status */
  67 #define OIRQ            (1 << 26)       /* Overflow Error Interrupt Status */
  68 #define IIRQ            (1 << 25)       /* Idle Mode Interrupt Status */
  69 #define DIRQ            (1 << 24)       /* Data Interrupt Status Flag */
  70 
  71 /*
  72  * SSIWSR
  73  */
  74 #define CONT            (1 << 8)        /* WS Continue Function */
  75 #define WS_MODE         (1 << 0)        /* WS Mode */
  76 
  77 #define SSI_NAME "ssi"
  78 
  79 struct rsnd_ssi {
  80         struct rsnd_mod mod;
  81 
  82         u32 flags;
  83         u32 cr_own;
  84         u32 cr_clk;
  85         u32 cr_mode;
  86         u32 cr_en;
  87         u32 wsr;
  88         int chan;
  89         int rate;
  90         int irq;
  91         unsigned int usrcnt;
  92 
  93         /* for PIO */
  94         int byte_pos;
  95         int byte_per_period;
  96         int next_period_byte;
  97 };
  98 
  99 /* flags */
 100 #define RSND_SSI_CLK_PIN_SHARE          (1 << 0)
 101 #define RSND_SSI_NO_BUSIF               (1 << 1) /* SSI+DMA without BUSIF */
 102 #define RSND_SSI_PROBED                 (1 << 2)
 103 
 104 #define for_each_rsnd_ssi(pos, priv, i)                                 \
 105         for (i = 0;                                                     \
 106              (i < rsnd_ssi_nr(priv)) &&                                 \
 107                 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));         \
 108              i++)
 109 
 110 #define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
 111 #define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
 112 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
 113 #define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
 114 #define rsnd_ssi_is_multi_slave(mod, io) \
 115         (rsnd_ssi_multi_slaves(io) & (1 << rsnd_mod_id(mod)))
 116 #define rsnd_ssi_is_run_mods(mod, io) \
 117         (rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
 118 #define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod))
 119 
 120 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
 121 
 122 int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
 123 {
 124         struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
 125         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 126         int use_busif = 0;
 127 
 128         if (!rsnd_ssi_is_dma_mode(mod))
 129                 return 0;
 130 
 131         if (!(rsnd_flags_has(ssi, RSND_SSI_NO_BUSIF)))
 132                 use_busif = 1;
 133         if (rsnd_io_to_mod_src(io))
 134                 use_busif = 1;
 135 
 136         return use_busif;
 137 }
 138 
 139 static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
 140 {
 141         rsnd_mod_write(mod, SSISR, 0);
 142 }
 143 
 144 static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
 145 {
 146         return rsnd_mod_read(mod, SSISR);
 147 }
 148 
 149 static void rsnd_ssi_status_check(struct rsnd_mod *mod,
 150                                   u32 bit)
 151 {
 152         struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 153         struct device *dev = rsnd_priv_to_dev(priv);
 154         u32 status;
 155         int i;
 156 
 157         for (i = 0; i < 1024; i++) {
 158                 status = rsnd_ssi_status_get(mod);
 159                 if (status & bit)
 160                         return;
 161 
 162                 udelay(5);
 163         }
 164 
 165         dev_warn(dev, "%s status check failed\n", rsnd_mod_name(mod));
 166 }
 167 
 168 static u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
 169 {
 170         struct rsnd_mod *mod;
 171         enum rsnd_mod_type types[] = {
 172                 RSND_MOD_SSIM1,
 173                 RSND_MOD_SSIM2,
 174                 RSND_MOD_SSIM3,
 175         };
 176         int i, mask;
 177 
 178         mask = 0;
 179         for (i = 0; i < ARRAY_SIZE(types); i++) {
 180                 mod = rsnd_io_to_mod(io, types[i]);
 181                 if (!mod)
 182                         continue;
 183 
 184                 mask |= 1 << rsnd_mod_id(mod);
 185         }
 186 
 187         return mask;
 188 }
 189 
 190 static u32 rsnd_ssi_run_mods(struct rsnd_dai_stream *io)
 191 {
 192         struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
 193         struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
 194         u32 mods;
 195 
 196         mods = rsnd_ssi_multi_slaves_runtime(io) |
 197                 1 << rsnd_mod_id(ssi_mod);
 198 
 199         if (ssi_parent_mod)
 200                 mods |= 1 << rsnd_mod_id(ssi_parent_mod);
 201 
 202         return mods;
 203 }
 204 
 205 u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io)
 206 {
 207         if (rsnd_runtime_is_multi_ssi(io))
 208                 return rsnd_ssi_multi_slaves(io);
 209 
 210         return 0;
 211 }
 212 
 213 static u32 rsnd_rdai_width_to_swl(struct rsnd_dai *rdai)
 214 {
 215         struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
 216         struct device *dev = rsnd_priv_to_dev(priv);
 217         int width = rsnd_rdai_width_get(rdai);
 218 
 219         switch (width) {
 220         case 32: return SWL_32;
 221         case 24: return SWL_24;
 222         case 16: return SWL_16;
 223         }
 224 
 225         dev_err(dev, "unsupported slot width value: %d\n", width);
 226         return 0;
 227 }
 228 
 229 unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai,
 230                        int param1, int param2, int *idx)
 231 {
 232         struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
 233         int ssi_clk_mul_table[] = {
 234                 1, 2, 4, 8, 16, 6, 12,
 235         };
 236         int j, ret;
 237         unsigned int main_rate;
 238         int width = rsnd_rdai_width_get(rdai);
 239 
 240         for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {
 241 
 242                 /*
 243                  * It will set SSIWSR.CONT here, but SSICR.CKDV = 000
 244                  * with it is not allowed. (SSIWSR.WS_MODE with
 245                  * SSICR.CKDV = 000 is not allowed either).
 246                  * Skip it. See SSICR.CKDV
 247                  */
 248                 if (j == 0)
 249                         continue;
 250 
 251                 main_rate = width * param1 * param2 * ssi_clk_mul_table[j];
 252 
 253                 ret = rsnd_adg_clk_query(priv, main_rate);
 254                 if (ret < 0)
 255                         continue;
 256 
 257                 if (idx)
 258                         *idx = j;
 259 
 260                 return main_rate;
 261         }
 262 
 263         return 0;
 264 }
 265 
 266 static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
 267                                      struct rsnd_dai_stream *io)
 268 {
 269         struct rsnd_priv *priv = rsnd_io_to_priv(io);
 270         struct device *dev = rsnd_priv_to_dev(priv);
 271         struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
 272         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 273         int chan = rsnd_runtime_channel_for_ssi(io);
 274         int idx, ret;
 275         unsigned int main_rate;
 276         unsigned int rate = rsnd_io_is_play(io) ?
 277                 rsnd_src_get_out_rate(priv, io) :
 278                 rsnd_src_get_in_rate(priv, io);
 279 
 280         if (!rsnd_rdai_is_clk_master(rdai))
 281                 return 0;
 282 
 283         if (!rsnd_ssi_can_output_clk(mod))
 284                 return 0;
 285 
 286         if (rsnd_ssi_is_multi_slave(mod, io))
 287                 return 0;
 288 
 289         if (rsnd_runtime_is_tdm_split(io))
 290                 chan = rsnd_io_converted_chan(io);
 291 
 292         chan = rsnd_channel_normalization(chan);
 293 
 294         if (ssi->usrcnt > 0) {
 295                 if (ssi->rate != rate) {
 296                         dev_err(dev, "SSI parent/child should use same rate\n");
 297                         return -EINVAL;
 298                 }
 299 
 300                 if (ssi->chan != chan) {
 301                         dev_err(dev, "SSI parent/child should use same chan\n");
 302                         return -EINVAL;
 303                 }
 304 
 305                 return 0;
 306         }
 307 
 308         main_rate = rsnd_ssi_clk_query(rdai, rate, chan, &idx);
 309         if (!main_rate) {
 310                 dev_err(dev, "unsupported clock rate\n");
 311                 return -EIO;
 312         }
 313 
 314         ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
 315         if (ret < 0)
 316                 return ret;
 317 
 318         /*
 319          * SSI clock will be output contiguously
 320          * by below settings.
 321          * This means, rsnd_ssi_master_clk_start()
 322          * and rsnd_ssi_register_setup() are necessary
 323          * for SSI parent
 324          *
 325          * SSICR  : FORCE, SCKD, SWSD
 326          * SSIWSR : CONT
 327          */
 328         ssi->cr_clk = FORCE | rsnd_rdai_width_to_swl(rdai) |
 329                         SCKD | SWSD | CKDV(idx);
 330         ssi->wsr = CONT;
 331         ssi->rate = rate;
 332         ssi->chan = chan;
 333 
 334         dev_dbg(dev, "%s outputs %d chan %u Hz\n",
 335                 rsnd_mod_name(mod), chan, rate);
 336 
 337         return 0;
 338 }
 339 
 340 static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
 341                                      struct rsnd_dai_stream *io)
 342 {
 343         struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
 344         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 345 
 346         if (!rsnd_rdai_is_clk_master(rdai))
 347                 return;
 348 
 349         if (!rsnd_ssi_can_output_clk(mod))
 350                 return;
 351 
 352         if (ssi->usrcnt > 1)
 353                 return;
 354 
 355         ssi->cr_clk     = 0;
 356         ssi->rate       = 0;
 357         ssi->chan       = 0;
 358 
 359         rsnd_adg_ssi_clk_stop(mod);
 360 }
 361 
 362 static void rsnd_ssi_config_init(struct rsnd_mod *mod,
 363                                 struct rsnd_dai_stream *io)
 364 {
 365         struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
 366         struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
 367         struct device *dev = rsnd_priv_to_dev(priv);
 368         struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
 369         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 370         u32 cr_own      = ssi->cr_own;
 371         u32 cr_mode     = ssi->cr_mode;
 372         u32 wsr         = ssi->wsr;
 373         int width;
 374         int is_tdm, is_tdm_split;
 375 
 376         is_tdm          = rsnd_runtime_is_tdm(io);
 377         is_tdm_split    = rsnd_runtime_is_tdm_split(io);
 378 
 379         if (is_tdm)
 380                 dev_dbg(dev, "TDM mode\n");
 381         if (is_tdm_split)
 382                 dev_dbg(dev, "TDM Split mode\n");
 383 
 384         cr_own |= FORCE | rsnd_rdai_width_to_swl(rdai);
 385 
 386         if (rdai->bit_clk_inv)
 387                 cr_own |= SCKP;
 388         if (rdai->frm_clk_inv && !is_tdm)
 389                 cr_own |= SWSP;
 390         if (rdai->data_alignment)
 391                 cr_own |= SDTA;
 392         if (rdai->sys_delay)
 393                 cr_own |= DEL;
 394 
 395         /*
 396          * TDM Mode
 397          * see
 398          *      rsnd_ssiu_init_gen2()
 399          */
 400         wsr = ssi->wsr;
 401         if (is_tdm || is_tdm_split) {
 402                 wsr     |= WS_MODE;
 403                 cr_own  |= CHNL_8;
 404         }
 405 
 406         /*
 407          * We shouldn't exchange SWSP after running.
 408          * This means, parent needs to care it.
 409          */
 410         if (rsnd_ssi_is_parent(mod, io))
 411                 goto init_end;
 412 
 413         if (rsnd_io_is_play(io))
 414                 cr_own |= TRMD;
 415 
 416         cr_own &= ~DWL_MASK;
 417         width = snd_pcm_format_width(runtime->format);
 418         if (is_tdm_split) {
 419                 /*
 420                  * The SWL and DWL bits in SSICR should be fixed at 32-bit
 421                  * setting when TDM split mode.
 422                  * see datasheet
 423                  *      Operation :: TDM Format Split Function (TDM Split Mode)
 424                  */
 425                 width = 32;
 426         }
 427 
 428         switch (width) {
 429         case 8:
 430                 cr_own |= DWL_8;
 431                 break;
 432         case 16:
 433                 cr_own |= DWL_16;
 434                 break;
 435         case 24:
 436                 cr_own |= DWL_24;
 437                 break;
 438         case 32:
 439                 cr_own |= DWL_32;
 440                 break;
 441         }
 442 
 443         if (rsnd_ssi_is_dma_mode(mod)) {
 444                 cr_mode = UIEN | OIEN | /* over/under run */
 445                           DMEN;         /* DMA : enable DMA */
 446         } else {
 447                 cr_mode = DIEN;         /* PIO : enable Data interrupt */
 448         }
 449 
 450 init_end:
 451         ssi->cr_own     = cr_own;
 452         ssi->cr_mode    = cr_mode;
 453         ssi->wsr        = wsr;
 454 }
 455 
 456 static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
 457 {
 458         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 459 
 460         rsnd_mod_write(mod, SSIWSR,     ssi->wsr);
 461         rsnd_mod_write(mod, SSICR,      ssi->cr_own     |
 462                                         ssi->cr_clk     |
 463                                         ssi->cr_mode    |
 464                                         ssi->cr_en);
 465 }
 466 
 467 /*
 468  *      SSI mod common functions
 469  */
 470 static int rsnd_ssi_init(struct rsnd_mod *mod,
 471                          struct rsnd_dai_stream *io,
 472                          struct rsnd_priv *priv)
 473 {
 474         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 475 
 476         if (!rsnd_ssi_is_run_mods(mod, io))
 477                 return 0;
 478 
 479         ssi->usrcnt++;
 480 
 481         rsnd_mod_power_on(mod);
 482 
 483         rsnd_ssi_config_init(mod, io);
 484 
 485         rsnd_ssi_register_setup(mod);
 486 
 487         /* clear error status */
 488         rsnd_ssi_status_clear(mod);
 489 
 490         return 0;
 491 }
 492 
 493 static int rsnd_ssi_quit(struct rsnd_mod *mod,
 494                          struct rsnd_dai_stream *io,
 495                          struct rsnd_priv *priv)
 496 {
 497         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 498         struct device *dev = rsnd_priv_to_dev(priv);
 499 
 500         if (!rsnd_ssi_is_run_mods(mod, io))
 501                 return 0;
 502 
 503         if (!ssi->usrcnt) {
 504                 dev_err(dev, "%s usrcnt error\n", rsnd_mod_name(mod));
 505                 return -EIO;
 506         }
 507 
 508         rsnd_ssi_master_clk_stop(mod, io);
 509 
 510         rsnd_mod_power_off(mod);
 511 
 512         ssi->usrcnt--;
 513 
 514         if (!ssi->usrcnt) {
 515                 ssi->cr_own     = 0;
 516                 ssi->cr_mode    = 0;
 517                 ssi->wsr        = 0;
 518         }
 519 
 520         return 0;
 521 }
 522 
 523 static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
 524                               struct rsnd_dai_stream *io,
 525                               struct snd_pcm_substream *substream,
 526                               struct snd_pcm_hw_params *params)
 527 {
 528         struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
 529         unsigned int fmt_width = snd_pcm_format_width(params_format(params));
 530 
 531         if (fmt_width > rdai->chan_width) {
 532                 struct rsnd_priv *priv = rsnd_io_to_priv(io);
 533                 struct device *dev = rsnd_priv_to_dev(priv);
 534 
 535                 dev_err(dev, "invalid combination of slot-width and format-data-width\n");
 536                 return -EINVAL;
 537         }
 538 
 539         return 0;
 540 }
 541 
 542 static int rsnd_ssi_start(struct rsnd_mod *mod,
 543                           struct rsnd_dai_stream *io,
 544                           struct rsnd_priv *priv)
 545 {
 546         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 547 
 548         if (!rsnd_ssi_is_run_mods(mod, io))
 549                 return 0;
 550 
 551         /*
 552          * EN will be set via SSIU :: SSI_CONTROL
 553          * if Multi channel mode
 554          */
 555         if (rsnd_ssi_multi_slaves_runtime(io))
 556                 return 0;
 557 
 558         /*
 559          * EN is for data output.
 560          * SSI parent EN is not needed.
 561          */
 562         if (rsnd_ssi_is_parent(mod, io))
 563                 return 0;
 564 
 565         ssi->cr_en = EN;
 566 
 567         rsnd_mod_write(mod, SSICR,      ssi->cr_own     |
 568                                         ssi->cr_clk     |
 569                                         ssi->cr_mode    |
 570                                         ssi->cr_en);
 571 
 572         return 0;
 573 }
 574 
 575 static int rsnd_ssi_stop(struct rsnd_mod *mod,
 576                          struct rsnd_dai_stream *io,
 577                          struct rsnd_priv *priv)
 578 {
 579         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 580         u32 cr;
 581 
 582         if (!rsnd_ssi_is_run_mods(mod, io))
 583                 return 0;
 584 
 585         if (rsnd_ssi_is_parent(mod, io))
 586                 return 0;
 587 
 588         cr  =   ssi->cr_own     |
 589                 ssi->cr_clk;
 590 
 591         /*
 592          * disable all IRQ,
 593          * Playback: Wait all data was sent
 594          * Capture:  It might not receave data. Do nothing
 595          */
 596         if (rsnd_io_is_play(io)) {
 597                 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en);
 598                 rsnd_ssi_status_check(mod, DIRQ);
 599         }
 600 
 601         /* In multi-SSI mode, stop is performed by setting ssi0129 in
 602          * SSI_CONTROL to 0 (in rsnd_ssio_stop_gen2). Do nothing here.
 603          */
 604         if (rsnd_ssi_multi_slaves_runtime(io))
 605                 return 0;
 606 
 607         /*
 608          * disable SSI,
 609          * and, wait idle state
 610          */
 611         rsnd_mod_write(mod, SSICR, cr); /* disabled all */
 612         rsnd_ssi_status_check(mod, IIRQ);
 613 
 614         ssi->cr_en = 0;
 615 
 616         return 0;
 617 }
 618 
 619 static int rsnd_ssi_irq(struct rsnd_mod *mod,
 620                         struct rsnd_dai_stream *io,
 621                         struct rsnd_priv *priv,
 622                         int enable)
 623 {
 624         u32 val = 0;
 625 
 626         if (rsnd_is_gen1(priv))
 627                 return 0;
 628 
 629         if (rsnd_ssi_is_parent(mod, io))
 630                 return 0;
 631 
 632         if (!rsnd_ssi_is_run_mods(mod, io))
 633                 return 0;
 634 
 635         if (enable)
 636                 val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;
 637 
 638         rsnd_mod_write(mod, SSI_INT_ENABLE, val);
 639 
 640         return 0;
 641 }
 642 
 643 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
 644                                    struct rsnd_dai_stream *io);
 645 static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
 646                                  struct rsnd_dai_stream *io)
 647 {
 648         struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 649         struct device *dev = rsnd_priv_to_dev(priv);
 650         int is_dma = rsnd_ssi_is_dma_mode(mod);
 651         u32 status;
 652         bool elapsed = false;
 653         bool stop = false;
 654 
 655         spin_lock(&priv->lock);
 656 
 657         /* ignore all cases if not working */
 658         if (!rsnd_io_is_working(io))
 659                 goto rsnd_ssi_interrupt_out;
 660 
 661         status = rsnd_ssi_status_get(mod);
 662 
 663         /* PIO only */
 664         if (!is_dma && (status & DIRQ))
 665                 elapsed = rsnd_ssi_pio_interrupt(mod, io);
 666 
 667         /* DMA only */
 668         if (is_dma && (status & (UIRQ | OIRQ))) {
 669                 rsnd_dbg_irq_status(dev, "%s err status : 0x%08x\n",
 670                         rsnd_mod_name(mod), status);
 671 
 672                 stop = true;
 673         }
 674 
 675         rsnd_ssi_status_clear(mod);
 676 rsnd_ssi_interrupt_out:
 677         spin_unlock(&priv->lock);
 678 
 679         if (elapsed)
 680                 rsnd_dai_period_elapsed(io);
 681 
 682         if (stop)
 683                 snd_pcm_stop_xrun(io->substream);
 684 
 685 }
 686 
 687 static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
 688 {
 689         struct rsnd_mod *mod = data;
 690 
 691         rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
 692 
 693         return IRQ_HANDLED;
 694 }
 695 
 696 static u32 *rsnd_ssi_get_status(struct rsnd_mod *mod,
 697                                 struct rsnd_dai_stream *io,
 698                                 enum rsnd_mod_type type)
 699 {
 700         /*
 701          * SSIP (= SSI parent) needs to be special, otherwise,
 702          * 2nd SSI might doesn't start. see also rsnd_mod_call()
 703          *
 704          * We can't include parent SSI status on SSI, because we don't know
 705          * how many SSI requests parent SSI. Thus, it is localed on "io" now.
 706          * ex) trouble case
 707          *      Playback: SSI0
 708          *      Capture : SSI1 (needs SSI0)
 709          *
 710          * 1) start Capture  -> SSI0/SSI1 are started.
 711          * 2) start Playback -> SSI0 doesn't work, because it is already
 712          *                      marked as "started" on 1)
 713          *
 714          * OTOH, using each mod's status is good for MUX case.
 715          * It doesn't need to start in 2nd start
 716          * ex)
 717          *      IO-0: SRC0 -> CTU1 -+-> MUX -> DVC -> SSIU -> SSI0
 718          *                          |
 719          *      IO-1: SRC1 -> CTU2 -+
 720          *
 721          * 1) start IO-0 ->     start SSI0
 722          * 2) start IO-1 ->     SSI0 doesn't need to start, because it is
 723          *                      already started on 1)
 724          */
 725         if (type == RSND_MOD_SSIP)
 726                 return &io->parent_ssi_status;
 727 
 728         return rsnd_mod_get_status(mod, io, type);
 729 }
 730 
 731 /*
 732  *              SSI PIO
 733  */
 734 static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
 735                                    struct rsnd_dai_stream *io)
 736 {
 737         struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
 738         struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 739 
 740         if (!__rsnd_ssi_is_pin_sharing(mod))
 741                 return;
 742 
 743         if (!rsnd_rdai_is_clk_master(rdai))
 744                 return;
 745 
 746         if (rsnd_ssi_is_multi_slave(mod, io))
 747                 return;
 748 
 749         switch (rsnd_mod_id(mod)) {
 750         case 1:
 751         case 2:
 752         case 9:
 753                 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP);
 754                 break;
 755         case 4:
 756                 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP);
 757                 break;
 758         case 8:
 759                 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP);
 760                 break;
 761         }
 762 }
 763 
 764 static int rsnd_ssi_pcm_new(struct rsnd_mod *mod,
 765                             struct rsnd_dai_stream *io,
 766                             struct snd_soc_pcm_runtime *rtd)
 767 {
 768         /*
 769          * rsnd_rdai_is_clk_master() will be enabled after set_fmt,
 770          * and, pcm_new will be called after it.
 771          * This function reuse pcm_new at this point.
 772          */
 773         rsnd_ssi_parent_attach(mod, io);
 774 
 775         return 0;
 776 }
 777 
 778 static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
 779                                  struct rsnd_dai_stream *io,
 780                                  struct rsnd_priv *priv)
 781 {
 782         struct device *dev = rsnd_priv_to_dev(priv);
 783         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 784         int ret = 0;
 785 
 786         /*
 787          * SSIP/SSIU/IRQ are not needed on
 788          * SSI Multi slaves
 789          */
 790         if (rsnd_ssi_is_multi_slave(mod, io))
 791                 return 0;
 792 
 793         /*
 794          * It can't judge ssi parent at this point
 795          * see rsnd_ssi_pcm_new()
 796          */
 797 
 798         /*
 799          * SSI might be called again as PIO fallback
 800          * It is easy to manual handling for IRQ request/free
 801          *
 802          * OTOH, this function might be called many times if platform is
 803          * using MIX. It needs xxx_attach() many times on xxx_probe().
 804          * Because of it, we can't control .probe/.remove calling count by
 805          * mod->status.
 806          * But it don't need to call request_irq() many times.
 807          * Let's control it by RSND_SSI_PROBED flag.
 808          */
 809         if (!rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
 810                 ret = request_irq(ssi->irq,
 811                                   rsnd_ssi_interrupt,
 812                                   IRQF_SHARED,
 813                                   dev_name(dev), mod);
 814 
 815                 rsnd_flags_set(ssi, RSND_SSI_PROBED);
 816         }
 817 
 818         return ret;
 819 }
 820 
 821 static int rsnd_ssi_common_remove(struct rsnd_mod *mod,
 822                                   struct rsnd_dai_stream *io,
 823                                   struct rsnd_priv *priv)
 824 {
 825         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 826         struct rsnd_mod *pure_ssi_mod = rsnd_io_to_mod_ssi(io);
 827 
 828         /* Do nothing if non SSI (= SSI parent, multi SSI) mod */
 829         if (pure_ssi_mod != mod)
 830                 return 0;
 831 
 832         /* PIO will request IRQ again */
 833         if (rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
 834                 free_irq(ssi->irq, mod);
 835 
 836                 rsnd_flags_del(ssi, RSND_SSI_PROBED);
 837         }
 838 
 839         return 0;
 840 }
 841 
 842 /*
 843  *      SSI PIO functions
 844  */
 845 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
 846                                    struct rsnd_dai_stream *io)
 847 {
 848         struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
 849         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 850         u32 *buf = (u32 *)(runtime->dma_area + ssi->byte_pos);
 851         int shift = 0;
 852         int byte_pos;
 853         bool elapsed = false;
 854 
 855         if (snd_pcm_format_width(runtime->format) == 24)
 856                 shift = 8;
 857 
 858         /*
 859          * 8/16/32 data can be assesse to TDR/RDR register
 860          * directly as 32bit data
 861          * see rsnd_ssi_init()
 862          */
 863         if (rsnd_io_is_play(io))
 864                 rsnd_mod_write(mod, SSITDR, (*buf) << shift);
 865         else
 866                 *buf = (rsnd_mod_read(mod, SSIRDR) >> shift);
 867 
 868         byte_pos = ssi->byte_pos + sizeof(*buf);
 869 
 870         if (byte_pos >= ssi->next_period_byte) {
 871                 int period_pos = byte_pos / ssi->byte_per_period;
 872 
 873                 if (period_pos >= runtime->periods) {
 874                         byte_pos = 0;
 875                         period_pos = 0;
 876                 }
 877 
 878                 ssi->next_period_byte = (period_pos + 1) * ssi->byte_per_period;
 879 
 880                 elapsed = true;
 881         }
 882 
 883         WRITE_ONCE(ssi->byte_pos, byte_pos);
 884 
 885         return elapsed;
 886 }
 887 
 888 static int rsnd_ssi_pio_init(struct rsnd_mod *mod,
 889                              struct rsnd_dai_stream *io,
 890                              struct rsnd_priv *priv)
 891 {
 892         struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
 893         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 894 
 895         if (!rsnd_ssi_is_parent(mod, io)) {
 896                 ssi->byte_pos           = 0;
 897                 ssi->byte_per_period    = runtime->period_size *
 898                                           runtime->channels *
 899                                           samples_to_bytes(runtime, 1);
 900                 ssi->next_period_byte   = ssi->byte_per_period;
 901         }
 902 
 903         return rsnd_ssi_init(mod, io, priv);
 904 }
 905 
 906 static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
 907                             struct rsnd_dai_stream *io,
 908                             snd_pcm_uframes_t *pointer)
 909 {
 910         struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 911         struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
 912 
 913         *pointer = bytes_to_frames(runtime, READ_ONCE(ssi->byte_pos));
 914 
 915         return 0;
 916 }
 917 
 918 static int rsnd_ssi_prepare(struct rsnd_mod *mod,
 919                             struct rsnd_dai_stream *io,
 920                             struct rsnd_priv *priv)
 921 {
 922         return rsnd_ssi_master_clk_start(mod, io);
 923 }
 924 
 925 static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
 926         .name           = SSI_NAME,
 927         .probe          = rsnd_ssi_common_probe,
 928         .remove         = rsnd_ssi_common_remove,
 929         .init           = rsnd_ssi_pio_init,
 930         .quit           = rsnd_ssi_quit,
 931         .start          = rsnd_ssi_start,
 932         .stop           = rsnd_ssi_stop,
 933         .irq            = rsnd_ssi_irq,
 934         .pointer        = rsnd_ssi_pio_pointer,
 935         .pcm_new        = rsnd_ssi_pcm_new,
 936         .hw_params      = rsnd_ssi_hw_params,
 937         .prepare        = rsnd_ssi_prepare,
 938         .get_status     = rsnd_ssi_get_status,
 939 };
 940 
 941 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
 942                               struct rsnd_dai_stream *io,
 943                               struct rsnd_priv *priv)
 944 {
 945         int ret;
 946 
 947         /*
 948          * SSIP/SSIU/IRQ/DMA are not needed on
 949          * SSI Multi slaves
 950          */
 951         if (rsnd_ssi_is_multi_slave(mod, io))
 952                 return 0;
 953 
 954         ret = rsnd_ssi_common_probe(mod, io, priv);
 955         if (ret)
 956                 return ret;
 957 
 958         /* SSI probe might be called many times in MUX multi path */
 959         ret = rsnd_dma_attach(io, mod, &io->dma);
 960 
 961         return ret;
 962 }
 963 
 964 static int rsnd_ssi_fallback(struct rsnd_mod *mod,
 965                              struct rsnd_dai_stream *io,
 966                              struct rsnd_priv *priv)
 967 {
 968         struct device *dev = rsnd_priv_to_dev(priv);
 969 
 970         /*
 971          * fallback to PIO
 972          *
 973          * SSI .probe might be called again.
 974          * see
 975          *      rsnd_rdai_continuance_probe()
 976          */
 977         mod->ops = &rsnd_ssi_pio_ops;
 978 
 979         dev_info(dev, "%s fallback to PIO mode\n", rsnd_mod_name(mod));
 980 
 981         return 0;
 982 }
 983 
 984 static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
 985                                          struct rsnd_mod *mod)
 986 {
 987         struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 988         int is_play = rsnd_io_is_play(io);
 989         char *name;
 990 
 991         /*
 992          * It should use "rcar_sound,ssiu" on DT.
 993          * But, we need to keep compatibility for old version.
 994          *
 995          * If it has "rcar_sound.ssiu", it will be used.
 996          * If not, "rcar_sound.ssi" will be used.
 997          * see
 998          *      rsnd_ssiu_dma_req()
 999          *      rsnd_dma_of_path()
1000          */
1001 
1002         if (rsnd_ssi_use_busif(io))
1003                 name = is_play ? "rxu" : "txu";
1004         else
1005                 name = is_play ? "rx" : "tx";
1006 
1007         return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
1008                                         mod, name);
1009 }
1010 
1011 static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
1012         .name           = SSI_NAME,
1013         .dma_req        = rsnd_ssi_dma_req,
1014         .probe          = rsnd_ssi_dma_probe,
1015         .remove         = rsnd_ssi_common_remove,
1016         .init           = rsnd_ssi_init,
1017         .quit           = rsnd_ssi_quit,
1018         .start          = rsnd_ssi_start,
1019         .stop           = rsnd_ssi_stop,
1020         .irq            = rsnd_ssi_irq,
1021         .pcm_new        = rsnd_ssi_pcm_new,
1022         .fallback       = rsnd_ssi_fallback,
1023         .hw_params      = rsnd_ssi_hw_params,
1024         .prepare        = rsnd_ssi_prepare,
1025         .get_status     = rsnd_ssi_get_status,
1026 };
1027 
1028 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
1029 {
1030         return mod->ops == &rsnd_ssi_dma_ops;
1031 }
1032 
1033 /*
1034  *              ssi mod function
1035  */
1036 static void rsnd_ssi_connect(struct rsnd_mod *mod,
1037                              struct rsnd_dai_stream *io)
1038 {
1039         struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
1040         enum rsnd_mod_type types[] = {
1041                 RSND_MOD_SSI,
1042                 RSND_MOD_SSIM1,
1043                 RSND_MOD_SSIM2,
1044                 RSND_MOD_SSIM3,
1045         };
1046         enum rsnd_mod_type type;
1047         int i;
1048 
1049         /* try SSI -> SSIM1 -> SSIM2 -> SSIM3 */
1050         for (i = 0; i < ARRAY_SIZE(types); i++) {
1051                 type = types[i];
1052                 if (!rsnd_io_to_mod(io, type)) {
1053                         rsnd_dai_connect(mod, io, type);
1054                         rsnd_rdai_channels_set(rdai, (i + 1) * 2);
1055                         rsnd_rdai_ssi_lane_set(rdai, (i + 1));
1056                         return;
1057                 }
1058         }
1059 }
1060 
1061 void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
1062                             struct device_node *playback,
1063                             struct device_node *capture)
1064 {
1065         struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
1066         struct device_node *node;
1067         struct device_node *np;
1068         struct rsnd_mod *mod;
1069         int i;
1070 
1071         node = rsnd_ssi_of_node(priv);
1072         if (!node)
1073                 return;
1074 
1075         i = 0;
1076         for_each_child_of_node(node, np) {
1077                 mod = rsnd_ssi_mod_get(priv, i);
1078                 if (np == playback)
1079                         rsnd_ssi_connect(mod, &rdai->playback);
1080                 if (np == capture)
1081                         rsnd_ssi_connect(mod, &rdai->capture);
1082                 i++;
1083         }
1084 
1085         of_node_put(node);
1086 }
1087 
1088 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
1089 {
1090         if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
1091                 id = 0;
1092 
1093         return rsnd_mod_get(rsnd_ssi_get(priv, id));
1094 }
1095 
1096 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
1097 {
1098         if (!mod)
1099                 return 0;
1100 
1101         return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE));
1102 }
1103 
1104 int rsnd_ssi_probe(struct rsnd_priv *priv)
1105 {
1106         struct device_node *node;
1107         struct device_node *np;
1108         struct device *dev = rsnd_priv_to_dev(priv);
1109         struct rsnd_mod_ops *ops;
1110         struct clk *clk;
1111         struct rsnd_ssi *ssi;
1112         char name[RSND_SSI_NAME_SIZE];
1113         int i, nr, ret;
1114 
1115         node = rsnd_ssi_of_node(priv);
1116         if (!node)
1117                 return -EINVAL;
1118 
1119         nr = of_get_child_count(node);
1120         if (!nr) {
1121                 ret = -EINVAL;
1122                 goto rsnd_ssi_probe_done;
1123         }
1124 
1125         ssi     = devm_kcalloc(dev, nr, sizeof(*ssi), GFP_KERNEL);
1126         if (!ssi) {
1127                 ret = -ENOMEM;
1128                 goto rsnd_ssi_probe_done;
1129         }
1130 
1131         priv->ssi       = ssi;
1132         priv->ssi_nr    = nr;
1133 
1134         i = 0;
1135         for_each_child_of_node(node, np) {
1136                 if (!of_device_is_available(np))
1137                         goto skip;
1138 
1139                 ssi = rsnd_ssi_get(priv, i);
1140 
1141                 snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
1142                          SSI_NAME, i);
1143 
1144                 clk = devm_clk_get(dev, name);
1145                 if (IS_ERR(clk)) {
1146                         ret = PTR_ERR(clk);
1147                         of_node_put(np);
1148                         goto rsnd_ssi_probe_done;
1149                 }
1150 
1151                 if (of_get_property(np, "shared-pin", NULL))
1152                         rsnd_flags_set(ssi, RSND_SSI_CLK_PIN_SHARE);
1153 
1154                 if (of_get_property(np, "no-busif", NULL))
1155                         rsnd_flags_set(ssi, RSND_SSI_NO_BUSIF);
1156 
1157                 ssi->irq = irq_of_parse_and_map(np, 0);
1158                 if (!ssi->irq) {
1159                         ret = -EINVAL;
1160                         of_node_put(np);
1161                         goto rsnd_ssi_probe_done;
1162                 }
1163 
1164                 if (of_property_read_bool(np, "pio-transfer"))
1165                         ops = &rsnd_ssi_pio_ops;
1166                 else
1167                         ops = &rsnd_ssi_dma_ops;
1168 
1169                 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
1170                                     RSND_MOD_SSI, i);
1171                 if (ret) {
1172                         of_node_put(np);
1173                         goto rsnd_ssi_probe_done;
1174                 }
1175 skip:
1176                 i++;
1177         }
1178 
1179         ret = 0;
1180 
1181 rsnd_ssi_probe_done:
1182         of_node_put(node);
1183 
1184         return ret;
1185 }
1186 
1187 void rsnd_ssi_remove(struct rsnd_priv *priv)
1188 {
1189         struct rsnd_ssi *ssi;
1190         int i;
1191 
1192         for_each_rsnd_ssi(ssi, priv, i) {
1193                 rsnd_mod_quit(rsnd_mod_get(ssi));
1194         }
1195 }

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