fpc1020_main.c 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131
  1. /* FPC1020 Touch sensor driver
  2. *
  3. * Copyright (c) 2013,2014 Fingerprint Cards AB <tech@fingerprints.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License Version 2
  7. * as published by the Free Software Foundation.
  8. */
  9. #define DEBUG
  10. #include <linux/init.h>
  11. #include <linux/module.h>
  12. #include <linux/kernel.h>
  13. #include <linux/spi/spi.h>
  14. #include <linux/fs.h>
  15. #include <linux/cdev.h>
  16. #include <linux/gpio.h>
  17. #include <linux/delay.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/wait.h>
  20. #include <linux/kthread.h>
  21. #include <linux/poll.h>
  22. #include <linux/types.h>
  23. /*MTK header*/
  24. #include <mach/mt_spi.h>
  25. /* #include <mach/mt_gpio.h> */
  26. #ifndef CONFIG_OF
  27. #include <linux/spi/fpc1020.h>
  28. #include <linux/spi/fpc1020_common.h>
  29. #include <linux/spi/fpc1020_regs.h>
  30. #include <linux/spi/fpc1020_input.h>
  31. #include <linux/spi/fpc1020_capture.h>
  32. #include <linux/spi/fpc1020_regulator.h>
  33. #else
  34. #include <linux/of.h>
  35. #include <linux/of_irq.h>
  36. #include "fpc1020.h"
  37. #include "fpc1020_common.h"
  38. #include "fpc1020_regs.h"
  39. #include "fpc1020_input.h"
  40. #include "fpc1020_capture.h"
  41. #include "fpc1020_regulator.h"
  42. #endif
  43. MODULE_LICENSE("GPL");
  44. MODULE_AUTHOR("Fingerprint Cards AB <tech@fingerprints.com>");
  45. MODULE_DESCRIPTION("FPC1020 touch sensor driver.");
  46. /* -------------------------------------------------------------------- */
  47. /* fpc1020 sensor commands and registers */
  48. /* -------------------------------------------------------------------- */
  49. typedef enum {
  50. FPC_1020_ERROR_REG_BIT_FIFO_UNDERFLOW = 1 << 0
  51. } fpc1020_error_reg_t;
  52. /* -------------------------------------------------------------------- */
  53. /* global variables */
  54. /* -------------------------------------------------------------------- */
  55. static int fpc1020_device_count;
  56. static struct mt_chip_conf spi_conf;
  57. /* -------------------------------------------------------------------- */
  58. /* fpc1020 data types */
  59. /* -------------------------------------------------------------------- */
  60. struct fpc1020_attribute {
  61. struct device_attribute attr;
  62. size_t offset;
  63. };
  64. enum {
  65. FPC1020_WORKER_IDLE_MODE = 0,
  66. FPC1020_WORKER_CAPTURE_MODE,
  67. FPC1020_WORKER_INPUT_MODE,
  68. FPC1020_WORKER_EXIT
  69. };
  70. static struct pinctrl *fpc_pinctrl;
  71. static struct pinctrl_state *fpc_pin_default;
  72. /* -------------------------------------------------------------------- */
  73. /* fpc1020 driver constants */
  74. /* -------------------------------------------------------------------- */
  75. #define FPC1020_CLASS_NAME "fpsensor"
  76. #define FPC1020_WORKER_THREAD_NAME "fpc1020_worker"
  77. /* -------------------------------------------------------------------- */
  78. /* function prototypes */
  79. /* -------------------------------------------------------------------- */
  80. static int __init fpc1020_init(void);
  81. static void __exit fpc1020_exit(void);
  82. static int fpc1020_probe(struct spi_device *spi);
  83. static int fpc1020_remove(struct spi_device *spi);
  84. static int fpc1020_suspend(struct device *dev);
  85. static int fpc1020_resume(struct device *dev);
  86. static int fpc1020_open(struct inode *inode, struct file *file);
  87. static ssize_t fpc1020_write(struct file *file, const char *buff,
  88. size_t count, loff_t *ppos);
  89. static ssize_t fpc1020_read(struct file *file, char *buff,
  90. size_t count, loff_t *ppos);
  91. static int fpc1020_release(struct inode *inode, struct file *file);
  92. static unsigned int fpc1020_poll(struct file *file, poll_table *wait);
  93. static int fpc1020_cleanup(fpc1020_data_t *fpc1020, struct spi_device *spidev);
  94. static int fpc1020_param_init(fpc1020_data_t *fpc1020,
  95. struct fpc1020_platform_data *pdata);
  96. static int fpc1020_supply_init(fpc1020_data_t *fpc1020);
  97. static int fpc1020_reset_init(fpc1020_data_t *fpc1020,
  98. struct fpc1020_platform_data *pdata);
  99. static int fpc1020_irq_init(fpc1020_data_t *fpc1020,
  100. struct fpc1020_platform_data *pdata);
  101. static int fpc1020_spi_setup(fpc1020_data_t *fpc1020,
  102. struct fpc1020_platform_data *pdata);
  103. static int fpc1020_worker_init(fpc1020_data_t *fpc1020);
  104. static int fpc1020_worker_destroy(fpc1020_data_t *fpc1020);
  105. static int fpc1020_get_of_pdata(struct device *dev,
  106. struct fpc1020_platform_data *pdata);
  107. static int fpc1020_create_class(fpc1020_data_t *fpc1020);
  108. static int fpc1020_create_device(fpc1020_data_t *fpc1020);
  109. static int fpc1020_manage_sysfs(fpc1020_data_t *fpc1020,
  110. struct spi_device *spi, bool create);
  111. static ssize_t fpc1020_show_attr_setup(struct device *dev,
  112. struct device_attribute *attr,
  113. char *buf);
  114. static ssize_t fpc1020_store_attr_setup(struct device *dev,
  115. struct device_attribute *attr,
  116. const char *buf,
  117. size_t count);
  118. static ssize_t fpc1020_show_attr_diag(struct device *dev,
  119. struct device_attribute *attr,
  120. char *buf);
  121. static ssize_t fpc1020_store_attr_diag(struct device *dev,
  122. struct device_attribute *attr,
  123. const char *buf,
  124. size_t count);
  125. static u8 fpc1020_selftest_short(fpc1020_data_t *fpc1020);
  126. static int fpc1020_start_capture(fpc1020_data_t *fpc1020);
  127. static int fpc1020_new_job(fpc1020_data_t *fpc1020, int new_job);
  128. static int fpc1020_worker_goto_idle(fpc1020_data_t *fpc1020);
  129. static int fpc1020_worker_function(void *_fpc1020);
  130. static int fpc1020_start_input(fpc1020_data_t *fpc1020);
  131. /* -------------------------------------------------------------------- */
  132. /* External interface */
  133. /* -------------------------------------------------------------------- */
  134. module_init(fpc1020_init);
  135. module_exit(fpc1020_exit);
  136. static const struct dev_pm_ops fpc1020_pm = {
  137. .suspend = fpc1020_suspend,
  138. .resume = fpc1020_resume
  139. };
  140. #ifdef CONFIG_OF
  141. static struct of_device_id fpc1020_of_match[] = {
  142. { .compatible = "fpc,fpc1020", },
  143. {}
  144. };
  145. MODULE_DEVICE_TABLE(of, fpc1020_of_match);
  146. #endif
  147. static struct spi_driver fpc1020_driver = {
  148. .driver = {
  149. .name = FPC1020_DEV_NAME,
  150. .bus = &spi_bus_type,
  151. .owner = THIS_MODULE,
  152. .pm = &fpc1020_pm,
  153. #ifdef CONFIG_OF
  154. .of_match_table = fpc1020_of_match,
  155. #endif
  156. },
  157. .probe = fpc1020_probe,
  158. .remove = fpc1020_remove,
  159. };
  160. static const struct file_operations fpc1020_fops = {
  161. .owner = THIS_MODULE,
  162. .open = fpc1020_open,
  163. .write = fpc1020_write,
  164. .read = fpc1020_read,
  165. .release = fpc1020_release,
  166. .poll = fpc1020_poll,
  167. };
  168. /* -------------------------------------------------------------------- */
  169. /* devfs */
  170. /* -------------------------------------------------------------------- */
  171. #define FPC1020_ATTR(__grp, __field, __mode) \
  172. { \
  173. .attr = __ATTR(__field, (__mode), \
  174. fpc1020_show_attr_##__grp, \
  175. fpc1020_store_attr_##__grp), \
  176. .offset = offsetof(struct fpc1020_##__grp, __field) \
  177. }
  178. #define FPC1020_DEV_ATTR(_grp, _field, _mode) \
  179. struct fpc1020_attribute fpc1020_attr_##_field = \
  180. FPC1020_ATTR(_grp, _field, (_mode))
  181. #define DEVFS_SETUP_MODE (S_IWUSR|S_IWGRP|S_IWOTH|S_IRUSR|S_IRGRP|S_IROTH)
  182. static FPC1020_DEV_ATTR(setup, adc_gain, DEVFS_SETUP_MODE);
  183. static FPC1020_DEV_ATTR(setup, adc_shift, DEVFS_SETUP_MODE);
  184. static FPC1020_DEV_ATTR(setup, capture_mode, DEVFS_SETUP_MODE);
  185. static FPC1020_DEV_ATTR(setup, capture_count, DEVFS_SETUP_MODE);
  186. static FPC1020_DEV_ATTR(setup, capture_settings_mux, DEVFS_SETUP_MODE);
  187. static FPC1020_DEV_ATTR(setup, pxl_ctrl, DEVFS_SETUP_MODE);
  188. static FPC1020_DEV_ATTR(setup, capture_row_start, DEVFS_SETUP_MODE);
  189. static FPC1020_DEV_ATTR(setup, capture_row_count, DEVFS_SETUP_MODE);
  190. static FPC1020_DEV_ATTR(setup, capture_col_start, DEVFS_SETUP_MODE);
  191. static FPC1020_DEV_ATTR(setup, capture_col_groups, DEVFS_SETUP_MODE);
  192. static struct attribute *fpc1020_setup_attrs[] = {
  193. &fpc1020_attr_adc_gain.attr.attr,
  194. &fpc1020_attr_adc_shift.attr.attr,
  195. &fpc1020_attr_capture_mode.attr.attr,
  196. &fpc1020_attr_capture_count.attr.attr,
  197. &fpc1020_attr_capture_settings_mux.attr.attr,
  198. &fpc1020_attr_pxl_ctrl.attr.attr,
  199. &fpc1020_attr_capture_row_start.attr.attr,
  200. &fpc1020_attr_capture_row_count.attr.attr,
  201. &fpc1020_attr_capture_col_start.attr.attr,
  202. &fpc1020_attr_capture_col_groups.attr.attr,
  203. NULL
  204. };
  205. static const struct attribute_group fpc1020_setup_attr_group = {
  206. .attrs = fpc1020_setup_attrs,
  207. .name = "setup"
  208. };
  209. #define DEVFS_DIAG_MODE_RO (S_IRUSR|S_IRGRP|S_IROTH)
  210. #define DEVFS_DIAG_MODE_RW (S_IWUSR|S_IWGRP|S_IWOTH|S_IRUSR|S_IRGRP|S_IROTH)
  211. static FPC1020_DEV_ATTR(diag, chip_id, DEVFS_DIAG_MODE_RO);
  212. static FPC1020_DEV_ATTR(diag, selftest, DEVFS_DIAG_MODE_RO);
  213. static FPC1020_DEV_ATTR(diag, spi_register, DEVFS_DIAG_MODE_RW);
  214. static FPC1020_DEV_ATTR(diag, spi_regsize, DEVFS_DIAG_MODE_RO);
  215. static FPC1020_DEV_ATTR(diag, spi_data , DEVFS_DIAG_MODE_RW);
  216. static FPC1020_DEV_ATTR(diag, last_capture_time, DEVFS_DIAG_MODE_RO);
  217. static FPC1020_DEV_ATTR(diag, finger_present_status, DEVFS_DIAG_MODE_RO);
  218. static struct attribute *fpc1020_diag_attrs[] = {
  219. &fpc1020_attr_chip_id.attr.attr,
  220. &fpc1020_attr_selftest.attr.attr,
  221. &fpc1020_attr_spi_register.attr.attr,
  222. &fpc1020_attr_spi_regsize.attr.attr,
  223. &fpc1020_attr_spi_data.attr.attr,
  224. &fpc1020_attr_last_capture_time.attr.attr,
  225. &fpc1020_attr_finger_present_status.attr.attr,
  226. NULL
  227. };
  228. static const struct attribute_group fpc1020_diag_attr_group = {
  229. .attrs = fpc1020_diag_attrs,
  230. .name = "diag"
  231. };
  232. /* -------------------------------------------------------------------- */
  233. /* SPI debug interface, prototypes */
  234. /* -------------------------------------------------------------------- */
  235. static int fpc1020_spi_debug_select(fpc1020_data_t *fpc1020,
  236. fpc1020_reg_t reg);
  237. static int fpc1020_spi_debug_value_write(fpc1020_data_t *fpc1020, u64 data);
  238. static int fpc1020_spi_debug_buffer_write(fpc1020_data_t *fpc1020,
  239. const char *data,
  240. size_t count);
  241. static int fpc1020_spi_debug_value_read(fpc1020_data_t *fpc1020,
  242. u64 *data);
  243. static int fpc1020_spi_debug_buffer_read(fpc1020_data_t *fpc1020,
  244. u8 *data,
  245. size_t max_count);
  246. static void fpc1020_spi_debug_buffer_to_hex_string(char *string,
  247. u8 *buffer,
  248. size_t bytes);
  249. static int fpc1020_spi_debug_hex_string_to_buffer(u8 *buffer,
  250. size_t buf_size,
  251. const char *string,
  252. size_t chars);
  253. /* -------------------------------------------------------------------- */
  254. /* function definitions */
  255. /* -------------------------------------------------------------------- */
  256. static int __init fpc1020_init(void)
  257. {
  258. pr_err("fpc1020_init+++++++++++++++++++\n");
  259. if (spi_register_driver(&fpc1020_driver))
  260. return -EINVAL;
  261. pr_err("fpc1020_init end++++++++++++++++++++++++\n");
  262. return 0;
  263. }
  264. /* -------------------------------------------------------------------- */
  265. static void __exit fpc1020_exit(void)
  266. {
  267. pr_debug("%s\n", __func__);
  268. spi_unregister_driver(&fpc1020_driver);
  269. }
  270. /* -------------------------------------------------------------------- */
  271. int fpc1020_gpio_set(int cmd)
  272. {
  273. struct device_node *node;
  274. switch (cmd) {
  275. case 1:
  276. fpc_pin_default = pinctrl_lookup_state(fpc_pinctrl, "state-high");
  277. if (IS_ERR(fpc_pin_default)) {
  278. ret = PTR_RRR(fpc_pin_default);
  279. dev_err(node->dev, "fpc cannot find pinctrl default\n");
  280. return -1;
  281. }
  282. pinctrl_select_state(fpc_pinctrl, fpc_pin_default);
  283. break;
  284. case 0:
  285. fpc_pin_default = pinctrl_lookup_state(fpc_pinctrl, "state-low");
  286. if (IS_ERR(fpc_pin_default)) {
  287. ret = PTR_RRR(fpc_pin_default);
  288. dev_err(node->dev, "fpc cannot find pinctrl default\n");
  289. return -1;
  290. }
  291. pinctrl_select_state(fpc_pinctrl, fpc_pin_default);
  292. break;
  293. }
  294. }
  295. /* -------------------------------------------------------------------- */
  296. static int fpc1020_gpio_init(void)
  297. {
  298. struct device_node *node;
  299. node = of_find_compatible_node(NULL, NULL, "mediatek,fpc1145");
  300. if (node) {
  301. fpc_pinctrl = devm_pinctrl_get(node->dev);
  302. if (IS_ERR(pinctrl)) {
  303. ret = PTR_RRR(pinctrl);
  304. dev_err(node->dev, "fpc cannot find pinctrl\n");
  305. }
  306. return 0;
  307. }
  308. pr_err("[fpc]%s can't find compatible node\n", __func__);
  309. return -1;
  310. }
  311. /* -------------------------------------------------------------------- */
  312. static int fpc1020_probe(struct spi_device *spi)
  313. {
  314. struct fpc1020_platform_data *fpc1020_pdata;
  315. struct fpc1020_platform_data pdata_of;
  316. struct device *dev = &spi->dev;
  317. int error = 0;
  318. fpc1020_data_t *fpc1020 = NULL;
  319. size_t buffer_size;
  320. pr_err("fpc1020_probe enter++++++\n");
  321. #ifdef FPC_MTK
  322. error = fpc1020_gpio_init();
  323. if (error) {
  324. dev_err(&spi->dev, "Could not do gpio init.\n");
  325. /*return -EIO;*/
  326. }
  327. error = fpc1020_gpio_set(1);
  328. if (error) {
  329. dev_err(&spi->dev, "Could not set gpio.\n");
  330. /*return -EIO;*/
  331. }
  332. /*
  333. error = mt_set_gpio_mode(0x80000000|1, 0);
  334. error |= mt_set_gpio_dir(0x80000000|1, 1);
  335. if( error ) {
  336. dev_err( &spi->dev, "Could not set GPIO#1 as output.\n" );
  337. //return -EIO;
  338. }
  339. mt_set_gpio_mode(0x80000000|65, 1);
  340. mt_set_gpio_mode(0x80000000|66, 1);
  341. mt_set_gpio_mode(0x80000000|67, 1);
  342. mt_set_gpio_pull_enable(0x80000000|67, 0);
  343. mt_set_gpio_mode(0x80000000|68, 1);
  344. */
  345. #else
  346. error = gpio_request(57, NULL);
  347. if (error) {
  348. dev_err(&spi->dev, "Could not request GPIO#57.\n");
  349. /*return -EIO;*/
  350. }
  351. error = gpio_direction_output(57, 1);
  352. if (error) {
  353. dev_err(&spi->dev, "Could not set GPIO#57 as output.\n");
  354. /*return -EIO;*/
  355. }
  356. #endif
  357. fpc1020 = kzalloc(sizeof(*fpc1020), GFP_KERNEL);
  358. if (!fpc1020) {
  359. /*
  360. dev_err(&spi->dev,
  361. "failed to allocate memory for struct fpc1020_data\n");
  362. */
  363. return -ENOMEM;
  364. }
  365. pr_alert("%s\n", __func__);
  366. buffer_size = fpc1020_calc_huge_buffer_minsize(fpc1020);
  367. error = fpc1020_manage_huge_buffer(fpc1020, buffer_size);
  368. if (error)
  369. goto err;
  370. spi_set_drvdata(spi, fpc1020);
  371. fpc1020->spi = spi;
  372. fpc1020->spi_freq_khz = 1000u;
  373. fpc1020->reset_gpio = -EINVAL;
  374. fpc1020->irq_gpio = -EINVAL;
  375. fpc1020->cs_gpio = -EINVAL;
  376. fpc1020->irq = -EINVAL;
  377. fpc1020->use_regulator_for_bezel = 0;
  378. fpc1020->use_fpc2050 = 0;
  379. init_waitqueue_head(&fpc1020->wq_irq_return);
  380. error = fpc1020_init_capture(fpc1020);
  381. if (error)
  382. goto err;
  383. fpc1020_pdata = spi->dev.platform_data;
  384. if (!fpc1020_pdata) {
  385. error = fpc1020_get_of_pdata(dev, &pdata_of);
  386. fpc1020_pdata = &pdata_of;
  387. /*if (error)
  388. goto err;
  389. */
  390. }
  391. if (!fpc1020_pdata) {
  392. dev_err(&fpc1020->spi->dev,
  393. "spi->dev.platform_data is NULL.\n");
  394. /*error = -EINVAL;
  395. goto err;*/
  396. }
  397. error = fpc1020_param_init(fpc1020, fpc1020_pdata);
  398. /*if (error)
  399. goto err;*/
  400. error = fpc1020_supply_init(fpc1020);
  401. /*if (error)
  402. goto err;*/
  403. error = fpc1020_reset_init(fpc1020, fpc1020_pdata);
  404. /*if (error)
  405. goto err;*/
  406. error = fpc1020_irq_init(fpc1020, fpc1020_pdata);
  407. /*if (error)
  408. goto err;*/
  409. error = fpc1020_spi_setup(fpc1020, fpc1020_pdata);
  410. /*if (error)
  411. goto err;*/
  412. error = fpc1020_reset(fpc1020);
  413. /*if (error)
  414. goto err;*/
  415. error = fpc1020_check_hw_id(fpc1020);
  416. /*if (error)
  417. goto err;*/
  418. fpc1020->spi_freq_khz = fpc1020->chip.spi_max_khz;
  419. dev_info(&fpc1020->spi->dev,
  420. "Req. SPI frequency : %d kHz.\n",
  421. fpc1020->spi_freq_khz);
  422. buffer_size = fpc1020_calc_huge_buffer_minsize(fpc1020);
  423. error = fpc1020_manage_huge_buffer(fpc1020, buffer_size);
  424. /*if (error)
  425. goto err;*/
  426. error = fpc1020_setup_defaults(fpc1020);
  427. /*if (error)
  428. goto err;*/
  429. error = fpc1020_create_class(fpc1020);
  430. /*if (error)
  431. goto err;*/
  432. error = fpc1020_create_device(fpc1020);
  433. /*if (error)
  434. goto err;*/
  435. sema_init(&fpc1020->mutex, 0);
  436. error = fpc1020_manage_sysfs(fpc1020, spi, true);
  437. /*if (error)
  438. goto err;*/
  439. cdev_init(&fpc1020->cdev, &fpc1020_fops);
  440. fpc1020->cdev.owner = THIS_MODULE;
  441. error = cdev_add(&fpc1020->cdev, fpc1020->devno, 1);
  442. if (error) {
  443. dev_err(&fpc1020->spi->dev, "cdev_add failed.\n");
  444. goto err_chrdev;
  445. }
  446. error = fpc1020_worker_init(fpc1020);
  447. if (error)
  448. goto err_cdev;
  449. error = fpc1020_calc_finger_detect_threshold_min(fpc1020);
  450. pr_err("fpc1020_calc_finger_detect_threshold_min probe\n");
  451. /*if (error < 0)
  452. goto err_cdev;*/
  453. error = fpc1020_set_finger_detect_threshold(fpc1020, error);
  454. /*if (error < 0)
  455. goto err_cdev;*/
  456. error = fpc1020_input_init(fpc1020);
  457. /*if (error)
  458. goto err_cdev;*/
  459. error = fpc1020_start_input(fpc1020);
  460. /*if (error)
  461. goto err_cdev;*/
  462. /*
  463. error = fpc1020_sleep(fpc1020, true);
  464. if (error)
  465. goto err_cdev;
  466. */
  467. up(&fpc1020->mutex);
  468. pr_err("FPC1020 probe done+++++++\n");
  469. return 0;
  470. err_cdev:
  471. cdev_del(&fpc1020->cdev);
  472. err_chrdev:
  473. unregister_chrdev_region(fpc1020->devno, 1);
  474. fpc1020_manage_sysfs(fpc1020, spi, false);
  475. err:
  476. fpc1020_cleanup(fpc1020, spi);
  477. return error;
  478. }
  479. /* -------------------------------------------------------------------- */
  480. static int fpc1020_remove(struct spi_device *spi)
  481. {
  482. fpc1020_data_t *fpc1020 = spi_get_drvdata(spi);
  483. pr_debug("%s\n", __func__);
  484. fpc1020_manage_sysfs(fpc1020, spi, false);
  485. fpc1020_sleep(fpc1020, true);
  486. cdev_del(&fpc1020->cdev);
  487. unregister_chrdev_region(fpc1020->devno, 1);
  488. fpc1020_cleanup(fpc1020, spi);
  489. return 0;
  490. }
  491. /* -------------------------------------------------------------------- */
  492. static int fpc1020_suspend(struct device *dev)
  493. {
  494. fpc1020_data_t *fpc1020 = dev_get_drvdata(dev);
  495. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  496. fpc1020_worker_goto_idle(fpc1020);
  497. return fpc1020_sleep(fpc1020, true);
  498. }
  499. /* -------------------------------------------------------------------- */
  500. static int fpc1020_resume(struct device *dev)
  501. {
  502. fpc1020_data_t *fpc1020 = dev_get_drvdata(dev);
  503. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  504. if (fpc1020_wake_up(fpc1020)) {
  505. if (fpc1020->input.enabled)
  506. fpc1020_start_input(fpc1020);
  507. }
  508. return 0;
  509. }
  510. /* -------------------------------------------------------------------- */
  511. static int fpc1020_open(struct inode *inode, struct file *file)
  512. {
  513. fpc1020_data_t *fpc1020;
  514. pr_debug("%s\n", __func__);
  515. fpc1020 = container_of(inode->i_cdev, fpc1020_data_t, cdev);
  516. if (down_interruptible(&fpc1020->mutex))
  517. return -ERESTARTSYS;
  518. file->private_data = fpc1020;
  519. up(&fpc1020->mutex);
  520. return 0;
  521. }
  522. /* -------------------------------------------------------------------- */
  523. static ssize_t fpc1020_write(struct file *file, const char *buff,
  524. size_t count, loff_t *ppos)
  525. {
  526. pr_debug("%s\n", __func__);
  527. return -ENOTTY;
  528. }
  529. /* -------------------------------------------------------------------- */
  530. static ssize_t fpc1020_read(struct file *file, char *buff,
  531. size_t count, loff_t *ppos)
  532. {
  533. fpc1020_data_t *fpc1020 = file->private_data;
  534. int error = 0;
  535. u32 max_data;
  536. u32 avail_data;
  537. if (down_interruptible(&fpc1020->mutex))
  538. return -ERESTARTSYS;
  539. if (fpc1020->capture.available_bytes > 0) {
  540. goto copy_data;
  541. } else {
  542. if (fpc1020->capture.read_pending_eof) {
  543. fpc1020->capture.read_pending_eof = false;
  544. error = 0;
  545. goto out;
  546. }
  547. if (file->f_flags & O_NONBLOCK) {
  548. if (fpc1020_capture_check_ready(fpc1020)) {
  549. error = fpc1020_start_capture(fpc1020);
  550. if (error)
  551. goto out;
  552. }
  553. error = -EWOULDBLOCK;
  554. goto out;
  555. } else {
  556. error = fpc1020_start_capture(fpc1020);
  557. if (error)
  558. goto out;
  559. }
  560. }
  561. pr_err("fpc1020_read++++\n");
  562. error = wait_event_interruptible(
  563. fpc1020->capture.wq_data_avail,
  564. (fpc1020->capture.available_bytes > 0));
  565. if (error)
  566. goto out;
  567. if (fpc1020->capture.last_error != 0) {
  568. error = fpc1020->capture.last_error;
  569. goto out;
  570. }
  571. copy_data:
  572. avail_data = fpc1020->capture.available_bytes;
  573. max_data = (count > avail_data) ? avail_data : count;
  574. if (max_data) {
  575. error = copy_to_user(buff,
  576. &fpc1020->huge_buffer[fpc1020->capture.read_offset],
  577. max_data);
  578. if (error)
  579. goto out;
  580. fpc1020->capture.read_offset += max_data;
  581. fpc1020->capture.available_bytes -= max_data;
  582. error = max_data;
  583. if (fpc1020->capture.available_bytes == 0)
  584. fpc1020->capture.read_pending_eof = true;
  585. }
  586. out:
  587. up(&fpc1020->mutex);
  588. return error;
  589. }
  590. /* -------------------------------------------------------------------- */
  591. static int fpc1020_release(struct inode *inode, struct file *file)
  592. {
  593. fpc1020_data_t *fpc1020 = file->private_data;
  594. int status = 0;
  595. pr_debug("%s\n", __func__);
  596. if (down_interruptible(&fpc1020->mutex))
  597. return -ERESTARTSYS;
  598. fpc1020_start_input(fpc1020);
  599. /*
  600. fpc1020_worker_goto_idle(fpc1020);
  601. fpc1020_sleep(fpc1020, true);
  602. */
  603. up(&fpc1020->mutex);
  604. return status;
  605. }
  606. /* -------------------------------------------------------------------- */
  607. static unsigned int fpc1020_poll(struct file *file, poll_table *wait)
  608. {
  609. fpc1020_data_t *fpc1020 = file->private_data;
  610. unsigned int ret = 0;
  611. fpc1020_capture_mode_t mode = fpc1020->setup.capture_mode;
  612. bool blocking_op;
  613. if (down_interruptible(&fpc1020->mutex))
  614. return -ERESTARTSYS;
  615. if (fpc1020->capture.available_bytes > 0)
  616. ret |= (POLLIN | POLLRDNORM);
  617. else if (fpc1020->capture.read_pending_eof)
  618. ret |= POLLHUP;
  619. else { /* available_bytes == 0 && !pending_eof */
  620. blocking_op =
  621. (mode == FPC1020_MODE_WAIT_AND_CAPTURE) ? true : false;
  622. switch (fpc1020->capture.state) {
  623. case FPC1020_CAPTURE_STATE_IDLE:
  624. if (!blocking_op)
  625. ret |= POLLIN;
  626. break;
  627. case FPC1020_CAPTURE_STATE_STARTED:
  628. case FPC1020_CAPTURE_STATE_PENDING:
  629. case FPC1020_CAPTURE_STATE_WRITE_SETTINGS:
  630. case FPC1020_CAPTURE_STATE_WAIT_FOR_FINGER_DOWN:
  631. case FPC1020_CAPTURE_STATE_ACQUIRE:
  632. case FPC1020_CAPTURE_STATE_FETCH:
  633. case FPC1020_CAPTURE_STATE_WAIT_FOR_FINGER_UP:
  634. case FPC1020_CAPTURE_STATE_COMPLETED:
  635. ret |= POLLIN;
  636. poll_wait(file, &fpc1020->capture.wq_data_avail, wait);
  637. if (fpc1020->capture.available_bytes > 0)
  638. ret |= POLLRDNORM;
  639. else if (blocking_op)
  640. ret = 0;
  641. break;
  642. case FPC1020_CAPTURE_STATE_FAILED:
  643. if (!blocking_op)
  644. ret |= POLLIN;
  645. break;
  646. default:
  647. dev_err(&fpc1020->spi->dev,
  648. "%s unknown state\n", __func__);
  649. break;
  650. }
  651. }
  652. up(&fpc1020->mutex);
  653. return ret;
  654. }
  655. /* -------------------------------------------------------------------- */
  656. static int fpc1020_cleanup(fpc1020_data_t *fpc1020, struct spi_device *spidev)
  657. {
  658. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  659. fpc1020_worker_destroy(fpc1020);
  660. if (!IS_ERR_OR_NULL(fpc1020->device))
  661. device_destroy(fpc1020->class, fpc1020->devno);
  662. class_destroy(fpc1020->class);
  663. if (fpc1020->irq >= 0)
  664. free_irq(fpc1020->irq, fpc1020);
  665. if (gpio_is_valid(fpc1020->irq_gpio))
  666. gpio_free(fpc1020->irq_gpio);
  667. if (gpio_is_valid(fpc1020->reset_gpio))
  668. gpio_free(fpc1020->reset_gpio);
  669. #ifdef MANUAL_CS
  670. if (gpio_is_valid(fpc1020->cs_gpio))
  671. gpio_free(fpc1020->cs_gpio);
  672. #endif
  673. fpc1020_manage_huge_buffer(fpc1020, 0);
  674. fpc1020_input_destroy(fpc1020);
  675. kfree(fpc1020);
  676. spi_set_drvdata(spidev, NULL);
  677. return 0;
  678. }
  679. /* -------------------------------------------------------------------- */
  680. static int fpc1020_param_init(fpc1020_data_t *fpc1020,
  681. struct fpc1020_platform_data *pdata)
  682. {
  683. fpc1020->vddtx_mv = pdata->external_supply_mv;
  684. fpc1020->txout_boost = pdata->txout_boost;
  685. if (fpc1020->vddtx_mv > 0) {
  686. dev_info(&fpc1020->spi->dev,
  687. "External TxOut supply (%d mV)\n",
  688. fpc1020->vddtx_mv);
  689. } else {
  690. dev_info(&fpc1020->spi->dev,
  691. "Internal TxOut supply (boost %s)\n",
  692. (fpc1020->txout_boost) ? "ON" : "OFF");
  693. }
  694. fpc1020->force_hwid = pdata->force_hwid;
  695. fpc1020->use_regulator_for_bezel = pdata->use_regulator_for_bezel;
  696. fpc1020->use_fpc2050 = pdata->use_fpc2050;
  697. return 0;
  698. }
  699. /* ------------------------------------------------------------ */
  700. static int fpc1020_supply_init(fpc1020_data_t *fpc1020)
  701. {
  702. int error = 0;
  703. /*Determine is we should use external regulator for
  704. power sully to the bezel. */
  705. if (fpc1020->use_regulator_for_bezel) {
  706. /*error = fpc1020_regulator_configure(fpc1020); */
  707. if (error) {
  708. dev_err(&fpc1020->spi->dev,
  709. "fpc1020_probe - regulator configuration failed.\n");
  710. goto err;
  711. }
  712. /*error = fpc1020_regulator_set(fpc1020, true);*/
  713. if (error) {
  714. dev_err(&fpc1020->spi->dev,
  715. "fpc1020_probe - regulator enable failed.\n");
  716. goto err;
  717. }
  718. }
  719. err:
  720. return error;
  721. }
  722. /* -------------------------------------------------- */
  723. static int fpc1020_reset_init(fpc1020_data_t *fpc1020,
  724. struct fpc1020_platform_data *pdata)
  725. {
  726. #ifdef FPC_MTK
  727. int error = 0;
  728. dev_info(&fpc1020->spi->dev,
  729. "Assign HW reset -> GPIO%d\n", pdata->reset_gpio);
  730. fpc1020->soft_reset_enabled = false;
  731. fpc1020->reset_gpio = pdata->reset_gpio;
  732. /*
  733. error = mt_set_gpio_mode(0x80000000|1, 0);
  734. error |= mt_set_gpio_dir(0x80000000|1, 1);
  735. if (error) {
  736. dev_err(&fpc1020->spi->dev,
  737. "gpio_direction_output(reset) failed.\n");
  738. return error;
  739. }
  740. */
  741. #else
  742. int error = 0;
  743. if (gpio_is_valid(pdata->reset_gpio)) {
  744. dev_info(&fpc1020->spi->dev,
  745. "Assign HW reset -> GPIO%d\n", pdata->reset_gpio);
  746. fpc1020->soft_reset_enabled = false;
  747. error = gpio_request(pdata->reset_gpio, "fpc1020_reset");
  748. if (error) {
  749. dev_err(&fpc1020->spi->dev,
  750. "gpio_request (reset) failed.\n");
  751. return error;
  752. }
  753. fpc1020->reset_gpio = pdata->reset_gpio;
  754. error = gpio_direction_output(fpc1020->reset_gpio, 1);
  755. if (error) {
  756. dev_err(&fpc1020->spi->dev,
  757. "gpio_direction_output(reset) failed.\n");
  758. return error;
  759. }
  760. } else {
  761. dev_info(&fpc1020->spi->dev, "Using soft reset\n");
  762. fpc1020->soft_reset_enabled = true;
  763. }
  764. #endif
  765. return error;
  766. }
  767. /* -------------------------------------------------------------------- */
  768. static int fpc1020_irq_init(fpc1020_data_t *fpc1020,
  769. struct fpc1020_platform_data *pdata)
  770. {
  771. int error = 0;
  772. #ifdef FPC_MTK
  773. unsigned int gpiopin, debounce, fpc_irq;
  774. u32 ints[2] = {0, 0};
  775. struct device_node *node;
  776. node = of_find_compatible_node(NULL, NULL, "mediatek,fpc1145");
  777. if (node) {
  778. of_property_read_u32_array(node, "debounce", ints, ARRAY_SIZE(ints));
  779. gpiopin = ints[0];
  780. debounce = ints[1];
  781. mt_gpio_set_debounce(gpiopin, debounce);
  782. fpc_irq = irq_of_parse_and_map(node, 0);
  783. pr_err("fpc_irq = %u\n", fpc_irq);
  784. fpc1020->irq = fpc_irq;
  785. } else
  786. pr_err("[fpc]%s can't find compatible node\n", __func__);
  787. #else
  788. if (gpio_is_valid(pdata->irq_gpio)) {
  789. dev_info(&fpc1020->spi->dev,
  790. "Assign IRQ -> GPIO%d\n",
  791. pdata->irq_gpio);
  792. error = gpio_request(pdata->irq_gpio, "fpc1020_irq");
  793. if (error) {
  794. dev_err(&fpc1020->spi->dev,
  795. "gpio_request (irq) failed.\n");
  796. return error;
  797. }
  798. fpc1020->irq_gpio = pdata->irq_gpio;
  799. error = gpio_direction_input(fpc1020->irq_gpio);
  800. if (error) {
  801. dev_err(&fpc1020->spi->dev,
  802. "gpio_direction_input (irq) failed.\n");
  803. return error;
  804. }
  805. } else {
  806. return -EINVAL;
  807. }
  808. fpc1020->irq = gpio_to_irq(fpc1020->irq_gpio);
  809. if (fpc1020->irq < 0) {
  810. dev_err(&fpc1020->spi->dev, "gpio_to_irq failed.\n");
  811. error = fpc1020->irq;
  812. return error;
  813. }
  814. #endif
  815. error = request_irq(fpc1020->irq, fpc1020_interrupt,
  816. IRQF_TRIGGER_RISING, "fpc1020", fpc1020);
  817. if (error) {
  818. dev_err(&fpc1020->spi->dev,
  819. "request_irq %i failed.\n",
  820. fpc1020->irq);
  821. fpc1020->irq = -EINVAL;
  822. return error;
  823. }
  824. return error;
  825. }
  826. /* -------------------------------------------------------------------- */
  827. static int fpc1020_spi_setup(fpc1020_data_t *fpc1020,
  828. struct fpc1020_platform_data *pdata)
  829. {
  830. int error = 0;
  831. struct mt_chip_conf *spi_par;
  832. pr_debug("%s\n", __func__);
  833. fpc1020->spi->controller_data = (void *)&spi_conf;
  834. spi_par = &spi_conf;
  835. spi_par->setuptime = 20;
  836. spi_par->holdtime = 20;
  837. spi_par->high_time = 50;
  838. spi_par->low_time = 50;
  839. spi_par->cs_idletime = 5;
  840. spi_par->rx_mlsb = 1;
  841. spi_par->tx_mlsb = 1;
  842. spi_par->tx_endian = 0;
  843. spi_par->rx_endian = 0;
  844. spi_par->cpol = 0;
  845. spi_par->cpha = 0;
  846. spi_par->com_mod = FIFO_TRANSFER;
  847. spi_par->pause = 1;
  848. spi_par->finish_intr = 1;
  849. spi_par->deassert = 0;
  850. fpc1020->spi->mode = SPI_MODE_0;
  851. fpc1020->spi->bits_per_word = 8;
  852. fpc1020->spi->chip_select = 0;
  853. error = spi_setup(fpc1020->spi);
  854. if (error) {
  855. dev_err(&fpc1020->spi->dev, "spi_setup failed\n");
  856. goto out_err;
  857. }
  858. #ifdef MANUAL_CS
  859. if (gpio_is_valid(pdata->cs_gpio)) {
  860. dev_info(&fpc1020->spi->dev,
  861. "Assign SPI.CS -> GPIO%d\n",
  862. pdata->cs_gpio);
  863. error = gpio_request(pdata->cs_gpio, "fpc1020_cs");
  864. if (error) {
  865. dev_err(&fpc1020->spi->dev,
  866. "gpio_request (cs) failed.\n");
  867. goto out_err;
  868. }
  869. fpc1020->cs_gpio = pdata->cs_gpio;
  870. error = gpio_direction_output(fpc1020->cs_gpio, 1);
  871. if (error) {
  872. dev_err(&fpc1020->spi->dev,
  873. "gpio_direction_output(cs) failed.\n");
  874. goto out_err;
  875. }
  876. } else {
  877. error = -EINVAL;
  878. }
  879. #endif
  880. out_err:
  881. return error;
  882. }
  883. /* -------------------------------------------------------------------- */
  884. static int fpc1020_worker_init(fpc1020_data_t *fpc1020)
  885. {
  886. int error = 0;
  887. pr_debug("%s\n", __func__);
  888. init_waitqueue_head(&fpc1020->worker.wq_wait_job);
  889. sema_init(&fpc1020->worker.sem_idle, 0);
  890. fpc1020->worker.req_mode = FPC1020_WORKER_IDLE_MODE;
  891. fpc1020->worker.thread = kthread_run(fpc1020_worker_function,
  892. fpc1020, "%s",
  893. FPC1020_WORKER_THREAD_NAME);
  894. if (IS_ERR(fpc1020->worker.thread)) {
  895. dev_err(&fpc1020->spi->dev, "kthread_run failed.\n");
  896. error = (int)PTR_ERR(fpc1020->worker.thread);
  897. }
  898. return error;
  899. }
  900. /* -------------------------------------------------------------------- */
  901. static int fpc1020_worker_destroy(fpc1020_data_t *fpc1020)
  902. {
  903. int error = 0;
  904. pr_debug("%s\n", __func__);
  905. if (fpc1020->worker.thread) {
  906. fpc1020_worker_goto_idle(fpc1020);
  907. fpc1020->worker.req_mode = FPC1020_WORKER_EXIT;
  908. wake_up_interruptible(&fpc1020->worker.wq_wait_job);
  909. kthread_stop(fpc1020->worker.thread);
  910. }
  911. return error;
  912. }
  913. /* -------------------------------------------------------------------- */
  914. #ifdef CONFIG_OF
  915. static int fpc1020_get_of_pdata(struct device *dev,
  916. struct fpc1020_platform_data *pdata)
  917. {
  918. const struct device_node *node = dev->of_node;
  919. /* required properties */
  920. const void *irq_prop = of_get_property(node, "fpc,gpio_irq", NULL);
  921. const void *rst_prop = of_get_property(node, "fpc,gpio_reset", NULL);
  922. const void *cs_prop = of_get_property(node, "fpc,gpio_cs", NULL);
  923. /* optional properties */
  924. const void *vddtx_prop = of_get_property(node, "fpc,vddtx_mv", NULL);
  925. const void *boost_prop =
  926. of_get_property(node, "fpc,txout_boost_enable", NULL);
  927. const void *hwid_prop =
  928. of_get_property(node, "fpc,force_hwid", NULL);
  929. const void *use_regulator_for_bezel_prop = of_get_property(node, "vdd_tx-supply", NULL);
  930. const void *use_fpc2050 = of_get_property(node, "fpc,use_fpc2050", NULL);
  931. if (node == NULL) {
  932. dev_err(dev, "%s: Could not find OF device node\n", __func__);
  933. goto of_err;
  934. }
  935. if (!irq_prop || !rst_prop) {
  936. dev_err(dev, "%s: Missing OF property\n", __func__);
  937. goto of_err;
  938. }
  939. pdata->irq_gpio = be32_to_cpup(irq_prop);
  940. pdata->reset_gpio = be32_to_cpup(rst_prop);
  941. pdata->cs_gpio = (cs_prop != NULL) ? be32_to_cpup(cs_prop) : -EINVAL;
  942. pdata->external_supply_mv =
  943. (vddtx_prop != NULL) ? be32_to_cpup(vddtx_prop) : 0;
  944. pdata->txout_boost = (boost_prop != NULL) ? 1 : 0;
  945. pdata->force_hwid =
  946. (hwid_prop != NULL) ? be32_to_cpup(hwid_prop) : 0;
  947. pdata->use_regulator_for_bezel = use_regulator_for_bezel_prop ? 1 : 0;
  948. pdata->use_fpc2050 = (use_fpc2050 != NULL) ? (be32_to_cpup(use_fpc2050) ? 1 : 0) : 0;
  949. return 0;
  950. of_err:
  951. pdata->reset_gpio = -EINVAL;
  952. pdata->irq_gpio = -EINVAL;
  953. pdata->cs_gpio = -EINVAL;
  954. pdata->force_hwid = -EINVAL;
  955. pdata->external_supply_mv = 0;
  956. pdata->txout_boost = 0;
  957. return -ENODEV;
  958. }
  959. #else
  960. static int fpc1020_get_of_pdata(struct device *dev,
  961. struct fpc1020_platform_data *pdata)
  962. {
  963. pdata->reset_gpio = -EINVAL;
  964. pdata->irq_gpio = -EINVAL;
  965. pdata->cs_gpio = -EINVAL;
  966. pdata->force_hwid = -EINVAL;
  967. pdata->external_supply_mv = 0;
  968. pdata->txout_boost = 0;
  969. return -ENODEV;
  970. }
  971. #endif
  972. /* -------------------------------------------------------------------- */
  973. static int fpc1020_create_class(fpc1020_data_t *fpc1020)
  974. {
  975. int error = 0;
  976. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  977. fpc1020->class = class_create(THIS_MODULE, FPC1020_CLASS_NAME);
  978. if (IS_ERR(fpc1020->class)) {
  979. dev_err(&fpc1020->spi->dev, "failed to create class.\n");
  980. error = PTR_ERR(fpc1020->class);
  981. }
  982. return error;
  983. }
  984. /* -------------------------------------------------------------------- */
  985. static int fpc1020_create_device(fpc1020_data_t *fpc1020)
  986. {
  987. int error = 0;
  988. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  989. if (FPC1020_MAJOR > 0) {
  990. fpc1020->devno = MKDEV(FPC1020_MAJOR, fpc1020_device_count++);
  991. error = register_chrdev_region(fpc1020->devno,
  992. 1,
  993. FPC1020_DEV_NAME);
  994. } else {
  995. error = alloc_chrdev_region(&fpc1020->devno,
  996. fpc1020_device_count++,
  997. 1,
  998. FPC1020_DEV_NAME);
  999. }
  1000. if (error < 0) {
  1001. dev_err(&fpc1020->spi->dev,
  1002. "%s: FAILED %d.\n", __func__, error);
  1003. goto out;
  1004. } else {
  1005. dev_info(&fpc1020->spi->dev, "%s: major=%d, minor=%d\n",
  1006. __func__,
  1007. MAJOR(fpc1020->devno),
  1008. MINOR(fpc1020->devno));
  1009. }
  1010. fpc1020->device = device_create(fpc1020->class, NULL, fpc1020->devno,
  1011. NULL, "%s", FPC1020_DEV_NAME);
  1012. if (IS_ERR(fpc1020->device)) {
  1013. dev_err(&fpc1020->spi->dev, "device_create failed.\n");
  1014. error = PTR_ERR(fpc1020->device);
  1015. }
  1016. out:
  1017. return error;
  1018. }
  1019. /* -------------------------------------------------------------------- */
  1020. static int fpc1020_manage_sysfs(fpc1020_data_t *fpc1020,
  1021. struct spi_device *spi, bool create)
  1022. {
  1023. int error = 0;
  1024. if (create) {
  1025. dev_dbg(&fpc1020->spi->dev, "%s create\n", __func__);
  1026. error = sysfs_create_group(&spi->dev.kobj,
  1027. &fpc1020_setup_attr_group);
  1028. if (error) {
  1029. dev_err(&fpc1020->spi->dev,
  1030. "sysf_create_group failed.\n");
  1031. return error;
  1032. }
  1033. error = sysfs_create_group(&spi->dev.kobj,
  1034. &fpc1020_diag_attr_group);
  1035. if (error) {
  1036. sysfs_remove_group(&spi->dev.kobj,
  1037. &fpc1020_setup_attr_group);
  1038. dev_err(&fpc1020->spi->dev,
  1039. "sysf_create_group failed.\n");
  1040. return error;
  1041. }
  1042. } else {
  1043. dev_dbg(&fpc1020->spi->dev, "%s remove\n", __func__);
  1044. sysfs_remove_group(&spi->dev.kobj, &fpc1020_setup_attr_group);
  1045. sysfs_remove_group(&spi->dev.kobj, &fpc1020_diag_attr_group);
  1046. }
  1047. return error;
  1048. }
  1049. /* -------------------------------------------------------------------- */
  1050. irqreturn_t fpc1020_interrupt(int irq, void *_fpc1020)
  1051. {
  1052. fpc1020_data_t *fpc1020 = _fpc1020;
  1053. #ifdef FPC_MTK
  1054. pr_err("fpc1020_interrupt enter\n");
  1055. /*disable_irq_nosync(fpc1020->irq);*/
  1056. fpc1020->interrupt_done = true;
  1057. wake_up_interruptible(&fpc1020->wq_irq_return);
  1058. return IRQ_HANDLED;
  1059. #else
  1060. if (gpio_get_value(fpc1020->irq_gpio)) {
  1061. fpc1020->interrupt_done = true;
  1062. wake_up_interruptible(&fpc1020->wq_irq_return);
  1063. return IRQ_HANDLED;
  1064. }
  1065. #endif
  1066. return IRQ_NONE;
  1067. }
  1068. /* -------------------------------------------------------------------- */
  1069. static ssize_t fpc1020_show_attr_setup(struct device *dev,
  1070. struct device_attribute *attr,
  1071. char *buf)
  1072. {
  1073. fpc1020_data_t *fpc1020 = dev_get_drvdata(dev);
  1074. struct fpc1020_attribute *fpc_attr;
  1075. int val = -1;
  1076. int mux;
  1077. fpc_attr = container_of(attr, struct fpc1020_attribute, attr);
  1078. mux = fpc1020->setup.capture_settings_mux;
  1079. if (fpc_attr->offset == offsetof(fpc1020_setup_t, adc_gain))
  1080. val = fpc1020->setup.adc_gain[mux];
  1081. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, adc_shift))
  1082. val = fpc1020->setup.adc_shift[mux];
  1083. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, pxl_ctrl))
  1084. val = fpc1020->setup.pxl_ctrl[mux];
  1085. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_mode))
  1086. val = fpc1020->setup.capture_mode;
  1087. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_count))
  1088. val = fpc1020->setup.capture_count;
  1089. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_settings_mux))
  1090. val = fpc1020->setup.capture_settings_mux;
  1091. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_row_start))
  1092. val = fpc1020->setup.capture_row_start;
  1093. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_row_count))
  1094. val = fpc1020->setup.capture_row_count;
  1095. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_col_start))
  1096. val = fpc1020->setup.capture_col_start;
  1097. else if (fpc_attr->offset == offsetof(fpc1020_setup_t, capture_col_groups))
  1098. val = fpc1020->setup.capture_col_groups;
  1099. if (val >= 0)
  1100. return scnprintf(buf, PAGE_SIZE, "%i\n", val);
  1101. return -ENOENT;
  1102. }
  1103. /* -------------------------------------------------------------------- */
  1104. static ssize_t fpc1020_store_attr_setup(struct device *dev,
  1105. struct device_attribute *attr,
  1106. const char *buf,
  1107. size_t count)
  1108. {
  1109. fpc1020_data_t *fpc1020 = dev_get_drvdata(dev);
  1110. u64 val;
  1111. int error = kstrtou64(buf, 0, &val);
  1112. int mux;
  1113. int column_groups = fpc1020->chip.pixel_columns / fpc1020->chip.adc_group_size;
  1114. struct fpc1020_attribute *fpc_attr;
  1115. fpc_attr = container_of(attr, struct fpc1020_attribute, attr);
  1116. mux = fpc1020->setup.capture_settings_mux;
  1117. if (!error) {
  1118. if (fpc_attr->offset ==
  1119. offsetof(fpc1020_setup_t, adc_gain)) {
  1120. fpc1020->setup.adc_gain[mux] = (u8)val;
  1121. } else if (fpc_attr->offset ==
  1122. offsetof(fpc1020_setup_t, adc_shift)) {
  1123. fpc1020->setup.adc_shift[mux] = (u8)val;
  1124. } else if (fpc_attr->offset ==
  1125. offsetof(fpc1020_setup_t, pxl_ctrl)) {
  1126. fpc1020->setup.pxl_ctrl[mux] = (u16)val;
  1127. } else if (fpc_attr->offset ==
  1128. offsetof(fpc1020_setup_t, capture_mode)) {
  1129. fpc1020->setup.capture_mode =
  1130. (fpc1020_capture_mode_t)val;
  1131. } else if (fpc_attr->offset ==
  1132. offsetof(fpc1020_setup_t, capture_count)) {
  1133. if (fpc1020_check_in_range_u64
  1134. (val, 1, FPC1020_BUFFER_MAX_IMAGES)) {
  1135. fpc1020->setup.capture_count = (u8)val;
  1136. } else
  1137. return -EINVAL;
  1138. } else if (fpc_attr->offset ==
  1139. offsetof(fpc1020_setup_t, capture_settings_mux)) {
  1140. if (fpc1020_check_in_range_u64
  1141. (val, 0, (FPC1020_BUFFER_MAX_IMAGES - 1))) {
  1142. fpc1020->setup.capture_settings_mux = (u8)val;
  1143. } else
  1144. return -EINVAL;
  1145. } else if (fpc_attr->offset ==
  1146. offsetof(fpc1020_setup_t, capture_row_start)) {
  1147. if (fpc1020_check_in_range_u64
  1148. (val, 0, (fpc1020->chip.pixel_rows - 1))) {
  1149. fpc1020->setup.capture_row_start = (u8)val;
  1150. } else
  1151. return -EINVAL;
  1152. } else if (fpc_attr->offset ==
  1153. offsetof(fpc1020_setup_t, capture_row_count)) {
  1154. if (fpc1020_check_in_range_u64
  1155. (val, 1, fpc1020->chip.pixel_rows)) {
  1156. fpc1020->setup.capture_row_count = (u8)val;
  1157. } else
  1158. return -EINVAL;
  1159. } else if (fpc_attr->offset ==
  1160. offsetof(fpc1020_setup_t, capture_col_start)) {
  1161. if (fpc1020_check_in_range_u64
  1162. (val, 0, (column_groups - 1))) {
  1163. fpc1020->setup.capture_col_start = (u8)val;
  1164. } else
  1165. return -EINVAL;
  1166. } else if (fpc_attr->offset ==
  1167. offsetof(fpc1020_setup_t, capture_col_groups)) {
  1168. if (fpc1020_check_in_range_u64
  1169. (val, 1, column_groups)) {
  1170. fpc1020->setup.capture_col_groups = (u8)val;
  1171. } else
  1172. return -EINVAL;
  1173. } else
  1174. return -ENOENT;
  1175. return strnlen(buf, count);
  1176. }
  1177. return error;
  1178. }
  1179. /* -------------------------------------------------------------------- */
  1180. static ssize_t fpc1020_show_attr_diag(struct device *dev,
  1181. struct device_attribute *attr,
  1182. char *buf)
  1183. {
  1184. fpc1020_data_t *fpc1020;
  1185. struct fpc1020_attribute *fpc_attr;
  1186. u64 val;
  1187. int error = 0;
  1188. bool is_buffer = false;
  1189. u8 u8_buffer[FPC1020_REG_MAX_SIZE];
  1190. char hex_string[sizeof("0x") + (FPC1020_REG_MAX_SIZE * 2)];
  1191. fpc1020 = dev_get_drvdata(dev);
  1192. fpc_attr = container_of(attr, struct fpc1020_attribute, attr);
  1193. switch (fpc_attr->offset) {
  1194. case offsetof(fpc1020_diag_t, chip_id):
  1195. return scnprintf(buf,
  1196. PAGE_SIZE,
  1197. "%s rev.%d\n",
  1198. fpc1020_hw_id_text(fpc1020),
  1199. fpc1020->chip.revision);
  1200. break;
  1201. case offsetof(fpc1020_diag_t, selftest):
  1202. val = (u64)fpc1020_selftest_short(fpc1020);
  1203. break;
  1204. case offsetof(fpc1020_diag_t, spi_register):
  1205. val = (int)fpc1020->diag.spi_register;
  1206. break;
  1207. case offsetof(fpc1020_diag_t, spi_regsize):
  1208. val = (int)fpc1020->diag.spi_regsize;
  1209. break;
  1210. case offsetof(fpc1020_diag_t, spi_data):
  1211. is_buffer = (fpc1020->diag.spi_regsize > sizeof(val));
  1212. if (!is_buffer) {
  1213. error = fpc1020_spi_debug_value_read(fpc1020, &val);
  1214. } else {
  1215. error = fpc1020_spi_debug_buffer_read(fpc1020,
  1216. u8_buffer,
  1217. sizeof(u8_buffer));
  1218. }
  1219. break;
  1220. case offsetof(fpc1020_diag_t, last_capture_time):
  1221. val = (int)fpc1020->diag.last_capture_time;
  1222. break;
  1223. case offsetof(fpc1020_diag_t, finger_present_status):
  1224. error = fpc1020_get_finger_present_status(fpc1020);
  1225. if (error >= 0) {
  1226. val = (int)error;
  1227. error = 0;
  1228. }
  1229. break;
  1230. }
  1231. if (error >= 0 && !is_buffer) {
  1232. return scnprintf(buf,
  1233. PAGE_SIZE,
  1234. "%lu\n",
  1235. (unsigned long int)val);
  1236. }
  1237. if (error >= 0 && is_buffer) {
  1238. fpc1020_spi_debug_buffer_to_hex_string(hex_string,
  1239. u8_buffer,
  1240. fpc1020->diag.spi_regsize);
  1241. return scnprintf(buf, PAGE_SIZE, "%s\n", hex_string);
  1242. }
  1243. return error;
  1244. }
  1245. /* -------------------------------------------------------------------- */
  1246. static ssize_t fpc1020_store_attr_diag(struct device *dev,
  1247. struct device_attribute *attr,
  1248. const char *buf,
  1249. size_t count)
  1250. {
  1251. fpc1020_data_t *fpc1020 = dev_get_drvdata(dev);
  1252. u64 val;
  1253. int error = 0;
  1254. struct fpc1020_attribute *fpc_attr;
  1255. fpc_attr = container_of(attr, struct fpc1020_attribute, attr);
  1256. if (fpc_attr->offset == offsetof(fpc1020_diag_t, spi_register)) {
  1257. error = kstrtou64(buf, 0, &val);
  1258. if (!error) {
  1259. error = fpc1020_spi_debug_select(fpc1020,
  1260. (fpc1020_reg_t)val);
  1261. }
  1262. } else if (fpc_attr->offset == offsetof(fpc1020_diag_t, spi_data)) {
  1263. if (fpc1020->diag.spi_regsize <= sizeof(val)) {
  1264. error = kstrtou64(buf, 0, &val);
  1265. if (!error)
  1266. error = fpc1020_spi_debug_value_write(fpc1020,
  1267. val);
  1268. } else {
  1269. error = fpc1020_spi_debug_buffer_write(fpc1020,
  1270. buf,
  1271. count);
  1272. }
  1273. } else
  1274. error = -EPERM;
  1275. return (error < 0) ? error : strnlen(buf, count);
  1276. }
  1277. /* -------------------------------------------------------------------- */
  1278. static u8 fpc1020_selftest_short(fpc1020_data_t *fpc1020)
  1279. {
  1280. const char *id_str = "selftest,";
  1281. int error = 0;
  1282. bool resume_input = false;
  1283. if (fpc1020->input.enabled) {
  1284. resume_input = true;
  1285. fpc1020_worker_goto_idle(fpc1020);
  1286. }
  1287. fpc1020->diag.selftest = 0;
  1288. error = fpc1020_wake_up(fpc1020);
  1289. if (error) {
  1290. dev_err(&fpc1020->spi->dev,
  1291. "%s wake up fail on entry.\n", id_str);
  1292. goto out;
  1293. }
  1294. error = fpc1020_reset(fpc1020);
  1295. if (error) {
  1296. dev_err(&fpc1020->spi->dev,
  1297. "%s reset fail on entry.\n", id_str);
  1298. goto out;
  1299. }
  1300. error = fpc1020_check_hw_id(fpc1020);
  1301. if (error)
  1302. goto out;
  1303. error = fpc1020_cmd(fpc1020, FPC1020_CMD_CAPTURE_IMAGE, false);
  1304. if (error < 0) {
  1305. dev_err(&fpc1020->spi->dev,
  1306. "%s capture command failed.\n", id_str);
  1307. goto out;
  1308. }
  1309. #ifndef FPC_MTK
  1310. error = gpio_get_value(fpc1020->irq_gpio) ? 0 : -EIO;
  1311. if (error) {
  1312. dev_err(&fpc1020->spi->dev,
  1313. "%s IRQ not HIGH after capture.\n", id_str);
  1314. goto out;
  1315. }
  1316. #endif
  1317. error = fpc1020_wait_for_irq(fpc1020, FPC1020_DEFAULT_IRQ_TIMEOUT_MS);
  1318. if (error) {
  1319. dev_err(&fpc1020->spi->dev,
  1320. "%s IRQ-wait after capture failed.\n", id_str);
  1321. goto out;
  1322. }
  1323. error = fpc1020_read_irq(fpc1020, true);
  1324. if (error < 0) {
  1325. dev_err(&fpc1020->spi->dev,
  1326. "%s IRQ clear fail\n", id_str);
  1327. goto out;
  1328. } else
  1329. error = 0;
  1330. #ifndef FPC_MTK
  1331. error = (gpio_get_value(fpc1020->irq_gpio) == 0) ? 0 : -EIO;
  1332. if (error) {
  1333. dev_err(&fpc1020->spi->dev,
  1334. "%s IRQ not LOW after clear.\n", id_str);
  1335. goto out;
  1336. }
  1337. #endif
  1338. error = fpc1020_reset(fpc1020);
  1339. if (error) {
  1340. dev_err(&fpc1020->spi->dev,
  1341. "%s reset fail on exit.\n", id_str);
  1342. goto out;
  1343. }
  1344. error = fpc1020_read_status_reg(fpc1020);
  1345. if (error != FPC1020_STATUS_REG_RESET_VALUE) {
  1346. dev_err(&fpc1020->spi->dev,
  1347. "%s status check fail on exit.\n", id_str);
  1348. goto out;
  1349. }
  1350. error = 0;
  1351. out:
  1352. fpc1020->diag.selftest = (error == 0) ? 1 : 0;
  1353. dev_info(&fpc1020->spi->dev, "%s %s\n", id_str,
  1354. (fpc1020->diag.selftest) ? "PASS" : "FAIL");
  1355. if (resume_input && fpc1020->diag.selftest)
  1356. fpc1020_start_input(fpc1020);
  1357. return fpc1020->diag.selftest;
  1358. };
  1359. /* -------------------------------------------------------------------- */
  1360. static int fpc1020_start_capture(fpc1020_data_t *fpc1020)
  1361. {
  1362. fpc1020_capture_mode_t mode = fpc1020->setup.capture_mode;
  1363. int error = 0;
  1364. dev_dbg(&fpc1020->spi->dev, "%s mode= %d\n", __func__, mode);
  1365. /* Mode check (and pre-conditions if required) ? */
  1366. switch (mode) {
  1367. case FPC1020_MODE_WAIT_AND_CAPTURE:
  1368. case FPC1020_MODE_SINGLE_CAPTURE:
  1369. case FPC1020_MODE_CHECKERBOARD_TEST_NORM:
  1370. case FPC1020_MODE_CHECKERBOARD_TEST_INV:
  1371. case FPC1020_MODE_BOARD_TEST_ONE:
  1372. case FPC1020_MODE_BOARD_TEST_ZERO:
  1373. case FPC1020_MODE_WAIT_FINGER_DOWN:
  1374. case FPC1020_MODE_WAIT_FINGER_UP:
  1375. case FPC1020_MODE_SINGLE_CAPTURE_CAL:
  1376. case FPC1020_MODE_CAPTURE_AND_WAIT_FINGER_UP:
  1377. break;
  1378. case FPC1020_MODE_IDLE:
  1379. default:
  1380. error = -EINVAL;
  1381. break;
  1382. }
  1383. fpc1020->capture.current_mode = (error >= 0) ? mode : FPC1020_MODE_IDLE;
  1384. fpc1020->capture.state = FPC1020_CAPTURE_STATE_STARTED;
  1385. fpc1020->capture.available_bytes = 0;
  1386. fpc1020->capture.read_offset = 0;
  1387. fpc1020->capture.read_pending_eof = false;
  1388. fpc1020_new_job(fpc1020, FPC1020_WORKER_CAPTURE_MODE);
  1389. return error;
  1390. }
  1391. /* -------------------------------------------------------------------- */
  1392. static int fpc1020_worker_goto_idle(fpc1020_data_t *fpc1020)
  1393. {
  1394. const int wait_idle_us = 100;
  1395. if (down_trylock(&fpc1020->worker.sem_idle)) {
  1396. dev_dbg(&fpc1020->spi->dev, "%s, stop_request\n", __func__);
  1397. fpc1020->worker.stop_request = true;
  1398. fpc1020->worker.req_mode = FPC1020_WORKER_IDLE_MODE;
  1399. while (down_trylock(&fpc1020->worker.sem_idle)) {
  1400. fpc1020->worker.stop_request = true;
  1401. fpc1020->worker.req_mode = FPC1020_WORKER_IDLE_MODE;
  1402. udelay(wait_idle_us); /*original is usleep*/
  1403. }
  1404. dev_dbg(&fpc1020->spi->dev, "%s, is idle\n", __func__);
  1405. up(&fpc1020->worker.sem_idle);
  1406. } else {
  1407. dev_dbg(&fpc1020->spi->dev, "%s, already idle\n", __func__);
  1408. up(&fpc1020->worker.sem_idle);
  1409. }
  1410. return 0;
  1411. }
  1412. /* -------------------------------------------------------------------- */
  1413. static int fpc1020_new_job(fpc1020_data_t *fpc1020, int new_job)
  1414. {
  1415. dev_dbg(&fpc1020->spi->dev, "%s %d\n", __func__, new_job);
  1416. fpc1020_worker_goto_idle(fpc1020);
  1417. fpc1020->worker.req_mode = new_job;
  1418. fpc1020->worker.stop_request = false;
  1419. wake_up_interruptible(&fpc1020->worker.wq_wait_job);
  1420. return 0;
  1421. }
  1422. /* -------------------------------------------------------------------- */
  1423. static int fpc1020_worker_function(void *_fpc1020)
  1424. {
  1425. fpc1020_data_t *fpc1020 = _fpc1020;
  1426. while (!kthread_should_stop()) {
  1427. up(&fpc1020->worker.sem_idle);
  1428. wait_event_interruptible(fpc1020->worker.wq_wait_job,
  1429. fpc1020->worker.req_mode != FPC1020_WORKER_IDLE_MODE);
  1430. down(&fpc1020->worker.sem_idle);
  1431. switch (fpc1020->worker.req_mode) {
  1432. case FPC1020_WORKER_CAPTURE_MODE:
  1433. fpc1020->capture.state = FPC1020_CAPTURE_STATE_PENDING;
  1434. fpc1020_capture_task(fpc1020);
  1435. break;
  1436. case FPC1020_WORKER_INPUT_MODE:
  1437. if (fpc1020_capture_deferred_task(fpc1020) != -EINTR) {
  1438. fpc1020_input_enable(fpc1020, true);
  1439. fpc1020_input_task(fpc1020);
  1440. }
  1441. break;
  1442. case FPC1020_WORKER_IDLE_MODE:
  1443. case FPC1020_WORKER_EXIT:
  1444. default:
  1445. break;
  1446. }
  1447. if (fpc1020->worker.req_mode != FPC1020_WORKER_EXIT)
  1448. fpc1020->worker.req_mode = FPC1020_WORKER_IDLE_MODE;
  1449. }
  1450. return 0;
  1451. }
  1452. /* -------------------------------------------------------------------- */
  1453. /* SPI debug interface, implementation */
  1454. /* -------------------------------------------------------------------- */
  1455. static int fpc1020_spi_debug_select(fpc1020_data_t *fpc1020, fpc1020_reg_t reg)
  1456. {
  1457. u8 size = FPC1020_REG_SIZE(reg);
  1458. if (size) {
  1459. fpc1020->diag.spi_register = reg;
  1460. fpc1020->diag.spi_regsize = size;
  1461. dev_dbg(&fpc1020->spi->dev, "%s : selected %d (%d byte(s))\n",
  1462. __func__
  1463. , fpc1020->diag.spi_register
  1464. , fpc1020->diag.spi_regsize);
  1465. return 0;
  1466. }
  1467. dev_dbg(&fpc1020->spi->dev,
  1468. "%s : reg %d not available\n", __func__, reg);
  1469. return -ENOENT;
  1470. }
  1471. /* -------------------------------------------------------------------- */
  1472. static int fpc1020_spi_debug_value_write(fpc1020_data_t *fpc1020, u64 data)
  1473. {
  1474. int error = 0;
  1475. fpc1020_reg_access_t reg;
  1476. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  1477. FPC1020_MK_REG_WRITE_BYTES(reg,
  1478. fpc1020->diag.spi_register,
  1479. fpc1020->diag.spi_regsize,
  1480. (u8 *)&data);
  1481. error = fpc1020_reg_access(fpc1020, &reg);
  1482. return error;
  1483. }
  1484. /* -------------------------------------------------------------------- */
  1485. static int fpc1020_spi_debug_buffer_write(fpc1020_data_t *fpc1020,
  1486. const char *data, size_t count)
  1487. {
  1488. int error = 0;
  1489. fpc1020_reg_access_t reg;
  1490. u8 u8_buffer[FPC1020_REG_MAX_SIZE];
  1491. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  1492. error = fpc1020_spi_debug_hex_string_to_buffer(u8_buffer,
  1493. sizeof(u8_buffer),
  1494. data,
  1495. count);
  1496. if (error < 0)
  1497. return error;
  1498. FPC1020_MK_REG_WRITE_BYTES(reg,
  1499. fpc1020->diag.spi_register,
  1500. fpc1020->diag.spi_regsize,
  1501. u8_buffer);
  1502. error = fpc1020_reg_access(fpc1020, &reg);
  1503. return error;
  1504. }
  1505. /* -------------------------------------------------------------------- */
  1506. static int fpc1020_spi_debug_value_read(fpc1020_data_t *fpc1020, u64 *data)
  1507. {
  1508. int error = 0;
  1509. fpc1020_reg_access_t reg;
  1510. dev_dbg(&fpc1020->spi->dev, "%s\n", __func__);
  1511. *data = 0;
  1512. FPC1020_MK_REG_READ_BYTES(reg,
  1513. fpc1020->diag.spi_register,
  1514. fpc1020->diag.spi_regsize,
  1515. (u8 *)data);
  1516. error = fpc1020_reg_access(fpc1020, &reg);
  1517. return error;
  1518. }
  1519. /* -------------------------------------------------------------------- */
  1520. static int fpc1020_spi_debug_buffer_read(fpc1020_data_t *fpc1020,
  1521. u8 *data, size_t max_count)
  1522. {
  1523. int error = 0;
  1524. fpc1020_reg_access_t reg;
  1525. if (max_count < fpc1020->diag.spi_regsize)
  1526. return -ENOMEM;
  1527. FPC1020_MK_REG_READ_BYTES(reg,
  1528. fpc1020->diag.spi_register,
  1529. fpc1020->diag.spi_regsize,
  1530. data);
  1531. error = fpc1020_reg_access(fpc1020, &reg);
  1532. return error;
  1533. }
  1534. /* -------------------------------------------------------------------- */
  1535. static void fpc1020_spi_debug_buffer_to_hex_string(char *string,
  1536. u8 *buffer,
  1537. size_t bytes)
  1538. {
  1539. int count = bytes;
  1540. int pos = 0;
  1541. int src = (target_little_endian) ? (bytes - 1) : 0;
  1542. u8 v1, v2;
  1543. string[pos++] = '0';
  1544. string[pos++] = 'x';
  1545. while (count) {
  1546. v1 = buffer[src] >> 4;
  1547. v2 = buffer[src] & 0x0f;
  1548. string[pos++] = (v1 >= 0x0a) ? ('a' - 0x0a + v1) : ('0' + v1);
  1549. string[pos++] = (v2 >= 0x0a) ? ('a' - 0x0a + v2) : ('0' + v2);
  1550. src += (target_little_endian) ? -1 : 1;
  1551. count--;
  1552. }
  1553. string[pos] = '\0';
  1554. }
  1555. /* -------------------------------------------------------------------- */
  1556. static u8 fpc1020_char_to_u8(char in_char)
  1557. {
  1558. if ((in_char >= 'A') && (in_char <= 'F'))
  1559. return (u8)(in_char - 'A' + 0xa);
  1560. if ((in_char >= 'a') && (in_char <= 'f'))
  1561. return (u8)(in_char - 'a' + 0xa);
  1562. if ((in_char >= '0') && (in_char <= '9'))
  1563. return (u8)(in_char - '0');
  1564. return 0;
  1565. }
  1566. /* -------------------------------------------------------------------- */
  1567. static int fpc1020_spi_debug_hex_string_to_buffer(u8 *buffer,
  1568. size_t buf_size,
  1569. const char *string,
  1570. size_t chars)
  1571. {
  1572. int bytes = 0;
  1573. int count;
  1574. int dst = (target_little_endian) ? 0 : (buf_size - 1);
  1575. int pos;
  1576. u8 v1, v2;
  1577. if (string[1] != 'x' && string[1] != 'X')
  1578. return -EINVAL;
  1579. if (string[0] != '0')
  1580. return -EINVAL;
  1581. if (chars < sizeof("0x1"))
  1582. return -EINVAL;
  1583. count = buf_size;
  1584. while (count)
  1585. buffer[--count] = 0;
  1586. count = chars - sizeof("0x");
  1587. bytes = ((count % 2) == 0) ? (count / 2) : (count / 2) + 1;
  1588. if (bytes > buf_size)
  1589. return -EINVAL;
  1590. pos = chars - 2;
  1591. while (pos >= 2) {
  1592. v1 = fpc1020_char_to_u8(string[pos--]);
  1593. v2 = (pos >= 2) ? fpc1020_char_to_u8(string[pos--]) : 0;
  1594. buffer[dst] = (v2 << 4) | v1;
  1595. dst += (target_little_endian) ? 1 : -1;
  1596. }
  1597. return bytes;
  1598. }
  1599. /* -------------------------------------------------------------------- */
  1600. static int fpc1020_start_input(fpc1020_data_t *fpc1020)
  1601. {
  1602. return fpc1020_new_job(fpc1020, FPC1020_WORKER_INPUT_MODE);
  1603. }
  1604. /* -------------------------------------------------------------------- */