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