tj9 84 drivers/input/misc/kxtj9.c static int kxtj9_i2c_read(struct kxtj9_data *tj9, u8 addr, u8 *data, int len) tj9 88 drivers/input/misc/kxtj9.c .addr = tj9->client->addr, tj9 89 drivers/input/misc/kxtj9.c .flags = tj9->client->flags, tj9 94 drivers/input/misc/kxtj9.c .addr = tj9->client->addr, tj9 95 drivers/input/misc/kxtj9.c .flags = tj9->client->flags | I2C_M_RD, tj9 101 drivers/input/misc/kxtj9.c return i2c_transfer(tj9->client->adapter, msgs, 2); tj9 104 drivers/input/misc/kxtj9.c static void kxtj9_report_acceleration_data(struct kxtj9_data *tj9) tj9 110 drivers/input/misc/kxtj9.c err = kxtj9_i2c_read(tj9, XOUT_L, (u8 *)acc_data, 6); tj9 112 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, "accelerometer data read failed\n"); tj9 114 drivers/input/misc/kxtj9.c x = le16_to_cpu(acc_data[tj9->pdata.axis_map_x]); tj9 115 drivers/input/misc/kxtj9.c y = le16_to_cpu(acc_data[tj9->pdata.axis_map_y]); tj9 116 drivers/input/misc/kxtj9.c z = le16_to_cpu(acc_data[tj9->pdata.axis_map_z]); tj9 118 drivers/input/misc/kxtj9.c x >>= tj9->shift; tj9 119 drivers/input/misc/kxtj9.c y >>= tj9->shift; tj9 120 drivers/input/misc/kxtj9.c z >>= tj9->shift; tj9 122 drivers/input/misc/kxtj9.c input_report_abs(tj9->input_dev, ABS_X, tj9->pdata.negate_x ? -x : x); tj9 123 drivers/input/misc/kxtj9.c input_report_abs(tj9->input_dev, ABS_Y, tj9->pdata.negate_y ? -y : y); tj9 124 drivers/input/misc/kxtj9.c input_report_abs(tj9->input_dev, ABS_Z, tj9->pdata.negate_z ? -z : z); tj9 125 drivers/input/misc/kxtj9.c input_sync(tj9->input_dev); tj9 130 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = dev; tj9 134 drivers/input/misc/kxtj9.c kxtj9_report_acceleration_data(tj9); tj9 136 drivers/input/misc/kxtj9.c err = i2c_smbus_read_byte_data(tj9->client, INT_REL); tj9 138 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, tj9 144 drivers/input/misc/kxtj9.c static int kxtj9_update_g_range(struct kxtj9_data *tj9, u8 new_g_range) tj9 148 drivers/input/misc/kxtj9.c tj9->shift = 4; tj9 151 drivers/input/misc/kxtj9.c tj9->shift = 3; tj9 154 drivers/input/misc/kxtj9.c tj9->shift = 2; tj9 160 drivers/input/misc/kxtj9.c tj9->ctrl_reg1 &= 0xe7; tj9 161 drivers/input/misc/kxtj9.c tj9->ctrl_reg1 |= new_g_range; tj9 166 drivers/input/misc/kxtj9.c static int kxtj9_update_odr(struct kxtj9_data *tj9, unsigned int poll_interval) tj9 173 drivers/input/misc/kxtj9.c tj9->data_ctrl = kxtj9_odr_table[i].mask; tj9 178 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, 0); tj9 182 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, DATA_CTRL, tj9->data_ctrl); tj9 186 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); tj9 193 drivers/input/misc/kxtj9.c static int kxtj9_device_power_on(struct kxtj9_data *tj9) tj9 195 drivers/input/misc/kxtj9.c if (tj9->pdata.power_on) tj9 196 drivers/input/misc/kxtj9.c return tj9->pdata.power_on(); tj9 201 drivers/input/misc/kxtj9.c static void kxtj9_device_power_off(struct kxtj9_data *tj9) tj9 205 drivers/input/misc/kxtj9.c tj9->ctrl_reg1 &= PC1_OFF; tj9 206 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); tj9 208 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, "soft power off failed\n"); tj9 210 drivers/input/misc/kxtj9.c if (tj9->pdata.power_off) tj9 211 drivers/input/misc/kxtj9.c tj9->pdata.power_off(); tj9 214 drivers/input/misc/kxtj9.c static int kxtj9_enable(struct kxtj9_data *tj9) tj9 218 drivers/input/misc/kxtj9.c err = kxtj9_device_power_on(tj9); tj9 223 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, 0); tj9 228 drivers/input/misc/kxtj9.c if (tj9->client->irq) { tj9 229 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, tj9 230 drivers/input/misc/kxtj9.c INT_CTRL1, tj9->int_ctrl); tj9 235 drivers/input/misc/kxtj9.c err = kxtj9_update_g_range(tj9, tj9->pdata.g_range); tj9 240 drivers/input/misc/kxtj9.c tj9->ctrl_reg1 |= PC1_ON; tj9 241 drivers/input/misc/kxtj9.c err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); tj9 245 drivers/input/misc/kxtj9.c err = kxtj9_update_odr(tj9, tj9->last_poll_interval); tj9 250 drivers/input/misc/kxtj9.c if (tj9->client->irq) { tj9 251 drivers/input/misc/kxtj9.c err = i2c_smbus_read_byte_data(tj9->client, INT_REL); tj9 253 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, tj9 262 drivers/input/misc/kxtj9.c kxtj9_device_power_off(tj9); tj9 266 drivers/input/misc/kxtj9.c static void kxtj9_disable(struct kxtj9_data *tj9) tj9 268 drivers/input/misc/kxtj9.c kxtj9_device_power_off(tj9); tj9 273 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = input_get_drvdata(input); tj9 275 drivers/input/misc/kxtj9.c return kxtj9_enable(tj9); tj9 280 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = input_get_drvdata(dev); tj9 282 drivers/input/misc/kxtj9.c kxtj9_disable(tj9); tj9 285 drivers/input/misc/kxtj9.c static void kxtj9_init_input_device(struct kxtj9_data *tj9, tj9 295 drivers/input/misc/kxtj9.c input_dev->dev.parent = &tj9->client->dev; tj9 298 drivers/input/misc/kxtj9.c static int kxtj9_setup_input_device(struct kxtj9_data *tj9) tj9 305 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, "input device allocate failed\n"); tj9 309 drivers/input/misc/kxtj9.c tj9->input_dev = input_dev; tj9 313 drivers/input/misc/kxtj9.c input_set_drvdata(input_dev, tj9); tj9 315 drivers/input/misc/kxtj9.c kxtj9_init_input_device(tj9, input_dev); tj9 317 drivers/input/misc/kxtj9.c err = input_register_device(tj9->input_dev); tj9 319 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, tj9 321 drivers/input/misc/kxtj9.c tj9->input_dev->name, err); tj9 322 drivers/input/misc/kxtj9.c input_free_device(tj9->input_dev); tj9 345 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = i2c_get_clientdata(client); tj9 347 drivers/input/misc/kxtj9.c return sprintf(buf, "%d\n", tj9->last_poll_interval); tj9 355 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = i2c_get_clientdata(client); tj9 356 drivers/input/misc/kxtj9.c struct input_dev *input_dev = tj9->input_dev; tj9 373 drivers/input/misc/kxtj9.c tj9->last_poll_interval = max(interval, tj9->pdata.min_interval); tj9 375 drivers/input/misc/kxtj9.c kxtj9_update_odr(tj9, tj9->last_poll_interval); tj9 398 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = dev->private; tj9 401 drivers/input/misc/kxtj9.c kxtj9_report_acceleration_data(tj9); tj9 403 drivers/input/misc/kxtj9.c if (poll_interval != tj9->last_poll_interval) { tj9 404 drivers/input/misc/kxtj9.c kxtj9_update_odr(tj9, poll_interval); tj9 405 drivers/input/misc/kxtj9.c tj9->last_poll_interval = poll_interval; tj9 411 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = dev->private; tj9 413 drivers/input/misc/kxtj9.c kxtj9_enable(tj9); tj9 418 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = dev->private; tj9 420 drivers/input/misc/kxtj9.c kxtj9_disable(tj9); tj9 423 drivers/input/misc/kxtj9.c static int kxtj9_setup_polled_device(struct kxtj9_data *tj9) tj9 430 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, tj9 435 drivers/input/misc/kxtj9.c tj9->poll_dev = poll_dev; tj9 436 drivers/input/misc/kxtj9.c tj9->input_dev = poll_dev->input; tj9 438 drivers/input/misc/kxtj9.c poll_dev->private = tj9; tj9 443 drivers/input/misc/kxtj9.c kxtj9_init_input_device(tj9, poll_dev->input); tj9 447 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, tj9 456 drivers/input/misc/kxtj9.c static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) tj9 458 drivers/input/misc/kxtj9.c input_unregister_polled_device(tj9->poll_dev); tj9 459 drivers/input/misc/kxtj9.c input_free_polled_device(tj9->poll_dev); tj9 464 drivers/input/misc/kxtj9.c static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9) tj9 469 drivers/input/misc/kxtj9.c static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) tj9 475 drivers/input/misc/kxtj9.c static int kxtj9_verify(struct kxtj9_data *tj9) tj9 479 drivers/input/misc/kxtj9.c retval = kxtj9_device_power_on(tj9); tj9 483 drivers/input/misc/kxtj9.c retval = i2c_smbus_read_byte_data(tj9->client, WHO_AM_I); tj9 485 drivers/input/misc/kxtj9.c dev_err(&tj9->client->dev, "read err int source\n"); tj9 492 drivers/input/misc/kxtj9.c kxtj9_device_power_off(tj9); tj9 501 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9; tj9 515 drivers/input/misc/kxtj9.c tj9 = kzalloc(sizeof(*tj9), GFP_KERNEL); tj9 516 drivers/input/misc/kxtj9.c if (!tj9) { tj9 522 drivers/input/misc/kxtj9.c tj9->client = client; tj9 523 drivers/input/misc/kxtj9.c tj9->pdata = *pdata; tj9 531 drivers/input/misc/kxtj9.c err = kxtj9_verify(tj9); tj9 537 drivers/input/misc/kxtj9.c i2c_set_clientdata(client, tj9); tj9 539 drivers/input/misc/kxtj9.c tj9->ctrl_reg1 = tj9->pdata.res_12bit | tj9->pdata.g_range; tj9 540 drivers/input/misc/kxtj9.c tj9->last_poll_interval = tj9->pdata.init_interval; tj9 544 drivers/input/misc/kxtj9.c tj9->int_ctrl |= KXTJ9_IEN | KXTJ9_IEA | KXTJ9_IEL; tj9 545 drivers/input/misc/kxtj9.c tj9->ctrl_reg1 |= DRDYE; tj9 547 drivers/input/misc/kxtj9.c err = kxtj9_setup_input_device(tj9); tj9 553 drivers/input/misc/kxtj9.c "kxtj9-irq", tj9); tj9 566 drivers/input/misc/kxtj9.c err = kxtj9_setup_polled_device(tj9); tj9 574 drivers/input/misc/kxtj9.c free_irq(client->irq, tj9); tj9 576 drivers/input/misc/kxtj9.c input_unregister_device(tj9->input_dev); tj9 578 drivers/input/misc/kxtj9.c if (tj9->pdata.exit) tj9 579 drivers/input/misc/kxtj9.c tj9->pdata.exit(); tj9 581 drivers/input/misc/kxtj9.c kfree(tj9); tj9 587 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = i2c_get_clientdata(client); tj9 591 drivers/input/misc/kxtj9.c free_irq(client->irq, tj9); tj9 592 drivers/input/misc/kxtj9.c input_unregister_device(tj9->input_dev); tj9 594 drivers/input/misc/kxtj9.c kxtj9_teardown_polled_device(tj9); tj9 597 drivers/input/misc/kxtj9.c if (tj9->pdata.exit) tj9 598 drivers/input/misc/kxtj9.c tj9->pdata.exit(); tj9 600 drivers/input/misc/kxtj9.c kfree(tj9); tj9 608 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = i2c_get_clientdata(client); tj9 609 drivers/input/misc/kxtj9.c struct input_dev *input_dev = tj9->input_dev; tj9 614 drivers/input/misc/kxtj9.c kxtj9_disable(tj9); tj9 623 drivers/input/misc/kxtj9.c struct kxtj9_data *tj9 = i2c_get_clientdata(client); tj9 624 drivers/input/misc/kxtj9.c struct input_dev *input_dev = tj9->input_dev; tj9 629 drivers/input/misc/kxtj9.c kxtj9_enable(tj9);