[bug report] backlight: mp3309c: Add support for MPS MP3309C
Dan Carpenter
dan.carpenter at linaro.org
Tue Nov 28 07:20:25 UTC 2023
Hello Flavio Suligoi,
The patch 2e914516a58c: "backlight: mp3309c: Add support for MPS
MP3309C" from Nov 16, 2023 (linux-next), leads to the following
Smatch static checker warning:
drivers/video/backlight/mp3309c.c:277 pm3309c_parse_dt_node()
error: uninitialized symbol 'prop_levels'.
drivers/video/backlight/mp3309c.c
202 static int pm3309c_parse_dt_node(struct mp3309c_chip *chip,
203 struct mp3309c_platform_data *pdata)
204 {
205 struct device_node *node = chip->dev->of_node;
206 struct property *prop_pwms, *prop_levels;
207 int length = 0;
208 int ret, i;
209 unsigned int num_levels, tmp_value;
210
211 if (!node) {
212 dev_err(chip->dev, "failed to get DT node\n");
213 return -ENODEV;
214 }
215
216 /*
217 * Dimming mode: the MP3309C provides two dimming control mode:
218 *
219 * - PWM mode
220 * - Analog by I2C control mode (default)
221 *
222 * I2C control mode is assumed as default but, if the pwms property is
223 * found in the backlight node, the mode switches to PWM mode.
224 */
225 pdata->dimming_mode = DIMMING_ANALOG_I2C;
226 prop_pwms = of_find_property(node, "pwms", &length);
227 if (prop_pwms) {
228 chip->pwmd = devm_pwm_get(chip->dev, NULL);
229 if (IS_ERR(chip->pwmd))
230 return dev_err_probe(chip->dev, PTR_ERR(chip->pwmd),
231 "error getting pwm data\n");
232 pdata->dimming_mode = DIMMING_PWM;
233 pwm_apply_args(chip->pwmd);
234 }
235
236 /*
237 * In I2C control mode the dimming levels (0..31) are fixed by the
238 * hardware, while in PWM control mode they can be chosen by the user,
239 * to allow nonlinear mappings.
240 */
241 if (pdata->dimming_mode == DIMMING_ANALOG_I2C) {
242 /*
243 * Analog (by I2C commands) control mode: fixed 0..31 brightness
244 * levels
245 */
246 num_levels = ANALOG_I2C_NUM_LEVELS;
247
248 /* Enable GPIO used in I2C dimming mode only */
249 chip->enable_gpio = devm_gpiod_get(chip->dev, "enable",
250 GPIOD_OUT_HIGH);
251 if (IS_ERR(chip->enable_gpio))
252 return dev_err_probe(chip->dev,
253 PTR_ERR(chip->enable_gpio),
254 "error getting enable gpio\n");
prop_levels not initialized on this path.
255 } else {
256 /*
257 * PWM control mode: check for brightness level in DT
258 */
259 prop_levels = of_find_property(node, "brightness-levels",
260 &length);
261 if (prop_levels) {
262 /* Read brightness levels from DT */
263 num_levels = length / sizeof(u32);
264 if (num_levels < 2)
265 return -EINVAL;
266 } else {
267 /* Use default brightness levels */
268 num_levels = MP3309C_PWM_DEFAULT_NUM_LEVELS;
269 }
270 }
271
272 /* Fill brightness levels array */
273 pdata->levels = devm_kcalloc(chip->dev, num_levels,
274 sizeof(*pdata->levels), GFP_KERNEL);
275 if (!pdata->levels)
276 return -ENOMEM;
--> 277 if (prop_levels) {
^^^^^^^^^^^
Uninitialized
278 ret = of_property_read_u32_array(node, "brightness-levels",
279 pdata->levels,
280 num_levels);
281 if (ret < 0)
282 return ret;
283 } else {
284 for (i = 0; i < num_levels; i++)
285 pdata->levels[i] = i;
286 }
287
288 pdata->max_brightness = num_levels - 1;
289
290 ret = of_property_read_u32(node, "default-brightness",
291 &pdata->default_brightness);
292 if (ret)
293 pdata->default_brightness = pdata->max_brightness;
294 if (pdata->default_brightness > pdata->max_brightness) {
295 dev_err(chip->dev,
296 "default brightness exceeds max brightness\n");
297 pdata->default_brightness = pdata->max_brightness;
298 }
299
300 /*
regards,
dan carpenter
More information about the dri-devel
mailing list