// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright 2012 ST-Ericsson AB
 *
 * Device Tree for the TVK1281618 UIB
 */

#include <dt-bindings/interrupt-controller/irq.h>

/ {
	gpio_keys {
		compatible = "gpio-keys";
		#address-cells = <1>;
		#size-cells = <0>;
		vdd-supply = <&ab8500_ldo_aux1_reg>;
		pinctrl-names = "default";
		pinctrl-0 = <&prox_tvk_mode>, <&hall_tvk_mode>;

		button@139 {
			/* Proximity sensor */
			gpios = <&gpio6 25 GPIO_ACTIVE_HIGH>;
			linux,code = <11>; /* SW_FRONT_PROXIMITY */
			label = "SFH7741 Proximity Sensor";
		};
		button@145 {
			/* Hall sensor */
			gpios = <&gpio4 17 GPIO_ACTIVE_HIGH>;
			linux,code = <0>; /* SW_LID */
			label = "HED54XXU11 Hall Effect Sensor";
		};
	};

	soc {
		i2c@80004000 {
			tc35893@44 {
				compatible = "toshiba,tc35893";
				reg = <0x44>;
				interrupt-parent = <&gpio6>;
				interrupts = <26 IRQ_TYPE_EDGE_RISING>;
				pinctrl-names = "default";
				pinctrl-0 = <&tc35893_tvk_mode>;

				interrupt-controller;
				#interrupt-cells = <1>;

				tc3589x_gpio {
					compatible = "toshiba,tc3589x-gpio";
					interrupts = <0>;

					interrupt-controller;
					#interrupt-cells = <2>;
					gpio-controller;
					#gpio-cells = <2>;
				};
				tc3589x_keypad {
					compatible = "toshiba,tc3589x-keypad";
					interrupts = <6>;
					debounce-delay-ms = <4>;
					keypad,num-columns = <8>;
					keypad,num-rows = <8>;
					linux,no-autorepeat;
					wakeup-source;
					linux,keymap = <0x0301006b
						        0x04010066
							0x06040072
							0x040200d7
							0x0303006a
							0x0205000e
							0x0607008b
							0x0500001c
							0x0403000b
							0x03040034
							0x05020067
							0x0305006c
							0x040500e7
							0x0005009e
							0x06020073
							0x01030039
							0x07060069
							0x050500d9>;
				};
			};
		};
		/* Sensors mounted on this board variant */
		i2c@80128000 {
			lsm303dlh@18 {
				/* Accelerometer */
				compatible = "st,lsm303dlh-accel";
				st,drdy-int-pin = <1>;
				drive-open-drain;
				reg = <0x18>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&accel_tvk_mode>;
				/*
				 * These interrupts cannot be used: the other component
				 * ST-Micro L3D4200D gyro that is connected to the same lines
				 * cannot set its DRDY line to open drain, so it cannot be
				 * shared with other peripherals. The should be defined for
				 * the falling edge if they could be wired together.
				 *
				 * interrupts-extended =
				 * <&gpio1 0 IRQ_TYPE_EDGE_FALLING>,
				 * <&gpio2 19 IRQ_TYPE_EDGE_FALLING>;
				 */
			};
			lsm303dlh@1e {
				/* Magnetometer */
				compatible = "st,lsm303dlh-magn";
				reg = <0x1e>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				/*
				 * These interrupts cannot be used: the other component
				 * ST-Micro L3D4200D gyro that is connected to the same lines
				 * cannot set its DRDY line to open drain, so it cannot be
				 * shared with other peripherals. The should be defined for
				 * the falling edge if they could be wired together.
				 *
				 * interrupts-extended =
				 * <&gpio1 0 IRQ_TYPE_EDGE_FALLING>,
				 * <&gpio2 19 IRQ_TYPE_EDGE_FALLING>;
				 */
			};
			lis331dl@1c {
				/* Accelerometer */
				compatible = "st,lis331dl-accel";
				st,drdy-int-pin = <1>;
				reg = <0x1c>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&accel_tvk_mode>;
				interrupt-parent = <&gpio2>;
				/* INT2 would need to be open drain */
				interrupts = <18 IRQ_TYPE_EDGE_RISING>,
					     <19 IRQ_TYPE_EDGE_RISING>;
			};
			ak8974@f {
				/* Magnetometer */
				compatible = "asahi-kasei,ak8974";
				reg = <0x0f>;
				avdd-supply = <&ab8500_ldo_aux1_reg>;
				dvdd-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&gyro_magn_tvk_mode>;
				/*
				 * These interrupts cannot be used: the other component
				 * ST-Micro L3D4200D gyro that is connected to the same lines
				 * cannot set its DRDY line to open drain, so it cannot be
				 * shared with other peripherals. The should be defined for
				 * the falling edge if they could be wired together.
				 *
				 * interrupts-extended =
				 * <&gpio1 0 IRQ_TYPE_EDGE_FALLING>,
				 * <&gpio0 31 IRQ_TYPE_EDGE_FALLING>;
				 */
			};
			l3g4200d@68 {
				/* Gyroscope */
				compatible = "st,l3g4200d-gyro";
				st,drdy-int-pin = <2>;
				reg = <0x68>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&gyro_magn_tvk_mode>;
				interrupts-extended =
				<&gpio1 0 IRQ_TYPE_EDGE_RISING>,
				<&gpio0 31 IRQ_TYPE_EDGE_RISING>;
			};
			lsp001wm@5c {
				/* Barometer/pressure sensor */
				compatible = "st,lps001wp-press";
				reg = <0x5c>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
			};
		};

		i2c@80110000 {
			synaptics@4b {
				/* Synaptics RMI4 TM1217 touchscreen */
				compatible = "syna,rmi4-i2c";
				#address-cells = <1>;
				#size-cells = <0>;
				reg = <0x4b>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&synaptics_tvk_mode>;
				interrupt-parent = <&gpio2>;
				interrupts = <20 IRQ_TYPE_EDGE_FALLING>;

				rmi-f01@1 {
					reg = <0x1>;
					syna,nosleep = <1>;
				};
				rmi-f11@11 {
					reg = <0x11>;
					touchscreen-inverted-x;
					syna,sensor-type = <1>;
				};
			};
		};

		pinctrl {
			/* Pull up this GPIO pin */
			tc35893 {
				tc35893_tvk_mode: tc35893_tvk {
					tvk_cfg {
						pins = "GPIO218_AH11";
						ste,config = <&gpio_in_pu>;
					};
				};
			};
			prox {
				prox_tvk_mode: prox_tvk {
					tvk_cfg {
						pins = "GPIO217_AH12";
						ste,config = <&gpio_in_pu>;
					};
				};
			};
			hall {
				hall_tvk_mode: hall_tvk {
					tvk_cfg {
						pins = "GPIO145_C13";
						ste,config = <&gpio_in_pu>;
					};
				};
			};
			accelerometer {
				accel_tvk_mode: accel_tvk {
					/* Accelerometer interrupt lines 1 & 2 */
					tvk_cfg {
						pins = "GPIO82_C1", "GPIO83_D3";
						ste,config = <&gpio_in_pd>;
					};
				};
			};
			gyroscope {
				/*
				 * These lines are shared between Gyroscope l3g400dh
				 * and AK8974 magnetometer.
				 */
				gyro_magn_tvk_mode: gyro_magn_tvk {
					 /* GPIO 31 used for INT pull down the line */
					tvk_cfg1 {
						pins = "GPIO31_V3";
						ste,config = <&gpio_in_pd>;
					};
					/* GPIO 32 used for DRDY, pull this down */
					tvk_cfg2 {
						pins = "GPIO32_V2";
						ste,config = <&gpio_in_pd>;
					};
				};
			};
			synaptics {
				synaptics_tvk_mode: synaptics_tvk {
					/* Touchscreen uses GPIO 84 */
					tvk_cfg1 {
						pins = "GPIO84_C2";
						ste,config = <&gpio_in_pu>;
					};
				};
			};
		};

		mcde@a0350000 {
			status = "okay";

			dsi@a0351000 {
				panel {
					compatible = "samsung,s6d16d0";
					reg = <0>;
					vdd1-supply = <&ab8500_ldo_aux1_reg>;
					reset-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
				};
			};
		};
	};
};
