/* * 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); }