/*
 * Copyright (c) 2015, 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 "msm8916.dtsi"
#include "pm8916.dtsi"
#include "apq8016-sbc-soc-pins.dtsi"
#include "apq8016-sbc-pmic-pins.dtsi"

/ {
	aliases {
		serial0 = &blsp1_uart2;
		serial1 = &blsp1_uart1;
		usid0 = &pm8916_0;
		i2c0	= &blsp_i2c2;
		i2c1	= &blsp_i2c6;
		i2c3	= &blsp_i2c4;
		spi0	= &blsp_spi5;
		spi1	= &blsp_spi3;
	};

	chosen {
		stdout-path = "serial0";
	};

	soc {
		dma@7884000 {
			status = "okay";
		};

		serial@78af000 {
			label = "LS-UART0";
			status = "okay";
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&blsp1_uart1_default>;
			pinctrl-1 = <&blsp1_uart1_sleep>;
		};

		serial@78b0000 {
			label = "LS-UART1";
			status = "okay";
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&blsp1_uart2_default>;
			pinctrl-1 = <&blsp1_uart2_sleep>;
		};

		i2c@78b6000 {
		/* On Low speed expansion */
			label = "LS-I2C0";
			status = "okay";
		};

		i2c@78b8000 {
		/* On High speed expansion */
			label = "HS-I2C2";
			status = "okay";

			adv_bridge: bridge@39 {
				status = "okay";

				compatible = "adi,adv7533";
				reg = <0x39>;

				interrupt-parent = <&msmgpio>;
				interrupts = <31 2>;

				adi,dsi-lanes = <4>;

				pd-gpios = <&msmgpio 32 0>;

				avdd-supply = <&pm8916_l6>;
				v1p2-supply = <&pm8916_l6>;
				v3p3-supply = <&pm8916_l17>;

				pinctrl-names = "default","sleep";
				pinctrl-0 = <&adv7533_int_active &adv7533_switch_active>;
				pinctrl-1 = <&adv7533_int_suspend &adv7533_switch_suspend>;

				ports {
					#address-cells = <1>;
					#size-cells = <0>;

					port@0 {
						reg = <0>;
						adv7533_in: endpoint {
							remote-endpoint = <&dsi0_out>;
						};
					};

					port@1 {
						reg = <1>;
						adv7533_out: endpoint {
							remote-endpoint = <&hdmi_con>;
						};
					};
				};
			};
		};

		i2c@78ba000 {
		/* On Low speed expansion */
			label = "LS-I2C1";
			status = "okay";
		};

		spi@78b7000 {
		/* On High speed expansion */
			label = "HS-SPI1";
			status = "okay";
		};

		spi@78b9000 {
		/* On Low speed expansion */
			label = "LS-SPI0";
			status = "okay";
		};

		leds {
			pinctrl-names = "default";
			pinctrl-0 = <&msmgpio_leds>,
				    <&pm8916_gpios_leds>,
				    <&pm8916_mpps_leds>;

			compatible = "gpio-leds";

			led@1 {
				label = "apq8016-sbc:green:user1";
				gpios = <&msmgpio 21 GPIO_ACTIVE_HIGH>;
				linux,default-trigger = "heartbeat";
				default-state = "off";
			};

			led@2 {
				label = "apq8016-sbc:green:user2";
				gpios = <&msmgpio 120 GPIO_ACTIVE_HIGH>;
				linux,default-trigger = "mmc0";
				default-state = "off";
			};

			led@3 {
				label = "apq8016-sbc:green:user3";
				gpios = <&pm8916_gpios 1 GPIO_ACTIVE_HIGH>;
				linux,default-trigger = "mmc1";
				default-state = "off";
			};

			led@4 {
				label = "apq8016-sbc:green:user4";
				gpios = <&pm8916_gpios 2 GPIO_ACTIVE_HIGH>;
				linux,default-trigger = "none";
				default-state = "off";
			};

			led@5 {
				label = "apq8016-sbc:yellow:wlan";
				gpios = <&pm8916_mpps 2 GPIO_ACTIVE_HIGH>;
				linux,default-trigger = "wlan";
				default-state = "off";
			};

			led@6 {
				label = "apq8016-sbc:blue:bt";
				gpios = <&pm8916_mpps 3 GPIO_ACTIVE_HIGH>;
				linux,default-trigger = "bt";
				default-state = "off";
			};
		};

		sdhci@07824000 {
			vmmc-supply = <&pm8916_l8>;
			vqmmc-supply = <&pm8916_l5>;

			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on>;
			pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off>;
			status = "okay";
		};

		sdhci@07864000 {
			vmmc-supply = <&pm8916_l11>;
			vqmmc-supply = <&pm8916_l12>;

			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>;
			pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>;

			cd-gpios = <&msmgpio 38 0x1>;
			status = "okay";
		};

		usb@78d9000 {
			extcon = <&usb_id>, <&usb_id>;
			status = "okay";
		};

		ehci@78d9000 {
			status = "okay";
		};

		phy@78d9000 {
			v1p8-supply = <&pm8916_l7>;
			v3p3-supply = <&pm8916_l13>;
			vddcx-supply = <&pm8916_s1>;
			extcon = <&usb_id>, <&usb_id>;
			dr_mode = "otg";
			status = "okay";
			switch-gpio = <&pm8916_gpios 4 GPIO_ACTIVE_HIGH>;
			pinctrl-names = "default";
			pinctrl-0 = <&usb_sw_sel_pm>;
		};

		lpass@07708000 {
			status = "okay";
		};

		mdss@1a00000 {
			status = "okay";

			mdp@1a01000 {
				status = "okay";
			};

			dsi@1a98000 {
				status = "okay";

				vdda-supply = <&pm8916_l2>;
				vddio-supply = <&pm8916_l6>;

				ports {
					port@1 {
						endpoint {
							remote-endpoint = <&adv7533_in>;
							data-lanes = <0 1 2 3>;
						};
					};
				};
			};

			dsi-phy@1a98300 {
				status = "okay";

				vddio-supply = <&pm8916_l6>;
			};
		};
	};

	usb2513 {
		compatible = "smsc,usb3503";
		reset-gpios = <&pm8916_gpios 3 GPIO_ACTIVE_LOW>;
		initial-mode = <1>;
	};

	usb_id: usb-id {
		compatible = "linux,extcon-usb-gpio";
		id-gpio = <&msmgpio 121 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&usb_id_default>;
	};

	hdmi-out {
		compatible = "hdmi-connector";
		type = "a";

		port {
			hdmi_con: endpoint {
				remote-endpoint = <&adv7533_out>;
			};
		};
	};
};

