Skip to content

Commit

Permalink
Merge pull request #287 from jeremy90307/master
Browse files Browse the repository at this point in the history
Allow GPIO example built with Linux v6.10+
  • Loading branch information
jserv authored Dec 11, 2024
2 parents 0b455a2 + bde77a1 commit e442916
Show file tree
Hide file tree
Showing 3 changed files with 203 additions and 11 deletions.
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

0 comments on commit e442916

Please sign in to comment.