1 /*
2  * LP55XX Common Driver Header
3  *
4  * Copyright (C) 2012 Texas Instruments
5  *
6  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * version 2 as published by the Free Software Foundation.
11  *
12  * Derived from leds-lp5521.c, leds-lp5523.c
13  */
14 
15 #ifndef _LEDS_LP55XX_COMMON_H
16 #define _LEDS_LP55XX_COMMON_H
17 
18 enum lp55xx_engine_index {
19 	LP55XX_ENGINE_INVALID,
20 	LP55XX_ENGINE_1,
21 	LP55XX_ENGINE_2,
22 	LP55XX_ENGINE_3,
23 };
24 
25 struct lp55xx_led;
26 struct lp55xx_chip;
27 
28 /*
29  * struct lp55xx_reg
30  * @addr : Register address
31  * @val  : Register value
32  */
33 struct lp55xx_reg {
34 	u8 addr;
35 	u8 val;
36 };
37 
38 /*
39  * struct lp55xx_device_config
40  * @reset              : Chip specific reset command
41  * @enable             : Chip specific enable command
42  * @max_channel        : Maximum number of channels
43  * @post_init_device   : Chip specific initialization code
44  * @brightness_work_fn : Brightness work function
45  * @set_led_current    : LED current set function
46  * @firmware_cb        : Call function when the firmware is loaded
47  * @run_engine         : Run internal engine for pattern
48  * @dev_attr_group     : Device specific attributes
49  */
50 struct lp55xx_device_config {
51 	const struct lp55xx_reg reset;
52 	const struct lp55xx_reg enable;
53 	const int max_channel;
54 
55 	/* define if the device has specific initialization process */
56 	int (*post_init_device) (struct lp55xx_chip *chip);
57 
58 	/* access brightness register */
59 	void (*brightness_work_fn)(struct work_struct *work);
60 
61 	/* current setting function */
62 	void (*set_led_current) (struct lp55xx_led *led, u8 led_current);
63 
64 	/* access program memory when the firmware is loaded */
65 	void (*firmware_cb)(struct lp55xx_chip *chip);
66 
67 	/* used for running firmware LED patterns */
68 	void (*run_engine) (struct lp55xx_chip *chip, bool start);
69 
70 	/* additional device specific attributes */
71 	const struct attribute_group *dev_attr_group;
72 };
73 
74 /*
75  * struct lp55xx_chip
76  * @cl         : I2C communication for access registers
77  * @pdata      : Platform specific data
78  * @lock       : Lock for user-space interface
79  * @num_leds   : Number of registered LEDs
80  * @cfg        : Device specific configuration data
81  * @engine_idx : Selected engine number
82  * @fw         : Firmware data for running a LED pattern
83  */
84 struct lp55xx_chip {
85 	struct i2c_client *cl;
86 	struct clk *clk;
87 	struct lp55xx_platform_data *pdata;
88 	struct mutex lock;	/* lock for user-space interface */
89 	int num_leds;
90 	struct lp55xx_device_config *cfg;
91 	enum lp55xx_engine_index engine_idx;
92 	const struct firmware *fw;
93 };
94 
95 /*
96  * struct lp55xx_led
97  * @chan_nr         : Channel number
98  * @cdev            : LED class device
99  * @led_current     : Current setting at each led channel
100  * @max_current     : Maximun current at each led channel
101  * @brightness_work : Workqueue for brightness control
102  * @brightness      : Brightness value
103  * @chip            : The lp55xx chip data
104  */
105 struct lp55xx_led {
106 	int chan_nr;
107 	struct led_classdev cdev;
108 	u8 led_current;
109 	u8 max_current;
110 	struct work_struct brightness_work;
111 	u8 brightness;
112 	struct lp55xx_chip *chip;
113 };
114 
115 /* register access */
116 extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val);
117 extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val);
118 extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg,
119 			u8 mask, u8 val);
120 
121 /* external clock detection */
122 extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip);
123 
124 /* common device init/deinit functions */
125 extern int lp55xx_init_device(struct lp55xx_chip *chip);
126 extern void lp55xx_deinit_device(struct lp55xx_chip *chip);
127 
128 /* common LED class device functions */
129 extern int lp55xx_register_leds(struct lp55xx_led *led,
130 				struct lp55xx_chip *chip);
131 extern void lp55xx_unregister_leds(struct lp55xx_led *led,
132 				struct lp55xx_chip *chip);
133 
134 /* common device attributes functions */
135 extern int lp55xx_register_sysfs(struct lp55xx_chip *chip);
136 extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip);
137 
138 #endif /* _LEDS_LP55XX_COMMON_H */
139