Commit 77588c14 authored by Janusz Krzysztofik's avatar Janusz Krzysztofik Committed by Linus Walleij

gpiolib: Pass array info to get/set array functions

In order to make use of array info obtained from gpiod_get_array() and
speed up processing of arrays matching single GPIO chip layout, that
information must be passed to get/set array functions.  Extend the
functions' API with that additional parameter and update all users.
Pass NULL if a user builds an array itself from single GPIOs.

Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Sebastien Bourdelin <sebastien.bourdelin@savoirfairelinux.com>
Cc: Lukas Wunner <lukas@wunner.de>
Cc: Peter Korsgaard <peter.korsgaard@barco.com>
Cc: Peter Rosin <peda@axentia.se>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Rojhalat Ibrahim <imr@rtschenk.de>
Cc: Dominik Brodowski <linux@dominikbrodowski.net>
Cc: Russell King <rmk+kernel@armlinux.org.uk>
Cc: Kishon Vijay Abraham I <kishon@ti.com>
Cc: Tony Lindgren <tony@atomide.com>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Michael Hennerich <Michael.Hennerich@analog.com>
Cc: Jonathan Cameron <jic23@kernel.org>
Cc: Hartmut Knaack <knaack.h@gmx.de>
Cc: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.com>
Cc: Yegor Yefremov <yegorslists@googlemail.com>
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarJanusz Krzysztofik <jmkrzyszt@gmail.com>
Acked-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent bf9346f5
...@@ -325,28 +325,36 @@ The following functions get or set the values of an array of GPIOs:: ...@@ -325,28 +325,36 @@ The following functions get or set the values of an array of GPIOs::
int gpiod_get_array_value(unsigned int array_size, int gpiod_get_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_get_raw_array_value(unsigned int array_size, int gpiod_get_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_get_array_value_cansleep(unsigned int array_size, int gpiod_get_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_get_raw_array_value_cansleep(unsigned int array_size, int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
void gpiod_set_array_value(unsigned int array_size, void gpiod_set_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
void gpiod_set_raw_array_value(unsigned int array_size, void gpiod_set_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
void gpiod_set_array_value_cansleep(unsigned int array_size, void gpiod_set_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
void gpiod_set_raw_array_value_cansleep(unsigned int array_size, void gpiod_set_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
The array can be an arbitrary set of GPIOs. The functions will try to access The array can be an arbitrary set of GPIOs. The functions will try to access
...@@ -358,6 +366,7 @@ accessed sequentially. ...@@ -358,6 +366,7 @@ accessed sequentially.
The functions take three arguments: The functions take three arguments:
* array_size - the number of array elements * array_size - the number of array elements
* desc_array - an array of GPIO descriptors * desc_array - an array of GPIO descriptors
* array_info - optional information obtained from gpiod_array_get()
* value_bitmap - a bitmap to store the GPIOs' values (get) or * value_bitmap - a bitmap to store the GPIOs' values (get) or
a bitmap of values to assign to the GPIOs (set) a bitmap of values to assign to the GPIOs (set)
...@@ -368,12 +377,13 @@ the struct gpio_descs returned by gpiod_get_array():: ...@@ -368,12 +377,13 @@ the struct gpio_descs returned by gpiod_get_array()::
struct gpio_descs *my_gpio_descs = gpiod_get_array(...); struct gpio_descs *my_gpio_descs = gpiod_get_array(...);
gpiod_set_array_value(my_gpio_descs->ndescs, my_gpio_descs->desc, gpiod_set_array_value(my_gpio_descs->ndescs, my_gpio_descs->desc,
my_gpio_value_bitmap); my_gpio_descs->info, my_gpio_value_bitmap);
It is also possible to access a completely arbitrary array of descriptors. The It is also possible to access a completely arbitrary array of descriptors. The
descriptors may be obtained using any combination of gpiod_get() and descriptors may be obtained using any combination of gpiod_get() and
gpiod_get_array(). Afterwards the array of descriptors has to be setup gpiod_get_array(). Afterwards the array of descriptors has to be setup
manually before it can be passed to one of the above functions. manually before it can be passed to one of the above functions. In that case,
array_info should be set to NULL.
Note that for optimal performance GPIOs belonging to the same chip should be Note that for optimal performance GPIOs belonging to the same chip should be
contiguous within the array of descriptors. contiguous within the array of descriptors.
......
...@@ -70,7 +70,7 @@ static void hd44780_write_gpio8(struct hd44780 *hd, u8 val, unsigned int rs) ...@@ -70,7 +70,7 @@ static void hd44780_write_gpio8(struct hd44780 *hd, u8 val, unsigned int rs)
n = hd->pins[PIN_CTRL_RW] ? 10 : 9; n = hd->pins[PIN_CTRL_RW] ? 10 : 9;
/* Present the data to the port */ /* Present the data to the port */
gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA0], values); gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA0], NULL, values);
hd44780_strobe_gpio(hd); hd44780_strobe_gpio(hd);
} }
...@@ -87,7 +87,7 @@ static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs) ...@@ -87,7 +87,7 @@ static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs)
n = hd->pins[PIN_CTRL_RW] ? 6 : 5; n = hd->pins[PIN_CTRL_RW] ? 6 : 5;
/* Present the data to the port */ /* Present the data to the port */
gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], values); gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], NULL, values);
hd44780_strobe_gpio(hd); hd44780_strobe_gpio(hd);
...@@ -96,7 +96,7 @@ static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs) ...@@ -96,7 +96,7 @@ static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs)
values[0] |= val & 0x0f; values[0] |= val & 0x0f;
/* Present the data to the port */ /* Present the data to the port */
gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], values); gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], NULL, values);
hd44780_strobe_gpio(hd); hd44780_strobe_gpio(hd);
} }
...@@ -152,7 +152,7 @@ static void hd44780_write_cmd_raw_gpio4(struct charlcd *lcd, int cmd) ...@@ -152,7 +152,7 @@ static void hd44780_write_cmd_raw_gpio4(struct charlcd *lcd, int cmd)
n = hd->pins[PIN_CTRL_RW] ? 6 : 5; n = hd->pins[PIN_CTRL_RW] ? 6 : 5;
/* Present the data to the port */ /* Present the data to the port */
gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], values); gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], NULL, values);
hd44780_strobe_gpio(hd); hd44780_strobe_gpio(hd);
} }
......
...@@ -114,7 +114,8 @@ static void ts_nbus_reset_bus(struct ts_nbus *ts_nbus) ...@@ -114,7 +114,8 @@ static void ts_nbus_reset_bus(struct ts_nbus *ts_nbus)
values[0] = 0; values[0] = 0;
gpiod_set_array_value_cansleep(8, ts_nbus->data->desc, values); gpiod_set_array_value_cansleep(8, ts_nbus->data->desc,
ts_nbus->data->info, values);
gpiod_set_value_cansleep(ts_nbus->csn, 0); gpiod_set_value_cansleep(ts_nbus->csn, 0);
gpiod_set_value_cansleep(ts_nbus->strobe, 0); gpiod_set_value_cansleep(ts_nbus->strobe, 0);
gpiod_set_value_cansleep(ts_nbus->ale, 0); gpiod_set_value_cansleep(ts_nbus->ale, 0);
...@@ -159,7 +160,7 @@ static void ts_nbus_write_byte(struct ts_nbus *ts_nbus, u8 byte) ...@@ -159,7 +160,7 @@ static void ts_nbus_write_byte(struct ts_nbus *ts_nbus, u8 byte)
values[0] = byte; values[0] = byte;
gpiod_set_array_value_cansleep(8, gpios->desc, values); gpiod_set_array_value_cansleep(8, gpios->desc, gpios->info, values);
} }
/* /*
......
...@@ -313,6 +313,7 @@ static int max3191x_set_config(struct gpio_chip *gpio, unsigned int offset, ...@@ -313,6 +313,7 @@ static int max3191x_set_config(struct gpio_chip *gpio, unsigned int offset,
static void gpiod_set_array_single_value_cansleep(unsigned int ndescs, static void gpiod_set_array_single_value_cansleep(unsigned int ndescs,
struct gpio_desc **desc, struct gpio_desc **desc,
struct gpio_array *info,
int value) int value)
{ {
unsigned long *values; unsigned long *values;
...@@ -326,7 +327,7 @@ static void gpiod_set_array_single_value_cansleep(unsigned int ndescs, ...@@ -326,7 +327,7 @@ static void gpiod_set_array_single_value_cansleep(unsigned int ndescs,
else else
bitmap_zero(values, ndescs); bitmap_zero(values, ndescs);
gpiod_set_array_value_cansleep(ndescs, desc, values); gpiod_set_array_value_cansleep(ndescs, desc, info, values);
kfree(values); kfree(values);
} }
...@@ -399,7 +400,8 @@ static int max3191x_probe(struct spi_device *spi) ...@@ -399,7 +400,8 @@ static int max3191x_probe(struct spi_device *spi)
if (max3191x->modesel_pins) if (max3191x->modesel_pins)
gpiod_set_array_single_value_cansleep( gpiod_set_array_single_value_cansleep(
max3191x->modesel_pins->ndescs, max3191x->modesel_pins->ndescs,
max3191x->modesel_pins->desc, max3191x->mode); max3191x->modesel_pins->desc,
max3191x->modesel_pins->info, max3191x->mode);
max3191x->ignore_uv = device_property_read_bool(dev, max3191x->ignore_uv = device_property_read_bool(dev,
"maxim,ignore-undervoltage"); "maxim,ignore-undervoltage");
......
...@@ -436,6 +436,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd, ...@@ -436,6 +436,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd,
true, true,
lh->numdescs, lh->numdescs,
lh->descs, lh->descs,
NULL,
vals); vals);
if (ret) if (ret)
return ret; return ret;
...@@ -468,6 +469,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd, ...@@ -468,6 +469,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd,
true, true,
lh->numdescs, lh->numdescs,
lh->descs, lh->descs,
NULL,
vals); vals);
} }
return -EINVAL; return -EINVAL;
...@@ -2784,6 +2786,7 @@ static int gpio_chip_get_multiple(struct gpio_chip *chip, ...@@ -2784,6 +2786,7 @@ static int gpio_chip_get_multiple(struct gpio_chip *chip,
int gpiod_get_array_value_complex(bool raw, bool can_sleep, int gpiod_get_array_value_complex(bool raw, bool can_sleep,
unsigned int array_size, unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
int i = 0; int i = 0;
...@@ -2897,6 +2900,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_value); ...@@ -2897,6 +2900,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_value);
* gpiod_get_raw_array_value() - read raw values from an array of GPIOs * gpiod_get_raw_array_value() - read raw values from an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be read * @desc_array: array of GPIO descriptors whose values will be read
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap to store the read values * @value_bitmap: bitmap to store the read values
* *
* Read the raw values of the GPIOs, i.e. the values of the physical lines * Read the raw values of the GPIOs, i.e. the values of the physical lines
...@@ -2908,12 +2912,14 @@ EXPORT_SYMBOL_GPL(gpiod_get_value); ...@@ -2908,12 +2912,14 @@ EXPORT_SYMBOL_GPL(gpiod_get_value);
*/ */
int gpiod_get_raw_array_value(unsigned int array_size, int gpiod_get_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
if (!desc_array) if (!desc_array)
return -EINVAL; return -EINVAL;
return gpiod_get_array_value_complex(true, false, array_size, return gpiod_get_array_value_complex(true, false, array_size,
desc_array, value_bitmap); desc_array, array_info,
value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value); EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value);
...@@ -2921,6 +2927,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value); ...@@ -2921,6 +2927,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value);
* gpiod_get_array_value() - read values from an array of GPIOs * gpiod_get_array_value() - read values from an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be read * @desc_array: array of GPIO descriptors whose values will be read
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap to store the read values * @value_bitmap: bitmap to store the read values
* *
* Read the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status * Read the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
...@@ -2931,12 +2938,14 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value); ...@@ -2931,12 +2938,14 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value);
*/ */
int gpiod_get_array_value(unsigned int array_size, int gpiod_get_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
if (!desc_array) if (!desc_array)
return -EINVAL; return -EINVAL;
return gpiod_get_array_value_complex(false, false, array_size, return gpiod_get_array_value_complex(false, false, array_size,
desc_array, value_bitmap); desc_array, array_info,
value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_get_array_value); EXPORT_SYMBOL_GPL(gpiod_get_array_value);
...@@ -3029,6 +3038,7 @@ static void gpio_chip_set_multiple(struct gpio_chip *chip, ...@@ -3029,6 +3038,7 @@ static void gpio_chip_set_multiple(struct gpio_chip *chip,
int gpiod_set_array_value_complex(bool raw, bool can_sleep, int gpiod_set_array_value_complex(bool raw, bool can_sleep,
unsigned int array_size, unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
int i = 0; int i = 0;
...@@ -3156,6 +3166,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_value); ...@@ -3156,6 +3166,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_value);
* gpiod_set_raw_array_value() - assign values to an array of GPIOs * gpiod_set_raw_array_value() - assign values to an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be assigned * @desc_array: array of GPIO descriptors whose values will be assigned
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap of values to assign * @value_bitmap: bitmap of values to assign
* *
* Set the raw values of the GPIOs, i.e. the values of the physical lines * Set the raw values of the GPIOs, i.e. the values of the physical lines
...@@ -3166,12 +3177,13 @@ EXPORT_SYMBOL_GPL(gpiod_set_value); ...@@ -3166,12 +3177,13 @@ EXPORT_SYMBOL_GPL(gpiod_set_value);
*/ */
int gpiod_set_raw_array_value(unsigned int array_size, int gpiod_set_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
if (!desc_array) if (!desc_array)
return -EINVAL; return -EINVAL;
return gpiod_set_array_value_complex(true, false, array_size, return gpiod_set_array_value_complex(true, false, array_size,
desc_array, value_bitmap); desc_array, array_info, value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value); EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
...@@ -3179,6 +3191,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value); ...@@ -3179,6 +3191,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
* gpiod_set_array_value() - assign values to an array of GPIOs * gpiod_set_array_value() - assign values to an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be assigned * @desc_array: array of GPIO descriptors whose values will be assigned
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap of values to assign * @value_bitmap: bitmap of values to assign
* *
* Set the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status * Set the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
...@@ -3189,12 +3202,13 @@ EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value); ...@@ -3189,12 +3202,13 @@ EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
*/ */
void gpiod_set_array_value(unsigned int array_size, void gpiod_set_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
if (!desc_array) if (!desc_array)
return; return;
gpiod_set_array_value_complex(false, false, array_size, desc_array, gpiod_set_array_value_complex(false, false, array_size, desc_array,
value_bitmap); array_info, value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_set_array_value); EXPORT_SYMBOL_GPL(gpiod_set_array_value);
...@@ -3416,6 +3430,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep); ...@@ -3416,6 +3430,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep);
* gpiod_get_raw_array_value_cansleep() - read raw values from an array of GPIOs * gpiod_get_raw_array_value_cansleep() - read raw values from an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be read * @desc_array: array of GPIO descriptors whose values will be read
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap to store the read values * @value_bitmap: bitmap to store the read values
* *
* Read the raw values of the GPIOs, i.e. the values of the physical lines * Read the raw values of the GPIOs, i.e. the values of the physical lines
...@@ -3426,13 +3441,15 @@ EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep); ...@@ -3426,13 +3441,15 @@ EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep);
*/ */
int gpiod_get_raw_array_value_cansleep(unsigned int array_size, int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
might_sleep_if(extra_checks); might_sleep_if(extra_checks);
if (!desc_array) if (!desc_array)
return -EINVAL; return -EINVAL;
return gpiod_get_array_value_complex(true, true, array_size, return gpiod_get_array_value_complex(true, true, array_size,
desc_array, value_bitmap); desc_array, array_info,
value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep); EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep);
...@@ -3440,6 +3457,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep); ...@@ -3440,6 +3457,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep);
* gpiod_get_array_value_cansleep() - read values from an array of GPIOs * gpiod_get_array_value_cansleep() - read values from an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be read * @desc_array: array of GPIO descriptors whose values will be read
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap to store the read values * @value_bitmap: bitmap to store the read values
* *
* Read the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status * Read the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
...@@ -3449,13 +3467,15 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep); ...@@ -3449,13 +3467,15 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep);
*/ */
int gpiod_get_array_value_cansleep(unsigned int array_size, int gpiod_get_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
might_sleep_if(extra_checks); might_sleep_if(extra_checks);
if (!desc_array) if (!desc_array)
return -EINVAL; return -EINVAL;
return gpiod_get_array_value_complex(false, true, array_size, return gpiod_get_array_value_complex(false, true, array_size,
desc_array, value_bitmap); desc_array, array_info,
value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_get_array_value_cansleep); EXPORT_SYMBOL_GPL(gpiod_get_array_value_cansleep);
...@@ -3499,6 +3519,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep); ...@@ -3499,6 +3519,7 @@ EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep);
* gpiod_set_raw_array_value_cansleep() - assign values to an array of GPIOs * gpiod_set_raw_array_value_cansleep() - assign values to an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be assigned * @desc_array: array of GPIO descriptors whose values will be assigned
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap of values to assign * @value_bitmap: bitmap of values to assign
* *
* Set the raw values of the GPIOs, i.e. the values of the physical lines * Set the raw values of the GPIOs, i.e. the values of the physical lines
...@@ -3508,13 +3529,14 @@ EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep); ...@@ -3508,13 +3529,14 @@ EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep);
*/ */
int gpiod_set_raw_array_value_cansleep(unsigned int array_size, int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
might_sleep_if(extra_checks); might_sleep_if(extra_checks);
if (!desc_array) if (!desc_array)
return -EINVAL; return -EINVAL;
return gpiod_set_array_value_complex(true, true, array_size, desc_array, return gpiod_set_array_value_complex(true, true, array_size, desc_array,
value_bitmap); array_info, value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value_cansleep); EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value_cansleep);
...@@ -3539,6 +3561,7 @@ void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n) ...@@ -3539,6 +3561,7 @@ void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n)
* gpiod_set_array_value_cansleep() - assign values to an array of GPIOs * gpiod_set_array_value_cansleep() - assign values to an array of GPIOs
* @array_size: number of elements in the descriptor array / value bitmap * @array_size: number of elements in the descriptor array / value bitmap
* @desc_array: array of GPIO descriptors whose values will be assigned * @desc_array: array of GPIO descriptors whose values will be assigned
* @array_info: information on applicability of fast bitmap processing path
* @value_bitmap: bitmap of values to assign * @value_bitmap: bitmap of values to assign
* *
* Set the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status * Set the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
...@@ -3548,13 +3571,14 @@ void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n) ...@@ -3548,13 +3571,14 @@ void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n)
*/ */
void gpiod_set_array_value_cansleep(unsigned int array_size, void gpiod_set_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
might_sleep_if(extra_checks); might_sleep_if(extra_checks);
if (!desc_array) if (!desc_array)
return; return;
gpiod_set_array_value_complex(false, true, array_size, desc_array, gpiod_set_array_value_complex(false, true, array_size, desc_array,
value_bitmap); array_info, value_bitmap);
} }
EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep); EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep);
......
...@@ -196,10 +196,12 @@ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum); ...@@ -196,10 +196,12 @@ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum);
int gpiod_get_array_value_complex(bool raw, bool can_sleep, int gpiod_get_array_value_complex(bool raw, bool can_sleep,
unsigned int array_size, unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_set_array_value_complex(bool raw, bool can_sleep, int gpiod_set_array_value_complex(bool raw, bool can_sleep,
unsigned int array_size, unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
/* This is just passed between gpiolib and devres */ /* This is just passed between gpiolib and devres */
......
...@@ -30,7 +30,8 @@ static void i2c_mux_gpio_set(const struct gpiomux *mux, unsigned val) ...@@ -30,7 +30,8 @@ static void i2c_mux_gpio_set(const struct gpiomux *mux, unsigned val)
values[0] = val; values[0] = val;
gpiod_set_array_value_cansleep(mux->data.n_gpios, mux->gpios, values); gpiod_set_array_value_cansleep(mux->data.n_gpios, mux->gpios, NULL,
values);
} }
static int i2c_mux_gpio_select(struct i2c_mux_core *muxc, u32 chan) static int i2c_mux_gpio_select(struct i2c_mux_core *muxc, u32 chan)
......
...@@ -46,7 +46,7 @@ static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq, ...@@ -46,7 +46,7 @@ static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq,
values[0] = value; values[0] = value;
gpiod_set_array_value_cansleep(nvalues, reset_gpios->desc, gpiod_set_array_value_cansleep(nvalues, reset_gpios->desc,
values); reset_gpios->info, values);
} }
} }
......
...@@ -27,7 +27,8 @@ static int mux_gpio_set(struct mux_control *mux, int state) ...@@ -27,7 +27,8 @@ static int mux_gpio_set(struct mux_control *mux, int state)
values[0] = state; values[0] = state;
gpiod_set_array_value_cansleep(mux_gpio->gpios->ndescs, gpiod_set_array_value_cansleep(mux_gpio->gpios->ndescs,
mux_gpio->gpios->desc, values); mux_gpio->gpios->desc,
mux_gpio->gpios->info, values);
return 0; return 0;
} }
......
...@@ -34,7 +34,7 @@ static int mdio_mux_gpio_switch_fn(int current_child, int desired_child, ...@@ -34,7 +34,7 @@ static int mdio_mux_gpio_switch_fn(int current_child, int desired_child,
values[0] = desired_child; values[0] = desired_child;
gpiod_set_array_value_cansleep(s->gpios->ndescs, s->gpios->desc, gpiod_set_array_value_cansleep(s->gpios->ndescs, s->gpios->desc,
values); s->gpios->info, values);
return 0; return 0;
} }
......
...@@ -364,7 +364,7 @@ static int soc_common_pcmcia_config_skt( ...@@ -364,7 +364,7 @@ static int soc_common_pcmcia_config_skt(
} }
if (n) if (n)
gpiod_set_array_value_cansleep(n, descs, values); gpiod_set_array_value_cansleep(n, descs, NULL, values);
/* /*
* This really needs a better solution. The IRQ * This really needs a better solution. The IRQ
......
...@@ -162,7 +162,8 @@ static void phy_mdm6600_cmd(struct phy_mdm6600 *ddata, int val) ...@@ -162,7 +162,8 @@ static void phy_mdm6600_cmd(struct phy_mdm6600 *ddata, int val)
values[0] = val; values[0] = val;
gpiod_set_array_value_cansleep(PHY_MDM6600_NR_CMD_LINES, gpiod_set_array_value_cansleep(PHY_MDM6600_NR_CMD_LINES,
ddata->cmd_gpios->desc, values); ddata->cmd_gpios->desc,
ddata->cmd_gpios->info, values);
} }
/** /**
...@@ -181,6 +182,7 @@ static void phy_mdm6600_status(struct work_struct *work) ...@@ -181,6 +182,7 @@ static void phy_mdm6600_status(struct work_struct *work)
error = gpiod_get_array_value_cansleep(PHY_MDM6600_NR_STATUS_LINES, error = gpiod_get_array_value_cansleep(PHY_MDM6600_NR_STATUS_LINES,
ddata->status_gpios->desc, ddata->status_gpios->desc,
ddata->status_gpios->info,
values); values);
if (error) if (error)
return; return;
......
...@@ -230,7 +230,8 @@ static int ad7606_write_raw(struct iio_dev *indio_dev, ...@@ -230,7 +230,8 @@ static int ad7606_write_raw(struct iio_dev *indio_dev,
values[0] = ret; values[0] = ret;
mutex_lock(&st->lock); mutex_lock(&st->lock);
gpiod_set_array_value(3, st->gpio_os->desc, values); gpiod_set_array_value(3, st->gpio_os->desc, st->gpio_os->info,
values);
st->oversampling = val; st->oversampling = val;
mutex_unlock(&st->lock); mutex_unlock(&st->lock);
......
...@@ -53,7 +53,7 @@ void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl) ...@@ -53,7 +53,7 @@ void mctrl_gpio_set(struct mctrl_gpios *gpios, unsigned int mctrl)
mctrl & mctrl_gpios_desc[i].mctrl); mctrl & mctrl_gpios_desc[i].mctrl);
count++; count++;
} }
gpiod_set_array_value(count, desc_array, values); gpiod_set_array_value(count, desc_array, NULL, values);
} }
EXPORT_SYMBOL_GPL(mctrl_gpio_set); EXPORT_SYMBOL_GPL(mctrl_gpio_set);
......
...@@ -114,36 +114,44 @@ int gpiod_direction_output_raw(struct gpio_desc *desc, int value); ...@@ -114,36 +114,44 @@ int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
int gpiod_get_value(const struct gpio_desc *desc); int gpiod_get_value(const struct gpio_desc *desc);
int gpiod_get_array_value(unsigned int array_size, int gpiod_get_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
void gpiod_set_value(struct gpio_desc *desc, int value); void gpiod_set_value(struct gpio_desc *desc, int value);
void gpiod_set_array_value(unsigned int array_size, void gpiod_set_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_get_raw_value(const struct gpio_desc *desc); int gpiod_get_raw_value(const struct gpio_desc *desc);
int gpiod_get_raw_array_value(unsigned int array_size, int gpiod_get_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
void gpiod_set_raw_value(struct gpio_desc *desc, int value); void gpiod_set_raw_value(struct gpio_desc *desc, int value);
int gpiod_set_raw_array_value(unsigned int array_size, int gpiod_set_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
/* Value get/set from sleeping context */ /* Value get/set from sleeping context */
int gpiod_get_value_cansleep(const struct gpio_desc *desc); int gpiod_get_value_cansleep(const struct gpio_desc *desc);
int gpiod_get_array_value_cansleep(unsigned int array_size, int gpiod_get_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
void gpiod_set_value_cansleep(struct gpio_desc *desc, int value); void gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
void gpiod_set_array_value_cansleep(unsigned int array_size, void gpiod_set_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc); int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
int gpiod_get_raw_array_value_cansleep(unsigned int array_size, int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value); void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
int gpiod_set_raw_array_value_cansleep(unsigned int array_size, int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap); unsigned long *value_bitmap);
int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce); int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
...@@ -341,6 +349,7 @@ static inline int gpiod_get_value(const struct gpio_desc *desc) ...@@ -341,6 +349,7 @@ static inline int gpiod_get_value(const struct gpio_desc *desc)
} }
static inline int gpiod_get_array_value(unsigned int array_size, static inline int gpiod_get_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -354,6 +363,7 @@ static inline void gpiod_set_value(struct gpio_desc *desc, int value) ...@@ -354,6 +363,7 @@ static inline void gpiod_set_value(struct gpio_desc *desc, int value)
} }
static inline void gpiod_set_array_value(unsigned int array_size, static inline void gpiod_set_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -367,6 +377,7 @@ static inline int gpiod_get_raw_value(const struct gpio_desc *desc) ...@@ -367,6 +377,7 @@ static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
} }
static inline int gpiod_get_raw_array_value(unsigned int array_size, static inline int gpiod_get_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -380,6 +391,7 @@ static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value) ...@@ -380,6 +391,7 @@ static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
} }
static inline int gpiod_set_raw_array_value(unsigned int array_size, static inline int gpiod_set_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -395,6 +407,7 @@ static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc) ...@@ -395,6 +407,7 @@ static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
} }
static inline int gpiod_get_array_value_cansleep(unsigned int array_size, static inline int gpiod_get_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -408,6 +421,7 @@ static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) ...@@ -408,6 +421,7 @@ static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
} }
static inline void gpiod_set_array_value_cansleep(unsigned int array_size, static inline void gpiod_set_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -421,6 +435,7 @@ static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) ...@@ -421,6 +435,7 @@ static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
} }
static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
...@@ -435,6 +450,7 @@ static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, ...@@ -435,6 +450,7 @@ static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
} }
static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
struct gpio_array *array_info,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment