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 17 #define LP55xx_BYTES_PER_PAGE 32 /* bytes */ 18 19 enum lp55xx_engine_index { 20 LP55XX_ENGINE_INVALID, 21 LP55XX_ENGINE_1, 22 LP55XX_ENGINE_2, 23 LP55XX_ENGINE_3, 24 LP55XX_ENGINE_MAX = LP55XX_ENGINE_3, 25 }; 26 27 enum lp55xx_engine_mode { 28 LP55XX_ENGINE_DISABLED, 29 LP55XX_ENGINE_LOAD, 30 LP55XX_ENGINE_RUN, 31 }; 32 33 #define LP55XX_DEV_ATTR_RW(name, show, store) \ 34 DEVICE_ATTR(name, S_IRUGO | S_IWUSR, show, store) 35 #define LP55XX_DEV_ATTR_RO(name, show) \ 36 DEVICE_ATTR(name, S_IRUGO, show, NULL) 37 #define LP55XX_DEV_ATTR_WO(name, store) \ 38 DEVICE_ATTR(name, S_IWUSR, NULL, store) 39 40 #define LP55XX_DEV_ATTR_ENGINE_MODE(nr) \ 41 static ssize_t show_engine##nr##_mode(struct device *dev, \ 42 struct device_attribute *attr, \ 43 char *buf) \ 44 { \ 45 return lp55xx_show_engine_mode(dev, attr, buf, nr); \ 46 } \ 47 static ssize_t store_engine##nr##_mode(struct device *dev, \ 48 struct device_attribute *attr, \ 49 const char *buf, size_t len) \ 50 { \ 51 return lp55xx_store_engine_mode(dev, attr, buf, len, nr); \ 52 } \ 53 static LP55XX_DEV_ATTR_RW(engine##nr##_mode, show_engine##nr##_mode, \ 54 store_engine##nr##_mode) 55 56 #define LP55XX_DEV_ATTR_ENGINE_LEDS(nr) \ 57 static ssize_t show_engine##nr##_leds(struct device *dev, \ 58 struct device_attribute *attr, \ 59 char *buf) \ 60 { \ 61 return lp55xx_show_engine_leds(dev, attr, buf, nr); \ 62 } \ 63 static ssize_t store_engine##nr##_leds(struct device *dev, \ 64 struct device_attribute *attr, \ 65 const char *buf, size_t len) \ 66 { \ 67 return lp55xx_store_engine_leds(dev, attr, buf, len, nr); \ 68 } \ 69 static LP55XX_DEV_ATTR_RW(engine##nr##_leds, show_engine##nr##_leds, \ 70 store_engine##nr##_leds) 71 72 #define LP55XX_DEV_ATTR_ENGINE_LOAD(nr) \ 73 static ssize_t store_engine##nr##_load(struct device *dev, \ 74 struct device_attribute *attr, \ 75 const char *buf, size_t len) \ 76 { \ 77 return lp55xx_store_engine_load(dev, attr, buf, len, nr); \ 78 } \ 79 static LP55XX_DEV_ATTR_WO(engine##nr##_load, store_engine##nr##_load) 80 81 #define LP55XX_DEV_ATTR_MASTER_FADER(nr) \ 82 static ssize_t show_master_fader##nr(struct device *dev, \ 83 struct device_attribute *attr, \ 84 char *buf) \ 85 { \ 86 return lp55xx_show_master_fader(dev, attr, buf, nr); \ 87 } \ 88 static ssize_t store_master_fader##nr(struct device *dev, \ 89 struct device_attribute *attr, \ 90 const char *buf, size_t len) \ 91 { \ 92 return lp55xx_store_master_fader(dev, attr, buf, len, nr); \ 93 } \ 94 static LP55XX_DEV_ATTR_RW(master_fader##nr, show_master_fader##nr, \ 95 store_master_fader##nr) 96 97 struct lp55xx_led; 98 struct lp55xx_chip; 99 100 /* 101 * struct lp55xx_reg 102 * @addr : Register address 103 * @val : Register value (can also used as mask or shift) 104 */ 105 struct lp55xx_reg { 106 u8 addr; 107 union { 108 u8 val; 109 u8 mask; 110 u8 shift; 111 }; 112 }; 113 114 /* 115 * struct lp55xx_device_config 116 * @reg_op_mode : Chip specific OP MODE reg addr 117 * @engine_busy : Chip specific engine busy 118 * (if not supported 153 us sleep) 119 * @reset : Chip specific reset command 120 * @enable : Chip specific enable command 121 * @prog_mem_base : Chip specific base reg address for chip SMEM programming 122 * @reg_led_pwm_base : Chip specific base reg address for LED PWM conf 123 * @reg_led_current_base : Chip specific base reg address for LED current conf 124 * @reg_master_fader_base : Chip specific base reg address for master fader base 125 * @reg_led_ctrl_base : Chip specific base reg address for LED ctrl base 126 * @pages_per_engine : Assigned pages for each engine 127 * (if not set chip doesn't support pages) 128 * @max_channel : Maximum number of channels 129 * @post_init_device : Chip specific initialization code 130 * @brightness_fn : Brightness function 131 * @multicolor_brightness_fn : Multicolor brightness function 132 * @set_led_current : LED current set function 133 * @firmware_cb : Call function when the firmware is loaded 134 * @run_engine : Run internal engine for pattern 135 * @dev_attr_group : Device specific attributes 136 */ 137 struct lp55xx_device_config { 138 const struct lp55xx_reg reg_op_mode; /* addr, shift */ 139 const struct lp55xx_reg reg_exec; /* addr, shift */ 140 const struct lp55xx_reg engine_busy; /* addr, mask */ 141 const struct lp55xx_reg reset; 142 const struct lp55xx_reg enable; 143 const struct lp55xx_reg prog_mem_base; 144 const struct lp55xx_reg reg_led_pwm_base; 145 const struct lp55xx_reg reg_led_current_base; 146 const struct lp55xx_reg reg_master_fader_base; 147 const struct lp55xx_reg reg_led_ctrl_base; 148 const int pages_per_engine; 149 const int max_channel; 150 151 /* define if the device has specific initialization process */ 152 int (*post_init_device) (struct lp55xx_chip *chip); 153 154 /* set LED brightness */ 155 int (*brightness_fn)(struct lp55xx_led *led); 156 157 /* set multicolor LED brightness */ 158 int (*multicolor_brightness_fn)(struct lp55xx_led *led); 159 160 /* current setting function */ 161 void (*set_led_current) (struct lp55xx_led *led, u8 led_current); 162 163 /* access program memory when the firmware is loaded */ 164 void (*firmware_cb)(struct lp55xx_chip *chip); 165 166 /* used for running firmware LED patterns */ 167 void (*run_engine) (struct lp55xx_chip *chip, bool start); 168 169 /* additional device specific attributes */ 170 const struct attribute_group *dev_attr_group; 171 }; 172 173 /* 174 * struct lp55xx_engine 175 * @mode : Engine mode 176 * @led_mux : Mux bits for LED selection. Only used in LP5523 177 */ 178 struct lp55xx_engine { 179 enum lp55xx_engine_mode mode; 180 u16 led_mux; 181 }; 182 183 /* 184 * struct lp55xx_chip 185 * @cl : I2C communication for access registers 186 * @pdata : Platform specific data 187 * @lock : Lock for user-space interface 188 * @num_leds : Number of registered LEDs 189 * @cfg : Device specific configuration data 190 * @engine_idx : Selected engine number 191 * @engines : Engine structure for the device attribute R/W interface 192 * @fw : Firmware data for running a LED pattern 193 */ 194 struct lp55xx_chip { 195 struct i2c_client *cl; 196 struct clk *clk; 197 struct lp55xx_platform_data *pdata; 198 struct mutex lock; /* lock for user-space interface */ 199 int num_leds; 200 const struct lp55xx_device_config *cfg; 201 enum lp55xx_engine_index engine_idx; 202 struct lp55xx_engine engines[LP55XX_ENGINE_MAX]; 203 const struct firmware *fw; 204 }; 205 206 /* 207 * struct lp55xx_led 208 * @chan_nr : Channel number 209 * @cdev : LED class device 210 * @mc_cdev : Multi color class device 211 * @color_components: Multi color LED map information 212 * @led_current : Current setting at each led channel 213 * @max_current : Maximun current at each led channel 214 * @brightness : Brightness value 215 * @chip : The lp55xx chip data 216 */ 217 struct lp55xx_led { 218 int chan_nr; 219 struct led_classdev cdev; 220 struct led_classdev_mc mc_cdev; 221 u8 led_current; 222 u8 max_current; 223 u8 brightness; 224 struct lp55xx_chip *chip; 225 }; 226 227 /* register access */ 228 extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val); 229 extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val); 230 extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg, 231 u8 mask, u8 val); 232 233 /* external clock detection */ 234 extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip); 235 236 /* common chip functions */ 237 extern void lp55xx_stop_all_engine(struct lp55xx_chip *chip); 238 extern void lp55xx_load_engine(struct lp55xx_chip *chip); 239 extern int lp55xx_run_engine_common(struct lp55xx_chip *chip); 240 extern int lp55xx_update_program_memory(struct lp55xx_chip *chip, 241 const u8 *data, size_t size); 242 extern void lp55xx_firmware_loaded_cb(struct lp55xx_chip *chip); 243 extern int lp55xx_led_brightness(struct lp55xx_led *led); 244 extern int lp55xx_multicolor_brightness(struct lp55xx_led *led); 245 extern void lp55xx_set_led_current(struct lp55xx_led *led, u8 led_current); 246 extern void lp55xx_turn_off_channels(struct lp55xx_chip *chip); 247 extern void lp55xx_stop_engine(struct lp55xx_chip *chip); 248 249 /* common probe/remove function */ 250 extern int lp55xx_probe(struct i2c_client *client); 251 extern void lp55xx_remove(struct i2c_client *client); 252 253 /* common sysfs function */ 254 extern ssize_t lp55xx_show_engine_mode(struct device *dev, 255 struct device_attribute *attr, 256 char *buf, int nr); 257 extern ssize_t lp55xx_store_engine_mode(struct device *dev, 258 struct device_attribute *attr, 259 const char *buf, size_t len, int nr); 260 extern ssize_t lp55xx_store_engine_load(struct device *dev, 261 struct device_attribute *attr, 262 const char *buf, size_t len, int nr); 263 extern ssize_t lp55xx_show_engine_leds(struct device *dev, 264 struct device_attribute *attr, 265 char *buf, int nr); 266 extern ssize_t lp55xx_store_engine_leds(struct device *dev, 267 struct device_attribute *attr, 268 const char *buf, size_t len, int nr); 269 extern ssize_t lp55xx_show_master_fader(struct device *dev, 270 struct device_attribute *attr, 271 char *buf, int nr); 272 extern ssize_t lp55xx_store_master_fader(struct device *dev, 273 struct device_attribute *attr, 274 const char *buf, size_t len, int nr); 275 extern ssize_t lp55xx_show_master_fader_leds(struct device *dev, 276 struct device_attribute *attr, 277 char *buf); 278 extern ssize_t lp55xx_store_master_fader_leds(struct device *dev, 279 struct device_attribute *attr, 280 const char *buf, size_t len); 281 282 #endif /* _LEDS_LP55XX_COMMON_H */ 283