3 Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
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.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <linux/i2c.h>
21 #include <linux/i2c-dev.h>
22 #include <linux/interrupt.h>
23 #include <linux/module.h>
24 #include <linux/moduleparam.h>
25 #include <linux/kernel.h>
26 #include <linux/init.h>
27 #include <linux/stat.h>
28 #include <linux/irq.h>
29 #include <linux/gpio.h>
30 #include <linux/signal.h>
31 #include <linux/miscdevice.h>
32 #include <linux/slab.h>
33 #include <linux/version.h>
35 #include <linux/mutex.h>
36 #include <linux/suspend.h>
37 #include <linux/poll.h>
39 #include <linux/errno.h>
42 #include <linux/sched.h>
43 #include <linux/wait.h>
44 #include <linux/uaccess.h>
51 #include <linux/mpu.h>
54 /* Platform data for the MPU */
55 struct mpu_private_data {
56 struct miscdevice dev;
57 struct i2c_client *client;
60 struct mldl_cfg mldl_cfg;
61 struct mpu_ram mpu_ram;
62 struct mpu_gyro_cfg mpu_gyro_cfg;
63 struct mpu_offsets mpu_offsets;
64 struct mpu_chip_info mpu_chip_info;
65 struct inv_mpu_cfg inv_mpu_cfg;
66 struct inv_mpu_state inv_mpu_state;
69 wait_queue_head_t mpu_event_wait;
70 struct completion completion;
71 struct timer_list timeout;
72 struct notifier_block nb;
73 struct mpuirq_data mpu_pm_event;
74 int response_timeout; /* In seconds */
77 struct module *slave_modules[EXT_SLAVE_NUM_TYPES];
80 struct mpu_private_data *mpu_private_data;
81 static struct i2c_client *this_client;
83 static void mpu_pm_timeout(u_long data)
85 struct mpu_private_data *mpu = (struct mpu_private_data *)data;
86 struct i2c_client *client = mpu->client;
87 dev_dbg(&client->adapter->dev, "%s\n", __func__);
88 complete(&mpu->completion);
91 static int mpu_pm_notifier_callback(struct notifier_block *nb,
92 unsigned long event, void *unused)
94 struct mpu_private_data *mpu =
95 container_of(nb, struct mpu_private_data, nb);
96 struct i2c_client *client = mpu->client;
97 struct timeval event_time;
98 dev_dbg(&client->adapter->dev, "%s: %ld\n", __func__, event);
100 /* Prevent the file handle from being closed before we initialize
101 the completion event */
102 mutex_lock(&mpu->mutex);
104 (event != PM_SUSPEND_PREPARE && event != PM_POST_SUSPEND)) {
105 mutex_unlock(&mpu->mutex);
109 if (event == PM_SUSPEND_PREPARE)
110 mpu->event = MPU_PM_EVENT_SUSPEND_PREPARE;
111 if (event == PM_POST_SUSPEND)
112 mpu->event = MPU_PM_EVENT_POST_SUSPEND;
114 do_gettimeofday(&event_time);
115 mpu->mpu_pm_event.interruptcount++;
116 mpu->mpu_pm_event.irqtime =
117 (((long long)event_time.tv_sec) << 32) + event_time.tv_usec;
118 mpu->mpu_pm_event.data_type = MPUIRQ_DATA_TYPE_PM_EVENT;
119 mpu->mpu_pm_event.data = mpu->event;
121 if (mpu->response_timeout > 0) {
122 mpu->timeout.expires = jiffies + mpu->response_timeout * HZ;
123 add_timer(&mpu->timeout);
125 INIT_COMPLETION(mpu->completion);
126 mutex_unlock(&mpu->mutex);
128 wake_up_interruptible(&mpu->mpu_event_wait);
129 wait_for_completion(&mpu->completion);
130 del_timer_sync(&mpu->timeout);
131 dev_dbg(&client->adapter->dev, "%s: %ld DONE\n", __func__, event);
135 static int mpu_dev_open(struct inode *inode, struct file *file)
137 struct mpu_private_data *mpu =
138 (struct mpu_private_data *) i2c_get_clientdata(this_client);
139 struct i2c_client *client = mpu->client;
142 dev_dbg(&client->adapter->dev, "%s\n", __func__);
143 dev_dbg(&client->adapter->dev, "current->pid %d\n", current->pid);
145 result = mutex_lock_interruptible(&mpu->mutex);
147 mutex_unlock(&mpu->mutex);
150 mpu->pid = current->pid;
151 file->private_data = &mpu->dev;
153 /* Reset the sensors to the default */
155 dev_err(&client->adapter->dev,
156 "%s: mutex_lock_interruptible returned %d\n",
161 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++)
162 __module_get(mpu->slave_modules[ii]);
164 mutex_unlock(&mpu->mutex);
168 /* close function - called when the "file" /dev/mpu is closed in userspace */
169 static int mpu_release(struct inode *inode, struct file *file)
171 struct mpu_private_data *mpu =
172 container_of(file->private_data, struct mpu_private_data, dev);
173 struct i2c_client *client = mpu->client;
174 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
177 struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES];
178 struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave;
180 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
181 if (!pdata_slave[ii])
182 slave_adapter[ii] = NULL;
185 i2c_get_adapter(pdata_slave[ii]->adapt_num);
187 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter;
189 mutex_lock(&mpu->mutex);
190 mldl_cfg->inv_mpu_cfg->requested_sensors = 0;
191 result = inv_mpu_suspend(mldl_cfg,
192 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
193 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
194 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
195 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
198 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++)
199 module_put(mpu->slave_modules[ii]);
201 mutex_unlock(&mpu->mutex);
202 complete(&mpu->completion);
203 dev_dbg(&client->adapter->dev, "mpu_release\n");
208 /* read function called when from /dev/mpu is read. Read from the FIFO */
209 static ssize_t mpu_read(struct file *file,
210 char __user *buf, size_t count, loff_t *offset)
212 struct mpu_private_data *mpu =
213 container_of(file->private_data, struct mpu_private_data, dev);
214 struct i2c_client *client = mpu->client;
215 size_t len = sizeof(mpu->mpu_pm_event) + sizeof(unsigned long);
218 if (!mpu->event && (!(file->f_flags & O_NONBLOCK)))
219 wait_event_interruptible(mpu->mpu_event_wait, mpu->event);
221 if (!mpu->event || !buf
222 || count < sizeof(mpu->mpu_pm_event))
225 err = copy_to_user(buf, &mpu->mpu_pm_event, sizeof(mpu->mpu_pm_event));
227 dev_err(&client->adapter->dev,
228 "Copy to user returned %d\n", err);
235 static unsigned int mpu_poll(struct file *file, struct poll_table_struct *poll)
237 struct mpu_private_data *mpu =
238 container_of(file->private_data, struct mpu_private_data, dev);
241 poll_wait(file, &mpu->mpu_event_wait, poll);
243 mask |= POLLIN | POLLRDNORM;
247 static int mpu_dev_ioctl_get_ext_slave_platform_data(
248 struct i2c_client *client,
249 struct ext_slave_platform_data __user *arg)
251 struct mpu_private_data *mpu =
252 (struct mpu_private_data *)i2c_get_clientdata(client);
253 struct ext_slave_platform_data *pdata_slave;
254 struct ext_slave_platform_data local_pdata_slave;
256 if (copy_from_user(&local_pdata_slave, arg, sizeof(local_pdata_slave)))
259 if (local_pdata_slave.type >= EXT_SLAVE_NUM_TYPES)
262 pdata_slave = mpu->mldl_cfg.pdata_slave[local_pdata_slave.type];
263 /* All but private data and irq_data */
266 if (copy_to_user(arg, pdata_slave, sizeof(*pdata_slave)))
271 static int mpu_dev_ioctl_get_mpu_platform_data(
272 struct i2c_client *client,
273 struct mpu_platform_data __user *arg)
275 struct mpu_private_data *mpu =
276 (struct mpu_private_data *)i2c_get_clientdata(client);
277 struct mpu_platform_data *pdata = mpu->mldl_cfg.pdata;
279 if (copy_to_user(arg, pdata, sizeof(*pdata)))
284 static int mpu_dev_ioctl_get_ext_slave_descr(
285 struct i2c_client *client,
286 struct ext_slave_descr __user *arg)
288 struct mpu_private_data *mpu =
289 (struct mpu_private_data *)i2c_get_clientdata(client);
290 struct ext_slave_descr *slave;
291 struct ext_slave_descr local_slave;
293 if (copy_from_user(&local_slave, arg, sizeof(local_slave)))
296 if (local_slave.type >= EXT_SLAVE_NUM_TYPES)
299 slave = mpu->mldl_cfg.slave[local_slave.type];
300 /* All but private data and irq_data */
303 if (copy_to_user(arg, slave, sizeof(*slave)))
310 * slave_config() - Pass a requested slave configuration to the slave sensor
312 * @adapter the adaptor to use to communicate with the slave
313 * @mldl_cfg the mldl configuration structuer
314 * @slave pointer to the slave descriptor
315 * @usr_config The configuration to pass to the slave sensor
317 * returns 0 or non-zero error code
319 static int inv_mpu_config(struct mldl_cfg *mldl_cfg,
321 struct ext_slave_config __user *usr_config)
324 struct ext_slave_config config;
326 retval = copy_from_user(&config, usr_config, sizeof(config));
330 if (config.len && config.data) {
332 data = kmalloc(config.len, GFP_KERNEL);
336 retval = copy_from_user(data,
337 (void __user *)config.data, config.len);
345 retval = gyro_config(gyro_adapter, mldl_cfg, &config);
350 static int inv_mpu_get_config(struct mldl_cfg *mldl_cfg,
352 struct ext_slave_config __user *usr_config)
355 struct ext_slave_config config;
358 retval = copy_from_user(&config, usr_config, sizeof(config));
362 user_data = config.data;
363 if (config.len && config.data) {
365 data = kmalloc(config.len, GFP_KERNEL);
369 retval = copy_from_user(data,
370 (void __user *)config.data, config.len);
378 retval = gyro_get_config(gyro_adapter, mldl_cfg, &config);
380 retval = copy_to_user((unsigned char __user *)user_data,
381 config.data, config.len);
386 static int slave_config(struct mldl_cfg *mldl_cfg,
389 struct ext_slave_descr *slave,
390 struct ext_slave_platform_data *pdata,
391 struct ext_slave_config __user *usr_config)
394 struct ext_slave_config config;
395 if ((!slave) || (!slave->config))
398 retval = copy_from_user(&config, usr_config, sizeof(config));
402 if (config.len && config.data) {
404 data = kmalloc(config.len, GFP_KERNEL);
408 retval = copy_from_user(data,
409 (void __user *)config.data, config.len);
417 retval = inv_mpu_slave_config(mldl_cfg, gyro_adapter, slave_adapter,
418 &config, slave, pdata);
423 static int slave_get_config(struct mldl_cfg *mldl_cfg,
426 struct ext_slave_descr *slave,
427 struct ext_slave_platform_data *pdata,
428 struct ext_slave_config __user *usr_config)
431 struct ext_slave_config config;
433 if (!(slave) || !(slave->get_config))
436 retval = copy_from_user(&config, usr_config, sizeof(config));
440 user_data = config.data;
441 if (config.len && config.data) {
443 data = kmalloc(config.len, GFP_KERNEL);
447 retval = copy_from_user(data,
448 (void __user *)config.data, config.len);
456 retval = inv_mpu_get_slave_config(mldl_cfg, gyro_adapter,
457 slave_adapter, &config, slave, pdata);
462 retval = copy_to_user((unsigned char __user *)user_data,
463 config.data, config.len);
468 static int inv_slave_read(struct mldl_cfg *mldl_cfg,
471 struct ext_slave_descr *slave,
472 struct ext_slave_platform_data *pdata,
473 void __user *usr_data)
477 data = kzalloc(slave->read_len, GFP_KERNEL);
481 retval = inv_mpu_slave_read(mldl_cfg, gyro_adapter, slave_adapter,
485 (copy_to_user((unsigned char __user *)usr_data,
486 data, slave->read_len)))
493 static int mpu_handle_mlsl(void *sl_handle,
496 struct mpu_read_write __user *usr_msg)
499 struct mpu_read_write msg;
500 unsigned char *user_data;
501 retval = copy_from_user(&msg, usr_msg, sizeof(msg));
505 user_data = msg.data;
506 if (msg.length && msg.data) {
508 data = kmalloc(msg.length, GFP_KERNEL);
512 retval = copy_from_user(data,
513 (void __user *)msg.data, msg.length);
526 retval = inv_serial_read(sl_handle, addr,
527 msg.address, msg.length, msg.data);
530 retval = inv_serial_write(sl_handle, addr,
531 msg.length, msg.data);
534 retval = inv_serial_read_mem(sl_handle, addr,
535 msg.address, msg.length, msg.data);
538 retval = inv_serial_write_mem(sl_handle, addr,
539 msg.address, msg.length,
543 retval = inv_serial_read_fifo(sl_handle, addr,
544 msg.length, msg.data);
547 retval = inv_serial_write_fifo(sl_handle, addr,
548 msg.length, msg.data);
553 dev_err(&((struct i2c_adapter *)sl_handle)->dev,
554 "%s: i2c %d error %d\n",
555 __func__, cmd, retval);
559 retval = copy_to_user((unsigned char __user *)user_data,
560 msg.data, msg.length);
565 /* ioctl - I/O control */
566 static long mpu_dev_ioctl(struct file *file,
567 unsigned int cmd, unsigned long arg)
569 struct mpu_private_data *mpu =
570 container_of(file->private_data, struct mpu_private_data, dev);
571 struct i2c_client *client = mpu->client;
572 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
574 struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES];
575 struct ext_slave_descr **slave = mldl_cfg->slave;
576 struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave;
579 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
580 if (!pdata_slave[ii])
581 slave_adapter[ii] = NULL;
584 i2c_get_adapter(pdata_slave[ii]->adapt_num);
586 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter;
588 retval = mutex_lock_interruptible(&mpu->mutex);
590 dev_err(&this_client->adapter->dev,
591 "%s: mutex_lock_interruptible returned %d\n",
597 case MPU_GET_EXT_SLAVE_PLATFORM_DATA:
598 retval = mpu_dev_ioctl_get_ext_slave_platform_data(
600 (struct ext_slave_platform_data __user *)arg);
602 case MPU_GET_MPU_PLATFORM_DATA:
603 retval = mpu_dev_ioctl_get_mpu_platform_data(
605 (struct mpu_platform_data __user *)arg);
607 case MPU_GET_EXT_SLAVE_DESCR:
608 retval = mpu_dev_ioctl_get_ext_slave_descr(
610 (struct ext_slave_descr __user *)arg);
618 retval = mpu_handle_mlsl(
619 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
620 mldl_cfg->mpu_chip_info->addr, cmd,
621 (struct mpu_read_write __user *)arg);
623 case MPU_CONFIG_GYRO:
624 retval = inv_mpu_config(
626 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
627 (struct ext_slave_config __user *)arg);
629 case MPU_CONFIG_ACCEL:
630 retval = slave_config(
632 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
633 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
634 slave[EXT_SLAVE_TYPE_ACCEL],
635 pdata_slave[EXT_SLAVE_TYPE_ACCEL],
636 (struct ext_slave_config __user *)arg);
638 case MPU_CONFIG_COMPASS:
639 retval = slave_config(
641 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
642 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
643 slave[EXT_SLAVE_TYPE_COMPASS],
644 pdata_slave[EXT_SLAVE_TYPE_COMPASS],
645 (struct ext_slave_config __user *)arg);
647 case MPU_CONFIG_PRESSURE:
648 retval = slave_config(
650 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
651 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
652 slave[EXT_SLAVE_TYPE_PRESSURE],
653 pdata_slave[EXT_SLAVE_TYPE_PRESSURE],
654 (struct ext_slave_config __user *)arg);
656 case MPU_GET_CONFIG_GYRO:
657 retval = inv_mpu_get_config(
659 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
660 (struct ext_slave_config __user *)arg);
662 case MPU_GET_CONFIG_ACCEL:
663 retval = slave_get_config(
665 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
666 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
667 slave[EXT_SLAVE_TYPE_ACCEL],
668 pdata_slave[EXT_SLAVE_TYPE_ACCEL],
669 (struct ext_slave_config __user *)arg);
671 case MPU_GET_CONFIG_COMPASS:
672 retval = slave_get_config(
674 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
675 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
676 slave[EXT_SLAVE_TYPE_COMPASS],
677 pdata_slave[EXT_SLAVE_TYPE_COMPASS],
678 (struct ext_slave_config __user *)arg);
680 case MPU_GET_CONFIG_PRESSURE:
681 retval = slave_get_config(
683 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
684 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
685 slave[EXT_SLAVE_TYPE_PRESSURE],
686 pdata_slave[EXT_SLAVE_TYPE_PRESSURE],
687 (struct ext_slave_config __user *)arg);
690 retval = inv_mpu_suspend(
692 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
693 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
694 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
695 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
699 retval = inv_mpu_resume(
701 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
702 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
703 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
704 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
707 case MPU_PM_EVENT_HANDLED:
708 dev_dbg(&client->adapter->dev, "%s: %d\n", __func__, cmd);
709 complete(&mpu->completion);
712 retval = inv_slave_read(
714 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
715 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
716 slave[EXT_SLAVE_TYPE_ACCEL],
717 pdata_slave[EXT_SLAVE_TYPE_ACCEL],
718 (unsigned char __user *)arg);
720 case MPU_READ_COMPASS:
721 retval = inv_slave_read(
723 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
724 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
725 slave[EXT_SLAVE_TYPE_COMPASS],
726 pdata_slave[EXT_SLAVE_TYPE_COMPASS],
727 (unsigned char __user *)arg);
729 case MPU_READ_PRESSURE:
730 retval = inv_slave_read(
732 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
733 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
734 slave[EXT_SLAVE_TYPE_PRESSURE],
735 pdata_slave[EXT_SLAVE_TYPE_PRESSURE],
736 (unsigned char __user *)arg);
738 case MPU_GET_REQUESTED_SENSORS:
741 &mldl_cfg->inv_mpu_cfg->requested_sensors,
742 sizeof(mldl_cfg->inv_mpu_cfg->requested_sensors)))
745 case MPU_SET_REQUESTED_SENSORS:
746 mldl_cfg->inv_mpu_cfg->requested_sensors = arg;
748 case MPU_GET_IGNORE_SYSTEM_SUSPEND:
750 (unsigned char __user *)arg,
751 &mldl_cfg->inv_mpu_cfg->ignore_system_suspend,
752 sizeof(mldl_cfg->inv_mpu_cfg->ignore_system_suspend)))
755 case MPU_SET_IGNORE_SYSTEM_SUSPEND:
756 mldl_cfg->inv_mpu_cfg->ignore_system_suspend = arg;
758 case MPU_GET_MLDL_STATUS:
760 (unsigned char __user *)arg,
761 &mldl_cfg->inv_mpu_state->status,
762 sizeof(mldl_cfg->inv_mpu_state->status)))
765 case MPU_GET_I2C_SLAVES_ENABLED:
767 (unsigned char __user *)arg,
768 &mldl_cfg->inv_mpu_state->i2c_slaves_enabled,
769 sizeof(mldl_cfg->inv_mpu_state->i2c_slaves_enabled)))
773 dev_err(&client->adapter->dev,
774 "%s: Unknown cmd %x, arg %lu\n",
779 mutex_unlock(&mpu->mutex);
782 //dev_dbg(&client->adapter->dev, "%s: %08x, %08lx, %d\n",__func__, cmd, arg, retval);
790 void mpu_shutdown(struct i2c_client *client)
792 struct mpu_private_data *mpu =
793 (struct mpu_private_data *)i2c_get_clientdata(client);
794 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
795 struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES];
796 struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave;
799 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
800 if (!pdata_slave[ii])
801 slave_adapter[ii] = NULL;
804 i2c_get_adapter(pdata_slave[ii]->adapt_num);
806 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter;
808 mutex_lock(&mpu->mutex);
809 (void)inv_mpu_suspend(mldl_cfg,
810 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
811 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
812 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
813 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
815 mutex_unlock(&mpu->mutex);
816 dev_dbg(&client->adapter->dev, "%s\n", __func__);
819 int mpu_dev_suspend(struct i2c_client *client, pm_message_t mesg)
821 struct mpu_private_data *mpu =
822 (struct mpu_private_data *)i2c_get_clientdata(client);
823 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
824 struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES];
825 struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave;
828 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
829 if (!pdata_slave[ii])
830 slave_adapter[ii] = NULL;
833 i2c_get_adapter(pdata_slave[ii]->adapt_num);
835 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter;
837 mutex_lock(&mpu->mutex);
838 if (!mldl_cfg->inv_mpu_cfg->ignore_system_suspend) {
839 dev_dbg(&client->adapter->dev,
840 "%s: suspending on event %d\n", __func__, mesg.event);
841 (void)inv_mpu_suspend(mldl_cfg,
842 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
843 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
844 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
845 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
848 dev_dbg(&client->adapter->dev,
849 "%s: Already suspended %d\n", __func__, mesg.event);
851 mutex_unlock(&mpu->mutex);
855 int mpu_dev_resume(struct i2c_client *client)
857 struct mpu_private_data *mpu =
858 (struct mpu_private_data *)i2c_get_clientdata(client);
859 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
860 struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES];
861 struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave;
864 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
865 if (!pdata_slave[ii])
866 slave_adapter[ii] = NULL;
869 i2c_get_adapter(pdata_slave[ii]->adapt_num);
871 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter;
873 mutex_lock(&mpu->mutex);
874 if (mpu->pid && !mldl_cfg->inv_mpu_cfg->ignore_system_suspend) {
875 (void)inv_mpu_resume(mldl_cfg,
876 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
877 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
878 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
879 slave_adapter[EXT_SLAVE_TYPE_PRESSURE],
880 mldl_cfg->inv_mpu_cfg->requested_sensors);
881 dev_dbg(&client->adapter->dev,
882 "%s for pid %d\n", __func__, mpu->pid);
884 mutex_unlock(&mpu->mutex);
888 /* define which file operations are supported */
889 static const struct file_operations mpu_fops = {
890 .owner = THIS_MODULE,
893 #if HAVE_COMPAT_IOCTL
894 .compat_ioctl = mpu_dev_ioctl,
896 #if HAVE_UNLOCKED_IOCTL
897 .unlocked_ioctl = mpu_dev_ioctl,
899 //.unlocked_ioctl = mpu_dev_ioctl,
900 .open = mpu_dev_open,
901 .release = mpu_release,
904 int inv_mpu_register_slave(struct module *slave_module,
905 struct i2c_client *slave_client,
906 struct ext_slave_platform_data *slave_pdata,
907 struct ext_slave_descr *(*get_slave_descr)(void))
909 struct mpu_private_data *mpu = mpu_private_data;
910 struct mldl_cfg *mldl_cfg;
911 struct ext_slave_descr *slave_descr;
912 struct ext_slave_platform_data **pdata_slave;
913 char *irq_name = NULL;
916 if (!slave_client || !slave_pdata || !get_slave_descr)
920 dev_err(&slave_client->adapter->dev,
921 "%s: Null mpu_private_data\n", __func__);
924 mldl_cfg = &mpu->mldl_cfg;
925 pdata_slave = mldl_cfg->pdata_slave;
926 slave_descr = get_slave_descr();
929 dev_err(&slave_client->adapter->dev,
930 "%s: Null ext_slave_descr\n", __func__);
934 mutex_lock(&mpu->mutex);
936 mutex_unlock(&mpu->mutex);
940 if (pdata_slave[slave_descr->type]) {
942 goto out_unlock_mutex;
945 slave_pdata->address = slave_client->addr;
946 slave_pdata->irq = gpio_to_irq(slave_client->irq);
947 slave_pdata->adapt_num = i2c_adapter_id(slave_client->adapter);
949 dev_info(&slave_client->adapter->dev,
950 "%s: +%s Type %d: Addr: %2x IRQ: %2d, Adapt: %2d\n",
954 slave_pdata->address,
956 slave_pdata->adapt_num);
958 switch (slave_descr->type) {
959 case EXT_SLAVE_TYPE_ACCEL:
960 irq_name = "accelirq";
962 case EXT_SLAVE_TYPE_COMPASS:
963 irq_name = "compassirq";
965 case EXT_SLAVE_TYPE_PRESSURE:
966 irq_name = "pressureirq";
971 if (slave_descr->init) {
972 result = slave_descr->init(slave_client->adapter,
976 dev_err(&slave_client->adapter->dev,
977 "%s init failed %d\n",
978 slave_descr->name, result);
979 goto out_unlock_mutex;
983 pdata_slave[slave_descr->type] = slave_pdata;
984 mpu->slave_modules[slave_descr->type] = slave_module;
985 mldl_cfg->slave[slave_descr->type] = slave_descr;
987 goto out_unlock_mutex;
990 mutex_unlock(&mpu->mutex);
992 if (!result && irq_name && (slave_pdata->irq > 0)) {
994 dev_info(&slave_client->adapter->dev,
995 "Installing %s irq using %d\n",
998 warn_result = slaveirq_init(slave_client->adapter,
999 slave_pdata, irq_name);
1001 dev_err(&slave_client->adapter->dev,
1002 "%s irq assigned error: %d\n",
1003 slave_descr->name, warn_result);
1005 dev_warn(&slave_client->adapter->dev,
1006 "%s irq not assigned: %d %d %d\n",
1008 result, (int)irq_name, slave_pdata->irq);
1013 EXPORT_SYMBOL(inv_mpu_register_slave);
1015 void inv_mpu_unregister_slave(struct i2c_client *slave_client,
1016 struct ext_slave_platform_data *slave_pdata,
1017 struct ext_slave_descr *(*get_slave_descr)(void))
1019 struct mpu_private_data *mpu = mpu_private_data;
1020 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
1021 struct ext_slave_descr *slave_descr;
1024 dev_info(&slave_client->adapter->dev, "%s\n", __func__);
1026 if (!slave_client || !slave_pdata || !get_slave_descr)
1029 if (slave_pdata->irq)
1030 slaveirq_exit(slave_pdata);
1032 slave_descr = get_slave_descr();
1036 mutex_lock(&mpu->mutex);
1038 if (slave_descr->exit) {
1039 result = slave_descr->exit(slave_client->adapter,
1043 dev_err(&slave_client->adapter->dev,
1044 "Accel exit failed %d\n", result);
1046 mldl_cfg->slave[slave_descr->type] = NULL;
1047 mldl_cfg->pdata_slave[slave_descr->type] = NULL;
1048 mpu->slave_modules[slave_descr->type] = NULL;
1050 mutex_unlock(&mpu->mutex);
1053 EXPORT_SYMBOL(inv_mpu_unregister_slave);
1055 static unsigned short normal_i2c[] = { I2C_CLIENT_END };
1057 static const struct i2c_device_id mpu_id[] = {
1060 {"mpu6050_no_accel", 0},
1063 MODULE_DEVICE_TABLE(i2c, mpu_id);
1065 int mpu_probe(struct i2c_client *client, const struct i2c_device_id *devid)
1067 struct mpu_platform_data *pdata;
1068 struct mpu_private_data *mpu;
1069 struct mldl_cfg *mldl_cfg;
1073 dev_info(&client->adapter->dev, "%s: %d\n", __func__, ii++);
1075 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1077 goto out_check_functionality_failed;
1080 mpu = kzalloc(sizeof(struct mpu_private_data), GFP_KERNEL);
1083 goto out_alloc_data_failed;
1085 mldl_cfg = &mpu->mldl_cfg;
1086 mldl_cfg->mpu_ram = &mpu->mpu_ram;
1087 mldl_cfg->mpu_gyro_cfg = &mpu->mpu_gyro_cfg;
1088 mldl_cfg->mpu_offsets = &mpu->mpu_offsets;
1089 mldl_cfg->mpu_chip_info = &mpu->mpu_chip_info;
1090 mldl_cfg->inv_mpu_cfg = &mpu->inv_mpu_cfg;
1091 mldl_cfg->inv_mpu_state = &mpu->inv_mpu_state;
1093 mldl_cfg->mpu_ram->length = MPU_MEM_NUM_RAM_BANKS * MPU_MEM_BANK_SIZE;
1094 mldl_cfg->mpu_ram->ram = kzalloc(mldl_cfg->mpu_ram->length, GFP_KERNEL);
1095 if (!mldl_cfg->mpu_ram->ram) {
1097 goto out_alloc_ram_failed;
1099 mpu_private_data = mpu;
1100 i2c_set_clientdata(client, mpu);
1101 this_client = client;
1102 mpu->client = client;
1104 init_waitqueue_head(&mpu->mpu_event_wait);
1105 mutex_init(&mpu->mutex);
1106 init_completion(&mpu->completion);
1108 mpu->response_timeout = 60; /* Seconds */
1109 mpu->timeout.function = mpu_pm_timeout;
1110 mpu->timeout.data = (u_long) mpu;
1111 init_timer(&mpu->timeout);
1113 mpu->nb.notifier_call = mpu_pm_notifier_callback;
1114 mpu->nb.priority = 0;
1115 res = register_pm_notifier(&mpu->nb);
1117 dev_err(&client->adapter->dev,
1118 "Unable to register pm_notifier %d\n", res);
1119 goto out_register_pm_notifier_failed;
1122 pdata = (struct mpu_platform_data *)client->dev.platform_data;
1124 dev_WARN(&client->adapter->dev,
1125 "Missing platform data for mpu\n");
1127 mldl_cfg->pdata = pdata;
1129 mldl_cfg->mpu_chip_info->addr = client->addr;
1130 res = inv_mpu_open(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL);
1133 dev_err(&client->adapter->dev,
1134 "Unable to open %s %d\n", MPU_NAME, res);
1136 goto out_whoami_failed;
1139 mpu->dev.minor = MISC_DYNAMIC_MINOR;
1140 mpu->dev.name = "mpu";
1141 mpu->dev.fops = &mpu_fops;
1142 res = misc_register(&mpu->dev);
1144 dev_err(&client->adapter->dev,
1145 "ERROR: misc_register returned %d\n", res);
1146 goto out_misc_register_failed;
1150 dev_info(&client->adapter->dev,
1151 "Installing irq using %d\n", client->irq);
1152 res = mpuirq_init(client, mldl_cfg);
1154 goto out_mpuirq_failed;
1156 dev_WARN(&client->adapter->dev,
1157 "Missing %s IRQ\n", MPU_NAME);
1162 misc_deregister(&mpu->dev);
1163 out_misc_register_failed:
1164 inv_mpu_close(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL);
1166 unregister_pm_notifier(&mpu->nb);
1167 out_register_pm_notifier_failed:
1168 kfree(mldl_cfg->mpu_ram->ram);
1169 mpu_private_data = NULL;
1170 out_alloc_ram_failed:
1172 out_alloc_data_failed:
1173 out_check_functionality_failed:
1174 dev_err(&client->adapter->dev, "%s failed %d\n", __func__, res);
1179 static int mpu_remove(struct i2c_client *client)
1181 struct mpu_private_data *mpu = i2c_get_clientdata(client);
1182 struct i2c_adapter *slave_adapter[EXT_SLAVE_NUM_TYPES];
1183 struct mldl_cfg *mldl_cfg = &mpu->mldl_cfg;
1184 struct ext_slave_platform_data **pdata_slave = mldl_cfg->pdata_slave;
1187 for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
1188 if (!pdata_slave[ii])
1189 slave_adapter[ii] = NULL;
1192 i2c_get_adapter(pdata_slave[ii]->adapt_num);
1195 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE] = client->adapter;
1196 dev_dbg(&client->adapter->dev, "%s\n", __func__);
1198 inv_mpu_close(mldl_cfg,
1199 slave_adapter[EXT_SLAVE_TYPE_GYROSCOPE],
1200 slave_adapter[EXT_SLAVE_TYPE_ACCEL],
1201 slave_adapter[EXT_SLAVE_TYPE_COMPASS],
1202 slave_adapter[EXT_SLAVE_TYPE_PRESSURE]);
1208 misc_deregister(&mpu->dev);
1210 unregister_pm_notifier(&mpu->nb);
1212 kfree(mpu->mldl_cfg.mpu_ram->ram);
1218 static struct i2c_driver mpu_driver = {
1219 .class = I2C_CLASS_HWMON,
1221 .remove = mpu_remove,
1224 .owner = THIS_MODULE,
1227 .address_list = normal_i2c,
1228 .shutdown = mpu_shutdown, /* optional */
1229 .suspend = mpu_dev_suspend, /* optional */
1230 .resume = mpu_dev_resume, /* optional */
1234 static int __init mpu_init(void)
1236 int res = i2c_add_driver(&mpu_driver);
1237 pr_info("%s: Probe name %s\n", __func__, MPU_NAME);
1239 pr_err("%s failed\n", __func__);
1243 static void __exit mpu_exit(void)
1245 pr_info("%s\n", __func__);
1246 i2c_del_driver(&mpu_driver);
1249 module_init(mpu_init);
1250 module_exit(mpu_exit);
1252 MODULE_AUTHOR("Invensense Corporation");
1253 MODULE_DESCRIPTION("User space character device interface for MPU");
1254 MODULE_LICENSE("GPL");
1255 MODULE_ALIAS(MPU_NAME);