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