2 * Copyright (C) 2016 Google, Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/kernel.h>
18 #include <linux/slab.h>
19 #include <linux/iio/iio.h>
20 #include <linux/firmware.h>
22 #include <linux/cdev.h>
23 #include <linux/uaccess.h>
24 #include <linux/delay.h>
25 #include <linux/of_gpio.h>
26 #include <linux/of_irq.h>
27 #include <linux/interrupt.h>
28 #include <linux/poll.h>
29 #include <linux/list.h>
30 #include <linux/vmalloc.h>
31 #include <linux/spinlock.h>
32 #include <linux/semaphore.h>
33 #include <linux/sched.h>
34 #include <linux/sched/rt.h>
35 #include <linux/sched/prio.h>
36 #include <linux/sched/signal.h>
37 #include <linux/time.h>
38 #include <linux/platform_data/nanohub.h>
39 #include <uapi/linux/sched/types.h>
45 #if defined(CONFIG_NANOHUB_MAILBOX)
48 #elif defined(CONFIG_SPI_MAILBOX)
52 #define READ_QUEUE_DEPTH 10
53 #define APP_FROM_HOST_EVENTID 0x000000F8
54 #define FIRST_SENSOR_EVENTID 0x00000200
55 #define LAST_SENSOR_EVENTID 0x000002FF
56 #define APP_TO_HOST_EVENTID 0x00000401
57 #define OS_LOG_EVENTID 0x3B474F4C
58 #define WAKEUP_INTERRUPT 1
59 #define WAKEUP_TIMEOUT_MS 1000
60 #define SUSPEND_TIMEOUT_MS 100
61 #define KTHREAD_ERR_TIME_NS (60LL * NSEC_PER_SEC)
62 #define KTHREAD_ERR_CNT 70
63 #define KTHREAD_WARN_CNT 10
64 #define WAKEUP_ERR_TIME_NS (60LL * NSEC_PER_SEC)
65 #define WAKEUP_ERR_CNT 4
67 #ifdef CONFIG_EXT_CHUB
69 * struct gpio_config - this is a binding between platform data and driver data
70 * @label: for diagnostics
71 * @flags: to pass to gpio_request_one()
72 * @options: one or more of GPIO_OPT_* flags, below
73 * @pdata_off: offset of u32 field in platform data with gpio #
74 * @data_off: offset of int field in driver data with irq # (optional)
84 #define GPIO_OPT_HAS_IRQ 0x0001
85 #define GPIO_OPT_OPTIONAL 0x8000
87 #define PLAT_GPIO_DEF(name, _flags) \
88 .pdata_off = offsetof(struct nanohub_platform_data, name ## _gpio), \
89 .label = "nanohub_" #name, \
92 #define PLAT_GPIO_DEF_IRQ(name, _flags, _opts) \
93 PLAT_GPIO_DEF(name, _flags), \
94 .data_off = offsetof(struct nanohub_data, name), \
95 .options = GPIO_OPT_HAS_IRQ | (_opts) \
99 static int nanohub_open(struct inode
*, struct file
*);
100 static ssize_t
nanohub_read(struct file
*, char *, size_t, loff_t
*);
101 static ssize_t
nanohub_write(struct file
*, const char *, size_t, loff_t
*);
102 static unsigned int nanohub_poll(struct file
*, poll_table
*);
103 static int nanohub_release(struct inode
*, struct file
*);
104 static int nanohub_hw_reset(struct nanohub_data
*data
);
106 static int chub_dev_open(struct inode
*, struct file
*);
107 static ssize_t
chub_dev_read(struct file
*, char *, size_t, loff_t
*);
108 static ssize_t
chub_dev_write(struct file
*, const char *, size_t, loff_t
*);
110 static struct class *sensor_class
;
111 static int major
, chub_dev_major
;
113 extern const char *os_image
[SENSOR_VARIATION
];
115 #ifdef CONFIG_EXT_CHUB
116 static const struct gpio_config gconf
[] = {
117 { PLAT_GPIO_DEF(nreset
, GPIOF_OUT_INIT_HIGH
) },
118 { PLAT_GPIO_DEF(wakeup
, GPIOF_OUT_INIT_HIGH
) },
119 { PLAT_GPIO_DEF(boot0
, GPIOF_OUT_INIT_LOW
) },
120 { PLAT_GPIO_DEF_IRQ(irq1
, GPIOF_DIR_IN
, 0) },
121 { PLAT_GPIO_DEF_IRQ(irq2
, GPIOF_DIR_IN
, GPIO_OPT_OPTIONAL
) },
125 static const struct iio_info nanohub_iio_info
= {
126 .driver_module
= THIS_MODULE
,
129 static const struct file_operations nanohub_fileops
= {
130 .owner
= THIS_MODULE
,
131 .open
= nanohub_open
,
132 .read
= nanohub_read
,
133 .write
= nanohub_write
,
134 .poll
= nanohub_poll
,
135 .release
= nanohub_release
,
138 static const struct file_operations chub_dev_fileops
= {
139 .owner
= THIS_MODULE
,
140 .open
= chub_dev_open
,
141 .read
= chub_dev_read
,
142 .write
= chub_dev_write
,
151 #ifdef CONFIG_EXT_CHUB
152 static inline bool gpio_is_optional(const struct gpio_config
*_cfg
)
154 return _cfg
->options
& GPIO_OPT_OPTIONAL
;
157 static inline bool gpio_has_irq(const struct gpio_config
*_cfg
)
159 return _cfg
->options
& GPIO_OPT_HAS_IRQ
;
163 static inline bool nanohub_has_priority_lock_locked(struct nanohub_data
*data
)
165 return atomic_read(&data
->wakeup_lock_cnt
) >
166 atomic_read(&data
->wakeup_cnt
);
169 static inline void nanohub_notify_thread(struct nanohub_data
*data
)
171 atomic_set(&data
->kthread_run
, 1);
172 /* wake_up implementation works as memory barrier */
173 wake_up_interruptible_sync(&data
->kthread_wait
);
176 static inline void nanohub_io_init(struct nanohub_io
*io
,
177 struct nanohub_data
*data
,
180 init_waitqueue_head(&io
->buf_wait
);
181 INIT_LIST_HEAD(&io
->buf_list
);
186 static inline bool nanohub_io_has_buf(struct nanohub_io
*io
)
188 return !list_empty(&io
->buf_list
);
191 #ifdef CONFIG_NANOHUB_MAILBOX
192 #define EVT_DEBUG_DUMP 0x00007F02 /* defined on sensorhal */
194 int nanohub_is_reset_notify_io(struct nanohub_buf
*buf
)
197 uint32_t *buffer
= (uint32_t *)buf
->buffer
;
198 if (*buffer
== EVT_DEBUG_DUMP
)
205 static struct nanohub_buf
*nanohub_io_get_buf(struct nanohub_io
*io
,
208 struct nanohub_buf
*buf
= NULL
;
211 spin_lock(&io
->buf_wait
.lock
);
213 ret
= wait_event_interruptible_locked(io
->buf_wait
,
214 nanohub_io_has_buf(io
));
216 spin_unlock(&io
->buf_wait
.lock
);
221 if (nanohub_io_has_buf(io
)) {
222 buf
= list_first_entry(&io
->buf_list
, struct nanohub_buf
, list
);
223 list_del(&buf
->list
);
225 spin_unlock(&io
->buf_wait
.lock
);
230 static void nanohub_io_put_buf(struct nanohub_io
*io
,
231 struct nanohub_buf
*buf
)
235 spin_lock(&io
->buf_wait
.lock
);
236 was_empty
= !nanohub_io_has_buf(io
);
237 list_add_tail(&buf
->list
, &io
->buf_list
);
238 spin_unlock(&io
->buf_wait
.lock
);
241 if (&io
->data
->free_pool
== io
)
242 nanohub_notify_thread(io
->data
);
244 wake_up_interruptible(&io
->buf_wait
);
248 #ifdef CONFIG_EXT_CHUB
249 static inline int plat_gpio_get(struct nanohub_data
*data
,
250 const struct gpio_config
*_cfg
)
252 const struct nanohub_platform_data
*pdata
= data
->pdata
;
254 return *(u32
*)(((char *)pdata
) + (_cfg
)->pdata_off
);
257 static inline void nanohub_set_irq_data(struct nanohub_data
*data
,
258 const struct gpio_config
*_cfg
, int val
)
260 int *data_addr
= ((int *)(((char *)data
) + _cfg
->data_off
));
262 if ((void *)data_addr
> (void *)data
&&
263 (void *)data_addr
< (void *)(data
+ 1))
266 WARN(1, "No data binding defined for %s", _cfg
->label
);
270 static inline void mcu_wakeup_gpio_set_value(struct nanohub_data
*data
,
273 #ifdef CONFIG_EXT_CHUB
274 const struct nanohub_platform_data
*pdata
= data
->pdata
;
276 gpio_set_value(pdata
->wakeup_gpio
, val
);
279 contexthub_ipc_write_event(data
->pdata
->mailbox_client
, MAILBOX_EVT_WAKEUP_CLR
);
281 contexthub_ipc_write_event(data
->pdata
->mailbox_client
, MAILBOX_EVT_WAKEUP
);
285 static inline void mcu_wakeup_gpio_get_locked(struct nanohub_data
*data
,
288 atomic_inc(&data
->wakeup_lock_cnt
);
289 if (!priority_lock
&& atomic_inc_return(&data
->wakeup_cnt
) == 1 &&
290 !nanohub_has_priority_lock_locked(data
))
291 mcu_wakeup_gpio_set_value(data
, 0);
294 static inline bool mcu_wakeup_gpio_put_locked(struct nanohub_data
*data
,
297 bool gpio_done
= priority_lock
?
298 atomic_read(&data
->wakeup_cnt
) == 0 :
299 atomic_dec_and_test(&data
->wakeup_cnt
);
300 bool done
= atomic_dec_and_test(&data
->wakeup_lock_cnt
);
302 if (!nanohub_has_priority_lock_locked(data
))
303 mcu_wakeup_gpio_set_value(data
, gpio_done
? 1 : 0);
308 static inline bool mcu_wakeup_gpio_is_locked(struct nanohub_data
*data
)
310 return atomic_read(&data
->wakeup_lock_cnt
) != 0;
313 inline void nanohub_handle_irq1(struct nanohub_data
*data
)
317 spin_lock(&data
->wakeup_wait
.lock
);
318 locked
= mcu_wakeup_gpio_is_locked(data
);
319 spin_unlock(&data
->wakeup_wait
.lock
);
321 nanohub_notify_thread(data
);
323 wake_up_interruptible_sync(&data
->wakeup_wait
);
326 static inline void nanohub_handle_irq2(struct nanohub_data
*data
)
328 nanohub_notify_thread(data
);
331 static inline bool mcu_wakeup_try_lock(struct nanohub_data
*data
, int key
)
333 /* implementation contains memory barrier */
334 return atomic_cmpxchg(&data
->wakeup_acquired
, 0, key
) == 0;
337 static inline void mcu_wakeup_unlock(struct nanohub_data
*data
, int key
)
339 WARN(atomic_cmpxchg(&data
->wakeup_acquired
, key
, 0) != key
,
340 "%s: failed to unlock with key %d; current state: %d",
341 __func__
, key
, atomic_read(&data
->wakeup_acquired
));
344 static inline void nanohub_set_state(struct nanohub_data
*data
, int state
)
346 atomic_set(&data
->thread_state
, state
);
347 smp_mb__after_atomic(); /* updated thread state is now visible */
350 static inline int nanohub_get_state(struct nanohub_data
*data
)
352 smp_mb__before_atomic(); /* wait for all updates to finish */
353 return atomic_read(&data
->thread_state
);
356 static inline void nanohub_clear_err_cnt(struct nanohub_data
*data
)
358 data
->kthread_err_cnt
= data
->wakeup_err_cnt
= 0;
361 int request_wakeup_ex(struct nanohub_data
*data
, long timeout_ms
,
362 int key
, int lock_mode
)
365 bool priority_lock
= lock_mode
> LOCK_MODE_NORMAL
;
366 struct device
*sensor_dev
= data
->io
[ID_NANOHUB_SENSOR
].dev
;
369 ktime_t wakeup_ktime
;
370 #ifdef CONFIG_NANOHUB_MAILBOX
373 spin_lock_irqsave(&data
->wakeup_wait
.lock
, flag
);
375 spin_lock(&data
->wakeup_wait
.lock
);
377 mcu_wakeup_gpio_get_locked(data
, priority_lock
);
378 timeout
= (timeout_ms
!= MAX_SCHEDULE_TIMEOUT
) ?
379 msecs_to_jiffies(timeout_ms
) :
380 MAX_SCHEDULE_TIMEOUT
;
382 if (!priority_lock
&& !data
->wakeup_err_cnt
)
383 wakeup_ktime
= ktime_get_boottime();
384 timeout
= wait_event_interruptible_timeout_locked(
386 ((priority_lock
|| nanohub_irq1_fired(data
)) &&
387 mcu_wakeup_try_lock(data
, key
)),
392 if (!timeout
&& !priority_lock
) {
393 if (!data
->wakeup_err_cnt
)
394 data
->wakeup_err_ktime
= wakeup_ktime
;
395 ktime_delta
= ktime_sub(ktime_get_boottime(),
396 data
->wakeup_err_ktime
);
397 data
->wakeup_err_cnt
++;
398 if (ktime_to_ns(ktime_delta
) > WAKEUP_ERR_TIME_NS
399 && data
->wakeup_err_cnt
> WAKEUP_ERR_CNT
) {
400 mcu_wakeup_gpio_put_locked(data
, priority_lock
);
401 #ifdef CONFIG_NANOHUB_MAILBOX
402 spin_unlock_irqrestore(&data
->wakeup_wait
.lock
, flag
);
404 spin_unlock(&data
->wakeup_wait
.lock
);
407 "wakeup: hard reset due to consistent error\n");
408 ret
= nanohub_hw_reset(data
);
411 "%s: failed to reset nanohub: ret=%d\n",
417 mcu_wakeup_gpio_put_locked(data
, priority_lock
);
422 data
->wakeup_err_cnt
= 0;
426 #ifdef CONFIG_NANOHUB_MAILBOX
427 spin_unlock_irqrestore(&data
->wakeup_wait
.lock
, flag
);
429 spin_unlock(&data
->wakeup_wait
.lock
);
435 void release_wakeup_ex(struct nanohub_data
*data
, int key
, int lock_mode
)
438 bool priority_lock
= lock_mode
> LOCK_MODE_NORMAL
;
439 #ifdef CONFIG_NANOHUB_MAILBOX
442 spin_lock_irqsave(&data
->wakeup_wait
.lock
, flag
);
444 spin_lock(&data
->wakeup_wait
.lock
);
447 done
= mcu_wakeup_gpio_put_locked(data
, priority_lock
);
448 mcu_wakeup_unlock(data
, key
);
450 #ifdef CONFIG_NANOHUB_MAILBOX
451 spin_unlock_irqrestore(&data
->wakeup_wait
.lock
, flag
);
453 spin_unlock(&data
->wakeup_wait
.lock
);
457 wake_up_interruptible_sync(&data
->wakeup_wait
);
458 else if (nanohub_irq1_fired(data
) || nanohub_irq2_fired(data
))
459 nanohub_notify_thread(data
);
462 int nanohub_wait_for_interrupt(struct nanohub_data
*data
)
466 /* release the wakeup line, and wait for nanohub to send
467 * us an interrupt indicating the transaction completed.
470 #ifdef CONFIG_NANOHUB_MAILBOX
472 spin_lock_irqsave(&data
->wakeup_wait
.lock
, flag
);
474 spin_lock(&data
->wakeup_wait
.lock
);
477 if (mcu_wakeup_gpio_is_locked(data
)) {
478 mcu_wakeup_gpio_set_value(data
, 1);
479 ret
= wait_event_interruptible_locked(data
->wakeup_wait
,
480 nanohub_irq1_fired(data
));
481 mcu_wakeup_gpio_set_value(data
, 0);
483 #ifdef CONFIG_NANOHUB_MAILBOX
484 spin_unlock_irqrestore(&data
->wakeup_wait
.lock
, flag
);
486 spin_unlock(&data
->wakeup_wait
.lock
);
492 int nanohub_wakeup_eom(struct nanohub_data
*data
, bool repeat
)
495 #ifdef LOWLEVEL_DEBUG
499 #ifdef CONFIG_NANOHUB_MAILBOX
501 spin_lock_irqsave(&data
->wakeup_wait
.lock
, flag
);
503 spin_lock(&data
->wakeup_wait
.lock
);
506 if (mcu_wakeup_gpio_is_locked(data
)) {
507 mcu_wakeup_gpio_set_value(data
, 1);
509 mcu_wakeup_gpio_set_value(data
, 0);
511 #ifdef LOWLEVEL_DEBUG
516 #ifdef CONFIG_NANOHUB_MAILBOX
517 spin_unlock_irqrestore(&data
->wakeup_wait
.lock
, flag
);
519 spin_unlock(&data
->wakeup_wait
.lock
);
525 #ifdef CONFIG_EXT_CHUB
526 static void __nanohub_interrupt_cfg(struct nanohub_data
*data
,
527 u8 interrupt
, bool mask
)
532 struct device
*dev
= data
->io
[ID_NANOHUB_SENSOR
].dev
;
533 int cmd
= mask
? CMD_COMMS_MASK_INTR
: CMD_COMMS_UNMASK_INTR
;
536 ret
= request_wakeup_timeout(data
, WAKEUP_TIMEOUT_MS
);
539 "%s: interrupt %d %smask failed: ret=%d\n",
540 __func__
, interrupt
, mask
? "" : "un", ret
);
545 nanohub_comms_tx_rx_retrans(data
, cmd
,
546 &interrupt
, sizeof(interrupt
),
547 &mask_ret
, sizeof(mask_ret
),
549 release_wakeup(data
);
551 "%smasking interrupt %d, ret=%d, mask_ret=%d\n",
553 interrupt
, ret
, mask_ret
);
554 } while ((ret
!= 1 || mask_ret
!= 1) && --cnt
> 0);
557 static inline void nanohub_mask_interrupt(struct nanohub_data
*data
,
560 #ifdef CONFIG_EXT_CHUB
561 __nanohub_interrupt_cfg(data
, interrupt
, true);
565 static inline void nanohub_unmask_interrupt(struct nanohub_data
*data
,
568 #ifdef CONFIG_EXT_CHUB
569 __nanohub_interrupt_cfg(data
, interrupt
, false);
573 static ssize_t
nanohub_wakeup_query(struct device
*dev
,
574 struct device_attribute
*attr
, char *buf
)
576 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
577 const struct nanohub_platform_data
*pdata
= data
->pdata
;
578 #ifdef CONFIG_NANOHUB_MAILBOX
579 struct contexthub_ipc_info
*ipc
;
582 nanohub_clear_err_cnt(data
);
583 if (nanohub_irq1_fired(data
) || nanohub_irq2_fired(data
))
584 wake_up_interruptible(&data
->wakeup_wait
);
586 #ifdef CONFIG_NANOHUB_MAILBOX
587 ipc
= pdata
->mailbox_client
;
588 return scnprintf(buf
, PAGE_SIZE
, "WAKEUP: %d INT1: %d INT2: %d\n",
589 atomic_read(&ipc
->wakeup_chub
),
590 atomic_read(&ipc
->irq1_apInt
), -1);
592 return scnprintf(buf
, PAGE_SIZE
, "WAKEUP: %d INT1: %d INT2: %d\n",
593 gpio_get_value(pdata
->wakeup_gpio
),
594 gpio_get_value(pdata
->irq1_gpio
),
595 data
->irq2
? gpio_get_value(pdata
->irq2_gpio
) : -1);
599 static ssize_t
nanohub_app_info(struct device
*dev
,
600 struct device_attribute
*attr
, char *buf
)
602 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
613 if (request_wakeup(data
))
616 if (nanohub_comms_tx_rx_retrans
617 (data
, CMD_COMMS_QUERY_APP_INFO
, (uint8_t *)&i
,
618 sizeof(i
), (u8
*)&buffer
, sizeof(buffer
),
619 false, 10, 10) == sizeof(buffer
)) {
621 scnprintf(buf
+ len
, PAGE_SIZE
- len
,
622 "app: %d id: %016llx ver: %08x size: %08x\n",
623 i
, buffer
.appId
, buffer
.appVer
,
633 release_wakeup(data
);
639 static ssize_t
nanohub_firmware_query(struct device
*dev
,
640 struct device_attribute
*attr
, char *buf
)
642 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
645 if (request_wakeup(data
))
648 if (nanohub_comms_tx_rx_retrans
649 (data
, CMD_COMMS_GET_OS_HW_VERSIONS
, NULL
, 0, (uint8_t *)&buffer
,
650 sizeof(buffer
), false, 10, 10) == sizeof(buffer
)) {
651 release_wakeup(data
);
652 return scnprintf(buf
, PAGE_SIZE
,
653 "hw type: %04x hw ver: %04x bl ver: %04x os ver: %04x variant ver: %08x\n",
654 buffer
[0], buffer
[1], buffer
[2], buffer
[3],
655 buffer
[5] << 16 | buffer
[4]);
657 release_wakeup(data
);
662 static inline int nanohub_wakeup_lock(struct nanohub_data
*data
, int mode
)
667 disable_irq(data
->irq2
);
669 nanohub_mask_interrupt(data
, 2);
671 ret
= request_wakeup_ex(data
,
672 mode
== LOCK_MODE_SUSPEND_RESUME
?
673 SUSPEND_TIMEOUT_MS
: WAKEUP_TIMEOUT_MS
,
674 KEY_WAKEUP_LOCK
, mode
);
676 #ifdef CONFIG_EXT_CHUB
678 enable_irq(data
->irq2
);
680 nanohub_unmask_interrupt(data
, 2);
685 #ifdef CONFIG_EXT_CHUB
686 if (mode
== LOCK_MODE_IO
|| mode
== LOCK_MODE_IO_BL
)
687 ret
= nanohub_bl_open(data
);
689 release_wakeup_ex(data
, KEY_WAKEUP_LOCK
, mode
);
692 if (mode
!= LOCK_MODE_SUSPEND_RESUME
)
693 disable_irq(data
->irq1
);
695 if (mode
!= LOCK_MODE_SUSPEND_RESUME
)
696 contexthub_ipc_write_event(data
->pdata
->mailbox_client
, (u32
)MAILBOX_EVT_DISABLE_IRQ
);
699 atomic_set(&data
->lock_mode
, mode
);
700 mcu_wakeup_gpio_set_value(data
, mode
!= LOCK_MODE_IO_BL
);
705 /* returns lock mode used to perform this lock */
706 static inline int nanohub_wakeup_unlock(struct nanohub_data
*data
)
708 int mode
= atomic_read(&data
->lock_mode
);
710 atomic_set(&data
->lock_mode
, LOCK_MODE_NONE
);
711 #ifdef CONFIG_EXT_CHUB
712 if (mode
!= LOCK_MODE_SUSPEND_RESUME
)
713 enable_irq(data
->irq1
);
714 if (mode
== LOCK_MODE_IO
|| mode
== LOCK_MODE_IO_BL
)
715 nanohub_bl_close(data
);
717 enable_irq(data
->irq2
);
719 release_wakeup_ex(data
, KEY_WAKEUP_LOCK
, mode
);
721 nanohub_unmask_interrupt(data
, 2);
723 if (mode
!= LOCK_MODE_SUSPEND_RESUME
)
724 contexthub_ipc_write_event(data
->pdata
->mailbox_client
, (u32
)MAILBOX_EVT_ENABLE_IRQ
);
725 release_wakeup_ex(data
, KEY_WAKEUP_LOCK
, mode
);
728 nanohub_notify_thread(data
);
733 static void __nanohub_hw_reset(struct nanohub_data
*data
, int boot0
)
735 const struct nanohub_platform_data
*pdata
= data
->pdata
;
737 #if defined(CONFIG_EXT_CHUB)
738 gpio_set_value(pdata
->nreset_gpio
, 0);
739 gpio_set_value(pdata
->boot0_gpio
, boot0
> 0);
740 usleep_range(30, 40);
741 gpio_set_value(pdata
->nreset_gpio
, 1);
743 usleep_range(70000, 75000);
745 usleep_range(750000, 800000);
746 #elif defined(CONFIG_NANOHUB_MAILBOX)
750 ret
= contexthub_ipc_write_event(pdata
->mailbox_client
, MAILBOX_EVT_SHUTDOWN
);
752 ret
= contexthub_ipc_write_event(pdata
->mailbox_client
, MAILBOX_EVT_RESET
);
755 dev_warn(data
->io
[ID_NANOHUB_SENSOR
].dev
,
756 "%s: fail to reset on boot0 %d\n", __func__
, boot0
);
760 static int nanohub_hw_reset(struct nanohub_data
*data
)
763 #if defined(CONFIG_EXT_CHUB)
764 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_RESET
);
768 __nanohub_hw_reset(data
, 0);
769 nanohub_wakeup_unlock(data
);
771 #elif defined(CONFIG_NANOHUB_MAILBOX)
772 #ifdef CHUB_RESET_ENABLE
773 ret
= contexthub_reset(data
->pdata
->mailbox_client
, 1, CHUB_ERR_COMMS
);
781 static ssize_t
nanohub_try_hw_reset(struct device
*dev
,
782 struct device_attribute
*attr
,
783 const char *buf
, size_t count
)
785 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
788 ret
= nanohub_hw_reset(data
);
790 return ret
< 0 ? ret
: count
;
793 static ssize_t
nanohub_erase_shared(struct device
*dev
,
794 struct device_attribute
*attr
,
795 const char *buf
, size_t count
)
797 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
799 #if defined(CONFIG_EXT_CHUB)
800 uint8_t status
= CMD_ACK
;
803 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_IO
);
808 __nanohub_hw_reset(data
, 1);
810 status
= nanohub_bl_erase_shared(data
);
811 dev_info(dev
, "nanohub_bl_erase_shared: status=%02x\n",
814 __nanohub_hw_reset(data
, 0);
815 nanohub_wakeup_unlock(data
);
817 return ret
< 0 ? ret
: count
;
818 #elif defined(CONFIG_NANOHUB_MAILBOX)
819 __nanohub_hw_reset(data
, 1);
821 contexthub_ipc_write_event(data
->pdata
->mailbox_client
, MAILBOX_EVT_ERASE_SHARED
);
823 __nanohub_hw_reset(data
, 0);
829 #ifdef CONFIG_EXT_CHUB
830 static ssize_t
nanohub_erase_shared_bl(struct device
*dev
,
831 struct device_attribute
*attr
,
832 const char *buf
, size_t count
)
834 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
835 uint8_t status
= CMD_ACK
;
838 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_IO_BL
);
842 __nanohub_hw_reset(data
, -1);
844 status
= nanohub_bl_erase_shared_bl(data
);
845 dev_info(dev
, "%s: status=%02x\n", __func__
, status
);
847 __nanohub_hw_reset(data
, 0);
848 nanohub_wakeup_unlock(data
);
850 return ret
< 0 ? ret
: count
;
853 static ssize_t
nanohub_download_bl(struct device
*dev
,
854 struct device_attribute
*attr
,
855 const char *buf
, size_t count
)
857 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
859 #ifdef CONFIG_EXT_CHUB
860 const struct nanohub_platform_data
*pdata
= data
->pdata
;
861 const struct firmware
*fw_entry
;
863 uint8_t status
= CMD_ACK
;
866 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_IO
);
871 __nanohub_hw_reset(data
, 1);
873 ret
= request_firmware(&fw_entry
, "nanohub.full.bin", dev
);
875 dev_err(dev
, "%s: err=%d\n", __func__
, ret
);
877 status
= nanohub_bl_download(data
, pdata
->bl_addr
,
878 fw_entry
->data
, fw_entry
->size
);
879 dev_info(dev
, "%s: status=%02x\n", __func__
, status
);
880 release_firmware(fw_entry
);
883 __nanohub_hw_reset(data
, 0);
884 nanohub_wakeup_unlock(data
);
886 return ret
< 0 ? ret
: count
;
887 #elif defined(CONFIG_NANOHUB_MAILBOX)
888 ret
= contexthub_reset(data
->pdata
->mailbox_client
, 1, CHUB_ERR_NONE
);
890 return ret
< 0 ? ret
: count
;
894 static ssize_t
nanohub_download_kernel(struct device
*dev
,
895 struct device_attribute
*attr
,
896 const char *buf
, size_t count
)
898 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
900 #ifdef CONFIG_NANOHUB_MAILBOX
901 int ret
= contexthub_download_image(data
->pdata
->mailbox_client
, IPC_REG_OS
);
903 return ret
< 0 ? ret
: count
;
905 const struct firmware
*fw_entry
;
908 ret
= request_firmware(&fw_entry
, "nanohub.update.bin", dev
);
910 dev_err(dev
, "nanohub_download_kernel: err=%d\n", ret
);
914 nanohub_comms_kernel_download(data
, fw_entry
->data
,
917 release_firmware(fw_entry
);
924 #ifdef CONFIG_EXT_CHUB
925 static ssize_t
nanohub_download_kernel_bl(struct device
*dev
,
926 struct device_attribute
*attr
,
927 const char *buf
, size_t count
)
929 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
930 const struct firmware
*fw_entry
;
932 uint8_t status
= CMD_ACK
;
934 ret
= request_firmware(&fw_entry
, "nanohub.kernel.signed", dev
);
936 dev_err(dev
, "%s: err=%d\n", __func__
, ret
);
938 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_IO_BL
);
942 __nanohub_hw_reset(data
, -1);
944 status
= nanohub_bl_erase_shared_bl(data
);
945 dev_info(dev
, "%s: (erase) status=%02x\n", __func__
, status
);
946 if (status
== CMD_ACK
) {
947 status
= nanohub_bl_write_memory(data
, 0x50000000,
950 mcu_wakeup_gpio_set_value(data
, 1);
951 dev_info(dev
, "%s: (write) status=%02x\n", __func__
, status
);
952 if (status
== CMD_ACK
) {
953 status
= nanohub_bl_update_finished(data
);
954 dev_info(dev
, "%s: (finish) status=%02x\n", __func__
, status
);
957 mcu_wakeup_gpio_set_value(data
, 1);
960 __nanohub_hw_reset(data
, 0);
961 nanohub_wakeup_unlock(data
);
963 release_firmware(fw_entry
);
966 return ret
< 0 ? ret
: count
;
970 static ssize_t
nanohub_download_app(struct device
*dev
,
971 struct device_attribute
*attr
,
972 const char *buf
, size_t count
)
974 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
975 const struct firmware
*fw_entry
;
977 int i
, ret
, ret1
, ret2
, file_len
= 0, appid_len
= 0, ver_len
= 0;
978 const char *appid
= NULL
, *ver
= NULL
;
979 unsigned long version
;
981 uint32_t cur_version
;
984 for (i
= 0; i
< count
; i
++) {
986 if (i
+ 1 == count
) {
991 else if (ver
== NULL
)
996 } else if (buf
[i
] == '\n' || buf
[i
] == '\r') {
1008 if (file_len
> 64 || appid_len
> 16 || ver_len
> 8 || file_len
< 1)
1011 memcpy(buffer
, buf
, file_len
);
1012 memcpy(buffer
+ file_len
, ".napp", 5);
1013 buffer
[file_len
+ 5] = '\0';
1015 ret
= request_firmware(&fw_entry
, buffer
, dev
);
1017 dev_err(dev
, "nanohub_download_app(%s): err=%d\n",
1021 if (appid_len
> 0 && ver_len
> 0) {
1022 memcpy(buffer
, appid
, appid_len
);
1023 buffer
[appid_len
] = '\0';
1025 ret1
= kstrtoull(buffer
, 16, &id
);
1027 memcpy(buffer
, ver
, ver_len
);
1028 buffer
[ver_len
] = '\0';
1030 ret2
= kstrtoul(buffer
, 16, &version
);
1032 if (ret1
== 0 && ret2
== 0) {
1033 if (request_wakeup(data
))
1034 return -ERESTARTSYS
;
1035 if (nanohub_comms_tx_rx_retrans
1036 (data
, CMD_COMMS_GET_APP_VERSIONS
,
1037 (uint8_t *)&id
, sizeof(id
),
1038 (uint8_t *)&cur_version
,
1039 sizeof(cur_version
), false, 10,
1040 10) == sizeof(cur_version
)) {
1041 if (cur_version
== version
)
1044 release_wakeup(data
);
1050 nanohub_comms_app_download(data
, fw_entry
->data
,
1053 release_firmware(fw_entry
);
1057 #ifdef CONFIG_EXT_CHUB
1058 static ssize_t
nanohub_lock_bl(struct device
*dev
,
1059 struct device_attribute
*attr
,
1060 const char *buf
, size_t count
)
1062 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
1064 uint8_t status
= CMD_ACK
;
1066 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_IO
);
1070 __nanohub_hw_reset(data
, 1);
1072 gpio_set_value(data
->pdata
->boot0_gpio
, 0);
1073 /* this command reboots itself */
1074 status
= nanohub_bl_lock(data
);
1075 dev_info(dev
, "%s: status=%02x\n", __func__
, status
);
1078 nanohub_wakeup_unlock(data
);
1080 return ret
< 0 ? ret
: count
;
1083 static ssize_t
nanohub_unlock_bl(struct device
*dev
,
1084 struct device_attribute
*attr
,
1085 const char *buf
, size_t count
)
1087 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
1089 uint8_t status
= CMD_ACK
;
1091 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_IO
);
1095 __nanohub_hw_reset(data
, 1);
1097 gpio_set_value(data
->pdata
->boot0_gpio
, 0);
1098 /* this command reboots itself (erasing the flash) */
1099 status
= nanohub_bl_unlock(data
);
1100 dev_info(dev
, "%s: status=%02x\n", __func__
, status
);
1103 nanohub_wakeup_unlock(data
);
1105 return ret
< 0 ? ret
: count
;
1109 #ifdef CONFIG_NANOHUB_MAILBOX
1110 static int chub_get_chipid(struct contexthub_ipc_info
*ipc
)
1116 ipc_write_debug_val(IPC_DATA_C2A
, 0); /* clear */
1117 contexthub_ipc_write_event(ipc
, (u32
)IPC_DEBUG_UTC_SENSOR_CHIPID
);
1120 msleep(WAIT_CHUB_MS
);
1121 id
= ipc_read_debug_val(IPC_DATA_C2A
);
1122 if (++trycnt
> WAIT_TRY_CNT
) {
1123 pr_warn("%s: can't get result\n", __func__
);
1131 static ssize_t
chub_chipid_show(struct device
*dev
,
1132 struct device_attribute
*attr
, char *buf
)
1134 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
1135 u32 id
= chub_get_chipid(data
->pdata
->mailbox_client
);
1137 dev_info(dev
, "%s: %d\n", __func__
, id
);
1139 return sprintf(buf
, "0x%x\n", id
);
1144 static ssize_t
chub_chipid_store(struct device
*dev
,
1145 struct device_attribute
*attr
,
1146 const char *buf
, size_t count
)
1149 int err
= kstrtol(&buf
[0], 10, &id
);
1151 dev_info(dev
, "%s: id: %d\n", __func__
, id
);
1153 ipc_write_debug_val(IPC_DATA_A2C
, (u32
)id
);
1160 static ssize_t
chub_sensortype_store(struct device
*dev
,
1161 struct device_attribute
*attr
,
1162 const char *buf
, size_t count
)
1167 static ssize_t
chub_sensortype_show(struct device
*dev
,
1168 struct device_attribute
*attr
, char *buf
)
1170 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
1172 return contexthub_get_sensortype(data
->pdata
->mailbox_client
, buf
);
1175 void nanohub_add_dump_request(struct nanohub_data
*data
)
1177 struct nanohub_io
*io
= &data
->io
[ID_NANOHUB_SENSOR
];
1178 struct nanohub_buf
*buf
= nanohub_io_get_buf(&data
->free_pool
, false);
1182 buffer
= (uint32_t *)buf
->buffer
;
1183 *buffer
= EVT_DEBUG_DUMP
;
1184 nanohub_io_put_buf(io
, buf
);
1185 wake_lock_timeout(&data
->wakelock_read
, msecs_to_jiffies(250));
1187 pr_err("%s: cann't get io buf\n", __func__
);
1191 static ssize_t
chub_dumpio_show(struct device
*dev
,
1192 struct device_attribute
*attr
, char *buf
)
1194 struct nanohub_data
*data
= dev_get_nanohub_data(dev
);
1195 struct nanohub_io
*io
;
1196 struct nanohub_buf
*desc
= NULL
;
1197 int buf_io_cnt
[ID_NANOHUB_MAX
] = {0, 0};
1198 int free_io_cnt
= 0;
1202 for (i
= 0; i
< ID_NANOHUB_MAX
; i
++) {
1205 list_for_each_entry(desc
, &io
->buf_list
, list
)
1208 list_for_each_entry(desc
, &data
->free_pool
.buf_list
, list
)
1211 return sprintf(buf
, "%s: sensor:%d, comms:%d, free:%d \n", __func__
,
1212 buf_io_cnt
[ID_NANOHUB_SENSOR
], buf_io_cnt
[ID_NANOHUB_COMMS
], free_io_cnt
);
1216 static struct device_attribute attributes
[] = {
1217 __ATTR(wakeup
, 0440, nanohub_wakeup_query
, NULL
),
1218 __ATTR(app_info
, 0440, nanohub_app_info
, NULL
),
1219 __ATTR(firmware_version
, 0440, nanohub_firmware_query
, NULL
),
1220 __ATTR(download_bl
, 0220, NULL
, nanohub_download_bl
),
1221 __ATTR(download_kernel
, 0220, NULL
, nanohub_download_kernel
),
1222 #ifdef CONFIG_EXT_CHUB
1223 __ATTR(download_kernel_bl
, 0220, NULL
, nanohub_download_kernel_bl
),
1225 __ATTR(download_app
, 0220, NULL
, nanohub_download_app
),
1226 __ATTR(erase_shared
, 0220, NULL
, nanohub_erase_shared
),
1227 #ifdef CONFIG_EXT_CHUB
1228 __ATTR(erase_shared_bl
, 0220, NULL
, nanohub_erase_shared_bl
),
1230 __ATTR(reset
, 0220, NULL
, nanohub_try_hw_reset
),
1231 #ifdef CONFIG_EXT_CHUB
1232 __ATTR(lock
, 0220, NULL
, nanohub_lock_bl
),
1233 __ATTR(unlock
, 0220, NULL
, nanohub_unlock_bl
),
1235 #ifdef CONFIG_NANOHUB_MAILBOX
1236 __ATTR(chipid
, 0664, chub_chipid_show
, chub_chipid_store
),
1237 __ATTR(sensortype
, 0775, chub_sensortype_show
, chub_sensortype_store
),
1238 __ATTR(dumpio
, 0440, chub_dumpio_show
, NULL
),
1242 static inline int nanohub_create_sensor(struct nanohub_data
*data
)
1245 struct device
*sensor_dev
= data
->io
[ID_NANOHUB_SENSOR
].dev
;
1247 for (i
= 0, ret
= 0; i
< ARRAY_SIZE(attributes
); i
++) {
1248 ret
= device_create_file(sensor_dev
, &attributes
[i
]);
1251 "create sysfs attr %d [%s] failed; err=%d\n",
1252 i
, attributes
[i
].attr
.name
, ret
);
1257 ret
= sysfs_create_link(&sensor_dev
->kobj
,
1258 &data
->iio_dev
->dev
.kobj
, "iio");
1261 "sysfs_create_link failed; err=%d\n", ret
);
1267 for (i
--; i
>= 0; i
--)
1268 device_remove_file(sensor_dev
, &attributes
[i
]);
1273 static int nanohub_create_devices(struct nanohub_data
*data
)
1276 struct device
*chub_dev
;
1277 static const char *names
[ID_NANOHUB_MAX
] = {
1278 "nanohub", "nanohub_comms"
1281 for (i
= 0; i
< ID_NANOHUB_MAX
; ++i
) {
1282 struct nanohub_io
*io
= &data
->io
[i
];
1284 nanohub_io_init(io
, data
, device_create(sensor_class
, NULL
,
1287 if (IS_ERR(io
->dev
)) {
1288 ret
= PTR_ERR(io
->dev
);
1289 pr_err("nanohub: device_create failed for %s; err=%d\n",
1294 chub_dev
= device_create(sensor_class
, NULL
, MKDEV(chub_dev_major
, 0), NULL
, "chub_dev");
1295 if(chub_dev
== NULL
)
1296 pr_info("nanohub: device_create failed for chub_dev!\n");
1297 ret
= nanohub_create_sensor(data
);
1302 for (--i
; i
>= 0; --i
)
1303 device_destroy(sensor_class
, MKDEV(major
, i
));
1304 device_destroy(sensor_class
, MKDEV(chub_dev_major
, 0));
1309 static int nanohub_match_devt(struct device
*dev
, const void *data
)
1311 const dev_t
*devt
= data
;
1313 return dev
->devt
== *devt
;
1316 int nanohub_reset(struct nanohub_data
*data
)
1318 #ifdef CONFIG_NANOHUB_MAILBOX
1319 return contexthub_poweron(data
->pdata
->mailbox_client
);
1321 const struct nanohub_platform_data
*pdata
= data
->pdata
;
1323 gpio_set_value(pdata
->nreset_gpio
, 1);
1324 usleep_range(650000, 700000);
1326 #ifdef CONFIG_EXT_CHUB
1327 enable_irq(data
->irq1
);
1329 enable_irq(data
->irq2
);
1331 nanohub_unmask_interrupt(data
, 2);
1333 contexthub_ipc_write_event(data
->pdata
->mailbox_client
, (u32
)MAILBOX_EVT_ENABLE_IRQ
);
1340 static int nanohub_kthread(void *arga
);
1341 static int nanohub_open(struct inode
*inode
, struct file
*file
)
1343 dev_t devt
= inode
->i_rdev
;
1345 #ifdef CONFIG_NANOHUB_MAILBOX
1346 struct nanohub_io
*io
;
1348 dev
= class_find_device(sensor_class
, NULL
, &devt
, nanohub_match_devt
);
1350 file
->private_data
= dev_get_drvdata(dev
);
1351 nonseekable_open(inode
, file
);
1352 #ifdef CONFIG_NANOHUB_MAILBOX
1353 io
= file
->private_data
;
1354 nanohub_reset(io
->data
);
1355 io
->data
->thread
= kthread_run(nanohub_kthread
, io
->data
, "nanohub");
1364 static ssize_t
nanohub_read(struct file
*file
, char *buffer
, size_t length
,
1367 struct nanohub_io
*io
= file
->private_data
;
1368 struct nanohub_data
*data
= io
->data
;
1369 struct nanohub_buf
*buf
;
1372 if (!nanohub_io_has_buf(io
) && (file
->f_flags
& O_NONBLOCK
))
1375 buf
= nanohub_io_get_buf(io
, true);
1376 if (IS_ERR_OR_NULL(buf
))
1377 return PTR_ERR(buf
);
1379 ret
= copy_to_user(buffer
, buf
->buffer
, buf
->length
);
1385 #ifdef CONFIG_NANOHUB_MAILBOX
1386 if (nanohub_is_reset_notify_io(buf
)) {
1387 io
= &io
->data
->free_pool
;
1388 spin_lock(&io
->buf_wait
.lock
);
1389 list_add_tail(&buf
->list
, &io
->buf_list
);
1390 spin_unlock(&io
->buf_wait
.lock
);
1392 nanohub_io_put_buf(&data
->free_pool
, buf
);
1394 nanohub_io_put_buf(&data
->free_pool
, buf
);
1400 static ssize_t
nanohub_write(struct file
*file
, const char *buffer
,
1401 size_t length
, loff_t
*offset
)
1403 struct nanohub_io
*io
= file
->private_data
;
1404 struct nanohub_data
*data
= io
->data
;
1406 #ifdef CONFIG_NANOHUB_MAILBOX
1407 struct contexthub_ipc_info
*ipc
= data
->pdata
->mailbox_client
;
1409 if (atomic_read(&ipc
->chub_status
) != CHUB_ST_RUN
) {
1410 dev_warn(data
->io
[ID_NANOHUB_SENSOR
].dev
,
1411 "%s fails. nanohub isn't running\n", __func__
);
1415 /* wakeup timeout should be bigger than timeout_write (544) to support both usecase */
1416 ret
= request_wakeup_timeout(data
, 644);
1419 ret
= request_wakeup_timeout(data
, 500);
1425 ret
= nanohub_comms_write(data
, buffer
, length
);
1427 release_wakeup(data
);
1432 static unsigned int nanohub_poll(struct file
*file
, poll_table
*wait
)
1434 struct nanohub_io
*io
= file
->private_data
;
1435 unsigned int mask
= POLLOUT
| POLLWRNORM
;
1437 poll_wait(file
, &io
->buf_wait
, wait
);
1439 if (nanohub_io_has_buf(io
))
1440 mask
|= POLLIN
| POLLRDNORM
;
1445 static int nanohub_release(struct inode
*inode
, struct file
*file
)
1447 file
->private_data
= NULL
;
1452 static int chub_dev_open(struct inode
*inode
, struct file
*file
)
1454 pr_info("%s\n", __func__
);
1458 static ssize_t
chub_dev_read(struct file
*file
, char *buffer
,
1459 size_t length
, loff_t
*offset
)
1464 static int nanohub_match_name(struct device
*dev
, const void *data
)
1466 const char *name
= data
;
1468 if(dev
->kobj
.name
== NULL
) {
1469 pr_info("nanohub device name invalid\n");
1473 pr_info("nanohub device name = %s\n", dev
->kobj
.name
);
1474 return !strcmp(dev
->kobj
.name
, name
);
1477 static ssize_t
chub_dev_write(struct file
*file
, const char *buffer
,
1478 size_t length
, loff_t
*offset
)
1480 struct device
*dev_nanohub
;
1481 struct nanohub_data
*data
;
1482 struct contexthub_ipc_info
*ipc
;
1486 dev_nanohub
= class_find_device(sensor_class
, NULL
, "nanohub", nanohub_match_name
);
1487 if(dev_nanohub
== NULL
) {
1488 pr_err("%s: dev_nanohub not available\n", __func__
);
1492 data
= dev_get_nanohub_data(dev_nanohub
);
1494 pr_err("%s nanohub_data not available\n", __func__
);
1498 ipc
= data
->pdata
->mailbox_client
;
1500 pr_err("%s ipc not available\n", __func__
);
1504 //read int8_t num_os
1505 ret
= copy_from_user(&num_os
, buffer
, sizeof(num_os
));
1507 if(num_os
> 0 && num_os
< SENSOR_VARIATION
) {
1509 pr_info("%s saved os name: %s\n", __func__
, os_image
[num_os
]);
1510 strncpy(ipc
->os_name
, os_image
[num_os
], sizeof(ipc
->os_name
));
1512 pr_warn("%s num_os is invalid %d\n", __func__
, num_os
);
1517 static void nanohub_destroy_devices(struct nanohub_data
*data
)
1520 struct device
*sensor_dev
= data
->io
[ID_NANOHUB_SENSOR
].dev
;
1522 sysfs_remove_link(&sensor_dev
->kobj
, "iio");
1523 for (i
= 0; i
< ARRAY_SIZE(attributes
); i
++)
1524 device_remove_file(sensor_dev
, &attributes
[i
]);
1525 for (i
= 0; i
< ID_NANOHUB_MAX
; ++i
)
1526 device_destroy(sensor_class
, MKDEV(major
, i
));
1527 device_destroy(sensor_class
, MKDEV(chub_dev_major
, 0));
1530 #ifdef CONFIG_EXT_CHUB
1531 static irqreturn_t
nanohub_irq1(int irq
, void *dev_id
)
1533 struct nanohub_data
*data
= (struct nanohub_data
*)dev_id
;
1535 nanohub_handle_irq1(data
);
1540 static irqreturn_t
nanohub_irq2(int irq
, void *dev_id
)
1542 struct nanohub_data
*data
= (struct nanohub_data
*)dev_id
;
1544 nanohub_handle_irq2(data
);
1550 static bool nanohub_os_log(char *buffer
, int len
)
1552 if (le32_to_cpu((((uint32_t *)buffer
)[0]) & 0x7FFFFFFF) ==
1554 char *mtype
, *mdata
= &buffer
[5];
1558 switch (buffer
[4]) {
1563 mtype
= KERN_WARNING
;
1572 mtype
= KERN_DEFAULT
;
1576 printk("%snanohub: %s", mtype
, mdata
);
1583 static void nanohub_process_buffer(struct nanohub_data
*data
,
1584 struct nanohub_buf
**buf
,
1589 bool wakeup
= false;
1590 struct nanohub_io
*io
= &data
->io
[ID_NANOHUB_SENSOR
];
1592 data
->kthread_err_cnt
= 0;
1593 if (ret
< 4 || nanohub_os_log((*buf
)->buffer
, ret
)) {
1594 release_wakeup(data
);
1598 (*buf
)->length
= ret
;
1600 event_id
= le32_to_cpu((((uint32_t *)(*buf
)->buffer
)[0]) & 0x7FFFFFFF);
1601 if (ret
>= sizeof(uint32_t) + sizeof(uint64_t) + sizeof(uint32_t) &&
1602 event_id
> FIRST_SENSOR_EVENTID
&&
1603 event_id
<= LAST_SENSOR_EVENTID
) {
1604 interrupt
= (*buf
)->buffer
[sizeof(uint32_t) +
1605 sizeof(uint64_t) + 3];
1606 if (interrupt
== WAKEUP_INTERRUPT
)
1609 if (event_id
== APP_TO_HOST_EVENTID
) {
1611 /* chub doesn't enable nanohal. use sensorhal io */
1612 io
= &data
->io
[ID_NANOHUB_COMMS
];
1615 nanohub_io_put_buf(io
, *buf
);
1618 /* (for wakeup interrupts): hold a wake lock for 250ms so the sensor hal
1619 * has time to grab its own wake lock */
1621 wake_lock_timeout(&data
->wakelock_read
, msecs_to_jiffies(250));
1622 release_wakeup(data
);
1625 static int nanohub_kthread(void *arg
)
1627 struct nanohub_data
*data
= (struct nanohub_data
*)arg
;
1628 struct nanohub_buf
*buf
= NULL
;
1630 ktime_t ktime_delta
;
1631 uint32_t clear_interrupts
[8] = { 0x00000006 };
1632 struct device
*sensor_dev
= data
->io
[ID_NANOHUB_SENSOR
].dev
;
1633 static const struct sched_param param
= {
1634 .sched_priority
= (MAX_USER_RT_PRIO
/2)-1,
1637 data
->kthread_err_cnt
= 0;
1638 sched_setscheduler(current
, SCHED_FIFO
, ¶m
);
1639 nanohub_set_state(data
, ST_IDLE
);
1641 while (!kthread_should_stop()) {
1642 switch (nanohub_get_state(data
)) {
1644 wait_event_interruptible(data
->kthread_wait
,
1645 atomic_read(&data
->kthread_run
)
1647 nanohub_set_state(data
, ST_RUNNING
);
1650 ktime_delta
= ktime_sub(ktime_get_boottime(),
1651 data
->kthread_err_ktime
);
1652 if (ktime_to_ns(ktime_delta
) > KTHREAD_ERR_TIME_NS
1653 && data
->kthread_err_cnt
> KTHREAD_ERR_CNT
) {
1654 dev_info(sensor_dev
,
1655 "kthread: hard reset due to consistent error\n");
1656 ret
= nanohub_hw_reset(data
);
1658 dev_info(sensor_dev
,
1659 "%s: failed to reset nanohub: ret=%d\n",
1663 msleep_interruptible(WAKEUP_TIMEOUT_MS
);
1664 nanohub_set_state(data
, ST_RUNNING
);
1665 #ifdef CONFIG_NANOHUB_MAILBOX
1666 #ifndef CHUB_RESET_ENABLE
1668 dev_warn(data
->io
[ID_NANOHUB_SENSOR
].dev
,
1669 "%s fails. nanohub isn't running\n", __func__
);
1678 atomic_set(&data
->kthread_run
, 0);
1680 buf
= nanohub_io_get_buf(&data
->free_pool
,
1683 ret
= request_wakeup_timeout(data
, 600);
1685 dev_info(sensor_dev
,
1686 "%s: request_wakeup_timeout: ret=%d, err_cnt:%d\n",
1687 __func__
, ret
, data
->kthread_err_cnt
);
1691 ret
= nanohub_comms_rx_retrans_boottime(
1692 data
, CMD_COMMS_READ
, buf
->buffer
,
1693 sizeof(buf
->buffer
), 10, 0);
1696 nanohub_process_buffer(data
, &buf
, ret
);
1697 if (!nanohub_irq1_fired(data
) &&
1698 !nanohub_irq2_fired(data
)) {
1699 nanohub_set_state(data
, ST_IDLE
);
1702 } else if (ret
== 0) {
1703 /* queue empty, go to sleep */
1704 data
->kthread_err_cnt
= 0;
1705 data
->interrupts
[0] &= ~0x00000006;
1706 release_wakeup(data
);
1707 nanohub_set_state(data
, ST_IDLE
);
1710 release_wakeup(data
);
1711 if (data
->kthread_err_cnt
== 0)
1712 data
->kthread_err_ktime
=
1713 ktime_get_boottime();
1715 data
->kthread_err_cnt
++;
1716 if (data
->kthread_err_cnt
>= KTHREAD_WARN_CNT
) {
1718 "%s: kthread_err_cnt=%d\n",
1720 data
->kthread_err_cnt
);
1721 nanohub_set_state(data
, ST_ERROR
);
1726 if (!nanohub_irq1_fired(data
) &&
1727 !nanohub_irq2_fired(data
)) {
1728 nanohub_set_state(data
, ST_IDLE
);
1731 /* pending interrupt, but no room to read data -
1732 * clear interrupts */
1733 if (request_wakeup(data
))
1735 nanohub_comms_tx_rx_retrans(data
,
1736 CMD_COMMS_CLR_GET_INTR
,
1739 sizeof(clear_interrupts
),
1742 sizeof(data
->interrupts
),
1744 release_wakeup(data
);
1745 nanohub_set_state(data
, ST_IDLE
);
1752 #ifndef CONFIG_NANOHUB_MAILBOX
1754 static struct nanohub_platform_data
*nanohub_parse_dt(struct device
*dev
)
1756 struct nanohub_platform_data
*pdata
;
1757 struct device_node
*dt
= dev
->of_node
;
1758 const uint32_t *tmp
;
1759 struct property
*prop
;
1764 return ERR_PTR(-ENODEV
);
1766 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
1768 return ERR_PTR(-ENOMEM
);
1770 ret
= pdata
->irq1_gpio
=
1771 of_get_named_gpio(dt
, "sensorhub,irq1-gpio", 0);
1773 pr_err("nanohub: missing sensorhub,irq1-gpio in device tree\n");
1777 /* optional (strongly recommended) */
1778 pdata
->irq2_gpio
= of_get_named_gpio(dt
, "sensorhub,irq2-gpio", 0);
1780 ret
= pdata
->wakeup_gpio
=
1781 of_get_named_gpio(dt
, "sensorhub,wakeup-gpio", 0);
1784 ("nanohub: missing sensorhub,wakeup-gpio in device tree\n");
1788 ret
= pdata
->nreset_gpio
=
1789 of_get_named_gpio(dt
, "sensorhub,nreset-gpio", 0);
1792 ("nanohub: missing sensorhub,nreset-gpio in device tree\n");
1796 /* optional (stm32f bootloader) */
1797 pdata
->boot0_gpio
= of_get_named_gpio(dt
, "sensorhub,boot0-gpio", 0);
1799 /* optional (spi) */
1800 pdata
->spi_cs_gpio
= of_get_named_gpio(dt
, "sensorhub,spi-cs-gpio", 0);
1802 /* optional (stm32f bootloader) */
1803 of_property_read_u32(dt
, "sensorhub,bl-addr", &pdata
->bl_addr
);
1805 /* optional (stm32f bootloader) */
1806 tmp
= of_get_property(dt
, "sensorhub,num-flash-banks", NULL
);
1808 pdata
->num_flash_banks
= be32_to_cpup(tmp
);
1809 pdata
->flash_banks
=
1811 sizeof(struct nanohub_flash_bank
) *
1812 pdata
->num_flash_banks
, GFP_KERNEL
);
1813 if (!pdata
->flash_banks
)
1816 /* TODO: investigate replacing with of_property_read_u32_array
1819 of_property_for_each_u32(dt
, "sensorhub,flash-banks", prop
, tmp
,
1821 if (i
/ 3 >= pdata
->num_flash_banks
)
1825 pdata
->flash_banks
[i
/ 3].bank
= u
;
1828 pdata
->flash_banks
[i
/ 3].address
= u
;
1831 pdata
->flash_banks
[i
/ 3].length
= u
;
1838 /* optional (stm32f bootloader) */
1839 tmp
= of_get_property(dt
, "sensorhub,num-shared-flash-banks", NULL
);
1841 pdata
->num_shared_flash_banks
= be32_to_cpup(tmp
);
1842 pdata
->shared_flash_banks
=
1844 sizeof(struct nanohub_flash_bank
) *
1845 pdata
->num_shared_flash_banks
, GFP_KERNEL
);
1846 if (!pdata
->shared_flash_banks
)
1849 /* TODO: investigate replacing with of_property_read_u32_array
1852 of_property_for_each_u32(dt
, "sensorhub,shared-flash-banks",
1854 if (i
/ 3 >= pdata
->num_shared_flash_banks
)
1858 pdata
->shared_flash_banks
[i
/ 3].bank
= u
;
1861 pdata
->shared_flash_banks
[i
/ 3].address
= u
;
1864 pdata
->shared_flash_banks
[i
/ 3].length
= u
;
1874 devm_kfree(dev
, pdata
->flash_banks
);
1878 devm_kfree(dev
, pdata
);
1879 return ERR_PTR(ret
);
1882 static struct nanohub_platform_data
*nanohub_parse_dt(struct device
*dev
)
1884 struct nanohub_platform_data
*pdata
;
1886 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
1888 return ERR_PTR(-ENOMEM
);
1894 static int nanohub_request_irqs(struct nanohub_data
*data
)
1898 ret
= request_threaded_irq(data
->irq1
, NULL
, nanohub_irq1
,
1899 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
1900 "nanohub-irq1", data
);
1904 disable_irq(data
->irq1
);
1905 if (data
->irq2
<= 0 || ret
< 0) {
1910 ret
= request_threaded_irq(data
->irq2
, NULL
, nanohub_irq2
,
1911 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
1912 "nanohub-irq2", data
);
1915 WARN(1, "failed to request optional IRQ %d; err=%d",
1918 disable_irq(data
->irq2
);
1921 /* if 2d request fails, hide this; it is optional IRQ,
1922 * and failure should not interrupt driver init sequence.
1927 static int nanohub_request_gpios(struct nanohub_data
*data
)
1931 for (i
= 0; i
< ARRAY_SIZE(gconf
); ++i
) {
1932 const struct gpio_config
*cfg
= &gconf
[i
];
1933 unsigned int gpio
= plat_gpio_get(data
, cfg
);
1935 bool optional
= gpio_is_optional(cfg
);
1937 ret
= 0; /* clear errors on optional pins, if any */
1939 if (!gpio_is_valid(gpio
) && optional
)
1943 ret
= gpio_request_one(gpio
, cfg
->flags
, label
);
1944 if (ret
&& !optional
) {
1945 pr_err("nanohub: gpio %d[%s] request failed;err=%d\n",
1949 if (gpio_has_irq(cfg
)) {
1950 int irq
= gpio_to_irq(gpio
);
1952 nanohub_set_irq_data(data
, cfg
, irq
);
1953 } else if (!optional
) {
1955 pr_err("nanohub: no irq; gpio %d[%s];err=%d\n",
1961 if (i
< ARRAY_SIZE(gconf
)) {
1962 for (--i
; i
>= 0; --i
)
1963 gpio_free(plat_gpio_get(data
, &gconf
[i
]));
1969 static void nanohub_release_gpios_irqs(struct nanohub_data
*data
)
1971 const struct nanohub_platform_data
*pdata
= data
->pdata
;
1974 free_irq(data
->irq2
, data
);
1976 free_irq(data
->irq1
, data
);
1977 if (gpio_is_valid(pdata
->irq2_gpio
))
1978 gpio_free(pdata
->irq2_gpio
);
1979 gpio_free(pdata
->irq1_gpio
);
1980 gpio_set_value(pdata
->nreset_gpio
, 0);
1981 gpio_free(pdata
->nreset_gpio
);
1982 mcu_wakeup_gpio_set_value(data
, 1);
1983 gpio_free(pdata
->wakeup_gpio
);
1984 gpio_set_value(pdata
->boot0_gpio
, 0);
1985 gpio_free(pdata
->boot0_gpio
);
1989 struct iio_dev
*nanohub_probe(struct device
*dev
, struct iio_dev
*iio_dev
)
1992 #ifdef CONFIG_NANOHUB_MAILBOX
1993 struct nanohub_platform_data
*pdata
;
1995 const struct nanohub_platform_data
*pdata
;
1997 struct nanohub_data
*data
;
1998 struct nanohub_buf
*buf
;
1999 bool own_iio_dev
= !iio_dev
;
2000 pdata
= dev_get_platdata(dev
);
2002 #ifdef CONFIG_NANOHUB_MAILBOX
2003 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
2005 pdata
= nanohub_parse_dt(dev
);
2008 return ERR_PTR(PTR_ERR(pdata
));
2012 iio_dev
= iio_device_alloc(sizeof(struct nanohub_data
));
2014 return ERR_PTR(-ENOMEM
);
2017 iio_dev
->name
= "nanohub";
2018 iio_dev
->dev
.parent
= dev
;
2019 iio_dev
->info
= &nanohub_iio_info
;
2020 iio_dev
->channels
= NULL
;
2021 iio_dev
->num_channels
= 0;
2023 data
= iio_priv(iio_dev
);
2024 data
->iio_dev
= iio_dev
;
2025 data
->pdata
= pdata
;
2027 init_waitqueue_head(&data
->kthread_wait
);
2029 nanohub_io_init(&data
->free_pool
, data
, dev
);
2031 buf
= vmalloc(sizeof(*buf
) * READ_QUEUE_DEPTH
);
2038 for (i
= 0; i
< READ_QUEUE_DEPTH
; i
++)
2039 nanohub_io_put_buf(&data
->free_pool
, &buf
[i
]);
2040 atomic_set(&data
->kthread_run
, 0);
2041 wake_lock_init(&data
->wakelock_read
, WAKE_LOCK_SUSPEND
,
2042 "nanohub_wakelock_read");
2044 atomic_set(&data
->lock_mode
, LOCK_MODE_NONE
);
2045 atomic_set(&data
->wakeup_cnt
, 0);
2046 atomic_set(&data
->wakeup_lock_cnt
, 0);
2047 atomic_set(&data
->wakeup_acquired
, 0);
2048 init_waitqueue_head(&data
->wakeup_wait
);
2050 #ifdef CONFIG_EXT_CHUB
2051 ret
= nanohub_request_gpios(data
);
2055 ret
= nanohub_request_irqs(data
);
2060 ret
= iio_device_register(iio_dev
);
2062 pr_err("nanohub: iio_device_register failed\n");
2066 ret
= nanohub_create_devices(data
);
2070 #ifdef CONFIG_EXT_CHUB
2071 data
->thread
= kthread_run(nanohub_kthread
, data
, "nanohub");
2078 iio_device_unregister(iio_dev
);
2080 #ifdef CONFIG_EXT_CHUB
2081 nanohub_release_gpios_irqs(data
);
2083 free_irq(data
->irq
, data
);
2085 wake_lock_destroy(&data
->wakelock_read
);
2089 iio_device_free(iio_dev
);
2091 return ERR_PTR(ret
);
2094 int nanohub_remove(struct iio_dev
*iio_dev
)
2096 struct nanohub_data
*data
= iio_priv(iio_dev
);
2098 nanohub_notify_thread(data
);
2099 kthread_stop(data
->thread
);
2101 nanohub_destroy_devices(data
);
2102 iio_device_unregister(iio_dev
);
2103 #ifdef CONFIG_EXT_CHUB
2104 nanohub_release_gpios_irqs(data
);
2106 wake_lock_destroy(&data
->wakelock_read
);
2108 iio_device_free(iio_dev
);
2113 int nanohub_suspend(struct iio_dev
*iio_dev
)
2115 #if defined(CONFIG_EXT_CHUB)
2116 struct nanohub_data
*data
= iio_priv(iio_dev
);
2119 ret
= nanohub_wakeup_lock(data
, LOCK_MODE_SUSPEND_RESUME
);
2122 const int max_cnt
= 10;
2124 for (cnt
= 0; cnt
< max_cnt
; ++cnt
) {
2125 if (!nanohub_irq1_fired(data
))
2127 usleep_range(10, 15);
2129 if (cnt
< max_cnt
) {
2130 dev_dbg(&iio_dev
->dev
, "%s: cnt=%d\n", __func__
, cnt
);
2131 enable_irq_wake(data
->irq1
);
2135 dev_info(&iio_dev
->dev
,
2136 "%s: failed to suspend: IRQ1=%d, state=%d\n",
2137 __func__
, nanohub_irq1_fired(data
),
2138 nanohub_get_state(data
));
2139 nanohub_wakeup_unlock(data
);
2141 dev_info(&iio_dev
->dev
, "%s: could not take wakeup lock\n",
2146 #elif defined(CONFIG_NANOHUB_MAILBOX)
2153 int nanohub_resume(struct iio_dev
*iio_dev
)
2155 struct nanohub_data
*data
= iio_priv(iio_dev
);
2157 #if defined(CONFIG_EXT_CHUB)
2158 disable_irq_wake(data
->irq1
);
2159 nanohub_wakeup_unlock(data
);
2160 #elif defined(CONFIG_NANOHUB_MAILBOX)
2161 nanohub_notify_thread(data
);
2166 static int __init
nanohub_init(void)
2170 sensor_class
= class_create(THIS_MODULE
, "nanohub");
2171 if (IS_ERR(sensor_class
)) {
2172 ret
= PTR_ERR(sensor_class
);
2173 pr_err("nanohub: class_create failed; err=%d\n", ret
);
2177 major
= __register_chrdev(0, 0, ID_NANOHUB_MAX
, "nanohub",
2180 chub_dev_major
= __register_chrdev(0, 0, 1, "chub_dev", &chub_dev_fileops
);
2181 if(chub_dev_major
< 0) {
2182 pr_info("nanohub : can't register chub_dev; err = %d\n", chub_dev_major
);
2185 pr_info("nanohub : registered chub_dev; %d\n", chub_dev_major
);
2191 pr_err("nanohub: can't register; err=%d\n", ret
);
2193 pr_info("nanohub : registered major; %d\n", major
);
2195 #ifdef CONFIG_NANOHUB_I2C
2197 ret
= nanohub_i2c_init();
2199 #ifdef CONFIG_NANOHUB_SPI
2201 ret
= nanohub_spi_init();
2203 pr_info("nanohub: loaded; ret=%d\n", ret
);
2207 static void __exit
nanohub_cleanup(void)
2209 #ifdef CONFIG_NANOHUB_I2C
2210 nanohub_i2c_cleanup();
2212 #ifdef CONFIG_NANOHUB_SPI
2213 nanohub_spi_cleanup();
2215 __unregister_chrdev(major
, 0, ID_NANOHUB_MAX
, "nanohub");
2216 __unregister_chrdev(chub_dev_major
, 0, 1, "chub_dev");
2217 class_destroy(sensor_class
);
2222 module_init(nanohub_init
);
2223 module_exit(nanohub_cleanup
);
2225 MODULE_AUTHOR("Ben Fennema");
2226 MODULE_LICENSE("GPL");