aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSakari Ailus <sakari.ailus@linux.intel.com>2014-09-16 08:07:11 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-10-28 11:35:48 -0400
commite3f8bc8c6ecd0bcb7b4d413332b068ebbbcc31ee (patch)
tree8b5d8304390dae5a510623df7df0446e94f6dc54
parentfff888c711764177a25a746d99a20e0549c54e3e (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.c60
-rw-r--r--drivers/media/i2c/smiapp-pll.h18
-rw-r--r--drivers/media/i2c/smiapp/smiapp-core.c14
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
90static int check_all_bounds(struct device *dev, 90static 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
38struct 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
38struct smiapp_pll { 45struct 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
243static int smiapp_pll_update(struct smiapp_sensor *sensor) 243static 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