summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/serial/serial_imx.c89
1 files changed, 47 insertions, 42 deletions
diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c
index 25e6a0c6fc..a7562f9db1 100644
--- a/drivers/serial/serial_imx.c
+++ b/drivers/serial/serial_imx.c
@@ -171,13 +171,14 @@ struct imx_serial_priv {
struct console_device cdev;
int baudrate;
struct notifier_block notify;
+ void __iomem *regs;
};
-static int imx_serial_reffreq(ulong base)
+static int imx_serial_reffreq(void __iomem *regs)
{
ulong rfdiv;
- rfdiv = (readl(base + UFCR) >> 7) & 7;
+ rfdiv = (readl(regs + UFCR) >> 7) & 7;
rfdiv = rfdiv < 6 ? 6 - rfdiv : 7;
return imx_get_uartclk() / rfdiv;
@@ -190,108 +191,111 @@ static int imx_serial_reffreq(ulong base)
*/
static int imx_serial_init_port(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
- ulong base = dev->map_base;
+ struct imx_serial_priv *priv = container_of(cdev,
+ struct imx_serial_priv, cdev);
+ void __iomem *regs = priv->regs;
uint32_t val;
- writel(UCR1_VAL, base + UCR1);
- writel(UCR2_WS | UCR2_IRTS, base + UCR2);
- writel(UCR3_VAL, base + UCR3);
- writel(UCR4_VAL, base + UCR4);
- writel(0x0000002B, base + UESC);
- writel(0, base + UTIM);
- writel(0, base + UBIR);
- writel(0, base + UBMR);
- writel(0, base + UTS);
+ writel(UCR1_VAL, regs + UCR1);
+ writel(UCR2_WS | UCR2_IRTS, regs + UCR2);
+ writel(UCR3_VAL, regs + UCR3);
+ writel(UCR4_VAL, regs + UCR4);
+ writel(0x0000002B, regs + UESC);
+ writel(0, regs + UTIM);
+ writel(0, regs + UBIR);
+ writel(0, regs + UBMR);
+ writel(0, regs + UTS);
/* Configure FIFOs */
- writel(0xa81, base + UFCR);
+ writel(0xa81, regs + UFCR);
#ifdef ONEMS
- writel(imx_serial_reffreq(base) / 1000, base + ONEMS);
+ writel(imx_serial_reffreq(regs) / 1000, regs + ONEMS);
#endif
/* Enable FIFOs */
- val = readl(base + UCR2);
+ val = readl(regs + UCR2);
val |= UCR2_SRST | UCR2_RXEN | UCR2_TXEN;
- writel(val, base + UCR2);
+ writel(val, regs + UCR2);
/* Clear status flags */
- val = readl(base + USR2);
+ val = readl(regs + USR2);
val |= USR2_ADET | USR2_DTRF | USR2_IDLE | USR2_IRINT | USR2_WAKE |
USR2_RTSF | USR2_BRCD | USR2_ORE | USR2_RDR;
- writel(val, base + USR2);
+ writel(val, regs + USR2);
/* Clear status flags */
- val = readl(base + USR2);
+ val = readl(regs + USR2);
val |= USR1_PARITYERR | USR1_RTSD | USR1_ESCF | USR1_FRAMERR | USR1_AIRINT |
USR1_AWAKE;
- writel(val, base + USR2);
+ writel(val, regs + USR2);
return 0;
}
static void imx_serial_putc(struct console_device *cdev, char c)
{
- struct device_d *dev = cdev->dev;
+ struct imx_serial_priv *priv = container_of(cdev,
+ struct imx_serial_priv, cdev);
/* Wait for Tx FIFO not full */
- while (readl(dev->map_base + UTS) & UTS_TXFULL);
+ while (readl(priv->regs + UTS) & UTS_TXFULL);
- writel(c, dev->map_base + URTX0);
+ writel(c, priv->regs + URTX0);
}
static int imx_serial_tstc(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
+ struct imx_serial_priv *priv = container_of(cdev,
+ struct imx_serial_priv, cdev);
/* If receive fifo is empty, return false */
- if (readl(dev->map_base + UTS) & UTS_RXEMPTY)
+ if (readl(priv->regs + UTS) & UTS_RXEMPTY)
return 0;
return 1;
}
static int imx_serial_getc(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
+ struct imx_serial_priv *priv = container_of(cdev,
+ struct imx_serial_priv, cdev);
unsigned char ch;
- while (readl(dev->map_base + UTS) & UTS_RXEMPTY);
+ while (readl(priv->regs + UTS) & UTS_RXEMPTY);
- ch = readl(dev->map_base + URXD0);
+ ch = readl(priv->regs + URXD0);
return ch;
}
static void imx_serial_flush(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
+ struct imx_serial_priv *priv = container_of(cdev,
+ struct imx_serial_priv, cdev);
- while (!(readl(dev->map_base + USR2) & USR2_TXDC));
+ while (!(readl(priv->regs + USR2) & USR2_TXDC));
}
static int imx_serial_setbaudrate(struct console_device *cdev, int baudrate)
{
- struct device_d *dev = cdev->dev;
struct imx_serial_priv *priv = container_of(cdev,
struct imx_serial_priv, cdev);
+ void __iomem *regs = priv->regs;
uint32_t val;
-
- ulong base = dev->map_base;
- ulong ucr1 = readl(base + UCR1);
+ uint32_t ucr1 = readl(regs + UCR1);
/* disable UART */
- val = readl(base + UCR1);
+ val = readl(regs + UCR1);
val &= ~UCR1_UARTEN;
- writel(val, base + UCR1);
+ writel(val, regs + UCR1);
/* Set the numerator value minus one of the BRM ratio */
- writel((baudrate / 100) - 1, base + UBIR);
+ writel((baudrate / 100) - 1, regs + UBIR);
/* Set the denominator value minus one of the BRM ratio */
- writel((imx_serial_reffreq(base) / 1600) - 1, base + UBMR);
+ writel((imx_serial_reffreq(regs) / 1600) - 1, regs + UBMR);
- writel(ucr1, base + UCR1);
+ writel(ucr1, regs + UCR1);
priv->baudrate = baudrate;
@@ -318,6 +322,7 @@ static int imx_serial_probe(struct device_d *dev)
priv = malloc(sizeof(*priv));
cdev = &priv->cdev;
+ priv->regs = (void __force __iomem *)dev->map_base;
dev->type_data = cdev;
cdev->dev = dev;
cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
@@ -331,9 +336,9 @@ static int imx_serial_probe(struct device_d *dev)
imx_serial_setbaudrate(cdev, 115200);
/* Enable UART */
- val = readl(cdev->dev->map_base + UCR1);
+ val = readl(priv->regs + UCR1);
val |= UCR1_UARTEN;
- writel(val, cdev->dev->map_base + UCR1);
+ writel(val, priv->regs + UCR1);
console_register(cdev);
priv->notify.notifier_call = imx_clocksource_clock_change;