Merge tag 'blackfin-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/realm...
[cascardo/linux.git] / drivers / leds / leds-lp55xx-common.h
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 /* common device tree population function */
139 extern int lp55xx_of_populate_pdata(struct device *dev,
140                                     struct device_node *np);
141
142 #endif /* _LEDS_LP55XX_COMMON_H */