[PATCH 08/13] serial s3c: add a driver private struct
Sascha Hauer
s.hauer at pengutronix.de
Sat Feb 25 10:51:05 EST 2012
Do not use dev->priv as a register base, but use a driver private
struct instead. Also, remove usage of dev->type_data
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
drivers/serial/serial_s3c.c | 47 +++++++++++++++++++++++++-----------------
1 files changed, 28 insertions(+), 19 deletions(-)
diff --git a/drivers/serial/serial_s3c.c b/drivers/serial/serial_s3c.c
index b7e0987..a5fd4ee 100644
--- a/drivers/serial/serial_s3c.c
+++ b/drivers/serial/serial_s3c.c
@@ -41,6 +41,13 @@
#define URXH 0x24 /* receive */
#define UBRDIV 0x28 /* baudrate generator */
+struct s3c_uart {
+ void __iomem *regs;
+ struct console_device cdev;
+};
+
+#define to_s3c_uart(c) container_of(c, struct s3c_uart, cdev)
+
static unsigned s3c_get_arch_uart_input_clock(void __iomem *base)
{
unsigned reg = readw(base + UCON);
@@ -60,8 +67,8 @@ static unsigned s3c_get_arch_uart_input_clock(void __iomem *base)
static int s3c_serial_setbaudrate(struct console_device *cdev, int baudrate)
{
- struct device_d *dev = cdev->dev;
- void __iomem *base = dev->priv;
+ struct s3c_uart *priv = to_s3c_uart(cdev);
+ void __iomem *base = priv->regs;
unsigned val;
val = s3c_get_arch_uart_input_clock(base) / (16 * baudrate) - 1;
@@ -72,8 +79,8 @@ static int s3c_serial_setbaudrate(struct console_device *cdev, int baudrate)
static int s3c_serial_init_port(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
- void __iomem *base = dev->priv;
+ struct s3c_uart *priv = to_s3c_uart(cdev);
+ void __iomem *base = priv->regs;
/* FIFO enable, Tx/Rx FIFO clear */
writeb(0x07, base + UFCON);
@@ -98,8 +105,8 @@ static int s3c_serial_init_port(struct console_device *cdev)
static void s3c_serial_putc(struct console_device *cdev, char c)
{
- struct device_d *dev = cdev->dev;
- void __iomem *base = dev->priv;
+ struct s3c_uart *priv = to_s3c_uart(cdev);
+ void __iomem *base = priv->regs;
/* Wait for Tx FIFO not full */
while (!(readb(base + UTRSTAT) & 0x2))
@@ -110,8 +117,8 @@ static void s3c_serial_putc(struct console_device *cdev, char c)
static int s3c_serial_tstc(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
- void __iomem *base = dev->priv;
+ struct s3c_uart *priv = to_s3c_uart(cdev);
+ void __iomem *base = priv->regs;
/* If receive fifo is empty, return false */
if (readb(base + UTRSTAT) & 0x1)
@@ -122,8 +129,8 @@ static int s3c_serial_tstc(struct console_device *cdev)
static int s3c_serial_getc(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
- void __iomem *base = dev->priv;
+ struct s3c_uart *priv = to_s3c_uart(cdev);
+ void __iomem *base = priv->regs;
/* wait for a character */
while (!(readb(base + UTRSTAT) & 0x1))
@@ -134,8 +141,8 @@ static int s3c_serial_getc(struct console_device *cdev)
static void s3c_serial_flush(struct console_device *cdev)
{
- struct device_d *dev = cdev->dev;
- void __iomem *base = dev->priv;
+ struct s3c_uart *priv = to_s3c_uart(cdev);
+ void __iomem *base = priv->regs;
while (!(readb(base + UTRSTAT) & 0x4))
;
@@ -143,11 +150,13 @@ static void s3c_serial_flush(struct console_device *cdev)
static int s3c_serial_probe(struct device_d *dev)
{
+ struct s3c_uart *priv;
struct console_device *cdev;
- cdev = xzalloc(sizeof(struct console_device));
- dev->type_data = cdev;
- dev->priv = dev_request_mem_region(dev, 0);
+ priv = xzalloc(sizeof(struct console_device));
+ cdev = &priv->cdev;
+ priv->regs = dev_request_mem_region(dev, 0);
+ dev->priv = priv;
cdev->dev = dev;
cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
cdev->tstc = s3c_serial_tstc;
@@ -166,11 +175,11 @@ static int s3c_serial_probe(struct device_d *dev)
static void s3c_serial_remove(struct device_d *dev)
{
- struct console_device *cdev = dev->type_data;
+ struct s3c_uart *priv= dev->priv;
- s3c_serial_flush(cdev);
- free(cdev);
- dev->type_data = NULL;
+ s3c_serial_flush(&priv->cdev);
+ console_unregister(&priv->cdev);
+ free(priv);
}
static struct driver_d s3c_serial_driver = {
--
1.7.9.1
More information about the barebox
mailing list