/* First obtain and turn on the main power */
mcde->epod = devm_regulator_get(dev, "epod"); if (IS_ERR(mcde->epod)) {
ret = PTR_ERR(mcde->epod);
dev_err(dev, "can't get EPOD regulator\n"); return ret;
}
ret = regulator_enable(mcde->epod); if (ret) {
dev_err(dev, "can't enable EPOD regulator\n"); return ret;
}
mcde->vana = devm_regulator_get(dev, "vana"); if (IS_ERR(mcde->vana)) {
ret = PTR_ERR(mcde->vana);
dev_err(dev, "can't get VANA regulator\n"); goto regulator_epod_off;
}
ret = regulator_enable(mcde->vana); if (ret) {
dev_err(dev, "can't enable VANA regulator\n"); goto regulator_epod_off;
} /* *ThevendorcodeusesESRAM(onchipRAM)andneedtoactivate *thev-esram34regulator,butwedon'tusethatyet
*/
/* Clock the silicon so we can access the registers */
mcde->mcde_clk = devm_clk_get(dev, "mcde"); if (IS_ERR(mcde->mcde_clk)) {
dev_err(dev, "unable to get MCDE main clock\n");
ret = PTR_ERR(mcde->mcde_clk); goto regulator_off;
}
ret = clk_prepare_enable(mcde->mcde_clk); if (ret) {
dev_err(dev, "failed to enable MCDE main clock\n"); goto regulator_off;
}
dev_info(dev, "MCDE clk rate %lu Hz\n", clk_get_rate(mcde->mcde_clk));
mcde->lcd_clk = devm_clk_get(dev, "lcd"); if (IS_ERR(mcde->lcd_clk)) {
dev_err(dev, "unable to get LCD clock\n");
ret = PTR_ERR(mcde->lcd_clk); goto clk_disable;
}
mcde->hdmi_clk = devm_clk_get(dev, "hdmi"); if (IS_ERR(mcde->hdmi_clk)) {
dev_err(dev, "unable to get HDMI clock\n");
ret = PTR_ERR(mcde->hdmi_clk); goto clk_disable;
}
mcde->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(mcde->regs)) {
dev_err(dev, "no MCDE regs\n");
ret = -EINVAL; goto clk_disable;
}
irq = platform_get_irq(pdev, 0); if (irq < 0) {
ret = irq; goto clk_disable;
}
ret = devm_request_irq(dev, irq, mcde_irq, 0, "mcde", mcde); if (ret) {
dev_err(dev, "failed to request irq %d\n", ret); goto clk_disable;
}
/* Disable and clear any pending interrupts */
mcde_display_disable_irqs(mcde);
writel(0, mcde->regs + MCDE_IMSCERR);
writel(0xFFFFFFFF, mcde->regs + MCDE_RISERR);
/* Spawn child devices for the DSI ports */
devm_of_platform_populate(dev);
/* Create something that will match the subdrivers when we bind */ for (i = 0; i < ARRAY_SIZE(mcde_component_drivers); i++) { struct device_driver *drv = &mcde_component_drivers[i]->driver; struct device *p = NULL, *d;
while ((d = platform_find_device_by_driver(p, drv))) {
put_device(p);
component_match_add(dev, &match, component_compare_dev, d);
p = d;
}
put_device(p);
} if (!match) {
dev_err(dev, "no matching components\n");
ret = -ENODEV; goto clk_disable;
} if (IS_ERR(match)) {
dev_err(dev, "could not create component match\n");
ret = PTR_ERR(match); goto clk_disable;
}
/* *PerformaninvasiveresetoftheMCDEandallblocksby *cuttingthepowertothesubsystem,thenbringitbackup *laterwhenweenablethedisplayasaresultof *component_master_add_with_match().
*/
ret = regulator_disable(mcde->epod); if (ret) {
dev_err(dev, "can't disable EPOD regulator\n"); return ret;
} /* Wait 50 ms so we are sure we cut the power */
usleep_range(50000, 70000);
ret = component_master_add_with_match(&pdev->dev, &mcde_drm_comp_ops,
match); if (ret) {
dev_err(dev, "failed to add component master\n"); /* *TheEPODregulatorisalreadydisabledatthispointsosome *specialerrorpathcodeisneeded
*/
clk_disable_unprepare(mcde->mcde_clk);
regulator_disable(mcde->vana); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.