Lines Matching full:camss
3 * camss.c
30 #include "camss.h"
2076 int camss_pm_domain_on(struct camss *camss, int id) in camss_pm_domain_on() argument
2080 if (id < camss->res->vfe_num) { in camss_pm_domain_on()
2081 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_on()
2089 void camss_pm_domain_off(struct camss *camss, int id) in camss_pm_domain_off() argument
2091 if (id < camss->res->vfe_num) { in camss_pm_domain_off()
2092 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_off()
2098 static int vfe_parent_dev_ops_get(struct camss *camss, int id) in vfe_parent_dev_ops_get() argument
2102 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_get()
2103 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_get()
2111 static int vfe_parent_dev_ops_put(struct camss *camss, int id) in vfe_parent_dev_ops_put() argument
2113 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_put()
2114 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_put()
2123 *vfe_parent_dev_ops_get_base_address(struct camss *camss, int id) in vfe_parent_dev_ops_get_base_address() argument
2125 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_get_base_address()
2126 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_get_base_address()
2190 static int camss_of_parse_ports(struct camss *camss) in camss_of_parse_ports() argument
2192 struct device *dev = camss->dev; in camss_of_parse_ports()
2210 csd = v4l2_async_nf_add_fwnode(&camss->notifier, in camss_of_parse_ports()
2235 * @camss: CAMSS device
2239 static int camss_init_subdevices(struct camss *camss) in camss_init_subdevices() argument
2241 struct platform_device *pdev = to_platform_device(camss->dev); in camss_init_subdevices()
2242 const struct camss_resources *res = camss->res; in camss_init_subdevices()
2246 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_init_subdevices()
2247 ret = msm_csiphy_subdev_init(camss, &camss->csiphy[i], in camss_init_subdevices()
2250 dev_err(camss->dev, in camss_init_subdevices()
2258 for (i = 0; i < camss->res->vfe_num; i++) { in camss_init_subdevices()
2259 ret = msm_vfe_subdev_init(camss, &camss->vfe[i], in camss_init_subdevices()
2262 dev_err(camss->dev, in camss_init_subdevices()
2276 camss->csid_wrapper_base = base; in camss_init_subdevices()
2279 for (i = 0; i < camss->res->csid_num; i++) { in camss_init_subdevices()
2280 ret = msm_csid_subdev_init(camss, &camss->csid[i], in camss_init_subdevices()
2283 dev_err(camss->dev, in camss_init_subdevices()
2290 ret = msm_ispif_subdev_init(camss, res->ispif_res); in camss_init_subdevices()
2292 dev_err(camss->dev, "Failed to init ispif sub-device: %d\n", in camss_init_subdevices()
2306 inline void camss_link_err(struct camss *camss, in camss_link_err() argument
2311 dev_err(camss->dev, in camss_link_err()
2320 * @camss: CAMSS device
2324 static int camss_link_entities(struct camss *camss) in camss_link_entities() argument
2329 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_link_entities()
2330 for (j = 0; j < camss->res->csid_num; j++) { in camss_link_entities()
2331 ret = media_create_pad_link(&camss->csiphy[i].subdev.entity, in camss_link_entities()
2333 &camss->csid[j].subdev.entity, in camss_link_entities()
2337 camss_link_err(camss, in camss_link_entities()
2338 camss->csiphy[i].subdev.entity.name, in camss_link_entities()
2339 camss->csid[j].subdev.entity.name, in camss_link_entities()
2346 if (camss->ispif) { in camss_link_entities()
2347 for (i = 0; i < camss->res->csid_num; i++) { in camss_link_entities()
2348 for (j = 0; j < camss->ispif->line_num; j++) { in camss_link_entities()
2349 ret = media_create_pad_link(&camss->csid[i].subdev.entity, in camss_link_entities()
2351 &camss->ispif->line[j].subdev.entity, in camss_link_entities()
2355 camss_link_err(camss, in camss_link_entities()
2356 camss->csid[i].subdev.entity.name, in camss_link_entities()
2357 camss->ispif->line[j].subdev.entity.name, in camss_link_entities()
2364 for (i = 0; i < camss->ispif->line_num; i++) in camss_link_entities()
2365 for (k = 0; k < camss->res->vfe_num; k++) in camss_link_entities()
2366 for (j = 0; j < camss->vfe[k].res->line_num; j++) { in camss_link_entities()
2367 struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; in camss_link_entities()
2368 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_link_entities()
2376 camss_link_err(camss, ispif->entity.name, in camss_link_entities()
2383 for (i = 0; i < camss->res->csid_num; i++) in camss_link_entities()
2384 for (k = 0; k < camss->res->vfe_num; k++) in camss_link_entities()
2385 for (j = 0; j < camss->vfe[k].res->line_num; j++) { in camss_link_entities()
2386 struct v4l2_subdev *csid = &camss->csid[i].subdev; in camss_link_entities()
2387 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_link_entities()
2395 camss_link_err(camss, csid->entity.name, in camss_link_entities()
2408 * @camss: CAMSS device
2412 static int camss_register_entities(struct camss *camss) in camss_register_entities() argument
2417 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_register_entities()
2418 ret = msm_csiphy_register_entity(&camss->csiphy[i], in camss_register_entities()
2419 &camss->v4l2_dev); in camss_register_entities()
2421 dev_err(camss->dev, in camss_register_entities()
2428 for (i = 0; i < camss->res->csid_num; i++) { in camss_register_entities()
2429 ret = msm_csid_register_entity(&camss->csid[i], in camss_register_entities()
2430 &camss->v4l2_dev); in camss_register_entities()
2432 dev_err(camss->dev, in camss_register_entities()
2439 ret = msm_ispif_register_entities(camss->ispif, in camss_register_entities()
2440 &camss->v4l2_dev); in camss_register_entities()
2442 dev_err(camss->dev, "Failed to register ispif entities: %d\n", ret); in camss_register_entities()
2446 for (i = 0; i < camss->res->vfe_num; i++) { in camss_register_entities()
2447 ret = msm_vfe_register_entities(&camss->vfe[i], in camss_register_entities()
2448 &camss->v4l2_dev); in camss_register_entities()
2450 dev_err(camss->dev, in camss_register_entities()
2461 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_register_entities()
2464 msm_ispif_unregister_entities(camss->ispif); in camss_register_entities()
2466 i = camss->res->csid_num; in camss_register_entities()
2469 msm_csid_unregister_entity(&camss->csid[i]); in camss_register_entities()
2471 i = camss->res->csiphy_num; in camss_register_entities()
2474 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_register_entities()
2481 * @camss: CAMSS device
2485 static void camss_unregister_entities(struct camss *camss) in camss_unregister_entities() argument
2489 for (i = 0; i < camss->res->csiphy_num; i++) in camss_unregister_entities()
2490 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_unregister_entities()
2492 for (i = 0; i < camss->res->csid_num; i++) in camss_unregister_entities()
2493 msm_csid_unregister_entity(&camss->csid[i]); in camss_unregister_entities()
2495 msm_ispif_unregister_entities(camss->ispif); in camss_unregister_entities()
2497 for (i = 0; i < camss->res->vfe_num; i++) in camss_unregister_entities()
2498 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_unregister_entities()
2505 struct camss *camss = container_of(async, struct camss, notifier); in camss_subdev_notifier_bound() local
2509 struct csiphy_device *csiphy = &camss->csiphy[id]; in camss_subdev_notifier_bound()
2519 struct camss *camss = container_of(async, struct camss, notifier); in camss_subdev_notifier_complete() local
2520 struct v4l2_device *v4l2_dev = &camss->v4l2_dev; in camss_subdev_notifier_complete()
2537 dev_err(camss->dev, in camss_subdev_notifier_complete()
2546 camss_link_err(camss, sensor->name, in camss_subdev_notifier_complete()
2554 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_subdev_notifier_complete()
2558 return media_device_register(&camss->media_dev); in camss_subdev_notifier_complete()
2570 static int camss_configure_pd(struct camss *camss) in camss_configure_pd() argument
2572 const struct camss_resources *res = camss->res; in camss_configure_pd()
2573 struct device *dev = camss->dev; in camss_configure_pd()
2578 camss->genpd_num = of_count_phandle_with_args(dev->of_node, in camss_configure_pd()
2581 if (camss->genpd_num < 0) { in camss_configure_pd()
2582 dev_err(dev, "Power domains are not defined for camss\n"); in camss_configure_pd()
2583 return camss->genpd_num; in camss_configure_pd()
2589 * option to attach it again, this is the case for CAMSS on MSM8916. in camss_configure_pd()
2591 if (camss->genpd_num == 1) in camss_configure_pd()
2595 for (vfepd_num = i = 0; i < camss->res->vfe_num; i++) { in camss_configure_pd()
2602 * then the additional power-domain is for the entire CAMSS block. in camss_configure_pd()
2604 if (!(camss->genpd_num > vfepd_num)) in camss_configure_pd()
2612 if (camss->res->pd_name) { in camss_configure_pd()
2613 camss->genpd = dev_pm_domain_attach_by_name(camss->dev, in camss_configure_pd()
2614 camss->res->pd_name); in camss_configure_pd()
2615 if (IS_ERR(camss->genpd)) in camss_configure_pd()
2616 return PTR_ERR(camss->genpd); in camss_configure_pd()
2619 if (!camss->genpd) { in camss_configure_pd()
2624 camss->genpd = dev_pm_domain_attach_by_id(camss->dev, in camss_configure_pd()
2625 camss->genpd_num - 1); in camss_configure_pd()
2626 if (IS_ERR(camss->genpd)) in camss_configure_pd()
2627 return PTR_ERR(camss->genpd); in camss_configure_pd()
2630 if (!camss->genpd) in camss_configure_pd()
2633 camss->genpd_link = device_link_add(camss->dev, camss->genpd, in camss_configure_pd()
2636 if (!camss->genpd_link) { in camss_configure_pd()
2644 dev_pm_domain_detach(camss->genpd, true); in camss_configure_pd()
2649 static int camss_icc_get(struct camss *camss) in camss_icc_get() argument
2654 icc_res = camss->res->icc_res; in camss_icc_get()
2656 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_icc_get()
2657 camss->icc_path[i] = devm_of_icc_get(camss->dev, in camss_icc_get()
2659 if (IS_ERR(camss->icc_path[i])) in camss_icc_get()
2660 return PTR_ERR(camss->icc_path[i]); in camss_icc_get()
2666 static void camss_genpd_subdevice_cleanup(struct camss *camss) in camss_genpd_subdevice_cleanup() argument
2670 for (i = 0; i < camss->res->vfe_num; i++) in camss_genpd_subdevice_cleanup()
2671 msm_vfe_genpd_cleanup(&camss->vfe[i]); in camss_genpd_subdevice_cleanup()
2674 static void camss_genpd_cleanup(struct camss *camss) in camss_genpd_cleanup() argument
2676 if (camss->genpd_num == 1) in camss_genpd_cleanup()
2679 camss_genpd_subdevice_cleanup(camss); in camss_genpd_cleanup()
2681 if (camss->genpd_link) in camss_genpd_cleanup()
2682 device_link_del(camss->genpd_link); in camss_genpd_cleanup()
2684 dev_pm_domain_detach(camss->genpd, true); in camss_genpd_cleanup()
2688 * camss_probe - Probe CAMSS platform device
2689 * @pdev: Pointer to CAMSS platform device
2696 struct camss *camss; in camss_probe() local
2700 camss = devm_kzalloc(dev, sizeof(*camss), GFP_KERNEL); in camss_probe()
2701 if (!camss) in camss_probe()
2704 camss->res = of_device_get_match_data(dev); in camss_probe()
2706 atomic_set(&camss->ref_count, 0); in camss_probe()
2707 camss->dev = dev; in camss_probe()
2708 platform_set_drvdata(pdev, camss); in camss_probe()
2710 camss->csiphy = devm_kcalloc(dev, camss->res->csiphy_num, in camss_probe()
2711 sizeof(*camss->csiphy), GFP_KERNEL); in camss_probe()
2712 if (!camss->csiphy) in camss_probe()
2715 camss->csid = devm_kcalloc(dev, camss->res->csid_num, sizeof(*camss->csid), in camss_probe()
2717 if (!camss->csid) in camss_probe()
2720 if (camss->res->version == CAMSS_8x16 || in camss_probe()
2721 camss->res->version == CAMSS_8x53 || in camss_probe()
2722 camss->res->version == CAMSS_8x96) { in camss_probe()
2723 camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL); in camss_probe()
2724 if (!camss->ispif) in camss_probe()
2728 camss->vfe = devm_kcalloc(dev, camss->res->vfe_num, in camss_probe()
2729 sizeof(*camss->vfe), GFP_KERNEL); in camss_probe()
2730 if (!camss->vfe) in camss_probe()
2733 ret = camss_icc_get(camss); in camss_probe()
2737 ret = camss_configure_pd(camss); in camss_probe()
2743 ret = camss_init_subdevices(camss); in camss_probe()
2751 camss->media_dev.dev = camss->dev; in camss_probe()
2752 strscpy(camss->media_dev.model, "Qualcomm Camera Subsystem", in camss_probe()
2753 sizeof(camss->media_dev.model)); in camss_probe()
2754 camss->media_dev.ops = &camss_media_ops; in camss_probe()
2755 media_device_init(&camss->media_dev); in camss_probe()
2757 camss->v4l2_dev.mdev = &camss->media_dev; in camss_probe()
2758 ret = v4l2_device_register(camss->dev, &camss->v4l2_dev); in camss_probe()
2764 v4l2_async_nf_init(&camss->notifier, &camss->v4l2_dev); in camss_probe()
2768 num_subdevs = camss_of_parse_ports(camss); in camss_probe()
2774 ret = camss_register_entities(camss); in camss_probe()
2778 ret = camss->res->link_entities(camss); in camss_probe()
2783 camss->notifier.ops = &camss_subdev_notifier_ops; in camss_probe()
2785 ret = v4l2_async_nf_register(&camss->notifier); in camss_probe()
2793 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_probe()
2800 ret = media_device_register(&camss->media_dev); in camss_probe()
2811 camss_unregister_entities(camss); in camss_probe()
2813 v4l2_device_unregister(&camss->v4l2_dev); in camss_probe()
2814 v4l2_async_nf_cleanup(&camss->notifier); in camss_probe()
2817 camss_genpd_cleanup(camss); in camss_probe()
2822 void camss_delete(struct camss *camss) in camss_delete() argument
2824 v4l2_device_unregister(&camss->v4l2_dev); in camss_delete()
2825 media_device_unregister(&camss->media_dev); in camss_delete()
2826 media_device_cleanup(&camss->media_dev); in camss_delete()
2828 pm_runtime_disable(camss->dev); in camss_delete()
2832 * camss_remove - Remove CAMSS platform device
2833 * @pdev: Pointer to CAMSS platform device
2839 struct camss *camss = platform_get_drvdata(pdev); in camss_remove() local
2841 v4l2_async_nf_unregister(&camss->notifier); in camss_remove()
2842 v4l2_async_nf_cleanup(&camss->notifier); in camss_remove()
2843 camss_unregister_entities(camss); in camss_remove()
2845 if (atomic_read(&camss->ref_count) == 0) in camss_remove()
2846 camss_delete(camss); in camss_remove()
2848 camss_genpd_cleanup(camss); in camss_remove()
2956 { .compatible = "qcom,msm8916-camss", .data = &msm8916_resources },
2957 { .compatible = "qcom,msm8953-camss", .data = &msm8953_resources },
2958 { .compatible = "qcom,msm8996-camss", .data = &msm8996_resources },
2959 { .compatible = "qcom,sc7280-camss", .data = &sc7280_resources },
2960 { .compatible = "qcom,sc8280xp-camss", .data = &sc8280xp_resources },
2961 { .compatible = "qcom,sdm660-camss", .data = &sdm660_resources },
2962 { .compatible = "qcom,sdm845-camss", .data = &sdm845_resources },
2963 { .compatible = "qcom,sm8250-camss", .data = &sm8250_resources },
2971 struct camss *camss = dev_get_drvdata(dev); in camss_runtime_suspend() local
2975 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_suspend()
2976 ret = icc_set_bw(camss->icc_path[i], 0, 0); in camss_runtime_suspend()
2986 struct camss *camss = dev_get_drvdata(dev); in camss_runtime_resume() local
2987 const struct resources_icc *icc_res = camss->res->icc_res; in camss_runtime_resume()
2991 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_resume()
2992 ret = icc_set_bw(camss->icc_path[i], in camss_runtime_resume()
3012 .name = "qcom-camss",
3020 MODULE_ALIAS("platform:qcom-camss");