Skip to content

Commit 5a15b2a

Browse files
Ansuellag-linaro
authored andcommitted
leds: leds-lp55xx: Generalize sysfs master_fader
Generalize sysfs master_fader since their implementation is the same across some lp55xx based LED driver. Suggested-by: Lee Jones <[email protected]> Signed-off-by: Christian Marangi <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent 8913c2c commit 5a15b2a

File tree

3 files changed

+156
-139
lines changed

3 files changed

+156
-139
lines changed

drivers/leds/leds-lp5523.c

Lines changed: 11 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -315,137 +315,6 @@ static ssize_t lp5523_selftest(struct device *dev,
315315
return pos;
316316
}
317317

318-
#define show_fader(nr) \
319-
static ssize_t show_master_fader##nr(struct device *dev, \
320-
struct device_attribute *attr, \
321-
char *buf) \
322-
{ \
323-
return show_master_fader(dev, attr, buf, nr); \
324-
}
325-
326-
#define store_fader(nr) \
327-
static ssize_t store_master_fader##nr(struct device *dev, \
328-
struct device_attribute *attr, \
329-
const char *buf, size_t len) \
330-
{ \
331-
return store_master_fader(dev, attr, buf, len, nr); \
332-
}
333-
334-
static ssize_t show_master_fader(struct device *dev,
335-
struct device_attribute *attr,
336-
char *buf, int nr)
337-
{
338-
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
339-
struct lp55xx_chip *chip = led->chip;
340-
int ret;
341-
u8 val;
342-
343-
mutex_lock(&chip->lock);
344-
ret = lp55xx_read(chip, LP5523_REG_MASTER_FADER_BASE + nr - 1, &val);
345-
mutex_unlock(&chip->lock);
346-
347-
if (ret == 0)
348-
ret = sprintf(buf, "%u\n", val);
349-
350-
return ret;
351-
}
352-
show_fader(1)
353-
show_fader(2)
354-
show_fader(3)
355-
356-
static ssize_t store_master_fader(struct device *dev,
357-
struct device_attribute *attr,
358-
const char *buf, size_t len, int nr)
359-
{
360-
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
361-
struct lp55xx_chip *chip = led->chip;
362-
int ret;
363-
unsigned long val;
364-
365-
if (kstrtoul(buf, 0, &val))
366-
return -EINVAL;
367-
368-
if (val > 0xff)
369-
return -EINVAL;
370-
371-
mutex_lock(&chip->lock);
372-
ret = lp55xx_write(chip, LP5523_REG_MASTER_FADER_BASE + nr - 1,
373-
(u8)val);
374-
mutex_unlock(&chip->lock);
375-
376-
if (ret == 0)
377-
ret = len;
378-
379-
return ret;
380-
}
381-
store_fader(1)
382-
store_fader(2)
383-
store_fader(3)
384-
385-
static ssize_t show_master_fader_leds(struct device *dev,
386-
struct device_attribute *attr,
387-
char *buf)
388-
{
389-
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
390-
struct lp55xx_chip *chip = led->chip;
391-
int i, ret, pos = 0;
392-
u8 val;
393-
394-
mutex_lock(&chip->lock);
395-
396-
for (i = 0; i < LP5523_MAX_LEDS; i++) {
397-
ret = lp55xx_read(chip, LP5523_REG_LED_CTRL_BASE + i, &val);
398-
if (ret)
399-
goto leave;
400-
401-
val = (val & LP5523_FADER_MAPPING_MASK)
402-
>> LP5523_FADER_MAPPING_SHIFT;
403-
if (val > 3) {
404-
ret = -EINVAL;
405-
goto leave;
406-
}
407-
buf[pos++] = val + '0';
408-
}
409-
buf[pos++] = '\n';
410-
ret = pos;
411-
leave:
412-
mutex_unlock(&chip->lock);
413-
return ret;
414-
}
415-
416-
static ssize_t store_master_fader_leds(struct device *dev,
417-
struct device_attribute *attr,
418-
const char *buf, size_t len)
419-
{
420-
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
421-
struct lp55xx_chip *chip = led->chip;
422-
int i, n, ret;
423-
u8 val;
424-
425-
n = min_t(int, len, LP5523_MAX_LEDS);
426-
427-
mutex_lock(&chip->lock);
428-
429-
for (i = 0; i < n; i++) {
430-
if (buf[i] >= '0' && buf[i] <= '3') {
431-
val = (buf[i] - '0') << LP5523_FADER_MAPPING_SHIFT;
432-
ret = lp55xx_update_bits(chip,
433-
LP5523_REG_LED_CTRL_BASE + i,
434-
LP5523_FADER_MAPPING_MASK,
435-
val);
436-
if (ret)
437-
goto leave;
438-
} else {
439-
ret = -EINVAL;
440-
goto leave;
441-
}
442-
}
443-
ret = len;
444-
leave:
445-
mutex_unlock(&chip->lock);
446-
return ret;
447-
}
448-
449318
LP55XX_DEV_ATTR_ENGINE_MODE(1);
450319
LP55XX_DEV_ATTR_ENGINE_MODE(2);
451320
LP55XX_DEV_ATTR_ENGINE_MODE(3);
@@ -456,14 +325,11 @@ LP55XX_DEV_ATTR_ENGINE_LOAD(1);
456325
LP55XX_DEV_ATTR_ENGINE_LOAD(2);
457326
LP55XX_DEV_ATTR_ENGINE_LOAD(3);
458327
static LP55XX_DEV_ATTR_RO(selftest, lp5523_selftest);
459-
static LP55XX_DEV_ATTR_RW(master_fader1, show_master_fader1,
460-
store_master_fader1);
461-
static LP55XX_DEV_ATTR_RW(master_fader2, show_master_fader2,
462-
store_master_fader2);
463-
static LP55XX_DEV_ATTR_RW(master_fader3, show_master_fader3,
464-
store_master_fader3);
465-
static LP55XX_DEV_ATTR_RW(master_fader_leds, show_master_fader_leds,
466-
store_master_fader_leds);
328+
LP55XX_DEV_ATTR_MASTER_FADER(1);
329+
LP55XX_DEV_ATTR_MASTER_FADER(2);
330+
LP55XX_DEV_ATTR_MASTER_FADER(3);
331+
static LP55XX_DEV_ATTR_RW(master_fader_leds, lp55xx_show_master_fader_leds,
332+
lp55xx_store_master_fader_leds);
467333

