From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E5F04C47089 for ; Tue, 6 Dec 2022 00:48:39 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6C3428532A; Tue, 6 Dec 2022 01:47:58 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by phobos.denx.de (Postfix, from userid 109) id 5B07D852F4; Tue, 6 Dec 2022 01:47:39 +0100 (CET) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by phobos.denx.de (Postfix) with ESMTP id 3A8308532A for ; Tue, 6 Dec 2022 01:47:31 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=andre.przywara@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 31B8923A; Mon, 5 Dec 2022 16:47:37 -0800 (PST) Received: from slackpad.fritz.box (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7A0D53F73B; Mon, 5 Dec 2022 16:47:29 -0800 (PST) From: Andre Przywara To: Samuel Holland , Jagan Teki Cc: u-boot@lists.denx.de, Icenowy Zheng , Jernej Skrabec Subject: [RFC PATCH 04/17] pinctrl: sunxi: add GPIO in/out wrappers Date: Tue, 6 Dec 2022 00:45:36 +0000 Message-Id: <20221206004549.29015-5-andre.przywara@arm.com> X-Mailer: git-send-email 2.35.5 In-Reply-To: <20221206004549.29015-1-andre.przywara@arm.com> References: <20221206004549.29015-1-andre.przywara@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean So far we were open-coding the pincontroller's GPIO output/input access in each function using that. Provide two functions that wrap that nicely, so users don't need to know about the internals, and we can abstract the new D1 pinctrl more easily. Signed-off-by: Andre Przywara --- arch/arm/include/asm/arch-sunxi/gpio.h | 2 ++ arch/arm/mach-sunxi/pinmux.c | 10 ++++++++++ drivers/gpio/sunxi_gpio.c | 26 +++++--------------------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/arch/arm/include/asm/arch-sunxi/gpio.h b/arch/arm/include/asm/arch-sunxi/gpio.h index 8333810a69f..42ca03d8c18 100644 --- a/arch/arm/include/asm/arch-sunxi/gpio.h +++ b/arch/arm/include/asm/arch-sunxi/gpio.h @@ -211,6 +211,8 @@ void sunxi_gpio_set_cfgbank(void *bank_base, int pin_offset, u32 val); void sunxi_gpio_set_cfgpin(u32 pin, u32 val); int sunxi_gpio_get_cfgbank(void *bank_base, int pin_offset); int sunxi_gpio_get_cfgpin(u32 pin); +void sunxi_gpio_set_output_bank(void *bank_base, u32 clear_mask, u32 set_mask); +u32 sunxi_gpio_get_output_bank(void *bank_base); void sunxi_gpio_set_drv(u32 pin, u32 val); void sunxi_gpio_set_drv_bank(void *bank_base, u32 pin_offset, u32 val); void sunxi_gpio_set_pull(u32 pin, u32 val); diff --git a/arch/arm/mach-sunxi/pinmux.c b/arch/arm/mach-sunxi/pinmux.c index b650f6b1aea..91acbf9269f 100644 --- a/arch/arm/mach-sunxi/pinmux.c +++ b/arch/arm/mach-sunxi/pinmux.c @@ -46,6 +46,16 @@ int sunxi_gpio_get_cfgpin(u32 pin) return sunxi_gpio_get_cfgbank(bank_base, pin % 32); } +void sunxi_gpio_set_output_bank(void *bank_base, u32 clear_mask, u32 set_mask) +{ + clrsetbits_le32(bank_base + GPIO_DAT_REG_OFFSET, clear_mask, set_mask); +} + +u32 sunxi_gpio_get_output_bank(void *bank_base) +{ + return readl(bank_base + GPIO_DAT_REG_OFFSET); +} + void sunxi_gpio_set_drv(u32 pin, u32 val) { u32 bank = GPIO_BANK(pin); diff --git a/drivers/gpio/sunxi_gpio.c b/drivers/gpio/sunxi_gpio.c index 1bf691a204a..767996c10fc 100644 --- a/drivers/gpio/sunxi_gpio.c +++ b/drivers/gpio/sunxi_gpio.c @@ -21,33 +21,22 @@ #if !CONFIG_IS_ENABLED(DM_GPIO) static int sunxi_gpio_output(u32 pin, u32 val) { - u32 dat; u32 bank = GPIO_BANK(pin); u32 num = GPIO_NUM(pin); void *pio = BANK_TO_GPIO(bank); - dat = readl(pio + 0x10); - if (val) - dat |= 0x1 << num; - else - dat &= ~(0x1 << num); - - writel(dat, pio + 0x10); - + sunxi_gpio_set_output_bank(pio, val ? 0 : 1U << num, + val ? 1U << num : 0); return 0; } static int sunxi_gpio_input(u32 pin) { - u32 dat; u32 bank = GPIO_BANK(pin); u32 num = GPIO_NUM(pin); void *pio = BANK_TO_GPIO(bank); - dat = readl(pio + 0x10); - dat >>= num; - - return dat & 0x1; + return (sunxi_gpio_get_output_bank(pio) >> num) & 0x1; } int gpio_request(unsigned gpio, const char *label) @@ -136,12 +125,8 @@ static int sunxi_gpio_get_value(struct udevice *dev, unsigned offset) { struct sunxi_gpio_plat *plat = dev_get_plat(dev); u32 num = GPIO_NUM(offset); - unsigned dat; - - dat = readl(plat->regs + GPIO_DAT_REG_OFFSET); - dat >>= num; - return dat & 0x1; + return (sunxi_gpio_get_output_bank(plat->regs) >> num) & 0x1; } static int sunxi_gpio_get_function(struct udevice *dev, unsigned offset) @@ -181,8 +166,7 @@ static int sunxi_gpio_set_flags(struct udevice *dev, unsigned int offset, u32 value = !!(flags & GPIOD_IS_OUT_ACTIVE); u32 num = GPIO_NUM(offset); - clrsetbits_le32(plat->regs + GPIO_DAT_REG_OFFSET, - 1 << num, value << num); + sunxi_gpio_set_output_bank(plat->regs, 1U << num, value << num); sunxi_gpio_set_cfgbank(plat->regs, offset, SUNXI_GPIO_OUTPUT); } else if (flags & GPIOD_IS_IN) { u32 pull = 0; -- 2.35.5