// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
// Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.xyz>
// Copyright (C) 2018 Vasily Khoruzhick <anarsoul@gmail.com>

/dts-v1/;

#include "sun50i-a64.dtsi"
#include "sun50i-a64-cpu-opp.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/gpio-keys.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/pwm/pwm.h>

/ {
	model = "Pine64 Pinebook";
	compatible = "pine64,pinebook", "allwinner,sun50i-a64";
	chassis-type = "laptop";

	aliases {
		serial0 = &uart0;
		ethernet0 = &rtl8723cs;
	};

	backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm 0 50000 0>;
		brightness-levels = <0 5 10 15 20 30 40 55 70 85 100>;
		default-brightness-level = <2>;
		enable-gpios = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD23 */
		power-supply = <&reg_vbklt>;
	};

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

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

		lid-switch {
			label = "Lid Switch";
			gpios = <&r_pio 0 12 GPIO_ACTIVE_LOW>; /* PL12 */
			linux,input-type = <EV_SW>;
			linux,code = <SW_LID>;
			linux,can-disable;
			wakeup-source;
			wakeup-event-action = <EV_ACT_DEASSERTED>;
		};
	};

	panel_edp: panel-edp {
		compatible = "neweast,wjfh116008a";
		backlight = <&backlight>;
		power-supply = <&reg_dc1sw>;

		port {
			panel_edp_in: endpoint {
				remote-endpoint = <&anx6345_out_edp>;
			};
		};
	};

	reg_vbklt: vbklt {
		compatible = "regulator-fixed";
		regulator-name = "vbklt";
		regulator-min-microvolt = <18000000>;
		regulator-max-microvolt = <18000000>;
		gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
		enable-active-high;
	};

	reg_vcc5v0: vcc5v0 {
		compatible = "regulator-fixed";
		regulator-name = "vcc5v0";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		gpio = <&axp_gpio 0 GPIO_ACTIVE_HIGH>;
		enable-active-high;
	};

	wifi_pwrseq: pwrseq {
		compatible = "mmc-pwrseq-simple";
		reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
	};

	speaker_amp: audio-amplifier {
		compatible = "simple-audio-amplifier";
		VCC-supply = <&reg_vcc5v0>;
		enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
		sound-name-prefix = "Speaker Amp";
	};

};

&codec {
	status = "okay";
};

&codec_analog {
	cpvdd-supply = <&reg_eldo1>;
	status = "okay";
};

&cpu0 {
	cpu-supply = <&reg_dcdc2>;
};

&cpu1 {
	cpu-supply = <&reg_dcdc2>;
};

&cpu2 {
	cpu-supply = <&reg_dcdc2>;
};

&cpu3 {
	cpu-supply = <&reg_dcdc2>;
};

&dai {
	status = "okay";
};

&de {
	status = "okay";
};

&ehci0 {
	status = "okay";
};

&ehci1 {
	status = "okay";
};

&mixer0 {
	status = "okay";
};

&mmc0 {
	pinctrl-names = "default";
	pinctrl-0 = <&mmc0_pins>;
	vmmc-supply = <&reg_dcdc1>;
	cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
	disable-wp;
	bus-width = <4>;
	status = "okay";
};

&mmc1 {
	pinctrl-names = "default";
	pinctrl-0 = <&mmc1_pins>;
	vmmc-supply = <&reg_dldo4>;
	vqmmc-supply = <&reg_eldo1>;
	mmc-pwrseq = <&wifi_pwrseq>;
	bus-width = <4>;
	non-removable;
	status = "okay";

	rtl8723cs: wifi@1 {
		reg = <1>;
	};
};

&mmc2 {
	pinctrl-names = "default";
	pinctrl-0 = <&mmc2_pins>, <&mmc2_ds_pin>;
	vmmc-supply = <&reg_dcdc1>;
	vqmmc-supply = <&reg_eldo1>;
	max-frequency = <200000000>;
	bus-width = <8>;
	non-removable;
	cap-mmc-hw-reset;
	mmc-hs200-1_8v;
	status = "okay";
};

&ohci0 {
	status = "okay";
};

&ohci1 {
	status = "okay";
};

&pio {
	vcc-pc-supply = <&reg_eldo1>;
	vcc-pd-supply = <&reg_dcdc1>;
	vcc-pe-supply = <&reg_aldo1>;
	vcc-pg-supply = <&reg_eldo1>;
};

&pwm {
	status = "okay";
};

&r_i2c {
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&r_i2c_pl89_pins>;
	status = "okay";

	anx6345: anx6345@38 {
		compatible = "analogix,anx6345";
		reg = <0x38>;
		reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
		dvdd25-supply = <&reg_dldo2>;
		dvdd12-supply = <&reg_fldo1>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			anx6345_in: port@0 {
				reg = <0>;
				anx6345_in_tcon0: endpoint {
					remote-endpoint = <&tcon0_out_anx6345>;
				};
			};

			anx6345_out: port@1 {
				reg = <1>;
				anx6345_out_edp: endpoint {
					remote-endpoint = <&panel_edp_in>;
				};
			};
		};
	};
};

