lkml.org 
[lkml]   [2015]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 028/122] serial: xilinx: Use platform_get_irq to get irq description structure
    Date
    3.13.11-ckt22 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Michal Simek <michal.simek@xilinx.com>

    commit 5c90c07b98c02198d9777a7c4f3047b0a94bf7ed upstream.

    For systems with CONFIG_SERIAL_OF_PLATFORM=y and device_type =
    "serial"; property in DT of_serial.c driver maps and unmaps IRQ (because
    driver probe fails). Then a driver is called but irq mapping is not
    created that's why driver is failing again in again on request_irq().
    Based on this use platform_get_irq() instead of platform_get_resource()
    which is doing irq_desc allocation and driver itself can request IRQ.

    Fix both xilinx serial drivers in the tree.

    Signed-off-by: Michal Simek <michal.simek@xilinx.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [ kamal: backport to 3.13-stable: context ]
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/tty/serial/uartlite.c | 11 ++++++-----
    drivers/tty/serial/xilinx_uartps.c | 12 ++++++------
    2 files changed, 12 insertions(+), 11 deletions(-)

    diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c
    index 5f90ef2..0de299c 100644
    --- a/drivers/tty/serial/uartlite.c
    +++ b/drivers/tty/serial/uartlite.c
    @@ -629,7 +629,8 @@ MODULE_DEVICE_TABLE(of, ulite_of_match);

    static int ulite_probe(struct platform_device *pdev)
    {
    - struct resource *res, *res2;
    + struct resource *res;
    + int irq;
    int id = pdev->id;
    #ifdef CONFIG_OF
    const __be32 *prop;
    @@ -643,11 +644,11 @@ static int ulite_probe(struct platform_device *pdev)
    if (!res)
    return -ENODEV;

    - res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
    - if (!res2)
    - return -ENODEV;
    + irq = platform_get_irq(pdev, 0);
    + if (irq <= 0)
    + return -ENXIO;

    - return ulite_assign(&pdev->dev, id, res->start, res2->start);
    + return ulite_assign(&pdev->dev, id, res->start, irq);
    }

    static int ulite_remove(struct platform_device *pdev)
    diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
    index f619ad5..a3a57c9 100644
    --- a/drivers/tty/serial/xilinx_uartps.c
    +++ b/drivers/tty/serial/xilinx_uartps.c
    @@ -1340,9 +1340,9 @@ static SIMPLE_DEV_PM_OPS(xuartps_dev_pm_ops, xuartps_suspend, xuartps_resume);
    **/
    static int xuartps_probe(struct platform_device *pdev)
    {
    - int rc;
    + int rc, irq;
    struct uart_port *port;
    - struct resource *res, *res2;
    + struct resource *res;
    struct xuartps *xuartps_data;

    xuartps_data = devm_kzalloc(&pdev->dev, sizeof(*xuartps_data),
    @@ -1378,9 +1378,9 @@ static int xuartps_probe(struct platform_device *pdev)
    goto err_out_clk_disable;
    }

    - res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
    - if (!res2) {
    - rc = -ENODEV;
    + irq = platform_get_irq(pdev, 0);
    + if (irq <= 0) {
    + rc = -ENXIO;
    goto err_out_clk_disable;
    }

    @@ -1405,7 +1405,7 @@ static int xuartps_probe(struct platform_device *pdev)
    * and triggers invocation of the config_port() entry point.
    */
    port->mapbase = res->start;
    - port->irq = res2->start;
    + port->irq = irq;
    port->dev = &pdev->dev;
    port->uartclk = clk_get_rate(xuartps_data->refclk);
    port->private_data = xuartps_data;
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-06-18 01:21    [W:4.019 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site