| /* |
| * shmob_drm_backlight.c -- SH Mobile DRM Backlight |
| * |
| * Copyright (C) 2012 Renesas Electronics Corporation |
| * |
| * Laurent Pinchart (laurent.pinchart@ideasonboard.com) |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| */ |
| |
| #include <linux/backlight.h> |
| |
| #include "shmob_drm_backlight.h" |
| #include "shmob_drm_crtc.h" |
| #include "shmob_drm_drv.h" |
| |
| static int shmob_drm_backlight_update(struct backlight_device *bdev) |
| { |
| struct shmob_drm_connector *scon = bl_get_data(bdev); |
| struct shmob_drm_device *sdev = scon->connector.dev->dev_private; |
| const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight; |
| int brightness = bdev->props.brightness; |
| |
| if (bdev->props.power != FB_BLANK_UNBLANK || |
| bdev->props.state & BL_CORE_SUSPENDED) |
| brightness = 0; |
| |
| return bdata->set_brightness(brightness); |
| } |
| |
| static int shmob_drm_backlight_get_brightness(struct backlight_device *bdev) |
| { |
| struct shmob_drm_connector *scon = bl_get_data(bdev); |
| struct shmob_drm_device *sdev = scon->connector.dev->dev_private; |
| const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight; |
| |
| return bdata->get_brightness(); |
| } |
| |
| static const struct backlight_ops shmob_drm_backlight_ops = { |
| .options = BL_CORE_SUSPENDRESUME, |
| .update_status = shmob_drm_backlight_update, |
| .get_brightness = shmob_drm_backlight_get_brightness, |
| }; |
| |
| void shmob_drm_backlight_dpms(struct shmob_drm_connector *scon, int mode) |
| { |
| if (scon->backlight == NULL) |
| return; |
| |
| scon->backlight->props.power = mode == DRM_MODE_DPMS_ON |
| ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; |
| backlight_update_status(scon->backlight); |
| } |
| |
| int shmob_drm_backlight_init(struct shmob_drm_connector *scon) |
| { |
| struct shmob_drm_device *sdev = scon->connector.dev->dev_private; |
| const struct shmob_drm_backlight_data *bdata = &sdev->pdata->backlight; |
| struct drm_connector *connector = &scon->connector; |
| struct drm_device *dev = connector->dev; |
| struct backlight_device *backlight; |
| |
| if (!bdata->max_brightness) |
| return 0; |
| |
| backlight = backlight_device_register(bdata->name, dev->dev, scon, |
| &shmob_drm_backlight_ops, NULL); |
| if (IS_ERR(backlight)) { |
| dev_err(dev->dev, "unable to register backlight device: %ld\n", |
| PTR_ERR(backlight)); |
| return PTR_ERR(backlight); |
| } |
| |
| backlight->props.max_brightness = bdata->max_brightness; |
| backlight->props.brightness = bdata->max_brightness; |
| backlight->props.power = FB_BLANK_POWERDOWN; |
| backlight_update_status(backlight); |
| |
| scon->backlight = backlight; |
| return 0; |
| } |
| |
| void shmob_drm_backlight_exit(struct shmob_drm_connector *scon) |
| { |
| backlight_device_unregister(scon->backlight); |
| } |