Final (hopefully) GPIO fixes for v4.7:

- Fix an oops on the Asus Eee PC 1201
 - Revert a patch trying to split GPIO parsing and GPIO configuration
 - Revert a too liberal compile testing thing
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJXf460AAoJEEEQszewGV1zelEQAKGzur1ClwQx4PzF5W+6hAkJ
 a7DDMOA2jBWgh+fnGRGq1yKNpeF1famLB4EVYvr4fzsTZDMFnFmHLAomc42wzfPM
 ZDgPBcpNN9/603vXrW32c84SbNKUt3liC0VGBiQns0ixRnl/z07HcFIcQgLWjSjc
 02VtYQVXlBtEvgpCSovfcly2hvoSB8onDKhF7/gaI5d+k0Ngq4MtIMueMEYaJY/z
 16NZl5Sapn58gAUhElUy+9gBeIA+xPx/VXhBlP+g6pSAHiRudaHNAMEFEDiAWEOQ
 Iedzy/vXtLdRV6w3ZZJ99OGSTYrGtBBMbIKOWA98IW9s2h98B3r7+267VzFMd5f2
 Avcdg8emkQP6iN1hWCtT3YKKgK6L0Iwi7FIqgaHzFyg32tIc42Ej8EoD+HyzT4MU
 NzAXg/0E3b0vgtxzXcWUNEJ3K4P7xlgcFRiuwGAE1C2c1RxxKLSTyvDBANRSKSLt
 ADNYioWr4vAQEE+id3SZFkbxOOlTSD+nAjcE1NzXCJcGpwinpPWADfQxwn6TEvp/
 KodH7eItpJsWs8z7mqnCFC6lox133phXqPvs2ECRMFi6p4OYaTRX+MSeoLv9t9w/
 e/KVl9Wpnx9ImvFurr3TsPaAtjsAPlnlUxrNrY3mngAfKEm+YKoJBgen6KrHiGPI
 fewQGrZr4xhtDn0AOKNm
 =9+1I
 -----END PGP SIGNATURE-----

Merge tag 'gpio-v4.7-5' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio

Pull GPIO fixes from Linus Walleij:
 "I don't like to toss in last minute patches, but these are all for
  things that are broken, and have bitten people for real.  Two of them
  go into stable.  Maybe all of them if the compile test problem is a
  pain in the ass also for stable folks.

  Final (hopefully) GPIO fixes for v4.7:

   - Fix an oops on the Asus Eee PC 1201

   - Revert a patch trying to split GPIO parsing and GPIO configuration

   - Revert a too liberal compile testing thing"

* tag 'gpio-v4.7-5' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
  Revert "gpio: gpiolib-of: Allow compile testing"
  Revert "gpiolib: Split GPIO flags parsing and GPIO configuration"
  gpio: sch: Fix Oops on module load on Asus Eee PC 1201
This commit is contained in:
Linus Torvalds 2016-07-08 08:57:03 -07:00
commit 18b16676c3
4 changed files with 31 additions and 52 deletions

View File

@ -49,7 +49,7 @@ config GPIO_DEVRES
config OF_GPIO config OF_GPIO
def_bool y def_bool y
depends on OF || COMPILE_TEST depends on OF
config GPIO_ACPI config GPIO_ACPI
def_bool y def_bool y

View File

