Exemple #1
0
static void display_driver_shutdown(struct platform_device *pdev)
{
#ifdef CONFIG_FB_HIBERNATION_DISPLAY
	struct display_driver *dispdrv = get_display_driver();
	disp_set_pm_status(DISP_STATUS_PM2);
	disp_pm_gate_lock(dispdrv, true);
	disp_pm_add_refcount(get_display_driver());
#endif
#ifdef CONFIG_DECON_MIPI_DSI
	s5p_mipi_dsi_disable(g_display_driver.dsi_driver.dsim);
#endif
}
static void display_driver_shutdown(struct platform_device *pdev)
{
#ifdef CONFIG_FB_HIBERNATION_DISPLAY
	disp_pm_add_refcount(get_display_driver());
#endif
	s5p_mipi_dsi_disable(g_display_driver.dsi_driver.dsim);
}
Exemple #3
0
int enable_display_driver_power(struct device *dev)
{
	struct display_gpio *gpio;
	struct display_driver *dispdrv;
#if defined(CONFIG_FB_I80_COMMAND_MODE) && !defined(CONFIG_FB_I80_SW_TRIGGER)
	struct pinctrl *pinctrl;
#endif
	int ret = 0;

	dispdrv = get_display_driver();

	gpio = dispdrv->dt_ops.get_display_dsi_reset_gpio();
	gpio_request_one(gpio->id[0], GPIOF_OUT_INIT_HIGH, "lcd_power");
	usleep_range(5000, 6000);
	gpio_free(gpio->id[0]);

	gpio_request_one(gpio->id[1], GPIOF_OUT_INIT_HIGH, "lcd_reset");
	usleep_range(5000, 6000);
	gpio_set_value(gpio->id[1], 0);
	usleep_range(5000, 6000);
	gpio_set_value(gpio->id[1], 1);
	usleep_range(5000, 6000);
	gpio_free(gpio->id[1]);

#if defined(CONFIG_FB_I80_COMMAND_MODE) && !defined(CONFIG_FB_I80_SW_TRIGGER)
	pinctrl = devm_pinctrl_get_select(dev, "turnon_tes");
	if (IS_ERR(pinctrl))
		pr_err("failed to get tes pinctrl - ON");
#endif
	return ret;
}
static void request_dynamic_hotplug(bool hotplug)
{
#ifdef CONFIG_EXYNOS5_DYNAMIC_CPU_HOTPLUG
	struct display_driver *dispdrv = get_display_driver();
	if (dispdrv->pm_status.hotplug_gating_on)
		force_dynamic_hotplug(hotplug);
#endif
}
int create_decon_mic(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct display_driver *dispdrv;
	struct decon_mic *mic;
	struct resource *res;

	dispdrv = get_display_driver();

	mic = devm_kzalloc(dev, sizeof(struct decon_mic), GFP_KERNEL);
	if (!mic) {
		dev_err(dev, "no memory for mic driver");
		return -ENOMEM;
	}

	mic->dev = dev;

	mic->lcd = decon_get_lcd_info();

	mic->mic_config = dispdrv->dt_ops.get_display_mic_config();

	mic->decon_mic_on = false;

	res = dispdrv->mic_driver.regs;
	if (!res) {
		dev_err(dev, "failed to find resource\n");
		return -ENOENT;
	}

	mic->reg_base = ioremap(res->start, resource_size(res));
	if (!mic->reg_base) {
		dev_err(dev, "failed to map registers\n");
		return -ENXIO;
	}

	decon_mic_set_sys_reg(mic, DECON_MIC_ON);

	decon_mic_set_image_size(mic);

	decon_mic_set_2d_bit_stream_size(mic);

	decon_mic_set_mic_base_operation(mic, DECON_MIC_ON);

	mic_for_decon = mic;

	mic->decon_mic_on = true;

	dispdrv->mic_driver.mic = mic;
#ifdef CONFIG_FB_HIBERNATION_DISPLAY
	dispdrv->mic_driver.ops->pwr_on = decon_mic_hibernation_power_on;
	dispdrv->mic_driver.ops->pwr_off = decon_mic_hibernation_power_off;
#endif

	dev_info(dev, "MIC driver has been probed\n");
	return 0;
}
static void request_dynamic_hotplug(bool hotplug)
{
#ifdef CONFIG_EXYNOS5_DYNAMIC_CPU_HOTPLUG
	struct display_driver *dispdrv = get_display_driver();
	if ((dispdrv->pm_status.hotplug_gating_on) &&
		(dispdrv->platform_status == DISP_STATUS_PM1))
		force_dynamic_hotplug(hotplug,
			dispdrv->pm_status.hotplug_delay_msec);
#endif
}
static void decon_clock_gating_handler(struct kthread_work *work)
{
	struct display_driver *dispdrv = get_display_driver();

	if (dispdrv->pm_status.clk_idle_count > MAX_CLK_GATING_COUNT)
		display_block_clock_off(dispdrv);

	init_gating_idle_count(dispdrv);
	disp_pm_gate_lock(dispdrv, false);
	pm_debug("display_block_clock_off -");
}
int create_decon_mic(struct platform_device *pdev)
{
    struct device *dev = &pdev->dev;
    struct display_driver *dispdrv;
    struct decon_mic *mic;
    struct resource *res;

    dispdrv = get_display_driver();

    mic = devm_kzalloc(dev, sizeof(struct decon_mic), GFP_KERNEL);
    if (!mic) {
        dev_err(&pdev->dev, "no memory for mic driver\n");
        return -ENOMEM;
    }

    mic->dev = dev;

    mic->lcd = decon_get_lcd_info();

    mic->mic_config = dispdrv->dt_ops.get_display_mic_config();

    mic->decon_mic_on = false;

    res = dispdrv->mic_driver.regs;
    if (!res) {
        mic_err("failed to find resource\n");
        return -ENOENT;
    }

    mic->reg_base = ioremap(res->start, resource_size(res));
    if (!mic->reg_base) {
        mic_err("failed to map registers\n");
        return -ENXIO;
    }

    mic_for_decon = mic;

    dispdrv->mic_driver.mic = mic;

#ifdef CONFIG_S5P_LCD_INIT
    decon_mic_enable(mic);
#endif
#ifdef CONFIG_FB_HIBERNATION_DISPLAY
    dispdrv->mic_driver.ops->pwr_on = decon_mic_hibernation_power_on;
    dispdrv->mic_driver.ops->pwr_off = decon_mic_hibernation_power_off;

    mic->lcd_update = kzalloc(sizeof(struct decon_lcd), GFP_KERNEL);
    memcpy(mic->lcd_update, mic->lcd, sizeof(struct decon_lcd));
#endif

    mic_info("MIC driver has been probed\n");
    return 0;
}
int enable_display_decon_clocks(struct device *dev)
{
	int ret = 0;
	struct display_driver *dispdrv;
	struct s3c_fb *sfb;

	dispdrv = get_display_driver();
	sfb = dispdrv->decon_driver.sfb;

	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_fimd1, mout_mpll_ctrl);
