misc: cec: add worker handler for resume
Shridhar Rasal [Tue, 14 May 2013 09:30:33 +0000 (14:30 +0530)]
HDMI CEC needs 1 sec delay for reset hardware in resume.
Adding work handler for CEC init.

Bug 1283088

Change-Id: I4498584ec93c1a5eefddfad9966cb5a1e7776e6e
Signed-off-by: Shridhar Rasal <srasal@nvidia.com>
Reviewed-on: http://git-master/r/228332
Reviewed-by: Sachin Nikam <snikam@nvidia.com>

drivers/misc/tegra-cec/tegra_cec.c
drivers/misc/tegra-cec/tegra_cec.h

index a368a22..21c5bee 100644 (file)
@@ -236,6 +236,13 @@ static void tegra_cec_init(struct tegra_cec *cec)
           cec->cec_base + TEGRA_CEC_INT_MASK);
 }
 
+static void tegra_cec_init_worker(struct work_struct *work)
+{
+       struct tegra_cec *cec = container_of(work, struct tegra_cec, work);
+
+       tegra_cec_init(cec);
+}
+
 static int __devinit tegra_cec_probe(struct platform_device *pdev)
 {
        struct tegra_cec *cec;
@@ -300,7 +307,8 @@ static int __devinit tegra_cec_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, cec);
        /* clear out the hardware. */
 
-       tegra_cec_init(cec);
+       INIT_WORK(&cec->work, tegra_cec_init_worker);
+       schedule_work(&cec->work);
 
        device_init_wakeup(&pdev->dev, 1);
 
@@ -342,6 +350,7 @@ static int tegra_cec_remove(struct platform_device *pdev)
        clk_put(cec->clk);
 
        misc_deregister(&cec->misc_dev);
+       cancel_work_sync(&cec->work);
 
        return 0;
 }
@@ -358,10 +367,11 @@ static int tegra_cec_suspend(struct platform_device *pdev, pm_message_t state)
 
 static int tegra_cec_resume(struct platform_device *pdev)
 {
-
        struct tegra_cec *cec = platform_get_drvdata(pdev);
+
        clk_enable(cec->clk);
-       tegra_cec_init(cec);
+       schedule_work(&cec->work);
+
        return 0;
 }
 #endif
index acc94dc..e33eb20 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/misc/tegra-cec/tegra_cec.h
  *
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2012-2013, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -29,6 +29,7 @@ struct tegra_cec {
        wait_queue_head_t       tx_waitq;
        unsigned int            rx_wake;
        unsigned int            tx_wake;
+       struct work_struct      work;
 };
 static int tegra_cec_remove(struct platform_device *pdev);