// SPDX-License-Identifier: GPL-2.0
/*
 * Device Tree Source for the Silicon Linux RZ/G2E 96board platform (CAT874)
 *
 * Copyright (C) 2019 Renesas Electronics Corp.
 */

/dts-v1/;
#include "r8a774c0.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/display/tda998x.h>

/ {
	model = "Silicon Linux RZ/G2E 96board platform (CAT874)";
	compatible = "si-linux,cat874", "renesas,r8a774c0";

	aliases {
		serial0 = &scif2;
		serial1 = &hscif2;
		mmc0 = &sdhi0;
		mmc1 = &sdhi3;
	};

	chosen {
		bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
		stdout-path = "serial0:115200n8";
	};

	hdmi-out {
		compatible = "hdmi-connector";
		type = "a";

		port {
			hdmi_con_out: endpoint {
				remote-endpoint = <&tda19988_out>;
			};
		};
	};

	leds {
		compatible = "gpio-leds";

		led0 {
			gpios = <&gpio5 19 GPIO_ACTIVE_HIGH>;
			label = "LED0";
		};

		led1 {
			gpios = <&gpio3 14 GPIO_ACTIVE_HIGH>;
			label = "LED1";
		};

		led2 {
			gpios = <&gpio4 10 GPIO_ACTIVE_HIGH>;
			label = "LED2";
		};

		led3 {
			gpios = <&gpio6 4 GPIO_ACTIVE_HIGH>;
			label = "LED3";
		};
	};

	memory@48000000 {
		device_type = "memory";
		/* first 128MB is reserved for secure area. */
		reg = <0x0 0x48000000 0x0 0x78000000>;
	};

	reg_12p0v: regulator-12p0v {
		compatible = "regulator-fixed";
		regulator-name = "D12.0V";
		regulator-min-microvolt = <12000000>;
		regulator-max-microvolt = <12000000>;
		regulator-boot-on;
		regulator-always-on;
	};

	sound: sound {
		compatible = "simple-audio-card";

		simple-audio-card,name = "CAT874 HDMI sound";
		simple-audio-card,format = "i2s";
		simple-audio-card,bitclock-master = <&sndcpu>;
		simple-audio-card,frame-master = <&sndcpu>;

		sndcodec: simple-audio-card,codec {
			sound-dai = <&tda19988>;
		};

		sndcpu: simple-audio-card,cpu {
			sound-dai = <&rcar_sound>;
		};
	};

	vcc_sdhi0: regulator-vcc-sdhi0 {
		compatible = "regulator-fixed";

		regulator-name = "SDHI0 Vcc";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-always-on;
		regulator-boot-on;
	};

	vccq_sdhi0: regulator-vccq-sdhi0 {
		compatible = "regulator-gpio";

		regulator-name = "SDHI0 VccQ";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <3300000>;

		gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;
		gpios-states = <1>;
		states = <3300000 1>, <1800000 0>;
	};

	wlan_en_reg: fixedregulator {
		compatible = "regulator-fixed";
		regulator-name = "wlan-en-regulator";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <1800000>;
		startup-delay-us = <70000>;

		gpio = <&gpio2 25 GPIO_ACTIVE_HIGH>;
		enable-active-high;
	};

	x13_clk: x13 {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <74250000>;
	};

	connector {
		compatible = "usb-c-connector";
		label = "USB-C";
		data-role = "dual";

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				hs_ep: endpoint {
					remote-endpoint = <&usb3_hs_ep>;
				};
			};
			port@1 {
				reg = <1>;
				ss_ep: endpoint {
					remote-endpoint = <&hd3ss3220_in_ep>;
				};
			};
		};
	};
};

&audio_clk_a {
	clock-frequency = <22579200>;
};

&du {
	pinctrl-0 = <&du_pins>;
	pinctrl-names = "default";
	status = "okay";

	clocks = <&cpg CPG_MOD 724>,
		 <&cpg CPG_MOD 723>,
		 <&x13_clk>;
	clock-names = "du.0", "du.1", "dclkin.0";

	ports {
		port@0 {
			du_out_rgb: endpoint {
				remote-endpoint = <&tda19988_in>;
			};
		};
	};
};

&ehci0 {
	dr_mode = "host";
	status = "okay";
};

&extal_clk {
	clock-frequency = <48000000>;
};

&hscif2 {
	pinctrl-0 = <&hscif2_pins>;
	pinctrl-names = "default";

	uart-has-rtscts;
	status = "okay";

	bluetooth {
		compatible = "ti,wl1837-st";
		enable-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>;
	};
};

