// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (C) 2023 Andreas Kemnade
 */
/dts-v1/;

#include <dt-bindings/input/input.h>
#include "omap4460.dtsi"

/ {
	model = "Epson Moverio BT-200";
	compatible = "epson,embt2ws", "ti,omap4460", "ti,omap4";

	memory@80000000 {
		device_type = "memory";
		reg = <0x80000000 0x40000000>; /* 1024M */
	};

	backlight-left {
		compatible = "pwm-backlight";
		pwms = <&twl_pwm 1 7812500>;
		power-supply = <&unknown_supply>;
	};

	backlight-right {
		compatible = "pwm-backlight";
		pwms = <&twl_pwm 0 7812500>;
		power-supply = <&unknown_supply>;
	};

	chosen {
		stdout-path = &uart3;
	};

	gpio-keys {
		compatible = "gpio-keys";
		pinctrl-names = "default";
		pinctrl-0 = <&gpio_keys_pins>;

		key-lock {
			label = "Lock";
			gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
			linux,code = <SW_ROTATE_LOCK>; /* SW_TOUCHPAD_LOCK */
			linux,input-type = <EV_SW>;
		};
	};

	unknown_supply: unknown-supply {
		compatible = "regulator-fixed";
		regulator-name = "unknown";
	};

       /* regulator for wl12xx on sdio2 */
	wl12xx_vmmc: wl12xx-vmmc {
		pinctrl-names = "default";
		pinctrl-0 = <&wl12xx_gpio>;
		compatible = "regulator-fixed";
		regulator-name = "vwl1271";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <1800000>;
		gpio = <&gpio1 24 GPIO_ACTIVE_HIGH>;
		startup-delay-us = <70000>;
		enable-active-high;
	};
};

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

	clock-frequency = <400000>;

	twl: pmic@48 {
		compatible = "ti,twl6032";
		reg = <0x48>;
		/* IRQ# = 7 */
		interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */
		interrupt-controller;
		#interrupt-cells = <1>;

		rtc {
			compatible = "ti,twl4030-rtc";
			interrupts = <11>;
		};

		ldo2: regulator-ldo2 {
			compatible = "ti,twl6032-ldo2";
			regulator-min-microvolt = <1000000>;
			regulator-max-microvolt = <3000000>;
		};

		ldo4: regulator-ldo4 {
			compatible = "ti,twl6032-ldo4";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <2800000>;
		};

		ldo3: regulator-ldo3 {
			compatible = "ti,twl6032-ldo3";
			regulator-min-microvolt = <1000000>;
			regulator-max-microvolt = <3000000>;
		};

		ldo5: regulator-ldo5 {
			compatible = "ti,twl6032-ldo5";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <3000000>;
			ti,retain-on-reset;
		};

		ldo1: regulator-ldo1 {
			compatible = "ti,twl6032-ldo1";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <2500000>;
		};

		ldo7: regulator-ldo7 {
			compatible = "ti,twl6032-ldo7";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <2900000>;
		};

		ldoln: regulator-ldoln {
			compatible = "ti,twl6032-ldoln";
			regulator-always-on;
		};

		ldo6: regulator-ldo6 {
			compatible = "ti,twl6032-ldo6";
			regulator-always-on;
		};

		ldousb: regulator-ldousb {
			compatible = "ti,twl6032-ldousb";
			regulator-always-on;
		};

		vio: regulator-vio {
			compatible = "ti,twl6032-vio";
			regulator-always-on;
		};

		twl_usb_comparator: usb-comparator {
			compatible = "ti,twl6030-usb";
			interrupts = <4>, <10>;
		};

		twl_pwm: pwm {
			/* provides two PWMs (id 0, 1 for PWM1 and PWM2) */
			compatible = "ti,twl6030-pwm";
			#pwm-cells = <2>;
		};

		twl_pwmled: pwmled {
			/* provides one PWM (id 0 for Charging indicator LED) */
			compatible = "ti,twl6030-pwmled";
			#pwm-cells = <2>;
		};

		gpadc {
			compatible = "ti,twl6032-gpadc";
			interrupts = <3>;
			#io-channel-cells = <1>;
		};

	};
};

#include "twl6030_omap4.dtsi"

&twl_usb_comparator {
	usb-supply = <&ldousb>;
};


&i2c2 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c2_pins>;

	clock-frequency = <200000>;

	/* at head/glasses */
	mpu9150h: imu@68 {
		compatible = "invensense,mpu9150";
		reg = <0x68>;

		pinctrl-names = "default";
		pinctrl-0 = <&mpu9150h_pins>;
		interrupt-parent = <&gpio2>;
		interrupt = <19 IRQ_TYPE_LEVEL_HIGH>;

		i2c-gate {
			#address-cells = <1>;
			#size-cells = <0>;
			magnetometer@c {
				compatible = "asahi-kasei,ak8975";
				reg = <0x0c>;
			};
		};
	};
};

