forked from luck/tmp_suning_uos_patched
gpio: Add new flags to control sleep status of GPIOs
Add new flags to allow users to specify that they are not concerned with the status of GPIOs whilst in a sleep/low power state. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
f9e3a419aa
commit
05f479bf7d
|
@ -153,6 +153,9 @@ struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
|
|||
*flags |= GPIO_OPEN_SOURCE;
|
||||
}
|
||||
|
||||
if (of_flags & OF_GPIO_SLEEP_MAY_LOOSE_VALUE)
|
||||
*flags |= GPIO_SLEEP_MAY_LOOSE_VALUE;
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
|
|
@ -2869,6 +2869,16 @@ bool gpiochip_line_is_open_source(struct gpio_chip *chip, unsigned int offset)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_line_is_open_source);
|
||||
|
||||
bool gpiochip_line_is_persistent(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
if (offset >= chip->ngpio)
|
||||
return false;
|
||||
|
||||
return !test_bit(FLAG_SLEEP_MAY_LOOSE_VALUE,
|
||||
&chip->gpiodev->descs[offset].flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_line_is_persistent);
|
||||
|
||||
/**
|
||||
* gpiod_get_raw_value_cansleep() - return a gpio's raw value
|
||||
* @desc: gpio whose value will be returned
|
||||
|
@ -3225,6 +3235,8 @@ static int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
|
|||
set_bit(FLAG_OPEN_DRAIN, &desc->flags);
|
||||
if (lflags & GPIO_OPEN_SOURCE)
|
||||
set_bit(FLAG_OPEN_SOURCE, &desc->flags);
|
||||
if (lflags & GPIO_SLEEP_MAY_LOOSE_VALUE)
|
||||
set_bit(FLAG_SLEEP_MAY_LOOSE_VALUE, &desc->flags);
|
||||
|
||||
/* No particular flag request, return here... */
|
||||
if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) {
|
||||
|
|
|
@ -190,6 +190,7 @@ struct gpio_desc {
|
|||
#define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */
|
||||
#define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */
|
||||
#define FLAG_IS_HOGGED 11 /* GPIO is hogged */
|
||||
#define FLAG_SLEEP_MAY_LOOSE_VALUE 12 /* GPIO may loose value in sleep */
|
||||
|
||||
/* Connection label */
|
||||
const char *label;
|
||||
|
|
|
@ -28,4 +28,8 @@
|
|||
#define GPIO_OPEN_DRAIN (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_DRAIN)
|
||||
#define GPIO_OPEN_SOURCE (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_SOURCE)
|
||||
|
||||
/* Bit 3 express GPIO suspend/resume persistence */
|
||||
#define GPIO_SLEEP_MAINTAIN_VALUE 0
|
||||
#define GPIO_SLEEP_MAY_LOOSE_VALUE 8
|
||||
|
||||
#endif
|
||||
|
|
|
@ -213,6 +213,9 @@ bool gpiochip_line_is_irq(struct gpio_chip *chip, unsigned int offset);
|
|||
bool gpiochip_line_is_open_drain(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_open_source(struct gpio_chip *chip, unsigned int offset);
|
||||
|
||||
/* Sleep persistence inquiry for drivers */
|
||||
bool gpiochip_line_is_persistent(struct gpio_chip *chip, unsigned int offset);
|
||||
|
||||
/* get driver data */
|
||||
void *gpiochip_get_data(struct gpio_chip *chip);
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ enum gpio_lookup_flags {
|
|||
GPIO_ACTIVE_LOW = (1 << 0),
|
||||
GPIO_OPEN_DRAIN = (1 << 1),
|
||||
GPIO_OPEN_SOURCE = (1 << 2),
|
||||
GPIO_SLEEP_MAINTAIN_VALUE = (0 << 3),
|
||||
GPIO_SLEEP_MAY_LOOSE_VALUE = (1 << 3),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -31,6 +31,7 @@ enum of_gpio_flags {
|
|||
OF_GPIO_ACTIVE_LOW = 0x1,
|
||||
OF_GPIO_SINGLE_ENDED = 0x2,
|
||||
OF_GPIO_OPEN_DRAIN = 0x4,
|
||||
OF_GPIO_SLEEP_MAY_LOOSE_VALUE = 0x8,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
|
|
Loading…
Reference in New Issue
Block a user