#include "exynos_drm_drv.h"
#include "exynos_drm_display.h"
-#ifdef CONFIG_DRM_PTN3460
-#include "i2c/ptn3460.h"
-#endif
-
#include <plat/cpu.h>
#include <plat/gpio-cfg.h>
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);
- /* Cable is disconnected, skip dp initialization */
- if (exynos_dp_detect_hpd(dp))
- goto out;
+ drm_helper_hpd_irq_event(dp->drm_dev);
+}
-#ifdef CONFIG_DRM_PTN3460
- ret = ptn3460_wait_until_ready(30 * 1000);
- if (ret) {
- DRM_ERROR("PTN3460 is not ready, don't plug\n");
- return;
- }
-#endif
+static void exynos_dp_train_link(struct exynos_dp_device *dp)
+{
+ int ret;
ret = exynos_dp_handle_edid(dp);
if (ret) {
exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate);
exynos_dp_init_video(dp);
- exynos_dp_config_video(dp);
-
-out:
- drm_helper_hpd_irq_event(dp->drm_dev);
}
static int exynos_dp_power_off(struct exynos_dp_device *dp)
{
+ if (!dp->enabled)
+ return 0;
+
+ dp->enabled = false;
exynos_dp_disable_hpd(dp);
if (work_pending(&dp->hotplug_work))
static int exynos_dp_power_on(struct exynos_dp_device *dp)
{
+ if (dp->enabled)
+ return 0;
+
if (dp->phy_ops.phy_init)
dp->phy_ops.phy_init();
if (dp->irq < 0 && !exynos_dp_detect_hpd(dp))
schedule_work(&dp->hotplug_work);
+ exynos_dp_train_link(dp);
+ exynos_dp_config_video(dp);
+
+ dp->enabled = true;
return 0;
}
static int exynos_dp_subdrv_probe(void *ctx, struct drm_device *drm_dev)
{
struct exynos_dp_device *dp = ctx;
+ int ret;
dp->drm_dev = drm_dev;
+ if (dp->irq >= 0) {
+ ret = request_irq(dp->irq, exynos_dp_irq_handler, dp->irq_flags,
+ "exynos-dp", dp);
+ if (ret) {
+ dev_err(dp->dev, "failed to request irq\n");
+ return ret;
+ }
+ }
+
exynos_dp_dpms(dp, DRM_MODE_DPMS_ON);
return 0;
struct exynos_dp_platdata *pdata;
int ret = 0;
- int irqflags;
pdata = pdev->dev.platform_data;
if (!pdata) {
s3c_gpio_cfgpin(dp->hpd_gpio, S3C_GPIO_SFN(0xf));
#endif
dp->irq = gpio_to_irq(dp->hpd_gpio);
- irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
+ dp->irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
} else {
dp->hpd_gpio = -ENODEV;
dp->irq = platform_get_irq(pdev, 0);
- irqflags = 0;
+ dp->irq_flags = 0;
}
+ dp->enabled = false;
dp->training_type = pdata->training_type;
dp->video_info = pdata->video_info;
dp->force_connected = pdata->force_connected;
INIT_WORK(&dp->hotplug_work, exynos_dp_hotplug);
- if (dp->irq >= 0) {
- ret = request_irq(dp->irq, exynos_dp_irq_handler, irqflags,
- "exynos-dp", dp);
- if (ret) {
- dev_err(&pdev->dev, "failed to request irq\n");
- goto err_gpio;
- }
- }
-
platform_set_drvdata(pdev, dp);
exynos_display_attach_panel(EXYNOS_DRM_DISPLAY_TYPE_FIMD, &dp_panel_ops,