aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMarco Schluessler <marco@lordzodiac.de>2007-01-21 17:43:38 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-02-21 10:34:47 -0500
commit4cbca185e9adf3d48205b60bf196ebb9882af043 (patch)
tree0f64c99188bf26c57c7a802247349aa57705e119 /drivers
parent9de271e66d1172e7fa68ba0a7ecec2f9fb8d78c1 (diff)
V4L/DVB (5113): Adds video output routing
Nexus CA needs to use a different routing on saa7115 module. Signed-off-by: Marco Schluessler <marco@lordzodiac.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/saa7115.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c
index c2374ed7ba9f..389e518bc3e5 100644
--- a/drivers/media/video/saa7115.c
+++ b/drivers/media/video/saa7115.c
@@ -71,6 +71,7 @@ I2C_CLIENT_INSMOD;
71struct saa711x_state { 71struct saa711x_state {
72 v4l2_std_id std; 72 v4l2_std_id std;
73 int input; 73 int input;
74 int output;
74 int enable; 75 int enable;
75 int radio; 76 int radio;
76 int bright; 77 int bright;
@@ -1301,7 +1302,7 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
1301 struct v4l2_routing *route = arg; 1302 struct v4l2_routing *route = arg;
1302 1303
1303 route->input = state->input; 1304 route->input = state->input;
1304 route->output = 0; 1305 route->output = state->output;
1305 break; 1306 break;
1306 } 1307 }
1307 1308
@@ -1309,7 +1310,7 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
1309 { 1310 {
1310 struct v4l2_routing *route = arg; 1311 struct v4l2_routing *route = arg;
1311 1312
1312 v4l_dbg(1, debug, client, "decoder set input %d\n", route->input); 1313 v4l_dbg(1, debug, client, "decoder set input %d output %d\n", route->input, route->output);
1313 /* saa7113 does not have these inputs */ 1314 /* saa7113 does not have these inputs */
1314 if (state->ident == V4L2_IDENT_SAA7113 && 1315 if (state->ident == V4L2_IDENT_SAA7113 &&
1315 (route->input == SAA7115_COMPOSITE4 || 1316 (route->input == SAA7115_COMPOSITE4 ||
@@ -1318,10 +1319,12 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
1318 } 1319 }
1319 if (route->input > SAA7115_SVIDEO3) 1320 if (route->input > SAA7115_SVIDEO3)
1320 return -EINVAL; 1321 return -EINVAL;
1321 if (state->input == route->input) 1322 if (route->output > SAA7115_IPORT_ON)
1323 return -EINVAL;
1324 if (state->input == route->input && state->output == route->output)
1322 break; 1325 break;
1323 v4l_dbg(1, debug, client, "now setting %s input\n", 1326 v4l_dbg(1, debug, client, "now setting %s input %s output\n",
1324 (route->input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite"); 1327 (route->input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite", (route->output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
1325 state->input = route->input; 1328 state->input = route->input;
1326 1329
1327 /* select mode */ 1330 /* select mode */
@@ -1333,6 +1336,14 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
1333 saa711x_write(client, R_09_LUMA_CNTL, 1336 saa711x_write(client, R_09_LUMA_CNTL,
1334 (saa711x_read(client, R_09_LUMA_CNTL) & 0x7f) | 1337 (saa711x_read(client, R_09_LUMA_CNTL) & 0x7f) |
1335 (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0)); 1338 (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
1339
1340 state->output = route->output;
1341 if (state->ident == V4L2_IDENT_SAA7114 ||
1342 state->ident == V4L2_IDENT_SAA7115) {
1343 saa711x_write(client, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
1344 (saa711x_read(client, R_83_X_PORT_I_O_ENA_AND_OUT_CLK) & 0xfe) |
1345 (state->output & 0x01));
1346 }
1336 break; 1347 break;
1337 } 1348 }
1338 1349
@@ -1492,6 +1503,7 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind)
1492 return -ENOMEM; 1503 return -ENOMEM;
1493 } 1504 }
1494 state->input = -1; 1505 state->input = -1;
1506 state->output = SAA7115_IPORT_ON;
1495 state->enable = 1; 1507 state->enable = 1;
1496 state->radio = 0; 1508 state->radio = 0;
1497 state->bright = 128; 1509 state->bright = 128;
@@ -1550,7 +1562,7 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind)
1550 1562
1551static int saa711x_probe(struct i2c_adapter *adapter) 1563static int saa711x_probe(struct i2c_adapter *adapter)
1552{ 1564{
1553 if (adapter->class & I2C_CLASS_TV_ANALOG) 1565 if (adapter->class & I2C_CLASS_TV_ANALOG || adapter->class & I2C_CLASS_TV_DIGITAL)
1554 return i2c_probe(adapter, &addr_data, &saa711x_attach); 1566 return i2c_probe(adapter, &addr_data, &saa711x_attach);
1555 return 0; 1567 return 0;
1556} 1568}