155d5d3b4SDan Murphy /* SPDX-License-Identifier: GPL-2.0 */
255d5d3b4SDan Murphy /* LED Multicolor class interface
355d5d3b4SDan Murphy  * Copyright (C) 2019-20 Texas Instruments Incorporated - http://www.ti.com/
455d5d3b4SDan Murphy  */
555d5d3b4SDan Murphy 
655d5d3b4SDan Murphy #ifndef _LINUX_MULTICOLOR_LEDS_H_INCLUDED
755d5d3b4SDan Murphy #define _LINUX_MULTICOLOR_LEDS_H_INCLUDED
855d5d3b4SDan Murphy 
955d5d3b4SDan Murphy #include <linux/leds.h>
1055d5d3b4SDan Murphy #include <dt-bindings/leds/common.h>
1155d5d3b4SDan Murphy 
1255d5d3b4SDan Murphy struct mc_subled {
1355d5d3b4SDan Murphy 	unsigned int color_index;
1455d5d3b4SDan Murphy 	unsigned int brightness;
1555d5d3b4SDan Murphy 	unsigned int intensity;
1655d5d3b4SDan Murphy 	unsigned int channel;
1755d5d3b4SDan Murphy };
1855d5d3b4SDan Murphy 
1955d5d3b4SDan Murphy struct led_classdev_mc {
2055d5d3b4SDan Murphy 	/* led class device */
2155d5d3b4SDan Murphy 	struct led_classdev led_cdev;
2255d5d3b4SDan Murphy 	unsigned int num_colors;
2355d5d3b4SDan Murphy 
2455d5d3b4SDan Murphy 	struct mc_subled *subled_info;
2555d5d3b4SDan Murphy };
2655d5d3b4SDan Murphy 
lcdev_to_mccdev(struct led_classdev * led_cdev)2755d5d3b4SDan Murphy static inline struct led_classdev_mc *lcdev_to_mccdev(
2855d5d3b4SDan Murphy 						struct led_classdev *led_cdev)
2955d5d3b4SDan Murphy {
3055d5d3b4SDan Murphy 	return container_of(led_cdev, struct led_classdev_mc, led_cdev);
3155d5d3b4SDan Murphy }
3255d5d3b4SDan Murphy 
3355d5d3b4SDan Murphy #if IS_ENABLED(CONFIG_LEDS_CLASS_MULTICOLOR)
3455d5d3b4SDan Murphy /**
3555d5d3b4SDan Murphy  * led_classdev_multicolor_register_ext - register a new object of led_classdev
3655d5d3b4SDan Murphy  *				      class with support for multicolor LEDs
3755d5d3b4SDan Murphy  * @parent: the multicolor LED to register
3855d5d3b4SDan Murphy  * @mcled_cdev: the led_classdev_mc structure for this device
3955d5d3b4SDan Murphy  * @init_data: the LED class multicolor device initialization data
4055d5d3b4SDan Murphy  *
4155d5d3b4SDan Murphy  * Returns: 0 on success or negative error value on failure
4255d5d3b4SDan Murphy  */
4355d5d3b4SDan Murphy int led_classdev_multicolor_register_ext(struct device *parent,
4455d5d3b4SDan Murphy 					    struct led_classdev_mc *mcled_cdev,
4555d5d3b4SDan Murphy 					    struct led_init_data *init_data);
4655d5d3b4SDan Murphy 
4755d5d3b4SDan Murphy /**
4855d5d3b4SDan Murphy  * led_classdev_multicolor_unregister - unregisters an object of led_classdev
4955d5d3b4SDan Murphy  *					class with support for multicolor LEDs
5055d5d3b4SDan Murphy  * @mcled_cdev: the multicolor LED to unregister
5155d5d3b4SDan Murphy  *
5255d5d3b4SDan Murphy  * Unregister a previously registered via led_classdev_multicolor_register
5355d5d3b4SDan Murphy  * object
5455d5d3b4SDan Murphy  */
5555d5d3b4SDan Murphy void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev);
5655d5d3b4SDan Murphy 
5755d5d3b4SDan Murphy /* Calculate brightness for the monochrome LED cluster */
5855d5d3b4SDan Murphy int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev,
5955d5d3b4SDan Murphy 				 enum led_brightness brightness);
6055d5d3b4SDan Murphy 
6155d5d3b4SDan Murphy int devm_led_classdev_multicolor_register_ext(struct device *parent,
6255d5d3b4SDan Murphy 					  struct led_classdev_mc *mcled_cdev,
6355d5d3b4SDan Murphy 					  struct led_init_data *init_data);
6455d5d3b4SDan Murphy 
6555d5d3b4SDan Murphy void devm_led_classdev_multicolor_unregister(struct device *parent,
6655d5d3b4SDan Murphy 					    struct led_classdev_mc *mcled_cdev);
6755d5d3b4SDan Murphy #else
6855d5d3b4SDan Murphy 
led_classdev_multicolor_register_ext(struct device * parent,struct led_classdev_mc * mcled_cdev,struct led_init_data * init_data)6955d5d3b4SDan Murphy static inline int led_classdev_multicolor_register_ext(struct device *parent,
7055d5d3b4SDan Murphy 					    struct led_classdev_mc *mcled_cdev,
7155d5d3b4SDan Murphy 					    struct led_init_data *init_data)
7255d5d3b4SDan Murphy {
73*6039b7e8SGene Chen 	return 0;
7455d5d3b4SDan Murphy }
7555d5d3b4SDan Murphy 
led_classdev_multicolor_unregister(struct led_classdev_mc * mcled_cdev)7655d5d3b4SDan Murphy static inline void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev) {};
led_mc_calc_color_components(struct led_classdev_mc * mcled_cdev,enum led_brightness brightness)7755d5d3b4SDan Murphy static inline int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev,
7855d5d3b4SDan Murphy 					       enum led_brightness brightness)
7955d5d3b4SDan Murphy {
80*6039b7e8SGene Chen 	return 0;
8155d5d3b4SDan Murphy }
8255d5d3b4SDan Murphy 
devm_led_classdev_multicolor_register_ext(struct device * parent,struct led_classdev_mc * mcled_cdev,struct led_init_data * init_data)8355d5d3b4SDan Murphy static inline int devm_led_classdev_multicolor_register_ext(struct device *parent,
8455d5d3b4SDan Murphy 					  struct led_classdev_mc *mcled_cdev,
8555d5d3b4SDan Murphy 					  struct led_init_data *init_data)
8655d5d3b4SDan Murphy {
87*6039b7e8SGene Chen 	return 0;
88*6039b7e8SGene Chen }
89*6039b7e8SGene Chen 
devm_led_classdev_multicolor_unregister(struct device * parent,struct led_classdev_mc * mcled_cdev)90*6039b7e8SGene Chen static inline void devm_led_classdev_multicolor_unregister(struct device *parent,
91*6039b7e8SGene Chen 					    struct led_classdev_mc *mcled_cdev)
92*6039b7e8SGene Chen {};
93*6039b7e8SGene Chen 
94*6039b7e8SGene Chen #endif  /* IS_ENABLED(CONFIG_LEDS_CLASS_MULTICOLOR) */
95*6039b7e8SGene Chen 
led_classdev_multicolor_register(struct device * parent,struct led_classdev_mc * mcled_cdev)96*6039b7e8SGene Chen static inline int led_classdev_multicolor_register(struct device *parent,
97*6039b7e8SGene Chen 					    struct led_classdev_mc *mcled_cdev)
98*6039b7e8SGene Chen {
99*6039b7e8SGene Chen 	return led_classdev_multicolor_register_ext(parent, mcled_cdev, NULL);
10055d5d3b4SDan Murphy }
10155d5d3b4SDan Murphy 
devm_led_classdev_multicolor_register(struct device * parent,struct led_classdev_mc * mcled_cdev)10255d5d3b4SDan Murphy static inline int devm_led_classdev_multicolor_register(struct device *parent,
10355d5d3b4SDan Murphy 					     struct led_classdev_mc *mcled_cdev)
10455d5d3b4SDan Murphy {
10555d5d3b4SDan Murphy 	return devm_led_classdev_multicolor_register_ext(parent, mcled_cdev,
10655d5d3b4SDan Murphy 							 NULL);
10755d5d3b4SDan Murphy }
10855d5d3b4SDan Murphy 
10955d5d3b4SDan Murphy #endif	/* _LINUX_MULTICOLOR_LEDS_H_INCLUDED */
110