[bug report] media: i2c: Add driver for onsemi MT9M114 camera sensor

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

 



Hello Laurent Pinchart,

The patch 70ff259069a5: "media: i2c: Add driver for onsemi MT9M114
camera sensor" from Sep 20, 2023 (linux-next), leads to the following
Smatch static checker warning:

	drivers/media/i2c/mt9m114.c:2381 mt9m114_probe()
	warn: missing unwind goto?

drivers/media/i2c/mt9m114.c
    2320 static int mt9m114_probe(struct i2c_client *client)
    2321 {
    2322         struct device *dev = &client->dev;
    2323         struct mt9m114 *sensor;
    2324         int ret;
    2325 
    2326         sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
    2327         if (!sensor)
    2328                 return -ENOMEM;
    2329 
    2330         sensor->client = client;
    2331 
    2332         sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
    2333         if (IS_ERR(sensor->regmap)) {
    2334                 dev_err(dev, "Unable to initialize I2C\n");
    2335                 return -ENODEV;
    2336         }
    2337 
    2338         ret = mt9m114_parse_dt(sensor);
    2339         if (ret < 0)
    2340                 return ret;
    2341 
    2342         /* Acquire clocks, GPIOs and regulators. */
    2343         sensor->clk = devm_clk_get(dev, NULL);
    2344         if (IS_ERR(sensor->clk)) {
    2345                 ret = PTR_ERR(sensor->clk);
    2346                 dev_err_probe(dev, ret, "Failed to get clock\n");
    2347                 goto error_ep_free;
    2348         }
    2349 
    2350         sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
    2351         if (IS_ERR(sensor->reset)) {
    2352                 ret = PTR_ERR(sensor->reset);
    2353                 dev_err_probe(dev, ret, "Failed to get reset GPIO\n");
    2354                 goto error_ep_free;
    2355         }
    2356 
    2357         sensor->supplies[0].supply = "vddio";
    2358         sensor->supplies[1].supply = "vdd";
    2359         sensor->supplies[2].supply = "vaa";
    2360 
    2361         ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sensor->supplies),
    2362                                       sensor->supplies);
    2363         if (ret < 0) {
    2364                 dev_err_probe(dev, ret, "Failed to get regulators\n");
    2365                 goto error_ep_free;
    2366         }
    2367 
    2368         ret = mt9m114_clk_init(sensor);
    2369         if (ret)
    2370                 return ret;

These two should probably be goto error_ep_free;

    2371 
    2372         /*
    2373          * Identify the sensor. The driver supports runtime PM, but needs to
    2374          * work when runtime PM is disabled in the kernel. To that end, power
    2375          * the sensor on manually here, and initialize it after identification
    2376          * to reach the same state as if resumed through runtime PM.
    2377          */
    2378         ret = mt9m114_power_on(sensor);
    2379         if (ret < 0) {
    2380                 dev_err_probe(dev, ret, "Could not power on the device\n");
--> 2381                 return ret;

This as well.

    2382         }
    2383 
    2384         ret = mt9m114_identify(sensor);
    2385         if (ret < 0)
    2386                 goto error_power_off;
    2387 
    2388         ret = mt9m114_initialize(sensor);
    2389         if (ret < 0)
    2390                 goto error_power_off;
    2391 
    2392         /*
    2393          * Enable runtime PM with autosuspend. As the device has been powered
    2394          * manually, mark it as active, and increase the usage count without
    2395          * resuming the device.
    2396          */
    2397         pm_runtime_set_active(dev);
    2398         pm_runtime_get_noresume(dev);
    2399         pm_runtime_enable(dev);
    2400         pm_runtime_set_autosuspend_delay(dev, 1000);
    2401         pm_runtime_use_autosuspend(dev);
    2402 
    2403         /* Initialize the subdevices. */
    2404         ret = mt9m114_pa_init(sensor);
    2405         if (ret < 0)
    2406                 goto error_pm_cleanup;
    2407 
    2408         ret = mt9m114_ifp_init(sensor);
    2409         if (ret < 0)
    2410                 goto error_pa_cleanup;
    2411 
    2412         ret = v4l2_async_register_subdev(&sensor->ifp.sd);
    2413         if (ret < 0)
    2414                 goto error_ifp_cleanup;
    2415 
    2416         /*
    2417          * Decrease the PM usage count. The device will get suspended after the
    2418          * autosuspend delay, turning the power off.
    2419          */
    2420         pm_runtime_mark_last_busy(dev);
    2421         pm_runtime_put_autosuspend(dev);
    2422 
    2423         return 0;
    2424 
    2425 error_ifp_cleanup:
    2426         mt9m114_ifp_cleanup(sensor);
    2427 error_pa_cleanup:
    2428         mt9m114_pa_cleanup(sensor);
    2429 error_pm_cleanup:
    2430         pm_runtime_disable(dev);
    2431         pm_runtime_put_noidle(dev);
    2432 error_power_off:
    2433         mt9m114_power_off(sensor);
    2434 error_ep_free:
    2435         v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
    2436         return ret;
    2437 }

regards,
dan carpenter



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux