18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#include <linux/i2c.h> 38c2ecf20Sopenharmony_ci#include <linux/input.h> 48c2ecf20Sopenharmony_ci#include <linux/kthread.h> 58c2ecf20Sopenharmony_ci#include <linux/mutex.h> 68c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 78c2ecf20Sopenharmony_ci#include <linux/types.h> 88c2ecf20Sopenharmony_ci#include <linux/of_device.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_cienum ams_irq { 118c2ecf20Sopenharmony_ci AMS_IRQ_FREEFALL = 0x01, 128c2ecf20Sopenharmony_ci AMS_IRQ_SHOCK = 0x02, 138c2ecf20Sopenharmony_ci AMS_IRQ_GLOBAL = 0x04, 148c2ecf20Sopenharmony_ci AMS_IRQ_ALL = 158c2ecf20Sopenharmony_ci AMS_IRQ_FREEFALL | 168c2ecf20Sopenharmony_ci AMS_IRQ_SHOCK | 178c2ecf20Sopenharmony_ci AMS_IRQ_GLOBAL, 188c2ecf20Sopenharmony_ci}; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct ams { 218c2ecf20Sopenharmony_ci /* Locks */ 228c2ecf20Sopenharmony_ci spinlock_t irq_lock; 238c2ecf20Sopenharmony_ci struct mutex lock; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci /* General properties */ 268c2ecf20Sopenharmony_ci struct device_node *of_node; 278c2ecf20Sopenharmony_ci struct platform_device *of_dev; 288c2ecf20Sopenharmony_ci char has_device; 298c2ecf20Sopenharmony_ci char vflag; 308c2ecf20Sopenharmony_ci u32 orient1; 318c2ecf20Sopenharmony_ci u32 orient2; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci /* Interrupt worker */ 348c2ecf20Sopenharmony_ci struct work_struct worker; 358c2ecf20Sopenharmony_ci u8 worker_irqs; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci /* Implementation 388c2ecf20Sopenharmony_ci * 398c2ecf20Sopenharmony_ci * Only call these functions with the main lock held. 408c2ecf20Sopenharmony_ci */ 418c2ecf20Sopenharmony_ci void (*exit)(void); 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci void (*get_xyz)(s8 *x, s8 *y, s8 *z); 448c2ecf20Sopenharmony_ci u8 (*get_vendor)(void); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci void (*clear_irq)(enum ams_irq reg); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#ifdef CONFIG_SENSORS_AMS_I2C 498c2ecf20Sopenharmony_ci /* I2C properties */ 508c2ecf20Sopenharmony_ci struct i2c_client *i2c_client; 518c2ecf20Sopenharmony_ci#endif 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci /* Joystick emulation */ 548c2ecf20Sopenharmony_ci struct input_dev *idev; 558c2ecf20Sopenharmony_ci __u16 bustype; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci /* calibrated null values */ 588c2ecf20Sopenharmony_ci int xcalib, ycalib, zcalib; 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ciextern struct ams ams_info; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ciextern void ams_sensors(s8 *x, s8 *y, s8 *z); 648c2ecf20Sopenharmony_ciextern int ams_sensor_attach(void); 658c2ecf20Sopenharmony_ciextern void ams_sensor_detach(void); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ciextern int ams_pmu_init(struct device_node *np); 688c2ecf20Sopenharmony_ciextern int ams_i2c_init(struct device_node *np); 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ciextern int ams_input_init(void); 718c2ecf20Sopenharmony_ciextern void ams_input_exit(void); 72