18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#include <linux/i2c.h>
38c2ecf20Sopenharmony_ci#include <linux/input.h>
48c2ecf20Sopenharmony_ci#include <linux/kthread.h>
58c2ecf20Sopenharmony_ci#include <linux/mutex.h>
68c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
78c2ecf20Sopenharmony_ci#include <linux/types.h>
88c2ecf20Sopenharmony_ci#include <linux/of_device.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cienum ams_irq {
118c2ecf20Sopenharmony_ci	AMS_IRQ_FREEFALL = 0x01,
128c2ecf20Sopenharmony_ci	AMS_IRQ_SHOCK = 0x02,
138c2ecf20Sopenharmony_ci	AMS_IRQ_GLOBAL = 0x04,
148c2ecf20Sopenharmony_ci	AMS_IRQ_ALL =
158c2ecf20Sopenharmony_ci		AMS_IRQ_FREEFALL |
168c2ecf20Sopenharmony_ci		AMS_IRQ_SHOCK |
178c2ecf20Sopenharmony_ci		AMS_IRQ_GLOBAL,
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistruct ams {
218c2ecf20Sopenharmony_ci	/* Locks */
228c2ecf20Sopenharmony_ci	spinlock_t irq_lock;
238c2ecf20Sopenharmony_ci	struct mutex lock;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	/* General properties */
268c2ecf20Sopenharmony_ci	struct device_node *of_node;
278c2ecf20Sopenharmony_ci	struct platform_device *of_dev;
288c2ecf20Sopenharmony_ci	char has_device;
298c2ecf20Sopenharmony_ci	char vflag;
308c2ecf20Sopenharmony_ci	u32 orient1;
318c2ecf20Sopenharmony_ci	u32 orient2;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	/* Interrupt worker */
348c2ecf20Sopenharmony_ci	struct work_struct worker;
358c2ecf20Sopenharmony_ci	u8 worker_irqs;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	/* Implementation
388c2ecf20Sopenharmony_ci	 *
398c2ecf20Sopenharmony_ci	 * Only call these functions with the main lock held.
408c2ecf20Sopenharmony_ci	 */
418c2ecf20Sopenharmony_ci	void (*exit)(void);
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	void (*get_xyz)(s8 *x, s8 *y, s8 *z);
448c2ecf20Sopenharmony_ci	u8 (*get_vendor)(void);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	void (*clear_irq)(enum ams_irq reg);
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#ifdef CONFIG_SENSORS_AMS_I2C
498c2ecf20Sopenharmony_ci	/* I2C properties */
508c2ecf20Sopenharmony_ci	struct i2c_client *i2c_client;
518c2ecf20Sopenharmony_ci#endif
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	/* Joystick emulation */
548c2ecf20Sopenharmony_ci	struct input_dev *idev;
558c2ecf20Sopenharmony_ci	__u16 bustype;
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	/* calibrated null values */
588c2ecf20Sopenharmony_ci	int xcalib, ycalib, zcalib;
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ciextern struct ams ams_info;
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ciextern void ams_sensors(s8 *x, s8 *y, s8 *z);
648c2ecf20Sopenharmony_ciextern int ams_sensor_attach(void);
658c2ecf20Sopenharmony_ciextern void ams_sensor_detach(void);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ciextern int ams_pmu_init(struct device_node *np);
688c2ecf20Sopenharmony_ciextern int ams_i2c_init(struct device_node *np);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ciextern int ams_input_init(void);
718c2ecf20Sopenharmony_ciextern void ams_input_exit(void);
72