do { /* clear clock only */
tmp = readl_relaxed(ctrl->reg_base + SPU_IRQ_ISR); if (tmp & isr)
writel_relaxed(~isr, ctrl->reg_base + SPU_IRQ_ISR);
} while ((isr = readl_relaxed(ctrl->reg_base + SPU_IRQ_ISR)) & imask);
return IRQ_HANDLED;
}
static u32 fmt_to_reg(struct mmp_overlay *overlay, int pix_fmt)
{
u32 rbswap = 0, uvswap = 0, yuvswap = 0,
csc_en = 0, val = 0,
vid = overlay_is_vid(overlay);
switch (pix_fmt) { case PIXFMT_RGB565: case PIXFMT_RGB1555: case PIXFMT_RGB888PACK: case PIXFMT_RGB888UNPACK: case PIXFMT_RGBA888:
rbswap = 1; break; case PIXFMT_VYUY: case PIXFMT_YVU422P: case PIXFMT_YVU420P:
uvswap = 1; break; case PIXFMT_YUYV:
yuvswap = 1; break; default: break;
}
switch (pix_fmt) { case PIXFMT_RGB565: case PIXFMT_BGR565: break; case PIXFMT_RGB1555: case PIXFMT_BGR1555:
val = 0x1; break; case PIXFMT_RGB888PACK: case PIXFMT_BGR888PACK:
val = 0x2; break; case PIXFMT_RGB888UNPACK: case PIXFMT_BGR888UNPACK:
val = 0x3; break; case PIXFMT_RGBA888: case PIXFMT_BGRA888:
val = 0x4; break; case PIXFMT_UYVY: case PIXFMT_VYUY: case PIXFMT_YUYV:
val = 0x5;
csc_en = 1; break; case PIXFMT_YUV422P: case PIXFMT_YVU422P:
val = 0x6;
csc_en = 1; break; case PIXFMT_YUV420P: case PIXFMT_YVU420P:
val = 0x7;
csc_en = 1; break; default: break;
}
/* * LCD Global control(LCD_TOP_CTRL) should be configed before * any other LCD registers read/write, or there maybe issues.
*/
tmp = readl_relaxed(ctrl->reg_base + LCD_TOP_CTRL);
tmp |= 0xfff0;
writel_relaxed(tmp, ctrl->reg_base + LCD_TOP_CTRL);
/* get resources from platform data */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) {
dev_err(&pdev->dev, "%s: no IO memory defined\n", __func__);
ret = -ENOENT; goto failed;
}
irq = platform_get_irq(pdev, 0); if (irq < 0) {
ret = -ENOENT; goto failed;
}
/* get configs from platform data */
mi = pdev->dev.platform_data; if (mi == NULL || !mi->path_num || !mi->paths) {
dev_err(&pdev->dev, "%s: no platform data defined\n", __func__);
ret = -EINVAL; goto failed;
}
/* allocate */
ctrl = devm_kzalloc(&pdev->dev,
struct_size(ctrl, path_plats, mi->path_num),
GFP_KERNEL); if (!ctrl) {
ret = -ENOMEM; goto failed;
}
/* map registers.*/ if (!devm_request_mem_region(ctrl->dev, res->start,
resource_size(res), ctrl->name)) {
dev_err(ctrl->dev, "can't request region for resource %pR\n", res);
ret = -EINVAL; goto failed;
}
ctrl->reg_base = devm_ioremap(ctrl->dev,
res->start, resource_size(res)); if (ctrl->reg_base == NULL) {
dev_err(ctrl->dev, "%s: res %pR map failed\n", __func__, res);
ret = -ENOMEM; goto failed;
}
/* request irq */
ret = devm_request_irq(ctrl->dev, ctrl->irq, ctrl_handle_irq,
IRQF_SHARED, "lcd_controller", ctrl); if (ret < 0) {
dev_err(ctrl->dev, "%s unable to request IRQ %d\n",
__func__, ctrl->irq);
ret = -ENXIO; goto failed;
}
/* get clock */
ctrl->clk = devm_clk_get_enabled(ctrl->dev, mi->clk_name); if (IS_ERR(ctrl->clk)) {
ret = PTR_ERR(ctrl->clk);
dev_err_probe(ctrl->dev, ret, "unable to get clk %s\n", mi->clk_name); goto failed;
}
/* init global regs */
ctrl_set_default(ctrl);
/* init pathes from machine info and register them */ for (i = 0; i < ctrl->path_num; i++) { /* get from config and machine info */
path_plat = &ctrl->path_plats[i];
path_plat->id = i;
path_plat->ctrl = ctrl;
/* path init */ if (!path_init(path_plat, &mi->paths[i])) {
ret = -EINVAL; goto failed_path_init;
}
}
#ifdef CONFIG_MMP_DISP_SPI
ret = lcd_spi_register(ctrl); if (ret < 0) goto failed_path_init; #endif
dev_info(ctrl->dev, "device init done\n");
return 0;
failed_path_init: for (i = 0; i < ctrl->path_num; i++) {
path_plat = &ctrl->path_plats[i];
path_deinit(path_plat);
}
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.