diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_bios.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.h | 3 |
3 files changed, 40 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index af0b47652752..f7ad6a585129 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h | |||
| @@ -778,6 +778,13 @@ int intel_parse_bios(struct drm_device *dev); | |||
| 778 | #define MIPI_DSI_UNDEFINED_PANEL_ID 0 | 778 | #define MIPI_DSI_UNDEFINED_PANEL_ID 0 |
| 779 | #define MIPI_DSI_GENERIC_PANEL_ID 1 | 779 | #define MIPI_DSI_GENERIC_PANEL_ID 1 |
| 780 | 780 | ||
| 781 | /* | ||
| 782 | * PMIC vs SoC Backlight support specified in pwm_blc | ||
| 783 | * field in mipi_config block below. | ||
| 784 | */ | ||
| 785 | #define PPS_BLC_PMIC 0 | ||
| 786 | #define PPS_BLC_SOC 1 | ||
| 787 | |||
| 781 | struct mipi_config { | 788 | struct mipi_config { |
| 782 | u16 panel_id; | 789 | u16 panel_id; |
| 783 | 790 | ||
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index b5a5558ecd63..c4db74a5e4e7 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <drm/drm_panel.h> | 31 | #include <drm/drm_panel.h> |
| 32 | #include <drm/drm_mipi_dsi.h> | 32 | #include <drm/drm_mipi_dsi.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/gpio/consumer.h> | ||
| 34 | #include "i915_drv.h" | 35 | #include "i915_drv.h" |
| 35 | #include "intel_drv.h" | 36 | #include "intel_drv.h" |
| 36 | #include "intel_dsi.h" | 37 | #include "intel_dsi.h" |
| @@ -415,6 +416,12 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder) | |||
| 415 | 416 | ||
| 416 | DRM_DEBUG_KMS("\n"); | 417 | DRM_DEBUG_KMS("\n"); |
| 417 | 418 | ||
| 419 | /* Panel Enable over CRC PMIC */ | ||
| 420 | if (intel_dsi->gpio_panel) | ||
| 421 | gpiod_set_value_cansleep(intel_dsi->gpio_panel, 1); | ||
| 422 | |||
| 423 | msleep(intel_dsi->panel_on_delay); | ||
| 424 | |||
| 418 | /* Disable DPOunit clock gating, can stall pipe | 425 | /* Disable DPOunit clock gating, can stall pipe |
| 419 | * and we need DPLL REFA always enabled */ | 426 | * and we need DPLL REFA always enabled */ |
| 420 | tmp = I915_READ(DPLL(pipe)); | 427 | tmp = I915_READ(DPLL(pipe)); |
| @@ -432,8 +439,6 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder) | |||
| 432 | /* put device in ready state */ | 439 | /* put device in ready state */ |
| 433 | intel_dsi_device_ready(encoder); | 440 | intel_dsi_device_ready(encoder); |
| 434 | 441 | ||
| 435 | msleep(intel_dsi->panel_on_delay); | ||
| 436 | |||
| 437 | drm_panel_prepare(intel_dsi->panel); | 442 | drm_panel_prepare(intel_dsi->panel); |
| 438 | 443 | ||
| 439 | for_each_dsi_port(port, intel_dsi->ports) | 444 | for_each_dsi_port(port, intel_dsi->ports) |
| @@ -576,6 +581,10 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder) | |||
| 576 | 581 | ||
| 577 | msleep(intel_dsi->panel_off_delay); | 582 | msleep(intel_dsi->panel_off_delay); |
| 578 | msleep(intel_dsi->panel_pwr_cycle_delay); | 583 | msleep(intel_dsi->panel_pwr_cycle_delay); |
| 584 | |||
| 585 | /* Panel Disable over CRC PMIC */ | ||
| 586 | if (intel_dsi->gpio_panel) | ||
| 587 | gpiod_set_value_cansleep(intel_dsi->gpio_panel, 0); | ||
| 579 | } | 588 | } |
| 580 | 589 | ||
| 581 | static bool intel_dsi_get_hw_state(struct intel_encoder *encoder, | 590 | static bool intel_dsi_get_hw_state(struct intel_encoder *encoder, |
| @@ -955,6 +964,11 @@ static void intel_dsi_encoder_destroy(struct drm_encoder *encoder) | |||
| 955 | /* XXX: Logically this call belongs in the panel driver. */ | 964 | /* XXX: Logically this call belongs in the panel driver. */ |
| 956 | drm_panel_remove(intel_dsi->panel); | 965 | drm_panel_remove(intel_dsi->panel); |
| 957 | } | 966 | } |
| 967 | |||
| 968 | /* dispose of the gpios */ | ||
| 969 | if (intel_dsi->gpio_panel) | ||
| 970 | gpiod_put(intel_dsi->gpio_panel); | ||
| 971 | |||
| 958 | intel_encoder_destroy(encoder); | 972 | intel_encoder_destroy(encoder); |
| 959 | } | 973 | } |
| 960 | 974 | ||
| @@ -1071,6 +1085,20 @@ void intel_dsi_init(struct drm_device *dev) | |||
| 1071 | goto err; | 1085 | goto err; |
| 1072 | } | 1086 | } |
| 1073 | 1087 | ||
| 1088 | /* | ||
| 1089 | * In case of BYT with CRC PMIC, we need to use GPIO for | ||
| 1090 | * Panel control. | ||
| 1091 | */ | ||
| 1092 | if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) { | ||
| 1093 | intel_dsi->gpio_panel = | ||
| 1094 | gpiod_get(dev->dev, "panel", GPIOD_OUT_HIGH); | ||
| 1095 | |||
| 1096 | if (IS_ERR(intel_dsi->gpio_panel)) { | ||
| 1097 | DRM_ERROR("Failed to own gpio for panel control\n"); | ||
| 1098 | intel_dsi->gpio_panel = NULL; | ||
| 1099 | } | ||
| 1100 | } | ||
| 1101 | |||
| 1074 | intel_encoder->type = INTEL_OUTPUT_DSI; | 1102 | intel_encoder->type = INTEL_OUTPUT_DSI; |
| 1075 | intel_encoder->cloneable = 0; | 1103 | intel_encoder->cloneable = 0; |
| 1076 | drm_connector_init(dev, connector, &intel_dsi_connector_funcs, | 1104 | drm_connector_init(dev, connector, &intel_dsi_connector_funcs, |
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h index 2784ac442368..42a68593e32a 100644 --- a/drivers/gpu/drm/i915/intel_dsi.h +++ b/drivers/gpu/drm/i915/intel_dsi.h | |||
| @@ -42,6 +42,9 @@ struct intel_dsi { | |||
| 42 | struct drm_panel *panel; | 42 | struct drm_panel *panel; |
| 43 | struct intel_dsi_host *dsi_hosts[I915_MAX_PORTS]; | 43 | struct intel_dsi_host *dsi_hosts[I915_MAX_PORTS]; |
| 44 | 44 | ||
| 45 | /* GPIO Desc for CRC based Panel control */ | ||
| 46 | struct gpio_desc *gpio_panel; | ||
| 47 | |||
| 45 | struct intel_connector *attached_connector; | 48 | struct intel_connector *attached_connector; |
| 46 | 49 | ||
| 47 | /* bit mask of ports being driven */ | 50 | /* bit mask of ports being driven */ |
