Commit cbfb3ea7 authored by Huacai Chen's avatar Huacai Chen Committed by Linus Walleij
Browse files

gpio: loongson: Add Loongson-3A/3B GPIO driver support



Improve Loongson-2's GPIO driver to support Loongson-3A/3B, and update
Loongson-3's default config file.

Acked-by: default avatarRalf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarHuacai Chen <chenhc@lemote.com>
Reviewed-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 991ff4e3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1245,6 +1245,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.
+1 −0
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -509,10 +509,10 @@ config GPIO_GRGPIO
	  VHDL IP core library.

config GPIO_LOONGSON
	bool "Loongson-2 GPIO support"
	depends on CPU_LOONGSON2
	bool "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
+27 −17
Original line number Diff line number Diff line
/*
 *  STLS2F GPIO Support
 *  Loongson-2F/3A/3B GPIO Support
 *
 *  Copyright (c) 2008 Richard Liu,  STMicroelectronics	 <richard.liu@st.com>
 *  Copyright (c) 2008-2010 Arnaud Patard <apatard@mandriva.com>
 *  Copyright (c) 2013 Hongbing Hu <huhb@lemote.com>
 *  Copyright (c) 2014 Huacai Chen <chenhc@lemote.com>
 *
 *  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,11 +22,19 @@
#include <linux/gpio.h>

#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);

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;
@@ -39,7 +49,7 @@ 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;
@@ -56,12 +66,12 @@ 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)
{
	u32 val;
	u32 mask;

	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);
@@ -69,7 +79,7 @@ static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
	return (val & mask) != 0;
}

static void ls2f_gpio_set_value(struct gpio_chip *chip,
static void loongson_gpio_set_value(struct gpio_chip *chip,
		unsigned gpio, int value)
{
	u32 val;
@@ -87,19 +97,19 @@ static void ls2f_gpio_set_value(struct gpio_chip *chip,
	spin_unlock(&gpio_lock);
}

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,
	.can_sleep		= false,
};

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);