Blame view

drivers/leds/leds-lp55xx-common.h 5.95 KB
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
   * LP55XX Common Driver Header
   *
   * Copyright (C) 2012 Texas Instruments
   *
   * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * version 2 as published by the Free Software Foundation.
   *
   * Derived from leds-lp5521.c, leds-lp5523.c
   */
  
  #ifndef _LEDS_LP55XX_COMMON_H
  #define _LEDS_LP55XX_COMMON_H
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
17
18
19
20
21
  enum lp55xx_engine_index {
  	LP55XX_ENGINE_INVALID,
  	LP55XX_ENGINE_1,
  	LP55XX_ENGINE_2,
  	LP55XX_ENGINE_3,
6841a91dc   Milo Kim   leds: lp55xx: add...
22
23
24
25
26
27
28
  	LP55XX_ENGINE_MAX = LP55XX_ENGINE_3,
  };
  
  enum lp55xx_engine_mode {
  	LP55XX_ENGINE_DISABLED,
  	LP55XX_ENGINE_LOAD,
  	LP55XX_ENGINE_RUN,
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
29
  };
36030978f   Milo Kim   leds: lp55xx: add...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  #define LP55XX_DEV_ATTR_RW(name, show, store)	\
  	DEVICE_ATTR(name, S_IRUGO | S_IWUSR, show, store)
  #define LP55XX_DEV_ATTR_RO(name, show)		\
  	DEVICE_ATTR(name, S_IRUGO, show, NULL)
  #define LP55XX_DEV_ATTR_WO(name, store)		\
  	DEVICE_ATTR(name, S_IWUSR, NULL, store)
  
  #define show_mode(nr)							\
  static ssize_t show_engine##nr##_mode(struct device *dev,		\
  				    struct device_attribute *attr,	\
  				    char *buf)				\
  {									\
  	return show_engine_mode(dev, attr, buf, nr);			\
  }
  
  #define store_mode(nr)							\
  static ssize_t store_engine##nr##_mode(struct device *dev,		\
  				     struct device_attribute *attr,	\
  				     const char *buf, size_t len)	\
  {									\
  	return store_engine_mode(dev, attr, buf, len, nr);		\
  }
  
  #define show_leds(nr)							\
  static ssize_t show_engine##nr##_leds(struct device *dev,		\
  			    struct device_attribute *attr,		\
  			    char *buf)					\
  {									\
  	return show_engine_leds(dev, attr, buf, nr);			\
  }
  
  #define store_leds(nr)						\
  static ssize_t store_engine##nr##_leds(struct device *dev,	\
  			     struct device_attribute *attr,	\
  			     const char *buf, size_t len)	\
  {								\
  	return store_engine_leds(dev, attr, buf, len, nr);	\
  }
  
  #define store_load(nr)							\
  static ssize_t store_engine##nr##_load(struct device *dev,		\
  				     struct device_attribute *attr,	\
  				     const char *buf, size_t len)	\
  {									\
  	return store_engine_load(dev, attr, buf, len, nr);		\
  }
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
76
77
78
79
  struct lp55xx_led;
  struct lp55xx_chip;
  
  /*
48068d5de   Milo(Woogyom) Kim   leds-lp55xx: use ...
80
81
82
83
84
85
86
87
88
89
90
91
   * struct lp55xx_reg
   * @addr : Register address
   * @val  : Register value
   */
  struct lp55xx_reg {
  	u8 addr;
  	u8 val;
  };
  
  /*
   * struct lp55xx_device_config
   * @reset              : Chip specific reset command
e3a700d8a   Milo(Woogyom) Kim   leds-lp55xx: use ...
92
   * @enable             : Chip specific enable command
0e2023463   Milo(Woogyom) Kim   leds-lp55xx: use ...
93
   * @max_channel        : Maximum number of channels
ffbdccdbb   Milo(Woogyom) Kim   leds-lp55xx: use ...
94
   * @post_init_device   : Chip specific initialization code
9e9b3db1b   Milo(Woogyom) Kim   leds-lp55xx: use ...
95
96
   * @brightness_work_fn : Brightness work function
   * @set_led_current    : LED current set function
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
97
98
   * @firmware_cb        : Call function when the firmware is loaded
   * @run_engine         : Run internal engine for pattern
240085e25   Milo(Woogyom) Kim   leds-lp55xx: supp...
99
   * @dev_attr_group     : Device specific attributes
48068d5de   Milo(Woogyom) Kim   leds-lp55xx: use ...
100
101
102
   */
  struct lp55xx_device_config {
  	const struct lp55xx_reg reset;
e3a700d8a   Milo(Woogyom) Kim   leds-lp55xx: use ...
103
  	const struct lp55xx_reg enable;
0e2023463   Milo(Woogyom) Kim   leds-lp55xx: use ...
104
  	const int max_channel;
ffbdccdbb   Milo(Woogyom) Kim   leds-lp55xx: use ...
105
106
107
  
  	/* define if the device has specific initialization process */
  	int (*post_init_device) (struct lp55xx_chip *chip);
9e9b3db1b   Milo(Woogyom) Kim   leds-lp55xx: use ...
108
109
110
111
112
113
  
  	/* access brightness register */
  	void (*brightness_work_fn)(struct work_struct *work);
  
  	/* current setting function */
  	void (*set_led_current) (struct lp55xx_led *led, u8 led_current);
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
114
115
116
117
118
119
  
  	/* access program memory when the firmware is loaded */
  	void (*firmware_cb)(struct lp55xx_chip *chip);
  
  	/* used for running firmware LED patterns */
  	void (*run_engine) (struct lp55xx_chip *chip, bool start);
240085e25   Milo(Woogyom) Kim   leds-lp55xx: supp...
120
121
122
  
  	/* additional device specific attributes */
  	const struct attribute_group *dev_attr_group;
48068d5de   Milo(Woogyom) Kim   leds-lp55xx: use ...
123
124
125
  };
  
  /*
6841a91dc   Milo Kim   leds: lp55xx: add...
126
127
128
129
130
131
132
133
134
135
   * struct lp55xx_engine
   * @mode       : Engine mode
   * @led_mux    : Mux bits for LED selection. Only used in LP5523
   */
  struct lp55xx_engine {
  	enum lp55xx_engine_mode mode;
  	u16 led_mux;
  };
  
  /*
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
136
137
138
139
140
   * struct lp55xx_chip
   * @cl         : I2C communication for access registers
   * @pdata      : Platform specific data
   * @lock       : Lock for user-space interface
   * @num_leds   : Number of registered LEDs
48068d5de   Milo(Woogyom) Kim   leds-lp55xx: use ...
141
   * @cfg        : Device specific configuration data
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
142
   * @engine_idx : Selected engine number
6841a91dc   Milo Kim   leds: lp55xx: add...
143
   * @engines    : Engine structure for the device attribute R/W interface
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
144
   * @fw         : Firmware data for running a LED pattern
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
145
146
147
   */
  struct lp55xx_chip {
  	struct i2c_client *cl;
53b419226   Kim, Milo   leds: lp55xx: use...
148
  	struct clk *clk;
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
149
150
151
  	struct lp55xx_platform_data *pdata;
  	struct mutex lock;	/* lock for user-space interface */
  	int num_leds;
48068d5de   Milo(Woogyom) Kim   leds-lp55xx: use ...
152
  	struct lp55xx_device_config *cfg;
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
153
  	enum lp55xx_engine_index engine_idx;
6841a91dc   Milo Kim   leds: lp55xx: add...
154
  	struct lp55xx_engine engines[LP55XX_ENGINE_MAX];
10c06d178   Milo(Woogyom) Kim   leds-lp55xx: supp...
155
  	const struct firmware *fw;
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  };
  
  /*
   * struct lp55xx_led
   * @chan_nr         : Channel number
   * @cdev            : LED class device
   * @led_current     : Current setting at each led channel
   * @max_current     : Maximun current at each led channel
   * @brightness_work : Workqueue for brightness control
   * @brightness      : Brightness value
   * @chip            : The lp55xx chip data
   */
  struct lp55xx_led {
  	int chan_nr;
  	struct led_classdev cdev;
  	u8 led_current;
  	u8 max_current;
  	struct work_struct brightness_work;
  	u8 brightness;
  	struct lp55xx_chip *chip;
  };
  
  /* register access */
  extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val);
  extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val);
  extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg,
  			u8 mask, u8 val);
