mt_irtx.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. #include <linux/cdev.h>
  2. #include <linux/device.h>
  3. #include <linux/fs.h>
  4. #include <linux/uaccess.h>
  5. #include <linux/wait.h>
  6. #include <linux/module.h>
  7. #include <linux/slab.h>
  8. #include <linux/uaccess.h>
  9. #include <linux/kthread.h>
  10. #include <linux/poll.h>
  11. #include <linux/time.h>
  12. #include <linux/delay.h>
  13. #include <linux/kobject.h>
  14. #include <linux/dma-mapping.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/irq.h>
  18. #if !defined(CONFIG_MTK_CLKMGR)
  19. #include <linux/clk.h>
  20. #else
  21. #include <mach/mt_clkmgr.h>
  22. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  23. #ifdef CONFIG_OF
  24. #include <linux/of.h>
  25. #include <linux/of_fdt.h>
  26. #include <linux/of_irq.h>
  27. #include <linux/of_address.h>
  28. #endif
  29. #include <mt-plat/sync_write.h>
  30. #include <mt-plat/mt_pwm.h>
  31. #include <mach/mt_pwm_hal.h>
  32. #include "mt_irtx.h"
  33. struct mt_irtx mt_irtx_dev;
  34. void __iomem *irtx_reg_base;
  35. unsigned int irtx_irq;
  36. struct pwm_spec_config irtx_pwm_config = {
  37. .pwm_no = 0,
  38. .mode = PWM_MODE_MEMORY,
  39. .clk_div = CLK_DIV1,
  40. .clk_src = PWM_CLK_NEW_MODE_BLOCK,
  41. .pmic_pad = 0,
  42. .PWM_MODE_MEMORY_REGS.IDLE_VALUE = IDLE_FALSE,
  43. .PWM_MODE_MEMORY_REGS.GUARD_VALUE = GUARD_FALSE,
  44. .PWM_MODE_MEMORY_REGS.STOP_BITPOS_VALUE = 31,
  45. .PWM_MODE_MEMORY_REGS.HDURATION = 25, /* 1 microseconds, assume clock source is 26M */
  46. .PWM_MODE_MEMORY_REGS.LDURATION = 25,
  47. .PWM_MODE_MEMORY_REGS.GDURATION = 0,
  48. .PWM_MODE_MEMORY_REGS.WAVE_NUM = 1,
  49. };
  50. #define IRTX_GPIO_MODE_DEFAULT 0
  51. #define IRTX_GPIO_MODE_LED_SET 1
  52. char *irtx_gpio_cfg[] = { "irtx_gpio_default", "irtx_gpio_led_set" };
  53. void switch_irtx_gpio(int mode)
  54. {
  55. struct pinctrl *ppinctrl_irtx = mt_irtx_dev.ppinctrl_irtx;
  56. struct pinctrl_state *pins_irtx = NULL;
  57. pr_notice("[IRTX][PinC]%s(%d)+\n", __func__, mode);
  58. if (mode >= (sizeof(irtx_gpio_cfg) / sizeof(irtx_gpio_cfg[0]))) {
  59. pr_err("[IRTX][PinC]%s(%d) fail!! - parameter error!\n", __func__, mode);
  60. return;
  61. }
  62. if (IS_ERR(ppinctrl_irtx)) {
  63. pr_err("[IRTX][PinC]%s ppinctrl_irtx:%p is error! err:%ld\n",
  64. __func__, ppinctrl_irtx, PTR_ERR(ppinctrl_irtx));
  65. return;
  66. }
  67. pins_irtx = pinctrl_lookup_state(ppinctrl_irtx, irtx_gpio_cfg[mode]);
  68. if (IS_ERR(pins_irtx)) {
  69. pr_err("[IRTX][PinC]%s pinctrl_lockup(%p, %s) fail!! ppinctrl:%p, err:%ld\n", __func__,
  70. ppinctrl_irtx, irtx_gpio_cfg[mode], pins_irtx, PTR_ERR(pins_irtx));
  71. return;
  72. }
  73. pinctrl_select_state(ppinctrl_irtx, pins_irtx);
  74. pr_notice("[IRTX][PinC]%s(%d)-\n", __func__, mode);
  75. }
  76. static int dev_char_open(struct inode *inode, struct file *file)
  77. {
  78. #if !defined(CONFIG_MTK_CLKMGR)
  79. int clk_en_ret = 0;
  80. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  81. if (atomic_read(&mt_irtx_dev.usage_cnt))
  82. return -EBUSY;
  83. #if !defined(CONFIG_MTK_CLKMGR)
  84. pr_notice("[IRTX][CCF]enable clk_irtx_main:%p\n", mt_irtx_dev.clk_irtx_main);
  85. clk_en_ret = clk_prepare_enable(mt_irtx_dev.clk_irtx_main);
  86. if (clk_en_ret) {
  87. pr_err("[IRTX][CCF]enable clk_irtx_main failed. ret:%d, clk_irtx_main:%p\n"
  88. , clk_en_ret, mt_irtx_dev.clk_irtx_main);
  89. }
  90. #else /* !defined(CONFIG_MTK_CLKMGR) */
  91. enable_clock(MT_CG_PERI_IRTX, "IRTX");
  92. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  93. pr_warn("[IRTX] open by %s\n", current->comm);
  94. /* set IRTX_IRINV */
  95. irtx_write32(mt_irtx_dev.reg_base, IRTXCFG, irtx_read32(mt_irtx_dev.reg_base, IRTXCFG) | 0x80);
  96. nonseekable_open(inode, file);
  97. atomic_inc(&mt_irtx_dev.usage_cnt);
  98. return 0;
  99. }
  100. static int dev_char_close(struct inode *inode, struct file *file)
  101. {
  102. pr_warn("[IRTX] close by %s\n", current->comm);
  103. atomic_dec(&mt_irtx_dev.usage_cnt);
  104. #if !defined(CONFIG_MTK_CLKMGR)
  105. pr_notice("[IRTX][CCF]disable clk_irtx_main:%p\n", mt_irtx_dev.clk_irtx_main);
  106. clk_disable_unprepare(mt_irtx_dev.clk_irtx_main);
  107. #else /* !defined(CONFIG_MTK_CLKMGR) */
  108. disable_clock(MT_CG_PERI_IRTX, "IRTX");
  109. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  110. return 0;
  111. }
  112. static ssize_t dev_char_read(struct file *file, char *buf, size_t count, loff_t *ppos)
  113. {
  114. return 0;
  115. }
  116. static long dev_char_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  117. {
  118. int ret = 0;
  119. unsigned int para = 0, gpio_id = -1, en = 0;
  120. switch (cmd) {
  121. case IRTX_IOC_SET_CARRIER_FREQ:
  122. if (copy_from_user(&mt_irtx_dev.carrier_freq, (void __user *)arg, sizeof(unsigned int))) {
  123. pr_err("[IRTX] IRTX_IOC_SET_CARRIER_FREQ: copy_from_user fail!\n");
  124. ret = -EFAULT;
  125. } else {
  126. pr_warn("[IRTX] IRTX_IOC_SET_CARRIER_FREQ: %d\n", mt_irtx_dev.carrier_freq);
  127. if (!mt_irtx_dev.carrier_freq) {
  128. ret = -EINVAL;
  129. mt_irtx_dev.carrier_freq = 38000;
  130. }
  131. }
  132. break;
  133. case IRTX_IOC_SET_IRTX_LED_EN:
  134. if (copy_from_user(&para, (void __user *)arg, sizeof(unsigned int))) {
  135. pr_err("[IRTX] IRTX_IOC_SET_IRTX_LED_EN: copy_from_user fail!\n");
  136. ret = -EFAULT;
  137. } else {
  138. /* en: bit 12; */
  139. /* gpio: bit 0-11 */
  140. gpio_id = (unsigned long)((para & 0x0FFF0000) > 16);
  141. en = (para & 0xF);
  142. pr_warn("[IRTX] IRTX_IOC_SET_IRTX_LED_EN: 0x%x, gpio_id:%ul, en:%ul\n", para, gpio_id, en);
  143. if (en)
  144. switch_irtx_gpio(IRTX_GPIO_MODE_LED_SET);
  145. else
  146. switch_irtx_gpio(IRTX_GPIO_MODE_DEFAULT);
  147. }
  148. break;
  149. default:
  150. pr_err("[IRTX] unknown ioctl cmd 0x%x\n", cmd);
  151. ret = -ENOTTY;
  152. break;
  153. }
  154. return ret;
  155. }
  156. static void set_irtx_sw_mode(void)
  157. {
  158. unsigned int ir_conf_wr;
  159. unsigned int L0H, L0L, L1H, L1L;
  160. unsigned int sync_h, sync_l;
  161. unsigned int cdt, cwt;
  162. struct irtx_config ir_conf;
  163. pr_warn("[IRTX] configure IrTx software mode\n");
  164. ir_conf.mode = 3;
  165. ir_conf.start = 0;
  166. ir_conf.sw_o = 0;
  167. ir_conf.b_ord = 1; /* LSB first */
  168. ir_conf.r_ord = 0; /* R0 first */
  169. ir_conf.ir_os = 1; /* modulated signal */
  170. ir_conf.ir_inv = 1;
  171. ir_conf.bit_num = 0;
  172. ir_conf.data_inv = 0;
  173. L0H = 0;
  174. L0L = (mt_irtx_dev.pwm_ch + 1) & 0x7; /* FIXME, workaround, HW will fix later */
  175. L1H = 0;
  176. L1L = 0;
  177. sync_h = 0;
  178. sync_l = 0;
  179. cwt = (CLOCK_SRC * 1000 * 1000) / (mt_irtx_dev.carrier_freq); /* carrier freq. */
  180. cdt = cwt / 3; /* duty=1/3 */
  181. memcpy(&ir_conf_wr, &ir_conf, sizeof(ir_conf));
  182. irtx_write32(mt_irtx_dev.reg_base, IRTXCFG, ir_conf_wr);
  183. irtx_write32(mt_irtx_dev.reg_base, IRTX_L0H, L0H);
  184. irtx_write32(mt_irtx_dev.reg_base, IRTX_L0L, L0L);
  185. irtx_write32(mt_irtx_dev.reg_base, IRTX_L1H, L1H);
  186. irtx_write32(mt_irtx_dev.reg_base, IRTX_L1L, L1L);
  187. irtx_write32(mt_irtx_dev.reg_base, IRTXSYNCH, sync_h);
  188. irtx_write32(mt_irtx_dev.reg_base, IRTXSYNCL, sync_l);
  189. irtx_write32(mt_irtx_dev.reg_base, IRTXMT, (cdt << 16) | (cwt & 0xFFFF));
  190. pr_warn("[IRTX] configured IrTx: cfg=%x L0=%x/%x L1=%x/%x sync=%x/%x mt=%x/%x\n", ir_conf_wr, L0H, L0L, L1H,
  191. L1L, sync_h, sync_l, cdt, cwt);
  192. pr_warn("[IRTX] configured cfg=0x%x", (unsigned int)irtx_read32(mt_irtx_dev.reg_base, IRTXCFG));
  193. }
  194. static ssize_t dev_char_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
  195. {
  196. dma_addr_t wave_phy;
  197. void *wave_vir;
  198. int ret;
  199. int buf_size = (count + 3) / 4; /* when count is 5... */
  200. pr_warn("[IRTX] irtx write len=0x%x, pwm=%d\n", (unsigned int)count, (unsigned int)irtx_pwm_config.pwm_no);
  201. wave_vir = dma_alloc_coherent(&mt_irtx_dev.plat_dev->dev, count, &wave_phy, GFP_KERNEL);
  202. if (!wave_vir) {
  203. pr_err("[IRTX] alloc memory fail\n");
  204. return -ENOMEM;
  205. }
  206. ret = copy_from_user(wave_vir, buf, count);
  207. if (ret) {
  208. pr_err("[IRTX] write, copy from user fail %d\n", ret);
  209. goto exit;
  210. }
  211. mt_set_intr_enable(0);
  212. mt_set_intr_enable(1);
  213. mt_pwm_26M_clk_enable_hal(1);
  214. pr_warn("[IRTX] irtx before read IRTXCFG:0x%x\n", (irtx_read32(mt_irtx_dev.reg_base, IRTXCFG)));
  215. irtx_pwm_config.PWM_MODE_MEMORY_REGS.BUF0_BASE_ADDR = (u32 *) wave_phy;
  216. irtx_pwm_config.PWM_MODE_MEMORY_REGS.BUF0_SIZE = (buf_size ? (buf_size - 1) : 0);
  217. set_irtx_sw_mode();
  218. switch_irtx_gpio(IRTX_GPIO_MODE_LED_SET);
  219. irtx_write32(mt_irtx_dev.reg_base, IRTXCFG, irtx_read32(mt_irtx_dev.reg_base, IRTXCFG) | 0x1); /* STRT=1 */
  220. mt_set_intr_ack(0);
  221. mt_set_intr_ack(1);
  222. ret = pwm_set_spec_config(&irtx_pwm_config);
  223. pr_warn("[IRTX] pwm is triggered, %d\n", ret);
  224. msleep(count * 8 / 1000);
  225. msleep(100);
  226. ret = count;
  227. exit:
  228. pr_warn("[IRTX] done, clean up\n");
  229. dma_free_coherent(&mt_irtx_dev.plat_dev->dev, count, wave_vir, wave_phy);
  230. /* SWO=0 */
  231. irtx_write32(mt_irtx_dev.reg_base, IRTXCFG, irtx_read32(mt_irtx_dev.reg_base, IRTXCFG) & 0xFFFFFFF7);
  232. /* STRT=0 */
  233. irtx_write32(mt_irtx_dev.reg_base, IRTXCFG, irtx_read32(mt_irtx_dev.reg_base, IRTXCFG) & 0xFFFFFFFE);
  234. mt_pwm_disable(irtx_pwm_config.pwm_no, irtx_pwm_config.pmic_pad);
  235. switch_irtx_gpio(IRTX_GPIO_MODE_DEFAULT);
  236. return ret;
  237. }
  238. static irqreturn_t irtx_isr(int irq, void *data)
  239. {
  240. return IRQ_HANDLED;
  241. }
  242. #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
  243. static u64 irtx_dma_mask = DMA_BIT_MASK((sizeof(unsigned long) << 3)); /* TODO: 3? */
  244. static struct file_operations const char_dev_fops = {
  245. .owner = THIS_MODULE,
  246. .open = &dev_char_open,
  247. .read = &dev_char_read,
  248. .write = &dev_char_write,
  249. .release = &dev_char_close,
  250. .unlocked_ioctl = &dev_char_ioctl,
  251. };
  252. #define irtx_driver_name "mt_irtx"
  253. static int irtx_probe(struct platform_device *plat_dev)
  254. {
  255. struct cdev *c_dev;
  256. dev_t dev_t_irtx;
  257. struct device *dev = NULL;
  258. static void *dev_class;
  259. u32 major = 0, minor = 0;
  260. int ret = 0;
  261. #ifdef CONFIG_OF
  262. if (plat_dev->dev.of_node == NULL) {
  263. pr_err("[IRTX] irtx OF node is NULL\n");
  264. return -1;
  265. }
  266. of_property_read_u32(plat_dev->dev.of_node, "major", &major);
  267. mt_irtx_dev.reg_base = of_iomap(plat_dev->dev.of_node, 0);
  268. mt_irtx_dev.irq = irq_of_parse_and_map(plat_dev->dev.of_node, 0);
  269. of_property_read_u32(plat_dev->dev.of_node, "pwm_ch", &mt_irtx_dev.pwm_ch);
  270. pr_warn("[IRTX] device tree info: major=%d base=0x%p irq=%d pwm=%d\n", major, mt_irtx_dev.reg_base,
  271. mt_irtx_dev.irq, mt_irtx_dev.pwm_ch);
  272. #endif
  273. #if !defined(CONFIG_MTK_CLKMGR)
  274. mt_irtx_dev.clk_irtx_main = devm_clk_get(&plat_dev->dev, "clk-irtx-main");
  275. if (IS_ERR(mt_irtx_dev.clk_irtx_main)) {
  276. pr_err("[IRTX][CCF]cannot get irtx clock. ptr_err:%ld\n", PTR_ERR(mt_irtx_dev.clk_irtx_main));
  277. return PTR_ERR(mt_irtx_dev.clk_irtx_main);
  278. }
  279. pr_notice("[IRTX][CCF]clk_irtx_main:%p\n", mt_irtx_dev.clk_irtx_main);
  280. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  281. mt_irtx_dev.ppinctrl_irtx = devm_pinctrl_get(&plat_dev->dev);
  282. if (IS_ERR(mt_irtx_dev.ppinctrl_irtx)) {
  283. pr_err("[IRTX][PinC]cannot find pinctrl. ptr_err:%ld\n", PTR_ERR(mt_irtx_dev.ppinctrl_irtx));
  284. return PTR_ERR(mt_irtx_dev.ppinctrl_irtx);
  285. }
  286. pr_notice("[IRTX][PinC]devm_pinctrl_get ppinctrl:%p\n", mt_irtx_dev.ppinctrl_irtx);
  287. /* Set GPIO as default */
  288. switch_irtx_gpio(IRTX_GPIO_MODE_DEFAULT);
  289. if (!major) {
  290. ret = alloc_chrdev_region(&dev_t_irtx, 0, 1, irtx_driver_name);
  291. if (ret) {
  292. pr_err("[IRTX] alloc_chrdev_region fail ret=%d\n", ret);
  293. goto exit;
  294. } else {
  295. major = MAJOR(dev_t_irtx);
  296. minor = MINOR(dev_t_irtx);
  297. }
  298. } else {
  299. dev_t_irtx = MKDEV(major, minor);
  300. ret = register_chrdev_region(dev_t_irtx, 1, irtx_driver_name);
  301. if (ret) {
  302. pr_err("[IRTX] register_chrdev_region fail ret=%d\n", ret);
  303. goto exit;
  304. }
  305. }
  306. ret = request_irq(mt_irtx_dev.irq, irtx_isr, IRQF_TRIGGER_FALLING, "IRTX", NULL); /* TODO: trigger */
  307. if (ret) {
  308. pr_err("[IRTX] request IRQ(%d) fail ret=%d\n", mt_irtx_dev.irq, ret);
  309. goto exit;
  310. }
  311. irtx_pwm_config.pwm_no = mt_irtx_dev.pwm_ch;
  312. mt_irtx_dev.plat_dev = plat_dev;
  313. mt_irtx_dev.plat_dev->dev.dma_mask = &irtx_dma_mask;
  314. mt_irtx_dev.plat_dev->dev.coherent_dma_mask = irtx_dma_mask;
  315. atomic_set(&mt_irtx_dev.usage_cnt, 0);
  316. mt_irtx_dev.carrier_freq = 38000; /* NEC as default */
  317. c_dev = kmalloc(sizeof(struct cdev), GFP_KERNEL);
  318. if (!c_dev) {
  319. /* pr_err("[IRTX] kmalloc cdev fail\n"); */
  320. goto exit;
  321. }
  322. cdev_init(c_dev, &char_dev_fops);
  323. c_dev->owner = THIS_MODULE;
  324. ret = cdev_add(c_dev, dev_t_irtx, 1);
  325. if (ret) {
  326. pr_err("[IRTX] cdev_add fail ret=%d\n", ret);
  327. goto exit;
  328. }
  329. dev_class = class_create(THIS_MODULE, irtx_driver_name);
  330. dev = device_create(dev_class, NULL, dev_t_irtx, NULL, "irtx");
  331. if (IS_ERR(dev)) {
  332. ret = PTR_ERR(dev);
  333. pr_err("[IRTX] device_create fail ret=%d\n", ret);
  334. goto exit;
  335. }
  336. exit:
  337. pr_warn("[IRTX] irtx probe ret=%d\n", ret);
  338. return ret;
  339. }
  340. #ifdef CONFIG_OF
  341. static const struct of_device_id irtx_of_ids[] = {
  342. {.compatible = "mediatek,irtx",},
  343. {}
  344. };
  345. #endif
  346. static struct platform_driver irtx_driver = {
  347. .driver = {
  348. .name = "mt_irtx",
  349. },
  350. .probe = irtx_probe,
  351. };
  352. static int __init irtx_init(void)
  353. {
  354. int ret = 0;
  355. pr_warn("[IRTX] irtx init\n");
  356. #ifdef CONFIG_OF
  357. irtx_driver.driver.of_match_table = irtx_of_ids;
  358. #else
  359. pr_err("[IRTX] irtx needs device tree!\n");
  360. BUG_ON(1);
  361. #endif
  362. ret = platform_driver_register(&irtx_driver);
  363. if (ret) {
  364. pr_err("[IRTX] irtx platform driver register fail %d\n", ret);
  365. goto exit;
  366. }
  367. exit:
  368. return ret;
  369. }
  370. module_init(irtx_init);
  371. MODULE_AUTHOR("Xiao Wang <xiao.wang@mediatek.com>");
  372. MODULE_DESCRIPTION("Consumer IR transmitter driver v0.1");