Skip to contentSkip to conversation

serial: sh-sci: modify sci_break_ctl()

PATCH Superseded Shimoda, Yoshihiro 3 participants 11 messages Apr 6, 2012 – Apr 11, 2012

Subsystems (2)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 serial: sh-sci: modify sci_break_ctl()

SCIF modules which have SCSPTR can output the break signal. This patch supports it.

This patch tested on sh7757lcr.

---
about v2:
- add serial_sci.h
- change sci_in/sci_out to serial_port_in/serial_port_out

 drivers/tty/serial/sh-sci.c |   30 ++++++++++++++++++++++++++----
 include/linux/serial_sci.h  |    2 ++
 2 files changed, 28 insertions(+), 4 deletions(-)
drivers/tty/serial/sh-sci.c +26 -4
index 3158e17..3e471fc 100644
@@ -1564,10 +1564,32 @@ static void sci_enable_ms(struct uart_port *port)
 
 static void sci_break_ctl(struct uart_port *port, int break_state)
 {
-	/*
-	 * Not supported by hardware. Most parts couple break and rx
-	 * interrupts together, with break detection always enabled.
-	 */
+	struct sci_port *s = to_sci_port(port);
+	unsigned short scscr, scsptr;
+
+	switch (s->cfg->regtype) {
+	case SCIx_SH4_SCIF_REGTYPE:
+		scsptr = serial_port_in(port, SCSPTR);
+		scscr = serial_port_in(port, SCSCR);
+
+		if (break_state = -1) {
+			scsptr = (scsptr | SCSPTR_SPB2IO) & ~SCSPTR_SPB2DT;
+			scscr &= ~SCSCR_TE;
+		} else {
+			scsptr = (scsptr | SCSPTR_SPB2DT) & ~SCSPTR_SPB2IO;
+			scscr |= SCSCR_TE;
+		}
+
+		serial_port_out(port, SCSPTR, scsptr);
+		serial_port_out(port, SCSCR, scscr);
+		break;
+	default:
+		/*
+		 * Not supported by hardware. Most parts couple break and rx
+		 * interrupts together, with break detection always enabled.
+		 */
+		break;
+	}
 }
 
 #ifdef CONFIG_SERIAL_SH_SCI_DMA
