/*
 * 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 {
		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
				>;
		};
	};
};
