Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9dde0ae3 authored by Richard Cochran's avatar Richard Cochran Committed by Arnd Bergmann
Browse files

ixp4xx: fix compilation by adding gpiolib support



Once again, ixp4xx no longer even compiles. This patch fixes the issue
by converting over to gpiolib. This patch was first made by Imre and
posted by Marc, and I added in Russell's suggestion to empty the gpio
header file.

This fix should also go for 3.1, 3.2, 3.3, and 3.4.

Signed-off-by: default avatarRichard Cochran <richardcochran@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 76e10d15
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -556,7 +556,7 @@ config ARCH_IXP4XX
	select ARCH_HAS_DMA_SET_COHERENT_MASK
	select CLKSRC_MMIO
	select CPU_XSCALE
	select GENERIC_GPIO
	select ARCH_REQUIRE_GPIOLIB
	select GENERIC_CLOCKEVENTS
	select MIGHT_HAVE_PCI
	select NEED_MACH_IO_H
+46 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/clockchips.h>
#include <linux/io.h>
#include <linux/export.h>
#include <linux/gpio.h>

#include <mach/udc.h>
#include <mach/hardware.h>
@@ -107,7 +108,7 @@ static signed char irq2gpio[32] = {
	 7,  8,  9, 10, 11, 12, -1, -1,
};

int gpio_to_irq(int gpio)
static int ixp4xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
{
	int irq;

@@ -117,7 +118,6 @@ int gpio_to_irq(int gpio)
	}
	return -EINVAL;
}
EXPORT_SYMBOL(gpio_to_irq);

int irq_to_gpio(unsigned int irq)
{
@@ -383,12 +383,56 @@ static struct platform_device *ixp46x_devices[] __initdata = {
unsigned long ixp4xx_exp_bus_size;
EXPORT_SYMBOL(ixp4xx_exp_bus_size);

static int ixp4xx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
{
	gpio_line_config(gpio, IXP4XX_GPIO_IN);

	return 0;
}

static int ixp4xx_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
					int level)
{
	gpio_line_set(gpio, level);
	gpio_line_config(gpio, IXP4XX_GPIO_OUT);

	return 0;
}

static int ixp4xx_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
{
	int value;

	gpio_line_get(gpio, &value);

	return value;
}

static void ixp4xx_gpio_set_value(struct gpio_chip *chip, unsigned gpio,
				  int value)
{
	gpio_line_set(gpio, value);
}

static struct gpio_chip ixp4xx_gpio_chip = {
	.label			= "IXP4XX_GPIO_CHIP",
	.direction_input	= ixp4xx_gpio_direction_input,
	.direction_output	= ixp4xx_gpio_direction_output,
	.get			= ixp4xx_gpio_get_value,
	.set			= ixp4xx_gpio_set_value,
	.to_irq			= ixp4xx_gpio_to_irq,
	.base			= 0,
	.ngpio			= 16,
};

void __init ixp4xx_sys_init(void)
{
	ixp4xx_exp_bus_size = SZ_16M;

	platform_add_devices(ixp4xx_devices, ARRAY_SIZE(ixp4xx_devices));

	gpiochip_add(&ixp4xx_gpio_chip);

	if (cpu_is_ixp46x()) {
		int region;

+1 −78
Original line number Diff line number Diff line
/*
 * arch/arm/mach-ixp4xx/include/mach/gpio.h
 *
 * IXP4XX GPIO wrappers for arch-neutral GPIO calls
 *
 * Written by Milan Svoboda <msvoboda@ra.rockwell.com>
 * Based on PXA implementation by Philipp Zabel <philipp.zabel@gmail.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
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#ifndef __ASM_ARCH_IXP4XX_GPIO_H
#define __ASM_ARCH_IXP4XX_GPIO_H

#include <linux/kernel.h>
#include <mach/hardware.h>

#define __ARM_GPIOLIB_COMPLEX

static inline int gpio_request(unsigned gpio, const char *label)
{
	return 0;
}

static inline void gpio_free(unsigned gpio)
{
	might_sleep();

	return;
}

static inline int gpio_direction_input(unsigned gpio)
{
	gpio_line_config(gpio, IXP4XX_GPIO_IN);
	return 0;
}

static inline int gpio_direction_output(unsigned gpio, int level)
{
	gpio_line_set(gpio, level);
	gpio_line_config(gpio, IXP4XX_GPIO_OUT);
	return 0;
}

static inline int gpio_get_value(unsigned gpio)
{
	int value;

	gpio_line_get(gpio, &value);

	return value;
}

static inline void gpio_set_value(unsigned gpio, int value)
{
	gpio_line_set(gpio, value);
}

#include <asm-generic/gpio.h>			/* cansleep wrappers */

extern int gpio_to_irq(int gpio);
#define gpio_to_irq gpio_to_irq
extern int irq_to_gpio(unsigned int irq);

#endif
/* empty */