ark1668e-adc.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/platform_device.h>
  4. #include <linux/io.h>
  5. #include <linux/iio/iio.h>
  6. #include <linux/iio/machine.h>
  7. #include <linux/iio/driver.h>
  8. #include <linux/mfd/syscon.h>
  9. #include <linux/regmap.h>
  10. #include <linux/of_platform.h>
  11. #include <linux/err.h>
  12. #include <linux/errno.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/delay.h>
  15. #include <linux/clk.h>
  16. #include <linux/completion.h>
  17. enum ADC_MODE{
  18. ARK_ADC_MODE_NONE,
  19. ARK_ADC_MODE_BATTERY,
  20. ARK_ADC_MODE_KEY,
  21. ARK_ADC_MODE_END,
  22. };
  23. struct ark_adc {
  24. struct ark_adc_data *data;
  25. struct device *dev;
  26. void __iomem *sys_base;
  27. void __iomem *adc_base;
  28. struct clk *clk;
  29. struct completion completion;
  30. u32 irq;
  31. u32 mode[4]; //adc channel[n] mode(battery, key, ...)
  32. u32 value1[4]; //adc channel[n] temp value
  33. u32 value2[4]; //adc channel[n] final value
  34. };
  35. struct ark_adc_data {
  36. int num_channels;
  37. u32 mask;
  38. void (*init_hw)(struct ark_adc *info);
  39. void (*exit_hw)(struct ark_adc *info);
  40. //void (*clear_irq)(struct ark_adc *info);
  41. void (*start_conv)(struct ark_adc *info, unsigned long addr);
  42. };
  43. #define BAT_CHANNEL 1
  44. #define TOUCHPAN_CHANNEL 2
  45. #define AUX0_CHANNEL 3
  46. #define AUX1_CHANNEL 4
  47. #define AUX2_CHANNEL 5
  48. #define AUX3_CHANNEL 6
  49. #define AUX0_START_INT (1<<0)
  50. #define AUX0_STOP_INT (1<<1)
  51. #define AUX0_VALUE_INT (1<<2)
  52. #define AUX1_START_INT (1<<3)
  53. #define AUX1_STOP_INT (1<<4)
  54. #define AUX1_VALUE_INT (1<<5)
  55. #define AUX2_START_INT (1<<6)
  56. #define AUX2_STOP_INT (1<<7)
  57. #define AUX2_VALUE_INT (1<<8)
  58. #define AUX3_START_INT (1<<9)
  59. #define AUX3_STOP_INT (1<<10)
  60. #define AUX3_VALUE_INT (1<<11)
  61. #define AUX_START_INT(ch) (1 << ((ch)*3 + 0))
  62. #define AUX_STOP_INT(ch) (1 << ((ch)*3 + 1))
  63. #define AUX_VALUE_INT(ch) (1 << ((ch)*3 + 2))
  64. #define ARK1668_ADC_CHANNEL_MAX_NUMS 4
  65. #define ARK1668E_ADC_CHANNEL_MAX_NUMS 4
  66. #define ARKN141_ADC_CHANNEL_MAX_NUMS 2
  67. #define ARK_ADC_DATX_MASK_12BIT 0xFFF
  68. #define ARK_ADC_DATX_MASK_10BIT 0x3FF
  69. #define ARK_BATTERY_VOLTAGE_REF 3300// 3.3V
  70. #define ARK_ADC_TIMEOUT (msecs_to_jiffies(100))
  71. #define ARK_ADC_USE_PULL_UP_REGISTER //ADC connect pull up register, have interrupe when voltage in 0V ~ 3V
  72. //#define ARK_ADC_USE_PULL_DOWM_REGISTER //ADC connect pull dowm register, have interrupt when voltage in 0.3V ~ 3.3V
  73. #define ADC_CHANNEL(_index, _id) { \
  74. .type = IIO_VOLTAGE, \
  75. .indexed = 1, \
  76. .channel = _index, \
  77. .address = _index, \
  78. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  79. .datasheet_name = _id, \
  80. }
  81. static const struct iio_chan_spec ark_adc_iio_channels[] = {
  82. ADC_CHANNEL(0, "adc0"),
  83. ADC_CHANNEL(1, "adc1"),
  84. ADC_CHANNEL(2, "adc2"),
  85. ADC_CHANNEL(3, "adc3"),
  86. };
  87. static int ark_adc_reg_access(struct iio_dev *indio_dev,
  88. unsigned reg, unsigned writeval,
  89. unsigned *readval)
  90. {
  91. //struct ark_adc *info = iio_priv(indio_dev);
  92. //printk(KERN_ALERT "### ark_adc_reg_access\n");
  93. if (!readval)
  94. return -EINVAL;
  95. //*readval = readl(info->adc_base + reg);
  96. return 0;
  97. }
  98. static int ark_read_raw(struct iio_dev *indio_dev,
  99. struct iio_chan_spec const *chan,
  100. int *val,
  101. int *val2,
  102. long mask)
  103. {
  104. struct ark_adc *info = iio_priv(indio_dev);
  105. unsigned long timeout;
  106. int ret = 0;
  107. mutex_lock(&indio_dev->mlock);
  108. reinit_completion(&info->completion);
  109. /* Select the channel to be used and Trigger conversion */
  110. if (info->data->start_conv)
  111. info->data->start_conv(info, chan->address);
  112. timeout = wait_for_completion_timeout(&info->completion, ARK_ADC_TIMEOUT);
  113. if (timeout == 0) {
  114. dev_warn(&indio_dev->dev, "Conversion timed out! Resetting\n");
  115. if (info->data->init_hw)
  116. info->data->init_hw(info);
  117. ret = -ETIMEDOUT;
  118. } else {
  119. *val = info->value2[chan->address];
  120. *val2 = 0;
  121. ret = IIO_VAL_INT;
  122. }
  123. mutex_unlock(&indio_dev->mlock);
  124. //printk(KERN_ALERT "### READ :%d\n", readl(info->adc_base+0x14));
  125. return ret;
  126. }
  127. static const struct iio_info ark_adc_iio_info = {
  128. .read_raw = &ark_read_raw,
  129. .debugfs_reg_access = &ark_adc_reg_access,
  130. };
  131. static void ark1668e_adc_init_hw(struct ark_adc *info)
  132. {
  133. unsigned int val;
  134. val = readl(info->sys_base+0x74);
  135. val |= (1 << 2);
  136. writel(val, info->sys_base+0x74);
  137. val = readl(info->adc_base+0x4);
  138. val |= (0x3f<<16);
  139. writel(val, info->adc_base+0x4);
  140. val = readl(info->adc_base+0x0);
  141. val &=~(1<<31);
  142. writel(val, info->adc_base+0x0);
  143. val |=1<<26;
  144. writel(val, info->adc_base+0x0);
  145. val |=0xff;
  146. writel(val, info->adc_base+0x0);
  147. val |=0xff << 16;
  148. writel(val, info->adc_base+0x0);
  149. val = readl(info->adc_base+0x10);
  150. val |= 0xffff;
  151. writel(val, info->adc_base+0x10);
  152. val = readl(info->adc_base+0x08);
  153. val &=~0xffffff;
  154. writel(val, info->adc_base+0x08);
  155. }
  156. static void ark1668e_adc_exit_hw(struct ark_adc *info)
  157. {
  158. //printk(KERN_ALERT "### exit\n");
  159. }
  160. static void ark1668e_adc_start_conv(struct ark_adc *info, unsigned long addr)
  161. {
  162. u32 value = info->value1[addr];
  163. #ifdef ARK_ADC_USE_PULL_UP_REGISTER
  164. if((value >= 0) && (value <= 3000))
  165. info->value2[addr] = value;
  166. else
  167. info->value2[addr] = ARK_BATTERY_VOLTAGE_REF;
  168. info->value1[addr] = ARK_BATTERY_VOLTAGE_REF;
  169. #else
  170. info->value2[addr] = value;
  171. #endif
  172. complete(&info->completion);
  173. }
  174. static const struct ark_adc_data ark1668e_adc_data = {
  175. .num_channels = ARK1668E_ADC_CHANNEL_MAX_NUMS,
  176. .mask = ARK_ADC_DATX_MASK_12BIT,
  177. .init_hw = ark1668e_adc_init_hw,
  178. .exit_hw = ark1668e_adc_exit_hw,
  179. .start_conv = ark1668e_adc_start_conv,
  180. };
  181. static const struct of_device_id ark_adc_match[] = {
  182. {
  183. .compatible = "arkmicro,ark1668e-adc",
  184. .data = &ark1668e_adc_data,
  185. },
  186. {},
  187. };
  188. MODULE_DEVICE_TABLE(of, ark_adc_match);
  189. static struct ark_adc_data *ark_adc_get_data(struct platform_device *pdev)
  190. {
  191. const struct of_device_id *match = of_match_node(ark_adc_match, pdev->dev.of_node);
  192. return (struct ark_adc_data *)match->data;
  193. }
  194. static irqreturn_t ark_adc_intr_handler(int irq, void *dev_id)
  195. {
  196. struct ark_adc *info = (struct ark_adc *)dev_id;
  197. u32 val,range,status;
  198. //printk(KERN_ALERT "++++++ark_adc_intr_handler entry\n");
  199. status = readl(info->adc_base+0x0c);
  200. if(status&(1<<23))
  201. {
  202. val = readl(info->adc_base+0x24);
  203. //printk(KERN_ALERT "aux7 value is 0x%x\r\n",(val>>16)&0xfff);
  204. val = ~(1<<23);
  205. writel(val, info->adc_base+0x0c);
  206. }
  207. if(status&(1<<22))
  208. {
  209. val = ~(1<<22);
  210. writel(val, info->adc_base+0x0c);
  211. }
  212. if(status&(1<<21))
  213. {
  214. val = ~(1<<21);
  215. writel(val, info->adc_base+0x0c);
  216. }
  217. if(status&(1<<20))
  218. {
  219. val = readl(info->adc_base+0x24);
  220. //printk(KERN_ALERT "aux6 value is 0x%x\r\n",(val)&0xfff);
  221. val = ~(1<<20);
  222. writel(val, info->adc_base+0x0c);
  223. }
  224. if(status&(1<<19))
  225. {
  226. val = ~(1<<19);
  227. writel(val, info->adc_base+0x0c);
  228. }
  229. if(status&(1<<18))
  230. {
  231. val = ~(1<<18);
  232. writel(val, info->adc_base+0x0c);
  233. }
  234. if(status&(1<<17))
  235. {
  236. val = readl(info->adc_base+0x20);
  237. //printk(KERN_ALERT "aux5 value is 0x%x\r\n",(val>>16)&0xfff);
  238. val = ~(1<<17);
  239. writel(val, info->adc_base+0x0c);
  240. }
  241. if(status&(1<<16))
  242. {
  243. val = ~(1<<16);
  244. writel(val, info->adc_base+0x0c);
  245. }
  246. if(status&(1<<15))
  247. {
  248. val = ~(1<<15);
  249. writel(val, info->adc_base+0x0c);
  250. }
  251. if(status&(1<<14))
  252. {
  253. val = readl(info->adc_base+0x20);
  254. //printk(KERN_ALERT "aux4 value is 0x%x\r\n",(val)&0xfff);
  255. val = ~(1<<14);
  256. writel(val, info->adc_base+0x0c);
  257. }
  258. if(status&(1<<13))
  259. {
  260. val = ~(1<<13);
  261. writel(val, info->adc_base+0x0c);
  262. }
  263. if(status&(1<<12))
  264. {
  265. val = ~(1<<12);
  266. writel(val, info->adc_base+0x0c);
  267. }
  268. if(status&(1<<11))
  269. {
  270. val = readl(info->adc_base+0x1c);
  271. range = ((info->data->mask==ARK_ADC_DATX_MASK_12BIT) ? 4096 : 1024);
  272. info->value1[3] = ((val>>16)&0xfff) * ARK_BATTERY_VOLTAGE_REF / range;
  273. //printk(KERN_ALERT "aux3 value = %d \n",(val>>16)&0xfff);
  274. val = ~(1<<11);
  275. writel(val, info->adc_base+0x0c);
  276. }
  277. if(status&(1<<10))
  278. {
  279. val = ~(1<<10);
  280. writel(val, info->adc_base+0x0c);
  281. }
  282. if(status&(1<<9))
  283. {
  284. val = ~(1<<9);
  285. writel(val, info->adc_base+0x0c);
  286. }
  287. if(status&(1<<8))
  288. {
  289. val = readl(info->adc_base+0x1c);
  290. range = ((info->data->mask==ARK_ADC_DATX_MASK_12BIT) ? 4096 : 1024);
  291. info->value1[2] = ((val)&0xfff) * ARK_BATTERY_VOLTAGE_REF / range;
  292. val = ~(1<<8);
  293. writel(val, info->adc_base+0x0c);
  294. }
  295. if(status&(1<<7))
  296. {
  297. val = ~(1<<7);
  298. writel(val, info->adc_base+0x0c);
  299. }
  300. if(status&(1<<6))
  301. {
  302. val = ~(1<<6);
  303. writel(val, info->adc_base+0x0c);
  304. }
  305. if(status&(1<<5))
  306. {
  307. val = readl(info->adc_base+0x18);
  308. range = ((info->data->mask==ARK_ADC_DATX_MASK_12BIT) ? 4096 : 1024);
  309. info->value1[1] = ((val>>16)&0xfff) * ARK_BATTERY_VOLTAGE_REF / range;
  310. val = ~(1<<5);
  311. writel(val, info->adc_base+0x0c);
  312. }
  313. if(status&(1<<4))
  314. {
  315. val = ~(1<<4);
  316. writel(val, info->adc_base+0x0c);
  317. }
  318. if(status&(1<<3))
  319. {
  320. val = ~(1<<3);
  321. writel(val, info->adc_base+0x0c);
  322. }
  323. if(status&(1<<2))
  324. {
  325. val = readl(info->adc_base+0x18);
  326. range = ((info->data->mask==ARK_ADC_DATX_MASK_12BIT) ? 4096 : 1024);
  327. info->value1[0] = ((val)&0xfff) * ARK_BATTERY_VOLTAGE_REF / range;
  328. //printk(KERN_ALERT "aux0 value = 0x%x,info->value1[0] = %d\n",val&0xfff,info->value1[0]);
  329. val = ~(1<<2);
  330. writel(val, info->adc_base+0x0c);
  331. }
  332. if(status&(1<<1))
  333. {
  334. val = ~(1<<1);
  335. writel(val, info->adc_base+0x0c);
  336. }
  337. if(status&(1<<0))
  338. {
  339. val = ~(1<<0);
  340. writel(val, info->adc_base+0x0c);
  341. }
  342. return IRQ_HANDLED;
  343. }
  344. static int ark_adc_probe(struct platform_device *pdev)
  345. {
  346. //struct device_node *np = pdev->dev.of_node;
  347. struct iio_dev *indio_dev = NULL;
  348. struct ark_adc *info = NULL;
  349. struct resource *res = NULL;
  350. int ret = -ENODEV;
  351. indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct ark_adc));
  352. if (!indio_dev) {
  353. dev_err(&pdev->dev, "failed allocating iio device\n");
  354. return -ENOMEM;
  355. }
  356. info = iio_priv(indio_dev);
  357. //get data
  358. info->data = ark_adc_get_data(pdev);
  359. if (!info->data) {
  360. dev_err(&pdev->dev, "failed getting ark_adc_data\n");
  361. goto err_devm_iio_device_alloc;
  362. }
  363. //adc resource
  364. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  365. info->adc_base= devm_ioremap_resource(&pdev->dev, res);
  366. if (IS_ERR(info->adc_base)) {
  367. ret = PTR_ERR(info->adc_base);
  368. goto err_resource;
  369. }
  370. //sys resource
  371. res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
  372. if (IS_ERR(res)) {
  373. ret = PTR_ERR(res);
  374. goto err_resource;
  375. }
  376. //info->sys_base = devm_ioremap_resource(&pdev->dev, res);
  377. info->sys_base = ioremap(res->start, resource_size(res));
  378. if (IS_ERR(info->sys_base)) {
  379. ret = PTR_ERR(info->sys_base);
  380. goto err_resource;
  381. }
  382. //irq
  383. info->irq = platform_get_irq(pdev, 0);
  384. if (info->irq < 0) {
  385. dev_err(&pdev->dev, "no irq resource\n");
  386. ret = info->irq;
  387. goto err_irq;
  388. }
  389. //ret = request_irq(info->irq, ark_adc_intr_handler, 0, dev_name(&pdev->dev), info);
  390. ret = devm_request_irq(
  391. &pdev->dev,
  392. info->irq,
  393. ark_adc_intr_handler,
  394. 0,//IRQF_SHARED|IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, //SA_SHIRQ,
  395. dev_name(&pdev->dev),//"adc",
  396. info
  397. );
  398. if (ret < 0) {
  399. dev_err(&pdev->dev, "failed requesting irq, irq = %d\n", info->irq);
  400. goto err_irq;
  401. }
  402. info->dev = &pdev->dev;
  403. info->value1[0] = info->value1[1] = info->value1[2] = info->value1[3] =ARK_BATTERY_VOLTAGE_REF;
  404. platform_set_drvdata(pdev, indio_dev);
  405. indio_dev->name = dev_name(&pdev->dev);
  406. indio_dev->dev.parent = &pdev->dev;
  407. indio_dev->dev.of_node = pdev->dev.of_node;
  408. indio_dev->info = &ark_adc_iio_info;
  409. indio_dev->modes = INDIO_DIRECT_MODE;
  410. indio_dev->channels = ark_adc_iio_channels;
  411. indio_dev->num_channels = info->data->num_channels;
  412. ret = iio_device_register(indio_dev);
  413. if(ret)
  414. goto err_iio_device_register;
  415. //ret = of_platform_populate(np, ark_adc_match, NULL, &indio_dev->dev);
  416. //if (ret < 0) {
  417. // dev_err(&pdev->dev, "failed adding child nodes\n");
  418. // goto err_of_populate;
  419. //}
  420. init_completion(&info->completion);
  421. if (info->data->init_hw)
  422. info->data->init_hw(info);
  423. printk(KERN_ALERT "++++++ark1668e_adc_probe success\n");
  424. return 0;
  425. //err_iio:
  426. iio_device_unregister(indio_dev);
  427. err_iio_device_register:
  428. //free_irq(info->irq, info);
  429. //devm_free_irq(&pdev->dev, info->irq, info);
  430. err_irq:
  431. //if(info->sys_base)
  432. // devm_iounmap(&pdev->dev, info->sys_base);
  433. err_resource:
  434. //if(info->adc_base)
  435. // devm_iounmap(&pdev->dev, info->adc_base);
  436. err_devm_iio_device_alloc:
  437. //if(indio_dev)
  438. // devm_iio_device_free(&pdev->dev, indio_dev);
  439. return ret;
  440. }
  441. static int ark_adc_remove(struct platform_device *pdev)
  442. {
  443. struct iio_dev *indio_dev = platform_get_drvdata(pdev);
  444. struct ark_adc *info = iio_priv(indio_dev);
  445. if(!info)
  446. return -ENODEV;
  447. //device_for_each_child(&indio_dev->dev, NULL, ark_adc_remove_devices);
  448. iio_device_unregister(indio_dev);
  449. //free_irq(info->irq, info);
  450. //devm_free_irq(&pdev->dev, info->irq, info);
  451. //if(info->sys_base)
  452. // devm_iounmap(&pdev->dev, info->sys_base);
  453. //if(info->adc_base)
  454. // devm_iounmap(&pdev->dev, info->adc_base);
  455. //if(indio_dev)
  456. // devm_iio_device_free(&pdev->dev, indio_dev);
  457. return 0;
  458. }
  459. static struct platform_driver ark_adc_driver = {
  460. .probe = ark_adc_probe,
  461. .remove = ark_adc_remove,
  462. .driver = {
  463. .name = "ark1668e-adc",
  464. .owner = THIS_MODULE,
  465. .of_match_table = ark_adc_match,
  466. },
  467. };
  468. module_platform_driver(ark_adc_driver);
  469. MODULE_LICENSE("GPL v2");
  470. MODULE_DESCRIPTION("Arkmicro ADC Driver");