static int opa362_enable(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; int r; dev_dbg(dssdev->dev, "enable\n"); if (!omapdss_device_is_connected(dssdev)) return -ENODEV; if (omapdss_device_is_enabled(dssdev)) return 0; in->ops.atv->set_timings(in, &ddata->timings); r = in->ops.atv->enable(in); if (r) return r; if (ddata->enable_gpio) gpiod_set_value_cansleep(ddata->enable_gpio, 1); dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; return 0; }
static void hdmic_get_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { struct panel_drv_data *ddata = to_panel_data(dssdev); *timings = ddata->timings; }
static int tpd_read_edid(struct omap_dss_device *dssdev, u8 *edid, int len) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; int r = 0; if (!gpio_get_value_cansleep(ddata->hpd_gpio)) return -ENODEV; if (gpio_is_valid(ddata->ls_oe_gpio)) gpio_set_value_cansleep(ddata->ls_oe_gpio, 1); i2c_lock_adapter(ddata->ddc_i2c_adapter); hdmi_i2c2_hack_demux(dssdev->dev, SEL_HDMI); r = in->ops.hdmi->read_edid(in, edid, len); hdmi_i2c2_hack_demux(dssdev->dev, SEL_I2C2); i2c_unlock_adapter(ddata->ddc_i2c_adapter); if (gpio_is_valid(ddata->ls_oe_gpio)) gpio_set_value_cansleep(ddata->ls_oe_gpio, 0); return r; }
static int hdmic_set_hdmi_mode(struct omap_dss_device *dssdev, bool hdmi_mode) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_hdmi_mode(in, hdmi_mode); }
static int tfp410_enable(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; int r; if (!omapdss_device_is_connected(dssdev)) return -ENODEV; if (omapdss_device_is_enabled(dssdev)) return 0; in->ops.dpi->set_timings(in, &ddata->timings); if (ddata->data_lines) in->ops.dpi->set_data_lines(in, ddata->data_lines); r = in->ops.dpi->enable(in); if (r) return r; if (gpio_is_valid(ddata->pd_gpio)) gpio_set_value_cansleep(ddata->pd_gpio, 1); dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; return 0; }
static int tpd_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; int r; r = in->ops.hdmi->connect(in, dssdev); if (r) return r; dst->src = dssdev; dssdev->dst = dst; gpio_set_value_cansleep(ddata->ct_cp_hpd_gpio, 1); /* DC-DC converter needs at max 300us to get to 90% of 5V */ udelay(300); /* * The HPD GPIO debounce causes a delay until we see the real HPD state. * If tpd_read_edid() or tpd_detect() are called very soon after setting * the ct_cp_hpd-gpio, we could observe wrong HPD value. So sleep here * until the GPIO values has become valid. */ msleep(DIV_ROUND_UP(HPD_DEBOUNCE_TIME, 1000)); return 0; }
static int panel_dpi_enable(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *src = dssdev->src; int r; if (!omapdss_device_is_connected(dssdev)) return -ENODEV; if (omapdss_device_is_enabled(dssdev)) return 0; r = src->ops->enable(src); if (r) return r; r = regulator_enable(ddata->vcc_supply); if (r) { src->ops->disable(src); return r; } gpiod_set_value_cansleep(ddata->enable_gpio, 1); backlight_enable(ddata->backlight); dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; return 0; }
static bool hdmic_detect(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->detect(in); }
static int tpd_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; int r; r = in->ops.hdmi->connect(in, dssdev); if (r) return r; dst->src = dssdev; dssdev->dst = dst; reinit_completion(&ddata->hpd_completion); gpio_set_value_cansleep(ddata->ct_cp_hpd_gpio, 1); /* DC-DC converter needs at max 300us to get to 90% of 5V */ udelay(300); /* * If there's a cable connected, wait for the hpd irq to trigger, * which turns on the level shifters. */ if (gpio_get_value_cansleep(ddata->hpd_gpio)) { unsigned long to; to = wait_for_completion_timeout(&ddata->hpd_completion, msecs_to_jiffies(250)); WARN_ON_ONCE(to == 0); } return 0; }
static void tpd_audio_stop(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; in->ops.hdmi->audio_stop(in); }
static bool tpd_audio_supported(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->audio_supported(in); }
static void acx565akm_get_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { struct panel_drv_data *ddata = to_panel_data(dssdev); *timings = ddata->videomode; }
static int tpd_audio_start(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->audio_start(in); }
static void acx565akm_panel_power_off(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; dev_dbg(dssdev->dev, "%s\n", __func__); if (!ddata->enabled) return; set_display_state(ddata, 0); set_sleep_mode(ddata, 1); ddata->enabled = 0; /* * We have to provide PCLK,HS,VS signals for 2 frames (worst case * ~50msec) after sending the sleep in command and asserting the * reset signal. We probably could assert the reset w/o the delay * but we still delay to avoid possible artifacts. (7.6.1) */ msleep(50); if (gpio_is_valid(ddata->reset_gpio)) gpio_set_value(ddata->reset_gpio, 0); /* FIXME need to tweak this delay */ msleep(100); in->ops.sdi->disable(in); }
static bool tpd_detect(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); return gpio_get_value_cansleep(ddata->hpd_gpio); }
static void hdmic_get_timings(struct omap_dss_device *dssdev, struct videomode *vm) { struct panel_drv_data *ddata = to_panel_data(dssdev); *vm = ddata->vm; }
static int panel_dpi_enable(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; int r; if (!omapdss_device_is_connected(dssdev)) return -ENODEV; if (omapdss_device_is_enabled(dssdev)) return 0; if (ddata->data_lines) in->ops.dpi->set_data_lines(in, ddata->data_lines); in->ops.dpi->set_timings(in, &ddata->vm); r = in->ops.dpi->enable(in); if (r) return r; r = regulator_enable(ddata->vcc_supply); if (r) { in->ops.dpi->disable(in); return r; } gpiod_set_value_cansleep(ddata->enable_gpio, 1); if (gpio_is_valid(ddata->backlight_gpio)) gpio_set_value_cansleep(ddata->backlight_gpio, 1); dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; return 0; }
static int panel_dpi_check_timings(struct omap_dss_device *dssdev, struct videomode *vm) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.dpi->check_timings(in, vm); }
static int hdmic_set_infoframe(struct omap_dss_device *dssdev, const struct hdmi_avi_infoframe *avi) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->set_infoframe(in, avi); }
static int hdmic_read_edid(struct omap_dss_device *dssdev, u8 *edid, int len) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->read_edid(in, edid, len); }
static int tpd_audio_config(struct omap_dss_device *dssdev, struct omap_dss_audio *audio) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->audio_config(in, audio); }
static int hdmic_check_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; return in->ops.hdmi->check_timings(in, timings); }
static void hdmic_audio_stop(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; in->ops.hdmi->audio_stop(in); dssdev->audio_state = OMAP_DSS_AUDIO_ENABLED; }
static void hdmic_unregister_hpd_cb(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); mutex_lock(&ddata->hpd_lock); ddata->hpd_cb = NULL; ddata->hpd_cb_data = NULL; mutex_unlock(&ddata->hpd_lock); }
static void opa362_get_timings(struct omap_dss_device *dssdev, struct videomode *vm) { struct panel_drv_data *ddata = to_panel_data(dssdev); dev_dbg(dssdev->dev, "get_timings\n"); *vm = ddata->vm; }
static void opa362_get_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { struct panel_drv_data *ddata = to_panel_data(dssdev); dev_dbg(dssdev->dev, "get_timings\n"); *timings = ddata->timings; }
static bool hdmic_detect(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; if (gpio_is_valid(ddata->hpd_gpio)) return gpio_get_value_cansleep(ddata->hpd_gpio); else return in->ops.hdmi->detect(in); }
static int opa362_check_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; dev_dbg(dssdev->dev, "check_timings\n"); return in->ops.atv->check_timings(in, timings); }
static void dvic_disconnect(struct omap_dss_device *dssdev) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; if (!omapdss_device_is_connected(dssdev)) return; in->ops.dvi->disconnect(in, dssdev); }
static int tfp410_check_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { struct panel_drv_data *ddata = to_panel_data(dssdev); struct omap_dss_device *in = ddata->in; tfp410_fix_timings(timings); return in->ops.dpi->check_timings(in, timings); }