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