ssp_sysfs.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  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 <linux/math64.h>
  17. #include "../../staging/iio/events.h"
  18. #include "../../staging/iio/iio.h"
  19. #define BATCH_IOCTL_MAGIC 0xFC
  20. struct batch_config {
  21. int64_t timeout;
  22. int64_t delay;
  23. int flag;
  24. };
  25. /*************************************************************************/
  26. /* SSP data delay function */
  27. /*************************************************************************/
  28. int get_msdelay(int64_t dDelayRate) {
  29. /*
  30. * From Android 5.0, There is MaxDelay Concept.
  31. * If App request lower frequency then MaxDelay,
  32. * Sensor have to work with MaxDelay.
  33. */
  34. if (dDelayRate > 200000000)
  35. dDelayRate = 200000000;
  36. return div_s64(dDelayRate, 1000000);
  37. }
  38. static void enable_sensor(struct ssp_data *data,
  39. int iSensorType, int64_t dNewDelay)
  40. {
  41. u8 uBuf[9];
  42. unsigned int uNewEnable = 0;
  43. s32 maxBatchReportLatency = 0;
  44. s8 batchOptions = 0;
  45. int64_t dTempDelay = data->adDelayBuf[iSensorType];
  46. s32 dMsDelay = get_msdelay(dNewDelay);
  47. int ret = 0;
  48. data->adDelayBuf[iSensorType] = dNewDelay;
  49. maxBatchReportLatency = data->batchLatencyBuf[iSensorType];
  50. batchOptions = data->batchOptBuf[iSensorType];
  51. switch (data->aiCheckStatus[iSensorType]) {
  52. case ADD_SENSOR_STATE:
  53. pr_debug("[SSP]: %s - add %u, New = %lldns\n",
  54. __func__, 1 << iSensorType, dNewDelay);
  55. memcpy(&uBuf[0], &dMsDelay, 4);
  56. memcpy(&uBuf[4], &maxBatchReportLatency, 4);
  57. uBuf[8] = batchOptions;
  58. if (iSensorType == TEMPERATURE_HUMIDITY_SENSOR &&
  59. dMsDelay == 10000)
  60. pr_info("[SSP] Skip Add Temphumidity Sensor\n");
  61. else
  62. ret = send_instruction(data, ADD_SENSOR,
  63. iSensorType, uBuf, 9);
  64. pr_info("[SSP], delay %d, timeout %d, flag=%d, ret%d",
  65. dMsDelay, maxBatchReportLatency, uBuf[8], ret);
  66. if (ret <= 0) {
  67. uNewEnable =
  68. (unsigned int)atomic_read(&data->aSensorEnable)
  69. & (~(unsigned int)(1 << iSensorType));
  70. atomic_set(&data->aSensorEnable, uNewEnable);
  71. data->aiCheckStatus[iSensorType] = NO_SENSOR_STATE;
  72. break;
  73. }
  74. data->aiCheckStatus[iSensorType] = RUNNING_SENSOR_STATE;
  75. if (iSensorType == PROXIMITY_SENSOR) {
  76. proximity_open_lcd_ldi(data);
  77. proximity_open_calibration(data);
  78. set_proximity_threshold(data, data->uProxHiThresh, data->uProxLoThresh);
  79. }
  80. break;
  81. case RUNNING_SENSOR_STATE:
  82. if (get_msdelay(dTempDelay)
  83. == get_msdelay(data->adDelayBuf[iSensorType]))
  84. break;
  85. pr_debug("[SSP]: %s - Change %u, New = %lldns\n",
  86. __func__, 1 << iSensorType, dNewDelay);
  87. memcpy(&uBuf[0], &dMsDelay, 4);
  88. memcpy(&uBuf[4], &maxBatchReportLatency, 4);
  89. uBuf[8] = batchOptions;
  90. send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 9);
  91. break;
  92. default:
  93. data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE;
  94. }
  95. }
  96. static void change_sensor_delay(struct ssp_data *data,
  97. int iSensorType, int64_t dNewDelay)
  98. {
  99. u8 uBuf[9];
  100. s32 maxBatchReportLatency = 0;
  101. s8 batchOptions = 0;
  102. int64_t dTempDelay = data->adDelayBuf[iSensorType];
  103. s32 dMsDelay = get_msdelay(dNewDelay);
  104. data->adDelayBuf[iSensorType] = dNewDelay;
  105. data->batchLatencyBuf[iSensorType] = maxBatchReportLatency;
  106. data->batchOptBuf[iSensorType] = batchOptions;
  107. switch (data->aiCheckStatus[iSensorType]) {
  108. case RUNNING_SENSOR_STATE:
  109. if (get_msdelay(dTempDelay)
  110. == get_msdelay(data->adDelayBuf[iSensorType]))
  111. break;
  112. ssp_dbg("[SSP]: %s - Change %u, New = %lldns\n",
  113. __func__, 1 << iSensorType, dNewDelay);
  114. memcpy(&uBuf[0], &dMsDelay, 4);
  115. memcpy(&uBuf[4], &maxBatchReportLatency, 4);
  116. uBuf[8] = batchOptions;
  117. send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 9);
  118. break;
  119. default:
  120. break;
  121. }
  122. }
  123. /*************************************************************************/
  124. /* SSP data enable function */
  125. /*************************************************************************/
  126. static int ssp_remove_sensor(struct ssp_data *data,
  127. unsigned int uChangedSensor, unsigned int uNewEnable)
  128. {
  129. u8 uBuf[4];
  130. int64_t dSensorDelay = data->adDelayBuf[uChangedSensor];
  131. pr_debug("[SSP]: %s - remove sensor = %d, current state = %d\n",
  132. __func__, (1 << uChangedSensor), uNewEnable);
  133. data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY;
  134. data->batchLatencyBuf[uChangedSensor] = 0;
  135. data->batchOptBuf[uChangedSensor] = 0;
  136. if (uChangedSensor == ORIENTATION_SENSOR) {
  137. if (!(atomic_read(&data->aSensorEnable)
  138. & (1 << ACCELEROMETER_SENSOR))) {
  139. uChangedSensor = ACCELEROMETER_SENSOR;
  140. } else {
  141. change_sensor_delay(data, ACCELEROMETER_SENSOR,
  142. data->adDelayBuf[ACCELEROMETER_SENSOR]);
  143. return 0;
  144. }
  145. } else if (uChangedSensor == ACCELEROMETER_SENSOR) {
  146. if (atomic_read(&data->aSensorEnable)
  147. & (1 << ORIENTATION_SENSOR)) {
  148. change_sensor_delay(data, ORIENTATION_SENSOR,
  149. data->adDelayBuf[ORIENTATION_SENSOR]);
  150. return 0;
  151. }
  152. }
  153. if (!data->bSspShutdown)
  154. if (atomic_read(&data->aSensorEnable) & (1 << uChangedSensor)) {
  155. s32 dMsDelay = get_msdelay(dSensorDelay);
  156. memcpy(&uBuf[0], &dMsDelay, 4);
  157. send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 4);
  158. }
  159. data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE;
  160. return 0;
  161. }
  162. /*************************************************************************/
  163. /* ssp Sysfs */
  164. /*************************************************************************/
  165. static ssize_t show_enable_irq(struct device *dev,
  166. struct device_attribute *attr, char *buf)
  167. {
  168. struct ssp_data *data = dev_get_drvdata(dev);
  169. ssp_dbg("[SSP]: %s - %d\n", __func__, !data->bSspShutdown);
  170. return sprintf(buf, "%d\n", !data->bSspShutdown);
  171. }
  172. static ssize_t set_enable_irq(struct device *dev,
  173. struct device_attribute *attr, const char *buf, size_t size)
  174. {
  175. u8 dTemp;
  176. struct ssp_data *data = dev_get_drvdata(dev);
  177. if (kstrtou8(buf, 10, &dTemp) < 0)
  178. return -1;
  179. pr_info("[SSP] %s - %d start\n", __func__, dTemp);
  180. if (dTemp) {
  181. reset_mcu(data);
  182. enable_debug_timer(data);
  183. } else if (!dTemp) {
  184. disable_debug_timer(data);
  185. ssp_enable(data, 0);
  186. } else
  187. pr_err("[SSP] %s - invalid value\n", __func__);
  188. pr_info("[SSP] %s - %d end\n", __func__, dTemp);
  189. return size;
  190. }
  191. static ssize_t show_sensors_enable(struct device *dev,
  192. struct device_attribute *attr, char *buf)
  193. {
  194. struct ssp_data *data = dev_get_drvdata(dev);
  195. pr_debug("[SSP]: %s - cur_enable = %d\n", __func__,
  196. atomic_read(&data->aSensorEnable));
  197. return sprintf(buf, "%9u\n", atomic_read(&data->aSensorEnable));
  198. }
  199. static ssize_t set_sensors_enable(struct device *dev,
  200. struct device_attribute *attr, const char *buf, size_t size)
  201. {
  202. int64_t dTemp;
  203. int iRet;
  204. unsigned int uNewEnable = 0, uChangedSensor = 0;
  205. struct ssp_data *data = dev_get_drvdata(dev);
  206. if (kstrtoll(buf, 10, &dTemp) < 0)
  207. return -EINVAL;
  208. uNewEnable = (unsigned int)dTemp;
  209. ssp_dbg("[SSP]: %s - new_enable = %u, old_enable = %u\n", __func__,
  210. uNewEnable, atomic_read(&data->aSensorEnable));
  211. if ((uNewEnable != atomic_read(&data->aSensorEnable)) &&
  212. !(data->uSensorState & (uNewEnable - atomic_read(&data->aSensorEnable)))) {
  213. pr_info("[SSP] %s - %u is not connected(sensortate: 0x%x)\n",
  214. __func__, uNewEnable - atomic_read(&data->aSensorEnable), data->uSensorState);
  215. return -EINVAL;
  216. }
  217. if (uNewEnable == atomic_read(&data->aSensorEnable))
  218. return size;
  219. for (uChangedSensor = 0; uChangedSensor < SENSOR_MAX; uChangedSensor++) {
  220. if ((atomic_read(&data->aSensorEnable) & (1 << uChangedSensor))
  221. != (uNewEnable & (1 << uChangedSensor))) {
  222. if (!(uNewEnable & (1 << uChangedSensor))) {
  223. data->reportedData[uChangedSensor] = false;
  224. ssp_remove_sensor(data, uChangedSensor,
  225. uNewEnable); /* disable */
  226. } else { /* Change to ADD_SENSOR_STATE from KitKat */
  227. if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) {
  228. if (uChangedSensor == ACCELEROMETER_SENSOR) {
  229. accel_open_calibration(data);
  230. iRet = set_accel_cal(data);
  231. if (iRet < 0)
  232. pr_err("[SSP]: %s - set_accel_cal failed %d\n", __func__, iRet);
  233. }
  234. else if (uChangedSensor == GYROSCOPE_SENSOR) {
  235. gyro_open_calibration(data);
  236. iRet = set_gyro_cal(data);
  237. if (iRet < 0)
  238. pr_err("[SSP]: %s - set_gyro_cal failed %d\n", __func__, iRet);
  239. }
  240. else if (uChangedSensor == PRESSURE_SENSOR)
  241. pressure_open_calibration(data);
  242. else if (uChangedSensor == PROXIMITY_SENSOR) {
  243. proximity_open_lcd_ldi(data);
  244. proximity_open_calibration(data);
  245. set_proximity_threshold(data, data->uProxHiThresh, data->uProxLoThresh);
  246. }
  247. }
  248. data->aiCheckStatus[uChangedSensor] = ADD_SENSOR_STATE;
  249. enable_sensor(data, uChangedSensor, data->adDelayBuf[uChangedSensor]);
  250. }
  251. break;
  252. }
  253. }
  254. atomic_set(&data->aSensorEnable, uNewEnable);
  255. return size;
  256. }
  257. static ssize_t set_flush(struct device *dev,
  258. struct device_attribute *attr, const char *buf, size_t size)
  259. {
  260. int64_t dTemp;
  261. u8 sensor_type = 0;
  262. struct ssp_data *data = dev_get_drvdata(dev);
  263. if (kstrtoll(buf, 10, &dTemp) < 0)
  264. return -EINVAL;
  265. sensor_type = (u8)dTemp;
  266. if (!(atomic_read(&data->aSensorEnable) & (1 << sensor_type)))
  267. return -EINVAL;
  268. if (flush(data, sensor_type) < 0) {
  269. pr_err("[SSP] ssp returns error for flush(%x)", sensor_type);
  270. return -EINVAL;
  271. }
  272. return size;
  273. }
  274. static ssize_t show_acc_delay(struct device *dev,
  275. struct device_attribute *attr, char *buf)
  276. {
  277. struct ssp_data *data = dev_get_drvdata(dev);
  278. return sprintf(buf, "%lld\n", data->adDelayBuf[ACCELEROMETER_SENSOR]);
  279. }
  280. static ssize_t set_acc_delay(struct device *dev,
  281. struct device_attribute *attr, const char *buf, size_t size)
  282. {
  283. int64_t dNewDelay;
  284. struct ssp_data *data = dev_get_drvdata(dev);
  285. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  286. return -EINVAL;
  287. if ((atomic_read(&data->aSensorEnable) & (1 << ORIENTATION_SENSOR)) &&
  288. (data->adDelayBuf[ORIENTATION_SENSOR] < dNewDelay))
  289. data->adDelayBuf[ACCELEROMETER_SENSOR] = dNewDelay;
  290. else
  291. change_sensor_delay(data, ACCELEROMETER_SENSOR, dNewDelay);
  292. return size;
  293. }
  294. static ssize_t show_gyro_delay(struct device *dev,
  295. struct device_attribute *attr, char *buf)
  296. {
  297. struct ssp_data *data = dev_get_drvdata(dev);
  298. return sprintf(buf, "%lld\n", data->adDelayBuf[GYROSCOPE_SENSOR]);
  299. }
  300. static ssize_t set_gyro_delay(struct device *dev,
  301. struct device_attribute *attr, const char *buf, size_t size)
  302. {
  303. int64_t dNewDelay;
  304. struct ssp_data *data = dev_get_drvdata(dev);
  305. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  306. return -EINVAL;
  307. change_sensor_delay(data, GYROSCOPE_SENSOR, dNewDelay);
  308. return size;
  309. }
  310. static ssize_t show_mag_delay(struct device *dev,
  311. struct device_attribute *attr, char *buf)
  312. {
  313. struct ssp_data *data = dev_get_drvdata(dev);
  314. return sprintf(buf, "%lld\n", data->adDelayBuf[GEOMAGNETIC_SENSOR]);
  315. }
  316. static ssize_t set_mag_delay(struct device *dev,
  317. struct device_attribute *attr, const char *buf, size_t size)
  318. {
  319. int64_t dNewDelay;
  320. struct ssp_data *data = dev_get_drvdata(dev);
  321. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  322. return -EINVAL;
  323. change_sensor_delay(data, GEOMAGNETIC_SENSOR, dNewDelay);
  324. return size;
  325. }
  326. static ssize_t show_uncal_mag_delay(struct device *dev,
  327. struct device_attribute *attr, char *buf)
  328. {
  329. struct ssp_data *data = dev_get_drvdata(dev);
  330. return sprintf(buf, "%lld\n", data->adDelayBuf[GEOMAGNETIC_UNCALIB_SENSOR]);
  331. }
  332. static ssize_t set_uncal_mag_delay(struct device *dev,
  333. struct device_attribute *attr, const char *buf, size_t size)
  334. {
  335. int64_t dNewDelay;
  336. struct ssp_data *data = dev_get_drvdata(dev);
  337. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  338. return -EINVAL;
  339. change_sensor_delay(data, GEOMAGNETIC_UNCALIB_SENSOR, dNewDelay);
  340. return size;
  341. }
  342. static ssize_t show_rot_delay(struct device *dev,
  343. struct device_attribute *attr, char *buf)
  344. {
  345. struct ssp_data *data = dev_get_drvdata(dev);
  346. return sprintf(buf, "%lld\n", data->adDelayBuf[ROTATION_VECTOR]);
  347. }
  348. static ssize_t set_rot_delay(struct device *dev,
  349. struct device_attribute *attr, const char *buf, size_t size)
  350. {
  351. int64_t dNewDelay;
  352. struct ssp_data *data = dev_get_drvdata(dev);
  353. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  354. return -EINVAL;
  355. change_sensor_delay(data, ROTATION_VECTOR, dNewDelay);
  356. return size;
  357. }
  358. static ssize_t show_game_rot_delay(struct device *dev,
  359. struct device_attribute *attr, char *buf)
  360. {
  361. struct ssp_data *data = dev_get_drvdata(dev);
  362. return sprintf(buf, "%lld\n", data->adDelayBuf[GAME_ROTATION_VECTOR]);
  363. }
  364. static ssize_t set_game_rot_delay(struct device *dev,
  365. struct device_attribute *attr, const char *buf, size_t size)
  366. {
  367. int64_t dNewDelay;
  368. struct ssp_data *data = dev_get_drvdata(dev);
  369. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  370. return -EINVAL;
  371. change_sensor_delay(data, GAME_ROTATION_VECTOR, dNewDelay);
  372. return size;
  373. }
  374. static ssize_t show_step_det_delay(struct device *dev,
  375. struct device_attribute *attr, char *buf)
  376. {
  377. struct ssp_data *data = dev_get_drvdata(dev);
  378. return sprintf(buf, "%lld\n",
  379. data->adDelayBuf[STEP_DETECTOR]);
  380. }
  381. static ssize_t set_step_det_delay(struct device *dev,
  382. struct device_attribute *attr, const char *buf, size_t size)
  383. {
  384. int64_t dNewDelay;
  385. struct ssp_data *data = dev_get_drvdata(dev);
  386. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  387. return -1;
  388. change_sensor_delay(data, STEP_DETECTOR, dNewDelay);
  389. return size;
  390. }
  391. static ssize_t show_sig_motion_delay(struct device *dev,
  392. struct device_attribute *attr, char *buf)
  393. {
  394. struct ssp_data *data = dev_get_drvdata(dev);
  395. return sprintf(buf, "%lld\n",
  396. data->adDelayBuf[SIG_MOTION_SENSOR]);
  397. }
  398. static ssize_t set_sig_motion_delay(struct device *dev,
  399. struct device_attribute *attr, const char *buf, size_t size)
  400. {
  401. int64_t dNewDelay;
  402. struct ssp_data *data = dev_get_drvdata(dev);
  403. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  404. return -1;
  405. change_sensor_delay(data, SIG_MOTION_SENSOR, dNewDelay);
  406. return size;
  407. }
  408. static ssize_t show_step_cnt_delay(struct device *dev,
  409. struct device_attribute *attr, char *buf)
  410. {
  411. struct ssp_data *data = dev_get_drvdata(dev);
  412. return sprintf(buf, "%lld\n",
  413. data->adDelayBuf[STEP_COUNTER]);
  414. }
  415. static ssize_t set_step_cnt_delay(struct device *dev,
  416. struct device_attribute *attr, const char *buf, size_t size)
  417. {
  418. int64_t dNewDelay;
  419. struct ssp_data *data = dev_get_drvdata(dev);
  420. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  421. return -1;
  422. change_sensor_delay(data, STEP_COUNTER, dNewDelay);
  423. return size;
  424. }
  425. static ssize_t show_uncalib_gyro_delay(struct device *dev,
  426. struct device_attribute *attr, char *buf)
  427. {
  428. struct ssp_data *data = dev_get_drvdata(dev);
  429. return sprintf(buf, "%lld\n", data->adDelayBuf[GYRO_UNCALIB_SENSOR]);
  430. }
  431. static ssize_t set_uncalib_gyro_delay(struct device *dev,
  432. struct device_attribute *attr, const char *buf, size_t size)
  433. {
  434. int64_t dNewDelay;
  435. struct ssp_data *data = dev_get_drvdata(dev);
  436. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  437. return -EINVAL;
  438. change_sensor_delay(data, GYRO_UNCALIB_SENSOR, dNewDelay);
  439. return size;
  440. }
  441. static ssize_t show_pressure_delay(struct device *dev,
  442. struct device_attribute *attr, char *buf)
  443. {
  444. struct ssp_data *data = dev_get_drvdata(dev);
  445. return sprintf(buf, "%lld\n", data->adDelayBuf[PRESSURE_SENSOR]);
  446. }
  447. static ssize_t set_pressure_delay(struct device *dev,
  448. struct device_attribute *attr, const char *buf, size_t size)
  449. {
  450. int64_t dNewDelay;
  451. struct ssp_data *data = dev_get_drvdata(dev);
  452. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  453. return -EINVAL;
  454. change_sensor_delay(data, PRESSURE_SENSOR, dNewDelay);
  455. return size;
  456. }
  457. static ssize_t show_gesture_delay(struct device *dev,
  458. struct device_attribute *attr, char *buf)
  459. {
  460. struct ssp_data *data = dev_get_drvdata(dev);
  461. return sprintf(buf, "%lld\n", data->adDelayBuf[GESTURE_SENSOR]);
  462. }
  463. static ssize_t set_gesture_delay(struct device *dev,
  464. struct device_attribute *attr, const char *buf, size_t size)
  465. {
  466. int64_t dNewDelay;
  467. struct ssp_data *data = dev_get_drvdata(dev);
  468. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  469. return -EINVAL;
  470. change_sensor_delay(data, GESTURE_SENSOR, dNewDelay);
  471. return size;
  472. }
  473. static ssize_t show_light_delay(struct device *dev,
  474. struct device_attribute *attr, char *buf)
  475. {
  476. struct ssp_data *data = dev_get_drvdata(dev);
  477. return sprintf(buf, "%lld\n", data->adDelayBuf[LIGHT_SENSOR]);
  478. }
  479. static ssize_t set_light_delay(struct device *dev,
  480. struct device_attribute *attr, const char *buf, size_t size)
  481. {
  482. int64_t dNewDelay;
  483. struct ssp_data *data = dev_get_drvdata(dev);
  484. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  485. return -EINVAL;
  486. change_sensor_delay(data, LIGHT_SENSOR, dNewDelay);
  487. return size;
  488. }
  489. static ssize_t show_prox_delay(struct device *dev,
  490. struct device_attribute *attr, char *buf)
  491. {
  492. struct ssp_data *data = dev_get_drvdata(dev);
  493. return sprintf(buf, "%lld\n", data->adDelayBuf[PROXIMITY_SENSOR]);
  494. }
  495. static ssize_t set_prox_delay(struct device *dev,
  496. struct device_attribute *attr, const char *buf, size_t size)
  497. {
  498. int64_t dNewDelay;
  499. struct ssp_data *data = dev_get_drvdata(dev);
  500. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  501. return -EINVAL;
  502. change_sensor_delay(data, PROXIMITY_SENSOR, dNewDelay);
  503. return size;
  504. }
  505. static ssize_t show_temp_humi_delay(struct device *dev,
  506. struct device_attribute *attr, char *buf)
  507. {
  508. struct ssp_data *data = dev_get_drvdata(dev);
  509. return sprintf(buf, "%lld\n",
  510. data->adDelayBuf[TEMPERATURE_HUMIDITY_SENSOR]);
  511. }
  512. static ssize_t set_temp_humi_delay(struct device *dev,
  513. struct device_attribute *attr, const char *buf, size_t size)
  514. {
  515. int64_t dNewDelay;
  516. struct ssp_data *data = dev_get_drvdata(dev);
  517. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  518. return -EINVAL;
  519. change_sensor_delay(data, TEMPERATURE_HUMIDITY_SENSOR, dNewDelay);
  520. return size;
  521. }
  522. ssize_t ssp_sensorhub_voicel_pcmdump_show(struct device *dev,
  523. struct device_attribute *attr, char *buf)
  524. {
  525. struct ssp_data *data = dev_get_drvdata(dev);
  526. int status = ssp_sensorhub_pcm_dump(data->hub_data);
  527. return sprintf(buf, "%s\n", (status ? "OK" : "NG"));
  528. }
  529. static DEVICE_ATTR(voice_pcmdump, S_IRUGO, ssp_sensorhub_voicel_pcmdump_show, NULL);
  530. static struct device_attribute *voice_attrs[] = {
  531. &dev_attr_voice_pcmdump,
  532. NULL,
  533. };
  534. static void initialize_voice_sysfs(struct ssp_data *data)
  535. {
  536. sensors_register(data->voice_device, data, voice_attrs, "ssp_voice");
  537. }
  538. static void remove_voice_sysfs(struct ssp_data *data)
  539. {
  540. sensors_unregister(data->voice_device, voice_attrs);
  541. }
  542. static DEVICE_ATTR(mcu_rev, S_IRUGO, mcu_revision_show, NULL);
  543. static DEVICE_ATTR(mcu_name, S_IRUGO, mcu_model_name_show, NULL);
  544. static DEVICE_ATTR(mcu_update, S_IRUGO, mcu_update_kernel_bin_show, NULL);
  545. static DEVICE_ATTR(mcu_update2, S_IRUGO,
  546. mcu_update_kernel_crashed_bin_show, NULL);
  547. static DEVICE_ATTR(mcu_update_ums, S_IRUGO, mcu_update_ums_bin_show, NULL);
  548. static DEVICE_ATTR(mcu_reset, S_IRUGO, mcu_reset_show, NULL);
  549. static DEVICE_ATTR(mcu_dump, S_IRUGO, mcu_dump_show, NULL);
  550. static DEVICE_ATTR(mcu_test, S_IRUGO | S_IWUSR | S_IWGRP,
  551. mcu_factorytest_show, mcu_factorytest_store);
  552. static DEVICE_ATTR(mcu_sleep_test, S_IRUGO | S_IWUSR | S_IWGRP,
  553. mcu_sleep_factorytest_show, mcu_sleep_factorytest_store);
  554. static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP,
  555. show_sensors_enable, set_sensors_enable);
  556. static DEVICE_ATTR(enable_irq, S_IRUGO | S_IWUSR | S_IWGRP,
  557. show_enable_irq, set_enable_irq);
  558. static DEVICE_ATTR(rot_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  559. show_rot_delay, set_rot_delay);
  560. static DEVICE_ATTR(game_rot_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  561. show_game_rot_delay, set_game_rot_delay);
  562. static DEVICE_ATTR(step_det_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  563. show_step_det_delay, set_step_det_delay);
  564. static DEVICE_ATTR(pressure_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  565. show_pressure_delay, set_pressure_delay);
  566. static DEVICE_ATTR(accel_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  567. show_acc_delay, set_acc_delay);
  568. static DEVICE_ATTR(gyro_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  569. show_gyro_delay, set_gyro_delay);
  570. static DEVICE_ATTR(uncalib_gyro_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  571. show_uncalib_gyro_delay, set_uncalib_gyro_delay);
  572. static DEVICE_ATTR(mag_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  573. show_mag_delay, set_mag_delay);
  574. static DEVICE_ATTR(uncal_mag_poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  575. show_uncal_mag_delay, set_uncal_mag_delay);
  576. static DEVICE_ATTR(ssp_flush, S_IWUSR | S_IWGRP,
  577. NULL, set_flush);
  578. static struct device_attribute dev_attr_gesture_poll_delay
  579. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  580. show_gesture_delay, set_gesture_delay);
  581. static struct device_attribute dev_attr_light_poll_delay
  582. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  583. show_light_delay, set_light_delay);
  584. static struct device_attribute dev_attr_prox_poll_delay
  585. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  586. show_prox_delay, set_prox_delay);
  587. static struct device_attribute dev_attr_temp_humi_poll_delay
  588. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  589. show_temp_humi_delay, set_temp_humi_delay);
  590. static struct device_attribute dev_attr_sig_motion_poll_delay
  591. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  592. show_sig_motion_delay, set_sig_motion_delay);
  593. static struct device_attribute dev_attr_step_cnt_poll_delay
  594. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  595. show_step_cnt_delay, set_step_cnt_delay);
  596. static struct device_attribute *mcu_attrs[] = {
  597. &dev_attr_enable,
  598. &dev_attr_mcu_rev,
  599. &dev_attr_mcu_name,
  600. &dev_attr_mcu_test,
  601. &dev_attr_mcu_reset,
  602. &dev_attr_mcu_dump,
  603. &dev_attr_mcu_update,
  604. &dev_attr_mcu_update2,
  605. &dev_attr_mcu_update_ums,
  606. &dev_attr_mcu_sleep_test,
  607. &dev_attr_enable_irq,
  608. &dev_attr_accel_poll_delay,
  609. &dev_attr_mag_poll_delay,
  610. &dev_attr_uncal_mag_poll_delay,
  611. &dev_attr_gyro_poll_delay,
  612. &dev_attr_uncalib_gyro_poll_delay,
  613. &dev_attr_rot_poll_delay,
  614. &dev_attr_game_rot_poll_delay,
  615. &dev_attr_step_det_poll_delay,
  616. &dev_attr_pressure_poll_delay,
  617. &dev_attr_ssp_flush,
  618. NULL,
  619. };
  620. static long ssp_batch_ioctl(struct file *file, unsigned int cmd,
  621. unsigned long arg)
  622. {
  623. struct ssp_data *data
  624. = container_of(file->private_data,
  625. struct ssp_data, batch_io_device);
  626. struct batch_config batch;
  627. void __user *argp = (void __user *)arg;
  628. int retries = 2;
  629. int ret = 0;
  630. int sensor_type, ms_delay;
  631. int timeout_ms = 0;
  632. u8 uBuf[9];
  633. sensor_type = (cmd & 0xFF);
  634. if ((cmd >> 8 & 0xFF) != BATCH_IOCTL_MAGIC) {
  635. pr_err("[SSP] Invalid BATCH CMD %x", cmd);
  636. return -EINVAL;
  637. }
  638. while (retries--) {
  639. ret = copy_from_user(&batch, argp, sizeof(batch));
  640. if (likely(!ret))
  641. break;
  642. }
  643. if (unlikely(ret)) {
  644. pr_err("[SSP] batch ioctl err(%d)", ret);
  645. return -EINVAL;
  646. }
  647. ms_delay = get_msdelay(batch.delay);
  648. timeout_ms = div_s64(batch.timeout, 1000000);
  649. memcpy(&uBuf[0], &ms_delay, 4);
  650. memcpy(&uBuf[4], &timeout_ms, 4);
  651. uBuf[8] = batch.flag;
  652. if (batch.timeout){ /* add or dry */
  653. if(!(batch.flag & SENSORS_BATCH_DRY_RUN)) { /* real batch, NOT DRY, change delay */
  654. ret = 1;
  655. /* if sensor is not running state, enable will be called.
  656. MCU return fail when receive chage delay inst during NO_SENSOR STATE */
  657. if (data->aiCheckStatus[sensor_type] == RUNNING_SENSOR_STATE) {
  658. ret = send_instruction_sync(data, CHANGE_DELAY, sensor_type, uBuf, 9);
  659. }
  660. if (ret > 0) { // ret 1 is success
  661. data->batchOptBuf[sensor_type] = (u8)batch.flag;
  662. data->batchLatencyBuf[sensor_type] = timeout_ms;
  663. data->adDelayBuf[sensor_type] = batch.delay;
  664. }
  665. } else { /* real batch, DRY RUN */
  666. ret = send_instruction_sync(data, CHANGE_DELAY, sensor_type, uBuf, 9);
  667. if (ret > 0) { // ret 1 is success
  668. data->batchOptBuf[sensor_type] = (u8)batch.flag;
  669. data->batchLatencyBuf[sensor_type] = timeout_ms;
  670. data->adDelayBuf[sensor_type] = batch.delay;
  671. }
  672. }
  673. } else { /* remove batch or normal change delay, remove or add will be called. */
  674. if (!(batch.flag & SENSORS_BATCH_DRY_RUN)) { /* no batch, NOT DRY, change delay */
  675. data->batchOptBuf[sensor_type] = 0;
  676. data->batchLatencyBuf[sensor_type] = 0;
  677. data->adDelayBuf[sensor_type] = batch.delay;
  678. if (data->aiCheckStatus[sensor_type] == RUNNING_SENSOR_STATE) {
  679. send_instruction(data, CHANGE_DELAY, sensor_type, uBuf, 9);
  680. }
  681. }
  682. }
  683. pr_info("[SSP] batch %d: delay %lld, timeout %lld, flag %d, ret %d",
  684. sensor_type, batch.delay, batch.timeout, batch.flag, ret);
  685. if (!batch.timeout)
  686. return 0;
  687. if (ret <= 0)
  688. return -EINVAL;
  689. else
  690. return 0;
  691. }
  692. static struct file_operations ssp_batch_fops = {
  693. .owner = THIS_MODULE,
  694. .open = nonseekable_open,
  695. .unlocked_ioctl = ssp_batch_ioctl,
  696. };
  697. static void initialize_mcu_factorytest(struct ssp_data *data)
  698. {
  699. sensors_register(data->mcu_device, data, mcu_attrs, "ssp_sensor");
  700. }
  701. static void remove_mcu_factorytest(struct ssp_data *data)
  702. {
  703. sensors_unregister(data->mcu_device, mcu_attrs);
  704. }
  705. int initialize_sysfs(struct ssp_data *data)
  706. {
  707. if (device_create_file(&data->gesture_input_dev->dev,
  708. &dev_attr_gesture_poll_delay))
  709. goto err_gesture_input_dev;
  710. if (device_create_file(&data->light_input_dev->dev,
  711. &dev_attr_light_poll_delay))
  712. goto err_light_input_dev;
  713. if (device_create_file(&data->prox_input_dev->dev,
  714. &dev_attr_prox_poll_delay))
  715. goto err_prox_input_dev;
  716. if (device_create_file(&data->temp_humi_input_dev->dev,
  717. &dev_attr_temp_humi_poll_delay))
  718. goto err_temp_humi_input_dev;
  719. if (device_create_file(&data->sig_motion_input_dev->dev,
  720. &dev_attr_sig_motion_poll_delay))
  721. goto err_sig_motion_input_dev;
  722. if (device_create_file(&data->step_cnt_input_dev->dev,
  723. &dev_attr_step_cnt_poll_delay))
  724. goto err_step_cnt_input_dev;
  725. data->batch_io_device.minor = MISC_DYNAMIC_MINOR;
  726. data->batch_io_device.name = "batch_io";
  727. data->batch_io_device.fops = &ssp_batch_fops;
  728. if (misc_register(&data->batch_io_device))
  729. goto err_batch_io_dev;
  730. initialize_accel_factorytest(data);
  731. initialize_gyro_factorytest(data);
  732. initialize_prox_factorytest(data);
  733. initialize_light_factorytest(data);
  734. initialize_pressure_factorytest(data);
  735. initialize_magnetic_factorytest(data);
  736. initialize_mcu_factorytest(data);
  737. initialize_gesture_factorytest(data);
  738. #ifdef CONFIG_SENSORS_SSP_SHTC1
  739. initialize_temphumidity_factorytest(data);
  740. #endif
  741. #ifdef CONFIG_SENSORS_SSP_MOBEAM
  742. initialize_mobeam(data);
  743. #endif
  744. /*snamy.jeong_0630 voice dump & data*/
  745. initialize_voice_sysfs(data);
  746. return SUCCESS;
  747. err_batch_io_dev:
  748. device_remove_file(&data->step_cnt_input_dev->dev,
  749. &dev_attr_step_cnt_poll_delay);
  750. err_step_cnt_input_dev:
  751. device_remove_file(&data->sig_motion_input_dev->dev,
  752. &dev_attr_sig_motion_poll_delay);
  753. err_sig_motion_input_dev:
  754. device_remove_file(&data->temp_humi_input_dev->dev,
  755. &dev_attr_temp_humi_poll_delay);
  756. err_temp_humi_input_dev:
  757. device_remove_file(&data->prox_input_dev->dev,
  758. &dev_attr_prox_poll_delay);
  759. err_prox_input_dev:
  760. device_remove_file(&data->light_input_dev->dev,
  761. &dev_attr_light_poll_delay);
  762. err_light_input_dev:
  763. device_remove_file(&data->gesture_input_dev->dev,
  764. &dev_attr_gesture_poll_delay);
  765. err_gesture_input_dev:
  766. pr_err("[SSP] error init sysfs");
  767. return ERROR;
  768. }
  769. void remove_sysfs(struct ssp_data *data)
  770. {
  771. device_remove_file(&data->gesture_input_dev->dev,
  772. &dev_attr_gesture_poll_delay);
  773. device_remove_file(&data->light_input_dev->dev,
  774. &dev_attr_light_poll_delay);
  775. device_remove_file(&data->prox_input_dev->dev,
  776. &dev_attr_prox_poll_delay);
  777. device_remove_file(&data->temp_humi_input_dev->dev,
  778. &dev_attr_temp_humi_poll_delay);
  779. device_remove_file(&data->sig_motion_input_dev->dev,
  780. &dev_attr_sig_motion_poll_delay);
  781. device_remove_file(&data->step_cnt_input_dev->dev,
  782. &dev_attr_step_cnt_poll_delay);
  783. ssp_batch_fops.unlocked_ioctl = NULL;
  784. misc_deregister(&data->batch_io_device);
  785. remove_accel_factorytest(data);
  786. remove_gyro_factorytest(data);
  787. remove_prox_factorytest(data);
  788. remove_light_factorytest(data);
  789. remove_pressure_factorytest(data);
  790. remove_magnetic_factorytest(data);
  791. remove_mcu_factorytest(data);
  792. remove_gesture_factorytest(data);
  793. #ifdef CONFIG_SENSORS_SSP_SHTC1
  794. remove_temphumidity_factorytest(data);
  795. #endif
  796. #ifdef CONFIG_SENSORS_SSP_MOBEAM
  797. remove_mobeam(data);
  798. #endif
  799. /*snamy.jeong_0630 voice dump & data*/
  800. remove_voice_sysfs(data);
  801. destroy_sensor_class();
  802. }