| /* |
| * Google LWIS Top Level Device Driver |
| * |
| * Copyright (c) 2018 Google, LLC |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| |
| #ifndef LWIS_DEVICE_TOP_H_ |
| #define LWIS_DEVICE_TOP_H_ |
| |
| #include "lwis_device.h" |
| |
| #define SCRATCH_MEMORY_SIZE 16 |
| |
| /* |
| * struct lwis_event_subscribe_operations |
| * This struct contains the 'virtual' functions for lwis_device subclasses |
| * Top device should be the only device to implement it. |
| */ |
| struct lwis_event_subscribe_operations { |
| /* Subscribe an event for subscriber device */ |
| int (*subscribe_event)(struct lwis_device *lwis_dev, int64_t trigger_event_id, |
| int trigger_device_id, int subscriber_device_id); |
| /* Unsubscribe an event for subscriber device */ |
| int (*unsubscribe_event)(struct lwis_device *lwis_dev, int64_t trigger_event_id, |
| int subscriber_device_id); |
| /* Notify subscriber when an event is happening */ |
| void (*notify_event_subscriber)(struct lwis_device *lwis_dev, int64_t trigger_event_id, |
| int64_t trigger_event_count, |
| int64_t trigger_event_timestamp); |
| /* Clean up event subscription hash table when unloading top device */ |
| void (*release)(struct lwis_device *lwis_dev); |
| }; |
| |
| /* |
| * struct lwis_top_device |
| * "Derived" lwis_device struct, with added top device related elements. |
| */ |
| struct lwis_top_device { |
| struct lwis_device base_dev; |
| /* For testing purposes, scratch memory is used as register space in |
| * top device. |
| */ |
| uint8_t scratch_mem[SCRATCH_MEMORY_SIZE]; |
| /* Hash table of event subscribers keyed by trigger event id */ |
| DECLARE_HASHTABLE(event_subscribers, EVENT_HASH_BITS); |
| |
| /* Subscription work */ |
| struct kthread_work subscribe_work; |
| struct list_head emitted_event_list_work; |
| |
| /* Subscription thread */ |
| struct kthread_worker subscribe_worker; |
| struct task_struct *subscribe_worker_thread; |
| struct lwis_event_subscribe_operations subscribe_ops; |
| }; |
| |
| int lwis_top_device_init(void); |
| int lwis_top_device_deinit(void); |
| #endif /* LWIS_DEVICE_TOP_H_ */ |