#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/leds.h>
#include <linux/module.h>

static void virtual_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness) {
	pr_info("Luminosité défini sur la LED %s à %d\n", led_cdev->name, brightness);
}

static enum led_brightness virtual_led_brightness_get(struct led_classdev *led_cdev) {
	pr_info("Luminosité lu sur la LED %s, valeur actuelle: %d\n", led_cdev->name, led_cdev->brightness);
	return led_cdev->brightness;
}

static struct led_classdev virtual_led = {
	.name = "flo-led:white:led-0",
	.color = LED_COLOR_ID_WHITE,
	.brightness = 0,
	.max_brightness = 255,
	.brightness_set = virtual_led_brightness_set,
	.brightness_set = virtual_led_brightness_get
};

static int __init virtual_led_init(void) {
	int ret;
	pr_info("Chargement du module pour la LED virtuelle\n");

	ret = led_classdev_register(NULL, &virtual_led);
	if (ret < 0) {
		pr_err("Impossible d'ajouter la LED virtuelle\n");
		return ret;
	}

	pr_info("La LED virtuelle est ajouté\n");
	return 0;
}

static void __exit virtual_led_exit(void) {
	pr_info("Déchargement du module pour la LED virtuelle\n");
	led_classdev_unregister(&virtual_led);
	pr_info("La LED virtuelle est bien retiré\n");
}

module_init(virtual_led_init);
module_exit(virtual_led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Florian RICHER");
MODULE_DESCRIPTION("Un module noyau qui ajoute une LED virtuelle");
MODULE_VERSION("1.0");