Lines Matching defs:fmd

40 static void __setup_sensor_notification(struct fimc_md *fmd,
49 if (!src_inf || WARN_ON(fmd == NULL))
53 spin_lock_irqsave(&fmd->slock, flags);
55 spin_unlock_irqrestore(&fmd->slock, flags);
68 struct fimc_md *fmd = entity_to_fimc_mdev(me);
121 __setup_sensor_notification(fmd, sensor, p->subdevs[IDX_FIMC]);
190 * @fmd: fimc media device
195 struct fimc_md *fmd)
201 if (!IS_ERR(fmd->wbclk[CLK_IDX_WB_B]) && p->subdevs[IDX_IS_ISP]) {
202 ret = clk_prepare_enable(fmd->wbclk[CLK_IDX_WB_B]);
211 if (!IS_ERR(fmd->wbclk[CLK_IDX_WB_B]) && p->subdevs[IDX_IS_ISP])
212 clk_disable_unprepare(fmd->wbclk[CLK_IDX_WB_B]);
229 struct fimc_md *fmd = entity_to_fimc_mdev(me);
249 return __fimc_pipeline_enable(ep, fmd);
262 struct fimc_md *fmd;
272 fmd = entity_to_fimc_mdev(&sd->entity);
275 if (!IS_ERR(fmd->wbclk[CLK_IDX_WB_B]) && p->subdevs[IDX_IS_ISP])
276 clk_disable_unprepare(fmd->wbclk[CLK_IDX_WB_B]);
297 struct fimc_md *fmd;
311 fmd = entity_to_fimc_mdev(&sd->entity);
313 if (!fmd->user_subdev_api) {
340 ret = __fimc_pipeline_enable(ep, fmd);
373 struct fimc_md *fmd)
381 list_add_tail(&p->list, &fmd->pipelines);
387 static void fimc_md_pipelines_free(struct fimc_md *fmd)
389 while (!list_empty(&fmd->pipelines)) {
392 p = list_entry(fmd->pipelines.next, typeof(*p), list);
398 static int fimc_md_parse_one_endpoint(struct fimc_md *fmd,
401 int index = fmd->num_sensors;
402 struct fimc_source_info *pd = &fmd->sensor[index].pdata;
423 v4l2_info(&fmd->v4l2_dev, "Remote device at %pOF not found\n",
442 v4l2_err(&fmd->v4l2_dev, "Wrong port id (%u) at node %pOF\n",
462 if (WARN_ON(index >= ARRAY_SIZE(fmd->sensor))) {
468 &fmd->subdev_notifier, of_fwnode_handle(ep), sizeof(*asd));
475 fmd->sensor[index].asd = asd;
476 fmd->num_sensors++;
482 static int fimc_md_parse_port_node(struct fimc_md *fmd,
489 ret = fimc_md_parse_one_endpoint(fmd, ep);
498 static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
500 struct device_node *parent = fmd->pdev->dev.of_node;
509 if (!fmd->pmf)
512 ret = pm_runtime_resume_and_get(fmd->pmf);
516 fmd->num_sensors = 0;
529 ret = fimc_md_parse_port_node(fmd, port);
543 ret = fimc_md_parse_port_node(fmd, node);
552 pm_runtime_put(fmd->pmf);
557 v4l2_async_notifier_cleanup(&fmd->subdev_notifier);
558 pm_runtime_put(fmd->pmf);
577 static int register_fimc_lite_entity(struct fimc_md *fmd,
585 fmd->fimc_lite[fimc_lite->index]))
591 ep = fimc_md_pipeline_create(fmd);
597 ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd);
599 fmd->fimc_lite[fimc_lite->index] = fimc_lite;
601 v4l2_err(&fmd->v4l2_dev, "Failed to register FIMC.LITE%d\n",
606 static int register_fimc_entity(struct fimc_md *fmd, struct fimc_dev *fimc)
612 if (WARN_ON(fimc->id >= FIMC_MAX_DEVS || fmd->fimc[fimc->id]))
618 ep = fimc_md_pipeline_create(fmd);
624 ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd);
626 if (!fmd->pmf && fimc->pdev)
627 fmd->pmf = &fimc->pdev->dev;
628 fmd->fimc[fimc->id] = fimc;
629 fimc->vid_cap.user_subdev_api = fmd->user_subdev_api;
631 v4l2_err(&fmd->v4l2_dev, "Failed to register FIMC.%d (%d)\n",
637 static int register_csis_entity(struct fimc_md *fmd,
649 if (WARN_ON(fmd->csis[id].sd))
653 ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd);
655 fmd->csis[id].sd = sd;
657 v4l2_err(&fmd->v4l2_dev,
662 static int register_fimc_is_entity(struct fimc_md *fmd, struct fimc_is *is)
669 ep = fimc_md_pipeline_create(fmd);
675 ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd);
677 v4l2_err(&fmd->v4l2_dev,
682 fmd->fimc_is = is;
686 static int fimc_md_register_platform_entity(struct fimc_md *fmd,
705 ret = register_fimc_entity(fmd, drvdata);
708 ret = register_fimc_lite_entity(fmd, drvdata);
711 ret = register_csis_entity(fmd, pdev, drvdata);
714 ret = register_fimc_is_entity(fmd, drvdata);
725 dev_info(&fmd->pdev->dev, "deferring %s device registration\n",
728 dev_err(&fmd->pdev->dev, "%s device registration failed (%d)\n",
734 static int fimc_md_register_platform_entities(struct fimc_md *fmd,
760 ret = fimc_md_register_platform_entity(fmd, pdev,
772 static void fimc_md_unregister_entities(struct fimc_md *fmd)
777 struct fimc_dev *dev = fmd->fimc[i];
782 fmd->fimc[i] = NULL;
785 struct fimc_lite *dev = fmd->fimc_lite[i];
790 fmd->fimc_lite[i] = NULL;
793 if (fmd->csis[i].sd == NULL)
795 v4l2_device_unregister_subdev(fmd->csis[i].sd);
796 fmd->csis[i].sd = NULL;
799 if (fmd->fimc_is)
800 v4l2_device_unregister_subdev(&fmd->fimc_is->isp.subdev);
802 v4l2_info(&fmd->v4l2_dev, "Unregistered all entities\n");
807 * @fmd: fimc media device
813 static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
831 if (!fmd->fimc[i])
837 if (!fmd->fimc[i]->variant->has_cam_if)
842 sink = &fmd->fimc[i]->vid_cap.subdev.entity;
854 v4l2_info(&fmd->v4l2_dev, "created link [%s] %c> [%s]\n",
859 if (!fmd->fimc_lite[i])
862 sink = &fmd->fimc_lite[i]->subdev.entity;
874 v4l2_info(&fmd->v4l2_dev, "created link [%s] -> [%s]\n",
881 static int __fimc_md_create_flite_source_links(struct fimc_md *fmd)
887 struct fimc_lite *fimc = fmd->fimc_lite[i];
900 sink = &fmd->fimc_is->isp.subdev.entity;
911 static int __fimc_md_create_fimc_is_links(struct fimc_md *fmd)
913 struct fimc_isp *isp = &fmd->fimc_is->isp;
920 if (fmd->fimc[i] == NULL)
924 sink = &fmd->fimc[i]->vid_cap.subdev.entity;
944 * @fmd: fimc media device
955 static int fimc_md_create_links(struct fimc_md *fmd)
964 for (i = 0; i < fmd->num_sensors; i++) {
965 if (fmd->sensor[i].subdev == NULL)
968 sensor = fmd->sensor[i].subdev;
981 csis = fmd->csis[pdata->mux_id].sd;
994 v4l2_info(&fmd->v4l2_dev, "created link [%s] => [%s]\n",
1007 v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n",
1015 ret = __fimc_md_create_fimc_sink_links(fmd, source, sensor,
1020 if (fmd->csis[i].sd == NULL)
1023 source = &fmd->csis[i].sd->entity;
1028 ret = __fimc_md_create_fimc_sink_links(fmd, source, sensor,
1035 if (!fmd->fimc[i])
1038 source = &fmd->fimc[i]->vid_cap.subdev.entity;
1039 sink = &fmd->fimc[i]->vid_cap.ve.vdev.entity;
1047 ret = __fimc_md_create_flite_source_links(fmd);
1051 if (fmd->use_isp)
1052 ret = __fimc_md_create_fimc_is_links(fmd);
1060 static void fimc_md_put_clocks(struct fimc_md *fmd)
1065 if (IS_ERR(fmd->camclk[i].clock))
1067 clk_put(fmd->camclk[i].clock);
1068 fmd->camclk[i].clock = ERR_PTR(-EINVAL);
1073 if (IS_ERR(fmd->wbclk[i]))
1075 clk_put(fmd->wbclk[i]);
1076 fmd->wbclk[i] = ERR_PTR(-EINVAL);
1080 static int fimc_md_get_clocks(struct fimc_md *fmd)
1082 struct device *dev = &fmd->pdev->dev;
1088 fmd->camclk[i].clock = ERR_PTR(-EINVAL);
1099 fmd->camclk[i].clock = clock;
1102 fimc_md_put_clocks(fmd);
1104 if (!fmd->use_isp)
1110 fmd->wbclk[CLK_IDX_WB_A] = ERR_PTR(-EINVAL);
1116 v4l2_err(&fmd->v4l2_dev, "Failed to get clock: %s\n",
1121 fmd->wbclk[i] = clock;
1124 fimc_md_put_clocks(fmd);
1241 struct fimc_md *fmd = dev_get_drvdata(dev);
1243 if (fmd->user_subdev_api)
1253 struct fimc_md *fmd = dev_get_drvdata(dev);
1264 fmd->user_subdev_api = subdev_api;
1266 if (fmd->fimc[i])
1267 fmd->fimc[i]->vid_cap.user_subdev_api = subdev_api;
1285 if (camclk->fmd->pmf == NULL)
1288 return pm_runtime_resume_and_get(camclk->fmd->pmf);
1295 if (camclk->fmd->pmf == NULL)
1298 pm_runtime_put_sync(camclk->fmd->pmf);
1306 static void fimc_md_unregister_clk_provider(struct fimc_md *fmd)
1308 struct cam_clk_provider *cp = &fmd->clk_provider;
1318 static int fimc_md_register_clk_provider(struct fimc_md *fmd)
1320 struct cam_clk_provider *cp = &fmd->clk_provider;
1321 struct device *dev = &fmd->pdev->dev;
1334 p_name = __clk_get_name(fmd->camclk[i].clock);
1342 camclk->fmd = fmd;
1367 fimc_md_unregister_clk_provider(fmd);
1375 struct fimc_md *fmd = notifier_to_fimc_md(notifier);
1380 for (i = 0; i < ARRAY_SIZE(fmd->sensor); i++)
1381 if (fmd->sensor[i].asd == asd)
1382 si = &fmd->sensor[i];
1396 v4l2_info(&fmd->v4l2_dev, "Registered sensor subdevice: %s (%d)\n",
1397 subdev->name, fmd->num_sensors);
1399 fmd->num_sensors++;
1406 struct fimc_md *fmd = notifier_to_fimc_md(notifier);
1409 mutex_lock(&fmd->media_dev.graph_mutex);
1411 ret = fimc_md_create_links(fmd);
1415 ret = v4l2_device_register_subdev_nodes(&fmd->v4l2_dev);
1417 mutex_unlock(&fmd->media_dev.graph_mutex);
1421 return media_device_register(&fmd->media_dev);
1434 struct fimc_md *fmd;
1437 fmd = devm_kzalloc(dev, sizeof(*fmd), GFP_KERNEL);
1438 if (!fmd)
1441 spin_lock_init(&fmd->slock);
1442 INIT_LIST_HEAD(&fmd->pipelines);
1443 fmd->pdev = pdev;
1445 strscpy(fmd->media_dev.model, "Samsung S5P FIMC",
1446 sizeof(fmd->media_dev.model));
1447 fmd->media_dev.ops = &fimc_md_ops;
1448 fmd->media_dev.dev = dev;
1450 v4l2_dev = &fmd->v4l2_dev;
1451 v4l2_dev->mdev = &fmd->media_dev;
1455 fmd->use_isp = fimc_md_is_isp_available(dev->of_node);
1456 fmd->user_subdev_api = true;
1458 media_device_init(&fmd->media_dev);
1460 ret = v4l2_device_register(dev, &fmd->v4l2_dev);
1466 ret = fimc_md_get_clocks(fmd);
1478 platform_set_drvdata(pdev, fmd);
1480 v4l2_async_notifier_init(&fmd->subdev_notifier);
1482 ret = fimc_md_register_platform_entities(fmd, dev->of_node);
1486 ret = fimc_md_register_sensor_entities(fmd);
1498 ret = fimc_md_register_clk_provider(fmd);
1504 if (fmd->num_sensors > 0) {
1505 fmd->subdev_notifier.ops = &subdev_notifier_ops;
1506 fmd->num_sensors = 0;
1508 ret = v4l2_async_notifier_register(&fmd->v4l2_dev,
1509 &fmd->subdev_notifier);
1517 fimc_md_unregister_clk_provider(fmd);
1521 v4l2_async_notifier_cleanup(&fmd->subdev_notifier);
1523 fimc_md_unregister_entities(fmd);
1525 fimc_md_put_clocks(fmd);
1527 v4l2_device_unregister(&fmd->v4l2_dev);
1529 media_device_cleanup(&fmd->media_dev);
1535 struct fimc_md *fmd = platform_get_drvdata(pdev);
1537 if (!fmd)
1540 fimc_md_unregister_clk_provider(fmd);
1541 v4l2_async_notifier_unregister(&fmd->subdev_notifier);
1542 v4l2_async_notifier_cleanup(&fmd->subdev_notifier);
1544 v4l2_device_unregister(&fmd->v4l2_dev);
1546 fimc_md_unregister_entities(fmd);
1547 fimc_md_pipelines_free(fmd);
1548 media_device_unregister(&fmd->media_dev);
1549 media_device_cleanup(&fmd->media_dev);
1550 fimc_md_put_clocks(fmd);