/* Copyright (c) 2013, 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.
 */

/*
 * As a general rule, only version-specific property overrides should be placed
 * inside this file. However, device definitions should be placed inside the
 * msm8974.dtsi file.
 */

/include/ "msm8974-v2.0-1.dtsi"
/include/ "apq8074-v2.0-1-ion.dtsi"

&soc {
	qcom,qseecom@a700000 {
		compatible = "qcom,qseecom";
		reg = <0x0a700000 0x500000>;
		reg-names = "secapp-region";
		qcom,disk-encrypt-pipe-pair = <2>;
		qcom,hlos-ce-hw-instance = <1>;
		qcom,qsee-ce-hw-instance = <0>;
		qcom,msm-bus,name = "qseecom-noc";
		qcom,msm-bus,num-cases = <4>;
		qcom,msm-bus,active-only = <0>;
		qcom,msm-bus,num-paths = <1>;
		qcom,msm-bus,vectors-KBps =
				<55 512 0 0>,
				<55 512 3936000 393600>,
				<55 512 3936000 393600>,
				<55 512 3936000 393600>;
	};

	sound {
		compatible = "qcom,apq8074-audio-taiko";
	};
};

&memory_hole {
	qcom,memblock-remove = <0x0a700000 0x5800000>; /* Address and size of the hole */
};

&qseecom {
	status = "disabled";
};

&sdcc3 {
	qcom,sup-voltages = <2000 2000>;
	status = "ok";
};

&ehci {
	hsusb_vdd_dig-supply = <&pm8841_s2_corner>;
	qcom,vdd-voltage-level = <1 2 3 5 7>;
};

