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

Commit 2d4dd0da authored by Chris Brandt's avatar Chris Brandt Committed by Greg Kroah-Hartman
Browse files

serial: sh-sci: Allow for compressed SCIF address



Some devices with SCIx_SH4_SCIF_REGTYPE have no space between registers.
Use the register area size to determine the spacing between register.

Signed-off-by: default avatarChris Brandt <chris.brandt@renesas.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 70a15ff0
Loading
Loading
Loading
Loading
+15 −10
Original line number Original line Diff line number Diff line
@@ -348,15 +348,15 @@ static const struct sci_port_params sci_port_params[SCIx_NR_REGTYPES] = {
	[SCIx_SH4_SCIF_REGTYPE] = {
	[SCIx_SH4_SCIF_REGTYPE] = {
		.regs = {
		.regs = {
			[SCSMR]		= { 0x00, 16 },
			[SCSMR]		= { 0x00, 16 },
			[SCBRR]		= { 0x04,  8 },
			[SCBRR]		= { 0x02,  8 },
			[SCSCR]		= { 0x08, 16 },
			[SCSCR]		= { 0x04, 16 },
			[SCxTDR]	= { 0x0c,  8 },
			[SCxTDR]	= { 0x06,  8 },
			[SCxSR]		= { 0x10, 16 },
			[SCxSR]		= { 0x08, 16 },
			[SCxRDR]	= { 0x14,  8 },
			[SCxRDR]	= { 0x0a,  8 },
			[SCFCR]		= { 0x18, 16 },
			[SCFCR]		= { 0x0c, 16 },
			[SCFDR]		= { 0x1c, 16 },
			[SCFDR]		= { 0x0e, 16 },
			[SCSPTR]	= { 0x20, 16 },
			[SCSPTR]	= { 0x10, 16 },
			[SCLSR]		= { 0x24, 16 },
			[SCLSR]		= { 0x12, 16 },
		},
		},
		.fifosize = 16,
		.fifosize = 16,
		.overrun_reg = SCLSR,
		.overrun_reg = SCLSR,
@@ -2848,7 +2848,7 @@ static int sci_init_single(struct platform_device *dev,
{
{
	struct uart_port *port = &sci_port->port;
	struct uart_port *port = &sci_port->port;
	const struct resource *res;
	const struct resource *res;
	unsigned int i;
	unsigned int i, regtype;
	int ret;
	int ret;


	sci_port->cfg	= p;
	sci_port->cfg	= p;
@@ -2885,6 +2885,7 @@ static int sci_init_single(struct platform_device *dev,
	if (unlikely(sci_port->params == NULL))
	if (unlikely(sci_port->params == NULL))
		return -EINVAL;
		return -EINVAL;


	regtype = sci_port->params - sci_port_params;
	switch (p->type) {
	switch (p->type) {
	case PORT_SCIFB:
	case PORT_SCIFB:
		sci_port->rx_trigger = 48;
		sci_port->rx_trigger = 48;
@@ -2939,6 +2940,10 @@ static int sci_init_single(struct platform_device *dev,
			port->regshift = 1;
			port->regshift = 1;
	}
	}


	if (regtype == SCIx_SH4_SCIF_REGTYPE)
		if (sci_port->reg_size >= 0x20)
			port->regshift = 1;

	/*
	/*
	 * The UART port needs an IRQ value, so we peg this to the RX IRQ
	 * The UART port needs an IRQ value, so we peg this to the RX IRQ
	 * for the multi-IRQ ports, which is where we are primarily
	 * for the multi-IRQ ports, which is where we are primarily