[bug report] backlight: mp3309c: Add support for MPS MP3309C

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux