diff --git a/driver/counter.c b/driver/counter.c index c03bc25..2cccc00 100644 --- a/driver/counter.c +++ b/driver/counter.c @@ -5,6 +5,7 @@ #include #include #include +#include /* Meta Information */ MODULE_LICENSE("GPL"); @@ -12,22 +13,22 @@ MODULE_AUTHOR("Wolfgang Hottgenroth"); MODULE_DESCRIPTION("A simple LKM to parse the device tree for a specific device and its properties"); /* Declate the probe and remove functions */ -static int dt_probe(struct platform_device *pdev); -static void dt_remove(struct platform_device *pdev); +static int dt_leds_probe(struct platform_device *pdev); +static void dt_leds_remove(struct platform_device *pdev); -static struct of_device_id my_driver_ids[] = { +static struct of_device_id leds_driver_ids[] = { { - .compatible = "hottis,counter", + .compatible = "hottis,leds", }, { /* sentinel */ } }; -MODULE_DEVICE_TABLE(of, my_driver_ids); +MODULE_DEVICE_TABLE(of, leds_driver_ids); -static struct platform_driver my_driver = { - .probe = dt_probe, - .remove = dt_remove, +static struct platform_driver leds_driver = { + .probe = dt_leds_probe, + .remove = dt_leds_remove, .driver = { - .name = "my_device_driver", - .of_match_table = my_driver_ids, + .name = "leds_device_driver", + .of_match_table = leds_driver_ids, }, }; @@ -36,13 +37,40 @@ static struct gpio_desc *red_led = NULL; static struct gpio_desc *blue_led = NULL; +/* spi stuff */ +static int dt_ls7366r_probe(struct spi_device *client); +static void dt_ls7366r_remove(struct spi_device *client); + +static struct of_device_id ls7366r_driver_ids[] = { + { + .compatible = "hottis,ls7366r", + }, {} +}; +MODULE_DEVICE_TABLE(of, ls7366r_driver_ids); + +static struct spi_device_id ls7366r[] = { + { "ls7366r", 0 }, + {}, +}; +MODULE_DEVICE_TABLE(spi, ls7366r); + +static struct spi_driver ls7366r_driver = { + .probe = dt_ls7366r_probe, + .remove = dt_ls7366r_remove, + .id_table = ls7366r, + .driver = { + .name = "ls7366r_device_driver", + .of_match_table = ls7366r_driver_ids, + }, +}; + /** * @brief This function is called on loading the driver */ -static int dt_probe(struct platform_device *pdev) { +static int dt_leds_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; - printk("counter - probing\n"); + printk("counter - leds probing\n"); if(!device_property_present(dev, "red-led-gpio")) { printk("counter - Error! Device property 'red-led-gpio' not found!\n"); @@ -72,22 +100,46 @@ static int dt_probe(struct platform_device *pdev) { /** * @brief This function is called on unloading the driver */ -static void dt_remove(struct platform_device *pdev) { - printk("counter - removing\n"); +static void dt_leds_remove(struct platform_device *pdev) { + printk("counter - leds removing\n"); gpiod_put(red_led); gpiod_put(blue_led); } +static int dt_ls7366r_probe(struct spi_device *client) { + printk("counter - ls7366r probing\n"); + + int ret = spi_setup(client); + if (ret < 0) { + printk("counter - Error! Failed to set up the SPI bus\n"); + return ret; + } + + return 0; +} + + +static void dt_ls7366r_remove(struct spi_device *client) { + printk("counter - ls7366r removing\n"); +} + + /** * @brief This function is called, when the module is loaded into the kernel */ static int __init my_init(void) { - printk("counter - Loading the driver...\n"); - if(platform_driver_register(&my_driver)) { + printk("counter - Loading the leds driver...\n"); + if(platform_driver_register(&leds_driver)) { printk("dt_gpio - Error! Could not load driver\n"); return -1; } + printk("counter - Loading the ls7366r driver...\n"); + if (spi_register_driver(&ls7366r_driver)) { + printk("counter - Error! Could not load spi driver\n"); + return -1; + } + printk("counter - red led on\n"); gpiod_set_value(red_led, 1); @@ -98,12 +150,14 @@ static int __init my_init(void) { * @brief This function is called, when the module is removed from the kernel */ static void __exit my_exit(void) { - printk("counter - Unload driver"); - printk("counter - red led off\n"); gpiod_set_value(red_led, 0); - platform_driver_unregister(&my_driver); + printk("counter - Unloading the leds driver...\n"); + platform_driver_unregister(&leds_driver); + + printk("counter - Unloading the ls7366r driver...\n"); + spi_unregister_driver(&ls7366r_driver); } module_init(my_init); diff --git a/driver/counter.dts b/driver/counter.dts index 442f794..2c9ef42 100644 --- a/driver/counter.dts +++ b/driver/counter.dts @@ -3,14 +3,40 @@ / { compatible = "brcm,bcm2835"; fragment@0 { - target-path = "/"; + target-path = "/soc"; __overlay__ { status = "okay"; - counter { - compatible = "hottis,counter"; + + leds { + compatible = "hottis,leds"; red-led-gpio = <&gpio 26 0>; blue-led-gpio = <&gpio 21 0>; }; }; }; + + fragment@1 { + target = <&spidev0>; + __overlay__ { + status = "disabled"; + }; + }; + + fragment@2 { + target = <&spi0>; + __overlay__ { + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + ls7366r: ls7366r0@0 { + compatible = "hottis,ls7366r"; + reg = <0x0>; + spi-max-frequency = <1000000>; + spi-bits-per-word = <8>; + status = "okay"; + }; + }; + }; + };