118 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * GMA500 Backlight Interface4 *5 * Copyright (c) 2009-2011, Intel Corporation.6 *7 * Authors: Eric Knopp8 */9 10#include <linux/backlight.h>11 12#include <acpi/video.h>13 14#include "psb_drv.h"15#include "psb_intel_reg.h"16#include "psb_intel_drv.h"17#include "intel_bios.h"18#include "power.h"19 20void gma_backlight_enable(struct drm_device *dev)21{22 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);23 24 dev_priv->backlight_enabled = true;25 dev_priv->ops->backlight_set(dev, dev_priv->backlight_level);26}27 28void gma_backlight_disable(struct drm_device *dev)29{30 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);31 32 dev_priv->backlight_enabled = false;33 dev_priv->ops->backlight_set(dev, 0);34}35 36void gma_backlight_set(struct drm_device *dev, int v)37{38 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);39 40 dev_priv->backlight_level = v;41 if (dev_priv->backlight_enabled)42 dev_priv->ops->backlight_set(dev, v);43}44 45static int gma_backlight_get_brightness(struct backlight_device *bd)46{47 struct drm_device *dev = bl_get_data(bd);48 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);49 50 if (dev_priv->ops->backlight_get)51 return dev_priv->ops->backlight_get(dev);52 53 return dev_priv->backlight_level;54}55 56static int gma_backlight_update_status(struct backlight_device *bd)57{58 struct drm_device *dev = bl_get_data(bd);59 int level = backlight_get_brightness(bd);60 61 /* Percentage 1-100% being valid */62 if (level < 1)63 level = 1;64 65 gma_backlight_set(dev, level);66 return 0;67}68 69static const struct backlight_ops gma_backlight_ops __maybe_unused = {70 .get_brightness = gma_backlight_get_brightness,71 .update_status = gma_backlight_update_status,72};73 74int gma_backlight_init(struct drm_device *dev)75{76 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);77 struct backlight_properties props __maybe_unused = {};78 int ret;79 80 dev_priv->backlight_enabled = true;81 dev_priv->backlight_level = 100;82 83 ret = dev_priv->ops->backlight_init(dev);84 if (ret)85 return ret;86 87 if (!acpi_video_backlight_use_native()) {88 drm_info(dev, "Skipping %s backlight registration\n",89 dev_priv->ops->backlight_name);90 return 0;91 }92 93#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE94 props.brightness = dev_priv->backlight_level;95 props.max_brightness = PSB_MAX_BRIGHTNESS;96 props.type = BACKLIGHT_RAW;97 98 dev_priv->backlight_device =99 backlight_device_register(dev_priv->ops->backlight_name,100 dev->dev, dev,101 &gma_backlight_ops, &props);102 if (IS_ERR(dev_priv->backlight_device))103 return PTR_ERR(dev_priv->backlight_device);104#endif105 106 return 0;107}108 109void gma_backlight_exit(struct drm_device *dev)110{111#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE112 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);113 114 if (dev_priv->backlight_device)115 backlight_device_unregister(dev_priv->backlight_device);116#endif117}118