.. | .. |
---|
401 | 401 | int index = fmd->num_sensors; |
---|
402 | 402 | struct fimc_source_info *pd = &fmd->sensor[index].pdata; |
---|
403 | 403 | struct device_node *rem, *np; |
---|
| 404 | + struct v4l2_async_subdev *asd; |
---|
404 | 405 | struct v4l2_fwnode_endpoint endpoint = { .bus_type = 0 }; |
---|
405 | 406 | int ret; |
---|
406 | 407 | |
---|
.. | .. |
---|
418 | 419 | pd->mux_id = (endpoint.base.port - 1) & 0x1; |
---|
419 | 420 | |
---|
420 | 421 | rem = of_graph_get_remote_port_parent(ep); |
---|
421 | | - of_node_put(ep); |
---|
422 | 422 | if (rem == NULL) { |
---|
423 | 423 | v4l2_info(&fmd->v4l2_dev, "Remote device at %pOF not found\n", |
---|
424 | 424 | ep); |
---|
| 425 | + of_node_put(ep); |
---|
425 | 426 | return 0; |
---|
426 | 427 | } |
---|
427 | 428 | |
---|
.. | .. |
---|
450 | 451 | * checking parent's node name. |
---|
451 | 452 | */ |
---|
452 | 453 | np = of_get_parent(rem); |
---|
| 454 | + of_node_put(rem); |
---|
453 | 455 | |
---|
454 | 456 | if (of_node_name_eq(np, "i2c-isp")) |
---|
455 | 457 | pd->fimc_bus_type = FIMC_BUS_TYPE_ISP_WRITEBACK; |
---|
.. | .. |
---|
458 | 460 | of_node_put(np); |
---|
459 | 461 | |
---|
460 | 462 | if (WARN_ON(index >= ARRAY_SIZE(fmd->sensor))) { |
---|
461 | | - of_node_put(rem); |
---|
| 463 | + of_node_put(ep); |
---|
462 | 464 | return -EINVAL; |
---|
463 | 465 | } |
---|
464 | 466 | |
---|
465 | | - fmd->sensor[index].asd.match_type = V4L2_ASYNC_MATCH_FWNODE; |
---|
466 | | - fmd->sensor[index].asd.match.fwnode = of_fwnode_handle(rem); |
---|
| 467 | + asd = v4l2_async_notifier_add_fwnode_remote_subdev( |
---|
| 468 | + &fmd->subdev_notifier, of_fwnode_handle(ep), sizeof(*asd)); |
---|
467 | 469 | |
---|
468 | | - ret = v4l2_async_notifier_add_subdev(&fmd->subdev_notifier, |
---|
469 | | - &fmd->sensor[index].asd); |
---|
470 | | - if (ret) { |
---|
471 | | - of_node_put(rem); |
---|
472 | | - return ret; |
---|
473 | | - } |
---|
| 470 | + of_node_put(ep); |
---|
474 | 471 | |
---|
| 472 | + if (IS_ERR(asd)) |
---|
| 473 | + return PTR_ERR(asd); |
---|
| 474 | + |
---|
| 475 | + fmd->sensor[index].asd = asd; |
---|
475 | 476 | fmd->num_sensors++; |
---|
476 | 477 | |
---|
477 | 478 | return 0; |
---|
.. | .. |
---|
1377 | 1378 | |
---|
1378 | 1379 | /* Find platform data for this sensor subdev */ |
---|
1379 | 1380 | for (i = 0; i < ARRAY_SIZE(fmd->sensor); i++) |
---|
1380 | | - if (fmd->sensor[i].asd.match.fwnode == |
---|
1381 | | - of_fwnode_handle(subdev->dev->of_node)) |
---|
| 1381 | + if (fmd->sensor[i].asd == asd) |
---|
1382 | 1382 | si = &fmd->sensor[i]; |
---|
1383 | 1383 | |
---|
1384 | 1384 | if (si == NULL) |
---|
.. | .. |
---|
1470 | 1470 | pinctrl = devm_pinctrl_get(dev); |
---|
1471 | 1471 | if (IS_ERR(pinctrl)) { |
---|
1472 | 1472 | ret = PTR_ERR(pinctrl); |
---|
1473 | | - if (ret != EPROBE_DEFER) |
---|
| 1473 | + if (ret != -EPROBE_DEFER) |
---|
1474 | 1474 | dev_err(dev, "Failed to get pinctrl: %d\n", ret); |
---|
1475 | 1475 | goto err_clk; |
---|
1476 | 1476 | } |
---|
.. | .. |
---|
1582 | 1582 | if (ret) |
---|
1583 | 1583 | return ret; |
---|
1584 | 1584 | |
---|
1585 | | - return platform_driver_register(&fimc_md_driver); |
---|
| 1585 | + ret = platform_driver_register(&fimc_md_driver); |
---|
| 1586 | + if (ret) |
---|
| 1587 | + fimc_unregister_driver(); |
---|
| 1588 | + |
---|
| 1589 | + return ret; |
---|
1586 | 1590 | } |
---|
1587 | 1591 | |
---|
1588 | 1592 | static void __exit fimc_md_exit(void) |
---|