diff --git a/drivers/misc/tegra-cec/tegra_cec.c b/drivers/misc/tegra-cec/tegra_cec.c index 5b7a778e..c34f91f5 100644 --- a/drivers/misc/tegra-cec/tegra_cec.c +++ b/drivers/misc/tegra-cec/tegra_cec.c @@ -234,7 +234,14 @@ static void tegra_cec_init(struct tegra_cec *cec) cec->cec_base + TEGRA_CEC_INT_MASK); } -static int __devinit tegra_cec_probe(struct platform_device *pdev) +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 tegra_cec_probe(struct platform_device *pdev) { struct tegra_cec *cec; struct resource *res; @@ -298,7 +305,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); @@ -340,6 +348,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; } @@ -356,10 +365,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 diff --git a/drivers/misc/tegra-cec/tegra_cec.h b/drivers/misc/tegra-cec/tegra_cec.h index 4f908cc6..c94f3996 100644 --- a/drivers/misc/tegra-cec/tegra_cec.h +++ b/drivers/misc/tegra-cec/tegra_cec.h @@ -30,6 +30,7 @@ struct tegra_cec { unsigned int rx_wake; unsigned int tx_wake; unsigned short rx_buffer; + struct work_struct work; }; static int tegra_cec_remove(struct platform_device *pdev);