mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 17:54:13 +08:00
810ad7b62c
The legacy i2c binding model is phasing out, so the ams driver needs to be converted to a new-style i2c driver. Here is a naive approach of this conversion. Basically it is moving the i2c device creation from the ams driver to the i2c-powermac driver. This should work, but I suspect we could come up with something cleaner by declaring the i2c device as part of the platform setup. This could be done later by someone more familiar with openfirmware-based platforms than I am myself. One nice thing brought by this conversion is that the ams driver should be loaded automatically on systems where is is needed (at least when the I2C interface to the chip is used) providing coldplug-aware user-space environment. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Johannes Berg <johannes@sipsolutions.net> Cc: Stelian Pop <stelian@popies.net> Cc: Michael Hanselmann <linux-kernel@hansmi.ch> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
70 lines
1.3 KiB
C
70 lines
1.3 KiB
C
#include <linux/i2c.h>
|
|
#include <linux/input-polldev.h>
|
|
#include <linux/kthread.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/types.h>
|
|
#include <linux/of_device.h>
|
|
|
|
enum ams_irq {
|
|
AMS_IRQ_FREEFALL = 0x01,
|
|
AMS_IRQ_SHOCK = 0x02,
|
|
AMS_IRQ_GLOBAL = 0x04,
|
|
AMS_IRQ_ALL =
|
|
AMS_IRQ_FREEFALL |
|
|
AMS_IRQ_SHOCK |
|
|
AMS_IRQ_GLOBAL,
|
|
};
|
|
|
|
struct ams {
|
|
/* Locks */
|
|
spinlock_t irq_lock;
|
|
struct mutex lock;
|
|
|
|
/* General properties */
|
|
struct device_node *of_node;
|
|
struct of_device *of_dev;
|
|
char has_device;
|
|
char vflag;
|
|
u32 orient1;
|
|
u32 orient2;
|
|
|
|
/* Interrupt worker */
|
|
struct work_struct worker;
|
|
u8 worker_irqs;
|
|
|
|
/* Implementation
|
|
*
|
|
* Only call these functions with the main lock held.
|
|
*/
|
|
void (*exit)(void);
|
|
|
|
void (*get_xyz)(s8 *x, s8 *y, s8 *z);
|
|
u8 (*get_vendor)(void);
|
|
|
|
void (*clear_irq)(enum ams_irq reg);
|
|
|
|
#ifdef CONFIG_SENSORS_AMS_I2C
|
|
/* I2C properties */
|
|
struct i2c_client *i2c_client;
|
|
#endif
|
|
|
|
/* Joystick emulation */
|
|
struct input_polled_dev *idev;
|
|
__u16 bustype;
|
|
|
|
/* calibrated null values */
|
|
int xcalib, ycalib, zcalib;
|
|
};
|
|
|
|
extern struct ams ams_info;
|
|
|
|
extern void ams_sensors(s8 *x, s8 *y, s8 *z);
|
|
extern int ams_sensor_attach(void);
|
|
|
|
extern int ams_pmu_init(struct device_node *np);
|
|
extern int ams_i2c_init(struct device_node *np);
|
|
|
|
extern int ams_input_init(void);
|
|
extern void ams_input_exit(void);
|