From patchwork Thu Nov 13 15:13:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huacai Chen X-Patchwork-Id: 410455 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 829EF1400B6 for ; Fri, 14 Nov 2014 02:13:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933378AbaKMPNP (ORCPT ); Thu, 13 Nov 2014 10:13:15 -0500 Received: from mail-pd0-f175.google.com ([209.85.192.175]:38455 "EHLO mail-pd0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933567AbaKMPNN (ORCPT ); Thu, 13 Nov 2014 10:13:13 -0500 Received: by mail-pd0-f175.google.com with SMTP id y13so14767443pdi.34 for ; Thu, 13 Nov 2014 07:13:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=Md2RiBYP2LjmkuViEnq028dTUz2CvR8lU2iMeV6Sdes=; b=QwnpSU+XrjIFdsfzNv1pVz1mrXctlKNgoHpdk1Oxv2DlkY9DiAji9MrO7wk49Rxi/u 3O8VlgHawhUWaIoBI42ykAd9MeKvQc1Nb3yl9uKCKO6Lpb3p8n5WGC7Rcbp83O02PZkV 1lwBDas31nk/Sa1FxxLeg0H8KKi8IklKl+KA/bwsoO+VL8xFmfTxL7tikpx9hvHT0yUK A5VoMpei6VDlmUFlZ2qaqTvprZyqUDTDOctQFsj6pmZ9/96jVyoOFdqRqIa0/Ncdj+Sr wP5l1M5dZnAMRwoJcDrdX5fg1bCqHWSC45RpWphQvvExmvtqlCweMA7elWnhKJmAjq+G S/8g== X-Received: by 10.70.126.194 with SMTP id na2mr3275694pdb.39.1415891593315; Thu, 13 Nov 2014 07:13:13 -0800 (PST) Received: from localhost.localdomain ([222.92.8.142]) by mx.google.com with ESMTPSA id bv3sm25184704pdb.32.2014.11.13.07.13.10 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 13 Nov 2014 07:13:12 -0800 (PST) From: Huacai Chen To: Ralf Baechle Cc: John Crispin , "Steven J. Hill" , linux-mips@linux-mips.org, Fuxin Zhang , Zhangjin Wu , linux-gpio@vger.kernel.org, Huacai Chen Subject: [PATCH V4 3/6] GPIO: Add Loongson-3A/3B GPIO driver support Date: Thu, 13 Nov 2014 23:13:02 +0800 Message-Id: <1415891582-9309-1-git-send-email-chenhc@lemote.com> X-Mailer: git-send-email 1.7.7.3 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Improve Loongson-2's GPIO driver to support Loongson-3A/3B, and update Loongson-3's default config file. Signed-off-by: Huacai Chen --- arch/mips/Kconfig | 1 + arch/mips/configs/loongson3_defconfig | 1 + drivers/gpio/Kconfig | 6 ++-- drivers/gpio/gpio-loongson.c | 54 +++++++++++++++++++------------- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 07bb4d9..7089df9 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1220,6 +1220,7 @@ config CPU_LOONGSON3 select CPU_SUPPORTS_HUGEPAGES select WEAK_ORDERING select WEAK_REORDERING_BEYOND_LLSC + select ARCH_REQUIRE_GPIOLIB help The Loongson 3 processor implements the MIPS64R2 instruction set with many extensions. diff --git a/arch/mips/configs/loongson3_defconfig b/arch/mips/configs/loongson3_defconfig index 1c6191e..e7a9bb4 100644 --- a/arch/mips/configs/loongson3_defconfig +++ b/arch/mips/configs/loongson3_defconfig @@ -243,6 +243,7 @@ CONFIG_HW_RANDOM=y CONFIG_RAW_DRIVER=m CONFIG_I2C_CHARDEV=y CONFIG_I2C_PIIX4=y +CONFIG_GPIO_LOONGSON=y CONFIG_SENSORS_LM75=m CONFIG_SENSORS_LM93=m CONFIG_SENSORS_W83627HF=m diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index bc5ffac..1ef82b2 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -453,10 +453,10 @@ config GPIO_GRGPIO VHDL IP core library. config GPIO_LOONGSON - tristate "Loongson-2 GPIO support" - depends on CPU_LOONGSON2 + tristate "Loongson-2/3 GPIO support" + depends on CPU_LOONGSON2 || CPU_LOONGSON3 help - driver for GPIO functionality on Loongson-2F processors. + driver for GPIO functionality on Loongson-2F/3A/3B processors. config GPIO_TB10X bool diff --git a/drivers/gpio/gpio-loongson.c b/drivers/gpio/gpio-loongson.c index 29dbaa2..f3351c7 100644 --- a/drivers/gpio/gpio-loongson.c +++ b/drivers/gpio/gpio-loongson.c @@ -1,8 +1,10 @@ /* - * STLS2F GPIO Support + * Loongson-2F/3A/3B GPIO Support * * Copyright (c) 2008 Richard Liu, STMicroelectronics * Copyright (c) 2008-2010 Arnaud Patard + * Copyright (c) 2013 Hongbing Hu + * Copyright (c) 2014 Huacai Chen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +22,15 @@ #include #define STLS2F_N_GPIO 4 -#define STLS2F_GPIO_IN_OFFSET 16 +#define STLS3A_N_GPIO 16 + +#ifdef CONFIG_CPU_LOONGSON3 +#define LOONGSON_N_GPIO STLS3A_N_GPIO +#else +#define LOONGSON_N_GPIO STLS2F_N_GPIO +#endif + +#define LOONGSON_GPIO_IN_OFFSET 16 static DEFINE_SPINLOCK(gpio_lock); @@ -29,10 +39,10 @@ int gpio_get_value(unsigned gpio) u32 val; u32 mask; - if (gpio >= STLS2F_N_GPIO) + if (gpio >= LOONGSON_N_GPIO) return __gpio_get_value(gpio); - mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET); + mask = 1 << (gpio + LOONGSON_GPIO_IN_OFFSET); spin_lock(&gpio_lock); val = LOONGSON_GPIODATA; spin_unlock(&gpio_lock); @@ -46,7 +56,7 @@ void gpio_set_value(unsigned gpio, int state) u32 val; u32 mask; - if (gpio >= STLS2F_N_GPIO) { + if (gpio >= LOONGSON_N_GPIO) { __gpio_set_value(gpio, state); return ; } @@ -66,19 +76,19 @@ EXPORT_SYMBOL(gpio_set_value); int gpio_cansleep(unsigned gpio) { - if (gpio < STLS2F_N_GPIO) + if (gpio < LOONGSON_N_GPIO) return 0; else return __gpio_cansleep(gpio); } EXPORT_SYMBOL(gpio_cansleep); -static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) +static int loongson_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) { u32 temp; u32 mask; - if (gpio >= STLS2F_N_GPIO) + if (gpio >= LOONGSON_N_GPIO) return -EINVAL; spin_lock(&gpio_lock); @@ -91,13 +101,13 @@ static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) return 0; } -static int ls2f_gpio_direction_output(struct gpio_chip *chip, +static int loongson_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int level) { u32 temp; u32 mask; - if (gpio >= STLS2F_N_GPIO) + if (gpio >= LOONGSON_N_GPIO) return -EINVAL; gpio_set_value(gpio, level); @@ -111,29 +121,29 @@ static int ls2f_gpio_direction_output(struct gpio_chip *chip, return 0; } -static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio) +static int loongson_gpio_get_value(struct gpio_chip *chip, unsigned gpio) { return gpio_get_value(gpio); } -static void ls2f_gpio_set_value(struct gpio_chip *chip, +static void loongson_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value) { gpio_set_value(gpio, value); } -static struct gpio_chip ls2f_chip = { - .label = "ls2f", - .direction_input = ls2f_gpio_direction_input, - .get = ls2f_gpio_get_value, - .direction_output = ls2f_gpio_direction_output, - .set = ls2f_gpio_set_value, +static struct gpio_chip loongson_chip = { + .label = "Loongson-gpio-chip", + .direction_input = loongson_gpio_direction_input, + .get = loongson_gpio_get_value, + .direction_output = loongson_gpio_direction_output, + .set = loongson_gpio_set_value, .base = 0, - .ngpio = STLS2F_N_GPIO, + .ngpio = LOONGSON_N_GPIO, }; -static int __init ls2f_gpio_setup(void) +static int __init loongson_gpio_setup(void) { - return gpiochip_add(&ls2f_chip); + return gpiochip_add(&loongson_chip); } -arch_initcall(ls2f_gpio_setup); +postcore_initcall(loongson_gpio_setup);