1e8e70d83SChris Hudson /* 2e8e70d83SChris Hudson * Copyright (C) 2011 Kionix, Inc. 3e8e70d83SChris Hudson * Written by Chris Hudson <chudson@kionix.com> 4e8e70d83SChris Hudson * 5e8e70d83SChris Hudson * This program is free software; you can redistribute it and/or modify 6e8e70d83SChris Hudson * it under the terms of the GNU General Public License version 2 as 7e8e70d83SChris Hudson * published by the Free Software Foundation. 8e8e70d83SChris Hudson * 9e8e70d83SChris Hudson * This program is distributed in the hope that it will be useful, 10e8e70d83SChris Hudson * but WITHOUT ANY WARRANTY; without even the implied warranty of 11e8e70d83SChris Hudson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12e8e70d83SChris Hudson * GNU General Public License for more details. 13e8e70d83SChris Hudson * 14e8e70d83SChris Hudson * You should have received a copy of the GNU General Public License 15e8e70d83SChris Hudson * along with this program; if not, write to the Free Software 16e8e70d83SChris Hudson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17e8e70d83SChris Hudson * 02111-1307, USA 18e8e70d83SChris Hudson */ 19e8e70d83SChris Hudson 20e8e70d83SChris Hudson #include <linux/delay.h> 21e8e70d83SChris Hudson #include <linux/i2c.h> 22e8e70d83SChris Hudson #include <linux/input.h> 23e8e70d83SChris Hudson #include <linux/interrupt.h> 24e8e70d83SChris Hudson #include <linux/slab.h> 25e8e70d83SChris Hudson #include <linux/input/kxtj9.h> 26e8e70d83SChris Hudson #include <linux/input-polldev.h> 27e8e70d83SChris Hudson 28e8e70d83SChris Hudson #define NAME "kxtj9" 29e8e70d83SChris Hudson #define G_MAX 8000 30e8e70d83SChris Hudson /* OUTPUT REGISTERS */ 31e8e70d83SChris Hudson #define XOUT_L 0x06 32e8e70d83SChris Hudson #define WHO_AM_I 0x0F 33e8e70d83SChris Hudson /* CONTROL REGISTERS */ 34e8e70d83SChris Hudson #define INT_REL 0x1A 35e8e70d83SChris Hudson #define CTRL_REG1 0x1B 36e8e70d83SChris Hudson #define INT_CTRL1 0x1E 37e8e70d83SChris Hudson #define DATA_CTRL 0x21 38e8e70d83SChris Hudson /* CONTROL REGISTER 1 BITS */ 39e8e70d83SChris Hudson #define PC1_OFF 0x7F 40e8e70d83SChris Hudson #define PC1_ON (1 << 7) 41e8e70d83SChris Hudson /* Data ready funtion enable bit: set during probe if using irq mode */ 42e8e70d83SChris Hudson #define DRDYE (1 << 5) 43e8e70d83SChris Hudson /* INTERRUPT CONTROL REGISTER 1 BITS */ 44e8e70d83SChris Hudson /* Set these during probe if using irq mode */ 45e8e70d83SChris Hudson #define KXTJ9_IEL (1 << 3) 46e8e70d83SChris Hudson #define KXTJ9_IEA (1 << 4) 47e8e70d83SChris Hudson #define KXTJ9_IEN (1 << 5) 48e8e70d83SChris Hudson /* INPUT_ABS CONSTANTS */ 49e8e70d83SChris Hudson #define FUZZ 3 50e8e70d83SChris Hudson #define FLAT 3 51e8e70d83SChris Hudson /* RESUME STATE INDICES */ 52e8e70d83SChris Hudson #define RES_DATA_CTRL 0 53e8e70d83SChris Hudson #define RES_CTRL_REG1 1 54e8e70d83SChris Hudson #define RES_INT_CTRL1 2 55e8e70d83SChris Hudson #define RESUME_ENTRIES 3 56e8e70d83SChris Hudson 57e8e70d83SChris Hudson /* 58e8e70d83SChris Hudson * The following table lists the maximum appropriate poll interval for each 59e8e70d83SChris Hudson * available output data rate. 60e8e70d83SChris Hudson */ 61e8e70d83SChris Hudson static const struct { 62e8e70d83SChris Hudson unsigned int cutoff; 63e8e70d83SChris Hudson u8 mask; 64e8e70d83SChris Hudson } kxtj9_odr_table[] = { 65e8e70d83SChris Hudson { 3, ODR800F }, 66e8e70d83SChris Hudson { 5, ODR400F }, 67e8e70d83SChris Hudson { 10, ODR200F }, 68e8e70d83SChris Hudson { 20, ODR100F }, 69e8e70d83SChris Hudson { 40, ODR50F }, 70e8e70d83SChris Hudson { 80, ODR25F }, 71e8e70d83SChris Hudson { 0, ODR12_5F}, 72e8e70d83SChris Hudson }; 73e8e70d83SChris Hudson 74e8e70d83SChris Hudson struct kxtj9_data { 75e8e70d83SChris Hudson struct i2c_client *client; 76e8e70d83SChris Hudson struct kxtj9_platform_data pdata; 77e8e70d83SChris Hudson struct input_dev *input_dev; 78e8e70d83SChris Hudson #ifdef CONFIG_INPUT_KXTJ9_POLLED_MODE 79e8e70d83SChris Hudson struct input_polled_dev *poll_dev; 80e8e70d83SChris Hudson #endif 81e8e70d83SChris Hudson unsigned int last_poll_interval; 82e8e70d83SChris Hudson u8 shift; 83e8e70d83SChris Hudson u8 ctrl_reg1; 84e8e70d83SChris Hudson u8 data_ctrl; 85e8e70d83SChris Hudson u8 int_ctrl; 86e8e70d83SChris Hudson }; 87e8e70d83SChris Hudson 88e8e70d83SChris Hudson static int kxtj9_i2c_read(struct kxtj9_data *tj9, u8 addr, u8 *data, int len) 89e8e70d83SChris Hudson { 90e8e70d83SChris Hudson struct i2c_msg msgs[] = { 91e8e70d83SChris Hudson { 92e8e70d83SChris Hudson .addr = tj9->client->addr, 93e8e70d83SChris Hudson .flags = tj9->client->flags, 94e8e70d83SChris Hudson .len = 1, 95e8e70d83SChris Hudson .buf = &addr, 96e8e70d83SChris Hudson }, 97e8e70d83SChris Hudson { 98e8e70d83SChris Hudson .addr = tj9->client->addr, 99e8e70d83SChris Hudson .flags = tj9->client->flags | I2C_M_RD, 100e8e70d83SChris Hudson .len = len, 101e8e70d83SChris Hudson .buf = data, 102e8e70d83SChris Hudson }, 103e8e70d83SChris Hudson }; 104e8e70d83SChris Hudson 105e8e70d83SChris Hudson return i2c_transfer(tj9->client->adapter, msgs, 2); 106e8e70d83SChris Hudson } 107e8e70d83SChris Hudson 108e8e70d83SChris Hudson static void kxtj9_report_acceleration_data(struct kxtj9_data *tj9) 109e8e70d83SChris Hudson { 110e8e70d83SChris Hudson s16 acc_data[3]; /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ 111e8e70d83SChris Hudson s16 x, y, z; 112e8e70d83SChris Hudson int err; 113e8e70d83SChris Hudson 114e8e70d83SChris Hudson err = kxtj9_i2c_read(tj9, XOUT_L, (u8 *)acc_data, 6); 115e8e70d83SChris Hudson if (err < 0) 116e8e70d83SChris Hudson dev_err(&tj9->client->dev, "accelerometer data read failed\n"); 117e8e70d83SChris Hudson 118e8e70d83SChris Hudson x = le16_to_cpu(acc_data[tj9->pdata.axis_map_x]) >> tj9->shift; 119e8e70d83SChris Hudson y = le16_to_cpu(acc_data[tj9->pdata.axis_map_y]) >> tj9->shift; 120e8e70d83SChris Hudson z = le16_to_cpu(acc_data[tj9->pdata.axis_map_z]) >> tj9->shift; 121e8e70d83SChris Hudson 122e8e70d83SChris Hudson input_report_abs(tj9->input_dev, ABS_X, tj9->pdata.negate_x ? -x : x); 123e8e70d83SChris Hudson input_report_abs(tj9->input_dev, ABS_Y, tj9->pdata.negate_y ? -y : y); 124e8e70d83SChris Hudson input_report_abs(tj9->input_dev, ABS_Z, tj9->pdata.negate_z ? -z : z); 125e8e70d83SChris Hudson input_sync(tj9->input_dev); 126e8e70d83SChris Hudson } 127e8e70d83SChris Hudson 128e8e70d83SChris Hudson static irqreturn_t kxtj9_isr(int irq, void *dev) 129e8e70d83SChris Hudson { 130e8e70d83SChris Hudson struct kxtj9_data *tj9 = dev; 131e8e70d83SChris Hudson int err; 132e8e70d83SChris Hudson 133e8e70d83SChris Hudson /* data ready is the only possible interrupt type */ 134e8e70d83SChris Hudson kxtj9_report_acceleration_data(tj9); 135e8e70d83SChris Hudson 136e8e70d83SChris Hudson err = i2c_smbus_read_byte_data(tj9->client, INT_REL); 137e8e70d83SChris Hudson if (err < 0) 138e8e70d83SChris Hudson dev_err(&tj9->client->dev, 139e8e70d83SChris Hudson "error clearing interrupt status: %d\n", err); 140e8e70d83SChris Hudson 141e8e70d83SChris Hudson return IRQ_HANDLED; 142e8e70d83SChris Hudson } 143e8e70d83SChris Hudson 144e8e70d83SChris Hudson static int kxtj9_update_g_range(struct kxtj9_data *tj9, u8 new_g_range) 145e8e70d83SChris Hudson { 146e8e70d83SChris Hudson switch (new_g_range) { 147e8e70d83SChris Hudson case KXTJ9_G_2G: 148e8e70d83SChris Hudson tj9->shift = 4; 149e8e70d83SChris Hudson break; 150e8e70d83SChris Hudson case KXTJ9_G_4G: 151e8e70d83SChris Hudson tj9->shift = 3; 152e8e70d83SChris Hudson break; 153e8e70d83SChris Hudson case KXTJ9_G_8G: 154e8e70d83SChris Hudson tj9->shift = 2; 155e8e70d83SChris Hudson break; 156e8e70d83SChris Hudson default: 157e8e70d83SChris Hudson return -EINVAL; 158e8e70d83SChris Hudson } 159e8e70d83SChris Hudson 160e8e70d83SChris Hudson tj9->ctrl_reg1 &= 0xe7; 161e8e70d83SChris Hudson tj9->ctrl_reg1 |= new_g_range; 162e8e70d83SChris Hudson 163e8e70d83SChris Hudson return 0; 164e8e70d83SChris Hudson } 165e8e70d83SChris Hudson 166e8e70d83SChris Hudson static int kxtj9_update_odr(struct kxtj9_data *tj9, unsigned int poll_interval) 167e8e70d83SChris Hudson { 168e8e70d83SChris Hudson int err; 169e8e70d83SChris Hudson int i; 170e8e70d83SChris Hudson 171e8e70d83SChris Hudson /* Use the lowest ODR that can support the requested poll interval */ 172e8e70d83SChris Hudson for (i = 0; i < ARRAY_SIZE(kxtj9_odr_table); i++) { 173e8e70d83SChris Hudson tj9->data_ctrl = kxtj9_odr_table[i].mask; 174e8e70d83SChris Hudson if (poll_interval < kxtj9_odr_table[i].cutoff) 175e8e70d83SChris Hudson break; 176e8e70d83SChris Hudson } 177e8e70d83SChris Hudson 178e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, 0); 179e8e70d83SChris Hudson if (err < 0) 180e8e70d83SChris Hudson return err; 181e8e70d83SChris Hudson 182e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, DATA_CTRL, tj9->data_ctrl); 183e8e70d83SChris Hudson if (err < 0) 184e8e70d83SChris Hudson return err; 185e8e70d83SChris Hudson 186e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); 187e8e70d83SChris Hudson if (err < 0) 188e8e70d83SChris Hudson return err; 189e8e70d83SChris Hudson 190e8e70d83SChris Hudson return 0; 191e8e70d83SChris Hudson } 192e8e70d83SChris Hudson 193e8e70d83SChris Hudson static int kxtj9_device_power_on(struct kxtj9_data *tj9) 194e8e70d83SChris Hudson { 195e8e70d83SChris Hudson if (tj9->pdata.power_on) 196e8e70d83SChris Hudson return tj9->pdata.power_on(); 197e8e70d83SChris Hudson 198e8e70d83SChris Hudson return 0; 199e8e70d83SChris Hudson } 200e8e70d83SChris Hudson 201e8e70d83SChris Hudson static void kxtj9_device_power_off(struct kxtj9_data *tj9) 202e8e70d83SChris Hudson { 203e8e70d83SChris Hudson int err; 204e8e70d83SChris Hudson 205e8e70d83SChris Hudson tj9->ctrl_reg1 &= PC1_OFF; 206e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); 207e8e70d83SChris Hudson if (err < 0) 208e8e70d83SChris Hudson dev_err(&tj9->client->dev, "soft power off failed\n"); 209e8e70d83SChris Hudson 210e8e70d83SChris Hudson if (tj9->pdata.power_off) 211e8e70d83SChris Hudson tj9->pdata.power_off(); 212e8e70d83SChris Hudson } 213e8e70d83SChris Hudson 214e8e70d83SChris Hudson static int kxtj9_enable(struct kxtj9_data *tj9) 215e8e70d83SChris Hudson { 216e8e70d83SChris Hudson int err; 217e8e70d83SChris Hudson 218e8e70d83SChris Hudson err = kxtj9_device_power_on(tj9); 219e8e70d83SChris Hudson if (err < 0) 220e8e70d83SChris Hudson return err; 221e8e70d83SChris Hudson 222e8e70d83SChris Hudson /* ensure that PC1 is cleared before updating control registers */ 223e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, 0); 224e8e70d83SChris Hudson if (err < 0) 225e8e70d83SChris Hudson return err; 226e8e70d83SChris Hudson 227e8e70d83SChris Hudson /* only write INT_CTRL_REG1 if in irq mode */ 228e8e70d83SChris Hudson if (tj9->client->irq) { 229e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, 230e8e70d83SChris Hudson INT_CTRL1, tj9->int_ctrl); 231e8e70d83SChris Hudson if (err < 0) 232e8e70d83SChris Hudson return err; 233e8e70d83SChris Hudson } 234e8e70d83SChris Hudson 235e8e70d83SChris Hudson err = kxtj9_update_g_range(tj9, tj9->pdata.g_range); 236e8e70d83SChris Hudson if (err < 0) 237e8e70d83SChris Hudson return err; 238e8e70d83SChris Hudson 239e8e70d83SChris Hudson /* turn on outputs */ 240e8e70d83SChris Hudson tj9->ctrl_reg1 |= PC1_ON; 241e8e70d83SChris Hudson err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); 242e8e70d83SChris Hudson if (err < 0) 243e8e70d83SChris Hudson return err; 244e8e70d83SChris Hudson 245e8e70d83SChris Hudson err = kxtj9_update_odr(tj9, tj9->last_poll_interval); 246e8e70d83SChris Hudson if (err < 0) 247e8e70d83SChris Hudson return err; 248e8e70d83SChris Hudson 249e8e70d83SChris Hudson /* clear initial interrupt if in irq mode */ 250e8e70d83SChris Hudson if (tj9->client->irq) { 251e8e70d83SChris Hudson err = i2c_smbus_read_byte_data(tj9->client, INT_REL); 252e8e70d83SChris Hudson if (err < 0) { 253e8e70d83SChris Hudson dev_err(&tj9->client->dev, 254e8e70d83SChris Hudson "error clearing interrupt: %d\n", err); 255e8e70d83SChris Hudson goto fail; 256e8e70d83SChris Hudson } 257e8e70d83SChris Hudson } 258e8e70d83SChris Hudson 259e8e70d83SChris Hudson return 0; 260e8e70d83SChris Hudson 261e8e70d83SChris Hudson fail: 262e8e70d83SChris Hudson kxtj9_device_power_off(tj9); 263e8e70d83SChris Hudson return err; 264e8e70d83SChris Hudson } 265e8e70d83SChris Hudson 266e8e70d83SChris Hudson static void kxtj9_disable(struct kxtj9_data *tj9) 267e8e70d83SChris Hudson { 268e8e70d83SChris Hudson kxtj9_device_power_off(tj9); 269e8e70d83SChris Hudson } 270e8e70d83SChris Hudson 271e8e70d83SChris Hudson static int kxtj9_input_open(struct input_dev *input) 272e8e70d83SChris Hudson { 273e8e70d83SChris Hudson struct kxtj9_data *tj9 = input_get_drvdata(input); 274e8e70d83SChris Hudson 275e8e70d83SChris Hudson return kxtj9_enable(tj9); 276e8e70d83SChris Hudson } 277e8e70d83SChris Hudson 278e8e70d83SChris Hudson static void kxtj9_input_close(struct input_dev *dev) 279e8e70d83SChris Hudson { 280e8e70d83SChris Hudson struct kxtj9_data *tj9 = input_get_drvdata(dev); 281e8e70d83SChris Hudson 282e8e70d83SChris Hudson kxtj9_disable(tj9); 283e8e70d83SChris Hudson } 284e8e70d83SChris Hudson 285e8e70d83SChris Hudson static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9, 286e8e70d83SChris Hudson struct input_dev *input_dev) 287e8e70d83SChris Hudson { 288e8e70d83SChris Hudson __set_bit(EV_ABS, input_dev->evbit); 289e8e70d83SChris Hudson input_set_abs_params(input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT); 290e8e70d83SChris Hudson input_set_abs_params(input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT); 291e8e70d83SChris Hudson input_set_abs_params(input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT); 292e8e70d83SChris Hudson 293e8e70d83SChris Hudson input_dev->name = "kxtj9_accel"; 294e8e70d83SChris Hudson input_dev->id.bustype = BUS_I2C; 295e8e70d83SChris Hudson input_dev->dev.parent = &tj9->client->dev; 296e8e70d83SChris Hudson } 297e8e70d83SChris Hudson 298e8e70d83SChris Hudson static int __devinit kxtj9_setup_input_device(struct kxtj9_data *tj9) 299e8e70d83SChris Hudson { 300e8e70d83SChris Hudson struct input_dev *input_dev; 301e8e70d83SChris Hudson int err; 302e8e70d83SChris Hudson 303e8e70d83SChris Hudson input_dev = input_allocate_device(); 3044fd9fcf7SDan Carpenter if (!input_dev) { 305e8e70d83SChris Hudson dev_err(&tj9->client->dev, "input device allocate failed\n"); 306e8e70d83SChris Hudson return -ENOMEM; 307e8e70d83SChris Hudson } 308e8e70d83SChris Hudson 309e8e70d83SChris Hudson tj9->input_dev = input_dev; 310e8e70d83SChris Hudson 311e8e70d83SChris Hudson input_dev->open = kxtj9_input_open; 312e8e70d83SChris Hudson input_dev->close = kxtj9_input_close; 313e8e70d83SChris Hudson input_set_drvdata(input_dev, tj9); 314e8e70d83SChris Hudson 315e8e70d83SChris Hudson kxtj9_init_input_device(tj9, input_dev); 316e8e70d83SChris Hudson 317e8e70d83SChris Hudson err = input_register_device(tj9->input_dev); 318e8e70d83SChris Hudson if (err) { 319e8e70d83SChris Hudson dev_err(&tj9->client->dev, 320e8e70d83SChris Hudson "unable to register input polled device %s: %d\n", 321e8e70d83SChris Hudson tj9->input_dev->name, err); 322e8e70d83SChris Hudson input_free_device(tj9->input_dev); 323e8e70d83SChris Hudson return err; 324e8e70d83SChris Hudson } 325e8e70d83SChris Hudson 326e8e70d83SChris Hudson return 0; 327e8e70d83SChris Hudson } 328e8e70d83SChris Hudson 329e8e70d83SChris Hudson /* 330e8e70d83SChris Hudson * When IRQ mode is selected, we need to provide an interface to allow the user 331e8e70d83SChris Hudson * to change the output data rate of the part. For consistency, we are using 332e8e70d83SChris Hudson * the set_poll method, which accepts a poll interval in milliseconds, and then 333e8e70d83SChris Hudson * calls update_odr() while passing this value as an argument. In IRQ mode, the 334e8e70d83SChris Hudson * data outputs will not be read AT the requested poll interval, rather, the 335e8e70d83SChris Hudson * lowest ODR that can support the requested interval. The client application 336e8e70d83SChris Hudson * will be responsible for retrieving data from the input node at the desired 337e8e70d83SChris Hudson * interval. 338e8e70d83SChris Hudson */ 339e8e70d83SChris Hudson 340e8e70d83SChris Hudson /* Returns currently selected poll interval (in ms) */ 341e8e70d83SChris Hudson static ssize_t kxtj9_get_poll(struct device *dev, 342e8e70d83SChris Hudson struct device_attribute *attr, char *buf) 343e8e70d83SChris Hudson { 344e8e70d83SChris Hudson struct i2c_client *client = to_i2c_client(dev); 345e8e70d83SChris Hudson struct kxtj9_data *tj9 = i2c_get_clientdata(client); 346e8e70d83SChris Hudson 347e8e70d83SChris Hudson return sprintf(buf, "%d\n", tj9->last_poll_interval); 348e8e70d83SChris Hudson } 349e8e70d83SChris Hudson 350e8e70d83SChris Hudson /* Allow users to select a new poll interval (in ms) */ 351e8e70d83SChris Hudson static ssize_t kxtj9_set_poll(struct device *dev, struct device_attribute *attr, 352e8e70d83SChris Hudson const char *buf, size_t count) 353e8e70d83SChris Hudson { 354e8e70d83SChris Hudson struct i2c_client *client = to_i2c_client(dev); 355e8e70d83SChris Hudson struct kxtj9_data *tj9 = i2c_get_clientdata(client); 356e8e70d83SChris Hudson struct input_dev *input_dev = tj9->input_dev; 357e8e70d83SChris Hudson unsigned int interval; 358e8e70d83SChris Hudson int error; 359e8e70d83SChris Hudson 360e8e70d83SChris Hudson error = kstrtouint(buf, 10, &interval); 361e8e70d83SChris Hudson if (error < 0) 362e8e70d83SChris Hudson return error; 363e8e70d83SChris Hudson 364e8e70d83SChris Hudson /* Lock the device to prevent races with open/close (and itself) */ 365e8e70d83SChris Hudson mutex_unlock(&input_dev->mutex); 366e8e70d83SChris Hudson 367e8e70d83SChris Hudson disable_irq(client->irq); 368e8e70d83SChris Hudson 369e8e70d83SChris Hudson /* 370e8e70d83SChris Hudson * Set current interval to the greater of the minimum interval or 371e8e70d83SChris Hudson * the requested interval 372e8e70d83SChris Hudson */ 373e8e70d83SChris Hudson tj9->last_poll_interval = max(interval, tj9->pdata.min_interval); 374e8e70d83SChris Hudson 375e8e70d83SChris Hudson kxtj9_update_odr(tj9, tj9->last_poll_interval); 376e8e70d83SChris Hudson 377e8e70d83SChris Hudson enable_irq(client->irq); 378e8e70d83SChris Hudson mutex_unlock(&input_dev->mutex); 379e8e70d83SChris Hudson 380e8e70d83SChris Hudson return count; 381e8e70d83SChris Hudson } 382e8e70d83SChris Hudson 383e8e70d83SChris Hudson static DEVICE_ATTR(poll, S_IRUGO|S_IWUSR, kxtj9_get_poll, kxtj9_set_poll); 384e8e70d83SChris Hudson 385e8e70d83SChris Hudson static struct attribute *kxtj9_attributes[] = { 386e8e70d83SChris Hudson &dev_attr_poll.attr, 387e8e70d83SChris Hudson NULL 388e8e70d83SChris Hudson }; 389e8e70d83SChris Hudson 390e8e70d83SChris Hudson static struct attribute_group kxtj9_attribute_group = { 391e8e70d83SChris Hudson .attrs = kxtj9_attributes 392e8e70d83SChris Hudson }; 393e8e70d83SChris Hudson 394e8e70d83SChris Hudson 395e8e70d83SChris Hudson #ifdef CONFIG_INPUT_KXTJ9_POLLED_MODE 396e8e70d83SChris Hudson static void kxtj9_poll(struct input_polled_dev *dev) 397e8e70d83SChris Hudson { 398e8e70d83SChris Hudson struct kxtj9_data *tj9 = dev->private; 399e8e70d83SChris Hudson unsigned int poll_interval = dev->poll_interval; 400e8e70d83SChris Hudson 401e8e70d83SChris Hudson kxtj9_report_acceleration_data(tj9); 402e8e70d83SChris Hudson 403e8e70d83SChris Hudson if (poll_interval != tj9->last_poll_interval) { 404e8e70d83SChris Hudson kxtj9_update_odr(tj9, poll_interval); 405e8e70d83SChris Hudson tj9->last_poll_interval = poll_interval; 406e8e70d83SChris Hudson } 407e8e70d83SChris Hudson } 408e8e70d83SChris Hudson 409e8e70d83SChris Hudson static void kxtj9_polled_input_open(struct input_polled_dev *dev) 410e8e70d83SChris Hudson { 411e8e70d83SChris Hudson struct kxtj9_data *tj9 = dev->private; 412e8e70d83SChris Hudson 413e8e70d83SChris Hudson kxtj9_enable(tj9); 414e8e70d83SChris Hudson } 415e8e70d83SChris Hudson 416e8e70d83SChris Hudson static void kxtj9_polled_input_close(struct input_polled_dev *dev) 417e8e70d83SChris Hudson { 418e8e70d83SChris Hudson struct kxtj9_data *tj9 = dev->private; 419e8e70d83SChris Hudson 420e8e70d83SChris Hudson kxtj9_disable(tj9); 421e8e70d83SChris Hudson } 422e8e70d83SChris Hudson 423e8e70d83SChris Hudson static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9) 424e8e70d83SChris Hudson { 425e8e70d83SChris Hudson int err; 426e8e70d83SChris Hudson struct input_polled_dev *poll_dev; 427e8e70d83SChris Hudson poll_dev = input_allocate_polled_device(); 428e8e70d83SChris Hudson 429e8e70d83SChris Hudson if (!poll_dev) { 430e8e70d83SChris Hudson dev_err(&tj9->client->dev, 431e8e70d83SChris Hudson "Failed to allocate polled device\n"); 432e8e70d83SChris Hudson return -ENOMEM; 433e8e70d83SChris Hudson } 434e8e70d83SChris Hudson 435e8e70d83SChris Hudson tj9->poll_dev = poll_dev; 436e8e70d83SChris Hudson tj9->input_dev = poll_dev->input; 437e8e70d83SChris Hudson 438e8e70d83SChris Hudson poll_dev->private = tj9; 439e8e70d83SChris Hudson poll_dev->poll = kxtj9_poll; 440e8e70d83SChris Hudson poll_dev->open = kxtj9_polled_input_open; 441e8e70d83SChris Hudson poll_dev->close = kxtj9_polled_input_close; 442e8e70d83SChris Hudson 443e8e70d83SChris Hudson kxtj9_init_input_device(tj9, poll_dev->input); 444e8e70d83SChris Hudson 445e8e70d83SChris Hudson err = input_register_polled_device(poll_dev); 446e8e70d83SChris Hudson if (err) { 447e8e70d83SChris Hudson dev_err(&tj9->client->dev, 448e8e70d83SChris Hudson "Unable to register polled device, err=%d\n", err); 449e8e70d83SChris Hudson input_free_polled_device(poll_dev); 450e8e70d83SChris Hudson return err; 451e8e70d83SChris Hudson } 452e8e70d83SChris Hudson 453e8e70d83SChris Hudson return 0; 454e8e70d83SChris Hudson } 455e8e70d83SChris Hudson 456e8e70d83SChris Hudson static void __devexit kxtj9_teardown_polled_device(struct kxtj9_data *tj9) 457e8e70d83SChris Hudson { 458e8e70d83SChris Hudson input_unregister_polled_device(tj9->poll_dev); 459e8e70d83SChris Hudson input_free_polled_device(tj9->poll_dev); 460e8e70d83SChris Hudson } 461e8e70d83SChris Hudson 462e8e70d83SChris Hudson #else 463e8e70d83SChris Hudson 464e8e70d83SChris Hudson static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9) 465e8e70d83SChris Hudson { 466e8e70d83SChris Hudson return -ENOSYS; 467e8e70d83SChris Hudson } 468e8e70d83SChris Hudson 469e8e70d83SChris Hudson static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) 470e8e70d83SChris Hudson { 471e8e70d83SChris Hudson } 472e8e70d83SChris Hudson 473e8e70d83SChris Hudson #endif 474e8e70d83SChris Hudson 475e8e70d83SChris Hudson static int __devinit kxtj9_verify(struct kxtj9_data *tj9) 476e8e70d83SChris Hudson { 477e8e70d83SChris Hudson int retval; 478e8e70d83SChris Hudson 479e8e70d83SChris Hudson retval = kxtj9_device_power_on(tj9); 480e8e70d83SChris Hudson if (retval < 0) 481e8e70d83SChris Hudson return retval; 482e8e70d83SChris Hudson 483e8e70d83SChris Hudson retval = i2c_smbus_read_byte_data(tj9->client, WHO_AM_I); 484e8e70d83SChris Hudson if (retval < 0) { 485e8e70d83SChris Hudson dev_err(&tj9->client->dev, "read err int source\n"); 486e8e70d83SChris Hudson goto out; 487e8e70d83SChris Hudson } 488e8e70d83SChris Hudson 489e8e70d83SChris Hudson retval = retval != 0x06 ? -EIO : 0; 490e8e70d83SChris Hudson 491e8e70d83SChris Hudson out: 492e8e70d83SChris Hudson kxtj9_device_power_off(tj9); 493e8e70d83SChris Hudson return retval; 494e8e70d83SChris Hudson } 495e8e70d83SChris Hudson 496e8e70d83SChris Hudson static int __devinit kxtj9_probe(struct i2c_client *client, 497e8e70d83SChris Hudson const struct i2c_device_id *id) 498e8e70d83SChris Hudson { 499e8e70d83SChris Hudson const struct kxtj9_platform_data *pdata = client->dev.platform_data; 500e8e70d83SChris Hudson struct kxtj9_data *tj9; 501e8e70d83SChris Hudson int err; 502e8e70d83SChris Hudson 503e8e70d83SChris Hudson if (!i2c_check_functionality(client->adapter, 504e8e70d83SChris Hudson I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE_DATA)) { 505e8e70d83SChris Hudson dev_err(&client->dev, "client is not i2c capable\n"); 506e8e70d83SChris Hudson return -ENXIO; 507e8e70d83SChris Hudson } 508e8e70d83SChris Hudson 509e8e70d83SChris Hudson if (!pdata) { 510e8e70d83SChris Hudson dev_err(&client->dev, "platform data is NULL; exiting\n"); 511e8e70d83SChris Hudson return -EINVAL; 512e8e70d83SChris Hudson } 513e8e70d83SChris Hudson 514e8e70d83SChris Hudson tj9 = kzalloc(sizeof(*tj9), GFP_KERNEL); 515e8e70d83SChris Hudson if (!tj9) { 516e8e70d83SChris Hudson dev_err(&client->dev, 517e8e70d83SChris Hudson "failed to allocate memory for module data\n"); 518e8e70d83SChris Hudson return -ENOMEM; 519e8e70d83SChris Hudson } 520e8e70d83SChris Hudson 521e8e70d83SChris Hudson tj9->client = client; 522e8e70d83SChris Hudson tj9->pdata = *pdata; 523e8e70d83SChris Hudson 524e8e70d83SChris Hudson if (pdata->init) { 525e8e70d83SChris Hudson err = pdata->init(); 526e8e70d83SChris Hudson if (err < 0) 527e8e70d83SChris Hudson goto err_free_mem; 528e8e70d83SChris Hudson } 529e8e70d83SChris Hudson 530e8e70d83SChris Hudson err = kxtj9_verify(tj9); 531e8e70d83SChris Hudson if (err < 0) { 532e8e70d83SChris Hudson dev_err(&client->dev, "device not recognized\n"); 533e8e70d83SChris Hudson goto err_pdata_exit; 534e8e70d83SChris Hudson } 535e8e70d83SChris Hudson 536e8e70d83SChris Hudson i2c_set_clientdata(client, tj9); 537e8e70d83SChris Hudson 538e8e70d83SChris Hudson tj9->ctrl_reg1 = tj9->pdata.res_12bit | tj9->pdata.g_range; 539e8e70d83SChris Hudson tj9->data_ctrl = tj9->pdata.data_odr_init; 540e8e70d83SChris Hudson 541e8e70d83SChris Hudson if (client->irq) { 542e8e70d83SChris Hudson /* If in irq mode, populate INT_CTRL_REG1 and enable DRDY. */ 543e8e70d83SChris Hudson tj9->int_ctrl |= KXTJ9_IEN | KXTJ9_IEA | KXTJ9_IEL; 544e8e70d83SChris Hudson tj9->ctrl_reg1 |= DRDYE; 545e8e70d83SChris Hudson 546e8e70d83SChris Hudson err = kxtj9_setup_input_device(tj9); 547e8e70d83SChris Hudson if (err) 548e8e70d83SChris Hudson goto err_pdata_exit; 549e8e70d83SChris Hudson 550e8e70d83SChris Hudson err = request_threaded_irq(client->irq, NULL, kxtj9_isr, 551e8e70d83SChris Hudson IRQF_TRIGGER_RISING | IRQF_ONESHOT, 552e8e70d83SChris Hudson "kxtj9-irq", tj9); 553e8e70d83SChris Hudson if (err) { 554e8e70d83SChris Hudson dev_err(&client->dev, "request irq failed: %d\n", err); 555e8e70d83SChris Hudson goto err_destroy_input; 556e8e70d83SChris Hudson } 557e8e70d83SChris Hudson 558e8e70d83SChris Hudson err = sysfs_create_group(&client->dev.kobj, &kxtj9_attribute_group); 559e8e70d83SChris Hudson if (err) { 560e8e70d83SChris Hudson dev_err(&client->dev, "sysfs create failed: %d\n", err); 561e8e70d83SChris Hudson goto err_free_irq; 562e8e70d83SChris Hudson } 563e8e70d83SChris Hudson 564e8e70d83SChris Hudson } else { 565e8e70d83SChris Hudson err = kxtj9_setup_polled_device(tj9); 566e8e70d83SChris Hudson if (err) 567e8e70d83SChris Hudson goto err_pdata_exit; 568e8e70d83SChris Hudson } 569e8e70d83SChris Hudson 570e8e70d83SChris Hudson return 0; 571e8e70d83SChris Hudson 572e8e70d83SChris Hudson err_free_irq: 573e8e70d83SChris Hudson free_irq(client->irq, tj9); 574e8e70d83SChris Hudson err_destroy_input: 575e8e70d83SChris Hudson input_unregister_device(tj9->input_dev); 576e8e70d83SChris Hudson err_pdata_exit: 577e8e70d83SChris Hudson if (tj9->pdata.exit) 578e8e70d83SChris Hudson tj9->pdata.exit(); 579e8e70d83SChris Hudson err_free_mem: 580e8e70d83SChris Hudson kfree(tj9); 581e8e70d83SChris Hudson return err; 582e8e70d83SChris Hudson } 583e8e70d83SChris Hudson 584e8e70d83SChris Hudson static int __devexit kxtj9_remove(struct i2c_client *client) 585e8e70d83SChris Hudson { 586e8e70d83SChris Hudson struct kxtj9_data *tj9 = i2c_get_clientdata(client); 587e8e70d83SChris Hudson 588e8e70d83SChris Hudson if (client->irq) { 589e8e70d83SChris Hudson sysfs_remove_group(&client->dev.kobj, &kxtj9_attribute_group); 590e8e70d83SChris Hudson free_irq(client->irq, tj9); 591e8e70d83SChris Hudson input_unregister_device(tj9->input_dev); 592e8e70d83SChris Hudson } else { 593e8e70d83SChris Hudson kxtj9_teardown_polled_device(tj9); 594e8e70d83SChris Hudson } 595e8e70d83SChris Hudson 596e8e70d83SChris Hudson if (tj9->pdata.exit) 597e8e70d83SChris Hudson tj9->pdata.exit(); 598e8e70d83SChris Hudson 599e8e70d83SChris Hudson kfree(tj9); 600e8e70d83SChris Hudson 601e8e70d83SChris Hudson return 0; 602e8e70d83SChris Hudson } 603e8e70d83SChris Hudson 604e8e70d83SChris Hudson #ifdef CONFIG_PM_SLEEP 605e8e70d83SChris Hudson static int kxtj9_suspend(struct device *dev) 606e8e70d83SChris Hudson { 607e8e70d83SChris Hudson struct i2c_client *client = to_i2c_client(dev); 608e8e70d83SChris Hudson struct kxtj9_data *tj9 = i2c_get_clientdata(client); 609e8e70d83SChris Hudson struct input_dev *input_dev = tj9->input_dev; 610e8e70d83SChris Hudson 611e8e70d83SChris Hudson mutex_lock(&input_dev->mutex); 612e8e70d83SChris Hudson 613e8e70d83SChris Hudson if (input_dev->users) 614e8e70d83SChris Hudson kxtj9_disable(tj9); 615e8e70d83SChris Hudson 616e8e70d83SChris Hudson mutex_unlock(&input_dev->mutex); 617e8e70d83SChris Hudson return 0; 618e8e70d83SChris Hudson } 619e8e70d83SChris Hudson 620e8e70d83SChris Hudson static int kxtj9_resume(struct device *dev) 621e8e70d83SChris Hudson { 622e8e70d83SChris Hudson struct i2c_client *client = to_i2c_client(dev); 623e8e70d83SChris Hudson struct kxtj9_data *tj9 = i2c_get_clientdata(client); 624e8e70d83SChris Hudson struct input_dev *input_dev = tj9->input_dev; 625e8e70d83SChris Hudson int retval = 0; 626e8e70d83SChris Hudson 627e8e70d83SChris Hudson mutex_lock(&input_dev->mutex); 628e8e70d83SChris Hudson 629e8e70d83SChris Hudson if (input_dev->users) 630e8e70d83SChris Hudson kxtj9_enable(tj9); 631e8e70d83SChris Hudson 632e8e70d83SChris Hudson mutex_unlock(&input_dev->mutex); 633e8e70d83SChris Hudson return retval; 634e8e70d83SChris Hudson } 635e8e70d83SChris Hudson #endif 636e8e70d83SChris Hudson 637e8e70d83SChris Hudson static SIMPLE_DEV_PM_OPS(kxtj9_pm_ops, kxtj9_suspend, kxtj9_resume); 638e8e70d83SChris Hudson 639e8e70d83SChris Hudson static const struct i2c_device_id kxtj9_id[] = { 640e8e70d83SChris Hudson { NAME, 0 }, 641e8e70d83SChris Hudson { }, 642e8e70d83SChris Hudson }; 643e8e70d83SChris Hudson 644e8e70d83SChris Hudson MODULE_DEVICE_TABLE(i2c, kxtj9_id); 645e8e70d83SChris Hudson 646e8e70d83SChris Hudson static struct i2c_driver kxtj9_driver = { 647e8e70d83SChris Hudson .driver = { 648e8e70d83SChris Hudson .name = NAME, 649e8e70d83SChris Hudson .owner = THIS_MODULE, 650e8e70d83SChris Hudson .pm = &kxtj9_pm_ops, 651e8e70d83SChris Hudson }, 652e8e70d83SChris Hudson .probe = kxtj9_probe, 653e8e70d83SChris Hudson .remove = __devexit_p(kxtj9_remove), 654e8e70d83SChris Hudson .id_table = kxtj9_id, 655e8e70d83SChris Hudson }; 656e8e70d83SChris Hudson 657e8e70d83SChris Hudson static int __init kxtj9_init(void) 658e8e70d83SChris Hudson { 659e8e70d83SChris Hudson return i2c_add_driver(&kxtj9_driver); 660e8e70d83SChris Hudson } 661e8e70d83SChris Hudson module_init(kxtj9_init); 662e8e70d83SChris Hudson 663e8e70d83SChris Hudson static void __exit kxtj9_exit(void) 664e8e70d83SChris Hudson { 665e8e70d83SChris Hudson i2c_del_driver(&kxtj9_driver); 666e8e70d83SChris Hudson } 667e8e70d83SChris Hudson module_exit(kxtj9_exit); 668e8e70d83SChris Hudson 669e8e70d83SChris Hudson MODULE_DESCRIPTION("KXTJ9 accelerometer driver"); 670e8e70d83SChris Hudson MODULE_AUTHOR("Chris Hudson <chudson@kionix.com>"); 671e8e70d83SChris Hudson MODULE_LICENSE("GPL"); 672