aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/i2c
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2014-07-17 11:31:23 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-17 11:44:38 -0400
commit0d5e8c4313c83dc2d60519a219d517a13ba8a432 (patch)
tree5a9f6581e1cc493f7dc624e51e7b65598a419005 /drivers/media/i2c
parent028e2b4fb69f03a294a69b27c99f05002b8ac021 (diff)
[media] Fix 64-bit division fall-out from 64-bit control ranges
Commit 0ba2aeb6dab80920edd9cf5b93b1ea4d6913b8f3 increased the internal control ranges to 64 bit, but that caused problems in drivers that use the minimum/maximum/step/default_value control values in a division or modulus operations since not all architectures support those natively. Luckily, in almost all cases it is possible to just cast to 32 bits (the control value is known to be 32 bits, so it is safe to cast). Only in v4l2-ctrls.c was it necessary to use do_div in one function. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/i2c')
-rw-r--r--drivers/media/i2c/soc_camera/mt9m001.c6
-rw-r--r--drivers/media/i2c/soc_camera/mt9t031.c6
-rw-r--r--drivers/media/i2c/soc_camera/mt9v022.c4
3 files changed, 8 insertions, 8 deletions
diff --git a/drivers/media/i2c/soc_camera/mt9m001.c b/drivers/media/i2c/soc_camera/mt9m001.c
index df97033fa6ef..dbd8c142d6ef 100644
--- a/drivers/media/i2c/soc_camera/mt9m001.c
+++ b/drivers/media/i2c/soc_camera/mt9m001.c
@@ -403,7 +403,7 @@ static int mt9m001_s_ctrl(struct v4l2_ctrl *ctrl)
403 if (ctrl->val <= ctrl->default_value) { 403 if (ctrl->val <= ctrl->default_value) {
404 /* Pack it into 0..1 step 0.125, register values 0..8 */ 404 /* Pack it into 0..1 step 0.125, register values 0..8 */
405 unsigned long range = ctrl->default_value - ctrl->minimum; 405 unsigned long range = ctrl->default_value - ctrl->minimum;
406 data = ((ctrl->val - ctrl->minimum) * 8 + range / 2) / range; 406 data = ((ctrl->val - (s32)ctrl->minimum) * 8 + range / 2) / range;
407 407
408 dev_dbg(&client->dev, "Setting gain %d\n", data); 408 dev_dbg(&client->dev, "Setting gain %d\n", data);
409 data = reg_write(client, MT9M001_GLOBAL_GAIN, data); 409 data = reg_write(client, MT9M001_GLOBAL_GAIN, data);
@@ -413,7 +413,7 @@ static int mt9m001_s_ctrl(struct v4l2_ctrl *ctrl)
413 /* Pack it into 1.125..15 variable step, register values 9..67 */ 413 /* Pack it into 1.125..15 variable step, register values 9..67 */
414 /* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */ 414 /* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */
415 unsigned long range = ctrl->maximum - ctrl->default_value - 1; 415 unsigned long range = ctrl->maximum - ctrl->default_value - 1;
416 unsigned long gain = ((ctrl->val - ctrl->default_value - 1) * 416 unsigned long gain = ((ctrl->val - (s32)ctrl->default_value - 1) *
417 111 + range / 2) / range + 9; 417 111 + range / 2) / range + 9;
418 418
419 if (gain <= 32) 419 if (gain <= 32)
@@ -434,7 +434,7 @@ static int mt9m001_s_ctrl(struct v4l2_ctrl *ctrl)
434 case V4L2_CID_EXPOSURE_AUTO: 434 case V4L2_CID_EXPOSURE_AUTO:
435 if (ctrl->val == V4L2_EXPOSURE_MANUAL) { 435 if (ctrl->val == V4L2_EXPOSURE_MANUAL) {
436 unsigned long range = exp->maximum - exp->minimum; 436 unsigned long range = exp->maximum - exp->minimum;
437 unsigned long shutter = ((exp->val - exp->minimum) * 1048 + 437 unsigned long shutter = ((exp->val - (s32)exp->minimum) * 1048 +
438 range / 2) / range + 1; 438 range / 2) / range + 1;
439 439
440 dev_dbg(&client->dev, 440 dev_dbg(&client->dev,
diff --git a/drivers/media/i2c/soc_camera/mt9t031.c b/drivers/media/i2c/soc_camera/mt9t031.c
index ee7bb0ffcecb..f8358c4071a9 100644
--- a/drivers/media/i2c/soc_camera/mt9t031.c
+++ b/drivers/media/i2c/soc_camera/mt9t031.c
@@ -474,7 +474,7 @@ static int mt9t031_s_ctrl(struct v4l2_ctrl *ctrl)
474 if (ctrl->val <= ctrl->default_value) { 474 if (ctrl->val <= ctrl->default_value) {
475 /* Pack it into 0..1 step 0.125, register values 0..8 */ 475 /* Pack it into 0..1 step 0.125, register values 0..8 */
476 unsigned long range = ctrl->default_value - ctrl->minimum; 476 unsigned long range = ctrl->default_value - ctrl->minimum;
477 data = ((ctrl->val - ctrl->minimum) * 8 + range / 2) / range; 477 data = ((ctrl->val - (s32)ctrl->minimum) * 8 + range / 2) / range;
478 478
479 dev_dbg(&client->dev, "Setting gain %d\n", data); 479 dev_dbg(&client->dev, "Setting gain %d\n", data);
480 data = reg_write(client, MT9T031_GLOBAL_GAIN, data); 480 data = reg_write(client, MT9T031_GLOBAL_GAIN, data);
@@ -485,7 +485,7 @@ static int mt9t031_s_ctrl(struct v4l2_ctrl *ctrl)
485 /* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */ 485 /* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */
486 unsigned long range = ctrl->maximum - ctrl->default_value - 1; 486 unsigned long range = ctrl->maximum - ctrl->default_value - 1;
487 /* calculated gain: map 65..127 to 9..1024 step 0.125 */ 487 /* calculated gain: map 65..127 to 9..1024 step 0.125 */
488 unsigned long gain = ((ctrl->val - ctrl->default_value - 1) * 488 unsigned long gain = ((ctrl->val - (s32)ctrl->default_value - 1) *
489 1015 + range / 2) / range + 9; 489 1015 + range / 2) / range + 9;
490 490
491 if (gain <= 32) /* calculated gain 9..32 -> 9..32 */ 491 if (gain <= 32) /* calculated gain 9..32 -> 9..32 */
@@ -507,7 +507,7 @@ static int mt9t031_s_ctrl(struct v4l2_ctrl *ctrl)
507 case V4L2_CID_EXPOSURE_AUTO: 507 case V4L2_CID_EXPOSURE_AUTO:
508 if (ctrl->val == V4L2_EXPOSURE_MANUAL) { 508 if (ctrl->val == V4L2_EXPOSURE_MANUAL) {
509 unsigned int range = exp->maximum - exp->minimum; 509 unsigned int range = exp->maximum - exp->minimum;
510 unsigned int shutter = ((exp->val - exp->minimum) * 1048 + 510 unsigned int shutter = ((exp->val - (s32)exp->minimum) * 1048 +
511 range / 2) / range + 1; 511 range / 2) / range + 1;
512 u32 old; 512 u32 old;
513 513
diff --git a/drivers/media/i2c/soc_camera/mt9v022.c b/drivers/media/i2c/soc_camera/mt9v022.c
index f9f95f815b1a..99022c8d76eb 100644
--- a/drivers/media/i2c/soc_camera/mt9v022.c
+++ b/drivers/media/i2c/soc_camera/mt9v022.c
@@ -583,7 +583,7 @@ static int mt9v022_s_ctrl(struct v4l2_ctrl *ctrl)
583 /* mt9v022 has minimum == default */ 583 /* mt9v022 has minimum == default */
584 unsigned long range = gain->maximum - gain->minimum; 584 unsigned long range = gain->maximum - gain->minimum;
585 /* Valid values 16 to 64, 32 to 64 must be even. */ 585 /* Valid values 16 to 64, 32 to 64 must be even. */
586 unsigned long gain_val = ((gain->val - gain->minimum) * 586 unsigned long gain_val = ((gain->val - (s32)gain->minimum) *
587 48 + range / 2) / range + 16; 587 48 + range / 2) / range + 16;
588 588
589 if (gain_val >= 32) 589 if (gain_val >= 32)
@@ -608,7 +608,7 @@ static int mt9v022_s_ctrl(struct v4l2_ctrl *ctrl)
608 } else { 608 } else {
609 struct v4l2_ctrl *exp = mt9v022->exposure; 609 struct v4l2_ctrl *exp = mt9v022->exposure;
610 unsigned long range = exp->maximum - exp->minimum; 610 unsigned long range = exp->maximum - exp->minimum;
611 unsigned long shutter = ((exp->val - exp->minimum) * 611 unsigned long shutter = ((exp->val - (s32)exp->minimum) *
612 479 + range / 2) / range + 1; 612 479 + range / 2) / range + 1;
613 613
614 /* 614 /*