Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * nvec_paz00: OEM specific driver for Compal PAZ00 based devices
0004  *
0005  * Copyright (C) 2011 The AC100 Kernel Team <ac100@lists.launchpad.net>
0006  *
0007  * Authors:  Ilya Petrov <ilya.muromec@gmail.com>
0008  */
0009 
0010 #include <linux/module.h>
0011 #include <linux/err.h>
0012 #include <linux/slab.h>
0013 #include <linux/leds.h>
0014 #include <linux/platform_device.h>
0015 #include "nvec.h"
0016 
0017 #define to_nvec_led(led_cdev) \
0018     container_of(led_cdev, struct nvec_led, cdev)
0019 
0020 #define NVEC_LED_REQ {'\x0d', '\x10', '\x45', '\x10', '\x00'}
0021 
0022 #define NVEC_LED_MAX 8
0023 
0024 struct nvec_led {
0025     struct led_classdev cdev;
0026     struct nvec_chip *nvec;
0027 };
0028 
0029 static void nvec_led_brightness_set(struct led_classdev *led_cdev,
0030                     enum led_brightness value)
0031 {
0032     struct nvec_led *led = to_nvec_led(led_cdev);
0033     unsigned char buf[] = NVEC_LED_REQ;
0034 
0035     buf[4] = value;
0036 
0037     nvec_write_async(led->nvec, buf, sizeof(buf));
0038 
0039     led->cdev.brightness = value;
0040 }
0041 
0042 static int nvec_paz00_probe(struct platform_device *pdev)
0043 {
0044     struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent);
0045     struct nvec_led *led;
0046     int ret = 0;
0047 
0048     led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL);
0049     if (!led)
0050         return -ENOMEM;
0051 
0052     led->cdev.max_brightness = NVEC_LED_MAX;
0053 
0054     led->cdev.brightness_set = nvec_led_brightness_set;
0055     led->cdev.name = "paz00-led";
0056     led->cdev.flags |= LED_CORE_SUSPENDRESUME;
0057     led->nvec = nvec;
0058 
0059     platform_set_drvdata(pdev, led);
0060 
0061     ret = devm_led_classdev_register(&pdev->dev, &led->cdev);
0062     if (ret < 0)
0063         return ret;
0064 
0065     /* to expose the default value to userspace */
0066     led->cdev.brightness = 0;
0067 
0068     return 0;
0069 }
0070 
0071 static struct platform_driver nvec_paz00_driver = {
0072     .probe  = nvec_paz00_probe,
0073     .driver = {
0074         .name  = "nvec-paz00",
0075     },
0076 };
0077 
0078 module_platform_driver(nvec_paz00_driver);
0079 
0080 MODULE_AUTHOR("Ilya Petrov <ilya.muromec@gmail.com>");
0081 MODULE_DESCRIPTION("Tegra NVEC PAZ00 driver");
0082 MODULE_LICENSE("GPL");
0083 MODULE_ALIAS("platform:nvec-paz00");