CC: Samuel Ortiz <sameo@xxxxxxxxxxxxxxx> Cc: Linus Walleij <linus.walleij@xxxxxxxxxx> Cc: Alexandre Courbot <gnurou@xxxxxxxxx> Cc: Thierry Reding <thierry.reding@xxxxxxxxx> Signed-off-by: Shobhit Kumar <shobhit.kumar@xxxxxxxxx> --- drivers/gpu/drm/i915/intel_dsi.c | 25 +++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_dsi.h | 3 +++ 2 files changed, 28 insertions(+) diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 219421c..511446f 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c @@ -32,6 +32,7 @@ #include <drm/drm_mipi_dsi.h> #include <linux/slab.h> #include <linux/gpio/consumer.h> +#include <linux/pwm.h> #include "i915_drv.h" #include "intel_drv.h" #include "intel_dsi.h" @@ -402,6 +403,10 @@ static void intel_dsi_enable(struct intel_encoder *encoder) intel_dsi_port_enable(encoder); } + + /* Enable the backlight with default PWM as programmed by BIOS */ + pwm_enable(intel_dsi->pwm); + pwm_config_alternate(intel_dsi->pwm, 0x7F, 100); } static void intel_dsi_pre_enable(struct intel_encoder *encoder) @@ -467,6 +472,11 @@ static void intel_dsi_pre_disable(struct intel_encoder *encoder) DRM_DEBUG_KMS("\n"); + /* Disable the backlight */ + pwm_config_alternate(intel_dsi->pwm, 0x7F, 0); + usleep_range(2000, 3000); + pwm_disable(intel_dsi->pwm); + if (is_vid_mode(intel_dsi)) { /* Send Shutdown command to the panel in LP mode */ for_each_dsi_port(port, intel_dsi->ports) @@ -971,6 +981,10 @@ static void intel_dsi_encoder_destroy(struct drm_encoder *encoder) if (intel_dsi->gpio_panel) gpiod_put(intel_dsi->gpio_panel); + /* dispose of the pwm */ + if (intel_dsi->pwm) + pwm_put(intel_dsi->pwm); + intel_encoder_destroy(encoder); } @@ -1098,6 +1112,17 @@ void intel_dsi_init(struct drm_device *dev) DRM_ERROR("Failed to own gpio for panel control\n"); intel_dsi->gpio_panel = NULL; } + + /* Get the PWM chip for backlight control */ + intel_dsi->pwm = pwm_get(dev->dev, "pwm_backlight"); + if (IS_ERR(intel_dsi->pwm)) { + DRM_ERROR("Faild to own the pwm chip\n"); + intel_dsi->pwm = NULL; + } else if (pwm_config_alternate(intel_dsi->pwm, 0x7F, 100) < 0) { + DRM_ERROR("Failed to configure the pwm chip\n"); + pwm_put(intel_dsi->pwm); + intel_dsi->pwm = NULL; + } } intel_encoder->type = INTEL_OUTPUT_DSI; diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h index 8be75a7..d8ec9c1 100644 --- a/drivers/gpu/drm/i915/intel_dsi.h +++ b/drivers/gpu/drm/i915/intel_dsi.h @@ -52,6 +52,9 @@ struct intel_dsi { /* GPIO Desc for CRC based Panel control */ struct gpio_desc *gpio_panel; + /* PWM chip */ + struct pwm_device *pwm; + struct intel_connector *attached_connector; /* bit mask of ports being driven */ -- 2.1.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx