From: Jarkko Sonninen <kasper@iki.fi>
To: Jarkko Sonninen <kasper@iki.fi>
Cc: Johan Hovold <johan@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3] USB: serial: xr: Add TIOCGRS485 and TIOCSRS485 ioctls
Date: Tue, 14 Mar 2023 09:00:01 +0200 [thread overview]
Message-ID: <20230314070002.1008959-1-kasper@iki.fi> (raw)
In-Reply-To: <20230313010416.845252-1-kasper@iki.fi>
Add support for RS-485 in Exar USB adapters.
RS-485 mode is controlled by TIOCGRS485 and TIOCSRS485 ioctls.
Gpio mode register is set to enable RS-485.
Signed-off-by: Jarkko Sonninen <kasper@iki.fi>
---
In this version only rs485.flags are stored to state.
There is no locking as only one bit of the flags is used.
ioctl returns -ENOIOCTLCMD as the actual error handling is in tty code.
drivers/usb/serial/xr_serial.c | 62 +++++++++++++++++++++++++++++++++-
1 file changed, 61 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/serial/xr_serial.c b/drivers/usb/serial/xr_serial.c
index fdb0aae546c3..7b542ccb6596 100644
--- a/drivers/usb/serial/xr_serial.c
+++ b/drivers/usb/serial/xr_serial.c
@@ -93,6 +93,7 @@ struct xr_txrx_clk_mask {
#define XR_GPIO_MODE_SEL_DTR_DSR 0x2
#define XR_GPIO_MODE_SEL_RS485 0x3
#define XR_GPIO_MODE_SEL_RS485_ADDR 0x4
+#define XR_GPIO_MODE_RS485_TX_H 0x8
#define XR_GPIO_MODE_TX_TOGGLE 0x100
#define XR_GPIO_MODE_RX_TOGGLE 0x200
@@ -237,6 +238,7 @@ static const struct xr_type xr_types[] = {
struct xr_data {
const struct xr_type *type;
u8 channel; /* zero-based index or interface number */
+ u32 rs485_flags;
};
static int xr_set_reg(struct usb_serial_port *port, u8 channel, u16 reg, u16 val)
@@ -645,9 +647,13 @@ static void xr_set_flow_mode(struct tty_struct *tty,
/* Set GPIO mode for controlling the pins manually by default. */
gpio_mode &= ~XR_GPIO_MODE_SEL_MASK;
+ if (data->rs485_flags & SER_RS485_ENABLED)
+ gpio_mode |= XR_GPIO_MODE_SEL_RS485 | XR_GPIO_MODE_RS485_TX_H;
+ else if (C_CRTSCTS(tty) && C_BAUD(tty) != B0)
+ gpio_mode |= XR_GPIO_MODE_SEL_RTS_CTS;
+
if (C_CRTSCTS(tty) && C_BAUD(tty) != B0) {
dev_dbg(&port->dev, "Enabling hardware flow ctrl\n");
- gpio_mode |= XR_GPIO_MODE_SEL_RTS_CTS;
flow = XR_UART_FLOW_MODE_HW;
} else if (I_IXON(tty)) {
u8 start_char = START_CHAR(tty);
@@ -827,6 +833,59 @@ static void xr_set_termios(struct tty_struct *tty,
xr_set_flow_mode(tty, port, old_termios);
}
+static int xr_get_rs485_config(struct tty_struct *tty,
+ unsigned int __user *argp)
+{
+ struct usb_serial_port *port = tty->driver_data;
+ struct xr_data *data = usb_get_serial_port_data(port);
+ struct serial_rs485 rs485;
+
+ dev_dbg(tty->dev, "Flags %02x\n", data->rs485_flags);
+ memset(&rs485, 0, sizeof(rs485));
+ rs485.flags = data->rs485_flags;
+ if (copy_to_user(argp, &rs485, sizeof(rs485)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int xr_set_rs485_config(struct tty_struct *tty,
+ unsigned long __user *argp)
+{
+ struct usb_serial_port *port = tty->driver_data;
+ struct xr_data *data = usb_get_serial_port_data(port);
+ struct serial_rs485 rs485;
+
+ if (copy_from_user(&rs485, argp, sizeof(rs485)))
+ return -EFAULT;
+
+ dev_dbg(tty->dev, "Flags %02x\n", rs485.flags);
+ data->rs485_flags = rs485.flags & SER_RS485_ENABLED;
+ xr_set_flow_mode(tty, port, (const struct ktermios *)0);
+
+ // Only the enable flag is implemented
+ memset(&rs485, 0, sizeof(rs485));
+ rs485.flags = data->rs485_flags;
+ if (copy_to_user(argp, &rs485, sizeof(rs485)))
+ return -EFAULT;
+
+ return 0;
+}
+
+
+static int xr_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
+{
+ void __user *argp = (void __user *)arg;
+
+ switch (cmd) {
+ case TIOCGRS485:
+ return xr_get_rs485_config(tty, argp);
+ case TIOCSRS485:
+ return xr_set_rs485_config(tty, argp);
+ }
+ return -ENOIOCTLCMD;
+}
+
static int xr_open(struct tty_struct *tty, struct usb_serial_port *port)
{
int ret;
@@ -1010,6 +1069,7 @@ static struct usb_serial_driver xr_device = {
.set_termios = xr_set_termios,
.tiocmget = xr_tiocmget,
.tiocmset = xr_tiocmset,
+ .ioctl = xr_ioctl,
.dtr_rts = xr_dtr_rts
};
--
2.34.1
next prev parent reply other threads:[~2023-03-14 7:01 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-13 1:04 [PATCH] " Jarkko Sonninen
2023-03-13 7:00 ` Greg Kroah-Hartman
2023-03-13 7:49 ` Jarkko Sonninen
2023-03-13 7:53 ` Greg Kroah-Hartman
2023-03-13 8:27 ` [PATCH v2] " Jarkko Sonninen
2023-03-13 8:45 ` Greg Kroah-Hartman
2023-03-13 9:54 ` Oliver Neukum
2023-03-13 10:47 ` Jarkko Sonninen
2023-03-13 11:27 ` Oliver Neukum
2023-03-13 23:02 ` David Laight
2023-03-14 6:19 ` kernel test robot
2023-03-13 15:07 ` [PATCH] " Jarkko Sonninen
2023-03-13 15:50 ` Greg Kroah-Hartman
2023-03-13 15:53 ` Jarkko Sonninen
2023-03-13 20:18 ` Oliver Neukum
2023-03-14 7:00 ` Jarkko Sonninen [this message]
2023-03-14 7:37 ` [PATCH v3] " Greg Kroah-Hartman
2023-03-14 8:00 ` Jarkko Sonninen
2023-04-13 8:57 ` Johan Hovold
2023-04-13 8:53 ` Johan Hovold
2023-04-16 8:40 ` Jarkko Sonninen
2023-04-17 14:50 ` Johan Hovold
2023-04-23 18:59 ` [PATCH v4] " Jarkko Sonninen
2023-04-24 5:32 ` kernel test robot
2023-06-20 12:38 ` Johan Hovold
2023-07-06 19:37 ` Jarkko Sonninen
2023-07-20 13:46 ` Johan Hovold
2023-07-08 14:56 ` [PATCH v5] " Jarkko Sonninen
2023-07-20 13:52 ` Johan Hovold
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230314070002.1008959-1-kasper@iki.fi \
--to=kasper@iki.fi \
--cc=gregkh@linuxfoundation.org \
--cc=johan@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®