@ -61,9 +61,8 @@ static unsigned sch_gpio_bit(struct sch_gpio *sch, unsigned gpio)
return gpio % 8; return gpio % 8;
} }
static int sch_gpio_reg_get(struct gpio_chip *gc, unsigned gpio, unsigned reg) static int sch_gpio_reg_get(struct sch_gpio *sch, unsigned gpio, unsigned reg)
{ {
struct sch_gpio *sch = gpiochip_get_data(gc);
unsigned short offset, bit; unsigned short offset, bit;
u8 reg_val; u8 reg_val;
@ -75,10 +74,9 @@ static int sch_gpio_reg_get(struct gpio_chip *gc, unsigned gpio, unsigned reg)
return reg_val; return reg_val;
} }
static void sch_gpio_reg_set(struct gpio_chip *gc, unsigned gpio, unsigned reg, static void sch_gpio_reg_set(struct sch_gpio *sch, unsigned gpio, unsigned reg,
int val) int val)
{ {
struct sch_gpio *sch = gpiochip_get_data(gc);
unsigned short offset, bit; unsigned short offset, bit;
u8 reg_val; u8 reg_val;
@ -98,14 +96,15 @@ static int sch_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num)
struct sch_gpio *sch = gpiochip_get_data(gc); struct sch_gpio *sch = gpiochip_get_data(gc);
spin_lock(&sch->lock); spin_lock(&sch->lock);
sch_gpio_reg_set(gc, gpio_num, GIO, 1); sch_gpio_reg_set(sch, gpio_num, GIO, 1);
spin_unlock(&sch->lock); spin_unlock(&sch->lock);
return 0; return 0;
} }
static int sch_gpio_get(struct gpio_chip *gc, unsigned gpio_num) static int sch_gpio_get(struct gpio_chip *gc, unsigned gpio_num)
{ {
return sch_gpio_reg_get(gc, gpio_num, GLV); struct sch_gpio *sch = gpiochip_get_data(gc);
return sch_gpio_reg_get(sch, gpio_num, GLV);
} }
static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val) static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val)
@ -113,7 +112,7 @@ static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val)
struct sch_gpio *sch = gpiochip_get_data(gc); struct sch_gpio *sch = gpiochip_get_data(gc);
spin_lock(&sch->lock); spin_lock(&sch->lock);
sch_gpio_reg_set(gc, gpio_num, GLV, val); sch_gpio_reg_set(sch, gpio_num, GLV, val);
spin_unlock(&sch->lock); spin_unlock(&sch->lock);
} }
@ -123,7 +122,7 @@ static int sch_gpio_direction_out(struct gpio_chip *gc, unsigned gpio_num,
struct sch_gpio *sch = gpiochip_get_data(gc); struct sch_gpio *sch = gpiochip_get_data(gc);
spin_lock(&sch->lock); spin_lock(&sch->lock);
sch_gpio_reg_set(gc, gpio_num, GIO, 0); sch_gpio_reg_set(sch, gpio_num, GIO, 0);
spin_unlock(&sch->lock); spin_unlock(&sch->lock);
/* /*
@ -182,13 +181,13 @@ static int sch_gpio_probe(struct platform_device *pdev)
* GPIO7 is configured by the CMC as SLPIOVR * GPIO7 is configured by the CMC as SLPIOVR
* Enable GPIO[9:8] core powered gpios explicitly * Enable GPIO[9:8] core powered gpios explicitly
*/ */
sch_gpio_reg_set(&sch->chip, 8, GEN, 1); sch_gpio_reg_set(sch, 8, GEN, 1);
sch_gpio_reg_set(&sch->chip, 9, GEN, 1); sch_gpio_reg_set(sch, 9, GEN, 1);
/* /*
* SUS_GPIO[2:0] enabled by default * SUS_GPIO[2:0] enabled by default
* Enable SUS_GPIO3 resume powered gpio explicitly * Enable SUS_GPIO3 resume powered gpio explicitly
*/ */
sch_gpio_reg_set(&sch->chip, 13, GEN, 1); sch_gpio_reg_set(sch, 13, GEN, 1);
break; break;
case PCI_DEVICE_ID_INTEL_ITC_LPC: case PCI_DEVICE_ID_INTEL_ITC_LPC:

View File

@ -28,6 +28,10 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
if (!desc && gpio_is_valid(gpio)) if (!desc && gpio_is_valid(gpio))
return -EPROBE_DEFER; return -EPROBE_DEFER;
err = gpiod_request(desc, label);
if (err)
return err;
if (flags & GPIOF_OPEN_DRAIN) if (flags & GPIOF_OPEN_DRAIN)
set_bit(FLAG_OPEN_DRAIN, &desc->flags); set_bit(FLAG_OPEN_DRAIN, &desc->flags);
@ -37,10 +41,6 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
if (flags & GPIOF_ACTIVE_LOW) if (flags & GPIOF_ACTIVE_LOW)
set_bit(FLAG_ACTIVE_LOW, &desc->flags); set_bit(FLAG_ACTIVE_LOW, &desc->flags);
err = gpiod_request(desc, label);
if (err)
return err;
if (flags & GPIOF_DIR_IN) if (flags & GPIOF_DIR_IN)
err = gpiod_direction_input(desc); err = gpiod_direction_input(desc);
else else

View File

@ -1352,14 +1352,6 @@ static int __gpiod_request(struct gpio_desc *desc, const char *label)
spin_lock_irqsave(&gpio_lock, flags); spin_lock_irqsave(&gpio_lock, flags);
} }
done: done:
if (status < 0) {
/* Clear flags that might have been set by the caller before
* requesting the GPIO.
*/
clear_bit(FLAG_ACTIVE_LOW, &desc->flags);
clear_bit(FLAG_OPEN_DRAIN, &desc->flags);
clear_bit(FLAG_OPEN_SOURCE, &desc->flags);
}
spin_unlock_irqrestore(&gpio_lock, flags); spin_unlock_irqrestore(&gpio_lock, flags);
return status; return status;
} }
@ -2587,28 +2579,13 @@ struct gpio_desc *__must_check gpiod_get_optional(struct device *dev,
} }
EXPORT_SYMBOL_GPL(gpiod_get_optional); EXPORT_SYMBOL_GPL(gpiod_get_optional);
/**
* gpiod_parse_flags - helper function to parse GPIO lookup flags
* @desc: gpio to be setup
* @lflags: gpio_lookup_flags - returned from of_find_gpio() or
* of_get_gpio_hog()
*
* Set the GPIO descriptor flags based on the given GPIO lookup flags.
*/
static void gpiod_parse_flags(struct gpio_desc *desc, unsigned long lflags)
{
if (lflags & GPIO_ACTIVE_LOW)
set_bit(FLAG_ACTIVE_LOW, &desc->flags);
if (lflags & GPIO_OPEN_DRAIN)
set_bit(FLAG_OPEN_DRAIN, &desc->flags);
if (lflags & GPIO_OPEN_SOURCE)
set_bit(FLAG_OPEN_SOURCE, &desc->flags);
}
/** /**
* gpiod_configure_flags - helper function to configure a given GPIO * gpiod_configure_flags - helper function to configure a given GPIO
* @desc: gpio whose value will be assigned * @desc: gpio whose value will be assigned
* @con_id: function within the GPIO consumer * @con_id: function within the GPIO consumer
* @lflags: gpio_lookup_flags - returned from of_find_gpio() or
* of_get_gpio_hog()
* @dflags: gpiod_flags - optional GPIO initialization flags * @dflags: gpiod_flags - optional GPIO initialization flags
* *
* Return 0 on success, -ENOENT if no GPIO has been assigned to the * Return 0 on success, -ENOENT if no GPIO has been assigned to the
@ -2616,10 +2593,17 @@ static void gpiod_parse_flags(struct gpio_desc *desc, unsigned long lflags)
* occurred while trying to acquire the GPIO. * occurred while trying to acquire the GPIO.
*/ */
static int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id, static int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
enum gpiod_flags dflags) unsigned long lflags, enum gpiod_flags dflags)
{ {
int status; int status;
if (lflags & GPIO_ACTIVE_LOW)
set_bit(FLAG_ACTIVE_LOW, &desc->flags);
if (lflags & GPIO_OPEN_DRAIN)
set_bit(FLAG_OPEN_DRAIN, &desc->flags);
if (lflags & GPIO_OPEN_SOURCE)
set_bit(FLAG_OPEN_SOURCE, &desc->flags);
/* No particular flag request, return here... */ /* No particular flag request, return here... */
if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) { if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) {
pr_debug("no flags found for %s\n", con_id); pr_debug("no flags found for %s\n", con_id);
@ -2686,13 +2670,11 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
return desc; return desc;
} }
gpiod_parse_flags(desc, lookupflags);
status = gpiod_request(desc, con_id); status = gpiod_request(desc, con_id);
if (status < 0) if (status < 0)
return ERR_PTR(status); return ERR_PTR(status);
status = gpiod_configure_flags(desc, con_id, flags); status = gpiod_configure_flags(desc, con_id, lookupflags, flags);
if (status < 0) { if (status < 0) {
dev_dbg(dev, "setup of GPIO %s failed\n", con_id); dev_dbg(dev, "setup of GPIO %s failed\n", con_id);
gpiod_put(desc); gpiod_put(desc);
@ -2748,6 +2730,10 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
if (IS_ERR(desc)) if (IS_ERR(desc))
return desc; return desc;
ret = gpiod_request(desc, NULL);
if (ret)
return ERR_PTR(ret);
if (active_low) if (active_low)
set_bit(FLAG_ACTIVE_LOW, &desc->flags); set_bit(FLAG_ACTIVE_LOW, &desc->flags);
@ -2758,10 +2744,6 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
set_bit(FLAG_OPEN_SOURCE, &desc->flags); set_bit(FLAG_OPEN_SOURCE, &desc->flags);
} }
ret = gpiod_request(desc, NULL);
if (ret)
return ERR_PTR(ret);
return desc; return desc;
} }
EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod); EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod);
@ -2814,8 +2796,6 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
chip = gpiod_to_chip(desc); chip = gpiod_to_chip(desc);
hwnum = gpio_chip_hwgpio(desc); hwnum = gpio_chip_hwgpio(desc);
gpiod_parse_flags(desc, lflags);
local_desc = gpiochip_request_own_desc(chip, hwnum, name); local_desc = gpiochip_request_own_desc(chip, hwnum, name);
if (IS_ERR(local_desc)) { if (IS_ERR(local_desc)) {
status = PTR_ERR(local_desc); status = PTR_ERR(local_desc);
@ -2824,7 +2804,7 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
return status; return status;
} }
status = gpiod_configure_flags(desc, name, dflags); status = gpiod_configure_flags(desc, name, lflags, dflags);
if (status < 0) { if (status < 0) {
pr_err("setup of hog GPIO %s (chip %s, offset %d) failed, %d\n", pr_err("setup of hog GPIO %s (chip %s, offset %d) failed, %d\n",
name, chip->label, hwnum, status); name, chip->label, hwnum, status);