if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
dev_err(dp->dev, "PLL is not locked yet.\n");
- return -EINVAL;
+ return -EAGAIN;
}
exynos_dp_reset_macro(dp);
return retval;
}
-static void exynos_dp_config_video(struct work_struct *work)
+static int exynos_dp_config_video(struct exynos_dp_device *dp)
{
- struct exynos_dp_device *dp;
int retval = 0;
int timeout_loop = 0;
int done_count = 0;
- dp = container_of(work, struct exynos_dp_device, config_work);
-
exynos_dp_config_video_slave_mode(dp);
exynos_dp_set_video_color_format(dp);
if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
dev_err(dp->dev, "PLL is not locked yet.\n");
- return;
+ return -EINVAL;
}
for (;;) {
break;
if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
dev_err(dp->dev, "Timeout of video streamclk ok\n");
- return;
+ return -ETIMEDOUT;
}
mdelay(100);
}
if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
dev_err(dp->dev, "Timeout of video streamclk ok\n");
- return;
+ return -ETIMEDOUT;
}
mdelay(100);
if (retval != 0)
dev_err(dp->dev, "Video stream is not detected!\n");
+
+ return retval;
}
static void exynos_dp_enable_scramble(struct exynos_dp_device *dp, bool enable)
return IRQ_HANDLED;
}
+static void exynos_dp_hotplug(struct work_struct *work)
+{
+ struct exynos_dp_device *dp;
+ int ret;
+
+ dp = container_of(work, struct exynos_dp_device, hotplug_work);
+
+ ret = exynos_dp_detect_hpd(dp);
+ if (ret) {
+ dev_err(dp->dev, "unable to detect hpd\n");
+ return;
+ }
+
+ ret = exynos_dp_handle_edid(dp);
+ if (ret) {
+ dev_err(dp->dev, "unable to handle edid\n");
+ return;
+ }
+
+ if (dp->training_type == SW_LINK_TRAINING)
+ ret = exynos_dp_set_link_train(dp, dp->video_info->lane_count,
+ dp->video_info->link_rate);
+ else
+ ret = exynos_dp_set_hw_link_train(dp,
+ dp->video_info->lane_count, dp->video_info->link_rate);
+ if (ret) {
+ dev_err(dp->dev, "unable to do link train\n");
+ return;
+ }
+
+ exynos_dp_enable_scramble(dp, 1);
+ exynos_dp_enable_rx_to_enhanced_mode(dp, 1);
+ exynos_dp_enable_enhanced_mode(dp, 1);
+
+ exynos_dp_set_lane_count(dp, dp->video_info->lane_count);
+ exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate);
+
+ exynos_dp_init_video(dp);
+ exynos_dp_config_video(dp);
+}
+
static int __devinit exynos_dp_probe(struct platform_device *pdev)
{
struct resource *res;
goto err_ioremap;
}
+ dp->training_type = pdata->training_type;
dp->video_info = pdata->video_info;
if (pdata->phy_init)
pdata->phy_init();
goto err_ioremap;
}
- ret = exynos_dp_detect_hpd(dp);
- if (ret) {
- dev_err(&pdev->dev, "unable to detect hpd\n");
- goto err_irq;
- }
-
- exynos_dp_handle_edid(dp);
-
- if (pdata->training_type == SW_LINK_TRAINING)
- ret = exynos_dp_set_link_train(dp, dp->video_info->lane_count,
- dp->video_info->link_rate);
- else
- ret = exynos_dp_set_hw_link_train(dp,
- dp->video_info->lane_count, dp->video_info->link_rate);
- if (ret) {
- dev_err(&pdev->dev, "unable to do link train\n");
- goto err_irq;
- }
-
- exynos_dp_enable_scramble(dp, 1);
- exynos_dp_enable_rx_to_enhanced_mode(dp, 1);
- exynos_dp_enable_enhanced_mode(dp, 1);
-
- exynos_dp_set_lane_count(dp, dp->video_info->lane_count);
- exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate);
-
- exynos_dp_init_video(dp);
-
- INIT_WORK(&dp->config_work, exynos_dp_config_video);
- schedule_work(&dp->config_work);
+ INIT_WORK(&dp->hotplug_work, exynos_dp_hotplug);
platform_set_drvdata(pdev, dp);
+ schedule_work(&dp->hotplug_work);
return 0;
-err_irq:
- free_irq(dp->irq, dp);
err_ioremap:
iounmap(dp->reg_base);
err_req_region:
struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
struct exynos_dp_device *dp = platform_get_drvdata(pdev);
- if (work_pending(&dp->config_work))
- flush_work_sync(&dp->config_work);
+ if (work_pending(&dp->hotplug_work))
+ flush_work_sync(&dp->hotplug_work);
if (pdata && pdata->phy_exit)
pdata->phy_exit();
struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
struct exynos_dp_device *dp = platform_get_drvdata(pdev);
- if (work_pending(&dp->config_work))
- flush_work_sync(&dp->config_work);
+ if (work_pending(&dp->hotplug_work))
+ flush_work_sync(&dp->hotplug_work);
if (pdata && pdata->phy_exit)
pdata->phy_exit();
clk_enable(dp->clock);
exynos_dp_init_dp(dp);
-
- exynos_dp_detect_hpd(dp);
- exynos_dp_handle_edid(dp);
-
- if (pdata->training_type == SW_LINK_TRAINING)
- exynos_dp_set_link_train(dp, dp->video_info->lane_count,
- dp->video_info->link_rate);
- else
- exynos_dp_set_hw_link_train(dp,
- dp->video_info->lane_count, dp->video_info->link_rate);
-
- exynos_dp_enable_scramble(dp, 1);
- exynos_dp_enable_rx_to_enhanced_mode(dp, 1);
- exynos_dp_enable_enhanced_mode(dp, 1);
-
- exynos_dp_set_lane_count(dp, dp->video_info->lane_count);
- exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate);
-
- exynos_dp_init_video(dp);
- schedule_work(&dp->config_work);
+ schedule_work(&dp->hotplug_work);
return 0;
}