&i2c3 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c3_pins>;

	clock-frequency = <100000>;

	/* TODO: BD2606MVV at 0x66 */
};

&i2c4 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c4_pins>;

	clock-frequency = <360000>;

	/* TODO: KXTI9 at 0xf */

	tlv320aic3x: codec@18 {
		compatible = "ti,tlv320aic3x";
		reg = <0x18>;
		pinctrl-names = "default";
		pinctrl-0 = <&tlv320aic3x_pins>;
		#sound-dai-cells = <0>;

		reset-gpios = <&gpio2 23 GPIO_ACTIVE_LOW>;
	};

	/* TODO: mpu9150 at control unit, seems to require quirks */
};

&keypad {
	pinctrl-names = "default";
	pinctrl-0 = <&keypad_pins>;
	keypad,num-rows = <2>;
	keypad,num-columns = <3>;
	linux,keymap = <MATRIX_KEY(0, 0, KEY_MENU)
			MATRIX_KEY(0, 1, KEY_HOME)
			MATRIX_KEY(0, 2, KEY_BACK)
			MATRIX_KEY(1, 0, KEY_ESC)
			MATRIX_KEY(1, 1, KEY_VOLUMEDOWN)
			MATRIX_KEY(1, 2, KEY_VOLUMEUP)>;
	linux,input-no-autorepeat;
};

&mcbsp2 {
	#sound-dai-cells = <0>;
	pinctrl-names = "default";
	pinctrl-0 = <&mcbsp2_pins>;
	status = "okay";
};


&mmc1 {
	/* sdcard */
	vmmc-supply = <&ldo5>;
	broken-cd;
	bus-width = <4>;
};

&mmc2 {
	/* emmc */
	vmmc-supply = <&ldo2>;
	bus-width = <8>;
};

&mmc3 {
	pinctrl-names = "default";
	pinctrl-0 = <&wl12xx_pins>;
	vmmc-supply = <&wl12xx_vmmc>;
	interrupts-extended = <&wakeupgen GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH
			       &omap4_pmx_core 0x12e>;
	non-removable;
	bus-width = <4>;
	cap-power-off-card;

	#address-cells = <1>;
	#size-cells = <0>;
	wlcore: wlcore@2 {
		compatible = "ti,wl1283";
		reg = <2>;
		interrupts-extended = <&gpio1 23 IRQ_TYPE_LEVEL_HIGH>;
		interrupt-names = "irq";
		ref-clock-frequency = <26000000>;
		tcxo-clock-frequency = <26000000>;
	};
};

&mmc4 {
	status = "disabled";
};

&mmc5 {
	status = "disabled";
};

