From mboxrd@z Thu Jan 1 00:00:00 1970 From: Grygorii Strashko Subject: [PATCH 1/4] gpio: syscon: add soc specific callback to assign output value Date: Wed, 13 Aug 2014 19:16:19 +0300 Message-ID: <1407946582-20927-2-git-send-email-grygorii.strashko@ti.com> References: <1407946582-20927-1-git-send-email-grygorii.strashko@ti.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1407946582-20927-1-git-send-email-grygorii.strashko@ti.com> Sender: linux-gpio-owner@vger.kernel.org To: Linus Walleij , santosh.shilimkar@ti.com, shc_work@mail.ru, linux-gpio@vger.kernel.org Cc: Rob Herring , Alexandre Courbot , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Grygorii Strashko List-Id: devicetree@vger.kernel.org Some SoCs (like Keystone) may require to perform special sequence of operations to assign output GPIO value, so default implementation of .set() callback from gpio-syscon driver can't be used. Hence, add optional, SoC specific callback to assign output gpio value. Signed-off-by: Grygorii Strashko --- drivers/gpio/gpio-syscon.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpio/gpio-syscon.c b/drivers/gpio/gpio-syscon.c index 30884fb..03b4699 100644 --- a/drivers/gpio/gpio-syscon.c +++ b/drivers/gpio/gpio-syscon.c @@ -37,6 +37,8 @@ * dat_bit_offset: Offset (in bits) to the first GPIO bit. * dir_bit_offset: Optional offset (in bits) to the first bit to switch * GPIO direction (Used with GPIO_SYSCON_FEAT_DIR flag). + * set: HW specific callback to assigns output value + * for signal "offset" */ struct syscon_gpio_data { @@ -45,6 +47,8 @@ struct syscon_gpio_data { unsigned int bit_count; unsigned int dat_bit_offset; unsigned int dir_bit_offset; + void (*set)(struct gpio_chip *chip, + unsigned offset, int value); }; struct syscon_gpio_priv { @@ -77,6 +81,11 @@ static void syscon_gpio_set(struct gpio_chip *chip, unsigned offset, int val) struct syscon_gpio_priv *priv = to_syscon_gpio(chip); unsigned int offs = priv->data->dat_bit_offset + offset; + if (priv->data->set) { + priv->data->set(chip, offset, val); + return; + } + regmap_update_bits(priv->syscon, (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE, BIT(offs % SYSCON_REG_BITS), -- 1.7.9.5