pedometer.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. #include "pedometer.h"
  2. struct pdr_context *pdr_context_obj = NULL;
  3. static struct pdr_init_info *pedometer_init_list[MAX_CHOOSE_PDR_NUM] = { 0 }; /* modified */
  4. static void pdr_early_suspend(struct early_suspend *h);
  5. static void pdr_late_resume(struct early_suspend *h);
  6. static void pdr_work_func(struct work_struct *work)
  7. {
  8. struct pdr_context *cxt = NULL;
  9. /* int out_size; */
  10. /* hwm_sensor_data sensor_data; */
  11. /* u64 data64[6]; //for unify get_data parameter type */
  12. u32 data32[6]; /* for hwm_sensor_data.values as int */
  13. /* u64 data[4]; */
  14. int status;
  15. int64_t nt;
  16. struct timespec time;
  17. int err = 0;
  18. cxt = pdr_context_obj;
  19. if (NULL == cxt->pdr_data.get_data)
  20. PDR_ERR("pdr driver not register data path\n");
  21. time.tv_sec = time.tv_nsec = 0;
  22. time = get_monotonic_coarse();
  23. nt = time.tv_sec * 1000000000LL + time.tv_nsec;
  24. /* add wake lock to make sure data can be read before system suspend */
  25. /* initial data */
  26. /* data[0] = cxt->drv_data.pdr_data.values[0]; */
  27. /* data[1] = cxt->drv_data.pdr_data.values[1]; */
  28. /* data[2] = cxt->drv_data.pdr_data.values[2]; */
  29. /* data[3] = cxt->drv_data.pdr_data.values[3]; */
  30. err = cxt->pdr_data.get_data(data32, &status);
  31. PDR_LOG("pdr get_data %d,%d,%d %d\n", data32[0], data32[1], data32[2], data32[3]);
  32. if (err) {
  33. PDR_ERR("get pdr data fails!!\n");
  34. goto pdr_loop;
  35. } else {
  36. if ((data32[0] == cxt->drv_data.pdr_data.values[0])
  37. && (data32[1] == cxt->drv_data.pdr_data.values[1])
  38. && (data32[2] == cxt->drv_data.pdr_data.values[2])
  39. && (data32[3] == cxt->drv_data.pdr_data.values[3])) {
  40. goto pdr_loop;
  41. } else {
  42. cxt->drv_data.pdr_data.values[0] = data32[0];
  43. cxt->drv_data.pdr_data.values[1] = data32[1];
  44. cxt->drv_data.pdr_data.values[2] = data32[2];
  45. cxt->drv_data.pdr_data.values[3] = data32[3];
  46. PDR_LOG("pdr values %d,%d,%d,%d\n",
  47. cxt->drv_data.pdr_data.values[0],
  48. cxt->drv_data.pdr_data.values[1],
  49. cxt->drv_data.pdr_data.values[2], cxt->drv_data.pdr_data.values[3]);
  50. cxt->drv_data.pdr_data.status = status;
  51. cxt->drv_data.pdr_data.time = nt;
  52. }
  53. }
  54. if (true == cxt->is_first_data_after_enable) {
  55. cxt->is_first_data_after_enable = false;
  56. /* filter -1 value */
  57. if (PDR_INVALID_VALUE == cxt->drv_data.pdr_data.values[0] ||
  58. PDR_INVALID_VALUE == cxt->drv_data.pdr_data.values[1] ||
  59. PDR_INVALID_VALUE == cxt->drv_data.pdr_data.values[2] ||
  60. PDR_INVALID_VALUE == cxt->drv_data.pdr_data.values[3]) {
  61. PDR_LOG(" read invalid data\n");
  62. goto pdr_loop;
  63. }
  64. }
  65. /* report data to input device */
  66. /* printk("new pdr work run....\n"); */
  67. PDR_LOG("pdr data %d,%d,%d %d\n", cxt->drv_data.pdr_data.values[0],
  68. cxt->drv_data.pdr_data.values[1], cxt->drv_data.pdr_data.values[2],
  69. cxt->drv_data.pdr_data.values[3]);
  70. pdr_data_report(cxt->drv_data.pdr_data, cxt->drv_data.pdr_data.status);
  71. pdr_loop:
  72. if (true == cxt->is_polling_run)
  73. mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay) / (1000 / HZ));
  74. }
  75. static void pdr_poll(unsigned long data)
  76. {
  77. struct pdr_context *obj = (struct pdr_context *)data;
  78. if (obj != NULL)
  79. schedule_work(&obj->report);
  80. }
  81. static struct pdr_context *pdr_context_alloc_object(void)
  82. {
  83. struct pdr_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  84. PDR_LOG("pdr_context_alloc_object++++\n");
  85. if (!obj) {
  86. PDR_ERR("Alloc pdr object error!\n");
  87. return NULL;
  88. }
  89. atomic_set(&obj->delay, 200); /*5Hz set work queue delay time 200ms */
  90. atomic_set(&obj->wake, 0);
  91. INIT_WORK(&obj->report, pdr_work_func);
  92. init_timer(&obj->timer);
  93. obj->timer.expires = jiffies + atomic_read(&obj->delay) / (1000 / HZ);
  94. obj->timer.function = pdr_poll;
  95. obj->timer.data = (unsigned long)obj;
  96. obj->is_first_data_after_enable = false;
  97. obj->is_polling_run = false;
  98. obj->is_batch_enable = false;
  99. mutex_init(&obj->pdr_op_mutex);
  100. PDR_LOG("pdr_context_alloc_object----\n");
  101. return obj;
  102. }
  103. static int pdr_real_enable(int enable)
  104. {
  105. int err = 0;
  106. struct pdr_context *cxt = NULL;
  107. cxt = pdr_context_obj;
  108. if (1 == enable) {
  109. if (true == cxt->is_active_data || true == cxt->is_active_nodata) {
  110. err = cxt->pdr_ctl.enable_nodata(1);
  111. if (err) {
  112. err = cxt->pdr_ctl.enable_nodata(1);
  113. if (err) {
  114. err = cxt->pdr_ctl.enable_nodata(1);
  115. if (err)
  116. PDR_ERR("pdr enable(%d) err 3 timers = %d\n",
  117. enable, err);
  118. }
  119. }
  120. PDR_LOG("pdr real enable\n");
  121. }
  122. }
  123. if (0 == enable) {
  124. if (false == cxt->is_active_data && false == cxt->is_active_nodata) {
  125. err = cxt->pdr_ctl.enable_nodata(0);
  126. if (err)
  127. PDR_ERR("pdr enable(%d) err = %d\n", enable, err);
  128. PDR_LOG("pdr real disable\n");
  129. }
  130. }
  131. return err;
  132. }
  133. static int pdr_enable_data(int enable)
  134. {
  135. struct pdr_context *cxt = NULL;
  136. cxt = pdr_context_obj;
  137. if (NULL == cxt->pdr_ctl.open_report_data) {
  138. PDR_ERR("no pdr control path\n");
  139. return -1;
  140. }
  141. if (1 == enable) {
  142. PDR_LOG("pdr enable data\n");
  143. cxt->is_active_data = true;
  144. cxt->is_first_data_after_enable = true;
  145. cxt->pdr_ctl.open_report_data(1);
  146. if (false == cxt->is_polling_run && cxt->is_batch_enable == false) {
  147. if (false == cxt->pdr_ctl.is_report_input_direct) {
  148. mod_timer(&cxt->timer,
  149. jiffies + atomic_read(&cxt->delay) / (1000 / HZ));
  150. cxt->is_polling_run = true;
  151. }
  152. }
  153. }
  154. if (0 == enable) {
  155. PDR_LOG("pdr disable\n");
  156. cxt->is_active_data = false;
  157. cxt->pdr_ctl.open_report_data(0);
  158. if (true == cxt->is_polling_run) {
  159. if (false == cxt->pdr_ctl.is_report_input_direct) {
  160. cxt->is_polling_run = false;
  161. del_timer_sync(&cxt->timer);
  162. cancel_work_sync(&cxt->report);
  163. cxt->drv_data.pdr_data.values[0] = PDR_INVALID_VALUE;
  164. cxt->drv_data.pdr_data.values[1] = PDR_INVALID_VALUE;
  165. cxt->drv_data.pdr_data.values[2] = PDR_INVALID_VALUE;
  166. cxt->drv_data.pdr_data.values[3] = PDR_INVALID_VALUE;
  167. }
  168. }
  169. }
  170. pdr_real_enable(enable);
  171. return 0;
  172. }
  173. int pdr_enable_nodata(int enable)
  174. {
  175. struct pdr_context *cxt = NULL;
  176. cxt = pdr_context_obj;
  177. if (NULL == cxt->pdr_ctl.enable_nodata) {
  178. PDR_ERR("pdr_enable_nodata:pdr ctl path is NULL\n");
  179. return -1;
  180. }
  181. if (1 == enable)
  182. cxt->is_active_nodata = true;
  183. if (0 == enable)
  184. cxt->is_active_nodata = false;
  185. pdr_real_enable(enable);
  186. return 0;
  187. }
  188. static ssize_t pdr_show_enable_nodata(struct device *dev, struct device_attribute *attr, char *buf)
  189. {
  190. int len = 0;
  191. PDR_LOG(" not support now\n");
  192. return len;
  193. }
  194. static ssize_t pdr_store_enable_nodata(struct device *dev, struct device_attribute *attr,
  195. const char *buf, size_t count)
  196. {
  197. struct pdr_context *cxt = NULL;
  198. /* int err =0; */
  199. PDR_LOG("pdr_store_enable nodata buf=%s\n", buf);
  200. mutex_lock(&pdr_context_obj->pdr_op_mutex);
  201. cxt = pdr_context_obj;
  202. if (NULL == cxt->pdr_ctl.enable_nodata) {
  203. PDR_LOG("pdr_ctl enable nodata NULL\n");
  204. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  205. return count;
  206. }
  207. if (!strncmp(buf, "1", 1))
  208. pdr_enable_nodata(1);
  209. else if (!strncmp(buf, "0", 1))
  210. pdr_enable_nodata(0);
  211. else
  212. PDR_ERR(" pdr_store enable nodata cmd error !!\n");
  213. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  214. return count;
  215. }
  216. static ssize_t pdr_store_active(struct device *dev, struct device_attribute *attr,
  217. const char *buf, size_t count)
  218. {
  219. struct pdr_context *cxt = NULL;
  220. PDR_LOG("pdr_store_active buf=%s\n", buf);
  221. mutex_lock(&pdr_context_obj->pdr_op_mutex);
  222. cxt = pdr_context_obj;
  223. if (NULL == cxt->pdr_ctl.open_report_data) {
  224. PDR_LOG("pdr_ctl enable NULL\n");
  225. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  226. return count;
  227. }
  228. if (!strncmp(buf, "1", 1))
  229. pdr_enable_data(1);
  230. else if (!strncmp(buf, "0", 1))
  231. pdr_enable_data(0);
  232. else
  233. PDR_ERR(" pdr_store_active error !!\n");
  234. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  235. PDR_LOG(" pdr_store_active done\n");
  236. return count;
  237. }
  238. /*----------------------------------------------------------------------------*/
  239. static ssize_t pdr_show_active(struct device *dev, struct device_attribute *attr, char *buf)
  240. {
  241. struct pdr_context *cxt = NULL;
  242. int div = 0;
  243. cxt = pdr_context_obj;
  244. /* int len = 0; */
  245. PDR_LOG("pdr show active not support now\n");
  246. /* div=cxt->pdr_data.vender_div; */
  247. PDR_LOG("pdr vender_div value: %d\n", div);
  248. return snprintf(buf, PAGE_SIZE, "%d\n", div);
  249. /* return len; */
  250. }
  251. static ssize_t pdr_store_delay(struct device *dev, struct device_attribute *attr,
  252. const char *buf, size_t count)
  253. {
  254. /* struct pdr_context *devobj = (struct pdr_context*)dev_get_drvdata(dev); */
  255. int delay;
  256. int mdelay = 0;
  257. struct pdr_context *cxt = NULL;
  258. int err = 0;
  259. mutex_lock(&pdr_context_obj->pdr_op_mutex);
  260. cxt = pdr_context_obj;
  261. if (NULL == cxt->pdr_ctl.set_delay) {
  262. PDR_LOG("pdr_ctl set_delay NULL\n");
  263. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  264. return count;
  265. }
  266. err = kstrtoint(buf, 10, &delay);
  267. if (err != 0) {
  268. PDR_ERR("invalid format!!\n");
  269. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  270. return count;
  271. }
  272. if (false == cxt->pdr_ctl.is_report_input_direct) {
  273. mdelay = (int)delay / 1000 / 1000;
  274. atomic_set(&pdr_context_obj->delay, mdelay);
  275. }
  276. cxt->pdr_ctl.set_delay(delay);
  277. PDR_LOG(" pdr_delay %d ns\n", delay);
  278. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  279. return count;
  280. }
  281. static ssize_t pdr_show_delay(struct device *dev, struct device_attribute *attr, char *buf)
  282. {
  283. int len = 0;
  284. PDR_LOG(" not support now\n");
  285. return len;
  286. }
  287. static ssize_t pdr_store_batch(struct device *dev, struct device_attribute *attr,
  288. const char *buf, size_t count)
  289. {
  290. struct pdr_context *cxt = NULL;
  291. /* int err =0; */
  292. PDR_LOG("pdr_store_batch buf=%s\n", buf);
  293. mutex_lock(&pdr_context_obj->pdr_op_mutex);
  294. cxt = pdr_context_obj;
  295. if (cxt->pdr_ctl.is_support_batch) {
  296. if (!strncmp(buf, "1", 1))
  297. cxt->is_batch_enable = true;
  298. else if (!strncmp(buf, "0", 1))
  299. cxt->is_batch_enable = false;
  300. else
  301. PDR_ERR(" pdr_store_batch error !!\n");
  302. } else {
  303. PDR_LOG(" pdr_store_batch not support\n");
  304. }
  305. mutex_unlock(&pdr_context_obj->pdr_op_mutex);
  306. PDR_LOG(" pdr_store_batch done: %d\n", cxt->is_batch_enable);
  307. return count;
  308. }
  309. static ssize_t pdr_show_batch(struct device *dev, struct device_attribute *attr, char *buf)
  310. {
  311. return snprintf(buf, PAGE_SIZE, "%d\n", 0);
  312. }
  313. static ssize_t pdr_store_flush(struct device *dev, struct device_attribute *attr,
  314. const char *buf, size_t count)
  315. {
  316. /* mutex_lock(&pdr_context_obj->pdr_op_mutex); */
  317. /* struct pdr_context *devobj = (struct pdr_context*)dev_get_drvdata(dev); */
  318. /* do read FIFO data function and report data immediately */
  319. /* mutex_unlock(&pdr_context_obj->pdr_op_mutex); */
  320. return count;
  321. }
  322. static ssize_t pdr_show_flush(struct device *dev, struct device_attribute *attr, char *buf)
  323. {
  324. return snprintf(buf, PAGE_SIZE, "%d\n", 0);
  325. }
  326. static ssize_t pdr_show_devnum(struct device *dev, struct device_attribute *attr, char *buf)
  327. {
  328. const char *devname = NULL;
  329. devname = dev_name(&pdr_context_obj->idev->dev);
  330. return snprintf(buf, PAGE_SIZE, "%s\n", devname + 5);
  331. }
  332. static int pedometer_remove(struct platform_device *pdev)
  333. {
  334. PDR_LOG("pedometer_remove\n");
  335. return 0;
  336. }
  337. static int pedometer_probe(struct platform_device *pdev)
  338. {
  339. PDR_LOG("pedometer_probe\n");
  340. return 0;
  341. }
  342. #ifdef CONFIG_OF
  343. static const struct of_device_id pedometer_of_match[] = {
  344. {.compatible = "mediatek,pedometer",},
  345. {},
  346. };
  347. #endif
  348. static struct platform_driver pedometer_driver = {
  349. .probe = pedometer_probe,
  350. .remove = pedometer_remove,
  351. .driver = {
  352. .name = "pedometer",
  353. #ifdef CONFIG_OF
  354. .of_match_table = pedometer_of_match,
  355. #endif
  356. }
  357. };
  358. static int pdr_real_driver_init(void)
  359. {
  360. int i = 0;
  361. int err = 0;
  362. PDR_LOG(" pdr_real_driver_init +\n");
  363. for (i = 0; i < MAX_CHOOSE_PDR_NUM; i++) {
  364. PDR_LOG(" i=%d\n", i);
  365. if (0 != pedometer_init_list[i]) {
  366. PDR_LOG(" pdr try to init driver %s\n", pedometer_init_list[i]->name);
  367. err = pedometer_init_list[i]->init();
  368. if (0 == err) {
  369. PDR_LOG(" pdr real driver %s probe ok\n",
  370. pedometer_init_list[i]->name);
  371. break;
  372. }
  373. }
  374. }
  375. if (i == MAX_CHOOSE_PDR_NUM) {
  376. PDR_LOG(" pdr_real_driver_init fail\n");
  377. err = -1;
  378. }
  379. return err;
  380. }
  381. int pdr_driver_add(struct pdr_init_info *obj)
  382. {
  383. int err = 0;
  384. int i = 0;
  385. PDR_FUN(f);
  386. for (i = 0; i < MAX_CHOOSE_PDR_NUM; i++) {
  387. if (i == 0) {
  388. PDR_LOG("register pdr driver for the first time\n");
  389. if (platform_driver_register(&pedometer_driver))
  390. PDR_ERR("failed to register pdr driver already exist\n");
  391. }
  392. if (NULL == pedometer_init_list[i]) {
  393. obj->platform_diver_addr = &pedometer_driver;
  394. pedometer_init_list[i] = obj;
  395. break;
  396. }
  397. }
  398. if (NULL == pedometer_init_list[i]) {
  399. PDR_ERR("pdr driver add err\n");
  400. err = -1;
  401. }
  402. return err;
  403. } EXPORT_SYMBOL_GPL(pdr_driver_add);
  404. static int pdr_misc_init(struct pdr_context *cxt)
  405. {
  406. int err = 0;
  407. /* kernel-3.10\include\linux\Miscdevice.h */
  408. /* use MISC_DYNAMIC_MINOR exceed 64 */
  409. cxt->mdev.minor = M_PDR_MISC_MINOR;
  410. cxt->mdev.name = PDR_MISC_DEV_NAME;
  411. err = misc_register(&cxt->mdev);
  412. if (err)
  413. PDR_ERR("unable to register pdr misc device!!\n");
  414. return err;
  415. }
  416. static void pdr_input_destroy(struct pdr_context *cxt)
  417. {
  418. struct input_dev *dev = cxt->idev;
  419. input_unregister_device(dev);
  420. input_free_device(dev);
  421. }
  422. static int pdr_input_init(struct pdr_context *cxt)
  423. {
  424. struct input_dev *dev;
  425. int err = 0;
  426. dev = input_allocate_device();
  427. if (NULL == dev)
  428. return -ENOMEM;
  429. dev->name = PDR_INPUTDEV_NAME;
  430. input_set_capability(dev, EV_ABS, EVENT_TYPE_PDR_LENGTH);
  431. input_set_capability(dev, EV_ABS, EVENT_TYPE_PDR_FREQUENCY);
  432. input_set_capability(dev, EV_ABS, EVENT_TYPE_PDR_COUNT);
  433. input_set_capability(dev, EV_ABS, EVENT_TYPE_PDR_DISTANCE);
  434. input_set_capability(dev, EV_ABS, EVENT_TYPE_PDR_STATUS);
  435. input_set_abs_params(dev, EVENT_TYPE_PDR_LENGTH, PDR_VALUE_MIN, PDR_VALUE_MAX, 0, 0);
  436. input_set_abs_params(dev, EVENT_TYPE_PDR_FREQUENCY, PDR_VALUE_MIN, PDR_VALUE_MAX, 0, 0);
  437. input_set_abs_params(dev, EVENT_TYPE_PDR_COUNT, PDR_VALUE_MIN, PDR_VALUE_MAX, 0, 0);
  438. input_set_abs_params(dev, EVENT_TYPE_PDR_DISTANCE, PDR_VALUE_MIN, PDR_VALUE_MAX, 0, 0);
  439. input_set_abs_params(dev, EVENT_TYPE_PDR_STATUS, PDR_STATUS_MIN, PDR_STATUS_MAX, 0, 0);
  440. input_set_drvdata(dev, cxt);
  441. err = input_register_device(dev);
  442. if (err < 0) {
  443. input_free_device(dev);
  444. return err;
  445. }
  446. cxt->idev = dev;
  447. return 0;
  448. }
  449. DEVICE_ATTR(pdrenablenodata, S_IWUSR | S_IRUGO, pdr_show_enable_nodata, pdr_store_enable_nodata);
  450. DEVICE_ATTR(pdractive, S_IWUSR | S_IRUGO, pdr_show_active, pdr_store_active);
  451. DEVICE_ATTR(pdrdelay, S_IWUSR | S_IRUGO, pdr_show_delay, pdr_store_delay);
  452. DEVICE_ATTR(pdrbatch, S_IWUSR | S_IRUGO, pdr_show_batch, pdr_store_batch);
  453. DEVICE_ATTR(pdrflush, S_IWUSR | S_IRUGO, pdr_show_flush, pdr_store_flush);
  454. DEVICE_ATTR(pdrdevnum, S_IWUSR | S_IRUGO, pdr_show_devnum, NULL);
  455. static struct attribute *pdr_attributes[] = {
  456. &dev_attr_pdrenablenodata.attr,
  457. &dev_attr_pdractive.attr,
  458. &dev_attr_pdrdelay.attr,
  459. &dev_attr_pdrbatch.attr,
  460. &dev_attr_pdrflush.attr,
  461. &dev_attr_pdrdevnum.attr,
  462. NULL
  463. };
  464. static struct attribute_group pdr_attribute_group = {
  465. .attrs = pdr_attributes
  466. };
  467. int pdr_register_data_path(struct pdr_data_path *data)
  468. {
  469. struct pdr_context *cxt = NULL;
  470. /* int err =0; */
  471. cxt = pdr_context_obj;
  472. cxt->pdr_data.get_data = data->get_data;
  473. /* cxt->pdr_data.vender_div = data->vender_div; */
  474. /* cxt->pdr_data.get_raw_data = data->get_raw_data; */
  475. /* PDR_LOG("pdr register data path vender_div: %d\n", cxt->pdr_data.vender_div); */
  476. if (NULL == cxt->pdr_data.get_data) {
  477. PDR_LOG("pdr register data path fail\n");
  478. return -1;
  479. }
  480. return 0;
  481. }
  482. int pdr_register_control_path(struct pdr_control_path *ctl)
  483. {
  484. struct pdr_context *cxt = NULL;
  485. int err = 0;
  486. cxt = pdr_context_obj;
  487. cxt->pdr_ctl.set_delay = ctl->set_delay;
  488. cxt->pdr_ctl.open_report_data = ctl->open_report_data;
  489. cxt->pdr_ctl.enable_nodata = ctl->enable_nodata;
  490. cxt->pdr_ctl.is_support_batch = ctl->is_support_batch;
  491. if (NULL == cxt->pdr_ctl.set_delay || NULL == cxt->pdr_ctl.open_report_data
  492. || NULL == cxt->pdr_ctl.enable_nodata) {
  493. PDR_LOG("pdr register control path fail\n");
  494. return -1;
  495. }
  496. /* add misc dev for sensor hal control cmd */
  497. err = pdr_misc_init(pdr_context_obj);
  498. if (err) {
  499. PDR_ERR("unable to register pdr misc device!!\n");
  500. return -2;
  501. }
  502. err = sysfs_create_group(&pdr_context_obj->mdev.this_device->kobj, &pdr_attribute_group);
  503. if (err < 0) {
  504. PDR_ERR("unable to create pdr attribute file\n");
  505. return -3;
  506. }
  507. kobject_uevent(&pdr_context_obj->mdev.this_device->kobj, KOBJ_ADD);
  508. return 0;
  509. }
  510. int pdr_data_report(hwm_sensor_data data, int status)
  511. {
  512. struct pdr_context *cxt = NULL;
  513. int err = 0;
  514. PDR_LOG("+pdr_data_report! %d, %d, %d, %d\n", data.values[0], data.values[1],
  515. data.values[2], data.values[3]);
  516. cxt = pdr_context_obj;
  517. input_report_abs(cxt->idev, EVENT_TYPE_PDR_LENGTH, data.values[0]);
  518. input_report_abs(cxt->idev, EVENT_TYPE_PDR_FREQUENCY, data.values[1]);
  519. input_report_abs(cxt->idev, EVENT_TYPE_PDR_COUNT, data.values[2]);
  520. input_report_abs(cxt->idev, EVENT_TYPE_PDR_DISTANCE, data.values[3]);
  521. input_report_abs(cxt->idev, EVENT_TYPE_PDR_STATUS, status);
  522. input_sync(cxt->idev);
  523. return err;
  524. }
  525. static int pdr_probe(struct platform_device *pdev)
  526. {
  527. int err;
  528. PDR_LOG("+++++++++++++pdr_probe!!\n");
  529. pdr_context_obj = pdr_context_alloc_object();
  530. if (!pdr_context_obj) {
  531. err = -ENOMEM;
  532. PDR_ERR("unable to allocate devobj!\n");
  533. goto exit_alloc_data_failed;
  534. }
  535. /* init real pdreleration driver */
  536. err = pdr_real_driver_init();
  537. if (err) {
  538. PDR_ERR("pdr real driver init fail\n");
  539. goto real_driver_init_fail;
  540. }
  541. /* err = pdr_factory_device_init(); */
  542. /* if(err) */
  543. /* { */
  544. /* PDR_ERR("pdr_factory_device_init fail\n"); */
  545. /* } */
  546. /* init input dev */
  547. err = pdr_input_init(pdr_context_obj);
  548. if (err) {
  549. PDR_ERR("unable to register pdr input device!\n");
  550. goto exit_alloc_input_dev_failed;
  551. }
  552. #if defined(CONFIG_HAS_EARLYSUSPEND) && defined(CONFIG_EARLYSUSPEND)
  553. atomic_set(&(pdr_context_obj->early_suspend), 0);
  554. pdr_context_obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1,
  555. pdr_context_obj->early_drv.suspend = pdr_early_suspend,
  556. pdr_context_obj->early_drv.resume = pdr_late_resume,
  557. register_early_suspend(&pdr_context_obj->early_drv);
  558. #endif /* #if defined(CONFIG_HAS_EARLYSUSPEND) && defined(CONFIG_EARLYSUSPEND) */
  559. PDR_LOG("----pdr_probe OK !!\n");
  560. return 0;
  561. /* exit_hwmsen_create_attr_failed: */
  562. /* exit_misc_register_failed: */
  563. /* exit_err_sysfs: */
  564. if (err) {
  565. PDR_ERR("sysfs node creation error\n");
  566. pdr_input_destroy(pdr_context_obj);
  567. }
  568. real_driver_init_fail:
  569. exit_alloc_input_dev_failed:
  570. kfree(pdr_context_obj);
  571. exit_alloc_data_failed:
  572. PDR_LOG("----pdr_probe fail !!!\n");
  573. return err;
  574. }
  575. static int pdr_remove(struct platform_device *pdev)
  576. {
  577. int err = 0;
  578. PDR_FUN(f);
  579. input_unregister_device(pdr_context_obj->idev);
  580. sysfs_remove_group(&pdr_context_obj->idev->dev.kobj, &pdr_attribute_group);
  581. err = misc_deregister(&pdr_context_obj->mdev);
  582. if (err)
  583. PDR_ERR("misc_deregister fail: %d\n", err);
  584. kfree(pdr_context_obj);
  585. return 0;
  586. }
  587. static void pdr_early_suspend(struct early_suspend *h)
  588. {
  589. atomic_set(&(pdr_context_obj->early_suspend), 1);
  590. PDR_LOG(" pdr_early_suspend ok------->hwm_obj->early_suspend=%d\n",
  591. atomic_read(&(pdr_context_obj->early_suspend)));
  592. }
  593. /*----------------------------------------------------------------------------*/
  594. static void pdr_late_resume(struct early_suspend *h)
  595. {
  596. atomic_set(&(pdr_context_obj->early_suspend), 0);
  597. PDR_LOG(" pdr_late_resume ok------->hwm_obj->early_suspend=%d\n",
  598. atomic_read(&(pdr_context_obj->early_suspend)));
  599. }
  600. static int pdr_suspend(struct platform_device *dev, pm_message_t state)
  601. {
  602. return 0;
  603. }
  604. /*----------------------------------------------------------------------------*/
  605. static int pdr_resume(struct platform_device *dev)
  606. {
  607. return 0;
  608. }
  609. #ifdef CONFIG_OF
  610. static const struct of_device_id m_pdr_pl_of_match[] = {
  611. {.compatible = "mediatek,m_pdr_pl",},
  612. {},
  613. };
  614. #endif
  615. static struct platform_driver pdr_driver = {
  616. .probe = pdr_probe,
  617. .remove = pdr_remove,
  618. .suspend = pdr_suspend,
  619. .resume = pdr_resume,
  620. .driver = {
  621. .name = PDR_PL_DEV_NAME, /* mt_pdr_pl */
  622. #ifdef CONFIG_OF
  623. .of_match_table = m_pdr_pl_of_match,
  624. #endif
  625. }
  626. };
  627. static int __init pdr_init(void)
  628. {
  629. PDR_FUN(f);
  630. if (platform_driver_register(&pdr_driver)) {
  631. PDR_ERR("failed to register pdr driver\n");
  632. return -ENODEV;
  633. }
  634. return 0;
  635. }
  636. static void __exit pdr_exit(void)
  637. {
  638. platform_driver_unregister(&pdr_driver);
  639. platform_driver_unregister(&pedometer_driver);
  640. }
  641. late_initcall(pdr_init);
  642. /* module_init(pdr_init); */
  643. /* module_exit(pdr_exit); */
  644. MODULE_LICENSE("GPL");
  645. MODULE_DESCRIPTION("PEDOMETER device driver");
  646. MODULE_AUTHOR("Mediatek");