linux/drivers/gpu/drm/shmobile/shmob_drm_backlight.c
<<
>>
Prefs
   1/*
   2 * shmob_drm_backlight.c  --  SH Mobile DRM Backlight
   3 *
   4 * Copyright (C) 2012 Renesas Electronics Corporation
   5 *
   6 * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 */
  13
  14#include <linux/backlight.h>
  15
  16#include "shmob_drm_backlight.h"
  17#include "shmob_drm_crtc.h"
  18#include "shmob_drm_drv.h"
  19
  20static int shmob_drm_backlight_update(struct backlight_device *bdev)
  21{
  22        struct shmob_drm_connector *scon = bl_get_data(bdev);
  23        struct shmob_drm_device *sdev = scon->connector.dev->dev_private;
  24        const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight;
  25        int brightness = bdev->props.brightness;
  26
  27        if (bdev->props.power != FB_BLANK_UNBLANK ||
  28            bdev->props.state & BL_CORE_SUSPENDED)
  29                brightness = 0;
  30
  31        return bdata->set_brightness(brightness);
  32}
  33
  34static int shmob_drm_backlight_get_brightness(struct backlight_device *bdev)
  35{
  36        struct shmob_drm_connector *scon = bl_get_data(bdev);
  37        struct shmob_drm_device *sdev = scon->connector.dev->dev_private;
  38        const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight;
  39
  40        return bdata->get_brightness();
  41}
  42
  43static const struct backlight_ops shmob_drm_backlight_ops = {
  44        .options        = BL_CORE_SUSPENDRESUME,
  45        .update_status  = shmob_drm_backlight_update,
  46        .get_brightness = shmob_drm_backlight_get_brightness,
  47};
  48
  49void shmob_drm_backlight_dpms(struct shmob_drm_connector *scon, int mode)
  50{
  51        if (scon->backlight == NULL)
  52                return;
  53
  54        scon->backlight->props.power = mode == DRM_MODE_DPMS_ON
  55                                     ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
  56        backlight_update_status(scon->backlight);
  57}
  58
  59int shmob_drm_backlight_init(struct shmob_drm_connector *scon)
  60{
  61        struct shmob_drm_device *sdev = scon->connector.dev->dev_private;
  62        const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight;
  63        struct drm_connector *connector = &scon->connector;
  64        struct drm_device *dev = connector->dev;
  65        struct backlight_device *backlight;
  66
  67        if (!bdata->max_brightness)
  68                return 0;
  69
  70        backlight = backlight_device_register(bdata->name, dev->dev, scon,
  71                                              &shmob_drm_backlight_ops, NULL);
  72        if (IS_ERR(backlight)) {
  73                dev_err(dev->dev, "unable to register backlight device: %ld\n",
  74                        PTR_ERR(backlight));
  75                return PTR_ERR(backlight);
  76        }
  77
  78        backlight->props.max_brightness = bdata->max_brightness;
  79        backlight->props.brightness = bdata->max_brightness;
  80        backlight->props.power = FB_BLANK_POWERDOWN;
  81        backlight_update_status(backlight);
  82
  83        scon->backlight = backlight;
  84        return 0;
  85}
  86
  87void shmob_drm_backlight_exit(struct shmob_drm_connector *scon)
  88{
  89        backlight_device_unregister(scon->backlight);
  90}
  91