|
|
|
@ -308,10 +308,9 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip); |
|
|
|
|
* |
|
|
|
|
* A gpio_chip with any GPIOs still requested may not be removed. |
|
|
|
|
*/ |
|
|
|
|
int gpiochip_remove(struct gpio_chip *chip) |
|
|
|
|
void gpiochip_remove(struct gpio_chip *chip) |
|
|
|
|
{ |
|
|
|
|
unsigned long flags; |
|
|
|
|
int status = 0; |
|
|
|
|
unsigned id; |
|
|
|
|
|
|
|
|
|
acpi_gpiochip_remove(chip); |
|
|
|
@ -323,24 +322,15 @@ int gpiochip_remove(struct gpio_chip *chip) |
|
|
|
|
of_gpiochip_remove(chip); |
|
|
|
|
|
|
|
|
|
for (id = 0; id < chip->ngpio; id++) { |
|
|
|
|
if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) { |
|
|
|
|
status = -EBUSY; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (status == 0) { |
|
|
|
|
for (id = 0; id < chip->ngpio; id++) |
|
|
|
|
chip->desc[id].chip = NULL; |
|
|
|
|
|
|
|
|
|
list_del(&chip->list); |
|
|
|
|
if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) |
|
|
|
|
dev_crit(chip->dev, "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n"); |
|
|
|
|
} |
|
|
|
|
for (id = 0; id < chip->ngpio; id++) |
|
|
|
|
chip->desc[id].chip = NULL; |
|
|
|
|
|
|
|
|
|
list_del(&chip->list); |
|
|
|
|
spin_unlock_irqrestore(&gpio_lock, flags); |
|
|
|
|
|
|
|
|
|
if (status == 0) |
|
|
|
|
gpiochip_unexport(chip); |
|
|
|
|
|
|
|
|
|
return status; |
|
|
|
|
gpiochip_unexport(chip); |
|
|
|
|
} |
|
|
|
|
EXPORT_SYMBOL_GPL(gpiochip_remove); |
|
|
|
|
|
|
|
|
|