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 | enum 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 | |
25 | enum 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) \ |
39 | static 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) \ |
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 store_engine_mode(dev, attr, buf, len, nr); \ |
52 | } |
53 | |
54 | #define show_leds(nr) \ |
55 | static 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) \ |
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 store_engine_leds(dev, attr, buf, len, nr); \ |
68 | } |
69 | |
70 | #define store_load(nr) \ |
71 | static 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 | |
78 | struct lp55xx_led; |
79 | struct lp55xx_chip; |
80 | |
81 | /* |
82 | * struct lp55xx_reg |
83 | * @addr : Register address |
84 | * @val : Register value |
85 | */ |
86 | struct 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 | */ |
104 | struct 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 | */ |
136 | struct 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 | */ |
152 | struct 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 | */ |
175 | struct 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 */ |
186 | extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val); |
187 | extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val); |
188 | extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg, |
189 | u8 mask, u8 val); |
190 | |
191 | /* external clock detection */ |
192 | extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip); |
193 | |
194 | /* common device init/deinit functions */ |
195 | extern int lp55xx_init_device(struct lp55xx_chip *chip); |
196 | extern void lp55xx_deinit_device(struct lp55xx_chip *chip); |
197 | |
198 | /* common LED class device functions */ |
199 | extern int lp55xx_register_leds(struct lp55xx_led *led, |
200 | struct lp55xx_chip *chip); |
201 | |
202 | /* common device attributes functions */ |
203 | extern int lp55xx_register_sysfs(struct lp55xx_chip *chip); |
204 | extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip); |
205 | |
206 | /* common device tree population function */ |
207 | extern 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 */ |
212 | |