Пример #1
0
static int s5p_dp_set_power(struct lcd_device *lcd, int power)
{
	struct s5p_dp_device *dp = lcd_get_data(lcd);
	int retval;

#ifdef CONFIG_S5P_DP_PSR
	if (dp->user_disabled)
		return 0;
#endif

#ifdef CONFIG_S5P_DP_ESD_RECOVERY
	dp->set_power_state = power;
#endif

	if (power == FB_BLANK_UNBLANK) {
		retval = s5p_dp_enable(dp);
		if (retval < 0)
			return retval;
	} else {
#ifdef CONFIG_S5P_DP_ESD_RECOVERY
		if (dp->enabled)
			s5p_dp_disable_esd_interrupt(dp);
		flush_delayed_work_sync(&dp->esd_recovery);
#endif
		s5p_dp_disable(dp);
	}

	return 0;
}
static int s5p_dp_set_power(struct lcd_device *lcd, int power)
{
	struct s5p_dp_device *dp = lcd_get_data(lcd);
	int retval;

	if (power == FB_BLANK_UNBLANK) {
		retval = s5p_dp_enable(dp);
		if (retval < 0)
			return retval;
	} else {
		s5p_dp_disable(dp);
	}

	return 0;
}
Пример #3
0
void esd_recover_handler(struct work_struct *work)
{
	struct s5p_dp_device *dp =
		container_of(work, struct s5p_dp_device, esd_recovery.work);
	struct s5p_dp_platdata *pdata = dp->dev->platform_data;

	if (!dp->enabled)
		return;

	dp->esd_count++;
	dev_info(dp->dev, "esd_recovery start. (%d) \n", dp->esd_count);

#ifdef CONFIG_S5P_DP_PSR
	s3c_fb_psr_exit_from_touch();
	usleep_range(40000, 40000);
#endif

	if (dp->set_power_state != FB_BLANK_UNBLANK)
		goto esd_done;
#ifdef CONFIG_S5P_DP_PSR
	dev_info(dp->dev, "esd_recovery state (%d, %d) \n",
		 dp->psr_enter_state, dp->psr_exit_state);
#endif
	s5p_dp_disable(dp);

	if (pdata->phy_exit)
		pdata->phy_exit();

	if (pdata->lcd_off)
		pdata->lcd_off();

	if (pdata->lcd_on)
		pdata->lcd_on();

	if (dp->set_power_state != FB_BLANK_UNBLANK)
		goto esd_done;

	s5p_dp_enable(dp);

esd_done:
	dev_info(dp->dev, "esd_recovery done. \n");
}
static int __devinit s5p_dp_probe(struct platform_device *pdev)
{
	struct resource *res;
	struct s5p_dp_device *dp;
	struct s5p_dp_platdata *pdata;

	int ret = 0;

    printk("############ start to dp_probe\n #############\n");

	pdata = pdev->dev.platform_data;
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

	dp = kzalloc(sizeof(struct s5p_dp_device), GFP_KERNEL);
	if (!dp) {
		dev_err(&pdev->dev, "no memory for device data\n");
		return -ENOMEM;
	}

	mutex_init(&dp->lock);

	dp->dev = &pdev->dev;

    printk("1\n");
    
	dp->clock = clk_get(&pdev->dev, "dp");
	if (IS_ERR(dp->clock)) {
		dev_err(&pdev->dev, "failed to get clock\n");
		ret = PTR_ERR(dp->clock);
		goto err_dp;
	}

	pm_runtime_enable(dp->dev);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(&pdev->dev, "failed to get registers\n");
		ret = -EINVAL;
		goto err_clock;
	}

    printk("2\n");

	res = request_mem_region(res->start, resource_size(res),
				dev_name(&pdev->dev));
	if (!res) {
		dev_err(&pdev->dev, "failed to request registers region\n");
		ret = -EINVAL;
		goto err_clock;
	}

	dp->res = res;

	dp->reg_base = ioremap(res->start, resource_size(res));
	if (!dp->reg_base) {
		dev_err(&pdev->dev, "failed to ioremap\n");
		ret = -ENOMEM;
		goto err_req_region;
	}

    printk("3\n");

	dp->irq = platform_get_irq(pdev, 0);
	if (!dp->irq) {
		dev_err(&pdev->dev, "failed to get irq\n");
		ret = -ENODEV;
		goto err_ioremap;
	}

	ret = request_irq(dp->irq, s5p_dp_irq_handler, 0,
			"s5p-dp", dp);
	if (ret) {
		dev_err(&pdev->dev, "failed to request irq\n");
		goto err_ioremap;
	}

	dp->video_info = pdata->video_info;

	platform_set_drvdata(pdev, dp);

    printk("4\n");

	dp->lcd = lcd_device_register("s5p_dp", &pdev->dev, dp, &s5p_dp_lcd_ops);
	if (IS_ERR(dp->lcd)) {
		ret = PTR_ERR(dp->lcd);
		goto err_irq;
	}

    printk("5\n");

	ret = s5p_dp_enable(dp);
	if (ret)
		goto err_fb;

	return 0;

