static void tegra_dc_dsi_suspend(struct tegra_dc *dc) { struct tegra_dc_dsi_data *dsi; int err; dsi = tegra_dc_get_outdata(dc); tegra_dc_io_start(dc); mutex_lock(&dsi->lock); if (dsi->ulpm) tegra_dsi_exit_ulpm(dsi); err = tegra_dsi_send_panel_cmd(dc, dsi, dsi->info.dsi_suspend_cmd, dsi->info.n_suspend_cmd); if (err < 0) { dev_err(&dc->ndev->dev, "dsi: error while sending dsi suspend cmd\n"); return; } clk_disable(dsi->dsi_clk); mutex_unlock(&dsi->lock); tegra_dc_io_end(dc); }
static void _tegra_dc_dsi_init(struct tegra_dc *dc) { struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); tegra_dsi_init_sw(dc, dsi); /* TODO: Configure the CSI pad configuration */ }
static void tegra_dc_dsi_enable(struct tegra_dc *dc) { struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); int err; tegra_dc_io_start(dc); mutex_lock(&dsi->lock); if (dsi->ulpm) { tegra_dsi_exit_ulpm(dsi); if (dsi->info.panel_reset) { err = tegra_dsi_send_panel_cmd(dc, dsi, dsi->info.dsi_init_cmd, dsi->info.n_init_cmd); if (err < 0) { dev_err(&dc->ndev->dev, "dsi: error while sending dsi init cmd\n"); return; } } } else { err = tegra_dsi_init_hw(dc, dsi); if (err < 0) { dev_err(&dc->ndev->dev, "dsi: not able to init dsi hardware\n"); return; } err = tegra_dsi_set_to_lp_mode(dc, dsi); if (err < 0) { dev_err(&dc->ndev->dev, "dsi: not able to set to lp mode\n"); return; } err = tegra_dsi_send_panel_cmd(dc, dsi, dsi->info.dsi_init_cmd, dsi->info.n_init_cmd); if (err < 0) { dev_err(&dc->ndev->dev, "dsi: error while sending dsi init cmd\n"); return; } err = tegra_dsi_set_to_hs_mode(dc, dsi); if (err < 0) { dev_err(&dc->ndev->dev, "dsi: not able to set to hs mode\n"); return; } } if (dsi->status.driven == DSI_DRIVEN_MODE_DC) { tegra_dsi_start_dc_stream(dc, dsi); } mutex_unlock(&dsi->lock); tegra_dc_io_end(dc); }
static ssize_t show_edid(struct device *dev, struct device_attribute *attr, char *buf) { struct platform_device *ndev = to_platform_device(dev); struct tegra_dc *dc = platform_get_drvdata(ndev); struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); tc358767_dsi2edp_get_edid(dsi, buf); return EDID_SIZE; }
static void tegra_dc_dsi_disable(struct tegra_dc *dc) { struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); mutex_lock(&dsi->lock); if (dsi->status.driven == DSI_DRIVEN_MODE_DC) tegra_dsi_stop_dc_stream(dc, dsi); if (!dsi->ulpm) tegra_dsi_enter_ulpm(dsi); mutex_unlock(&dsi->lock); }
static void tegra_dc_dsi_destroy(struct tegra_dc *dc) { struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); u16 i; u32 val; mutex_lock(&dsi->lock); /* free up the pdata*/ for(i = 0; i < dsi->info.n_init_cmd; i++){ if(dsi->info.dsi_init_cmd[i].pdata) kfree(dsi->info.dsi_init_cmd[i].pdata); } kfree(dsi->info.dsi_init_cmd); /* Disable dc stream*/ if(dsi->status.driven == DSI_DRIVEN_MODE_DC) tegra_dsi_stop_dc_stream(dc, dsi); /* Disable dsi phy clock*/ if(dsi->status.clk_out == DSI_PHYCLK_OUT_EN) tegra_dsi_hs_clk_out_disable(dc, dsi); val = DSI_POWER_CONTROL_LEG_DSI_ENABLE(TEGRA_DSI_DISABLE); tegra_dsi_writel(dsi, val, DSI_POWER_CONTROL); iounmap(dsi->base); release_resource(dsi->base_res); clk_put(dsi->dc_clk); clk_put(dsi->dsi_clk); mutex_unlock(&dsi->lock); mutex_destroy(dsi->lock); kfree(dsi); }