&smd_rpm_regulators {
	vdd_l1_l2_l3-supply = <&pm8916_s3>;
	vdd_l5-supply = <&pm8916_s3>;
	vdd_l4_l5_l6-supply = <&pm8916_s4>;
	vdd_l7-supply = <&pm8916_s4>;

	s1 {
		regulator-min-microvolt = <375000>;
		regulator-max-microvolt = <1562000>;
	};

	s3 {
		regulator-min-microvolt = <375000>;
		regulator-max-microvolt = <1562000>;
	};

	s4 {
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <1800000>;

		regulator-always-on;
		regulator-boot-on;
	};

	l1 {
		regulator-min-microvolt = <375000>;
		regulator-max-microvolt = <1525000>;
	};

	l2 {
		regulator-min-microvolt = <375000>;
		regulator-max-microvolt = <1525000>;
	};

	l3 {
		regulator-min-microvolt = <375000>;
		regulator-max-microvolt = <1525000>;
	};

	l4 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l5 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l6 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l7 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l8 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l9 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l10 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l11 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l12 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l13 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l14 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	/**
	 * 1.8v required on LS expansion
	 * for mezzanine boards
	 */
	l15 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
		regulator-always-on;
	};

	l16 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l17 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};

	l18 {
		regulator-min-microvolt = <1750000>;
		regulator-max-microvolt = <3337000>;
	};
};
