/*
 * Device tree file for Phytec PCM-947 carrier board
 * Copyright (C) 2017 PHYTEC Messtechnik GmbH
 * Author: Wadim Egorov <w.egorov@phytec.de>
 *
 * 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.
 */

/dts-v1/;

#include <dt-bindings/input/input.h>
#include "rk3288-phycore-som.dtsi"

/ {
	model = "Phytec RK3288 PCM-947";
	compatible = "phytec,rk3288-pcm-947", "phytec,rk3288-phycore-som", "rockchip,rk3288";

	chosen {
		stdout-path = &uart2;
	};

	user_buttons: user-buttons {
		compatible = "gpio-keys";
		pinctrl-names = "default";
		pinctrl-0 = <&user_button_pins>;

		button@0 {
			label = "home";
			linux,code = <KEY_HOME>;
			gpios = <&gpio8 0 GPIO_ACTIVE_HIGH>;
			wakeup-source;
		};

		button@1 {
			label = "menu";
			linux,code = <KEY_MENU>;
			gpios = <&gpio8 3 GPIO_ACTIVE_HIGH>;
			wakeup-source;
		};
	};

	vcc_host0_5v: usb-host0-regulator {
		compatible = "regulator-fixed";
		gpio = <&gpio2 13 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&host0_vbus_drv>;
		regulator-name = "vcc_host0_5v";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-always-on;
		vin-supply = <&vdd_in_otg_out>;
	};

	vcc_host1_5v: usb-host1-regulator {
		compatible = "regulator-fixed";
		gpio = <&gpio2 0 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&host1_vbus_drv>;
		regulator-name = "vcc_host1_5v";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-always-on;
		vin-supply = <&vdd_in_otg_out>;
	};

	vcc_otg_5v: usb-otg-regulator {
		compatible = "regulator-fixed";
		gpio = <&gpio2 12 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&otg_vbus_drv>;
		regulator-name = "vcc_otg_5v";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-always-on;
		vin-supply = <&vdd_in_otg_out>;
	};
};

&dmc {
	rockchip,num-channels = <2>;
	rockchip,pctl-timing = <0x29a 0xc8 0x1f8 0x42 0x4e 0x4 0xea 0xa
		0x5 0x0 0xa 0x7 0x19 0x24 0xa 0x7
		0x5 0xa 0x5 0x200 0x5 0x10 0x40 0x0
		0x1 0x7 0x7 0x4 0xc 0x43 0x100 0x0
		0x5 0x0>;
	rockchip,phy-timing = <0x48f9aab4 0xea0910 0x1002c200
		0xa60 0x40 0x10 0x0>;
	rockchip,sdram-channel = /bits/ 8 <0x1 0xa 0x3 0x2 0x1 0x0 0xe 0xe>;
	rockchip,sdram-params = <0x30B25564 0x627 3 666000000 3 5 1>;
};

&gmac {
	status = "okay";
};

&hdmi {
	status = "okay";
};

&i2c1 {
	status = "okay";

	touchscreen@44 {
		compatible = "st,stmpe811";
		reg = <0x44>;
	};

	adc@64 {
		compatible = "maxim,max1037";
		reg = <0x64>;
	};

	i2c_rtc: rtc@68 {
		compatible = "rv4162";
		reg = <0x68>;
		pinctrl-names = "default";
		pinctrl-0 = <&i2c_rtc_int>;
		interrupt-parent = <&gpio5>;
		interrupts = <10 0>;
	};
};

&i2c3 {
	status = "okay";

	i2c_eeprom_cb: eeprom@51 {
		compatible = "atmel,24c32";
		reg = <0x51>;
		pagesize = <32>;
	};
};

&i2c4 {
	status = "okay";
};

&i2c5 {
	status = "okay";
};

&pinctrl {
	u-boot,dm-pre-reloc;

	pcfg_pull_up_drv_12ma: pcfg-pull-up-drv-12ma {
		bias-pull-up;
		drive-strength = <12>;
	};

	buttons {
		user_button_pins: user-button-pins {
			/* button 1 */
			rockchip,pins = <8 3 RK_FUNC_GPIO &pcfg_pull_up>,
			/* button 2 */
					<8 0 RK_FUNC_GPIO &pcfg_pull_up>;
		};
	};

	rv4162 {
		i2c_rtc_int: i2c-rtc-int {
			rockchip,pins = <5 10 RK_FUNC_GPIO &pcfg_pull_up>;
		};
	};

	sdmmc {
		/*
		 * Default drive strength isn't enough to achieve even
		 * high-speed mode on pcm-947 board so bump up to 12 mA.
		 */
		sdmmc_bus4: sdmmc-bus4 {
			rockchip,pins = <6 16 RK_FUNC_1 &pcfg_pull_up_drv_12ma>,
					<6 17 RK_FUNC_1 &pcfg_pull_up_drv_12ma>,
					<6 18 RK_FUNC_1 &pcfg_pull_up_drv_12ma>,
					<6 19 RK_FUNC_1 &pcfg_pull_up_drv_12ma>;
		};

		sdmmc_clk: sdmmc-clk {
			rockchip,pins = <6 20 RK_FUNC_1 &pcfg_pull_none_12ma>;
		};

		sdmmc_cmd: sdmmc-cmd {
			rockchip,pins = <6 21 RK_FUNC_1 &pcfg_pull_up_drv_12ma>;
		};

		sdmmc_pwr: sdmmc-pwr {
			rockchip,pins = <7 11 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};

	touchscreen {
		ts_irq_pin: ts-irq-pin {
			rockchip,pins = <5 15 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};

	usb_host {
		host0_vbus_drv: host0-vbus-drv {
			rockchip,pins = <2 13 RK_FUNC_GPIO &pcfg_pull_none>;
		};

		host1_vbus_drv: host1-vbus-drv {
			rockchip,pins = <2 0 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};

	usb_otg {
		otg_vbus_drv: otg-vbus-drv {
			rockchip,pins = <2 12 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
};

&sdmmc {
	u-boot,dm-pre-reloc;

	bus-width = <4>;
	cap-mmc-highspeed;
	cap-sd-highspeed;
	card-detect-delay = <200>;
	disable-wp;
	num-slots = <1>;
	pinctrl-names = "default";
	pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
	vmmc-supply = <&vdd_io_sd>;
	vqmmc-supply = <&vdd_io_sd>;
	status = "okay";
};

&uart0 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
	status = "okay";
};

&uart2 {
	u-boot,dm-pre-reloc;
	status = "okay";
};

&usbphy {
	status = "okay";
};

&usb_host0_ehci {
	status = "okay";
};

&usb_host1 {
	status = "okay";
};

&usb_otg {
	status = "okay";
};
