Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 71 additions & 7 deletions examples/bh_threaded.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/version.h>

#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 10, 0)
#define NO_GPIO_REQUEST_ARRAY
#endif

static int button_irqs[] = { -1, -1 };

Expand Down Expand Up @@ -50,29 +55,53 @@ static int __init bottomhalf_init(void)

pr_info("%s\n", __func__);

/* register LED gpios */
/* register LED gpios */
#ifdef NO_GPIO_REQUEST_ARRAY
ret = gpio_request(leds[0].gpio, leds[0].label);
#else
ret = gpio_request_array(leds, ARRAY_SIZE(leds));
#endif

if (ret) {
pr_err("Unable to request GPIOs for LEDs: %d\n", ret);
return ret;
}

/* register BUTTON gpios */
/* register BUTTON gpios */
#ifdef NO_GPIO_REQUEST_ARRAY
ret = gpio_request(buttons[0].gpio, buttons[0].label);

if (ret) {
pr_err("Unable to request GPIOs for BUTTONs: %d\n", ret);
goto fail1;
}

ret = gpio_request(buttons[1].gpio, buttons[1].label);

if (ret) {
pr_err("Unable to request GPIOs for BUTTONs: %d\n", ret);
goto fail2;
}
#else
ret = gpio_request_array(buttons, ARRAY_SIZE(buttons));

if (ret) {
pr_err("Unable to request GPIOs for BUTTONs: %d\n", ret);
goto fail1;
}
#endif

pr_info("Current button1 value: %d\n", gpio_get_value(buttons[0].gpio));

ret = gpio_to_irq(buttons[0].gpio);

if (ret < 0) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail3;
#else
goto fail2;
#endif
}

button_irqs[0] = ret;
Expand All @@ -86,14 +115,22 @@ static int __init bottomhalf_init(void)

if (ret) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail3;
#else
goto fail2;
#endif
}

ret = gpio_to_irq(buttons[1].gpio);

if (ret < 0) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail3;
#else
goto fail2;
#endif
}

button_irqs[1] = ret;
Expand All @@ -107,12 +144,29 @@ static int __init bottomhalf_init(void)

if (ret) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail4;
#else
goto fail3;
#endif
}

return 0;

/* cleanup what has been setup so far */
#ifdef NO_GPIO_REQUEST_ARRAY
fail4:
free_irq(button_irqs[0], NULL);

fail3:
gpio_free(buttons[1].gpio);

fail2:
gpio_free(buttons[0].gpio);

fail1:
gpio_free(leds[0].gpio);
#else
fail3:
free_irq(button_irqs[0], NULL);

Expand All @@ -121,27 +175,37 @@ static int __init bottomhalf_init(void)

fail1:
gpio_free_array(leds, ARRAY_SIZE(leds));
#endif

return ret;
}

static void __exit bottomhalf_exit(void)
{
int i;

pr_info("%s\n", __func__);

/* free irqs */
free_irq(button_irqs[0], NULL);
free_irq(button_irqs[1], NULL);

/* turn all LEDs off */
/* turn all LEDs off */
#ifdef NO_GPIO_REQUEST_ARRAY
gpio_set_value(leds[0].gpio, 0);
#else
int i;
for (i = 0; i < ARRAY_SIZE(leds); i++)
gpio_set_value(leds[i].gpio, 0);

/* unregister */
#endif

/* unregister */
#ifdef NO_GPIO_REQUEST_ARRAY
gpio_free(leds[0].gpio);
gpio_free(buttons[0].gpio);
gpio_free(buttons[1].gpio);
#else
gpio_free_array(leds, ARRAY_SIZE(leds));
gpio_free_array(buttons, ARRAY_SIZE(buttons));
#endif
}

module_init(bottomhalf_init);
Expand Down
68 changes: 66 additions & 2 deletions examples/bottomhalf.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/init.h>
#include <linux/version.h>

#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 10, 0)
#define NO_GPIO_REQUEST_ARRAY
#endif

/* Macro DECLARE_TASKLET_OLD exists for compatibility.
* See https://lwn.net/Articles/830964/
Expand Down Expand Up @@ -70,28 +75,52 @@ static int __init bottomhalf_init(void)
pr_info("%s\n", __func__);

/* register LED gpios */
#ifdef NO_GPIO_REQUEST_ARRAY
ret = gpio_request(leds[0].gpio, leds[0].label);
#else
ret = gpio_request_array(leds, ARRAY_SIZE(leds));
#endif

if (ret) {
pr_err("Unable to request GPIOs for LEDs: %d\n", ret);
return ret;
}

/* register BUTTON gpios */
#ifdef NO_GPIO_REQUEST_ARRAY
ret = gpio_request(buttons[0].gpio, buttons[0].label);

if (ret) {
pr_err("Unable to request GPIOs for BUTTONs: %d\n", ret);
goto fail1;
}

ret = gpio_request(buttons[1].gpio, buttons[1].label);

if (ret) {
pr_err("Unable to request GPIOs for BUTTONs: %d\n", ret);
goto fail2;
}
#else
ret = gpio_request_array(buttons, ARRAY_SIZE(buttons));

if (ret) {
pr_err("Unable to request GPIOs for BUTTONs: %d\n", ret);
goto fail1;
}
#endif

pr_info("Current button1 value: %d\n", gpio_get_value(buttons[0].gpio));

ret = gpio_to_irq(buttons[0].gpio);

if (ret < 0) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail3;
#else
goto fail2;
#endif
}

button_irqs[0] = ret;
Expand All @@ -104,14 +133,22 @@ static int __init bottomhalf_init(void)

if (ret) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail3;
#else
goto fail2;
#endif
}

ret = gpio_to_irq(buttons[1].gpio);

if (ret < 0) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail3;
#else
goto fail2;
#endif
}

button_irqs[1] = ret;
Expand All @@ -124,12 +161,29 @@ static int __init bottomhalf_init(void)

if (ret) {
pr_err("Unable to request IRQ: %d\n", ret);
#ifdef NO_GPIO_REQUEST_ARRAY
goto fail4;
#else
goto fail3;
#endif
}

return 0;

/* cleanup what has been setup so far */
#ifdef NO_GPIO_REQUEST_ARRAY
fail4:
free_irq(button_irqs[0], NULL);

fail3:
gpio_free(buttons[1].gpio);

fail2:
gpio_free(buttons[0].gpio);

fail1:
gpio_free(leds[0].gpio);
#else
fail3:
free_irq(button_irqs[0], NULL);

Expand All @@ -138,27 +192,37 @@ static int __init bottomhalf_init(void)

fail1:
gpio_free_array(leds, ARRAY_SIZE(leds));
#endif

return ret;
}

static void __exit bottomhalf_exit(void)
{
int i;

pr_info("%s\n", __func__);

/* free irqs */
free_irq(button_irqs[0], NULL);
free_irq(button_irqs[1], NULL);

/* turn all LEDs off */
#ifdef NO_GPIO_REQUEST_ARRAY
gpio_set_value(leds[0].gpio, 0);
#else
int i;
for (i = 0; i < ARRAY_SIZE(leds); i++)
gpio_set_value(leds[i].gpio, 0);
#endif

/* unregister */
#ifdef NO_GPIO_REQUEST_ARRAY
gpio_free(leds[0].gpio);
gpio_free(buttons[0].gpio);
gpio_free(buttons[1].gpio);
#else
gpio_free_array(leds, ARRAY_SIZE(leds));
gpio_free_array(buttons, ARRAY_SIZE(buttons));
#endif
}

module_init(bottomhalf_init);
Expand Down
Loading