Lines Matching +full:ahb +full:- +full:lite

1 // SPDX-License-Identifier: GPL-2.0
5 * Qualcomm MSM Camera Subsystem - Core
8 * Copyright (C) 2015-2018 Linaro Ltd.
12 #include <linux/media-bus-format.h>
24 #include <media/media-device.h>
25 #include <media/v4l2-async.h>
26 #include <media/v4l2-device.h>
27 #include <media/v4l2-mc.h>
28 #include <media/v4l2-fwnode.h>
41 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy0_timer" },
57 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy1_timer" },
75 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb",
97 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb",
119 .clock = { "top_ahb", "ahb", "ispif_ahb",
132 "vfe_ahb", "vfe_axi", "ahb" },
159 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb",
182 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb",
205 .clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb",
228 .clock = { "top_ahb", "ahb", "ispif_ahb",
241 .clock = { "top_ahb", "ahb", "ispif_ahb",
267 .clock = { "top_ahb", "ahb", "ispif_ahb",
313 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy0_timer" },
329 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy1_timer" },
345 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy2_timer" },
363 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb",
385 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb",
407 .clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb",
429 .clock = { "top_ahb", "ispif_ahb", "csi3_ahb", "ahb",
451 .clock = { "top_ahb", "ahb", "ispif_ahb",
465 .clock = { "top_ahb", "ahb", "vfe0", "csi_vfe0", "vfe_ahb",
490 .clock = { "top_ahb", "ahb", "vfe1", "csi_vfe1", "vfe_ahb",
517 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy0_timer",
535 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy1_timer",
553 .clock = { "top_ahb", "ispif_ahb", "ahb", "csiphy2_timer",
573 .clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb",
598 .clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb",
623 .clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb",
648 .clock = { "top_ahb", "ispif_ahb", "csi3_ahb", "ahb",
673 .clock = { "top_ahb", "ahb", "ispif_ahb",
687 .clock = { "throttle_axi", "top_ahb", "ahb", "vfe0",
715 .clock = { "throttle_axi", "top_ahb", "ahb", "vfe1",
744 .regulators = { "vdda-phy", "vdda-pll" },
761 .regulators = { "vdda-phy", "vdda-pll" },
778 .regulators = { "vdda-phy", "vdda-pll" },
899 /* VFE-lite */
1013 .regulators = { "vdda-phy", "vdda-pll" },
1038 .regulators = { "vdda-phy", "vdda-pll" },
1063 .regulators = { "vdda-phy", "vdda-pll" },
1145 /* VFE-lite */
1175 .regulators = { "vdda-phy", "vdda-pll" },
1188 .regulators = { "vdda-phy", "vdda-pll" },
1201 .regulators = { "vdda-phy", "vdda-pll" },
1214 .regulators = { "vdda-phy", "vdda-pll" },
1227 .regulators = { "vdda-phy", "vdda-pll" },
1240 .regulators = { "vdda-phy", "vdda-pll" },
1377 /* VFE2 (lite) */
1401 /* VFE3 (lite) */
1453 .regulators = { "vdda-phy", "vdda-pll" },
1467 .regulators = { "vdda-phy", "vdda-pll" },
1481 .regulators = { "vdda-phy", "vdda-pll" },
1495 .regulators = { "vdda-phy", "vdda-pll" },
1509 .regulators = { "vdda-phy", "vdda-pll" },
1700 /* VFE3 (lite) */
1722 /* VFE4 (lite) */
1748 .name = "ahb",
1817 .regulators = { "vdda-phy", "vdda-pll" },
1833 .regulators = { "vdda-phy", "vdda-pll" },
1849 .regulators = { "vdda-phy", "vdda-pll" },
1865 .regulators = { "vdda-phy", "vdda-pll" },
1881 .regulators = { "vdda-phy", "vdda-pll" },
1897 .regulators = { "vdda-phy", "vdda-pll" },
1913 .regulators = { "vdda-phy", "vdda-pll" },
1929 .regulators = { "vdda-phy", "vdda-pll" },
2130 .regulators = { "vdda-phy", "vdda-pll" },
2143 .regulators = { "vdda-phy", "vdda-pll" },
2156 .regulators = { "vdda-phy", "vdda-pll" },
2169 .regulators = { "vdda-phy", "vdda-pll" },
2182 .regulators = { "vdda-phy", "vdda-pll" },
2195 .regulators = { "vdda-phy", "vdda-pll" },
2208 .regulators = { "vdda-phy", "vdda-pll" },
2221 .regulators = { "vdda-phy", "vdda-pll" },
2389 /* VFE3 lite */
2411 /* VFE4 lite */
2437 .name = "ahb",
2449 * camss_add_clock_margin - Add margin to clock frequency rate
2462 * camss_enable_clocks - Enable multiple clocks
2486 for (i--; i >= 0; i--) in camss_enable_clocks()
2493 * camss_disable_clocks - Disable multiple clocks
2501 for (i = nclocks - 1; i >= 0; i--) in camss_disable_clocks()
2506 * camss_find_sensor_pad - Find the media pad via which the sensor is linked
2516 pad = &entity->pads[0]; in camss_find_sensor_pad()
2517 if (!(pad->flags & MEDIA_PAD_FL_SINK)) in camss_find_sensor_pad()
2521 if (!pad || !is_media_entity_v4l2_subdev(pad->entity)) in camss_find_sensor_pad()
2524 entity = pad->entity; in camss_find_sensor_pad()
2526 if (entity->function == MEDIA_ENT_F_CAM_SENSOR) in camss_find_sensor_pad()
2532 * camss_get_link_freq - Get link frequency from sensor
2546 return -ENODEV; in camss_get_link_freq()
2552 * camss_get_pixel_clock - Get pixel clock rate from sensor
2566 return -ENODEV; in camss_get_pixel_clock()
2568 subdev = media_entity_to_v4l2_subdev(sensor_pad->entity); in camss_get_pixel_clock()
2570 ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_PIXEL_RATE); in camss_get_pixel_clock()
2573 return -EINVAL; in camss_get_pixel_clock()
2584 if (id < camss->res->vfe_num) { in camss_pm_domain_on()
2585 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_on()
2587 ret = vfe->res->hw_ops->pm_domain_on(vfe); in camss_pm_domain_on()
2595 if (id < camss->res->vfe_num) { in camss_pm_domain_off()
2596 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_off()
2598 vfe->res->hw_ops->pm_domain_off(vfe); in camss_pm_domain_off()
2604 int ret = -EINVAL; in vfe_parent_dev_ops_get()
2606 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_get()
2607 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_get()
2617 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_put()
2618 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_put()
2629 if (id < camss->res->vfe_num) { in vfe_parent_dev_ops_get_base_address()
2630 struct vfe_device *vfe = &camss->vfe[id]; in vfe_parent_dev_ops_get_base_address()
2632 return vfe->base; in vfe_parent_dev_ops_get_base_address()
2645 * camss_of_parse_endpoint_node - Parse port endpoint node
2656 struct csiphy_lanes_cfg *lncfg = &csd->interface.csi2.lane_cfg; in camss_of_parse_endpoint_node()
2666 csd->interface.csiphy_id = vep.base.port; in camss_of_parse_endpoint_node()
2669 lncfg->clk.pos = mipi_csi2->clock_lane; in camss_of_parse_endpoint_node()
2670 lncfg->clk.pol = mipi_csi2->lane_polarities[0]; in camss_of_parse_endpoint_node()
2671 lncfg->num_data = mipi_csi2->num_data_lanes; in camss_of_parse_endpoint_node()
2673 lncfg->data = devm_kcalloc(dev, in camss_of_parse_endpoint_node()
2674 lncfg->num_data, sizeof(*lncfg->data), in camss_of_parse_endpoint_node()
2676 if (!lncfg->data) in camss_of_parse_endpoint_node()
2677 return -ENOMEM; in camss_of_parse_endpoint_node()
2679 for (i = 0; i < lncfg->num_data; i++) { in camss_of_parse_endpoint_node()
2680 lncfg->data[i].pos = mipi_csi2->data_lanes[i]; in camss_of_parse_endpoint_node()
2681 lncfg->data[i].pol = mipi_csi2->lane_polarities[i + 1]; in camss_of_parse_endpoint_node()
2688 * camss_of_parse_ports - Parse ports node
2696 struct device *dev = camss->dev; in camss_of_parse_ports()
2701 for_each_endpoint_of_node(dev->of_node, node) { in camss_of_parse_ports()
2710 ret = -EINVAL; in camss_of_parse_ports()
2714 csd = v4l2_async_nf_add_fwnode(&camss->notifier, in camss_of_parse_ports()
2738 * camss_init_subdevices - Initialize subdev structures and resources
2745 struct platform_device *pdev = to_platform_device(camss->dev); in camss_init_subdevices()
2746 const struct camss_resources *res = camss->res; in camss_init_subdevices()
2750 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_init_subdevices()
2751 ret = msm_csiphy_subdev_init(camss, &camss->csiphy[i], in camss_init_subdevices()
2752 &res->csiphy_res[i], i); in camss_init_subdevices()
2754 dev_err(camss->dev, in camss_init_subdevices()
2755 "Failed to init csiphy%d sub-device: %d\n", in camss_init_subdevices()
2762 for (i = 0; i < camss->res->vfe_num; i++) { in camss_init_subdevices()
2763 ret = msm_vfe_subdev_init(camss, &camss->vfe[i], in camss_init_subdevices()
2764 &res->vfe_res[i], i); in camss_init_subdevices()
2766 dev_err(camss->dev, in camss_init_subdevices()
2767 "Fail to init vfe%d sub-device: %d\n", i, ret); in camss_init_subdevices()
2773 if (res->csid_wrapper_res) { in camss_init_subdevices()
2774 char *reg = res->csid_wrapper_res->reg; in camss_init_subdevices()
2780 camss->csid_wrapper_base = base; in camss_init_subdevices()
2783 for (i = 0; i < camss->res->csid_num; i++) { in camss_init_subdevices()
2784 ret = msm_csid_subdev_init(camss, &camss->csid[i], in camss_init_subdevices()
2785 &res->csid_res[i], i); in camss_init_subdevices()
2787 dev_err(camss->dev, in camss_init_subdevices()
2788 "Failed to init csid%d sub-device: %d\n", in camss_init_subdevices()
2794 ret = msm_ispif_subdev_init(camss, res->ispif_res); in camss_init_subdevices()
2796 dev_err(camss->dev, "Failed to init ispif sub-device: %d\n", in camss_init_subdevices()
2805 * camss_link_entities - Register subdev nodes and create links
2806 * camss_link_err - print error in case link creation fails
2815 dev_err(camss->dev, in camss_link_err()
2816 "Failed to link %s->%s entities: %d\n", in camss_link_err()
2823 * camss_link_entities - Register subdev nodes and create links
2833 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_link_entities()
2834 for (j = 0; j < camss->res->csid_num; j++) { in camss_link_entities()
2835 ret = media_create_pad_link(&camss->csiphy[i].subdev.entity, in camss_link_entities()
2837 &camss->csid[j].subdev.entity, in camss_link_entities()
2842 camss->csiphy[i].subdev.entity.name, in camss_link_entities()
2843 camss->csid[j].subdev.entity.name, in camss_link_entities()
2850 if (camss->ispif) { in camss_link_entities()
2851 for (i = 0; i < camss->res->csid_num; i++) { in camss_link_entities()
2852 for (j = 0; j < camss->ispif->line_num; j++) { in camss_link_entities()
2853 ret = media_create_pad_link(&camss->csid[i].subdev.entity, in camss_link_entities()
2855 &camss->ispif->line[j].subdev.entity, in camss_link_entities()
2860 camss->csid[i].subdev.entity.name, in camss_link_entities()
2861 camss->ispif->line[j].subdev.entity.name, in camss_link_entities()
2868 for (i = 0; i < camss->ispif->line_num; i++) in camss_link_entities()
2869 for (k = 0; k < camss->res->vfe_num; k++) in camss_link_entities()
2870 for (j = 0; j < camss->vfe[k].res->line_num; j++) { in camss_link_entities()
2871 struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; in camss_link_entities()
2872 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_link_entities()
2874 ret = media_create_pad_link(&ispif->entity, in camss_link_entities()
2876 &vfe->entity, in camss_link_entities()
2880 camss_link_err(camss, ispif->entity.name, in camss_link_entities()
2881 vfe->entity.name, in camss_link_entities()
2887 for (i = 0; i < camss->res->csid_num; i++) in camss_link_entities()
2888 for (k = 0; k < camss->res->vfe_num; k++) in camss_link_entities()
2889 for (j = 0; j < camss->vfe[k].res->line_num; j++) { in camss_link_entities()
2890 struct v4l2_subdev *csid = &camss->csid[i].subdev; in camss_link_entities()
2891 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_link_entities()
2893 ret = media_create_pad_link(&csid->entity, in camss_link_entities()
2895 &vfe->entity, in camss_link_entities()
2899 camss_link_err(camss, csid->entity.name, in camss_link_entities()
2900 vfe->entity.name, in camss_link_entities()
2914 if (hw_id < camss->res->csid_num) { in camss_reg_update()
2915 csid = &camss->csid[hw_id]; in camss_reg_update()
2917 csid->res->hw_ops->reg_update(csid, port_id, is_clear); in camss_reg_update()
2925 if (hw_id < camss->res->vfe_num) { in camss_buf_done()
2926 vfe = &camss->vfe[hw_id]; in camss_buf_done()
2928 vfe->res->hw_ops->vfe_buf_done(vfe, port_id); in camss_buf_done()
2933 * camss_register_entities - Register subdev nodes and create links
2943 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_register_entities()
2944 ret = msm_csiphy_register_entity(&camss->csiphy[i], in camss_register_entities()
2945 &camss->v4l2_dev); in camss_register_entities()
2947 dev_err(camss->dev, in camss_register_entities()
2954 for (i = 0; i < camss->res->csid_num; i++) { in camss_register_entities()
2955 ret = msm_csid_register_entity(&camss->csid[i], in camss_register_entities()
2956 &camss->v4l2_dev); in camss_register_entities()
2958 dev_err(camss->dev, in camss_register_entities()
2965 ret = msm_ispif_register_entities(camss->ispif, in camss_register_entities()
2966 &camss->v4l2_dev); in camss_register_entities()
2968 dev_err(camss->dev, "Failed to register ispif entities: %d\n", ret); in camss_register_entities()
2972 for (i = 0; i < camss->res->vfe_num; i++) { in camss_register_entities()
2973 ret = msm_vfe_register_entities(&camss->vfe[i], in camss_register_entities()
2974 &camss->v4l2_dev); in camss_register_entities()
2976 dev_err(camss->dev, in camss_register_entities()
2986 for (i--; i >= 0; i--) in camss_register_entities()
2987 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_register_entities()
2990 msm_ispif_unregister_entities(camss->ispif); in camss_register_entities()
2992 i = camss->res->csid_num; in camss_register_entities()
2994 for (i--; i >= 0; i--) in camss_register_entities()
2995 msm_csid_unregister_entity(&camss->csid[i]); in camss_register_entities()
2997 i = camss->res->csiphy_num; in camss_register_entities()
2999 for (i--; i >= 0; i--) in camss_register_entities()
3000 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_register_entities()
3006 * camss_unregister_entities - Unregister subdev nodes
3015 for (i = 0; i < camss->res->csiphy_num; i++) in camss_unregister_entities()
3016 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_unregister_entities()
3018 for (i = 0; i < camss->res->csid_num; i++) in camss_unregister_entities()
3019 msm_csid_unregister_entity(&camss->csid[i]); in camss_unregister_entities()
3021 msm_ispif_unregister_entities(camss->ispif); in camss_unregister_entities()
3023 for (i = 0; i < camss->res->vfe_num; i++) in camss_unregister_entities()
3024 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_unregister_entities()
3034 u8 id = csd->interface.csiphy_id; in camss_subdev_notifier_bound()
3035 struct csiphy_device *csiphy = &camss->csiphy[id]; in camss_subdev_notifier_bound()
3037 csiphy->cfg.csi2 = &csd->interface.csi2; in camss_subdev_notifier_bound()
3038 subdev->host_priv = csiphy; in camss_subdev_notifier_bound()
3046 struct v4l2_device *v4l2_dev = &camss->v4l2_dev; in camss_subdev_notifier_complete()
3050 list_for_each_entry(sd, &v4l2_dev->subdevs, list) { in camss_subdev_notifier_complete()
3051 if (sd->host_priv) { in camss_subdev_notifier_complete()
3052 struct media_entity *sensor = &sd->entity; in camss_subdev_notifier_complete()
3054 (struct csiphy_device *) sd->host_priv; in camss_subdev_notifier_complete()
3055 struct media_entity *input = &csiphy->subdev.entity; in camss_subdev_notifier_complete()
3058 for (i = 0; i < sensor->num_pads; i++) { in camss_subdev_notifier_complete()
3059 if (sensor->pads[i].flags & MEDIA_PAD_FL_SOURCE) in camss_subdev_notifier_complete()
3062 if (i == sensor->num_pads) { in camss_subdev_notifier_complete()
3063 dev_err(camss->dev, in camss_subdev_notifier_complete()
3065 return -EINVAL; in camss_subdev_notifier_complete()
3072 camss_link_err(camss, sensor->name, in camss_subdev_notifier_complete()
3073 input->name, in camss_subdev_notifier_complete()
3080 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_subdev_notifier_complete()
3084 return media_device_register(&camss->media_dev); in camss_subdev_notifier_complete()
3098 const struct camss_resources *res = camss->res; in camss_configure_pd()
3099 struct device *dev = camss->dev; in camss_configure_pd()
3104 camss->genpd_num = of_count_phandle_with_args(dev->of_node, in camss_configure_pd()
3105 "power-domains", in camss_configure_pd()
3106 "#power-domain-cells"); in camss_configure_pd()
3107 if (camss->genpd_num < 0) { in camss_configure_pd()
3109 return camss->genpd_num; in camss_configure_pd()
3117 if (camss->genpd_num == 1) in camss_configure_pd()
3120 /* count the # of VFEs which have flagged power-domain */ in camss_configure_pd()
3121 for (vfepd_num = i = 0; i < camss->res->vfe_num; i++) { in camss_configure_pd()
3122 if (res->vfe_res[i].vfe.has_pd) in camss_configure_pd()
3127 * If the number of power-domains is greater than the number of VFEs in camss_configure_pd()
3128 * then the additional power-domain is for the entire CAMSS block. in camss_configure_pd()
3130 if (!(camss->genpd_num > vfepd_num)) in camss_configure_pd()
3134 * If a power-domain name is defined try to use it. in camss_configure_pd()
3138 if (camss->res->pd_name) { in camss_configure_pd()
3139 camss->genpd = dev_pm_domain_attach_by_name(camss->dev, in camss_configure_pd()
3140 camss->res->pd_name); in camss_configure_pd()
3141 if (IS_ERR(camss->genpd)) in camss_configure_pd()
3142 return PTR_ERR(camss->genpd); in camss_configure_pd()
3145 if (!camss->genpd) { in camss_configure_pd()
3148 * item in the power-domain list. in camss_configure_pd()
3150 camss->genpd = dev_pm_domain_attach_by_id(camss->dev, in camss_configure_pd()
3151 camss->genpd_num - 1); in camss_configure_pd()
3152 if (IS_ERR(camss->genpd)) in camss_configure_pd()
3153 return PTR_ERR(camss->genpd); in camss_configure_pd()
3156 if (!camss->genpd) in camss_configure_pd()
3157 return -ENODEV; in camss_configure_pd()
3159 camss->genpd_link = device_link_add(camss->dev, camss->genpd, in camss_configure_pd()
3162 if (!camss->genpd_link) { in camss_configure_pd()
3163 ret = -EINVAL; in camss_configure_pd()
3170 dev_pm_domain_detach(camss->genpd, true); in camss_configure_pd()
3180 icc_res = camss->res->icc_res; in camss_icc_get()
3182 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_icc_get()
3183 camss->icc_path[i] = devm_of_icc_get(camss->dev, in camss_icc_get()
3185 if (IS_ERR(camss->icc_path[i])) in camss_icc_get()
3186 return PTR_ERR(camss->icc_path[i]); in camss_icc_get()
3196 for (i = 0; i < camss->res->vfe_num; i++) in camss_genpd_subdevice_cleanup()
3197 msm_vfe_genpd_cleanup(&camss->vfe[i]); in camss_genpd_subdevice_cleanup()
3202 if (camss->genpd_num == 1) in camss_genpd_cleanup()
3207 if (camss->genpd_link) in camss_genpd_cleanup()
3208 device_link_del(camss->genpd_link); in camss_genpd_cleanup()
3210 dev_pm_domain_detach(camss->genpd, true); in camss_genpd_cleanup()
3214 * camss_probe - Probe CAMSS platform device
3221 struct device *dev = &pdev->dev; in camss_probe()
3228 return -ENOMEM; in camss_probe()
3230 camss->res = of_device_get_match_data(dev); in camss_probe()
3232 atomic_set(&camss->ref_count, 0); in camss_probe()
3233 camss->dev = dev; in camss_probe()
3236 camss->csiphy = devm_kcalloc(dev, camss->res->csiphy_num, in camss_probe()
3237 sizeof(*camss->csiphy), GFP_KERNEL); in camss_probe()
3238 if (!camss->csiphy) in camss_probe()
3239 return -ENOMEM; in camss_probe()
3241 camss->csid = devm_kcalloc(dev, camss->res->csid_num, sizeof(*camss->csid), in camss_probe()
3243 if (!camss->csid) in camss_probe()
3244 return -ENOMEM; in camss_probe()
3246 if (camss->res->version == CAMSS_8x16 || in camss_probe()
3247 camss->res->version == CAMSS_8x53 || in camss_probe()
3248 camss->res->version == CAMSS_8x96) { in camss_probe()
3249 camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL); in camss_probe()
3250 if (!camss->ispif) in camss_probe()
3251 return -ENOMEM; in camss_probe()
3254 camss->vfe = devm_kcalloc(dev, camss->res->vfe_num, in camss_probe()
3255 sizeof(*camss->vfe), GFP_KERNEL); in camss_probe()
3256 if (!camss->vfe) in camss_probe()
3257 return -ENOMEM; in camss_probe()
3277 camss->media_dev.dev = camss->dev; in camss_probe()
3278 strscpy(camss->media_dev.model, "Qualcomm Camera Subsystem", in camss_probe()
3279 sizeof(camss->media_dev.model)); in camss_probe()
3280 camss->media_dev.ops = &camss_media_ops; in camss_probe()
3281 media_device_init(&camss->media_dev); in camss_probe()
3283 camss->v4l2_dev.mdev = &camss->media_dev; in camss_probe()
3284 ret = v4l2_device_register(camss->dev, &camss->v4l2_dev); in camss_probe()
3290 v4l2_async_nf_init(&camss->notifier, &camss->v4l2_dev); in camss_probe()
3304 ret = camss->res->link_entities(camss); in camss_probe()
3309 camss->notifier.ops = &camss_subdev_notifier_ops; in camss_probe()
3311 ret = v4l2_async_nf_register(&camss->notifier); in camss_probe()
3319 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_probe()
3326 ret = media_device_register(&camss->media_dev); in camss_probe()
3339 v4l2_device_unregister(&camss->v4l2_dev); in camss_probe()
3340 v4l2_async_nf_cleanup(&camss->notifier); in camss_probe()
3350 v4l2_device_unregister(&camss->v4l2_dev); in camss_delete()
3351 media_device_unregister(&camss->media_dev); in camss_delete()
3352 media_device_cleanup(&camss->media_dev); in camss_delete()
3354 pm_runtime_disable(camss->dev); in camss_delete()
3358 * camss_remove - Remove CAMSS platform device
3367 v4l2_async_nf_unregister(&camss->notifier); in camss_remove()
3368 v4l2_async_nf_cleanup(&camss->notifier); in camss_remove()
3371 if (atomic_read(&camss->ref_count) == 0) in camss_remove()
3509 { .compatible = "qcom,msm8916-camss", .data = &msm8916_resources },
3510 { .compatible = "qcom,msm8953-camss", .data = &msm8953_resources },
3511 { .compatible = "qcom,msm8996-camss", .data = &msm8996_resources },
3512 { .compatible = "qcom,sc7280-camss", .data = &sc7280_resources },
3513 { .compatible = "qcom,sc8280xp-camss", .data = &sc8280xp_resources },
3514 { .compatible = "qcom,sdm660-camss", .data = &sdm660_resources },
3515 { .compatible = "qcom,sdm670-camss", .data = &sdm670_resources },
3516 { .compatible = "qcom,sdm845-camss", .data = &sdm845_resources },
3517 { .compatible = "qcom,sm8250-camss", .data = &sm8250_resources },
3518 { .compatible = "qcom,sm8550-camss", .data = &sm8550_resources },
3530 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_suspend()
3531 ret = icc_set_bw(camss->icc_path[i], 0, 0); in camss_runtime_suspend()
3542 const struct resources_icc *icc_res = camss->res->icc_res; in camss_runtime_resume()
3546 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_resume()
3547 ret = icc_set_bw(camss->icc_path[i], in camss_runtime_resume()
3567 .name = "qcom-camss",
3575 MODULE_ALIAS("platform:qcom-camss");