Commit 7bd18221 authored by Sascha Hauer's avatar Sascha Hauer
Browse files

[ARM] MX1/MX2: simplify mxc_gpio_setup_multiple_pins



mxc_gpio_setup_multiple_pins used to take several ALLOC_MODE flags. Most
of them are unused, so simplify the function by removing the flags. Also,
instead of using a confusing MXC_GPIO_ALLOC_MODE_RELEASE flag in a function
having alloc in its name, add a mxc_gpio_release_multiple_pins function.

Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
parent d1900d3a
Loading
Loading
Loading
Loading
+26 −35
Original line number Diff line number Diff line
@@ -68,15 +68,14 @@ static int mxc_uart0_pins[] = {
static int uart_mxc_port0_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart0_pins,
			ARRAY_SIZE(mxc_uart0_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART0");
			ARRAY_SIZE(mxc_uart0_pins), "UART0");
}

static int uart_mxc_port0_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart0_pins,
			ARRAY_SIZE(mxc_uart0_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART0");
	mxc_gpio_release_multiple_pins(mxc_uart0_pins,
			ARRAY_SIZE(mxc_uart0_pins));
	return 0;
}

static int mxc_uart1_pins[] = {
@@ -89,15 +88,14 @@ static int mxc_uart1_pins[] = {
static int uart_mxc_port1_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
			ARRAY_SIZE(mxc_uart1_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART1");
			ARRAY_SIZE(mxc_uart1_pins), "UART1");
}

static int uart_mxc_port1_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
			ARRAY_SIZE(mxc_uart1_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART1");
	mxc_gpio_setup_release_pins(mxc_uart1_pins,
			ARRAY_SIZE(mxc_uart1_pins));
	return 0;
}

static int mxc_uart2_pins[] = {
@@ -110,15 +108,14 @@ static int mxc_uart2_pins[] = {
static int uart_mxc_port2_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
			ARRAY_SIZE(mxc_uart2_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART2");
			ARRAY_SIZE(mxc_uart2_pins), "UART2");
}

static int uart_mxc_port2_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
			ARRAY_SIZE(mxc_uart2_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART2");
	mxc_gpio_release_multiple_pins(mxc_uart2_pins,
			ARRAY_SIZE(mxc_uart2_pins));
	return 0;
}

static int mxc_uart3_pins[] = {
@@ -131,15 +128,13 @@ static int mxc_uart3_pins[] = {
static int uart_mxc_port3_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart3_pins,
			ARRAY_SIZE(mxc_uart3_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART3");
			ARRAY_SIZE(mxc_uart3_pins), "UART3");
}

static int uart_mxc_port3_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart3_pins,
			ARRAY_SIZE(mxc_uart3_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART3");
	mxc_gpio_release_multiple_pins(mxc_uart3_pins,
			ARRAY_SIZE(mxc_uart3_pins));
}

static int mxc_uart4_pins[] = {
@@ -152,15 +147,14 @@ static int mxc_uart4_pins[] = {
static int uart_mxc_port4_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart4_pins,
			ARRAY_SIZE(mxc_uart4_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART4");
			ARRAY_SIZE(mxc_uart4_pins), "UART4");
}

static int uart_mxc_port4_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart4_pins,
			ARRAY_SIZE(mxc_uart4_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART4");
	mxc_gpio_release_multiple_pins(mxc_uart4_pins,
			ARRAY_SIZE(mxc_uart4_pins));
	return 0;
}

static int mxc_uart5_pins[] = {
@@ -173,15 +167,14 @@ static int mxc_uart5_pins[] = {
static int uart_mxc_port5_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart5_pins,
			ARRAY_SIZE(mxc_uart5_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART5");
			ARRAY_SIZE(mxc_uart5_pins), "UART5");
}

static int uart_mxc_port5_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart5_pins,
			ARRAY_SIZE(mxc_uart5_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART5");
	mxc_gpio_release_multiple_pins(mxc_uart5_pins,
			ARRAY_SIZE(mxc_uart5_pins));
	return 0;
}

static struct platform_device *platform_devices[] __initdata = {
@@ -212,15 +205,13 @@ static int mxc_fec_pins[] = {
static void gpio_fec_active(void)
{
	mxc_gpio_setup_multiple_pins(mxc_fec_pins,
			ARRAY_SIZE(mxc_fec_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "FEC");
			ARRAY_SIZE(mxc_fec_pins), "FEC");
}

static void gpio_fec_inactive(void)
{
	mxc_gpio_setup_multiple_pins(mxc_fec_pins,
			ARRAY_SIZE(mxc_fec_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "FEC");
	mxc_gpio_release_multiple_pins(mxc_fec_pins,
			ARRAY_SIZE(mxc_fec_pins));
}

static struct imxuart_platform_data uart_pdata[] = {
+15 −20
Original line number Diff line number Diff line
@@ -64,15 +64,14 @@ static int mxc_uart0_pins[] = {
static int uart_mxc_port0_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart0_pins,
			ARRAY_SIZE(mxc_uart0_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART0");
			ARRAY_SIZE(mxc_uart0_pins), "UART0");
}

static int uart_mxc_port0_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart0_pins,
			ARRAY_SIZE(mxc_uart0_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART0");
	mxc_gpio_release_multiple_pins(mxc_uart0_pins,
			ARRAY_SIZE(mxc_uart0_pins));
	return 0;
}

static int mxc_uart1_pins[] = {
@@ -85,15 +84,14 @@ static int mxc_uart1_pins[] = {
static int uart_mxc_port1_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
			ARRAY_SIZE(mxc_uart1_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART1");
			ARRAY_SIZE(mxc_uart1_pins), "UART1");
}

static int uart_mxc_port1_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart1_pins,
			ARRAY_SIZE(mxc_uart1_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART1");
	mxc_gpio_release_multiple_pins(mxc_uart1_pins,
			ARRAY_SIZE(mxc_uart1_pins));
	return 0;
}

static int mxc_uart2_pins[] = { PE10_PF_UART3_CTS,
@@ -104,15 +102,14 @@ static int mxc_uart2_pins[] = { PE10_PF_UART3_CTS,
static int uart_mxc_port2_init(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
			ARRAY_SIZE(mxc_uart2_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "UART2");
			ARRAY_SIZE(mxc_uart2_pins), "UART2");
}

static int uart_mxc_port2_exit(struct platform_device *pdev)
{
	return mxc_gpio_setup_multiple_pins(mxc_uart2_pins,
			ARRAY_SIZE(mxc_uart2_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "UART2");
	mxc_gpio_release_multiple_pins(mxc_uart2_pins,
			ARRAY_SIZE(mxc_uart2_pins));
	return 0;
}

static struct imxuart_platform_data uart_pdata[] = {
@@ -155,15 +152,13 @@ static int mxc_fec_pins[] = {
static void gpio_fec_active(void)
{
	mxc_gpio_setup_multiple_pins(mxc_fec_pins,
			ARRAY_SIZE(mxc_fec_pins),
			MXC_GPIO_ALLOC_MODE_NORMAL, "FEC");
			ARRAY_SIZE(mxc_fec_pins), "FEC");
}

static void gpio_fec_inactive(void)
{
	mxc_gpio_setup_multiple_pins(mxc_fec_pins,
			ARRAY_SIZE(mxc_fec_pins),
			MXC_GPIO_ALLOC_MODE_RELEASE, "FEC");
	mxc_gpio_release_multiple_pins(mxc_fec_pins,
			ARRAY_SIZE(mxc_fec_pins));
}

static struct platform_device *platform_devices[] __initdata = {
+2 −7
Original line number Diff line number Diff line
@@ -21,12 +21,6 @@

#include <linux/io.h>

#define MXC_GPIO_ALLOC_MODE_NORMAL	0
#define MXC_GPIO_ALLOC_MODE_NO_ALLOC	1
#define MXC_GPIO_ALLOC_MODE_TRY_ALLOC	2
#define MXC_GPIO_ALLOC_MODE_ALLOC_ONLY	4
#define MXC_GPIO_ALLOC_MODE_RELEASE	8

/*
 *  GPIO Module and I/O Multiplexer
 *  x = 0..3 for reg_A, reg_B, reg_C, reg_D
@@ -103,7 +97,8 @@

extern void mxc_gpio_mode(int gpio_mode);
extern int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
					int alloc_mode, const char *label);
					const char *label);
extern void mxc_gpio_release_multiple_pins(const int *pin_list, int count);

/*-------------------------------------------------------------------------*/

+19 −18
Original line number Diff line number Diff line
@@ -110,12 +110,13 @@ void mxc_gpio_mode(int gpio_mode)
EXPORT_SYMBOL(mxc_gpio_mode);

int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
				int alloc_mode, const char *label)
		const char *label)
{
	const int *p = pin_list;
	int i;
	unsigned gpio;
	unsigned mode;
	int ret = -EINVAL;

	for (i = 0; i < count; i++) {
		gpio = *p & (GPIO_PIN_MASK | GPIO_PORT_MASK);
@@ -124,15 +125,10 @@ int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
		if (gpio >= (GPIO_PORT_MAX + 1) * 32)
			goto setup_error;

		if (alloc_mode & MXC_GPIO_ALLOC_MODE_RELEASE)
			gpio_free(gpio);
		else if (!(alloc_mode & MXC_GPIO_ALLOC_MODE_NO_ALLOC))
			if (gpio_request(gpio, label)
			   && !(alloc_mode & MXC_GPIO_ALLOC_MODE_TRY_ALLOC))
		ret = gpio_request(gpio, label);
		if (ret)
			goto setup_error;

		if (!(alloc_mode & (MXC_GPIO_ALLOC_MODE_ALLOC_ONLY |
				    MXC_GPIO_ALLOC_MODE_RELEASE)))
		mxc_gpio_mode(gpio | mode);

		p++;
@@ -140,17 +136,22 @@ int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
	return 0;

setup_error:
	if (alloc_mode & (MXC_GPIO_ALLOC_MODE_NO_ALLOC |
	    MXC_GPIO_ALLOC_MODE_TRY_ALLOC))
		return -EINVAL;
	mxc_gpio_release_multiple_pins(pin_list, i);
	return ret;
}
EXPORT_SYMBOL(mxc_gpio_setup_multiple_pins);

	while (p != pin_list) {
		p--;
		gpio = *p & (GPIO_PIN_MASK | GPIO_PORT_MASK);
void mxc_gpio_release_multiple_pins(const int *pin_list, int count)
{
	const int *p = pin_list;
	int i;

	for (i = 0; i < count; i++) {
		unsigned gpio = *p & (GPIO_PIN_MASK | GPIO_PORT_MASK);
		gpio_free(gpio);
		p++;
	}

	return -EINVAL;
}
EXPORT_SYMBOL(mxc_gpio_setup_multiple_pins);
EXPORT_SYMBOL(mxc_gpio_release_multiple_pins);