int dsi_panel_init(void) { int rc; if (!panel_private) { panel_private = kzalloc(sizeof(struct dsi_panel_private), GFP_KERNEL); if (!panel_private) { pr_err("fail to alloc dsi panel private data\n"); return -ENOMEM; } } rc = dsi_buf_alloc(&panel_private->dsi_panel_tx_buf, ALIGN(DSI_BUF_SIZE, SZ_4K)); if (rc) return rc; rc = dsi_buf_alloc(&panel_private->dsi_panel_rx_buf, ALIGN(DSI_BUF_SIZE, SZ_4K)); if (rc) return rc; return 0; }
int dsi_panel_device_register_v2(struct platform_device *dev, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { struct mipi_panel_info *mipi; int rc; u8 lanes = 0, bpp; u32 h_period, v_period; struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info); h_period = ((pinfo->lcdc.h_pulse_width) + (pinfo->lcdc.h_back_porch) + (pinfo->xres) + (pinfo->lcdc.h_front_porch)); v_period = ((pinfo->lcdc.v_pulse_width) + (pinfo->lcdc.v_back_porch) + (pinfo->yres) + (pinfo->lcdc.v_front_porch)); mipi = &pinfo->mipi; pinfo->type = ((mipi->mode == DSI_VIDEO_MODE) ? MIPI_VIDEO_PANEL : MIPI_CMD_PANEL); if (mipi->data_lane3) lanes += 1; if (mipi->data_lane2) lanes += 1; if (mipi->data_lane1) lanes += 1; if (mipi->data_lane0) lanes += 1; if ((mipi->dst_format == DSI_CMD_DST_FORMAT_RGB888) || (mipi->dst_format == DSI_VIDEO_DST_FORMAT_RGB888) || (mipi->dst_format == DSI_VIDEO_DST_FORMAT_RGB666_LOOSE)) bpp = 3; else if ((mipi->dst_format == DSI_CMD_DST_FORMAT_RGB565) || (mipi->dst_format == DSI_VIDEO_DST_FORMAT_RGB565)) bpp = 2; else bpp = 3; /* Default format set to RGB888 */ if (pinfo->type == MIPI_VIDEO_PANEL && !pinfo->clk_rate) { h_period += pinfo->lcdc.xres_pad; v_period += pinfo->lcdc.yres_pad; if (lanes > 0) { pinfo->clk_rate = ((h_period * v_period * (mipi->frame_rate) * bpp * 8) / lanes); } else { pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__); pinfo->clk_rate = (h_period * v_period * (mipi->frame_rate) * bpp * 8); } } ctrl_pdata->panel_data.event_handler = dsi_event_handler; rc = dsi_buf_alloc(&dsi_panel_tx_buf, ALIGN(DSI_BUF_SIZE, SZ_4K)); if (rc) return rc; /* * register in mdp driver */ rc = mdss_register_panel(dev, &(ctrl_pdata->panel_data)); if (rc) { dev_err(&dev->dev, "unable to register MIPI DSI panel\n"); kfree(dsi_panel_tx_buf.start); return rc; } pr_debug("%s: Panal data initialized\n", __func__); return 0; }