Private
Public Access
2
0

gpio: adjust adv function hooks to fix subplatforms

The chardev feature changed the flow for most GPIO functions but did not take into account existing function hooks correctly.
This fixes the checks and restores subplatform GPIO access.

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
Mihai Tudor Panu
2018-06-22 14:07:31 -07:00
parent a2f01bee5f
commit 47728b4c1d

View File

@@ -172,11 +172,6 @@ mraa_gpio_init(int pin)
return NULL;
}
if (board->chardev_capable) {
int pins[1] = { pin };
return mraa_gpio_init_multi(pins, 1);
}
if (mraa_is_sub_platform_id(pin)) {
syslog(LOG_NOTICE, "gpio%i: init: Using sub platform", pin);
board = board->sub_platform;
@@ -187,6 +182,11 @@ mraa_gpio_init(int pin)
pin = mraa_get_sub_platform_index(pin);
}
if (board->chardev_capable) {
int pins[1] = { pin };
return mraa_gpio_init_multi(pins, 1);
}
if (pin < 0 || pin >= board->phy_pin_count) {
syslog(LOG_ERR, "gpio: init: pin %i beyond platform pin count (%i)",
pin, board->phy_pin_count);
@@ -941,6 +941,16 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
syslog(LOG_ERR, "gpio: mode: context is invalid");
return MRAA_ERROR_INVALID_HANDLE;
}
if (IS_FUNC_DEFINED(dev, gpio_mode_replace))
return dev->advance_func->gpio_mode_replace(dev, mode);
if (IS_FUNC_DEFINED(dev, gpio_mode_pre)) {
mraa_result_t pre_ret = (dev->advance_func->gpio_mode_pre(dev, mode));
if (pre_ret != MRAA_SUCCESS)
return pre_ret;
}
if (plat->chardev_capable) {
unsigned flags = 0;
int line_handle;
@@ -948,7 +958,6 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
_mraa_close_gpio_desc(dev);
/* We save flag values from the first valid line. */
for_each_gpio_group(gpio_iter, dev) {
mraa_gpiod_line_info* linfo = mraa_get_line_info_by_chip_number(gpio_iter->gpio_chip, gpio_iter->gpio_lines[0]);
@@ -988,14 +997,6 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
gpio_iter->gpiod_handle = line_handle;
}
} else {
if (IS_FUNC_DEFINED(dev, gpio_mode_replace))
return dev->advance_func->gpio_mode_replace(dev, mode);
if (IS_FUNC_DEFINED(dev, gpio_mode_pre)) {
mraa_result_t pre_ret = (dev->advance_func->gpio_mode_pre(dev, mode));
if (pre_ret != MRAA_SUCCESS)
return pre_ret;
}
if (dev->value_fp != -1) {
close(dev->value_fp);
@@ -1037,10 +1038,11 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
}
close(drive);
if (IS_FUNC_DEFINED(dev, gpio_mode_post))
return dev->advance_func->gpio_mode_post(dev, mode);
}
if (IS_FUNC_DEFINED(dev, gpio_mode_post))
return dev->advance_func->gpio_mode_post(dev, mode);
return MRAA_SUCCESS;
}
@@ -1104,24 +1106,23 @@ mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir)
return MRAA_ERROR_INVALID_HANDLE;
}
if (IS_FUNC_DEFINED(dev, gpio_dir_replace)) {
return dev->advance_func->gpio_dir_replace(dev, dir);
}
if (IS_FUNC_DEFINED(dev, gpio_dir_pre)) {
mraa_result_t pre_ret = (dev->advance_func->gpio_dir_pre(dev, dir));
if (pre_ret != MRAA_SUCCESS) {
return pre_ret;
}
}
if (plat->chardev_capable)
return mraa_gpio_chardev_dir(dev, dir);
mraa_gpio_context it = dev;
while (it) {
if (IS_FUNC_DEFINED(it, gpio_dir_replace)) {
return it->advance_func->gpio_dir_replace(it, dir);
}
if (IS_FUNC_DEFINED(it, gpio_dir_pre)) {
mraa_result_t pre_ret = (it->advance_func->gpio_dir_pre(it, dir));
if (pre_ret != MRAA_SUCCESS) {
return pre_ret;
}
}
if (it->value_fp != -1) {
close(it->value_fp);
it->value_fp = -1;
@@ -1173,12 +1174,12 @@ mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir)
}
close(direction);
if (IS_FUNC_DEFINED(it, gpio_dir_post))
return it->advance_func->gpio_dir_post(it, dir);
it = it->next;
}
if (IS_FUNC_DEFINED(dev, gpio_dir_post))
return dev->advance_func->gpio_dir_post(dev, dir);
return MRAA_SUCCESS;
}
@@ -1190,6 +1191,10 @@ mraa_gpio_read_dir(mraa_gpio_context dev, mraa_gpio_dir_t *dir)
/* Initialize with 'unusable'. */
unsigned flags = GPIOLINE_FLAG_KERNEL;
if (IS_FUNC_DEFINED(dev, gpio_read_dir_replace)) {
return dev->advance_func->gpio_read_dir_replace(dev, dir);
}
if (plat->chardev_capable) {
mraa_gpiod_group_t gpio_iter;
@@ -1227,10 +1232,6 @@ mraa_gpio_read_dir(mraa_gpio_context dev, mraa_gpio_dir_t *dir)
return MRAA_ERROR_INVALID_HANDLE;
}
if (IS_FUNC_DEFINED(dev, gpio_read_dir_replace)) {
return dev->advance_func->gpio_read_dir_replace(dev, dir);
}
snprintf(filepath, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%d/direction", dev->pin);
fd = open(filepath, O_RDONLY);
if (fd == -1) {
@@ -1268,6 +1269,10 @@ mraa_gpio_read(mraa_gpio_context dev)
return -1;
}
if (IS_FUNC_DEFINED(dev, gpio_read_replace)) {
return dev->advance_func->gpio_read_replace(dev);
}
if (plat->chardev_capable) {
int output_values[1] = { 0 };
@@ -1277,10 +1282,6 @@ mraa_gpio_read(mraa_gpio_context dev)
return output_values[0];
}
if (IS_FUNC_DEFINED(dev, gpio_read_replace)) {
return dev->advance_func->gpio_read_replace(dev);
}
if (dev->mmap_read != NULL) {
return dev->mmap_read(dev);
}
@@ -1371,16 +1372,6 @@ mraa_gpio_write(mraa_gpio_context dev, int value)
return MRAA_ERROR_INVALID_HANDLE;
}
if (plat->chardev_capable) {
int input_values[1] = { value };
return mraa_gpio_write_multi(dev, input_values);
}
if (dev->mmap_write != NULL) {
return dev->mmap_write(dev, value);
}
if (IS_FUNC_DEFINED(dev, gpio_write_pre)) {
mraa_result_t pre_ret = (dev->advance_func->gpio_write_pre(dev, value));
if (pre_ret != MRAA_SUCCESS)
@@ -1391,6 +1382,16 @@ mraa_gpio_write(mraa_gpio_context dev, int value)
return dev->advance_func->gpio_write_replace(dev, value);
}
if (plat->chardev_capable) {
int input_values[1] = { value };
return mraa_gpio_write_multi(dev, input_values);
}
if (dev->mmap_write != NULL) {
return dev->mmap_write(dev, value);
}
if (dev->value_fp == -1) {
if (_mraa_gpio_get_valfp(dev) != MRAA_SUCCESS) {
return MRAA_ERROR_INVALID_RESOURCE;