drivers: gpio: add system call handlers
Many APIs had two versions, by port and by pin, which called the same API with different parameters. This has been reorganized to reduce the number of system calls. Callback registration API skipped. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
4d91f5abe9
commit
d3ec6654f5
3 changed files with 118 additions and 32 deletions
|
@ -17,3 +17,5 @@ obj-$(CONFIG_GPIO_FE310) += gpio_fe310.o
|
||||||
obj-$(CONFIG_GPIO_CC2650) += gpio_cc2650.o
|
obj-$(CONFIG_GPIO_CC2650) += gpio_cc2650.o
|
||||||
obj-$(CONFIG_GPIO_ESP32) += gpio_esp32.o
|
obj-$(CONFIG_GPIO_ESP32) += gpio_esp32.o
|
||||||
obj-$(CONFIG_GPIO_GECKO) += gpio_gecko.o
|
obj-$(CONFIG_GPIO_GECKO) += gpio_gecko.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_USERSPACE) += gpio_handlers.o
|
||||||
|
|
45
drivers/gpio/gpio_handlers.c
Normal file
45
drivers/gpio/gpio_handlers.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017 Intel Corporation
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gpio.h>
|
||||||
|
#include <syscall_handler.h>
|
||||||
|
|
||||||
|
_SYSCALL_HANDLER(gpio_config, port, access_op, pin, flags)
|
||||||
|
{
|
||||||
|
_SYSCALL_OBJ(port, K_OBJ_DRIVER_GPIO);
|
||||||
|
return _impl_gpio_config((struct device *)port, access_op, pin, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
_SYSCALL_HANDLER(gpio_write, port, access_op, pin, value)
|
||||||
|
{
|
||||||
|
_SYSCALL_OBJ(port, K_OBJ_DRIVER_GPIO);
|
||||||
|
return _impl_gpio_write((struct device *)port, access_op, pin, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
_SYSCALL_HANDLER(gpio_read, port, access_op, pin, value)
|
||||||
|
{
|
||||||
|
_SYSCALL_OBJ(port, K_OBJ_DRIVER_GPIO);
|
||||||
|
_SYSCALL_MEMORY_WRITE(value, sizeof(u32_t));
|
||||||
|
return _impl_gpio_read((struct device *)port, access_op, pin,
|
||||||
|
(u32_t *)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
_SYSCALL_HANDLER(gpio_enable_callback, port, access_op, pin)
|
||||||
|
{
|
||||||
|
_SYSCALL_OBJ(port, K_OBJ_DRIVER_GPIO);
|
||||||
|
return _impl_gpio_enable_callback((struct device *)port, access_op,
|
||||||
|
pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
_SYSCALL_HANDLER(gpio_disable_callback, port, access_op, pin)
|
||||||
|
{
|
||||||
|
_SYSCALL_OBJ(port, K_OBJ_DRIVER_GPIO);
|
||||||
|
return _impl_gpio_disable_callback((struct device *)port, access_op,
|
||||||
|
pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
_SYSCALL_HANDLER1_SIMPLE(gpio_get_pending_int, K_OBJ_DRIVER_GPIO,
|
||||||
|
struct device *);
|
103
include/gpio.h
103
include/gpio.h
|
@ -239,7 +239,7 @@ struct gpio_callback {
|
||||||
/**
|
/**
|
||||||
* @cond INTERNAL_HIDDEN
|
* @cond INTERNAL_HIDDEN
|
||||||
*
|
*
|
||||||
* GPIO driver API definition.
|
* GPIO driver API definition and system call entry points
|
||||||
*
|
*
|
||||||
* (Internal use only.)
|
* (Internal use only.)
|
||||||
*/
|
*/
|
||||||
|
@ -269,6 +269,61 @@ struct gpio_driver_api {
|
||||||
gpio_disable_callback_t disable_callback;
|
gpio_disable_callback_t disable_callback;
|
||||||
gpio_api_get_pending_int get_pending_int;
|
gpio_api_get_pending_int get_pending_int;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__syscall int gpio_config(struct device *port, int access_op, u32_t pin,
|
||||||
|
int flags);
|
||||||
|
|
||||||
|
static inline int _impl_gpio_config(struct device *port, int access_op,
|
||||||
|
u32_t pin, int flags)
|
||||||
|
{
|
||||||
|
const struct gpio_driver_api *api = port->driver_api;
|
||||||
|
|
||||||
|
return api->config(port, access_op, pin, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
__syscall int gpio_write(struct device *port, int access_op, u32_t pin,
|
||||||
|
u32_t value);
|
||||||
|
|
||||||
|
static inline int _impl_gpio_write(struct device *port, int access_op,
|
||||||
|
u32_t pin, u32_t value)
|
||||||
|
{
|
||||||
|
const struct gpio_driver_api *api = port->driver_api;
|
||||||
|
|
||||||
|
return api->write(port, access_op, pin, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
__syscall int gpio_read(struct device *port, int access_op, u32_t pin,
|
||||||
|
u32_t *value);
|
||||||
|
|
||||||
|
static inline int _impl_gpio_read(struct device *port, int access_op,
|
||||||
|
u32_t pin, u32_t *value)
|
||||||
|
{
|
||||||
|
const struct gpio_driver_api *api = port->driver_api;
|
||||||
|
|
||||||
|
return api->read(port, access_op, pin, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
__syscall int gpio_enable_callback(struct device *port, int access_op,
|
||||||
|
u32_t pin);
|
||||||
|
|
||||||
|
static inline int _impl_gpio_enable_callback(struct device *port,
|
||||||
|
int access_op, u32_t pin)
|
||||||
|
{
|
||||||
|
const struct gpio_driver_api *api = port->driver_api;
|
||||||
|
|
||||||
|
return api->enable_callback(port, access_op, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
__syscall int gpio_disable_callback(struct device *port, int access_op,
|
||||||
|
u32_t pin);
|
||||||
|
|
||||||
|
static inline int _impl_gpio_disable_callback(struct device *port,
|
||||||
|
int access_op, u32_t pin)
|
||||||
|
{
|
||||||
|
const struct gpio_driver_api *api = port->driver_api;
|
||||||
|
|
||||||
|
return api->disable_callback(port, access_op, pin);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @endcond
|
* @endcond
|
||||||
*/
|
*/
|
||||||
|
@ -283,9 +338,7 @@ struct gpio_driver_api {
|
||||||
static inline int gpio_pin_configure(struct device *port, u32_t pin,
|
static inline int gpio_pin_configure(struct device *port, u32_t pin,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_config(port, GPIO_ACCESS_BY_PIN, pin, flags);
|
||||||
|
|
||||||
return api->config(port, GPIO_ACCESS_BY_PIN, pin, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -298,9 +351,7 @@ static inline int gpio_pin_configure(struct device *port, u32_t pin,
|
||||||
static inline int gpio_pin_write(struct device *port, u32_t pin,
|
static inline int gpio_pin_write(struct device *port, u32_t pin,
|
||||||
u32_t value)
|
u32_t value)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_write(port, GPIO_ACCESS_BY_PIN, pin, value);
|
||||||
|
|
||||||
return api->write(port, GPIO_ACCESS_BY_PIN, pin, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -316,9 +367,7 @@ static inline int gpio_pin_write(struct device *port, u32_t pin,
|
||||||
static inline int gpio_pin_read(struct device *port, u32_t pin,
|
static inline int gpio_pin_read(struct device *port, u32_t pin,
|
||||||
u32_t *value)
|
u32_t *value)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_read(port, GPIO_ACCESS_BY_PIN, pin, value);
|
||||||
|
|
||||||
return api->read(port, GPIO_ACCESS_BY_PIN, pin, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -387,9 +436,7 @@ static inline int gpio_remove_callback(struct device *port,
|
||||||
*/
|
*/
|
||||||
static inline int gpio_pin_enable_callback(struct device *port, u32_t pin)
|
static inline int gpio_pin_enable_callback(struct device *port, u32_t pin)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_enable_callback(port, GPIO_ACCESS_BY_PIN, pin);
|
||||||
|
|
||||||
return api->enable_callback(port, GPIO_ACCESS_BY_PIN, pin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -400,9 +447,7 @@ static inline int gpio_pin_enable_callback(struct device *port, u32_t pin)
|
||||||
*/
|
*/
|
||||||
static inline int gpio_pin_disable_callback(struct device *port, u32_t pin)
|
static inline int gpio_pin_disable_callback(struct device *port, u32_t pin)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_disable_callback(port, GPIO_ACCESS_BY_PIN, pin);
|
||||||
|
|
||||||
return api->disable_callback(port, GPIO_ACCESS_BY_PIN, pin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -415,9 +460,7 @@ static inline int gpio_pin_disable_callback(struct device *port, u32_t pin)
|
||||||
*/
|
*/
|
||||||
static inline int gpio_port_configure(struct device *port, int flags)
|
static inline int gpio_port_configure(struct device *port, int flags)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_config(port, GPIO_ACCESS_BY_PORT, 0, flags);
|
||||||
|
|
||||||
return api->config(port, GPIO_ACCESS_BY_PORT, 0, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -435,9 +478,7 @@ static inline int gpio_port_configure(struct device *port, int flags)
|
||||||
*/
|
*/
|
||||||
static inline int gpio_port_write(struct device *port, u32_t value)
|
static inline int gpio_port_write(struct device *port, u32_t value)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_write(port, GPIO_ACCESS_BY_PORT, 0, value);
|
||||||
|
|
||||||
return api->write(port, GPIO_ACCESS_BY_PORT, 0, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -455,9 +496,7 @@ static inline int gpio_port_write(struct device *port, u32_t value)
|
||||||
*/
|
*/
|
||||||
static inline int gpio_port_read(struct device *port, u32_t *value)
|
static inline int gpio_port_read(struct device *port, u32_t *value)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_read(port, GPIO_ACCESS_BY_PORT, 0, value);
|
||||||
|
|
||||||
return api->read(port, GPIO_ACCESS_BY_PORT, 0, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -472,9 +511,7 @@ static inline int gpio_port_read(struct device *port, u32_t *value)
|
||||||
*/
|
*/
|
||||||
static inline int gpio_port_enable_callback(struct device *port)
|
static inline int gpio_port_enable_callback(struct device *port)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_enable_callback(port, GPIO_ACCESS_BY_PORT, 0);
|
||||||
|
|
||||||
return api->enable_callback(port, GPIO_ACCESS_BY_PORT, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -484,9 +521,7 @@ static inline int gpio_port_enable_callback(struct device *port)
|
||||||
*/
|
*/
|
||||||
static inline int gpio_port_disable_callback(struct device *port)
|
static inline int gpio_port_disable_callback(struct device *port)
|
||||||
{
|
{
|
||||||
const struct gpio_driver_api *api = port->driver_api;
|
return gpio_disable_callback(port, GPIO_ACCESS_BY_PORT, 0);
|
||||||
|
|
||||||
return api->disable_callback(port, GPIO_ACCESS_BY_PORT, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -502,7 +537,9 @@ static inline int gpio_port_disable_callback(struct device *port)
|
||||||
* @retval status != 0 if at least one gpio interrupt is pending.
|
* @retval status != 0 if at least one gpio interrupt is pending.
|
||||||
* @retval 0 if no gpio interrupt is pending.
|
* @retval 0 if no gpio interrupt is pending.
|
||||||
*/
|
*/
|
||||||
static inline int gpio_get_pending_int(struct device *dev)
|
__syscall int gpio_get_pending_int(struct device *dev);
|
||||||
|
|
||||||
|
static inline int _impl_gpio_get_pending_int(struct device *dev)
|
||||||
{
|
{
|
||||||
struct gpio_driver_api *api;
|
struct gpio_driver_api *api;
|
||||||
|
|
||||||
|
@ -544,4 +581,6 @@ struct gpio_pin_config {
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <syscalls/gpio.h>
|
||||||
|
|
||||||
#endif /* __GPIO_H__ */
|
#endif /* __GPIO_H__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue