ssp_sysfs.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  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. /*************************************************************************/
  17. /* SSP data delay function */
  18. /*************************************************************************/
  19. unsigned int get_msdelay(int64_t dDelayRate)
  20. {
  21. if (dDelayRate >= SENSOR_NS_DELAY_NORMAL)
  22. return SENSOR_MS_DELAY_NORMAL;
  23. else if (dDelayRate >= SENSOR_NS_DELAY_UI)
  24. return SENSOR_MS_DELAY_UI;
  25. else if (dDelayRate >= SENSOR_NS_DELAY_GAME)
  26. return SENSOR_MS_DELAY_GAME;
  27. else
  28. return SENSOR_MS_DELAY_FASTEST;
  29. }
  30. unsigned int get_delay_cmd(u8 uDelayRate)
  31. {
  32. if (uDelayRate >= SENSOR_MS_DELAY_NORMAL)
  33. return SENSOR_CMD_DELAY_NORMAL;
  34. else if (uDelayRate >= SENSOR_MS_DELAY_UI)
  35. return SENSOR_CMD_DELAY_UI;
  36. else if (uDelayRate >= SENSOR_MS_DELAY_GAME)
  37. return SENSOR_CMD_DELAY_GAME;
  38. else
  39. return SENSOR_CMD_DELAY_FASTEST;
  40. }
  41. static void enable_sensor(struct ssp_data *data,
  42. int iSensorType, int64_t dNewDelay)
  43. {
  44. u8 uBuf[2];
  45. unsigned int uNewEnable = 0;
  46. int64_t dTempDelay = data->adDelayBuf[iSensorType];
  47. data->adDelayBuf[iSensorType] = dNewDelay;
  48. switch (data->aiCheckStatus[iSensorType]) {
  49. case ADD_SENSOR_STATE:
  50. pr_info("[SSP]: %s - add %u, New = %lldns\n",
  51. __func__, 1 << iSensorType, dNewDelay);
  52. uBuf[1] = (u8)get_msdelay(dNewDelay);
  53. uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
  54. if (send_instruction(data, ADD_SENSOR, iSensorType, uBuf, 2)
  55. != SUCCESS) {
  56. uNewEnable =
  57. (unsigned int)atomic_read(&data->aSensorEnable)
  58. & (~(unsigned int)(1 << iSensorType));
  59. atomic_set(&data->aSensorEnable, uNewEnable);
  60. data->aiCheckStatus[iSensorType] = NO_SENSOR_STATE;
  61. data->uMissSensorCnt++;
  62. break;
  63. }
  64. data->aiCheckStatus[iSensorType] = RUNNING_SENSOR_STATE;
  65. if (iSensorType == PROXIMITY_SENSOR && !(data->bSspShutdown)) {
  66. proximity_open_lcd_ldi(data);
  67. proximity_open_calibration(data);
  68. input_report_abs(data->prox_input_dev, ABS_DISTANCE, 1);
  69. input_sync(data->prox_input_dev);
  70. }
  71. break;
  72. case RUNNING_SENSOR_STATE:
  73. if (get_msdelay(dTempDelay)
  74. == get_msdelay(data->adDelayBuf[iSensorType]))
  75. break;
  76. pr_info("[SSP]: %s - Change %u, New = %lldns\n",
  77. __func__, 1 << iSensorType, dNewDelay);
  78. uBuf[1] = (u8)get_msdelay(dNewDelay);
  79. uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
  80. send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 2);
  81. break;
  82. default:
  83. break;
  84. /* data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE;*/
  85. }
  86. }
  87. static void change_sensor_delay(struct ssp_data *data,
  88. int iSensorType, int64_t dNewDelay)
  89. {
  90. u8 uBuf[2];
  91. int64_t dTempDelay = data->adDelayBuf[iSensorType];
  92. data->adDelayBuf[iSensorType] = dNewDelay;
  93. switch (data->aiCheckStatus[iSensorType]) {
  94. case RUNNING_SENSOR_STATE:
  95. if (get_msdelay(dTempDelay)
  96. == get_msdelay(data->adDelayBuf[iSensorType]))
  97. break;
  98. pr_info("[SSP]: %s - Change %u, New = %lldns\n",
  99. __func__, 1 << iSensorType, dNewDelay);
  100. uBuf[1] = (u8)get_msdelay(dNewDelay);
  101. uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
  102. send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 2);
  103. break;
  104. default:
  105. break;
  106. }
  107. }
  108. /*************************************************************************/
  109. /* SSP data enable function */
  110. /*************************************************************************/
  111. static int ssp_remove_sensor(struct ssp_data *data,
  112. unsigned int uChangedSensor, unsigned int uNewEnable)
  113. {
  114. u8 uBuf[2];
  115. int64_t dSensorDelay = data->adDelayBuf[uChangedSensor];
  116. ssp_dbg("[SSP]: %s - remove sensor = %d, current state = %d\n",
  117. __func__, (1 << uChangedSensor), uNewEnable);
  118. data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY;
  119. if (uChangedSensor == ORIENTATION_SENSOR) {
  120. if (!(atomic_read(&data->aSensorEnable)
  121. & (1 << ACCELEROMETER_SENSOR))) {
  122. uChangedSensor = ACCELEROMETER_SENSOR;
  123. } else {
  124. change_sensor_delay(data, ACCELEROMETER_SENSOR,
  125. data->adDelayBuf[ACCELEROMETER_SENSOR]);
  126. return 0;
  127. }
  128. } else if (uChangedSensor == ACCELEROMETER_SENSOR) {
  129. if (atomic_read(&data->aSensorEnable)
  130. & (1 << ORIENTATION_SENSOR)) {
  131. change_sensor_delay(data, ORIENTATION_SENSOR,
  132. data->adDelayBuf[ORIENTATION_SENSOR]);
  133. return 0;
  134. }
  135. } else if (uChangedSensor == GEOMAGNETIC_SENSOR) {
  136. if (mag_store_hwoffset(data))
  137. pr_err("mag_store_hwoffset success\n");
  138. }
  139. if (atomic_read(&data->aSensorEnable) & (1 << uChangedSensor)) {
  140. uBuf[1] = (u8)get_msdelay(dSensorDelay);
  141. uBuf[0] = (u8)get_delay_cmd(uBuf[1]);
  142. send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 2);
  143. }
  144. data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE;
  145. return 0;
  146. }
  147. /*************************************************************************/
  148. /* ssp Sysfs */
  149. /*************************************************************************/
  150. static ssize_t show_enable_irq(struct device *dev,
  151. struct device_attribute *attr, char *buf)
  152. {
  153. struct ssp_data *data = dev_get_drvdata(dev);
  154. ssp_dbg("[SSP]: %s - %d\n", __func__, !data->bSspShutdown);
  155. return sprintf(buf, "%d\n", !data->bSspShutdown);
  156. }
  157. static ssize_t set_enable_irq(struct device *dev,
  158. struct device_attribute *attr, const char *buf, size_t size)
  159. {
  160. u8 dTemp;
  161. struct ssp_data *data = dev_get_drvdata(dev);
  162. if (kstrtou8(buf, 10, &dTemp) < 0)
  163. return -1;
  164. pr_info("[SSP] %s - %d start\n", __func__, dTemp);
  165. if (dTemp) {
  166. reset_mcu(data);
  167. enable_debug_timer(data);
  168. } else if (!dTemp) {
  169. disable_debug_timer(data);
  170. ssp_enable(data, 0);
  171. } else
  172. pr_err("[SSP] %s - invalid value\n", __func__);
  173. pr_info("[SSP] %s - %d end\n", __func__, dTemp);
  174. return size;
  175. }
  176. static ssize_t show_sensors_enable(struct device *dev,
  177. struct device_attribute *attr, char *buf)
  178. {
  179. struct ssp_data *data = dev_get_drvdata(dev);
  180. ssp_dbg("[SSP]: %s - cur_enable = %d\n", __func__,
  181. atomic_read(&data->aSensorEnable));
  182. return sprintf(buf, "%9u\n", atomic_read(&data->aSensorEnable));
  183. }
  184. static ssize_t set_sensors_enable(struct device *dev,
  185. struct device_attribute *attr, const char *buf, size_t size)
  186. {
  187. int64_t dTemp;
  188. unsigned int uNewEnable = 0, uChangedSensor = 0;
  189. int iRet;
  190. struct ssp_data *data = dev_get_drvdata(dev);
  191. if (kstrtoll(buf, 10, &dTemp) < 0)
  192. return -EINVAL;
  193. uNewEnable = (unsigned int)dTemp;
  194. ssp_dbg("[SSP]: %s - new_enable = %u, old_enable = %u\n", __func__,
  195. uNewEnable, atomic_read(&data->aSensorEnable));
  196. if (uNewEnable == atomic_read(&data->aSensorEnable))
  197. return size;
  198. for (uChangedSensor = 0; uChangedSensor < SENSOR_MAX; uChangedSensor++) {
  199. if ((atomic_read(&data->aSensorEnable) & (1 << uChangedSensor))
  200. != (uNewEnable & (1 << uChangedSensor))) {
  201. if (!(uNewEnable & (1 << uChangedSensor))) {
  202. ssp_remove_sensor(data, uChangedSensor,
  203. uNewEnable); /* disable */
  204. } else {
  205. if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) {
  206. switch (uChangedSensor) {
  207. case ACCELEROMETER_SENSOR:
  208. accel_open_calibration(data);
  209. break;
  210. case GYROSCOPE_SENSOR:
  211. gyro_open_calibration(data);
  212. break;
  213. case PRESSURE_SENSOR:
  214. pressure_open_calibration(data);
  215. break;
  216. case PROXIMITY_SENSOR:
  217. proximity_open_lcd_ldi(data);
  218. proximity_open_calibration(data);
  219. break;
  220. case GEOMAGNETIC_SENSOR:
  221. iRet = mag_open_hwoffset(data);
  222. if (iRet < 0)
  223. pr_err("[SSP]: %s - mag_open_hw_offset"
  224. " failed, %d\n", __func__, iRet);
  225. iRet = set_hw_offset(data);
  226. if (iRet < 0) {
  227. pr_err("[SSP]: %s - set_hw_offset failed\n",
  228. __func__);
  229. }
  230. break;
  231. default:
  232. break;
  233. }
  234. }
  235. data->aiCheckStatus[uChangedSensor] = ADD_SENSOR_STATE;
  236. enable_sensor(data, uChangedSensor, data->adDelayBuf[uChangedSensor]);
  237. }
  238. break;
  239. }
  240. }
  241. atomic_set(&data->aSensorEnable, uNewEnable);
  242. return size;
  243. }
  244. static ssize_t set_flush(struct device *dev,
  245. struct device_attribute *attr, const char *buf, size_t size)
  246. {
  247. int64_t dTemp;
  248. u8 sensor_type = 0;
  249. struct ssp_data *data = dev_get_drvdata(dev);
  250. if (kstrtoll(buf, 10, &dTemp) < 0)
  251. return -EINVAL;
  252. sensor_type = (u8)dTemp;
  253. input_report_rel(data->meta_input_dev, REL_DIAL, META_DATA_FLUSH_COMPLETE);
  254. input_report_rel(data->meta_input_dev, REL_HWHEEL, sensor_type + 1);
  255. input_sync(data->meta_input_dev);
  256. pr_info("[SSP] flush %d", sensor_type);
  257. return size;
  258. }
  259. static ssize_t show_acc_delay(struct device *dev,
  260. struct device_attribute *attr, char *buf)
  261. {
  262. struct ssp_data *data = dev_get_drvdata(dev);
  263. return sprintf(buf, "%lld\n", data->adDelayBuf[ACCELEROMETER_SENSOR]);
  264. }
  265. static ssize_t set_acc_delay(struct device *dev,
  266. struct device_attribute *attr, const char *buf, size_t size)
  267. {
  268. int64_t dNewDelay;
  269. struct ssp_data *data = dev_get_drvdata(dev);
  270. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  271. return -EINVAL;
  272. if ((atomic_read(&data->aSensorEnable) & (1 << ORIENTATION_SENSOR)) &&
  273. (data->adDelayBuf[ORIENTATION_SENSOR] < dNewDelay))
  274. data->adDelayBuf[ACCELEROMETER_SENSOR] = dNewDelay;
  275. else
  276. change_sensor_delay(data, ACCELEROMETER_SENSOR, dNewDelay);
  277. return size;
  278. }
  279. static ssize_t show_gyro_delay(struct device *dev,
  280. struct device_attribute *attr, char *buf)
  281. {
  282. struct ssp_data *data = dev_get_drvdata(dev);
  283. return sprintf(buf, "%lld\n", data->adDelayBuf[GYROSCOPE_SENSOR]);
  284. }
  285. static ssize_t set_gyro_delay(struct device *dev,
  286. struct device_attribute *attr, const char *buf, size_t size)
  287. {
  288. int64_t dNewDelay;
  289. struct ssp_data *data = dev_get_drvdata(dev);
  290. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  291. return -EINVAL;
  292. change_sensor_delay(data, GYROSCOPE_SENSOR, dNewDelay);
  293. return size;
  294. }
  295. static ssize_t show_mag_delay(struct device *dev,
  296. struct device_attribute *attr, char *buf)
  297. {
  298. struct ssp_data *data = dev_get_drvdata(dev);
  299. return sprintf(buf, "%lld\n", data->adDelayBuf[GEOMAGNETIC_SENSOR]);
  300. }
  301. static ssize_t set_mag_delay(struct device *dev,
  302. struct device_attribute *attr, const char *buf, size_t size)
  303. {
  304. int64_t dNewDelay;
  305. struct ssp_data *data = dev_get_drvdata(dev);
  306. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  307. return -EINVAL;
  308. change_sensor_delay(data, GEOMAGNETIC_SENSOR, dNewDelay);
  309. return size;
  310. }
  311. static ssize_t show_pressure_delay(struct device *dev,
  312. struct device_attribute *attr, char *buf)
  313. {
  314. struct ssp_data *data = dev_get_drvdata(dev);
  315. return sprintf(buf, "%lld\n", data->adDelayBuf[PRESSURE_SENSOR]);
  316. }
  317. static ssize_t set_pressure_delay(struct device *dev,
  318. struct device_attribute *attr, const char *buf, size_t size)
  319. {
  320. int64_t dNewDelay;
  321. struct ssp_data *data = dev_get_drvdata(dev);
  322. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  323. return -EINVAL;
  324. change_sensor_delay(data, PRESSURE_SENSOR, dNewDelay);
  325. return size;
  326. }
  327. static ssize_t show_gesture_delay(struct device *dev,
  328. struct device_attribute *attr, char *buf)
  329. {
  330. struct ssp_data *data = dev_get_drvdata(dev);
  331. return sprintf(buf, "%lld\n", data->adDelayBuf[GESTURE_SENSOR]);
  332. }
  333. static ssize_t set_gesture_delay(struct device *dev,
  334. struct device_attribute *attr, const char *buf, size_t size)
  335. {
  336. int64_t dNewDelay;
  337. struct ssp_data *data = dev_get_drvdata(dev);
  338. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  339. return -EINVAL;
  340. change_sensor_delay(data, GESTURE_SENSOR, dNewDelay);
  341. return size;
  342. }
  343. static ssize_t show_light_delay(struct device *dev,
  344. struct device_attribute *attr, char *buf)
  345. {
  346. struct ssp_data *data = dev_get_drvdata(dev);
  347. return sprintf(buf, "%lld\n", data->adDelayBuf[LIGHT_SENSOR]);
  348. }
  349. static ssize_t set_light_delay(struct device *dev,
  350. struct device_attribute *attr, const char *buf, size_t size)
  351. {
  352. int64_t dNewDelay;
  353. struct ssp_data *data = dev_get_drvdata(dev);
  354. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  355. return -EINVAL;
  356. change_sensor_delay(data, LIGHT_SENSOR, dNewDelay);
  357. return size;
  358. }
  359. static ssize_t show_prox_delay(struct device *dev,
  360. struct device_attribute *attr, char *buf)
  361. {
  362. struct ssp_data *data = dev_get_drvdata(dev);
  363. return sprintf(buf, "%lld\n", data->adDelayBuf[PROXIMITY_SENSOR]);
  364. }
  365. static ssize_t set_prox_delay(struct device *dev,
  366. struct device_attribute *attr, const char *buf, size_t size)
  367. {
  368. int64_t dNewDelay;
  369. struct ssp_data *data = dev_get_drvdata(dev);
  370. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  371. return -EINVAL;
  372. change_sensor_delay(data, PROXIMITY_SENSOR, dNewDelay);
  373. return size;
  374. }
  375. static ssize_t show_temp_humi_delay(struct device *dev,
  376. struct device_attribute *attr, char *buf)
  377. {
  378. struct ssp_data *data = dev_get_drvdata(dev);
  379. return sprintf(buf, "%lld\n",
  380. data->adDelayBuf[TEMPERATURE_HUMIDITY_SENSOR]);
  381. }
  382. static ssize_t set_temp_humi_delay(struct device *dev,
  383. struct device_attribute *attr, const char *buf, size_t size)
  384. {
  385. int64_t dNewDelay;
  386. struct ssp_data *data = dev_get_drvdata(dev);
  387. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  388. return -EINVAL;
  389. change_sensor_delay(data, TEMPERATURE_HUMIDITY_SENSOR, dNewDelay);
  390. return size;
  391. }
  392. static ssize_t show_sig_motion_delay(struct device *dev,
  393. struct device_attribute *attr, char *buf)
  394. {
  395. struct ssp_data *data = dev_get_drvdata(dev);
  396. return sprintf(buf, "%lld\n",
  397. data->adDelayBuf[SIG_MOTION_SENSOR]);
  398. }
  399. static ssize_t set_sig_motion_delay(struct device *dev,
  400. struct device_attribute *attr, const char *buf, size_t size)
  401. {
  402. int64_t dNewDelay;
  403. struct ssp_data *data = dev_get_drvdata(dev);
  404. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  405. return -1;
  406. change_sensor_delay(data, SIG_MOTION_SENSOR, dNewDelay);
  407. return size;
  408. }
  409. static ssize_t show_step_det_delay(struct device *dev,
  410. struct device_attribute *attr, char *buf)
  411. {
  412. struct ssp_data *data = dev_get_drvdata(dev);
  413. return sprintf(buf, "%lld\n",
  414. data->adDelayBuf[STEP_DETECTOR]);
  415. }
  416. static ssize_t set_step_det_delay(struct device *dev,
  417. struct device_attribute *attr, const char *buf, size_t size)
  418. {
  419. int64_t dNewDelay;
  420. struct ssp_data *data = dev_get_drvdata(dev);
  421. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  422. return -1;
  423. change_sensor_delay(data, STEP_DETECTOR, dNewDelay);
  424. return size;
  425. }
  426. static ssize_t show_step_cnt_delay(struct device *dev,
  427. struct device_attribute *attr, char *buf)
  428. {
  429. struct ssp_data *data = dev_get_drvdata(dev);
  430. return sprintf(buf, "%lld\n",
  431. data->adDelayBuf[STEP_COUNTER]);
  432. }
  433. static ssize_t set_step_cnt_delay(struct device *dev,
  434. struct device_attribute *attr, const char *buf, size_t size)
  435. {
  436. int64_t dNewDelay;
  437. struct ssp_data *data = dev_get_drvdata(dev);
  438. if (kstrtoll(buf, 10, &dNewDelay) < 0)
  439. return -1;
  440. change_sensor_delay(data, STEP_COUNTER, dNewDelay);
  441. return size;
  442. }
  443. static DEVICE_ATTR(mcu_rev, S_IRUGO, mcu_revision_show, NULL);
  444. static DEVICE_ATTR(mcu_name, S_IRUGO, mcu_model_name_show, NULL);
  445. static DEVICE_ATTR(mcu_update, S_IRUGO, mcu_update_kernel_bin_show, NULL);
  446. static DEVICE_ATTR(mcu_update2, S_IRUGO,
  447. mcu_update_kernel_crashed_bin_show, NULL);
  448. static DEVICE_ATTR(mcu_update_ums, S_IRUGO, mcu_update_ums_bin_show, NULL);
  449. static DEVICE_ATTR(mcu_reset, S_IRUGO, mcu_reset_show, NULL);
  450. static DEVICE_ATTR(mcu_test, S_IRUGO | S_IWUSR | S_IWGRP,
  451. mcu_factorytest_show, mcu_factorytest_store);
  452. static DEVICE_ATTR(mcu_sleep_test, S_IRUGO | S_IWUSR | S_IWGRP,
  453. mcu_sleep_factorytest_show, mcu_sleep_factorytest_store);
  454. static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP,
  455. show_sensors_enable, set_sensors_enable);
  456. static DEVICE_ATTR(enable_irq, S_IRUGO | S_IWUSR | S_IWGRP,
  457. show_enable_irq, set_enable_irq);
  458. static DEVICE_ATTR(ssp_flush, S_IWUSR | S_IWGRP, NULL, set_flush);
  459. static struct device_attribute dev_attr_accel_poll_delay
  460. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  461. show_acc_delay, set_acc_delay);
  462. static struct device_attribute dev_attr_gyro_poll_delay
  463. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  464. show_gyro_delay, set_gyro_delay);
  465. static struct device_attribute dev_attr_mag_poll_delay
  466. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  467. show_mag_delay, set_mag_delay);
  468. static struct device_attribute dev_attr_pressure_poll_delay
  469. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  470. show_pressure_delay, set_pressure_delay);
  471. static struct device_attribute dev_attr_gesture_poll_delay
  472. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  473. show_gesture_delay, set_gesture_delay);
  474. static struct device_attribute dev_attr_light_poll_delay
  475. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  476. show_light_delay, set_light_delay);
  477. static struct device_attribute dev_attr_prox_poll_delay
  478. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  479. show_prox_delay, set_prox_delay);
  480. static struct device_attribute dev_attr_temp_humi_poll_delay
  481. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  482. show_temp_humi_delay, set_temp_humi_delay);
  483. static struct device_attribute dev_attr_sig_motion_poll_delay
  484. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  485. show_sig_motion_delay, set_sig_motion_delay);
  486. static struct device_attribute dev_attr_step_det_poll_delay
  487. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  488. show_step_det_delay, set_step_det_delay);
  489. static struct device_attribute dev_attr_step_cnt_poll_delay
  490. = __ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP,
  491. show_step_cnt_delay, set_step_cnt_delay);
  492. static struct device_attribute *mcu_attrs[] = {
  493. &dev_attr_enable,
  494. &dev_attr_mcu_rev,
  495. &dev_attr_mcu_name,
  496. &dev_attr_mcu_test,
  497. &dev_attr_mcu_reset,
  498. &dev_attr_mcu_update,
  499. &dev_attr_mcu_update2,
  500. &dev_attr_mcu_update_ums,
  501. &dev_attr_mcu_sleep_test,
  502. &dev_attr_enable_irq,
  503. &dev_attr_ssp_flush,
  504. NULL,
  505. };
  506. static void initialize_mcu_factorytest(struct ssp_data *data)
  507. {
  508. sensors_register(data->mcu_device, data, mcu_attrs, "ssp_sensor");
  509. }
  510. static void remove_mcu_factorytest(struct ssp_data *data)
  511. {
  512. sensors_unregister(data->mcu_device, mcu_attrs);
  513. }
  514. int initialize_sysfs(struct ssp_data *data)
  515. {
  516. if (device_create_file(&data->acc_input_dev->dev,
  517. &dev_attr_accel_poll_delay))
  518. goto err_acc_input_dev;
  519. if (device_create_file(&data->gyro_input_dev->dev,
  520. &dev_attr_gyro_poll_delay))
  521. goto err_gyro_input_dev;
  522. if (device_create_file(&data->pressure_input_dev->dev,
  523. &dev_attr_pressure_poll_delay))
  524. goto err_pressure_input_dev;
  525. if (device_create_file(&data->gesture_input_dev->dev,
  526. &dev_attr_gesture_poll_delay))
  527. goto err_gesture_input_dev;
  528. if (device_create_file(&data->light_input_dev->dev,
  529. &dev_attr_light_poll_delay))
  530. goto err_light_input_dev;
  531. if (device_create_file(&data->prox_input_dev->dev,
  532. &dev_attr_prox_poll_delay))
  533. goto err_prox_input_dev;
  534. if (device_create_file(&data->temp_humi_input_dev->dev,
  535. &dev_attr_temp_humi_poll_delay))
  536. goto err_temp_humi_input_dev;
  537. if (device_create_file(&data->mag_input_dev->dev,
  538. &dev_attr_mag_poll_delay))
  539. goto err_mag_input_dev;
  540. if (device_create_file(&data->sig_motion_input_dev->dev,
  541. &dev_attr_sig_motion_poll_delay))
  542. goto err_sig_motion_input_dev;
  543. if (device_create_file(&data->step_det_input_dev->dev,
  544. &dev_attr_step_det_poll_delay))
  545. goto err_step_det_input_dev;
  546. if (device_create_file(&data->step_cnt_input_dev->dev,
  547. &dev_attr_step_cnt_poll_delay))
  548. goto err_step_cnt_input_dev;
  549. initialize_accel_factorytest(data);
  550. initialize_gyro_factorytest(data);
  551. initialize_prox_factorytest(data);
  552. initialize_light_factorytest(data);
  553. initialize_pressure_factorytest(data);
  554. initialize_magnetic_factorytest(data);
  555. initialize_mcu_factorytest(data);
  556. #ifdef CONFIG_SENSORS_SSP_MAX88920
  557. initialize_gesture_factorytest(data);
  558. #endif
  559. #ifdef CONFIG_SENSORS_SSP_SHTC1
  560. initialize_temphumidity_factorytest(data);
  561. #endif
  562. return SUCCESS;
  563. err_step_cnt_input_dev:
  564. device_remove_file(&data->step_det_input_dev->dev,
  565. &dev_attr_step_det_poll_delay);
  566. err_step_det_input_dev:
  567. device_remove_file(&data->sig_motion_input_dev->dev,
  568. &dev_attr_sig_motion_poll_delay);
  569. err_sig_motion_input_dev:
  570. device_remove_file(&data->mag_input_dev->dev,
  571. &dev_attr_mag_poll_delay);
  572. err_mag_input_dev:
  573. device_remove_file(&data->temp_humi_input_dev->dev,
  574. &dev_attr_temp_humi_poll_delay);
  575. err_temp_humi_input_dev:
  576. device_remove_file(&data->prox_input_dev->dev,
  577. &dev_attr_prox_poll_delay);
  578. err_prox_input_dev:
  579. device_remove_file(&data->light_input_dev->dev,
  580. &dev_attr_light_poll_delay);
  581. err_light_input_dev:
  582. device_remove_file(&data->pressure_input_dev->dev,
  583. &dev_attr_pressure_poll_delay);
  584. err_pressure_input_dev:
  585. device_remove_file(&data->gyro_input_dev->dev,
  586. &dev_attr_gyro_poll_delay);
  587. err_gesture_input_dev:
  588. device_remove_file(&data->gesture_input_dev->dev,
  589. &dev_attr_gesture_poll_delay);
  590. err_gyro_input_dev:
  591. device_remove_file(&data->acc_input_dev->dev,
  592. &dev_attr_accel_poll_delay);
  593. err_acc_input_dev:
  594. return ERROR;
  595. }
  596. void remove_sysfs(struct ssp_data *data)
  597. {
  598. device_remove_file(&data->acc_input_dev->dev,
  599. &dev_attr_accel_poll_delay);
  600. device_remove_file(&data->gyro_input_dev->dev,
  601. &dev_attr_gyro_poll_delay);
  602. device_remove_file(&data->pressure_input_dev->dev,
  603. &dev_attr_pressure_poll_delay);
  604. device_remove_file(&data->gesture_input_dev->dev,
  605. &dev_attr_gesture_poll_delay);
  606. device_remove_file(&data->light_input_dev->dev,
  607. &dev_attr_light_poll_delay);
  608. device_remove_file(&data->prox_input_dev->dev,
  609. &dev_attr_prox_poll_delay);
  610. device_remove_file(&data->temp_humi_input_dev->dev,
  611. &dev_attr_temp_humi_poll_delay);
  612. device_remove_file(&data->mag_input_dev->dev,
  613. &dev_attr_mag_poll_delay);
  614. device_remove_file(&data->sig_motion_input_dev->dev,
  615. &dev_attr_sig_motion_poll_delay);
  616. device_remove_file(&data->step_det_input_dev->dev,
  617. &dev_attr_step_det_poll_delay);
  618. device_remove_file(&data->step_cnt_input_dev->dev,
  619. &dev_attr_step_cnt_poll_delay);
  620. remove_accel_factorytest(data);
  621. remove_gyro_factorytest(data);
  622. remove_prox_factorytest(data);
  623. remove_light_factorytest(data);
  624. remove_pressure_factorytest(data);
  625. remove_magnetic_factorytest(data);
  626. remove_mcu_factorytest(data);
  627. #ifdef CONFIG_SENSORS_SSP_MAX88920
  628. remove_gesture_factorytest(data);
  629. #endif
  630. #ifdef CONFIG_SENSORS_SSP_SHTC1
  631. remove_temphumidity_factorytest(data);
  632. #endif
  633. destroy_sensor_class();
  634. }