[Xenomai-git] Jan Kiszka : cobalt/kernel: Allow to restart clock_nanosleep and select after signal processing
Module: xenomai-3 Branch: stable-3.0.x Commit: 36132cdb21cd0f8325ca9ef5a3299fecaf2ddfcc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=36132cdb21cd0f8325ca9ef5a3299fecaf2ddfcc Author: Jan KiszkaDate: Fri May 13 20:35:26 2016 +0200 cobalt/kernel: Allow to restart clock_nanosleep and select after signal processing Only if a signal was actually delivered to a thread that was blocked on sleep, [clock_]nanosleep or select, those calls should return -EINTR. Otherwise, they should resume with the timeout, accordingly adjusted in case of relative timeout. So far we returned -EINTR immediately which particularly disturbed the debugging of applications (SIGSTOP/CONT terminated those syscalls). This approach reuses the Linux restart mechanism to find out if those syscalls should be restarted or actually terminated after the signal was handled: Linux sets current->restart_block.fn in case a termination is required, unconditionally, thus also when the syscall did not return ERESTART_RESTARTBLOCK. We also use the restart_block.nanosleep.expires to transfer the remaining timeout to the restarted syscall. We can't use the original restart mechanism of Linux because it directs all ERESTART_RESTARTBLOCK through a special, Linux-only syscall. In our case, we would have to migrate the caller in that context to primary in order to resume the sleep, but this is not possible under Xenomai (we need to migration from within the syscall hooks). Signed-off-by: Jan Kiszka --- include/cobalt/uapi/kernel/thread.h|1 + .../cobalt/include/asm-generic/xenomai/wrappers.h |6 +++ kernel/cobalt/posix/clock.c| 35 -- kernel/cobalt/posix/internal.h |2 + kernel/cobalt/posix/io.c | 39 kernel/cobalt/posix/syscall.c |5 +++ 6 files changed, 78 insertions(+), 10 deletions(-) diff --git a/include/cobalt/uapi/kernel/thread.h b/include/cobalt/uapi/kernel/thread.h index 100ccee..cf2dfd3 100644 --- a/include/cobalt/uapi/kernel/thread.h +++ b/include/cobalt/uapi/kernel/thread.h @@ -77,6 +77,7 @@ #define XNMOVED 0x0001 /**< CPU migration in primary mode occurred */ #define XNLBALERT 0x0002 /**< Scheduler lock break alert (SIGDEBUG sent) */ #define XNDESCENT 0x0004 /**< Adaptive transitioning to secondary mode */ +#define XNSYSRST 0x0008 /**< Thread awaiting syscall restart after signal */ /** @} */ diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h index 060ce85..0f9ab14 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h +++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h @@ -133,4 +133,10 @@ devm_hwmon_device_register_with_groups(struct device *dev, const char *name, #error "Xenomai/cobalt requires Linux kernel 3.10 or above" #endif /* < 3.10 */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) +#define cobalt_get_restart_block(p)(_thread_info(p)->restart_block) +#else +#define cobalt_get_restart_block(p)(&(p)->restart_block) +#endif + #endif /* _COBALT_ASM_GENERIC_WRAPPERS_H */ diff --git a/kernel/cobalt/posix/clock.c b/kernel/cobalt/posix/clock.c index 8dab55b..d6a315b 100644 --- a/kernel/cobalt/posix/clock.c +++ b/kernel/cobalt/posix/clock.c @@ -236,8 +236,9 @@ int __cobalt_clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqt, struct timespec *rmt) { + struct restart_block *restart; struct xnthread *cur; - xnsticks_t rem; + xnsticks_t timeout, rem; int ret = 0; spl_t s; @@ -259,12 +260,40 @@ int __cobalt_clock_nanosleep(clockid_t clock_id, int flags, cur = xnthread_current(); + if (xnthread_test_localinfo(cur, XNSYSRST)) { + xnthread_clear_localinfo(cur, XNSYSRST); + + restart = cobalt_get_restart_block(current); + + if (restart->fn != cobalt_restart_syscall_placeholder) { + if (rmt) + ns2ts(rmt, rem > 1 ? rem : 0); + return -EINTR; + } + + timeout = restart->nanosleep.expires; + } else + timeout = ts2ns(rqt); + xnlock_get_irqsave(, s); - xnthread_suspend(cur, XNDELAY, ts2ns(rqt) + 1, + xnthread_suspend(cur, XNDELAY, timeout + 1, clock_flag(flags, clock_id), NULL); if (xnthread_test_info(cur, XNBREAK)) { + if (signal_pending(current)) { + restart = cobalt_get_restart_block(current); + restart->nanosleep.expires = + (flags & TIMER_ABSTIME) ? timeout : + xntimer_get_timeout_stopped(>rtimer); +
[Xenomai-git] Philippe Gerum : testsuite/gpio: add interrupt trigger argument
Module: xenomai-3 Branch: stable-3.0.x Commit: 588f1ad5e30a4c49533ea2eec4fafd9d50ec976f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=588f1ad5e30a4c49533ea2eec4fafd9d50ec976f Author: Philippe GerumDate: Tue Jul 12 10:03:48 2016 +0200 testsuite/gpio: add interrupt trigger argument --- testsuite/gpiotest/gpiotest.c |5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index aeb16af..c6620e1 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -32,10 +32,13 @@ smokey_test_plugin(interrupt, SMOKEY_ARGLIST( SMOKEY_STRING(device), + SMOKEY_STRING(trigger), SMOKEY_BOOL(select), ), "Wait for interrupts from a GPIO pin.\n" - "\tdevice=." + "\tdevice=\n" + "\trigger={edge[-rising/falling/both], level[-low/high]}\n" + "\tselect, wait on select(2)." ); smokey_test_plugin(read_value, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/gpio: fix output value set with direction
Module: xenomai-3 Branch: stable-3.0.x Commit: d0647b6468052cc491ee3324109153ed17510bc0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0647b6468052cc491ee3324109153ed17510bc0 Author: Philippe GerumDate: Tue Jul 12 10:03:48 2016 +0200 testsuite/gpio: fix output value set with direction --- testsuite/gpiotest/gpiotest.c |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index c6620e1..a845ef5 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -202,7 +202,8 @@ static int run_write_value(struct smokey_test *t, int argc, char *const argv[]) return ret; } - if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_OUT))) + value = 1; + if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_OUT, ))) return ret; ret = write(fd, , sizeof(value)); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: add blocking read()
Module: xenomai-3 Branch: stable-3.0.x Commit: e171922a92f7fec3dc484286b4e8ea92860a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e171922a92f7fec3dc484286b4e8ea92860a Author: Philippe GerumDate: Tue Jul 12 09:53:37 2016 +0200 drivers/gpio: add blocking read() --- include/rtdm/uapi/gpio.h|2 -- kernel/drivers/gpio/gpio-core.c |7 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h index 307e190..f846f48 100644 --- a/include/rtdm/uapi/gpio.h +++ b/include/rtdm/uapi/gpio.h @@ -18,8 +18,6 @@ #ifndef _RTDM_UAPI_GPIO_H #define _RTDM_UAPI_GPIO_H -#include - #define GPIO_RTIOC_DIR_OUT _IOW(RTDM_CLASS_GPIO, 0, int) #define GPIO_RTIOC_DIR_IN _IO(RTDM_CLASS_GPIO, 1) #define GPIO_RTIOC_IRQEN _IOW(RTDM_CLASS_GPIO, 2, int) /* GPIO trigger */ diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 6c1f351..f18d571 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -155,6 +155,13 @@ static ssize_t gpio_pin_read_rt(struct rtdm_fd *fd, return -EINVAL; pin = container_of(dev, struct rtdm_gpio_pin, dev); + + if (!(fd->oflags & O_NONBLOCK)) { + ret = rtdm_event_wait(>event); + if (ret) + return ret; + } + value = gpiod_get_raw_value(pin->desc); ret = rtdm_safe_copy_to_user(fd, buf, , sizeof(value)); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: auto-release pin upon close()
Module: xenomai-3 Branch: stable-3.0.x Commit: 261d1e84678900e04db56f71e7930fea0e36970f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=261d1e84678900e04db56f71e7930fea0e36970f Author: Philippe GerumDate: Tue Dec 27 15:37:06 2016 +0100 drivers/gpio: auto-release pin upon close() --- kernel/drivers/gpio/gpio-core.c | 42 +++ 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 5c08355..c310a96 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -33,6 +33,10 @@ struct rtdm_gpio_pin { struct gpio_desc *desc; }; +struct rtdm_gpio_chan { + bool requested; +}; + static int gpio_pin_interrupt(rtdm_irq_t *irqh) { struct rtdm_gpio_pin *pin; @@ -45,6 +49,7 @@ static int gpio_pin_interrupt(rtdm_irq_t *irqh) } static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, + struct rtdm_gpio_chan *chan, int trigger) { static const int trigger_flags[] = { @@ -92,6 +97,8 @@ static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, goto fail; } + chan->requested = true; + rtdm_irq_enable(>irqh); return 0; @@ -101,15 +108,18 @@ fail: return ret; } -static void release_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin) +static void release_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, +struct rtdm_gpio_chan *chan) { rtdm_irq_free(>irqh); gpio_free(gpio); + chan->requested = false; } static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, unsigned int request, void *arg) { + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); struct rtdm_device *dev = rtdm_fd_device(fd); unsigned int gpio = rtdm_fd_minor(fd); int ret = 0, val, trigger; @@ -128,14 +138,16 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, ret = gpio_direction_input(gpio); break; case GPIO_RTIOC_IRQEN: + if (chan->requested) + return -EBUSY; ret = rtdm_safe_copy_from_user(fd, , arg, sizeof(trigger)); if (ret) return ret; - ret = request_gpio_irq(gpio, pin, trigger); + ret = request_gpio_irq(gpio, pin, chan, trigger); break; case GPIO_RTIOC_IRQDIS: - release_gpio_irq(gpio, pin); + release_gpio_irq(gpio, pin, chan); break; default: return -EINVAL; @@ -147,6 +159,7 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, static ssize_t gpio_pin_read_rt(struct rtdm_fd *fd, void __user *buf, size_t len) { + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); struct rtdm_device *dev = rtdm_fd_device(fd); struct rtdm_gpio_pin *pin; int value, ret; @@ -154,6 +167,9 @@ static ssize_t gpio_pin_read_rt(struct rtdm_fd *fd, if (len < sizeof(value)) return -EINVAL; + if (!chan->requested) + return -EAGAIN; + pin = container_of(dev, struct rtdm_gpio_pin, dev); if (!(fd->oflags & O_NONBLOCK)) { @@ -191,14 +207,31 @@ static ssize_t gpio_pin_write_rt(struct rtdm_fd *fd, static int gpio_pin_select(struct rtdm_fd *fd, struct xnselector *selector, unsigned int type, unsigned int index) { + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); struct rtdm_device *dev = rtdm_fd_device(fd); struct rtdm_gpio_pin *pin; + if (!chan->requested) + return -EAGAIN; + pin = container_of(dev, struct rtdm_gpio_pin, dev); return rtdm_event_select(>event, selector, type, index); } +static void gpio_pin_close(struct rtdm_fd *fd) +{ + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); + struct rtdm_device *dev = rtdm_fd_device(fd); + unsigned int gpio = rtdm_fd_minor(fd); + struct rtdm_gpio_pin *pin; + + if (chan->requested) { + pin = container_of(dev, struct rtdm_gpio_pin, dev); + release_gpio_irq(gpio, pin, chan); + } +} + static void delete_pin_devices(struct rtdm_gpio_chip *rgc) { struct rtdm_gpio_pin *pin, *n; @@ -304,8 +337,9 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, rgc->driver.device_flags = RTDM_NAMED_DEVICE|RTDM_FIXED_MINOR; rgc->driver.base_minor = gc->base; rgc->driver.device_count = gc->ngpio; - rgc->driver.context_size = 0; + rgc->driver.context_size = sizeof(struct rtdm_gpio_chan); rgc->driver.ops = (struct rtdm_fd_ops){ + .close
[Xenomai-git] Philippe Gerum : drivers/spi: fix read/write transfer descriptor
Module: xenomai-3 Branch: stable-3.0.x Commit: f6d88b8d4c0d1e68673726dca5d668c29f275662 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f6d88b8d4c0d1e68673726dca5d668c29f275662 Author: Philippe GerumDate: Wed Aug 10 10:14:28 2016 +0200 drivers/spi: fix read/write transfer descriptor --- kernel/drivers/spi/spi-bcm2835.c | 18 ++ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index 117cf38..da44bf7 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -324,13 +324,10 @@ static ssize_t bcm2835_read(struct rtdm_spi_remote_slave *slave, struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); - if (bcm->io_len == 0) - return -EINVAL; /* No I/O buffers set. */ - - spim->tx_len = bcm->io_len / 2; - spim->rx_len = spim->tx_len; + spim->tx_len = len; + spim->rx_len = len; spim->tx_buf = NULL; - spim->rx_buf = bcm->io_virt; + spim->rx_buf = rx; return do_transfer_irq(slave) ?: len; } @@ -341,12 +338,9 @@ static ssize_t bcm2835_write(struct rtdm_spi_remote_slave *slave, struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); - if (bcm->io_len == 0) - return -EINVAL; /* No I/O buffers set. */ - - spim->tx_len = bcm->io_len / 2; - spim->rx_len = spim->tx_len; - spim->tx_buf = bcm->io_virt + bcm->io_len / 2; + spim->tx_len = len; + spim->rx_len = len; + spim->tx_buf = tx; spim->rx_buf = NULL; return do_transfer_irq(slave) ?: len; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: master: clear device class upon removal
Module: xenomai-3 Branch: stable-3.0.x Commit: cc6f7533e468f874834bb0e78b3b0765b33cd706 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cc6f7533e468f874834bb0e78b3b0765b33cd706 Author: Philippe GerumDate: Tue Nov 29 12:21:32 2016 +0100 drivers/spi: master: clear device class upon removal Since the master driver structure may be registered back later, we want to make sure that no dandling class pointer is left there. --- kernel/drivers/spi/spi-master.c |1 + 1 file changed, 1 insertion(+) diff --git a/kernel/drivers/spi/spi-master.c b/kernel/drivers/spi/spi-master.c index ac7929a..12a1ad1 100644 --- a/kernel/drivers/spi/spi-master.c +++ b/kernel/drivers/spi/spi-master.c @@ -426,6 +426,7 @@ void rtdm_spi_remove_master(struct rtdm_spi_master *master) rtdm_mutex_destroy(>bus_lock); spi_unregister_master(master->kmaster); + rtdm_drv_set_sysclass(>driver, NULL); class_destroy(class); kfree(classname); } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers
Module: xenomai-3 Branch: stable-3.0.x Commit: bb9c92b86ac166f12d5661950fe53187af3247cf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf Author: Philippe GerumDate: Thu Sep 29 15:22:24 2016 +0200 drivers/gpio: fix enumeration/detection of controllers --- kernel/drivers/gpio/Kconfig| 18 + kernel/drivers/gpio/gpio-bcm2835.c | 12 +++--- kernel/drivers/gpio/gpio-core.c| 71 +++- kernel/drivers/gpio/gpio-core.h| 10 - kernel/drivers/gpio/gpio-mxc.c | 39 ++-- 5 files changed, 89 insertions(+), 61 deletions(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 850127f..74c56d4 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -1,13 +1,17 @@ menu "Real-time GPIO drivers" config XENO_DRIVERS_GPIO - tristate + tristate "GPIO controller" depends on GPIOLIB + help + + Real-time capable GPIO module. + +if XENO_DRIVERS_GPIO config XENO_DRIVERS_GPIO_BCM2835 depends on MACH_BCM2708 - select XENO_DRIVERS_GPIO - tristate "Support for BCM2835 GPIOs" + bool "Support for BCM2835 GPIOs" help Enables support for the GPIO controller available from @@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835 config XENO_DRIVERS_GPIO_MXC depends on GPIO_MXC - select XENO_DRIVERS_GPIO - tristate "Support for MXC GPIOs" + bool "Support for MXC GPIOs" help Suitable for the GPIO controller available from Freescale/NXP's MXC architecture. config XENO_DRIVERS_GPIO_DEBUG - depends on XENO_DRIVERS_GPIO bool "Enable GPIO core debugging features" - + +endif + endmenu diff --git a/kernel/drivers/gpio/gpio-bcm2835.c b/kernel/drivers/gpio/gpio-bcm2835.c index f277262..6328955 100644 --- a/kernel/drivers/gpio/gpio-bcm2835.c +++ b/kernel/drivers/gpio/gpio-bcm2835.c @@ -20,20 +20,18 @@ #define RTDM_SUBCLASS_BCM2835 1 -static struct rtdm_gpio_chip bcm2835_gpio_chip; - static int __init bcm2835_gpio_init(void) { - return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio", -RTDM_SUBCLASS_BCM2835); + return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio", +RTDM_SUBCLASS_BCM2835); } +module_init(bcm2835_gpio_init); static void __exit bcm2835_gpio_exit(void) { - rtdm_gpiochip_remove(_gpio_chip); + rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835); } - -module_init(bcm2835_gpio_init); module_exit(bcm2835_gpio_exit); MODULE_LICENSE("GPL"); + diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index f18d571..5c08355 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc) { struct rtdm_gpio_pin *pin, *n; struct rtdm_device *dev; + rtdm_lockctx_t s; - rtdm_lock_get(>lock); + rtdm_lock_get_irqsave(>lock, s); list_for_each_entry_safe(pin, n, >pins, next) { list_del(>next); - rtdm_lock_put(>lock); + rtdm_lock_put_irqrestore(>lock, s); dev = >dev; rtdm_dev_unregister(dev); rtdm_event_destroy(>event); kfree(dev->label); kfree(pin->name); kfree(pin); - rtdm_lock_get(>lock); + rtdm_lock_get_irqsave(>lock, s); } - rtdm_lock_put(>lock); + rtdm_lock_put_irqrestore(>lock, s); } static int create_pin_devices(struct rtdm_gpio_chip *rgc) @@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc) struct gpio_chip *gc = rgc->gc; struct rtdm_gpio_pin *pin; struct rtdm_device *dev; + rtdm_lockctx_t s; int n, ret; for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) { @@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc) if (ret) goto fail_register; rtdm_event_init(>event, 0); - rtdm_lock_get(>lock); + rtdm_lock_get_irqsave(>lock, s); list_add_tail(>next, >pins); - rtdm_lock_put(>lock); + rtdm_lock_put_irqrestore(>lock, s); } return 0; @@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name); #include +LIST_HEAD(rtdm_gpio_chips); + +static DEFINE_MUTEX(chip_lock); + +static int match_gpio_chip(struct gpio_chip *gc, void *data) +{ + struct device *dev = data; + + return gc->dev == dev; +} + +static int add_gpio_chip(struct gpio_chip *gc, int type) +{ + struct rtdm_gpio_chip *rgc; + int ret; + + rgc = kzalloc(sizeof(*rgc),
[Xenomai-git] Philippe Gerum : drivers/gpio: allow setting trigger type w/ GPIO_RTIOC_IRQEN
Module: xenomai-3 Branch: stable-3.0.x Commit: a847734467bde3a979bd0916c57c4375b34fbaa0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a847734467bde3a979bd0916c57c4375b34fbaa0 Author: Philippe GerumDate: Tue Jun 28 12:16:02 2016 +0200 drivers/gpio: allow setting trigger type w/ GPIO_RTIOC_IRQEN --- include/rtdm/uapi/gpio.h|9 - kernel/drivers/gpio/gpio-core.c | 31 +++ testsuite/gpiotest/gpiotest.c | 34 +++--- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h index b0d4899..307e190 100644 --- a/include/rtdm/uapi/gpio.h +++ b/include/rtdm/uapi/gpio.h @@ -22,7 +22,14 @@ #define GPIO_RTIOC_DIR_OUT _IOW(RTDM_CLASS_GPIO, 0, int) #define GPIO_RTIOC_DIR_IN _IO(RTDM_CLASS_GPIO, 1) -#define GPIO_RTIOC_IRQEN _IO(RTDM_CLASS_GPIO, 2) +#define GPIO_RTIOC_IRQEN _IOW(RTDM_CLASS_GPIO, 2, int) /* GPIO trigger */ #define GPIO_RTIOC_IRQDIS _IO(RTDM_CLASS_GPIO, 3) +#define GPIO_TRIGGER_NONE 0x0 /* unspecified */ +#define GPIO_TRIGGER_EDGE_RISING 0x1 +#define GPIO_TRIGGER_EDGE_FALLING 0x2 +#define GPIO_TRIGGER_LEVEL_HIGH0x4 +#define GPIO_TRIGGER_LEVEL_LOW 0x8 +#define GPIO_TRIGGER_MASK 0xf + #endif /* !_RTDM_UAPI_GPIO_H */ diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index e8a7ba1..6c1f351 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -44,10 +44,20 @@ static int gpio_pin_interrupt(rtdm_irq_t *irqh) return RTDM_IRQ_HANDLED; } -static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin) +static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, + int trigger) { + static const int trigger_flags[] = { + IRQ_TYPE_EDGE_RISING, + IRQ_TYPE_EDGE_FALLING, + IRQ_TYPE_LEVEL_HIGH, + IRQ_TYPE_LEVEL_LOW, + }; + int irq_trigger, ret; unsigned int irq; - int ret; + + if (trigger & ~GPIO_TRIGGER_MASK) + return -EINVAL; ret = gpio_request(gpio, pin->name); if (ret) { @@ -66,6 +76,15 @@ static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin) rtdm_event_clear(>event); irq = gpio_to_irq(gpio); + /* +* Assumes GPIO_TRIGGER_xx values are forming a continuous +* sequence of bits starting at bit #0. +*/ + if (trigger) { + irq_trigger = trigger_flags[ffs(trigger) - 1]; + irq_set_irq_type(irq, irq_trigger); + } + ret = rtdm_irq_request(>irqh, irq, gpio_pin_interrupt, 0, pin->name, pin); if (ret) { @@ -93,8 +112,8 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, { struct rtdm_device *dev = rtdm_fd_device(fd); unsigned int gpio = rtdm_fd_minor(fd); + int ret = 0, val, trigger; struct rtdm_gpio_pin *pin; - int ret = 0, val; pin = container_of(dev, struct rtdm_gpio_pin, dev); @@ -109,7 +128,11 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, ret = gpio_direction_input(gpio); break; case GPIO_RTIOC_IRQEN: - ret = request_gpio_irq(gpio, pin); + ret = rtdm_safe_copy_from_user(fd, , + arg, sizeof(trigger)); + if (ret) + return ret; + ret = request_gpio_irq(gpio, pin, trigger); break; case GPIO_RTIOC_IRQDIS: release_gpio_irq(gpio, pin); diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 0bdd39f..6e9ce5b 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -55,8 +55,21 @@ smokey_test_plugin(write_value, static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) { - const char *device = NULL; - int fd, ret; + static struct { + const char *name; + int flag; + } trigger_types[] = { + { .name = "edge", .flag = GPIO_TRIGGER_EDGE_RISING }, + { .name = "edge-rising", .flag = GPIO_TRIGGER_EDGE_RISING }, + { .name = "edge-falling", .flag = GPIO_TRIGGER_EDGE_FALLING }, + { .name = "edge-both", .flag = GPIO_TRIGGER_EDGE_FALLING|GPIO_TRIGGER_EDGE_RISING }, + { .name = "level", .flag = GPIO_TRIGGER_LEVEL_LOW }, + { .name = "level-low", .flag = GPIO_TRIGGER_LEVEL_LOW }, + { .name = "level-high", .flag = GPIO_TRIGGER_LEVEL_HIGH }, + { NULL, 0 }, + }; + const char *device = NULL, *trigname; + int fd, ret, trigger, n;
[Xenomai-git] Philippe Gerum : drivers/spi: bcm2835: drop unused variables
Module: xenomai-3 Branch: stable-3.0.x Commit: 18aa7ff54025132aaabc6daa7dd50a70f62763bb URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=18aa7ff54025132aaabc6daa7dd50a70f62763bb Author: Philippe GerumDate: Thu Sep 29 15:25:57 2016 +0200 drivers/spi: bcm2835: drop unused variables --- kernel/drivers/spi/spi-bcm2835.c |2 -- 1 file changed, 2 deletions(-) diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index da44bf7..e4a95d0 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -322,7 +322,6 @@ static ssize_t bcm2835_read(struct rtdm_spi_remote_slave *slave, void *rx, size_t len) { struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); - struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); spim->tx_len = len; spim->rx_len = len; @@ -336,7 +335,6 @@ static ssize_t bcm2835_write(struct rtdm_spi_remote_slave *slave, const void *tx, size_t len) { struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); - struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); spim->tx_len = len; spim->rx_len = len; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Ronny Meeus : boilerplate/tlsf: limit memory usage to the specified size
Module: xenomai-3 Branch: stable-3.0.x Commit: e0e6ae76230e283e81bd0e80ea87dd6612c63a1c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e0e6ae76230e283e81bd0e80ea87dd6612c63a1c Author: Ronny MeeusDate: Thu Dec 15 12:45:00 2016 +0100 boilerplate/tlsf: limit memory usage to the specified size Before this patch the system memory pool's (tlsf variant) behavior was to grow in case allocations were done when depleted. This is a contradiction with the expected behavior (see mem-pool-size tunable documentation). When the pool is depleted, an error should be retuned instead of growing the pool. This patch solves this bug. --- lib/boilerplate/tlsf/tlsf.c | 18 +- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/lib/boilerplate/tlsf/tlsf.c b/lib/boilerplate/tlsf/tlsf.c index 207de21..8ee9405 100644 --- a/lib/boilerplate/tlsf/tlsf.c +++ b/lib/boilerplate/tlsf/tlsf.c @@ -625,6 +625,7 @@ void *tlsf_malloc(size_t size) void *area; area_size = sizeof(tlsf_t) + BHDR_OVERHEAD * 8; /* Just a safety constant */ + area_size += size; area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; area = get_new_area(_size); if (area == ((void *) ~0)) @@ -709,23 +710,6 @@ void *malloc_ex(size_t size, void *mem_pool) /* Searching a free block, recall that this function changes the values of fl and sl, so they are not longer valid when the function fails */ b = FIND_SUITABLE_BLOCK(tlsf, , ); -#if USE_MMAP || USE_SBRK -if (!b && mem_pool == mp) {/* Don't grow private pools */ - size_t area_size; - void *area; - /* Growing the pool size when needed */ - area_size = size + BHDR_OVERHEAD * 8; /* size plus enough room for the requered headers. */ - area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; - area = get_new_area(_size);/* Call sbrk or mmap */ - if (area == ((void *) ~0)) - return NULL;/* Not enough system memory */ - add_new_area(area, area_size, mem_pool); - /* Rounding up the requested size and calculating fl and sl */ - MAPPING_SEARCH(, , ); - /* Searching a free block */ - b = FIND_SUITABLE_BLOCK(tlsf, , ); -} -#endif if (!b) return NULL;/* Not found */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: introduce real-time SPI support
Module: xenomai-3 Branch: stable-3.0.x Commit: b7e3bd434ff00403bfe971c531c467e42502386f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b7e3bd434ff00403bfe971c531c467e42502386f Author: Philippe GerumDate: Fri Jun 17 16:28:25 2016 +0200 drivers/spi: introduce real-time SPI support --- include/rtdm/Makefile.am |1 + include/rtdm/spi.h | 24 ++ include/rtdm/uapi/Makefile.am |1 + include/rtdm/uapi/rtdm.h |9 +- include/rtdm/uapi/spi.h| 40 +++ kernel/drivers/Kconfig |1 + kernel/drivers/Makefile|2 +- kernel/drivers/gpio/gpio-bcm2835.c | 18 +- kernel/drivers/spi/Kconfig | 20 ++ kernel/drivers/spi/Makefile|8 + kernel/drivers/spi/spi-bcm2835.c | 691 kernel/drivers/spi/spi-device.c| 180 ++ kernel/drivers/spi/spi-device.h| 53 +++ kernel/drivers/spi/spi-master.c| 423 ++ kernel/drivers/spi/spi-master.h| 81 + 15 files changed, 1535 insertions(+), 17 deletions(-) diff --git a/include/rtdm/Makefile.am b/include/rtdm/Makefile.am index c837a05..9198595 100644 --- a/include/rtdm/Makefile.am +++ b/include/rtdm/Makefile.am @@ -10,6 +10,7 @@ includesub_HEADERS += \ gpio.h \ ipc.h \ serial.h\ + spi.h \ testing.h \ udd.h endif diff --git a/include/rtdm/spi.h b/include/rtdm/spi.h new file mode 100644 index 000..339a862 --- /dev/null +++ b/include/rtdm/spi.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2016 Philippe Gerum + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef _RTDM_SPI_H +#define _RTDM_SPI_H + +#include +#include + +#endif /* !_RTDM_SPI_H */ diff --git a/include/rtdm/uapi/Makefile.am b/include/rtdm/uapi/Makefile.am index c288ff9..fec15db 100644 --- a/include/rtdm/uapi/Makefile.am +++ b/include/rtdm/uapi/Makefile.am @@ -10,6 +10,7 @@ includesub_HEADERS += \ gpio.h \ ipc.h \ serial.h\ + spi.h \ testing.h \ udd.h endif diff --git a/include/rtdm/uapi/rtdm.h b/include/rtdm/uapi/rtdm.h index c49378c..ee6de65 100644 --- a/include/rtdm/uapi/rtdm.h +++ b/include/rtdm/uapi/rtdm.h @@ -80,13 +80,8 @@ typedef int64_t nanosecs_rel_t; #define RTDM_CLASS_UDD 9 #define RTDM_CLASS_MEMORY 10 #define RTDM_CLASS_GPIO11 -/* -#define RTDM_CLASS_USB ? -#define RTDM_CLASS_FIREWIRE? -#define RTDM_CLASS_INTERBUS? -#define RTDM_CLASS_PROFIBUS? -#define ... -*/ +#define RTDM_CLASS_SPI 12 + #define RTDM_CLASS_MISC223 #define RTDM_CLASS_EXPERIMENTAL224 #define RTDM_CLASS_MAX 255 diff --git a/include/rtdm/uapi/spi.h b/include/rtdm/uapi/spi.h new file mode 100644 index 000..45bc92d --- /dev/null +++ b/include/rtdm/uapi/spi.h @@ -0,0 +1,40 @@ +/** + * @note Copyright (C) 2016 Philippe Gerum + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _RTDM_UAPI_SPI_H +#define _RTDM_UAPI_SPI_H + +#include + +struct rtdm_spi_config { + __u32 speed_hz; + __u16 mode; + __u8 bits_per_word; +}; + +struct rtdm_spi_iobufs { + __u32 io_len; + __u32 i_offset; + __u32 o_offset; +}; + +#define SPI_RTIOC_SET_CONFIG _IOW(RTDM_CLASS_SPI, 0, struct rtdm_spi_config) +#define
[Xenomai-git] Philippe Gerum : drivers/spi: sanitize DEBUG mode switch
Module: xenomai-3 Branch: stable-3.0.x Commit: 121c9feb407e259e27995f70ba63b8a64ac071b6 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=121c9feb407e259e27995f70ba63b8a64ac071b6 Author: Philippe GerumDate: Tue Jun 28 10:49:26 2016 +0200 drivers/spi: sanitize DEBUG mode switch --- kernel/drivers/spi/Makefile |2 ++ kernel/drivers/spi/spi-bcm2835.c |3 --- kernel/drivers/spi/spi-device.c |3 --- kernel/drivers/spi/spi-master.c |3 --- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/kernel/drivers/spi/Makefile b/kernel/drivers/spi/Makefile index 6c78a2e..2a00284 100644 --- a/kernel/drivers/spi/Makefile +++ b/kernel/drivers/spi/Makefile @@ -1,4 +1,6 @@ +ccflags-$(CONFIG_XENO_DRIVERS_SPI_DEBUG) := -DDEBUG + obj-$(CONFIG_XENO_DRIVERS_SPI) += xeno_spi.o xeno_spi-y := spi-master.o spi-device.o diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index 118cfd5..117cf38 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -21,9 +21,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_SPI_DEBUG -#define DEBUG -#endif #include #include #include diff --git a/kernel/drivers/spi/spi-device.c b/kernel/drivers/spi/spi-device.c index 08cf9b0..71f30a6 100644 --- a/kernel/drivers/spi/spi-device.c +++ b/kernel/drivers/spi/spi-device.c @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_SPI_DEBUG -#define DEBUG -#endif #include #include #include diff --git a/kernel/drivers/spi/spi-master.c b/kernel/drivers/spi/spi-master.c index fe2ee40..ac7929a 100644 --- a/kernel/drivers/spi/spi-master.c +++ b/kernel/drivers/spi/spi-master.c @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_SPI_DEBUG -#define DEBUG -#endif #include #include #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/gpiotest: add GPIO test suite
Module: xenomai-3 Branch: stable-3.0.x Commit: 0165782dbde8cea4da45cd65df0c7e5f7fc17e12 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0165782dbde8cea4da45cd65df0c7e5f7fc17e12 Author: Philippe GerumDate: Wed Jun 1 15:59:27 2016 +0200 testsuite/gpiotest: add GPIO test suite --- testsuite/Makefile.am |2 + testsuite/gpiotest/Makefile.am | 19 testsuite/gpiotest/gpiotest.c | 188 3 files changed, 209 insertions(+) diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index e83e6cb..c345472 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -4,12 +4,14 @@ SUBDIRS = latency smokey if XENO_COBALT SUBDIRS += \ clocktest \ + gpiotest\ switchtest \ xeno-test endif DIST_SUBDIRS = \ clocktest \ + gpiotest\ latency \ smokey \ switchtest \ diff --git a/testsuite/gpiotest/Makefile.am b/testsuite/gpiotest/Makefile.am new file mode 100644 index 000..b01427b --- /dev/null +++ b/testsuite/gpiotest/Makefile.am @@ -0,0 +1,19 @@ +testdir = @XENO_TEST_DIR@ + +CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC) + +test_PROGRAMS = gpiotest + +gpiotest_SOURCES = gpiotest.c + +gpiotest_CPPFLAGS =\ + $(XENO_USER_CFLAGS) \ + -I$(top_srcdir)/include + +gpiotest_LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS) + +gpiotest_LDADD = \ + ../../lib/smokey/libsmokey.la \ + ../../lib/@XENO_CORE_LIB@ \ +@XENO_USER_LDADD@ \ + -lpthread -lrt diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c new file mode 100644 index 000..838f498 --- /dev/null +++ b/testsuite/gpiotest/gpiotest.c @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2016 Philippe Gerum . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +smokey_test_plugin(interrupt, + SMOKEY_ARGLIST( + SMOKEY_STRING(device), + ), + "Wait for interrupts from a GPIO pin.\n" + "\tdevice=." +); + +smokey_test_plugin(read_value, + SMOKEY_ARGLIST( + SMOKEY_STRING(device), + ), + "Read GPIO value.\n" + "\tdevice=." +); + +smokey_test_plugin(write_value, + SMOKEY_ARGLIST( + SMOKEY_STRING(device), + ), + "Write GPIO value.\n" + "\tdevice=." +); + +static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) +{ + const char *device = NULL; + int fd, ret; + fd_set set; + + smokey_parse_args(t, argc, argv); + + if (!SMOKEY_ARG_ISSET(interrupt, device)) { + warning("missing device= specification"); + return -EINVAL; + } + + device = SMOKEY_ARG_STRING(interrupt, device); + fd = open(device, O_RDWR); + if (fd < 0) { + ret = -errno; + warning("cannot open device %s [%s]", + device, symerror(ret)); + return ret; + } + + ret = ioctl(fd, GPIO_RTIOC_IRQEN); + if (ret) { + ret = -errno; + warning("GPIO_RTIOC_IRQEN failed on %s [%s]", + device, symerror(ret)); + return ret; + } + + FD_ZERO(); + FD_SET(fd, ); + + for (;;) { + ret = select(fd + 1, , NULL, NULL, NULL); + if (ret < 0) { + ret = -errno; + warning("failed listening to %s [%s]", + device, symerror(ret)); + } + printf("kick %d!\n", ret); + } + + close(fd); + + return 0; +} + +static int run_read_value(struct smokey_test *t, int argc, char *const argv[]) +{ + const char *device = NULL; + int fd, ret, value = -1; + + smokey_parse_args(t, argc, argv); + + if (!SMOKEY_ARG_ISSET(read_value, device)) { + warning("missing device= specification"); +
[Xenomai-git] Philippe Gerum : drivers/gpio: introduce real-time GPIO support
Module: xenomai-3 Branch: stable-3.0.x Commit: d0adf70c4a58c9ccc113ec54f4e07d0cc6261d5c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0adf70c4a58c9ccc113ec54f4e07d0cc6261d5c Author: Philippe GerumDate: Wed May 25 10:54:22 2016 +0200 drivers/gpio: introduce real-time GPIO support --- configure.ac |1 + include/rtdm/Makefile.am |1 + include/rtdm/gpio.h| 24 +++ include/rtdm/uapi/Makefile.am |1 + include/rtdm/uapi/gpio.h | 28 +++ include/rtdm/uapi/rtdm.h |1 + kernel/drivers/Kconfig |1 + kernel/drivers/Makefile|2 +- kernel/drivers/gpio/Kconfig| 25 +++ kernel/drivers/gpio/Makefile |7 + kernel/drivers/gpio/gpio-bcm2708.c | 39 kernel/drivers/gpio/gpio-core.c| 349 kernel/drivers/gpio/gpio-core.h| 48 + kernel/drivers/gpio/gpio-mxc.c | 67 +++ 14 files changed, 593 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index b33ff12..1f3c4fe 100644 --- a/configure.ac +++ b/configure.ac @@ -884,6 +884,7 @@ AC_CONFIG_FILES([ \ testsuite/Makefile \ testsuite/latency/Makefile \ testsuite/switchtest/Makefile \ + testsuite/gpiotest/Makefile \ testsuite/smokey/Makefile \ testsuite/smokey/arith/Makefile \ testsuite/smokey/sched-quota/Makefile \ diff --git a/include/rtdm/Makefile.am b/include/rtdm/Makefile.am index a8773ed..c837a05 100644 --- a/include/rtdm/Makefile.am +++ b/include/rtdm/Makefile.am @@ -7,6 +7,7 @@ includesub_HEADERS += \ analogy.h \ autotune.h \ can.h \ + gpio.h \ ipc.h \ serial.h\ testing.h \ diff --git a/include/rtdm/gpio.h b/include/rtdm/gpio.h new file mode 100644 index 000..c61f229 --- /dev/null +++ b/include/rtdm/gpio.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2016 Philippe Gerum + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef _RTDM_GPIO_H +#define _RTDM_GPIO_H + +#include +#include + +#endif /* !_RTDM_GPIO_H */ diff --git a/include/rtdm/uapi/Makefile.am b/include/rtdm/uapi/Makefile.am index 9560310..c288ff9 100644 --- a/include/rtdm/uapi/Makefile.am +++ b/include/rtdm/uapi/Makefile.am @@ -7,6 +7,7 @@ includesub_HEADERS += \ analogy.h \ autotune.h \ can.h \ + gpio.h \ ipc.h \ serial.h\ testing.h \ diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h new file mode 100644 index 000..b0d4899 --- /dev/null +++ b/include/rtdm/uapi/gpio.h @@ -0,0 +1,28 @@ +/** + * @note Copyright (C) 2016 Philippe Gerum + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _RTDM_UAPI_GPIO_H +#define _RTDM_UAPI_GPIO_H + +#include + +#define GPIO_RTIOC_DIR_OUT _IOW(RTDM_CLASS_GPIO, 0, int) +#define GPIO_RTIOC_DIR_IN _IO(RTDM_CLASS_GPIO, 1) +#define GPIO_RTIOC_IRQEN _IO(RTDM_CLASS_GPIO, 2) +#define GPIO_RTIOC_IRQDIS _IO(RTDM_CLASS_GPIO, 3) + +#endif /* !_RTDM_UAPI_GPIO_H */ diff --git a/include/rtdm/uapi/rtdm.h b/include/rtdm/uapi/rtdm.h index eed3b36..c49378c 100644 --- a/include/rtdm/uapi/rtdm.h +++ b/include/rtdm/uapi/rtdm.h @@ -79,6 +79,7 @@ typedef int64_t nanosecs_rel_t; #define RTDM_CLASS_COBALT 8 #define RTDM_CLASS_UDD 9 #define RTDM_CLASS_MEMORY
[Xenomai-git] Philippe Gerum : drivers/gpio: sanitize DEBUG mode switch
Module: xenomai-3 Branch: stable-3.0.x Commit: a49b78bfeabb16685807155d71541b733594a61d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a49b78bfeabb16685807155d71541b733594a61d Author: Philippe GerumDate: Tue Jun 28 10:49:17 2016 +0200 drivers/gpio: sanitize DEBUG mode switch --- kernel/drivers/gpio/Makefile|2 ++ kernel/drivers/gpio/gpio-core.c |3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/gpio/Makefile b/kernel/drivers/gpio/Makefile index e237279..c9e976f 100644 --- a/kernel/drivers/gpio/Makefile +++ b/kernel/drivers/gpio/Makefile @@ -1,4 +1,6 @@ +ccflags-$(CONFIG_XENO_DRIVERS_GPIO_DEBUG) := -DDEBUG + obj-$(CONFIG_XENO_DRIVERS_GPIO) += xeno_gpio.o xeno_gpio-y := gpio-core.o diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index d9863d9..e8a7ba1 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_GPIO_DEBUG -#define DEBUG -#endif #include #include #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: introduce iobufs.map_len to expose the mapping length
Module: xenomai-3 Branch: stable-3.0.x Commit: 11a3a75f92cecabf2a202698ebde60287dd5ef3f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=11a3a75f92cecabf2a202698ebde60287dd5ef3f Author: Philippe GerumDate: Tue Jun 28 10:41:33 2016 +0200 drivers/spi: introduce iobufs.map_len to expose the mapping length Overwriting iobufs.io_len for returning the length of the user-space mapping makes no sense, since both values have different meanings (DMA_ALIGNED(io_len) * 2 == map_len). --- include/rtdm/uapi/spi.h |1 + kernel/drivers/spi/spi-bcm2835.c |2 +- testsuite/spitest/spitest.c |4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/rtdm/uapi/spi.h b/include/rtdm/uapi/spi.h index 45bc92d..8f04237 100644 --- a/include/rtdm/uapi/spi.h +++ b/include/rtdm/uapi/spi.h @@ -30,6 +30,7 @@ struct rtdm_spi_iobufs { __u32 io_len; __u32 i_offset; __u32 o_offset; + __u32 map_len; }; #define SPI_RTIOC_SET_CONFIG _IOW(RTDM_CLASS_SPI, 0, struct rtdm_spi_config) diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index 02ebecd..118cfd5 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -409,7 +409,7 @@ static int bcm2835_set_iobufs(struct rtdm_spi_remote_slave *slave, p->i_offset = 0; p->o_offset = bcm->io_len / 2; - p->io_len = bcm->io_len; + p->map_len = bcm->io_len; return 0; } diff --git a/testsuite/spitest/spitest.c b/testsuite/spitest/spitest.c index 0609bad..40ef9a9 100644 --- a/testsuite/spitest/spitest.c +++ b/testsuite/spitest/spitest.c @@ -385,14 +385,14 @@ static int run_spi_transfer(struct smokey_test *t, int argc, char *const argv[]) if (!__T(ret, ioctl(fd, SPI_RTIOC_SET_IOBUFS, ))) return ret; - p = mmap(NULL, iobufs.io_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + p = mmap(NULL, iobufs.map_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (!__Fassert(p == MAP_FAILED)) return -EINVAL; smokey_trace("input_area[%u..%u], output_area[%u..%u], mapping length=%u", iobufs.i_offset, iobufs.i_offset + TRANSFER_SIZE - 1, iobufs.o_offset, iobufs.o_offset + TRANSFER_SIZE - 1, -iobufs.io_len); +iobufs.map_len); i_area = p + iobufs.i_offset; o_area = p + iobufs.o_offset; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: add debugging option
Module: xenomai-3 Branch: stable-3.0.x Commit: 657763dd956f9fecc1518f55d9c263366e46c8dc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=657763dd956f9fecc1518f55d9c263366e46c8dc Author: Philippe GerumDate: Thu Jun 23 11:57:50 2016 +0200 drivers/gpio: add debugging option --- kernel/drivers/gpio/Kconfig |6 +- kernel/drivers/gpio/gpio-core.c |3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 8997963..618f23a 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -19,7 +19,11 @@ config XENO_DRIVERS_GPIO_MXC tristate "Support for MXC GPIOs" help - Suitable for the GPIO controller available with + Suitable for the GPIO controller available from Freescale/NXP's MXC architecture. +config XENO_DRIVERS_GPIO_DEBUG + depends on XENO_DRIVERS_GPIO + bool "Enable GPIO core debugging features" + endmenu diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index e8a7ba1..d9863d9 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -15,6 +15,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#ifdef CONFIG_XENO_DRIVERS_GPIO_DEBUG +#define DEBUG +#endif #include #include #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/gpiotest: set GPIO direction
Module: xenomai-3 Branch: stable-3.0.x Commit: 597e4bf3b0f95c6802489e19e6671cf0a7e0c33e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=597e4bf3b0f95c6802489e19e6671cf0a7e0c33e Author: Philippe GerumDate: Sat Jun 25 18:53:36 2016 +0200 testsuite/gpiotest: set GPIO direction --- testsuite/gpiotest/gpiotest.c |6 ++ 1 file changed, 6 insertions(+) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 838f498..65949ee 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -117,6 +117,9 @@ static int run_read_value(struct smokey_test *t, int argc, char *const argv[]) return ret; } + if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_IN))) + return ret; + ret = read(fd, , sizeof(value)); close(fd); @@ -149,6 +152,9 @@ static int run_write_value(struct smokey_test *t, int argc, char *const argv[]) return ret; } + if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_OUT))) + return ret; + ret = write(fd, , sizeof(value)); close(fd); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: serialize access to per-chip pin list
Module: xenomai-3 Branch: stable-3.0.x Commit: 3b42d107c1ae11fc39a0cf11c1d8c8f78adac46b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3b42d107c1ae11fc39a0cf11c1d8c8f78adac46b Author: Philippe GerumDate: Fri Jun 17 16:12:27 2016 +0200 drivers/gpio: serialize access to per-chip pin list --- kernel/drivers/gpio/gpio-core.c |9 + kernel/drivers/gpio/gpio-core.h |1 + 2 files changed, 10 insertions(+) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 4f707b8..319d5c7 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -175,15 +175,21 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc) struct rtdm_gpio_pin *pin, *n; struct rtdm_device *dev; + rtdm_lock_get(>lock); + list_for_each_entry_safe(pin, n, >pins, next) { list_del(>next); + rtdm_lock_put(>lock); dev = >dev; rtdm_dev_unregister(dev); rtdm_event_destroy(>event); kfree(dev->label); kfree(pin->name); kfree(pin); + rtdm_lock_get(>lock); } + + rtdm_lock_put(>lock); } static int create_pin_devices(struct rtdm_gpio_chip *rgc) @@ -217,7 +223,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc) if (ret) goto fail_register; rtdm_event_init(>event, 0); + rtdm_lock_get(>lock); list_add_tail(>next, >pins); + rtdm_lock_put(>lock); } return 0; @@ -277,6 +285,7 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, rgc->gc = gc; INIT_LIST_HEAD(>pins); + rtdm_lock_init(>lock); ret = create_pin_devices(rgc); if (ret) diff --git a/kernel/drivers/gpio/gpio-core.h b/kernel/drivers/gpio/gpio-core.h index 3fa7867..d4dd28a 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/kernel/drivers/gpio/gpio-core.h @@ -31,6 +31,7 @@ struct rtdm_gpio_chip { struct class *devclass; struct list_head pins; struct list_head next; + rtdm_lock_t lock; }; int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: rename after the SoC
Module: xenomai-3 Branch: stable-3.0.x Commit: b6e0ca8e8b43a052e78b440cce91cccf069b5943 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b6e0ca8e8b43a052e78b440cce91cccf069b5943 Author: Philippe GerumDate: Thu Jun 23 14:31:10 2016 +0200 drivers/gpio: rename after the SoC --- kernel/drivers/gpio/Kconfig|8 kernel/drivers/gpio/Makefile |2 +- kernel/drivers/gpio/{gpio-bcm2708.c => gpio-bcm2835.c} |0 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 618f23a..850127f 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -4,14 +4,14 @@ config XENO_DRIVERS_GPIO tristate depends on GPIOLIB -config XENO_DRIVERS_GPIO_BCM2708 +config XENO_DRIVERS_GPIO_BCM2835 depends on MACH_BCM2708 select XENO_DRIVERS_GPIO - tristate "Support for BCM2708 GPIOs" + tristate "Support for BCM2835 GPIOs" help - Suitable for the GPIO controller present on Broadcom's BCM2708 - chip family. + Enables support for the GPIO controller available from + Broadcom's BCM2835 SoC. config XENO_DRIVERS_GPIO_MXC depends on GPIO_MXC diff --git a/kernel/drivers/gpio/Makefile b/kernel/drivers/gpio/Makefile index 5d194a1..e237279 100644 --- a/kernel/drivers/gpio/Makefile +++ b/kernel/drivers/gpio/Makefile @@ -3,5 +3,5 @@ obj-$(CONFIG_XENO_DRIVERS_GPIO) += xeno_gpio.o xeno_gpio-y := gpio-core.o -xeno_gpio-$(CONFIG_XENO_DRIVERS_GPIO_BCM2708) += gpio-bcm2708.o +xeno_gpio-$(CONFIG_XENO_DRIVERS_GPIO_BCM2835) += gpio-bcm2835.o xeno_gpio-$(CONFIG_XENO_DRIVERS_GPIO_MXC) += gpio-mxc.o diff --git a/kernel/drivers/gpio/gpio-bcm2708.c b/kernel/drivers/gpio/gpio-bcm2835.c similarity index 100% rename from kernel/drivers/gpio/gpio-bcm2708.c rename to kernel/drivers/gpio/gpio-bcm2835.c ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: enable GPIO-based chip select
Module: xenomai-3 Branch: stable-3.0.x Commit: 0f85395e3228ea30523d21a50ee9a0e5d0dfe82c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0f85395e3228ea30523d21a50ee9a0e5d0dfe82c Author: Philippe GerumDate: Tue Jun 28 09:58:10 2016 +0200 drivers/spi: enable GPIO-based chip select --- kernel/drivers/spi/spi-device.c | 38 +- kernel/drivers/spi/spi-device.h |1 + kernel/drivers/spi/spi-master.c | 18 -- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/kernel/drivers/spi/spi-device.c b/kernel/drivers/spi/spi-device.c index 62482b2..08cf9b0 100644 --- a/kernel/drivers/spi/spi-device.c +++ b/kernel/drivers/spi/spi-device.c @@ -43,22 +43,14 @@ int rtdm_spi_add_remote_slave(struct rtdm_spi_remote_slave *slave, slave->config.speed_hz = spi->max_speed_hz; slave->config.mode = spi->mode; slave->master = master; - mutex_init(>ctl_lock); dev = >dev; dev->driver = >driver; dev->label = kasprintf(GFP_KERNEL, "%s/slave%d.%%d", dev_name(>dev), kmaster->bus_num); - if (dev->label == NULL) { - ret = -ENOMEM; - goto fail_label; - } - - dev->device_data = master; - ret = rtdm_dev_register(dev); - if (ret) - goto fail_register; + if (dev->label == NULL) + return -ENOMEM; if (gpio_is_valid(spi->cs_gpio)) slave->cs_gpio = spi->cs_gpio; @@ -68,21 +60,30 @@ int rtdm_spi_add_remote_slave(struct rtdm_spi_remote_slave *slave, slave->cs_gpio = kmaster->cs_gpios[spi->chip_select]; } - if (gpio_is_valid(slave->cs_gpio)) - dev_dbg(slave_to_kdev(slave), "using CS GPIO%d\n", - slave->cs_gpio); + if (gpio_is_valid(slave->cs_gpio)) { + ret = gpio_request(slave->cs_gpio, dev->label); + if (ret) + goto fail; + slave->cs_gpiod = gpio_to_desc(slave->cs_gpio); + if (slave->cs_gpiod == NULL) + goto fail; + } + + mutex_init(>ctl_lock); + + dev->device_data = master; + ret = rtdm_dev_register(dev); + if (ret) + goto fail; rtdm_lock_get_irqsave(>lock, c); list_add_tail(>next, >slaves); rtdm_lock_put_irqrestore(>lock, c); return 0; - -fail_register: +fail: kfree(dev->label); -fail_label: - return ret; } EXPORT_SYMBOL_GPL(rtdm_spi_add_remote_slave); @@ -93,6 +94,9 @@ void rtdm_spi_remove_remote_slave(struct rtdm_spi_remote_slave *slave) struct rtdm_device *dev; rtdm_lockctx_t c; + if (gpio_is_valid(slave->cs_gpio)) + gpio_free(slave->cs_gpio); + mutex_destroy(>ctl_lock); rtdm_lock_get_irqsave(>lock, c); list_del(>next); diff --git a/kernel/drivers/spi/spi-device.h b/kernel/drivers/spi/spi-device.h index fcfca90..ee43c38 100644 --- a/kernel/drivers/spi/spi-device.h +++ b/kernel/drivers/spi/spi-device.h @@ -30,6 +30,7 @@ struct rtdm_spi_master; struct rtdm_spi_remote_slave { u8 chip_select; int cs_gpio; + struct gpio_desc *cs_gpiod; struct rtdm_device dev; struct list_head next; struct rtdm_spi_config config; diff --git a/kernel/drivers/spi/spi-master.c b/kernel/drivers/spi/spi-master.c index 132a3b9..fe2ee40 100644 --- a/kernel/drivers/spi/spi-master.c +++ b/kernel/drivers/spi/spi-master.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "spi-master.h" static inline @@ -105,6 +106,7 @@ static int do_chip_select(struct rtdm_spi_remote_slave *slave) { /* master->bus_lock held */ struct rtdm_spi_master *master = slave->master; rtdm_lockctx_t c; + int state; if (slave->config.speed_hz == 0) return -EINVAL; /* Setup is missing. */ @@ -113,7 +115,11 @@ static int do_chip_select(struct rtdm_spi_remote_slave *slave) rtdm_lock_get_irqsave(>lock, c); if (master->cs != slave) { - master->ops->chip_select(slave, true); + if (gpio_is_valid(slave->cs_gpio)) { + state = !!(slave->config.mode & SPI_CS_HIGH); + gpiod_set_raw_value(slave->cs_gpiod, state); + } else + master->ops->chip_select(slave, true); master->cs = slave; } @@ -126,10 +132,18 @@ static void do_chip_deselect(struct rtdm_spi_remote_slave *slave) { /* master->bus_lock held */ struct rtdm_spi_master *master = slave->master; rtdm_lockctx_t c; + int state; rtdm_lock_get_irqsave(>lock, c); - master->ops->chip_select(slave, false);
[Xenomai-git] Philippe Gerum : drivers/gpio: return ENODEV on failed device detection
Module: xenomai-3 Branch: stable-3.0.x Commit: 609615e9e94ce68d33adc8e3802cf5f9199142ca URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=609615e9e94ce68d33adc8e3802cf5f9199142ca Author: Philippe GerumDate: Sat Jun 18 12:20:43 2016 +0200 drivers/gpio: return ENODEV on failed device detection --- kernel/drivers/gpio/gpio-core.c | 11 --- kernel/drivers/gpio/gpio-core.h |2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 319d5c7..e8a7ba1 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -22,7 +22,6 @@ #include #include #include -#include #include "gpio-core.h" struct rtdm_gpio_pin { @@ -329,13 +328,17 @@ int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, } EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name); +#ifdef CONFIG_OF + +#include + int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, int (*match)(struct gpio_chip *gc)) { struct device_node *np = from; struct platform_device *pdev; - int ret = -EPROBE_DEFER; struct gpio_chip *gc; + int ret = -ENODEV; for (;;) { np = of_find_compatible_node(np, NULL, compat); @@ -344,7 +347,7 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, pdev = of_find_device_by_node(np); of_node_put(np); if (pdev == NULL) - return -ENODEV; + break; gc = find_chip_by_name(dev_name(>dev)); if (gc) { ret = match(gc); @@ -356,3 +359,5 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, return ret; } EXPORT_SYMBOL_GPL(rtdm_gpiochip_scan_of); + +#endif /* CONFIG_OF */ diff --git a/kernel/drivers/gpio/gpio-core.h b/kernel/drivers/gpio/gpio-core.h index d4dd28a..c0eac32 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/kernel/drivers/gpio/gpio-core.h @@ -43,7 +43,9 @@ void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, const char *label, int gpio_subclass); +#ifdef CONFIG_OF int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, int (*match)(struct gpio_chip *gc)); +#endif #endif /* !_RTDM_GPIO_CORE_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/spitest: add SPI test suite
Module: xenomai-3 Branch: stable-3.0.x Commit: 789773177b7d124dac8c652f53a973cf71ee2b2a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=789773177b7d124dac8c652f53a973cf71ee2b2a Author: Philippe GerumDate: Sat Jun 25 18:55:14 2016 +0200 testsuite/spitest: add SPI test suite --- configure.ac |1 + testsuite/Makefile.am |2 + testsuite/gpiotest/gpiotest.c | 31 +-- testsuite/spitest/Makefile.am | 19 ++ testsuite/spitest/spitest.c | 451 + 5 files changed, 491 insertions(+), 13 deletions(-) diff --git a/configure.ac b/configure.ac index 1f3c4fe..1308f8b 100644 --- a/configure.ac +++ b/configure.ac @@ -885,6 +885,7 @@ AC_CONFIG_FILES([ \ testsuite/latency/Makefile \ testsuite/switchtest/Makefile \ testsuite/gpiotest/Makefile \ + testsuite/spitest/Makefile \ testsuite/smokey/Makefile \ testsuite/smokey/arith/Makefile \ testsuite/smokey/sched-quota/Makefile \ diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index c345472..76d108e 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -5,6 +5,7 @@ if XENO_COBALT SUBDIRS += \ clocktest \ gpiotest\ + spitest \ switchtest \ xeno-test endif @@ -14,5 +15,6 @@ DIST_SUBDIRS =\ gpiotest\ latency \ smokey \ + spitest \ switchtest \ xeno-test diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 65949ee..0bdd39f 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -1,19 +1,24 @@ /* - * Copyright (C) 2016 Philippe Gerum . + * Copyright (C) 2016 Philippe Gerum * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include diff --git a/testsuite/spitest/Makefile.am b/testsuite/spitest/Makefile.am new file mode 100644 index 000..ccdd392 --- /dev/null +++ b/testsuite/spitest/Makefile.am @@ -0,0 +1,19 @@ +testdir = @XENO_TEST_DIR@ + +CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC) + +test_PROGRAMS = spitest + +spitest_SOURCES = spitest.c + +spitest_CPPFLAGS = \ + $(XENO_USER_CFLAGS) \ + -I$(top_srcdir)/include + +spitest_LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS) + +spitest_LDADD =\ + ../../lib/smokey/libsmokey.la \ + ../../lib/@XENO_CORE_LIB@ \ +@XENO_USER_LDADD@ \ + -lpthread -lrt diff --git a/testsuite/spitest/spitest.c b/testsuite/spitest/spitest.c new file mode 100644 index 000..0609bad --- /dev/null +++ b/testsuite/spitest/spitest.c @@ -0,0 +1,451 @@ +/* + * Copyright (C) 2016 Philippe Gerum + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of
[Xenomai-git] Philippe Gerum : testsuite/gpio: illustrate select() + read() combination
Module: xenomai-3 Branch: wip/drivers Commit: 322f91153bb8ce8710837722ae24d8376d7cad6c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=322f91153bb8ce8710837722ae24d8376d7cad6c Author: Philippe GerumDate: Tue Jul 12 10:03:48 2016 +0200 testsuite/gpio: illustrate select() + read() combination --- testsuite/gpiotest/gpiotest.c | 24 +++- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 6e9ce5b..aeb16af 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -32,6 +32,7 @@ smokey_test_plugin(interrupt, SMOKEY_ARGLIST( SMOKEY_STRING(device), + SMOKEY_BOOL(select), ), "Wait for interrupts from a GPIO pin.\n" "\tdevice=." @@ -68,8 +69,8 @@ static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) { .name = "level-high", .flag = GPIO_TRIGGER_LEVEL_HIGH }, { NULL, 0 }, }; + int do_select = 0, fd, ret, trigger, n, value; const char *device = NULL, *trigname; - int fd, ret, trigger, n; fd_set set; smokey_parse_args(t, argc, argv); @@ -88,6 +89,9 @@ static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) return ret; } + if (SMOKEY_ARG_ISSET(interrupt, select)) + do_select = SMOKEY_ARG_BOOL(interrupt, select); + trigger = GPIO_TRIGGER_NONE; if (SMOKEY_ARG_ISSET(interrupt, trigger)) { trigname = SMOKEY_ARG_STRING(interrupt, trigger); @@ -115,13 +119,23 @@ static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) FD_SET(fd, ); for (;;) { - ret = select(fd + 1, , NULL, NULL, NULL); + if (do_select) { + ret = select(fd + 1, , NULL, NULL, NULL); + if (ret < 0) { + ret = -errno; + warning("failed listening to %s [%s]", + device, symerror(ret)); + return ret; + } + } + ret = read(fd, , sizeof(value)); if (ret < 0) { ret = -errno; - warning("failed listening to %s [%s]", + warning("failed reading from %s [%s]", device, symerror(ret)); + return ret; } - printf("kick %d!\n", ret); + printf("received irq, GPIO state=%d\n", value); } close(fd); @@ -142,7 +156,7 @@ static int run_read_value(struct smokey_test *t, int argc, char *const argv[]) } device = SMOKEY_ARG_STRING(read_value, device); - fd = open(device, O_RDONLY); + fd = open(device, O_RDONLY|O_NONBLOCK); if (fd < 0) { ret = -errno; warning("cannot open device %s [%s]", ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: bcm2835: look up for the right chip label
Module: xenomai-3 Branch: wip/drivers Commit: 8012a966ac5ed9fe5de272e4021c697c3be1857c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8012a966ac5ed9fe5de272e4021c697c3be1857c Author: Philippe GerumDate: Sun Jul 10 12:02:04 2016 +0200 drivers/gpio: bcm2835: look up for the right chip label --- kernel/drivers/gpio/gpio-bcm2835.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/drivers/gpio/gpio-bcm2835.c b/kernel/drivers/gpio/gpio-bcm2835.c index 772298b..f277262 100644 --- a/kernel/drivers/gpio/gpio-bcm2835.c +++ b/kernel/drivers/gpio/gpio-bcm2835.c @@ -24,7 +24,7 @@ static struct rtdm_gpio_chip bcm2835_gpio_chip; static int __init bcm2835_gpio_init(void) { - return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2835_gpio", + return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio", RTDM_SUBCLASS_BCM2835); } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: add blocking read()
Module: xenomai-3 Branch: wip/drivers Commit: e171922a92f7fec3dc484286b4e8ea92860a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e171922a92f7fec3dc484286b4e8ea92860a Author: Philippe GerumDate: Tue Jul 12 09:53:37 2016 +0200 drivers/gpio: add blocking read() --- include/rtdm/uapi/gpio.h|2 -- kernel/drivers/gpio/gpio-core.c |7 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h index 307e190..f846f48 100644 --- a/include/rtdm/uapi/gpio.h +++ b/include/rtdm/uapi/gpio.h @@ -18,8 +18,6 @@ #ifndef _RTDM_UAPI_GPIO_H #define _RTDM_UAPI_GPIO_H -#include - #define GPIO_RTIOC_DIR_OUT _IOW(RTDM_CLASS_GPIO, 0, int) #define GPIO_RTIOC_DIR_IN _IO(RTDM_CLASS_GPIO, 1) #define GPIO_RTIOC_IRQEN _IOW(RTDM_CLASS_GPIO, 2, int) /* GPIO trigger */ diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 6c1f351..f18d571 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -155,6 +155,13 @@ static ssize_t gpio_pin_read_rt(struct rtdm_fd *fd, return -EINVAL; pin = container_of(dev, struct rtdm_gpio_pin, dev); + + if (!(fd->oflags & O_NONBLOCK)) { + ret = rtdm_event_wait(>event); + if (ret) + return ret; + } + value = gpiod_get_raw_value(pin->desc); ret = rtdm_safe_copy_to_user(fd, buf, , sizeof(value)); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: sanitize DEBUG mode switch
Module: xenomai-3 Branch: wip/drivers Commit: a49b78bfeabb16685807155d71541b733594a61d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a49b78bfeabb16685807155d71541b733594a61d Author: Philippe GerumDate: Tue Jun 28 10:49:17 2016 +0200 drivers/gpio: sanitize DEBUG mode switch --- kernel/drivers/gpio/Makefile|2 ++ kernel/drivers/gpio/gpio-core.c |3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/gpio/Makefile b/kernel/drivers/gpio/Makefile index e237279..c9e976f 100644 --- a/kernel/drivers/gpio/Makefile +++ b/kernel/drivers/gpio/Makefile @@ -1,4 +1,6 @@ +ccflags-$(CONFIG_XENO_DRIVERS_GPIO_DEBUG) := -DDEBUG + obj-$(CONFIG_XENO_DRIVERS_GPIO) += xeno_gpio.o xeno_gpio-y := gpio-core.o diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index d9863d9..e8a7ba1 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_GPIO_DEBUG -#define DEBUG -#endif #include #include #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers
Module: xenomai-3 Branch: wip/drivers Commit: bb9c92b86ac166f12d5661950fe53187af3247cf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf Author: Philippe GerumDate: Thu Sep 29 15:22:24 2016 +0200 drivers/gpio: fix enumeration/detection of controllers --- kernel/drivers/gpio/Kconfig| 18 + kernel/drivers/gpio/gpio-bcm2835.c | 12 +++--- kernel/drivers/gpio/gpio-core.c| 71 +++- kernel/drivers/gpio/gpio-core.h| 10 - kernel/drivers/gpio/gpio-mxc.c | 39 ++-- 5 files changed, 89 insertions(+), 61 deletions(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 850127f..74c56d4 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -1,13 +1,17 @@ menu "Real-time GPIO drivers" config XENO_DRIVERS_GPIO - tristate + tristate "GPIO controller" depends on GPIOLIB + help + + Real-time capable GPIO module. + +if XENO_DRIVERS_GPIO config XENO_DRIVERS_GPIO_BCM2835 depends on MACH_BCM2708 - select XENO_DRIVERS_GPIO - tristate "Support for BCM2835 GPIOs" + bool "Support for BCM2835 GPIOs" help Enables support for the GPIO controller available from @@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835 config XENO_DRIVERS_GPIO_MXC depends on GPIO_MXC - select XENO_DRIVERS_GPIO - tristate "Support for MXC GPIOs" + bool "Support for MXC GPIOs" help Suitable for the GPIO controller available from Freescale/NXP's MXC architecture. config XENO_DRIVERS_GPIO_DEBUG - depends on XENO_DRIVERS_GPIO bool "Enable GPIO core debugging features" - + +endif + endmenu diff --git a/kernel/drivers/gpio/gpio-bcm2835.c b/kernel/drivers/gpio/gpio-bcm2835.c index f277262..6328955 100644 --- a/kernel/drivers/gpio/gpio-bcm2835.c +++ b/kernel/drivers/gpio/gpio-bcm2835.c @@ -20,20 +20,18 @@ #define RTDM_SUBCLASS_BCM2835 1 -static struct rtdm_gpio_chip bcm2835_gpio_chip; - static int __init bcm2835_gpio_init(void) { - return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio", -RTDM_SUBCLASS_BCM2835); + return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio", +RTDM_SUBCLASS_BCM2835); } +module_init(bcm2835_gpio_init); static void __exit bcm2835_gpio_exit(void) { - rtdm_gpiochip_remove(_gpio_chip); + rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835); } - -module_init(bcm2835_gpio_init); module_exit(bcm2835_gpio_exit); MODULE_LICENSE("GPL"); + diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index f18d571..5c08355 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc) { struct rtdm_gpio_pin *pin, *n; struct rtdm_device *dev; + rtdm_lockctx_t s; - rtdm_lock_get(>lock); + rtdm_lock_get_irqsave(>lock, s); list_for_each_entry_safe(pin, n, >pins, next) { list_del(>next); - rtdm_lock_put(>lock); + rtdm_lock_put_irqrestore(>lock, s); dev = >dev; rtdm_dev_unregister(dev); rtdm_event_destroy(>event); kfree(dev->label); kfree(pin->name); kfree(pin); - rtdm_lock_get(>lock); + rtdm_lock_get_irqsave(>lock, s); } - rtdm_lock_put(>lock); + rtdm_lock_put_irqrestore(>lock, s); } static int create_pin_devices(struct rtdm_gpio_chip *rgc) @@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc) struct gpio_chip *gc = rgc->gc; struct rtdm_gpio_pin *pin; struct rtdm_device *dev; + rtdm_lockctx_t s; int n, ret; for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) { @@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc) if (ret) goto fail_register; rtdm_event_init(>event, 0); - rtdm_lock_get(>lock); + rtdm_lock_get_irqsave(>lock, s); list_add_tail(>next, >pins); - rtdm_lock_put(>lock); + rtdm_lock_put_irqrestore(>lock, s); } return 0; @@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name); #include +LIST_HEAD(rtdm_gpio_chips); + +static DEFINE_MUTEX(chip_lock); + +static int match_gpio_chip(struct gpio_chip *gc, void *data) +{ + struct device *dev = data; + + return gc->dev == dev; +} + +static int add_gpio_chip(struct gpio_chip *gc, int type) +{ + struct rtdm_gpio_chip *rgc; + int ret; + + rgc = kzalloc(sizeof(*rgc),
[Xenomai-git] Philippe Gerum : drivers/spi: bcm2835: drop unused variables
Module: xenomai-3 Branch: wip/drivers Commit: 18aa7ff54025132aaabc6daa7dd50a70f62763bb URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=18aa7ff54025132aaabc6daa7dd50a70f62763bb Author: Philippe GerumDate: Thu Sep 29 15:25:57 2016 +0200 drivers/spi: bcm2835: drop unused variables --- kernel/drivers/spi/spi-bcm2835.c |2 -- 1 file changed, 2 deletions(-) diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index da44bf7..e4a95d0 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -322,7 +322,6 @@ static ssize_t bcm2835_read(struct rtdm_spi_remote_slave *slave, void *rx, size_t len) { struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); - struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); spim->tx_len = len; spim->rx_len = len; @@ -336,7 +335,6 @@ static ssize_t bcm2835_write(struct rtdm_spi_remote_slave *slave, const void *tx, size_t len) { struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); - struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); spim->tx_len = len; spim->rx_len = len; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: allow setting trigger type w/ GPIO_RTIOC_IRQEN
Module: xenomai-3 Branch: wip/drivers Commit: a847734467bde3a979bd0916c57c4375b34fbaa0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a847734467bde3a979bd0916c57c4375b34fbaa0 Author: Philippe GerumDate: Tue Jun 28 12:16:02 2016 +0200 drivers/gpio: allow setting trigger type w/ GPIO_RTIOC_IRQEN --- include/rtdm/uapi/gpio.h|9 - kernel/drivers/gpio/gpio-core.c | 31 +++ testsuite/gpiotest/gpiotest.c | 34 +++--- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h index b0d4899..307e190 100644 --- a/include/rtdm/uapi/gpio.h +++ b/include/rtdm/uapi/gpio.h @@ -22,7 +22,14 @@ #define GPIO_RTIOC_DIR_OUT _IOW(RTDM_CLASS_GPIO, 0, int) #define GPIO_RTIOC_DIR_IN _IO(RTDM_CLASS_GPIO, 1) -#define GPIO_RTIOC_IRQEN _IO(RTDM_CLASS_GPIO, 2) +#define GPIO_RTIOC_IRQEN _IOW(RTDM_CLASS_GPIO, 2, int) /* GPIO trigger */ #define GPIO_RTIOC_IRQDIS _IO(RTDM_CLASS_GPIO, 3) +#define GPIO_TRIGGER_NONE 0x0 /* unspecified */ +#define GPIO_TRIGGER_EDGE_RISING 0x1 +#define GPIO_TRIGGER_EDGE_FALLING 0x2 +#define GPIO_TRIGGER_LEVEL_HIGH0x4 +#define GPIO_TRIGGER_LEVEL_LOW 0x8 +#define GPIO_TRIGGER_MASK 0xf + #endif /* !_RTDM_UAPI_GPIO_H */ diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index e8a7ba1..6c1f351 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -44,10 +44,20 @@ static int gpio_pin_interrupt(rtdm_irq_t *irqh) return RTDM_IRQ_HANDLED; } -static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin) +static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, + int trigger) { + static const int trigger_flags[] = { + IRQ_TYPE_EDGE_RISING, + IRQ_TYPE_EDGE_FALLING, + IRQ_TYPE_LEVEL_HIGH, + IRQ_TYPE_LEVEL_LOW, + }; + int irq_trigger, ret; unsigned int irq; - int ret; + + if (trigger & ~GPIO_TRIGGER_MASK) + return -EINVAL; ret = gpio_request(gpio, pin->name); if (ret) { @@ -66,6 +76,15 @@ static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin) rtdm_event_clear(>event); irq = gpio_to_irq(gpio); + /* +* Assumes GPIO_TRIGGER_xx values are forming a continuous +* sequence of bits starting at bit #0. +*/ + if (trigger) { + irq_trigger = trigger_flags[ffs(trigger) - 1]; + irq_set_irq_type(irq, irq_trigger); + } + ret = rtdm_irq_request(>irqh, irq, gpio_pin_interrupt, 0, pin->name, pin); if (ret) { @@ -93,8 +112,8 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, { struct rtdm_device *dev = rtdm_fd_device(fd); unsigned int gpio = rtdm_fd_minor(fd); + int ret = 0, val, trigger; struct rtdm_gpio_pin *pin; - int ret = 0, val; pin = container_of(dev, struct rtdm_gpio_pin, dev); @@ -109,7 +128,11 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, ret = gpio_direction_input(gpio); break; case GPIO_RTIOC_IRQEN: - ret = request_gpio_irq(gpio, pin); + ret = rtdm_safe_copy_from_user(fd, , + arg, sizeof(trigger)); + if (ret) + return ret; + ret = request_gpio_irq(gpio, pin, trigger); break; case GPIO_RTIOC_IRQDIS: release_gpio_irq(gpio, pin); diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 0bdd39f..6e9ce5b 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -55,8 +55,21 @@ smokey_test_plugin(write_value, static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) { - const char *device = NULL; - int fd, ret; + static struct { + const char *name; + int flag; + } trigger_types[] = { + { .name = "edge", .flag = GPIO_TRIGGER_EDGE_RISING }, + { .name = "edge-rising", .flag = GPIO_TRIGGER_EDGE_RISING }, + { .name = "edge-falling", .flag = GPIO_TRIGGER_EDGE_FALLING }, + { .name = "edge-both", .flag = GPIO_TRIGGER_EDGE_FALLING|GPIO_TRIGGER_EDGE_RISING }, + { .name = "level", .flag = GPIO_TRIGGER_LEVEL_LOW }, + { .name = "level-low", .flag = GPIO_TRIGGER_LEVEL_LOW }, + { .name = "level-high", .flag = GPIO_TRIGGER_LEVEL_HIGH }, + { NULL, 0 }, + }; + const char *device = NULL, *trigname; + int fd, ret, trigger, n;
[Xenomai-git] Philippe Gerum : drivers/spi: master: clear device class upon removal
Module: xenomai-3 Branch: wip/drivers Commit: cc6f7533e468f874834bb0e78b3b0765b33cd706 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cc6f7533e468f874834bb0e78b3b0765b33cd706 Author: Philippe GerumDate: Tue Nov 29 12:21:32 2016 +0100 drivers/spi: master: clear device class upon removal Since the master driver structure may be registered back later, we want to make sure that no dandling class pointer is left there. --- kernel/drivers/spi/spi-master.c |1 + 1 file changed, 1 insertion(+) diff --git a/kernel/drivers/spi/spi-master.c b/kernel/drivers/spi/spi-master.c index ac7929a..12a1ad1 100644 --- a/kernel/drivers/spi/spi-master.c +++ b/kernel/drivers/spi/spi-master.c @@ -426,6 +426,7 @@ void rtdm_spi_remove_master(struct rtdm_spi_master *master) rtdm_mutex_destroy(>bus_lock); spi_unregister_master(master->kmaster); + rtdm_drv_set_sysclass(>driver, NULL); class_destroy(class); kfree(classname); } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: introduce real-time SPI support
Module: xenomai-3 Branch: wip/drivers Commit: b7e3bd434ff00403bfe971c531c467e42502386f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b7e3bd434ff00403bfe971c531c467e42502386f Author: Philippe GerumDate: Fri Jun 17 16:28:25 2016 +0200 drivers/spi: introduce real-time SPI support --- include/rtdm/Makefile.am |1 + include/rtdm/spi.h | 24 ++ include/rtdm/uapi/Makefile.am |1 + include/rtdm/uapi/rtdm.h |9 +- include/rtdm/uapi/spi.h| 40 +++ kernel/drivers/Kconfig |1 + kernel/drivers/Makefile|2 +- kernel/drivers/gpio/gpio-bcm2835.c | 18 +- kernel/drivers/spi/Kconfig | 20 ++ kernel/drivers/spi/Makefile|8 + kernel/drivers/spi/spi-bcm2835.c | 691 kernel/drivers/spi/spi-device.c| 180 ++ kernel/drivers/spi/spi-device.h| 53 +++ kernel/drivers/spi/spi-master.c| 423 ++ kernel/drivers/spi/spi-master.h| 81 + 15 files changed, 1535 insertions(+), 17 deletions(-) diff --git a/include/rtdm/Makefile.am b/include/rtdm/Makefile.am index c837a05..9198595 100644 --- a/include/rtdm/Makefile.am +++ b/include/rtdm/Makefile.am @@ -10,6 +10,7 @@ includesub_HEADERS += \ gpio.h \ ipc.h \ serial.h\ + spi.h \ testing.h \ udd.h endif diff --git a/include/rtdm/spi.h b/include/rtdm/spi.h new file mode 100644 index 000..339a862 --- /dev/null +++ b/include/rtdm/spi.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2016 Philippe Gerum + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef _RTDM_SPI_H +#define _RTDM_SPI_H + +#include +#include + +#endif /* !_RTDM_SPI_H */ diff --git a/include/rtdm/uapi/Makefile.am b/include/rtdm/uapi/Makefile.am index c288ff9..fec15db 100644 --- a/include/rtdm/uapi/Makefile.am +++ b/include/rtdm/uapi/Makefile.am @@ -10,6 +10,7 @@ includesub_HEADERS += \ gpio.h \ ipc.h \ serial.h\ + spi.h \ testing.h \ udd.h endif diff --git a/include/rtdm/uapi/rtdm.h b/include/rtdm/uapi/rtdm.h index c49378c..ee6de65 100644 --- a/include/rtdm/uapi/rtdm.h +++ b/include/rtdm/uapi/rtdm.h @@ -80,13 +80,8 @@ typedef int64_t nanosecs_rel_t; #define RTDM_CLASS_UDD 9 #define RTDM_CLASS_MEMORY 10 #define RTDM_CLASS_GPIO11 -/* -#define RTDM_CLASS_USB ? -#define RTDM_CLASS_FIREWIRE? -#define RTDM_CLASS_INTERBUS? -#define RTDM_CLASS_PROFIBUS? -#define ... -*/ +#define RTDM_CLASS_SPI 12 + #define RTDM_CLASS_MISC223 #define RTDM_CLASS_EXPERIMENTAL224 #define RTDM_CLASS_MAX 255 diff --git a/include/rtdm/uapi/spi.h b/include/rtdm/uapi/spi.h new file mode 100644 index 000..45bc92d --- /dev/null +++ b/include/rtdm/uapi/spi.h @@ -0,0 +1,40 @@ +/** + * @note Copyright (C) 2016 Philippe Gerum + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _RTDM_UAPI_SPI_H +#define _RTDM_UAPI_SPI_H + +#include + +struct rtdm_spi_config { + __u32 speed_hz; + __u16 mode; + __u8 bits_per_word; +}; + +struct rtdm_spi_iobufs { + __u32 io_len; + __u32 i_offset; + __u32 o_offset; +}; + +#define SPI_RTIOC_SET_CONFIG _IOW(RTDM_CLASS_SPI, 0, struct rtdm_spi_config) +#define
[Xenomai-git] Philippe Gerum : drivers/spi: fix read/write transfer descriptor
Module: xenomai-3 Branch: wip/drivers Commit: f6d88b8d4c0d1e68673726dca5d668c29f275662 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f6d88b8d4c0d1e68673726dca5d668c29f275662 Author: Philippe GerumDate: Wed Aug 10 10:14:28 2016 +0200 drivers/spi: fix read/write transfer descriptor --- kernel/drivers/spi/spi-bcm2835.c | 18 ++ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index 117cf38..da44bf7 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -324,13 +324,10 @@ static ssize_t bcm2835_read(struct rtdm_spi_remote_slave *slave, struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); - if (bcm->io_len == 0) - return -EINVAL; /* No I/O buffers set. */ - - spim->tx_len = bcm->io_len / 2; - spim->rx_len = spim->tx_len; + spim->tx_len = len; + spim->rx_len = len; spim->tx_buf = NULL; - spim->rx_buf = bcm->io_virt; + spim->rx_buf = rx; return do_transfer_irq(slave) ?: len; } @@ -341,12 +338,9 @@ static ssize_t bcm2835_write(struct rtdm_spi_remote_slave *slave, struct spi_master_bcm2835 *spim = to_master_bcm2835(slave); struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave); - if (bcm->io_len == 0) - return -EINVAL; /* No I/O buffers set. */ - - spim->tx_len = bcm->io_len / 2; - spim->rx_len = spim->tx_len; - spim->tx_buf = bcm->io_virt + bcm->io_len / 2; + spim->tx_len = len; + spim->rx_len = len; + spim->tx_buf = tx; spim->rx_buf = NULL; return do_transfer_irq(slave) ?: len; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/gpio: fix output value set with direction
Module: xenomai-3 Branch: wip/drivers Commit: d0647b6468052cc491ee3324109153ed17510bc0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0647b6468052cc491ee3324109153ed17510bc0 Author: Philippe GerumDate: Tue Jul 12 10:03:48 2016 +0200 testsuite/gpio: fix output value set with direction --- testsuite/gpiotest/gpiotest.c |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index c6620e1..a845ef5 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -202,7 +202,8 @@ static int run_write_value(struct smokey_test *t, int argc, char *const argv[]) return ret; } - if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_OUT))) + value = 1; + if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_OUT, ))) return ret; ret = write(fd, , sizeof(value)); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: introduce iobufs.map_len to expose the mapping length
Module: xenomai-3 Branch: wip/drivers Commit: 11a3a75f92cecabf2a202698ebde60287dd5ef3f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=11a3a75f92cecabf2a202698ebde60287dd5ef3f Author: Philippe GerumDate: Tue Jun 28 10:41:33 2016 +0200 drivers/spi: introduce iobufs.map_len to expose the mapping length Overwriting iobufs.io_len for returning the length of the user-space mapping makes no sense, since both values have different meanings (DMA_ALIGNED(io_len) * 2 == map_len). --- include/rtdm/uapi/spi.h |1 + kernel/drivers/spi/spi-bcm2835.c |2 +- testsuite/spitest/spitest.c |4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/rtdm/uapi/spi.h b/include/rtdm/uapi/spi.h index 45bc92d..8f04237 100644 --- a/include/rtdm/uapi/spi.h +++ b/include/rtdm/uapi/spi.h @@ -30,6 +30,7 @@ struct rtdm_spi_iobufs { __u32 io_len; __u32 i_offset; __u32 o_offset; + __u32 map_len; }; #define SPI_RTIOC_SET_CONFIG _IOW(RTDM_CLASS_SPI, 0, struct rtdm_spi_config) diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index 02ebecd..118cfd5 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -409,7 +409,7 @@ static int bcm2835_set_iobufs(struct rtdm_spi_remote_slave *slave, p->i_offset = 0; p->o_offset = bcm->io_len / 2; - p->io_len = bcm->io_len; + p->map_len = bcm->io_len; return 0; } diff --git a/testsuite/spitest/spitest.c b/testsuite/spitest/spitest.c index 0609bad..40ef9a9 100644 --- a/testsuite/spitest/spitest.c +++ b/testsuite/spitest/spitest.c @@ -385,14 +385,14 @@ static int run_spi_transfer(struct smokey_test *t, int argc, char *const argv[]) if (!__T(ret, ioctl(fd, SPI_RTIOC_SET_IOBUFS, ))) return ret; - p = mmap(NULL, iobufs.io_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + p = mmap(NULL, iobufs.map_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (!__Fassert(p == MAP_FAILED)) return -EINVAL; smokey_trace("input_area[%u..%u], output_area[%u..%u], mapping length=%u", iobufs.i_offset, iobufs.i_offset + TRANSFER_SIZE - 1, iobufs.o_offset, iobufs.o_offset + TRANSFER_SIZE - 1, -iobufs.io_len); +iobufs.map_len); i_area = p + iobufs.i_offset; o_area = p + iobufs.o_offset; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: enable GPIO-based chip select
Module: xenomai-3 Branch: wip/drivers Commit: 0f85395e3228ea30523d21a50ee9a0e5d0dfe82c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0f85395e3228ea30523d21a50ee9a0e5d0dfe82c Author: Philippe GerumDate: Tue Jun 28 09:58:10 2016 +0200 drivers/spi: enable GPIO-based chip select --- kernel/drivers/spi/spi-device.c | 38 +- kernel/drivers/spi/spi-device.h |1 + kernel/drivers/spi/spi-master.c | 18 -- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/kernel/drivers/spi/spi-device.c b/kernel/drivers/spi/spi-device.c index 62482b2..08cf9b0 100644 --- a/kernel/drivers/spi/spi-device.c +++ b/kernel/drivers/spi/spi-device.c @@ -43,22 +43,14 @@ int rtdm_spi_add_remote_slave(struct rtdm_spi_remote_slave *slave, slave->config.speed_hz = spi->max_speed_hz; slave->config.mode = spi->mode; slave->master = master; - mutex_init(>ctl_lock); dev = >dev; dev->driver = >driver; dev->label = kasprintf(GFP_KERNEL, "%s/slave%d.%%d", dev_name(>dev), kmaster->bus_num); - if (dev->label == NULL) { - ret = -ENOMEM; - goto fail_label; - } - - dev->device_data = master; - ret = rtdm_dev_register(dev); - if (ret) - goto fail_register; + if (dev->label == NULL) + return -ENOMEM; if (gpio_is_valid(spi->cs_gpio)) slave->cs_gpio = spi->cs_gpio; @@ -68,21 +60,30 @@ int rtdm_spi_add_remote_slave(struct rtdm_spi_remote_slave *slave, slave->cs_gpio = kmaster->cs_gpios[spi->chip_select]; } - if (gpio_is_valid(slave->cs_gpio)) - dev_dbg(slave_to_kdev(slave), "using CS GPIO%d\n", - slave->cs_gpio); + if (gpio_is_valid(slave->cs_gpio)) { + ret = gpio_request(slave->cs_gpio, dev->label); + if (ret) + goto fail; + slave->cs_gpiod = gpio_to_desc(slave->cs_gpio); + if (slave->cs_gpiod == NULL) + goto fail; + } + + mutex_init(>ctl_lock); + + dev->device_data = master; + ret = rtdm_dev_register(dev); + if (ret) + goto fail; rtdm_lock_get_irqsave(>lock, c); list_add_tail(>next, >slaves); rtdm_lock_put_irqrestore(>lock, c); return 0; - -fail_register: +fail: kfree(dev->label); -fail_label: - return ret; } EXPORT_SYMBOL_GPL(rtdm_spi_add_remote_slave); @@ -93,6 +94,9 @@ void rtdm_spi_remove_remote_slave(struct rtdm_spi_remote_slave *slave) struct rtdm_device *dev; rtdm_lockctx_t c; + if (gpio_is_valid(slave->cs_gpio)) + gpio_free(slave->cs_gpio); + mutex_destroy(>ctl_lock); rtdm_lock_get_irqsave(>lock, c); list_del(>next); diff --git a/kernel/drivers/spi/spi-device.h b/kernel/drivers/spi/spi-device.h index fcfca90..ee43c38 100644 --- a/kernel/drivers/spi/spi-device.h +++ b/kernel/drivers/spi/spi-device.h @@ -30,6 +30,7 @@ struct rtdm_spi_master; struct rtdm_spi_remote_slave { u8 chip_select; int cs_gpio; + struct gpio_desc *cs_gpiod; struct rtdm_device dev; struct list_head next; struct rtdm_spi_config config; diff --git a/kernel/drivers/spi/spi-master.c b/kernel/drivers/spi/spi-master.c index 132a3b9..fe2ee40 100644 --- a/kernel/drivers/spi/spi-master.c +++ b/kernel/drivers/spi/spi-master.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "spi-master.h" static inline @@ -105,6 +106,7 @@ static int do_chip_select(struct rtdm_spi_remote_slave *slave) { /* master->bus_lock held */ struct rtdm_spi_master *master = slave->master; rtdm_lockctx_t c; + int state; if (slave->config.speed_hz == 0) return -EINVAL; /* Setup is missing. */ @@ -113,7 +115,11 @@ static int do_chip_select(struct rtdm_spi_remote_slave *slave) rtdm_lock_get_irqsave(>lock, c); if (master->cs != slave) { - master->ops->chip_select(slave, true); + if (gpio_is_valid(slave->cs_gpio)) { + state = !!(slave->config.mode & SPI_CS_HIGH); + gpiod_set_raw_value(slave->cs_gpiod, state); + } else + master->ops->chip_select(slave, true); master->cs = slave; } @@ -126,10 +132,18 @@ static void do_chip_deselect(struct rtdm_spi_remote_slave *slave) { /* master->bus_lock held */ struct rtdm_spi_master *master = slave->master; rtdm_lockctx_t c; + int state; rtdm_lock_get_irqsave(>lock, c); - master->ops->chip_select(slave, false);
[Xenomai-git] Philippe Gerum : drivers/gpio: auto-release pin upon close()
Module: xenomai-3 Branch: wip/drivers Commit: 261d1e84678900e04db56f71e7930fea0e36970f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=261d1e84678900e04db56f71e7930fea0e36970f Author: Philippe GerumDate: Tue Dec 27 15:37:06 2016 +0100 drivers/gpio: auto-release pin upon close() --- kernel/drivers/gpio/gpio-core.c | 42 +++ 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 5c08355..c310a96 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -33,6 +33,10 @@ struct rtdm_gpio_pin { struct gpio_desc *desc; }; +struct rtdm_gpio_chan { + bool requested; +}; + static int gpio_pin_interrupt(rtdm_irq_t *irqh) { struct rtdm_gpio_pin *pin; @@ -45,6 +49,7 @@ static int gpio_pin_interrupt(rtdm_irq_t *irqh) } static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, + struct rtdm_gpio_chan *chan, int trigger) { static const int trigger_flags[] = { @@ -92,6 +97,8 @@ static int request_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, goto fail; } + chan->requested = true; + rtdm_irq_enable(>irqh); return 0; @@ -101,15 +108,18 @@ fail: return ret; } -static void release_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin) +static void release_gpio_irq(unsigned int gpio, struct rtdm_gpio_pin *pin, +struct rtdm_gpio_chan *chan) { rtdm_irq_free(>irqh); gpio_free(gpio); + chan->requested = false; } static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, unsigned int request, void *arg) { + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); struct rtdm_device *dev = rtdm_fd_device(fd); unsigned int gpio = rtdm_fd_minor(fd); int ret = 0, val, trigger; @@ -128,14 +138,16 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, ret = gpio_direction_input(gpio); break; case GPIO_RTIOC_IRQEN: + if (chan->requested) + return -EBUSY; ret = rtdm_safe_copy_from_user(fd, , arg, sizeof(trigger)); if (ret) return ret; - ret = request_gpio_irq(gpio, pin, trigger); + ret = request_gpio_irq(gpio, pin, chan, trigger); break; case GPIO_RTIOC_IRQDIS: - release_gpio_irq(gpio, pin); + release_gpio_irq(gpio, pin, chan); break; default: return -EINVAL; @@ -147,6 +159,7 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd, static ssize_t gpio_pin_read_rt(struct rtdm_fd *fd, void __user *buf, size_t len) { + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); struct rtdm_device *dev = rtdm_fd_device(fd); struct rtdm_gpio_pin *pin; int value, ret; @@ -154,6 +167,9 @@ static ssize_t gpio_pin_read_rt(struct rtdm_fd *fd, if (len < sizeof(value)) return -EINVAL; + if (!chan->requested) + return -EAGAIN; + pin = container_of(dev, struct rtdm_gpio_pin, dev); if (!(fd->oflags & O_NONBLOCK)) { @@ -191,14 +207,31 @@ static ssize_t gpio_pin_write_rt(struct rtdm_fd *fd, static int gpio_pin_select(struct rtdm_fd *fd, struct xnselector *selector, unsigned int type, unsigned int index) { + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); struct rtdm_device *dev = rtdm_fd_device(fd); struct rtdm_gpio_pin *pin; + if (!chan->requested) + return -EAGAIN; + pin = container_of(dev, struct rtdm_gpio_pin, dev); return rtdm_event_select(>event, selector, type, index); } +static void gpio_pin_close(struct rtdm_fd *fd) +{ + struct rtdm_gpio_chan *chan = rtdm_fd_to_private(fd); + struct rtdm_device *dev = rtdm_fd_device(fd); + unsigned int gpio = rtdm_fd_minor(fd); + struct rtdm_gpio_pin *pin; + + if (chan->requested) { + pin = container_of(dev, struct rtdm_gpio_pin, dev); + release_gpio_irq(gpio, pin, chan); + } +} + static void delete_pin_devices(struct rtdm_gpio_chip *rgc) { struct rtdm_gpio_pin *pin, *n; @@ -304,8 +337,9 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, rgc->driver.device_flags = RTDM_NAMED_DEVICE|RTDM_FIXED_MINOR; rgc->driver.base_minor = gc->base; rgc->driver.device_count = gc->ngpio; - rgc->driver.context_size = 0; + rgc->driver.context_size = sizeof(struct rtdm_gpio_chan); rgc->driver.ops = (struct rtdm_fd_ops){ + .close
[Xenomai-git] Philippe Gerum : include/rtdm: mercury: export basic RTDM definitions
Module: xenomai-3 Branch: wip/drivers Commit: acde09bc494c5a13652548f0f5778842ddf8f90e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=acde09bc494c5a13652548f0f5778842ddf8f90e Author: Philippe GerumDate: Tue Dec 13 11:35:50 2016 +0100 include/rtdm: mercury: export basic RTDM definitions The basic RTDM definitions and data types should be exposed to Mercury-based applications, since the native RTDM implementation should use them over the POSIX I/O interface the same way. --- include/Makefile.am |5 ++--- include/rtdm/Makefile.am |7 +-- include/rtdm/uapi/Makefile.am |7 +-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/Makefile.am b/include/Makefile.am index f1b5738..1e9fe02 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -6,14 +6,13 @@ SUBDIRS = \ smokey \ alchemy \ psos\ + rtdm\ trank \ vxworks \ xenomai if XENO_COBALT -SUBDIRS += \ - cobalt \ - rtdm +SUBDIRS += cobalt else SUBDIRS += mercury endif diff --git a/include/rtdm/Makefile.am b/include/rtdm/Makefile.am index a4e6ff8..a8773ed 100644 --- a/include/rtdm/Makefile.am +++ b/include/rtdm/Makefile.am @@ -1,13 +1,16 @@ includesubdir = $(includedir)/rtdm -includesub_HEADERS = \ +includesub_HEADERS = rtdm.h + +if XENO_COBALT +includesub_HEADERS += \ analogy.h \ autotune.h \ can.h \ ipc.h \ - rtdm.h \ serial.h\ testing.h \ udd.h +endif SUBDIRS = uapi diff --git a/include/rtdm/uapi/Makefile.am b/include/rtdm/uapi/Makefile.am index 7cff6c2..9560310 100644 --- a/include/rtdm/uapi/Makefile.am +++ b/include/rtdm/uapi/Makefile.am @@ -1,11 +1,14 @@ includesubdir = $(includedir)/rtdm/uapi -includesub_HEADERS = \ +includesub_HEADERS = rtdm.h + +if XENO_COBALT +includesub_HEADERS += \ analogy.h \ autotune.h \ can.h \ ipc.h \ - rtdm.h \ serial.h\ testing.h \ udd.h +endif ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: rename after the SoC
Module: xenomai-3 Branch: wip/drivers Commit: b6e0ca8e8b43a052e78b440cce91cccf069b5943 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b6e0ca8e8b43a052e78b440cce91cccf069b5943 Author: Philippe GerumDate: Thu Jun 23 14:31:10 2016 +0200 drivers/gpio: rename after the SoC --- kernel/drivers/gpio/Kconfig|8 kernel/drivers/gpio/Makefile |2 +- kernel/drivers/gpio/{gpio-bcm2708.c => gpio-bcm2835.c} |0 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 618f23a..850127f 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -4,14 +4,14 @@ config XENO_DRIVERS_GPIO tristate depends on GPIOLIB -config XENO_DRIVERS_GPIO_BCM2708 +config XENO_DRIVERS_GPIO_BCM2835 depends on MACH_BCM2708 select XENO_DRIVERS_GPIO - tristate "Support for BCM2708 GPIOs" + tristate "Support for BCM2835 GPIOs" help - Suitable for the GPIO controller present on Broadcom's BCM2708 - chip family. + Enables support for the GPIO controller available from + Broadcom's BCM2835 SoC. config XENO_DRIVERS_GPIO_MXC depends on GPIO_MXC diff --git a/kernel/drivers/gpio/Makefile b/kernel/drivers/gpio/Makefile index 5d194a1..e237279 100644 --- a/kernel/drivers/gpio/Makefile +++ b/kernel/drivers/gpio/Makefile @@ -3,5 +3,5 @@ obj-$(CONFIG_XENO_DRIVERS_GPIO) += xeno_gpio.o xeno_gpio-y := gpio-core.o -xeno_gpio-$(CONFIG_XENO_DRIVERS_GPIO_BCM2708) += gpio-bcm2708.o +xeno_gpio-$(CONFIG_XENO_DRIVERS_GPIO_BCM2835) += gpio-bcm2835.o xeno_gpio-$(CONFIG_XENO_DRIVERS_GPIO_MXC) += gpio-mxc.o diff --git a/kernel/drivers/gpio/gpio-bcm2708.c b/kernel/drivers/gpio/gpio-bcm2835.c similarity index 100% rename from kernel/drivers/gpio/gpio-bcm2708.c rename to kernel/drivers/gpio/gpio-bcm2835.c ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/spi: sanitize DEBUG mode switch
Module: xenomai-3 Branch: wip/drivers Commit: 121c9feb407e259e27995f70ba63b8a64ac071b6 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=121c9feb407e259e27995f70ba63b8a64ac071b6 Author: Philippe GerumDate: Tue Jun 28 10:49:26 2016 +0200 drivers/spi: sanitize DEBUG mode switch --- kernel/drivers/spi/Makefile |2 ++ kernel/drivers/spi/spi-bcm2835.c |3 --- kernel/drivers/spi/spi-device.c |3 --- kernel/drivers/spi/spi-master.c |3 --- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/kernel/drivers/spi/Makefile b/kernel/drivers/spi/Makefile index 6c78a2e..2a00284 100644 --- a/kernel/drivers/spi/Makefile +++ b/kernel/drivers/spi/Makefile @@ -1,4 +1,6 @@ +ccflags-$(CONFIG_XENO_DRIVERS_SPI_DEBUG) := -DDEBUG + obj-$(CONFIG_XENO_DRIVERS_SPI) += xeno_spi.o xeno_spi-y := spi-master.o spi-device.o diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c index 118cfd5..117cf38 100644 --- a/kernel/drivers/spi/spi-bcm2835.c +++ b/kernel/drivers/spi/spi-bcm2835.c @@ -21,9 +21,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_SPI_DEBUG -#define DEBUG -#endif #include #include #include diff --git a/kernel/drivers/spi/spi-device.c b/kernel/drivers/spi/spi-device.c index 08cf9b0..71f30a6 100644 --- a/kernel/drivers/spi/spi-device.c +++ b/kernel/drivers/spi/spi-device.c @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_SPI_DEBUG -#define DEBUG -#endif #include #include #include diff --git a/kernel/drivers/spi/spi-master.c b/kernel/drivers/spi/spi-master.c index fe2ee40..ac7929a 100644 --- a/kernel/drivers/spi/spi-master.c +++ b/kernel/drivers/spi/spi-master.c @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef CONFIG_XENO_DRIVERS_SPI_DEBUG -#define DEBUG -#endif #include #include #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : boilerplate/time: add helper to init a timespec from a scalar
Module: xenomai-3 Branch: wip/drivers Commit: 61f6da906cda308c9f9a9de84ebf6010e988ccb8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=61f6da906cda308c9f9a9de84ebf6010e988ccb8 Author: Philippe GerumDate: Tue Dec 13 14:56:10 2016 +0100 boilerplate/time: add helper to init a timespec from a scalar --- include/boilerplate/time.h |3 +++ lib/boilerplate/time.c | 11 +++ 2 files changed, 14 insertions(+) diff --git a/include/boilerplate/time.h b/include/boilerplate/time.h index fff6075..8d317e7 100644 --- a/include/boilerplate/time.h +++ b/include/boilerplate/time.h @@ -44,6 +44,9 @@ void timespec_adds(struct timespec *__restrict r, const struct timespec *__restrict t1, sticks_t t2); +void timespec_sets(struct timespec *__restrict r, + ticks_t ns); + #ifdef __cplusplus } #endif diff --git a/lib/boilerplate/time.c b/lib/boilerplate/time.c index 547f899..d112593 100644 --- a/lib/boilerplate/time.c +++ b/lib/boilerplate/time.c @@ -72,3 +72,14 @@ void timespec_adds(struct timespec *__restrict r, r->tv_nsec -= 10; } } + +void timespec_sets(struct timespec *__restrict r, + ticks_t ns) +{ + r->tv_sec = ns / 10UL; + r->tv_nsec = ns - r->tv_sec * 10UL; + if (r->tv_nsec >= 10) { + r->tv_sec++; + r->tv_nsec -= 10; + } +} ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: add debugging option
Module: xenomai-3 Branch: wip/drivers Commit: 657763dd956f9fecc1518f55d9c263366e46c8dc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=657763dd956f9fecc1518f55d9c263366e46c8dc Author: Philippe GerumDate: Thu Jun 23 11:57:50 2016 +0200 drivers/gpio: add debugging option --- kernel/drivers/gpio/Kconfig |6 +- kernel/drivers/gpio/gpio-core.c |3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 8997963..618f23a 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -19,7 +19,11 @@ config XENO_DRIVERS_GPIO_MXC tristate "Support for MXC GPIOs" help - Suitable for the GPIO controller available with + Suitable for the GPIO controller available from Freescale/NXP's MXC architecture. +config XENO_DRIVERS_GPIO_DEBUG + depends on XENO_DRIVERS_GPIO + bool "Enable GPIO core debugging features" + endmenu diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index e8a7ba1..d9863d9 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -15,6 +15,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#ifdef CONFIG_XENO_DRIVERS_GPIO_DEBUG +#define DEBUG +#endif #include #include #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: introduce real-time GPIO support
Module: xenomai-3 Branch: wip/drivers Commit: d0adf70c4a58c9ccc113ec54f4e07d0cc6261d5c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0adf70c4a58c9ccc113ec54f4e07d0cc6261d5c Author: Philippe GerumDate: Wed May 25 10:54:22 2016 +0200 drivers/gpio: introduce real-time GPIO support --- configure.ac |1 + include/rtdm/Makefile.am |1 + include/rtdm/gpio.h| 24 +++ include/rtdm/uapi/Makefile.am |1 + include/rtdm/uapi/gpio.h | 28 +++ include/rtdm/uapi/rtdm.h |1 + kernel/drivers/Kconfig |1 + kernel/drivers/Makefile|2 +- kernel/drivers/gpio/Kconfig| 25 +++ kernel/drivers/gpio/Makefile |7 + kernel/drivers/gpio/gpio-bcm2708.c | 39 kernel/drivers/gpio/gpio-core.c| 349 kernel/drivers/gpio/gpio-core.h| 48 + kernel/drivers/gpio/gpio-mxc.c | 67 +++ 14 files changed, 593 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index b33ff12..1f3c4fe 100644 --- a/configure.ac +++ b/configure.ac @@ -884,6 +884,7 @@ AC_CONFIG_FILES([ \ testsuite/Makefile \ testsuite/latency/Makefile \ testsuite/switchtest/Makefile \ + testsuite/gpiotest/Makefile \ testsuite/smokey/Makefile \ testsuite/smokey/arith/Makefile \ testsuite/smokey/sched-quota/Makefile \ diff --git a/include/rtdm/Makefile.am b/include/rtdm/Makefile.am index a8773ed..c837a05 100644 --- a/include/rtdm/Makefile.am +++ b/include/rtdm/Makefile.am @@ -7,6 +7,7 @@ includesub_HEADERS += \ analogy.h \ autotune.h \ can.h \ + gpio.h \ ipc.h \ serial.h\ testing.h \ diff --git a/include/rtdm/gpio.h b/include/rtdm/gpio.h new file mode 100644 index 000..c61f229 --- /dev/null +++ b/include/rtdm/gpio.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2016 Philippe Gerum + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef _RTDM_GPIO_H +#define _RTDM_GPIO_H + +#include +#include + +#endif /* !_RTDM_GPIO_H */ diff --git a/include/rtdm/uapi/Makefile.am b/include/rtdm/uapi/Makefile.am index 9560310..c288ff9 100644 --- a/include/rtdm/uapi/Makefile.am +++ b/include/rtdm/uapi/Makefile.am @@ -7,6 +7,7 @@ includesub_HEADERS += \ analogy.h \ autotune.h \ can.h \ + gpio.h \ ipc.h \ serial.h\ testing.h \ diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h new file mode 100644 index 000..b0d4899 --- /dev/null +++ b/include/rtdm/uapi/gpio.h @@ -0,0 +1,28 @@ +/** + * @note Copyright (C) 2016 Philippe Gerum + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _RTDM_UAPI_GPIO_H +#define _RTDM_UAPI_GPIO_H + +#include + +#define GPIO_RTIOC_DIR_OUT _IOW(RTDM_CLASS_GPIO, 0, int) +#define GPIO_RTIOC_DIR_IN _IO(RTDM_CLASS_GPIO, 1) +#define GPIO_RTIOC_IRQEN _IO(RTDM_CLASS_GPIO, 2) +#define GPIO_RTIOC_IRQDIS _IO(RTDM_CLASS_GPIO, 3) + +#endif /* !_RTDM_UAPI_GPIO_H */ diff --git a/include/rtdm/uapi/rtdm.h b/include/rtdm/uapi/rtdm.h index eed3b36..c49378c 100644 --- a/include/rtdm/uapi/rtdm.h +++ b/include/rtdm/uapi/rtdm.h @@ -79,6 +79,7 @@ typedef int64_t nanosecs_rel_t; #define RTDM_CLASS_COBALT 8 #define RTDM_CLASS_UDD 9 #define RTDM_CLASS_MEMORY
[Xenomai-git] Philippe Gerum : drivers/gpio: allow building as module
Module: xenomai-3 Branch: wip/drivers Commit: 429a2315f831746f2f2b17dd82d0bfc86b527fa6 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=429a2315f831746f2f2b17dd82d0bfc86b527fa6 Author: Philippe GerumDate: Sat Jun 18 15:39:52 2016 +0200 drivers/gpio: allow building as module --- kernel/drivers/gpio/Kconfig |6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig index 001c1bc..8997963 100644 --- a/kernel/drivers/gpio/Kconfig +++ b/kernel/drivers/gpio/Kconfig @@ -1,13 +1,13 @@ menu "Real-time GPIO drivers" config XENO_DRIVERS_GPIO - bool + tristate depends on GPIOLIB config XENO_DRIVERS_GPIO_BCM2708 depends on MACH_BCM2708 select XENO_DRIVERS_GPIO - bool "Support for BCM2708 GPIOs" + tristate "Support for BCM2708 GPIOs" help Suitable for the GPIO controller present on Broadcom's BCM2708 @@ -16,7 +16,7 @@ config XENO_DRIVERS_GPIO_BCM2708 config XENO_DRIVERS_GPIO_MXC depends on GPIO_MXC select XENO_DRIVERS_GPIO - bool "Support for MXC GPIOs" + tristate "Support for MXC GPIOs" help Suitable for the GPIO controller available with ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Ronny Meeus : include/psos: remove dependency on tunables.h
Module: xenomai-3 Branch: wip/drivers Commit: dfec891315969f92aec781d037dd5cbb11cbdb1c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dfec891315969f92aec781d037dd5cbb11cbdb1c Author: Ronny MeeusDate: Tue Nov 29 15:03:00 2016 +0100 include/psos: remove dependency on tunables.h The psos.h file pollutes the application's namespace with defines of the boilerplate code because the tunables.h is included. In our application we already have a definition of the list_entry macro, resulting in a redefinition. The psos.h should be kept clean. Following small test program clearly shows the issue: int main(int argc, char * const argv[]) { return 0; } When compiling the code above a warning is generated: simple_test.c:3:1: warning: "list_entry" redefined In file included from boilerplate/list.h:24, from boilerplate/setup.h:21, from boilerplate/tunables.h:22, from psos/psos.h:28, from simple_test.c:1: boilerplate/shared-list.h:233:1: warning: this is the location of the previous definition This patch resolves the issue by moving the tunable related functionality in a seperate header file. --- include/psos/Makefile.am |4 +++- include/psos/psos.h | 13 include/psos/tunables.h | 49 ++ 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/include/psos/Makefile.am b/include/psos/Makefile.am index 0174271..ee7c5c8 100644 --- a/include/psos/Makefile.am +++ b/include/psos/Makefile.am @@ -1,3 +1,5 @@ includesubdir = $(includedir)/psos -includesub_HEADERS = psos.h +includesub_HEADERS = \ + psos.h \ + tunables.h diff --git a/include/psos/psos.h b/include/psos/psos.h index a6f1559..1554244 100644 --- a/include/psos/psos.h +++ b/include/psos/psos.h @@ -25,7 +25,6 @@ #define _XENOMAI_PSOS_PSOS_H #include -#include #ifndef SUCCESS #define SUCCESS 0 @@ -370,18 +369,6 @@ int psos_task_normalize_priority(u_long psos_prio); u_long psos_task_denormalize_priority(int core_prio); -extern int psos_long_names; - -static inline define_config_tunable(long_names, int, on) -{ - psos_long_names = on; -} - -static inline read_config_tunable(long_names, int) -{ - return psos_long_names; -} - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/include/psos/tunables.h b/include/psos/tunables.h new file mode 100644 index 000..2dbd3f0 --- /dev/null +++ b/include/psos/tunables.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2001-2010 Philippe Gerum . + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * This file satisfies the references within the emulator code + * mimicking a pSOS-like API built upon the copperplate library. + * + * pSOS and pSOS+ are registered trademarks of Wind River Systems, Inc. + */ + +#ifndef _XENOMAI_PSOS_TUNABLES_H +#define _XENOMAI_PSOS_TUNABLES_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern int psos_long_names; + +static inline define_config_tunable(long_names, int, on) +{ + psos_long_names = on; +} + +static inline read_config_tunable(long_names, int) +{ + return psos_long_names; +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* !_XENOMAI_PSOS_TUNABLES_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: serialize access to per-chip pin list
Module: xenomai-3 Branch: wip/drivers Commit: 3b42d107c1ae11fc39a0cf11c1d8c8f78adac46b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3b42d107c1ae11fc39a0cf11c1d8c8f78adac46b Author: Philippe GerumDate: Fri Jun 17 16:12:27 2016 +0200 drivers/gpio: serialize access to per-chip pin list --- kernel/drivers/gpio/gpio-core.c |9 + kernel/drivers/gpio/gpio-core.h |1 + 2 files changed, 10 insertions(+) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 4f707b8..319d5c7 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -175,15 +175,21 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc) struct rtdm_gpio_pin *pin, *n; struct rtdm_device *dev; + rtdm_lock_get(>lock); + list_for_each_entry_safe(pin, n, >pins, next) { list_del(>next); + rtdm_lock_put(>lock); dev = >dev; rtdm_dev_unregister(dev); rtdm_event_destroy(>event); kfree(dev->label); kfree(pin->name); kfree(pin); + rtdm_lock_get(>lock); } + + rtdm_lock_put(>lock); } static int create_pin_devices(struct rtdm_gpio_chip *rgc) @@ -217,7 +223,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc) if (ret) goto fail_register; rtdm_event_init(>event, 0); + rtdm_lock_get(>lock); list_add_tail(>next, >pins); + rtdm_lock_put(>lock); } return 0; @@ -277,6 +285,7 @@ int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, rgc->gc = gc; INIT_LIST_HEAD(>pins); + rtdm_lock_init(>lock); ret = create_pin_devices(rgc); if (ret) diff --git a/kernel/drivers/gpio/gpio-core.h b/kernel/drivers/gpio/gpio-core.h index 3fa7867..d4dd28a 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/kernel/drivers/gpio/gpio-core.h @@ -31,6 +31,7 @@ struct rtdm_gpio_chip { struct class *devclass; struct list_head pins; struct list_head next; + rtdm_lock_t lock; }; int rtdm_gpiochip_add(struct rtdm_gpio_chip *rgc, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : copperplate/regd: conform to libfuse assumption regarding SIGCHLD
Module: xenomai-3 Branch: wip/drivers Commit: 4364bdd358e893b1f4f7f644a35191b3fc7f4180 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4364bdd358e893b1f4f7f644a35191b3fc7f4180 Author: Philippe GerumDate: Tue Dec 27 09:45:35 2016 +0100 copperplate/regd: conform to libfuse assumption regarding SIGCHLD When executing utility programs such as /bin/mount via a fork+exec sequence, libfuse assumes that SIGCHLD won't be ignored by the forked child, so that waitpid() may be safely used to wait for child completion. This means that SIGCHLD must not be ignored by the caller of fuse_main() in the first place, since such signal disposition is inherited. It turned out that sysregd was actually ignoring SIGCHLD before attempting to mount the system fs on behalf of fuse_main(), causing libfuse's add_mount() to fail after ECHILD was received from waitpid(), due to the following sequence of events: registry_thread: fuse_main() registry_thread:add_mount() registry_thread:mount_pid = fork() registry_thread:execl("/bin/mount", ...) /bin/mount: ... /bin/mount: exit(0) registry_thread:waitpid(mount_pid, ...) => ECHILD As a matter of fact, sysregd does not need any particular disposition for SIGCHLD for carrying out its own duties, but has to start with this signal set to SIG_IGN when spawned from copperplate (see spawn_daemon()). The fix is to switch this signal disposition back to SIG_DFL before the registry thread is started. --- lib/copperplate/regd/regd.c |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/copperplate/regd/regd.c b/lib/copperplate/regd/regd.c index e0228fb..8752070 100644 --- a/lib/copperplate/regd/regd.c +++ b/lib/copperplate/regd/regd.c @@ -541,8 +541,9 @@ int main(int argc, char *const *argv) memset(, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, , NULL); sigaction(SIGPIPE, , NULL); + sa.sa_handler = SIG_DFL; + sigaction(SIGCHLD, , NULL); if (daemonize) { ret = daemon(1, 1); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : demo/cross-link: fix multiple error reports
Module: xenomai-3 Branch: wip/drivers Commit: 8fe023a422aab5cebfbd0363d6f06cbe2386eca4 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8fe023a422aab5cebfbd0363d6f06cbe2386eca4 Author: Philippe GerumDate: Tue Nov 29 09:37:48 2016 +0100 demo/cross-link: fix multiple error reports --- demo/alchemy/cobalt/cross-link.c | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/demo/alchemy/cobalt/cross-link.c b/demo/alchemy/cobalt/cross-link.c index 8c0f53f..9b1fb34 100644 --- a/demo/alchemy/cobalt/cross-link.c +++ b/demo/alchemy/cobalt/cross-link.c @@ -89,7 +89,7 @@ static int close_file( int fd, char *name) break; default: printf(MAIN_PREFIX "%s -> %s\n", name, - strerror(-err)); + strerror(errno)); break; } } while (err == -EAGAIN && i < 10); @@ -158,7 +158,7 @@ static void write_task_proc(void *arg) written = write(write_fd, _time, sz); if (written < 0 ) { printf(WTASK_PREFIX "error on write, %s\n", - strerror(-err)); + strerror(errno)); break; } else if (written != sz) { printf(WTASK_PREFIX "only %d / %zd byte transmitted\n", @@ -201,7 +201,7 @@ static void read_task_proc(void *arg) if (err) { printf(RTASK_PREFIX "error on RTSER_RTIOC_WAIT_EVENT, %s\n", - strerror(-err)); + strerror(errno)); if (err == -ETIMEDOUT) continue; break; @@ -218,7 +218,7 @@ static void read_task_proc(void *arg) nr++; } else if (rd < 0 ) { printf(RTASK_PREFIX "error on read, code %s\n", - strerror(-err)); + strerror(errno)); break; } else { printf(RTASK_PREFIX "only %d / %zd byte received \n", @@ -245,7 +245,7 @@ int main(int argc, char* argv[]) write_fd = open( WRITE_FILE, 0); if (write_fd < 0) { printf(MAIN_PREFIX "can't open %s (write), %s\n", WRITE_FILE, - strerror(-write_fd)); + strerror(errno)); goto error; } write_state |= STATE_FILE_OPENED; @@ -255,7 +255,7 @@ int main(int argc, char* argv[]) err = ioctl(write_fd, RTSER_RTIOC_SET_CONFIG, _config); if (err) { printf(MAIN_PREFIX "error while RTSER_RTIOC_SET_CONFIG, %s\n", - strerror(-err)); + strerror(errno)); goto error; } printf(MAIN_PREFIX "write-config written\n"); @@ -264,7 +264,7 @@ int main(int argc, char* argv[]) read_fd = open( READ_FILE, 0 ); if (read_fd < 0) { printf(MAIN_PREFIX "can't open %s (read), %s\n", READ_FILE, - strerror(-read_fd)); + strerror(errno)); goto error; } read_state |= STATE_FILE_OPENED; @@ -274,7 +274,7 @@ int main(int argc, char* argv[]) err = ioctl(read_fd, RTSER_RTIOC_SET_CONFIG, _config); if (err) { printf(MAIN_PREFIX "error while ioctl, %s\n", - strerror(-err)); + strerror(errno)); goto error; } printf(MAIN_PREFIX "read-config written\n"); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : build: allow building Mercury over any CPU architecture
Module: xenomai-3 Branch: wip/drivers Commit: 18493575967fe969768674096f88b63d71e032e1 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=18493575967fe969768674096f88b63d71e032e1 Author: Philippe GerumDate: Mon Nov 28 16:42:10 2016 +0100 build: allow building Mercury over any CPU architecture We have no arch-dep bits for Mercury, so there is no point in restricting the set of supported CPU architectures further than those the target compiler can build for. --- configure.ac | 54 ++ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index 789a6d7..b33ff12 100644 --- a/configure.ac +++ b/configure.ac @@ -123,37 +123,44 @@ use_tls=no case "$build_for" in i*86*-*) use_tls=yes - XENO_TARGET_ARCH=x86 + target_cpu_arch=x86 CONFIG_XENO_DEFAULT_PERIOD=10 ;; ppc-*|powerpc-*|powerpc64-*|ppc64-*) use_tls=yes - XENO_TARGET_ARCH=powerpc + target_cpu_arch=powerpc CONFIG_XENO_DEFAULT_PERIOD=10 ;; bfin-*|bfinnommu-*|blackfin-*) - XENO_TARGET_ARCH=blackfin + target_cpu_arch=blackfin CONFIG_XENO_DEFAULT_PERIOD=10 ;; arm*-*) - XENO_TARGET_ARCH=arm + target_cpu_arch=arm CONFIG_XENO_DEFAULT_PERIOD=100 ;; x86_64-*|amd64-*) use_tls=yes - XENO_TARGET_ARCH=x86 + target_cpu_arch=x86 CONFIG_XENO_DEFAULT_PERIOD=10 ;; - *) echo "" - echo "***" - echo "Still unsupported target: $build_for -- Sorry." - echo "***" - echo "" - exit 1;; + *) + if test $rtcore_type = cobalt; then + echo "" + echo "**" + echo "Cobalt not supported over $build_for." + echo "**" + echo "" + exit 1 + else + CONFIG_XENO_DEFAULT_PERIOD=10 + target_cpu_arch=`echo $build_for|cut -d- -f1` + fi + ;; esac -AC_MSG_RESULT([$XENO_TARGET_ARCH]) -AM_CONDITIONAL(XENO_TARGET_ARCH_X86,[test $XENO_TARGET_ARCH = x86]) +AC_MSG_RESULT([$target_cpu_arch]) +XENO_TARGET_ARCH=$target_cpu_arch AC_ENABLE_SHARED AC_PROG_LIBTOOL @@ -211,7 +218,7 @@ fi dnl Raw monotonic clock (default: cobalt=on, mercury=off) -if test x$rtcore_type = xcobalt; then +if test $rtcore_type = cobalt; then raw_monotonic_clock=y else raw_monotonic_clock= @@ -273,7 +280,7 @@ AC_ARG_ENABLE(condvar-workaround, esac]) AC_MSG_RESULT(${workaround_condvar_pi:-no}) if test x$workaround_condvar_pi = xy; then - if test x$rtcore_type = xmercury; then + if test $rtcore_type = mercury; then AC_DEFINE(CONFIG_XENO_WORKAROUND_CONDVAR_PI,1,[config]) else AC_MSG_WARN([PI workaround for condvars useless over Cobalt - ignoring]) @@ -319,10 +326,10 @@ if test x$use_registry = xy; then fi AM_CONDITIONAL(XENO_REGISTRY,[test x$use_registry = xy]) -dnl SMP support (default: off) +dnl SMP support (default: on for cobalt/x86, off otherwise) CONFIG_SMP= -if test $XENO_TARGET_ARCH = x86; then +if test $target_cpu_arch = x86 -a $rtcore_type = cobalt; then CONFIG_SMP=y fi AC_MSG_CHECKING(for SMP support) @@ -352,11 +359,10 @@ else AC_DEFINE(CONFIG_XENO_SANITY,0,[config]) fi -dnl VSYSCALL (default: enabled) for x86 - -CONFIG_XENO_X86_VSYSCALL=y +dnl VSYSCALL (default: enabled) for Cobalt/x86 -if test $XENO_TARGET_ARCH = x86; then +if test $XENO_TARGET_ARCH = x86 -a $rtcore_type = cobalt; then + CONFIG_XENO_X86_VSYSCALL=y AC_MSG_CHECKING(for x86 VSYSCALL availability) AC_ARG_ENABLE(x86-vsyscall, AS_HELP_STRING([--enable-x86-vsyscall], [Assume VSYSCALL enabled for issuing syscalls]), @@ -597,8 +603,8 @@ dnl Allocator for Copperplate dnl Note: in dual kernel mode, we don't want malloc, no matter what. dnl We switch to malloc only over the Mercury core in debug mode, to ease dnl debugging with valgrind, instrumented glibc etc. -AM_CONDITIONAL(XENO_TLSF,[test x$rtcore_type = xcobalt -o x$debug_mode = x]) -test x$rtcore_type = xcobalt -o x$debug_mode = x && AC_DEFINE(CONFIG_XENO_TLSF,1,[config]) +AM_CONDITIONAL(XENO_TLSF,[test $rtcore_type = cobalt -o x$debug_mode = x]) +test $rtcore_type = cobalt -o x$debug_mode = x && AC_DEFINE(CONFIG_XENO_TLSF,1,[config]) dnl Check for atomic builtins. For now we only check for the legacy dnl interface, i.e. __sync_*. @@ -779,7 +785,7 @@ dnl Now we can close the conditional section, right after all dnl Autoconf-generated symbols have been listed. AH_BOTTOM([#endif /* __IN_XENO__ */]) -if test x$rtcore_type = xcobalt; then +if test $rtcore_type = cobalt; then XENO_USER_CFLAGS="-I$topdir/lib/cobalt/arch/$XENO_TARGET_ARCH/include -I$topdir/kernel/cobalt/arch/$XENO_TARGET_ARCH/include $XENO_USER_CFLAGS"
[Xenomai-git] Ronny Meeus : boilerplate: solve compiler warning when libgen.h is included
Module: xenomai-3 Branch: wip/drivers Commit: 12fa18f4267cc67882d477b282eb72b2daa5c193 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=12fa18f4267cc67882d477b282eb72b2daa5c193 Author: Ronny MeeusDate: Tue Nov 29 14:26:00 2016 +0100 boilerplate: solve compiler warning when libgen.h is included In boilerplate function 'get_program_name', basename is used. When libgen.h is included in your program, the basename gets the POSIX version (no const char*, see 'man basename'): char *basename(char *path); This results in the following compiler warning: boilerplate/setup.h: In function 'const char* get_program_name()': boilerplate/setup.h:107: error: invalid conversion from 'const char*' to 'char*' boilerplate/setup.h:107: error: initializing argument 1 of 'char* __xpg_basename(char*)' Test application: int main(int argc, char * const argv[]) { return 0; } When the libgen.h is not included, the warning is not seen. This patch solve the above issue by moving the implementation to setup.c instead of using an inline function. --- include/boilerplate/setup.h |5 + lib/boilerplate/setup.c |5 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/boilerplate/setup.h b/include/boilerplate/setup.h index 5a18f6a..374758b 100644 --- a/include/boilerplate/setup.h +++ b/include/boilerplate/setup.h @@ -102,10 +102,7 @@ extern int __config_done; extern struct base_setup_data __base_setup_data; -static inline const char *get_program_name(void) -{ - return basename(__base_setup_data.arg0 ?: "program"); -} +const char *get_program_name(void); void __trace_me(const char *fmt, ...); diff --git a/lib/boilerplate/setup.c b/lib/boilerplate/setup.c index dbeb5e1..f1760e6 100644 --- a/lib/boilerplate/setup.c +++ b/lib/boilerplate/setup.c @@ -644,3 +644,8 @@ void __register_setup_call(struct setup_descriptor *p, int id) } pvlist_prepend(>__reserved.next, _list); } + +const char *get_program_name(void) +{ + return basename(__base_setup_data.arg0 ?: "program"); +} ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : drivers/gpio: return ENODEV on failed device detection
Module: xenomai-3 Branch: wip/drivers Commit: 609615e9e94ce68d33adc8e3802cf5f9199142ca URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=609615e9e94ce68d33adc8e3802cf5f9199142ca Author: Philippe GerumDate: Sat Jun 18 12:20:43 2016 +0200 drivers/gpio: return ENODEV on failed device detection --- kernel/drivers/gpio/gpio-core.c | 11 --- kernel/drivers/gpio/gpio-core.h |2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c index 319d5c7..e8a7ba1 100644 --- a/kernel/drivers/gpio/gpio-core.c +++ b/kernel/drivers/gpio/gpio-core.c @@ -22,7 +22,6 @@ #include #include #include -#include #include "gpio-core.h" struct rtdm_gpio_pin { @@ -329,13 +328,17 @@ int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, } EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name); +#ifdef CONFIG_OF + +#include + int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, int (*match)(struct gpio_chip *gc)) { struct device_node *np = from; struct platform_device *pdev; - int ret = -EPROBE_DEFER; struct gpio_chip *gc; + int ret = -ENODEV; for (;;) { np = of_find_compatible_node(np, NULL, compat); @@ -344,7 +347,7 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, pdev = of_find_device_by_node(np); of_node_put(np); if (pdev == NULL) - return -ENODEV; + break; gc = find_chip_by_name(dev_name(>dev)); if (gc) { ret = match(gc); @@ -356,3 +359,5 @@ int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, return ret; } EXPORT_SYMBOL_GPL(rtdm_gpiochip_scan_of); + +#endif /* CONFIG_OF */ diff --git a/kernel/drivers/gpio/gpio-core.h b/kernel/drivers/gpio/gpio-core.h index d4dd28a..c0eac32 100644 --- a/kernel/drivers/gpio/gpio-core.h +++ b/kernel/drivers/gpio/gpio-core.h @@ -43,7 +43,9 @@ void rtdm_gpiochip_remove(struct rtdm_gpio_chip *rgc); int rtdm_gpiochip_add_by_name(struct rtdm_gpio_chip *rgc, const char *label, int gpio_subclass); +#ifdef CONFIG_OF int rtdm_gpiochip_scan_of(struct device_node *from, const char *compat, int (*match)(struct gpio_chip *gc)); +#endif #endif /* !_RTDM_GPIO_CORE_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/rtdm: allow polling events from secondary/ IRQ context
Module: xenomai-3 Branch: wip/drivers Commit: 91010aab23e6ae8993a136b1a64c20daf0a89b4b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=91010aab23e6ae8993a136b1a64c20daf0a89b4b Author: Philippe GerumDate: Wed Dec 14 15:06:34 2016 +0100 cobalt/rtdm: allow polling events from secondary/IRQ context Invoking timed services for receiving events in polled mode (timeout == RTDM_TIMEOUT_NONE) is always valid regardless of the calling context. Do not trigger assertions when doing so. --- kernel/cobalt/init.c|3 ++- kernel/cobalt/rtdm/drvlib.c |8 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/kernel/cobalt/init.c b/kernel/cobalt/init.c index 5a6fdbf..1f7ce49 100644 --- a/kernel/cobalt/init.c +++ b/kernel/cobalt/init.c @@ -445,10 +445,11 @@ device_initcall(xenomai_init); * * Tag Context on entry * primary-only Must be called from a Cobalt task in primary mode + * primary-timed Requires a Cobalt task in primary mode if timed * coreirq-only Must be called from a Cobalt IRQ handler * secondary-only Must be called from a Cobalt task in secondary mode or regular Linux task * rtdm-task Must be called from a RTDM driver task - * mode-unrestricted Must be called from a Cobalt task in either primary or secondary mode + * mode-unrestricted May be called from a Cobalt task in either primary or secondary mode * task-unrestricted May be called from a Cobalt or regular Linux task indifferently * unrestricted May be called from any context previously described * atomic-entry Caller must currently hold the big Cobalt kernel lock (nklock) diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c index 629c555..1a79121 100644 --- a/kernel/cobalt/rtdm/drvlib.c +++ b/kernel/cobalt/rtdm/drvlib.c @@ -858,7 +858,7 @@ EXPORT_SYMBOL_GPL(rtdm_event_wait); * - -EWOULDBLOCK is returned if a negative @a timeout (i.e., non-blocking * operation) has been specified. * - * @coretags{primary-only, might-switch} + * @coretags{primary-timed, might-switch} */ int rtdm_event_timedwait(rtdm_event_t *event, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) @@ -867,7 +867,7 @@ int rtdm_event_timedwait(rtdm_event_t *event, nanosecs_rel_t timeout, int err = 0, ret; spl_t s; - if (!XENO_ASSERT(COBALT, !xnsched_unblockable_p())) + if (!XENO_ASSERT(COBALT, timeout < 0 || !xnsched_unblockable_p())) return -EPERM; trace_cobalt_driver_event_wait(event, xnthread_current()); @@ -1091,7 +1091,7 @@ EXPORT_SYMBOL_GPL(rtdm_sem_down); * - -EPERM @e may be returned if an illegal invocation environment is * detected. * - * @coretags{primary-only, might-switch} + * @coretags{primary-timed, might-switch} */ int rtdm_sem_timeddown(rtdm_sem_t *sem, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) @@ -1100,7 +1100,7 @@ int rtdm_sem_timeddown(rtdm_sem_t *sem, nanosecs_rel_t timeout, int err = 0, ret; spl_t s; - if (!XENO_ASSERT(COBALT, !xnsched_unblockable_p())) + if (!XENO_ASSERT(COBALT, timeout < 0 || !xnsched_unblockable_p())) return -EPERM; trace_cobalt_driver_sem_wait(sem, xnthread_current()); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/gpiotest: add GPIO test suite
Module: xenomai-3 Branch: wip/drivers Commit: 0165782dbde8cea4da45cd65df0c7e5f7fc17e12 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0165782dbde8cea4da45cd65df0c7e5f7fc17e12 Author: Philippe GerumDate: Wed Jun 1 15:59:27 2016 +0200 testsuite/gpiotest: add GPIO test suite --- testsuite/Makefile.am |2 + testsuite/gpiotest/Makefile.am | 19 testsuite/gpiotest/gpiotest.c | 188 3 files changed, 209 insertions(+) diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index e83e6cb..c345472 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -4,12 +4,14 @@ SUBDIRS = latency smokey if XENO_COBALT SUBDIRS += \ clocktest \ + gpiotest\ switchtest \ xeno-test endif DIST_SUBDIRS = \ clocktest \ + gpiotest\ latency \ smokey \ switchtest \ diff --git a/testsuite/gpiotest/Makefile.am b/testsuite/gpiotest/Makefile.am new file mode 100644 index 000..b01427b --- /dev/null +++ b/testsuite/gpiotest/Makefile.am @@ -0,0 +1,19 @@ +testdir = @XENO_TEST_DIR@ + +CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC) + +test_PROGRAMS = gpiotest + +gpiotest_SOURCES = gpiotest.c + +gpiotest_CPPFLAGS =\ + $(XENO_USER_CFLAGS) \ + -I$(top_srcdir)/include + +gpiotest_LDFLAGS = @XENO_AUTOINIT_LDFLAGS@ $(XENO_POSIX_WRAPPERS) + +gpiotest_LDADD = \ + ../../lib/smokey/libsmokey.la \ + ../../lib/@XENO_CORE_LIB@ \ +@XENO_USER_LDADD@ \ + -lpthread -lrt diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c new file mode 100644 index 000..838f498 --- /dev/null +++ b/testsuite/gpiotest/gpiotest.c @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2016 Philippe Gerum . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +smokey_test_plugin(interrupt, + SMOKEY_ARGLIST( + SMOKEY_STRING(device), + ), + "Wait for interrupts from a GPIO pin.\n" + "\tdevice=." +); + +smokey_test_plugin(read_value, + SMOKEY_ARGLIST( + SMOKEY_STRING(device), + ), + "Read GPIO value.\n" + "\tdevice=." +); + +smokey_test_plugin(write_value, + SMOKEY_ARGLIST( + SMOKEY_STRING(device), + ), + "Write GPIO value.\n" + "\tdevice=." +); + +static int run_interrupt(struct smokey_test *t, int argc, char *const argv[]) +{ + const char *device = NULL; + int fd, ret; + fd_set set; + + smokey_parse_args(t, argc, argv); + + if (!SMOKEY_ARG_ISSET(interrupt, device)) { + warning("missing device= specification"); + return -EINVAL; + } + + device = SMOKEY_ARG_STRING(interrupt, device); + fd = open(device, O_RDWR); + if (fd < 0) { + ret = -errno; + warning("cannot open device %s [%s]", + device, symerror(ret)); + return ret; + } + + ret = ioctl(fd, GPIO_RTIOC_IRQEN); + if (ret) { + ret = -errno; + warning("GPIO_RTIOC_IRQEN failed on %s [%s]", + device, symerror(ret)); + return ret; + } + + FD_ZERO(); + FD_SET(fd, ); + + for (;;) { + ret = select(fd + 1, , NULL, NULL, NULL); + if (ret < 0) { + ret = -errno; + warning("failed listening to %s [%s]", + device, symerror(ret)); + } + printf("kick %d!\n", ret); + } + + close(fd); + + return 0; +} + +static int run_read_value(struct smokey_test *t, int argc, char *const argv[]) +{ + const char *device = NULL; + int fd, ret, value = -1; + + smokey_parse_args(t, argc, argv); + + if (!SMOKEY_ARG_ISSET(read_value, device)) { + warning("missing device= specification"); +
[Xenomai-git] Philippe Gerum : testsuite/gpiotest: set GPIO direction
Module: xenomai-3 Branch: wip/drivers Commit: 597e4bf3b0f95c6802489e19e6671cf0a7e0c33e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=597e4bf3b0f95c6802489e19e6671cf0a7e0c33e Author: Philippe GerumDate: Sat Jun 25 18:53:36 2016 +0200 testsuite/gpiotest: set GPIO direction --- testsuite/gpiotest/gpiotest.c |6 ++ 1 file changed, 6 insertions(+) diff --git a/testsuite/gpiotest/gpiotest.c b/testsuite/gpiotest/gpiotest.c index 838f498..65949ee 100644 --- a/testsuite/gpiotest/gpiotest.c +++ b/testsuite/gpiotest/gpiotest.c @@ -117,6 +117,9 @@ static int run_read_value(struct smokey_test *t, int argc, char *const argv[]) return ret; } + if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_IN))) + return ret; + ret = read(fd, , sizeof(value)); close(fd); @@ -149,6 +152,9 @@ static int run_write_value(struct smokey_test *t, int argc, char *const argv[]) return ret; } + if (!__T(ret, ioctl(fd, GPIO_RTIOC_DIR_OUT))) + return ret; + ret = write(fd, , sizeof(value)); close(fd); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : copperplate/regd: conform to libfuse assumption regarding SIGCHLD
Module: xenomai-3 Branch: stable-3.0.x Commit: 4364bdd358e893b1f4f7f644a35191b3fc7f4180 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4364bdd358e893b1f4f7f644a35191b3fc7f4180 Author: Philippe GerumDate: Tue Dec 27 09:45:35 2016 +0100 copperplate/regd: conform to libfuse assumption regarding SIGCHLD When executing utility programs such as /bin/mount via a fork+exec sequence, libfuse assumes that SIGCHLD won't be ignored by the forked child, so that waitpid() may be safely used to wait for child completion. This means that SIGCHLD must not be ignored by the caller of fuse_main() in the first place, since such signal disposition is inherited. It turned out that sysregd was actually ignoring SIGCHLD before attempting to mount the system fs on behalf of fuse_main(), causing libfuse's add_mount() to fail after ECHILD was received from waitpid(), due to the following sequence of events: registry_thread: fuse_main() registry_thread:add_mount() registry_thread:mount_pid = fork() registry_thread:execl("/bin/mount", ...) /bin/mount: ... /bin/mount: exit(0) registry_thread:waitpid(mount_pid, ...) => ECHILD As a matter of fact, sysregd does not need any particular disposition for SIGCHLD for carrying out its own duties, but has to start with this signal set to SIG_IGN when spawned from copperplate (see spawn_daemon()). The fix is to switch this signal disposition back to SIG_DFL before the registry thread is started. --- lib/copperplate/regd/regd.c |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/copperplate/regd/regd.c b/lib/copperplate/regd/regd.c index e0228fb..8752070 100644 --- a/lib/copperplate/regd/regd.c +++ b/lib/copperplate/regd/regd.c @@ -541,8 +541,9 @@ int main(int argc, char *const *argv) memset(, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, , NULL); sigaction(SIGPIPE, , NULL); + sa.sa_handler = SIG_DFL; + sigaction(SIGCHLD, , NULL); if (daemonize) { ret = daemon(1, 1); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git