// SPDX-License-Identifier: GPL-2.0
/dts-v1/;

#include "jz4740.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/iio/adc/ingenic,adc.h>
#include <dt-bindings/clock/ingenic,tcu.h>
#include <dt-bindings/input/input.h>

#define KEY_QI_QI	KEY_F13
#define KEY_QI_UPRED	KEY_RIGHTALT
#define KEY_QI_VOLUP	KEY_VOLUMEUP
#define KEY_QI_VOLDOWN	KEY_VOLUMEDOWN
#define KEY_QI_FN	KEY_LEFTCTRL

/ {
	compatible = "qi,lb60", "ingenic,jz4740";

	chosen {
		stdout-path = &uart0;
	};

	vcc: regulator@0 {
		compatible = "regulator-fixed";
		regulator-name = "vcc";

		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-always-on;
	};

	mmc_power: regulator@1 {
		compatible = "regulator-fixed";
		regulator-name = "mmc_vcc";
		gpio = <&gpd 2 0>;

		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	amp_supply: regulator@2 {
		compatible = "regulator-fixed";
		regulator-name = "amp_supply";
		gpio = <&gpd 4 0>;
		enable-active-high;

		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	amp: analog-amplifier {
		compatible = "simple-audio-amplifier";
		enable-gpios = <&gpb 29 GPIO_ACTIVE_HIGH>;
		VCC-supply = <&amp_supply>;
	};

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

		simple-audio-card,name = "QI LB60";
		simple-audio-card,format = "i2s";

		simple-audio-card,widgets =
			"Speaker", "Speaker",
			"Microphone", "Mic";
		simple-audio-card,routing =
			"MIC", "Mic",
			"Speaker", "OUTL",
			"Speaker", "OUTR",
			"INL", "LOUT",
			"INL", "ROUT";

		simple-audio-card,aux-devs = <&amp>;

		simple-audio-card,bitclock-master = <&dai_codec>;
		simple-audio-card,frame-master = <&dai_codec>;

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

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

	keys {
		compatible = "gpio-keys";

		key {
			label = "Power";
			wakeup-source;
			linux,code = <KEY_POWER>;
			gpios = <&gpd 29 GPIO_ACTIVE_LOW>;
		};
	};

	keyboard {
		compatible = "gpio-matrix-keypad";

		col-scan-delay-us = <10>;
		debounce-delay-ms = <10>;
		wakeup-source;

		row-gpios = <&gpd 18 0 &gpd 19 0 &gpd 20 0 &gpd 21 0
			     &gpd 22 0 &gpd 23 0 &gpd 24 0 &gpd 26 0>;
		col-gpios = <&gpc 10 0 &gpc 11 0 &gpc 12 0 &gpc 13 0
			     &gpc 14 0 &gpc 15 0 &gpc 16 0 &gpc 17 0>;
		gpio-activelow;

		linux,keymap = <
			MATRIX_KEY(0, 0, KEY_F1)	/* S2 */
			MATRIX_KEY(0, 1, KEY_F2)	/* S3 */
			MATRIX_KEY(0, 2, KEY_F3)	/* S4 */
			MATRIX_KEY(0, 3, KEY_F4)	/* S5 */
			MATRIX_KEY(0, 4, KEY_F5)	/* S6 */
			MATRIX_KEY(0, 5, KEY_F6)	/* S7 */
			MATRIX_KEY(0, 6, KEY_F7)	/* S8 */

			MATRIX_KEY(1, 0, KEY_Q)	/* S10 */
			MATRIX_KEY(1, 1, KEY_W)	/* S11 */
			MATRIX_KEY(1, 2, KEY_E)	/* S12 */
			MATRIX_KEY(1, 3, KEY_R)	/* S13 */
			MATRIX_KEY(1, 4, KEY_T)	/* S14 */
			MATRIX_KEY(1, 5, KEY_Y)	/* S15 */
			MATRIX_KEY(1, 6, KEY_U)	/* S16 */
			MATRIX_KEY(1, 7, KEY_I)	/* S17 */
			MATRIX_KEY(2, 0, KEY_A)	/* S18 */
			MATRIX_KEY(2, 1, KEY_S)	/* S19 */
			MATRIX_KEY(2, 2, KEY_D)	/* S20 */
			MATRIX_KEY(2, 3, KEY_F)	/* S21 */
			MATRIX_KEY(2, 4, KEY_G)	/* S22 */
			MATRIX_KEY(2, 5, KEY_H)	/* S23 */
			MATRIX_KEY(2, 6, KEY_J)	/* S24 */
			MATRIX_KEY(2, 7, KEY_K)	/* S25 */
			MATRIX_KEY(3, 0, KEY_ESC)	/* S26 */
			MATRIX_KEY(3, 1, KEY_Z)	/* S27 */
			MATRIX_KEY(3, 2, KEY_X)	/* S28 */
			MATRIX_KEY(3, 3, KEY_C)	/* S29 */
			MATRIX_KEY(3, 4, KEY_V)	/* S30 */
			MATRIX_KEY(3, 5, KEY_B)	/* S31 */
			MATRIX_KEY(3, 6, KEY_N)	/* S32 */
			MATRIX_KEY(3, 7, KEY_M)	/* S33 */
			MATRIX_KEY(4, 0, KEY_TAB)	/* S34 */
			MATRIX_KEY(4, 1, KEY_CAPSLOCK)	/* S35 */
			MATRIX_KEY(4, 2, KEY_BACKSLASH)	/* S36 */
			MATRIX_KEY(4, 3, KEY_APOSTROPHE)	/* S37 */
			MATRIX_KEY(4, 4, KEY_COMMA)	/* S38 */
			MATRIX_KEY(4, 5, KEY_DOT)	/* S39 */
			MATRIX_KEY(4, 6, KEY_SLASH)	/* S40 */
			MATRIX_KEY(4, 7, KEY_UP)	/* S41 */
			MATRIX_KEY(5, 0, KEY_O)	/* S42 */
			MATRIX_KEY(5, 1, KEY_L)	/* S43 */
			MATRIX_KEY(5, 2, KEY_EQUAL)	/* S44 */
			MATRIX_KEY(5, 3, KEY_QI_UPRED)	/* S45 */
			MATRIX_KEY(5, 4, KEY_SPACE)	/* S46 */
			MATRIX_KEY(5, 5, KEY_QI_QI)	/* S47 */
			MATRIX_KEY(5, 6, KEY_RIGHTCTRL)	/* S48 */
			MATRIX_KEY(5, 7, KEY_LEFT)	/* S49 */
			MATRIX_KEY(6, 0, KEY_F8)	/* S50 */
			MATRIX_KEY(6, 1, KEY_P)	/* S51 */
			MATRIX_KEY(6, 2, KEY_BACKSPACE)/* S52 */
			MATRIX_KEY(6, 3, KEY_ENTER)	/* S53 */
			MATRIX_KEY(6, 4, KEY_QI_VOLUP)	/* S54 */
			MATRIX_KEY(6, 5, KEY_QI_VOLDOWN)	/* S55 */
			MATRIX_KEY(6, 6, KEY_DOWN)	/* S56 */
			MATRIX_KEY(6, 7, KEY_RIGHT)	/* S57 */

			MATRIX_KEY(7, 0, KEY_LEFTSHIFT)	/* S58 */
			MATRIX_KEY(7, 1, KEY_LEFTALT) /* S59 */
			MATRIX_KEY(7, 2, KEY_QI_FN)	/* S60 */
			>;
	};

	spi {
		compatible = "spi-gpio";
		#address-cells = <1>;
		#size-cells = <0>;

		sck-gpios = <&gpc 23 GPIO_ACTIVE_HIGH>;
		mosi-gpios = <&gpc 22 GPIO_ACTIVE_HIGH>;
		cs-gpios = <&gpc 21 GPIO_ACTIVE_LOW>;
		num-chipselects = <1>;
	};

	usb_charger: charger {
		compatible = "gpio-charger";
		charger-type = "usb-sdp";
		gpios = <&gpd 28 GPIO_ACTIVE_LOW>;
		status-gpios = <&gpc 27 GPIO_ACTIVE_LOW>;
	};

	simple_battery: battery {
		compatible = "simple-battery";
		voltage-min-design-microvolt = <3600000>;
		voltage-max-design-microvolt = <4200000>;
	};

	pmu {
		compatible = "ingenic,jz4740-battery";
		io-channels = <&adc INGENIC_ADC_BATTERY>;
		io-channel-names = "battery";
		power-supplies = <&usb_charger>;
		monitored-battery = <&simple_battery>;
	};

	hwmon {
		compatible = "iio-hwmon";
		io-channels = <&adc INGENIC_ADC_AUX>;
	};

	panel: panel {
		compatible = "giantplus,gpm940b0";

		power-supply = <&vcc>;

		port {
			panel_input: endpoint {
				remote-endpoint = <&panel_output>;
			};
		};
	};

	usb_phy: usb-phy {
		compatible = "usb-nop-xceiv";
		#phy-cells = <0>;

		vcc-supply = <&vcc>;
	};
};

&ext {
	clock-frequency = <12000000>;
};

&rtc_dev {
	system-power-controller;
};

&uart0 {
	pinctrl-names = "default";
	pinctrl-0 = <&pins_uart0>;
};

&uart1 {
	status = "disabled";
};

&nemc {
	nandc: nand-controller@1 {
		compatible = "ingenic,jz4740-nand";
		reg = <1 0 0x4000000>;

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

		ingenic,bch-controller = <&ecc>;

		pinctrl-names = "default";
		pinctrl-0 = <&pins_nemc>;

		rb-gpios = <&gpc 30 GPIO_ACTIVE_LOW>;

		nand@1 {
			reg = <1>;

			nand-ecc-step-size = <512>;
			nand-ecc-strength = <4>;
			nand-ecc-mode = "hw";
			nand-is-boot-medium;
			nand-on-flash-bbt;

			partitions {
				compatible = "fixed-partitions";
				#address-cells = <1>;
				#size-cells = <1>;

				partition@0 {
					label = "boot";
					reg = <0x0 0x400000>;
				};

				partition@400000 {
					label = "kernel";
					reg = <0x400000 0x400000>;
				};

				partition@800000 {
					label = "rootfs";
					reg = <0x800000 0x0>;
				};
			};
		};
	};
};

&lcd {
	pinctrl-names = "default";
	pinctrl-0 = <&pins_lcd>;

	port {
		panel_output: endpoint {
			remote-endpoint = <&panel_input>;
		};
	};
};

&udc {
	phys = <&usb_phy>;
};

&pinctrl {
	pins_lcd: lcd {
		function = "lcd";
		groups = "lcd-8bit";
	};

	pins_nemc: nemc {
		function = "nand";
		groups = "nand-cs1";
	};

	pins_uart0: uart0 {
		function = "uart0";
		groups = "uart0-data";
		bias-disable;
	};

	pins_mmc: mmc {
		mmc {
			function = "mmc";
			groups = "mmc-1bit", "mmc-4bit";
			bias-disable;
		};

		mmc-gpios {
			pins = "PD0", "PD2";
			bias-disable;
		};
	};
};

&mmc {
	bus-width = <4>;
	max-frequency = <24000000>;
	cd-gpios = <&gpd 0 GPIO_ACTIVE_HIGH>;
	vmmc-supply = <&mmc_power>;

	pinctrl-names = "default";
	pinctrl-0 = <&pins_mmc>;
};

&tcu {
	/* 750 kHz for the system timer and clocksource */
	assigned-clocks = <&tcu TCU_CLK_TIMER0>, <&tcu TCU_CLK_TIMER1>;
	assigned-clock-rates = <750000>, <750000>;
};
