Skip to contentSkip to conversation

sc16is7xx: IrDA mode and threaded IRQs

PATCH New Daniel Mack 1 participant 3 messages May 29, 2020

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

v4 cover sc16is7xx: IrDA mode and threaded IRQs

This is a resend of the first two patches of the series to bring IrDA support to the sc16is7xx driver.

The "linux," prefix is now dropped from the DT property.

The patches are rebased on top of the other 4 that have already been merged.

Pascal Huerst (2):
dt-bindings: sc16is7xx: Add flag to activate IrDA mode
sc16is7xx: Add flag to activate IrDA mode

 .../bindings/serial/nxp,sc16is7xx.txt         |  4 ++++
 drivers/tty/serial/sc16is7xx.c                | 20 +++++++++++++++++++
 2 files changed, 24 insertions(+)
Signature · 1 line
2.26.2
#1 lore raw

PATCH v4 1/2 dt-bindings: sc16is7xx: Add flag to activate IrDA mode

From: Pascal Huerst <[email protected]>

This series of uart controllers is able to work in IrDA mode. This adds a property to the device tree to enable that feature on selected ports if needed.

---
 Documentation/devicetree/bindings/serial/nxp,sc16is7xx.txt | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/serial/nxp,sc16is7xx.txt +4 -0
index c1091a923a89..0fa8e3e43bf8 100644
@@ -21,6 +21,8 @@ Optional properties:
   the second cell is used to specify the GPIO polarity:
     0 = active high,
     1 = active low.
+- irda-mode-ports: An array that lists the indices of the port that
+		   should operate in IrDA mode.
 
 Example:
         sc16is750: sc16is750@51 {
@@ -55,6 +57,8 @@ Optional properties:
   the second cell is used to specify the GPIO polarity:
     0 = active high,
     1 = active low.
+- irda-mode-ports: An array that lists the indices of the port that
+		   should operate in IrDA mode.
 
 Example:
 	sc16is750: sc16is750@0 {
Signature · 1 line
2.26.2
#2 lore raw

PATCH v4 2/2 sc16is7xx: Add flag to activate IrDA mode

In reply to Daniel Mack

From: Pascal Huerst <[email protected]>

This series of uart controllers is able to work in IrDA mode. Add per-port flag to the device-tree to enable that feature if needed.

---
 drivers/tty/serial/sc16is7xx.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
drivers/tty/serial/sc16is7xx.c +20 -0
index 56508e63f9a0..deb55e2ad169 100644
@@ -315,6 +315,7 @@ struct sc16is7xx_one {
 	struct kthread_work		tx_work;
 	struct kthread_work		reg_work;
 	struct sc16is7xx_one_config	config;
+	bool				irda_mode;
 };
 
 struct sc16is7xx_port {
@@ -986,6 +987,7 @@ static int sc16is7xx_config_rs485(struct uart_port *port,
 
 static int sc16is7xx_startup(struct uart_port *port)
 {
+	struct sc16is7xx_one *one = to_sc16is7xx_one(port, port);
 	struct sc16is7xx_port *s = dev_get_drvdata(port->dev);
 	unsigned int val;
 
@@ -1024,6 +1026,13 @@ static int sc16is7xx_startup(struct uart_port *port)
 	/* Now, initialize the UART */
 	sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, SC16IS7XX_LCR_WORD_LEN_8);
 
+	/* Enable IrDA mode if requested in DT */
+	/* This bit must be written with LCR[7] = 0 */
+	sc16is7xx_port_update(port, SC16IS7XX_MCR_REG,
+			      SC16IS7XX_MCR_IRDA_BIT,
+			      one->irda_mode ?
+				SC16IS7XX_MCR_IRDA_BIT : 0);
+
 	/* Enable the Rx and Tx FIFO */
 	sc16is7xx_port_update(port, SC16IS7XX_EFCR_REG,
 			      SC16IS7XX_EFCR_RXDISABLE_BIT |
@@ -1304,6 +1313,17 @@ static int sc16is7xx_probe(struct device *dev,
 		sc16is7xx_power(&s->p[i].port, 0);
 	}
 
+	if (dev->of_node) {
+		struct property *prop;
+		const __be32 *p;
+		u32 u;
+
+		of_property_for_each_u32(dev->of_node, "irda-mode-ports",
+					 prop, p, u)
+			if (u < devtype->nr_uart)
+				s->p[u].irda_mode = true;
+	}
+
 	/*
 	 * Setup interrupt. We first try to acquire the IRQ line as level IRQ.
 	 * If that succeeds, we can allow sharing the interrupt as well.
Signature · 1 line
2.26.2