#if !defined (CONFIG_SOC_EXYNOS5422_REV_0)
	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_fimd1_mdnie1, mout_fimd1);
#endif


#if defined(CONFIG_DECON_LCD_S6E8AA0)
	DISPLAY_INLINE_SET_RATE(dout_fimd1, 67 * MHZ);
#elif defined(CONFIG_DECON_LCD_S6E3FA0) || defined(CONFIG_DECON_LCD_S6E3FA2)
	DISPLAY_INLINE_SET_RATE(dout_fimd1, 133 * MHZ);
#else
	DISPLAY_INLINE_SET_RATE(dout_fimd1, 266 * MHZ);
#endif

	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_aclk_300_disp1_user, mout_aclk_300_disp1_sw);
	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_aclk_300_disp1_sw, dout_aclk_300_disp1);
	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_aclk_300_disp1, mout_dpll_ctrl);
	DISPLAY_INLINE_SET_RATE(dout_aclk_300_disp1, 300 * MHZ);
	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_aclk_400_disp1_user, mout_aclk_400_disp1_sw);
	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_aclk_400_disp1_sw, dout_aclk_400_disp1);
	DISPLAY_CLOCK_INLINE_SET_PARENT(mout_aclk_400_disp1, mout_dpll_ctrl);

#ifdef CONFIG_FB_HIBERNATION_DISPLAY_CLOCK_GATING
	dispdrv->pm_status.ops->clk_on(dispdrv);
