From patchwork Mon Aug 7 11:01:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Simek X-Patchwork-Id: 798586 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=monstr-eu.20150623.gappssmtp.com header.i=@monstr-eu.20150623.gappssmtp.com header.b="pi/u8JGO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xQvm02gR7z9t1t for ; Mon, 7 Aug 2017 21:03:44 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753193AbdHGLDm (ORCPT ); Mon, 7 Aug 2017 07:03:42 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:35742 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753014AbdHGLCL (ORCPT ); Mon, 7 Aug 2017 07:02:11 -0400 Received: by mail-wm0-f66.google.com with SMTP id r77so611612wmd.2 for ; Mon, 07 Aug 2017 04:02:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monstr-eu.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=Ay4pfBaTmVs5IclXOIkfv8BMwK/kiaD7dA7n60Yc+eo=; b=pi/u8JGOQpjvlb992ZpTLNqYMHXPrgEzCmgHT0SX2AqHk+iaIh1iKtBOqG16LrEbxd vsjXKNpdRn3OXZVBjCo2xt3qMXEYnjhm9Rh/vznyhczRtEU04LwL8Qwc2BF9inIENWGH x9b3hozXfkmLJWnrxDxtgak7o4CEwYe5VsJk3NFOssRr21CXOFE80yuE4jO+RRAuAnrP BHB3WQ1YE8aOV9sGCzAnqUGxXuSj9I5TiIknPJnotm0CejcnRL7PQxJ2rUIDI9TuD/9Q ZMXpVtfGqPv4kNWBGR0DK+jf1y7Imc/EX1UgTPBB2JlpSe+7mTAERddgWF9uJWm6q3De FcmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:in-reply-to:references; bh=Ay4pfBaTmVs5IclXOIkfv8BMwK/kiaD7dA7n60Yc+eo=; b=X+UBBOHnDRNwCwHk3CSrQosfrXl/FSS0FGzWPwNYzTfLn1ngPOfKPwHvGAk8VOJKdE wcCkC1HLZuXXhWkNx2u7CGDhfHLCCKfOL0SkBNnsB3RotdgOXnXerhkP/OcVUYNEyjRq eBF2N8rruqT7RhnmC84ztFO9jIHL47/fFYjkTfb4ITr7C1UzcyaPy7+33VPOqRxgvHhS uYOsVVlIl2P/fFZwbnCWt3cB66M8B3I3km2rcYQDD7sddZJatra8deRpVCgUEVuQ3pZi ugcw+MELROTgvVnBsqzIrDu9khfNR7SvEQ3BL9IznBP/YByLz7TV6KX2DxvGNCRv4Kju nBKw== X-Gm-Message-State: AHYfb5jJyehHC8ohJE/wa8fPPEXqYCUqykqfjB9lAgRY93vYjvL28Gk/ HKMzX+Q5SX170g6z X-Received: by 10.28.111.206 with SMTP id c75mr437427wmi.36.1502103729094; Mon, 07 Aug 2017 04:02:09 -0700 (PDT) Received: from localhost (nat-35.starnet.cz. [178.255.168.35]) by smtp.gmail.com with ESMTPSA id n7sm18388147wrb.37.2017.08.07.04.02.08 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 07 Aug 2017 04:02:08 -0700 (PDT) From: Michal Simek To: linux-kernel@vger.kernel.org, monstr@monstr.eu Cc: Swapna Manupati , =?UTF-8?q?S=C3=B6ren=20Brinkmann?= , Steffen Trumtrar , Linus Walleij , Peter Crosthwaite , linux-gpio@vger.kernel.org, Rob Herring , Josh Cartwright , linux-arm-kernel@lists.infradead.org Subject: [PATCH 4/8] gpio: zynq: Provided workaround for GPIO Date: Mon, 7 Aug 2017 13:01:57 +0200 Message-Id: <4f1f7ed79879d17e38ffda095d631d0f561c2818.1502103715.git.michal.simek@xilinx.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org From: Swapna Manupati This patch provides workaround in the gpio driver for Zynq and ZynqMP Platforms by reading pin value of EMIO banks through DATA register as it was unable to read the value of it from DATA_RO register. Signed-off-by: Swapna Manupati Signed-off-by: Michal Simek --- drivers/gpio/gpio-zynq.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c index bcf11f0ef5c3..1ab0f8c991b6 100644 --- a/drivers/gpio/gpio-zynq.c +++ b/drivers/gpio/gpio-zynq.c @@ -70,6 +70,7 @@ /* MSW Mask & Data -WO */ #define ZYNQ_GPIO_DATA_MSW_OFFSET(BANK) (0x004 + (8 * BANK)) /* Data Register-RW */ +#define ZYNQ_GPIO_DATA_OFFSET(BANK) (0x040 + (4 * BANK)) #define ZYNQ_GPIO_DATA_RO_OFFSET(BANK) (0x060 + (4 * BANK)) /* Direction mode reg-RW */ #define ZYNQ_GPIO_DIRM_OFFSET(BANK) (0x204 + (0x40 * BANK)) @@ -101,6 +102,7 @@ /* set to differentiate zynq from zynqmp, 0=zynqmp, 1=zynq */ #define ZYNQ_GPIO_QUIRK_IS_ZYNQ BIT(0) +#define GPIO_QUIRK_DATA_RO_BUG BIT(1) struct gpio_regs { u32 datamsw[ZYNQMP_GPIO_MAX_BANK]; @@ -163,6 +165,17 @@ static int zynq_gpio_is_zynq(struct zynq_gpio *gpio) } /** + * gpio_data_ro_bug - test if HW bug exists or not + * @gpio: Pointer to driver data struct + * + * Return: 0 if bug doesnot exist, 1 if bug exists. + */ +static int gpio_data_ro_bug(struct zynq_gpio *gpio) +{ + return !!(gpio->p_data->quirks & GPIO_QUIRK_DATA_RO_BUG); +} + +/** * zynq_gpio_get_bank_pin - Get the bank number and pin number within that bank * for a given pin in the GPIO device * @pin_num: gpio pin number within the device @@ -213,9 +226,28 @@ static int zynq_gpio_get_value(struct gpio_chip *chip, unsigned int pin) zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); - data = readl_relaxed(gpio->base_addr + - ZYNQ_GPIO_DATA_RO_OFFSET(bank_num)); - + if (gpio_data_ro_bug(gpio)) { + if (zynq_gpio_is_zynq(gpio)) { + if (bank_num <= 1) { + data = readl_relaxed(gpio->base_addr + + ZYNQ_GPIO_DATA_RO_OFFSET(bank_num)); + } else { + data = readl_relaxed(gpio->base_addr + + ZYNQ_GPIO_DATA_OFFSET(bank_num)); + } + } else { + if (bank_num <= 2) { + data = readl_relaxed(gpio->base_addr + + ZYNQ_GPIO_DATA_RO_OFFSET(bank_num)); + } else { + data = readl_relaxed(gpio->base_addr + + ZYNQ_GPIO_DATA_OFFSET(bank_num)); + } + } + } else { + data = readl_relaxed(gpio->base_addr + + ZYNQ_GPIO_DATA_RO_OFFSET(bank_num)); + } return (data >> bank_pin_num) & 1; } @@ -743,6 +775,7 @@ static void zynq_gpio_free(struct gpio_chip *chip, unsigned offset) static const struct zynq_platform_data zynqmp_gpio_def = { .label = "zynqmp_gpio", + .quirks = GPIO_QUIRK_DATA_RO_BUG, .ngpio = ZYNQMP_GPIO_NR_GPIOS, .max_bank = ZYNQMP_GPIO_MAX_BANK, .bank_min[0] = ZYNQ_GPIO_BANK0_PIN_MIN(MP), @@ -761,7 +794,7 @@ static void zynq_gpio_free(struct gpio_chip *chip, unsigned offset) static const struct zynq_platform_data zynq_gpio_def = { .label = "zynq_gpio", - .quirks = ZYNQ_GPIO_QUIRK_IS_ZYNQ, + .quirks = ZYNQ_GPIO_QUIRK_IS_ZYNQ | GPIO_QUIRK_DATA_RO_BUG, .ngpio = ZYNQ_GPIO_NR_GPIOS, .max_bank = ZYNQ_GPIO_MAX_BANK, .bank_min[0] = ZYNQ_GPIO_BANK0_PIN_MIN(),