Skip to content

Commit

Permalink
various tweaks, mainly intel_backlight support
Browse files Browse the repository at this point in the history
  • Loading branch information
zefie committed May 16, 2016
1 parent 6785e3a commit 121736b
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 78 deletions.
60 changes: 30 additions & 30 deletions arch/x86/configs/baytrail_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -617,9 +617,9 @@ CONFIG_CPU_FREQ_STAT_DETAILS=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
Expand Down Expand Up @@ -2646,7 +2646,7 @@ CONFIG_INPUT_YEALINK=m
CONFIG_INPUT_CM109=m
CONFIG_INPUT_REGULATOR_HAPTIC=m
CONFIG_INPUT_TPS65218_PWRBUTTON=m
CONFIG_INPUT_AXP20X_PEK=m
# CONFIG_INPUT_AXP20X_PEK is not set
CONFIG_INPUT_UINPUT=y
CONFIG_INPUT_GPIO=y
CONFIG_INPUT_PCF8574=m
Expand Down Expand Up @@ -4295,35 +4295,35 @@ CONFIG_FB_EFI=y
# CONFIG_FB_SM712 is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_L4F00242T03=m
CONFIG_LCD_LMS283GF05=m
CONFIG_LCD_LTV350QV=m
CONFIG_LCD_ILI922X=m
CONFIG_LCD_ILI9320=m
CONFIG_LCD_TDO24M=m
CONFIG_LCD_VGG2432A4=m
CONFIG_LCD_PLATFORM=m
CONFIG_LCD_S6E63M0=m
CONFIG_LCD_LD9040=m
CONFIG_LCD_AMS369FG06=m
CONFIG_LCD_LMS501KF03=m
CONFIG_LCD_HX8357=m
# CONFIG_LCD_L4F00242T03 is not set
# CONFIG_LCD_LMS283GF05 is not set
# CONFIG_LCD_LTV350QV is not set
# CONFIG_LCD_ILI922X is not set
# CONFIG_LCD_ILI9320 is not set
# CONFIG_LCD_TDO24M is not set
# CONFIG_LCD_VGG2432A4 is not set
CONFIG_LCD_PLATFORM=y
# CONFIG_LCD_S6E63M0 is not set
# CONFIG_LCD_LD9040 is not set
# CONFIG_LCD_AMS369FG06 is not set
# CONFIG_LCD_LMS501KF03 is not set
# CONFIG_LCD_HX8357 is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_GENERIC=m
CONFIG_BACKLIGHT_LM3533=m
# CONFIG_BACKLIGHT_GENERIC is not set
# CONFIG_BACKLIGHT_LM3533 is not set
CONFIG_BACKLIGHT_PWM=m
CONFIG_BACKLIGHT_APPLE=m
# CONFIG_BACKLIGHT_APPLE is not set
# CONFIG_BACKLIGHT_PM8941_WLED is not set
CONFIG_BACKLIGHT_SAHARA=m
CONFIG_BACKLIGHT_ADP8860=m
CONFIG_BACKLIGHT_ADP8870=m
CONFIG_BACKLIGHT_LM3630A=m
CONFIG_BACKLIGHT_LM3639=m
CONFIG_BACKLIGHT_LP855X=m
CONFIG_BACKLIGHT_TPS65217=m
# CONFIG_BACKLIGHT_SAHARA is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_LM3630A is not set
# CONFIG_BACKLIGHT_LM3639 is not set
# CONFIG_BACKLIGHT_LP855X is not set
# CONFIG_BACKLIGHT_TPS65217 is not set
CONFIG_BACKLIGHT_GPIO=m
CONFIG_BACKLIGHT_LV5207LP=m
CONFIG_BACKLIGHT_BD6107=m
# CONFIG_BACKLIGHT_LV5207LP is not set
# CONFIG_BACKLIGHT_BD6107 is not set
# CONFIG_ADF is not set
# CONFIG_VGASTATE is not set
CONFIG_HDMI=y
Expand Down Expand Up @@ -5750,9 +5750,9 @@ CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
CONFIG_PWM_CRC=y
# CONFIG_PWM_FSL_FTM is not set
CONFIG_PWM_LPSS=m
CONFIG_PWM_LPSS=y
CONFIG_PWM_LPSS_PCI=m
CONFIG_PWM_LPSS_PLATFORM=m
CONFIG_PWM_LPSS_PLATFORM=y
# CONFIG_PWM_PCA9685 is not set
CONFIG_IRQCHIP=y
# CONFIG_IPACK_BUS is not set
Expand Down
60 changes: 30 additions & 30 deletions arch/x86/configs/nextbook_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -617,9 +617,9 @@ CONFIG_CPU_FREQ_STAT_DETAILS=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
Expand Down Expand Up @@ -2646,7 +2646,7 @@ CONFIG_INPUT_YEALINK=m
CONFIG_INPUT_CM109=m
CONFIG_INPUT_REGULATOR_HAPTIC=m
CONFIG_INPUT_TPS65218_PWRBUTTON=m
CONFIG_INPUT_AXP20X_PEK=m
# CONFIG_INPUT_AXP20X_PEK is not set
CONFIG_INPUT_UINPUT=y
CONFIG_INPUT_GPIO=y
CONFIG_INPUT_PCF8574=m
Expand Down Expand Up @@ -4295,35 +4295,35 @@ CONFIG_FB_EFI=y
# CONFIG_FB_SM712 is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_L4F00242T03=m
CONFIG_LCD_LMS283GF05=m
CONFIG_LCD_LTV350QV=m
CONFIG_LCD_ILI922X=m
CONFIG_LCD_ILI9320=m
CONFIG_LCD_TDO24M=m
CONFIG_LCD_VGG2432A4=m
CONFIG_LCD_PLATFORM=m
CONFIG_LCD_S6E63M0=m
CONFIG_LCD_LD9040=m
CONFIG_LCD_AMS369FG06=m
CONFIG_LCD_LMS501KF03=m
CONFIG_LCD_HX8357=m
# CONFIG_LCD_L4F00242T03 is not set
# CONFIG_LCD_LMS283GF05 is not set
# CONFIG_LCD_LTV350QV is not set
# CONFIG_LCD_ILI922X is not set
# CONFIG_LCD_ILI9320 is not set
# CONFIG_LCD_TDO24M is not set
# CONFIG_LCD_VGG2432A4 is not set
CONFIG_LCD_PLATFORM=y
# CONFIG_LCD_S6E63M0 is not set
# CONFIG_LCD_LD9040 is not set
# CONFIG_LCD_AMS369FG06 is not set
# CONFIG_LCD_LMS501KF03 is not set
# CONFIG_LCD_HX8357 is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_GENERIC=m
CONFIG_BACKLIGHT_LM3533=m
# CONFIG_BACKLIGHT_GENERIC is not set
# CONFIG_BACKLIGHT_LM3533 is not set
CONFIG_BACKLIGHT_PWM=m
CONFIG_BACKLIGHT_APPLE=m
# CONFIG_BACKLIGHT_APPLE is not set
# CONFIG_BACKLIGHT_PM8941_WLED is not set
CONFIG_BACKLIGHT_SAHARA=m
CONFIG_BACKLIGHT_ADP8860=m
CONFIG_BACKLIGHT_ADP8870=m
CONFIG_BACKLIGHT_LM3630A=m
CONFIG_BACKLIGHT_LM3639=m
CONFIG_BACKLIGHT_LP855X=m
CONFIG_BACKLIGHT_TPS65217=m
# CONFIG_BACKLIGHT_SAHARA is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_LM3630A is not set
# CONFIG_BACKLIGHT_LM3639 is not set
# CONFIG_BACKLIGHT_LP855X is not set
# CONFIG_BACKLIGHT_TPS65217 is not set
CONFIG_BACKLIGHT_GPIO=m
CONFIG_BACKLIGHT_LV5207LP=m
CONFIG_BACKLIGHT_BD6107=m
# CONFIG_BACKLIGHT_LV5207LP is not set
# CONFIG_BACKLIGHT_BD6107 is not set
# CONFIG_ADF is not set
# CONFIG_VGASTATE is not set
CONFIG_HDMI=y
Expand Down Expand Up @@ -5750,9 +5750,9 @@ CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
CONFIG_PWM_CRC=y
# CONFIG_PWM_FSL_FTM is not set
CONFIG_PWM_LPSS=m
CONFIG_PWM_LPSS=y
CONFIG_PWM_LPSS_PCI=m
CONFIG_PWM_LPSS_PLATFORM=m
CONFIG_PWM_LPSS_PLATFORM=y
# CONFIG_PWM_PCA9685 is not set
CONFIG_IRQCHIP=y
# CONFIG_IPACK_BUS is not set
Expand Down
8 changes: 7 additions & 1 deletion drivers/gpu/drm/i915/intel_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,12 @@ struct intel_encoder {
enum hpd_pin hpd_pin;
};

