bool intel_dsi_init(struct drm_device *dev, int pipe) #endif { struct drm_i915_private *dev_priv = dev->dev_private; struct intel_dsi *intel_dsi; struct intel_encoder *intel_encoder; struct drm_encoder *encoder; struct intel_connector *intel_connector; struct drm_connector *connector; struct drm_display_mode *fixed_mode = NULL; const struct intel_dsi_device *dsi; unsigned int i; unsigned int panel_id; extern int intel_adc_read_panelid(unsigned int*); DRM_DEBUG_KMS("\n"); intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL); if (!intel_dsi) return false; intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); if (!intel_connector) { kfree(intel_dsi); return false; } intel_encoder = &intel_dsi->base; encoder = &intel_encoder->base; intel_dsi->attached_connector = intel_connector; connector = &intel_connector->base; drm_encoder_init(dev, encoder, &intel_dsi_funcs, DRM_MODE_ENCODER_DSI); /* XXX: very likely not all of these are needed */ intel_encoder->hot_plug = intel_dsi_hot_plug; intel_encoder->compute_config = intel_dsi_compute_config; intel_encoder->pre_pll_enable = intel_dsi_pre_pll_enable; intel_encoder->pre_enable = intel_dsi_pre_enable; intel_encoder->enable = intel_dsi_enable; intel_encoder->mode_set = intel_dsi_mode_set; intel_encoder->disable = intel_dsi_disable; intel_encoder->post_disable = intel_dsi_post_disable; intel_encoder->get_hw_state = intel_dsi_get_hw_state; intel_encoder->get_config = intel_dsi_get_config; intel_connector->get_hw_state = intel_connector_get_hw_state; /* Initialize panel id based on kernel param. * If no kernel param use panel id from VBT * If no param and no VBT initialize with * default ASUS panel ID for now */ #ifndef BYT_DUAL_MIPI_DSI intel_adc_read_panelid(&panel_id); i915_mipi_panel_id = panel_id; #else dual_display_status.pipea_status = PIPE_INIT; dual_display_status.pipeb_status = PIPE_OFF; dual_display_status.call_back = NULL; mutex_init(&(dual_display_status.dual_display_mutex)); if(pipe == 1) { i915_mipi_panel_id = MIPI_DSI_TI_DPP3430_PANEL_ID; #if 0 dual_display_status.mipia_ori = PIPE_INIT; dual_display_status.mipib_ori = PIPE_INIT; dual_display_status.pipea_status = PIPE_INIT; dual_display_status.pipeb_status = PIPE_INIT; dual_display_status.call_back = NULL; mutex_init(&(dual_display_status.dual_display_mutex)); #endif } else if (i915_enable_dummy_dsi) { i915_mipi_panel_id = MIPI_DSI_DUMMY_PANEL_ID; } else { intel_adc_read_panelid(&panel_id); i915_mipi_panel_id = panel_id; } #endif printk("[drm] intel debug panel_id is:%d\n",i915_mipi_panel_id); if (i915_mipi_panel_id <= 0) { /* check if panel id available from VBT */ if (!dev_priv->vbt.dsi.panel_id) { /* default Panasonic panel */ dev_priv->mipi_panel_id = MIPI_DSI_PANASONIC_VXX09F006A00_PANEL_ID; } else dev_priv->mipi_panel_id = dev_priv->vbt.dsi.panel_id; } else dev_priv->mipi_panel_id = i915_mipi_panel_id; /*enable for blade2 panel*/ //dev_priv->mipi_panel_id = MIPI_DSI_AUO_B101UAN01E_PANEL_ID; //dev_priv->mipi_panel_id = MIPI_DSI_CMI_NT51021_PANEL_ID; //dev_priv->mipi_panel_id = MIPI_DSI_TI_DPP3430_PANEL_ID; for (i = 0; i < ARRAY_SIZE(intel_dsi_devices); i++) { dsi = &intel_dsi_devices[i]; if (dsi->panel_id == dev_priv->mipi_panel_id) { intel_dsi->dev = *dsi; intel_dsi_dev = &intel_dsi->dev; if (dsi->dev_ops->init(&intel_dsi->dev)) break; } } if (i == ARRAY_SIZE(intel_dsi_devices)) { DRM_DEBUG_KMS("no device found\n"); goto err; } //specify pipe to the dsi #ifndef BYT_DUAL_MIPI_DSI intel_encoder->type = INTEL_OUTPUT_DSI; intel_encoder->crtc_mask = (1 << 0); #else if(pipe ==0){ intel_encoder->type = INTEL_OUTPUT_DSI; intel_encoder->crtc_mask = (1 << 0); } else{ intel_encoder->type = INTEL_OUTPUT_DSI; intel_encoder->crtc_mask = (1 << 1); } #endif intel_encoder->cloneable = false; drm_connector_init(dev, connector, &intel_dsi_connector_funcs, DRM_MODE_CONNECTOR_DSI); drm_encoder_helper_add(encoder, &intel_dsi_helper_funcs); drm_connector_helper_add(connector, &intel_dsi_connector_helper_funcs); connector->display_info.subpixel_order = SubPixelHorizontalRGB; /*XXX*/ connector->interlace_allowed = false; connector->doublescan_allowed = false; intel_dsi_add_properties(intel_dsi, connector); intel_connector_attach_encoder(intel_connector, intel_encoder); drm_sysfs_connector_add(connector); fixed_mode = dsi->dev_ops->get_modes(&intel_dsi->dev); if (!fixed_mode) { DRM_DEBUG_KMS("no fixed mode\n"); goto err; } //in dual display , mipi 's backlight is useless. it use a bulb to control #ifndef BYT_DUAL_MIPI_DSI dev_priv->is_mipi = true; #else dev_priv->is_mipi = false; #endif fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; intel_panel_init(&intel_connector->panel, fixed_mode, NULL); intel_panel_setup_backlight(connector); intel_connector->panel.fitting_mode = 0; /* Panel native resolution and desired mode can be different in these two cases: 1. Generic driver specifies scaling reqd flag. 2. Static driver for Panasonic panel with BYT_CR Fixme: Remove static driver's panel ID check as we are planning to enable generic driver by default */ if ((dev_priv->scaling_reqd) || (BYT_CR_CONFIG && (i915_mipi_panel_id == MIPI_DSI_PANASONIC_VXX09F006A00_PANEL_ID))) { intel_connector->panel.fitting_mode = AUTOSCALE; DRM_DEBUG_DRIVER("Enabling panel fitter as scaling required flag set\n"); } return true; err: drm_encoder_cleanup(&intel_encoder->base); kfree(intel_dsi); kfree(intel_connector); return false; }
bool intel_dsi_init(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev->dev_private; struct intel_dsi *intel_dsi; struct intel_encoder *intel_encoder; struct drm_encoder *encoder; struct intel_connector *intel_connector; struct drm_connector *connector; struct drm_display_mode *fixed_mode = NULL; struct drm_display_mode *downclock_mode = NULL; const struct intel_dsi_device *dsi; unsigned int i; DRM_DEBUG_KMS("\n"); intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL); if (!intel_dsi) return false; intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); if (!intel_connector) { kfree(intel_dsi); return false; } intel_encoder = &intel_dsi->base; encoder = &intel_encoder->base; intel_dsi->attached_connector = intel_connector; connector = &intel_connector->base; drm_encoder_init(dev, encoder, &intel_dsi_funcs, DRM_MODE_ENCODER_DSI); /* XXX: very likely not all of these are needed */ intel_encoder->hot_plug = intel_dsi_hot_plug; intel_encoder->compute_config = intel_dsi_compute_config; intel_encoder->pre_pll_enable = intel_dsi_pre_pll_enable; intel_encoder->pre_enable = intel_dsi_pre_enable; intel_encoder->enable = intel_dsi_enable; intel_encoder->mode_set = intel_dsi_mode_set; intel_encoder->disable = intel_dsi_disable; intel_encoder->post_disable = intel_dsi_post_disable; intel_encoder->get_hw_state = intel_dsi_get_hw_state; intel_encoder->get_config = intel_dsi_get_config; intel_encoder->set_drrs_state = intel_dsi_set_drrs_state; intel_connector->get_hw_state = intel_connector_get_hw_state; /* Initialize panel id based on kernel param. * If no kernel param use panel id from VBT * If no param and no VBT initialize with * default ASUS panel ID for now */ if (i915_mipi_panel_id <= 0) { /* check if panel id available from VBT */ if (!dev_priv->vbt.dsi.panel_id) { /* default Panasonic panel */ dev_priv->mipi_panel_id = MIPI_DSI_PANASONIC_VXX09F006A00_PANEL_ID; } else dev_priv->mipi_panel_id = dev_priv->vbt.dsi.panel_id; } else dev_priv->mipi_panel_id = i915_mipi_panel_id; for (i = 0; i < ARRAY_SIZE(intel_dsi_devices); i++) { dsi = &intel_dsi_devices[i]; if (dsi->panel_id == dev_priv->mipi_panel_id) { intel_dsi->dev = *dsi; if (dsi->dev_ops->init(&intel_dsi->dev)) break; } } if (i == ARRAY_SIZE(intel_dsi_devices)) { DRM_DEBUG_KMS("no device found\n"); goto err; } intel_encoder->type = INTEL_OUTPUT_DSI; intel_encoder->crtc_mask = (1 << 0); /* XXX */ intel_encoder->cloneable = false; drm_connector_init(dev, connector, &intel_dsi_connector_funcs, DRM_MODE_CONNECTOR_DSI); drm_encoder_helper_add(encoder, &intel_dsi_helper_funcs); drm_connector_helper_add(connector, &intel_dsi_connector_helper_funcs); connector->display_info.subpixel_order = SubPixelHorizontalRGB; /*XXX*/ connector->interlace_allowed = false; connector->doublescan_allowed = false; intel_dsi_add_properties(intel_dsi, connector); intel_connector_attach_encoder(intel_connector, intel_encoder); drm_sysfs_connector_add(connector); fixed_mode = dsi->dev_ops->get_modes(&intel_dsi->dev); if (!fixed_mode) { DRM_DEBUG_KMS("no fixed mode\n"); goto err; } dev_priv->is_mipi = true; fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; if (INTEL_INFO(dev)->gen > 6) { downclock_mode = intel_dsi_calc_panel_downclock(dev, fixed_mode, connector); if (downclock_mode) intel_dsi_drrs_init(intel_connector, downclock_mode); else DRM_DEBUG_KMS("Downclock_mode is not found\n"); } intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); intel_panel_setup_backlight(connector); intel_connector->panel.fitting_mode = 0; return true; err: drm_encoder_cleanup(&intel_encoder->base); kfree(intel_dsi); kfree(intel_connector); return false; }