1cd59f138SKenneth Westfield /* 2cd59f138SKenneth Westfield * Copyright (c) 2010-2011,2013-2015 The Linux Foundation. All rights reserved. 3cd59f138SKenneth Westfield * 4cd59f138SKenneth Westfield * This program is free software; you can redistribute it and/or modify 5cd59f138SKenneth Westfield * it under the terms of the GNU General Public License version 2 and 6cd59f138SKenneth Westfield * only version 2 as published by the Free Software Foundation. 7cd59f138SKenneth Westfield * 8cd59f138SKenneth Westfield * This program is distributed in the hope that it will be useful, 9cd59f138SKenneth Westfield * but WITHOUT ANY WARRANTY; without even the implied warranty of 10cd59f138SKenneth Westfield * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11cd59f138SKenneth Westfield * GNU General Public License for more details. 12cd59f138SKenneth Westfield * 13cd59f138SKenneth Westfield * lpass.h - Definitions for the QTi LPASS 14cd59f138SKenneth Westfield */ 15cd59f138SKenneth Westfield 16cd59f138SKenneth Westfield #ifndef __LPASS_H__ 17cd59f138SKenneth Westfield #define __LPASS_H__ 18cd59f138SKenneth Westfield 19cd59f138SKenneth Westfield #include <linux/clk.h> 20cd59f138SKenneth Westfield #include <linux/compiler.h> 21cd59f138SKenneth Westfield #include <linux/platform_device.h> 22cd59f138SKenneth Westfield #include <linux/regmap.h> 23cd59f138SKenneth Westfield 24cd59f138SKenneth Westfield #define LPASS_AHBIX_CLOCK_FREQUENCY 131072000 259a127cffSSrinivas Kandagatla #define LPASS_MAX_MI2S_PORTS (8) 264f629e4bSSrinivas Kandagatla #define LPASS_MAX_DMA_CHANNELS (8) 27cd59f138SKenneth Westfield 28cd59f138SKenneth Westfield /* Both the CPU DAI and platform drivers will access this data */ 29cd59f138SKenneth Westfield struct lpass_data { 30cd59f138SKenneth Westfield 31cd59f138SKenneth Westfield /* AHB-I/X bus clocks inside the low-power audio subsystem (LPASS) */ 32cd59f138SKenneth Westfield struct clk *ahbix_clk; 33cd59f138SKenneth Westfield 34cd59f138SKenneth Westfield /* MI2S system clock */ 359a127cffSSrinivas Kandagatla struct clk *mi2s_osr_clk[LPASS_MAX_MI2S_PORTS]; 36cd59f138SKenneth Westfield 37cd59f138SKenneth Westfield /* MI2S bit clock (derived from system clock by a divider */ 389a127cffSSrinivas Kandagatla struct clk *mi2s_bit_clk[LPASS_MAX_MI2S_PORTS]; 39cd59f138SKenneth Westfield 40cd59f138SKenneth Westfield /* low-power audio interface (LPAIF) registers */ 41cd59f138SKenneth Westfield void __iomem *lpaif; 42cd59f138SKenneth Westfield 43cd59f138SKenneth Westfield /* regmap backed by the low-power audio interface (LPAIF) registers */ 44cd59f138SKenneth Westfield struct regmap *lpaif_map; 45cd59f138SKenneth Westfield 46cd59f138SKenneth Westfield /* interrupts from the low-power audio interface (LPAIF) */ 47cd59f138SKenneth Westfield int lpaif_irq; 489bae4880SSrinivas Kandagatla 499bae4880SSrinivas Kandagatla /* SOC specific variations in the LPASS IP integration */ 509bae4880SSrinivas Kandagatla struct lpass_variant *variant; 514f629e4bSSrinivas Kandagatla 5289cdfa06SSrinivas Kandagatla /* bit map to keep track of static channel allocations */ 5389cdfa06SSrinivas Kandagatla unsigned long rdma_ch_bit_map; 5489cdfa06SSrinivas Kandagatla 554f629e4bSSrinivas Kandagatla /* used it for handling interrupt per dma channel */ 564f629e4bSSrinivas Kandagatla struct snd_pcm_substream *substream[LPASS_MAX_DMA_CHANNELS]; 579bae4880SSrinivas Kandagatla }; 589bae4880SSrinivas Kandagatla 599bae4880SSrinivas Kandagatla /* Vairant data per each SOC */ 609bae4880SSrinivas Kandagatla struct lpass_variant { 619bae4880SSrinivas Kandagatla u32 i2sctrl_reg_base; 629bae4880SSrinivas Kandagatla u32 i2sctrl_reg_stride; 639bae4880SSrinivas Kandagatla u32 i2s_ports; 649bae4880SSrinivas Kandagatla u32 irq_reg_base; 659bae4880SSrinivas Kandagatla u32 irq_reg_stride; 669bae4880SSrinivas Kandagatla u32 irq_ports; 679bae4880SSrinivas Kandagatla u32 rdma_reg_base; 689bae4880SSrinivas Kandagatla u32 rdma_reg_stride; 699bae4880SSrinivas Kandagatla u32 rdma_channels; 709bae4880SSrinivas Kandagatla 710054055cSSrinivas Kandagatla /** 720054055cSSrinivas Kandagatla * on SOCs like APQ8016 the channel control bits start 730054055cSSrinivas Kandagatla * at different offset to ipq806x 740054055cSSrinivas Kandagatla **/ 750054055cSSrinivas Kandagatla u32 rdmactl_audif_start; 769bae4880SSrinivas Kandagatla /* SOC specific intialization like clocks */ 779bae4880SSrinivas Kandagatla int (*init)(struct platform_device *pdev); 789bae4880SSrinivas Kandagatla int (*exit)(struct platform_device *pdev); 796db1c6baSSrinivas Kandagatla int (*alloc_dma_channel)(struct lpass_data *data); 806db1c6baSSrinivas Kandagatla int (*free_dma_channel)(struct lpass_data *data, int ch); 819bae4880SSrinivas Kandagatla 829bae4880SSrinivas Kandagatla /* SOC specific dais */ 839bae4880SSrinivas Kandagatla struct snd_soc_dai_driver *dai_driver; 849bae4880SSrinivas Kandagatla int num_dai; 85cd59f138SKenneth Westfield }; 86cd59f138SKenneth Westfield 87cd59f138SKenneth Westfield /* register the platform driver from the CPU DAI driver */ 88cd59f138SKenneth Westfield int asoc_qcom_lpass_platform_register(struct platform_device *); 899bae4880SSrinivas Kandagatla int asoc_qcom_lpass_cpu_platform_remove(struct platform_device *pdev); 909bae4880SSrinivas Kandagatla int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev); 919bae4880SSrinivas Kandagatla int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai); 929bae4880SSrinivas Kandagatla extern struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops; 93cd59f138SKenneth Westfield 94cd59f138SKenneth Westfield #endif /* __LPASS_H__ */ 95