1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
27aea8389SJacek Anaszewski /*
37aea8389SJacek Anaszewski * LED Flash class interface
47aea8389SJacek Anaszewski *
57aea8389SJacek Anaszewski * Copyright (C) 2015 Samsung Electronics Co., Ltd.
67aea8389SJacek Anaszewski * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
77aea8389SJacek Anaszewski */
87aea8389SJacek Anaszewski #ifndef __LINUX_FLASH_LEDS_H_INCLUDED
97aea8389SJacek Anaszewski #define __LINUX_FLASH_LEDS_H_INCLUDED
107aea8389SJacek Anaszewski
117aea8389SJacek Anaszewski #include <linux/leds.h>
127aea8389SJacek Anaszewski
137aea8389SJacek Anaszewski struct device_node;
147aea8389SJacek Anaszewski struct led_classdev_flash;
157aea8389SJacek Anaszewski
167aea8389SJacek Anaszewski /*
177aea8389SJacek Anaszewski * Supported led fault bits - must be kept in synch
187aea8389SJacek Anaszewski * with V4L2_FLASH_FAULT bits.
197aea8389SJacek Anaszewski */
207aea8389SJacek Anaszewski #define LED_FAULT_OVER_VOLTAGE (1 << 0)
217aea8389SJacek Anaszewski #define LED_FAULT_TIMEOUT (1 << 1)
227aea8389SJacek Anaszewski #define LED_FAULT_OVER_TEMPERATURE (1 << 2)
237aea8389SJacek Anaszewski #define LED_FAULT_SHORT_CIRCUIT (1 << 3)
247aea8389SJacek Anaszewski #define LED_FAULT_OVER_CURRENT (1 << 4)
257aea8389SJacek Anaszewski #define LED_FAULT_INDICATOR (1 << 5)
267aea8389SJacek Anaszewski #define LED_FAULT_UNDER_VOLTAGE (1 << 6)
277aea8389SJacek Anaszewski #define LED_FAULT_INPUT_VOLTAGE (1 << 7)
287aea8389SJacek Anaszewski #define LED_FAULT_LED_OVER_TEMPERATURE (1 << 8)
297aea8389SJacek Anaszewski #define LED_NUM_FLASH_FAULTS 9
307aea8389SJacek Anaszewski
319647507aSJacek Anaszewski #define LED_FLASH_SYSFS_GROUPS_SIZE 5
327aea8389SJacek Anaszewski
337aea8389SJacek Anaszewski struct led_flash_ops {
347aea8389SJacek Anaszewski /* set flash brightness */
357aea8389SJacek Anaszewski int (*flash_brightness_set)(struct led_classdev_flash *fled_cdev,
367aea8389SJacek Anaszewski u32 brightness);
377aea8389SJacek Anaszewski /* get flash brightness */
387aea8389SJacek Anaszewski int (*flash_brightness_get)(struct led_classdev_flash *fled_cdev,
397aea8389SJacek Anaszewski u32 *brightness);
407aea8389SJacek Anaszewski /* set flash strobe state */
417aea8389SJacek Anaszewski int (*strobe_set)(struct led_classdev_flash *fled_cdev, bool state);
427aea8389SJacek Anaszewski /* get flash strobe state */
437aea8389SJacek Anaszewski int (*strobe_get)(struct led_classdev_flash *fled_cdev, bool *state);
447aea8389SJacek Anaszewski /* set flash timeout */
457aea8389SJacek Anaszewski int (*timeout_set)(struct led_classdev_flash *fled_cdev, u32 timeout);
467aea8389SJacek Anaszewski /* get the flash LED fault */
477aea8389SJacek Anaszewski int (*fault_get)(struct led_classdev_flash *fled_cdev, u32 *fault);
487aea8389SJacek Anaszewski };
497aea8389SJacek Anaszewski
507aea8389SJacek Anaszewski /*
517aea8389SJacek Anaszewski * Current value of a flash setting along
527aea8389SJacek Anaszewski * with its constraints.
537aea8389SJacek Anaszewski */
547aea8389SJacek Anaszewski struct led_flash_setting {
557aea8389SJacek Anaszewski /* maximum allowed value */
567aea8389SJacek Anaszewski u32 min;
577aea8389SJacek Anaszewski /* maximum allowed value */
587aea8389SJacek Anaszewski u32 max;
597aea8389SJacek Anaszewski /* step value */
607aea8389SJacek Anaszewski u32 step;
617aea8389SJacek Anaszewski /* current value */
627aea8389SJacek Anaszewski u32 val;
637aea8389SJacek Anaszewski };
647aea8389SJacek Anaszewski
657aea8389SJacek Anaszewski struct led_classdev_flash {
667aea8389SJacek Anaszewski /* led class device */
677aea8389SJacek Anaszewski struct led_classdev led_cdev;
687aea8389SJacek Anaszewski
697aea8389SJacek Anaszewski /* flash led specific ops */
707aea8389SJacek Anaszewski const struct led_flash_ops *ops;
717aea8389SJacek Anaszewski
727aea8389SJacek Anaszewski /* flash brightness value in microamperes along with its constraints */
737aea8389SJacek Anaszewski struct led_flash_setting brightness;
747aea8389SJacek Anaszewski
757aea8389SJacek Anaszewski /* flash timeout value in microseconds along with its constraints */
767aea8389SJacek Anaszewski struct led_flash_setting timeout;
777aea8389SJacek Anaszewski
787aea8389SJacek Anaszewski /* LED Flash class sysfs groups */
799647507aSJacek Anaszewski const struct attribute_group *sysfs_groups[LED_FLASH_SYSFS_GROUPS_SIZE];
807aea8389SJacek Anaszewski };
817aea8389SJacek Anaszewski
lcdev_to_flcdev(struct led_classdev * lcdev)827aea8389SJacek Anaszewski static inline struct led_classdev_flash *lcdev_to_flcdev(
837aea8389SJacek Anaszewski struct led_classdev *lcdev)
847aea8389SJacek Anaszewski {
857aea8389SJacek Anaszewski return container_of(lcdev, struct led_classdev_flash, led_cdev);
867aea8389SJacek Anaszewski }
877aea8389SJacek Anaszewski
88*8e5c38a3SGene Chen #if IS_ENABLED(CONFIG_LEDS_CLASS_FLASH)
897aea8389SJacek Anaszewski /**
90b2b998c0SJacek Anaszewski * led_classdev_flash_register_ext - register a new object of LED class with
91b2b998c0SJacek Anaszewski * init data and with support for flash LEDs
92b2b998c0SJacek Anaszewski * @parent: LED flash controller device this flash LED is driven by
937aea8389SJacek Anaszewski * @fled_cdev: the led_classdev_flash structure for this device
94b2b998c0SJacek Anaszewski * @init_data: the LED class flash device initialization data
957aea8389SJacek Anaszewski *
967aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
977aea8389SJacek Anaszewski */
9857e5c31eSDan Murphy int led_classdev_flash_register_ext(struct device *parent,
99b2b998c0SJacek Anaszewski struct led_classdev_flash *fled_cdev,
100b2b998c0SJacek Anaszewski struct led_init_data *init_data);
101b2b998c0SJacek Anaszewski
1027aea8389SJacek Anaszewski /**
1037aea8389SJacek Anaszewski * led_classdev_flash_unregister - unregisters an object of led_classdev class
1047aea8389SJacek Anaszewski * with support for flash LEDs
1057aea8389SJacek Anaszewski * @fled_cdev: the flash LED to unregister
1067aea8389SJacek Anaszewski *
1077aea8389SJacek Anaszewski * Unregister a previously registered via led_classdev_flash_register object
1087aea8389SJacek Anaszewski */
10957e5c31eSDan Murphy void led_classdev_flash_unregister(struct led_classdev_flash *fled_cdev);
1107aea8389SJacek Anaszewski
11120cdba9dSDan Murphy int devm_led_classdev_flash_register_ext(struct device *parent,
11220cdba9dSDan Murphy struct led_classdev_flash *fled_cdev,
11320cdba9dSDan Murphy struct led_init_data *init_data);
11420cdba9dSDan Murphy
11520cdba9dSDan Murphy
116*8e5c38a3SGene Chen void devm_led_classdev_flash_unregister(struct device *parent,
117*8e5c38a3SGene Chen struct led_classdev_flash *fled_cdev);
118*8e5c38a3SGene Chen
119*8e5c38a3SGene Chen #else
120*8e5c38a3SGene Chen
led_classdev_flash_register_ext(struct device * parent,struct led_classdev_flash * fled_cdev,struct led_init_data * init_data)121*8e5c38a3SGene Chen static inline int led_classdev_flash_register_ext(struct device *parent,
122*8e5c38a3SGene Chen struct led_classdev_flash *fled_cdev,
123*8e5c38a3SGene Chen struct led_init_data *init_data)
124*8e5c38a3SGene Chen {
125*8e5c38a3SGene Chen return 0;
126*8e5c38a3SGene Chen }
127*8e5c38a3SGene Chen
led_classdev_flash_unregister(struct led_classdev_flash * fled_cdev)128*8e5c38a3SGene Chen static inline void led_classdev_flash_unregister(struct led_classdev_flash *fled_cdev) {};
devm_led_classdev_flash_register_ext(struct device * parent,struct led_classdev_flash * fled_cdev,struct led_init_data * init_data)129*8e5c38a3SGene Chen static inline int devm_led_classdev_flash_register_ext(struct device *parent,
130*8e5c38a3SGene Chen struct led_classdev_flash *fled_cdev,
131*8e5c38a3SGene Chen struct led_init_data *init_data)
132*8e5c38a3SGene Chen {
133*8e5c38a3SGene Chen return 0;
134*8e5c38a3SGene Chen }
135*8e5c38a3SGene Chen
devm_led_classdev_flash_unregister(struct device * parent,struct led_classdev_flash * fled_cdev)136*8e5c38a3SGene Chen static inline void devm_led_classdev_flash_unregister(struct device *parent,
137*8e5c38a3SGene Chen struct led_classdev_flash *fled_cdev)
138*8e5c38a3SGene Chen {};
139*8e5c38a3SGene Chen
140*8e5c38a3SGene Chen #endif /* IS_ENABLED(CONFIG_LEDS_CLASS_FLASH) */
141*8e5c38a3SGene Chen
led_classdev_flash_register(struct device * parent,struct led_classdev_flash * fled_cdev)142*8e5c38a3SGene Chen static inline int led_classdev_flash_register(struct device *parent,
143*8e5c38a3SGene Chen struct led_classdev_flash *fled_cdev)
144*8e5c38a3SGene Chen {
145*8e5c38a3SGene Chen return led_classdev_flash_register_ext(parent, fled_cdev, NULL);
146*8e5c38a3SGene Chen }
147*8e5c38a3SGene Chen
devm_led_classdev_flash_register(struct device * parent,struct led_classdev_flash * fled_cdev)14820cdba9dSDan Murphy static inline int devm_led_classdev_flash_register(struct device *parent,
14920cdba9dSDan Murphy struct led_classdev_flash *fled_cdev)
15020cdba9dSDan Murphy {
15120cdba9dSDan Murphy return devm_led_classdev_flash_register_ext(parent, fled_cdev, NULL);
15220cdba9dSDan Murphy }
15320cdba9dSDan Murphy
1547aea8389SJacek Anaszewski /**
1557aea8389SJacek Anaszewski * led_set_flash_strobe - setup flash strobe
1567aea8389SJacek Anaszewski * @fled_cdev: the flash LED to set strobe on
1577aea8389SJacek Anaszewski * @state: 1 - strobe flash, 0 - stop flash strobe
1587aea8389SJacek Anaszewski *
1597aea8389SJacek Anaszewski * Strobe the flash LED.
1607aea8389SJacek Anaszewski *
1617aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
1627aea8389SJacek Anaszewski */
led_set_flash_strobe(struct led_classdev_flash * fled_cdev,bool state)1637aea8389SJacek Anaszewski static inline int led_set_flash_strobe(struct led_classdev_flash *fled_cdev,
1647aea8389SJacek Anaszewski bool state)
1657aea8389SJacek Anaszewski {
16609db1a46SMauro Carvalho Chehab if (!fled_cdev)
16709db1a46SMauro Carvalho Chehab return -EINVAL;
1687aea8389SJacek Anaszewski return fled_cdev->ops->strobe_set(fled_cdev, state);
1697aea8389SJacek Anaszewski }
1707aea8389SJacek Anaszewski
1717aea8389SJacek Anaszewski /**
1727aea8389SJacek Anaszewski * led_get_flash_strobe - get flash strobe status
1737aea8389SJacek Anaszewski * @fled_cdev: the flash LED to query
1747aea8389SJacek Anaszewski * @state: 1 - flash is strobing, 0 - flash is off
1757aea8389SJacek Anaszewski *
1767aea8389SJacek Anaszewski * Check whether the flash is strobing at the moment.
1777aea8389SJacek Anaszewski *
1787aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
1797aea8389SJacek Anaszewski */
led_get_flash_strobe(struct led_classdev_flash * fled_cdev,bool * state)1807aea8389SJacek Anaszewski static inline int led_get_flash_strobe(struct led_classdev_flash *fled_cdev,
1817aea8389SJacek Anaszewski bool *state)
1827aea8389SJacek Anaszewski {
18309db1a46SMauro Carvalho Chehab if (!fled_cdev)
18409db1a46SMauro Carvalho Chehab return -EINVAL;
1857aea8389SJacek Anaszewski if (fled_cdev->ops->strobe_get)
1867aea8389SJacek Anaszewski return fled_cdev->ops->strobe_get(fled_cdev, state);
1877aea8389SJacek Anaszewski
1887aea8389SJacek Anaszewski return -EINVAL;
1897aea8389SJacek Anaszewski }
1907aea8389SJacek Anaszewski
1917aea8389SJacek Anaszewski /**
1927aea8389SJacek Anaszewski * led_set_flash_brightness - set flash LED brightness
1937aea8389SJacek Anaszewski * @fled_cdev: the flash LED to set
1947aea8389SJacek Anaszewski * @brightness: the brightness to set it to
1957aea8389SJacek Anaszewski *
1967aea8389SJacek Anaszewski * Set a flash LED's brightness.
1977aea8389SJacek Anaszewski *
1987aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
1997aea8389SJacek Anaszewski */
20057e5c31eSDan Murphy int led_set_flash_brightness(struct led_classdev_flash *fled_cdev,
2017aea8389SJacek Anaszewski u32 brightness);
2027aea8389SJacek Anaszewski
2037aea8389SJacek Anaszewski /**
2047aea8389SJacek Anaszewski * led_update_flash_brightness - update flash LED brightness
2057aea8389SJacek Anaszewski * @fled_cdev: the flash LED to query
2067aea8389SJacek Anaszewski *
2077aea8389SJacek Anaszewski * Get a flash LED's current brightness and update led_flash->brightness
2087aea8389SJacek Anaszewski * member with the obtained value.
2097aea8389SJacek Anaszewski *
2107aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
2117aea8389SJacek Anaszewski */
21257e5c31eSDan Murphy int led_update_flash_brightness(struct led_classdev_flash *fled_cdev);
2137aea8389SJacek Anaszewski
2147aea8389SJacek Anaszewski /**
2157aea8389SJacek Anaszewski * led_set_flash_timeout - set flash LED timeout
2167aea8389SJacek Anaszewski * @fled_cdev: the flash LED to set
2177aea8389SJacek Anaszewski * @timeout: the flash timeout to set it to
2187aea8389SJacek Anaszewski *
2197aea8389SJacek Anaszewski * Set the flash strobe duration.
2207aea8389SJacek Anaszewski *
2217aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
2227aea8389SJacek Anaszewski */
22357e5c31eSDan Murphy int led_set_flash_timeout(struct led_classdev_flash *fled_cdev, u32 timeout);
2247aea8389SJacek Anaszewski
2257aea8389SJacek Anaszewski /**
2267aea8389SJacek Anaszewski * led_get_flash_fault - get the flash LED fault
2277aea8389SJacek Anaszewski * @fled_cdev: the flash LED to query
2287aea8389SJacek Anaszewski * @fault: bitmask containing flash faults
2297aea8389SJacek Anaszewski *
2307aea8389SJacek Anaszewski * Get the flash LED fault.
2317aea8389SJacek Anaszewski *
2327aea8389SJacek Anaszewski * Returns: 0 on success or negative error value on failure
2337aea8389SJacek Anaszewski */
23457e5c31eSDan Murphy int led_get_flash_fault(struct led_classdev_flash *fled_cdev, u32 *fault);
2357aea8389SJacek Anaszewski
2367aea8389SJacek Anaszewski #endif /* __LINUX_FLASH_LEDS_H_INCLUDED */
237