ssp_input.c 43 KB

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