// SPDX-License-Identifier: GPL-2.0-only
/*
 * omap3-n950.dts - Device Tree file for Nokia N950
 *
 * Written by: Aaro Koskinen <aaro.koskinen@iki.fi>
 */

/dts-v1/;

#include "omap3-n950-n9.dtsi"
#include <dt-bindings/input/input.h>

/ {
	model = "Nokia N950";
	compatible = "nokia,omap3-n950", "ti,omap3630", "ti,omap36xx", "ti,omap3";

	keys {
		compatible = "gpio-keys";

		keypad_slide {
			label = "Keypad Slide";
			gpios = <&gpio4 13 GPIO_ACTIVE_LOW>; /* 109 */
			linux,input-type = <EV_SW>;
			linux,code = <SW_KEYPAD_SLIDE>;
			wakeup-source;
			pinctrl-names = "default";
			pinctrl-0 = <&keypad_slide_pins>;
		};
	};
};

&omap3_pmx_core {
	keypad_slide_pins: pinmux_debug_led_pins {
		pinctrl-single,pins = <
			OMAP3_CORE1_IOPAD(0x212a, PIN_INPUT | MUX_MODE4)       /* cam_d10.gpio_109 */
		>;
	};
};

&omap3_pmx_core {
	spi4_pins: pinmux_spi4_pins {
		pinctrl-single,pins = <
			OMAP3_CORE1_IOPAD(0x218c, PIN_INPUT_PULLDOWN | MUX_MODE1) /* mcspi4_clk */
			OMAP3_CORE1_IOPAD(0x2190, PIN_OUTPUT | MUX_MODE1) /* mcspi4_simo */
			OMAP3_CORE1_IOPAD(0x2192, PIN_INPUT_PULLDOWN | MUX_MODE1) /* mcspi4_somi */
			OMAP3_CORE1_IOPAD(0x2196, PIN_OUTPUT | MUX_MODE1) /* mcspi4_cs0 */
		>;
	};
};

&omap3_pmx_core {
	dsi_pins: pinmux_dsi_pins {
		pinctrl-single,pins = <
			OMAP3_CORE1_IOPAD(0x20dc, PIN_OUTPUT | MUX_MODE1) /* dsi_dx0 - data0+ */
			OMAP3_CORE1_IOPAD(0x20de, PIN_OUTPUT | MUX_MODE1) /* dsi_dy0 - data0- */
			OMAP3_CORE1_IOPAD(0x20e0, PIN_OUTPUT | MUX_MODE1) /* dsi_dx1 - clk+   */
			OMAP3_CORE1_IOPAD(0x20e2, PIN_OUTPUT | MUX_MODE1) /* dsi_dy1 - clk-   */
			OMAP3_CORE1_IOPAD(0x20e4, PIN_OUTPUT | MUX_MODE1) /* dsi_dx2 - data1+ */
			OMAP3_CORE1_IOPAD(0x20e6, PIN_OUTPUT | MUX_MODE1) /* dsi_dy2 - data1- */
		>;
	};

	display_pins: pinmux_display_pins {
		pinctrl-single,pins = <
			OMAP3_CORE1_IOPAD(0x20ca, PIN_INPUT | MUX_MODE4) /* gpio 62 - display te */
			OMAP3_CORE1_IOPAD(0x20fe, PIN_OUTPUT | MUX_MODE4) /* gpio 87 - display reset */
		>;
	};
};

&i2c2 {
	smia_1: camera@10 {
		compatible = "nokia,smia";
		reg = <0x10>;
		/* No reset gpio */
		vana-supply = <&vaux3>;
		clocks = <&isp 0>;
		clock-frequency = <9600000>;
		nokia,nvm-size = <(16 * 64)>;
		flash-leds = <&as3645a_flash &as3645a_indicator>;
		port {
			smia_1_1: endpoint {
				link-frequencies = /bits/ 64 <210000000 333600000 398400000>;
				clock-lanes = <0>;
				data-lanes = <1 2>;
				remote-endpoint = <&csi2a_ep>;
			};
		};
	};
};

&isp {
	vdd-csiphy1-supply = <&vaux2>;
	vdd-csiphy2-supply = <&vaux2>;
	ports {
		port@2 {
			reg = <2>;
			csi2a_ep: endpoint {
				remote-endpoint = <&smia_1_1>;
				clock-lanes = <2>;
				data-lanes = <3 1>;
				crc = <1>;
				lane-polarities = <1 1 1>;
			};
		};
	};
};

&mcspi4 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&spi4_pins>;

	wlcore: wlcore@0 {
		compatible = "ti,wl1271";
		pinctrl-names = "default";
		pinctrl-0 = <&wlan_pins>;
		reg = <0>;
		spi-max-frequency = <48000000>;
		clock-xtal;
		ref-clock-frequency = <38400000>;
		interrupts-extended = <&gpio2 10 IRQ_TYPE_LEVEL_HIGH>; /* gpio 42 */
		vwlan-supply = <&vwlan_fixed>;
	};
};

&modem {
	compatible = "nokia,n950-modem";
};

&twl {
	twl_audio: audio {
		compatible = "ti,twl4030-audio";
		ti,enable-vibra = <1>;
	};
};

