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 */ 29 struct 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 */ 64 struct 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 */ 96 int asoc_qcom_lpass_platform_register(struct platform_device *); 97 int asoc_qcom_lpass_cpu_platform_remove(struct platform_device *pdev); 98 int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev); 99 int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai); 100 extern const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops; 101 102 #endif /* __LPASS_H__ */ 103