#else
	if (!dispdrv->dsi_driver.clk) {
		dispdrv->dsi_driver.clk = __clk_lookup("clk_dsim1");
		if (IS_ERR(dispdrv->dsi_driver.clk)) {
			pr_err("Failed to clk_get - clk_dsim1\n");
			return ret;
		}
	}
	clk_prepare_enable(dispdrv->dsi_driver.clk);

	clk_prepare_enable(sfb->bus_clk);

	clk_prepare_enable(sfb->axi_disp1);

	if (!sfb->variant.has_clksel)
		clk_prepare_enable(sfb->lcd_clk);
#endif
	return ret;
}
static void decon_power_gating_handler(struct kthread_work *work)
{
	struct display_driver *dispdrv = get_display_driver();

	if (dispdrv->pm_status.pwr_idle_count > MAX_PWR_GATING_COUNT) {
		if (!check_camera_is_running()) {
			display_hibernation_power_off(dispdrv);
			init_gating_idle_count(dispdrv);
		}
	} else if (dispdrv->decon_driver.sfb->power_state == POWER_HIBER_DOWN) {
		display_hibernation_power_on(dispdrv);
	}
}
void disp_debug_power_info(void)
{
	struct display_driver *dispdrv = get_display_driver();

	pm_info("clk: %d,  \
		lock: %d, clk_idle: %d, pwr_idle: %d\n,	\
		output_on: %d, pwr_state: %d, vsync: %lld, frame_cnt: %d, te_cnt: %d",
		dispdrv->pm_status.clock_enabled,
		atomic_read(&dispdrv->pm_status.lock_count),
		dispdrv->pm_status.clk_idle_count,
		dispdrv->pm_status.pwr_idle_count,
		dispdrv->decon_driver.sfb->output_on,
		dispdrv->decon_driver.sfb->power_state,
		ktime_to_ns(dispdrv->decon_driver.sfb->vsync_info.timestamp),
		frame_done_count,
		te_count);
}
int create_decon_mic(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct display_driver *dispdrv;
	struct decon_mic *mic;
	struct resource *res;
	int ret;

	dispdrv = get_display_driver();

	mic = devm_kzalloc(dev, sizeof(struct decon_mic), GFP_KERNEL);
	if (!mic) {
		dev_err(dev, "no memory for mic driver");
		return -ENOMEM;
	}

	mic->dev = dev;

	mic->lcd = decon_get_lcd_info();

	mic->mic_config = dispdrv->dt_ops.get_display_mic_config();

	mic->decon_mic_on = false;

	res = dispdrv->mic_driver.regs;
	if (!res) {
		dev_err(dev, "failed to find resource\n");
		ret = -ENOENT;
	}

	mic->reg_base = ioremap(res->start, resource_size(res));
	if (!mic->reg_base) {
		dev_err(dev, "failed to map registers\n");
		ret = -ENXIO;
	}

	decon_mic_enable(mic);
	mic_for_decon = mic;

	mic->decon_mic_on = true;

	dispdrv->mic_driver.mic = mic;
	dev_info(dev, "MIC driver has been probed\n");
	return 0;
}
int reset_display_driver_panel(struct device *dev)
{
	struct display_gpio *gpio;
	struct display_driver *dispdrv;

	dispdrv = get_display_driver();
	gpio = dispdrv->dt_ops.get_display_dsi_reset_gpio();

	usleep_range(5000, 6000); /* need 5ms delay after LP11 high*/
	gpio_request_one(gpio->id[0], GPIOF_OUT_INIT_HIGH, "lcd_reset");
	usleep_range(5000, 6000);
	gpio_set_value(gpio->id[0], 0);
	usleep_range(5000, 6000);
	gpio_set_value(gpio->id[0], 1);
	usleep_range(5000, 6000);
	gpio_free(gpio->id[0]);

	return 0;
}
Exemple #14
0
int disable_display_driver_power(struct device *dev)
{
	struct display_gpio *gpio;
	struct display_driver *dispdrv;
	int ret = 0;

	dispdrv = get_display_driver();

	/* Reset */
	gpio = dispdrv->dt_ops.get_display_dsi_reset_gpio();
	gpio_request_one(gpio->id[1], GPIOF_OUT_INIT_LOW, "lcd_reset");
	usleep_range(5000, 6000);
	gpio_free(gpio->id[1]);
	/* Power */
	gpio_request_one(gpio->id[0], GPIOF_OUT_INIT_LOW, "lcd_power");
	usleep_range(5000, 6000);
	gpio_free(gpio->id[0]);

	return ret;
}
int enable_display_driver_power(struct device *dev)
{
	int i, ret = 0;
	struct display_gpio *gpio;
	struct display_driver *dispdrv;
	struct regulator *regulator;

	dispdrv = get_display_driver();
	gpio = dispdrv->dt_ops.get_display_dsi_reset_gpio();

	for (i = 0; i < ARRAY_SIZE(lcd_regulator_arr); i++) {
		regulator = regulator_get(dev, lcd_regulator_arr[i]);
		if (IS_ERR(regulator))
			pr_err("failed to get %s\n", lcd_regulator_arr[i]);
		else {
			ret = regulator_enable(regulator);
			if (ret)
				dev_err(dev, "failed to enable %s: %d\n",
						lcd_regulator_arr[i], ret);

			regulator_put(regulator);
		}
	}

	/*	0. GPY7[4] : MLCD_RST
		1. GPY3[2] : MIPI_1.8V_EN
		2. GPB0[0] : LCD_1P5_EN */
	gpio_request_one(gpio->id[1], GPIOF_OUT_INIT_HIGH, "mipi_power");
	gpio_free(gpio->id[1]);
	usleep_range(5000, 6000);
#ifdef CONFIG_MACH_UNIVERSAL5422
	gpio_request_one(gpio->id[2], GPIOF_OUT_INIT_HIGH, "lcd_power");
	gpio_free(gpio->id[2]);
	usleep_range(10000, 11000);
#endif

	set_pinctrl(dev, 1);

	return ret;
}
int disable_display_decon_clocks(struct device *dev)
{
	struct display_driver *dispdrv;
	struct s3c_fb *sfb;

	dispdrv = get_display_driver();
	sfb = dispdrv->decon_driver.sfb;

#ifdef CONFIG_FB_HIBERNATION_DISPLAY_CLOCK_GATING
	dispdrv->pm_status.ops->clk_off(dispdrv);
#else
	if (!sfb->variant.has_clksel)
		clk_disable_unprepare(sfb->lcd_clk);

	clk_disable_unprepare(sfb->axi_disp1);

	clk_disable_unprepare(sfb->bus_clk);

	clk_disable_unprepare(dispdrv->dsi_driver.clk);
#endif
	return 0;
}
int disable_display_driver_power(struct device *dev)
{
	int i, ret = 0;
	struct display_gpio *gpio;
	struct display_driver *dispdrv;
	struct regulator *regulator;

	dispdrv = get_display_driver();
	gpio = dispdrv->dt_ops.get_display_dsi_reset_gpio();

	/* Reset & Power */
	gpio_request_one(gpio->id[0], GPIOF_OUT_INIT_LOW, "lcd_reset");
	gpio_free(gpio->id[0]);
	usleep_range(5000, 6000);
#ifdef CONFIG_MACH_UNIVERSAL5422
	gpio_request_one(gpio->id[2], GPIOF_OUT_INIT_LOW, "lcd_power");
	gpio_free(gpio->id[2]);
	usleep_range(5000, 6000);
#endif

	for (i = 0; i < ARRAY_SIZE(lcd_regulator_arr); i++) {
		regulator = regulator_get(dev, lcd_regulator_arr[i]);
		if (IS_ERR(regulator))
			pr_err("failed to get %s\n", lcd_regulator_arr[i]);
		else {
			ret = regulator_disable(regulator);
			if (ret)
				dev_err(dev, "failed to enable %s: %d\n",
						lcd_regulator_arr[i], ret);

			regulator_put(regulator);
		}
	}

	set_pinctrl(dev, 0);

	return ret;
}
void disp_set_pm_status(int flag)
{
	struct display_driver *dispdrv = get_display_driver();
	if ((flag >= DISP_STATUS_PM0) || (flag < DISP_STATUS_PM_MAX))
		dispdrv->platform_status = flag;
}