From: cixi.geng@linux.dev
To: "Wenhua Lin" <Wenhua.Lin@unisoc.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Jiri Slaby" <jirislaby@kernel.org>,
"Bartosz Golaszewski" <brgl@bgdev.pl>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>
Cc: "Orson Zhai" <orsonzhai@gmail.com>,
"Baolin Wang" <baolin.wang@linux.alibaba.com>,
"Chunyan Zhang" <zhang.lyra@gmail.com>,
linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
devicetree@vger.kernel.org,
"wenhua lin" <wenhua.lin1994@gmail.com>,
"Wenhua Lin" <Wenhua.Lin@unisoc.com>,
"Xiongpeng Wu" <xiongpeng.wu@unisoc.com>,
"Zhaochen Su" <Zhaochen.Su@unisoc.com>,
"Zhirong Qiu" <Zhirong.Qiu@unisoc.com>
Subject: Re: [PATCH 1/2] serial: sprd: Add support for sc9632
Date: Fri, 15 Nov 2024 08:39:47 +0000 [thread overview]
Message-ID: <d9bd254f7d2f43c99b9d2369af59b208d787683a@linux.dev> (raw)
In-Reply-To: <20241113110516.2166328-2-Wenhua.Lin@unisoc.com>
2024年11月13日 19:05, "Wenhua Lin" <Wenhua.Lin@unisoc.com> 写到:
>
> Due to the platform's new project uart ip upgrade,
>
> the new project's timeout interrupt needs to use bit17
>
> while other projects' timeout interrupt needs to use
>
> bit13, using private data to adapt and be compatible
>
> with all projects.
>
> Signed-off-by: Wenhua Lin <Wenhua.Lin@unisoc.com>
>
> ---
>
> drivers/tty/serial/sprd_serial.c | 41 ++++++++++++++++++++++++++++----
>
> 1 file changed, 36 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c
>
> index 3fc54cc02a1f..882580c3cf37 100644
>
> --- a/drivers/tty/serial/sprd_serial.c
>
> +++ b/drivers/tty/serial/sprd_serial.c
>
> @@ -53,10 +53,12 @@
>
> #define SPRD_IEN_TX_EMPTY BIT(1)
>
> #define SPRD_IEN_BREAK_DETECT BIT(7)
>
> #define SPRD_IEN_TIMEOUT BIT(13)
>
> +#define SPRD_IEN_DATA_TIMEOUT BIT(17)
>
>
>
> /* interrupt clear register */
>
> #define SPRD_ICLR 0x0014
>
> #define SPRD_ICLR_TIMEOUT BIT(13)
>
> +#define SPRD_ICLR_DATA_TIMEOUT BIT(17)
>
>
>
> /* line control register */
>
> #define SPRD_LCR 0x0018
>
> @@ -102,6 +104,7 @@
>
> #define SPRD_IMSR_TX_FIFO_EMPTY BIT(1)
>
> #define SPRD_IMSR_BREAK_DETECT BIT(7)
>
> #define SPRD_IMSR_TIMEOUT BIT(13)
>
> +#define SPRD_IMSR_DATA_TIMEOUT BIT(17)
>
> #define SPRD_DEFAULT_SOURCE_CLK 26000000
>
>
>
> #define SPRD_RX_DMA_STEP 1
>
> @@ -118,6 +121,12 @@ struct sprd_uart_dma {
>
> bool enable;
>
> };
>
>
>
> +struct sprd_uart_data {
>
> + unsigned int timeout_ien;
>
> + unsigned int timeout_iclr;
>
> + unsigned int timeout_imsr;
>
> +};
>
> +
>
> struct sprd_uart_port {
>
> struct uart_port port;
>
> char name[16];
>
> @@ -126,6 +135,7 @@ struct sprd_uart_port {
>
> struct sprd_uart_dma rx_dma;
>
> dma_addr_t pos;
>
> unsigned char *rx_buf_tail;
>
> + const struct sprd_uart_data *pdata;
>
> };
>
>
>
> static struct sprd_uart_port *sprd_port[UART_NR_MAX];
>
> @@ -134,6 +144,18 @@ static int sprd_ports_num;
>
> static int sprd_start_dma_rx(struct uart_port *port);
>
> static int sprd_tx_dma_config(struct uart_port *port);
>
>
>
> +static const struct sprd_uart_data sc9836_data = {
>
> + .timeout_ien = SPRD_IEN_TIMEOUT,
>
> + .timeout_iclr = SPRD_ICLR_TIMEOUT,
>
> + .timeout_imsr = SPRD_IMSR_TIMEOUT,
>
> +};
>
> +
>
> +static const struct sprd_uart_data sc9632_data = {
>
> + .timeout_ien = SPRD_IEN_DATA_TIMEOUT,
>
> + .timeout_iclr = SPRD_ICLR_DATA_TIMEOUT,
>
> + .timeout_imsr = SPRD_IMSR_DATA_TIMEOUT,
>
> +};
>
> +
>
> static inline unsigned int serial_in(struct uart_port *port,
>
> unsigned int offset)
>
> {
>
> @@ -637,6 +659,8 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
>
> {
>
> struct uart_port *port = dev_id;
>
> unsigned int ims;
>
> + struct sprd_uart_port *sp =
>
> + container_of(port, struct sprd_uart_port, port);
>
>
>
> uart_port_lock(port);
>
>
>
> @@ -647,14 +671,14 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
>
> return IRQ_NONE;
>
> }
>
>
>
> - if (ims & SPRD_IMSR_TIMEOUT)
>
> - serial_out(port, SPRD_ICLR, SPRD_ICLR_TIMEOUT);
>
> + if (ims & sp->pdata->timeout_imsr)
>
> + serial_out(port, SPRD_ICLR, sp->pdata->timeout_iclr);
>
>
>
> if (ims & SPRD_IMSR_BREAK_DETECT)
>
> serial_out(port, SPRD_ICLR, SPRD_IMSR_BREAK_DETECT);
>
>
>
> if (ims & (SPRD_IMSR_RX_FIFO_FULL | SPRD_IMSR_BREAK_DETECT |
>
> - SPRD_IMSR_TIMEOUT))
>
> + sp->pdata->timeout_imsr))
>
> sprd_rx(port);
>
>
>
> if (ims & SPRD_IMSR_TX_FIFO_EMPTY)
>
> @@ -729,7 +753,7 @@ static int sprd_startup(struct uart_port *port)
>
> /* enable interrupt */
>
> uart_port_lock_irqsave(port, &flags);
>
> ien = serial_in(port, SPRD_IEN);
>
> - ien |= SPRD_IEN_BREAK_DETECT | SPRD_IEN_TIMEOUT;
>
> + ien |= SPRD_IEN_BREAK_DETECT | sp->pdata->timeout_ien;
>
> if (!sp->rx_dma.enable)
>
> ien |= SPRD_IEN_RX_FULL;
>
> serial_out(port, SPRD_IEN, ien);
>
> @@ -1184,6 +1208,12 @@ static int sprd_probe(struct platform_device *pdev)
>
>
>
> up->mapbase = res->start;
>
>
>
> + sport->pdata = of_device_get_match_data(&pdev->dev);
>
> + if (!sport->pdata) {
>
> + dev_err(&pdev->dev, "get match data failed!\n");
>
> + return -EINVAL;
>
> + }
>
> +
>
> irq = platform_get_irq(pdev, 0);
>
> if (irq < 0)
>
> return irq;
>
> @@ -1248,7 +1278,8 @@ static int sprd_resume(struct device *dev)
>
> static SIMPLE_DEV_PM_OPS(sprd_pm_ops, sprd_suspend, sprd_resume);
>
>
>
> static const struct of_device_id serial_ids[] = {
>
> - {.compatible = "sprd,sc9836-uart",},
>
> + {.compatible = "sprd,sc9836-uart", .data = &sc9836_data},
>
> + {.compatible = "sprd,sc9632-uart", .data = &sc9632_data},
>
> {}
>
> };
>
> MODULE_DEVICE_TABLE(of, serial_ids);
>
> --
>
> 2.34.1
>
Acked-by: Cixi Geng <cixi.geng@linux.dev>
next prev parent reply other threads:[~2024-11-15 8:39 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-13 11:05 [PATCH 0/2] serial: sprd: Modification of UNISOC Platform UART Driver Wenhua Lin
2024-11-13 11:05 ` [PATCH 1/2] serial: sprd: Add support for sc9632 Wenhua Lin
2024-11-15 5:47 ` Baolin Wang
2024-11-15 7:46 ` wenhua lin
2024-11-15 8:06 ` Baolin Wang
2024-11-15 8:39 ` cixi.geng [this message]
2024-11-13 11:05 ` [PATCH 2/2] dt-bindings: serial: Add a new compatible string for ums9632 Wenhua Lin
2024-11-14 20:12 ` Conor Dooley
2024-11-15 8:40 ` cixi.geng
2024-11-21 12:26 ` Stanislav Jakubek
2024-11-21 13:34 ` Krzysztof Kozlowski
2025-01-13 2:29 ` wenhua lin
2025-01-13 7:42 ` Krzysztof Kozlowski
2025-01-13 2:29 ` wenhua lin
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=d9bd254f7d2f43c99b9d2369af59b208d787683a@linux.dev \
--to=cixi.geng@linux.dev \
--cc=Wenhua.Lin@unisoc.com \
--cc=Zhaochen.Su@unisoc.com \
--cc=Zhirong.Qiu@unisoc.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=brgl@bgdev.pl \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=orsonzhai@gmail.com \
--cc=robh@kernel.org \
--cc=wenhua.lin1994@gmail.com \
--cc=xiongpeng.wu@unisoc.com \
--cc=zhang.lyra@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.