53b419226   Kim, Milo   leds: lp55xx: use...
183
184
  /* external clock detection */
  extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip);
6ce617626   Milo(Woogyom) Kim   leds-lp55xx: use ...
185
  /* common device init/deinit functions */
a85908dd7   Milo(Woogyom) Kim   leds-lp55xx: use ...
186
  extern int lp55xx_init_device(struct lp55xx_chip *chip);
6ce617626   Milo(Woogyom) Kim   leds-lp55xx: use ...
187
  extern void lp55xx_deinit_device(struct lp55xx_chip *chip);
a85908dd7   Milo(Woogyom) Kim   leds-lp55xx: use ...
188

9e9b3db1b   Milo(Woogyom) Kim   leds-lp55xx: use ...
189
190
191
  /* common LED class device functions */
  extern int lp55xx_register_leds(struct lp55xx_led *led,
  				struct lp55xx_chip *chip);
c3a68ebfc   Milo(Woogyom) Kim   leds-lp55xx: use ...
192
193
  extern void lp55xx_unregister_leds(struct lp55xx_led *led,
  				struct lp55xx_chip *chip);
b3b6f8119   Milo(Woogyom) Kim   leds-lp55xx: add ...
194
195
196
  
  /* common device attributes functions */
  extern int lp55xx_register_sysfs(struct lp55xx_chip *chip);
ba6fa8465   Milo(Woogyom) Kim   leds-lp55xx: add ...
197
  extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip);
b3b6f8119   Milo(Woogyom) Kim   leds-lp55xx: add ...
198

7542a04b1   Linus Walleij   leds: lp55xx: add...
199
200
201
  /* common device tree population function */
  extern int lp55xx_of_populate_pdata(struct device *dev,
  				    struct device_node *np);
c93d08fa7   Milo(Woogyom) Kim   leds-lp55xx: add ...
202
  #endif /* _LEDS_LP55XX_COMMON_H */