xref: /openbmc/linux/drivers/leds/leds-lp55xx-common.h (revision 6841a91dc5cfcb02b99413fa4199d9a8ce5ae770)
1c93d08faSMilo(Woogyom) Kim /*
2c93d08faSMilo(Woogyom) Kim  * LP55XX Common Driver Header
3c93d08faSMilo(Woogyom) Kim  *
4c93d08faSMilo(Woogyom) Kim  * Copyright (C) 2012 Texas Instruments
5c93d08faSMilo(Woogyom) Kim  *
6c93d08faSMilo(Woogyom) Kim  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
7c93d08faSMilo(Woogyom) Kim  *
8c93d08faSMilo(Woogyom) Kim  * This program is free software; you can redistribute it and/or
9c93d08faSMilo(Woogyom) Kim  * modify it under the terms of the GNU General Public License
10c93d08faSMilo(Woogyom) Kim  * version 2 as published by the Free Software Foundation.
11c93d08faSMilo(Woogyom) Kim  *
12c93d08faSMilo(Woogyom) Kim  * Derived from leds-lp5521.c, leds-lp5523.c
13c93d08faSMilo(Woogyom) Kim  */
14c93d08faSMilo(Woogyom) Kim 
15c93d08faSMilo(Woogyom) Kim #ifndef _LEDS_LP55XX_COMMON_H
16c93d08faSMilo(Woogyom) Kim #define _LEDS_LP55XX_COMMON_H
17c93d08faSMilo(Woogyom) Kim 
1810c06d17SMilo(Woogyom) Kim enum lp55xx_engine_index {
1910c06d17SMilo(Woogyom) Kim 	LP55XX_ENGINE_INVALID,
2010c06d17SMilo(Woogyom) Kim 	LP55XX_ENGINE_1,
2110c06d17SMilo(Woogyom) Kim 	LP55XX_ENGINE_2,
2210c06d17SMilo(Woogyom) Kim 	LP55XX_ENGINE_3,
23*6841a91dSMilo Kim 	LP55XX_ENGINE_MAX = LP55XX_ENGINE_3,
24*6841a91dSMilo Kim };
25*6841a91dSMilo Kim 
26*6841a91dSMilo Kim enum lp55xx_engine_mode {
27*6841a91dSMilo Kim 	LP55XX_ENGINE_DISABLED,
28*6841a91dSMilo Kim 	LP55XX_ENGINE_LOAD,
29*6841a91dSMilo Kim 	LP55XX_ENGINE_RUN,
3010c06d17SMilo(Woogyom) Kim };
3110c06d17SMilo(Woogyom) Kim 
32c93d08faSMilo(Woogyom) Kim struct lp55xx_led;
33c93d08faSMilo(Woogyom) Kim struct lp55xx_chip;
34c93d08faSMilo(Woogyom) Kim 
35c93d08faSMilo(Woogyom) Kim /*
3648068d5dSMilo(Woogyom) Kim  * struct lp55xx_reg
3748068d5dSMilo(Woogyom) Kim  * @addr : Register address
3848068d5dSMilo(Woogyom) Kim  * @val  : Register value
3948068d5dSMilo(Woogyom) Kim  */
4048068d5dSMilo(Woogyom) Kim struct lp55xx_reg {
4148068d5dSMilo(Woogyom) Kim 	u8 addr;
4248068d5dSMilo(Woogyom) Kim 	u8 val;
4348068d5dSMilo(Woogyom) Kim };
4448068d5dSMilo(Woogyom) Kim 
4548068d5dSMilo(Woogyom) Kim /*
4648068d5dSMilo(Woogyom) Kim  * struct lp55xx_device_config
4748068d5dSMilo(Woogyom) Kim  * @reset              : Chip specific reset command
48e3a700d8SMilo(Woogyom) Kim  * @enable             : Chip specific enable command
490e202346SMilo(Woogyom) Kim  * @max_channel        : Maximum number of channels
50ffbdccdbSMilo(Woogyom) Kim  * @post_init_device   : Chip specific initialization code
519e9b3db1SMilo(Woogyom) Kim  * @brightness_work_fn : Brightness work function
529e9b3db1SMilo(Woogyom) Kim  * @set_led_current    : LED current set function
5310c06d17SMilo(Woogyom) Kim  * @firmware_cb        : Call function when the firmware is loaded
5410c06d17SMilo(Woogyom) Kim  * @run_engine         : Run internal engine for pattern
55240085e2SMilo(Woogyom) Kim  * @dev_attr_group     : Device specific attributes
5648068d5dSMilo(Woogyom) Kim  */
5748068d5dSMilo(Woogyom) Kim struct lp55xx_device_config {
5848068d5dSMilo(Woogyom) Kim 	const struct lp55xx_reg reset;
59e3a700d8SMilo(Woogyom) Kim 	const struct lp55xx_reg enable;
600e202346SMilo(Woogyom) Kim 	const int max_channel;
61ffbdccdbSMilo(Woogyom) Kim 
62ffbdccdbSMilo(Woogyom) Kim 	/* define if the device has specific initialization process */
63ffbdccdbSMilo(Woogyom) Kim 	int (*post_init_device) (struct lp55xx_chip *chip);
649e9b3db1SMilo(Woogyom) Kim 
659e9b3db1SMilo(Woogyom) Kim 	/* access brightness register */
669e9b3db1SMilo(Woogyom) Kim 	void (*brightness_work_fn)(struct work_struct *work);
679e9b3db1SMilo(Woogyom) Kim 
689e9b3db1SMilo(Woogyom) Kim 	/* current setting function */
699e9b3db1SMilo(Woogyom) Kim 	void (*set_led_current) (struct lp55xx_led *led, u8 led_current);
7010c06d17SMilo(Woogyom) Kim 
7110c06d17SMilo(Woogyom) Kim 	/* access program memory when the firmware is loaded */
7210c06d17SMilo(Woogyom) Kim 	void (*firmware_cb)(struct lp55xx_chip *chip);
7310c06d17SMilo(Woogyom) Kim 
7410c06d17SMilo(Woogyom) Kim 	/* used for running firmware LED patterns */
7510c06d17SMilo(Woogyom) Kim 	void (*run_engine) (struct lp55xx_chip *chip, bool start);
76240085e2SMilo(Woogyom) Kim 
77240085e2SMilo(Woogyom) Kim 	/* additional device specific attributes */
78240085e2SMilo(Woogyom) Kim 	const struct attribute_group *dev_attr_group;
7948068d5dSMilo(Woogyom) Kim };
8048068d5dSMilo(Woogyom) Kim 
8148068d5dSMilo(Woogyom) Kim /*
82*6841a91dSMilo Kim  * struct lp55xx_engine
83*6841a91dSMilo Kim  * @mode       : Engine mode
84*6841a91dSMilo Kim  * @led_mux    : Mux bits for LED selection. Only used in LP5523
85*6841a91dSMilo Kim  */
86*6841a91dSMilo Kim struct lp55xx_engine {
87*6841a91dSMilo Kim 	enum lp55xx_engine_mode mode;
88*6841a91dSMilo Kim 	u16 led_mux;
89*6841a91dSMilo Kim };
90*6841a91dSMilo Kim 
91*6841a91dSMilo Kim /*
92c93d08faSMilo(Woogyom) Kim  * struct lp55xx_chip
93c93d08faSMilo(Woogyom) Kim  * @cl         : I2C communication for access registers
94c93d08faSMilo(Woogyom) Kim  * @pdata      : Platform specific data
95c93d08faSMilo(Woogyom) Kim  * @lock       : Lock for user-space interface
96c93d08faSMilo(Woogyom) Kim  * @num_leds   : Number of registered LEDs
9748068d5dSMilo(Woogyom) Kim  * @cfg        : Device specific configuration data
9810c06d17SMilo(Woogyom) Kim  * @engine_idx : Selected engine number
99*6841a91dSMilo Kim  * @engines    : Engine structure for the device attribute R/W interface
10010c06d17SMilo(Woogyom) Kim  * @fw         : Firmware data for running a LED pattern
101c93d08faSMilo(Woogyom) Kim  */
102c93d08faSMilo(Woogyom) Kim struct lp55xx_chip {
103c93d08faSMilo(Woogyom) Kim 	struct i2c_client *cl;
10453b41922SKim, Milo 	struct clk *clk;
105c93d08faSMilo(Woogyom) Kim 	struct lp55xx_platform_data *pdata;
106c93d08faSMilo(Woogyom) Kim 	struct mutex lock;	/* lock for user-space interface */
107c93d08faSMilo(Woogyom) Kim 	int num_leds;
10848068d5dSMilo(Woogyom) Kim 	struct lp55xx_device_config *cfg;
10910c06d17SMilo(Woogyom) Kim 	enum lp55xx_engine_index engine_idx;
110*6841a91dSMilo Kim 	struct lp55xx_engine engines[LP55XX_ENGINE_MAX];
11110c06d17SMilo(Woogyom) Kim 	const struct firmware *fw;
112c93d08faSMilo(Woogyom) Kim };
113c93d08faSMilo(Woogyom) Kim 
114c93d08faSMilo(Woogyom) Kim /*
115c93d08faSMilo(Woogyom) Kim  * struct lp55xx_led
116c93d08faSMilo(Woogyom) Kim  * @chan_nr         : Channel number
117c93d08faSMilo(Woogyom) Kim  * @cdev            : LED class device
118c93d08faSMilo(Woogyom) Kim  * @led_current     : Current setting at each led channel
119c93d08faSMilo(Woogyom) Kim  * @max_current     : Maximun current at each led channel
120c93d08faSMilo(Woogyom) Kim  * @brightness_work : Workqueue for brightness control
121c93d08faSMilo(Woogyom) Kim  * @brightness      : Brightness value
122c93d08faSMilo(Woogyom) Kim  * @chip            : The lp55xx chip data
123c93d08faSMilo(Woogyom) Kim  */
124c93d08faSMilo(Woogyom) Kim struct lp55xx_led {
125c93d08faSMilo(Woogyom) Kim 	int chan_nr;
126c93d08faSMilo(Woogyom) Kim 	struct led_classdev cdev;
127c93d08faSMilo(Woogyom) Kim 	u8 led_current;
128c93d08faSMilo(Woogyom) Kim 	u8 max_current;
129c93d08faSMilo(Woogyom) Kim 	struct work_struct brightness_work;
130c93d08faSMilo(Woogyom) Kim 	u8 brightness;
131c93d08faSMilo(Woogyom) Kim 	struct lp55xx_chip *chip;
132c93d08faSMilo(Woogyom) Kim };
133c93d08faSMilo(Woogyom) Kim 
134c93d08faSMilo(Woogyom) Kim /* register access */
135c93d08faSMilo(Woogyom) Kim extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val);
136c93d08faSMilo(Woogyom) Kim extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val);
137c93d08faSMilo(Woogyom) Kim extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg,
138c93d08faSMilo(Woogyom) Kim 			u8 mask, u8 val);
139c93d08faSMilo(Woogyom) Kim 
14053b41922SKim, Milo /* external clock detection */
14153b41922SKim, Milo extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip);
14253b41922SKim, Milo 
1436ce61762SMilo(Woogyom) Kim /* common device init/deinit functions */
144a85908ddSMilo(Woogyom) Kim extern int lp55xx_init_device(struct lp55xx_chip *chip);
1456ce61762SMilo(Woogyom) Kim extern void lp55xx_deinit_device(struct lp55xx_chip *chip);
146a85908ddSMilo(Woogyom) Kim 
1479e9b3db1SMilo(Woogyom) Kim /* common LED class device functions */
1489e9b3db1SMilo(Woogyom) Kim extern int lp55xx_register_leds(struct lp55xx_led *led,
1499e9b3db1SMilo(Woogyom) Kim 				struct lp55xx_chip *chip);
150c3a68ebfSMilo(Woogyom) Kim extern void lp55xx_unregister_leds(struct lp55xx_led *led,
151c3a68ebfSMilo(Woogyom) Kim 				struct lp55xx_chip *chip);
152b3b6f811SMilo(Woogyom) Kim 
153b3b6f811SMilo(Woogyom) Kim /* common device attributes functions */
154b3b6f811SMilo(Woogyom) Kim extern int lp55xx_register_sysfs(struct lp55xx_chip *chip);
155ba6fa846SMilo(Woogyom) Kim extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip);
156b3b6f811SMilo(Woogyom) Kim 
1577542a04bSLinus Walleij /* common device tree population function */
1587542a04bSLinus Walleij extern int lp55xx_of_populate_pdata(struct device *dev,
1597542a04bSLinus Walleij 				    struct device_node *np);
1607542a04bSLinus Walleij 
161c93d08faSMilo(Woogyom) Kim #endif /* _LEDS_LP55XX_COMMON_H */
162