cyttsp4_devtree.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. /*
  2. * cyttsp4_devtree.c
  3. * Cypress TrueTouch(TM) Standard Product V4 Device Tree Support Driver.
  4. * For use with Cypress Txx4xx parts.
  5. * Supported parts include:
  6. * TMA4XX
  7. * TMA1036
  8. *
  9. * Copyright (C) 2013 Cypress Semiconductor
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * version 2, and only version 2, as published by the
  14. * Free Software Foundation.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * Contact Cypress Semiconductor at www.cypress.com <ttdrivers@cypress.com>
  22. *
  23. */
  24. #include <linux/device.h>
  25. #include <linux/err.h>
  26. #include <linux/of_device.h>
  27. #include <linux/slab.h>
  28. /* cyttsp */
  29. #include "cyttsp4_regs.h"
  30. #include <linux/cyttsp4_platform.h>
  31. #include <linux/of_gpio.h>
  32. #define ENABLE_VIRTUAL_KEYS
  33. #define MAX_NAME_LENGTH 64
  34. enum cyttsp4_device_type {
  35. DEVICE_MT,
  36. DEVICE_BTN,
  37. DEVICE_PROXIMITY,
  38. DEVICE_TYPE_MAX,
  39. };
  40. struct cyttsp4_device_pdata_func {
  41. void * (*create_and_get_pdata)(struct device_node *);
  42. void (*free_pdata)(void *);
  43. };
  44. struct cyttsp5_pdata_ptr {
  45. void **pdata;
  46. };
  47. #ifdef ENABLE_VIRTUAL_KEYS
  48. static struct kobject *board_properties_kobj;
  49. struct cyttsp4_virtual_keys {
  50. struct kobj_attribute kobj_attr;
  51. u16 *data;
  52. int size;
  53. };
  54. #endif
  55. struct cyttsp4_extended_mt_platform_data {
  56. struct cyttsp4_mt_platform_data pdata;
  57. #ifdef ENABLE_VIRTUAL_KEYS
  58. struct cyttsp4_virtual_keys vkeys;
  59. #endif
  60. };
  61. static inline int get_inp_dev_name(struct device_node *dev_node,
  62. const char **inp_dev_name)
  63. {
  64. return of_property_read_string(dev_node, "cy,inp_dev_name",
  65. inp_dev_name);
  66. }
  67. static u16 *create_and_get_u16_array(struct device_node *dev_node,
  68. const char *name, int *size)
  69. {
  70. const __be32 *values;
  71. u16 *val_array;
  72. int len;
  73. int sz;
  74. int rc;
  75. int i;
  76. values = of_get_property(dev_node, name, &len);
  77. if (values == NULL)
  78. return NULL;
  79. sz = len / sizeof(u32);
  80. pr_debug("%s: %s size:%d\n", __func__, name, sz);
  81. val_array = kzalloc(sz * sizeof(u16), GFP_KERNEL);
  82. if (val_array == NULL) {
  83. rc = -ENOMEM;
  84. goto fail;
  85. }
  86. for (i = 0; i < sz; i++)
  87. val_array[i] = (u16)be32_to_cpup(values++);
  88. *size = sz;
  89. return val_array;
  90. fail:
  91. return ERR_PTR(rc);
  92. }
  93. static struct touch_framework *create_and_get_touch_framework(
  94. struct device_node *dev_node)
  95. {
  96. struct touch_framework *frmwrk;
  97. u16 *abs;
  98. int size;
  99. int rc;
  100. abs = create_and_get_u16_array(dev_node, "cy,abs", &size);
  101. if (IS_ERR_OR_NULL(abs))
  102. return (void *)abs;
  103. /* Check for valid abs size */
  104. if (size % CY_NUM_ABS_SET) {
  105. rc = -EINVAL;
  106. goto fail_free_abs;
  107. }
  108. frmwrk = kzalloc(sizeof(*frmwrk), GFP_KERNEL);
  109. if (frmwrk == NULL) {
  110. rc = -ENOMEM;
  111. goto fail_free_abs;
  112. }
  113. frmwrk->abs = abs;
  114. frmwrk->size = size;
  115. return frmwrk;
  116. fail_free_abs:
  117. kfree(abs);
  118. return ERR_PTR(rc);
  119. }
  120. static void free_touch_framework(struct touch_framework *frmwrk)
  121. {
  122. kfree(frmwrk->abs);
  123. kfree(frmwrk);
  124. }
  125. #ifdef ENABLE_VIRTUAL_KEYS
  126. #define VIRTUAL_KEY_ELEMENT_SIZE 5
  127. static ssize_t virtual_keys_show(struct kobject *kobj,
  128. struct kobj_attribute *attr, char *buf)
  129. {
  130. struct cyttsp4_virtual_keys *vkeys = container_of(attr,
  131. struct cyttsp4_virtual_keys, kobj_attr);
  132. u16 *data = vkeys->data;
  133. int size = vkeys->size;
  134. int index;
  135. int i;
  136. index = 0;
  137. for (i = 0; i < size; i += VIRTUAL_KEY_ELEMENT_SIZE)
  138. index += scnprintf(buf + index, CY_MAX_PRBUF_SIZE - index,
  139. "0x01:%d:%d:%d:%d:%d\n",
  140. data[i], data[i+1], data[i+2], data[i+3], data[i+4]);
  141. return index;
  142. }
  143. static int setup_virtual_keys(struct device_node *dev_node,
  144. const char *inp_dev_name, struct cyttsp4_virtual_keys *vkeys)
  145. {
  146. char *name;
  147. u16 *data;
  148. int size;
  149. int rc;
  150. data = create_and_get_u16_array(dev_node, "cy,virtual_keys", &size);
  151. if (data == NULL)
  152. return 0;
  153. else if (IS_ERR(data)) {
  154. rc = PTR_ERR(data);
  155. goto fail;
  156. }
  157. /* Check for valid virtual keys size */
  158. if (size % VIRTUAL_KEY_ELEMENT_SIZE) {
  159. rc = -EINVAL;
  160. goto fail_free_data;
  161. }
  162. name = kzalloc(MAX_NAME_LENGTH, GFP_KERNEL);
  163. if (name == NULL) {
  164. rc = -ENOMEM;
  165. goto fail_free_data;
  166. }
  167. snprintf(name, MAX_NAME_LENGTH, "virtualkeys.%s", inp_dev_name);
  168. vkeys->data = data;
  169. vkeys->size = size;
  170. /* TODO: Instantiate in board file and export it */
  171. if (board_properties_kobj == NULL)
  172. board_properties_kobj =
  173. kobject_create_and_add("board_properties", NULL);
  174. if (board_properties_kobj == NULL) {
  175. pr_err("%s: Cannot get board_properties kobject!\n", __func__);
  176. rc = -EINVAL;
  177. goto fail_free_name;
  178. }
  179. /* Initialize dynamic SysFs attribute */
  180. sysfs_attr_init(&vkeys->kobj_attr.attr);
  181. vkeys->kobj_attr.attr.name = name;
  182. vkeys->kobj_attr.attr.mode = S_IRUGO;
  183. vkeys->kobj_attr.show = virtual_keys_show;
  184. rc = sysfs_create_file(board_properties_kobj, &vkeys->kobj_attr.attr);
  185. if (rc)
  186. goto fail_del_kobj;
  187. return 0;
  188. fail_del_kobj:
  189. kobject_del(board_properties_kobj);
  190. fail_free_name:
  191. kfree(name);
  192. vkeys->kobj_attr.attr.name = NULL;
  193. fail_free_data:
  194. kfree(data);
  195. vkeys->data = NULL;
  196. fail:
  197. return rc;
  198. }
  199. static void free_virtual_keys(struct cyttsp4_virtual_keys *vkeys)
  200. {
  201. if (board_properties_kobj)
  202. sysfs_remove_file(board_properties_kobj,
  203. &vkeys->kobj_attr.attr);
  204. kfree(vkeys->data);
  205. kfree(vkeys->kobj_attr.attr.name);
  206. }
  207. #endif
  208. static void *create_and_get_mt_pdata(struct device_node *dev_node)
  209. {
  210. struct cyttsp4_extended_mt_platform_data *ext_pdata;
  211. struct cyttsp4_mt_platform_data *pdata;
  212. u32 value;
  213. int rc;
  214. ext_pdata = kzalloc(sizeof(*ext_pdata), GFP_KERNEL);
  215. if (ext_pdata == NULL) {
  216. rc = -ENOMEM;
  217. goto fail;
  218. }
  219. pdata = &ext_pdata->pdata;
  220. rc = get_inp_dev_name(dev_node, &pdata->inp_dev_name);
  221. if (rc)
  222. goto fail_free_pdata;
  223. /* Optional fields */
  224. rc = of_property_read_u32(dev_node, "cy,flags", &value);
  225. if (!rc)
  226. pdata->flags = value;
  227. rc = of_property_read_u32(dev_node, "cy,vkeys_x", &value);
  228. if (!rc)
  229. pdata->vkeys_x = value;
  230. rc = of_property_read_u32(dev_node, "cy,vkeys_y", &value);
  231. if (!rc)
  232. pdata->vkeys_y = value;
  233. /* Required fields */
  234. pdata->frmwrk = create_and_get_touch_framework(dev_node);
  235. if (pdata->frmwrk == NULL) {
  236. rc = -EINVAL;
  237. goto fail_free_pdata;
  238. } else if (IS_ERR(pdata->frmwrk)) {
  239. rc = PTR_ERR(pdata->frmwrk);
  240. goto fail_free_pdata;
  241. }
  242. #ifdef ENABLE_VIRTUAL_KEYS
  243. rc = setup_virtual_keys(dev_node, pdata->inp_dev_name,
  244. &ext_pdata->vkeys);
  245. if (rc) {
  246. pr_err("%s: Cannot setup virtual keys!\n", __func__);
  247. goto fail_free_pdata;
  248. }
  249. #endif
  250. return pdata;
  251. fail_free_pdata:
  252. kfree(ext_pdata);
  253. fail:
  254. return ERR_PTR(rc);
  255. }
  256. static void free_mt_pdata(void *pdata)
  257. {
  258. struct cyttsp4_mt_platform_data *mt_pdata =
  259. (struct cyttsp4_mt_platform_data *)pdata;
  260. struct cyttsp4_extended_mt_platform_data *ext_mt_pdata =
  261. container_of(mt_pdata,
  262. struct cyttsp4_extended_mt_platform_data, pdata);
  263. free_touch_framework(mt_pdata->frmwrk);
  264. #ifdef ENABLE_VIRTUAL_KEYS
  265. free_virtual_keys(&ext_mt_pdata->vkeys);
  266. #endif
  267. kfree(ext_mt_pdata);
  268. }
  269. static void *create_and_get_btn_pdata(struct device_node *dev_node)
  270. {
  271. struct cyttsp4_btn_platform_data *pdata;
  272. int rc;
  273. pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  274. if (pdata == NULL) {
  275. rc = -ENOMEM;
  276. goto fail;
  277. }
  278. rc = get_inp_dev_name(dev_node, &pdata->inp_dev_name);
  279. if (rc)
  280. goto fail_free_pdata;
  281. return pdata;
  282. fail_free_pdata:
  283. kfree(pdata);
  284. fail:
  285. return ERR_PTR(rc);
  286. }
  287. static void free_btn_pdata(void *pdata)
  288. {
  289. struct cyttsp4_btn_platform_data *btn_pdata =
  290. (struct cyttsp4_btn_platform_data *)pdata;
  291. kfree(btn_pdata);
  292. }
  293. static void *create_and_get_proximity_pdata(struct device_node *dev_node)
  294. {
  295. struct cyttsp4_proximity_platform_data *pdata;
  296. int rc;
  297. pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  298. if (pdata == NULL) {
  299. rc = -ENOMEM;
  300. goto fail;
  301. }
  302. rc = get_inp_dev_name(dev_node, &pdata->inp_dev_name);
  303. if (rc)
  304. goto fail_free_pdata;
  305. pdata->frmwrk = create_and_get_touch_framework(dev_node);
  306. if (pdata->frmwrk == NULL) {
  307. rc = -EINVAL;
  308. goto fail_free_pdata;
  309. } else if (IS_ERR(pdata->frmwrk)) {
  310. rc = PTR_ERR(pdata->frmwrk);
  311. goto fail_free_pdata;
  312. }
  313. return pdata;
  314. fail_free_pdata:
  315. kfree(pdata);
  316. fail:
  317. return ERR_PTR(rc);
  318. }
  319. static void free_proximity_pdata(void *pdata)
  320. {
  321. struct cyttsp4_proximity_platform_data *proximity_pdata =
  322. (struct cyttsp4_proximity_platform_data *)pdata;
  323. free_touch_framework(proximity_pdata->frmwrk);
  324. kfree(proximity_pdata);
  325. }
  326. static struct cyttsp4_device_pdata_func device_pdata_funcs[DEVICE_TYPE_MAX] = {
  327. [DEVICE_MT] = {
  328. .create_and_get_pdata = create_and_get_mt_pdata,
  329. .free_pdata = free_mt_pdata,
  330. },
  331. [DEVICE_BTN] = {
  332. .create_and_get_pdata = create_and_get_btn_pdata,
  333. .free_pdata = free_btn_pdata,
  334. },
  335. [DEVICE_PROXIMITY] = {
  336. .create_and_get_pdata = create_and_get_proximity_pdata,
  337. .free_pdata = free_proximity_pdata,
  338. },
  339. };
  340. static struct cyttsp5_pdata_ptr pdata_ptr[DEVICE_TYPE_MAX];
  341. static const char *device_names[DEVICE_TYPE_MAX] = {
  342. [DEVICE_MT] = "cy,mt",
  343. [DEVICE_BTN] = "cy,btn",
  344. [DEVICE_PROXIMITY] = "cy,proximity",
  345. };
  346. static void set_pdata_ptr(struct cyttsp4_platform_data *pdata)
  347. {
  348. pdata_ptr[DEVICE_MT].pdata = (void **)&pdata->mt_pdata;
  349. pdata_ptr[DEVICE_BTN].pdata = (void **)&pdata->btn_pdata;
  350. pdata_ptr[DEVICE_PROXIMITY].pdata = (void **)&pdata->prox_pdata;
  351. }
  352. static int get_device_type(struct device_node *dev_node,
  353. enum cyttsp4_device_type *type)
  354. {
  355. const char *name;
  356. enum cyttsp4_device_type t;
  357. int rc;
  358. rc = of_property_read_string(dev_node, "name", &name);
  359. if (rc)
  360. return rc;
  361. for (t = 0; t < DEVICE_TYPE_MAX; t++)
  362. if (!strncmp(name, device_names[t], MAX_NAME_LENGTH)) {
  363. *type = t;
  364. return 0;
  365. }
  366. return -EINVAL;
  367. }
  368. static inline void *create_and_get_device_pdata(struct device_node *dev_node,
  369. enum cyttsp4_device_type type)
  370. {
  371. return device_pdata_funcs[type].create_and_get_pdata(dev_node);
  372. }
  373. static inline void free_device_pdata(enum cyttsp4_device_type type)
  374. {
  375. device_pdata_funcs[type].free_pdata(*pdata_ptr[type].pdata);
  376. }
  377. static struct touch_settings *create_and_get_touch_setting(
  378. struct device_node *core_node, const char *name)
  379. {
  380. struct touch_settings *setting;
  381. char *tag_name;
  382. u32 tag_value;
  383. u16 *data;
  384. int size;
  385. int rc;
  386. data = create_and_get_u16_array(core_node, name, &size);
  387. if (IS_ERR_OR_NULL(data))
  388. return (void *)data;
  389. pr_debug("%s: Touch setting:'%s' size:%d\n", __func__, name, size);
  390. setting = kzalloc(sizeof(*setting), GFP_KERNEL);
  391. if (setting == NULL) {
  392. rc = -ENOMEM;
  393. goto fail_free_data;
  394. }
  395. setting->data = (u8 *)data;
  396. setting->size = size;
  397. tag_name = kzalloc(MAX_NAME_LENGTH, GFP_KERNEL);
  398. if (tag_name == NULL) {
  399. rc = -ENOMEM;
  400. goto fail_free_setting;
  401. }
  402. snprintf(tag_name, MAX_NAME_LENGTH, "%s-tag", name);
  403. rc = of_property_read_u32(core_node, tag_name, &tag_value);
  404. if (!rc)
  405. setting->tag = tag_value;
  406. kfree(tag_name);
  407. return setting;
  408. fail_free_setting:
  409. kfree(setting);
  410. fail_free_data:
  411. kfree(data);
  412. return ERR_PTR(rc);
  413. }
  414. static void free_touch_setting(struct touch_settings *setting)
  415. {
  416. if (setting) {
  417. kfree(setting->data);
  418. kfree(setting);
  419. }
  420. }
  421. static char *touch_setting_names[CY_IC_GRPNUM_NUM] = {
  422. NULL, /* CY_IC_GRPNUM_RESERVED */
  423. "cy,cmd_regs", /* CY_IC_GRPNUM_CMD_REGS */
  424. "cy,tch_rep", /* CY_IC_GRPNUM_TCH_REP */
  425. "cy,data_rec", /* CY_IC_GRPNUM_DATA_REC */
  426. "cy,test_rec", /* CY_IC_GRPNUM_TEST_REC */
  427. "cy,pcfg_rec", /* CY_IC_GRPNUM_PCFG_REC */
  428. "cy,tch_parm_val", /* CY_IC_GRPNUM_TCH_PARM_VAL */
  429. "cy,tch_parm_size", /* CY_IC_GRPNUM_TCH_PARM_SIZE */
  430. NULL, /* CY_IC_GRPNUM_RESERVED1 */
  431. NULL, /* CY_IC_GRPNUM_RESERVED2 */
  432. "cy,opcfg_rec", /* CY_IC_GRPNUM_OPCFG_REC */
  433. "cy,ddata_rec", /* CY_IC_GRPNUM_DDATA_REC */
  434. "cy,mdata_rec", /* CY_IC_GRPNUM_MDATA_REC */
  435. "cy,test_regs", /* CY_IC_GRPNUM_TEST_REGS */
  436. "cy,btn_keys", /* CY_IC_GRPNUM_BTN_KEYS */
  437. NULL, /* CY_IC_GRPNUM_TTHE_REGS */
  438. };
  439. int avdd_gpio;
  440. const char *model_name;
  441. static struct cyttsp4_core_platform_data *create_and_get_core_pdata(
  442. struct device_node *core_node)
  443. {
  444. struct cyttsp4_core_platform_data *pdata;
  445. u32 value;
  446. int rc;
  447. int i;
  448. pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  449. if (pdata == NULL) {
  450. rc = -ENOMEM;
  451. goto fail;
  452. }
  453. /* Required fields */
  454. rc = of_property_read_u32(core_node, "cy,irq_gpio", &value);
  455. if (rc)
  456. goto fail_free;
  457. pdata->irq_gpio = value;
  458. /* Optional fields */
  459. /* rst_gpio is optional since a platform may use
  460. * power cycling instead of using the XRES pin
  461. */
  462. rc = of_property_read_u32(core_node, "cy,rst_gpio", &value);
  463. if (!rc)
  464. pdata->rst_gpio = value;
  465. rc = of_property_read_u32(core_node, "cy,level_irq_udelay", &value);
  466. if (!rc)
  467. pdata->level_irq_udelay = value;
  468. rc = of_property_read_u32(core_node, "cy,max_xfer_len", &value);
  469. if (!rc)
  470. pdata->max_xfer_len = value;
  471. rc = of_property_read_u32(core_node, "cy,flags", &value);
  472. if (!rc)
  473. pdata->flags = value;
  474. rc = of_property_read_string(core_node, "cy,pname", &model_name);
  475. if (rc < 0)
  476. goto fail_free;
  477. avdd_gpio = of_get_named_gpio(core_node, "tsp,tsppwr_en", 0);
  478. printk(KERN_INFO "[TSP] %s: avdd=%d", __func__, avdd_gpio);
  479. rc = of_property_read_u32(core_node, "cy,easy_wakeup_gesture", &value);
  480. if (!rc)
  481. pdata->easy_wakeup_gesture = (u8)value;
  482. for (i = 0; (unsigned int)i < ARRAY_SIZE(touch_setting_names); i++) {
  483. if (touch_setting_names[i] == NULL)
  484. continue;
  485. pdata->sett[i] = create_and_get_touch_setting(core_node,
  486. touch_setting_names[i]);
  487. if (IS_ERR(pdata->sett[i])) {
  488. rc = PTR_ERR(pdata->sett[i]);
  489. goto fail_free_sett;
  490. } else if (pdata->sett[i] == NULL)
  491. pr_debug("%s: No data for setting '%s'\n", __func__,
  492. touch_setting_names[i]);
  493. }
  494. pr_debug("%s: irq_gpio:%d rst_gpio:%d level_irq_udelay:%d\n"
  495. "max_xfer_len:%d flags:%d easy_wakeup_gesture:%d\n", __func__,
  496. pdata->irq_gpio, pdata->rst_gpio, pdata->level_irq_udelay,
  497. pdata->max_xfer_len, pdata->flags, pdata->easy_wakeup_gesture);
  498. pdata->xres = cyttsp4_xres;
  499. pdata->init = cyttsp4_init;
  500. pdata->power = cyttsp4_power;
  501. #ifdef CYTTSP4_DETECT_HW
  502. pdata->detect = cyttsp4_detect;
  503. #endif
  504. pdata->irq_stat = cyttsp4_irq_stat;
  505. return pdata;
  506. fail_free_sett:
  507. for (i--; i >= 0; i--)
  508. free_touch_setting(pdata->sett[i]);
  509. fail_free:
  510. kfree(pdata);
  511. fail:
  512. return ERR_PTR(rc);
  513. }
  514. static void free_core_pdata(void *pdata)
  515. {
  516. struct cyttsp4_core_platform_data *core_pdata = pdata;
  517. unsigned int i;
  518. for (i = 0; i < ARRAY_SIZE(touch_setting_names); i++)
  519. free_touch_setting(core_pdata->sett[i]);
  520. kfree(core_pdata);
  521. }
  522. int cyttsp4_devtree_create_and_get_pdata(struct device *adap_dev)
  523. {
  524. struct cyttsp4_platform_data *pdata;
  525. struct device_node *core_node, *dev_node, *dev_node_fail;
  526. enum cyttsp4_device_type type;
  527. int count = 0;
  528. int rc = 0;
  529. if (!adap_dev->of_node)
  530. return 0;
  531. pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  532. if (!pdata)
  533. return -ENOMEM;
  534. adap_dev->platform_data = pdata;
  535. set_pdata_ptr(pdata);
  536. /* There should be only one core node */
  537. for_each_child_of_node(adap_dev->of_node, core_node) {
  538. const char *name;
  539. rc = of_property_read_string(core_node, "name", &name);
  540. if (!rc)
  541. pr_debug("%s: name:%s\n", __func__, name);
  542. pdata->core_pdata = create_and_get_core_pdata(core_node);
  543. if (IS_ERR(pdata->core_pdata)) {
  544. rc = PTR_ERR(pdata->core_pdata);
  545. break;
  546. }
  547. /* Increment reference count */
  548. of_node_get(core_node);
  549. for_each_child_of_node(core_node, dev_node) {
  550. count++;
  551. rc = get_device_type(dev_node, &type);
  552. if (rc)
  553. break;
  554. *pdata_ptr[type].pdata
  555. = create_and_get_device_pdata(dev_node, type);
  556. if (IS_ERR(*pdata_ptr[type].pdata))
  557. rc = PTR_ERR(*pdata_ptr[type].pdata);
  558. if (rc)
  559. break;
  560. /* Increment reference count */
  561. of_node_get(dev_node);
  562. }
  563. if (rc) {
  564. free_core_pdata(pdata->core_pdata);
  565. of_node_put(core_node);
  566. for_each_child_of_node(core_node, dev_node_fail) {
  567. if (dev_node == dev_node_fail)
  568. break;
  569. rc = get_device_type(dev_node, &type);
  570. if (rc)
  571. break;
  572. free_device_pdata(type);
  573. of_node_put(dev_node);
  574. }
  575. break;
  576. }
  577. pdata->loader_pdata = &_cyttsp4_loader_platform_data;
  578. }
  579. pr_debug("%s: %d child node(s) found\n", __func__, count);
  580. return rc;
  581. }
  582. EXPORT_SYMBOL_GPL(cyttsp4_devtree_create_and_get_pdata);
  583. int cyttsp4_devtree_clean_pdata(struct device *adap_dev)
  584. {
  585. struct cyttsp4_platform_data *pdata;
  586. struct device_node *core_node, *dev_node;
  587. enum cyttsp4_device_type type;
  588. int rc = 0;
  589. if (!adap_dev->of_node)
  590. return 0;
  591. pdata = dev_get_platdata(adap_dev);
  592. set_pdata_ptr(pdata);
  593. for_each_child_of_node(adap_dev->of_node, core_node) {
  594. free_core_pdata(pdata->core_pdata);
  595. of_node_put(core_node);
  596. for_each_child_of_node(core_node, dev_node) {
  597. rc = get_device_type(dev_node, &type);
  598. if (rc)
  599. break;
  600. free_device_pdata(type);
  601. of_node_put(dev_node);
  602. }
  603. }
  604. return rc;
  605. }
  606. EXPORT_SYMBOL_GPL(cyttsp4_devtree_clean_pdata);
  607. MODULE_LICENSE("GPL");
  608. MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard Product DeviceTree Driver");
  609. MODULE_AUTHOR("Cypress Semiconductor <ttdrivers@cypress.com>");