Lines Matching full:camss
3 * camss.c
30 #include "camss.h"
2911 int camss_pm_domain_on(struct camss *camss, int id) in camss_pm_domain_on() argument
2915 if (id < camss->res->vfe_num) { in camss_pm_domain_on()
2916 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_on()
2924 void camss_pm_domain_off(struct camss *camss, int id) in camss_pm_domain_off() argument
2926 if (id < camss->res->vfe_num) { in camss_pm_domain_off()
2927 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_off()
2933 static int vfe_parent_dev_ops_get(struct camss *camss, int id) in vfe_parent_dev_ops_get() argument
2937 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_get()
2938 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_get()
2946 static int vfe_parent_dev_ops_put(struct camss *camss, int id) in vfe_parent_dev_ops_put() argument
2948 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_put()
2949 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_put()
2958 *vfe_parent_dev_ops_get_base_address(struct camss *camss, int id) in vfe_parent_dev_ops_get_base_address() argument
2960 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_get_base_address()
2961 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_get_base_address()
3034 static int camss_of_parse_ports(struct camss *camss) in camss_of_parse_ports() argument
3036 struct device *dev = camss->dev; in camss_of_parse_ports()
3054 csd = v4l2_async_nf_add_fwnode(&camss->notifier, in camss_of_parse_ports()
3079 * @camss: CAMSS device
3083 static int camss_init_subdevices(struct camss *camss) in camss_init_subdevices() argument
3085 struct platform_device *pdev = to_platform_device(camss->dev); in camss_init_subdevices()
3086 const struct camss_resources *res = camss->res; in camss_init_subdevices()
3090 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_init_subdevices()
3091 ret = msm_csiphy_subdev_init(camss, &camss->csiphy[i], in camss_init_subdevices()
3095 dev_err(camss->dev, in camss_init_subdevices()
3103 for (i = 0; i < camss->res->vfe_num; i++) { in camss_init_subdevices()
3104 ret = msm_vfe_subdev_init(camss, &camss->vfe[i], in camss_init_subdevices()
3107 dev_err(camss->dev, in camss_init_subdevices()
3121 camss->csid_wrapper_base = base; in camss_init_subdevices()
3124 for (i = 0; i < camss->res->csid_num; i++) { in camss_init_subdevices()
3125 ret = msm_csid_subdev_init(camss, &camss->csid[i], in camss_init_subdevices()
3128 dev_err(camss->dev, in camss_init_subdevices()
3135 ret = msm_ispif_subdev_init(camss, res->ispif_res); in camss_init_subdevices()
3137 dev_err(camss->dev, "Failed to init ispif sub-device: %d\n", in camss_init_subdevices()
3151 inline void camss_link_err(struct camss *camss, in camss_link_err() argument
3156 dev_err(camss->dev, in camss_link_err()
3165 * @camss: CAMSS device
3169 static int camss_link_entities(struct camss *camss) in camss_link_entities() argument
3174 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_link_entities()
3175 for (j = 0; j < camss->res->csid_num; j++) { in camss_link_entities()
3176 ret = media_create_pad_link(&camss->csiphy[i].subdev.entity, in camss_link_entities()
3178 &camss->csid[j].subdev.entity, in camss_link_entities()
3182 camss_link_err(camss, in camss_link_entities()
3183 camss->csiphy[i].subdev.entity.name, in camss_link_entities()
3184 camss->csid[j].subdev.entity.name, in camss_link_entities()
3191 if (camss->ispif) { in camss_link_entities()
3192 for (i = 0; i < camss->res->csid_num; i++) { in camss_link_entities()
3193 for (j = 0; j < camss->ispif->line_num; j++) { in camss_link_entities()
3194 ret = media_create_pad_link(&camss->csid[i].subdev.entity, in camss_link_entities()
3196 &camss->ispif->line[j].subdev.entity, in camss_link_entities()
3200 camss_link_err(camss, in camss_link_entities()
3201 camss->csid[i].subdev.entity.name, in camss_link_entities()
3202 camss->ispif->line[j].subdev.entity.name, in camss_link_entities()
3209 for (i = 0; i < camss->ispif->line_num; i++) in camss_link_entities()
3210 for (k = 0; k < camss->res->vfe_num; k++) in camss_link_entities()
3211 for (j = 0; j < camss->vfe[k].res->line_num; j++) { in camss_link_entities()
3212 struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; in camss_link_entities()
3213 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_link_entities()
3221 camss_link_err(camss, ispif->entity.name, in camss_link_entities()
3228 for (i = 0; i < camss->res->csid_num; i++) in camss_link_entities()
3229 for (k = 0; k < camss->res->vfe_num; k++) in camss_link_entities()
3230 for (j = 0; j < camss->vfe[k].res->line_num; j++) { in camss_link_entities()
3231 struct v4l2_subdev *csid = &camss->csid[i].subdev; in camss_link_entities()
3232 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_link_entities()
3240 camss_link_err(camss, csid->entity.name, in camss_link_entities()
3251 void camss_reg_update(struct camss *camss, int hw_id, int port_id, bool is_clear) in camss_reg_update() argument
3255 if (hw_id < camss->res->csid_num) { in camss_reg_update()
3256 csid = &camss->csid[hw_id]; in camss_reg_update()
3262 void camss_buf_done(struct camss *camss, int hw_id, int port_id) in camss_buf_done() argument
3266 if (hw_id < camss->res->vfe_num) { in camss_buf_done()
3267 vfe = &camss->vfe[hw_id]; in camss_buf_done()
3275 * @camss: CAMSS device
3279 static int camss_register_entities(struct camss *camss) in camss_register_entities() argument
3284 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_register_entities()
3285 ret = msm_csiphy_register_entity(&camss->csiphy[i], in camss_register_entities()
3286 &camss->v4l2_dev); in camss_register_entities()
3288 dev_err(camss->dev, in camss_register_entities()
3295 for (i = 0; i < camss->res->csid_num; i++) { in camss_register_entities()
3296 ret = msm_csid_register_entity(&camss->csid[i], in camss_register_entities()
3297 &camss->v4l2_dev); in camss_register_entities()
3299 dev_err(camss->dev, in camss_register_entities()
3306 ret = msm_ispif_register_entities(camss->ispif, in camss_register_entities()
3307 &camss->v4l2_dev); in camss_register_entities()
3309 dev_err(camss->dev, "Failed to register ispif entities: %d\n", ret); in camss_register_entities()
3313 for (i = 0; i < camss->res->vfe_num; i++) { in camss_register_entities()
3314 ret = msm_vfe_register_entities(&camss->vfe[i], in camss_register_entities()
3315 &camss->v4l2_dev); in camss_register_entities()
3317 dev_err(camss->dev, in camss_register_entities()
3328 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_register_entities()
3331 msm_ispif_unregister_entities(camss->ispif); in camss_register_entities()
3333 i = camss->res->csid_num; in camss_register_entities()
3336 msm_csid_unregister_entity(&camss->csid[i]); in camss_register_entities()
3338 i = camss->res->csiphy_num; in camss_register_entities()
3341 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_register_entities()
3348 * @camss: CAMSS device
3352 static void camss_unregister_entities(struct camss *camss) in camss_unregister_entities() argument
3356 for (i = 0; i < camss->res->csiphy_num; i++) in camss_unregister_entities()
3357 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_unregister_entities()
3359 for (i = 0; i < camss->res->csid_num; i++) in camss_unregister_entities()
3360 msm_csid_unregister_entity(&camss->csid[i]); in camss_unregister_entities()
3362 msm_ispif_unregister_entities(camss->ispif); in camss_unregister_entities()
3364 for (i = 0; i < camss->res->vfe_num; i++) in camss_unregister_entities()
3365 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_unregister_entities()
3372 struct camss *camss = container_of(async, struct camss, notifier); in camss_subdev_notifier_bound() local
3376 struct csiphy_device *csiphy = &camss->csiphy[id]; in camss_subdev_notifier_bound()
3386 struct camss *camss = container_of(async, struct camss, notifier); in camss_subdev_notifier_complete() local
3387 struct v4l2_device *v4l2_dev = &camss->v4l2_dev; in camss_subdev_notifier_complete()
3407 dev_err(camss->dev, in camss_subdev_notifier_complete()
3416 camss_link_err(camss, sensor->name, input->name, ret); in camss_subdev_notifier_complete()
3421 return v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_subdev_notifier_complete()
3433 static int camss_configure_pd(struct camss *camss) in camss_configure_pd() argument
3435 const struct camss_resources *res = camss->res; in camss_configure_pd()
3436 struct device *dev = camss->dev; in camss_configure_pd()
3441 camss->genpd_num = of_count_phandle_with_args(dev->of_node, in camss_configure_pd()
3444 if (camss->genpd_num < 0) { in camss_configure_pd()
3445 dev_err(dev, "Power domains are not defined for camss\n"); in camss_configure_pd()
3446 return camss->genpd_num; in camss_configure_pd()
3452 * option to attach it again, this is the case for CAMSS on MSM8916. in camss_configure_pd()
3454 if (camss->genpd_num == 1) in camss_configure_pd()
3458 for (vfepd_num = i = 0; i < camss->res->vfe_num; i++) { in camss_configure_pd()
3465 * then the additional power-domain is for the entire CAMSS block. in camss_configure_pd()
3467 if (!(camss->genpd_num > vfepd_num)) in camss_configure_pd()
3475 if (camss->res->pd_name) { in camss_configure_pd()
3476 camss->genpd = dev_pm_domain_attach_by_name(camss->dev, in camss_configure_pd()
3477 camss->res->pd_name); in camss_configure_pd()
3478 if (IS_ERR(camss->genpd)) in camss_configure_pd()
3479 return PTR_ERR(camss->genpd); in camss_configure_pd()
3482 if (!camss->genpd) { in camss_configure_pd()
3487 camss->genpd = dev_pm_domain_attach_by_id(camss->dev, in camss_configure_pd()
3488 camss->genpd_num - 1); in camss_configure_pd()
3489 if (IS_ERR(camss->genpd)) in camss_configure_pd()
3490 return PTR_ERR(camss->genpd); in camss_configure_pd()
3493 if (!camss->genpd) in camss_configure_pd()
3496 camss->genpd_link = device_link_add(camss->dev, camss->genpd, in camss_configure_pd()
3499 if (!camss->genpd_link) { in camss_configure_pd()
3507 dev_pm_domain_detach(camss->genpd, true); in camss_configure_pd()
3512 static int camss_icc_get(struct camss *camss) in camss_icc_get() argument
3517 icc_res = camss->res->icc_res; in camss_icc_get()
3519 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_icc_get()
3520 camss->icc_path[i] = devm_of_icc_get(camss->dev, in camss_icc_get()
3522 if (IS_ERR(camss->icc_path[i])) in camss_icc_get()
3523 return PTR_ERR(camss->icc_path[i]); in camss_icc_get()
3529 static void camss_genpd_subdevice_cleanup(struct camss *camss) in camss_genpd_subdevice_cleanup() argument
3533 for (i = 0; i < camss->res->vfe_num; i++) in camss_genpd_subdevice_cleanup()
3534 msm_vfe_genpd_cleanup(&camss->vfe[i]); in camss_genpd_subdevice_cleanup()
3537 static void camss_genpd_cleanup(struct camss *camss) in camss_genpd_cleanup() argument
3539 if (camss->genpd_num == 1) in camss_genpd_cleanup()
3542 camss_genpd_subdevice_cleanup(camss); in camss_genpd_cleanup()
3544 if (camss->genpd_link) in camss_genpd_cleanup()
3545 device_link_del(camss->genpd_link); in camss_genpd_cleanup()
3547 dev_pm_domain_detach(camss->genpd, true); in camss_genpd_cleanup()
3551 * camss_probe - Probe CAMSS platform device
3552 * @pdev: Pointer to CAMSS platform device
3559 struct camss *camss; in camss_probe() local
3563 camss = devm_kzalloc(dev, sizeof(*camss), GFP_KERNEL); in camss_probe()
3564 if (!camss) in camss_probe()
3567 camss->res = of_device_get_match_data(dev); in camss_probe()
3569 atomic_set(&camss->ref_count, 0); in camss_probe()
3570 camss->dev = dev; in camss_probe()
3571 platform_set_drvdata(pdev, camss); in camss_probe()
3573 camss->csiphy = devm_kcalloc(dev, camss->res->csiphy_num, in camss_probe()
3574 sizeof(*camss->csiphy), GFP_KERNEL); in camss_probe()
3575 if (!camss->csiphy) in camss_probe()
3578 camss->csid = devm_kcalloc(dev, camss->res->csid_num, sizeof(*camss->csid), in camss_probe()
3580 if (!camss->csid) in camss_probe()
3583 if (camss->res->version == CAMSS_8x16 || in camss_probe()
3584 camss->res->version == CAMSS_8x53 || in camss_probe()
3585 camss->res->version == CAMSS_8x96) { in camss_probe()
3586 camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL); in camss_probe()
3587 if (!camss->ispif) in camss_probe()
3591 camss->vfe = devm_kcalloc(dev, camss->res->vfe_num, in camss_probe()
3592 sizeof(*camss->vfe), GFP_KERNEL); in camss_probe()
3593 if (!camss->vfe) in camss_probe()
3596 ret = camss_icc_get(camss); in camss_probe()
3600 ret = camss_configure_pd(camss); in camss_probe()
3606 ret = camss_init_subdevices(camss); in camss_probe()
3614 camss->media_dev.dev = camss->dev; in camss_probe()
3615 strscpy(camss->media_dev.model, "Qualcomm Camera Subsystem", in camss_probe()
3616 sizeof(camss->media_dev.model)); in camss_probe()
3617 camss->media_dev.ops = &camss_media_ops; in camss_probe()
3618 media_device_init(&camss->media_dev); in camss_probe()
3620 camss->v4l2_dev.mdev = &camss->media_dev; in camss_probe()
3621 ret = v4l2_device_register(camss->dev, &camss->v4l2_dev); in camss_probe()
3627 v4l2_async_nf_init(&camss->notifier, &camss->v4l2_dev); in camss_probe()
3631 num_subdevs = camss_of_parse_ports(camss); in camss_probe()
3637 ret = camss_register_entities(camss); in camss_probe()
3641 ret = camss->res->link_entities(camss); in camss_probe()
3645 ret = media_device_register(&camss->media_dev); in camss_probe()
3652 camss->notifier.ops = &camss_subdev_notifier_ops; in camss_probe()
3654 ret = v4l2_async_nf_register(&camss->notifier); in camss_probe()
3662 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_probe()
3673 media_device_unregister(&camss->media_dev); in camss_probe()
3675 camss_unregister_entities(camss); in camss_probe()
3677 v4l2_device_unregister(&camss->v4l2_dev); in camss_probe()
3678 v4l2_async_nf_cleanup(&camss->notifier); in camss_probe()
3681 media_device_cleanup(&camss->media_dev); in camss_probe()
3683 camss_genpd_cleanup(camss); in camss_probe()
3688 void camss_delete(struct camss *camss) in camss_delete() argument
3690 v4l2_device_unregister(&camss->v4l2_dev); in camss_delete()
3691 media_device_unregister(&camss->media_dev); in camss_delete()
3692 media_device_cleanup(&camss->media_dev); in camss_delete()
3694 pm_runtime_disable(camss->dev); in camss_delete()
3698 * camss_remove - Remove CAMSS platform device
3699 * @pdev: Pointer to CAMSS platform device
3705 struct camss *camss = platform_get_drvdata(pdev); in camss_remove() local
3707 v4l2_async_nf_unregister(&camss->notifier); in camss_remove()
3708 v4l2_async_nf_cleanup(&camss->notifier); in camss_remove()
3709 camss_unregister_entities(camss); in camss_remove()
3711 if (atomic_read(&camss->ref_count) == 0) in camss_remove()
3712 camss_delete(camss); in camss_remove()
3714 camss_genpd_cleanup(camss); in camss_remove()
3864 { .compatible = "qcom,msm8916-camss", .data = &msm8916_resources },
3865 { .compatible = "qcom,msm8953-camss", .data = &msm8953_resources },
3866 { .compatible = "qcom,msm8996-camss", .data = &msm8996_resources },
3867 { .compatible = "qcom,sc7280-camss", .data = &sc7280_resources },
3868 { .compatible = "qcom,sc8280xp-camss", .data = &sc8280xp_resources },
3869 { .compatible = "qcom,sdm660-camss", .data = &sdm660_resources },
3870 { .compatible = "qcom,sdm670-camss", .data = &sdm670_resources },
3871 { .compatible = "qcom,sdm845-camss", .data = &sdm845_resources },
3872 { .compatible = "qcom,sm8250-camss", .data = &sm8250_resources },
3873 { .compatible = "qcom,sm8550-camss", .data = &sm8550_resources },
3874 { .compatible = "qcom,x1e80100-camss", .data = &x1e80100_resources },
3882 struct camss *camss = dev_get_drvdata(dev); in camss_runtime_suspend() local
3886 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_suspend()
3887 ret = icc_set_bw(camss->icc_path[i], 0, 0); in camss_runtime_suspend()
3897 struct camss *camss = dev_get_drvdata(dev); in camss_runtime_resume() local
3898 const struct resources_icc *icc_res = camss->res->icc_res; in camss_runtime_resume()
3902 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_resume()
3903 ret = icc_set_bw(camss->icc_path[i], in camss_runtime_resume()
3923 .name = "qcom-camss",
3931 MODULE_ALIAS("platform:qcom-camss");