tty: serial: fsl_lpuart: add LS1028A support
The LS1028A uses little endian register access and has a different FIFO size encoding. Signed-off-by: Michael Walle <michael@walle.cc> Link: https://lore.kernel.org/r/20200306214433.23215-4-michael@walle.cc Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a092ab25fd
commit
c2f448cff2
@ -234,6 +234,7 @@ static DEFINE_IDA(fsl_lpuart_ida);
|
|||||||
enum lpuart_type {
|
enum lpuart_type {
|
||||||
VF610_LPUART,
|
VF610_LPUART,
|
||||||
LS1021A_LPUART,
|
LS1021A_LPUART,
|
||||||
|
LS1028A_LPUART,
|
||||||
IMX7ULP_LPUART,
|
IMX7ULP_LPUART,
|
||||||
IMX8QXP_LPUART,
|
IMX8QXP_LPUART,
|
||||||
};
|
};
|
||||||
@ -278,11 +279,16 @@ static const struct lpuart_soc_data vf_data = {
|
|||||||
.iotype = UPIO_MEM,
|
.iotype = UPIO_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct lpuart_soc_data ls_data = {
|
static const struct lpuart_soc_data ls1021a_data = {
|
||||||
.devtype = LS1021A_LPUART,
|
.devtype = LS1021A_LPUART,
|
||||||
.iotype = UPIO_MEM32BE,
|
.iotype = UPIO_MEM32BE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct lpuart_soc_data ls1028a_data = {
|
||||||
|
.devtype = LS1028A_LPUART,
|
||||||
|
.iotype = UPIO_MEM32,
|
||||||
|
};
|
||||||
|
|
||||||
static struct lpuart_soc_data imx7ulp_data = {
|
static struct lpuart_soc_data imx7ulp_data = {
|
||||||
.devtype = IMX7ULP_LPUART,
|
.devtype = IMX7ULP_LPUART,
|
||||||
.iotype = UPIO_MEM32,
|
.iotype = UPIO_MEM32,
|
||||||
@ -297,7 +303,8 @@ static struct lpuart_soc_data imx8qxp_data = {
|
|||||||
|
|
||||||
static const struct of_device_id lpuart_dt_ids[] = {
|
static const struct of_device_id lpuart_dt_ids[] = {
|
||||||
{ .compatible = "fsl,vf610-lpuart", .data = &vf_data, },
|
{ .compatible = "fsl,vf610-lpuart", .data = &vf_data, },
|
||||||
{ .compatible = "fsl,ls1021a-lpuart", .data = &ls_data, },
|
{ .compatible = "fsl,ls1021a-lpuart", .data = &ls1021a_data, },
|
||||||
|
{ .compatible = "fsl,ls1028a-lpuart", .data = &ls1028a_data, },
|
||||||
{ .compatible = "fsl,imx7ulp-lpuart", .data = &imx7ulp_data, },
|
{ .compatible = "fsl,imx7ulp-lpuart", .data = &imx7ulp_data, },
|
||||||
{ .compatible = "fsl,imx8qxp-lpuart", .data = &imx8qxp_data, },
|
{ .compatible = "fsl,imx8qxp-lpuart", .data = &imx8qxp_data, },
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
@ -307,6 +314,11 @@ MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
|
|||||||
/* Forward declare this for the dma callbacks*/
|
/* Forward declare this for the dma callbacks*/
|
||||||
static void lpuart_dma_tx_complete(void *arg);
|
static void lpuart_dma_tx_complete(void *arg);
|
||||||
|
|
||||||
|
static inline bool is_ls1028a_lpuart(struct lpuart_port *sport)
|
||||||
|
{
|
||||||
|
return sport->devtype == LS1028A_LPUART;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_imx8qxp_lpuart(struct lpuart_port *sport)
|
static inline bool is_imx8qxp_lpuart(struct lpuart_port *sport)
|
||||||
{
|
{
|
||||||
return sport->devtype == IMX8QXP_LPUART;
|
return sport->devtype == IMX8QXP_LPUART;
|
||||||
@ -1626,6 +1638,17 @@ static int lpuart32_startup(struct uart_port *port)
|
|||||||
sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_RXSIZE_OFF) &
|
sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_RXSIZE_OFF) &
|
||||||
UARTFIFO_FIFOSIZE_MASK);
|
UARTFIFO_FIFOSIZE_MASK);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The LS1028A has a fixed length of 16 words. Although it supports the
|
||||||
|
* RX/TXSIZE fields their encoding is different. Eg the reference manual
|
||||||
|
* states 0b101 is 16 words.
|
||||||
|
*/
|
||||||
|
if (is_ls1028a_lpuart(sport)) {
|
||||||
|
sport->rxfifo_size = 16;
|
||||||
|
sport->txfifo_size = 16;
|
||||||
|
sport->port.fifosize = sport->txfifo_size;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&sport->port.lock, flags);
|
spin_lock_irqsave(&sport->port.lock, flags);
|
||||||
|
|
||||||
lpuart32_setup_watermark_enable(sport);
|
lpuart32_setup_watermark_enable(sport);
|
||||||
|
Loading…
Reference in New Issue
Block a user