/dts-v1/;
/*
 * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#include "qcom-ipq807x-soc.dtsi"
#include "qcom-ipq807x-audio.dtsi"
#include "qcom-ipq807x-hk-cpu.dtsi"

/ {
	#address-cells = <0x2>;
	#size-cells = <0x2>;
	model = "CIG WF194C";
	compatible = "cig,wf194c", "qcom,ipq807x";
	qcom,msm-id = <0x143 0x0>, <0x158 0x0>, <0x186 0x0>, <0x188 0x0>;
	interrupt-parent = <&intc>;
	qcom,board-id = <0x8 0x0>;
	qcom,pmic-id = <0x0 0x0 0x0 0x0>;

	aliases {
		sdhc1 = &sdhc_1; /* SDC1 eMMC slot */
		sdhc2 = &sdhc_2; /* SDC2 SD slot */
		/*
		 * Aliases as required by u-boot
		 * to patch MAC addresses
		 */
		ethernet0 = "/soc/dp1";
		ethernet1 = "/soc/dp2";
	};

	chosen {
		bootargs = "console=ttyMSM0,115200,n8 root=/dev/ram0 rw init=/init";
		#ifdef __IPQ_MEM_PROFILE_256_MB__
			bootargs-append = " swiotlb=1";
		#else
			bootargs-append = " swiotlb=1 coherent_pool=2M";
		#endif
	};
};

&tlmm {
	pinctrl-0 = <&btcoex_pins>;
	pinctrl-names = "default";

	btcoex_pins: btcoex_pins {
		mux_0 {
			pins = "gpio34";
			function = "gpio";
			drive-strength = <6>;
			bias-pull-up;
			output-high;
		};
		mux_1 {
			pins = "gpio62";
			function = "gpio";
			drive-strength = <6>;
			bias-pull-up;
			output-high;
		};
	};

	mdio_pins: mdio_pinmux {
		mux_0 {
			pins = "gpio68";
			function = "mdc";
			drive-strength = <8>;
			bias-pull-up;
		};
		mux_1 {
			pins = "gpio69";
			function = "mdio";
			drive-strength = <8>;
			bias-pull-up;
		};
	};

	uart_pins: uart_pins {
		mux {
			pins = "gpio23", "gpio24";
			function = "blsp4_uart1";
			drive-strength = <8>;
			bias-disable;
		};
	};

	i2c_0_pins: i2c_0_pinmux {
		mux {
			pins = "gpio42", "gpio43";
			function = "blsp1_i2c";
			drive-strength = <8>;
			bias-disable;
		};
	};

	spi_0_pins: spi_0_pins {
		mux {
			pins = "gpio38", "gpio39", "gpio40", "gpio41";
			function = "blsp0_spi";
			drive-strength = <8>;
			bias-disable;
		};
	};

	qpic_pins: qpic_pins {
		data_0 {
			pins = "gpio15";
			function = "qpic_pad0";
			drive-strength = <8>;
			bias-disable;
		};
		data_1 {
			pins = "gpio12";
			function = "qpic_pad1";
			drive-strength = <8>;
			bias-disable;
		};
		data_2 {
			pins = "gpio13";
			function = "qpic_pad2";
			drive-strength = <8>;
			bias-disable;
		};
		data_3 {
			pins = "gpio14";
			function = "qpic_pad3";
			drive-strength = <8>;
			bias-disable;
		};
		data_4 {
			pins = "gpio5";
			function = "qpic_pad4";
			drive-strength = <8>;
			bias-disable;
		};
		data_5 {
			pins = "gpio6";
			function = "qpic_pad5";
			drive-strength = <8>;
			bias-disable;
		};
		data_6 {
			pins = "gpio7";
			function = "qpic_pad6";
			drive-strength = <8>;
			bias-disable;
		};
		data_7 {
			pins = "gpio8";
			function = "qpic_pad7";
			drive-strength = <8>;
			bias-disable;
		};
		data_8 {
			pins = "gpio16";
			function = "qpic_pad8";
			drive-strength = <8>;
			bias-disable;
		};
		qpic_pad {
			pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4",
			       "gpio9", "gpio10", "gpio11", "gpio17";
			function = "qpic_pad";
			drive-strength = <8>;
			bias-disable;
		};
	};

	sd_pins: sd_pins {
		mux {
			pins = "gpio63";
			function = "sd_card";
			drive-strength = <8>;
			bias-pull-up;
		};
	};

	hsuart_pins: hsuart_pins {
		mux {
			pins = "gpio48", "gpio49";
			function = "blsp2_uart";
			drive-strength = <8>;
			bias-disable;
		};
	};

	leds_pins: leds_pinmux {
		led1_r {
			pins = "gpio54";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-down;
		};
		led1_g {
			pins = "gpio55";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-down;
		};
		led2_r {
			pins = "gpio56";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-down;
		};
		led2_g {
			pins = "gpio64";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-down;
		};

	};

	button_pins: button_pins {
		wps_button {
			pins = "gpio67";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-up;
		};
	};

	uniphy_pins: uniphy_pinmux {
		mux_2 {
			pins = "gpio37";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-up;
		};
		mux_3 {
			pins = "gpio44";
			function = "gpio";
			drive-strength = <8>;
			bias-pull-up;
		};
	};

	pwm_pins: pwm_pinmux {
		mux_1 {
			pins = "gpio25";
			function = "pwm02";
			drive-strength = <8>;
		};
	};
};

