Advertisement
Guest User

Untitled

a guest
Jan 30th, 2013
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/types.h>
  4. #include <linux/kdev_t.h>
  5. #include <linux/fs.h>
  6. #include <linux/device.h>
  7. #include <linux/cdev.h>
  8. #include <asm/uaccess.h>
  9.  
  10. #include <linux/init.h>
  11. #include <linux/mutex.h>
  12. #include <linux/slab.h>
  13. #include <linux/string.h>
  14. #include <linux/of.h>
  15.  
  16. #include <linux/interrupt.h>
  17. #include <linux/irq.h>
  18. #include <linux/spi/spi.h>
  19. #include <linux/gpio.h>
  20. #include <linux/pinctrl/consumer.h>
  21.  
  22. #include "r0005spi.h"
  23.  
  24. #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
  25.  
  26. const char this_driver_name[] = "r0005spi";
  27.  
  28. static int r0005spi_probe(struct spi_device *pdev);
  29. static int r0005spi_remove(struct spi_device *pdev);
  30.  
  31. static const struct of_device_id db_r0005spi_of_ids[] = {
  32. {
  33. .compatible = "dbbroadcast,r0005spi",
  34. },
  35. { },
  36. };
  37. MODULE_DEVICE_TABLE(of, db_r0005spi_of_ids);
  38.  
  39. static struct spi_driver r0005spi_driver =
  40. {
  41. .driver = {
  42. .name = this_driver_name,
  43. .owner = THIS_MODULE,
  44. .of_match_table = db_r0005spi_of_ids,
  45. },
  46. .probe = r0005spi_probe,
  47. .remove = r0005spi_remove,
  48. };
  49.  
  50. static struct card_config cards[] =
  51. {
  52.  
  53. {
  54. .cardPosition = 0,
  55. .readLatch = GPIO_TO_PIN(1,16),
  56. .writeLatch = GPIO_TO_PIN(1,17),
  57. .bus = 2,
  58. .interrupt = 60,
  59. },
  60.  
  61. {
  62. .cardPosition = 1,
  63. .readLatch = GPIO_TO_PIN(3,21),
  64. .writeLatch = GPIO_TO_PIN(3,19),
  65. .bus = 2,
  66. },
  67.  
  68. {
  69. .cardPosition = 2,
  70. .readLatch = GPIO_TO_PIN(1,6),
  71. .writeLatch = GPIO_TO_PIN(1,15),
  72. .bus = 1,
  73. },
  74.  
  75. };
  76.  
  77. /****************
  78. * IRQ Handling *
  79. ***************/
  80.  
  81. static irqreturn_t r0005spi_irq_handler(int irq, void* devID)
  82. {
  83.  
  84. pr_debug("%s: IRQ: %d\n", __func__, irq);
  85.  
  86. return IRQ_HANDLED;
  87.  
  88. }
  89. /***********
  90. * Probing *
  91. * ********/
  92.  
  93. static int r0005spi_probe(struct spi_device *pdev)
  94. {
  95. pr_debug("%s: Probed\n", __func__);
  96.  
  97. return 0;
  98. }
  99.  
  100. static int r0005spi_remove(struct spi_device *pdev)
  101. {
  102. pr_debug("%s: Removed\n", __func__);
  103.  
  104. return 0;
  105. }
  106.  
  107. /*****************************************
  108. * Module Intialisation/Deinitialisation *
  109. *****************************************/
  110.  
  111. static int r0005spi_init(void)
  112. {
  113.  
  114. int status = 0;
  115. unsigned int irq_num;
  116.  
  117. pr_debug("%s: Inititialising Driver r0005spi\n", __func__);
  118.  
  119. status = gpio_request_one(cards[0].interrupt, GPIOF_IN, "Card 0 Interrupt");
  120.  
  121. if (status < 0)
  122. {
  123. pr_debug("%s: Failed to aquire gpio, bailing: -%d\n", __func__, status);
  124. return 0;
  125. }
  126.  
  127. gpio_direction_input(cards[0].interrupt);
  128.  
  129. irq_num = gpio_to_irq(cards[0].interrupt);
  130.  
  131. if (irq_num < 0)
  132. {
  133. pr_debug("%s: Failed to aquire irq_num: -%d\n", __func__, irq_num);
  134. goto err0;
  135. }
  136.  
  137. cards[0].irq = request_irq(irq_num, r0005spi_irq_handler, IRQF_SHARED | IRQF_TRIGGER_FALLING, "Card 0 Interrupt IRQ", NULL);
  138.  
  139. if (cards[0].irq < 0)
  140. {
  141. pr_debug("%s: Failed to requst irq: %d\n", __func__, cards[0].irq);
  142. goto err0;
  143. }
  144.  
  145. return 0;
  146.  
  147. err0:
  148. gpio_free(cards[0].interrupt);
  149.  
  150. return 0;
  151.  
  152. }
  153.  
  154. static void r0005spi_exit(void)
  155. {
  156.  
  157. gpio_free(cards[0].interrupt);
  158.  
  159. if (cards[0].irq)
  160. {
  161. free_irq(cards[0].irq, NULL);
  162. }
  163.  
  164. pr_debug("%s: Exiting Driver r0005spi\n", __func__);
  165.  
  166. }
  167.  
  168. module_init(r0005spi_init);
  169. module_exit(r0005spi_exit);
  170.  
  171. MODULE_LICENSE("GPL");
  172. MODULE_AUTHOR("Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>");
  173. MODULE_DESCRIPTION("r0005spi driver");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement