smiapp-pll.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * drivers/media/i2c/smiapp-pll.h
  3. *
  4. * Generic driver for SMIA/SMIA++ compliant camera modules
  5. *
  6. * Copyright (C) 2012 Nokia Corporation
  7. * Contact: Sakari Ailus <sakari.ailus@iki.fi>
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * version 2 as published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  21. * 02110-1301 USA
  22. *
  23. */
  24. #ifndef SMIAPP_PLL_H
  25. #define SMIAPP_PLL_H
  26. #include <linux/device.h>
  27. /* CSI-2 or CCP-2 */
  28. #define SMIAPP_PLL_BUS_TYPE_CSI2 0x00
  29. #define SMIAPP_PLL_BUS_TYPE_PARALLEL 0x01
  30. /* op pix clock is for all lanes in total normally */
  31. #define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0)
  32. #define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1)
  33. struct smiapp_pll_branch {
  34. uint16_t sys_clk_div;
  35. uint16_t pix_clk_div;
  36. uint32_t sys_clk_freq_hz;
  37. uint32_t pix_clk_freq_hz;
  38. };
  39. struct smiapp_pll {
  40. /* input values */
  41. uint8_t bus_type;
  42. union {
  43. struct {
  44. uint8_t lanes;
  45. } csi2;
  46. struct {
  47. uint8_t bus_width;
  48. } parallel;
  49. };
  50. unsigned long flags;
  51. uint8_t binning_horizontal;
  52. uint8_t binning_vertical;
  53. uint8_t scale_m;
  54. uint8_t scale_n;
  55. uint8_t bits_per_pixel;
  56. uint32_t link_freq;
  57. uint32_t ext_clk_freq_hz;
  58. /* output values */
  59. uint16_t pre_pll_clk_div;
  60. uint16_t pll_multiplier;
  61. uint32_t pll_ip_clk_freq_hz;
  62. uint32_t pll_op_clk_freq_hz;
  63. struct smiapp_pll_branch vt;
  64. struct smiapp_pll_branch op;
  65. uint32_t pixel_rate_csi;
  66. uint32_t pixel_rate_pixel_array;
  67. };
  68. struct smiapp_pll_branch_limits {
  69. uint16_t min_sys_clk_div;
  70. uint16_t max_sys_clk_div;
  71. uint32_t min_sys_clk_freq_hz;
  72. uint32_t max_sys_clk_freq_hz;
  73. uint16_t min_pix_clk_div;
  74. uint16_t max_pix_clk_div;
  75. uint32_t min_pix_clk_freq_hz;
  76. uint32_t max_pix_clk_freq_hz;
  77. };
  78. struct smiapp_pll_limits {
  79. /* Strict PLL limits */
  80. uint32_t min_ext_clk_freq_hz;
  81. uint32_t max_ext_clk_freq_hz;
  82. uint16_t min_pre_pll_clk_div;
  83. uint16_t max_pre_pll_clk_div;
  84. uint32_t min_pll_ip_freq_hz;
  85. uint32_t max_pll_ip_freq_hz;
  86. uint16_t min_pll_multiplier;
  87. uint16_t max_pll_multiplier;
  88. uint32_t min_pll_op_freq_hz;
  89. uint32_t max_pll_op_freq_hz;
  90. struct smiapp_pll_branch_limits vt;
  91. struct smiapp_pll_branch_limits op;
  92. /* Other relevant limits */
  93. uint32_t min_line_length_pck_bin;
  94. uint32_t min_line_length_pck;
  95. };
  96. struct device;
  97. int smiapp_pll_calculate(struct device *dev,
  98. const struct smiapp_pll_limits *limits,
  99. struct smiapp_pll *pll);
  100. #endif /* SMIAPP_PLL_H */