提交 5da0f468 编写于 作者: G Geert Uytterhoeven 提交者: Greg Kroah-Hartman

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: NGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 a9efeca6
...@@ -84,6 +84,7 @@ struct sci_port { ...@@ -84,6 +84,7 @@ struct sci_port {
unsigned int overrun_reg; unsigned int overrun_reg;
unsigned int overrun_mask; unsigned int overrun_mask;
unsigned int error_mask; unsigned int error_mask;
unsigned int error_clear;
unsigned int sampling_rate; unsigned int sampling_rate;
resource_size_t reg_size; resource_size_t reg_size;
...@@ -2319,15 +2320,22 @@ static int sci_init_single(struct platform_device *dev, ...@@ -2319,15 +2320,22 @@ static int sci_init_single(struct platform_device *dev,
/* /*
* Establish some sensible defaults for the error detection. * Establish some sensible defaults for the error detection.
*/ */
sci_port->error_mask = (p->type == PORT_SCI) ? if (p->type == PORT_SCI) {
SCI_DEFAULT_ERROR_MASK : SCIF_DEFAULT_ERROR_MASK; 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 * Make the error mask inclusive of overrun detection, if
* supported. * supported.
*/ */
if (sci_port->overrun_reg == SCxSR) if (sci_port->overrun_reg == SCxSR) {
sci_port->error_mask |= sci_port->overrun_mask; sci_port->error_mask |= sci_port->overrun_mask;
sci_port->error_clear &= ~sci_port->overrun_mask;
}
port->type = p->type; port->type = p->type;
port->flags = UPF_FIXED_PORT | p->flags; port->flags = UPF_FIXED_PORT | p->flags;
......
...@@ -77,7 +77,7 @@ enum { ...@@ -77,7 +77,7 @@ enum {
#define SCIF_DEFAULT_ERROR_MASK (SCIF_PER | SCIF_FER | SCIF_BRK | SCIF_ER) #define SCIF_DEFAULT_ERROR_MASK (SCIF_PER | SCIF_FER | SCIF_BRK | SCIF_ER)
#define SCIF_RDxF_CLEAR (u32)(~(SCIF_DR | SCIF_RDF)) #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_TDxE_CLEAR (u32)(~(SCIF_TDFE))
#define SCIF_BREAK_CLEAR (u32)(~(SCIF_PER | SCIF_FER | SCIF_BRK)) #define SCIF_BREAK_CLEAR (u32)(~(SCIF_PER | SCIF_FER | SCIF_BRK))
...@@ -122,7 +122,7 @@ enum { ...@@ -122,7 +122,7 @@ enum {
#define SCxSR_RDxF_CLEAR(port) \ #define SCxSR_RDxF_CLEAR(port) \
(((port)->type == PORT_SCI) ? SCI_RDxF_CLEAR : SCIF_RDxF_CLEAR) (((port)->type == PORT_SCI) ? SCI_RDxF_CLEAR : SCIF_RDxF_CLEAR)
#define SCxSR_ERROR_CLEAR(port) \ #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) \ #define SCxSR_TDxE_CLEAR(port) \
(((port)->type == PORT_SCI) ? SCI_TDxE_CLEAR : SCIF_TDxE_CLEAR) (((port)->type == PORT_SCI) ? SCI_TDxE_CLEAR : SCIF_TDxE_CLEAR)
#define SCxSR_BREAK_CLEAR(port) \ #define SCxSR_BREAK_CLEAR(port) \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册