ssp_input.c 44 KB

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