Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/kdev_t.h>
- #include <linux/fs.h>
- #include <linux/device.h>
- #include <linux/cdev.h>
- #include <asm/uaccess.h>
- #include <linux/init.h>
- #include <linux/mutex.h>
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/of.h>
- #include <linux/interrupt.h>
- #include <linux/irq.h>
- #include <linux/spi/spi.h>
- #include <linux/gpio.h>
- #include <linux/pinctrl/consumer.h>
- #include "r0005spi.h"
- #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
- const char this_driver_name[] = "r0005spi";
- static int r0005spi_probe(struct spi_device *pdev);
- static int r0005spi_remove(struct spi_device *pdev);
- static const struct of_device_id db_r0005spi_of_ids[] = {
- {
- .compatible = "dbbroadcast,r0005spi",
- },
- { },
- };
- MODULE_DEVICE_TABLE(of, db_r0005spi_of_ids);
- static struct spi_driver r0005spi_driver =
- {
- .driver = {
- .name = this_driver_name,
- .owner = THIS_MODULE,
- .of_match_table = db_r0005spi_of_ids,
- },
- .probe = r0005spi_probe,
- .remove = r0005spi_remove,
- };
- static struct card_config cards[] =
- {
- {
- .cardPosition = 0,
- .readLatch = GPIO_TO_PIN(1,16),
- .writeLatch = GPIO_TO_PIN(1,17),
- .bus = 2,
- .interrupt = 60,
- },
- {
- .cardPosition = 1,
- .readLatch = GPIO_TO_PIN(3,21),
- .writeLatch = GPIO_TO_PIN(3,19),
- .bus = 2,
- },
- {
- .cardPosition = 2,
- .readLatch = GPIO_TO_PIN(1,6),
- .writeLatch = GPIO_TO_PIN(1,15),
- .bus = 1,
- },
- };
- /****************
- * IRQ Handling *
- ***************/
- static irqreturn_t r0005spi_irq_handler(int irq, void* devID)
- {
- pr_debug("%s: IRQ: %d\n", __func__, irq);
- return IRQ_HANDLED;
- }
- /***********
- * Probing *
- * ********/
- static int r0005spi_probe(struct spi_device *pdev)
- {
- pr_debug("%s: Probed\n", __func__);
- return 0;
- }
- static int r0005spi_remove(struct spi_device *pdev)
- {
- pr_debug("%s: Removed\n", __func__);
- return 0;
- }
- /*****************************************
- * Module Intialisation/Deinitialisation *
- *****************************************/
- static int r0005spi_init(void)
- {
- int status = 0;
- unsigned int irq_num;
- pr_debug("%s: Inititialising Driver r0005spi\n", __func__);
- status = gpio_request_one(cards[0].interrupt, GPIOF_IN, "Card 0 Interrupt");
- if (status < 0)
- {
- pr_debug("%s: Failed to aquire gpio, bailing: -%d\n", __func__, status);
- return 0;
- }
- gpio_direction_input(cards[0].interrupt);
- irq_num = gpio_to_irq(cards[0].interrupt);
- if (irq_num < 0)
- {
- pr_debug("%s: Failed to aquire irq_num: -%d\n", __func__, irq_num);
- goto err0;
- }
- cards[0].irq = request_irq(irq_num, r0005spi_irq_handler, IRQF_SHARED | IRQF_TRIGGER_FALLING, "Card 0 Interrupt IRQ", NULL);
- if (cards[0].irq < 0)
- {
- pr_debug("%s: Failed to requst irq: %d\n", __func__, cards[0].irq);
- goto err0;
- }
- return 0;
- err0:
- gpio_free(cards[0].interrupt);
- return 0;
- }
- static void r0005spi_exit(void)
- {
- gpio_free(cards[0].interrupt);
- if (cards[0].irq)
- {
- free_irq(cards[0].irq, NULL);
- }
- pr_debug("%s: Exiting Driver r0005spi\n", __func__);
- }
- module_init(r0005spi_init);
- module_exit(r0005spi_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>");
- MODULE_DESCRIPTION("r0005spi driver");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement