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

led-class-flash.h (6900B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * LED Flash class interface
      4 *
      5 * Copyright (C) 2015 Samsung Electronics Co., Ltd.
      6 * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
      7 */
      8#ifndef __LINUX_FLASH_LEDS_H_INCLUDED
      9#define __LINUX_FLASH_LEDS_H_INCLUDED
     10
     11#include <linux/leds.h>
     12
     13struct device_node;
     14struct led_classdev_flash;
     15
     16/*
     17 * Supported led fault bits - must be kept in synch
     18 * with V4L2_FLASH_FAULT bits.
     19 */
     20#define LED_FAULT_OVER_VOLTAGE		(1 << 0)
     21#define LED_FAULT_TIMEOUT		(1 << 1)
     22#define LED_FAULT_OVER_TEMPERATURE	(1 << 2)
     23#define LED_FAULT_SHORT_CIRCUIT		(1 << 3)
     24#define LED_FAULT_OVER_CURRENT		(1 << 4)
     25#define LED_FAULT_INDICATOR		(1 << 5)
     26#define LED_FAULT_UNDER_VOLTAGE		(1 << 6)
     27#define LED_FAULT_INPUT_VOLTAGE		(1 << 7)
     28#define LED_FAULT_LED_OVER_TEMPERATURE	(1 << 8)
     29#define LED_NUM_FLASH_FAULTS		9
     30
     31#define LED_FLASH_SYSFS_GROUPS_SIZE	5
     32
     33struct led_flash_ops {
     34	/* set flash brightness */
     35	int (*flash_brightness_set)(struct led_classdev_flash *fled_cdev,
     36					u32 brightness);
     37	/* get flash brightness */
     38	int (*flash_brightness_get)(struct led_classdev_flash *fled_cdev,
     39					u32 *brightness);
     40	/* set flash strobe state */
     41	int (*strobe_set)(struct led_classdev_flash *fled_cdev, bool state);
     42	/* get flash strobe state */
     43	int (*strobe_get)(struct led_classdev_flash *fled_cdev, bool *state);
     44	/* set flash timeout */
     45	int (*timeout_set)(struct led_classdev_flash *fled_cdev, u32 timeout);
     46	/* get the flash LED fault */
     47	int (*fault_get)(struct led_classdev_flash *fled_cdev, u32 *fault);
     48};
     49
     50/*
     51 * Current value of a flash setting along
     52 * with its constraints.
     53 */
     54struct led_flash_setting {
     55	/* maximum allowed value */
     56	u32 min;
     57	/* maximum allowed value */
     58	u32 max;
     59	/* step value */
     60	u32 step;
     61	/* current value */
     62	u32 val;
     63};
     64
     65struct led_classdev_flash {
     66	/* led class device */
     67	struct led_classdev led_cdev;
     68
     69	/* flash led specific ops */
     70	const struct led_flash_ops *ops;
     71
     72	/* flash brightness value in microamperes along with its constraints */
     73	struct led_flash_setting brightness;
     74
     75	/* flash timeout value in microseconds along with its constraints */
     76	struct led_flash_setting timeout;
     77
     78	/* LED Flash class sysfs groups */
     79	const struct attribute_group *sysfs_groups[LED_FLASH_SYSFS_GROUPS_SIZE];
     80};
     81
     82static inline struct led_classdev_flash *lcdev_to_flcdev(
     83						struct led_classdev *lcdev)
     84{
     85	return container_of(lcdev, struct led_classdev_flash, led_cdev);
     86}
     87
     88#if IS_ENABLED(CONFIG_LEDS_CLASS_FLASH)
     89/**
     90 * led_classdev_flash_register_ext - register a new object of LED class with
     91 *				     init data and with support for flash LEDs
     92 * @parent: LED flash controller device this flash LED is driven by
     93 * @fled_cdev: the led_classdev_flash structure for this device
     94 * @init_data: the LED class flash device initialization data
     95 *
     96 * Returns: 0 on success or negative error value on failure
     97 */
     98int led_classdev_flash_register_ext(struct device *parent,
     99				    struct led_classdev_flash *fled_cdev,
    100				    struct led_init_data *init_data);
    101
    102/**
    103 * led_classdev_flash_unregister - unregisters an object of led_classdev class
    104 *				   with support for flash LEDs
    105 * @fled_cdev: the flash LED to unregister
    106 *
    107 * Unregister a previously registered via led_classdev_flash_register object
    108 */
    109void led_classdev_flash_unregister(struct led_classdev_flash *fled_cdev);
    110
    111int devm_led_classdev_flash_register_ext(struct device *parent,
    112				     struct led_classdev_flash *fled_cdev,
    113				     struct led_init_data *init_data);
    114
    115
    116void devm_led_classdev_flash_unregister(struct device *parent,
    117					struct led_classdev_flash *fled_cdev);
    118
    119#else
    120
    121static inline int led_classdev_flash_register_ext(struct device *parent,
    122				    struct led_classdev_flash *fled_cdev,
    123				    struct led_init_data *init_data)
    124{
    125	return 0;
    126}
    127
    128static inline void led_classdev_flash_unregister(struct led_classdev_flash *fled_cdev) {};
    129static inline int devm_led_classdev_flash_register_ext(struct device *parent,
    130				     struct led_classdev_flash *fled_cdev,
    131				     struct led_init_data *init_data)
    132{
    133	return 0;
    134}
    135
    136static inline void devm_led_classdev_flash_unregister(struct device *parent,
    137					struct led_classdev_flash *fled_cdev)
    138{};
    139
    140#endif  /* IS_ENABLED(CONFIG_LEDS_CLASS_FLASH) */
    141
    142static inline int led_classdev_flash_register(struct device *parent,
    143					   struct led_classdev_flash *fled_cdev)
    144{
    145	return led_classdev_flash_register_ext(parent, fled_cdev, NULL);
    146}
    147
    148static inline int devm_led_classdev_flash_register(struct device *parent,
    149				     struct led_classdev_flash *fled_cdev)
    150{
    151	return devm_led_classdev_flash_register_ext(parent, fled_cdev, NULL);
    152}
    153
    154/**
    155 * led_set_flash_strobe - setup flash strobe
    156 * @fled_cdev: the flash LED to set strobe on
    157 * @state: 1 - strobe flash, 0 - stop flash strobe
    158 *
    159 * Strobe the flash LED.
    160 *
    161 * Returns: 0 on success or negative error value on failure
    162 */
    163static inline int led_set_flash_strobe(struct led_classdev_flash *fled_cdev,
    164					bool state)
    165{
    166	if (!fled_cdev)
    167		return -EINVAL;
    168	return fled_cdev->ops->strobe_set(fled_cdev, state);
    169}
    170
    171/**
    172 * led_get_flash_strobe - get flash strobe status
    173 * @fled_cdev: the flash LED to query
    174 * @state: 1 - flash is strobing, 0 - flash is off
    175 *
    176 * Check whether the flash is strobing at the moment.
    177 *
    178 * Returns: 0 on success or negative error value on failure
    179 */
    180static inline int led_get_flash_strobe(struct led_classdev_flash *fled_cdev,
    181					bool *state)
    182{
    183	if (!fled_cdev)
    184		return -EINVAL;
    185	if (fled_cdev->ops->strobe_get)
    186		return fled_cdev->ops->strobe_get(fled_cdev, state);
    187
    188	return -EINVAL;
    189}
    190
    191/**
    192 * led_set_flash_brightness - set flash LED brightness
    193 * @fled_cdev: the flash LED to set
    194 * @brightness: the brightness to set it to
    195 *
    196 * Set a flash LED's brightness.
    197 *
    198 * Returns: 0 on success or negative error value on failure
    199 */
    200int led_set_flash_brightness(struct led_classdev_flash *fled_cdev,
    201			     u32 brightness);
    202
    203/**
    204 * led_update_flash_brightness - update flash LED brightness
    205 * @fled_cdev: the flash LED to query
    206 *
    207 * Get a flash LED's current brightness and update led_flash->brightness
    208 * member with the obtained value.
    209 *
    210 * Returns: 0 on success or negative error value on failure
    211 */
    212int led_update_flash_brightness(struct led_classdev_flash *fled_cdev);
    213
    214/**
    215 * led_set_flash_timeout - set flash LED timeout
    216 * @fled_cdev: the flash LED to set
    217 * @timeout: the flash timeout to set it to
    218 *
    219 * Set the flash strobe duration.
    220 *
    221 * Returns: 0 on success or negative error value on failure
    222 */
    223int led_set_flash_timeout(struct led_classdev_flash *fled_cdev, u32 timeout);
    224
    225/**
    226 * led_get_flash_fault - get the flash LED fault
    227 * @fled_cdev: the flash LED to query
    228 * @fault: bitmask containing flash faults
    229 *
    230 * Get the flash LED fault.
    231 *
    232 * Returns: 0 on success or negative error value on failure
    233 */
    234int led_get_flash_fault(struct led_classdev_flash *fled_cdev, u32 *fault);
    235
    236#endif	/* __LINUX_FLASH_LEDS_H_INCLUDED */