2 * Copyright (C) 2010, Samsung Electronics Co. Ltd. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/i2c.h>
19 #include <linux/uaccess.h>
20 #include <linux/poll.h>
21 #include <linux/slab.h>
22 #include <linux/input.h>
23 #include <linux/interrupt.h>
24 #include <asm/div64.h>
25 //#include <linux/input/k3g.h>
26 #include <linux/delay.h>
29 #define DEVICE_ID 0xD3
30 /* k3g gyroscope registers */
32 #define CTRL_REG1 0x20 /* power control reg */
33 #define CTRL_REG2 0x21 /* power control reg */
34 #define CTRL_REG3 0x22 /* power control reg */
35 #define CTRL_REG4 0x23 /* interrupt control reg */
36 #define CTRL_REG5 0x24 /* interrupt control reg */
37 #define OUT_TEMP 0x26 /* Temperature data */
38 #define STATUS_REG 0x27
39 #define AXISDATA_REG 0x28
41 #define FIFO_CTRL_REG 0x2E
42 #define FIFO_SRC_REG 0x2F
44 #define PM_NORMAL 0x08
45 #define ENABLE_ALL_AXES 0x07
46 #define BYPASS_MODE 0x00
47 #define FIFO_MODE 0x20
49 #define FIFO_EMPTY 0x20
52 #define ODR105_BW12_5 0x00 /* ODR = 105Hz; BW = 12.5Hz */
53 #define ODR105_BW25 0x10 /* ODR = 105Hz; BW = 25Hz */
54 #define ODR210_BW12_5 0x40 /* ODR = 210Hz; BW = 12.5Hz */
55 #define ODR210_BW25 0x50 /* ODR = 210Hz; BW = 25Hz */
56 #define ODR210_BW50 0x60 /* ODR = 210Hz; BW = 50Hz */
57 #define ODR210_BW70 0x70 /* ODR = 210Hz; BW = 70Hz */
58 #define ODR420_BW20 0x80 /* ODR = 420Hz; BW = 20Hz */
59 #define ODR420_BW25 0x90 /* ODR = 420Hz; BW = 25Hz */
60 #define ODR420_BW50 0xA0 /* ODR = 420Hz; BW = 50Hz */
61 #define ODR420_BW110 0xB0 /* ODR = 420Hz; BW = 110Hz */
62 #define ODR840_BW30 0xC0 /* ODR = 840Hz; BW = 30Hz */
63 #define ODR840_BW35 0xD0 /* ODR = 840Hz; BW = 35Hz */
64 #define ODR840_BW50 0xE0 /* ODR = 840Hz; BW = 50Hz */
65 #define ODR840_BW110 0xF0 /* ODR = 840Hz; BW = 110Hz */
69 #define AC (1 << 7) /* register auto-increment bit */
71 #define MAX_DELAY (MAX_ENTRY * 9523809LL)
73 /* default register setting for device init */
74 static const char default_ctrl_regs[] = {
75 0x3F, /* 105HZ, PM-normal, xyz enable */
76 0x00, /* normal mode */
77 0x04, /* fifo wtm interrupt on */
78 0xA0, /* block data update, 2000d/s */
79 0x40, /* fifo enable */
82 static const struct odr_delay {
83 u8 odr; /* odr reg setting */
84 u32 delay_ns; /* odr in ns */
85 } odr_delay_table[] = {
86 { ODR840_BW110, 1190476LL }, /* 840Hz */
87 { ODR420_BW110, 2380952LL }, /* 420Hz */
88 { ODR210_BW70, 4761904LL }, /* 210Hz */
89 { ODR105_BW25, 9523809LL }, /* 105Hz */
94 * brief structure containing gyroscope values for yaw, pitch and roll in
104 struct i2c_client *client;
105 struct input_dev *input_dev;
107 struct workqueue_struct *k3g_wq;
108 struct work_struct work;
109 struct hrtimer timer;
111 bool drop_next_event;
112 bool interruptible; /* interrupt or polling? */
113 int entries; /* number of fifo entries */
114 u8 ctrl_regs[5]; /* saving register settings */
115 u32 time_to_read; /* time needed to read one entry */
116 ktime_t polling_delay; /* polling time for timer */
119 static int k3g_read_fifo_status(struct k3g_data *k3g_data)
123 fifo_status = i2c_smbus_read_byte_data(k3g_data->client, FIFO_SRC_REG);
124 if (fifo_status < 0) {
125 pr_err("%s: failed to read fifo source register\n",
129 return (fifo_status & FSS_MASK) + !(fifo_status & FIFO_EMPTY);
132 static int k3g_restart_fifo(struct k3g_data *k3g_data)
136 res = i2c_smbus_write_byte_data(k3g_data->client,
137 FIFO_CTRL_REG, BYPASS_MODE);
139 pr_err("%s : failed to set bypass_mode\n", __func__);
143 res = i2c_smbus_write_byte_data(k3g_data->client,
144 FIFO_CTRL_REG, FIFO_MODE | (k3g_data->entries - 1));
147 pr_err("%s : failed to set fifo_mode\n", __func__);
152 static void set_polling_delay(struct k3g_data *k3g_data, int res)
156 delay_ns = k3g_data->entries + 1 - res;
160 delay_ns = delay_ns * k3g_data->time_to_read;
161 k3g_data->polling_delay = ns_to_ktime(delay_ns);
164 /* gyroscope data readout */
165 static int k3g_read_gyro_values(struct i2c_client *client,
166 struct k3g_t *data, int total_read)
169 struct i2c_msg msg[2];
171 u8 gyro_data[sizeof(*data) * (total_read ? (total_read - 1) : 1)];
173 msg[0].addr = client->addr;
174 msg[0].buf = ®_buf;
178 msg[1].addr = client->addr;
179 msg[1].flags = I2C_M_RD;
180 msg[1].buf = gyro_data;
182 if (total_read > 1) {
183 reg_buf = AXISDATA_REG | AC;
184 msg[1].len = sizeof(gyro_data);
186 err = i2c_transfer(client->adapter, msg, 2);
188 return (err < 0) ? err : -EIO;
191 reg_buf = AXISDATA_REG;
193 err = i2c_transfer(client->adapter, msg, 2);
195 return (err < 0) ? err : -EIO;
197 reg_buf = OUT_Y_L | AC;
198 msg[1].len = sizeof(*data);
199 err = i2c_transfer(client->adapter, msg, 2);
201 return (err < 0) ? err : -EIO;
203 data->y = (gyro_data[1] << 8) | gyro_data[0];
204 data->z = (gyro_data[3] << 8) | gyro_data[2];
205 data->x = (gyro_data[5] << 8) | gyro_data[4];
210 static int k3g_report_gyro_values(struct k3g_data *k3g_data)
215 res = k3g_read_gyro_values(k3g_data->client, &data,
216 k3g_data->entries + k3g_data->drop_next_event);
220 res = k3g_read_fifo_status(k3g_data);
222 k3g_data->drop_next_event = !res;
224 if (res >= 31 - k3g_data->entries) {
225 /* reset fifo to start again - data isn't trustworthy,
226 * our locked read might not have worked and we
227 * could have done i2c read in mid register update
229 return k3g_restart_fifo(k3g_data);
232 input_report_rel(k3g_data->input_dev, REL_RX, data.x);
233 input_report_rel(k3g_data->input_dev, REL_RY, data.y);
234 input_report_rel(k3g_data->input_dev, REL_RZ, data.z);
235 input_sync(k3g_data->input_dev);
240 static enum hrtimer_restart k3g_timer_func(struct hrtimer *timer)
242 struct k3g_data *k3g_data = container_of(timer, struct k3g_data, timer);
243 queue_work(k3g_data->k3g_wq, &k3g_data->work);
244 return HRTIMER_NORESTART;
247 static void k3g_work_func(struct work_struct *work)
250 struct k3g_data *k3g_data = container_of(work, struct k3g_data, work);
253 res = k3g_read_fifo_status(k3g_data);
257 if (res < k3g_data->entries) {
258 pr_warning("%s: fifo entries are less than we want\n",
263 res = k3g_report_gyro_values(k3g_data);
267 set_polling_delay(k3g_data, res);
269 } while (!ktime_to_ns(k3g_data->polling_delay));
271 hrtimer_start(&k3g_data->timer,
272 k3g_data->polling_delay, HRTIMER_MODE_REL);
275 static irqreturn_t k3g_interrupt_thread(int irq, void *k3g_data_p)
278 struct k3g_data *k3g_data = k3g_data_p;
279 res = k3g_report_gyro_values(k3g_data);
281 pr_err("%s: failed to report gyro values\n", __func__);
286 static ssize_t k3g_show_enable(struct device *dev,
287 struct device_attribute *attr, char *buf)
289 struct k3g_data *k3g_data = dev_get_drvdata(dev);
290 return sprintf(buf, "%d\n", k3g_data->enable);
293 static ssize_t k3g_set_enable(struct device *dev,
294 struct device_attribute *attr, const char *buf, size_t size)
297 struct k3g_data *k3g_data = dev_get_drvdata(dev);
300 if (sysfs_streq(buf, "1"))
302 else if (sysfs_streq(buf, "0"))
305 pr_debug("%s: invalid value %d\n", __func__, *buf);
309 if (new_enable == k3g_data->enable)
312 mutex_lock(&k3g_data->lock);
315 err = i2c_smbus_write_i2c_block_data(k3g_data->client,
316 CTRL_REG1 | AC, sizeof(k3g_data->ctrl_regs),
317 k3g_data->ctrl_regs);
323 /* reset fifo entries */
324 err = k3g_restart_fifo(k3g_data);
330 if (k3g_data->interruptible)
331 enable_irq(k3g_data->client->irq);
333 set_polling_delay(k3g_data, 0);
334 hrtimer_start(&k3g_data->timer,
335 k3g_data->polling_delay, HRTIMER_MODE_REL);
338 if (k3g_data->interruptible)
339 disable_irq(k3g_data->client->irq);
341 hrtimer_cancel(&k3g_data->timer);
342 cancel_work_sync(&k3g_data->work);
345 err = i2c_smbus_write_byte_data(k3g_data->client,
350 k3g_data->enable = new_enable;
354 i2c_smbus_write_byte_data(k3g_data->client,
357 mutex_unlock(&k3g_data->lock);
359 return err ? err : size;
362 static ssize_t k3g_show_delay(struct device *dev,
363 struct device_attribute *attr, char *buf)
365 struct k3g_data *k3g_data = dev_get_drvdata(dev);
368 delay = k3g_data->time_to_read * k3g_data->entries;
369 delay = ktime_to_ns(ns_to_ktime(delay));
371 return sprintf(buf, "%lld\n", delay);
374 static ssize_t k3g_set_delay(struct device *dev,
375 struct device_attribute *attr, const char *buf, size_t size)
377 struct k3g_data *k3g_data = dev_get_drvdata(dev);
378 int odr_value = ODR105_BW25;
384 res = strict_strtoll(buf, 10, &delay_ns);
388 mutex_lock(&k3g_data->lock);
389 if (!k3g_data->interruptible)
390 hrtimer_cancel(&k3g_data->timer);
392 disable_irq(k3g_data->client->irq);
394 /* round to the nearest supported ODR that is less than
395 * the requested value
397 for (i = 0; i < ARRAY_SIZE(odr_delay_table); i++)
398 if (delay_ns <= odr_delay_table[i].delay_ns) {
399 odr_value = odr_delay_table[i].odr;
400 delay_ns = odr_delay_table[i].delay_ns;
401 k3g_data->time_to_read = delay_ns;
402 k3g_data->entries = 1;
406 if (delay_ns >= odr_delay_table[3].delay_ns) {
407 if (delay_ns >= MAX_DELAY) {
408 k3g_data->entries = MAX_ENTRY;
409 delay_ns = MAX_DELAY;
411 do_div(delay_ns, odr_delay_table[3].delay_ns);
412 k3g_data->entries = delay_ns;
414 k3g_data->time_to_read = odr_delay_table[3].delay_ns;
417 if (odr_value != (k3g_data->ctrl_regs[0] & ODR_MASK)) {
418 ctrl = (k3g_data->ctrl_regs[0] & ~ODR_MASK);
420 k3g_data->ctrl_regs[0] = ctrl;
421 res = i2c_smbus_write_byte_data(k3g_data->client,
425 /* we see a noise in the first sample or two after we
426 * change rates. this delay helps eliminate that noise.
428 msleep((u32)delay_ns * 2 / NSEC_PER_MSEC);
431 k3g_restart_fifo(k3g_data);
433 if (!k3g_data->interruptible) {
434 delay_ns = k3g_data->entries * k3g_data->time_to_read;
435 k3g_data->polling_delay = ns_to_ktime(delay_ns);
436 if (k3g_data->enable)
437 hrtimer_start(&k3g_data->timer,
438 k3g_data->polling_delay, HRTIMER_MODE_REL);
440 enable_irq(k3g_data->client->irq);
442 mutex_unlock(&k3g_data->lock);
447 static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP,
448 k3g_show_enable, k3g_set_enable);
449 static DEVICE_ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
450 k3g_show_delay, k3g_set_delay);
452 static int k3g_probe(struct i2c_client *client,
453 const struct i2c_device_id *devid)
457 struct k3g_data *data;
458 struct input_dev *input_dev;
460 if (client->dev.platform_data == NULL) {
461 dev_err(&client->dev, "platform data is NULL. exiting.\n");
466 data = kzalloc(sizeof(*data), GFP_KERNEL);
468 dev_err(&client->dev,
469 "failed to allocate memory for module data\n");
474 data->client = client;
477 ret = i2c_smbus_read_byte_data(client, WHO_AM_I);
478 if (ret != DEVICE_ID) {
480 pr_err("%s: i2c for reading chip id failed\n",
484 pr_err("%s : Device identification failed\n",
491 mutex_init(&data->lock);
493 /* allocate gyro input_device */
494 input_dev = input_allocate_device();
496 pr_err("%s: could not allocate input device\n", __func__);
498 goto err_input_allocate_device;
501 data->input_dev = input_dev;
502 input_set_drvdata(input_dev, data);
503 input_dev->name = "gyro";
505 input_set_capability(input_dev, EV_REL, REL_RX);
506 input_set_abs_params(input_dev, REL_RX, -2048, 2047, 0, 0);
508 input_set_capability(input_dev, EV_REL, REL_RY);
509 input_set_abs_params(input_dev, REL_RY, -2048, 2047, 0, 0);
511 input_set_capability(input_dev, EV_REL, REL_RZ);
512 input_set_abs_params(input_dev, REL_RZ, -2048, 2047, 0, 0);
514 err = input_register_device(input_dev);
516 pr_err("%s: could not register input device\n", __func__);
517 input_free_device(data->input_dev);
518 goto err_input_register_device;
521 memcpy(&data->ctrl_regs, &default_ctrl_regs, sizeof(default_ctrl_regs));
522 if (data->client->irq >= 0) { /* interrupt */
523 data->interruptible = true;
524 err = request_threaded_irq(data->client->irq, NULL,
525 k3g_interrupt_thread, IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
528 pr_err("%s: can't allocate irq.\n", __func__);
529 goto err_request_irq;
531 disable_irq(data->client->irq);
533 } else { /* polling */
535 data->ctrl_regs[2] = 0x00; /* disable interrupt */
536 /* hrtimer settings. we poll for gyro values using a timer. */
537 hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
538 data->polling_delay = ns_to_ktime(200 * NSEC_PER_MSEC);
539 data->time_to_read = 10000000LL;
540 delay_ns = ktime_to_ns(data->polling_delay);
541 do_div(delay_ns, data->time_to_read);
542 data->entries = delay_ns;
543 data->timer.function = k3g_timer_func;
545 /* the timer just fires off a work queue request.
546 We need a thread to read i2c (can be slow and blocking). */
547 data->k3g_wq = create_singlethread_workqueue("k3g_wq");
550 pr_err("%s: could not create workqueue\n", __func__);
551 goto err_create_workqueue;
553 /* this is the thread function we run on the work queue */
554 INIT_WORK(&data->work, k3g_work_func);
557 if (device_create_file(&input_dev->dev,
558 &dev_attr_enable) < 0) {
559 pr_err("Failed to create device file(%s)!\n",
560 dev_attr_enable.attr.name);
561 goto err_device_create_file;
564 if (device_create_file(&input_dev->dev,
565 &dev_attr_poll_delay) < 0) {
566 pr_err("Failed to create device file(%s)!\n",
567 dev_attr_poll_delay.attr.name);
568 goto err_device_create_file2;
571 i2c_set_clientdata(client, data);
572 dev_set_drvdata(&input_dev->dev, data);
576 err_device_create_file2:
577 device_remove_file(&input_dev->dev, &dev_attr_enable);
578 err_device_create_file:
579 if (data->interruptible) {
580 enable_irq(data->client->irq);
581 free_irq(data->client->irq, data);
583 destroy_workqueue(data->k3g_wq);
584 input_unregister_device(data->input_dev);
585 err_create_workqueue:
587 err_input_register_device:
588 err_input_allocate_device:
589 mutex_destroy(&data->lock);
596 static int k3g_remove(struct i2c_client *client)
599 struct k3g_data *k3g_data = i2c_get_clientdata(client);
601 device_remove_file(&k3g_data->input_dev->dev, &dev_attr_enable);
602 device_remove_file(&k3g_data->input_dev->dev, &dev_attr_poll_delay);
604 if (k3g_data->enable)
605 err = i2c_smbus_write_byte_data(k3g_data->client,
607 if (k3g_data->interruptible) {
608 if (!k3g_data->enable) /* no disable_irq before free_irq */
609 enable_irq(k3g_data->client->irq);
610 free_irq(k3g_data->client->irq, k3g_data);
613 hrtimer_cancel(&k3g_data->timer);
614 cancel_work_sync(&k3g_data->work);
615 destroy_workqueue(k3g_data->k3g_wq);
618 input_unregister_device(k3g_data->input_dev);
619 mutex_destroy(&k3g_data->lock);
625 static int k3g_suspend(struct device *dev)
628 struct i2c_client *client = to_i2c_client(dev);
629 struct k3g_data *k3g_data = i2c_get_clientdata(client);
631 if (k3g_data->enable) {
632 mutex_lock(&k3g_data->lock);
633 if (!k3g_data->interruptible) {
634 hrtimer_cancel(&k3g_data->timer);
635 cancel_work_sync(&k3g_data->work);
637 err = i2c_smbus_write_byte_data(k3g_data->client,
639 mutex_unlock(&k3g_data->lock);
645 static int k3g_resume(struct device *dev)
648 struct i2c_client *client = to_i2c_client(dev);
649 struct k3g_data *k3g_data = i2c_get_clientdata(client);
651 if (k3g_data->enable) {
652 mutex_lock(&k3g_data->lock);
653 if (!k3g_data->interruptible)
654 hrtimer_start(&k3g_data->timer,
655 k3g_data->polling_delay, HRTIMER_MODE_REL);
656 err = i2c_smbus_write_i2c_block_data(client,
657 CTRL_REG1 | AC, sizeof(k3g_data->ctrl_regs),
658 k3g_data->ctrl_regs);
659 mutex_unlock(&k3g_data->lock);
665 static const struct dev_pm_ops k3g_pm_ops = {
666 .suspend = k3g_suspend,
670 static const struct i2c_device_id k3g_id[] = {
675 MODULE_DEVICE_TABLE(i2c, k3g_id);
677 static struct i2c_driver k3g_driver = {
679 .remove = __devexit_p(k3g_remove),
683 .owner = THIS_MODULE,
688 static int __init k3g_init(void)
690 return i2c_add_driver(&k3g_driver);
693 static void __exit k3g_exit(void)
695 i2c_del_driver(&k3g_driver);
698 module_init(k3g_init);
699 module_exit(k3g_exit);
701 MODULE_DESCRIPTION("k3g digital gyroscope driver");
702 MODULE_AUTHOR("Tim SK Lee Samsung Electronics <tim.sk.lee@samsung.com>");
703 MODULE_LICENSE("GPL");