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

Commit 59f06d67 authored by Russell King's avatar Russell King
Browse files

ARM: sa1100/assabet: convert serial to gpiod APIs



Convert the Assabet serial modem control signals to use the gpiod APIs
rather than custom callbacks into platform code.

Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 0faf70ca
Loading
Loading
Loading
Loading
+28 −63
Original line number Diff line number Diff line
@@ -522,6 +522,29 @@ static const struct gpio_keys_platform_data assabet_keys_pdata = {
	.rep = 0,
};

static struct gpiod_lookup_table assabet_uart1_gpio_table = {
	.dev_id = "sa11x0-uart.1",
	.table = {
		GPIO_LOOKUP("assabet", 16, "dtr", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 17, "rts", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 25, "dcd", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 26, "cts", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 27, "dsr", GPIO_ACTIVE_LOW),
		{ },
	},
};

static struct gpiod_lookup_table assabet_uart3_gpio_table = {
	.dev_id = "sa11x0-uart.3",
	.table = {
		GPIO_LOOKUP("assabet", 28, "cts", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 29, "dsr", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 30, "dcd", GPIO_ACTIVE_LOW),
		GPIO_LOOKUP("assabet", 31, "rng", GPIO_ACTIVE_LOW),
		{ },
	},
};

static void __init assabet_init(void)
{
	/*
@@ -568,7 +591,10 @@ static void __init assabet_init(void)
			neponset_resources, ARRAY_SIZE(neponset_resources));
#endif
	} else {
		gpiod_add_lookup_table(&assabet_uart1_gpio_table);
		gpiod_add_lookup_table(&assabet_uart3_gpio_table);
		gpiod_add_lookup_table(&assabet_cf_vcc_gpio_table);

		sa11x0_register_fixed_regulator(0, &assabet_cf_vcc_pdata,
					assabet_cf_vcc_consumers,
					ARRAY_SIZE(assabet_cf_vcc_consumers),
@@ -658,74 +684,13 @@ static void assabet_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
{
	if (port->mapbase == _Ser1UTCR0) {
		if (state)
			ASSABET_BCR_clear(ASSABET_BCR_RS232EN |
					  ASSABET_BCR_COM_RTS |
					  ASSABET_BCR_COM_DTR);
		else
			ASSABET_BCR_set(ASSABET_BCR_RS232EN |
					ASSABET_BCR_COM_RTS |
					ASSABET_BCR_COM_DTR);
	}
}

/*
 * Assabet uses COM_RTS and COM_DTR for both UART1 (com port)
 * and UART3 (radio module).  We only handle them for UART1 here.
 */
static void assabet_set_mctrl(struct uart_port *port, u_int mctrl)
{
	if (port->mapbase == _Ser1UTCR0) {
		u_int set = 0, clear = 0;

		if (mctrl & TIOCM_RTS)
			clear |= ASSABET_BCR_COM_RTS;
			ASSABET_BCR_clear(ASSABET_BCR_RS232EN);
		else
			set |= ASSABET_BCR_COM_RTS;

		if (mctrl & TIOCM_DTR)
			clear |= ASSABET_BCR_COM_DTR;
		else
			set |= ASSABET_BCR_COM_DTR;

		ASSABET_BCR_clear(clear);
		ASSABET_BCR_set(set);
	}
			ASSABET_BCR_set(ASSABET_BCR_RS232EN);
	}

static u_int assabet_get_mctrl(struct uart_port *port)
{
	u_int ret = 0;
	u_int bsr = ASSABET_BSR;

	/* need 2 reads to read current value */
	bsr = ASSABET_BSR;

	if (port->mapbase == _Ser1UTCR0) {
		if (bsr & ASSABET_BSR_COM_DCD)
			ret |= TIOCM_CD;
		if (bsr & ASSABET_BSR_COM_CTS)
			ret |= TIOCM_CTS;
		if (bsr & ASSABET_BSR_COM_DSR)
			ret |= TIOCM_DSR;
	} else if (port->mapbase == _Ser3UTCR0) {
		if (bsr & ASSABET_BSR_RAD_DCD)
			ret |= TIOCM_CD;
		if (bsr & ASSABET_BSR_RAD_CTS)
			ret |= TIOCM_CTS;
		if (bsr & ASSABET_BSR_RAD_DSR)
			ret |= TIOCM_DSR;
		if (bsr & ASSABET_BSR_RAD_RI)
			ret |= TIOCM_RI;
	} else {
		ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
	}

	return ret;
}

static struct sa1100_port_fns assabet_port_fns __initdata = {
	.set_mctrl	= assabet_set_mctrl,
	.get_mctrl	= assabet_get_mctrl,
	.pm		= assabet_uart_pm,
};