xref: /openbmc/linux/drivers/leds/leds-lp55xx-common.h (revision ba6fa84651ff9a609e0ceb8265e3335ab6ed656d)
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,
2310c06d17SMilo(Woogyom) Kim };
2410c06d17SMilo(Woogyom) Kim 
25c93d08faSMilo(Woogyom) Kim struct lp55xx_led;
26c93d08faSMilo(Woogyom) Kim struct lp55xx_chip;
27c93d08faSMilo(Woogyom) Kim 
28c93d08faSMilo(Woogyom) Kim /*
2948068d5dSMilo(Woogyom) Kim  * struct lp55xx_reg
3048068d5dSMilo(Woogyom) Kim  * @addr : Register address
3148068d5dSMilo(Woogyom) Kim  * @val  : Register value
3248068d5dSMilo(Woogyom) Kim  */
3348068d5dSMilo(Woogyom) Kim struct lp55xx_reg {
3448068d5dSMilo(Woogyom) Kim 	u8 addr;
3548068d5dSMilo(Woogyom) Kim 	u8 val;
3648068d5dSMilo(Woogyom) Kim };
3748068d5dSMilo(Woogyom) Kim 
3848068d5dSMilo(Woogyom) Kim /*
3948068d5dSMilo(Woogyom) Kim  * struct lp55xx_device_config
4048068d5dSMilo(Woogyom) Kim  * @reset              : Chip specific reset command
41e3a700d8SMilo(Woogyom) Kim  * @enable             : Chip specific enable command
420e202346SMilo(Woogyom) Kim  * @max_channel        : Maximum number of channels
43ffbdccdbSMilo(Woogyom) Kim  * @post_init_device   : Chip specific initialization code
449e9b3db1SMilo(Woogyom) Kim  * @brightness_work_fn : Brightness work function
459e9b3db1SMilo(Woogyom) Kim  * @set_led_current    : LED current set function
4610c06d17SMilo(Woogyom) Kim  * @firmware_cb        : Call function when the firmware is loaded
4710c06d17SMilo(Woogyom) Kim  * @run_engine         : Run internal engine for pattern
48240085e2SMilo(Woogyom) Kim  * @dev_attr_group     : Device specific attributes
4948068d5dSMilo(Woogyom) Kim  */
5048068d5dSMilo(Woogyom) Kim struct lp55xx_device_config {
5148068d5dSMilo(Woogyom) Kim 	const struct lp55xx_reg reset;
52e3a700d8SMilo(Woogyom) Kim 	const struct lp55xx_reg enable;
530e202346SMilo(Woogyom) Kim 	const int max_channel;
54ffbdccdbSMilo(Woogyom) Kim 
55ffbdccdbSMilo(Woogyom) Kim 	/* define if the device has specific initialization process */
56ffbdccdbSMilo(Woogyom) Kim 	int (*post_init_device) (struct lp55xx_chip *chip);
579e9b3db1SMilo(Woogyom) Kim 
589e9b3db1SMilo(Woogyom) Kim 	/* access brightness register */
599e9b3db1SMilo(Woogyom) Kim 	void (*brightness_work_fn)(struct work_struct *work);
609e9b3db1SMilo(Woogyom) Kim 
619e9b3db1SMilo(Woogyom) Kim 	/* current setting function */
629e9b3db1SMilo(Woogyom) Kim 	void (*set_led_current) (struct lp55xx_led *led, u8 led_current);
6310c06d17SMilo(Woogyom) Kim 
6410c06d17SMilo(Woogyom) Kim 	/* access program memory when the firmware is loaded */
6510c06d17SMilo(Woogyom) Kim 	void (*firmware_cb)(struct lp55xx_chip *chip);
6610c06d17SMilo(Woogyom) Kim 
6710c06d17SMilo(Woogyom) Kim 	/* used for running firmware LED patterns */
6810c06d17SMilo(Woogyom) Kim 	void (*run_engine) (struct lp55xx_chip *chip, bool start);
69240085e2SMilo(Woogyom) Kim 
70240085e2SMilo(Woogyom) Kim 	/* additional device specific attributes */
71240085e2SMilo(Woogyom) Kim 	const struct attribute_group *dev_attr_group;
7248068d5dSMilo(Woogyom) Kim };
7348068d5dSMilo(Woogyom) Kim 
7448068d5dSMilo(Woogyom) Kim /*
75c93d08faSMilo(Woogyom) Kim  * struct lp55xx_chip
76c93d08faSMilo(Woogyom) Kim  * @cl         : I2C communication for access registers
77c93d08faSMilo(Woogyom) Kim  * @pdata      : Platform specific data
78c93d08faSMilo(Woogyom) Kim  * @lock       : Lock for user-space interface
79c93d08faSMilo(Woogyom) Kim  * @num_leds   : Number of registered LEDs
8048068d5dSMilo(Woogyom) Kim  * @cfg        : Device specific configuration data
8110c06d17SMilo(Woogyom) Kim  * @engine_idx : Selected engine number
8210c06d17SMilo(Woogyom) Kim  * @fw         : Firmware data for running a LED pattern
83c93d08faSMilo(Woogyom) Kim  */
84c93d08faSMilo(Woogyom) Kim struct lp55xx_chip {
85c93d08faSMilo(Woogyom) Kim 	struct i2c_client *cl;
86c93d08faSMilo(Woogyom) Kim 	struct lp55xx_platform_data *pdata;
87c93d08faSMilo(Woogyom) Kim 	struct mutex lock;	/* lock for user-space interface */
88c93d08faSMilo(Woogyom) Kim 	int num_leds;
8948068d5dSMilo(Woogyom) Kim 	struct lp55xx_device_config *cfg;
9010c06d17SMilo(Woogyom) Kim 	enum lp55xx_engine_index engine_idx;
9110c06d17SMilo(Woogyom) Kim 	const struct firmware *fw;
92c93d08faSMilo(Woogyom) Kim };
93c93d08faSMilo(Woogyom) Kim 
94c93d08faSMilo(Woogyom) Kim /*
95c93d08faSMilo(Woogyom) Kim  * struct lp55xx_led
96c93d08faSMilo(Woogyom) Kim  * @chan_nr         : Channel number
97c93d08faSMilo(Woogyom) Kim  * @cdev            : LED class device
98c93d08faSMilo(Woogyom) Kim  * @led_current     : Current setting at each led channel
99c93d08faSMilo(Woogyom) Kim  * @max_current     : Maximun current at each led channel
100c93d08faSMilo(Woogyom) Kim  * @brightness_work : Workqueue for brightness control
101c93d08faSMilo(Woogyom) Kim  * @brightness      : Brightness value
102c93d08faSMilo(Woogyom) Kim  * @chip            : The lp55xx chip data
103c93d08faSMilo(Woogyom) Kim  */
104c93d08faSMilo(Woogyom) Kim struct lp55xx_led {
105c93d08faSMilo(Woogyom) Kim 	int chan_nr;
106c93d08faSMilo(Woogyom) Kim 	struct led_classdev cdev;
107c93d08faSMilo(Woogyom) Kim 	u8 led_current;
108c93d08faSMilo(Woogyom) Kim 	u8 max_current;
109c93d08faSMilo(Woogyom) Kim 	struct work_struct brightness_work;
110c93d08faSMilo(Woogyom) Kim 	u8 brightness;
111c93d08faSMilo(Woogyom) Kim 	struct lp55xx_chip *chip;
112c93d08faSMilo(Woogyom) Kim };
113c93d08faSMilo(Woogyom) Kim 
114c93d08faSMilo(Woogyom) Kim /* register access */
115c93d08faSMilo(Woogyom) Kim extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val);
116c93d08faSMilo(Woogyom) Kim extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val);
117c93d08faSMilo(Woogyom) Kim extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg,
118c93d08faSMilo(Woogyom) Kim 			u8 mask, u8 val);
119c93d08faSMilo(Woogyom) Kim 
1206ce61762SMilo(Woogyom) Kim /* common device init/deinit functions */
121a85908ddSMilo(Woogyom) Kim extern int lp55xx_init_device(struct lp55xx_chip *chip);
1226ce61762SMilo(Woogyom) Kim extern void lp55xx_deinit_device(struct lp55xx_chip *chip);
123a85908ddSMilo(Woogyom) Kim 
1249e9b3db1SMilo(Woogyom) Kim /* common LED class device functions */
1259e9b3db1SMilo(Woogyom) Kim extern int lp55xx_register_leds(struct lp55xx_led *led,
1269e9b3db1SMilo(Woogyom) Kim 				struct lp55xx_chip *chip);
127c3a68ebfSMilo(Woogyom) Kim extern void lp55xx_unregister_leds(struct lp55xx_led *led,
128c3a68ebfSMilo(Woogyom) Kim 				struct lp55xx_chip *chip);
129b3b6f811SMilo(Woogyom) Kim 
130b3b6f811SMilo(Woogyom) Kim /* common device attributes functions */
131b3b6f811SMilo(Woogyom) Kim extern int lp55xx_register_sysfs(struct lp55xx_chip *chip);
132*ba6fa846SMilo(Woogyom) Kim extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip);
133b3b6f811SMilo(Woogyom) Kim 
134c93d08faSMilo(Woogyom) Kim #endif /* _LEDS_LP55XX_COMMON_H */
135