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