@@ -9,6 +9,7 @@
#include <linux/io.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
+#include <linux/property.h>
#include <linux/serial_8250.h>
#include <linux/serial_reg.h>
#include <linux/platform_device.h>
@@ -19,6 +20,11 @@
#define UART_DLL_EM 9
#define UART_DLM_EM 10
+struct serial8250_em_hw_info {
+ unsigned int type;
+ upf_t flags;
+};
+
struct serial8250_em_priv {
int line;
};
@@ -76,6 +82,7 @@ static void serial8250_em_serial_dl_write(struct uart_8250_port *up, int value)
static int serial8250_em_probe(struct platform_device *pdev)
{
+ const struct serial8250_em_hw_info *info;
struct serial8250_em_priv *priv;
struct device *dev = &pdev->dev;
struct uart_8250_port up;
@@ -83,6 +90,8 @@ static int serial8250_em_probe(struct platform_device *pdev)
struct clk *sclk;
int irq, ret;
+ info = device_get_match_data(dev);
+
irq = platform_get_irq(pdev, 0);
if (irq < 0)
return irq;
@@ -102,8 +111,8 @@ static int serial8250_em_probe(struct platform_device *pdev)
memset(&up, 0, sizeof(up));
up.port.mapbase = regs->start;
up.port.irq = irq;
- up.port.type = PORT_UNKNOWN;
- up.port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP;
+ up.port.type = info->type;
+ up.port.flags = info->flags;
up.port.dev = dev;
up.port.private_data = priv;
@@ -132,9 +141,20 @@ static int serial8250_em_remove(struct platform_device *pdev)
return 0;
}
+static const struct serial8250_em_hw_info emma_mobile_uart_hw_info = {
+ .type = PORT_UNKNOWN,
+ .flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP,
+};
+
+static const struct serial8250_em_hw_info rzv2m_uart_hw_info = {
+ .type = PORT_16750,
+ .flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP | UPF_FIXED_TYPE,
+};
+
static const struct of_device_id serial8250_em_dt_ids[] = {
- { .compatible = "renesas,em-uart", },
- {},
+ { .compatible = "renesas,r9a09g011-uart", .data = &rzv2m_uart_hw_info },
+ { .compatible = "renesas,em-uart", .data = &emma_mobile_uart_hw_info },
+ { /* Sentinel */ }
};
MODULE_DEVICE_TABLE(of, serial8250_em_dt_ids);