cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gpio_backlight.c (3423B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * gpio_backlight.c - Simple GPIO-controlled backlight
      4 */
      5
      6#include <linux/backlight.h>
      7#include <linux/err.h>
      8#include <linux/fb.h>
      9#include <linux/gpio/consumer.h>
     10#include <linux/init.h>
     11#include <linux/kernel.h>
     12#include <linux/module.h>
     13#include <linux/of.h>
     14#include <linux/platform_data/gpio_backlight.h>
     15#include <linux/platform_device.h>
     16#include <linux/property.h>
     17#include <linux/slab.h>
     18
     19struct gpio_backlight {
     20	struct device *fbdev;
     21	struct gpio_desc *gpiod;
     22};
     23
     24static int gpio_backlight_update_status(struct backlight_device *bl)
     25{
     26	struct gpio_backlight *gbl = bl_get_data(bl);
     27
     28	gpiod_set_value_cansleep(gbl->gpiod, backlight_get_brightness(bl));
     29
     30	return 0;
     31}
     32
     33static int gpio_backlight_check_fb(struct backlight_device *bl,
     34				   struct fb_info *info)
     35{
     36	struct gpio_backlight *gbl = bl_get_data(bl);
     37
     38	return gbl->fbdev == NULL || gbl->fbdev == info->dev;
     39}
     40
     41static const struct backlight_ops gpio_backlight_ops = {
     42	.options	= BL_CORE_SUSPENDRESUME,
     43	.update_status	= gpio_backlight_update_status,
     44	.check_fb	= gpio_backlight_check_fb,
     45};
     46
     47static int gpio_backlight_probe(struct platform_device *pdev)
     48{
     49	struct device *dev = &pdev->dev;
     50	struct gpio_backlight_platform_data *pdata = dev_get_platdata(dev);
     51	struct device_node *of_node = dev->of_node;
     52	struct backlight_properties props;
     53	struct backlight_device *bl;
     54	struct gpio_backlight *gbl;
     55	int ret, init_brightness, def_value;
     56
     57	gbl = devm_kzalloc(dev, sizeof(*gbl), GFP_KERNEL);
     58	if (gbl == NULL)
     59		return -ENOMEM;
     60
     61	if (pdata)
     62		gbl->fbdev = pdata->fbdev;
     63
     64	def_value = device_property_read_bool(dev, "default-on");
     65
     66	gbl->gpiod = devm_gpiod_get(dev, NULL, GPIOD_ASIS);
     67	if (IS_ERR(gbl->gpiod)) {
     68		ret = PTR_ERR(gbl->gpiod);
     69		if (ret != -EPROBE_DEFER)
     70			dev_err(dev,
     71				"Error: The gpios parameter is missing or invalid.\n");
     72		return ret;
     73	}
     74
     75	memset(&props, 0, sizeof(props));
     76	props.type = BACKLIGHT_RAW;
     77	props.max_brightness = 1;
     78	bl = devm_backlight_device_register(dev, dev_name(dev), dev, gbl,
     79					    &gpio_backlight_ops, &props);
     80	if (IS_ERR(bl)) {
     81		dev_err(dev, "failed to register backlight\n");
     82		return PTR_ERR(bl);
     83	}
     84
     85	/* Set the initial power state */
     86	if (!of_node || !of_node->phandle)
     87		/* Not booted with device tree or no phandle link to the node */
     88		bl->props.power = def_value ? FB_BLANK_UNBLANK
     89					    : FB_BLANK_POWERDOWN;
     90	else if (gpiod_get_direction(gbl->gpiod) == 0 &&
     91		 gpiod_get_value_cansleep(gbl->gpiod) == 0)
     92		bl->props.power = FB_BLANK_POWERDOWN;
     93	else
     94		bl->props.power = FB_BLANK_UNBLANK;
     95
     96	bl->props.brightness = 1;
     97
     98	init_brightness = backlight_get_brightness(bl);
     99	ret = gpiod_direction_output(gbl->gpiod, init_brightness);
    100	if (ret) {
    101		dev_err(dev, "failed to set initial brightness\n");
    102		return ret;
    103	}
    104
    105	platform_set_drvdata(pdev, bl);
    106	return 0;
    107}
    108
    109static struct of_device_id gpio_backlight_of_match[] = {
    110	{ .compatible = "gpio-backlight" },
    111	{ /* sentinel */ }
    112};
    113
    114MODULE_DEVICE_TABLE(of, gpio_backlight_of_match);
    115
    116static struct platform_driver gpio_backlight_driver = {
    117	.driver		= {
    118		.name		= "gpio-backlight",
    119		.of_match_table = gpio_backlight_of_match,
    120	},
    121	.probe		= gpio_backlight_probe,
    122};
    123
    124module_platform_driver(gpio_backlight_driver);
    125
    126MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
    127MODULE_DESCRIPTION("GPIO-based Backlight Driver");
    128MODULE_LICENSE("GPL");
    129MODULE_ALIAS("platform:gpio-backlight");