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

Commit 5da0f468 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Greg Kroah-Hartman
Browse files

serial: sh-sci: Correct SCIF_ERROR_CLEAR for plain SCIF



SCIF_ERROR_CLEAR includes SCIFA_ORER, which exists only on SCIFA/SCIFB
and SCIF on sh7705/sh7720/sh7721.

To fix this:
  1. Remove SCIFA_ORER from the definition of SCIF_ERROR_CLEAR,
  2. During initialization, store the error clear mask to use,
     incorporating the overrun bit only if it applies to the SCxSR
     register.

Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a9efeca6
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ struct sci_port {
	unsigned int		overrun_reg;
	unsigned int		overrun_mask;
	unsigned int		error_mask;
	unsigned int		error_clear;
	unsigned int		sampling_rate;
	resource_size_t		reg_size;

@@ -2319,15 +2320,22 @@ static int sci_init_single(struct platform_device *dev,
	/*
	 * Establish some sensible defaults for the error detection.
	 */
	sci_port->error_mask = (p->type == PORT_SCI) ?
			SCI_DEFAULT_ERROR_MASK : SCIF_DEFAULT_ERROR_MASK;
	if (p->type == PORT_SCI) {
		sci_port->error_mask = SCI_DEFAULT_ERROR_MASK;
		sci_port->error_clear = SCI_ERROR_CLEAR;
	} else {
		sci_port->error_mask = SCIF_DEFAULT_ERROR_MASK;
		sci_port->error_clear = SCIF_ERROR_CLEAR;
	}

	/*
	 * Make the error mask inclusive of overrun detection, if
	 * supported.
	 */
	if (sci_port->overrun_reg == SCxSR)
	if (sci_port->overrun_reg == SCxSR) {
		sci_port->error_mask |= sci_port->overrun_mask;
		sci_port->error_clear &= ~sci_port->overrun_mask;
	}

	port->type		= p->type;
	port->flags		= UPF_FIXED_PORT | p->flags;
+2 −2
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ enum {
#define SCIF_DEFAULT_ERROR_MASK (SCIF_PER | SCIF_FER | SCIF_BRK | SCIF_ER)

#define SCIF_RDxF_CLEAR		(u32)(~(SCIF_DR | SCIF_RDF))
#define SCIF_ERROR_CLEAR	(u32)(~(SCIFA_ORER | SCIF_PER | SCIF_FER | SCIF_ER))
#define SCIF_ERROR_CLEAR	(u32)(~(SCIF_PER | SCIF_FER | SCIF_ER))
#define SCIF_TDxE_CLEAR		(u32)(~(SCIF_TDFE))
#define SCIF_BREAK_CLEAR	(u32)(~(SCIF_PER | SCIF_FER | SCIF_BRK))

@@ -122,7 +122,7 @@ enum {
#define SCxSR_RDxF_CLEAR(port) \
	(((port)->type == PORT_SCI) ? SCI_RDxF_CLEAR : SCIF_RDxF_CLEAR)
#define SCxSR_ERROR_CLEAR(port) \
	(((port)->type == PORT_SCI) ? SCI_ERROR_CLEAR : SCIF_ERROR_CLEAR)
	(to_sci_port(port)->error_clear)
#define SCxSR_TDxE_CLEAR(port) \
	(((port)->type == PORT_SCI) ? SCI_TDxE_CLEAR : SCIF_TDxE_CLEAR)
#define SCxSR_BREAK_CLEAR(port) \