ssp_sysfs.c 31 KB

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