/*
 * Copyright 2014 Toradex AG
 *
 * 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
 *     version 2 as published by the Free Software Foundation.
 *
 *     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 "vf500.dtsi"
#include "vf-colibri.dtsi"

/ {
	model = "Toradex Colibri VF50 COM";
	compatible = "toradex,vf610-colibri_vf50", "fsl,vf500";

	memory@80000000 {
		device_type = "memory";
		reg = <0x80000000 0x8000000>;
	};

	touchscreen: vf50-touchscreen {
		compatible = "toradex,vf50-touchscreen";
		io-channels = <&adc1 0>,<&adc0 0>,
				<&adc0 1>,<&adc1 2>;
		xp-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
		xm-gpios = <&gpio2 29 GPIO_ACTIVE_HIGH>;
		yp-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
		ym-gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>;
		interrupt-parent = <&gpio0>;
		interrupts = <8 IRQ_TYPE_LEVEL_LOW>;
		pinctrl-names = "idle","default","gpios";
		pinctrl-0 = <&pinctrl_touchctrl_idle>;
		pinctrl-1 = <&pinctrl_touchctrl_default>;
		pinctrl-2 = <&pinctrl_touchctrl_gpios>;
		vf50-ts-min-pressure = <200>;
		status = "disabled";
	};
};

&nfc {
	assigned-clocks = <&clks VF610_CLK_NFC>;
	assigned-clock-rates = <33000000>;
};

&iomuxc {
	vf610-colibri {
		pinctrl_touchctrl_idle: touchctrl_idle {
			fsl,pins = <
				VF610_PAD_PTA18__GPIO_8		0x006d
				VF610_PAD_PTA19__GPIO_9		0x006c
				>;
		};

		pinctrl_touchctrl_default: touchctrl_default {
			fsl,pins = <
				VF610_PAD_PTA18__ADC0_SE0	0x0040
				VF610_PAD_PTA19__ADC0_SE1	0x0040
				VF610_PAD_PTA16__ADC1_SE0	0x0040
				VF610_PAD_PTB2__ADC1_SE2	0x0040
				>;
		};

		pinctrl_touchctrl_gpios: touchctrl_gpios {
			fsl,pins = <
				VF610_PAD_PTA23__GPIO_13	0x22e9
				VF610_PAD_PTB23__GPIO_93	0x22e9
				VF610_PAD_PTA22__GPIO_12	0x22e9
				VF610_PAD_PTA11__GPIO_4		0x22e9
				>;
		};
	};
};
