ssp_input.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323
  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. #include "../../staging/iio/iio.h"
  17. #include "../../staging/iio/events.h"
  18. #include "../../staging/iio/sysfs.h"
  19. #include "../../staging/iio/buffer.h"
  20. #include "../../staging/iio/types.h"
  21. /*************************************************************************/
  22. /* SSP Kernel -> HAL input evnet function */
  23. /*************************************************************************/
  24. #define IIO_BUFFER_12_BYTES 20 /* 12 + timestamp 8*/
  25. #define IIO_BUFFER_6_BYTES 14
  26. #define IIO_BUFFER_1_BYTES 9
  27. #define IIO_BUFFER_17_BYTES 25
  28. #define IIO_BUFFER_24_BYTES 20
  29. #define IIO_BUFFER_7_BYTES 15
  30. /* data header defines */
  31. static int ssp_push_17bytes_buffer(struct iio_dev *indio_dev, u64 t, int *q)
  32. {
  33. u8 buf[IIO_BUFFER_17_BYTES];
  34. int i;
  35. for (i = 0; i < 4; i++)
  36. memcpy(buf + 4 * i, &q[i], sizeof(q[i]));
  37. buf[16] = (u8)q[4];
  38. memcpy(buf + 17, &t, sizeof(t));
  39. mutex_lock(&indio_dev->mlock);
  40. iio_push_to_buffer(indio_dev->buffer, buf, 0);
  41. mutex_unlock(&indio_dev->mlock);
  42. return 0;
  43. }
  44. static int ssp_push_12bytes_buffer(struct iio_dev *indio_dev, u64 t, int *q)
  45. {
  46. u8 buf[IIO_BUFFER_12_BYTES];
  47. int i;
  48. for (i = 0; i < 3; i++)
  49. memcpy(buf + 4 * i, &q[i], sizeof(q[i]));
  50. memcpy(buf + 12, &t, sizeof(t));
  51. mutex_lock(&indio_dev->mlock);
  52. iio_push_to_buffer(indio_dev->buffer, buf, 0);
  53. mutex_unlock(&indio_dev->mlock);
  54. return 0;
  55. }
  56. static int ssp_push_24bytes_buffer(struct iio_dev *indio_dev, u64 t, s16 *q)
  57. {
  58. u8 buf[IIO_BUFFER_24_BYTES];
  59. int i;
  60. for (i = 0; i < 6; i++)
  61. memcpy(buf + 2 * i, &q[i], sizeof(q[i]));
  62. memcpy(buf + 12, &t, sizeof(t));
  63. mutex_lock(&indio_dev->mlock);
  64. iio_push_to_buffer(indio_dev->buffer, buf, 0);
  65. mutex_unlock(&indio_dev->mlock);
  66. return 0;
  67. }
  68. static int ssp_push_6bytes_buffer(struct iio_dev *indio_dev, u64 t, s16 *d)
  69. {
  70. u8 buf[IIO_BUFFER_6_BYTES];
  71. int i;
  72. for (i = 0; i < 3; i++)
  73. memcpy(buf + i * 2, &d[i], sizeof(d[i]));
  74. memcpy(buf + 6, &t, sizeof(t));
  75. mutex_lock(&indio_dev->mlock);
  76. iio_push_to_buffer(indio_dev->buffer, buf, 0);
  77. mutex_unlock(&indio_dev->mlock);
  78. return 0;
  79. }
  80. static int ssp_push_1bytes_buffer(struct iio_dev *indio_dev, u64 t, u8 *d)
  81. {
  82. u8 buf[IIO_BUFFER_1_BYTES];
  83. memcpy(buf, d, sizeof(u8));
  84. memcpy(buf + 1, &t, sizeof(t));
  85. mutex_lock(&indio_dev->mlock);
  86. iio_push_to_buffer(indio_dev->buffer, buf, 0);
  87. mutex_unlock(&indio_dev->mlock);
  88. return 0;
  89. }
  90. static int ssp_push_7bytes_buffer(struct iio_dev *indio_dev, u64 t, s16 *d,
  91. u8 status)
  92. {
  93. u8 buf[IIO_BUFFER_7_BYTES];
  94. int i;
  95. for (i = 0; i < 3; i++)
  96. memcpy(buf + i * 2, &d[i], sizeof(d[i]));
  97. buf[6] = status;
  98. memcpy(buf + 7, &t, sizeof(t));
  99. mutex_lock(&indio_dev->mlock);
  100. iio_push_to_buffer(indio_dev->buffer, buf, 0);
  101. mutex_unlock(&indio_dev->mlock);
  102. return 0;
  103. }
  104. void report_meta_data(struct ssp_data *data, struct sensor_value *s)
  105. {
  106. pr_info("[SSP]: %s - what: %d, sensor: %d\n", __func__,
  107. s->meta_data.what, s->meta_data.sensor);
  108. if (s->meta_data.sensor == ACCELEROMETER_SENSOR) {
  109. s16 accel_buf[3];
  110. memset(accel_buf, 0xff, sizeof(s16) * 3);
  111. ssp_push_6bytes_buffer(data->accel_indio_dev, 0, accel_buf);
  112. } else if (s->meta_data.sensor == GYROSCOPE_SENSOR) {
  113. int gyro_buf[3];
  114. memset(gyro_buf, 0xff, sizeof(int) * 3);
  115. ssp_push_12bytes_buffer(data->gyro_indio_dev, 0, gyro_buf);
  116. } else if (s->meta_data.sensor == GAME_ROTATION_VECTOR) {
  117. int grot_buf[5];
  118. memset(grot_buf, 0xff, sizeof(int) * 4);
  119. ssp_push_17bytes_buffer(data->game_rot_indio_dev, 0, grot_buf);
  120. } else if (s->meta_data.sensor == STEP_DETECTOR) {
  121. u8 step_buf[1] = {0xff};
  122. ssp_push_1bytes_buffer(data->step_det_indio_dev, 0, step_buf);
  123. } else {
  124. input_report_rel(data->meta_input_dev, REL_DIAL,
  125. s->meta_data.what);
  126. input_report_rel(data->meta_input_dev, REL_HWHEEL,
  127. s->meta_data.sensor + 1);
  128. input_sync(data->meta_input_dev);
  129. }
  130. }
  131. void convert_acc_data(s16 *iValue)
  132. {
  133. if (*iValue > MAX_ACCEL_2G)
  134. *iValue = ((MAX_ACCEL_4G - *iValue)) * (-1);
  135. }
  136. void report_acc_data(struct ssp_data *data, struct sensor_value *accdata)
  137. {
  138. s16 accel_buf[3];
  139. data->buf[ACCELEROMETER_SENSOR].x = accdata->x;
  140. data->buf[ACCELEROMETER_SENSOR].y = accdata->y;
  141. data->buf[ACCELEROMETER_SENSOR].z = accdata->z;
  142. accel_buf[0] = data->buf[ACCELEROMETER_SENSOR].x;
  143. accel_buf[1] = data->buf[ACCELEROMETER_SENSOR].y;
  144. accel_buf[2] = data->buf[ACCELEROMETER_SENSOR].z;
  145. ssp_push_6bytes_buffer(data->accel_indio_dev, accdata->timestamp,
  146. accel_buf);
  147. }
  148. void report_gyro_data(struct ssp_data *data, struct sensor_value *gyrodata)
  149. {
  150. int lTemp[3] = {0,};
  151. data->buf[GYROSCOPE_SENSOR].x = gyrodata->x;
  152. data->buf[GYROSCOPE_SENSOR].y = gyrodata->y;
  153. data->buf[GYROSCOPE_SENSOR].z = gyrodata->z;
  154. if (data->uGyroDps == GYROSCOPE_DPS500) {
  155. lTemp[0] = (int)data->buf[GYROSCOPE_SENSOR].x;
  156. lTemp[1] = (int)data->buf[GYROSCOPE_SENSOR].y;
  157. lTemp[2] = (int)data->buf[GYROSCOPE_SENSOR].z;
  158. } else if (data->uGyroDps == GYROSCOPE_DPS250) {
  159. lTemp[0] = (int)data->buf[GYROSCOPE_SENSOR].x >> 1;
  160. lTemp[1] = (int)data->buf[GYROSCOPE_SENSOR].y >> 1;
  161. lTemp[2] = (int)data->buf[GYROSCOPE_SENSOR].z >> 1;
  162. } else if (data->uGyroDps == GYROSCOPE_DPS2000) {
  163. lTemp[0] = (int)data->buf[GYROSCOPE_SENSOR].x << 2;
  164. lTemp[1] = (int)data->buf[GYROSCOPE_SENSOR].y << 2;
  165. lTemp[2] = (int)data->buf[GYROSCOPE_SENSOR].z << 2;
  166. } else {
  167. lTemp[0] = (int)data->buf[GYROSCOPE_SENSOR].x;
  168. lTemp[1] = (int)data->buf[GYROSCOPE_SENSOR].y;
  169. lTemp[2] = (int)data->buf[GYROSCOPE_SENSOR].z;
  170. }
  171. ssp_push_12bytes_buffer(data->gyro_indio_dev, gyrodata->timestamp,
  172. lTemp);
  173. }
  174. void report_mag_data(struct ssp_data *data, struct sensor_value *magdata)
  175. {
  176. s16 lTemp[3] = { 0, };
  177. data->buf[GEOMAGNETIC_SENSOR].cal_x = magdata->cal_x;
  178. data->buf[GEOMAGNETIC_SENSOR].cal_y = magdata->cal_y;
  179. data->buf[GEOMAGNETIC_SENSOR].cal_z = magdata->cal_z;
  180. data->buf[GEOMAGNETIC_SENSOR].accuracy = magdata->accuracy;
  181. lTemp[0] = data->buf[GEOMAGNETIC_SENSOR].cal_x;
  182. lTemp[1] = data->buf[GEOMAGNETIC_SENSOR].cal_y;
  183. lTemp[2] = data->buf[GEOMAGNETIC_SENSOR].cal_z;
  184. ssp_push_7bytes_buffer(data->mag_indio_dev, magdata->timestamp,
  185. lTemp, data->buf[GEOMAGNETIC_SENSOR].accuracy);
  186. }
  187. void report_uncalib_mag_data(struct ssp_data *data, struct sensor_value *magdata)
  188. {
  189. s16 lTemp[6] = {0,};
  190. data->buf[GEOMAGNETIC_UNCALIB_SENSOR].uncal_x = magdata->uncal_x;
  191. data->buf[GEOMAGNETIC_UNCALIB_SENSOR].uncal_y = magdata->uncal_y;
  192. data->buf[GEOMAGNETIC_UNCALIB_SENSOR].uncal_z = magdata->uncal_z;
  193. data->buf[GEOMAGNETIC_UNCALIB_SENSOR].offset_x = magdata->offset_x;
  194. data->buf[GEOMAGNETIC_UNCALIB_SENSOR].offset_y = magdata->offset_y;
  195. data->buf[GEOMAGNETIC_UNCALIB_SENSOR].offset_z = magdata->offset_z;
  196. lTemp[0] = data->buf[GEOMAGNETIC_UNCALIB_SENSOR].uncal_x;
  197. lTemp[1] = data->buf[GEOMAGNETIC_UNCALIB_SENSOR].uncal_y;
  198. lTemp[2] = data->buf[GEOMAGNETIC_UNCALIB_SENSOR].uncal_z;
  199. lTemp[3] = data->buf[GEOMAGNETIC_UNCALIB_SENSOR].offset_x;
  200. lTemp[4] = data->buf[GEOMAGNETIC_UNCALIB_SENSOR].offset_y;
  201. lTemp[5] = data->buf[GEOMAGNETIC_UNCALIB_SENSOR].offset_z;
  202. ssp_push_24bytes_buffer(data->uncal_mag_indio_dev, magdata->timestamp, lTemp);
  203. }
  204. void report_uncalib_gyro_data(struct ssp_data *data, struct sensor_value *gyrodata)
  205. {
  206. s16 lTemp[6] = {0,};
  207. data->buf[GYRO_UNCALIB_SENSOR].uncal_x = gyrodata->uncal_x;
  208. data->buf[GYRO_UNCALIB_SENSOR].uncal_y = gyrodata->uncal_y;
  209. data->buf[GYRO_UNCALIB_SENSOR].uncal_z = gyrodata->uncal_z;
  210. data->buf[GYRO_UNCALIB_SENSOR].offset_x = gyrodata->offset_x;
  211. data->buf[GYRO_UNCALIB_SENSOR].offset_y = gyrodata->offset_y;
  212. data->buf[GYRO_UNCALIB_SENSOR].offset_z = gyrodata->offset_z;
  213. lTemp[0] = gyrodata->uncal_x;
  214. lTemp[1] = gyrodata->uncal_y;
  215. lTemp[2] = gyrodata->uncal_z;
  216. lTemp[3] = gyrodata->offset_x;
  217. lTemp[4] = gyrodata->offset_y;
  218. lTemp[5] = gyrodata->offset_z;
  219. ssp_push_24bytes_buffer(data->uncal_gyro_indio_dev, gyrodata->timestamp, lTemp);
  220. }
  221. void report_sig_motion_data(struct ssp_data *data,
  222. struct sensor_value *sig_motion_data)
  223. {
  224. data->buf[SIG_MOTION_SENSOR].sig_motion = sig_motion_data->sig_motion;
  225. input_report_rel(data->sig_motion_input_dev, REL_MISC,
  226. data->buf[SIG_MOTION_SENSOR].sig_motion);
  227. input_sync(data->sig_motion_input_dev);
  228. }
  229. void report_rot_data(struct ssp_data *data, struct sensor_value *rotdata)
  230. {
  231. int rot_buf[5];
  232. data->buf[ROTATION_VECTOR].quat_a = rotdata->quat_a;
  233. data->buf[ROTATION_VECTOR].quat_b = rotdata->quat_b;
  234. data->buf[ROTATION_VECTOR].quat_c = rotdata->quat_c;
  235. data->buf[ROTATION_VECTOR].quat_d = rotdata->quat_d;
  236. data->buf[ROTATION_VECTOR].acc_rot = rotdata->acc_rot;
  237. rot_buf[0] = rotdata->quat_a;
  238. rot_buf[1] = rotdata->quat_b;
  239. rot_buf[2] = rotdata->quat_c;
  240. rot_buf[3] = rotdata->quat_d;
  241. rot_buf[4] = rotdata->acc_rot;
  242. ssp_push_17bytes_buffer(data->rot_indio_dev, rotdata->timestamp, rot_buf);
  243. }
  244. void report_game_rot_data(struct ssp_data *data, struct sensor_value *grotdata)
  245. {
  246. int rot_buf[5];
  247. data->buf[GAME_ROTATION_VECTOR].quat_a = grotdata->quat_a;
  248. data->buf[GAME_ROTATION_VECTOR].quat_b = grotdata->quat_b;
  249. data->buf[GAME_ROTATION_VECTOR].quat_c = grotdata->quat_c;
  250. data->buf[GAME_ROTATION_VECTOR].quat_d = grotdata->quat_d;
  251. data->buf[GAME_ROTATION_VECTOR].acc_rot = grotdata->acc_rot;
  252. rot_buf[0] = grotdata->quat_a;
  253. rot_buf[1] = grotdata->quat_b;
  254. rot_buf[2] = grotdata->quat_c;
  255. rot_buf[3] = grotdata->quat_d;
  256. rot_buf[4] = grotdata->acc_rot;
  257. ssp_push_17bytes_buffer(data->game_rot_indio_dev, grotdata->timestamp,
  258. rot_buf);
  259. }
  260. void report_gesture_data(struct ssp_data *data, struct sensor_value *gesdata)
  261. {
  262. int i = 0;
  263. for (i=0; i<19; i++) {
  264. data->buf[GESTURE_SENSOR].data[i] = gesdata->data[i];
  265. }
  266. #if defined (CONFIG_SENSORS_SSP_MAX88920)
  267. input_report_abs(data->gesture_input_dev,
  268. ABS_RUDDER, data->buf[GESTURE_SENSOR].data[0]);
  269. input_report_abs(data->gesture_input_dev,
  270. ABS_WHEEL, data->buf[GESTURE_SENSOR].data[1]);
  271. input_report_abs(data->gesture_input_dev,
  272. ABS_GAS, data->buf[GESTURE_SENSOR].data[2]);
  273. input_report_abs(data->gesture_input_dev,
  274. ABS_BRAKE, data->buf[GESTURE_SENSOR].data[3]);
  275. input_report_abs(data->gesture_input_dev,
  276. ABS_THROTTLE, data->buf[GESTURE_SENSOR].data[4]);
  277. input_report_abs(data->gesture_input_dev,
  278. ABS_X, data->buf[GESTURE_SENSOR].data[5]);
  279. input_report_abs(data->gesture_input_dev,
  280. ABS_Y, data->buf[GESTURE_SENSOR].data[6]);
  281. input_report_abs(data->gesture_input_dev,
  282. ABS_Z, data->buf[GESTURE_SENSOR].data[7]);
  283. input_report_abs(data->gesture_input_dev,
  284. ABS_RX, data->buf[GESTURE_SENSOR].data[8]);
  285. #else
  286. input_report_abs(data->gesture_input_dev,
  287. ABS_X, data->buf[GESTURE_SENSOR].data[0]);
  288. input_report_abs(data->gesture_input_dev,
  289. ABS_Y, data->buf[GESTURE_SENSOR].data[1]);
  290. input_report_abs(data->gesture_input_dev,
  291. ABS_Z, data->buf[GESTURE_SENSOR].data[2]);
  292. input_report_abs(data->gesture_input_dev,
  293. ABS_RX, data->buf[GESTURE_SENSOR].data[3]);
  294. input_report_abs(data->gesture_input_dev,
  295. ABS_RY, data->buf[GESTURE_SENSOR].data[4]);
  296. input_report_abs(data->gesture_input_dev,
  297. ABS_RZ, data->buf[GESTURE_SENSOR].data[5]);
  298. input_report_abs(data->gesture_input_dev,
  299. ABS_THROTTLE, data->buf[GESTURE_SENSOR].data[6]);
  300. input_report_abs(data->gesture_input_dev,
  301. ABS_RUDDER, data->buf[GESTURE_SENSOR].data[7]);
  302. input_report_abs(data->gesture_input_dev,
  303. ABS_WHEEL, data->buf[GESTURE_SENSOR].data[8]);
  304. input_report_abs(data->gesture_input_dev,
  305. ABS_GAS, data->buf[GESTURE_SENSOR].data[9]);
  306. input_report_abs(data->gesture_input_dev,
  307. ABS_BRAKE, data->buf[GESTURE_SENSOR].data[10]);
  308. input_report_abs(data->gesture_input_dev,
  309. ABS_HAT0X, data->buf[GESTURE_SENSOR].data[11]);
  310. input_report_abs(data->gesture_input_dev,
  311. ABS_HAT0Y, data->buf[GESTURE_SENSOR].data[12]);
  312. input_report_abs(data->gesture_input_dev,
  313. ABS_HAT1X, data->buf[GESTURE_SENSOR].data[13]);
  314. input_report_abs(data->gesture_input_dev,
  315. ABS_HAT1Y, data->buf[GESTURE_SENSOR].data[14]);
  316. input_report_abs(data->gesture_input_dev,
  317. ABS_HAT2X, data->buf[GESTURE_SENSOR].data[15]);
  318. input_report_abs(data->gesture_input_dev,
  319. ABS_HAT2Y, data->buf[GESTURE_SENSOR].data[16]);
  320. input_report_abs(data->gesture_input_dev,
  321. ABS_HAT3X, data->buf[GESTURE_SENSOR].data[17]);
  322. input_report_abs(data->gesture_input_dev,
  323. ABS_HAT3Y, data->buf[GESTURE_SENSOR].data[18]);
  324. #endif
  325. input_sync(data->gesture_input_dev);
  326. }
  327. void report_pressure_data(struct ssp_data *data, struct sensor_value *predata)
  328. {
  329. data->buf[PRESSURE_SENSOR].pressure[0] =
  330. predata->pressure[0] - data->iPressureCal;
  331. data->buf[PRESSURE_SENSOR].pressure[1] = predata->pressure[1];
  332. /* pressure */
  333. input_report_rel(data->pressure_input_dev, REL_HWHEEL,
  334. data->buf[PRESSURE_SENSOR].pressure[0]);
  335. /* temperature */
  336. input_report_rel(data->pressure_input_dev, REL_WHEEL,
  337. data->buf[PRESSURE_SENSOR].pressure[1]);
  338. input_sync(data->pressure_input_dev);
  339. }
  340. void report_light_data(struct ssp_data *data, struct sensor_value *lightdata)
  341. {
  342. data->buf[LIGHT_SENSOR].r = lightdata->r;
  343. data->buf[LIGHT_SENSOR].g = lightdata->g;
  344. data->buf[LIGHT_SENSOR].b = lightdata->b;
  345. data->buf[LIGHT_SENSOR].w = lightdata->w;
  346. #if defined (CONFIG_SENSORS_SSP_MAX88921)
  347. data->buf[LIGHT_SENSOR].ir_cmp = lightdata->ir_cmp;
  348. data->buf[LIGHT_SENSOR].amb_pga = lightdata->amb_pga;
  349. #endif
  350. input_report_rel(data->light_input_dev, REL_HWHEEL,
  351. data->buf[LIGHT_SENSOR].r + 1);
  352. input_report_rel(data->light_input_dev, REL_DIAL,
  353. data->buf[LIGHT_SENSOR].g + 1);
  354. input_report_rel(data->light_input_dev, REL_WHEEL,
  355. data->buf[LIGHT_SENSOR].b + 1);
  356. input_report_rel(data->light_input_dev, REL_MISC,
  357. data->buf[LIGHT_SENSOR].w + 1);
  358. #if defined (CONFIG_SENSORS_SSP_MAX88921)
  359. input_report_rel(data->light_input_dev, REL_RY,
  360. data->buf[LIGHT_SENSOR].ir_cmp + 1);
  361. input_report_rel(data->light_input_dev, REL_RZ,
  362. data->buf[LIGHT_SENSOR].amb_pga + 1);
  363. #endif
  364. input_sync(data->light_input_dev);
  365. }
  366. void report_prox_data(struct ssp_data *data, struct sensor_value *proxdata)
  367. {
  368. ssp_dbg("[SSP] Proximity Sensor Detect : %u, raw : %u\n",
  369. proxdata->prox[0], proxdata->prox[1]);
  370. data->buf[PROXIMITY_SENSOR].prox[0] = proxdata->prox[0];
  371. data->buf[PROXIMITY_SENSOR].prox[1] = proxdata->prox[1];
  372. input_report_rel(data->prox_input_dev, REL_DIAL,
  373. (!proxdata->prox[0]) + 1);
  374. input_sync(data->prox_input_dev);
  375. wake_lock_timeout(&data->ssp_wake_lock, 3 * HZ);
  376. }
  377. void report_prox_raw_data(struct ssp_data *data,
  378. struct sensor_value *proxrawdata)
  379. {
  380. if (data->uFactoryProxAvg[0]++ >= PROX_AVG_READ_NUM) {
  381. data->uFactoryProxAvg[2] /= PROX_AVG_READ_NUM;
  382. data->buf[PROXIMITY_RAW].prox[1] = (u16)data->uFactoryProxAvg[1];
  383. data->buf[PROXIMITY_RAW].prox[2] = (u16)data->uFactoryProxAvg[2];
  384. data->buf[PROXIMITY_RAW].prox[3] = (u16)data->uFactoryProxAvg[3];
  385. data->uFactoryProxAvg[0] = 0;
  386. data->uFactoryProxAvg[1] = 0;
  387. data->uFactoryProxAvg[2] = 0;
  388. data->uFactoryProxAvg[3] = 0;
  389. } else {
  390. data->uFactoryProxAvg[2] += proxrawdata->prox[0];
  391. if (data->uFactoryProxAvg[0] == 1)
  392. data->uFactoryProxAvg[1] = proxrawdata->prox[0];
  393. else if (proxrawdata->prox[0] < data->uFactoryProxAvg[1])
  394. data->uFactoryProxAvg[1] = proxrawdata->prox[0];
  395. if (proxrawdata->prox[0] > data->uFactoryProxAvg[3])
  396. data->uFactoryProxAvg[3] = proxrawdata->prox[0];
  397. }
  398. data->buf[PROXIMITY_RAW].prox[0] = proxrawdata->prox[0];
  399. }
  400. void report_geomagnetic_raw_data(struct ssp_data *data,
  401. struct sensor_value *magrawdata)
  402. {
  403. data->buf[GEOMAGNETIC_RAW].x = magrawdata->x;
  404. data->buf[GEOMAGNETIC_RAW].y = magrawdata->y;
  405. data->buf[GEOMAGNETIC_RAW].z = magrawdata->z;
  406. }
  407. void report_step_det_data(struct ssp_data *data,
  408. struct sensor_value *sig_motion_data)
  409. {
  410. data->buf[STEP_DETECTOR].step_det = sig_motion_data->step_det;
  411. ssp_push_1bytes_buffer(data->step_det_indio_dev, sig_motion_data->timestamp,
  412. &sig_motion_data->step_det);
  413. }
  414. void report_step_cnt_data(struct ssp_data *data,
  415. struct sensor_value *sig_motion_data)
  416. {
  417. data->buf[STEP_COUNTER].step_diff = sig_motion_data->step_diff;
  418. data->step_count_total += data->buf[STEP_COUNTER].step_diff;
  419. input_report_rel(data->step_cnt_input_dev, REL_MISC,
  420. data->step_count_total + 1);
  421. input_sync(data->step_cnt_input_dev);
  422. }
  423. void report_temp_humidity_data(struct ssp_data *data,
  424. struct sensor_value *temp_humi_data)
  425. {
  426. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[0] =
  427. temp_humi_data->data[0];
  428. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[1] =
  429. temp_humi_data->data[1];
  430. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[2] =
  431. temp_humi_data->data[2];
  432. /* Temperature */
  433. input_report_rel(data->temp_humi_input_dev, REL_HWHEEL,
  434. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[0]);
  435. /* Humidity */
  436. input_report_rel(data->temp_humi_input_dev, REL_DIAL,
  437. data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[1]);
  438. input_sync(data->temp_humi_input_dev);
  439. if (data->buf[TEMPERATURE_HUMIDITY_SENSOR].data[2])
  440. wake_lock_timeout(&data->ssp_wake_lock, 2 * HZ);
  441. }
  442. void report_bulk_comp_data(struct ssp_data *data)
  443. {
  444. input_report_rel(data->temp_humi_input_dev, REL_WHEEL,
  445. data->bulk_buffer->len);
  446. input_sync(data->temp_humi_input_dev);
  447. }
  448. int initialize_event_symlink(struct ssp_data *data)
  449. {
  450. int iRet = 0;
  451. data->sen_dev = device_create(sensors_event_class, NULL, 0, NULL,
  452. "%s", "symlink");
  453. iRet = sysfs_create_link(&data->sen_dev->kobj,
  454. &data->pressure_input_dev->dev.kobj,
  455. data->pressure_input_dev->name);
  456. if (iRet < 0)
  457. goto iRet_prs_sysfs_create_link;
  458. iRet = sysfs_create_link(&data->sen_dev->kobj,
  459. &data->gesture_input_dev->dev.kobj,
  460. data->gesture_input_dev->name);
  461. if (iRet < 0)
  462. goto iRet_gesture_sysfs_create_link;
  463. iRet = sysfs_create_link(&data->sen_dev->kobj,
  464. &data->light_input_dev->dev.kobj,
  465. data->light_input_dev->name);
  466. if (iRet < 0)
  467. goto iRet_light_sysfs_create_link;
  468. iRet = sysfs_create_link(&data->sen_dev->kobj,
  469. &data->prox_input_dev->dev.kobj,
  470. data->prox_input_dev->name);
  471. if (iRet < 0)
  472. goto iRet_prox_sysfs_create_link;
  473. iRet = sysfs_create_link(&data->sen_dev->kobj,
  474. &data->temp_humi_input_dev->dev.kobj,
  475. data->temp_humi_input_dev->name);
  476. if (iRet < 0)
  477. goto iRet_temp_humi_sysfs_create_link;
  478. iRet = sysfs_create_link(&data->sen_dev->kobj,
  479. &data->sig_motion_input_dev->dev.kobj,
  480. data->sig_motion_input_dev->name);
  481. if (iRet < 0)
  482. goto iRet_sig_motion_sysfs_create_link;
  483. iRet = sysfs_create_link(&data->sen_dev->kobj,
  484. &data->step_cnt_input_dev->dev.kobj,
  485. data->step_cnt_input_dev->name);
  486. if (iRet < 0)
  487. goto iRet_step_cnt_sysfs_create_link;
  488. iRet = sysfs_create_link(&data->sen_dev->kobj,
  489. &data->meta_input_dev->dev.kobj,
  490. data->meta_input_dev->name);
  491. if (iRet < 0)
  492. goto iRet_meta_sysfs_create_link;
  493. return SUCCESS;
  494. iRet_meta_sysfs_create_link:
  495. sysfs_delete_link(&data->sen_dev->kobj,
  496. &data->step_cnt_input_dev->dev.kobj,
  497. data->step_cnt_input_dev->name);
  498. iRet_step_cnt_sysfs_create_link:
  499. sysfs_delete_link(&data->sen_dev->kobj,
  500. &data->sig_motion_input_dev->dev.kobj,
  501. data->sig_motion_input_dev->name);
  502. iRet_sig_motion_sysfs_create_link:
  503. sysfs_delete_link(&data->sen_dev->kobj,
  504. &data->temp_humi_input_dev->dev.kobj,
  505. data->temp_humi_input_dev->name);
  506. iRet_temp_humi_sysfs_create_link:
  507. sysfs_delete_link(&data->sen_dev->kobj,
  508. &data->prox_input_dev->dev.kobj,
  509. data->prox_input_dev->name);
  510. iRet_prox_sysfs_create_link:
  511. sysfs_delete_link(&data->sen_dev->kobj,
  512. &data->light_input_dev->dev.kobj,
  513. data->light_input_dev->name);
  514. iRet_light_sysfs_create_link:
  515. sysfs_delete_link(&data->sen_dev->kobj,
  516. &data->pressure_input_dev->dev.kobj,
  517. data->pressure_input_dev->name);
  518. iRet_gesture_sysfs_create_link:
  519. sysfs_delete_link(&data->sen_dev->kobj,
  520. &data->gesture_input_dev->dev.kobj,
  521. data->gesture_input_dev->name);
  522. iRet_prs_sysfs_create_link:
  523. pr_err("[SSP]: %s - could not create event symlink\n", __func__);
  524. return FAIL;
  525. }
  526. void remove_event_symlink(struct ssp_data *data)
  527. {
  528. sysfs_delete_link(&data->sen_dev->kobj,
  529. &data->pressure_input_dev->dev.kobj,
  530. data->pressure_input_dev->name);
  531. sysfs_delete_link(&data->sen_dev->kobj,
  532. &data->gesture_input_dev->dev.kobj,
  533. data->gesture_input_dev->name);
  534. sysfs_delete_link(&data->sen_dev->kobj,
  535. &data->light_input_dev->dev.kobj,
  536. data->light_input_dev->name);
  537. sysfs_delete_link(&data->sen_dev->kobj,
  538. &data->prox_input_dev->dev.kobj,
  539. data->prox_input_dev->name);
  540. sysfs_delete_link(&data->sen_dev->kobj,
  541. &data->temp_humi_input_dev->dev.kobj,
  542. data->temp_humi_input_dev->name);
  543. sysfs_delete_link(&data->sen_dev->kobj,
  544. &data->sig_motion_input_dev->dev.kobj,
  545. data->sig_motion_input_dev->name);
  546. sysfs_delete_link(&data->sen_dev->kobj,
  547. &data->step_cnt_input_dev->dev.kobj,
  548. data->step_cnt_input_dev->name);
  549. sysfs_delete_link(&data->sen_dev->kobj,
  550. &data->meta_input_dev->dev.kobj,
  551. data->meta_input_dev->name);
  552. }
  553. static const struct iio_info accel_info = {
  554. .driver_module = THIS_MODULE,
  555. };
  556. static const struct iio_chan_spec accel_channels[] = {
  557. {
  558. .type = IIO_TIMESTAMP,
  559. .channel = -1,
  560. .scan_index = 3,
  561. .scan_type = IIO_ST('s', IIO_BUFFER_6_BYTES * 8,
  562. IIO_BUFFER_6_BYTES * 8, 0)
  563. }
  564. };
  565. static const struct iio_info gyro_info = {
  566. .driver_module = THIS_MODULE,
  567. };
  568. static const struct iio_info mag_info = {
  569. .driver_module = THIS_MODULE,
  570. };
  571. static const struct iio_chan_spec mag_channels[] = {
  572. {
  573. .type = IIO_TIMESTAMP,
  574. .channel = -1,
  575. .scan_index = 3,
  576. .scan_type = IIO_ST('s', IIO_BUFFER_7_BYTES * 8,
  577. IIO_BUFFER_7_BYTES * 8, 0)
  578. }
  579. };
  580. static const struct iio_info uncal_mag_info = {
  581. .driver_module = THIS_MODULE,
  582. };
  583. static const struct iio_chan_spec uncal_mag_channels[] = {
  584. {
  585. .type = IIO_TIMESTAMP,
  586. .channel = -1,
  587. .scan_index = 3,
  588. .scan_type = IIO_ST('s', IIO_BUFFER_12_BYTES * 8,
  589. IIO_BUFFER_12_BYTES * 8, 0)
  590. }
  591. };
  592. static const struct iio_chan_spec gyro_channels[] = {
  593. {
  594. .type = IIO_TIMESTAMP,
  595. .channel = -1,
  596. .scan_index = 3,
  597. .scan_type = IIO_ST('s', IIO_BUFFER_12_BYTES * 8,
  598. IIO_BUFFER_12_BYTES * 8, 0)
  599. }
  600. };
  601. static const struct iio_info uncal_gyro_info = {
  602. .driver_module = THIS_MODULE,
  603. };
  604. static const struct iio_chan_spec uncal_gyro_channels[] = {
  605. {
  606. .type = IIO_TIMESTAMP,
  607. .channel = -1,
  608. .scan_index = 3,
  609. .scan_type = IIO_ST('s', IIO_BUFFER_12_BYTES * 8,
  610. IIO_BUFFER_12_BYTES * 8, 0)
  611. }
  612. };
  613. static const struct iio_info game_rot_info = {
  614. .driver_module = THIS_MODULE,
  615. };
  616. static const struct iio_chan_spec game_rot_channels[] = {
  617. {
  618. .type = IIO_TIMESTAMP,
  619. .channel = -1,
  620. .scan_index = 3,
  621. .scan_type = IIO_ST('s', IIO_BUFFER_17_BYTES * 8,
  622. IIO_BUFFER_17_BYTES * 8, 0)
  623. }
  624. };
  625. static const struct iio_info rot_info = {
  626. .driver_module = THIS_MODULE,
  627. };
  628. static const struct iio_chan_spec rot_channels[] = {
  629. {
  630. .type = IIO_TIMESTAMP,
  631. .channel = -1,
  632. .scan_index = 3,
  633. .scan_type = IIO_ST('s', IIO_BUFFER_17_BYTES * 8,
  634. IIO_BUFFER_17_BYTES * 8, 0)
  635. }
  636. };
  637. static const struct iio_info step_det_info = {
  638. .driver_module = THIS_MODULE,
  639. };
  640. static const struct iio_chan_spec step_det_channels[] = {
  641. {
  642. .type = IIO_TIMESTAMP,
  643. .channel = -1,
  644. .scan_index = 3,
  645. .scan_type = IIO_ST('s', IIO_BUFFER_1_BYTES * 8,
  646. IIO_BUFFER_1_BYTES * 8, 0)
  647. }
  648. };
  649. int initialize_input_dev(struct ssp_data *data)
  650. {
  651. int iRet = 0;
  652. struct input_dev *pressure_input_dev,
  653. *light_input_dev, *prox_input_dev, *temp_humi_input_dev,
  654. *gesture_input_dev, *sig_motion_input_dev, *step_cnt_input_dev,
  655. *meta_input_dev;
  656. /* accel */
  657. data->accel_indio_dev = iio_allocate_device(0);
  658. if (!data->accel_indio_dev) {
  659. pr_err("[SSP]: %s failed to allocate memory for iio accel device\n", __func__);
  660. return -ENOMEM;
  661. }
  662. data->accel_indio_dev->name = "accelerometer_sensor";
  663. data->accel_indio_dev->dev.parent = &data->spi->dev;
  664. data->accel_indio_dev->info = &accel_info;
  665. data->accel_indio_dev->channels = accel_channels;
  666. data->accel_indio_dev->num_channels = ARRAY_SIZE(accel_channels);
  667. data->accel_indio_dev->modes = INDIO_DIRECT_MODE;
  668. data->accel_indio_dev->currentmode = INDIO_DIRECT_MODE;
  669. iRet = ssp_iio_configure_ring(data->accel_indio_dev);
  670. if (iRet) {
  671. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  672. goto out_free_accel;
  673. }
  674. iRet = iio_buffer_register(data->accel_indio_dev, data->accel_indio_dev->channels,
  675. data->accel_indio_dev->num_channels);
  676. if (iRet)
  677. goto out_unreg_ring_accel;
  678. iRet = iio_device_register(data->accel_indio_dev);
  679. if (iRet)
  680. goto out_remove_trigger_accel;
  681. /* mag */
  682. data->mag_indio_dev = iio_allocate_device(0);
  683. if (!data->mag_indio_dev) {
  684. pr_err("[SSP]: %s failed to allocate memory for iio mag device\n", __func__);
  685. goto out_alloc_fail_mag;
  686. }
  687. data->mag_indio_dev->name = "geomagnetic_sensor";
  688. data->mag_indio_dev->dev.parent = &data->spi->dev;
  689. data->mag_indio_dev->info = &mag_info;
  690. data->mag_indio_dev->channels = mag_channels;
  691. data->mag_indio_dev->num_channels = ARRAY_SIZE(mag_channels);
  692. data->mag_indio_dev->modes = INDIO_DIRECT_MODE;
  693. data->mag_indio_dev->currentmode = INDIO_DIRECT_MODE;
  694. iRet = ssp_iio_configure_ring(data->mag_indio_dev);
  695. if (iRet) {
  696. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  697. goto out_free_mag;
  698. }
  699. iRet = iio_buffer_register(data->mag_indio_dev,
  700. data->mag_indio_dev->channels, data->mag_indio_dev->num_channels);
  701. if (iRet)
  702. goto out_unreg_ring_mag;
  703. iRet = iio_device_register(data->mag_indio_dev);
  704. if (iRet)
  705. goto out_remove_trigger_mag;
  706. /* uncal mag */
  707. data->uncal_mag_indio_dev = iio_allocate_device(0);
  708. if (!data->uncal_mag_indio_dev) {
  709. pr_err("[SSP]: %s failed to allocate memory for iio uncal mag device\n", __func__);
  710. goto out_alloc_fail_uncal_mag;
  711. }
  712. data->uncal_mag_indio_dev->name = "uncal_geomagnetic_sensor";
  713. data->uncal_mag_indio_dev->dev.parent = &data->spi->dev;
  714. data->uncal_mag_indio_dev->info = &uncal_mag_info;
  715. data->uncal_mag_indio_dev->channels = uncal_mag_channels;
  716. data->uncal_mag_indio_dev->num_channels = ARRAY_SIZE(uncal_mag_channels);
  717. data->uncal_mag_indio_dev->modes = INDIO_DIRECT_MODE;
  718. data->uncal_mag_indio_dev->currentmode = INDIO_DIRECT_MODE;
  719. iRet = ssp_iio_configure_ring(data->uncal_mag_indio_dev);
  720. if (iRet) {
  721. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  722. goto out_free_uncal_mag;
  723. }
  724. iRet = iio_buffer_register(data->uncal_mag_indio_dev,
  725. data->uncal_mag_indio_dev->channels, data->uncal_mag_indio_dev->num_channels);
  726. if (iRet)
  727. goto out_unreg_ring_uncal_mag;
  728. iRet = iio_device_register(data->uncal_mag_indio_dev);
  729. if (iRet)
  730. goto out_remove_trigger_uncal_mag;
  731. /* gyro */
  732. data->gyro_indio_dev = iio_allocate_device(0);
  733. if (!data->gyro_indio_dev) {
  734. pr_err("[SSP]: %s failed to allocate memory for iio gyro device\n", __func__);
  735. goto out_alloc_fail_gyro;
  736. }
  737. data->gyro_indio_dev->name = "gyro_sensor";
  738. data->gyro_indio_dev->dev.parent = &data->spi->dev;
  739. data->gyro_indio_dev->info = &gyro_info;
  740. data->gyro_indio_dev->channels = gyro_channels;
  741. data->gyro_indio_dev->num_channels = ARRAY_SIZE(gyro_channels);
  742. data->gyro_indio_dev->modes = INDIO_DIRECT_MODE;
  743. data->gyro_indio_dev->currentmode = INDIO_DIRECT_MODE;
  744. iRet = ssp_iio_configure_ring(data->gyro_indio_dev);
  745. if (iRet) {
  746. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  747. goto out_free_gyro;
  748. }
  749. iRet = iio_buffer_register(data->gyro_indio_dev, data->gyro_indio_dev->channels,
  750. data->gyro_indio_dev->num_channels);
  751. if (iRet)
  752. goto out_unreg_ring_gyro;
  753. iRet = iio_device_register(data->gyro_indio_dev);
  754. if (iRet)
  755. goto out_remove_trigger_gyro;
  756. data->uncal_gyro_indio_dev = iio_allocate_device(0);
  757. if (!data->uncal_gyro_indio_dev) {
  758. pr_err("[SSP]: %s failed to allocate memory for iio gyro device\n", __func__);
  759. goto out_alloc_fail_uncal_gyro;
  760. }
  761. data->uncal_gyro_indio_dev->name = "uncalibrated_gyro_sensor";
  762. data->uncal_gyro_indio_dev->dev.parent = &data->spi->dev;
  763. data->uncal_gyro_indio_dev->info = &uncal_gyro_info;
  764. data->uncal_gyro_indio_dev->channels = uncal_gyro_channels;
  765. data->uncal_gyro_indio_dev->num_channels = ARRAY_SIZE(uncal_gyro_channels);
  766. data->uncal_gyro_indio_dev->modes = INDIO_DIRECT_MODE;
  767. data->uncal_gyro_indio_dev->currentmode = INDIO_DIRECT_MODE;
  768. iRet = ssp_iio_configure_ring(data->uncal_gyro_indio_dev);
  769. if (iRet) {
  770. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  771. goto out_free_uncal_gyro;
  772. }
  773. iRet = iio_buffer_register(data->uncal_gyro_indio_dev, data->uncal_gyro_indio_dev->channels,
  774. data->uncal_gyro_indio_dev->num_channels);
  775. if (iRet)
  776. goto out_unreg_ring_uncal_gyro;
  777. iRet = iio_device_register(data->uncal_gyro_indio_dev);
  778. if (iRet)
  779. goto out_remove_trigger_uncal_gyro;
  780. data->game_rot_indio_dev = iio_allocate_device(0);
  781. if (!data->game_rot_indio_dev) {
  782. pr_err("[SSP]: %s failed to allocate memory for iio gyro device\n", __func__);
  783. goto out_alloc_fail_game_rot;
  784. }
  785. data->game_rot_indio_dev->name = "game_rotation_vector_sensor";
  786. data->game_rot_indio_dev->dev.parent = &data->spi->dev;
  787. data->game_rot_indio_dev->info = &game_rot_info;
  788. data->game_rot_indio_dev->channels = game_rot_channels;
  789. data->game_rot_indio_dev->num_channels = ARRAY_SIZE(game_rot_channels);
  790. data->game_rot_indio_dev->modes = INDIO_DIRECT_MODE;
  791. data->game_rot_indio_dev->currentmode = INDIO_DIRECT_MODE;
  792. iRet = ssp_iio_configure_ring(data->game_rot_indio_dev);
  793. if (iRet) {
  794. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  795. goto out_free_game_rot;
  796. }
  797. iRet = iio_buffer_register(data->game_rot_indio_dev, data->game_rot_indio_dev->channels,
  798. data->game_rot_indio_dev->num_channels);
  799. if (iRet)
  800. goto out_unreg_ring_game_rot;
  801. iRet = iio_device_register(data->game_rot_indio_dev);
  802. if (iRet)
  803. goto out_remove_trigger_game_rot;
  804. data->rot_indio_dev = iio_allocate_device(0);
  805. if (!data->rot_indio_dev) {
  806. pr_err("[SSP]: %s failed to allocate memory for iio gyro device\n", __func__);
  807. goto out_alloc_fail_rot;
  808. }
  809. data->rot_indio_dev->name = "rotation_vector_sensor";
  810. data->rot_indio_dev->dev.parent = &data->spi->dev;
  811. data->rot_indio_dev->info = &rot_info;
  812. data->rot_indio_dev->channels = rot_channels;
  813. data->rot_indio_dev->num_channels = ARRAY_SIZE(rot_channels);
  814. data->rot_indio_dev->modes = INDIO_DIRECT_MODE;
  815. data->rot_indio_dev->currentmode = INDIO_DIRECT_MODE;
  816. iRet = ssp_iio_configure_ring(data->rot_indio_dev);
  817. if (iRet) {
  818. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  819. goto out_free_rot;
  820. }
  821. iRet = iio_buffer_register(data->rot_indio_dev, data->rot_indio_dev->channels,
  822. data->rot_indio_dev->num_channels);
  823. if (iRet)
  824. goto out_unreg_ring_rot;
  825. iRet = iio_device_register(data->rot_indio_dev);
  826. if (iRet)
  827. goto out_remove_trigger_rot;
  828. data->step_det_indio_dev = iio_allocate_device(0);
  829. if (!data->step_det_indio_dev) {
  830. pr_err("[SSP]: %s failed to allocate memory for iio gyro device\n", __func__);
  831. goto out_alloc_fail_step_det;
  832. }
  833. data->step_det_indio_dev->name = "step_det_sensor";
  834. data->step_det_indio_dev->dev.parent = &data->spi->dev;
  835. data->step_det_indio_dev->info = &step_det_info;
  836. data->step_det_indio_dev->channels = step_det_channels;
  837. data->step_det_indio_dev->num_channels = ARRAY_SIZE(step_det_channels);
  838. data->step_det_indio_dev->modes = INDIO_DIRECT_MODE;
  839. data->step_det_indio_dev->currentmode = INDIO_DIRECT_MODE;
  840. iRet = ssp_iio_configure_ring(data->step_det_indio_dev);
  841. if (iRet) {
  842. pr_err("[SSP]: %s configure ring buffer fail\n", __func__);
  843. goto out_free_step_det;
  844. }
  845. iRet = iio_buffer_register(data->step_det_indio_dev, data->step_det_indio_dev->channels,
  846. data->step_det_indio_dev->num_channels);
  847. if (iRet)
  848. goto out_unreg_ring_step_det;
  849. iRet = iio_device_register(data->step_det_indio_dev);
  850. if (iRet)
  851. goto out_remove_trigger_step_det;
  852. /* allocate input_device */
  853. pressure_input_dev = input_allocate_device();
  854. if (pressure_input_dev == NULL)
  855. goto iRet_pressure_input_free_device;
  856. gesture_input_dev = input_allocate_device();
  857. if (gesture_input_dev == NULL)
  858. goto iRet_gesture_input_free_device;
  859. light_input_dev = input_allocate_device();
  860. if (light_input_dev == NULL)
  861. goto iRet_light_input_free_device;
  862. prox_input_dev = input_allocate_device();
  863. if (prox_input_dev == NULL)
  864. goto iRet_proximity_input_free_device;
  865. temp_humi_input_dev = input_allocate_device();
  866. if (temp_humi_input_dev == NULL)
  867. goto iRet_temp_humidity_input_free_device;
  868. sig_motion_input_dev = input_allocate_device();
  869. if (sig_motion_input_dev == NULL)
  870. goto iRet_sig_motion_input_free_device;
  871. step_cnt_input_dev = input_allocate_device();
  872. if (step_cnt_input_dev == NULL)
  873. goto iRet_step_cnt_input_free_device;
  874. meta_input_dev = input_allocate_device();
  875. if (meta_input_dev == NULL)
  876. goto iRet_meta_input_free_device;
  877. input_set_drvdata(pressure_input_dev, data);
  878. input_set_drvdata(gesture_input_dev, data);
  879. input_set_drvdata(light_input_dev, data);
  880. input_set_drvdata(prox_input_dev, data);
  881. input_set_drvdata(temp_humi_input_dev, data);
  882. input_set_drvdata(sig_motion_input_dev, data);
  883. input_set_drvdata(step_cnt_input_dev, data);
  884. input_set_drvdata(meta_input_dev, data);
  885. pressure_input_dev->name = "pressure_sensor";
  886. gesture_input_dev->name = "gesture_sensor";
  887. light_input_dev->name = "light_sensor";
  888. prox_input_dev->name = "proximity_sensor";
  889. temp_humi_input_dev->name = "temp_humidity_sensor";
  890. sig_motion_input_dev->name = "sig_motion_sensor";
  891. step_cnt_input_dev->name = "step_cnt_sensor";
  892. meta_input_dev->name = "meta_event";
  893. input_set_capability(pressure_input_dev, EV_REL, REL_HWHEEL);
  894. input_set_capability(pressure_input_dev, EV_REL, REL_DIAL);
  895. input_set_capability(pressure_input_dev, EV_REL, REL_WHEEL);
  896. #if defined (CONFIG_SENSORS_SSP_MAX88920)
  897. input_set_capability(gesture_input_dev, EV_ABS, ABS_RUDDER);
  898. input_set_abs_params(gesture_input_dev, ABS_RUDDER, 0, 1024, 0, 0);
  899. input_set_capability(gesture_input_dev, EV_ABS, ABS_WHEEL);
  900. input_set_abs_params(gesture_input_dev, ABS_WHEEL, 0, 1024, 0, 0);
  901. input_set_capability(gesture_input_dev, EV_ABS, ABS_GAS);
  902. input_set_abs_params(gesture_input_dev, ABS_GAS, 0, 1024, 0, 0);
  903. input_set_capability(gesture_input_dev, EV_ABS, ABS_BRAKE);
  904. input_set_abs_params(gesture_input_dev, ABS_BRAKE, 0, 1024, 0, 0);
  905. input_set_capability(gesture_input_dev, EV_ABS, ABS_THROTTLE);
  906. input_set_abs_params(gesture_input_dev, ABS_THROTTLE, 0, 1024, 0, 0);
  907. input_set_capability(gesture_input_dev, EV_ABS, ABS_X);
  908. input_set_abs_params(gesture_input_dev, ABS_X, 0, 1024, 0, 0);
  909. input_set_capability(gesture_input_dev, EV_ABS, ABS_Y);
  910. input_set_abs_params(gesture_input_dev, ABS_Y, 0, 1024, 0, 0);
  911. input_set_capability(gesture_input_dev, EV_ABS, ABS_Z);
  912. input_set_abs_params(gesture_input_dev, ABS_Z, 0, 1024, 0, 0);
  913. input_set_capability(gesture_input_dev, EV_ABS, ABS_RX);
  914. input_set_abs_params(gesture_input_dev, ABS_RX, 0, 1024, 0, 0);
  915. #else
  916. input_set_capability(gesture_input_dev, EV_ABS, ABS_X);
  917. input_set_abs_params(gesture_input_dev, ABS_X, 0, 1024, 0, 0);
  918. input_set_capability(gesture_input_dev, EV_ABS, ABS_Y);
  919. input_set_abs_params(gesture_input_dev, ABS_Y, 0, 1024, 0, 0);
  920. input_set_capability(gesture_input_dev, EV_ABS, ABS_Z);
  921. input_set_abs_params(gesture_input_dev, ABS_Z, 0, 1024, 0, 0);
  922. input_set_capability(gesture_input_dev, EV_ABS, ABS_RX);
  923. input_set_abs_params(gesture_input_dev, ABS_RX, 0, 1024, 0, 0);
  924. input_set_capability(gesture_input_dev, EV_ABS, ABS_RY);
  925. input_set_abs_params(gesture_input_dev, ABS_RY, 0, 1024, 0, 0);
  926. input_set_capability(gesture_input_dev, EV_ABS, ABS_RZ);
  927. input_set_abs_params(gesture_input_dev, ABS_RZ, 0, 1024, 0, 0);
  928. input_set_capability(gesture_input_dev, EV_ABS, ABS_THROTTLE);
  929. input_set_abs_params(gesture_input_dev, ABS_THROTTLE, 0, 1024, 0, 0);
  930. input_set_capability(gesture_input_dev, EV_ABS, ABS_RUDDER);
  931. input_set_abs_params(gesture_input_dev, ABS_RUDDER, 0, 1024, 0, 0);
  932. input_set_capability(gesture_input_dev, EV_ABS, ABS_WHEEL);
  933. input_set_abs_params(gesture_input_dev, ABS_WHEEL, 0, 1024, 0, 0);
  934. input_set_capability(gesture_input_dev, EV_ABS, ABS_GAS);
  935. input_set_abs_params(gesture_input_dev, ABS_GAS, 0, 1024, 0, 0);
  936. input_set_capability(gesture_input_dev, EV_ABS, ABS_BRAKE);
  937. input_set_abs_params(gesture_input_dev, ABS_BRAKE, 0, 1024, 0, 0);
  938. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT0X);
  939. input_set_abs_params(gesture_input_dev, ABS_HAT0X, 0, 1024, 0, 0);
  940. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT0Y);
  941. input_set_abs_params(gesture_input_dev, ABS_HAT0Y, 0, 1024, 0, 0);
  942. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT1X);
  943. input_set_abs_params(gesture_input_dev, ABS_HAT1X, 0, 1024, 0, 0);
  944. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT1Y);
  945. input_set_abs_params(gesture_input_dev, ABS_HAT1Y, 0, 1024, 0, 0);
  946. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT2X);
  947. input_set_abs_params(gesture_input_dev, ABS_HAT2X, 0, 1024, 0, 0);
  948. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT2Y);
  949. input_set_abs_params(gesture_input_dev, ABS_HAT2Y, 0, 1024, 0, 0);
  950. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT3X);
  951. input_set_abs_params(gesture_input_dev, ABS_HAT3X, 0, 1024, 0, 0);
  952. input_set_capability(gesture_input_dev, EV_ABS, ABS_HAT3Y);
  953. input_set_abs_params(gesture_input_dev, ABS_HAT3Y, 0, 1024, 0, 0);
  954. #endif
  955. input_set_capability(light_input_dev, EV_REL, REL_HWHEEL);
  956. input_set_capability(light_input_dev, EV_REL, REL_DIAL);
  957. input_set_capability(light_input_dev, EV_REL, REL_WHEEL);
  958. input_set_capability(light_input_dev, EV_REL, REL_MISC);
  959. #if defined (CONFIG_SENSORS_SSP_MAX88921)
  960. input_set_capability(light_input_dev, EV_REL, REL_RY);
  961. input_set_capability(light_input_dev, EV_REL, REL_RZ);
  962. #endif
  963. input_set_capability(prox_input_dev, EV_REL, REL_DIAL);
  964. input_set_capability(temp_humi_input_dev, EV_REL, REL_HWHEEL);
  965. input_set_capability(temp_humi_input_dev, EV_REL, REL_DIAL);
  966. input_set_capability(temp_humi_input_dev, EV_REL, REL_WHEEL);
  967. input_set_capability(sig_motion_input_dev, EV_REL, REL_MISC);
  968. input_set_capability(step_cnt_input_dev, EV_REL, REL_MISC);
  969. input_set_capability(meta_input_dev, EV_REL, REL_HWHEEL);
  970. input_set_capability(meta_input_dev, EV_REL, REL_DIAL);
  971. /* register input_device */
  972. iRet = input_register_device(pressure_input_dev);
  973. if (iRet < 0)
  974. goto iRet_pressure_input_unreg_device;
  975. iRet = input_register_device(gesture_input_dev);
  976. if (iRet < 0) {
  977. input_free_device(gesture_input_dev);
  978. input_free_device(light_input_dev);
  979. input_free_device(prox_input_dev);
  980. input_free_device(temp_humi_input_dev);
  981. input_free_device(sig_motion_input_dev);
  982. input_free_device(step_cnt_input_dev);
  983. input_free_device(meta_input_dev);
  984. goto iRet_gesture_input_unreg_device;
  985. }
  986. iRet = input_register_device(light_input_dev);
  987. if (iRet < 0) {
  988. input_free_device(light_input_dev);
  989. input_free_device(prox_input_dev);
  990. input_free_device(temp_humi_input_dev);
  991. input_free_device(sig_motion_input_dev);
  992. input_free_device(step_cnt_input_dev);
  993. input_free_device(meta_input_dev);
  994. goto iRet_light_input_unreg_device;
  995. }
  996. iRet = input_register_device(prox_input_dev);
  997. if (iRet < 0) {
  998. input_free_device(prox_input_dev);
  999. input_free_device(temp_humi_input_dev);
  1000. input_free_device(sig_motion_input_dev);
  1001. input_free_device(step_cnt_input_dev);
  1002. input_free_device(meta_input_dev);
  1003. goto iRet_proximity_input_unreg_device;
  1004. }
  1005. iRet = input_register_device(temp_humi_input_dev);
  1006. if (iRet < 0) {
  1007. input_free_device(temp_humi_input_dev);
  1008. input_free_device(sig_motion_input_dev);
  1009. input_free_device(step_cnt_input_dev);
  1010. input_free_device(meta_input_dev);
  1011. goto iRet_tmep_humi_input_unreg_device;
  1012. }
  1013. iRet = input_register_device(sig_motion_input_dev);
  1014. if (iRet < 0) {
  1015. input_free_device(sig_motion_input_dev);
  1016. input_free_device(step_cnt_input_dev);
  1017. input_free_device(meta_input_dev);
  1018. goto iRet_sig_motion_input_unreg_device;
  1019. }
  1020. iRet = input_register_device(step_cnt_input_dev);
  1021. if (iRet < 0) {
  1022. input_free_device(step_cnt_input_dev);
  1023. input_free_device(meta_input_dev);
  1024. goto iRet_step_cnt_input_unreg_device;
  1025. }
  1026. iRet = input_register_device(meta_input_dev);
  1027. if (iRet < 0) {
  1028. input_free_device(meta_input_dev);
  1029. goto iRet_meta_input_unreg_device;
  1030. }
  1031. data->pressure_input_dev = pressure_input_dev;
  1032. data->gesture_input_dev = gesture_input_dev;
  1033. data->light_input_dev = light_input_dev;
  1034. data->prox_input_dev = prox_input_dev;
  1035. data->temp_humi_input_dev = temp_humi_input_dev;
  1036. data->sig_motion_input_dev = sig_motion_input_dev;
  1037. data->step_cnt_input_dev = step_cnt_input_dev;
  1038. data->meta_input_dev = meta_input_dev;
  1039. return SUCCESS;
  1040. iRet_meta_input_unreg_device:
  1041. input_unregister_device(step_cnt_input_dev);
  1042. iRet_step_cnt_input_unreg_device:
  1043. input_unregister_device(sig_motion_input_dev);
  1044. iRet_sig_motion_input_unreg_device:
  1045. input_unregister_device(temp_humi_input_dev);
  1046. iRet_tmep_humi_input_unreg_device:
  1047. input_unregister_device(prox_input_dev);
  1048. iRet_proximity_input_unreg_device:
  1049. input_unregister_device(light_input_dev);
  1050. iRet_light_input_unreg_device:
  1051. input_unregister_device(gesture_input_dev);
  1052. iRet_gesture_input_unreg_device:
  1053. input_unregister_device(pressure_input_dev);
  1054. return ERROR;
  1055. iRet_pressure_input_unreg_device:
  1056. input_free_device(meta_input_dev);
  1057. iRet_meta_input_free_device:
  1058. input_free_device(step_cnt_input_dev);
  1059. iRet_step_cnt_input_free_device:
  1060. input_free_device(sig_motion_input_dev);
  1061. iRet_sig_motion_input_free_device:
  1062. input_free_device(temp_humi_input_dev);
  1063. iRet_temp_humidity_input_free_device:
  1064. input_free_device(prox_input_dev);
  1065. iRet_proximity_input_free_device:
  1066. input_free_device(light_input_dev);
  1067. iRet_light_input_free_device:
  1068. input_free_device(gesture_input_dev);
  1069. iRet_gesture_input_free_device:
  1070. input_free_device(pressure_input_dev);
  1071. iRet_pressure_input_free_device:
  1072. iio_device_unregister(data->step_det_indio_dev);
  1073. out_remove_trigger_step_det:
  1074. iio_buffer_unregister(data->step_det_indio_dev);
  1075. out_unreg_ring_step_det:
  1076. ssp_iio_unconfigure_ring(data->step_det_indio_dev);
  1077. out_free_step_det:
  1078. iio_free_device(data->step_det_indio_dev);
  1079. out_alloc_fail_step_det:
  1080. iio_device_unregister(data->rot_indio_dev);
  1081. out_remove_trigger_rot:
  1082. iio_buffer_unregister(data->rot_indio_dev);
  1083. out_unreg_ring_rot:
  1084. ssp_iio_unconfigure_ring(data->rot_indio_dev);
  1085. out_free_rot:
  1086. iio_free_device(data->rot_indio_dev);
  1087. out_alloc_fail_rot:
  1088. iio_device_unregister(data->game_rot_indio_dev);
  1089. out_remove_trigger_game_rot:
  1090. iio_buffer_unregister(data->game_rot_indio_dev);
  1091. out_unreg_ring_game_rot:
  1092. ssp_iio_unconfigure_ring(data->game_rot_indio_dev);
  1093. out_free_game_rot:
  1094. iio_free_device(data->game_rot_indio_dev);
  1095. out_alloc_fail_game_rot:
  1096. iio_device_unregister(data->uncal_gyro_indio_dev);
  1097. out_remove_trigger_uncal_gyro:
  1098. iio_buffer_unregister(data->uncal_gyro_indio_dev);
  1099. out_unreg_ring_uncal_gyro:
  1100. ssp_iio_unconfigure_ring(data->uncal_gyro_indio_dev);
  1101. out_free_uncal_gyro:
  1102. iio_free_device(data->uncal_gyro_indio_dev);
  1103. out_alloc_fail_uncal_gyro:
  1104. iio_device_unregister(data->gyro_indio_dev);
  1105. out_remove_trigger_gyro:
  1106. iio_buffer_unregister(data->gyro_indio_dev);
  1107. out_unreg_ring_gyro:
  1108. ssp_iio_unconfigure_ring(data->gyro_indio_dev);
  1109. out_free_gyro:
  1110. iio_free_device(data->gyro_indio_dev);
  1111. out_alloc_fail_gyro:
  1112. iio_device_unregister(data->uncal_mag_indio_dev);
  1113. out_remove_trigger_uncal_mag:
  1114. iio_buffer_unregister(data->uncal_mag_indio_dev);
  1115. out_unreg_ring_uncal_mag:
  1116. ssp_iio_unconfigure_ring(data->uncal_mag_indio_dev);
  1117. out_free_uncal_mag:
  1118. iio_free_device(data->uncal_mag_indio_dev);
  1119. out_alloc_fail_uncal_mag:
  1120. iio_device_unregister(data->mag_indio_dev);
  1121. out_remove_trigger_mag:
  1122. iio_buffer_unregister(data->mag_indio_dev);
  1123. out_unreg_ring_mag:
  1124. ssp_iio_unconfigure_ring(data->mag_indio_dev);
  1125. out_free_mag:
  1126. iio_free_device(data->mag_indio_dev);
  1127. out_alloc_fail_mag:
  1128. iio_device_unregister(data->accel_indio_dev);
  1129. out_remove_trigger_accel:
  1130. iio_buffer_unregister(data->accel_indio_dev);
  1131. out_unreg_ring_accel:
  1132. ssp_iio_unconfigure_ring(data->accel_indio_dev);
  1133. out_free_accel:
  1134. iio_free_device(data->accel_indio_dev);
  1135. pr_err("[SSP]: %s - could not allocate input device\n", __func__);
  1136. return ERROR;
  1137. }
  1138. void remove_input_dev(struct ssp_data *data)
  1139. {
  1140. input_unregister_device(data->pressure_input_dev);
  1141. input_unregister_device(data->gesture_input_dev);
  1142. input_unregister_device(data->light_input_dev);
  1143. input_unregister_device(data->prox_input_dev);
  1144. input_unregister_device(data->temp_humi_input_dev);
  1145. input_unregister_device(data->sig_motion_input_dev);
  1146. input_unregister_device(data->step_cnt_input_dev);
  1147. input_unregister_device(data->meta_input_dev);
  1148. }