&r_pio {
	/*
	 * FIXME: We can't add that supply for now since it would
	 * create a circular dependency between pinctrl, the regulator
	 * and the RSB Bus.
	 *
	 * vcc-pl-supply = <&reg_aldo2>;
	 */
};

&r_rsb {
	status = "okay";

	axp803: pmic@3a3 {
		compatible = "x-powers,axp803";
		reg = <0x3a3>;
		interrupt-parent = <&r_intc>;
		interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
	};
};

#include "axp803.dtsi"

&ac_power_supply {
	status = "okay";
};

&battery_power_supply {
	status = "okay";
};

&reg_aldo1 {
	regulator-name = "vcc-pe";
};

&reg_aldo2 {
	regulator-always-on;
	regulator-min-microvolt = <1800000>;
	regulator-max-microvolt = <3300000>;
	regulator-name = "vcc-pl";
};

&reg_aldo3 {
	regulator-always-on;
	regulator-min-microvolt = <2700000>;
	regulator-max-microvolt = <3300000>;
	regulator-name = "vcc-pll-avcc";
};

&reg_dc1sw {
	regulator-name = "vcc-lcd";
};

&reg_dcdc1 {
	regulator-always-on;
	regulator-min-microvolt = <3300000>;
	regulator-max-microvolt = <3300000>;
	regulator-name = "vcc-3v3";
};

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

/* DCDC3 is polyphased with DCDC2 */

&reg_dcdc5 {
	regulator-always-on;
	regulator-min-microvolt = <1200000>;
	regulator-max-microvolt = <1200000>;
	regulator-name = "vcc-dram";
};

&reg_dcdc6 {
	regulator-always-on;
	regulator-min-microvolt = <1100000>;
	regulator-max-microvolt = <1100000>;
	regulator-name = "vdd-sys";
};

&reg_dldo1 {
	regulator-min-microvolt = <3300000>;
	regulator-max-microvolt = <3300000>;
	regulator-name = "vcc-hdmi";
};

&reg_dldo2 {
	regulator-min-microvolt = <2500000>;
	regulator-max-microvolt = <2500000>;
	regulator-name = "vcc-edp";
};

&reg_dldo4 {
	regulator-min-microvolt = <3300000>;
	regulator-max-microvolt = <3300000>;
	regulator-name = "vcc-wifi";
};

&reg_eldo1 {
	regulator-always-on;
	regulator-min-microvolt = <1800000>;
	regulator-max-microvolt = <1800000>;
	regulator-name = "cpvdd";
};

&reg_fldo1 {
	regulator-min-microvolt = <1200000>;
	regulator-max-microvolt = <1200000>;
	regulator-name = "vcc-1v2-hsic";
};

&reg_fldo2 {
	regulator-always-on;
	regulator-min-microvolt = <1100000>;
	regulator-max-microvolt = <1100000>;
	regulator-name = "vdd-cpus";
};

&reg_rtc_ldo {
	regulator-name = "vcc-rtc";
};

&simplefb_lcd {
	panel-supply = <&reg_dc1sw>;
	dvdd25-supply = <&reg_dldo2>;
	dvdd12-supply = <&reg_fldo1>;
};

&simplefb_hdmi {
	vcc-hdmi-supply = <&reg_dldo1>;
};

&sound {
	status = "okay";
	simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
	simple-audio-card,widgets = "Microphone", "Internal Microphone Left",
				    "Microphone", "Internal Microphone Right",
				    "Headphone", "Headphone Jack",
				    "Speaker", "Internal Speaker";
	simple-audio-card,routing =
			"Left DAC", "DACL",
			"Right DAC", "DACR",
			"Speaker Amp INL", "LINEOUT",
			"Speaker Amp INR", "LINEOUT",
			"Internal Speaker", "Speaker Amp OUTL",
			"Internal Speaker", "Speaker Amp OUTR",
			"Headphone Jack", "HP",
			"ADCL", "Left ADC",
			"ADCR", "Right ADC",
			"Internal Microphone Left", "MBIAS",
			"MIC1", "Internal Microphone Left",
			"Internal Microphone Right", "HBIAS",
			"MIC2", "Internal Microphone Right";
};

&tcon0 {
	pinctrl-names = "default";
	pinctrl-0 = <&lcd_rgb666_pins>;
	assigned-clocks = <&ccu CLK_TCON0>;
	assigned-clock-parents = <&ccu CLK_PLL_VIDEO0_2X>;

	status = "okay";
};

&tcon0_out {
	tcon0_out_anx6345: endpoint {
		remote-endpoint = <&anx6345_in_tcon0>;
	};
};

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

&uart1 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
	uart-has-rtscts;
	status = "okay";

	bluetooth {
		compatible = "realtek,rtl8723cs-bt";
		device-wake-gpios = <&r_pio 0 5 GPIO_ACTIVE_LOW>; /* PL5 */
		enable-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
		host-wake-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
	};
};

&usb_otg {
	dr_mode = "host";
};

&usbphy {
	usb0_vbus-supply = <&reg_vcc5v0>;
	usb1_vbus-supply = <&reg_vcc5v0>;
	status = "okay";
};
