Commit e3a2e878 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Linus Walleij

gpio: rename gpio_lock_as_irq to gpiochip_lock_as_irq

This function actually operates on a gpio_chip, so its prefix should
reflect that fact for consistency with other functions defined in
gpio/driver.h.
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent ee2a9f7f
...@@ -158,12 +158,12 @@ Locking IRQ usage ...@@ -158,12 +158,12 @@ Locking IRQ usage
Input GPIOs can be used as IRQ signals. When this happens, a driver is requested Input GPIOs can be used as IRQ signals. When this happens, a driver is requested
to mark the GPIO as being used as an IRQ: to mark the GPIO as being used as an IRQ:
int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset) int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
This will prevent the use of non-irq related GPIO APIs until the GPIO IRQ lock This will prevent the use of non-irq related GPIO APIs until the GPIO IRQ lock
is released: is released:
void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset) void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset)
When implementing an irqchip inside a GPIO driver, these two functions should When implementing an irqchip inside a GPIO driver, these two functions should
typically be called in the .startup() and .shutdown() callbacks from the typically be called in the .startup() and .shutdown() callbacks from the
......
...@@ -470,7 +470,7 @@ static int bcm_kona_gpio_irq_reqres(struct irq_data *d) ...@@ -470,7 +470,7 @@ static int bcm_kona_gpio_irq_reqres(struct irq_data *d)
{ {
struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d); struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d);
if (gpio_lock_as_irq(&kona_gpio->gpio_chip, d->hwirq)) { if (gpiochip_lock_as_irq(&kona_gpio->gpio_chip, d->hwirq)) {
dev_err(kona_gpio->gpio_chip.dev, dev_err(kona_gpio->gpio_chip.dev,
"unable to lock HW IRQ %lu for IRQ\n", "unable to lock HW IRQ %lu for IRQ\n",
d->hwirq); d->hwirq);
...@@ -483,7 +483,7 @@ static void bcm_kona_gpio_irq_relres(struct irq_data *d) ...@@ -483,7 +483,7 @@ static void bcm_kona_gpio_irq_relres(struct irq_data *d)
{ {
struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d); struct bcm_kona_gpio *kona_gpio = irq_data_get_irq_chip_data(d);
gpio_unlock_as_irq(&kona_gpio->gpio_chip, d->hwirq); gpiochip_unlock_as_irq(&kona_gpio->gpio_chip, d->hwirq);
} }
static struct irq_chip bcm_gpio_irq_chip = { static struct irq_chip bcm_gpio_irq_chip = {
......
...@@ -194,7 +194,7 @@ static int dwapb_irq_reqres(struct irq_data *d) ...@@ -194,7 +194,7 @@ static int dwapb_irq_reqres(struct irq_data *d)
struct dwapb_gpio *gpio = igc->private; struct dwapb_gpio *gpio = igc->private;
struct bgpio_chip *bgc = &gpio->ports[0].bgc; struct bgpio_chip *bgc = &gpio->ports[0].bgc;
if (gpio_lock_as_irq(&bgc->gc, irqd_to_hwirq(d))) { if (gpiochip_lock_as_irq(&bgc->gc, irqd_to_hwirq(d))) {
dev_err(gpio->dev, "unable to lock HW IRQ %lu for IRQ\n", dev_err(gpio->dev, "unable to lock HW IRQ %lu for IRQ\n",
irqd_to_hwirq(d)); irqd_to_hwirq(d));
return -EINVAL; return -EINVAL;
...@@ -208,7 +208,7 @@ static void dwapb_irq_relres(struct irq_data *d) ...@@ -208,7 +208,7 @@ static void dwapb_irq_relres(struct irq_data *d)
struct dwapb_gpio *gpio = igc->private; struct dwapb_gpio *gpio = igc->private;
struct bgpio_chip *bgc = &gpio->ports[0].bgc; struct bgpio_chip *bgc = &gpio->ports[0].bgc;
gpio_unlock_as_irq(&bgc->gc, irqd_to_hwirq(d)); gpiochip_unlock_as_irq(&bgc->gc, irqd_to_hwirq(d));
} }
static int dwapb_irq_set_type(struct irq_data *d, u32 type) static int dwapb_irq_set_type(struct irq_data *d, u32 type)
......
...@@ -103,7 +103,7 @@ static int em_gio_irq_reqres(struct irq_data *d) ...@@ -103,7 +103,7 @@ static int em_gio_irq_reqres(struct irq_data *d)
{ {
struct em_gio_priv *p = irq_data_get_irq_chip_data(d); struct em_gio_priv *p = irq_data_get_irq_chip_data(d);
if (gpio_lock_as_irq(&p->gpio_chip, irqd_to_hwirq(d))) { if (gpiochip_lock_as_irq(&p->gpio_chip, irqd_to_hwirq(d))) {
dev_err(p->gpio_chip.dev, dev_err(p->gpio_chip.dev,
"unable to lock HW IRQ %lu for IRQ\n", "unable to lock HW IRQ %lu for IRQ\n",
irqd_to_hwirq(d)); irqd_to_hwirq(d));
...@@ -116,7 +116,7 @@ static void em_gio_irq_relres(struct irq_data *d) ...@@ -116,7 +116,7 @@ static void em_gio_irq_relres(struct irq_data *d)
{ {
struct em_gio_priv *p = irq_data_get_irq_chip_data(d); struct em_gio_priv *p = irq_data_get_irq_chip_data(d);
gpio_unlock_as_irq(&p->gpio_chip, irqd_to_hwirq(d)); gpiochip_unlock_as_irq(&p->gpio_chip, irqd_to_hwirq(d));
} }
......
...@@ -444,7 +444,7 @@ static int mcp23s08_irq_reqres(struct irq_data *data) ...@@ -444,7 +444,7 @@ static int mcp23s08_irq_reqres(struct irq_data *data)
{ {
struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data);
if (gpio_lock_as_irq(&mcp->chip, data->hwirq)) { if (gpiochip_lock_as_irq(&mcp->chip, data->hwirq)) {
dev_err(mcp->chip.dev, dev_err(mcp->chip.dev,
"unable to lock HW IRQ %lu for IRQ usage\n", "unable to lock HW IRQ %lu for IRQ usage\n",
data->hwirq); data->hwirq);
...@@ -458,7 +458,7 @@ static void mcp23s08_irq_relres(struct irq_data *data) ...@@ -458,7 +458,7 @@ static void mcp23s08_irq_relres(struct irq_data *data)
{ {
struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data);
gpio_unlock_as_irq(&mcp->chip, data->hwirq); gpiochip_unlock_as_irq(&mcp->chip, data->hwirq);
} }
static struct irq_chip mcp23s08_irq_chip = { static struct irq_chip mcp23s08_irq_chip = {
......
...@@ -800,7 +800,7 @@ static void omap_gpio_irq_shutdown(struct irq_data *d) ...@@ -800,7 +800,7 @@ static void omap_gpio_irq_shutdown(struct irq_data *d)
unsigned offset = GPIO_INDEX(bank, gpio); unsigned offset = GPIO_INDEX(bank, gpio);
spin_lock_irqsave(&bank->lock, flags); spin_lock_irqsave(&bank->lock, flags);
gpio_unlock_as_irq(&bank->chip, offset); gpiochip_unlock_as_irq(&bank->chip, offset);
bank->irq_usage &= ~(BIT(offset)); bank->irq_usage &= ~(BIT(offset));
omap_disable_gpio_module(bank, offset); omap_disable_gpio_module(bank, offset);
omap_reset_gpio(bank, gpio); omap_reset_gpio(bank, gpio);
......
...@@ -233,7 +233,7 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -233,7 +233,7 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)
return -EINVAL; return -EINVAL;
} }
ret = gpio_lock_as_irq(&tegra_gpio_chip, gpio); ret = gpiochip_lock_as_irq(&tegra_gpio_chip, gpio);
if (ret) { if (ret) {
dev_err(dev, "unable to lock Tegra GPIO %d as IRQ\n", gpio); dev_err(dev, "unable to lock Tegra GPIO %d as IRQ\n", gpio);
return ret; return ret;
...@@ -263,7 +263,7 @@ static void tegra_gpio_irq_shutdown(struct irq_data *d) ...@@ -263,7 +263,7 @@ static void tegra_gpio_irq_shutdown(struct irq_data *d)
{ {
int gpio = d->hwirq; int gpio = d->hwirq;
gpio_unlock_as_irq(&tegra_gpio_chip, gpio); gpiochip_unlock_as_irq(&tegra_gpio_chip, gpio);
} }
static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
......
...@@ -138,7 +138,7 @@ static void unmask_giuint_low(struct irq_data *d) ...@@ -138,7 +138,7 @@ static void unmask_giuint_low(struct irq_data *d)
static unsigned int startup_giuint(struct irq_data *data) static unsigned int startup_giuint(struct irq_data *data)
{ {
if (gpio_lock_as_irq(&vr41xx_gpio_chip, data->hwirq)) if (gpiochip_lock_as_irq(&vr41xx_gpio_chip, data->hwirq))
dev_err(vr41xx_gpio_chip.dev, dev_err(vr41xx_gpio_chip.dev,
"unable to lock HW IRQ %lu for IRQ\n", "unable to lock HW IRQ %lu for IRQ\n",
data->hwirq); data->hwirq);
...@@ -150,7 +150,7 @@ static unsigned int startup_giuint(struct irq_data *data) ...@@ -150,7 +150,7 @@ static unsigned int startup_giuint(struct irq_data *data)
static void shutdown_giuint(struct irq_data *data) static void shutdown_giuint(struct irq_data *data)
{ {
mask_giuint_low(data); mask_giuint_low(data);
gpio_unlock_as_irq(&vr41xx_gpio_chip, data->hwirq); gpiochip_unlock_as_irq(&vr41xx_gpio_chip, data->hwirq);
} }
static struct irq_chip giuint_low_irq_chip = { static struct irq_chip giuint_low_irq_chip = {
......
...@@ -153,7 +153,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, ...@@ -153,7 +153,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
gpiod_direction_input(desc); gpiod_direction_input(desc);
ret = gpio_lock_as_irq(chip, pin); ret = gpiochip_lock_as_irq(chip, pin);
if (ret) { if (ret) {
dev_err(chip->dev, "Failed to lock GPIO as interrupt\n"); dev_err(chip->dev, "Failed to lock GPIO as interrupt\n");
goto fail_free_desc; goto fail_free_desc;
...@@ -209,7 +209,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, ...@@ -209,7 +209,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
fail_free_event: fail_free_event:
kfree(event); kfree(event);
fail_unlock_irq: fail_unlock_irq:
gpio_unlock_as_irq(chip, pin); gpiochip_unlock_as_irq(chip, pin);
fail_free_desc: fail_free_desc:
gpiochip_free_own_desc(desc); gpiochip_free_own_desc(desc);
...@@ -280,7 +280,7 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip) ...@@ -280,7 +280,7 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
desc = event->desc; desc = event->desc;
if (WARN_ON(IS_ERR(desc))) if (WARN_ON(IS_ERR(desc)))
continue; continue;
gpio_unlock_as_irq(chip, event->pin); gpiochip_unlock_as_irq(chip, event->pin);
gpiochip_free_own_desc(desc); gpiochip_free_own_desc(desc);
list_del(&event->node); list_del(&event->node);
kfree(event); kfree(event);
......
...@@ -161,7 +161,7 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev, ...@@ -161,7 +161,7 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,
desc->flags &= ~GPIO_TRIGGER_MASK; desc->flags &= ~GPIO_TRIGGER_MASK;
if (!gpio_flags) { if (!gpio_flags) {
gpio_unlock_as_irq(desc->chip, gpio_chip_hwgpio(desc)); gpiochip_unlock_as_irq(desc->chip, gpio_chip_hwgpio(desc));
ret = 0; ret = 0;
goto free_id; goto free_id;
} }
...@@ -200,7 +200,7 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev, ...@@ -200,7 +200,7 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,
if (ret < 0) if (ret < 0)
goto free_id; goto free_id;
ret = gpio_lock_as_irq(desc->chip, gpio_chip_hwgpio(desc)); ret = gpiochip_lock_as_irq(desc->chip, gpio_chip_hwgpio(desc));
if (ret < 0) { if (ret < 0) {
gpiod_warn(desc, "failed to flag the GPIO for IRQ\n"); gpiod_warn(desc, "failed to flag the GPIO for IRQ\n");
goto free_id; goto free_id;
......
...@@ -495,7 +495,7 @@ static int gpiochip_irq_reqres(struct irq_data *d) ...@@ -495,7 +495,7 @@ static int gpiochip_irq_reqres(struct irq_data *d)
{ {
struct gpio_chip *chip = irq_data_get_irq_chip_data(d); struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
if (gpio_lock_as_irq(chip, d->hwirq)) { if (gpiochip_lock_as_irq(chip, d->hwirq)) {
chip_err(chip, chip_err(chip,
"unable to lock HW IRQ %lu for IRQ\n", "unable to lock HW IRQ %lu for IRQ\n",
d->hwirq); d->hwirq);
...@@ -508,7 +508,7 @@ static void gpiochip_irq_relres(struct irq_data *d) ...@@ -508,7 +508,7 @@ static void gpiochip_irq_relres(struct irq_data *d)
{ {
struct gpio_chip *chip = irq_data_get_irq_chip_data(d); struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
gpio_unlock_as_irq(chip, d->hwirq); gpiochip_unlock_as_irq(chip, d->hwirq);
} }
static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset) static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset)
...@@ -1332,14 +1332,14 @@ int gpiod_to_irq(const struct gpio_desc *desc) ...@@ -1332,14 +1332,14 @@ int gpiod_to_irq(const struct gpio_desc *desc)
EXPORT_SYMBOL_GPL(gpiod_to_irq); EXPORT_SYMBOL_GPL(gpiod_to_irq);
/** /**
* gpio_lock_as_irq() - lock a GPIO to be used as IRQ * gpiochip_lock_as_irq() - lock a GPIO to be used as IRQ
* @chip: the chip the GPIO to lock belongs to * @chip: the chip the GPIO to lock belongs to
* @offset: the offset of the GPIO to lock as IRQ * @offset: the offset of the GPIO to lock as IRQ
* *
* This is used directly by GPIO drivers that want to lock down * This is used directly by GPIO drivers that want to lock down
* a certain GPIO line to be used for IRQs. * a certain GPIO line to be used for IRQs.
*/ */
int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset) int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
{ {
if (offset >= chip->ngpio) if (offset >= chip->ngpio)
return -EINVAL; return -EINVAL;
...@@ -1354,24 +1354,24 @@ int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset) ...@@ -1354,24 +1354,24 @@ int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
set_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags); set_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(gpio_lock_as_irq); EXPORT_SYMBOL_GPL(gpiochip_lock_as_irq);
/** /**
* gpio_unlock_as_irq() - unlock a GPIO used as IRQ * gpiochip_unlock_as_irq() - unlock a GPIO used as IRQ
* @chip: the chip the GPIO to lock belongs to * @chip: the chip the GPIO to lock belongs to
* @offset: the offset of the GPIO to lock as IRQ * @offset: the offset of the GPIO to lock as IRQ
* *
* This is used directly by GPIO drivers that want to indicate * This is used directly by GPIO drivers that want to indicate
* that a certain GPIO is no longer used exclusively for IRQ. * that a certain GPIO is no longer used exclusively for IRQ.
*/ */
void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset) void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset)
{ {
if (offset >= chip->ngpio) if (offset >= chip->ngpio)
return; return;
clear_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags); clear_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags);
} }
EXPORT_SYMBOL_GPL(gpio_unlock_as_irq); EXPORT_SYMBOL_GPL(gpiochip_unlock_as_irq);
/** /**
* gpiod_get_raw_value_cansleep() - return a gpio's raw value * gpiod_get_raw_value_cansleep() - return a gpio's raw value
......
...@@ -1472,7 +1472,7 @@ static unsigned int gpio_irq_startup(struct irq_data *d) ...@@ -1472,7 +1472,7 @@ static unsigned int gpio_irq_startup(struct irq_data *d)
unsigned pin = d->hwirq; unsigned pin = d->hwirq;
int ret; int ret;
ret = gpio_lock_as_irq(&at91_gpio->chip, pin); ret = gpiochip_lock_as_irq(&at91_gpio->chip, pin);
if (ret) { if (ret) {
dev_err(at91_gpio->chip.dev, "unable to lock pind %lu IRQ\n", dev_err(at91_gpio->chip.dev, "unable to lock pind %lu IRQ\n",
d->hwirq); d->hwirq);
...@@ -1488,7 +1488,7 @@ static void gpio_irq_shutdown(struct irq_data *d) ...@@ -1488,7 +1488,7 @@ static void gpio_irq_shutdown(struct irq_data *d)
unsigned pin = d->hwirq; unsigned pin = d->hwirq;
gpio_irq_mask(d); gpio_irq_mask(d);
gpio_unlock_as_irq(&at91_gpio->chip, pin); gpiochip_unlock_as_irq(&at91_gpio->chip, pin);
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -180,7 +180,7 @@ static int exynos_irq_request_resources(struct irq_data *irqd) ...@@ -180,7 +180,7 @@ static int exynos_irq_request_resources(struct irq_data *irqd)
unsigned int con; unsigned int con;
int ret; int ret;
ret = gpio_lock_as_irq(&bank->gpio_chip, irqd->hwirq); ret = gpiochip_lock_as_irq(&bank->gpio_chip, irqd->hwirq);
if (ret) { if (ret) {
dev_err(bank->gpio_chip.dev, "unable to lock pin %s-%lu IRQ\n", dev_err(bank->gpio_chip.dev, "unable to lock pin %s-%lu IRQ\n",
bank->name, irqd->hwirq); bank->name, irqd->hwirq);
...@@ -233,7 +233,7 @@ static void exynos_irq_release_resources(struct irq_data *irqd) ...@@ -233,7 +233,7 @@ static void exynos_irq_release_resources(struct irq_data *irqd)
spin_unlock_irqrestore(&bank->slock, flags); spin_unlock_irqrestore(&bank->slock, flags);
gpio_unlock_as_irq(&bank->gpio_chip, irqd->hwirq); gpiochip_unlock_as_irq(&bank->gpio_chip, irqd->hwirq);
} }
/* /*
......
...@@ -553,7 +553,7 @@ static int sunxi_pinctrl_irq_request_resources(struct irq_data *d) ...@@ -553,7 +553,7 @@ static int sunxi_pinctrl_irq_request_resources(struct irq_data *d)
if (!func) if (!func)
return -EINVAL; return -EINVAL;
ret = gpio_lock_as_irq(pctl->chip, ret = gpiochip_lock_as_irq(pctl->chip,
pctl->irq_array[d->hwirq] - pctl->desc->pin_base); pctl->irq_array[d->hwirq] - pctl->desc->pin_base);
if (ret) { if (ret) {
dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n", dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n",
...@@ -571,8 +571,8 @@ static void sunxi_pinctrl_irq_release_resources(struct irq_data *d) ...@@ -571,8 +571,8 @@ static void sunxi_pinctrl_irq_release_resources(struct irq_data *d)
{ {
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
gpio_unlock_as_irq(pctl->chip, gpiochip_unlock_as_irq(pctl->chip,
pctl->irq_array[d->hwirq] - pctl->desc->pin_base); pctl->irq_array[d->hwirq] - pctl->desc->pin_base);
} }
static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type) static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
......
...@@ -216,14 +216,15 @@ static inline int gpio_to_irq(unsigned gpio) ...@@ -216,14 +216,15 @@ static inline int gpio_to_irq(unsigned gpio)
return -EINVAL; return -EINVAL;
} }
static inline int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset) static inline int gpiochip_lock_as_irq(struct gpio_chip *chip,
unsigned int offset)
{ {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
static inline void gpio_unlock_as_irq(struct gpio_chip *chip, static inline void gpiochip_unlock_as_irq(struct gpio_chip *chip,
unsigned int offset) unsigned int offset)
{ {
WARN_ON(1); WARN_ON(1);
} }
......
...@@ -149,8 +149,8 @@ extern struct gpio_chip *gpiochip_find(void *data, ...@@ -149,8 +149,8 @@ extern struct gpio_chip *gpiochip_find(void *data,
int (*match)(struct gpio_chip *chip, void *data)); int (*match)(struct gpio_chip *chip, void *data));
/* lock/unlock as IRQ */ /* lock/unlock as IRQ */
int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset); int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset);
void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset); void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset);
struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc); struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment