Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a7320c4 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman
Browse files

serial: 8250_dw: Add ACPI 5.0 support



This adds support for ACPI 5.0 enumerated Designware UARTs.
ACPI does not deliver information about uart clk, so
delivering it with the driver_data.

Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 30046df2
Loading
Loading
Loading
Loading
+41 −0
Original line number Original line Diff line number Diff line
@@ -2,6 +2,7 @@
 * Synopsys DesignWare 8250 driver.
 * Synopsys DesignWare 8250 driver.
 *
 *
 * Copyright 2011 Picochip, Jamie Iles.
 * Copyright 2011 Picochip, Jamie Iles.
 * Copyright 2013 Intel Corporation
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * it under the terms of the GNU General Public License as published by
@@ -24,12 +25,16 @@
#include <linux/of_platform.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/acpi.h>


/* Offsets for the DesignWare specific registers */
/* Offsets for the DesignWare specific registers */
#define DW_UART_USR	0x1f /* UART Status Register */
#define DW_UART_USR	0x1f /* UART Status Register */
#define DW_UART_CPR	0xf4 /* Component Parameter Register */
#define DW_UART_CPR	0xf4 /* Component Parameter Register */
#define DW_UART_UCV	0xf8 /* UART Component Version */
#define DW_UART_UCV	0xf8 /* UART Component Version */


/* Intel Low Power Subsystem specific */
#define LPSS_PRV_CLOCK_PARAMS 0x800

/* Component Parameter Register bits */
/* Component Parameter Register bits */
#define DW_UART_CPR_ABP_DATA_WIDTH	(3 << 0)
#define DW_UART_CPR_ABP_DATA_WIDTH	(3 << 0)
#define DW_UART_CPR_AFCE_MODE		(1 << 4)
#define DW_UART_CPR_AFCE_MODE		(1 << 4)
@@ -138,6 +143,30 @@ static int dw8250_probe_of(struct uart_port *p)
	return 0;
	return 0;
}
}


static int dw8250_probe_acpi(struct uart_port *p)
{
	const struct acpi_device_id *id;
	u32 reg;

	id = acpi_match_device(p->dev->driver->acpi_match_table, p->dev);
	if (!id)
		return -ENODEV;

	p->iotype = UPIO_MEM32;
	p->serial_in = dw8250_serial_in32;
	p->serial_out = dw8250_serial_out32;
	p->regshift = 2;
	p->uartclk = (unsigned int)id->driver_data;

	/* Fix Haswell issue where the clocks do not get enabled */
	if (!strcmp(id->id, "INT33C4") || !strcmp(id->id, "INT33C5")) {
		reg = readl(p->membase + LPSS_PRV_CLOCK_PARAMS);
		writel(reg | 1, p->membase + LPSS_PRV_CLOCK_PARAMS);
	}

	return 0;
}

static void dw8250_setup_port(struct uart_8250_port *up)
static void dw8250_setup_port(struct uart_8250_port *up)
{
{
	struct uart_port	*p = &up->port;
	struct uart_port	*p = &up->port;
@@ -199,6 +228,10 @@ static int dw8250_probe(struct platform_device *pdev)
		err = dw8250_probe_of(&uart.port);
		err = dw8250_probe_of(&uart.port);
		if (err)
		if (err)
			return err;
			return err;
	} else if (ACPI_HANDLE(&pdev->dev)) {
		err = dw8250_probe_acpi(&uart.port);
		if (err)
			return err;
	} else {
	} else {
		return -ENODEV;
		return -ENODEV;
	}
	}
@@ -258,11 +291,19 @@ static const struct of_device_id dw8250_of_match[] = {
};
};
MODULE_DEVICE_TABLE(of, dw8250_of_match);
MODULE_DEVICE_TABLE(of, dw8250_of_match);


static const struct acpi_device_id dw8250_acpi_match[] = {
	{ "INT33C4", 100000000 },
	{ "INT33C5", 100000000 },
	{ },
};
MODULE_DEVICE_TABLE(acpi, dw8250_acpi_match);

static struct platform_driver dw8250_platform_driver = {
static struct platform_driver dw8250_platform_driver = {
	.driver = {
	.driver = {
		.name		= "dw-apb-uart",
		.name		= "dw-apb-uart",
		.owner		= THIS_MODULE,
		.owner		= THIS_MODULE,
		.of_match_table	= dw8250_of_match,
		.of_match_table	= dw8250_of_match,
		.acpi_match_table = ACPI_PTR(dw8250_acpi_match),
	},
	},
	.probe			= dw8250_probe,
	.probe			= dw8250_probe,
	.remove			= dw8250_remove,
	.remove			= dw8250_remove,
+1 −1
Original line number Original line Diff line number Diff line
@@ -256,7 +256,7 @@ config SERIAL_8250_FSL


config SERIAL_8250_DW
config SERIAL_8250_DW
	tristate "Support for Synopsys DesignWare 8250 quirks"
	tristate "Support for Synopsys DesignWare 8250 quirks"
	depends on SERIAL_8250 && OF
	depends on SERIAL_8250
	help
	help
	  Selecting this option will enable handling of the extra features
	  Selecting this option will enable handling of the extra features
	  present in the Synopsys DesignWare APB UART.
	  present in the Synopsys DesignWare APB UART.