/*
 * Device Tree Source for mangOH Green Board with 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 <dt-bindings/input/input.h>

#include "qcom-mdm9615-wp8548.dtsi"
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/gpio/gpio.h>

/ {
	model = "MangOH Green with WP8548 Module";
	compatible = "swir,mangoh-green-wp8548", "swir,wp8548", "qcom,mdm9615";

	aliases {
		spi0 = &gsbi3_spi;
		serial0 = &gsbi4_serial;
		serial1 = &gsbi5_serial;
		i2c0 = &gsbi5_i2c;
		mmc0 = &sdcc1;
	};

	chosen {
		stdout-path = "serial1:115200n8";
	};
};

&msmgpio {
	/* MangOH GPIO Mapping :
	 * - 2 : GPIOEXP_INT2
	 * - 7 : IOT1_GPIO2
	 * - 8 : IOT0_GPIO4
	 * - 13: IOT0_GPIO3
	 * - 21: IOT1_GPIO4
	 * - 22: IOT2_GPIO1
	 * - 23: IOT2_GPIO2
	 * - 24: IOT2_GPIO3
	 * - 25: IOT1_GPIO1
	 * - 32: IOT1_GPIO3
	 * - 33: IOT0_GPIO2
	 * - 42: IOT0_GPIO1 and SD Card Detect
	 */

	gpioext1_pins: gpioext1_pins {
		pins {
			pins = "gpio2";
			function = "gpio";
			input-enable;
			bias-disable;
		};
	};

	sdc_cd_pins: sdc_cd_pins {
		pins {
			pins = "gpio42";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};
};

&gsbi3_spi {
	spi@0 {
		compatible = "swir,mangoh-iotport-spi", "spidev";
		spi-max-frequency = <24000000>;
		reg = <0>;
	};
};

&gsbi5_i2c {
	mux@71 {
		compatible = "nxp,pca9548";
		#address-cells = <1>;
		#size-cells = <0>;
		reg = <0x71>;

		i2c_iot0: i2c@0 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <0>;
		};

		i2c_iot1: i2c@1 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <1>;
		};

		i2c_iot2: i2c@2 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <2>;
		};

		i2c@3 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <3>;

			usbhub: hub@8 {
				compatible = "smsc,usb3503a";
				reg = <0x8>;
				connect-gpios = <&gpioext2 1 GPIO_ACTIVE_HIGH>;
				intn-gpios = <&gpioext2 0 GPIO_ACTIVE_LOW>;
				initial-mode = <1>;
			};
		};

		i2c@4 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <4>;

			gpioext0: gpio@3e {
				/* GPIO Expander 0 Mapping :
				 * - 0: ARDUINO_RESET_Level shift
				 * - 1: BattChrgr_PG_N
				 * - 2: BattGauge_GPIO
				 * - 3: LED_ON (out active high)
				 * - 4: ATmega_reset_GPIO
				 * - 5: X
				 * - 6: PCM_ANALOG_SELECT (out active high)
				 * - 7: X
				 * - 8: Board_rev_res1 (in)
				 * - 9: Board_rev_res2 (in)
				 * - 10: UART_EXP1_ENn (out active low / pull-down)
				 * - 11: UART_EXP1_IN (out pull-down)
				 * - 12: UART_EXP2_IN (out pull-down)
				 * - 13: SDIO_SEL (out pull-down)
				 * - 14: SPI_EXP1_ENn (out active low / pull-down)
				 * - 15: SPI_EXP1_IN (out pull-down)
				 */
				#gpio-cells = <2>;
				#interrupt-cells = <2>;
				compatible = "semtech,sx1509q";
				reg = <0x3e>;
				interrupt-parent = <&gpioext1>;
				interrupts = <0 IRQ_TYPE_EDGE_FALLING>;

				probe-reset;

				gpio-controller;
				interrupt-controller;
			};
		};

		i2c@5 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <5>;

			gpioext1: gpio@3f {
				/* GPIO Expander 1 Mapping :
				 * - 0: GPIOEXP_INT1
				 * - 1: Battery detect
				 * - 2: GPIO_SCF3_RESET
				 * - 3: LED_CARD_DETECT_IOT0 (in)
				 * - 4: LED_CARD_DETECT_IOT1 (in)
				 * - 5: LED_CARD_DETECT_IOT2 (in)
				 * - 6: UIM2_PWM_SELECT
				 * - 7: UIM2_M2_S_SELECT
				 * - 8: TP900
				 * - 9: SENSOR_INT1 (in)
				 * - 10: SENSOR_INT2 (in)
				 * - 11: CARD_DETECT_IOT0 (in pull-up)
				 * - 12: CARD_DETECT_IOT2 (in pull-up)
				 * - 13: CARD_DETECT_IOT1 (in pull-up)
				 * - 14: GPIOEXP_INT3 (in active low / pull-up)
				 * - 15: BattChrgr_INT_N
				 */
				pinctrl-0 = <&gpioext1_pins>;
				pinctrl-names = "default";

				#gpio-cells = <2>;
				#interrupt-cells = <2>;
				compatible = "semtech,sx1509q";
				reg = <0x3f>;
				interrupt-parent = <&msmgpio>;
				interrupts = <0 IRQ_TYPE_EDGE_FALLING>;

				probe-reset;

				gpio-controller;
				interrupt-controller;
			};
		};

		i2c@6 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <6>;

			gpioext2: gpio@70 {
				/* GPIO Expander 2 Mapping :
				 * - 0: USB_HUB_INTn
				 * - 1: HUB_CONNECT
				 * - 2: GPIO_IOT2_RESET (out active low / pull-up)
				 * - 3: GPIO_IOT1_RESET (out active low / pull-up)
				 * - 4: GPIO_IOT0_RESET (out active low / pull-up)
				 * - 5: TP901
				 * - 6: TP902
				 * - 7: TP903
				 * - 8: UART_EXP2_ENn (out active low / pull-down)
				 * - 9: PCM_EXP1_ENn (out active low)
				 * - 10: PCM_EXP1_SEL (out)
				 * - 11: ARD_FTDI
				 * - 12: TP904
				 * - 13: TP905
				 * - 14: TP906
				 * - 15: RS232_Enable (out active high / pull-up)
				 */
				#gpio-cells = <2>;
				#interrupt-cells = <2>;
				compatible = "semtech,sx1509q";
				reg = <0x70>;
				interrupt-parent = <&gpioext1>;
				interrupts = <14 IRQ_TYPE_EDGE_FALLING>;

				probe-reset;

				gpio-controller;
				interrupt-controller;
			};
		};

		i2c@7 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <7>;
		};
	};
};

&sdcc1 {
	pinctrl-0 = <&sdc_cd_pins>;
	pinctrl-names = "default";
	disable-wp;
	cd-gpios = <&msmgpio 42 GPIO_ACTIVE_LOW>; /* Active low CD */
};
