[bug report] backlight: mp3309c: Add support for MPS MP3309C
Flavio Suligoi
f.suligoi at asem.it
Wed Nov 29 11:12:29 UTC 2023
Hi Dan,
Can I add the "Reported-by" tag, with your name, in my 2nd vers of
the commit to fix this bug?
Thanks and regards,
Flavio
> -----Original Message-----
> From: Flavio Suligoi <f.suligoi at asem.it>
> Sent: Tuesday, November 28, 2023 9:24 AM
> To: Dan Carpenter <dan.carpenter at linaro.org>
> Cc: dri-devel at lists.freedesktop.org
> Subject: RE: [bug report] backlight: mp3309c: Add support for MPS
> MP3309C
>
> Hi Dan,
>
> Thanks for the report, I'll fix the bug as soon as possible.
>
> Regards,
> Flavio
>
> > -----Original Message-----
> > From: Dan Carpenter <dan.carpenter at linaro.org>
> > Sent: Tuesday, November 28, 2023 8:20 AM
> > To: Flavio Suligoi <f.suligoi at asem.it>
> > Cc: dri-devel at lists.freedesktop.org
> > Subject: [bug report] backlight: mp3309c: Add support for MPS MP3309C
> >
> > 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