From: Li Peng <[email protected]> so that we can handle backlight control of psb/mrst/medfield in one interface.
Change-Id: I4a5f70592938643b0363afcb3981cb4b8efb16f2 Signed-off-by: Li Peng <[email protected]> Signed-off-by: Justin Dou <[email protected]> Signed-off-by: Hitesh K. Patel <[email protected]> --- drivers/staging/mrst/drv/psb_bl.c | 158 ++++++++++++----------------- drivers/staging/mrst/drv/psb_bl2.c | 96 ----------------- drivers/staging/mrst/drv/psb_drv.c | 100 +++++++++++-------- drivers/staging/mrst/drv/psb_drv.h | 5 - drivers/staging/mrst/drv/psb_intel_dsi2.c | 10 +- drivers/staging/mrst/drv/psb_powermgmt.c | 2 +- 6 files changed, 130 insertions(+), 241 deletions(-) delete mode 100644 drivers/staging/mrst/drv/psb_bl2.c diff --git a/drivers/staging/mrst/drv/psb_bl.c b/drivers/staging/mrst/drv/psb_bl.c index 3095edc..5024185 100644 --- a/drivers/staging/mrst/drv/psb_bl.c +++ b/drivers/staging/mrst/drv/psb_bl.c @@ -55,17 +55,13 @@ u8 blc_type; int psb_set_brightness(struct backlight_device *bd) { + struct drm_device *dev = (struct drm_device *)bl_get_data(psb_backlight_device); + struct drm_psb_private *dev_priv = (struct drm_psb_private *) dev->dev_private; + int level = bd->props.brightness; u32 blc_pwm_ctl; u32 max_pwm_blc; - struct drm_device *dev = - (struct drm_device *)bl_get_data(psb_backlight_device); - struct drm_psb_private *dev_priv = - (struct drm_psb_private *) dev->dev_private; - - int level = bd->props.brightness; - - DRM_DEBUG("backlight level set to %d\n", level); + DRM_DEBUG_DRIVER("backlight level set to %d\n", level); /* Perform value bounds checking */ if (level < BRIGHTNESS_MIN_LEVEL) @@ -77,36 +73,38 @@ int psb_set_brightness(struct backlight_device *bd) return 0; } - if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, - OSPM_UHB_ONLY_IF_ON)) { - /* Calculate and set the brightness value */ - max_pwm_blc = REG_READ(BLC_PWM_CTL) >> - MRST_BACKLIGHT_MODULATION_FREQ_SHIFT; - blc_pwm_ctl = level * max_pwm_blc / BRIGHTNESS_MAX_LEVEL; - - /* Adjust the backlight level with the percent in - * dev_priv->blc_adj1; - */ - blc_pwm_ctl = blc_pwm_ctl * dev_priv->blc_adj1; - blc_pwm_ctl = blc_pwm_ctl / BLC_ADJUSTMENT_MAX; - - /* Adjust the backlight level with the percent in - * dev_priv->blc_adj2; - */ - blc_pwm_ctl = blc_pwm_ctl * dev_priv->blc_adj2; - blc_pwm_ctl = blc_pwm_ctl / BLC_ADJUSTMENT_MAX; - - - if (blc_pol == BLC_POLARITY_INVERSE) - blc_pwm_ctl = max_pwm_blc - blc_pwm_ctl; - - /* force PWM bit on */ - REG_WRITE(BLC_PWM_CTL2, (0x80000000 | REG_READ(BLC_PWM_CTL2))); - REG_WRITE(BLC_PWM_CTL, - (max_pwm_blc << MRST_BACKLIGHT_MODULATION_FREQ_SHIFT) | - blc_pwm_ctl); - - /* printk("***backlight brightness = %i\n", level); */ + if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, OSPM_UHB_ONLY_IF_ON)) { + if (IS_MRST(dev)) { + /* Calculate and set the brightness value */ + max_pwm_blc = REG_READ(BLC_PWM_CTL) >> MRST_BACKLIGHT_MODULATION_FREQ_SHIFT; + blc_pwm_ctl = level * max_pwm_blc / BRIGHTNESS_MAX_LEVEL; + + /* Adjust the backlight level with the percent in + * dev_priv->blc_adj1; + */ + blc_pwm_ctl = blc_pwm_ctl * dev_priv->blc_adj1; + blc_pwm_ctl = blc_pwm_ctl / BLC_ADJUSTMENT_MAX; + + /* Adjust the backlight level with the percent in + * dev_priv->blc_adj2; + */ + blc_pwm_ctl = blc_pwm_ctl * dev_priv->blc_adj2; + blc_pwm_ctl = blc_pwm_ctl / BLC_ADJUSTMENT_MAX; + + + if (blc_pol == BLC_POLARITY_INVERSE) + blc_pwm_ctl = max_pwm_blc - blc_pwm_ctl; + + /* force PWM bit on */ + REG_WRITE(BLC_PWM_CTL2, (0x80000000 | REG_READ(BLC_PWM_CTL2))); + REG_WRITE(BLC_PWM_CTL, (max_pwm_blc << MRST_BACKLIGHT_MODULATION_FREQ_SHIFT) | + blc_pwm_ctl); + } else if (IS_MDFLD(dev)) { + if ((dev_priv->dbi_panel_on) || (dev_priv->dpi_panel_on)) + mdfld_dsi_brightness_control(dev, 0, level); + if ((dev_priv->dbi_panel_on2) || (dev_priv->dpi_panel_on2)) + mdfld_dsi_brightness_control(dev, 2, level); + } ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); } @@ -117,6 +115,8 @@ int psb_set_brightness(struct backlight_device *bd) int psb_get_brightness(struct backlight_device *bd) { + DRM_DEBUG_DRIVER("brightness = 0x%x \n", psb_brightness); + /* return locally cached var instead of HW read (due to DPST etc.) */ return psb_brightness; } @@ -126,35 +126,18 @@ struct backlight_ops psb_ops = { .update_status = psb_set_brightness, }; -int psb_backlight_init(struct drm_device *dev) +static int device_backlight_init(struct drm_device *dev) { -#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE unsigned long CoreClock; /* u32 bl_max_freq; */ /* unsigned long value; */ u16 bl_max_freq; uint32_t value; - uint32_t clock; uint32_t blc_pwm_precision_factor; + struct drm_psb_private *dev_priv = (struct drm_psb_private *) dev->dev_private; - struct pci_dev *pci_root = pci_get_bus_and_slot(0, 0); - - struct drm_psb_private *dev_priv = - (struct drm_psb_private *) dev->dev_private; - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) - psb_backlight_device = backlight_device_register("psb-bl", - NULL, (void *)dev, &psb_ops); -#else - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = BRIGHTNESS_MAX_LEVEL; - - psb_backlight_device = backlight_device_register("psb-bl", - NULL, (void *)dev, &psb_ops, &props); -#endif - if (IS_ERR(psb_backlight_device)) - return PTR_ERR(psb_backlight_device); + if (IS_MDFLD(dev)) + return 0; if (IS_MRST(dev)) { dev_priv->blc_adj1 = BLC_ADJUSTMENT_MAX; @@ -179,35 +162,7 @@ int psb_backlight_init(struct drm_device *dev) blc_brightnesscmd = dev_priv->lvds_bl->brightnesscmd; blc_type = dev_priv->lvds_bl->type; - /*pci_write_config_dword(pci_root, 0xD4, 0x00C32004);*/ - /*pci_write_config_dword(pci_root, 0xD0, 0xE0033000);*/ - - pci_write_config_dword(pci_root, 0xD0, 0xD0050300); - pci_read_config_dword(pci_root, 0xD4, &clock); - - switch (clock & 0x07) { - case 0: - CoreClock = 100; - break; - case 1: - CoreClock = 133; - break; - case 2: - CoreClock = 150; - break; - case 3: - CoreClock = 178; - break; - case 4: - CoreClock = 200; - break; - case 5: - case 6: - case 7: - CoreClock = 266; - default: - return 1; - } + CoreClock = dev_priv->core_freq; } /*end if(IS_MRST(dev))*/ value = (CoreClock * MHz) / BLC_PWM_FREQ_CALC_CONSTANT; @@ -215,8 +170,7 @@ int psb_backlight_init(struct drm_device *dev) value /= bl_max_freq; value /= blc_pwm_precision_factor; - if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, - OSPM_UHB_ONLY_IF_ON)) { + if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, OSPM_UHB_ONLY_IF_ON)) { if (IS_MRST(dev)) { if (value > (unsigned long long)MRST_BLC_MAX_PWM_REG_FREQ) @@ -242,6 +196,28 @@ int psb_backlight_init(struct drm_device *dev) } /*end if(IS_MRST(dev))*/ ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); } + return 0; +} + +int psb_backlight_init(struct drm_device *dev) +{ +#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE + int ret = 0; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) + psb_backlight_device = backlight_device_register("psb-bl", NULL, (void *)dev, &psb_ops); +#else + struct backlight_properties props; + memset(&props, 0, sizeof(struct backlight_properties)); + props.max_brightness = BRIGHTNESS_MAX_LEVEL; + + psb_backlight_device = backlight_device_register("psb-bl", NULL, (void *)dev, &psb_ops, &props); +#endif + if (IS_ERR(psb_backlight_device)) + return PTR_ERR(psb_backlight_device); + + if ((ret = device_backlight_init(dev)) != 0) + return ret; psb_backlight_device->props.brightness = BRIGHTNESS_MAX_LEVEL; psb_backlight_device->props.max_brightness = BRIGHTNESS_MAX_LEVEL; @@ -259,5 +235,3 @@ void psb_backlight_exit(void) #endif return; } - -#include "psb_bl2.c" diff --git a/drivers/staging/mrst/drv/psb_bl2.c b/drivers/staging/mrst/drv/psb_bl2.c deleted file mode 100644 index 72861b1..0000000 --- a/drivers/staging/mrst/drv/psb_bl2.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * psb backlight using HAL - * - * Copyright (c) 2009 Eric Knopp - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -static int mdfld_brightness; -static struct backlight_device *mdfld_backlight_device = 0; - -int mdfld_set_brightness(struct backlight_device *bd) -{ - struct drm_device *dev = 0; - DRM_DRIVER_PRIVATE_T *dev_priv = 0; - int level = bd->props.brightness; - - PSB_DEBUG_ENTRY("backlight level = 0x%x. \n", level); - - if (mdfld_backlight_device == 0) - return 0; - - dev = (struct drm_device *)bl_get_data(mdfld_backlight_device); - dev_priv = dev->dev_private; - - /* Perform value bounds checking */ - if (level < BRIGHTNESS_MIN_LEVEL) - level = BRIGHTNESS_MIN_LEVEL; - - /* cache the brightness for later use */ - mdfld_brightness = level; - if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, OSPM_UHB_ONLY_IF_ON)) { - - if ((dev_priv->dbi_panel_on) || (dev_priv->dpi_panel_on)) - mdfld_dsi_brightness_control(dev, 0, level); - if ((dev_priv->dbi_panel_on2) || (dev_priv->dpi_panel_on2)) - mdfld_dsi_brightness_control(dev, 2, level); - - ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); - } - return 0; -} - -int mdfld_get_brightness(struct backlight_device *bd) -{ - PSB_DEBUG_ENTRY("mdfld_brightness = 0x%x \n", mdfld_brightness); - - /* return locally cached var instead of HW read (due to DPST etc.) */ - return mdfld_brightness; -} - -struct backlight_ops mdfld_ops = { - .get_brightness = mdfld_get_brightness, - .update_status = mdfld_set_brightness, -}; - -int mdfld_backlight_init(struct drm_device *dev) -{ -#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) - mdfld_backlight_device = backlight_device_register("psb-bl", - NULL, (void *)dev, &mdfld_ops); -#else - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = BRIGHTNESS_MAX_LEVEL; - - mdfld_backlight_device = backlight_device_register("psb-bl", - NULL, (void *)dev, &mdfld_ops, &props); -#endif - if (IS_ERR(mdfld_backlight_device)) - return PTR_ERR(mdfld_backlight_device); - - mdfld_backlight_device->props.brightness = BRIGHTNESS_MAX_LEVEL; - mdfld_backlight_device->props.max_brightness = BRIGHTNESS_MAX_LEVEL; - backlight_update_status(mdfld_backlight_device); - - PSB_DEBUG_ENTRY("\n"); -#endif - return 0; -} - -void mdfld_backlight_exit(void) -{ -#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - PSB_DEBUG_ENTRY("\n"); - - mdfld_backlight_device->props.brightness = 0; - backlight_update_status(mdfld_backlight_device); - backlight_device_unregister(mdfld_backlight_device); -#endif - return; -} diff --git a/drivers/staging/mrst/drv/psb_drv.c b/drivers/staging/mrst/drv/psb_drv.c index b296ef8..069f98b 100644 --- a/drivers/staging/mrst/drv/psb_drv.c +++ b/drivers/staging/mrst/drv/psb_drv.c @@ -561,6 +561,44 @@ static void psb_do_takedown(struct drm_device *dev) lnc_topaz_uninit(dev); } +static void psb_get_core_freq(struct drm_device *dev) +{ + uint32_t clock; + struct pci_dev *pci_root = pci_get_bus_and_slot(0, 0); + struct drm_psb_private *dev_priv = (struct drm_psb_private *) dev->dev_private; + + /*pci_write_config_dword(pci_root, 0xD4, 0x00C32004);*/ + /*pci_write_config_dword(pci_root, 0xD0, 0xE0033000);*/ + + pci_write_config_dword(pci_root, 0xD0, 0xD0050300); + pci_read_config_dword(pci_root, 0xD4, &clock); + pci_dev_put(pci_root); + + switch (clock & 0x07) { + case 0: + dev_priv->core_freq = 100; + break; + case 1: + dev_priv->core_freq = 133; + break; + case 2: + dev_priv->core_freq = 150; + break; + case 3: + dev_priv->core_freq = 178; + break; + case 4: + dev_priv->core_freq = 200; + break; + case 5: + case 6: + case 7: + dev_priv->core_freq = 266; + default: + dev_priv->core_freq = 0; + } +} + #define FB_REG06 0xD0810600 #define FB_TOPAZ_DISABLE BIT0 #define FB_MIPI_DISABLE BIT11 @@ -992,13 +1030,8 @@ static int psb_driver_unload(struct drm_device *dev) /*Fristly, unload pvr driver*/ PVRSRVDrmUnload(dev); - if (IS_MDFLD(dev)) { - /*TODO: destroy DSR/DPU infos here*/ - - mdfld_backlight_exit(); /*writes minimum value to backlight HW reg */ - } else { - psb_backlight_exit(); /*writes minimum value to backlight HW reg */ - } + /*TODO: destroy DSR/DPU infos here*/ + psb_backlight_exit(); /*writes minimum value to backlight HW reg */ if (drm_psb_no_fb == 0) psb_modeset_cleanup(dev); @@ -1212,6 +1245,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset) mrst_get_fuse_settings(dev); mrst_get_vbt_data(dev_priv); } else { + psb_get_core_freq(dev); psb_intel_opregion_init(dev); psb_intel_init_bios(dev); } @@ -1391,17 +1425,11 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset) #endif } - if (IS_MDFLD(dev)) { - /*must be after mrst_get_fuse_settings() */ - ret = mdfld_backlight_init(dev); - if (ret) - return ret; - } else { - /*must be after mrst_get_fuse_settings()*/ - ret = psb_backlight_init(dev); - if (ret) - return ret; - } + /*must be after mrst_get_fuse_settings()*/ + ret = psb_backlight_init(dev); + if (ret) + return ret; + /*enable runtime pm at last*/ pm_runtime_enable(&dev->pdev->dev); pm_runtime_set_active(&dev->pdev->dev); @@ -1612,20 +1640,16 @@ static int psb_dc_state_ioctl(struct drm_device *dev, void * data, static int psb_dpst_bl_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct drm_psb_private *dev_priv = psb_priv(dev); - uint32_t *arg = data; - struct backlight_device bd; - dev_priv->blc_adj2 = *arg; + struct drm_psb_private *dev_priv = psb_priv(dev); + uint32_t *arg = data; + struct backlight_device bd; + dev_priv->blc_adj2 = *arg; + #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - if (IS_MDFLD(dev)) { - bd.props.brightness = mdfld_get_brightness(&bd); - mdfld_set_brightness(&bd); - } else { - bd.props.brightness = psb_get_brightness(&bd); - psb_set_brightness(&bd); - } + bd.props.brightness = psb_get_brightness(&bd); + psb_set_brightness(&bd); #endif - return 0; + return 0; } static int psb_adb_ioctl(struct drm_device *dev, void *data, @@ -1635,14 +1659,10 @@ static int psb_adb_ioctl(struct drm_device *dev, void *data, uint32_t *arg = data; struct backlight_device bd; dev_priv->blc_adj1 = *arg; + #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - if (IS_MDFLD(dev)) { - bd.props.brightness = mdfld_get_brightness(&bd); - mdfld_set_brightness(&bd); - } else { - bd.props.brightness = psb_get_brightness(&bd); - psb_set_brightness(&bd); - } + bd.props.brightness = psb_get_brightness(&bd); + psb_set_brightness(&bd); #endif return 0; } @@ -2523,11 +2543,7 @@ static int psb_blc_read(char *buf, char **start, off_t offset, int request, *start = &buf[offset]; *eof = 0; - if (IS_MDFLD(dev)) - user_brightness = mdfld_get_brightness(&bd); - else - user_brightness = psb_get_brightness(&bd); - + user_brightness = psb_get_brightness(&bd); final_brightness = (user_brightness * dev_priv->blc_adj1) / 100; final_brightness = (final_brightness * dev_priv->blc_adj2) / 100; diff --git a/drivers/staging/mrst/drv/psb_drv.h b/drivers/staging/mrst/drv/psb_drv.h index 57d4ce0..78cb913 100644 --- a/drivers/staging/mrst/drv/psb_drv.h +++ b/drivers/staging/mrst/drv/psb_drv.h @@ -1210,11 +1210,6 @@ int psb_backlight_init(struct drm_device *dev); void psb_backlight_exit(void); int psb_set_brightness(struct backlight_device *bd); int psb_get_brightness(struct backlight_device *bd); -/* MDFLD supports */ -int mdfld_backlight_init(struct drm_device *dev); -void mdfld_backlight_exit(void); -int mdfld_set_brightness(struct backlight_device *bd); -int mdfld_get_brightness(struct backlight_device *bd); /* *Debug print bits setting diff --git a/drivers/staging/mrst/drv/psb_intel_dsi2.c b/drivers/staging/mrst/drv/psb_intel_dsi2.c index 6ec1b53..6a6b78d 100644 --- a/drivers/staging/mrst/drv/psb_intel_dsi2.c +++ b/drivers/staging/mrst/drv/psb_intel_dsi2.c @@ -1765,8 +1765,8 @@ static void mdfld_dpi_set_power(struct drm_device *dev, #endif /* DSI_TPO_864x480*/ *pdpi_panel_on = true; #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - bd.props.brightness = mdfld_get_brightness(&bd); - mdfld_set_brightness(&bd); + bd.props.brightness = psb_get_brightness(&bd); + psb_set_brightness(&bd); #endif } } @@ -1902,8 +1902,8 @@ static void mdfld_dbi_set_power(struct drm_device *dev, *pdbi_panel_on = true; #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - bd.props.brightness = mdfld_get_brightness(&bd); - mdfld_set_brightness(&bd); + bd.props.brightness = psb_get_brightness(&bd); + psb_set_brightness(&bd); #endif } /*FIXME JLIU7 */ @@ -2055,7 +2055,7 @@ static int mdfld_dsi_set_property(struct drm_connector *connector, #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE struct backlight_device bd; bd.props.brightness = value; - mdfld_set_brightness(&bd); + psb_set_brightness(&bd); #endif } } else if (!strcmp(property->name, "DPMS") && pEncoder) { diff --git a/drivers/staging/mrst/drv/psb_powermgmt.c b/drivers/staging/mrst/drv/psb_powermgmt.c index 1df07e1..41708f8 100644 --- a/drivers/staging/mrst/drv/psb_powermgmt.c +++ b/drivers/staging/mrst/drv/psb_powermgmt.c @@ -1234,7 +1234,7 @@ static int mdfld_restore_display_registers(struct drm_device *dev, int pipe) #endif #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - mdfld_dsi_brightness_control(dev, pipe, mdfld_get_brightness(&bd)); + mdfld_dsi_brightness_control(dev, pipe, psb_get_brightness(&bd)); #endif return 0; } -- 1.7.1 _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
