12
12
#include <linux/mfd/lp8788.h>
13
13
#include <linux/module.h>
14
14
#include <linux/platform_device.h>
15
- #include <linux/pwm.h>
16
15
#include <linux/slab.h>
17
16
18
17
/* Register address */
31
30
#define MAX_BRIGHTNESS 127
32
31
#define DEFAULT_BL_NAME "lcd-backlight"
33
32
34
- struct lp8788_bl_config {
35
- enum lp8788_bl_ctrl_mode bl_mode ;
36
- enum lp8788_bl_dim_mode dim_mode ;
37
- enum lp8788_bl_full_scale_current full_scale ;
38
- enum lp8788_bl_ramp_step rise_time ;
39
- enum lp8788_bl_ramp_step fall_time ;
40
- enum pwm_polarity pwm_pol ;
41
- };
42
-
43
33
struct lp8788_bl {
44
34
struct lp8788 * lp ;
45
35
struct backlight_device * bl_dev ;
46
- struct lp8788_backlight_platform_data * pdata ;
47
- enum lp8788_bl_ctrl_mode mode ;
48
- struct pwm_device * pwm ;
49
- };
50
-
51
- static struct lp8788_bl_config default_bl_config = {
52
- .bl_mode = LP8788_BL_REGISTER_ONLY ,
53
- .dim_mode = LP8788_DIM_EXPONENTIAL ,
54
- .full_scale = LP8788_FULLSCALE_1900uA ,
55
- .rise_time = LP8788_RAMP_8192us ,
56
- .fall_time = LP8788_RAMP_8192us ,
57
- .pwm_pol = PWM_POLARITY_NORMAL ,
58
36
};
59
37
60
- static inline bool is_brightness_ctrl_by_pwm (enum lp8788_bl_ctrl_mode mode )
61
- {
62
- return mode == LP8788_BL_COMB_PWM_BASED ;
63
- }
64
-
65
- static inline bool is_brightness_ctrl_by_register (enum lp8788_bl_ctrl_mode mode )
66
- {
67
- return mode == LP8788_BL_REGISTER_ONLY ||
68
- mode == LP8788_BL_COMB_REGISTER_BASED ;
69
- }
70
-
71
38
static int lp8788_backlight_configure (struct lp8788_bl * bl )
72
39
{
73
- struct lp8788_backlight_platform_data * pdata = bl -> pdata ;
74
- struct lp8788_bl_config * cfg = & default_bl_config ;
75
40
int ret ;
76
41
u8 val ;
77
42
78
- /*
79
- * Update chip configuration if platform data exists,
80
- * otherwise use the default settings.
81
- */
82
- if (pdata ) {
83
- cfg -> bl_mode = pdata -> bl_mode ;
84
- cfg -> dim_mode = pdata -> dim_mode ;
85
- cfg -> full_scale = pdata -> full_scale ;
86
- cfg -> rise_time = pdata -> rise_time ;
87
- cfg -> fall_time = pdata -> fall_time ;
88
- cfg -> pwm_pol = pdata -> pwm_pol ;
89
- }
90
-
91
43
/* Brightness ramp up/down */
92
- val = (cfg -> rise_time << LP8788_BL_RAMP_RISE_SHIFT ) | cfg -> fall_time ;
44
+ val = (LP8788_RAMP_8192us << LP8788_BL_RAMP_RISE_SHIFT ) | LP8788_RAMP_8192us ;
93
45
ret = lp8788_write_byte (bl -> lp , LP8788_BL_RAMP , val );
94
46
if (ret )
95
47
return ret ;
96
48
97
49
/* Fullscale current setting */
98
- val = (cfg -> full_scale << LP8788_BL_FULLSCALE_SHIFT ) |
99
- (cfg -> dim_mode << LP8788_BL_DIM_MODE_SHIFT );
50
+ val = (LP8788_FULLSCALE_1900uA << LP8788_BL_FULLSCALE_SHIFT ) |
51
+ (LP8788_DIM_EXPONENTIAL << LP8788_BL_DIM_MODE_SHIFT );
100
52
101
53
/* Brightness control mode */
102
- switch (cfg -> bl_mode ) {
103
- case LP8788_BL_REGISTER_ONLY :
104
- val |= LP8788_BL_EN ;
105
- break ;
106
- case LP8788_BL_COMB_PWM_BASED :
107
- case LP8788_BL_COMB_REGISTER_BASED :
108
- val |= LP8788_BL_EN | LP8788_BL_PWM_INPUT_EN |
109
- (cfg -> pwm_pol << LP8788_BL_PWM_POLARITY_SHIFT );
110
- break ;
111
- default :
112
- dev_err (bl -> lp -> dev , "invalid mode: %d\n" , cfg -> bl_mode );
113
- return - EINVAL ;
114
- }
115
-
116
- bl -> mode = cfg -> bl_mode ;
54
+ val |= LP8788_BL_EN ;
117
55
118
56
return lp8788_write_byte (bl -> lp , LP8788_BL_CONFIG , val );
119
57
}
120
58
121
- static void lp8788_pwm_ctrl (struct lp8788_bl * bl , int br , int max_br )
122
- {
123
- unsigned int period ;
124
- unsigned int duty ;
125
- struct device * dev ;
126
- struct pwm_device * pwm ;
127
-
128
- if (!bl -> pdata )
129
- return ;
130
-
131
- period = bl -> pdata -> period_ns ;
132
- duty = br * period / max_br ;
133
- dev = bl -> lp -> dev ;
134
-
135
- /* request PWM device with the consumer name */
136
- if (!bl -> pwm ) {
137
- pwm = devm_pwm_get (dev , LP8788_DEV_BACKLIGHT );
138
- if (IS_ERR (pwm )) {
139
- dev_err (dev , "can not get PWM device\n" );
140
- return ;
141
- }
142
-
143
- bl -> pwm = pwm ;
144
-
145
- /*
146
- * FIXME: pwm_apply_args() should be removed when switching to
147
- * the atomic PWM API.
148
- */
149
- pwm_apply_args (pwm );
150
- }
151
-
152
- pwm_config (bl -> pwm , duty , period );
153
- if (duty )
154
- pwm_enable (bl -> pwm );
155
- else
156
- pwm_disable (bl -> pwm );
157
- }
158
-
159
59
static int lp8788_bl_update_status (struct backlight_device * bl_dev )
160
60
{
161
61
struct lp8788_bl * bl = bl_get_data (bl_dev );
162
- enum lp8788_bl_ctrl_mode mode = bl -> mode ;
163
62
164
63
if (bl_dev -> props .state & BL_CORE_SUSPENDED )
165
64
bl_dev -> props .brightness = 0 ;
166
65
167
- if (is_brightness_ctrl_by_pwm (mode )) {
168
- int brt = bl_dev -> props .brightness ;
169
- int max = bl_dev -> props .max_brightness ;
170
-
171
- lp8788_pwm_ctrl (bl , brt , max );
172
- } else if (is_brightness_ctrl_by_register (mode )) {
173
- u8 brt = bl_dev -> props .brightness ;
174
-
175
- lp8788_write_byte (bl -> lp , LP8788_BL_BRIGHTNESS , brt );
176
- }
66
+ lp8788_write_byte (bl -> lp , LP8788_BL_BRIGHTNESS , bl_dev -> props .brightness );
177
67
178
68
return 0 ;
179
69
}
@@ -187,30 +77,16 @@ static int lp8788_backlight_register(struct lp8788_bl *bl)
187
77
{
188
78
struct backlight_device * bl_dev ;
189
79
struct backlight_properties props ;
190
- struct lp8788_backlight_platform_data * pdata = bl -> pdata ;
191
- int init_brt ;
192
- char * name ;
193
80
194
81
memset (& props , 0 , sizeof (struct backlight_properties ));
195
82
props .type = BACKLIGHT_PLATFORM ;
196
83
props .max_brightness = MAX_BRIGHTNESS ;
197
84
198
85
/* Initial brightness */
199
- if (pdata )
200
- init_brt = min_t (int , pdata -> initial_brightness ,
201
- props .max_brightness );
202
- else
203
- init_brt = 0 ;
204
-
205
- props .brightness = init_brt ;
86
+ props .brightness = 0 ;
206
87
207
88
/* Backlight device name */
208
- if (!pdata || !pdata -> name )
209
- name = DEFAULT_BL_NAME ;
210
- else
211
- name = pdata -> name ;
212
-
213
- bl_dev = backlight_device_register (name , bl -> lp -> dev , bl ,
89
+ bl_dev = backlight_device_register (DEFAULT_BL_NAME , bl -> lp -> dev , bl ,
214
90
& lp8788_bl_ops , & props );
215
91
if (IS_ERR (bl_dev ))
216
92
return PTR_ERR (bl_dev );
@@ -230,16 +106,7 @@ static void lp8788_backlight_unregister(struct lp8788_bl *bl)
230
106
static ssize_t lp8788_get_bl_ctl_mode (struct device * dev ,
231
107
struct device_attribute * attr , char * buf )
232
108
{
233
- struct lp8788_bl * bl = dev_get_drvdata (dev );
234
- enum lp8788_bl_ctrl_mode mode = bl -> mode ;
235
- char * strmode ;
236
-
237
- if (is_brightness_ctrl_by_pwm (mode ))
238
- strmode = "PWM based" ;
239
- else if (is_brightness_ctrl_by_register (mode ))
240
- strmode = "Register based" ;
241
- else
242
- strmode = "Invalid mode" ;
109
+ const char * strmode = "Register based" ;
243
110
244
111
return scnprintf (buf , PAGE_SIZE , "%s\n" , strmode );
245
112
}
@@ -266,8 +133,6 @@ static int lp8788_backlight_probe(struct platform_device *pdev)
266
133
return - ENOMEM ;
267
134
268
135
bl -> lp = lp ;
269
- if (lp -> pdata )
270
- bl -> pdata = lp -> pdata -> bl_pdata ;
271
136
272
137
platform_set_drvdata (pdev , bl );
273
138
0 commit comments