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); return 0; }
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; struct resource *res; int ret = 0; cec = devm_kzalloc(&pdev->dev, sizeof(struct tegra_cec), GFP_KERNEL); if (!cec) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "Unable to allocate resources for device.\n"); ret = -EBUSY; goto cec_error; } if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res), pdev->name)) { dev_err(&pdev->dev, "Unable to request mem region for device.\n"); ret = -EBUSY; goto cec_error; } cec->tegra_cec_irq = platform_get_irq(pdev, 0); if (cec->tegra_cec_irq <= 0) { ret = -EBUSY; goto cec_error; } cec->cec_base = devm_ioremap_nocache(&pdev->dev, res->start, resource_size(res)); if (!cec->cec_base) { dev_err(&pdev->dev, "Unable to grab IOs for device.\n"); ret = -EBUSY; goto cec_error; } cec->clk = clk_get(&pdev->dev, "cec"); if (IS_ERR_OR_NULL(cec->clk)) { dev_err(&pdev->dev, "can't get clock for CEC\n"); ret = -ENOENT; goto clk_error; } clk_enable(cec->clk); /* set context info. */ cec->dev = &pdev->dev; cec->rx_wake = 0; cec->tx_wake = 0; init_waitqueue_head(&cec->rx_waitq); init_waitqueue_head(&cec->tx_waitq); platform_set_drvdata(pdev, cec); /* clear out the hardware. */ tegra_cec_init(cec); device_init_wakeup(&pdev->dev, 1); cec->misc_dev.minor = MISC_DYNAMIC_MINOR; cec->misc_dev.name = TEGRA_CEC_NAME; cec->misc_dev.fops = &tegra_cec_fops; cec->misc_dev.parent = &pdev->dev; if (misc_register(&cec->misc_dev)) { printk(KERN_WARNING "Couldn't register device , %s.\n", TEGRA_CEC_NAME); goto cec_error; } ret = devm_request_irq(&pdev->dev, cec->tegra_cec_irq, tegra_cec_irq_handler, IRQF_DISABLED, "cec_irq", &pdev->dev); if (ret) { dev_err(&pdev->dev, "Unable to request interrupt for device (err=%d).\n", ret); goto cec_error; } dev_notice(&pdev->dev, "probed\n"); return 0; cec_error: clk_disable(cec->clk); clk_put(cec->clk); clk_error: return ret; }