err_fb:
	lcd_device_unregister(dp->lcd);
err_irq:
	free_irq(dp->irq, dp);
err_ioremap:
	iounmap(dp->reg_base);
err_req_region:
	release_mem_region(res->start, resource_size(res));
err_clock:
	clk_put(dp->clock);
err_dp:
	mutex_destroy(&dp->lock);
	kfree(dp);

	return ret;
}
Пример #5
0
static int __devinit s5p_dp_probe(struct platform_device *pdev)
{
	struct resource *res;
	struct s5p_dp_device *dp;
	struct s5p_dp_platdata *pdata;

	int ret = 0;

	pdata = pdev->dev.platform_data;
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

	dp = kzalloc(sizeof(struct s5p_dp_device), GFP_KERNEL);
	if (!dp) {
		dev_err(&pdev->dev, "no memory for device data\n");
		return -ENOMEM;
	}

	mutex_init(&dp->lock);

	dp->dev = &pdev->dev;

	dp->clock = clk_get(&pdev->dev, "dp");
	if (IS_ERR(dp->clock)) {
		dev_err(&pdev->dev, "failed to get clock\n");
		ret = PTR_ERR(dp->clock);
		goto err_dp;
	}

	pm_runtime_enable(dp->dev);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(&pdev->dev, "failed to get registers\n");
		ret = -EINVAL;
		goto err_clock;
	}

	res = request_mem_region(res->start, resource_size(res),
				dev_name(&pdev->dev));
	if (!res) {
		dev_err(&pdev->dev, "failed to request registers region\n");
		ret = -EINVAL;
		goto err_clock;
	}

	dp->res = res;

	dp->reg_base = ioremap(res->start, resource_size(res));
	if (!dp->reg_base) {
		dev_err(&pdev->dev, "failed to ioremap\n");
		ret = -ENOMEM;
		goto err_req_region;
	}

	dp->irq = platform_get_irq(pdev, 0);
	if (!dp->irq) {
		dev_err(&pdev->dev, "failed to get irq\n");
		ret = -ENODEV;
		goto err_ioremap;
	}

	ret = request_irq(dp->irq, s5p_dp_irq_handler, 0,
			"s5p-dp", dp);
	if (ret) {
		dev_err(&pdev->dev, "failed to request irq\n");
		goto err_ioremap;
	}

	dp->video_info = pdata->video_info;

	platform_set_drvdata(pdev, dp);

	dp->lcd = lcd_device_register("s5p_dp", &pdev->dev, dp, &s5p_dp_lcd_ops);
	if (IS_ERR(dp->lcd)) {
		ret = PTR_ERR(dp->lcd);
		goto err_irq;
	}
#ifdef CONFIG_S5P_DP_ESD_RECOVERY
	INIT_DELAYED_WORK(&dp->esd_recovery, esd_recover_handler);
#endif

#ifdef CONFIG_LCD_LSL122DL01
	ret = s5p_dp_enable_boot(dp);
#else
	ret = s5p_dp_enable(dp);
#endif
	if (ret)
		goto err_fb;

#ifdef CONFIG_S5P_DP_PSR
	dp->user_disabled = false;
	dp->psr_enter_state = PSR_NONE;
	dp->psr_exit_state = PSR_NONE;
	dp->notifier.notifier_call = s5p_dp_notify;
	fb_register_client(&dp->notifier);
#endif

	return 0;

err_fb:
	lcd_device_unregister(dp->lcd);
err_irq:
	free_irq(dp->irq, dp);
err_ioremap:
	iounmap(dp->reg_base);
err_req_region:
	release_mem_region(res->start, resource_size(res));
err_clock:
	clk_put(dp->clock);
err_dp:
	mutex_destroy(&dp->lock);
	kfree(dp);

	return ret;
}