&twl_keypad {
	linux,keymap = < MATRIX_KEY(0x00, 0x00, KEY_BACKSLASH)
			 MATRIX_KEY(0x01, 0x00, KEY_LEFTSHIFT)
			 MATRIX_KEY(0x02, 0x00, KEY_COMPOSE)
			 MATRIX_KEY(0x03, 0x00, KEY_LEFTMETA)
			 MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL)
			 MATRIX_KEY(0x05, 0x00, KEY_BACKSPACE)
			 MATRIX_KEY(0x06, 0x00, KEY_VOLUMEDOWN)
			 MATRIX_KEY(0x07, 0x00, KEY_VOLUMEUP)

			 MATRIX_KEY(0x03, 0x01, KEY_Z)
			 MATRIX_KEY(0x04, 0x01, KEY_A)
			 MATRIX_KEY(0x05, 0x01, KEY_Q)
			 MATRIX_KEY(0x06, 0x01, KEY_W)
			 MATRIX_KEY(0x07, 0x01, KEY_E)

			 MATRIX_KEY(0x03, 0x02, KEY_X)
			 MATRIX_KEY(0x04, 0x02, KEY_S)
			 MATRIX_KEY(0x05, 0x02, KEY_D)
			 MATRIX_KEY(0x06, 0x02, KEY_C)
			 MATRIX_KEY(0x07, 0x02, KEY_V)

			 MATRIX_KEY(0x03, 0x03, KEY_O)
			 MATRIX_KEY(0x04, 0x03, KEY_I)
			 MATRIX_KEY(0x05, 0x03, KEY_U)
			 MATRIX_KEY(0x06, 0x03, KEY_L)
			 MATRIX_KEY(0x07, 0x03, KEY_APOSTROPHE)

			 MATRIX_KEY(0x03, 0x04, KEY_Y)
			 MATRIX_KEY(0x04, 0x04, KEY_K)
			 MATRIX_KEY(0x05, 0x04, KEY_J)
			 MATRIX_KEY(0x06, 0x04, KEY_H)
			 MATRIX_KEY(0x07, 0x04, KEY_G)

			 MATRIX_KEY(0x03, 0x05, KEY_B)
			 MATRIX_KEY(0x04, 0x05, KEY_COMMA)
			 MATRIX_KEY(0x05, 0x05, KEY_M)
			 MATRIX_KEY(0x06, 0x05, KEY_N)
			 MATRIX_KEY(0x07, 0x05, KEY_DOT)

			 MATRIX_KEY(0x00, 0x06, KEY_SPACE)
			 MATRIX_KEY(0x03, 0x06, KEY_T)
			 MATRIX_KEY(0x04, 0x06, KEY_UP)
			 MATRIX_KEY(0x05, 0x06, KEY_LEFT)
			 MATRIX_KEY(0x06, 0x06, KEY_RIGHT)
			 MATRIX_KEY(0x07, 0x06, KEY_DOWN)

			 MATRIX_KEY(0x03, 0x07, KEY_P)
			 MATRIX_KEY(0x04, 0x07, KEY_ENTER)
			 MATRIX_KEY(0x05, 0x07, KEY_SLASH)
			 MATRIX_KEY(0x06, 0x07, KEY_F)
			 MATRIX_KEY(0x07, 0x07, KEY_R)
			 >;
};

&lis302 {
	st,axis-x = <(-2)>; /* LIS3_INV_DEV_Y */
	st,axis-y = <(-1)>; /* LIS3_INV_DEV_X */
	st,axis-z = <(-3)>; /* LIS3_INV_DEV_Z */

	st,min-limit-x = <(-32)>;
	st,min-limit-y = <3>;
	st,min-limit-z = <3>;

	st,max-limit-x = <(-3)>;
	st,max-limit-y = <32>;
	st,max-limit-z = <32>;
};

&dss {
	status = "ok";

	vdda_video-supply = <&vdac>;
};

&dsi {
	status = "ok";

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

	vdd-supply = <&vpll2>;

	port {
		dsi_out_ep: endpoint {
			remote-endpoint = <&lcd0_in>;
			lanes = <2 3 0 1 4 5>;
		};
	};

	lcd0: display {
		compatible = "nokia,himalaya", "panel-dsi-cm";
		label = "lcd0";

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

		vpnl-supply = <&vmmc2>;
		vddi-supply = <&vio>;

		reset-gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;	/* 87 */
		te-gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;	/* 62 */

		width-mm = <49>; /* 48.960 mm */
		height-mm = <88>; /* 88.128 mm */

		/* TODO:
		 * - panel is upside-down
		 * - top + bottom 5px are not visible
		 */
		panel-timing {
			clock-frequency = <0>;          /* Calculated by dsi */

			hback-porch = <2>;
			hactive = <480>;
			hfront-porch = <0>;
			hsync-len = <2>;

			vback-porch = <1>;
			vactive = <864>;
			vfront-porch = <0>;
			vsync-len = <1>;

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <1>;
		};

		port {
			lcd0_in: endpoint {
				remote-endpoint = <&dsi_out_ep>;
			};
		};
	};
};
