Merge branch 'asoc-fix-rcar' into HEAD
authorMark Brown <broonie@kernel.org>
Fri, 27 Mar 2015 23:00:39 +0000 (16:00 -0700)
committerMark Brown <broonie@kernel.org>
Fri, 27 Mar 2015 23:00:39 +0000 (16:00 -0700)
1  2 
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/dvc.c
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/src.c
sound/soc/sh/rcar/ssi.c

index 519d85692e0c612c91f5d0419aff73653585aa4b,6046c10ef3c7f94d9f192ce3c8a48cb59c0cc6dc..770247cddb6c44bf33a5e87c5cbe8ed98520bbd2
@@@ -137,15 -138,18 +137,15 @@@ char *rsnd_mod_name(struct rsnd_mod *mo
        return mod->ops->name;
  }
  
 -char *rsnd_mod_dma_name(struct rsnd_mod *mod)
 +struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod)
  {
 -      if (!mod || !mod->ops)
 -              return "unknown";
 -
 -      if (!mod->ops->dma_name)
 -              return mod->ops->name;
 +      if (!mod || !mod->ops || !mod->ops->dma_req)
 +              return NULL;
  
 -      return mod->ops->dma_name(mod);
 +      return mod->ops->dma_req(mod);
  }
  
void rsnd_mod_init(struct rsnd_mod *mod,
int rsnd_mod_init(struct rsnd_mod *mod,
                   struct rsnd_mod_ops *ops,
                   struct clk *clk,
                   enum rsnd_mod_type type,
        mod->ops        = ops;
        mod->type       = type;
        mod->clk        = clk;
+       return ret;
+ }
+ void rsnd_mod_quit(struct rsnd_mod *mod)
+ {
+       if (mod->clk)
+               clk_unprepare(mod->clk);
  }
  
 -/*
 - *    rsnd_dma functions
 - */
 -void rsnd_dma_stop(struct rsnd_dma *dma)
 -{
 -      dmaengine_terminate_all(dma->chan);
 -}
 -
 -static void rsnd_dma_complete(void *data)
 -{
 -      struct rsnd_dma *dma = (struct rsnd_dma *)data;
 -      struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
 -      struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
 -
 -      /*
 -       * Renesas sound Gen1 needs 1 DMAC,
 -       * Gen2 needs 2 DMAC.
 -       * In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
 -       * But, Audio-DMAC-peri-peri doesn't have interrupt,
 -       * and this driver is assuming that here.
 -       *
 -       * If Audio-DMAC-peri-peri has interrpt,
 -       * rsnd_dai_pointer_update() will be called twice,
 -       * ant it will breaks io->byte_pos
 -       */
 -
 -      rsnd_dai_pointer_update(io, io->byte_per_period);
 -}
 -
 -void rsnd_dma_start(struct rsnd_dma *dma)
 -{
 -      struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
 -      struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 -      struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
 -      struct snd_pcm_substream *substream = io->substream;
 -      struct device *dev = rsnd_priv_to_dev(priv);
 -      struct dma_async_tx_descriptor *desc;
 -
 -      desc = dmaengine_prep_dma_cyclic(dma->chan,
 -                                       (dma->addr) ? dma->addr :
 -                                       substream->runtime->dma_addr,
 -                                       snd_pcm_lib_buffer_bytes(substream),
 -                                       snd_pcm_lib_period_bytes(substream),
 -                                       dma->dir,
 -                                       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 -
 -      if (!desc) {
 -              dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
 -              return;
 -      }
 -
 -      desc->callback          = rsnd_dma_complete;
 -      desc->callback_param    = dma;
 -
 -      if (dmaengine_submit(desc) < 0) {
 -              dev_err(dev, "dmaengine_submit() fail\n");
 -              return;
 -      }
 -
 -      dma_async_issue_pending(dma->chan);
 -}
 -
 -int rsnd_dma_available(struct rsnd_dma *dma)
 -{
 -      return !!dma->chan;
 -}
 -
 -#define DMA_NAME_SIZE 16
 -#define MOD_MAX 4 /* MEM/SSI/SRC/DVC */
 -static int _rsnd_dma_of_name(char *dma_name, struct rsnd_mod *mod)
 -{
 -      if (mod)
 -              return snprintf(dma_name, DMA_NAME_SIZE / 2, "%s%d",
 -                       rsnd_mod_dma_name(mod), rsnd_mod_id(mod));
 -      else
 -              return snprintf(dma_name, DMA_NAME_SIZE / 2, "mem");
 -
 -}
 -
 -static void rsnd_dma_of_name(struct rsnd_mod *mod_from,
 -                           struct rsnd_mod *mod_to,
 -                           char *dma_name)
 -{
 -      int index = 0;
 -
 -      index = _rsnd_dma_of_name(dma_name + index, mod_from);
 -      *(dma_name + index++) = '_';
 -      index = _rsnd_dma_of_name(dma_name + index, mod_to);
 -}
 -
 -static void rsnd_dma_of_path(struct rsnd_dma *dma,
 -                           int is_play,
 -                           struct rsnd_mod **mod_from,
 -                           struct rsnd_mod **mod_to)
 -{
 -      struct rsnd_mod *this = rsnd_dma_to_mod(dma);
 -      struct rsnd_dai_stream *io = rsnd_mod_to_io(this);
 -      struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
 -      struct rsnd_mod *src = rsnd_io_to_mod_src(io);
 -      struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
 -      struct rsnd_mod *mod[MOD_MAX];
 -      int i, index;
 -
 -
 -      for (i = 0; i < MOD_MAX; i++)
 -              mod[i] = NULL;
 -
 -      /*
 -       * in play case...
 -       *
 -       * src -> dst
 -       *
 -       * mem -> SSI
 -       * mem -> SRC -> SSI
 -       * mem -> SRC -> DVC -> SSI
 -       */
 -      mod[0] = NULL; /* for "mem" */
 -      index = 1;
 -      for (i = 1; i < MOD_MAX; i++) {
 -              if (!src) {
 -                      mod[i] = ssi;
 -              } else if (!dvc) {
 -                      mod[i] = src;
 -                      src = NULL;
 -              } else {
 -                      if ((!is_play) && (this == src))
 -                              this = dvc;
 -
 -                      mod[i] = (is_play) ? src : dvc;
 -                      i++;
 -                      mod[i] = (is_play) ? dvc : src;
 -                      src = NULL;
 -                      dvc = NULL;
 -              }
 -
 -              if (mod[i] == this)
 -                      index = i;
 -
 -              if (mod[i] == ssi)
 -                      break;
 -      }
 -
 -      if (is_play) {
 -              *mod_from = mod[index - 1];
 -              *mod_to   = mod[index];
 -      } else {
 -              *mod_from = mod[index];
 -              *mod_to   = mod[index - 1];
 -      }
 -}
 -
 -int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma,
 -                int is_play, int id)
 -{
 -      struct device *dev = rsnd_priv_to_dev(priv);
 -      struct dma_slave_config cfg;
 -      struct rsnd_mod *mod_from;
 -      struct rsnd_mod *mod_to;
 -      char dma_name[DMA_NAME_SIZE];
 -      dma_cap_mask_t mask;
 -      int ret;
 -
 -      if (dma->chan) {
 -              dev_err(dev, "it already has dma channel\n");
 -              return -EIO;
 -      }
 -
 -      dma_cap_zero(mask);
 -      dma_cap_set(DMA_SLAVE, mask);
 -
 -      rsnd_dma_of_path(dma, is_play, &mod_from, &mod_to);
 -      rsnd_dma_of_name(mod_from, mod_to, dma_name);
 -
 -      cfg.slave_id    = id;
 -      cfg.direction   = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
 -      cfg.src_addr    = rsnd_gen_dma_addr(priv, mod_from, is_play, 1);
 -      cfg.dst_addr    = rsnd_gen_dma_addr(priv, mod_to,   is_play, 0);
 -      cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 -      cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 -
 -      dev_dbg(dev, "dma : %s %pad -> %pad\n",
 -              dma_name, &cfg.src_addr, &cfg.dst_addr);
 -
 -      dma->chan = dma_request_slave_channel_compat(mask, shdma_chan_filter,
 -                                                   (void *)id, dev,
 -                                                   dma_name);
 -      if (!dma->chan) {
 -              dev_err(dev, "can't get dma channel\n");
 -              goto rsnd_dma_channel_err;
 -      }
 -
 -      ret = dmaengine_slave_config(dma->chan, &cfg);
 -      if (ret < 0)
 -              goto rsnd_dma_init_err;
 -
 -      dma->addr = is_play ? cfg.src_addr : cfg.dst_addr;
 -      dma->dir = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
 -
 -      return 0;
 -
 -rsnd_dma_init_err:
 -      rsnd_dma_quit(priv, dma);
 -rsnd_dma_channel_err:
 -
 -      /*
 -       * DMA failed. try to PIO mode
 -       * see
 -       *      rsnd_ssi_fallback()
 -       *      rsnd_rdai_continuance_probe()
 -       */
 -      return -EAGAIN;
 -}
 -
 -void  rsnd_dma_quit(struct rsnd_priv *priv,
 -                  struct rsnd_dma *dma)
 -{
 -      if (dma->chan)
 -              dma_release_channel(dma->chan);
 -
 -      dma->chan = NULL;
 -}
 -
  /*
   *    settting function
   */
Simple merge
index 5f35af7ff8212649e51bf07b531e34950aa5c403,1bccc5515b5a9bbbb2e7c57255aa6a9707b11593..f7af0be1155838ac974a1b1662c1674ca955a5fa
@@@ -283,18 -257,20 +283,19 @@@ struct rsnd_mod 
  
  #define rsnd_mod_to_priv(mod) (rsnd_io_to_priv(rsnd_mod_to_io(mod)))
  #define rsnd_mod_to_dma(mod) (&(mod)->dma)
 -#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
  #define rsnd_mod_to_io(mod) ((mod)->io)
  #define rsnd_mod_id(mod) ((mod)->id)
- #define rsnd_mod_hw_start(mod)        clk_prepare_enable((mod)->clk)
- #define rsnd_mod_hw_stop(mod) clk_disable_unprepare((mod)->clk)
+ #define rsnd_mod_hw_start(mod)        clk_enable((mod)->clk)
+ #define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk)
  
void rsnd_mod_init(struct rsnd_mod *mod,
int rsnd_mod_init(struct rsnd_mod *mod,
                   struct rsnd_mod_ops *ops,
                   struct clk *clk,
                   enum rsnd_mod_type type,
                   int id);
+ void rsnd_mod_quit(struct rsnd_mod *mod);
  char *rsnd_mod_name(struct rsnd_mod *mod);
 -char *rsnd_mod_dma_name(struct rsnd_mod *mod);
 +struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
  
  /*
   *    R-Car sound DAI
Simple merge
Simple merge