aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/sonixj.c
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2009-02-01 12:20:07 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 11:42:37 -0400
commitb083b92f9386d82e8ff3c1cfe04eefae488cbf1f (patch)
tree835bdeda2498491a932f1135dedfa21b5fc5e8d4 /drivers/media/video/gspca/sonixj.c
parent5e31dc8dda6e52934acfa4706854cc2a22542949 (diff)
V4L/DVB (10428): gspca - sonixj: Specific gamma tables per sensor.
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/sonixj.c')
-rw-r--r--drivers/media/video/gspca/sonixj.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
index d9a7d1157f92..a5b58374333b 100644
--- a/drivers/media/video/gspca/sonixj.c
+++ b/drivers/media/video/gspca/sonixj.c
@@ -379,11 +379,21 @@ static const u8 *sn_tb[] = {
379 sn_sp80708 379 sn_sp80708
380}; 380};
381 381
382/* default gamma table */
382static const u8 gamma_def[17] = { 383static const u8 gamma_def[17] = {
383 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99, 384 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99,
384 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff 385 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff
385}; 386};
386 387/* gamma for sensors HV7131R and MT9V111 */
388static const u8 gamma_spec_1[17] = {
389 0x08, 0x3a, 0x52, 0x65, 0x75, 0x83, 0x91, 0x9d,
390 0xa9, 0xb4, 0xbe, 0xc8, 0xd2, 0xdb, 0xe4, 0xed, 0xf5
391};
392/* gamma for sensor SP80708 */
393static const u8 gamma_spec_2[17] = {
394 0x0a, 0x2d, 0x4e, 0x68, 0x7d, 0x8f, 0x9f, 0xab,
395 0xb7, 0xc2, 0xcc, 0xd3, 0xd8, 0xde, 0xe2, 0xe5, 0xe6
396};
387 397
388/* color matrix and offsets */ 398/* color matrix and offsets */
389static const u8 reg84[] = { 399static const u8 reg84[] = {
@@ -1514,14 +1524,27 @@ static void setgamma(struct gspca_dev *gspca_dev)
1514 struct sd *sd = (struct sd *) gspca_dev; 1524 struct sd *sd = (struct sd *) gspca_dev;
1515 int i; 1525 int i;
1516 u8 gamma[17]; 1526 u8 gamma[17];
1527 const u8 *gamma_base;
1517 static const u8 delta[17] = { 1528 static const u8 delta[17] = {
1518 0x00, 0x14, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1a, 1529 0x00, 0x14, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1a,
1519 0x18, 0x13, 0x10, 0x0e, 0x08, 0x07, 0x04, 0x02, 0x00 1530 0x18, 0x13, 0x10, 0x0e, 0x08, 0x07, 0x04, 0x02, 0x00
1520 }; 1531 };
1521 1532
1533 switch (sd->sensor) {
1534 case SENSOR_HV7131R:
1535 case SENSOR_MT9V111:
1536 gamma_base = gamma_spec_1;
1537 break;
1538 case SENSOR_SP80708:
1539 gamma_base = gamma_spec_2;
1540 break;
1541 default:
1542 gamma_base = gamma_def;
1543 break;
1544 }
1522 1545
1523 for (i = 0; i < sizeof gamma; i++) 1546 for (i = 0; i < sizeof gamma; i++)
1524 gamma[i] = gamma_def[i] 1547 gamma[i] = gamma_base[i]
1525 + delta[i] * (sd->gamma - GAMMA_DEF) / 32; 1548 + delta[i] * (sd->gamma - GAMMA_DEF) / 32;
1526 reg_w(gspca_dev, 0x20, gamma, sizeof gamma); 1549 reg_w(gspca_dev, 0x20, gamma, sizeof gamma);
1527} 1550}
@@ -1608,6 +1631,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
1608 reg_w1(gspca_dev, 0x07, sn9c1xx[7]); /* green */ 1631 reg_w1(gspca_dev, 0x07, sn9c1xx[7]); /* green */
1609 reg_w1(gspca_dev, 0x06, sn9c1xx[6]); /* blue */ 1632 reg_w1(gspca_dev, 0x06, sn9c1xx[6]); /* blue */
1610 reg_w1(gspca_dev, 0x14, sn9c1xx[0x14]); 1633 reg_w1(gspca_dev, 0x14, sn9c1xx[0x14]);
1634
1611 setgamma(gspca_dev); 1635 setgamma(gspca_dev);
1612 1636
1613 for (i = 0; i < 8; i++) 1637 for (i = 0; i < 8; i++)
@@ -1702,7 +1726,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
1702 sp80708_InitSensor(gspca_dev); 1726 sp80708_InitSensor(gspca_dev);
1703 if (mode) { 1727 if (mode) {
1704/*?? reg1 = 0x04; * 320 clk 48Mhz */ 1728/*?? reg1 = 0x04; * 320 clk 48Mhz */
1705 ;
1706 } else { 1729 } else {
1707 reg1 = 0x46; /* 640 clk 48Mz */ 1730 reg1 = 0x46; /* 640 clk 48Mz */
1708 reg17 = 0xa2; 1731 reg17 = 0xa2;