&omap4_pmx_core {
	bt_pins: pinmux-bt-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x1ca, PIN_OUTPUT | MUX_MODE3) /* gpio25 */
		>;
	};

	gpio_keys_pins: pinmux-gpio-key-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x56, PIN_INPUT_PULLUP | MUX_MODE3) /* gpio35 */
		>;
	};

	i2c1_pins: pinmux-i2c1-pins {
		pinctrl-single,pins = <
			   OMAP4_IOPAD(0x122, PIN_INPUT_PULLUP | MUX_MODE0)	/* i2c1_scl */
			   OMAP4_IOPAD(0x124, PIN_INPUT_PULLUP | MUX_MODE0)	/* i2c1_sda */
		>;
	};

	i2c2_pins: pinmux-i2c2-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x126, PIN_INPUT | MUX_MODE0)	/* i2c2_scl */
			OMAP4_IOPAD(0x128, PIN_INPUT | MUX_MODE0)	/* i2c2_sda */
		>;
	};

	i2c3_pins: pinmux-i2c3-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x12a, PIN_INPUT | MUX_MODE0)	/* i2c3_scl */
			OMAP4_IOPAD(0x12c, PIN_INPUT | MUX_MODE0)	/* i2c3_sda */
		>;
	};

	i2c4_pins: pinmux-i2c4-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x12e, PIN_INPUT | MUX_MODE0)	/* i2c4_scl */
			OMAP4_IOPAD(0x130, PIN_INPUT | MUX_MODE0)	/* i2c4_sda */
		>;
	};

	keypad_pins: pinmux-keypad-pins {
		pinctrl-single,pins = <
			/* kpd_row0 */
			OMAP4_IOPAD(0x0050, PIN_INPUT_PULLUP | MUX_MODE1)
			/* kpd_row1 */
			OMAP4_IOPAD(0x0052, PIN_INPUT_PULLUP | MUX_MODE1)
			/* kpd_row2 */
			OMAP4_IOPAD(0x0054, PIN_INPUT_PULLUP | MUX_MODE1)
			/* kpd_col0 */
			OMAP4_IOPAD(0x0058, PIN_OUTPUT | MUX_MODE1)
			/* kpd_col1 */
			OMAP4_IOPAD(0x005a, PIN_OUTPUT | MUX_MODE1)
			/* kpd_col2 */
			OMAP4_IOPAD(0x005c, PIN_OUTPUT | MUX_MODE1)
		>;
	};

	mcbsp2_pins: pinmux-mcbsp2-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x0f6, PIN_INPUT | MUX_MODE0)       /* abe_mcbsp2_clkx */
			OMAP4_IOPAD(0x0f8, PIN_INPUT | MUX_MODE0)       /* abe_mcbsp2_dr */
			OMAP4_IOPAD(0x0fa, PIN_OUTPUT | MUX_MODE0)      /* abe_mcbsp2_dx */
			OMAP4_IOPAD(0x0fc, PIN_INPUT | MUX_MODE0)       /* abe_mcbsp2_fsx */
		>;
	};

	mpu9150h_pins: pinmux-mpu9150h-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x76, PIN_INPUT_PULLUP | MUX_MODE3)
		>;
	};

	tlv320aic3x_pins: pinmux-tlv320aic3x-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x7e, PIN_OUTPUT | MUX_MODE3)
		>;
	};

	uart2_pins: pinmux-uart2-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x118, PIN_INPUT_PULLUP | MUX_MODE0) /* uart2_cts.uart2_cts */
			OMAP4_IOPAD(0x11a, PIN_OUTPUT | MUX_MODE0)	 /* uart2_rts.uart2_rts */
			OMAP4_IOPAD(0x11c, PIN_INPUT_PULLUP | MUX_MODE0) /* uart2_rx.uart2_rx */
			OMAP4_IOPAD(0x11e, PIN_OUTPUT | MUX_MODE0)	 /* uart2_tx.uart2_tx */
		>;
	};

	uart3_pins: pinmux-uart3-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x144, PIN_INPUT | MUX_MODE0)  /* uart3_rx_irrx */
			OMAP4_IOPAD(0x146, PIN_OUTPUT | MUX_MODE0) /* uart3_tx_irtx */
		>;
	};

	usb_otg_hs_pins: pinmux-usb-otg-hs-pins {
		 pinctrl-single,pins = <
			 OMAP4_IOPAD(0x194, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* usba0_otg_ce */
			 OMAP4_IOPAD(0x196, PIN_INPUT | MUX_MODE0)	     /* usba0_otg_dp */
			 OMAP4_IOPAD(0x198, PIN_INPUT | MUX_MODE0)	     /* usba0_otg_dm */
		 >;
	};

	wl12xx_pins: pinmux-wl12xx-pins {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x1c6, PIN_INPUT | MUX_MODE3) /* gpio_23 / IRQ */
			OMAP4_IOPAD(0x16c, PIN_INPUT_PULLUP | MUX_MODE2) /* sdmmc3_dat2 */
			OMAP4_IOPAD(0x16e, PIN_INPUT_PULLUP | MUX_MODE2) /* sdmmc3_dat1 */
			OMAP4_IOPAD(0x170, PIN_INPUT_PULLUP | MUX_MODE2) /* sdmmc3_dat0 */
			OMAP4_IOPAD(0x172, PIN_INPUT_PULLUP | MUX_MODE2) /* sdmmc3_dat3 */
			OMAP4_IOPAD(0x174, PIN_INPUT_PULLUP | MUX_MODE2) /* sdmmc3_cmd */
			OMAP4_IOPAD(0x176, PIN_INPUT_PULLUP | MUX_MODE2) /* sdmmc3_clk */
		>;
	};

	wl12xx_gpio: pinmux-wl12xx-gpio {
		pinctrl-single,pins = <
			OMAP4_IOPAD(0x1c8, PIN_OUTPUT | MUX_MODE3)  /* gpio_24 / WLAN_EN */
		>;
	};
};

&uart2 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart2_pins &bt_pins>;
	interrupts-extended = <&wakeupgen GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH
			       &omap4_pmx_core OMAP4_UART2_RX>;

	/*
	 * BT + GPS in WL1283 in WG7500 requiring CLK32KAUDIO of pmic
	 * which does not have a driver
	 */
};

&uart3 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart3_pins>;
	interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH
			       &omap4_pmx_core OMAP4_UART3_RX>;
};

&usb_otg_hs {
	pinctrl-names = "default";
	pinctrl-0 = <&usb_otg_hs_pins>;

	interface-type = <1>;
	mode = <3>;
	power = <50>;
};

&usbhshost {
	status = "disabled";
};