/*
 * Common device tree include for all Exynos 5250 boards based off of Daisy.
 *
 * Copyright (c) 2012 Google, Inc
 *
 * This program 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.
*/

/ {
	aliases {
	};

	memory {
		reg = <0x40000000 0x80000000>;
	};

	chosen {
	};

	i2c@12C60000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <378000>;
		gpios = <&gpb3 0 2 3 0>,
			<&gpb3 1 2 3 0>;
	};

	i2c@12C70000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <378000>;
		gpios = <&gpb3 2 2 3 0>,
			<&gpb3 3 2 3 0>;
	};

	i2c@12C80000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <66000>;

		/*
		 * Disabled pullups since external part has its own pullups and
		 * double-pulling gets us out of spec in some cases.
		 */
		gpios = <&gpa0 6 3 0 0>,
			<&gpa0 7 3 0 0>;

		hdmiddc@50 {
			compatible = "samsung,exynos5-hdmiddc";
			reg = <0x50>;
		};
	};

	i2c@12C90000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <66000>;
		gpios = <&gpa1 2 3 3 0>,
			<&gpa1 3 3 3 0>;
	};

	i2c@12CA0000 {
		status = "disabled";
	};

	i2c@12CB0000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <66000>;
		gpios = <&gpa2 2 3 3 0>,
			<&gpa2 3 3 3 0>;
	};

	i2c@12CC0000 {
		status = "disabled";
	};

	i2c@12CD0000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <66000>;
		gpios = <&gpb2 2 3 3 0>,
			<&gpb2 3 3 3 0>;
	};

	i2c@12CE0000 {
		samsung,i2c-sda-delay = <100>;
		samsung,i2c-max-bus-freq = <378000>;

		hdmiphy@38 {
			compatible = "samsung,exynos5-hdmiphy";
			reg = <0x38>;
		};
	};

	dwmmc0@12200000 {
		num-slots = <1>;
		supports-highspeed;
		broken-cd;
		fifo-depth = <0x80>;
		card-detect-delay = <200>;
		samsung,dw-mshc-ciu-div = <3>;
		samsung,dw-mshc-sdr-timing = <2 3>;
		samsung,dw-mshc-ddr-timing = <1 2>;

		slot@0 {
			reg = <0>;
			bus-width = <8>;
			gpios = <&gpc0 0 2 0 3>, <&gpc0 1 2 0 3>,
				<&gpc1 0 2 3 3>, <&gpc1 1 2 3 3>,
				<&gpc1 2 2 3 3>, <&gpc1 3 2 3 3>,
				<&gpc0 3 2 3 3>, <&gpc0 4 2 3 3>,
				<&gpc0 5 2 3 3>, <&gpc0 6 2 3 3>;
		};
	};

	dwmmc1@12210000 {
		status = "disabled";
	};

	dwmmc2@12220000 {
		num-slots = <1>;
		supports-highspeed;
		fifo-depth = <0x80>;
		card-detect-delay = <200>;
		samsung,dw-mshc-ciu-div = <3>;
		samsung,dw-mshc-sdr-timing = <2 3>;
		samsung,dw-mshc-ddr-timing = <1 2>;

		slot@0 {
			reg = <0>;
			bus-width = <4>;
			samsung,cd-pinmux-gpio = <&gpc3 2 2 3 3>;
			wp-gpios = <&gpc2 1 0 0 3>;
			gpios = <&gpc3 0 2 0 3>, <&gpc3 1 2 0 3>,
				<&gpc3 3 2 3 3>, <&gpc3 4 2 3 3>,
				<&gpc3 5 2 3 3>, <&gpc3 6 2 3 3>;
		};
	};

	dwmmc3@12230000 {
		num-slots = <1>;
		supports-highspeed;
		broken-cd;
		fifo-depth = <0x80>;
		card-detect-delay = <200>;
		samsung,dw-mshc-ciu-div = <3>;
		samsung,dw-mshc-sdr-timing = <2 3>;
		samsung,dw-mshc-ddr-timing = <1 2>;

		slot@0 {
			reg = <0>;
			bus-width = <4>;
			/* See board-specific dts files for GPIOs */
		};
	};

	spi_0: spi@12d20000 {
		status = "disabled";
	};

	spi_1: spi@12d30000 {
		gpios = <&gpa2 4 2 3 0>,
			<&gpa2 6 2 3 0>,
			<&gpa2 7 2 3 0>;
		samsung,spi-src-clk = <0>;
		num-cs = <1>;
	};

	spi_2: spi@12d40000 {
		status = "disabled";
	};

	hdmi {
		hpd-gpio = <&gpx3 7 0xf 1 3>;
	};

	gpio-keys {
		compatible = "gpio-keys";

		power {
			label = "Power";
			gpios = <&gpx1 3 0 0x10000 0>;
			linux,code = <116>; /* KEY_POWER */
			gpio-key,wakeup;
		};
	};
};
