1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #include <linux/i2c.h> 3 #include <linux/input.h> 4 #include <linux/kthread.h> 5 #include <linux/mutex.h> 6 #include <linux/spinlock.h> 7 #include <linux/types.h> 8 #include <linux/of_device.h> 9 10 enum ams_irq { 11 AMS_IRQ_FREEFALL = 0x01, 12 AMS_IRQ_SHOCK = 0x02, 13 AMS_IRQ_GLOBAL = 0x04, 14 AMS_IRQ_ALL = 15 AMS_IRQ_FREEFALL | 16 AMS_IRQ_SHOCK | 17 AMS_IRQ_GLOBAL, 18 }; 19 20 struct ams { 21 /* Locks */ 22 spinlock_t irq_lock; 23 struct mutex lock; 24 25 /* General properties */ 26 struct device_node *of_node; 27 struct platform_device *of_dev; 28 char has_device; 29 char vflag; 30 u32 orient1; 31 u32 orient2; 32 33 /* Interrupt worker */ 34 struct work_struct worker; 35 u8 worker_irqs; 36 37 /* Implementation 38 * 39 * Only call these functions with the main lock held. 40 */ 41 void (*exit)(void); 42 43 void (*get_xyz)(s8 *x, s8 *y, s8 *z); 44 u8 (*get_vendor)(void); 45 46 void (*clear_irq)(enum ams_irq reg); 47 48 #ifdef CONFIG_SENSORS_AMS_I2C 49 /* I2C properties */ 50 struct i2c_client *i2c_client; 51 #endif 52 53 /* Joystick emulation */ 54 struct input_dev *idev; 55 __u16 bustype; 56 57 /* calibrated null values */ 58 int xcalib, ycalib, zcalib; 59 }; 60 61 extern struct ams ams_info; 62 63 extern void ams_sensors(s8 *x, s8 *y, s8 *z); 64 extern int ams_sensor_attach(void); 65 extern void ams_sensor_detach(void); 66 67 extern int ams_pmu_init(struct device_node *np); 68 extern int ams_i2c_init(struct device_node *np); 69 70 extern int ams_input_init(void); 71 extern void ams_input_exit(void); 72