struct intel_pwm_info {
struct pwm_device *dev;
unsigned int period_ns;
char *name;
};

struct intel_panel {
struct drm_display_mode *fixed_mode;
struct drm_display_mode *downclock_mode;
Expand All @@ -181,7 +187,7 @@ struct intel_panel {
/* PWM chip */
bool util_pin_active_low; /* bxt+ */
u8 controller; /* bxt+ only */
struct pwm_device *pwm;
struct intel_pwm_info *pwm;

struct backlight_device *device;

Expand Down
65 changes: 48 additions & 17 deletions drivers/gpu/drm/i915/intel_panel.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,21 @@
#include "intel_drv.h"

#define CRC_PMIC_PWM_PERIOD_NS 21333
#define LPSS_PWM_PERIOD_NS 10240

/* CRC PMIC based PWM Information */
struct intel_pwm_info crc_pwm_info = {
.period_ns = CRC_PMIC_PWM_PERIOD_NS,
.name = "pwm_backlight",
.dev = NULL,
};

/* LPSS based PWM Information */
struct intel_pwm_info lpss_pwm_info = {
.period_ns = LPSS_PWM_PERIOD_NS,
.name = "pwm_lpss",
.dev = NULL,
};

void
intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
Expand Down Expand Up @@ -545,10 +560,11 @@ static u32 bxt_get_backlight(struct intel_connector *connector)
static u32 pwm_get_backlight(struct intel_connector *connector)
{
struct intel_panel *panel = &connector->panel;
struct intel_pwm_info *pwm = panel->backlight.pwm;
int duty_ns;

duty_ns = pwm_get_duty_cycle(panel->backlight.pwm);
return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
duty_ns = pwm_get_duty_cycle(pwm->dev);
return DIV_ROUND_UP(duty_ns * 100, pwm->period_ns);
}

static u32 intel_panel_get_backlight(struct intel_connector *connector)
Expand Down Expand Up @@ -643,9 +659,10 @@ static void bxt_set_backlight(struct intel_connector *connector, u32 level)
static void pwm_set_backlight(struct intel_connector *connector, u32 level)
{
struct intel_panel *panel = &connector->panel;
int duty_ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
struct intel_pwm_info *pwm = panel->backlight.pwm;
int duty_ns = DIV_ROUND_UP(level * pwm->period_ns, 100);

pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
pwm_config(pwm->dev, duty_ns, pwm->period_ns);
}

static void
Expand Down Expand Up @@ -821,11 +838,12 @@ static void bxt_disable_backlight(struct intel_connector *connector)
static void pwm_disable_backlight(struct intel_connector *connector)
{
struct intel_panel *panel = &connector->panel;
struct intel_pwm_info *pwm = panel->backlight.pwm;

/* Disable the backlight */
pwm_config(panel->backlight.pwm, 0, CRC_PMIC_PWM_PERIOD_NS);
pwm_config(pwm->dev, 0, pwm->period_ns);
usleep_range(2000, 3000);
pwm_disable(panel->backlight.pwm);
pwm_disable(pwm->dev);
}

void intel_panel_disable_backlight(struct intel_connector *connector)
Expand Down Expand Up @@ -1096,7 +1114,7 @@ static void pwm_enable_backlight(struct intel_connector *connector)
{
struct intel_panel *panel = &connector->panel;

pwm_enable(panel->backlight.pwm);
pwm_enable(panel->backlight.pwm->dev);
intel_panel_actually_set_backlight(connector, panel->backlight.level);
}

Expand Down Expand Up @@ -1651,33 +1669,46 @@ static int pwm_setup_backlight(struct intel_connector *connector,
enum pipe pipe)
{
struct drm_device *dev = connector->base.dev;
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
struct intel_panel *panel = &connector->panel;
struct intel_pwm_info *pwm;
const char *pwm_name;
int pwm_index = 0;
int retval;

if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) {
pwm = &crc_pwm_info;
pwm_name = "crystal_cove_pwm";
} else {
pwm = &lpss_pwm_info;
pwm_name = "pwm-lpss";
}

/* Get the PWM chip for backlight control */
panel->backlight.pwm = pwm_get(dev->dev, "pwm_backlight");
if (IS_ERR(panel->backlight.pwm)) {
DRM_ERROR("Failed to own the pwm chip\n");
// pwm->dev = pwm_get(dev->dev, pwm->name); /* Doesn't seem to work */
pwm->dev = pwm_request(pwm_index,pwm_name);
if (IS_ERR(pwm->dev)) {
DRM_ERROR("Failed to own the pwm chip: %s\n", pwm->name);
panel->backlight.pwm = NULL;
return -ENODEV;
}

retval = pwm_config(panel->backlight.pwm, CRC_PMIC_PWM_PERIOD_NS,
CRC_PMIC_PWM_PERIOD_NS);
retval = pwm_config(pwm->dev, pwm->period_ns, pwm->period_ns);
if (retval < 0) {
DRM_ERROR("Failed to configure the pwm chip\n");
pwm_put(panel->backlight.pwm);
DRM_ERROR("Failed to configure the pwm chip: %s\n", pwm->name);
pwm_put(pwm->dev);
panel->backlight.pwm = NULL;
return retval;
}

panel->backlight.min = 0; /* 0% */
panel->backlight.max = 100; /* 100% */
panel->backlight.level = DIV_ROUND_UP(
pwm_get_duty_cycle(panel->backlight.pwm) * 100,
CRC_PMIC_PWM_PERIOD_NS);
pwm_get_duty_cycle(pwm->dev) * 100, pwm->period_ns);
panel->backlight.enabled = panel->backlight.level != 0;

panel->backlight.pwm = pwm;

return 0;
}

Expand Down Expand Up @@ -1730,7 +1761,7 @@ void intel_panel_destroy_backlight(struct drm_connector *connector)

/* dispose of the pwm */
if (panel->backlight.pwm)
pwm_put(panel->backlight.pwm);
pwm_put(panel->backlight.pwm->dev);

panel->backlight.present = false;
}
Expand Down
9 changes: 9 additions & 0 deletions drivers/pwm/pwm-lpss-platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@

#include "pwm-lpss.h"

/* PWM consumed by the Intel GFX */
static struct pwm_lookup lpss_pwm_lookup[] = {
PWM_LOOKUP("pwm-lpss", 0, "0000:00:02.0", "pwm_lpss", 0, PWM_POLARITY_NORMAL),
};

static int pwm_lpss_probe_platform(struct platform_device *pdev)
{
const struct pwm_lpss_boardinfo *info;
Expand All @@ -38,6 +43,9 @@ static int pwm_lpss_probe_platform(struct platform_device *pdev)

platform_set_drvdata(pdev, lpwm);

/* Register intel-gfx device as allowed consumer */
pwm_add_table(lpss_pwm_lookup, ARRAY_SIZE(lpss_pwm_lookup));

pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);

Expand All @@ -48,6 +56,7 @@ static int pwm_lpss_remove_platform(struct platform_device *pdev)
{
struct pwm_lpss_chip *lpwm = platform_get_drvdata(pdev);

pwm_remove_table(lpss_pwm_lookup, ARRAY_SIZE(lpss_pwm_lookup));
pm_runtime_disable(&pdev->dev);
return pwm_lpss_remove(lpwm);
}
Expand Down

0 comments on commit 121736b

Please sign in to comment.