[Xenomai-git] Jan Kiszka : cobalt/kernel: Allow to restart clock_nanosleep and select after signal processing

2016-12-27 Thread git repository hosting
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 Kiszka 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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()

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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()

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Meeus 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 322f91153bb8ce8710837722ae24d8376d7cad6c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=322f91153bb8ce8710837722ae24d8376d7cad6c

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 8012a966ac5ed9fe5de272e4021c697c3be1857c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8012a966ac5ed9fe5de272e4021c697c3be1857c

Author: Philippe Gerum 
Date:   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()

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: e171922a92f7fec3dc484286b4e8ea92860a
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e171922a92f7fec3dc484286b4e8ea92860a

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: a49b78bfeabb16685807155d71541b733594a61d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a49b78bfeabb16685807155d71541b733594a61d

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: bb9c92b86ac166f12d5661950fe53187af3247cf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 18aa7ff54025132aaabc6daa7dd50a70f62763bb
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=18aa7ff54025132aaabc6daa7dd50a70f62763bb

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: a847734467bde3a979bd0916c57c4375b34fbaa0
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a847734467bde3a979bd0916c57c4375b34fbaa0

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: cc6f7533e468f874834bb0e78b3b0765b33cd706
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cc6f7533e468f874834bb0e78b3b0765b33cd706

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: b7e3bd434ff00403bfe971c531c467e42502386f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b7e3bd434ff00403bfe971c531c467e42502386f

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: f6d88b8d4c0d1e68673726dca5d668c29f275662
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f6d88b8d4c0d1e68673726dca5d668c29f275662

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: d0647b6468052cc491ee3324109153ed17510bc0
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0647b6468052cc491ee3324109153ed17510bc0

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 11a3a75f92cecabf2a202698ebde60287dd5ef3f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=11a3a75f92cecabf2a202698ebde60287dd5ef3f

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 0f85395e3228ea30523d21a50ee9a0e5d0dfe82c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0f85395e3228ea30523d21a50ee9a0e5d0dfe82c

Author: Philippe Gerum 
Date:   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()

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 261d1e84678900e04db56f71e7930fea0e36970f
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=261d1e84678900e04db56f71e7930fea0e36970f

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: acde09bc494c5a13652548f0f5778842ddf8f90e
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=acde09bc494c5a13652548f0f5778842ddf8f90e

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: b6e0ca8e8b43a052e78b440cce91cccf069b5943
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b6e0ca8e8b43a052e78b440cce91cccf069b5943

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 121c9feb407e259e27995f70ba63b8a64ac071b6
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=121c9feb407e259e27995f70ba63b8a64ac071b6

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 61f6da906cda308c9f9a9de84ebf6010e988ccb8
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=61f6da906cda308c9f9a9de84ebf6010e988ccb8

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 657763dd956f9fecc1518f55d9c263366e46c8dc
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=657763dd956f9fecc1518f55d9c263366e46c8dc

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: d0adf70c4a58c9ccc113ec54f4e07d0cc6261d5c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d0adf70c4a58c9ccc113ec54f4e07d0cc6261d5c

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 429a2315f831746f2f2b17dd82d0bfc86b527fa6
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=429a2315f831746f2f2b17dd82d0bfc86b527fa6

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: dfec891315969f92aec781d037dd5cbb11cbdb1c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=dfec891315969f92aec781d037dd5cbb11cbdb1c

Author: Ronny Meeus 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 3b42d107c1ae11fc39a0cf11c1d8c8f78adac46b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3b42d107c1ae11fc39a0cf11c1d8c8f78adac46b

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 4364bdd358e893b1f4f7f644a35191b3fc7f4180
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4364bdd358e893b1f4f7f644a35191b3fc7f4180

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 8fe023a422aab5cebfbd0363d6f06cbe2386eca4
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8fe023a422aab5cebfbd0363d6f06cbe2386eca4

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 18493575967fe969768674096f88b63d71e032e1
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=18493575967fe969768674096f88b63d71e032e1

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 12fa18f4267cc67882d477b282eb72b2daa5c193
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=12fa18f4267cc67882d477b282eb72b2daa5c193

Author: Ronny Meeus 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 609615e9e94ce68d33adc8e3802cf5f9199142ca
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=609615e9e94ce68d33adc8e3802cf5f9199142ca

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 91010aab23e6ae8993a136b1a64c20daf0a89b4b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=91010aab23e6ae8993a136b1a64c20daf0a89b4b

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 0165782dbde8cea4da45cd65df0c7e5f7fc17e12
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0165782dbde8cea4da45cd65df0c7e5f7fc17e12

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: 597e4bf3b0f95c6802489e19e6671cf0a7e0c33e
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=597e4bf3b0f95c6802489e19e6671cf0a7e0c33e

Author: Philippe Gerum 
Date:   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

2016-12-27 Thread git repository hosting
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 Gerum 
Date:   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