leds-lp55xx-common.h (6121B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * LP55XX Common Driver Header 4 * 5 * Copyright (C) 2012 Texas Instruments 6 * 7 * Author: Milo(Woogyom) Kim <milo.kim@ti.com> 8 * 9 * Derived from leds-lp5521.c, leds-lp5523.c 10 */ 11 12#ifndef _LEDS_LP55XX_COMMON_H 13#define _LEDS_LP55XX_COMMON_H 14 15#include <linux/led-class-multicolor.h> 16 17enum lp55xx_engine_index { 18 LP55XX_ENGINE_INVALID, 19 LP55XX_ENGINE_1, 20 LP55XX_ENGINE_2, 21 LP55XX_ENGINE_3, 22 LP55XX_ENGINE_MAX = LP55XX_ENGINE_3, 23}; 24 25enum lp55xx_engine_mode { 26 LP55XX_ENGINE_DISABLED, 27 LP55XX_ENGINE_LOAD, 28 LP55XX_ENGINE_RUN, 29}; 30 31#define LP55XX_DEV_ATTR_RW(name, show, store) \ 32 DEVICE_ATTR(name, S_IRUGO | S_IWUSR, show, store) 33#define LP55XX_DEV_ATTR_RO(name, show) \ 34 DEVICE_ATTR(name, S_IRUGO, show, NULL) 35#define LP55XX_DEV_ATTR_WO(name, store) \ 36 DEVICE_ATTR(name, S_IWUSR, NULL, store) 37 38#define show_mode(nr) \ 39static ssize_t show_engine##nr##_mode(struct device *dev, \ 40 struct device_attribute *attr, \ 41 char *buf) \ 42{ \ 43 return show_engine_mode(dev, attr, buf, nr); \ 44} 45 46#define store_mode(nr) \ 47static ssize_t store_engine##nr##_mode(struct device *dev, \ 48 struct device_attribute *attr, \ 49 const char *buf, size_t len) \ 50{ \ 51 return store_engine_mode(dev, attr, buf, len, nr); \ 52} 53 54#define show_leds(nr) \ 55static ssize_t show_engine##nr##_leds(struct device *dev, \ 56 struct device_attribute *attr, \ 57 char *buf) \ 58{ \ 59 return show_engine_leds(dev, attr, buf, nr); \ 60} 61 62#define store_leds(nr) \ 63static ssize_t store_engine##nr##_leds(struct device *dev, \ 64 struct device_attribute *attr, \ 65 const char *buf, size_t len) \ 66{ \ 67 return store_engine_leds(dev, attr, buf, len, nr); \ 68} 69 70#define store_load(nr) \ 71static ssize_t store_engine##nr##_load(struct device *dev, \ 72 struct device_attribute *attr, \ 73 const char *buf, size_t len) \ 74{ \ 75 return store_engine_load(dev, attr, buf, len, nr); \ 76} 77 78struct lp55xx_led; 79struct lp55xx_chip; 80 81/* 82 * struct lp55xx_reg 83 * @addr : Register address 84 * @val : Register value 85 */ 86struct lp55xx_reg { 87 u8 addr; 88 u8 val; 89}; 90 91/* 92 * struct lp55xx_device_config 93 * @reset : Chip specific reset command 94 * @enable : Chip specific enable command 95 * @max_channel : Maximum number of channels 96 * @post_init_device : Chip specific initialization code 97 * @brightness_fn : Brightness function 98 * @multicolor_brightness_fn : Multicolor brightness function 99 * @set_led_current : LED current set function 100 * @firmware_cb : Call function when the firmware is loaded 101 * @run_engine : Run internal engine for pattern 102 * @dev_attr_group : Device specific attributes 103 */ 104struct lp55xx_device_config { 105 const struct lp55xx_reg reset; 106 const struct lp55xx_reg enable; 107 const int max_channel; 108 109 /* define if the device has specific initialization process */ 110 int (*post_init_device) (struct lp55xx_chip *chip); 111 112 /* set LED brightness */ 113 int (*brightness_fn)(struct lp55xx_led *led); 114 115 /* set multicolor LED brightness */ 116 int (*multicolor_brightness_fn)(struct lp55xx_led *led); 117 118 /* current setting function */ 119 void (*set_led_current) (struct lp55xx_led *led, u8 led_current); 120 121 /* access program memory when the firmware is loaded */ 122 void (*firmware_cb)(struct lp55xx_chip *chip); 123 124 /* used for running firmware LED patterns */ 125 void (*run_engine) (struct lp55xx_chip *chip, bool start); 126 127 /* additional device specific attributes */ 128 const struct attribute_group *dev_attr_group; 129}; 130 131/* 132 * struct lp55xx_engine 133 * @mode : Engine mode 134 * @led_mux : Mux bits for LED selection. Only used in LP5523 135 */ 136struct lp55xx_engine { 137 enum lp55xx_engine_mode mode; 138 u16 led_mux; 139}; 140 141/* 142 * struct lp55xx_chip 143 * @cl : I2C communication for access registers 144 * @pdata : Platform specific data 145 * @lock : Lock for user-space interface 146 * @num_leds : Number of registered LEDs 147 * @cfg : Device specific configuration data 148 * @engine_idx : Selected engine number 149 * @engines : Engine structure for the device attribute R/W interface 150 * @fw : Firmware data for running a LED pattern 151 */ 152struct lp55xx_chip { 153 struct i2c_client *cl; 154 struct clk *clk; 155 struct lp55xx_platform_data *pdata; 156 struct mutex lock; /* lock for user-space interface */ 157 int num_leds; 158 struct lp55xx_device_config *cfg; 159 enum lp55xx_engine_index engine_idx; 160 struct lp55xx_engine engines[LP55XX_ENGINE_MAX]; 161 const struct firmware *fw; 162}; 163 164/* 165 * struct lp55xx_led 166 * @chan_nr : Channel number 167 * @cdev : LED class device 168 * @mc_cdev : Multi color class device 169 * @color_components: Multi color LED map information 170 * @led_current : Current setting at each led channel 171 * @max_current : Maximun current at each led channel 172 * @brightness : Brightness value 173 * @chip : The lp55xx chip data 174 */ 175struct lp55xx_led { 176 int chan_nr; 177 struct led_classdev cdev; 178 struct led_classdev_mc mc_cdev; 179 u8 led_current; 180 u8 max_current; 181 u8 brightness; 182 struct lp55xx_chip *chip; 183}; 184 185/* register access */ 186extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val); 187extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val); 188extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg, 189 u8 mask, u8 val); 190 191/* external clock detection */ 192extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip); 193 194/* common device init/deinit functions */ 195extern int lp55xx_init_device(struct lp55xx_chip *chip); 196extern void lp55xx_deinit_device(struct lp55xx_chip *chip); 197 198/* common LED class device functions */ 199extern int lp55xx_register_leds(struct lp55xx_led *led, 200 struct lp55xx_chip *chip); 201 202/* common device attributes functions */ 203extern int lp55xx_register_sysfs(struct lp55xx_chip *chip); 204extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip); 205 206/* common device tree population function */ 207extern struct lp55xx_platform_data 208*lp55xx_of_populate_pdata(struct device *dev, struct device_node *np, 209 struct lp55xx_chip *chip); 210 211#endif /* _LEDS_LP55XX_COMMON_H */