162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _AMS_H
362306a36Sopenharmony_ci#define _AMS_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/i2c.h>
662306a36Sopenharmony_ci#include <linux/input.h>
762306a36Sopenharmony_ci#include <linux/kthread.h>
862306a36Sopenharmony_ci#include <linux/mutex.h>
962306a36Sopenharmony_ci#include <linux/platform_device.h>
1062306a36Sopenharmony_ci#include <linux/spinlock.h>
1162306a36Sopenharmony_ci#include <linux/types.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cienum ams_irq {
1462306a36Sopenharmony_ci	AMS_IRQ_FREEFALL = 0x01,
1562306a36Sopenharmony_ci	AMS_IRQ_SHOCK = 0x02,
1662306a36Sopenharmony_ci	AMS_IRQ_GLOBAL = 0x04,
1762306a36Sopenharmony_ci	AMS_IRQ_ALL =
1862306a36Sopenharmony_ci		AMS_IRQ_FREEFALL |
1962306a36Sopenharmony_ci		AMS_IRQ_SHOCK |
2062306a36Sopenharmony_ci		AMS_IRQ_GLOBAL,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct ams {
2462306a36Sopenharmony_ci	/* Locks */
2562306a36Sopenharmony_ci	spinlock_t irq_lock;
2662306a36Sopenharmony_ci	struct mutex lock;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	/* General properties */
2962306a36Sopenharmony_ci	struct device_node *of_node;
3062306a36Sopenharmony_ci	struct platform_device *of_dev;
3162306a36Sopenharmony_ci	char has_device;
3262306a36Sopenharmony_ci	char vflag;
3362306a36Sopenharmony_ci	u32 orient1;
3462306a36Sopenharmony_ci	u32 orient2;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	/* Interrupt worker */
3762306a36Sopenharmony_ci	struct work_struct worker;
3862306a36Sopenharmony_ci	u8 worker_irqs;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	/* Implementation
4162306a36Sopenharmony_ci	 *
4262306a36Sopenharmony_ci	 * Only call these functions with the main lock held.
4362306a36Sopenharmony_ci	 */
4462306a36Sopenharmony_ci	void (*exit)(void);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	void (*get_xyz)(s8 *x, s8 *y, s8 *z);
4762306a36Sopenharmony_ci	u8 (*get_vendor)(void);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	void (*clear_irq)(enum ams_irq reg);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#ifdef CONFIG_SENSORS_AMS_I2C
5262306a36Sopenharmony_ci	/* I2C properties */
5362306a36Sopenharmony_ci	struct i2c_client *i2c_client;
5462306a36Sopenharmony_ci#endif
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	/* Joystick emulation */
5762306a36Sopenharmony_ci	struct input_dev *idev;
5862306a36Sopenharmony_ci	__u16 bustype;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	/* calibrated null values */
6162306a36Sopenharmony_ci	int xcalib, ycalib, zcalib;
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciextern struct ams ams_info;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciextern void ams_sensors(s8 *x, s8 *y, s8 *z);
6762306a36Sopenharmony_ciextern int ams_sensor_attach(void);
6862306a36Sopenharmony_ciextern void ams_sensor_detach(void);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciextern int ams_pmu_init(struct device_node *np);
7162306a36Sopenharmony_ciextern int ams_i2c_init(struct device_node *np);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ciextern int ams_input_init(void);
7462306a36Sopenharmony_ciextern void ams_input_exit(void);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#endif /* _AMS_H */
77