@@ -113,6 +113,18 @@ struct lm3530_data {
113
113
bool enable ;
114
114
};
115
115
116
+ /*
117
+ * struct lm3530_als_data
118
+ * @config : value of ALS configuration register
119
+ * @imp_sel : value of ALS resistor select register
120
+ * @zone : values of ALS ZB(Zone Boundary) registers
121
+ */
122
+ struct lm3530_als_data {
123
+ u8 config ;
124
+ u8 imp_sel ;
125
+ u8 zones [LM3530_ALS_ZB_MAX ];
126
+ };
127
+
116
128
static const u8 lm3530_reg [LM3530_REG_MAX ] = {
117
129
LM3530_GEN_CONFIG ,
118
130
LM3530_ALS_CONFIG ,
@@ -141,68 +153,72 @@ static int lm3530_get_mode_from_str(const char *str)
141
153
return -1 ;
142
154
}
143
155
156
+ static void lm3530_als_configure (struct lm3530_platform_data * pdata ,
157
+ struct lm3530_als_data * als )
158
+ {
159
+ int i ;
160
+ u32 als_vmin , als_vmax , als_vstep ;
161
+
162
+ if (pdata -> als_vmax == 0 ) {
163
+ pdata -> als_vmin = 0 ;
164
+ pdata -> als_vmax = LM3530_ALS_WINDOW_mV ;
165
+ }
166
+
167
+ als_vmin = pdata -> als_vmin ;
168
+ als_vmax = pdata -> als_vmax ;
169
+
170
+ if ((als_vmax - als_vmin ) > LM3530_ALS_WINDOW_mV )
171
+ pdata -> als_vmax = als_vmax = als_vmin + LM3530_ALS_WINDOW_mV ;
172
+
173
+ /* n zone boundary makes n+1 zones */
174
+ als_vstep = (als_vmax - als_vmin ) / (LM3530_ALS_ZB_MAX + 1 );
175
+
176
+ for (i = 0 ; i < LM3530_ALS_ZB_MAX ; i ++ )
177
+ als -> zones [i ] = (((als_vmin + LM3530_ALS_OFFSET_mV ) +
178
+ als_vstep + (i * als_vstep )) * LED_FULL ) / 1000 ;
179
+
180
+ als -> config =
181
+ (pdata -> als_avrg_time << LM3530_ALS_AVG_TIME_SHIFT ) |
182
+ (LM3530_ENABLE_ALS ) |
183
+ (pdata -> als_input_mode << LM3530_ALS_SEL_SHIFT );
184
+
185
+ als -> imp_sel =
186
+ (pdata -> als1_resistor_sel << LM3530_ALS1_IMP_SHIFT ) |
187
+ (pdata -> als2_resistor_sel << LM3530_ALS2_IMP_SHIFT );
188
+ }
189
+
144
190
static int lm3530_init_registers (struct lm3530_data * drvdata )
145
191
{
146
192
int ret = 0 ;
147
193
int i ;
148
194
u8 gen_config ;
149
- u8 als_config = 0 ;
150
195
u8 brt_ramp ;
151
- u8 als_imp_sel = 0 ;
152
196
u8 brightness ;
153
197
u8 reg_val [LM3530_REG_MAX ];
154
- u8 zones [LM3530_ALS_ZB_MAX ];
155
- u32 als_vmin , als_vmax , als_vstep ;
156
198
struct lm3530_platform_data * pdata = drvdata -> pdata ;
157
199
struct i2c_client * client = drvdata -> client ;
158
200
struct lm3530_pwm_data * pwm = & pdata -> pwm_data ;
201
+ struct lm3530_als_data als ;
202
+
203
+ memset (& als , 0 , sizeof (struct lm3530_als_data ));
159
204
160
205
gen_config = (pdata -> brt_ramp_law << LM3530_RAMP_LAW_SHIFT ) |
161
206
((pdata -> max_current & 7 ) << LM3530_MAX_CURR_SHIFT );
162
207
163
208
switch (drvdata -> mode ) {
164
209
case LM3530_BL_MODE_MANUAL :
210
+ gen_config |= LM3530_ENABLE_I2C ;
211
+ break ;
165
212
case LM3530_BL_MODE_ALS :
166
213
gen_config |= LM3530_ENABLE_I2C ;
214
+ lm3530_als_configure (pdata , & als );
167
215
break ;
168
216
case LM3530_BL_MODE_PWM :
169
217
gen_config |= LM3530_ENABLE_PWM | LM3530_ENABLE_PWM_SIMPLE |
170
218
(pdata -> pwm_pol_hi << LM3530_PWM_POL_SHIFT );
171
219
break ;
172
220
}
173
221
174
- if (drvdata -> mode == LM3530_BL_MODE_ALS ) {
175
- if (pdata -> als_vmax == 0 ) {
176
- pdata -> als_vmin = 0 ;
177
- pdata -> als_vmax = LM3530_ALS_WINDOW_mV ;
178
- }
179
-
180
- als_vmin = pdata -> als_vmin ;
181
- als_vmax = pdata -> als_vmax ;
182
-
183
- if ((als_vmax - als_vmin ) > LM3530_ALS_WINDOW_mV )
184
- pdata -> als_vmax = als_vmax =
185
- als_vmin + LM3530_ALS_WINDOW_mV ;
186
-
187
- /* n zone boundary makes n+1 zones */
188
- als_vstep = (als_vmax - als_vmin ) / (LM3530_ALS_ZB_MAX + 1 );
189
-
190
- for (i = 0 ; i < LM3530_ALS_ZB_MAX ; i ++ )
191
- zones [i ] = (((als_vmin + LM3530_ALS_OFFSET_mV ) +
192
- als_vstep + (i * als_vstep )) * LED_FULL )
193
- / 1000 ;
194
-
195
- als_config =
196
- (pdata -> als_avrg_time << LM3530_ALS_AVG_TIME_SHIFT ) |
197
- (LM3530_ENABLE_ALS ) |
198
- (pdata -> als_input_mode << LM3530_ALS_SEL_SHIFT );
199
-
200
- als_imp_sel =
201
- (pdata -> als1_resistor_sel << LM3530_ALS1_IMP_SHIFT ) |
202
- (pdata -> als2_resistor_sel << LM3530_ALS2_IMP_SHIFT );
203
-
204
- }
205
-
206
222
brt_ramp = (pdata -> brt_ramp_fall << LM3530_BRT_RAMP_FALL_SHIFT ) |
207
223
(pdata -> brt_ramp_rise << LM3530_BRT_RAMP_RISE_SHIFT );
208
224
@@ -215,14 +231,14 @@ static int lm3530_init_registers(struct lm3530_data *drvdata)
215
231
brightness = drvdata -> led_dev .max_brightness ;
216
232
217
233
reg_val [0 ] = gen_config ; /* LM3530_GEN_CONFIG */
218
- reg_val [1 ] = als_config ; /* LM3530_ALS_CONFIG */
234
+ reg_val [1 ] = als . config ; /* LM3530_ALS_CONFIG */
219
235
reg_val [2 ] = brt_ramp ; /* LM3530_BRT_RAMP_RATE */
220
- reg_val [3 ] = als_imp_sel ; /* LM3530_ALS_IMP_SELECT */
236
+ reg_val [3 ] = als . imp_sel ; /* LM3530_ALS_IMP_SELECT */
221
237
reg_val [4 ] = brightness ; /* LM3530_BRT_CTRL_REG */
222
- reg_val [5 ] = zones [0 ]; /* LM3530_ALS_ZB0_REG */
223
- reg_val [6 ] = zones [1 ]; /* LM3530_ALS_ZB1_REG */
224
- reg_val [7 ] = zones [2 ]; /* LM3530_ALS_ZB2_REG */
225
- reg_val [8 ] = zones [3 ]; /* LM3530_ALS_ZB3_REG */
238
+ reg_val [5 ] = als . zones [0 ]; /* LM3530_ALS_ZB0_REG */
239
+ reg_val [6 ] = als . zones [1 ]; /* LM3530_ALS_ZB1_REG */
240
+ reg_val [7 ] = als . zones [2 ]; /* LM3530_ALS_ZB2_REG */
241
+ reg_val [8 ] = als . zones [3 ]; /* LM3530_ALS_ZB3_REG */
226
242
reg_val [9 ] = LM3530_DEF_ZT_0 ; /* LM3530_ALS_Z0T_REG */
227
243
reg_val [10 ] = LM3530_DEF_ZT_1 ; /* LM3530_ALS_Z1T_REG */
228
244
reg_val [11 ] = LM3530_DEF_ZT_2 ; /* LM3530_ALS_Z2T_REG */
0 commit comments