camss.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * camss.h
  4. *
  5. * Qualcomm MSM Camera Subsystem - Core
  6. *
  7. * Copyright (c) 2015, The Linux Foundation. All rights reserved.
  8. * Copyright (C) 2015-2018 Linaro Ltd.
  9. */
  10. #ifndef QC_MSM_CAMSS_H
  11. #define QC_MSM_CAMSS_H
  12. #include <linux/device.h>
  13. #include <linux/types.h>
  14. #include <media/v4l2-async.h>
  15. #include <media/v4l2-device.h>
  16. #include <media/v4l2-subdev.h>
  17. #include <media/media-device.h>
  18. #include <media/media-entity.h>
  19. #include <linux/device.h>
  20. #include "camss-csid.h"
  21. #include "camss-csiphy.h"
  22. #include "camss-ispif.h"
  23. #include "camss-vfe.h"
  24. #define to_camss(ptr_module) \
  25. container_of(ptr_module, struct camss, ptr_module)
  26. #define to_device(ptr_module) \
  27. (to_camss(ptr_module)->dev)
  28. #define module_pointer(ptr_module, index) \
  29. ((const struct ptr_module##_device (*)[]) &(ptr_module[-(index)]))
  30. #define to_camss_index(ptr_module, index) \
  31. container_of(module_pointer(ptr_module, index), \
  32. struct camss, ptr_module)
  33. #define to_device_index(ptr_module, index) \
  34. (to_camss_index(ptr_module, index)->dev)
  35. #define CAMSS_RES_MAX 17
  36. struct resources {
  37. char *regulator[CAMSS_RES_MAX];
  38. char *clock[CAMSS_RES_MAX];
  39. u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX];
  40. char *reg[CAMSS_RES_MAX];
  41. char *interrupt[CAMSS_RES_MAX];
  42. };
  43. struct resources_ispif {
  44. char *clock[CAMSS_RES_MAX];
  45. char *clock_for_reset[CAMSS_RES_MAX];
  46. char *reg[CAMSS_RES_MAX];
  47. char *interrupt;
  48. };
  49. enum pm_domain {
  50. PM_DOMAIN_VFE0,
  51. PM_DOMAIN_VFE1,
  52. PM_DOMAIN_COUNT
  53. };
  54. enum camss_version {
  55. CAMSS_8x16,
  56. CAMSS_8x96,
  57. };
  58. struct camss {
  59. enum camss_version version;
  60. struct v4l2_device v4l2_dev;
  61. struct v4l2_async_notifier notifier;
  62. struct media_device media_dev;
  63. struct device *dev;
  64. int csiphy_num;
  65. struct csiphy_device *csiphy;
  66. int csid_num;
  67. struct csid_device *csid;
  68. struct ispif_device ispif;
  69. int vfe_num;
  70. struct vfe_device *vfe;
  71. atomic_t ref_count;
  72. struct device *genpd[PM_DOMAIN_COUNT];
  73. struct device_link *genpd_link[PM_DOMAIN_COUNT];
  74. };
  75. struct camss_camera_interface {
  76. u8 csiphy_id;
  77. struct csiphy_csi2_cfg csi2;
  78. };
  79. struct camss_async_subdev {
  80. struct camss_camera_interface interface;
  81. struct v4l2_async_subdev asd;
  82. };
  83. struct camss_clock {
  84. struct clk *clk;
  85. const char *name;
  86. u32 *freq;
  87. u32 nfreqs;
  88. };
  89. void camss_add_clock_margin(u64 *rate);
  90. int camss_enable_clocks(int nclocks, struct camss_clock *clock,
  91. struct device *dev);
  92. void camss_disable_clocks(int nclocks, struct camss_clock *clock);
  93. int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock);
  94. int camss_pm_domain_on(struct camss *camss, int id);
  95. void camss_pm_domain_off(struct camss *camss, int id);
  96. void camss_delete(struct camss *camss);
  97. #endif /* QC_MSM_CAMSS_H */