Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * shmob_drm_backlight.c  --  SH Mobile DRM Backlight
0004  *
0005  * Copyright (C) 2012 Renesas Electronics Corporation
0006  *
0007  * Laurent Pinchart (laurent.pinchart@ideasonboard.com)
0008  */
0009 
0010 #include <linux/backlight.h>
0011 
0012 #include "shmob_drm_backlight.h"
0013 #include "shmob_drm_crtc.h"
0014 #include "shmob_drm_drv.h"
0015 
0016 static int shmob_drm_backlight_update(struct backlight_device *bdev)
0017 {
0018     struct shmob_drm_connector *scon = bl_get_data(bdev);
0019     struct shmob_drm_device *sdev = scon->connector.dev->dev_private;
0020     const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight;
0021     int brightness = backlight_get_brightness(bdev);
0022 
0023     return bdata->set_brightness(brightness);
0024 }
0025 
0026 static int shmob_drm_backlight_get_brightness(struct backlight_device *bdev)
0027 {
0028     struct shmob_drm_connector *scon = bl_get_data(bdev);
0029     struct shmob_drm_device *sdev = scon->connector.dev->dev_private;
0030     const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight;
0031 
0032     return bdata->get_brightness();
0033 }
0034 
0035 static const struct backlight_ops shmob_drm_backlight_ops = {
0036     .options    = BL_CORE_SUSPENDRESUME,
0037     .update_status  = shmob_drm_backlight_update,
0038     .get_brightness = shmob_drm_backlight_get_brightness,
0039 };
0040 
0041 void shmob_drm_backlight_dpms(struct shmob_drm_connector *scon, int mode)
0042 {
0043     if (scon->backlight == NULL)
0044         return;
0045 
0046     scon->backlight->props.power = mode == DRM_MODE_DPMS_ON
0047                      ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
0048     backlight_update_status(scon->backlight);
0049 }
0050 
0051 int shmob_drm_backlight_init(struct shmob_drm_connector *scon)
0052 {
0053     struct shmob_drm_device *sdev = scon->connector.dev->dev_private;
0054     const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight;
0055     struct drm_connector *connector = &scon->connector;
0056     struct drm_device *dev = connector->dev;
0057     struct backlight_device *backlight;
0058 
0059     if (!bdata->max_brightness)
0060         return 0;
0061 
0062     backlight = backlight_device_register(bdata->name, dev->dev, scon,
0063                           &shmob_drm_backlight_ops, NULL);
0064     if (IS_ERR(backlight)) {
0065         dev_err(dev->dev, "unable to register backlight device: %ld\n",
0066             PTR_ERR(backlight));
0067         return PTR_ERR(backlight);
0068     }
0069 
0070     backlight->props.max_brightness = bdata->max_brightness;
0071     backlight->props.brightness = bdata->max_brightness;
0072     backlight->props.power = FB_BLANK_POWERDOWN;
0073     backlight_update_status(backlight);
0074 
0075     scon->backlight = backlight;
0076     return 0;
0077 }
0078 
0079 void shmob_drm_backlight_exit(struct shmob_drm_connector *scon)
0080 {
0081     backlight_device_unregister(scon->backlight);
0082 }