2011-12-07 20:45:25 +04:00
/*
2012-08-14 23:23:43 +04:00
* drivers / media / i2c / smiapp - pll . h
2011-12-07 20:45:25 +04:00
*
* Generic driver for SMIA / SMIA + + compliant camera modules
*
* Copyright ( C ) 2012 Nokia Corporation
2012-10-28 13:44:17 +04:00
* Contact : Sakari Ailus < sakari . ailus @ iki . fi >
2011-12-07 20:45:25 +04:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA
* 02110 - 1301 USA
*
*/
# ifndef SMIAPP_PLL_H
# define SMIAPP_PLL_H
# include <linux/device.h>
2012-10-20 17:35:25 +04:00
/* CSI-2 or CCP-2 */
# define SMIAPP_PLL_BUS_TYPE_CSI2 0x00
# define SMIAPP_PLL_BUS_TYPE_PARALLEL 0x01
/* op pix clock is for all lanes in total normally */
# define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0)
# define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1)
2014-09-16 16:07:11 +04:00
struct smiapp_pll_branch {
uint16_t sys_clk_div ;
uint16_t pix_clk_div ;
uint32_t sys_clk_freq_hz ;
uint32_t pix_clk_freq_hz ;
} ;
2011-12-07 20:45:25 +04:00
struct smiapp_pll {
2012-10-20 17:35:25 +04:00
/* input values */
uint8_t bus_type ;
union {
struct {
uint8_t lanes ;
} csi2 ;
struct {
uint8_t bus_width ;
} parallel ;
} ;
2014-04-09 01:14:42 +04:00
unsigned long flags ;
2011-12-07 20:45:25 +04:00
uint8_t binning_horizontal ;
uint8_t binning_vertical ;
uint8_t scale_m ;
uint8_t scale_n ;
uint8_t bits_per_pixel ;
uint32_t link_freq ;
2014-09-16 16:04:35 +04:00
uint32_t ext_clk_freq_hz ;
2011-12-07 20:45:25 +04:00
2012-10-20 17:35:25 +04:00
/* output values */
2011-12-07 20:45:25 +04:00
uint16_t pre_pll_clk_div ;
uint16_t pll_multiplier ;
uint32_t pll_ip_clk_freq_hz ;
uint32_t pll_op_clk_freq_hz ;
2014-09-16 16:07:11 +04:00
struct smiapp_pll_branch vt ;
struct smiapp_pll_branch op ;
2011-12-07 20:45:25 +04:00
uint32_t pixel_rate_csi ;
} ;
2012-10-22 18:40:56 +04:00
struct smiapp_pll_branch_limits {
uint16_t min_sys_clk_div ;
uint16_t max_sys_clk_div ;
uint32_t min_sys_clk_freq_hz ;
uint32_t max_sys_clk_freq_hz ;
uint16_t min_pix_clk_div ;
uint16_t max_pix_clk_div ;
uint32_t min_pix_clk_freq_hz ;
uint32_t max_pix_clk_freq_hz ;
} ;
2011-12-07 20:45:25 +04:00
struct smiapp_pll_limits {
/* Strict PLL limits */
uint32_t min_ext_clk_freq_hz ;
uint32_t max_ext_clk_freq_hz ;
uint16_t min_pre_pll_clk_div ;
uint16_t max_pre_pll_clk_div ;
uint32_t min_pll_ip_freq_hz ;
uint32_t max_pll_ip_freq_hz ;
uint16_t min_pll_multiplier ;
uint16_t max_pll_multiplier ;
uint32_t min_pll_op_freq_hz ;
uint32_t max_pll_op_freq_hz ;
2012-10-22 18:40:56 +04:00
struct smiapp_pll_branch_limits vt ;
struct smiapp_pll_branch_limits op ;
2011-12-07 20:45:25 +04:00
/* Other relevant limits */
uint32_t min_line_length_pck_bin ;
uint32_t min_line_length_pck ;
} ;
struct device ;
2012-10-22 18:40:57 +04:00
int smiapp_pll_calculate ( struct device * dev ,
const struct smiapp_pll_limits * limits ,
2011-12-07 20:45:25 +04:00
struct smiapp_pll * pll ) ;
# endif /* SMIAPP_PLL_H */