468334
static struct attribute *lp5523_attributes[] = {
469335
&dev_attr_engine1_mode.attr,
@@ -516,6 +382,12 @@ static struct lp55xx_device_config lp5523_cfg = {
516382
.reg_led_current_base = {
517383
.addr = LP5523_REG_LED_CURRENT_BASE,
518384
},
385+
.reg_master_fader_base = {
386+
.addr = LP5523_REG_MASTER_FADER_BASE,
387+
},
388+
.reg_led_ctrl_base = {
389+
.addr = LP5523_REG_LED_CTRL_BASE,
390+
},
519391
.pages_per_engine = LP5523_PAGES_PER_ENGINE,
520392
.max_channel = LP5523_MAX_LEDS,
521393
.post_init_device = lp5523_post_init_device,

drivers/leds/leds-lp55xx-common.c

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@
6464

6565
#define LED_ACTIVE(mux, led) (!!((mux) & (0x0001 << (led))))
6666

67+
/* MASTER FADER common property */
68+
#define LP55xx_FADER_MAPPING_MASK GENMASK(7, 6)
69+
6770
/* External clock rate */
6871
#define LP55XX_CLK_32K 32768
6972

@@ -800,6 +803,116 @@ ssize_t lp55xx_store_engine_leds(struct device *dev,
800803
}
801804
EXPORT_SYMBOL_GPL(lp55xx_store_engine_leds);
802805

806+
ssize_t lp55xx_show_master_fader(struct device *dev,
807+
struct device_attribute *attr,
808+
char *buf, int nr)
809+
{
810+
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
811+
struct lp55xx_chip *chip = led->chip;
812+
const struct lp55xx_device_config *cfg = chip->cfg;
813+
int ret;
814+
u8 val;
815+
816+
mutex_lock(&chip->lock);
817+
ret = lp55xx_read(chip, cfg->reg_master_fader_base.addr + nr - 1, &val);
818+
mutex_unlock(&chip->lock);
819+
820+
return ret ? ret : sysfs_emit(buf, "%u\n", val);
821+
}
822+
EXPORT_SYMBOL_GPL(lp55xx_show_master_fader);
823+
824+
ssize_t lp55xx_store_master_fader(struct device *dev,
825+
struct device_attribute *attr,
826+
const char *buf, size_t len, int nr)
827+
{
828+
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
829+
struct lp55xx_chip *chip = led->chip;
830+
const struct lp55xx_device_config *cfg = chip->cfg;
831+
int ret;
832+
unsigned long val;
833+
834+
if (kstrtoul(buf, 0, &val))
835+
return -EINVAL;
836+
837+
if (val > 0xff)
838+
return -EINVAL;
839+
840+
mutex_lock(&chip->lock);
841+
ret = lp55xx_write(chip, cfg->reg_master_fader_base.addr + nr - 1,
842+
(u8)val);
843+
mutex_unlock(&chip->lock);
844+
845+
return ret ? ret : len;
846+
}
847+
EXPORT_SYMBOL_GPL(lp55xx_store_master_fader);
848+
849+
ssize_t lp55xx_show_master_fader_leds(struct device *dev,
850+
struct device_attribute *attr,
851+
char *buf)
852+
{
853+
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
854+
struct lp55xx_chip *chip = led->chip;
855+
const struct lp55xx_device_config *cfg = chip->cfg;
856+
int i, ret, pos = 0;
857+
u8 val;
858+
859+
mutex_lock(&chip->lock);
860+
861+
for (i = 0; i < cfg->max_channel; i++) {
862+
ret = lp55xx_read(chip, cfg->reg_led_ctrl_base.addr + i, &val);
863+
if (ret)
864+
goto leave;
865+
866+
val = FIELD_GET(LP55xx_FADER_MAPPING_MASK, val);
867+
if (val > FIELD_MAX(LP55xx_FADER_MAPPING_MASK)) {
868+
ret = -EINVAL;
869+
goto leave;
870+
}
871+
buf[pos++] = val + '0';
872+
}
873+
buf[pos++] = '\n';
874+
ret = pos;
875+
leave:
876+
mutex_unlock(&chip->lock);
877+
return ret;
878+
}
879+
EXPORT_SYMBOL_GPL(lp55xx_show_master_fader_leds);
880+
881+
ssize_t lp55xx_store_master_fader_leds(struct device *dev,
882+
struct device_attribute *attr,
883+
const char *buf, size_t len)
884+
{
885+
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
886+
struct lp55xx_chip *chip = led->chip;
887+
const struct lp55xx_device_config *cfg = chip->cfg;
888+
int i, n, ret;
889+
u8 val;
890+
891+
n = min_t(int, len, cfg->max_channel);
892+
893+
mutex_lock(&chip->lock);
894+
895+
for (i = 0; i < n; i++) {
896+
if (buf[i] >= '0' && buf[i] <= '3') {
897+
val = (buf[i] - '0') << __bf_shf(LP55xx_FADER_MAPPING_MASK);
898+
ret = lp55xx_update_bits(chip,
899+
cfg->reg_led_ctrl_base.addr + i,
900+
LP55xx_FADER_MAPPING_MASK,
901+
val);
902+
if (ret)
903+
goto leave;
904+
} else {
905+
ret = -EINVAL;
906+
goto leave;
907+
}
908+
}
909+
ret = len;
910+
leave:
911+
mutex_unlock(&chip->lock);
912+
return ret;
913+
}
914+
EXPORT_SYMBOL_GPL(lp55xx_store_master_fader_leds);
915+
803916
static struct attribute *lp55xx_engine_attributes[] = {
804917
&dev_attr_select_engine.attr,
805918
&dev_attr_run_engine.attr,

drivers/leds/leds-lp55xx-common.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ static ssize_t store_engine##nr##_load(struct device *dev, \
7676
} \
7777
static LP55XX_DEV_ATTR_WO(engine##nr##_load, store_engine##nr##_load)
7878

79+
#define LP55XX_DEV_ATTR_MASTER_FADER(nr) \
80+
static ssize_t show_master_fader##nr(struct device *dev, \
81+
struct device_attribute *attr, \
82+
char *buf) \
83+
{ \
84+
return lp55xx_show_master_fader(dev, attr, buf, nr); \
85+
} \
86+
static ssize_t store_master_fader##nr(struct device *dev, \
87+
struct device_attribute *attr, \
88+
const char *buf, size_t len) \
89+
{ \
90+
return lp55xx_store_master_fader(dev, attr, buf, len, nr); \
91+
} \
92+
static LP55XX_DEV_ATTR_RW(master_fader##nr, show_master_fader##nr, \
93+
store_master_fader##nr)
94+
7995
struct lp55xx_led;
8096
struct lp55xx_chip;
8197

@@ -103,6 +119,8 @@ struct lp55xx_reg {
103119
* @prog_mem_base : Chip specific base reg address for chip SMEM programming
104120
* @reg_led_pwm_base : Chip specific base reg address for LED PWM conf
105121
* @reg_led_current_base : Chip specific base reg address for LED current conf
122+
* @reg_master_fader_base : Chip specific base reg address for master fader base
123+
* @reg_led_ctrl_base : Chip specific base reg address for LED ctrl base
106124
* @pages_per_engine : Assigned pages for each engine
107125
* (if not set chip doesn't support pages)
108126
* @max_channel : Maximum number of channels
@@ -123,6 +141,8 @@ struct lp55xx_device_config {
123141
const struct lp55xx_reg prog_mem_base;
124142
const struct lp55xx_reg reg_led_pwm_base;
125143
const struct lp55xx_reg reg_led_current_base;
144+
const struct lp55xx_reg reg_master_fader_base;
145+
const struct lp55xx_reg reg_led_ctrl_base;
126146
const int pages_per_engine;
127147
const int max_channel;
128148

@@ -244,5 +264,17 @@ extern ssize_t lp55xx_show_engine_leds(struct device *dev,
244264
extern ssize_t lp55xx_store_engine_leds(struct device *dev,
245265
struct device_attribute *attr,
246266
const char *buf, size_t len, int nr);
267+
extern ssize_t lp55xx_show_master_fader(struct device *dev,
268+
struct device_attribute *attr,
269+
char *buf, int nr);
270+
extern ssize_t lp55xx_store_master_fader(struct device *dev,
271+
struct device_attribute *attr,
272+
const char *buf, size_t len, int nr);
273+
extern ssize_t lp55xx_show_master_fader_leds(struct device *dev,
274+
struct device_attribute *attr,
275+
char *buf);
276+
extern ssize_t lp55xx_store_master_fader_leds(struct device *dev,
277+
struct device_attribute *attr,
278+
const char *buf, size_t len);
247279

248280
#endif /* _LEDS_LP55XX_COMMON_H */

0 commit comments

Comments
 (0)