&soc {
	pwm {
		pinctrl-0 = <&pwm_pins>;
		pinctrl-names = "default";
		used-pwm-indices = <1>, <0>, <0>, <0>;
		status = "disabled";
	};

	gpio_keys {
		compatible = "gpio-keys";
		pinctrl-0 = <&button_pins>;
		pinctrl-names = "default";

		button@1 {
			label = "reset";
			linux,code = <KEY_RESTART>;
			gpios = <&tlmm 67 GPIO_ACTIVE_LOW>;
			linux,input-type = <1>;
			debounce-interval = <60>;
		};
	};

	leds {
		compatible = "gpio-leds";
		pinctrl-0 = <&leds_pins>;
		pinctrl-names = "default";
		status = "ok";

		led@54 {
			label = "wf194c:red:lan";
			gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
			default-state = "off";
		};
		led@55 {
			label = "wf194c:green:lan";
			gpios = <&tlmm 55 GPIO_ACTIVE_HIGH>;
			default-state = "on";
		};
		led@56 {
			label = "wf194c:red:wan";
			gpios = <&tlmm 56 GPIO_ACTIVE_HIGH>;
			default-state = "off";
		};
		led@64 {
			label = "wf194c:green:wan";
			gpios = <&tlmm 64 GPIO_ACTIVE_HIGH>;
			default-state = "on";
		};
	};
	mdio@90000 {
		pinctrl-0 = <&mdio_pins>;
		pinctrl-names = "default";
		phy-reset-gpio = <&tlmm 37 0 &tlmm 44 0>;
		phy0: ethernet-phy@0 {
			reg = <0xf>;	/*<0>*/
		};
		phy1: ethernet-phy@1 {
			reg = <0xf>;
		};
		phy2: ethernet-phy@2 {
			reg = <0xf>;
		};
		phy3: ethernet-phy@3 {
			reg = <3>;
		};
		phy4: ethernet-phy@4 {
			reg = <4>;
		};
		phy5: ethernet-phy@5 {
			compatible ="ethernet-phy-ieee802.3-c45";
			reg = <0>;
		};
	};

	ess-switch@3a000000 {
		pinctrl-0 = <&uniphy_pins>;
		pinctrl-names = "default";
		switch_cpu_bmp = <0x1>;  /* cpu port bitmap */
		switch_lan_bmp = <0x30>; /*..0x3e lan port bitmap */
		switch_wan_bmp = <0x40>; /* wan port bitmap */
		switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/
		switch_mac_mode1 = <0xff>; /* mac mode for uniphy instance1*/
		switch_mac_mode2 = <0xd>; /* mac mode for uniphy instance2*/
		bm_tick_mode = <0>; /* bm tick mode */
		tm_tick_mode = <0>; /* tm tick mode */
		port_scheduler_resource {
			port@0 {
				port_id = <0>;
				ucast_queue = <0 143>;
				mcast_queue = <256 271>;
				l0sp = <0 35>;
				l0cdrr = <0 47>;
				l0edrr = <0 47>;
				l1cdrr = <0 7>;
				l1edrr = <0 7>;
			};
			port@1 {
				port_id = <1>;
				ucast_queue = <144 159>;
				mcast_queue = <272 275>;
				l0sp = <36 39>;
				l0cdrr = <48 63>;
				l0edrr = <48 63>;
				l1cdrr = <8 11>;
				l1edrr = <8 11>;
			};
			port@2 {
				port_id = <2>;
				ucast_queue = <160 175>;
				mcast_queue = <276 279>;
				l0sp = <40 43>;
				l0cdrr = <64 79>;
				l0edrr = <64 79>;
				l1cdrr = <12 15>;
				l1edrr = <12 15>;
			};
			port@3 {
				port_id = <3>;
				ucast_queue = <176 191>;
				mcast_queue = <280 283>;
				l0sp = <44 47>;
				l0cdrr = <80 95>;
				l0edrr = <80 95>;
				l1cdrr = <16 19>;
				l1edrr = <16 19>;
			};
			port@4 {
				port_id = <4>;
				ucast_queue = <192 207>;
				mcast_queue = <284 287>;
				l0sp = <48 51>;
				l0cdrr = <96 111>;
				l0edrr = <96 111>;
				l1cdrr = <20 23>;
				l1edrr = <20 23>;
			};
			port@5 {
				port_id = <5>;
				ucast_queue = <208 223>;
				mcast_queue = <288 291>;
				l0sp = <52 55>;
				l0cdrr = <112 127>;
				l0edrr = <112 127>;
				l1cdrr = <24 27>;
				l1edrr = <24 27>;
			};
			port@6 {
				port_id = <6>;
				ucast_queue = <224 239>;
				mcast_queue = <292 295>;
				l0sp = <56 59>;
				l0cdrr = <128 143>;
				l0edrr = <128 143>;
				l1cdrr = <28 31>;
				l1edrr = <28 31>;
			};
			port@7 {
				port_id = <7>;
				ucast_queue = <240 255>;
				mcast_queue = <296 299>;
				l0sp = <60 63>;
				l0cdrr = <144 159>;
				l0edrr = <144 159>;
				l1cdrr = <32 35>;
				l1edrr = <32 35>;
			};
		};
		port_scheduler_config {
			port@0 {
				port_id = <0>;
				l1scheduler {
					group@0 {
						sp = <0 1>; /*L0 SPs*/
						/*cpri cdrr epri edrr*/
						cfg = <0 0 0 0>;
					};
				};
				l0scheduler {
					group@0 {
						/*unicast queues*/
						ucast_queue = <0 4 8>;
						/*multicast queues*/
						mcast_queue = <256 260>;
						/*sp cpri cdrr epri edrr*/
						cfg = <0 0 0 0 0>;
					};
					group@1 {
						ucast_queue = <1 5 9>;
						mcast_queue = <257 261>;
						cfg = <0 1 1 1 1>;
					};
					group@2 {
						ucast_queue = <2 6 10>;
						mcast_queue = <258 262>;
						cfg = <0 2 2 2 2>;
					};
					group@3 {
						ucast_queue = <3 7 11>;
						mcast_queue = <259 263>;
						cfg = <0 3 3 3 3>;
					};
				};
			};
			port@1 {
				port_id = <1>;
				l1scheduler {
					group@0 {
						sp = <36>;
						cfg = <0 8 0 8>;
					};
					group@1 {
						sp = <37>;
						cfg = <1 9 1 9>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <144>;
						ucast_loop_pri = <16>;
						mcast_queue = <272>;
						mcast_loop_pri = <4>;
						cfg = <36 0 48 0 48>;
					};
				};
			};
			port@2 {
				port_id = <2>;
				l1scheduler {
					group@0 {
						sp = <40>;
						cfg = <0 12 0 12>;
					};
					group@1 {
						sp = <41>;
						cfg = <1 13 1 13>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <160>;
						ucast_loop_pri = <16>;
						mcast_queue = <276>;
						mcast_loop_pri = <4>;
						cfg = <40 0 64 0 64>;
					};
				};
			};
			port@3 {
				port_id = <3>;
				l1scheduler {
					group@0 {
						sp = <44>;
						cfg = <0 16 0 16>;
					};
					group@1 {
						sp = <45>;
						cfg = <1 17 1 17>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <176>;
						ucast_loop_pri = <16>;
						mcast_queue = <280>;
						mcast_loop_pri = <4>;
						cfg = <44 0 80 0 80>;
					};
				};
			};
			port@4 {
				port_id = <4>;
				l1scheduler {
					group@0 {
						sp = <48>;
						cfg = <0 20 0 20>;
					};
					group@1 {
						sp = <49>;
						cfg = <1 21 1 21>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <192>;
						ucast_loop_pri = <16>;
						mcast_queue = <284>;
						mcast_loop_pri = <4>;
						cfg = <48 0 96 0 96>;
					};
				};
			};
			port@5 {
				port_id = <5>;
				l1scheduler {
					group@0 {
						sp = <52>;
						cfg = <0 24 0 24>;
					};
					group@1 {
						sp = <53>;
						cfg = <1 25 1 25>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <208>;
						ucast_loop_pri = <16>;
						mcast_queue = <288>;
						mcast_loop_pri = <4>;
						cfg = <52 0 112 0 112>;
					};
				};
			};
			port@6 {
				port_id = <6>;
				l1scheduler {
					group@0 {
						sp = <56>;
						cfg = <0 28 0 28>;
					};
					group@1 {
						sp = <57>;
						cfg = <1 29 1 29>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <224>;
						ucast_loop_pri = <16>;
						mcast_queue = <292>;
						mcast_loop_pri = <4>;
						cfg = <56 0 128 0 128>;
					};
				};
			};
			port@7 {
				port_id = <7>;
				l1scheduler {
					group@0 {
						sp = <60>;
						cfg = <0 32 0 32>;
					};
					group@1 {
						sp = <61>;
						cfg = <1 33 1 33>;
					};
				};
				l0scheduler {
					group@0 {
						ucast_queue = <240>;
						ucast_loop_pri = <16>;
						mcast_queue = <296>;
						cfg = <60 0 144 0 144>;
					};
				};
			};
		};
	};
	dp1 {
		device_type = "network";
		compatible = "qcom,nss-dp";
		qcom,id = <4>;
		reg = <0x3a001600 0x200>;
		qcom,mactype = <0>;
		local-mac-address = [000000000000];
		qcom,link-poll = <1>;
		qcom,phy-mdio-addr = <3>;
		phy-mode = "sgmii";
	};
	dp2 {
		device_type = "network";
		compatible = "qcom,nss-dp";
		qcom,id = <6>;
		reg = <0x3a007000 0x3fff>;
		qcom,mactype = <1>;
		local-mac-address = [000000000000];
		qcom,link-poll = <1>;
		qcom,phy-mdio-addr = <0>;
		phy-mode = "sgmii";
	};
};

