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 19 #ifndef SMIAPP_PLL_H 20 #define SMIAPP_PLL_H 21 22 /* CSI-2 or CCP-2 */ 23 #define SMIAPP_PLL_BUS_TYPE_CSI2 0x00 24 #define SMIAPP_PLL_BUS_TYPE_PARALLEL 0x01 25 26 /* op pix clock is for all lanes in total normally */ 27 #define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0) 28 #define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1) 29 30 struct smiapp_pll_branch { 31 uint16_t sys_clk_div; 32 uint16_t pix_clk_div; 33 uint32_t sys_clk_freq_hz; 34 uint32_t pix_clk_freq_hz; 35 }; 36 37 struct smiapp_pll { 38 /* input values */ 39 uint8_t bus_type; 40 union { 41 struct { 42 uint8_t lanes; 43 } csi2; 44 struct { 45 uint8_t bus_width; 46 } parallel; 47 }; 48 unsigned long flags; 49 uint8_t binning_horizontal; 50 uint8_t binning_vertical; 51 uint8_t scale_m; 52 uint8_t scale_n; 53 uint8_t bits_per_pixel; 54 uint32_t link_freq; 55 uint32_t ext_clk_freq_hz; 56 57 /* output values */ 58 uint16_t pre_pll_clk_div; 59 uint16_t pll_multiplier; 60 uint32_t pll_ip_clk_freq_hz; 61 uint32_t pll_op_clk_freq_hz; 62 struct smiapp_pll_branch vt; 63 struct smiapp_pll_branch op; 64 65 uint32_t pixel_rate_csi; 66 uint32_t pixel_rate_pixel_array; 67 }; 68 69 struct smiapp_pll_branch_limits { 70 uint16_t min_sys_clk_div; 71 uint16_t max_sys_clk_div; 72 uint32_t min_sys_clk_freq_hz; 73 uint32_t max_sys_clk_freq_hz; 74 uint16_t min_pix_clk_div; 75 uint16_t max_pix_clk_div; 76 uint32_t min_pix_clk_freq_hz; 77 uint32_t max_pix_clk_freq_hz; 78 }; 79 80 struct smiapp_pll_limits { 81 /* Strict PLL limits */ 82 uint32_t min_ext_clk_freq_hz; 83 uint32_t max_ext_clk_freq_hz; 84 uint16_t min_pre_pll_clk_div; 85 uint16_t max_pre_pll_clk_div; 86 uint32_t min_pll_ip_freq_hz; 87 uint32_t max_pll_ip_freq_hz; 88 uint16_t min_pll_multiplier; 89 uint16_t max_pll_multiplier; 90 uint32_t min_pll_op_freq_hz; 91 uint32_t max_pll_op_freq_hz; 92 93 struct smiapp_pll_branch_limits vt; 94 struct smiapp_pll_branch_limits op; 95 96 /* Other relevant limits */ 97 uint32_t min_line_length_pck_bin; 98 uint32_t min_line_length_pck; 99 }; 100 101 struct device; 102 103 int smiapp_pll_calculate(struct device *dev, 104 const struct smiapp_pll_limits *limits, 105 struct smiapp_pll *pll); 106 107 #endif /* SMIAPP_PLL_H */ 108