|
@@ -427,7 +427,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd,
|
|
|
struct linehandle_state *lh = filep->private_data;
|
|
|
void __user *ip = (void __user *)arg;
|
|
|
struct gpiohandle_data ghd;
|
|
|
- int vals[GPIOHANDLES_MAX];
|
|
|
+ DECLARE_BITMAP(vals, GPIOHANDLES_MAX);
|
|
|
int i;
|
|
|
|
|
|
if (cmd == GPIOHANDLE_GET_LINE_VALUES_IOCTL) {
|
|
@@ -442,7 +442,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd,
|
|
|
|
|
|
memset(&ghd, 0, sizeof(ghd));
|
|
|
for (i = 0; i < lh->numdescs; i++)
|
|
|
- ghd.values[i] = vals[i];
|
|
|
+ ghd.values[i] = test_bit(i, vals);
|
|
|
|
|
|
if (copy_to_user(ip, &ghd, sizeof(ghd)))
|
|
|
return -EFAULT;
|
|
@@ -461,7 +461,7 @@ static long linehandle_ioctl(struct file *filep, unsigned int cmd,
|
|
|
|
|
|
/* Clamp all values to [0,1] */
|
|
|
for (i = 0; i < lh->numdescs; i++)
|
|
|
- vals[i] = !!ghd.values[i];
|
|
|
+ __assign_bit(i, vals, ghd.values[i]);
|
|
|
|
|
|
/* Reuse the array setting function */
|
|
|
return gpiod_set_array_value_complex(false,
|
|
@@ -2784,7 +2784,7 @@ static int gpio_chip_get_multiple(struct gpio_chip *chip,
|
|
|
int gpiod_get_array_value_complex(bool raw, bool can_sleep,
|
|
|
unsigned int array_size,
|
|
|
struct gpio_desc **desc_array,
|
|
|
- int *value_array)
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
int i = 0;
|
|
|
|
|
@@ -2835,7 +2835,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
|
|
|
|
|
|
if (!raw && test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
|
|
value = !value;
|
|
|
- value_array[j] = value;
|
|
|
+ __assign_bit(j, value_bitmap, value);
|
|
|
trace_gpio_value(desc_to_gpio(desc), 1, value);
|
|
|
}
|
|
|
|
|
@@ -2895,9 +2895,9 @@ EXPORT_SYMBOL_GPL(gpiod_get_value);
|
|
|
|
|
|
/**
|
|
|
* gpiod_get_raw_array_value() - read raw values from an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be read
|
|
|
- * @value_array: array 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
|
|
|
* without regard for their ACTIVE_LOW status. Return 0 in case of success,
|
|
@@ -2907,20 +2907,21 @@ EXPORT_SYMBOL_GPL(gpiod_get_value);
|
|
|
* and it will complain if the GPIO chip functions potentially sleep.
|
|
|
*/
|
|
|
int gpiod_get_raw_array_value(unsigned int array_size,
|
|
|
- struct gpio_desc **desc_array, int *value_array)
|
|
|
+ struct gpio_desc **desc_array,
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
if (!desc_array)
|
|
|
return -EINVAL;
|
|
|
return gpiod_get_array_value_complex(true, false, array_size,
|
|
|
- desc_array, value_array);
|
|
|
+ desc_array, value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value);
|
|
|
|
|
|
/**
|
|
|
* gpiod_get_array_value() - read values from an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be read
|
|
|
- * @value_array: array 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
|
|
|
* into account. Return 0 in case of success, else an error code.
|
|
@@ -2929,12 +2930,13 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value);
|
|
|
* and it will complain if the GPIO chip functions potentially sleep.
|
|
|
*/
|
|
|
int gpiod_get_array_value(unsigned int array_size,
|
|
|
- struct gpio_desc **desc_array, int *value_array)
|
|
|
+ struct gpio_desc **desc_array,
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
if (!desc_array)
|
|
|
return -EINVAL;
|
|
|
return gpiod_get_array_value_complex(false, false, array_size,
|
|
|
- desc_array, value_array);
|
|
|
+ desc_array, value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_get_array_value);
|
|
|
|
|
@@ -3027,7 +3029,7 @@ static void gpio_chip_set_multiple(struct gpio_chip *chip,
|
|
|
int gpiod_set_array_value_complex(bool raw, bool can_sleep,
|
|
|
unsigned int array_size,
|
|
|
struct gpio_desc **desc_array,
|
|
|
- int *value_array)
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
int i = 0;
|
|
|
|
|
@@ -3056,7 +3058,7 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
|
|
|
do {
|
|
|
struct gpio_desc *desc = desc_array[i];
|
|
|
int hwgpio = gpio_chip_hwgpio(desc);
|
|
|
- int value = value_array[i];
|
|
|
+ int value = test_bit(i, value_bitmap);
|
|
|
|
|
|
if (!raw && test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
|
|
value = !value;
|
|
@@ -3152,9 +3154,9 @@ EXPORT_SYMBOL_GPL(gpiod_set_value);
|
|
|
|
|
|
/**
|
|
|
* gpiod_set_raw_array_value() - assign values to an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be assigned
|
|
|
- * @value_array: array 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
|
|
|
* without regard for their ACTIVE_LOW status.
|
|
@@ -3163,20 +3165,21 @@ EXPORT_SYMBOL_GPL(gpiod_set_value);
|
|
|
* complain if the GPIO chip functions potentially sleep.
|
|
|
*/
|
|
|
int gpiod_set_raw_array_value(unsigned int array_size,
|
|
|
- struct gpio_desc **desc_array, int *value_array)
|
|
|
+ struct gpio_desc **desc_array,
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
if (!desc_array)
|
|
|
return -EINVAL;
|
|
|
return gpiod_set_array_value_complex(true, false, array_size,
|
|
|
- desc_array, value_array);
|
|
|
+ desc_array, value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
|
|
|
|
|
|
/**
|
|
|
* gpiod_set_array_value() - assign values to an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be assigned
|
|
|
- * @value_array: array 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
|
|
|
* into account.
|
|
@@ -3185,12 +3188,13 @@ EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
|
|
|
* complain if the GPIO chip functions potentially sleep.
|
|
|
*/
|
|
|
void gpiod_set_array_value(unsigned int array_size,
|
|
|
- struct gpio_desc **desc_array, int *value_array)
|
|
|
+ struct gpio_desc **desc_array,
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
if (!desc_array)
|
|
|
return;
|
|
|
gpiod_set_array_value_complex(false, false, array_size, desc_array,
|
|
|
- value_array);
|
|
|
+ value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_set_array_value);
|
|
|
|
|
@@ -3410,9 +3414,9 @@ EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep);
|
|
|
|
|
|
/**
|
|
|
* gpiod_get_raw_array_value_cansleep() - read raw values from an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be read
|
|
|
- * @value_array: array 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
|
|
|
* without regard for their ACTIVE_LOW status. Return 0 in case of success,
|
|
@@ -3422,21 +3426,21 @@ EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep);
|
|
|
*/
|
|
|
int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
|
|
|
struct gpio_desc **desc_array,
|
|
|
- int *value_array)
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
might_sleep_if(extra_checks);
|
|
|
if (!desc_array)
|
|
|
return -EINVAL;
|
|
|
return gpiod_get_array_value_complex(true, true, array_size,
|
|
|
- desc_array, value_array);
|
|
|
+ desc_array, value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep);
|
|
|
|
|
|
/**
|
|
|
* gpiod_get_array_value_cansleep() - read values from an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be read
|
|
|
- * @value_array: array 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
|
|
|
* into account. Return 0 in case of success, else an error code.
|
|
@@ -3445,13 +3449,13 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep);
|
|
|
*/
|
|
|
int gpiod_get_array_value_cansleep(unsigned int array_size,
|
|
|
struct gpio_desc **desc_array,
|
|
|
- int *value_array)
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
might_sleep_if(extra_checks);
|
|
|
if (!desc_array)
|
|
|
return -EINVAL;
|
|
|
return gpiod_get_array_value_complex(false, true, array_size,
|
|
|
- desc_array, value_array);
|
|
|
+ desc_array, value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_get_array_value_cansleep);
|
|
|
|
|
@@ -3493,9 +3497,9 @@ EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep);
|
|
|
|
|
|
/**
|
|
|
* gpiod_set_raw_array_value_cansleep() - assign values to an array of GPIOs
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be assigned
|
|
|
- * @value_array: array 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
|
|
|
* without regard for their ACTIVE_LOW status.
|
|
@@ -3504,13 +3508,13 @@ EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep);
|
|
|
*/
|
|
|
int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|
|
struct gpio_desc **desc_array,
|
|
|
- int *value_array)
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
might_sleep_if(extra_checks);
|
|
|
if (!desc_array)
|
|
|
return -EINVAL;
|
|
|
return gpiod_set_array_value_complex(true, true, array_size, desc_array,
|
|
|
- value_array);
|
|
|
+ value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_set_raw_array_value_cansleep);
|
|
|
|
|
@@ -3533,9 +3537,9 @@ 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
|
|
|
- * @array_size: number of elements in the descriptor / value arrays
|
|
|
+ * @array_size: number of elements in the descriptor array / value bitmap
|
|
|
* @desc_array: array of GPIO descriptors whose values will be assigned
|
|
|
- * @value_array: array 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
|
|
|
* into account.
|
|
@@ -3544,13 +3548,13 @@ void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n)
|
|
|
*/
|
|
|
void gpiod_set_array_value_cansleep(unsigned int array_size,
|
|
|
struct gpio_desc **desc_array,
|
|
|
- int *value_array)
|
|
|
+ unsigned long *value_bitmap)
|
|
|
{
|
|
|
might_sleep_if(extra_checks);
|
|
|
if (!desc_array)
|
|
|
return;
|
|
|
gpiod_set_array_value_complex(false, true, array_size, desc_array,
|
|
|
- value_array);
|
|
|
+ value_bitmap);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep);
|
|
|
|