/*
 * Copyright (C) 2013-2016 Marek Vasut <marek.vasut@gmail.com>
 *
 * 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 "imx23.dtsi"

/ {
	model = "SanDisk Sansa Fuze+";
	compatible = "sandisk,sansa_fuze_plus", "fsl,imx23";

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

	apb@80000000 {
		apbh@80000000 {
			ssp0: ssp@80010000 {
				compatible = "fsl,imx23-mmc";
				pinctrl-names = "default";
				pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_pins_fixup>;
				bus-width = <4>;
				vmmc-supply = <&reg_vddio_sd0>;
				cd-inverted;
				status = "okay";
			};

			ssp1: ssp@80034000 {
				compatible = "fsl,imx23-mmc";
				pinctrl-names = "default";
				pinctrl-0 = <&mmc1_8bit_pins_a>;
				bus-width = <8>;
				vmmc-supply = <&reg_vddio_sd1>;
				non-removable;
				status = "okay";
			};

			pinctrl@80018000 {
				pinctrl-names = "default";
				pinctrl-0 = <&hog_pins_a>;

				hog_pins_a: hog@0 {
					reg = <0>;
					fsl,pinmux-ids = <
						MX23_PAD_GPMI_D08__GPIO_0_8
						MX23_PAD_PWM3__GPIO_1_29
						MX23_PAD_AUART1_RTS__GPIO_0_27
						MX23_PAD_AUART1_CTS__GPIO_0_26
						MX23_PAD_I2C_SCL__I2C_SCL
						MX23_PAD_I2C_SDA__I2C_SDA
						MX23_PAD_LCD_DOTCK__GPIO_1_22
						MX23_PAD_LCD_HSYNC__GPIO_1_24
						MX23_PAD_PWM3__GPIO_1_29
					>;
					fsl,drive-strength = <0>;
					fsl,voltage = <1>;
					fsl,pull-up = <0>;
				};
			};
		};

		apbx@80040000 {
			pwm: pwm@80064000 {
				pinctrl-names = "default";
				pinctrl-0 = <&pwm2_pins_a>;
				status = "okay";
			};

			duart: serial@80070000 {
				pinctrl-names = "default";
				pinctrl-0 = <&duart_pins_a>;
				status = "okay";
			};

			usbphy0: usbphy@8007c000 {
				status = "okay";
			};

			lradc@80050000 {
				status = "okay";
			};
		};
	};

	ahb@80080000 {
		usb0: usb@80080000 {
			dr_mode = "peripheral";
			status = "okay";
		};
	};

	reg_vddio_sd0: regulator-vddio-sd0 {
		compatible = "regulator-fixed";
		regulator-name = "vddio-sd0";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		gpio = <&gpio0 8 0>;
	};

	reg_vddio_sd1: regulator-vddio-sd1 {
		compatible = "regulator-fixed";
		regulator-name = "vddio-sd1";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		gpio = <&gpio1 29 0>;
	};

	reg_vdd_touchpad: regulator-vdd-touchpad0 {
		compatible = "regulator-fixed";
		regulator-name = "vdd-touchpad0";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		gpio = <&gpio0 26 0>;
		regulator-always-on;
		enable-active-low;
	};

	reg_vdd_tuner: regulator-vdd-tuner0 {
		compatible = "regulator-fixed";
		regulator-name = "vdd-tuner0";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		gpio = <&gpio0 29 0>;
		regulator-always-on;
		enable-active-low;
	};

	backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm 2 5000000>;
		brightness-levels = <0 4 8 16 32 64 128 255>;
		default-brightness-level = <6>;
	};

	i2c-0 {
		#address-cells = <1>;
		#size-cells = <0>;
		compatible = "i2c-gpio";
		gpios = <
			&gpio1 24 0		/* SDA */
			&gpio1 22 0		/* SCL */
		>;
		i2c-gpio,delay-us = <2>;	/* ~100 kHz */
	};

	i2c-1 {
		#address-cells = <1>;
		#size-cells = <0>;
		compatible = "i2c-gpio";
		gpios = <
			&gpio0 31 0		/* SDA */
			&gpio0 30 0		/* SCL */
		>;
		i2c-gpio,delay-us = <2>;	/* ~100 kHz */

		touch: touch@20 {
			compatible = "synaptics,synaptics_i2c";
			reg = <0x20>;
		};

		eeprom: eeprom@50 {
			compatible = "atmel,24c64";
			reg = <0x50>;
			pagesize = <32>;
		};
	};

};