&i2c0 {
	status = "okay";
	clock-frequency = <100000>;

	hd3ss3220@47 {
		compatible = "ti,hd3ss3220";
		reg = <0x47>;
		interrupt-parent = <&gpio6>;
		interrupts = <3 IRQ_TYPE_LEVEL_LOW>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				reg = <0>;
				hd3ss3220_in_ep: endpoint {
					remote-endpoint = <&ss_ep>;
				};
			};
			port@1 {
				reg = <1>;
				hd3ss3220_out_ep: endpoint {
					remote-endpoint = <&usb3_role_switch>;
				};
			};
		};
	};

	tda19988: tda19988@70 {
		compatible = "nxp,tda998x";
		reg = <0x70>;
		interrupt-parent = <&gpio1>;
		interrupts = <1 IRQ_TYPE_LEVEL_LOW>;

		video-ports = <0x234501>;

		#sound-dai-cells = <0>;
		audio-ports = <TDA998x_I2S 0x03>;
		clocks = <&rcar_sound 1>;

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

			port@0 {
				reg = <0>;
				tda19988_in: endpoint {
					remote-endpoint = <&du_out_rgb>;
				};
			};

			port@1 {
				reg = <1>;
				tda19988_out: endpoint {
					remote-endpoint = <&hdmi_con_out>;
				};
			};
		};
	};
};

&i2c1 {
	pinctrl-0 = <&i2c1_pins>;
	pinctrl-names = "default";

	status = "okay";
	clock-frequency = <400000>;

	rtc@32 {
		compatible = "epson,rx8571";
		reg = <0x32>;
	};
};

&lvds0 {
	status = "okay";

	clocks = <&cpg CPG_MOD 727>, <&x13_clk>, <&extal_clk>;
	clock-names = "fck", "dclkin.0", "extal";
};

&ohci0 {
	dr_mode = "host";
	status = "okay";
};

&pcie_bus_clk {
	clock-frequency = <100000000>;
};

&pciec0 {
	/* Map all possible DDR as inbound ranges */
	dma-ranges = <0x42000000 0 0x40000000 0 0x40000000 0 0x80000000>;
};

&pfc {
	du_pins: du {
		groups = "du_rgb888", "du_clk_out_0", "du_sync", "du_disp",
			 "du_clk_in_0";
		function = "du";
	};

	hscif2_pins: hscif2 {
		groups = "hscif2_data_a", "hscif2_ctrl_a";
		function = "hscif2";
	};

	i2c1_pins: i2c1 {
		groups = "i2c1_b";
		function = "i2c1";
	};

	scif2_pins: scif2 {
		groups = "scif2_data_a";
		function = "scif2";
	};

	sdhi0_pins: sd0 {
		groups = "sdhi0_data4", "sdhi0_ctrl";
		function = "sdhi0";
		power-source = <3300>;
	};

	sdhi0_pins_uhs: sd0_uhs {
		groups = "sdhi0_data4", "sdhi0_ctrl";
		function = "sdhi0";
		power-source = <1800>;
	};

	sdhi3_pins: sd3 {
		groups = "sdhi3_data4", "sdhi3_ctrl";
		function = "sdhi3";
		power-source = <1800>;
	};

	sound_clk_pins: sound_clk {
		groups = "audio_clkout1_a";
		function = "audio_clk";
	};

	sound_pins: sound {
		groups = "ssi01239_ctrl", "ssi0_data";
		function = "ssi";
	};

	usb30_pins: usb30 {
		groups = "usb30", "usb30_id";
		function = "usb30";
	};
};

&rcar_sound {
	pinctrl-0 = <&sound_pins>, <&sound_clk_pins>;
	pinctrl-names = "default";

	/* Single DAI */
	#sound-dai-cells = <0>;

	/* audio_clkout0/1/2/3 */
	#clock-cells = <1>;
	clock-frequency = <11289600>;

	status = "okay";

	rcar_sound,dai {
		dai0 {
			playback = <&ssi0>, <&src0>, <&dvc0>;
		};
	};
};

&rwdt {
	timeout-sec = <60>;
	status = "okay";
};

&scif2 {
	pinctrl-0 = <&scif2_pins>;
	pinctrl-names = "default";

	status = "okay";
};

&sdhi0 {
	pinctrl-0 = <&sdhi0_pins>;
	pinctrl-1 = <&sdhi0_pins_uhs>;
	pinctrl-names = "default", "state_uhs";

	vmmc-supply = <&vcc_sdhi0>;
	vqmmc-supply = <&vccq_sdhi0>;
	cd-gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
	bus-width = <4>;
	sd-uhs-sdr50;
	sd-uhs-sdr104;
	status = "okay";
};

&sdhi3 {
	status = "okay";
	pinctrl-0 = <&sdhi3_pins>;
	pinctrl-names = "default";

	vmmc-supply = <&wlan_en_reg>;
	bus-width = <4>;
	non-removable;
	cap-power-off-card;
	keep-power-in-suspend;

	#address-cells = <1>;
	#size-cells = <0>;
	wlcore: wlcore@2 {
		compatible = "ti,wl1837";
		reg = <2>;
		interrupt-parent = <&gpio1>;
		interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
	};
};

&usb2_phy0 {
	renesas,no-otg-pins;
	status = "okay";
};

&usb3_peri0 {
	companion = <&xhci0>;
	status = "okay";
	usb-role-switch;

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			usb3_hs_ep: endpoint {
				remote-endpoint = <&hs_ep>;
			};
		};
		port@1 {
			reg = <1>;
			usb3_role_switch: endpoint {
				remote-endpoint = <&hd3ss3220_out_ep>;
			};
		};
	};
};

&xhci0 {
	pinctrl-0 = <&usb30_pins>;
	pinctrl-names = "default";

	status = "okay";
};