• Hans de Goede's avatar
    gpio: crystalcove: Do not write regular gpio registers for virtual GPIOs · 9a752b4c
    Hans de Goede authored
    The Crystal Cove PMIC has 16 real GPIOs but the ACPI code for devices
    with this PMIC may address up to 95 GPIOs, these extra GPIOs are
    called virtual GPIOs and are used by the ACPI code as a method of
    accessing various non GPIO bits of PMIC.
    
    Commit dcdc3018 ("gpio: crystalcove: support virtual GPIO") added
    dummy support for these to avoid a bunch of ACPI errors, but instead of
    ignoring writes / reads to them by doing:
    
    if (gpio >= CRYSTALCOVE_GPIO_NUM)
    	return 0;
    
    It accidentally introduced the following wrong check:
    
    if (gpio > CRYSTALCOVE_VGPIO_NUM)
    	return 0;
    
    Which means that attempts by the ACPI code to access these gpios
    causes some arbitrary gpio to get touched through for example
    GPIO1P0CTLO + gpionr % 8.
    
    Since we do support input/output (but not interrupts) on the 0x5e
    virtual GPIO, this commit makes to_reg return -ENOTSUPP for unsupported
    virtual GPIOs so as to not have to check for (gpio >= CRYSTALCOVE_GPIO_NUM
    && gpio != 0x5e) everywhere and to make it easier to add support for more
    virtual GPIOs in the future.
    
    It then adds a check for to_reg returning an error to all callers where
    this may happen fixing the ACPI code accessing virtual GPIOs accidentally
    causing changes to real GPIOs.
    
    Fixes: dcdc3018 ("gpio: crystalcove: support virtual GPIO")
    Cc: Aaron Lu <aaron.lu@intel.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    9a752b4c
gpio-crystalcove.c 9.95 KB