Exemplo n.º 1
0
static int dpe_on(struct platform_device *pdev)
{
	int ret = 0;
	struct k3_fb_data_type *k3fd = NULL;

	BUG_ON(pdev == NULL);
	k3fd = platform_get_drvdata(pdev);
	BUG_ON(k3fd == NULL);

	K3_FB_DEBUG("fb%d, +.\n", k3fd->index);

	/* dis reset DSI */
	if (is_mipi_panel(k3fd)) {
		if (is_dual_mipi_panel(k3fd)) {
			outp32(k3fd->crgperi_base + PERRSTDIS3_OFFSET, 0x00030000);
		} else {
			outp32(k3fd->crgperi_base + PERRSTDIS3_OFFSET, 0x00020000);
		}
	}

	if (k3fd->index != PRIMARY_PANEL_IDX) {
		if (k3fd_list[PRIMARY_PANEL_IDX] &&
			(k3fd_list[PRIMARY_PANEL_IDX]->panel_info.vsync_ctrl_type & VSYNC_CTRL_CLK_OFF)) {
			K3_FB_DEBUG("fb%d, pdp clk enable!\n", k3fd->index);
			dpe_clk_enable(k3fd_list[PRIMARY_PANEL_IDX]);
		}
	}

	dpe_regulator_enable(k3fd);

	dpe_init(k3fd);

	if (is_ldi_panel(k3fd)) {
		k3fd->panel_info.lcd_init_step = LCD_INIT_POWER_ON;
		ret = panel_next_on(pdev);
	}

	ret = panel_next_on(pdev);

	if (k3fd->panel_info.vsync_ctrl_type == VSYNC_CTRL_NONE) {
		dpe_irq_enable(k3fd);
		dpe_interrupt_unmask(k3fd);
	}

#if 0
	if (k3fd->index == PRIMARY_PANEL_IDX) {
		enable_ldi_pdp(k3fd);
	} else if (k3fd->index == EXTERNAL_PANEL_IDX) {
		enable_ldi_sdp(k3fd);
	} else if (k3fd->index == AUXILIARY_PANEL_IDX) {
		; /* do nothing */
	} else {
		K3_FB_ERR("fb%d, not support this device!\n", k3fd->index);
	}
#endif

	K3_FB_DEBUG("fb%d, -.\n", k3fd->index);

	return ret;
}
void enable_clk_panel(struct hisi_fb_data_type *hisifd)
{
	char __iomem *dss_base = NULL;
	uint32_t val = 0;
	int prev_refcount = 0;

	BUG_ON(hisifd == NULL);

	dss_base = hisifd->dss_base;

	down(&hisi_fb_dss_panel_clk_sem);
	prev_refcount = panel_refcount++;
	if (!prev_refcount) {
		/* de-reset status */
		val =0x0;
		if (is_mipi_panel(hisifd)) {
			val |= PDP_DSI0_DIS_RST_CFG;
		}
		if (is_dual_mipi_panel(hisifd)) {
			val |= PDP_DSI1_DIS_RST_CFG;
		}
		outp32(dss_base + DSS_GLB_DIS_RST_CFG, val);

		/* enable clk */
		val = 0x0;
		if (is_mipi_panel(hisifd)) {
			val |= PDP_DSI0_EN_CLK_CFG;
		}
		if (is_dual_mipi_panel(hisifd)) {
			val |= PDP_DSI1_EN_CLK_CFG;
			if (is_ifbc_panel(hisifd)) {
				set_reg(dss_base + DSS_GLB_PXL0_DIV, 0xb, 4, 0);
			} else {
				set_reg(dss_base + DSS_GLB_PXL0_DIV, 0x9, 4, 0);
			}
		}
		if (is_ifbc_panel(hisifd)) {
			val |= PDP_IFBC_EN_CLK_CFG;
		}
		outp32(dss_base + DSS_GLB_EN_CLK_CFG, val);
	}
	up(&hisi_fb_dss_panel_clk_sem);
}
Exemplo n.º 3
0
static int dpe_off(struct platform_device *pdev)
{
	int ret = 0;
	struct k3_fb_data_type *k3fd = NULL;

	BUG_ON(pdev == NULL);
	k3fd = platform_get_drvdata(pdev);
	BUG_ON(k3fd == NULL);

	K3_FB_DEBUG("fb%d, +.\n", k3fd->index);

	if (k3fd->panel_info.vsync_ctrl_type == VSYNC_CTRL_NONE) {
		dpe_interrupt_mask(k3fd);
		dpe_irq_disable(k3fd);
	} else {
		if (k3fd->vsync_ctrl.vsync_ctrl_enabled == 1) {
			if (k3fd->panel_info.vsync_ctrl_type & VSYNC_CTRL_ISR_OFF) {
				dpe_interrupt_mask(k3fd);
				dpe_irq_disable(k3fd);
				K3_FB_INFO("fb%d, need to disable dpe irq! vsync_ctrl_enabled=%d.\n",
					k3fd->index, k3fd->vsync_ctrl.vsync_ctrl_enabled);
			}
		}
	}

	ret = panel_next_off(pdev);

	dpe_deinit(k3fd);

	dpe_regulator_disable(k3fd);

	if (k3fd->index != PRIMARY_PANEL_IDX) {
		if (k3fd_list[PRIMARY_PANEL_IDX] &&
			(k3fd_list[PRIMARY_PANEL_IDX]->panel_info.vsync_ctrl_type & VSYNC_CTRL_CLK_OFF)) {
			K3_FB_DEBUG("fb%d, pdp clk disable!\n", k3fd->index);
			dpe_clk_disable(k3fd_list[PRIMARY_PANEL_IDX]);
		}
	}

	/* reset DSI */
	if (is_mipi_panel(k3fd)) {
		if (is_dual_mipi_panel(k3fd)) {
			outp32(k3fd->crgperi_base + PERRSTEN3_OFFSET, 0x00030000);
		} else {
			outp32(k3fd->crgperi_base + PERRSTEN3_OFFSET, 0x00020000);
		}
	}

	K3_FB_DEBUG("fb%d, -.\n", k3fd->index);

	return ret;
}
void disable_clk_panel(struct hisi_fb_data_type *hisifd)
{
	char __iomem *dss_base = NULL;
	uint32_t val = 0;
	int new_refcount = 0;

	BUG_ON(hisifd == NULL);

	dss_base = hisifd->dss_base;

	down(&hisi_fb_dss_panel_clk_sem);
	new_refcount = --panel_refcount;
	WARN_ON(new_refcount < 0);
	if (!new_refcount) {
		/* disable clk */
		val = 0x0;
		if (is_mipi_panel(hisifd)) {
			val |= PDP_DSI0_DIS_CLK_CFG;
		}
		if (is_dual_mipi_panel(hisifd)) {
			val |= PDP_DSI1_DIS_CLK_CFG;
		}
		if (is_ifbc_panel(hisifd)) {
			val |= PDP_IFBC_DIS_CLK_CFG;
		}
		outp32(dss_base + DSS_GLB_DIS_CLK_CFG, val);

		/* reset status */
		val = 0x0;
		if (is_mipi_panel(hisifd)) {
			val |= PDP_DSI0_EN_RST_CFG;
		}
		if (is_dual_mipi_panel(hisifd)) {
			val |= PDP_DSI1_EN_RST_CFG;
		}
		outp32(dss_base + DSS_GLB_EN_RST_CFG, val);
	}
	up(&hisi_fb_dss_panel_clk_sem);
}