BACKPORT: tty: goldfish: support platform_device with id -1
authorGreg Hackmann <ghackmann@google.com>
Fri, 26 Feb 2016 19:01:05 +0000 (19:01 +0000)
committerJin Qian <jinqian@google.com>
Thu, 17 Nov 2016 17:56:06 +0000 (09:56 -0800)
When the platform bus sets the platform_device id to -1 (PLATFORM_DEVID_NONE),
use an incrementing counter for the TTY index instead

Signed-off-by: Greg Hackmann <ghackmann@google.com>
Signed-off-by: Jin Qian <jinqian@android.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 465893e18878e119d8d0255439fad8debbd646fd)

Change-Id: Ifec5ee9d71c7c076e59bb7af77c0184d1b1383cb

drivers/tty/goldfish.c

index 0f82c0b146f6d8eb0bdea4a92e4c8a4d72dd3332..4356a23c588fe67ee5a14b7a76cf71131c714eeb 100644 (file)
@@ -68,8 +68,7 @@ static void goldfish_tty_do_write(int line, const char *buf, unsigned count)
 
 static irqreturn_t goldfish_tty_interrupt(int irq, void *dev_id)
 {
-       struct platform_device *pdev = dev_id;
-       struct goldfish_tty *qtty = &goldfish_ttys[pdev->id];
+       struct goldfish_tty *qtty = dev_id;
        void __iomem *base = qtty->base;
        unsigned long irq_flags;
        unsigned char *buf;
@@ -233,6 +232,7 @@ static int goldfish_tty_probe(struct platform_device *pdev)
        struct device *ttydev;
        void __iomem *base;
        u32 irq;
+       unsigned int line;
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (r == NULL)
@@ -248,10 +248,16 @@ static int goldfish_tty_probe(struct platform_device *pdev)
 
        irq = r->start;
 
-       if (pdev->id >= goldfish_tty_line_count)
-               goto err_unmap;
-
        mutex_lock(&goldfish_tty_lock);
+
+       if (pdev->id == PLATFORM_DEVID_NONE)
+               line = goldfish_tty_current_line_count;
+       else
+               line = pdev->id;
+
+       if (line >= goldfish_tty_line_count)
+               goto err_create_driver_failed;
+
        if (goldfish_tty_current_line_count == 0) {
                ret = goldfish_tty_create_driver();
                if (ret)
@@ -259,7 +265,7 @@ static int goldfish_tty_probe(struct platform_device *pdev)
        }
        goldfish_tty_current_line_count++;
 
-       qtty = &goldfish_ttys[pdev->id];
+       qtty = &goldfish_ttys[line];
        spin_lock_init(&qtty->lock);
        tty_port_init(&qtty->port);
        qtty->port.ops = &goldfish_port_ops;
@@ -269,13 +275,13 @@ static int goldfish_tty_probe(struct platform_device *pdev)
        writel(GOLDFISH_TTY_CMD_INT_DISABLE, base + GOLDFISH_TTY_CMD);
 
        ret = request_irq(irq, goldfish_tty_interrupt, IRQF_SHARED,
-                                               "goldfish_tty", pdev);
+                                               "goldfish_tty", qtty);
        if (ret)
                goto err_request_irq_failed;
 
 
        ttydev = tty_port_register_device(&qtty->port, goldfish_tty_driver,
-                                                       pdev->id, &pdev->dev);
+                                                       line, &pdev->dev);
        if (IS_ERR(ttydev)) {
                ret = PTR_ERR(ttydev);
                goto err_tty_register_device_failed;
@@ -286,8 +292,9 @@ static int goldfish_tty_probe(struct platform_device *pdev)
        qtty->console.device = goldfish_tty_console_device;
        qtty->console.setup = goldfish_tty_console_setup;
        qtty->console.flags = CON_PRINTBUFFER;
-       qtty->console.index = pdev->id;
+       qtty->console.index = line;
        register_console(&qtty->console);
+       platform_set_drvdata(pdev, qtty);
 
        mutex_unlock(&goldfish_tty_lock);
        return 0;
@@ -307,13 +314,12 @@ err_unmap:
 
 static int goldfish_tty_remove(struct platform_device *pdev)
 {
-       struct goldfish_tty *qtty;
+       struct goldfish_tty *qtty = platform_get_drvdata(pdev);
 
        mutex_lock(&goldfish_tty_lock);
 
-       qtty = &goldfish_ttys[pdev->id];
        unregister_console(&qtty->console);
-       tty_unregister_device(goldfish_tty_driver, pdev->id);
+       tty_unregister_device(goldfish_tty_driver, qtty->console.index);
        iounmap(qtty->base);
        qtty->base = NULL;
        free_irq(qtty->irq, pdev);