ssp_input.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. /*
  2. * Copyright (C) 2012, Samsung Electronics Co. Ltd. All Rights Reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include "ssp.h"
  16. /*************************************************************************/
  17. /* SSP Kernel -> HAL input evnet function */
  18. /*************************************************************************/
  19. void convert_acc_data(s16 *iValue)
  20. {
  21. if (*iValue > MAX_ACCEL_2G)
  22. *iValue = ((MAX_ACCEL_4G - *iValue)) * (-1);
  23. }
  24. void report_acc_data(struct ssp_data *data, struct sensor_value *accdata)
  25. {
  26. int time_hi, time_lo;
  27. convert_acc_data(&accdata->x);
  28. convert_acc_data(&accdata->y);
  29. convert_acc_data(&accdata->z);
  30. data->buf[ACCELEROMETER_SENSOR].x = accdata->x - data->accelcal.x;
  31. data->buf[ACCELEROMETER_SENSOR].y = accdata->y - data->accelcal.y;
  32. data->buf[ACCELEROMETER_SENSOR].z = accdata->z - data->accelcal.z;
  33. if (!(data->buf[ACCELEROMETER_SENSOR].x >> 15 == accdata->x >> 15) &&\
  34. !(data->accelcal.x >> 15 == accdata->x >> 15)) {
  35. pr_debug("[SSP] : ACCEL X is overflowed!!!\n");
  36. data->buf[ACCELEROMETER_SENSOR].x =
  37. (data->buf[ACCELEROMETER_SENSOR].x > 0 ? MIN_ACCEL_2G : MAX_ACCEL_2G);
  38. }
  39. if (!(data->buf[ACCELEROMETER_SENSOR].y >> 15 == accdata->y >> 15) &&\
  40. !(data->accelcal.y >> 15 == accdata->y >> 15)) {
  41. pr_debug("[SSP] : ACCEL Y is overflowed!!!\n");
  42. data->buf[ACCELEROMETER_SENSOR].y =
  43. (data->buf[ACCELEROMETER_SENSOR].y > 0 ? MIN_ACCEL_2G : MAX_ACCEL_2G);
  44. }
  45. if (!(data->buf[ACCELEROMETER_SENSOR].z >> 15 == accdata->z >> 15) &&\
  46. !(data->accelcal.z >> 15 == accdata->z >> 15)) {
  47. pr_debug("[SSP] : ACCEL Z is overflowed!!!\n");
  48. data->buf[ACCELEROMETER_SENSOR].z =
  49. (data->buf[ACCELEROMETER_SENSOR].z > 0 ? MIN_ACCEL_2G : MAX_ACCEL_2G);
  50. }
  51. time_lo = (int)(accdata->timestamp & TIME_LO_MASK);
  52. time_hi = (int)((accdata->timestamp & TIME_HI_MASK) >> TIME_HI_SHIFT);
  53. input_report_rel(data->acc_input_dev, REL_X,
  54. data->buf[ACCELEROMETER_SENSOR].x);
  55. input_report_rel(data->acc_input_dev, REL_Y,
  56. data->buf[ACCELEROMETER_SENSOR].y);
  57. input_report_rel(data->acc_input_dev, REL_Z,
  58. data->buf[ACCELEROMETER_SENSOR].z);
  59. input_report_rel(data->acc_input_dev, REL_DIAL, time_hi);
  60. input_report_rel(data->acc_input_dev, REL_MISC, time_lo);
  61. input_sync(data->acc_input_dev);
  62. }
  63. void report_gyro_data(struct ssp_data *data, struct sensor_value *gyrodata)
  64. {
  65. long lTemp[6] = {0,};
  66. int time_hi, time_lo;
  67. data->buf[GYROSCOPE_SENSOR].x = gyrodata->x - data->gyrocal.x;
  68. data->buf[GYROSCOPE_SENSOR].y = gyrodata->y - data->gyrocal.y;
  69. data->buf[GYROSCOPE_SENSOR].z = gyrodata->z - data->gyrocal.z;
  70. if (!(data->buf[GYROSCOPE_SENSOR].x >> 15 == gyrodata->x >> 15) &&\
  71. !(data->gyrocal.x >> 15 == gyrodata->x >> 15)) {
  72. pr_debug("[SSP] : GYRO X is overflowed!!!\n");
  73. data->buf[GYROSCOPE_SENSOR].x =
  74. (data->buf[GYROSCOPE_SENSOR].x >= 0 ? MIN_GYRO : MAX_GYRO);
  75. }
  76. if (!(data->buf[GYROSCOPE_SENSOR].y >> 15 == gyrodata->y >> 15) &&\
  77. !(data->gyrocal.y >> 15 == gyrodata->y >> 15)) {
  78. pr_debug("[SSP] : GYRO Y is overflowed!!!\n");
  79. data->buf[GYROSCOPE_SENSOR].y =
  80. (data->buf[GYROSCOPE_SENSOR].y >= 0 ? MIN_GYRO : MAX_GYRO);
  81. }
  82. if (!(data->buf[GYROSCOPE_SENSOR].z >> 15 == gyrodata->z >> 15) &&\
  83. !(data->gyrocal.z >> 15 == gyrodata->z >> 15)) {
  84. pr_debug("[SSP] : GYRO Z is overflowed!!!\n");
  85. data->buf[GYROSCOPE_SENSOR].z =
  86. (data->buf[GYROSCOPE_SENSOR].z >= 0 ? MIN_GYRO : MAX_GYRO);
  87. }
  88. if (data->uGyroDps == GYROSCOPE_DPS500) {
  89. lTemp[0] = (long)gyrodata->x;
  90. lTemp[1] = (long)gyrodata->y;
  91. lTemp[2] = (long)gyrodata->z;
  92. lTemp[3] = (long)data->gyrocal.x;
  93. lTemp[4] = (long)data->gyrocal.y;
  94. lTemp[5] = (long)data->gyrocal.z;
  95. } else if (data->uGyroDps == GYROSCOPE_DPS250) {
  96. lTemp[0] = (long)gyrodata->x >> 1;
  97. lTemp[1] = (long)gyrodata->y >> 1;
  98. lTemp[2] = (long)gyrodata->z >> 1;
  99. lTemp[3] = (long)data->gyrocal.x >> 1;
  100. lTemp[4] = (long)data->gyrocal.y >> 1;
  101. lTemp[5] = (long)data->gyrocal.z >> 1;
  102. } else if (data->uGyroDps == GYROSCOPE_DPS2000) {
  103. lTemp[0] = (long)gyrodata->x << 2;
  104. lTemp[1] = (long)gyrodata->y << 2;
  105. lTemp[2] = (long)gyrodata->z << 2;
  106. lTemp[3] = (long)data->gyrocal.x << 2;
  107. lTemp[4] = (long)data->gyrocal.y << 2;
  108. lTemp[5] = (long)data->gyrocal.z << 2;
  109. } else {
  110. lTemp[0] = (long)gyrodata->x;
  111. lTemp[1] = (long)gyrodata->y;
  112. lTemp[2] = (long)gyrodata->z;
  113. lTemp[3] = (long)data->gyrocal.x;
  114. lTemp[4] = (long)data->gyrocal.y;
  115. lTemp[5] = (long)data->gyrocal.z;
  116. }
  117. time_lo = (int)(gyrodata->timestamp & TIME_LO_MASK);
  118. time_hi = (int)((gyrodata->timestamp & TIME_HI_MASK) >> TIME_HI_SHIFT);
  119. input_report_rel(data->gyro_input_dev, REL_RX, lTemp[0] + 1);
  120. input_report_rel(data->gyro_input_dev, REL_RY, lTemp[1] + 1);
  121. input_report_rel(data->gyro_input_dev, REL_RZ, lTemp[2] + 1);
  122. input_report_rel(data->gyro_input_dev, REL_HWHEEL, lTemp[3] + 1);
  123. input_report_rel(data->gyro_input_dev, REL_DIAL, lTemp[4] + 1);
  124. input_report_rel(data->gyro_input_dev, REL_WHEEL, lTemp[5] + 1);
  125. input_report_rel(data->gyro_input_dev, REL_X, time_hi);
  126. input_report_rel(data->gyro_input_dev, REL_Y, time_lo);
  127. input_sync(data->gyro_input_dev);
  128. }
  129. void report_mag_data(struct ssp_data *data, struct sensor_value *magdata)
  130. {
  131. int time_hi, time_lo;
  132. data->buf[GEOMAGNETIC_SENSOR].x = magdata->x;
  133. data->buf[GEOMAGNETIC_SENSOR].y = magdata->y;
  134. data->buf[GEOMAGNETIC_SENSOR].z = magdata->z;
  135. time_lo = (int)(magdata->timestamp & TIME_LO_MASK);
  136. time_hi = (int)((magdata->timestamp & TIME_HI_MASK) >> TIME_HI_SHIFT);
  137. input_report_rel(data->mag_input_dev, REL_RX,
  138. data->buf[GEOMAGNETIC_SENSOR].x);
  139. input_report_rel(data->mag_input_dev, REL_RY,
  140. data->buf[GEOMAGNETIC_SENSOR].y);
  141. input_report_rel(data->mag_input_dev, REL_RZ,
  142. data->buf[GEOMAGNETIC_SENSOR].z);
  143. input_report_rel(data->mag_input_dev, REL_X, time_hi);
  144. input_report_rel(data->mag_input_dev, REL_Y, time_lo);
  145. input_sync(data->mag_input_dev);
  146. }
  147. void report_gesture_data(struct ssp_data *data, struct sensor_value *gesdata)
  148. {
  149. data->buf[GESTURE_SENSOR].data[0] = gesdata->data[0]; /* X */
  150. data->buf[GESTURE_SENSOR].data[1] = gesdata->data[1]; /* Y */
  151. data->buf[GESTURE_SENSOR].data[2] = gesdata->data[2]; /* Z */
  152. data->buf[GESTURE_SENSOR].data[3] = gesdata->data[3]; /* thresh */
  153. data->buf[GESTURE_SENSOR].data[4] = gesdata->data[4]; /* count */
  154. data->buf[GESTURE_SENSOR].data[5] = gesdata->data[5]; /* a_delta */
  155. data->buf[GESTURE_SENSOR].data[6] = gesdata->data[6]; /* b_delta */
  156. data->buf[GESTURE_SENSOR].data[7] = gesdata->data[7]; /* c_delta */
  157. data->buf[GESTURE_SENSOR].data[8] = gesdata->data[8]; /* d_delta */
  158. input_report_abs(data->gesture_input_dev,
  159. ABS_RUDDER, data->buf[GESTURE_SENSOR].data[0]);
  160. input_report_abs(data->gesture_input_dev,
  161. ABS_WHEEL, data->buf[GESTURE_SENSOR].data[1]);
  162. input_report_abs(data->gesture_input_dev,
  163. ABS_GAS, data->buf[GESTURE_SENSOR].data[2]);
  164. input_report_abs(data->gesture_input_dev,
  165. ABS_BRAKE, data->buf[GESTURE_SENSOR].data[3]);
  166. input_report_abs(data->gesture_input_dev,
  167. ABS_THROTTLE, data->buf[GESTURE_SENSOR].data[4]);
  168. input_report_abs(data->gesture_input_dev,
  169. ABS_X, data->buf[GESTURE_SENSOR].data[5]);
  170. input_report_abs(data->gesture_input_dev,
  171. ABS_Y, data->buf[GESTURE_SENSOR].data[6]);
  172. input_report_abs(data->gesture_input_dev,
  173. ABS_Z, data->buf[GESTURE_SENSOR].data[7]);
  174. input_report_abs(data->gesture_input_dev,
  175. ABS_RX, data->buf[GESTURE_SENSOR].data[8]);
  176. input_sync(data->gesture_input_dev);
  177. }
  178. void report_pressure_data(struct ssp_data *data, struct sensor_value *predata)
  179. {
  180. data->buf[PRESSURE_SENSOR].pressure[0] =
  181. predata->pressure[0] - data->iPressureCal;
  182. data->buf[PRESSURE_SENSOR].pressure[1] = predata->pressure[1];
  183. /* pressure */
  184. input_report_rel(data->pressure_input_dev, REL_HWHEEL,
  185. data->buf[PRESSURE_SENSOR].pressure[0]);
  186. /* temperature */
  187. input_report_rel(data->pressure_input_dev, REL_WHEEL,
  188. data->buf[PRESSURE_SENSOR].pressure[1]);
  189. input_sync(data->pressure_input_dev);
  190. }
  191. void report_light_data(struct ssp_data *data, struct sensor_value *lightdata)
  192. {
  193. data->buf[LIGHT_SENSOR].r = lightdata->r;
  194. data->buf[LIGHT_SENSOR].g = lightdata->g;
  195. data->buf[LIGHT_SENSOR].b = lightdata->b;
  196. data->buf[LIGHT_SENSOR].w = lightdata->w;
  197. input_report_rel(data->light_input_dev, REL_HWHEEL,
  198. data->buf[LIGHT_SENSOR].r + 1);
  199. input_report_rel(data->light_input_dev, REL_DIAL,
  200. data->buf[LIGHT_SENSOR].g + 1);
  201. input_report_rel(data->light_input_dev, REL_WHEEL,
  202. data->buf[LIGHT_SENSOR].b + 1);
  203. input_report_rel(data->light_input_dev, REL_MISC,
  204. data->buf[LIGHT_SENSOR].w + 1);
  205. input_sync(data->light_input_dev);
  206. }
  207. void report_prox_data(struct ssp_data *data, struct sensor_value *proxdata)
  208. {
  209. ssp_dbg("[SSP] Proximity Sensor Detect : %u, raw : %u\n",
  210. proxdata->prox[0], proxdata->prox[1]);
  211. data->buf[PROXIMITY_SENSOR].prox[0] = proxdata->prox[0];
  212. data->buf[PROXIMITY_SENSOR].prox[1] = proxdata->prox[1];
  213. input_report_abs(data->prox_input_dev, ABS_DISTANCE,
  214. (!proxdata->prox[0]));
  215. input_sync(data->prox_input_dev);
  216. wake_lock_timeout(&data->ssp_wake_lock, 3 * HZ);
  217. }
  218. void report_prox_raw_data(struct ssp_data *data,
  219. struct sensor_value *proxrawdata)
  220. {
  221. if (data->uFactoryProxAvg[0]++ >= PROX_AVG_READ_NUM) {
  222. data->uFactoryProxAvg[2] /= PROX_AVG_READ_NUM;
  223. data->buf[PROXIMITY_RAW].prox[1] = (u8)data->uFactoryProxAvg[1];
  224. data->buf[PROXIMITY_RAW].prox[2] = (u8)data->uFactoryProxAvg[2];
  225. data->buf[PROXIMITY_RAW].prox[3] = (u8)data->uFactoryProxAvg[3];
  226. data->uFactoryProxAvg[0] = 0;
  227. data->uFactoryProxAvg[1] = 0;
  228. data->uFactoryProxAvg[2] = 0;
  229. data->uFactoryProxAvg[3] = 0;
  230. } else {
  231. data->uFactoryProxAvg[2] += proxrawdata->prox[0];
  232. if (data->uFactoryProxAvg[0] == 1)
  233. data->uFactoryProxAvg[1] = proxrawdata->prox[0];
  234. else if (proxrawdata->prox[0] < data->uFactoryProxAvg[1])
  235. data->uFactoryProxAvg[1] = proxrawdata->prox[0];
  236. if (proxrawdata->prox[0] > data->uFactoryProxAvg[3])
  237. data->uFactoryProxAvg[3] = proxrawdata->prox[0];
  238. }
  239. data->buf[PROXIMITY_RAW].prox[0] = proxrawdata->prox[0];
  240. }
  241. void report_geomagnetic_raw_data(struct ssp_data *data,
  242. struct sensor_value *magrawdata)
  243. {
  244. data->buf[GEOMAGNETIC_RAW].x = magrawdata->x;
  245. data->buf[GEOMAGNETIC_RAW].y = magrawdata->y;
  246. data->buf[GEOMAGNETIC_RAW].z = magrawdata->z;
  247. }
  248. void report_temp_humidity_data(struct ssp_data *data,
  249. struct sensor_value *temp_humi_data)
  250. {
  251. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[0] =
  252. temp_humi_data->data[0];
  253. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[1] =
  254. temp_humi_data->data[1];
  255. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[2] =
  256. temp_humi_data->data[2];
  257. /* Temperature */
  258. input_report_rel(data->temp_humi_input_dev, REL_HWHEEL,
  259. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[0]);
  260. /* Humidity */
  261. input_report_rel(data->temp_humi_input_dev, REL_DIAL,
  262. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[1]);
  263. input_sync(data->temp_humi_input_dev);
  264. if (data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[2])
  265. wake_lock_timeout(&data->ssp_wake_lock, 2 * HZ);
  266. }
  267. void report_sig_motion_data(struct ssp_data *data,
  268. struct sensor_value *sig_motion_data)
  269. {
  270. data->buf[SIG_MOTION_SENSOR].sig_motion = sig_motion_data->sig_motion;
  271. input_report_rel(data->sig_motion_input_dev, REL_MISC,
  272. data->buf[SIG_MOTION_SENSOR].sig_motion);
  273. input_sync(data->sig_motion_input_dev);
  274. }
  275. void report_step_det_data(struct ssp_data *data,
  276. struct sensor_value *sig_motion_data)
  277. {
  278. data->buf[STEP_DETECTOR].step_det = sig_motion_data->step_det;
  279. input_report_rel(data->step_det_input_dev, REL_MISC,
  280. data->buf[STEP_DETECTOR].step_det + 1);
  281. input_sync(data->step_det_input_dev);
  282. }
  283. void report_step_cnt_data(struct ssp_data *data,
  284. struct sensor_value *sig_motion_data)
  285. {
  286. data->buf[STEP_COUNTER].step_diff = sig_motion_data->step_diff;
  287. data->step_count_total += data->buf[STEP_COUNTER].step_diff;
  288. input_report_rel(data->step_cnt_input_dev, REL_MISC,
  289. data->step_count_total + 1);
  290. input_sync(data->step_cnt_input_dev);
  291. }
  292. int initialize_event_symlink(struct ssp_data *data)
  293. {
  294. int iRet = 0;
  295. data->sen_dev = device_create(sensors_event_class, NULL, 0, NULL,
  296. "%s", "symlink");
  297. iRet = sysfs_create_link(&data->sen_dev->kobj,
  298. &data->acc_input_dev->dev.kobj,
  299. data->acc_input_dev->name);
  300. if (iRet < 0)
  301. goto iRet_acc_sysfs_create_link;
  302. iRet = sysfs_create_link(&data->sen_dev->kobj,
  303. &data->gyro_input_dev->dev.kobj,
  304. data->gyro_input_dev->name);
  305. if (iRet < 0)
  306. goto iRet_gyro_sysfs_create_link;
  307. iRet = sysfs_create_link(&data->sen_dev->kobj,
  308. &data->pressure_input_dev->dev.kobj,
  309. data->pressure_input_dev->name);
  310. if (iRet < 0)
  311. goto iRet_prs_sysfs_create_link;
  312. iRet = sysfs_create_link(&data->sen_dev->kobj,
  313. &data->gesture_input_dev->dev.kobj,
  314. data->gesture_input_dev->name);
  315. if (iRet < 0)
  316. goto iRet_gesture_sysfs_create_link;
  317. iRet = sysfs_create_link(&data->sen_dev->kobj,
  318. &data->light_input_dev->dev.kobj,
  319. data->light_input_dev->name);
  320. if (iRet < 0)
  321. goto iRet_light_sysfs_create_link;
  322. iRet = sysfs_create_link(&data->sen_dev->kobj,
  323. &data->prox_input_dev->dev.kobj,
  324. data->prox_input_dev->name);
  325. if (iRet < 0)
  326. goto iRet_prox_sysfs_create_link;
  327. iRet = sysfs_create_link(&data->sen_dev->kobj,
  328. &data->temp_humi_input_dev->dev.kobj,
  329. data->temp_humi_input_dev->name);
  330. if (iRet < 0)
  331. goto iRet_temp_humi_sysfs_create_link;
  332. iRet = sysfs_create_link(&data->sen_dev->kobj,
  333. &data->mag_input_dev->dev.kobj,
  334. data->mag_input_dev->name);
  335. if (iRet < 0)
  336. goto iRet_mag_sysfs_create_link;
  337. iRet = sysfs_create_link(&data->sen_dev->kobj,
  338. &data->sig_motion_input_dev->dev.kobj,
  339. data->sig_motion_input_dev->name);
  340. if (iRet < 0)
  341. goto iRet_sig_motion_sysfs_create_link;
  342. iRet = sysfs_create_link(&data->sen_dev->kobj,
  343. &data->step_det_input_dev->dev.kobj,
  344. data->step_det_input_dev->name);
  345. if (iRet < 0)
  346. goto iRet_step_det_sysfs_create_link;
  347. iRet = sysfs_create_link(&data->sen_dev->kobj,
  348. &data->step_cnt_input_dev->dev.kobj,
  349. data->step_cnt_input_dev->name);
  350. if (iRet < 0)
  351. goto iRet_step_cnt_sysfs_create_link;
  352. iRet = sysfs_create_link(&data->sen_dev->kobj,
  353. &data->meta_input_dev->dev.kobj,
  354. data->meta_input_dev->name);
  355. if (iRet < 0)
  356. goto iRet_meta_sysfs_create_link;
  357. return SUCCESS;
  358. iRet_meta_sysfs_create_link:
  359. sysfs_delete_link(&data->sen_dev->kobj,
  360. &data->step_cnt_input_dev->dev.kobj,
  361. data->step_cnt_input_dev->name);
  362. iRet_step_cnt_sysfs_create_link:
  363. sysfs_delete_link(&data->sen_dev->kobj,
  364. &data->step_det_input_dev->dev.kobj,
  365. data->step_det_input_dev->name);
  366. iRet_step_det_sysfs_create_link:
  367. sysfs_delete_link(&data->sen_dev->kobj,
  368. &data->sig_motion_input_dev->dev.kobj,
  369. data->sig_motion_input_dev->name);
  370. iRet_sig_motion_sysfs_create_link:
  371. sysfs_delete_link(&data->sen_dev->kobj,
  372. &data->mag_input_dev->dev.kobj,
  373. data->mag_input_dev->name);
  374. iRet_mag_sysfs_create_link:
  375. sysfs_delete_link(&data->sen_dev->kobj,
  376. &data->temp_humi_input_dev->dev.kobj,
  377. data->temp_humi_input_dev->name);
  378. iRet_temp_humi_sysfs_create_link:
  379. sysfs_delete_link(&data->sen_dev->kobj,
  380. &data->prox_input_dev->dev.kobj,
  381. data->prox_input_dev->name);
  382. iRet_prox_sysfs_create_link:
  383. sysfs_delete_link(&data->sen_dev->kobj,
  384. &data->light_input_dev->dev.kobj,
  385. data->light_input_dev->name);
  386. iRet_light_sysfs_create_link:
  387. sysfs_delete_link(&data->sen_dev->kobj,
  388. &data->pressure_input_dev->dev.kobj,
  389. data->pressure_input_dev->name);
  390. iRet_gesture_sysfs_create_link:
  391. sysfs_delete_link(&data->sen_dev->kobj,
  392. &data->gesture_input_dev->dev.kobj,
  393. data->gesture_input_dev->name);
  394. iRet_prs_sysfs_create_link:
  395. sysfs_delete_link(&data->sen_dev->kobj,
  396. &data->gyro_input_dev->dev.kobj,
  397. data->gyro_input_dev->name);
  398. iRet_gyro_sysfs_create_link:
  399. sysfs_delete_link(&data->sen_dev->kobj,
  400. &data->acc_input_dev->dev.kobj,
  401. data->acc_input_dev->name);
  402. iRet_acc_sysfs_create_link:
  403. pr_err("[SSP]: %s - could not create event symlink\n", __func__);
  404. return FAIL;
  405. }
  406. void remove_event_symlink(struct ssp_data *data)
  407. {
  408. sysfs_delete_link(&data->sen_dev->kobj,
  409. &data->acc_input_dev->dev.kobj,
  410. data->acc_input_dev->name);
  411. sysfs_delete_link(&data->sen_dev->kobj,
  412. &data->gyro_input_dev->dev.kobj,
  413. data->gyro_input_dev->name);
  414. sysfs_delete_link(&data->sen_dev->kobj,
  415. &data->pressure_input_dev->dev.kobj,
  416. data->pressure_input_dev->name);
  417. sysfs_delete_link(&data->sen_dev->kobj,
  418. &data->gesture_input_dev->dev.kobj,
  419. data->gesture_input_dev->name);
  420. sysfs_delete_link(&data->sen_dev->kobj,
  421. &data->light_input_dev->dev.kobj,
  422. data->light_input_dev->name);
  423. sysfs_delete_link(&data->sen_dev->kobj,
  424. &data->prox_input_dev->dev.kobj,
  425. data->prox_input_dev->name);
  426. sysfs_delete_link(&data->sen_dev->kobj,
  427. &data->temp_humi_input_dev->dev.kobj,
  428. data->temp_humi_input_dev->name);
  429. sysfs_delete_link(&data->sen_dev->kobj,
  430. &data->mag_input_dev->dev.kobj,
  431. data->mag_input_dev->name);
  432. sysfs_delete_link(&data->sen_dev->kobj,
  433. &data->sig_motion_input_dev->dev.kobj,
  434. data->sig_motion_input_dev->name);
  435. sysfs_delete_link(&data->sen_dev->kobj,
  436. &data->step_det_input_dev->dev.kobj,
  437. data->step_det_input_dev->name);
  438. sysfs_delete_link(&data->sen_dev->kobj,
  439. &data->step_cnt_input_dev->dev.kobj,
  440. data->step_cnt_input_dev->name);
  441. sysfs_delete_link(&data->sen_dev->kobj,
  442. &data->meta_input_dev->dev.kobj,
  443. data->meta_input_dev->name);
  444. }
  445. int initialize_input_dev(struct ssp_data *data)
  446. {
  447. int iRet = 0;
  448. struct input_dev *acc_input_dev, *gyro_input_dev, *pressure_input_dev,
  449. *light_input_dev, *prox_input_dev, *temp_humi_input_dev,
  450. *mag_input_dev, *gesture_input_dev, *sig_motion_input_dev,
  451. *step_det_input_dev, *step_cnt_input_dev, *meta_input_dev;
  452. /* allocate input_device */
  453. acc_input_dev = input_allocate_device();
  454. if (acc_input_dev == NULL)
  455. goto iRet_acc_input_free_device;
  456. gyro_input_dev = input_allocate_device();
  457. if (gyro_input_dev == NULL)
  458. goto iRet_gyro_input_free_device;
  459. pressure_input_dev = input_allocate_device();
  460. if (pressure_input_dev == NULL)
  461. goto iRet_pressure_input_free_device;
  462. gesture_input_dev = input_allocate_device();
  463. if (gesture_input_dev == NULL)
  464. goto iRet_gesture_input_free_device;
  465. light_input_dev = input_allocate_device();
  466. if (light_input_dev == NULL)
  467. goto iRet_light_input_free_device;
  468. prox_input_dev = input_allocate_device();
  469. if (prox_input_dev == NULL)
  470. goto iRet_proximity_input_free_device;
  471. temp_humi_input_dev = input_allocate_device();
  472. if (temp_humi_input_dev == NULL)
  473. goto iRet_temp_humidity_input_free_device;
  474. mag_input_dev = input_allocate_device();
  475. if (mag_input_dev == NULL)
  476. goto iRet_mag_input_free_device;
  477. sig_motion_input_dev = input_allocate_device();
  478. if (sig_motion_input_dev == NULL)
  479. goto iRet_sig_motion_input_free_device;
  480. step_det_input_dev = input_allocate_device();
  481. if (step_det_input_dev == NULL)
  482. goto iRet_step_det_input_free_device;
  483. step_cnt_input_dev = input_allocate_device();
  484. if (step_cnt_input_dev == NULL)
  485. goto iRet_step_cnt_input_free_device;
  486. meta_input_dev = input_allocate_device();
  487. if (meta_input_dev == NULL)
  488. goto iRet_meta_input_free_device;
  489. input_set_drvdata(acc_input_dev, data);
  490. input_set_drvdata(gyro_input_dev, data);
  491. input_set_drvdata(pressure_input_dev, data);
  492. input_set_drvdata(gesture_input_dev, data);
  493. input_set_drvdata(light_input_dev, data);
  494. input_set_drvdata(prox_input_dev, data);
  495. input_set_drvdata(temp_humi_input_dev, data);
  496. input_set_drvdata(mag_input_dev, data);
  497. input_set_drvdata(sig_motion_input_dev, data);
  498. input_set_drvdata(step_det_input_dev, data);
  499. input_set_drvdata(step_cnt_input_dev, data);
  500. input_set_drvdata(meta_input_dev, data);
  501. acc_input_dev->name = "accelerometer_sensor";
  502. gyro_input_dev->name = "gyro_sensor";
  503. pressure_input_dev->name = "pressure_sensor";
  504. gesture_input_dev->name = "gesture_sensor";
  505. light_input_dev->name = "light_sensor";
  506. prox_input_dev->name = "proximity_sensor";
  507. temp_humi_input_dev->name = "temp_humidity_sensor";
  508. mag_input_dev->name = "geomagnetic_sensor";
  509. sig_motion_input_dev->name = "sig_motion_sensor";
  510. step_det_input_dev->name = "step_det_sensor";
  511. step_cnt_input_dev->name = "step_cnt_sensor";
  512. meta_input_dev->name = "meta_event";
  513. input_set_capability(acc_input_dev, EV_REL, REL_X);
  514. input_set_capability(acc_input_dev, EV_REL, REL_Y);
  515. input_set_capability(acc_input_dev, EV_REL, REL_Z);
  516. input_set_capability(acc_input_dev, EV_REL, REL_DIAL); /* time_hi */
  517. input_set_capability(acc_input_dev, EV_REL, REL_MISC); /* time_lo */
  518. input_set_capability(gyro_input_dev, EV_REL, REL_RX);
  519. input_set_capability(gyro_input_dev, EV_REL, REL_RY);
  520. input_set_capability(gyro_input_dev, EV_REL, REL_RZ);
  521. input_set_capability(gyro_input_dev, EV_REL, REL_HWHEEL);
  522. input_set_capability(gyro_input_dev, EV_REL, REL_DIAL);
  523. input_set_capability(gyro_input_dev, EV_REL, REL_WHEEL);
  524. input_set_capability(gyro_input_dev, EV_REL, REL_X); /* time_hi */
  525. input_set_capability(gyro_input_dev, EV_REL, REL_Y); /* time_lo */
  526. input_set_capability(pressure_input_dev, EV_REL, REL_HWHEEL);
  527. input_set_capability(pressure_input_dev, EV_REL, REL_DIAL);
  528. input_set_capability(pressure_input_dev, EV_REL, REL_WHEEL);
  529. input_set_capability(gesture_input_dev, EV_ABS, ABS_RUDDER);
  530. input_set_abs_params(gesture_input_dev, ABS_RUDDER, 0, 1024, 0, 0);
  531. input_set_capability(gesture_input_dev, EV_ABS, ABS_WHEEL);
  532. input_set_abs_params(gesture_input_dev, ABS_WHEEL, 0, 1024, 0, 0);
  533. input_set_capability(gesture_input_dev, EV_ABS, ABS_GAS);
  534. input_set_abs_params(gesture_input_dev, ABS_GAS, 0, 1024, 0, 0);
  535. input_set_capability(gesture_input_dev, EV_ABS, ABS_BRAKE);
  536. input_set_abs_params(gesture_input_dev, ABS_BRAKE, 0, 1024, 0, 0);
  537. input_set_capability(gesture_input_dev, EV_ABS, ABS_THROTTLE);
  538. input_set_abs_params(gesture_input_dev, ABS_THROTTLE, 0, 1024, 0, 0);
  539. input_set_capability(gesture_input_dev, EV_ABS, ABS_X);
  540. input_set_abs_params(gesture_input_dev, ABS_X, 0, 1024, 0, 0);
  541. input_set_capability(gesture_input_dev, EV_ABS, ABS_Y);
  542. input_set_abs_params(gesture_input_dev, ABS_Y, 0, 1024, 0, 0);
  543. input_set_capability(gesture_input_dev, EV_ABS, ABS_Z);
  544. input_set_abs_params(gesture_input_dev, ABS_Z, 0, 1024, 0, 0);
  545. input_set_capability(gesture_input_dev, EV_ABS, ABS_RX);
  546. input_set_abs_params(gesture_input_dev, ABS_RX, 0, 1024, 0, 0);
  547. input_set_capability(light_input_dev, EV_REL, REL_HWHEEL);
  548. input_set_capability(light_input_dev, EV_REL, REL_DIAL);
  549. input_set_capability(light_input_dev, EV_REL, REL_WHEEL);
  550. input_set_capability(light_input_dev, EV_REL, REL_MISC);
  551. input_set_capability(prox_input_dev, EV_ABS, ABS_DISTANCE);
  552. input_set_abs_params(prox_input_dev, ABS_DISTANCE, 0, 1, 0, 0);
  553. input_set_capability(temp_humi_input_dev, EV_REL, REL_HWHEEL);
  554. input_set_capability(temp_humi_input_dev, EV_REL, REL_DIAL);
  555. input_set_capability(temp_humi_input_dev, EV_REL, REL_WHEEL);
  556. input_set_capability(mag_input_dev, EV_REL, REL_RX);
  557. input_set_capability(mag_input_dev, EV_REL, REL_RY);
  558. input_set_capability(mag_input_dev, EV_REL, REL_RZ);
  559. input_set_capability(mag_input_dev, EV_REL, REL_X); /* time_hi */
  560. input_set_capability(mag_input_dev, EV_REL, REL_Y); /* time_lo */
  561. input_set_capability(sig_motion_input_dev, EV_REL, REL_MISC);
  562. input_set_capability(step_det_input_dev, EV_REL, REL_MISC);
  563. input_set_capability(step_cnt_input_dev, EV_REL, REL_MISC);
  564. input_set_capability(meta_input_dev, EV_REL, REL_HWHEEL);
  565. input_set_capability(meta_input_dev, EV_REL, REL_DIAL);
  566. /* register input_device */
  567. iRet = input_register_device(acc_input_dev);
  568. if (iRet < 0)
  569. goto iRet_acc_input_unreg_device;
  570. iRet = input_register_device(gyro_input_dev);
  571. if (iRet < 0) {
  572. input_free_device(gyro_input_dev);
  573. input_free_device(pressure_input_dev);
  574. input_free_device(gesture_input_dev);
  575. input_free_device(light_input_dev);
  576. input_free_device(prox_input_dev);
  577. input_free_device(temp_humi_input_dev);
  578. input_free_device(mag_input_dev);
  579. input_free_device(sig_motion_input_dev);
  580. input_free_device(step_det_input_dev);
  581. input_free_device(step_cnt_input_dev);
  582. input_free_device(meta_input_dev);
  583. goto iRet_gyro_input_unreg_device;
  584. }
  585. iRet = input_register_device(pressure_input_dev);
  586. if (iRet < 0) {
  587. input_free_device(pressure_input_dev);
  588. input_free_device(gesture_input_dev);
  589. input_free_device(light_input_dev);
  590. input_free_device(prox_input_dev);
  591. input_free_device(temp_humi_input_dev);
  592. input_free_device(mag_input_dev);
  593. input_free_device(sig_motion_input_dev);
  594. input_free_device(step_det_input_dev);
  595. input_free_device(step_cnt_input_dev);
  596. input_free_device(meta_input_dev);
  597. goto iRet_pressure_input_unreg_device;
  598. }
  599. iRet = input_register_device(gesture_input_dev);
  600. if (iRet < 0) {
  601. input_free_device(gesture_input_dev);
  602. input_free_device(light_input_dev);
  603. input_free_device(prox_input_dev);
  604. input_free_device(temp_humi_input_dev);
  605. input_free_device(mag_input_dev);
  606. input_free_device(sig_motion_input_dev);
  607. input_free_device(step_det_input_dev);
  608. input_free_device(step_cnt_input_dev);
  609. input_free_device(meta_input_dev);
  610. goto iRet_gesture_input_unreg_device;
  611. }
  612. iRet = input_register_device(light_input_dev);
  613. if (iRet < 0) {
  614. input_free_device(light_input_dev);
  615. input_free_device(prox_input_dev);
  616. input_free_device(temp_humi_input_dev);
  617. input_free_device(mag_input_dev);
  618. input_free_device(sig_motion_input_dev);
  619. input_free_device(step_det_input_dev);
  620. input_free_device(step_cnt_input_dev);
  621. input_free_device(meta_input_dev);
  622. goto iRet_light_input_unreg_device;
  623. }
  624. iRet = input_register_device(prox_input_dev);
  625. if (iRet < 0) {
  626. input_free_device(prox_input_dev);
  627. input_free_device(temp_humi_input_dev);
  628. input_free_device(mag_input_dev);
  629. input_free_device(sig_motion_input_dev);
  630. input_free_device(step_det_input_dev);
  631. input_free_device(step_cnt_input_dev);
  632. input_free_device(meta_input_dev);
  633. goto iRet_proximity_input_unreg_device;
  634. }
  635. iRet = input_register_device(temp_humi_input_dev);
  636. if (iRet < 0) {
  637. input_free_device(temp_humi_input_dev);
  638. input_free_device(mag_input_dev);
  639. input_free_device(sig_motion_input_dev);
  640. input_free_device(step_det_input_dev);
  641. input_free_device(step_cnt_input_dev);
  642. input_free_device(meta_input_dev);
  643. goto iRet_tmep_humi_input_unreg_device;
  644. }
  645. iRet = input_register_device(mag_input_dev);
  646. if (iRet < 0) {
  647. input_free_device(mag_input_dev);
  648. input_free_device(sig_motion_input_dev);
  649. input_free_device(step_det_input_dev);
  650. input_free_device(step_cnt_input_dev);
  651. input_free_device(meta_input_dev);
  652. goto iRet_mag_input_unreg_device;
  653. }
  654. iRet = input_register_device(sig_motion_input_dev);
  655. if (iRet < 0) {
  656. input_free_device(sig_motion_input_dev);
  657. input_free_device(step_det_input_dev);
  658. input_free_device(step_cnt_input_dev);
  659. input_free_device(meta_input_dev);
  660. goto iRet_sig_motion_input_unreg_device;
  661. }
  662. iRet = input_register_device(step_det_input_dev);
  663. if (iRet < 0) {
  664. input_free_device(step_det_input_dev);
  665. input_free_device(step_cnt_input_dev);
  666. input_free_device(meta_input_dev);
  667. goto iRet_step_det_motion_input_unreg_device;
  668. }
  669. iRet = input_register_device(step_cnt_input_dev);
  670. if (iRet < 0) {
  671. input_free_device(step_cnt_input_dev);
  672. input_free_device(meta_input_dev);
  673. goto iRet_step_cnt_motion_input_unreg_device;
  674. }
  675. iRet = input_register_device(meta_input_dev);
  676. if (iRet < 0) {
  677. input_free_device(meta_input_dev);
  678. goto iRet_meta_input_unreg_device;
  679. }
  680. data->acc_input_dev = acc_input_dev;
  681. data->gyro_input_dev = gyro_input_dev;
  682. data->pressure_input_dev = pressure_input_dev;
  683. data->gesture_input_dev = gesture_input_dev;
  684. data->light_input_dev = light_input_dev;
  685. data->prox_input_dev = prox_input_dev;
  686. data->temp_humi_input_dev = temp_humi_input_dev;
  687. data->mag_input_dev = mag_input_dev;
  688. data->sig_motion_input_dev = sig_motion_input_dev;
  689. data->step_det_input_dev = step_det_input_dev;
  690. data->step_cnt_input_dev = step_cnt_input_dev;
  691. data->meta_input_dev = meta_input_dev;
  692. return SUCCESS;
  693. iRet_meta_input_unreg_device:
  694. input_unregister_device(step_cnt_input_dev);
  695. iRet_step_cnt_motion_input_unreg_device:
  696. input_unregister_device(step_det_input_dev);
  697. iRet_step_det_motion_input_unreg_device:
  698. input_unregister_device(sig_motion_input_dev);
  699. iRet_sig_motion_input_unreg_device:
  700. input_unregister_device(mag_input_dev);
  701. iRet_mag_input_unreg_device:
  702. input_unregister_device(temp_humi_input_dev);
  703. iRet_tmep_humi_input_unreg_device:
  704. input_unregister_device(prox_input_dev);
  705. iRet_proximity_input_unreg_device:
  706. input_unregister_device(light_input_dev);
  707. iRet_light_input_unreg_device:
  708. input_unregister_device(pressure_input_dev);
  709. iRet_pressure_input_unreg_device:
  710. input_unregister_device(gyro_input_dev);
  711. iRet_gesture_input_unreg_device:
  712. input_unregister_device(gesture_input_dev);
  713. iRet_gyro_input_unreg_device:
  714. input_unregister_device(acc_input_dev);
  715. return ERROR;
  716. iRet_acc_input_unreg_device:
  717. pr_err("[SSP]: %s - could not register input device\n", __func__);
  718. input_free_device(meta_input_dev);
  719. iRet_meta_input_free_device:
  720. input_free_device(step_cnt_input_dev);
  721. iRet_step_cnt_input_free_device:
  722. input_free_device(step_det_input_dev);
  723. iRet_step_det_input_free_device:
  724. input_free_device(sig_motion_input_dev);
  725. iRet_sig_motion_input_free_device:
  726. input_free_device(mag_input_dev);
  727. iRet_mag_input_free_device:
  728. input_free_device(temp_humi_input_dev);
  729. iRet_temp_humidity_input_free_device:
  730. input_free_device(prox_input_dev);
  731. iRet_proximity_input_free_device:
  732. input_free_device(light_input_dev);
  733. iRet_light_input_free_device:
  734. input_free_device(gesture_input_dev);
  735. iRet_gesture_input_free_device:
  736. input_free_device(pressure_input_dev);
  737. iRet_pressure_input_free_device:
  738. input_free_device(gyro_input_dev);
  739. iRet_gyro_input_free_device:
  740. input_free_device(acc_input_dev);
  741. iRet_acc_input_free_device:
  742. pr_err("[SSP]: %s - could not allocate input device\n", __func__);
  743. return ERROR;
  744. }
  745. void remove_input_dev(struct ssp_data *data)
  746. {
  747. input_unregister_device(data->acc_input_dev);
  748. input_unregister_device(data->gyro_input_dev);
  749. input_unregister_device(data->pressure_input_dev);
  750. input_unregister_device(data->gesture_input_dev);
  751. input_unregister_device(data->light_input_dev);
  752. input_unregister_device(data->prox_input_dev);
  753. input_unregister_device(data->temp_humi_input_dev);
  754. input_unregister_device(data->mag_input_dev);
  755. input_unregister_device(data->sig_motion_input_dev);
  756. input_unregister_device(data->step_det_input_dev);
  757. input_unregister_device(data->step_cnt_input_dev);
  758. input_unregister_device(data->meta_input_dev);
  759. }