/*
 * Copyright 2015 Hans de Goede <hdegoede@redhat.com>
 *
 * Hans de Goede <hdegoede@redhat.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 "sun7i-a20.dtsi"
#include "sunxi-common-regulators.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pinctrl/sun4i-a10.h>

/ {
	model = "Orange Pi Mini";
	compatible = "xunlong,orangepi-mini", "allwinner,sun7i-a20";

	aliases {
		serial0 = &uart0;
	};

	chosen {
		stdout-path = "serial0:115200n8";
	};

	leds {
		compatible = "gpio-leds";
		pinctrl-names = "default";
		pinctrl-0 = <&led_pins_orangepi>;

		green {
			label = "orangepi:green:usr";
			gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>; /* PH24 */
		};

		blue {
			label = "orangepi:blue:usr";
			gpios = <&pio 7 25 GPIO_ACTIVE_HIGH>; /* PH25 */
		};
	};

	reg_gmac_3v3: gmac-3v3 {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&gmac_power_pin_orangepi>;
		regulator-name = "gmac-3v3";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		startup-delay-us = <100000>;
		enable-active-high;
		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
	};
};

&ahci {
	status = "okay";
};

&codec {
	status = "okay";
};

&ehci0 {
	status = "okay";
};

&ehci1 {
	status = "okay";
};

&gmac {
	pinctrl-names = "default";
	pinctrl-0 = <&gmac_pins_rgmii_a>;
	phy = <&phy1>;
	phy-mode = "rgmii";
	phy-supply = <&reg_gmac_3v3>;
	status = "okay";

	phy1: ethernet-phy@1 {
		reg = <1>;
	};
};

&i2c0 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c0_pins_a>;
	status = "okay";

	axp209: pmic@34 {
		reg = <0x34>;
		interrupt-parent = <&nmi_intc>;
		interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
	};
};

#include "axp209.dtsi"

&ir0 {
	pinctrl-names = "default";
	pinctrl-0 = <&ir0_rx_pins_a>;
	status = "okay";
};

&mmc0 {
	pinctrl-names = "default";
	pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_orangepi>;
	vmmc-supply = <&reg_vcc3v3>;
	bus-width = <4>;
	cd-gpios = <&pio 7 10 GPIO_ACTIVE_HIGH>; /* PH10 */
	cd-inverted;
	status = "okay";
};

&mmc3 {
	pinctrl-names = "default";
	pinctrl-0 = <&mmc3_pins_a>, <&mmc3_cd_pin_orangepi>;
	vmmc-supply = <&reg_vcc3v3>;
	bus-width = <4>;
	cd-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
	cd-inverted;
	status = "okay";
};

&otg_sram {
	status = "okay";
};

&pio {
	usb0_id_detect_pin: usb0_id_detect_pin@0 {
		pins = "PH4";
		function = "gpio_in";
		bias-pull-up;
	};

	mmc0_cd_pin_orangepi: mmc0_cd_pin@0 {
		pins = "PH10";
		function = "gpio_in";
		bias-pull-up;
	};

	mmc3_cd_pin_orangepi: mmc3_cd_pin@0 {
		pins = "PH11";
		function = "gpio_in";
		bias-pull-up;
	};

	usb2_vbus_pin_bananapro: usb2_vbus_pin@0 {
		pins = "PH22";
		function = "gpio_out";
	};

	gmac_power_pin_orangepi: gmac_power_pin@0 {
		pins = "PH23";
		function = "gpio_out";
	};

	led_pins_orangepi: led_pins@0 {
		pins = "PH24", "PH25";
		function = "gpio_out";
	};

	usb1_vbus_pin_bananapro: usb1_vbus_pin@0 {
		pins = "PH26";
		function = "gpio_out";
	};
};

&reg_dcdc2 {
	regulator-always-on;
	regulator-min-microvolt = <1000000>;
	regulator-max-microvolt = <1500000>;
	regulator-name = "vdd-cpu";
};

&reg_dcdc3 {
	regulator-always-on;
	regulator-min-microvolt = <1000000>;
	regulator-max-microvolt = <1400000>;
	regulator-name = "vdd-int-pll";
};

&reg_ldo1 {
	regulator-name = "vdd-rtc";
};

&reg_ldo2 {
	regulator-always-on;
	regulator-min-microvolt = <3000000>;
	regulator-max-microvolt = <3000000>;
	regulator-name = "avcc";
};

&reg_usb0_vbus {
	status = "okay";
};

&reg_usb1_vbus {
	pinctrl-0 = <&usb1_vbus_pin_bananapro>;
	gpio = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
	status = "okay";
};

&reg_usb2_vbus {
	pinctrl-0 = <&usb2_vbus_pin_bananapro>;
	gpio = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
	status = "okay";
};

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

&usb_otg {
	dr_mode = "otg";
	status = "okay";
};

&usb_power_supply {
	status = "okay";
};

&usbphy {
	pinctrl-names = "default";
	pinctrl-0 = <&usb0_id_detect_pin>;
	usb0_id_det-gpio = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
	usb0_vbus_power-supply = <&usb_power_supply>;
	usb0_vbus-supply = <&reg_usb0_vbus>;
	usb1_vbus-supply = <&reg_usb1_vbus>;
	usb2_vbus-supply = <&reg_usb2_vbus>;
	status = "okay";
};
