ep7211_ir.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * IR port driver for the Cirrus Logic EP7211 processor.
  3.  *
  4.  * Copyright 2001, Blue Mug Inc.  All rights reserved.
  5.  */
  6. #include <linux/module.h>
  7. #include <linux/delay.h>
  8. #include <linux/tty.h>
  9. #include <linux/sched.h>
  10. #include <linux/init.h>
  11. #include <net/irda/irda.h>
  12. #include <net/irda/irmod.h>
  13. #include <net/irda/irda_device.h>
  14. #include <asm/io.h>
  15. #include <asm/hardware.h>
  16. #define MIN_DELAY 25      /* 15 us, but wait a little more to be sure */
  17. #define MAX_DELAY 10000   /* 1 ms */
  18. static void ep7211_ir_open(dongle_t *self, struct qos_info *qos);
  19. static void ep7211_ir_close(dongle_t *self);
  20. static int  ep7211_ir_change_speed(struct irda_task *task);
  21. static int  ep7211_ir_reset(struct irda_task *task);
  22. static struct dongle_reg dongle = {
  23. Q_NULL,
  24. IRDA_EP7211_IR,
  25. ep7211_ir_open,
  26. ep7211_ir_close,
  27. ep7211_ir_reset,
  28. ep7211_ir_change_speed,
  29. };
  30. static void ep7211_ir_open(dongle_t *self, struct qos_info *qos)
  31. {
  32. unsigned int syscon1, flags;
  33. save_flags(flags); cli();
  34. /* Turn on the SIR encoder. */
  35. syscon1 = clps_readl(SYSCON1);
  36. syscon1 |= SYSCON1_SIREN;
  37. clps_writel(syscon1, SYSCON1);
  38. /* XXX: We should disable modem status interrupts on the first
  39. UART (interrupt #14). */
  40. restore_flags(flags);
  41. MOD_INC_USE_COUNT;
  42. }
  43. static void ep7211_ir_close(dongle_t *self)
  44. {
  45. unsigned int syscon1, flags;
  46. save_flags(flags); cli();
  47. /* Turn off the SIR encoder. */
  48. syscon1 = clps_readl(SYSCON1);
  49. syscon1 &= ~SYSCON1_SIREN;
  50. clps_writel(syscon1, SYSCON1);
  51. /* XXX: If we've disabled the modem status interrupts, we should
  52. reset them back to their original state. */
  53. restore_flags(flags);
  54. MOD_DEC_USE_COUNT;
  55. }
  56. /*
  57.  * Function ep7211_ir_change_speed (task)
  58.  *
  59.  *    Change speed of the EP7211 I/R port. We don't really have to do anything
  60.  *    for the EP7211 as long as the rate is being changed at the serial port
  61.  *    level.
  62.  */
  63. static int ep7211_ir_change_speed(struct irda_task *task)
  64. {
  65. irda_task_next_state(task, IRDA_TASK_DONE);
  66. return 0;
  67. }
  68. /*
  69.  * Function ep7211_ir_reset (task)
  70.  *
  71.  *      Reset the EP7211 I/R. We don't really have to do anything.
  72.  *
  73.  */
  74. static int ep7211_ir_reset(struct irda_task *task)
  75. {
  76. irda_task_next_state(task, IRDA_TASK_DONE);
  77. return 0;
  78. }
  79. /*
  80.  * Function ep7211_ir_init(void)
  81.  *
  82.  *    Initialize EP7211 I/R module
  83.  *
  84.  */
  85. int __init ep7211_ir_init(void)
  86. {
  87. return irda_device_register_dongle(&dongle);
  88. }
  89. /*
  90.  * Function ep7211_ir_cleanup(void)
  91.  *
  92.  *    Cleanup EP7211 I/R module
  93.  *
  94.  */
  95. static void __exit ep7211_ir_cleanup(void)
  96. {
  97. irda_device_unregister_dongle(&dongle);
  98. }
  99. MODULE_AUTHOR("Jon McClintock <jonm@bluemug.com>");
  100. MODULE_DESCRIPTION("EP7211 I/R driver");
  101. MODULE_LICENSE("GPL");
  102. #ifdef MODULE
  103. module_init(ep7211_ir_init);
  104. #endif /* MODULE */
  105. module_exit(ep7211_ir_cleanup);