Advertisement
Guest User

Untitled

a guest
Jan 31st, 2013
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 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. #include <linux/of_gpio.h>
  22.  
  23. #include "r0005spi.h"
  24.  
  25. #define MAX_CARDS 6
  26.  
  27. const char this_driver_name[] = "r0005spi";
  28.  
  29. static int r0005spi_probe(struct spi_device *pdev);
  30. static int r0005spi_remove(struct spi_device *pdev);
  31.  
  32. static const struct of_device_id db_r0005spi_of_ids[] = {
  33. {
  34. .compatible = "dbbroadcast,r0005spi",
  35. },
  36. { },
  37. };
  38. MODULE_DEVICE_TABLE(of, db_r0005spi_of_ids);
  39.  
  40. static struct spi_driver r0005spi_driver =
  41. {
  42. .driver = {
  43. .name = this_driver_name,
  44. .owner = THIS_MODULE,
  45. .of_match_table = db_r0005spi_of_ids,
  46. },
  47. .probe = r0005spi_probe,
  48. .remove = r0005spi_remove,
  49. };
  50.  
  51. /****************
  52. * IRQ Handling *
  53. ***************/
  54.  
  55. static irqreturn_t r0005spi_irq_handler(int irq, void* devID)
  56. {
  57. pr_debug("%s: IRQ: %d\n", __func__, irq);
  58.  
  59. return IRQ_HANDLED;
  60. }
  61. /***********
  62. * Probing *
  63. * ********/
  64.  
  65. static int r0005spi_probe(struct spi_device *spi)
  66. {
  67. struct device_node *parent_node = spi->master->dev.of_node;
  68. struct device_node *child_node;
  69. struct r0005spi_data *data;
  70. struct card_config *card;
  71. int num_cards = 0;
  72. struct pinctrl *pinctrl;
  73.  
  74. data = kzalloc(sizeof(*data), GFP_KERNEL);
  75.  
  76. pr_debug("%s: SPI Bus %d probed\n", __func__, spi->master->bus_num);
  77.  
  78. if (IS_ERR(parent_node))
  79. {
  80.  
  81. pr_debug("%s: Failed to get parent node\n", __func__);
  82.  
  83. }
  84.  
  85. pinctrl = devm_pinctrl_get_select_default(&spi->dev);
  86. if (IS_ERR(pinctrl))
  87. {
  88. pr_debug("%s: Setting pins failed: %d\n", __func__, (s32) pinctrl);
  89. }
  90.  
  91. for_each_available_child_of_node(parent_node, child_node)
  92. {
  93.  
  94. data->cards[num_cards] = kzalloc(sizeof(*card), GFP_KERNEL);
  95. card = data->cards[num_cards];
  96.  
  97. of_property_read_u32(child_node, "card", &(card->position));
  98. pr_debug("%s: Loaded node: %s with position: %d\n", __func__, child_node->name, card->position);
  99.  
  100. num_cards++;
  101.  
  102. }
  103.  
  104. data->num_cards = num_cards;
  105.  
  106. spi_set_drvdata(spi, data);
  107.  
  108. pr_debug("%s: Finished probing\n", __func__);
  109.  
  110. return 0;
  111. }
  112.  
  113. static int r0005spi_remove(struct spi_device *spi)
  114. {
  115. int i;
  116. struct r0005spi_data *data;
  117.  
  118. pr_debug("%s: Removing\n", __func__);
  119.  
  120. data = spi_get_drvdata(spi);
  121.  
  122. for(i=0; i<data->num_cards; i++)
  123. {
  124. if (!IS_ERR(data->cards[i]))
  125. {
  126. pr_debug("%s: card at position %d is to be set free\n", __func__, data->cards[i]->position);
  127. kfree(data->cards[i]);
  128. pr_debug("%s: card at index %d memory was set free\n", __func__, i);
  129. }
  130. }
  131.  
  132. kfree(data);
  133. pr_debug("%s: data memory was set free\n", __func__);
  134.  
  135. pr_debug("%s: Removed\n", __func__);
  136.  
  137. return 0;
  138. }
  139.  
  140. /*****************************************
  141. * Module Intialisation/Deinitialisation *
  142. *****************************************/
  143.  
  144. static int r0005spi_init(void)
  145. {
  146. pr_debug("%s: Inititialising Driver r0005spi\n", __func__);
  147. return spi_register_driver(&r0005spi_driver);
  148. }
  149.  
  150. static void r0005spi_exit(void)
  151. {
  152. spi_unregister_driver(&r0005spi_driver);
  153. pr_debug("%s: Exiting Driver r0005spi\n", __func__);
  154. }
  155.  
  156. module_init(r0005spi_init);
  157. module_exit(r0005spi_exit);
  158.  
  159. MODULE_LICENSE("GPL");
  160. MODULE_AUTHOR("Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>");
  161. MODULE_DESCRIPTION("r0005spi driver");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement