Commit d9d03e2c authored by Russell King's avatar Russell King
Browse files

serial: sa1100: add support for mctrl gpios



Add support for the generic mctrl gpio helper.  This will allow us to
convert several board files to use the gpiod tables to assign GPIOs to
serial ports, rather than needing to have private function callbacks.

If the generic mctrl gpio helper fails, ignore the mctrl gpios rather
than preventing the (possibly console) serial port from being created.

Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent cd6c84d8
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -511,6 +511,7 @@ config SERIAL_SA1100
	bool "SA1100 serial port support"
	bool "SA1100 serial port support"
	depends on ARCH_SA1100
	depends on ARCH_SA1100
	select SERIAL_CORE
	select SERIAL_CORE
	select SERIAL_MCTRL_GPIO if GPIOLIB
	help
	help
	  If you have a machine based on a SA1100/SA1110 StrongARM(R) CPU you
	  If you have a machine based on a SA1100/SA1110 StrongARM(R) CPU you
	  can enable its onboard serial port by enabling this option.
	  can enable its onboard serial port by enabling this option.
+38 −4
Original line number Original line Diff line number Diff line
@@ -28,6 +28,8 @@
#include <mach/hardware.h>
#include <mach/hardware.h>
#include <mach/irqs.h>
#include <mach/irqs.h>


#include "serial_mctrl_gpio.h"

/* We've been assigned a range on the "Low-density serial ports" major */
/* We've been assigned a range on the "Low-density serial ports" major */
#define SERIAL_SA1100_MAJOR	204
#define SERIAL_SA1100_MAJOR	204
#define MINOR_START		5
#define MINOR_START		5
@@ -77,6 +79,7 @@ struct sa1100_port {
	struct uart_port	port;
	struct uart_port	port;
	struct timer_list	timer;
	struct timer_list	timer;
	unsigned int		old_status;
	unsigned int		old_status;
	struct mctrl_gpios	*gpios;
};
};


/*
/*
@@ -174,6 +177,8 @@ static void sa1100_enable_ms(struct uart_port *port)
		container_of(port, struct sa1100_port, port);
		container_of(port, struct sa1100_port, port);


	mod_timer(&sport->timer, jiffies);
	mod_timer(&sport->timer, jiffies);

	mctrl_gpio_enable_ms(sport->gpios);
}
}


static void
static void
@@ -322,11 +327,21 @@ static unsigned int sa1100_tx_empty(struct uart_port *port)


static unsigned int sa1100_get_mctrl(struct uart_port *port)
static unsigned int sa1100_get_mctrl(struct uart_port *port)
{
{
	return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
	struct sa1100_port *sport =
		container_of(port, struct sa1100_port, port);
	int ret = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;

	mctrl_gpio_get(sport->gpios, &ret);

	return ret;
}
}


static void sa1100_set_mctrl(struct uart_port *port, unsigned int mctrl)
static void sa1100_set_mctrl(struct uart_port *port, unsigned int mctrl)
{
{
	struct sa1100_port *sport =
		container_of(port, struct sa1100_port, port);

	mctrl_gpio_set(sport->gpios, mctrl);
}
}


/*
/*
@@ -842,6 +857,27 @@ static int sa1100_serial_resume(struct platform_device *dev)
	return 0;
	return 0;
}
}


static int sa1100_serial_add_one_port(struct sa1100_port *sport, struct platform_device *dev)
{
	sport->port.dev = &dev->dev;
	sport->gpios = mctrl_gpio_init_noauto(sport->port.dev, 0);
	if (IS_ERR(sport->gpios)) {
		int err = PTR_ERR(sport->gpios);

		dev_err(sport->port.dev, "failed to get mctrl gpios: %d\n",
			err);

		if (err == -EPROBE_DEFER)
			return err;

		sport->gpios = NULL;
	}

	platform_set_drvdata(dev, sport);

	return uart_add_one_port(&sa1100_reg, &sport->port);
}

static int sa1100_serial_probe(struct platform_device *dev)
static int sa1100_serial_probe(struct platform_device *dev)
{
{
	struct resource *res = dev->resource;
	struct resource *res = dev->resource;
@@ -856,9 +892,7 @@ static int sa1100_serial_probe(struct platform_device *dev)
			if (sa1100_ports[i].port.mapbase != res->start)
			if (sa1100_ports[i].port.mapbase != res->start)
				continue;
				continue;


			sa1100_ports[i].port.dev = &dev->dev;
			sa1100_serial_add_one_port(&sa1100_ports[i], dev);
			uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
			platform_set_drvdata(dev, &sa1100_ports[i]);
			break;
			break;
		}
		}
	}
	}