Lines Matching full:camss

3  * camss.c
30 #include "camss.h"
1079 int camss_pm_domain_on(struct camss *camss, int id) in camss_pm_domain_on() argument
1083 if (id < camss->res->vfe_num) { in camss_pm_domain_on()
1084 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_on()
1092 void camss_pm_domain_off(struct camss *camss, int id) in camss_pm_domain_off() argument
1094 if (id < camss->res->vfe_num) { in camss_pm_domain_off()
1095 struct vfe_device *vfe = &camss->vfe[id]; in camss_pm_domain_off()
1148 static int camss_of_parse_ports(struct camss *camss) in camss_of_parse_ports() argument
1150 struct device *dev = camss->dev; in camss_of_parse_ports()
1168 csd = v4l2_async_nf_add_fwnode(&camss->notifier, in camss_of_parse_ports()
1193 * @camss: CAMSS device
1197 static int camss_init_subdevices(struct camss *camss) in camss_init_subdevices() argument
1199 const struct camss_resources *res = camss->res; in camss_init_subdevices()
1203 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_init_subdevices()
1204 ret = msm_csiphy_subdev_init(camss, &camss->csiphy[i], in camss_init_subdevices()
1207 dev_err(camss->dev, in camss_init_subdevices()
1215 for (i = 0; i < camss->res->vfe_num; i++) { in camss_init_subdevices()
1216 ret = msm_vfe_subdev_init(camss, &camss->vfe[i], in camss_init_subdevices()
1219 dev_err(camss->dev, in camss_init_subdevices()
1225 for (i = 0; i < camss->res->csid_num; i++) { in camss_init_subdevices()
1226 ret = msm_csid_subdev_init(camss, &camss->csid[i], in camss_init_subdevices()
1229 dev_err(camss->dev, in camss_init_subdevices()
1236 ret = msm_ispif_subdev_init(camss, res->ispif_res); in camss_init_subdevices()
1238 dev_err(camss->dev, "Failed to init ispif sub-device: %d\n", in camss_init_subdevices()
1248 * @camss: CAMSS device
1252 static int camss_register_entities(struct camss *camss) in camss_register_entities() argument
1257 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_register_entities()
1258 ret = msm_csiphy_register_entity(&camss->csiphy[i], in camss_register_entities()
1259 &camss->v4l2_dev); in camss_register_entities()
1261 dev_err(camss->dev, in camss_register_entities()
1268 for (i = 0; i < camss->res->csid_num; i++) { in camss_register_entities()
1269 ret = msm_csid_register_entity(&camss->csid[i], in camss_register_entities()
1270 &camss->v4l2_dev); in camss_register_entities()
1272 dev_err(camss->dev, in camss_register_entities()
1279 ret = msm_ispif_register_entities(camss->ispif, in camss_register_entities()
1280 &camss->v4l2_dev); in camss_register_entities()
1282 dev_err(camss->dev, "Failed to register ispif entities: %d\n", in camss_register_entities()
1287 for (i = 0; i < camss->res->vfe_num; i++) { in camss_register_entities()
1288 ret = msm_vfe_register_entities(&camss->vfe[i], in camss_register_entities()
1289 &camss->v4l2_dev); in camss_register_entities()
1291 dev_err(camss->dev, in camss_register_entities()
1298 for (i = 0; i < camss->res->csiphy_num; i++) { in camss_register_entities()
1299 for (j = 0; j < camss->res->csid_num; j++) { in camss_register_entities()
1301 &camss->csiphy[i].subdev.entity, in camss_register_entities()
1303 &camss->csid[j].subdev.entity, in camss_register_entities()
1307 dev_err(camss->dev, in camss_register_entities()
1309 camss->csiphy[i].subdev.entity.name, in camss_register_entities()
1310 camss->csid[j].subdev.entity.name, in camss_register_entities()
1317 if (camss->ispif) { in camss_register_entities()
1318 for (i = 0; i < camss->res->csid_num; i++) { in camss_register_entities()
1319 for (j = 0; j < camss->ispif->line_num; j++) { in camss_register_entities()
1321 &camss->csid[i].subdev.entity, in camss_register_entities()
1323 &camss->ispif->line[j].subdev.entity, in camss_register_entities()
1327 dev_err(camss->dev, in camss_register_entities()
1329 camss->csid[i].subdev.entity.name, in camss_register_entities()
1330 camss->ispif->line[j].subdev.entity.name, in camss_register_entities()
1337 for (i = 0; i < camss->ispif->line_num; i++) in camss_register_entities()
1338 for (k = 0; k < camss->res->vfe_num; k++) in camss_register_entities()
1339 for (j = 0; j < camss->vfe[k].line_num; j++) { in camss_register_entities()
1340 struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; in camss_register_entities()
1341 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_register_entities()
1349 dev_err(camss->dev, in camss_register_entities()
1358 for (i = 0; i < camss->res->csid_num; i++) in camss_register_entities()
1359 for (k = 0; k < camss->res->vfe_num; k++) in camss_register_entities()
1360 for (j = 0; j < camss->vfe[k].line_num; j++) { in camss_register_entities()
1361 struct v4l2_subdev *csid = &camss->csid[i].subdev; in camss_register_entities()
1362 struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; in camss_register_entities()
1370 dev_err(camss->dev, in camss_register_entities()
1383 i = camss->res->vfe_num; in camss_register_entities()
1386 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_register_entities()
1389 msm_ispif_unregister_entities(camss->ispif); in camss_register_entities()
1391 i = camss->res->csid_num; in camss_register_entities()
1394 msm_csid_unregister_entity(&camss->csid[i]); in camss_register_entities()
1396 i = camss->res->csiphy_num; in camss_register_entities()
1399 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_register_entities()
1406 * @camss: CAMSS device
1410 static void camss_unregister_entities(struct camss *camss) in camss_unregister_entities() argument
1414 for (i = 0; i < camss->res->csiphy_num; i++) in camss_unregister_entities()
1415 msm_csiphy_unregister_entity(&camss->csiphy[i]); in camss_unregister_entities()
1417 for (i = 0; i < camss->res->csid_num; i++) in camss_unregister_entities()
1418 msm_csid_unregister_entity(&camss->csid[i]); in camss_unregister_entities()
1420 msm_ispif_unregister_entities(camss->ispif); in camss_unregister_entities()
1422 for (i = 0; i < camss->res->vfe_num; i++) in camss_unregister_entities()
1423 msm_vfe_unregister_entities(&camss->vfe[i]); in camss_unregister_entities()
1430 struct camss *camss = container_of(async, struct camss, notifier); in camss_subdev_notifier_bound() local
1434 struct csiphy_device *csiphy = &camss->csiphy[id]; in camss_subdev_notifier_bound()
1444 struct camss *camss = container_of(async, struct camss, notifier); in camss_subdev_notifier_complete() local
1445 struct v4l2_device *v4l2_dev = &camss->v4l2_dev; in camss_subdev_notifier_complete()
1462 dev_err(camss->dev, in camss_subdev_notifier_complete()
1471 dev_err(camss->dev, in camss_subdev_notifier_complete()
1479 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_subdev_notifier_complete()
1483 return media_device_register(&camss->media_dev); in camss_subdev_notifier_complete()
1495 static int camss_configure_pd(struct camss *camss) in camss_configure_pd() argument
1497 const struct camss_resources *res = camss->res; in camss_configure_pd()
1498 struct device *dev = camss->dev; in camss_configure_pd()
1503 camss->genpd_num = of_count_phandle_with_args(dev->of_node, in camss_configure_pd()
1506 if (camss->genpd_num < 0) { in camss_configure_pd()
1507 dev_err(dev, "Power domains are not defined for camss\n"); in camss_configure_pd()
1508 return camss->genpd_num; in camss_configure_pd()
1514 * option to attach it again, this is the case for CAMSS on MSM8916. in camss_configure_pd()
1516 if (camss->genpd_num == 1) in camss_configure_pd()
1520 for (vfepd_num = i = 0; i < camss->res->vfe_num; i++) { in camss_configure_pd()
1527 * then the additional power-domain is for the entire CAMSS block. in camss_configure_pd()
1529 if (!(camss->genpd_num > vfepd_num)) in camss_configure_pd()
1537 if (camss->res->pd_name) { in camss_configure_pd()
1538 camss->genpd = dev_pm_domain_attach_by_name(camss->dev, in camss_configure_pd()
1539 camss->res->pd_name); in camss_configure_pd()
1540 if (IS_ERR(camss->genpd)) { in camss_configure_pd()
1541 ret = PTR_ERR(camss->genpd); in camss_configure_pd()
1546 if (!camss->genpd) { in camss_configure_pd()
1551 camss->genpd = dev_pm_domain_attach_by_id(camss->dev, in camss_configure_pd()
1552 camss->genpd_num - 1); in camss_configure_pd()
1554 if (IS_ERR_OR_NULL(camss->genpd)) { in camss_configure_pd()
1555 if (!camss->genpd) in camss_configure_pd()
1558 ret = PTR_ERR(camss->genpd); in camss_configure_pd()
1561 camss->genpd_link = device_link_add(camss->dev, camss->genpd, in camss_configure_pd()
1564 if (!camss->genpd_link) { in camss_configure_pd()
1572 dev_pm_domain_detach(camss->genpd, true); in camss_configure_pd()
1577 static int camss_icc_get(struct camss *camss) in camss_icc_get() argument
1582 icc_res = camss->res->icc_res; in camss_icc_get()
1584 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_icc_get()
1585 camss->icc_path[i] = devm_of_icc_get(camss->dev, in camss_icc_get()
1587 if (IS_ERR(camss->icc_path[i])) in camss_icc_get()
1588 return PTR_ERR(camss->icc_path[i]); in camss_icc_get()
1594 static void camss_genpd_subdevice_cleanup(struct camss *camss) in camss_genpd_subdevice_cleanup() argument
1598 for (i = 0; i < camss->res->vfe_num; i++) in camss_genpd_subdevice_cleanup()
1599 msm_vfe_genpd_cleanup(&camss->vfe[i]); in camss_genpd_subdevice_cleanup()
1602 static void camss_genpd_cleanup(struct camss *camss) in camss_genpd_cleanup() argument
1604 if (camss->genpd_num == 1) in camss_genpd_cleanup()
1607 camss_genpd_subdevice_cleanup(camss); in camss_genpd_cleanup()
1609 if (camss->genpd_link) in camss_genpd_cleanup()
1610 device_link_del(camss->genpd_link); in camss_genpd_cleanup()
1612 dev_pm_domain_detach(camss->genpd, true); in camss_genpd_cleanup()
1616 * camss_probe - Probe CAMSS platform device
1617 * @pdev: Pointer to CAMSS platform device
1624 struct camss *camss; in camss_probe() local
1628 camss = devm_kzalloc(dev, sizeof(*camss), GFP_KERNEL); in camss_probe()
1629 if (!camss) in camss_probe()
1632 camss->res = of_device_get_match_data(dev); in camss_probe()
1634 atomic_set(&camss->ref_count, 0); in camss_probe()
1635 camss->dev = dev; in camss_probe()
1636 platform_set_drvdata(pdev, camss); in camss_probe()
1638 camss->csiphy = devm_kcalloc(dev, camss->res->csiphy_num, in camss_probe()
1639 sizeof(*camss->csiphy), GFP_KERNEL); in camss_probe()
1640 if (!camss->csiphy) in camss_probe()
1643 camss->csid = devm_kcalloc(dev, camss->res->csid_num, sizeof(*camss->csid), in camss_probe()
1645 if (!camss->csid) in camss_probe()
1648 if (camss->res->version == CAMSS_8x16 || in camss_probe()
1649 camss->res->version == CAMSS_8x96) { in camss_probe()
1650 camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL); in camss_probe()
1651 if (!camss->ispif) in camss_probe()
1655 camss->vfe = devm_kcalloc(dev, camss->res->vfe_num, in camss_probe()
1656 sizeof(*camss->vfe), GFP_KERNEL); in camss_probe()
1657 if (!camss->vfe) in camss_probe()
1660 ret = camss_icc_get(camss); in camss_probe()
1664 ret = camss_configure_pd(camss); in camss_probe()
1670 ret = camss_init_subdevices(camss); in camss_probe()
1678 camss->media_dev.dev = camss->dev; in camss_probe()
1679 strscpy(camss->media_dev.model, "Qualcomm Camera Subsystem", in camss_probe()
1680 sizeof(camss->media_dev.model)); in camss_probe()
1681 camss->media_dev.ops = &camss_media_ops; in camss_probe()
1682 media_device_init(&camss->media_dev); in camss_probe()
1684 camss->v4l2_dev.mdev = &camss->media_dev; in camss_probe()
1685 ret = v4l2_device_register(camss->dev, &camss->v4l2_dev); in camss_probe()
1691 v4l2_async_nf_init(&camss->notifier, &camss->v4l2_dev); in camss_probe()
1693 num_subdevs = camss_of_parse_ports(camss); in camss_probe()
1699 ret = camss_register_entities(camss); in camss_probe()
1704 camss->notifier.ops = &camss_subdev_notifier_ops; in camss_probe()
1706 ret = v4l2_async_nf_register(&camss->notifier); in camss_probe()
1714 ret = v4l2_device_register_subdev_nodes(&camss->v4l2_dev); in camss_probe()
1721 ret = media_device_register(&camss->media_dev); in camss_probe()
1734 camss_unregister_entities(camss); in camss_probe()
1736 v4l2_device_unregister(&camss->v4l2_dev); in camss_probe()
1737 v4l2_async_nf_cleanup(&camss->notifier); in camss_probe()
1739 camss_genpd_cleanup(camss); in camss_probe()
1744 void camss_delete(struct camss *camss) in camss_delete() argument
1746 v4l2_device_unregister(&camss->v4l2_dev); in camss_delete()
1747 media_device_unregister(&camss->media_dev); in camss_delete()
1748 media_device_cleanup(&camss->media_dev); in camss_delete()
1750 pm_runtime_disable(camss->dev); in camss_delete()
1754 * camss_remove - Remove CAMSS platform device
1755 * @pdev: Pointer to CAMSS platform device
1761 struct camss *camss = platform_get_drvdata(pdev); in camss_remove() local
1763 v4l2_async_nf_unregister(&camss->notifier); in camss_remove()
1764 v4l2_async_nf_cleanup(&camss->notifier); in camss_remove()
1765 camss_unregister_entities(camss); in camss_remove()
1767 if (atomic_read(&camss->ref_count) == 0) in camss_remove()
1768 camss_delete(camss); in camss_remove()
1770 camss_genpd_cleanup(camss); in camss_remove()
1830 { .compatible = "qcom,msm8916-camss", .data = &msm8916_resources },
1831 { .compatible = "qcom,msm8996-camss", .data = &msm8996_resources },
1832 { .compatible = "qcom,sdm660-camss", .data = &sdm660_resources },
1833 { .compatible = "qcom,sdm845-camss", .data = &sdm845_resources },
1834 { .compatible = "qcom,sm8250-camss", .data = &sm8250_resources },
1842 struct camss *camss = dev_get_drvdata(dev); in camss_runtime_suspend() local
1846 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_suspend()
1847 ret = icc_set_bw(camss->icc_path[i], 0, 0); in camss_runtime_suspend()
1857 struct camss *camss = dev_get_drvdata(dev); in camss_runtime_resume() local
1858 const struct resources_icc *icc_res = camss->res->icc_res; in camss_runtime_resume()
1862 for (i = 0; i < camss->res->icc_path_num; i++) { in camss_runtime_resume()
1863 ret = icc_set_bw(camss->icc_path[i], in camss_runtime_resume()
1883 .name = "qcom-camss",
1891 MODULE_ALIAS("platform:qcom-camss");