include/linux/serial_sci.h +2 -0
index 7877907..eb763ad 100644
@@ -52,6 +52,8 @@ enum {
 /* SCSPTR, optional */
 #define SCSPTR_RTSIO	(1 << 7)
 #define SCSPTR_CTSIO	(1 << 5)
+#define SCSPTR_SPB2IO	(1 << 1)
+#define SCSPTR_SPB2DT	(1 << 0)
 
 /* Offsets into the sci_port->irqs array */
 enum {
Signature · 1 line
1.7.1
#1 lore raw
Quoted 4 lines · Yoshihiro

SCIF modules which have SCSPTR can output the break signal. This patch supports it.

This patch tested on sh7757lcr.

Hi Shimoda-san,

I have checked that this change boots on the sh7757lcr and that the serial console seems to work. I am curious to know if there is anything else that can be tested.

Quoted 72 lines

---
about v2:
- add serial_sci.h
- change sci_in/sci_out to serial_port_in/serial_port_out

 drivers/tty/serial/sh-sci.c |   30 ++++++++++++++++++++++++++----
 include/linux/serial_sci.h  |    2 ++
 2 files changed, 28 insertions(+), 4 deletions(-)
drivers/tty/serial/sh-sci.c +26 -4
index 3158e17..3e471fc 100644
@@ -1564,10 +1564,32 @@ static void sci_enable_ms(struct uart_port *port)
 
 static void sci_break_ctl(struct uart_port *port, int break_state)
 {
-	/*
-	 * Not supported by hardware. Most parts couple break and rx
-	 * interrupts together, with break detection always enabled.
-	 */
+	struct sci_port *s = to_sci_port(port);
+	unsigned short scscr, scsptr;
+
+	switch (s->cfg->regtype) {
+	case SCIx_SH4_SCIF_REGTYPE:
+		scsptr = serial_port_in(port, SCSPTR);
+		scscr = serial_port_in(port, SCSCR);
+
+		if (break_state = -1) {
+			scsptr = (scsptr | SCSPTR_SPB2IO) & ~SCSPTR_SPB2DT;
+			scscr &= ~SCSCR_TE;
+		} else {
+			scsptr = (scsptr | SCSPTR_SPB2DT) & ~SCSPTR_SPB2IO;
+			scscr |= SCSCR_TE;
+		}
+
+		serial_port_out(port, SCSPTR, scsptr);
+		serial_port_out(port, SCSCR, scscr);
+		break;
+	default:
+		/*
+		 * Not supported by hardware. Most parts couple break and rx
+		 * interrupts together, with break detection always enabled.
+		 */
+		break;
+	}
 }
 
 #ifdef CONFIG_SERIAL_SH_SCI_DMA
include/linux/serial_sci.h +2 -0
index 7877907..eb763ad 100644
@@ -52,6 +52,8 @@ enum {
 /* SCSPTR, optional */
 #define SCSPTR_RTSIO	(1 << 7)
 #define SCSPTR_CTSIO	(1 << 5)
+#define SCSPTR_SPB2IO	(1 << 1)
+#define SCSPTR_SPB2DT	(1 << 0)
 
 /* Offsets into the sci_port->irqs array */
 enum {
Signature · 5 lines
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#2 lore raw
In reply to Shimoda, Yoshihiro

Hi Simon-san,

Quoted 11 lines · Simon Horman
Quoted 4 lines · Yoshihiro

SCIF modules which have SCSPTR can output the break signal. This patch supports it.

This patch tested on sh7757lcr.

Hi Shimoda-san,

I have checked that this change boots on the sh7757lcr and that the serial console seems to work. I am curious to know if there is anything else that can be tested.

Thank you for the check.
setup-xxxx.c which have "PORT_SCIF" can be tested:
- SH7724, SH7785, R8A7779, etc.

Best regards,
Yoshihiro Shimoda

#3 lore raw
In reply to Shimoda, Yoshihiro
Quoted 11 lines · Yoshihiro

Hi Simon-san,

Quoted 8 lines · Simon Horman
Quoted 4 lines · Yoshihiro

SCIF modules which have SCSPTR can output the break signal. This patch supports it.

This patch tested on sh7757lcr.

Hi Shimoda-san,

Quoted 7 lines
Quoted 3 lines

I have checked that this change boots on the sh7757lcr and that the serial console seems to work. I am curious to know if there is anything else that can be tested.

Thank you for the check.
setup-xxxx.c which have "PORT_SCIF" can be tested:
- SH7724, SH7785, R8A7779, etc.

Thanks, I will try and test on ecovec which I believe has SH7724. Do you have any information on how I should test the code, other than booting it

#4 lore raw
In reply to Shimoda, Yoshihiro
Quoted 7 lines · Simon Horman
Quoted 4 lines · Yoshihiro

Thank you for the check.
setup-xxxx.c which have "PORT_SCIF" can be tested:
- SH7724, SH7785, R8A7779, etc.

Thanks, I will try and test on ecovec which I believe has SH7724.

Yes, ecovec has SH7724.

Quoted 2 lines

Do you have any information on how I should test the code, other than booting it

If userland calls ioctl with TIOCSBRK/TIOCCBRK, the sci_break_ctl is called. After TIOCSBRK we cannot send data from SCIF. After TIOCCBRK, we can send data from SCIF.

Best regards,
Yoshihiro Shimoda

#5 lore raw
In reply to Shimoda, Yoshihiro
Quoted 9 lines · Yoshihiro
Quoted 7 lines · Simon Horman
Quoted 4 lines · Yoshihiro

Thank you for the check.
setup-xxxx.c which have "PORT_SCIF" can be tested:
- SH7724, SH7785, R8A7779, etc.

Thanks, I will try and test on ecovec which I believe has SH7724.

Quoted 8 lines

Yes, ecovec has SH7724.

Quoted 2 lines

Do you have any information on how I should test the code, other than booting it

If userland calls ioctl with TIOCSBRK/TIOCCBRK, the sci_break_ctl is called. After TIOCSBRK we cannot send data from SCIF. After TIOCCBRK, we can send data from SCIF.

Thanks, that make a lot of sense.

Unfortunately the ecovec doesn't exercise the new code as the regtype of its scif is SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE but your code only operates on SCIx_SH4_SCIF_REGTYPE.

#6 lore raw
In reply to Shimoda, Yoshihiro
Quoted 11 lines · Simon Horman
Quoted 4 lines · Yoshihiro

If userland calls ioctl with TIOCSBRK/TIOCCBRK, the sci_break_ctl is called. After TIOCSBRK we cannot send data from SCIF. After TIOCCBRK, we can send data from SCIF.

Thanks, that make a lot of sense.

Unfortunately the ecovec doesn't exercise the new code as the regtype of its scif is SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE but your code only operates on SCIx_SH4_SCIF_REGTYPE.

Sorry I forgot that the SH7724 has SCIF and SCIFA.
The ecovec uses SCIF, and it doesn't have SCSPTR.
I checked the ecovec schematics, but it cannot use SCIFA because other functions use the multiplex pins.

Best regards,
Yoshihiro Shimoda

#7 lore raw
In reply to Shimoda, Yoshihiro
Quoted 9 lines · Yoshihiro
Quoted 8 lines · Simon Horman
Quoted 4 lines · Yoshihiro

If userland calls ioctl with TIOCSBRK/TIOCCBRK, the sci_break_ctl is called. After TIOCSBRK we cannot send data from SCIF. After TIOCCBRK, we can send data from SCIF.

Thanks, that make a lot of sense.

Quoted 8 lines
Quoted 3 lines

Unfortunately the ecovec doesn't exercise the new code as the regtype of its scif is SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE but your code only operates on SCIx_SH4_SCIF_REGTYPE.

Sorry I forgot that the SH7724 has SCIF and SCIFA.
The ecovec uses SCIF, and it doesn't have SCSPTR.
I checked the ecovec schematics, but it cannot use SCIFA because other functions use the multiplex pins.

No problem.

In any case, Reviewed-by: Simon Horman <[email protected]>

#9 lore raw
In reply to Shimoda, Yoshihiro
Quoted 7 lines · Yoshihiro
Quoted 6 lines · Simon Horman
Quoted 4 lines · Yoshihiro

If userland calls ioctl with TIOCSBRK/TIOCCBRK, the sci_break_ctl is called. After TIOCSBRK we cannot send data from SCIF. After TIOCCBRK, we can send data from SCIF.

Quoted 8 lines
Quoted 5 lines

Thanks, that make a lot of sense.

Unfortunately the ecovec doesn't exercise the new code as the regtype of its scif is SCIx_SH4_SCIF_NO_SCSPTR_REGTYPE but your code only operates on SCIx_SH4_SCIF_REGTYPE.

Sorry I forgot that the SH7724 has SCIF and SCIFA. The ecovec uses SCIF, and it doesn't have SCSPTR.

Well, one thing that you can do is test for the SCSPTR existence and simply not care about the port type. This is roughly what the generic sci_init_pins() does for example.

You would have to ensure that the bits you are twiddling also exist for the SCIx_SH2_SCIF_FIFODATA_REGTYPE, SCIx_SH2_SCIF_FIFODATA_REGTYPE, and SCIx_SH4_SCIF_FIFODATA_REGTYPE, though.

Quoted 3 lines

I checked the ecovec schematics, but it cannot use SCIFA because other functions use the multiplex pins.

You should be able to plug them in for the port and let the sh-sci driver try to grab the port. The port will simply be skipped if pin demux fails. Take a look at 50f0959ad4f9ac1c5ee208bb820de299a1b3730b for an idea of how to wire it up.

#10 lore raw
In reply to Shimoda, Yoshihiro
Quoted 5 lines · Paul Mundt
Quoted 3 lines · Yoshihiro

Sorry I forgot that the SH7724 has SCIF and SCIFA. The ecovec uses SCIF, and it doesn't have SCSPTR.

Quoted 7 lines

Well, one thing that you can do is test for the SCSPTR existence and simply not care about the port type. This is roughly what the generic sci_init_pins() does for example.

You would have to ensure that the bits you are twiddling also exist for the SCIx_SH2_SCIF_FIFODATA_REGTYPE, SCIx_SH2_SCIF_FIFODATA_REGTYPE, and SCIx_SH4_SCIF_FIFODATA_REGTYPE, though.

Thank you for the suggestion. I will modify the code.

Quoted 8 lines
Quoted 3 lines

I checked the ecovec schematics, but it cannot use SCIFA because other functions use the multiplex pins.

You should be able to plug them in for the port and let the sh-sci driver try to grab the port. The port will simply be skipped if pin demux fails. Take a look at 50f0959ad4f9ac1c5ee208bb820de299a1b3730b for an idea of how to wire it up.

I'm sorry, I don't understand this comment.
I think that if the sh-sci driver grab the port, other driver cannot work correctly when other driver is working.

Best regards,
Yoshihiro Shimoda