gpio: Pass a flag to gpiochip_request_own_desc()
Before things go out of hand, make it possible to pass flags when requesting "own" descriptors from a gpio_chip. This is necessary if the chip wants to request a GPIO with active low semantics, for example. Cc: Janusz Krzysztofik <jmkrzyszt@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Jiri Kosina <jkosina@suse.cz> Cc: Roger Quadros <rogerq@ti.com> Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
@@ -608,7 +608,7 @@ static int mvebu_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
ret = -EBUSY;
|
||||
} else {
|
||||
desc = gpiochip_request_own_desc(&mvchip->chip,
|
||||
pwm->hwpwm, "mvebu-pwm");
|
||||
pwm->hwpwm, "mvebu-pwm", 0);
|
||||
if (IS_ERR(desc)) {
|
||||
ret = PTR_ERR(desc);
|
||||
goto out;
|
||||
|
@@ -167,7 +167,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
|
||||
if (!handler)
|
||||
return AE_OK;
|
||||
|
||||
desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
|
||||
desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event", 0);
|
||||
if (IS_ERR(desc)) {
|
||||
dev_err(chip->parent, "Failed to request GPIO\n");
|
||||
return AE_ERROR;
|
||||
@@ -884,21 +884,14 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
|
||||
const char *label = "ACPI:OpRegion";
|
||||
int err;
|
||||
|
||||
desc = gpiochip_request_own_desc(chip, pin, label);
|
||||
desc = gpiochip_request_own_desc(chip, pin, label,
|
||||
flags);
|
||||
if (IS_ERR(desc)) {
|
||||
status = AE_ERROR;
|
||||
mutex_unlock(&achip->conn_lock);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = gpiod_configure_flags(desc, label, 0, flags);
|
||||
if (err < 0) {
|
||||
status = AE_NOT_CONFIGURED;
|
||||
gpiochip_free_own_desc(desc);
|
||||
mutex_unlock(&achip->conn_lock);
|
||||
goto out;
|
||||
}
|
||||
|
||||
conn = kzalloc(sizeof(*conn), GFP_KERNEL);
|
||||
if (!conn) {
|
||||
status = AE_NO_MEMORY;
|
||||
|
@@ -2454,6 +2454,7 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
|
||||
* @chip: GPIO chip
|
||||
* @hwnum: hardware number of the GPIO for which to request the descriptor
|
||||
* @label: label for the GPIO
|
||||
* @flags: flags for this GPIO or 0 if default
|
||||
*
|
||||
* Function allows GPIO chip drivers to request and use their own GPIO
|
||||
* descriptors via gpiolib API. Difference to gpiod_request() is that this
|
||||
@@ -2466,7 +2467,8 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
|
||||
* code on failure.
|
||||
*/
|
||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
|
||||
const char *label)
|
||||
const char *label,
|
||||
enum gpiod_flags flags)
|
||||
{
|
||||
struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum);
|
||||
int err;
|
||||
@@ -2480,6 +2482,13 @@ struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
|
||||
if (err < 0)
|
||||
return ERR_PTR(err);
|
||||
|
||||
err = gpiod_configure_flags(desc, label, 0, flags);
|
||||
if (err) {
|
||||
chip_err(chip, "setup of own GPIO %s failed\n", label);
|
||||
gpiod_free_commit(desc);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
return desc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
|
||||
@@ -4332,7 +4341,15 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
|
||||
chip = gpiod_to_chip(desc);
|
||||
hwnum = gpio_chip_hwgpio(desc);
|
||||
|
||||
local_desc = gpiochip_request_own_desc(chip, hwnum, name);
|
||||
/*
|
||||
* FIXME: not very elegant that we call gpiod_configure_flags()
|
||||
* twice here (once inside gpiochip_request_own_desc() and
|
||||
* again here), but the gpiochip_request_own_desc() is external
|
||||
* and cannot really pass the lflags so this is the lesser evil
|
||||
* at the moment. Pass zero as dflags on this first call so we
|
||||
* don't screw anything up.
|
||||
*/
|
||||
local_desc = gpiochip_request_own_desc(chip, hwnum, name, 0);
|
||||
if (IS_ERR(local_desc)) {
|
||||
status = PTR_ERR(local_desc);
|
||||
pr_err("requesting hog GPIO %s (chip %s, offset %d) failed, %d\n",
|
||||
|
Reference in New Issue
Block a user