/*
 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include "msm-audio-lpass.dtsi"
#include "sdm670-wcd.dtsi"
#include "sdm670-wsa881x.dtsi"
#include "sdm670-lpi.dtsi"
#include <dt-bindings/clock/qcom,audio-ext-clk.h>

&msm_audio_ion {
	iommus = <&apps_smmu 0x1801 0x0>;
	qcom,smmu-sid-mask = /bits/ 64 <0xf>;
};

&soc {
	qcom,avtimer@62cf700c {
		compatible = "qcom,avtimer";
		reg = <0x62cf700c 0x4>,
			<0x62cf7010 0x4>;
		reg-names = "avtimer_lsb_addr", "avtimer_msb_addr";
		qcom,clk-div = <192>;
		qcom,clk-mult = <10>;
	};

	tavil_snd: sound-tavil {
		status = "disabled";
		compatible = "qcom,sdm670-asoc-snd-tavil";
		qcom,model = "sdm670-tavil-snd-card";
		qcom,wcn-btfm;
		qcom,mi2s-audio-intf;
		qcom,auxpcm-audio-intf;
		asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>,
			<&loopback>, <&compress>, <&hostless>,
			<&afe>, <&lsm>, <&routing>, <&cpe>, <&compr>,
			<&pcm_noirq>;
		asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1",
			"msm-pcm-dsp.2", "msm-voip-dsp",
			"msm-pcm-voice", "msm-pcm-loopback",
			"msm-compress-dsp", "msm-pcm-hostless",
			"msm-pcm-afe", "msm-lsm-client",
			"msm-pcm-routing", "msm-cpe-lsm",
			"msm-compr-dsp", "msm-pcm-dsp-noirq";
		asoc-cpu = <&dai_mi2s0>, <&dai_mi2s1>,
			<&dai_mi2s2>, <&dai_mi2s3>, <&dai_mi2s4>,
			<&dai_pri_auxpcm>, <&dai_sec_auxpcm>,
			<&dai_tert_auxpcm>, <&dai_quat_auxpcm>,
			<&dai_quin_auxpcm>,
			<&sb_0_rx>, <&sb_0_tx>, <&sb_1_rx>, <&sb_1_tx>,
			<&sb_2_rx>, <&sb_2_tx>, <&sb_3_rx>, <&sb_3_tx>,
			<&sb_4_rx>, <&sb_4_tx>, <&sb_5_rx>, <&sb_5_tx>,
			<&sb_6_rx>, <&sb_7_rx>, <&sb_7_tx>,
			<&sb_8_rx>, <&sb_8_tx>,
			<&afe_pcm_rx>, <&afe_pcm_tx>, <&afe_proxy_rx>,
			<&afe_proxy_tx>, <&incall_record_rx>,
			<&incall_record_tx>, <&incall_music_rx>,
			<&incall_music_2_rx>,
			<&usb_audio_rx>, <&usb_audio_tx>,
			<&dai_pri_tdm_rx_0>, <&dai_pri_tdm_tx_0>,
			<&dai_sec_tdm_rx_0>, <&dai_sec_tdm_tx_0>,
			<&dai_tert_tdm_rx_0>, <&dai_tert_tdm_tx_0>,
			<&dai_quat_tdm_rx_0>, <&dai_quat_tdm_tx_0>,
			<&dai_quin_tdm_rx_0>, <&dai_quin_tdm_tx_0>;
		asoc-cpu-names = "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1",
			"msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3",
			"msm-dai-q6-mi2s.4",
			"msm-dai-q6-auxpcm.1", "msm-dai-q6-auxpcm.2",
			"msm-dai-q6-auxpcm.3", "msm-dai-q6-auxpcm.4",
			"msm-dai-q6-auxpcm.5",
			"msm-dai-q6-dev.16384", "msm-dai-q6-dev.16385",
			"msm-dai-q6-dev.16386", "msm-dai-q6-dev.16387",
			"msm-dai-q6-dev.16388", "msm-dai-q6-dev.16389",
			"msm-dai-q6-dev.16390", "msm-dai-q6-dev.16391",
			"msm-dai-q6-dev.16392", "msm-dai-q6-dev.16393",
			"msm-dai-q6-dev.16394", "msm-dai-q6-dev.16395",
			"msm-dai-q6-dev.16396",
			"msm-dai-q6-dev.16398", "msm-dai-q6-dev.16399",
			"msm-dai-q6-dev.16400", "msm-dai-q6-dev.16401",
			"msm-dai-q6-dev.224", "msm-dai-q6-dev.225",
			"msm-dai-q6-dev.241", "msm-dai-q6-dev.240",
			"msm-dai-q6-dev.32771", "msm-dai-q6-dev.32772",
			"msm-dai-q6-dev.32773", "msm-dai-q6-dev.32770",
			"msm-dai-q6-dev.28672", "msm-dai-q6-dev.28673",
			"msm-dai-q6-tdm.36864", "msm-dai-q6-tdm.36865",
			"msm-dai-q6-tdm.36880", "msm-dai-q6-tdm.36881",
			"msm-dai-q6-tdm.36896", "msm-dai-q6-tdm.36897",
			"msm-dai-q6-tdm.36912", "msm-dai-q6-tdm.36913",
			"msm-dai-q6-tdm.36928", "msm-dai-q6-tdm.36929";
	};

	int_codec: sound {
		status = "okay";
		compatible = "qcom,sdm670-asoc-snd";
		qcom,model = "sdm670-mtp-snd-card";
		qcom,wcn-btfm;
		qcom,mi2s-audio-intf;
		qcom,auxpcm-audio-intf;
		asoc-platform = <&pcm0>, <&pcm1>, <&pcm2>, <&voip>, <&voice>,
			<&loopback>, <&compress>, <&hostless>,
			<&afe>, <&lsm>, <&routing>, <&compr>,
			<&pcm_noirq>;
		asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-dsp.1",
			"msm-pcm-dsp.2", "msm-voip-dsp",
			"msm-pcm-voice", "msm-pcm-loopback",
			"msm-compress-dsp", "msm-pcm-hostless",
			"msm-pcm-afe", "msm-lsm-client",
			"msm-pcm-routing", "msm-compr-dsp",
			"msm-pcm-dsp-noirq";
		asoc-cpu = <&dai_mi2s0>, <&dai_mi2s1>,
			<&dai_mi2s2>, <&dai_mi2s3>, <&dai_mi2s4>,
			<&dai_int_mi2s0>, <&dai_int_mi2s1>,
			<&dai_int_mi2s2>, <&dai_int_mi2s3>,
			<&dai_int_mi2s4>, <&dai_int_mi2s5>,
			<&dai_pri_auxpcm>, <&dai_sec_auxpcm>,
			<&dai_tert_auxpcm>, <&dai_quat_auxpcm>,
			<&dai_quin_auxpcm>,
			<&afe_pcm_rx>, <&afe_pcm_tx>, <&afe_proxy_rx>,
			<&afe_proxy_tx>, <&incall_record_rx>,
			<&incall_record_tx>, <&incall_music_rx>,
			<&incall_music_2_rx>, <&sb_7_rx>, <&sb_7_tx>,
			<&sb_8_tx>, <&sb_8_rx>,
			<&usb_audio_rx>, <&usb_audio_tx>,
			<&dai_pri_tdm_rx_0>, <&dai_pri_tdm_tx_0>,
			<&dai_sec_tdm_rx_0>, <&dai_sec_tdm_tx_0>,
			<&dai_tert_tdm_rx_0>, <&dai_tert_tdm_tx_0>,
			<&dai_quat_tdm_rx_0>, <&dai_quat_tdm_tx_0>,
			<&dai_quin_tdm_rx_0>, <&dai_quin_tdm_tx_0>;
		asoc-cpu-names = "msm-dai-q6-mi2s.0", "msm-dai-q6-mi2s.1",
			"msm-dai-q6-mi2s.2", "msm-dai-q6-mi2s.3",
			"msm-dai-q6-mi2s.4",
			"msm-dai-q6-mi2s.7", "msm-dai-q6-mi2s.8",
			"msm-dai-q6-mi2s.9", "msm-dai-q6-mi2s.10",
			"msm-dai-q6-mi2s.11", "msm-dai-q6-mi2s.12",
			"msm-dai-q6-auxpcm.1", "msm-dai-q6-auxpcm.2",
			"msm-dai-q6-auxpcm.3", "msm-dai-q6-auxpcm.4",
			"msm-dai-q6-auxpcm.5",
			"msm-dai-q6-dev.224", "msm-dai-q6-dev.225",
			"msm-dai-q6-dev.241", "msm-dai-q6-dev.240",
			"msm-dai-q6-dev.32771", "msm-dai-q6-dev.32772",
			"msm-dai-q6-dev.32773", "msm-dai-q6-dev.32770",
			"msm-dai-q6-dev.16398", "msm-dai-q6-dev.16399",
			"msm-dai-q6-dev.16401", "msm-dai-q6-dev.16400",
			"msm-dai-q6-dev.28672", "msm-dai-q6-dev.28673",
			"msm-dai-q6-tdm.36864", "msm-dai-q6-tdm.36865",
			"msm-dai-q6-tdm.36880", "msm-dai-q6-tdm.36881",
			"msm-dai-q6-tdm.36896", "msm-dai-q6-tdm.36897",
			"msm-dai-q6-tdm.36912", "msm-dai-q6-tdm.36913",
			"msm-dai-q6-tdm.36928", "msm-dai-q6-tdm.36929";
	};

	cpe: qcom,msm-cpe-lsm {
		compatible = "qcom,msm-cpe-lsm";
	};

	cpe3: qcom,msm-cpe-lsm@3 {
		compatible = "qcom,msm-cpe-lsm";
		qcom,msm-cpe-lsm-id = <3>;
	};
};

&slim_aud {
	status = "disabled";
	dai_slim: msm_dai_slim {
		status = "disabled";
		compatible = "qcom,msm-dai-slim";
		elemental-addr = [ff ff ff fe 17 02];
	};
};

&msm_dai_mi2s {
	dai_int_mi2s0: qcom,msm-dai-q6-int-mi2s0 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <7>;
		qcom,msm-mi2s-rx-lines = <3>;
		qcom,msm-mi2s-tx-lines = <0>;
	};

	dai_int_mi2s1: qcom,msm-dai-q6-int-mi2s1 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <8>;
		qcom,msm-mi2s-rx-lines = <3>;
		qcom,msm-mi2s-tx-lines = <0>;
	};

	dai_int_mi2s2: qcom,msm-dai-q6-int-mi2s2 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <9>;
		qcom,msm-mi2s-rx-lines = <0>;
		qcom,msm-mi2s-tx-lines = <3>;
	};

	dai_int_mi2s3: qcom,msm-dai-q6-int-mi2s3 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <10>;
		qcom,msm-mi2s-rx-lines = <0>;
		qcom,msm-mi2s-tx-lines = <3>;
	};

	dai_int_mi2s4: qcom,msm-dai-q6-int-mi2s4 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <11>;
		qcom,msm-mi2s-rx-lines = <3>;
		qcom,msm-mi2s-tx-lines = <0>;
	};

	dai_int_mi2s5: qcom,msm-dai-q6-int-mi2s5 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <12>;
		qcom,msm-mi2s-rx-lines = <0>;
		qcom,msm-mi2s-tx-lines = <3>;
	};

	dai_int_mi2s6: qcom,msm-dai-q6-int-mi2s6 {
		compatible = "qcom,msm-dai-q6-mi2s";
		qcom,msm-dai-q6-mi2s-dev-id = <13>;
		qcom,msm-mi2s-rx-lines = <0>;
		qcom,msm-mi2s-tx-lines = <3>;
	};
};
