diff options
author | Sakari Ailus <sakari.ailus@linux.intel.com> | 2014-09-16 08:07:11 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-10-28 11:35:48 -0400 |
commit | e3f8bc8c6ecd0bcb7b4d413332b068ebbbcc31ee (patch) | |
tree | 8b5d8304390dae5a510623df7df0446e94f6dc54 | |
parent | fff888c711764177a25a746d99a20e0549c54e3e (diff) |
[media] smiapp-pll: Unify OP and VT PLL structs
Uniform representation for VT and OP clocks. This is preparation for
calculating the VT clocks using the OP clock code.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/i2c/smiapp-pll.c | 60 | ||||
-rw-r--r-- | drivers/media/i2c/smiapp-pll.h | 18 | ||||
-rw-r--r-- | drivers/media/i2c/smiapp/smiapp-core.c | 14 |
3 files changed, 46 insertions, 46 deletions
diff --git a/drivers/media/i2c/smiapp-pll.c b/drivers/media/i2c/smiapp-pll.c index bde8eb839ccc..40a18ba85557 100644 --- a/drivers/media/i2c/smiapp-pll.c +++ b/drivers/media/i2c/smiapp-pll.c | |||
@@ -68,23 +68,23 @@ static void print_pll(struct device *dev, struct smiapp_pll *pll) | |||
68 | dev_dbg(dev, "pre_pll_clk_div\t%u\n", pll->pre_pll_clk_div); | 68 | dev_dbg(dev, "pre_pll_clk_div\t%u\n", pll->pre_pll_clk_div); |
69 | dev_dbg(dev, "pll_multiplier \t%u\n", pll->pll_multiplier); | 69 | dev_dbg(dev, "pll_multiplier \t%u\n", pll->pll_multiplier); |
70 | if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { | 70 | if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { |
71 | dev_dbg(dev, "op_sys_clk_div \t%u\n", pll->op_sys_clk_div); | 71 | dev_dbg(dev, "op_sys_clk_div \t%u\n", pll->op.sys_clk_div); |
72 | dev_dbg(dev, "op_pix_clk_div \t%u\n", pll->op_pix_clk_div); | 72 | dev_dbg(dev, "op_pix_clk_div \t%u\n", pll->op.pix_clk_div); |
73 | } | 73 | } |
74 | dev_dbg(dev, "vt_sys_clk_div \t%u\n", pll->vt_sys_clk_div); | 74 | dev_dbg(dev, "vt_sys_clk_div \t%u\n", pll->vt.sys_clk_div); |
75 | dev_dbg(dev, "vt_pix_clk_div \t%u\n", pll->vt_pix_clk_div); | 75 | dev_dbg(dev, "vt_pix_clk_div \t%u\n", pll->vt.pix_clk_div); |
76 | 76 | ||
77 | dev_dbg(dev, "ext_clk_freq_hz \t%u\n", pll->ext_clk_freq_hz); | 77 | dev_dbg(dev, "ext_clk_freq_hz \t%u\n", pll->ext_clk_freq_hz); |
78 | dev_dbg(dev, "pll_ip_clk_freq_hz \t%u\n", pll->pll_ip_clk_freq_hz); | 78 | dev_dbg(dev, "pll_ip_clk_freq_hz \t%u\n", pll->pll_ip_clk_freq_hz); |
79 | dev_dbg(dev, "pll_op_clk_freq_hz \t%u\n", pll->pll_op_clk_freq_hz); | 79 | dev_dbg(dev, "pll_op_clk_freq_hz \t%u\n", pll->pll_op_clk_freq_hz); |
80 | if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { | 80 | if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { |
81 | dev_dbg(dev, "op_sys_clk_freq_hz \t%u\n", | 81 | dev_dbg(dev, "op_sys_clk_freq_hz \t%u\n", |
82 | pll->op_sys_clk_freq_hz); | 82 | pll->op.sys_clk_freq_hz); |
83 | dev_dbg(dev, "op_pix_clk_freq_hz \t%u\n", | 83 | dev_dbg(dev, "op_pix_clk_freq_hz \t%u\n", |
84 | pll->op_pix_clk_freq_hz); | 84 | pll->op.pix_clk_freq_hz); |
85 | } | 85 | } |
86 | dev_dbg(dev, "vt_sys_clk_freq_hz \t%u\n", pll->vt_sys_clk_freq_hz); | 86 | dev_dbg(dev, "vt_sys_clk_freq_hz \t%u\n", pll->vt.sys_clk_freq_hz); |
87 | dev_dbg(dev, "vt_pix_clk_freq_hz \t%u\n", pll->vt_pix_clk_freq_hz); | 87 | dev_dbg(dev, "vt_pix_clk_freq_hz \t%u\n", pll->vt.pix_clk_freq_hz); |
88 | } | 88 | } |
89 | 89 | ||
90 | static int check_all_bounds(struct device *dev, | 90 | static int check_all_bounds(struct device *dev, |
@@ -109,35 +109,35 @@ static int check_all_bounds(struct device *dev, | |||
109 | "pll_op_clk_freq_hz"); | 109 | "pll_op_clk_freq_hz"); |
110 | if (!rval) | 110 | if (!rval) |
111 | rval = bounds_check( | 111 | rval = bounds_check( |
112 | dev, pll->op_sys_clk_div, | 112 | dev, pll->op.sys_clk_div, |
113 | limits->op.min_sys_clk_div, limits->op.max_sys_clk_div, | 113 | limits->op.min_sys_clk_div, limits->op.max_sys_clk_div, |
114 | "op_sys_clk_div"); | 114 | "op_sys_clk_div"); |
115 | if (!rval) | 115 | if (!rval) |
116 | rval = bounds_check( | 116 | rval = bounds_check( |
117 | dev, pll->op_pix_clk_div, | 117 | dev, pll->op.pix_clk_div, |
118 | limits->op.min_pix_clk_div, limits->op.max_pix_clk_div, | 118 | limits->op.min_pix_clk_div, limits->op.max_pix_clk_div, |
119 | "op_pix_clk_div"); | 119 | "op_pix_clk_div"); |
120 | if (!rval) | 120 | if (!rval) |
121 | rval = bounds_check( | 121 | rval = bounds_check( |
122 | dev, pll->op_sys_clk_freq_hz, | 122 | dev, pll->op.sys_clk_freq_hz, |
123 | limits->op.min_sys_clk_freq_hz, | 123 | limits->op.min_sys_clk_freq_hz, |
124 | limits->op.max_sys_clk_freq_hz, | 124 | limits->op.max_sys_clk_freq_hz, |
125 | "op_sys_clk_freq_hz"); | 125 | "op_sys_clk_freq_hz"); |
126 | if (!rval) | 126 | if (!rval) |
127 | rval = bounds_check( | 127 | rval = bounds_check( |
128 | dev, pll->op_pix_clk_freq_hz, | 128 | dev, pll->op.pix_clk_freq_hz, |
129 | limits->op.min_pix_clk_freq_hz, | 129 | limits->op.min_pix_clk_freq_hz, |
130 | limits->op.max_pix_clk_freq_hz, | 130 | limits->op.max_pix_clk_freq_hz, |
131 | "op_pix_clk_freq_hz"); | 131 | "op_pix_clk_freq_hz"); |
132 | if (!rval) | 132 | if (!rval) |
133 | rval = bounds_check( | 133 | rval = bounds_check( |
134 | dev, pll->vt_sys_clk_freq_hz, | 134 | dev, pll->vt.sys_clk_freq_hz, |
135 | limits->vt.min_sys_clk_freq_hz, | 135 | limits->vt.min_sys_clk_freq_hz, |
136 | limits->vt.max_sys_clk_freq_hz, | 136 | limits->vt.max_sys_clk_freq_hz, |
137 | "vt_sys_clk_freq_hz"); | 137 | "vt_sys_clk_freq_hz"); |
138 | if (!rval) | 138 | if (!rval) |
139 | rval = bounds_check( | 139 | rval = bounds_check( |
140 | dev, pll->vt_pix_clk_freq_hz, | 140 | dev, pll->vt.pix_clk_freq_hz, |
141 | limits->vt.min_pix_clk_freq_hz, | 141 | limits->vt.min_pix_clk_freq_hz, |
142 | limits->vt.max_pix_clk_freq_hz, | 142 | limits->vt.max_pix_clk_freq_hz, |
143 | "vt_pix_clk_freq_hz"); | 143 | "vt_pix_clk_freq_hz"); |
@@ -240,8 +240,8 @@ static int __smiapp_pll_calculate(struct device *dev, | |||
240 | } | 240 | } |
241 | 241 | ||
242 | pll->pll_multiplier = mul * i; | 242 | pll->pll_multiplier = mul * i; |
243 | pll->op_sys_clk_div = div * i / pll->pre_pll_clk_div; | 243 | pll->op.sys_clk_div = div * i / pll->pre_pll_clk_div; |
244 | dev_dbg(dev, "op_sys_clk_div: %u\n", pll->op_sys_clk_div); | 244 | dev_dbg(dev, "op_sys_clk_div: %u\n", pll->op.sys_clk_div); |
245 | 245 | ||
246 | pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz | 246 | pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz |
247 | / pll->pre_pll_clk_div; | 247 | / pll->pre_pll_clk_div; |
@@ -250,14 +250,14 @@ static int __smiapp_pll_calculate(struct device *dev, | |||
250 | * pll->pll_multiplier; | 250 | * pll->pll_multiplier; |
251 | 251 | ||
252 | /* Derive pll_op_clk_freq_hz. */ | 252 | /* Derive pll_op_clk_freq_hz. */ |
253 | pll->op_sys_clk_freq_hz = | 253 | pll->op.sys_clk_freq_hz = |
254 | pll->pll_op_clk_freq_hz / pll->op_sys_clk_div; | 254 | pll->pll_op_clk_freq_hz / pll->op.sys_clk_div; |
255 | 255 | ||
256 | pll->op_pix_clk_div = pll->bits_per_pixel; | 256 | pll->op.pix_clk_div = pll->bits_per_pixel; |
257 | dev_dbg(dev, "op_pix_clk_div: %u\n", pll->op_pix_clk_div); | 257 | dev_dbg(dev, "op_pix_clk_div: %u\n", pll->op.pix_clk_div); |
258 | 258 | ||
259 | pll->op_pix_clk_freq_hz = | 259 | pll->op.pix_clk_freq_hz = |
260 | pll->op_sys_clk_freq_hz / pll->op_pix_clk_div; | 260 | pll->op.sys_clk_freq_hz / pll->op.pix_clk_div; |
261 | 261 | ||
262 | /* | 262 | /* |
263 | * Some sensors perform analogue binning and some do this | 263 | * Some sensors perform analogue binning and some do this |
@@ -285,7 +285,7 @@ static int __smiapp_pll_calculate(struct device *dev, | |||
285 | * Find absolute limits for the factor of vt divider. | 285 | * Find absolute limits for the factor of vt divider. |
286 | */ | 286 | */ |
287 | dev_dbg(dev, "scale_m: %u\n", pll->scale_m); | 287 | dev_dbg(dev, "scale_m: %u\n", pll->scale_m); |
288 | min_vt_div = DIV_ROUND_UP(pll->op_pix_clk_div * pll->op_sys_clk_div | 288 | min_vt_div = DIV_ROUND_UP(pll->op.pix_clk_div * pll->op.sys_clk_div |
289 | * pll->scale_n, | 289 | * pll->scale_n, |
290 | lane_op_clock_ratio * vt_op_binning_div | 290 | lane_op_clock_ratio * vt_op_binning_div |
291 | * pll->scale_m); | 291 | * pll->scale_m); |
@@ -369,16 +369,16 @@ static int __smiapp_pll_calculate(struct device *dev, | |||
369 | break; | 369 | break; |
370 | } | 370 | } |
371 | 371 | ||
372 | pll->vt_sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div); | 372 | pll->vt.sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div); |
373 | pll->vt_pix_clk_div = best_pix_div; | 373 | pll->vt.pix_clk_div = best_pix_div; |
374 | 374 | ||
375 | pll->vt_sys_clk_freq_hz = | 375 | pll->vt.sys_clk_freq_hz = |
376 | pll->pll_op_clk_freq_hz / pll->vt_sys_clk_div; | 376 | pll->pll_op_clk_freq_hz / pll->vt.sys_clk_div; |
377 | pll->vt_pix_clk_freq_hz = | 377 | pll->vt.pix_clk_freq_hz = |
378 | pll->vt_sys_clk_freq_hz / pll->vt_pix_clk_div; | 378 | pll->vt.sys_clk_freq_hz / pll->vt.pix_clk_div; |
379 | 379 | ||
380 | pll->pixel_rate_csi = | 380 | pll->pixel_rate_csi = |
381 | pll->op_pix_clk_freq_hz * lane_op_clock_ratio; | 381 | pll->op.pix_clk_freq_hz * lane_op_clock_ratio; |
382 | 382 | ||
383 | return check_all_bounds(dev, limits, pll); | 383 | return check_all_bounds(dev, limits, pll); |
384 | } | 384 | } |
diff --git a/drivers/media/i2c/smiapp-pll.h b/drivers/media/i2c/smiapp-pll.h index 2885cd76ff8c..b7c0e6609ad4 100644 --- a/drivers/media/i2c/smiapp-pll.h +++ b/drivers/media/i2c/smiapp-pll.h | |||
@@ -35,6 +35,13 @@ | |||
35 | #define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0) | 35 | #define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0) |
36 | #define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1) | 36 | #define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1) |
37 | 37 | ||
38 | struct smiapp_pll_branch { | ||
39 | uint16_t sys_clk_div; | ||
40 | uint16_t pix_clk_div; | ||
41 | uint32_t sys_clk_freq_hz; | ||
42 | uint32_t pix_clk_freq_hz; | ||
43 | }; | ||
44 | |||
38 | struct smiapp_pll { | 45 | struct smiapp_pll { |
39 | /* input values */ | 46 | /* input values */ |
40 | uint8_t bus_type; | 47 | uint8_t bus_type; |
@@ -58,17 +65,10 @@ struct smiapp_pll { | |||
58 | /* output values */ | 65 | /* output values */ |
59 | uint16_t pre_pll_clk_div; | 66 | uint16_t pre_pll_clk_div; |
60 | uint16_t pll_multiplier; | 67 | uint16_t pll_multiplier; |
61 | uint16_t op_sys_clk_div; | ||
62 | uint16_t op_pix_clk_div; | ||
63 | uint16_t vt_sys_clk_div; | ||
64 | uint16_t vt_pix_clk_div; | ||
65 | |||
66 | uint32_t pll_ip_clk_freq_hz; | 68 | uint32_t pll_ip_clk_freq_hz; |
67 | uint32_t pll_op_clk_freq_hz; | 69 | uint32_t pll_op_clk_freq_hz; |
68 | uint32_t op_sys_clk_freq_hz; | 70 | struct smiapp_pll_branch vt; |
69 | uint32_t op_pix_clk_freq_hz; | 71 | struct smiapp_pll_branch op; |
70 | uint32_t vt_sys_clk_freq_hz; | ||
71 | uint32_t vt_pix_clk_freq_hz; | ||
72 | 72 | ||
73 | uint32_t pixel_rate_csi; | 73 | uint32_t pixel_rate_csi; |
74 | }; | 74 | }; |
diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c index 6174a592adcc..389e7751ebb4 100644 --- a/drivers/media/i2c/smiapp/smiapp-core.c +++ b/drivers/media/i2c/smiapp/smiapp-core.c | |||
@@ -205,12 +205,12 @@ static int smiapp_pll_configure(struct smiapp_sensor *sensor) | |||
205 | int rval; | 205 | int rval; |
206 | 206 | ||
207 | rval = smiapp_write( | 207 | rval = smiapp_write( |
208 | sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt_pix_clk_div); | 208 | sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div); |
209 | if (rval < 0) | 209 | if (rval < 0) |
210 | return rval; | 210 | return rval; |
211 | 211 | ||
212 | rval = smiapp_write( | 212 | rval = smiapp_write( |
213 | sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt_sys_clk_div); | 213 | sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div); |
214 | if (rval < 0) | 214 | if (rval < 0) |
215 | return rval; | 215 | return rval; |
216 | 216 | ||
@@ -227,17 +227,17 @@ static int smiapp_pll_configure(struct smiapp_sensor *sensor) | |||
227 | /* Lane op clock ratio does not apply here. */ | 227 | /* Lane op clock ratio does not apply here. */ |
228 | rval = smiapp_write( | 228 | rval = smiapp_write( |
229 | sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS, | 229 | sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS, |
230 | DIV_ROUND_UP(pll->op_sys_clk_freq_hz, 1000000 / 256 / 256)); | 230 | DIV_ROUND_UP(pll->op.sys_clk_freq_hz, 1000000 / 256 / 256)); |
231 | if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) | 231 | if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) |
232 | return rval; | 232 | return rval; |
233 | 233 | ||
234 | rval = smiapp_write( | 234 | rval = smiapp_write( |
235 | sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op_pix_clk_div); | 235 | sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div); |
236 | if (rval < 0) | 236 | if (rval < 0) |
237 | return rval; | 237 | return rval; |
238 | 238 | ||
239 | return smiapp_write( | 239 | return smiapp_write( |
240 | sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op_sys_clk_div); | 240 | sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div); |
241 | } | 241 | } |
242 | 242 | ||
243 | static int smiapp_pll_update(struct smiapp_sensor *sensor) | 243 | static int smiapp_pll_update(struct smiapp_sensor *sensor) |
@@ -299,7 +299,7 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor) | |||
299 | return rval; | 299 | return rval; |
300 | 300 | ||
301 | __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray, | 301 | __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray, |
302 | pll->vt_pix_clk_freq_hz); | 302 | pll->vt.pix_clk_freq_hz); |
303 | __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi); | 303 | __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi); |
304 | 304 | ||
305 | return 0; | 305 | return 0; |
@@ -904,7 +904,7 @@ static int smiapp_update_mode(struct smiapp_sensor *sensor) | |||
904 | dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val); | 904 | dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val); |
905 | 905 | ||
906 | dev_dbg(&client->dev, "real timeperframe\t100/%d\n", | 906 | dev_dbg(&client->dev, "real timeperframe\t100/%d\n", |
907 | sensor->pll.vt_pix_clk_freq_hz / | 907 | sensor->pll.vt.pix_clk_freq_hz / |
908 | ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width | 908 | ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width |
909 | + sensor->hblank->val) * | 909 | + sensor->hblank->val) * |
910 | (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height | 910 | (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height |