aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/pac7302.c
diff options
context:
space:
mode:
authorMarton Nemeth <nm127@freemail.hu>2009-11-08 02:35:12 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-12-05 15:41:39 -0500
commit23fbee6f88d59b4edca0855242d55e5b7cfc2401 (patch)
treeb9015f3c9b44429727a774ef3d023fd65d07493c /drivers/media/video/gspca/pac7302.c
parentb760812ed78c93249ac7957fedb87ba9c3ca3906 (diff)
V4L/DVB (13388): gspca - pac7302: Add white balance control.
Signed-off-by: Marton Nemeth <nm127@freemail.hu> Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/pac7302.c')
-rw-r--r--drivers/media/video/gspca/pac7302.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/drivers/media/video/gspca/pac7302.c b/drivers/media/video/gspca/pac7302.c
index e7a4ced86e9..f8bf6a63f04 100644
--- a/drivers/media/video/gspca/pac7302.c
+++ b/drivers/media/video/gspca/pac7302.c
@@ -57,6 +57,7 @@
57 0 | 0x0f..0x20 | setcolors() 57 0 | 0x0f..0x20 | setcolors()
58 0 | 0xa2..0xab | setbrightcont() 58 0 | 0xa2..0xab | setbrightcont()
59 0 | 0xc5 | setredbalance() 59 0 | 0xc5 | setredbalance()
60 0 | 0xc6 | setwhitebalance()
60 0 | 0xc7 | setbluebalance() 61 0 | 0xc7 | setbluebalance()
61 0 | 0xdc | setbrightcont(), setcolors() 62 0 | 0xdc | setbrightcont(), setcolors()
62 3 | 0x02 | setexposure() 63 3 | 0x02 | setexposure()
@@ -80,6 +81,7 @@ struct sd {
80 unsigned char brightness; 81 unsigned char brightness;
81 unsigned char contrast; 82 unsigned char contrast;
82 unsigned char colors; 83 unsigned char colors;
84 unsigned char white_balance;
83 unsigned char red_balance; 85 unsigned char red_balance;
84 unsigned char blue_balance; 86 unsigned char blue_balance;
85 unsigned char gain; 87 unsigned char gain;
@@ -101,6 +103,8 @@ static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
101static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val); 103static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
102static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val); 104static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val);
103static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val); 105static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);
106static int sd_setwhitebalance(struct gspca_dev *gspca_dev, __s32 val);
107static int sd_getwhitebalance(struct gspca_dev *gspca_dev, __s32 *val);
104static int sd_setredbalance(struct gspca_dev *gspca_dev, __s32 val); 108static int sd_setredbalance(struct gspca_dev *gspca_dev, __s32 val);
105static int sd_getredbalance(struct gspca_dev *gspca_dev, __s32 *val); 109static int sd_getredbalance(struct gspca_dev *gspca_dev, __s32 *val);
106static int sd_setbluebalance(struct gspca_dev *gspca_dev, __s32 val); 110static int sd_setbluebalance(struct gspca_dev *gspca_dev, __s32 val);
@@ -167,6 +171,20 @@ static struct ctrl sd_ctrls[] = {
167 }, 171 },
168 { 172 {
169 { 173 {
174 .id = V4L2_CID_WHITE_BALANCE_TEMPERATURE,
175 .type = V4L2_CTRL_TYPE_INTEGER,
176 .name = "White Balance",
177 .minimum = 0,
178 .maximum = 255,
179 .step = 1,
180#define WHITEBALANCE_DEF 4
181 .default_value = WHITEBALANCE_DEF,
182 },
183 .set = sd_setwhitebalance,
184 .get = sd_getwhitebalance,
185 },
186 {
187 {
170 .id = V4L2_CID_RED_BALANCE, 188 .id = V4L2_CID_RED_BALANCE,
171 .type = V4L2_CTRL_TYPE_INTEGER, 189 .type = V4L2_CTRL_TYPE_INTEGER,
172 .name = "Red", 190 .name = "Red",
@@ -525,6 +543,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
525 sd->brightness = BRIGHTNESS_DEF; 543 sd->brightness = BRIGHTNESS_DEF;
526 sd->contrast = CONTRAST_DEF; 544 sd->contrast = CONTRAST_DEF;
527 sd->colors = COLOR_DEF; 545 sd->colors = COLOR_DEF;
546 sd->white_balance = WHITEBALANCE_DEF;
528 sd->red_balance = REDBALANCE_DEF; 547 sd->red_balance = REDBALANCE_DEF;
529 sd->blue_balance = BLUEBALANCE_DEF; 548 sd->blue_balance = BLUEBALANCE_DEF;
530 sd->gain = GAIN_DEF; 549 sd->gain = GAIN_DEF;
@@ -595,6 +614,21 @@ static int setcolors(struct gspca_dev *gspca_dev)
595 return ret; 614 return ret;
596} 615}
597 616
617static int setwhitebalance(struct gspca_dev *gspca_dev)
618{
619 struct sd *sd = (struct sd *) gspca_dev;
620 int ret;
621
622 ret = reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
623 if (0 <= ret)
624 ret = reg_w(gspca_dev, 0xc6, sd->white_balance);
625
626 if (0 <= ret)
627 ret = reg_w(gspca_dev, 0xdc, 0x01);
628 PDEBUG(D_CONF|D_STREAM, "white_balance: %i", sd->white_balance);
629 return ret;
630}
631
598static int setredbalance(struct gspca_dev *gspca_dev) 632static int setredbalance(struct gspca_dev *gspca_dev)
599{ 633{
600 struct sd *sd = (struct sd *) gspca_dev; 634 struct sd *sd = (struct sd *) gspca_dev;
@@ -706,6 +740,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
706 if (0 <= ret) 740 if (0 <= ret)
707 ret = setcolors(gspca_dev); 741 ret = setcolors(gspca_dev);
708 if (0 <= ret) 742 if (0 <= ret)
743 ret = setwhitebalance(gspca_dev);
744 if (0 <= ret)
709 ret = setredbalance(gspca_dev); 745 ret = setredbalance(gspca_dev);
710 if (0 <= ret) 746 if (0 <= ret)
711 ret = setbluebalance(gspca_dev); 747 ret = setbluebalance(gspca_dev);
@@ -941,6 +977,27 @@ static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
941 return 0; 977 return 0;
942} 978}
943 979
980static int sd_setwhitebalance(struct gspca_dev *gspca_dev, __s32 val)
981{
982 struct sd *sd = (struct sd *) gspca_dev;
983 int ret = 0;
984
985 sd->white_balance = val;
986 if (gspca_dev->streaming)
987 ret = setwhitebalance(gspca_dev);
988 if (0 <= ret)
989 ret = 0;
990 return ret;
991}
992
993static int sd_getwhitebalance(struct gspca_dev *gspca_dev, __s32 *val)
994{
995 struct sd *sd = (struct sd *) gspca_dev;
996
997 *val = sd->white_balance;
998 return 0;
999}
1000
944static int sd_setredbalance(struct gspca_dev *gspca_dev, __s32 val) 1001static int sd_setredbalance(struct gspca_dev *gspca_dev, __s32 val)
945{ 1002{
946 struct sd *sd = (struct sd *) gspca_dev; 1003 struct sd *sd = (struct sd *) gspca_dev;