1 /* drivers/i2c/chips/akm8975.c - akm8975 compass driver
3 * Copyright (C) 2007-2008 HTC Corporation.
4 * Author: Hou-Kun Chen <houkun.chen@gmail.com>
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
18 * Revised by AKM 2009/04/02
22 #include <linux/interrupt.h>
23 #include <linux/i2c.h>
24 #include <linux/slab.h>
25 #include <linux/irq.h>
26 #include <linux/miscdevice.h>
27 #include <linux/gpio.h>
28 #include <linux/uaccess.h>
29 #include <linux/delay.h>
30 #include <linux/input.h>
31 #include <linux/workqueue.h>
32 #include <linux/freezer.h>
33 #include <linux/earlysuspend.h>
36 #define AKM8975_DEBUG 1
37 #define AKM8975_DEBUG_MSG 1
38 #define AKM8975_DEBUG_FUNC 0
39 #define AKM8975_DEBUG_DATA 0
40 #define MAX_FAILURE_COUNT 3
41 #define AKM8975_RETRY_COUNT 10
42 #define AKM8975_DEFAULT_DELAY 100
45 #define AKMDBG(format, ...) printk(KERN_INFO "AKM8975 " format "\n", ## __VA_ARGS__)
47 #define AKMDBG(format, ...)
50 #if AKM8975_DEBUG_FUNC
51 #define AKMFUNC(func) printk(KERN_INFO "AKM8975 " func " is called\n")
56 static struct i2c_client *this_client;
59 struct i2c_client *client;
60 struct input_dev *input_dev;
61 struct work_struct work;
62 struct early_suspend akm_early_suspend;
66 /* Addresses to scan -- protected by sense_data_mutex */
67 static char sense_data[SENSOR_DATA_SIZE];
68 static struct mutex sense_data_mutex;
69 static DECLARE_WAIT_QUEUE_HEAD(data_ready_wq);
70 static DECLARE_WAIT_QUEUE_HEAD(open_wq);
72 static atomic_t data_ready;
73 static atomic_t open_count;
74 static atomic_t open_flag;
75 static atomic_t reserve_open_flag;
77 static atomic_t m_flag;
78 static atomic_t a_flag;
79 static atomic_t mv_flag;
81 static int failure_count = 0;
83 static short akmd_delay = AKM8975_DEFAULT_DELAY;
85 static atomic_t suspend_flag = ATOMIC_INIT(0);
87 //static struct akm8975_platform_data *pdata;
89 static int AKI2C_RxData(char *rxData, int length)
92 struct i2c_msg msgs[] = {
94 .addr = this_client->addr,
100 .addr = this_client->addr,
106 #if AKM8975_DEBUG_DATA
108 char addr = rxData[0];
111 /* Caller should check parameter validity.*/
112 if ((rxData == NULL) || (length < 1)) {
116 for (loop_i = 0; loop_i < AKM8975_RETRY_COUNT; loop_i++) {
117 if (i2c_transfer(this_client->adapter, msgs, 2) > 0) {
123 if (loop_i >= AKM8975_RETRY_COUNT) {
124 printk(KERN_ERR "%s retry over %d\n", __func__, AKM8975_RETRY_COUNT);
127 #if AKM8975_DEBUG_DATA
128 printk(KERN_INFO "RxData: len=%02x, addr=%02x\n data=", length, addr);
129 for (i = 0; i < length; i++) {
130 printk(KERN_INFO " %02x", rxData[i]);
132 printk(KERN_INFO "\n");
137 static int AKI2C_TxData(char *txData, int length)
140 struct i2c_msg msg[] = {
142 .addr = this_client->addr,
148 #if AKM8975_DEBUG_DATA
152 /* Caller should check parameter validity.*/
153 if ((txData == NULL) || (length < 2)) {
157 for (loop_i = 0; loop_i < AKM8975_RETRY_COUNT; loop_i++) {
158 if (i2c_transfer(this_client->adapter, msg, 1) > 0) {
164 if (loop_i >= AKM8975_RETRY_COUNT) {
165 printk(KERN_ERR "%s retry over %d\n", __func__, AKM8975_RETRY_COUNT);
168 #if AKM8975_DEBUG_DATA
169 printk(KERN_INFO "TxData: len=%02x, addr=%02x\n data=", length, txData[0]);
170 for (i = 0; i < (length-1); i++) {
171 printk(KERN_INFO " %02x", txData[i + 1]);
173 printk(KERN_INFO "\n");
178 static int AKECS_SetMode_SngMeasure(void)
182 atomic_set(&data_ready, 0);
184 /* Set measure mode */
185 buffer[0] = AK8975_REG_CNTL;
186 buffer[1] = AK8975_MODE_SNG_MEASURE;
189 return AKI2C_TxData(buffer, 2);
192 static int AKECS_SetMode_SelfTest(void)
196 /* Set measure mode */
197 buffer[0] = AK8975_REG_CNTL;
198 buffer[1] = AK8975_MODE_SELF_TEST;
200 return AKI2C_TxData(buffer, 2);
203 static int AKECS_SetMode_FUSEAccess(void)
207 /* Set measure mode */
208 buffer[0] = AK8975_REG_CNTL;
209 buffer[1] = AK8975_MODE_FUSE_ACCESS;
211 return AKI2C_TxData(buffer, 2);
214 static int AKECS_SetMode_PowerDown(void)
218 /* Set powerdown mode */
219 buffer[0] = AK8975_REG_CNTL;
220 buffer[1] = AK8975_MODE_POWERDOWN;
222 return AKI2C_TxData(buffer, 2);
225 static int AKECS_SetMode(char mode)
230 case AK8975_MODE_SNG_MEASURE:
231 ret = AKECS_SetMode_SngMeasure();
233 case AK8975_MODE_SELF_TEST:
234 ret = AKECS_SetMode_SelfTest();
236 case AK8975_MODE_FUSE_ACCESS:
237 ret = AKECS_SetMode_FUSEAccess();
239 case AK8975_MODE_POWERDOWN:
240 ret = AKECS_SetMode_PowerDown();
241 /* wait at least 100us after changing mode */
245 AKMDBG("%s: Unknown mode(%d)", __func__, mode);
252 static int AKECS_CheckDevice(void)
257 /* Set measure mode */
258 buffer[0] = AK8975_REG_WIA;
261 ret = AKI2C_RxData(buffer, 1);
265 /* Check read data */
266 if (buffer[0] != 0x48) {
273 static int AKECS_GetData(char *rbuf, int size)
276 /* This function is not exposed, so parameters
277 should be checked internally.*/
278 if ((rbuf == NULL) || (size < SENSOR_DATA_SIZE)) {
282 wait_event_interruptible_timeout(data_ready_wq,
283 atomic_read(&data_ready), 1000);
284 if (!atomic_read(&data_ready)) {
285 AKMDBG("%s: data_ready is not set.", __func__);
286 if (!atomic_read(&suspend_flag)) {
287 AKMDBG("%s: suspend_flag is not set.", __func__);
289 if (failure_count >= MAX_FAILURE_COUNT) {
291 "AKM8975 AKECS_GetData: successive %d failure.\n",
293 atomic_set(&open_flag, -1);
301 mutex_lock(&sense_data_mutex);
302 memcpy(rbuf, sense_data, size);
303 atomic_set(&data_ready, 0);
304 mutex_unlock(&sense_data_mutex);
310 static void AKECS_SetYPR(short *rbuf)
312 struct akm8975_data *data = i2c_get_clientdata(this_client);
313 #if AKM8975_DEBUG_DATA
314 printk(KERN_INFO "AKM8975 %s:\n", __func__);
315 printk(KERN_INFO " yaw =%6d, pitch =%6d, roll =%6d\n",
316 rbuf[0], rbuf[1], rbuf[2]);
317 printk(KERN_INFO " tmp =%6d, m_stat =%6d, g_stat =%6d\n",
318 rbuf[3], rbuf[4], rbuf[5]);
319 printk(KERN_INFO " Acceleration[LSB]: %6d,%6d,%6d\n",
320 rbuf[6], rbuf[7], rbuf[8]);
321 printk(KERN_INFO " Geomagnetism[LSB]: %6d,%6d,%6d\n",
322 rbuf[9], rbuf[10], rbuf[11]);
324 /* Report magnetic sensor information */
325 if (atomic_read(&m_flag)) {
326 input_report_abs(data->input_dev, ABS_RX, rbuf[0]);
327 input_report_abs(data->input_dev, ABS_RY, rbuf[1]);
328 input_report_abs(data->input_dev, ABS_RZ, rbuf[2]);
329 input_report_abs(data->input_dev, ABS_RUDDER, rbuf[4]);
332 /* Report acceleration sensor information */
333 if (atomic_read(&a_flag)) {
334 input_report_abs(data->input_dev, ABS_X, rbuf[6]);
335 input_report_abs(data->input_dev, ABS_Y, rbuf[7]);
336 input_report_abs(data->input_dev, ABS_Z, rbuf[8]);
337 input_report_abs(data->input_dev, ABS_WHEEL, rbuf[5]);
340 /* Report magnetic vector information */
341 if (atomic_read(&mv_flag)) {
342 input_report_abs(data->input_dev, ABS_HAT0X, rbuf[9]);
343 input_report_abs(data->input_dev, ABS_HAT0Y, rbuf[10]);
344 input_report_abs(data->input_dev, ABS_BRAKE, rbuf[11]);
347 input_sync(data->input_dev);
350 static int AKECS_GetOpenStatus(void)
352 wait_event_interruptible(open_wq, (atomic_read(&open_flag) != 0));
353 return atomic_read(&open_flag);
356 static int AKECS_GetCloseStatus(void)
358 wait_event_interruptible(open_wq, (atomic_read(&open_flag) <= 0));
359 return atomic_read(&open_flag);
362 static void AKECS_CloseDone(void)
364 atomic_set(&m_flag, 1);
365 atomic_set(&a_flag, 1);
366 atomic_set(&mv_flag, 1);
369 /***** akm_aot functions ***************************************/
370 static int akm_aot_open(struct inode *inode, struct file *file)
374 AKMFUNC("akm_aot_open");
375 if (atomic_cmpxchg(&open_count, 0, 1) == 0) {
376 if (atomic_cmpxchg(&open_flag, 0, 1) == 0) {
377 atomic_set(&reserve_open_flag, 1);
385 static int akm_aot_release(struct inode *inode, struct file *file)
387 AKMFUNC("akm_aot_release");
388 atomic_set(&reserve_open_flag, 0);
389 atomic_set(&open_flag, 0);
390 atomic_set(&open_count, 0);
396 akm_aot_ioctl(struct inode *inode, struct file *file,
397 unsigned int cmd, unsigned long arg)
399 void __user *argp = (void __user *)arg;
403 case ECS_IOCTL_APP_SET_MFLAG:
404 case ECS_IOCTL_APP_SET_AFLAG:
405 case ECS_IOCTL_APP_SET_MVFLAG:
406 if (copy_from_user(&flag, argp, sizeof(flag))) {
409 if (flag < 0 || flag > 1) {
413 case ECS_IOCTL_APP_SET_DELAY:
414 if (copy_from_user(&flag, argp, sizeof(flag))) {
423 case ECS_IOCTL_APP_SET_MFLAG:
424 atomic_set(&m_flag, flag);
425 AKMDBG("MFLAG is set to %d", flag);
427 case ECS_IOCTL_APP_GET_MFLAG:
428 flag = atomic_read(&m_flag);
430 case ECS_IOCTL_APP_SET_AFLAG:
431 atomic_set(&a_flag, flag);
432 AKMDBG("AFLAG is set to %d", flag);
434 case ECS_IOCTL_APP_GET_AFLAG:
435 flag = atomic_read(&a_flag);
437 case ECS_IOCTL_APP_SET_MVFLAG:
438 atomic_set(&mv_flag, flag);
439 AKMDBG("MVFLAG is set to %d", flag);
441 case ECS_IOCTL_APP_GET_MVFLAG:
442 flag = atomic_read(&mv_flag);
444 case ECS_IOCTL_APP_SET_DELAY:
446 AKMDBG("Delay is set to %d", flag);
448 case ECS_IOCTL_APP_GET_DELAY:
456 case ECS_IOCTL_APP_GET_MFLAG:
457 case ECS_IOCTL_APP_GET_AFLAG:
458 case ECS_IOCTL_APP_GET_MVFLAG:
459 case ECS_IOCTL_APP_GET_DELAY:
460 if (copy_to_user(argp, &flag, sizeof(flag))) {
471 /***** akmd functions ********************************************/
472 static int akmd_open(struct inode *inode, struct file *file)
474 AKMFUNC("akmd_open");
475 return nonseekable_open(inode, file);
478 static int akmd_release(struct inode *inode, struct file *file)
480 AKMFUNC("akmd_release");
486 akmd_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
489 void __user *argp = (void __user *)arg;
491 /* NOTE: In this function the size of "char" should be 1-byte. */
492 char sData[SENSOR_DATA_SIZE];/* for GETDATA */
493 char rwbuf[RWBUF_SIZE]; /* for READ/WRITE */
494 char mode; /* for SET_MODE*/
495 short value[12]; /* for SET_YPR */
496 short delay; /* for GET_DELAY */
497 int status; /* for OPEN/CLOSE_STATUS */
498 int ret = -1; /* Return value. */
499 /*AKMDBG("%s (0x%08X).", __func__, cmd);*/
502 case ECS_IOCTL_WRITE:
505 AKMDBG("invalid argument.");
508 if (copy_from_user(&rwbuf, argp, sizeof(rwbuf))) {
509 AKMDBG("copy_from_user failed.");
513 case ECS_IOCTL_SET_MODE:
515 AKMDBG("invalid argument.");
518 if (copy_from_user(&mode, argp, sizeof(mode))) {
519 AKMDBG("copy_from_user failed.");
523 case ECS_IOCTL_SET_YPR:
525 AKMDBG("invalid argument.");
528 if (copy_from_user(&value, argp, sizeof(value))) {
529 AKMDBG("copy_from_user failed.");
538 case ECS_IOCTL_WRITE:
539 AKMFUNC("IOCTL_WRITE");
540 if ((rwbuf[0] < 2) || (rwbuf[0] > (RWBUF_SIZE-1))) {
541 AKMDBG("invalid argument.");
544 ret = AKI2C_TxData(&rwbuf[1], rwbuf[0]);
550 AKMFUNC("IOCTL_READ");
551 if ((rwbuf[0] < 1) || (rwbuf[0] > (RWBUF_SIZE-1))) {
552 AKMDBG("invalid argument.");
555 ret = AKI2C_RxData(&rwbuf[1], rwbuf[0]);
560 case ECS_IOCTL_SET_MODE:
561 AKMFUNC("IOCTL_SET_MODE");
562 ret = AKECS_SetMode(mode);
567 case ECS_IOCTL_GETDATA:
568 AKMFUNC("IOCTL_GET_DATA");
569 ret = AKECS_GetData(sData, SENSOR_DATA_SIZE);
574 case ECS_IOCTL_SET_YPR:
577 case ECS_IOCTL_GET_OPEN_STATUS:
578 AKMFUNC("IOCTL_GET_OPEN_STATUS");
579 status = AKECS_GetOpenStatus();
580 AKMDBG("AKECS_GetOpenStatus returned (%d)", status);
582 case ECS_IOCTL_GET_CLOSE_STATUS:
583 AKMFUNC("IOCTL_GET_CLOSE_STATUS");
584 status = AKECS_GetCloseStatus();
585 AKMDBG("AKECS_GetCloseStatus returned (%d)", status);
587 case ECS_IOCTL_GET_DELAY:
588 AKMFUNC("IOCTL_GET_DELAY");
597 if (copy_to_user(argp, &rwbuf, rwbuf[0]+1)) {
598 AKMDBG("copy_to_user failed.");
602 case ECS_IOCTL_GETDATA:
603 if (copy_to_user(argp, &sData, sizeof(sData))) {
604 AKMDBG("copy_to_user failed.");
608 case ECS_IOCTL_GET_OPEN_STATUS:
609 case ECS_IOCTL_GET_CLOSE_STATUS:
610 if (copy_to_user(argp, &status, sizeof(status))) {
611 AKMDBG("copy_to_user failed.");
615 case ECS_IOCTL_GET_DELAY:
616 if (copy_to_user(argp, &delay, sizeof(delay))) {
617 AKMDBG("copy_to_user failed.");
628 static void akm8975_work_func(struct work_struct *work)
630 char buffer[SENSOR_DATA_SIZE];
633 memset(buffer, 0, SENSOR_DATA_SIZE);
634 buffer[0] = AK8975_REG_ST1;
635 ret = AKI2C_RxData(buffer, SENSOR_DATA_SIZE);
637 printk(KERN_ERR "AKM8975 akm8975_work_func: I2C failed\n");
641 if ((buffer[0] & 0x01) != 0x01) {
642 printk(KERN_ERR "AKM8975 akm8975_work_func: ST is not set\n");
646 mutex_lock(&sense_data_mutex);
647 memcpy(sense_data, buffer, SENSOR_DATA_SIZE);
648 atomic_set(&data_ready, 1);
649 wake_up(&data_ready_wq);
650 mutex_unlock(&sense_data_mutex);
652 enable_irq(this_client->irq);
654 AKMFUNC("akm8975_work_func");
657 static irqreturn_t akm8975_interrupt(int irq, void *dev_id)
659 struct akm8975_data *data = dev_id;
660 AKMFUNC("akm8975_interrupt");
661 disable_irq(this_client->irq);
662 schedule_work(&data->work);
666 static void akm8975_early_suspend(struct early_suspend *handler)
668 AKMFUNC("akm8975_early_suspend");
669 atomic_set(&suspend_flag, 1);
670 atomic_set(&reserve_open_flag, atomic_read(&open_flag));
671 atomic_set(&open_flag, 0);
673 disable_irq(this_client->irq);
674 AKMDBG("suspended with flag=%d",
675 atomic_read(&reserve_open_flag));
678 static void akm8975_early_resume(struct early_suspend *handler)
680 AKMFUNC("akm8975_early_resume");
681 enable_irq(this_client->irq);
682 atomic_set(&suspend_flag, 0);
683 atomic_set(&open_flag, atomic_read(&reserve_open_flag));
685 AKMDBG("resumed with flag=%d",
686 atomic_read(&reserve_open_flag));
689 /*********************************************/
690 static struct file_operations akmd_fops = {
691 .owner = THIS_MODULE,
693 .release = akmd_release,
697 static struct file_operations akm_aot_fops = {
698 .owner = THIS_MODULE,
699 .open = akm_aot_open,
700 .release = akm_aot_release,
701 .ioctl = akm_aot_ioctl,
704 static struct miscdevice akmd_device = {
705 .minor = MISC_DYNAMIC_MINOR,
706 .name = "akm8975_dev",
710 static struct miscdevice akm_aot_device = {
711 .minor = MISC_DYNAMIC_MINOR,
712 .name = "akm8975_aot",
713 .fops = &akm_aot_fops,
716 /*********************************************/
717 int akm8975_probe(struct i2c_client *client, const struct i2c_device_id *id)
719 struct akm8975_data *akm;
722 AKMFUNC("akm8975_probe");
724 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
725 printk(KERN_ERR "AKM8975 akm8975_probe: check_functionality failed.\n");
730 /* Allocate memory for driver data */
731 akm = kzalloc(sizeof(struct akm8975_data), GFP_KERNEL);
733 printk(KERN_ERR "AKM8975 akm8975_probe: memory allocation failed.\n");
738 INIT_WORK(&akm->work, akm8975_work_func);
739 i2c_set_clientdata(client, akm);
741 this_client = client;
743 /* Check connection */
744 err = AKECS_CheckDevice();
746 printk(KERN_ERR "AKM8975 akm8975_probe: set power down mode error\n");
749 akm->eoc_irq = client->irq;
751 dev_dbg(&akm->client->dev, "no IRQ?\n");
754 akm->eoc_irq = gpio_to_irq(akm->eoc_irq);
756 err = gpio_request(client->irq, "ak_8975");
758 dev_err(&client->dev, "failed to request GPIO, error %d\n", err);
762 err = request_irq(akm->eoc_irq, akm8975_interrupt, IRQ_TYPE_EDGE_RISING,
763 "akm8975_DRDY", akm);
765 printk(KERN_ERR "AKM8975 akm8975_probe: request irq failed\n");
769 /* Declare input device */
770 akm->input_dev = input_allocate_device();
771 if (!akm->input_dev) {
774 "AKM8975 akm8975_probe: Failed to allocate input device\n");
777 /* Setup input device */
778 set_bit(EV_ABS, akm->input_dev->evbit);
780 input_set_abs_params(akm->input_dev, ABS_RX, 0, 23040, 0, 0);
781 /* pitch (-180, 180) */
782 input_set_abs_params(akm->input_dev, ABS_RY, -11520, 11520, 0, 0);
784 input_set_abs_params(akm->input_dev, ABS_RZ, -5760, 5760, 0, 0);
785 /* x-axis acceleration (720 x 8G) */
786 input_set_abs_params(akm->input_dev, ABS_X, -5760, 5760, 0, 0);
787 /* y-axis acceleration (720 x 8G) */
788 input_set_abs_params(akm->input_dev, ABS_Y, -5760, 5760, 0, 0);
789 /* z-axis acceleration (720 x 8G) */
790 input_set_abs_params(akm->input_dev, ABS_Z, -5760, 5760, 0, 0);
793 input_set_abs_params(akm->input_dev, ABS_THROTTLE, -30, 85, 0, 0);
795 /* status of magnetic sensor */
796 input_set_abs_params(akm->input_dev, ABS_RUDDER, -32768, 3, 0, 0);
797 /* status of acceleration sensor */
798 input_set_abs_params(akm->input_dev, ABS_WHEEL, -32768, 3, 0, 0);
799 /* x-axis of raw magnetic vector (-4096, 4095) */
800 input_set_abs_params(akm->input_dev, ABS_HAT0X, -20480, 20479, 0, 0);
801 /* y-axis of raw magnetic vector (-4096, 4095) */
802 input_set_abs_params(akm->input_dev, ABS_HAT0Y, -20480, 20479, 0, 0);
803 /* z-axis of raw magnetic vector (-4096, 4095) */
804 input_set_abs_params(akm->input_dev, ABS_BRAKE, -20480, 20479, 0, 0);
806 akm->input_dev->name = "compass";
809 err = input_register_device(akm->input_dev);
812 "AKM8975 akm8975_probe: Unable to register input device\n");
816 err = misc_register(&akmd_device);
819 "AKM8975 akm8975_probe: akmd_device register failed\n");
823 err = misc_register(&akm_aot_device);
826 "AKM8975 akm8975_probe: akm_aot_device register failed\n");
830 mutex_init(&sense_data_mutex);
832 init_waitqueue_head(&data_ready_wq);
833 init_waitqueue_head(&open_wq);
835 /* As default, report all information */
836 atomic_set(&m_flag, 1);
837 atomic_set(&a_flag, 1);
838 atomic_set(&mv_flag, 1);
840 akm->akm_early_suspend.suspend = akm8975_early_suspend;
841 akm->akm_early_suspend.resume = akm8975_early_resume;
842 register_early_suspend(&akm->akm_early_suspend);
844 AKMDBG("successfully probed.");
848 misc_deregister(&akmd_device);
850 input_unregister_device(akm->input_dev);
852 input_free_device(akm->input_dev);
854 free_irq(client->irq, akm);
864 static int akm8975_remove(struct i2c_client *client)
866 struct akm8975_data *akm = i2c_get_clientdata(client);
867 AKMFUNC("akm8975_remove");
868 unregister_early_suspend(&akm->akm_early_suspend);
869 misc_deregister(&akm_aot_device);
870 misc_deregister(&akmd_device);
871 input_unregister_device(akm->input_dev);
872 free_irq(client->irq, akm);
874 AKMDBG("successfully removed.");
878 static const struct i2c_device_id akm8975_id[] = {
879 {AKM8975_I2C_NAME, 0 },
883 static struct i2c_driver akm8975_driver = {
884 .probe = akm8975_probe,
885 .remove = akm8975_remove,
886 .id_table = akm8975_id,
888 .name = AKM8975_I2C_NAME,
892 static int __init akm8975_init(void)
894 printk(KERN_INFO "AKM8975 compass driver: initialize\n");
895 return i2c_add_driver(&akm8975_driver);
898 static void __exit akm8975_exit(void)
900 printk(KERN_INFO "AKM8975 compass driver: release\n");
901 i2c_del_driver(&akm8975_driver);
904 module_init(akm8975_init);
905 module_exit(akm8975_exit);
907 MODULE_AUTHOR("viral wang <viral_wang@htc.com>");
908 MODULE_DESCRIPTION("AKM8975 compass driver");
909 MODULE_LICENSE("GPL");