struct tegra_cec *cec = container_of(miscdev,
struct tegra_cec, misc_dev);
dev_dbg(cec->dev, "%s\n", __func__);
+
+ wait_event_interruptible(cec->init_waitq, cec->init_done == 1);
file->private_data = cec;
return 0;
count = 4;
+ wait_event_interruptible(cec->init_waitq, cec->init_done == 1);
+
if (copy_from_user(&write_buff, buffer, count))
return -EFAULT;
struct tegra_cec *cec = file->private_data;
count = 2;
+ wait_event_interruptible(cec->init_waitq, cec->init_done == 1);
+
if (cec->rx_wake == 0)
if (file->f_flags & O_NONBLOCK)
return -EAGAIN;
struct tegra_cec *cec = dev_get_drvdata(dev);
unsigned long status;
+ wait_event_interruptible(cec->init_waitq, cec->init_done == 1);
+
status = readl(cec->cec_base + TEGRA_CEC_INT_STAT);
if (!status)
static void tegra_cec_init(struct tegra_cec *cec)
{
+ dev_notice(cec->dev, "%s started\n", __func__);
+
+ cec->init_done = 0;
+
writel(0x00, cec->cec_base + TEGRA_CEC_HW_CONTROL);
writel(0x00, cec->cec_base + TEGRA_CEC_INT_MASK);
writel(0xffffffff, cec->cec_base + TEGRA_CEC_INT_STAT);
TEGRA_CEC_INT_MASK_RX_REGISTER_FULL |
TEGRA_CEC_INT_MASK_RX_REGISTER_OVERRUN),
cec->cec_base + TEGRA_CEC_INT_MASK);
+
+ cec->init_done = 1;
+ wake_up_interruptible(&cec->init_waitq);
+
+ dev_notice(cec->dev, "%s Done.\n", __func__);
}
static void tegra_cec_init_worker(struct work_struct *work)
cec->tx_wake = 0;
init_waitqueue_head(&cec->rx_waitq);
init_waitqueue_head(&cec->tx_waitq);
+ init_waitqueue_head(&cec->init_waitq);
platform_set_drvdata(pdev, cec);
/* clear out the hardware. */
clk_disable(cec->clk);
+ dev_notice(&pdev->dev, "suspended\n");
return 0;
}
{
struct tegra_cec *cec = platform_get_drvdata(pdev);
+ dev_notice(&pdev->dev, "Resuming\n");
+
clk_enable(cec->clk);
schedule_work(&cec->work);