00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00039
00040
00041 #ifndef _EC_MASTER_H_
00042 #define _EC_MASTER_H_
00043
00044 #include <linux/list.h>
00045 #include <linux/sysfs.h>
00046 #include <linux/timer.h>
00047 #include <asm/atomic.h>
00048 #include <asm/semaphore.h>
00049
00050 #include "device.h"
00051 #include "domain.h"
00052 #include "fsm.h"
00053
00054
00055
00060 typedef enum
00061 {
00062 EC_MASTER_MODE_ORPHANED,
00063 EC_MASTER_MODE_IDLE,
00064 EC_MASTER_MODE_OPERATION
00065 }
00066 ec_master_mode_t;
00067
00068
00069
00074 typedef struct
00075 {
00076 unsigned int timeouts;
00077 unsigned int corrupted;
00078 unsigned int skipped;
00080 unsigned int unmatched;
00082 unsigned long output_jiffies;
00083 }
00084 ec_stats_t;
00085
00086
00087
00093 struct ec_master
00094 {
00095 struct list_head list;
00096 atomic_t available;
00097 unsigned int index;
00099 struct kobject kobj;
00101 ec_device_t *device;
00102 struct semaphore device_sem;
00104 ec_fsm_t fsm;
00105 ec_master_mode_t mode;
00107 struct list_head slaves;
00108 unsigned int slave_count;
00110 struct list_head datagram_queue;
00111 uint8_t datagram_index;
00113 struct list_head domains;
00115 int debug_level;
00116 ec_stats_t stats;
00118 struct workqueue_struct *workqueue;
00119 struct work_struct idle_work;
00120 uint32_t idle_cycle_times[HZ];
00121 unsigned int idle_cycle_time_pos;
00123 struct timer_list eoe_timer;
00124 uint32_t eoe_cycle_times[HZ];
00125 unsigned int eoe_cycle_time_pos;
00126 unsigned int eoe_running;
00127 unsigned int eoe_checked;
00129 struct list_head eoe_handlers;
00131 spinlock_t internal_lock;
00132 int (*request_cb)(void *);
00133 void (*release_cb)(void *);
00134 void *cb_data;
00136 uint8_t eeprom_write_enable;
00138 ec_sdo_request_t *sdo_request;
00139 unsigned int sdo_seq_user;
00140 unsigned int sdo_seq_master;
00141 struct semaphore sdo_sem;
00142 struct timer_list sdo_timer;
00143 struct completion sdo_complete;
00144 };
00145
00146
00147
00148
00149 int ec_master_init(ec_master_t *, unsigned int, unsigned int);
00150 void ec_master_destroy(ec_master_t *);
00151
00152
00153 int ec_master_enter_idle_mode(ec_master_t *);
00154 void ec_master_leave_idle_mode(ec_master_t *);
00155 int ec_master_enter_operation_mode(ec_master_t *);
00156 void ec_master_leave_operation_mode(ec_master_t *);
00157
00158
00159 void ec_master_eoe_start(ec_master_t *);
00160 void ec_master_eoe_stop(ec_master_t *);
00161
00162
00163 void ec_master_receive_datagrams(ec_master_t *, const uint8_t *, size_t);
00164 void ec_master_queue_datagram(ec_master_t *, ec_datagram_t *);
00165
00166
00167 void ec_master_output_stats(ec_master_t *);
00168 void ec_master_destroy_slaves(ec_master_t *);
00169 void ec_master_calc_addressing(ec_master_t *);
00170
00171
00172 void ec_sync_config(const ec_sii_sync_t *, const ec_slave_t *, uint8_t *);
00173 void ec_fmmu_config(const ec_fmmu_t *, const ec_slave_t *, uint8_t *);
00174
00175
00176
00177 #endif