linux/sound/soc/qcom/lpass.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2010-2011,2013-2015 The Linux Foundation. All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 and
   6 * only version 2 as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 *
  13 * lpass.h - Definitions for the QTi LPASS
  14 */
  15
  16#ifndef __LPASS_H__
  17#define __LPASS_H__
  18
  19#include <linux/clk.h>
  20#include <linux/compiler.h>
  21#include <linux/platform_device.h>
  22#include <linux/regmap.h>
  23
  24#define LPASS_AHBIX_CLOCK_FREQUENCY             131072000
  25#define LPASS_MAX_MI2S_PORTS                    (8)
  26#define LPASS_MAX_DMA_CHANNELS                  (8)
  27
  28/* Both the CPU DAI and platform drivers will access this data */
  29struct lpass_data {
  30
  31        /* AHB-I/X bus clocks inside the low-power audio subsystem (LPASS) */
  32        struct clk *ahbix_clk;
  33
  34        /* MI2S system clock */
  35        struct clk *mi2s_osr_clk[LPASS_MAX_MI2S_PORTS];
  36
  37        /* MI2S bit clock (derived from system clock by a divider */
  38        struct clk *mi2s_bit_clk[LPASS_MAX_MI2S_PORTS];
  39
  40        /* low-power audio interface (LPAIF) registers */
  41        void __iomem *lpaif;
  42
  43        /* regmap backed by the low-power audio interface (LPAIF) registers */
  44        struct regmap *lpaif_map;
  45
  46        /* interrupts from the low-power audio interface (LPAIF) */
  47        int lpaif_irq;
  48
  49        /* SOC specific variations in the LPASS IP integration */
  50        struct lpass_variant *variant;
  51
  52        /* bit map to keep track of static channel allocations */
  53        unsigned long dma_ch_bit_map;
  54
  55        /* used it for handling interrupt per dma channel */
  56        struct snd_pcm_substream *substream[LPASS_MAX_DMA_CHANNELS];
  57
  58        /* 8016 specific */
  59        struct clk *pcnoc_mport_clk;
  60        struct clk *pcnoc_sway_clk;
  61};
  62
  63/* Vairant data per each SOC */
  64struct lpass_variant {
  65        u32     i2sctrl_reg_base;
  66        u32     i2sctrl_reg_stride;
  67        u32     i2s_ports;
  68        u32     irq_reg_base;
  69        u32     irq_reg_stride;
  70        u32     irq_ports;
  71        u32     rdma_reg_base;
  72        u32     rdma_reg_stride;
  73        u32     rdma_channels;
  74        u32     wrdma_reg_base;
  75        u32     wrdma_reg_stride;
  76        u32     wrdma_channels;
  77
  78        /**
  79         * on SOCs like APQ8016 the channel control bits start
  80         * at different offset to ipq806x
  81         **/
  82        u32     dmactl_audif_start;
  83        u32     wrdma_channel_start;
  84        /* SOC specific intialization like clocks */
  85        int (*init)(struct platform_device *pdev);
  86        int (*exit)(struct platform_device *pdev);
  87        int (*alloc_dma_channel)(struct lpass_data *data, int direction);
  88        int (*free_dma_channel)(struct lpass_data *data, int ch);
  89
  90        /* SOC specific dais */
  91        struct snd_soc_dai_driver *dai_driver;
  92        int num_dai;
  93};
  94
  95/* register the platform driver from the CPU DAI driver */
  96int asoc_qcom_lpass_platform_register(struct platform_device *);
  97int asoc_qcom_lpass_cpu_platform_remove(struct platform_device *pdev);
  98int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev);
  99int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai);
 100extern const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops;
 101
 102#endif /* __LPASS_H__ */
 103