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 /**
3455d5d3b4SDan Murphy * led_classdev_multicolor_register_ext - register a new object of led_classdev
3555d5d3b4SDan Murphy * class with support for multicolor LEDs
3655d5d3b4SDan Murphy * @parent: the multicolor LED to register
3755d5d3b4SDan Murphy * @mcled_cdev: the led_classdev_mc structure for this device
3855d5d3b4SDan Murphy * @init_data: the LED class multicolor device initialization data
3955d5d3b4SDan Murphy *
4055d5d3b4SDan Murphy * Returns: 0 on success or negative error value on failure
4155d5d3b4SDan Murphy */
4255d5d3b4SDan Murphy int led_classdev_multicolor_register_ext(struct device *parent,
4355d5d3b4SDan Murphy struct led_classdev_mc *mcled_cdev,
4455d5d3b4SDan Murphy struct led_init_data *init_data);
4555d5d3b4SDan Murphy
4655d5d3b4SDan Murphy /**
4755d5d3b4SDan Murphy * led_classdev_multicolor_unregister - unregisters an object of led_classdev
4855d5d3b4SDan Murphy * class with support for multicolor LEDs
4955d5d3b4SDan Murphy * @mcled_cdev: the multicolor LED to unregister
5055d5d3b4SDan Murphy *
5155d5d3b4SDan Murphy * Unregister a previously registered via led_classdev_multicolor_register
5255d5d3b4SDan Murphy * object
5355d5d3b4SDan Murphy */
5455d5d3b4SDan Murphy void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev);
5555d5d3b4SDan Murphy
5655d5d3b4SDan Murphy /* Calculate brightness for the monochrome LED cluster */
5755d5d3b4SDan Murphy int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev,
5855d5d3b4SDan Murphy enum led_brightness brightness);
5955d5d3b4SDan Murphy
6055d5d3b4SDan Murphy int devm_led_classdev_multicolor_register_ext(struct device *parent,
6155d5d3b4SDan Murphy struct led_classdev_mc *mcled_cdev,
6255d5d3b4SDan Murphy struct led_init_data *init_data);
6355d5d3b4SDan Murphy
6455d5d3b4SDan Murphy void devm_led_classdev_multicolor_unregister(struct device *parent,
6555d5d3b4SDan Murphy struct led_classdev_mc *mcled_cdev);
66*6039b7e8SGene Chen
led_classdev_multicolor_register(struct device * parent,struct led_classdev_mc * mcled_cdev)67*6039b7e8SGene Chen static inline int led_classdev_multicolor_register(struct device *parent,
68*6039b7e8SGene Chen struct led_classdev_mc *mcled_cdev)
69*6039b7e8SGene Chen {
70*6039b7e8SGene Chen return led_classdev_multicolor_register_ext(parent, mcled_cdev, NULL);
7155d5d3b4SDan Murphy }
7255d5d3b4SDan Murphy
devm_led_classdev_multicolor_register(struct device * parent,struct led_classdev_mc * mcled_cdev)7355d5d3b4SDan Murphy static inline int devm_led_classdev_multicolor_register(struct device *parent,
7455d5d3b4SDan Murphy struct led_classdev_mc *mcled_cdev)
7555d5d3b4SDan Murphy {
7655d5d3b4SDan Murphy return devm_led_classdev_multicolor_register_ext(parent, mcled_cdev,
7755d5d3b4SDan Murphy NULL);
7855d5d3b4SDan Murphy }
7955d5d3b4SDan Murphy
8055d5d3b4SDan Murphy #endif /* _LINUX_MULTICOLOR_LEDS_H_INCLUDED */
81