Signed-off-by: Andreas Fenkart <afenkart@xxxxxxxxx> --- drivers/tty/serial/imx.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 231e7d5..aab8681 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -25,6 +25,7 @@ #include <linux/ioport.h> #include <linux/init.h> #include <linux/console.h> +#include <linux/debugfs.h> #include <linux/sysrq.h> #include <linux/platform_device.h> #include <linux/tty.h> @@ -64,6 +65,7 @@ #define IMX21_ONEMS 0xb0 /* One Millisecond register */ #define IMX1_UTS 0xd0 /* UART Test Register on i.mx1 */ #define IMX21_UTS 0xb4 /* UART Test Register on all other i.mx*/ +#define IMX6_UMCR 0xb8 /* RS-485 Mode Control Register */ /* UART Control Register Bit Fields.*/ #define URXD_DUMMY_READ (1<<16) @@ -226,6 +228,8 @@ struct imx_port { wait_queue_head_t dma_wait; unsigned int saved_reg[10]; bool context_saved; + + struct dentry *debugfs; }; struct imx_port_ucrs { @@ -292,6 +296,71 @@ static inline int is_imx6q_uart(struct imx_port *sport) { return sport->devdata->devtype == IMX6Q_UART; } + +#ifdef CONFIG_DEBUG_FS +static int imx_regs_show(struct seq_file *s, void *data) +{ + struct imx_port *sport = s->private; + struct uart_port *port = &sport->port; + + seq_printf(s, "uart%d:\t%s\n", port->line, dev_name(port->dev)); + seq_printf(s, "UCR1:\t0x%08x\n", readl(port->membase + UCR1)); + seq_printf(s, "UCR2:\t0x%08x\n", readl(port->membase + UCR2)); + seq_printf(s, "UCR3:\t0x%08x\n", readl(port->membase + UCR3)); + seq_printf(s, "UCR4:\t0x%08x\n", readl(port->membase + UCR4)); + seq_printf(s, "UFCR:\t0x%08x\n", readl(port->membase + UFCR)); + seq_printf(s, "USR1:\t0x%08x\n", readl(port->membase + USR1)); + seq_printf(s, "USR2:\t0x%08x\n", readl(port->membase + USR2)); + seq_printf(s, "UESC:\t0x%08x\n", readl(port->membase + UESC)); + seq_printf(s, "UTIM:\t0x%08x\n", readl(port->membase + UTIM)); + seq_printf(s, "UBIR:\t0x%08x\n", readl(port->membase + UBIR)); + seq_printf(s, "UBMR:\t0x%08x\n", readl(port->membase + UBMR)); + seq_printf(s, "UBRC:\t0x%08x\n", readl(port->membase + UBRC)); + + seq_printf(s, "UTS:\t0x%08x\n", readl(port->membase + uts_reg(sport))); + if (is_imx21_uart(sport)) { + seq_printf(s, "ONEMS:\t0x%08x\n", readl(port->membase + + IMX21_ONEMS)); + } else if (is_imx6q_uart(sport)) { + seq_printf(s, "ONEMS:\t0x%08x\n", readl(port->membase + + IMX21_ONEMS)); + seq_printf(s, "UMCR:\t0x%08x\n", readl(port->membase + + IMX6_UMCR)); + } + + return 0; +} + +static int imx_regs_open(struct inode *inode, struct file *file) +{ + return single_open(file, imx_regs_show, inode->i_private); +} + +static const struct file_operations debugfs_reg_ops = { + .owner = THIS_MODULE, + .open = imx_regs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void imx_debugfs(struct imx_port *sport) +{ + char name[20]; + + snprintf(name, sizeof(name), "uart%d_regs", sport->port.line); + sport->debugfs = debugfs_create_file(name, S_IFREG | S_IRUGO, + NULL, sport, &debugfs_reg_ops); +} + +#else + +static void imx_debugfs(struct imx_port *sport) +{ +} + +#endif + /* * Save and restore functions for UCR1, UCR2 and UCR3 registers */ @@ -2058,6 +2127,7 @@ static int serial_imx_probe(struct platform_device *pdev) imx_ports[sport->port.line] = sport; platform_set_drvdata(pdev, sport); + imx_debugfs(sport); return uart_add_one_port(&imx_reg, &sport->port); } -- 2.8.1 -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html