&serial_blsp4 {
	pinctrl-0 = <&uart_pins>;
	pinctrl-names = "default";
	status = "ok";
};

&spi_0 { /* BLSP1 QUP1 */
	pinctrl-0 = <&spi_0_pins>;
	pinctrl-names = "default";
	cs-select = <0>;
	status = "ok";

	m25p80@0 {
		#address-cells = <1>;
		#size-cells = <1>;
		reg = <0>;
		compatible = "n25q128a11";
		linux,modalias = "m25p80", "n25q128a11";
		spi-max-frequency = <50000000>;
		use-default-sizes;
	};
};

&serial_blsp2 {
	pinctrl-0 = <&hsuart_pins>;
	pinctrl-names = "default";
	status = "ok";
};

&msm_imem {
	status = "enabled";
};

&ssphy_0 {
	status = "ok";
};

&qusb_phy_0 {
	status = "ok";
};

&ssphy_1 {
	status = "ok";
};

&qusb_phy_1 {
	status = "ok";
};

&usb3_0 {
	status = "ok";
};

&usb3_1 {
	status = "ok";
};

&cryptobam {
	status = "ok";
};

&crypto {
	status = "ok";
};

&i2c_0 {
	pinctrl-0 = <&i2c_0_pins>;
	pinctrl-names = "default";
	status = "ok";
};

&i2c_1 {
	status = "disabled";
};

&sdhc_1 {
	qcom,clk-rates = <400000 25000000 50000000 100000000 \
			 192000000 384000000>;
	qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v";
	qcom,nonremovable;
	status = "ok";
};

&qpic_bam {
	status = "ok";
};

&nand {
	pinctrl-0 = <&qpic_pins>;
	pinctrl-names = "default";
	status = "ok";
};

&sdhc_2 {
	qcom,clk-rates = <400000 25000000 50000000 100000000 \
			 192000000>;
	qcom,bus-speed-mode = "HS200_1p8v", "DDR_1p8v";
	pinctrl-0 = <&sd_pins>;
	pinctrl-names = "default";
	cd-gpios = <&tlmm 63 1>;
	sd-ldo-gpios = <&tlmm 21 0>;
	vqmmc-supply = <&ldo11>;
	status = "ok";
};

&qpic_lcd {
	status = "ok";
};

&qpic_lcd_panel {
	status = "ok";
};
