/*
 * Device Tree Source for Sierra Wireless WP8548 Module
 *
 * Copyright (C) 2016 BayLibre, SAS.
 * Author : Neil Armstrong <narmstrong@baylibre.com>
 *
 * This file is dual-licensed: you can use it either under the terms
 * of the GPL or the X11 license, at your option. Note that this dual
 * licensing only applies to this file, and not this project as a
 * whole.
 *
 *  a) This file is free software; you can redistribute it and/or
 *     modify it under the terms of the GNU General Public License as
 *     published by the Free Software Foundation; either version 2 of the
 *     License, or (at your option) any later version.
 *
 *     This file 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.
 *
 * Or, alternatively,
 *
 *  b) Permission is hereby granted, free of charge, to any person
 *     obtaining a copy of this software and associated documentation
 *     files (the "Software"), to deal in the Software without
 *     restriction, including without limitation the rights to use,
 *     copy, modify, merge, publish, distribute, sublicense, and/or
 *     sell copies of the Software, and to permit persons to whom the
 *     Software is furnished to do so, subject to the following
 *     conditions:
 *
 *     The above copyright notice and this permission notice shall be
 *     included in all copies or substantial portions of the Software.
 *
 *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *     OTHER DEALINGS IN THE SOFTWARE.
 */

#include "qcom-mdm9615.dtsi"

/ {
	model = "Sierra Wireless WP8548 Module";
	compatible = "swir,wp8548", "qcom,mdm9615";

	memory {
		device_type = "memory";
		reg = <0x48000000 0x7F00000>;
	};
};

&msmgpio {
	pinctrl-0 = <&reset_out_pins>;
	pinctrl-names = "default";

	gsbi3_pins: gsbi3_pins {
		mux {
			pins = "gpio8", "gpio9", "gpio10", "gpio11";
			function = "gsbi3";
			drive-strength = <8>;
			bias-disable;
		};
	};

	gsbi4_pins: gsbi4_pins {
		mux {
			pins = "gpio12", "gpio13", "gpio14", "gpio15";
			function = "gsbi4";
			drive-strength = <8>;
			bias-disable;
		};
	};

	gsbi5_i2c_pins: gsbi5_i2c_pins {
		pin16 {
			pins = "gpio16";
			function = "gsbi5_i2c";
			drive-strength = <8>;
			bias-disable;
		};

		pin17 {
			pins = "gpio17";
			function = "gsbi5_i2c";
			drive-strength = <2>;
			bias-disable;
		};
	};

	gsbi5_uart_pins: gsbi5_uart_pins {
		mux {
			pins = "gpio18", "gpio19";
			function = "gsbi5_uart";
			drive-strength = <8>;
			bias-disable;
		};
	};

	reset_out_pins: reset_out_pins {
		pins {
			pins = "gpio66";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
			output-high;
		};
	};
};

&pmicgpio {
	usb_vbus_5v_pins: usb_vbus_5v_pins {
		pins = "gpio4";
		function = "normal";
		output-high;
		bias-disable;
		qcom,drive-strength = <1>;
		power-source = <2>;
	};
};

&gsbi3 {
	status = "okay";
	qcom,mode = <GSBI_PROT_SPI>;
};

&gsbi3_spi {
	status = "okay";
	pinctrl-0 = <&gsbi3_pins>;
	pinctrl-names = "default";
	assigned-clocks = <&gcc GSBI3_QUP_CLK>;
	assigned-clock-rates = <24000000>;
};

&gsbi4 {
	status = "okay";
	qcom,mode = <GSBI_PROT_UART_W_FC>;
};

&gsbi4_serial {
	status = "okay";
	pinctrl-0 = <&gsbi4_pins>;
	pinctrl-names = "default";
};

&gsbi5 {
	status = "okay";
	qcom,mode = <GSBI_PROT_I2C_UART>;
};

&gsbi5_i2c {
	status = "okay";
	clock-frequency = <200000>;
	pinctrl-0 = <&gsbi5_i2c_pins>;
	pinctrl-names = "default";
};

&gsbi5_serial {
	status = "okay";
	pinctrl-0 = <&gsbi5_uart_pins>;
	pinctrl-names = "default";
};

&sdcc1 {
	status = "okay";
};
