diff options
-rw-r--r-- | drivers/media/video/saa7115.c | 76 |
1 files changed, 16 insertions, 60 deletions
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c index 2d18f0069821..ad60335544ff 100644 --- a/drivers/media/video/saa7115.c +++ b/drivers/media/video/saa7115.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/videodev2.h> | 46 | #include <linux/videodev2.h> |
47 | #include <media/v4l2-common.h> | 47 | #include <media/v4l2-common.h> |
48 | #include <media/v4l2-chip-ident.h> | 48 | #include <media/v4l2-chip-ident.h> |
49 | #include <media/v4l2-i2c-drv-legacy.h> | ||
49 | #include <media/saa7115.h> | 50 | #include <media/saa7115.h> |
50 | #include <asm/div64.h> | 51 | #include <asm/div64.h> |
51 | 52 | ||
@@ -1230,7 +1231,7 @@ static void saa711x_decode_vbi_line(struct i2c_client *client, | |||
1230 | 1231 | ||
1231 | /* ============ SAA7115 AUDIO settings (end) ============= */ | 1232 | /* ============ SAA7115 AUDIO settings (end) ============= */ |
1232 | 1233 | ||
1233 | static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *arg) | 1234 | static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *arg) |
1234 | { | 1235 | { |
1235 | struct saa711x_state *state = i2c_get_clientdata(client); | 1236 | struct saa711x_state *state = i2c_get_clientdata(client); |
1236 | 1237 | ||
@@ -1449,26 +1450,17 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar | |||
1449 | 1450 | ||
1450 | /* ----------------------------------------------------------------------- */ | 1451 | /* ----------------------------------------------------------------------- */ |
1451 | 1452 | ||
1452 | static struct i2c_driver i2c_driver_saa711x; | 1453 | static int saa7115_probe(struct i2c_client *client) |
1453 | |||
1454 | static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | ||
1455 | { | 1454 | { |
1456 | struct i2c_client *client; | ||
1457 | struct saa711x_state *state; | 1455 | struct saa711x_state *state; |
1458 | int i; | 1456 | int i; |
1459 | char name[17]; | 1457 | char name[17]; |
1460 | u8 chip_id; | 1458 | u8 chip_id; |
1461 | 1459 | ||
1462 | /* Check if the adapter supports the needed features */ | 1460 | /* Check if the adapter supports the needed features */ |
1463 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 1461 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
1464 | return 0; | 1462 | return 0; |
1465 | 1463 | ||
1466 | client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); | ||
1467 | if (client == 0) | ||
1468 | return -ENOMEM; | ||
1469 | client->addr = address; | ||
1470 | client->adapter = adapter; | ||
1471 | client->driver = &i2c_driver_saa711x; | ||
1472 | snprintf(client->name, sizeof(client->name) - 1, "saa7115"); | 1464 | snprintf(client->name, sizeof(client->name) - 1, "saa7115"); |
1473 | 1465 | ||
1474 | for (i = 0; i < 0x0f; i++) { | 1466 | for (i = 0; i < 0x0f; i++) { |
@@ -1485,18 +1477,16 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | |||
1485 | /* Check whether this chip is part of the saa711x series */ | 1477 | /* Check whether this chip is part of the saa711x series */ |
1486 | if (memcmp(name, "1f711", 5)) { | 1478 | if (memcmp(name, "1f711", 5)) { |
1487 | v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n", | 1479 | v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n", |
1488 | address << 1, name); | 1480 | client->addr << 1, name); |
1489 | kfree(client); | ||
1490 | return 0; | 1481 | return 0; |
1491 | } | 1482 | } |
1492 | 1483 | ||
1493 | snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); | 1484 | snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id); |
1494 | v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, address << 1, adapter->name); | 1485 | v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, client->addr << 1, client->adapter->name); |
1495 | 1486 | ||
1496 | state = kzalloc(sizeof(struct saa711x_state), GFP_KERNEL); | 1487 | state = kzalloc(sizeof(struct saa711x_state), GFP_KERNEL); |
1497 | i2c_set_clientdata(client, state); | 1488 | i2c_set_clientdata(client, state); |
1498 | if (state == NULL) { | 1489 | if (state == NULL) { |
1499 | kfree(client); | ||
1500 | return -ENOMEM; | 1490 | return -ENOMEM; |
1501 | } | 1491 | } |
1502 | state->input = -1; | 1492 | state->input = -1; |
@@ -1549,59 +1539,25 @@ static int saa711x_attach(struct i2c_adapter *adapter, int address, int kind) | |||
1549 | saa711x_writeregs(client, saa7115_init_misc); | 1539 | saa711x_writeregs(client, saa7115_init_misc); |
1550 | saa711x_set_v4lstd(client, V4L2_STD_NTSC); | 1540 | saa711x_set_v4lstd(client, V4L2_STD_NTSC); |
1551 | 1541 | ||
1552 | i2c_attach_client(client); | ||
1553 | |||
1554 | v4l_dbg(1, debug, client, "status: (1E) 0x%02x, (1F) 0x%02x\n", | 1542 | v4l_dbg(1, debug, client, "status: (1E) 0x%02x, (1F) 0x%02x\n", |
1555 | saa711x_read(client, R_1E_STATUS_BYTE_1_VD_DEC), saa711x_read(client, R_1F_STATUS_BYTE_2_VD_DEC)); | 1543 | saa711x_read(client, R_1E_STATUS_BYTE_1_VD_DEC), saa711x_read(client, R_1F_STATUS_BYTE_2_VD_DEC)); |
1556 | |||
1557 | return 0; | 1544 | return 0; |
1558 | } | 1545 | } |
1559 | 1546 | ||
1560 | static int saa711x_probe(struct i2c_adapter *adapter) | 1547 | /* ----------------------------------------------------------------------- */ |
1561 | { | ||
1562 | if (adapter->class & I2C_CLASS_TV_ANALOG || adapter->class & I2C_CLASS_TV_DIGITAL) | ||
1563 | return i2c_probe(adapter, &addr_data, &saa711x_attach); | ||
1564 | return 0; | ||
1565 | } | ||
1566 | 1548 | ||
1567 | static int saa711x_detach(struct i2c_client *client) | 1549 | static int saa7115_remove(struct i2c_client *client) |
1568 | { | 1550 | { |
1569 | struct saa711x_state *state = i2c_get_clientdata(client); | 1551 | kfree(i2c_get_clientdata(client)); |
1570 | int err; | ||
1571 | |||
1572 | err = i2c_detach_client(client); | ||
1573 | if (err) { | ||
1574 | return err; | ||
1575 | } | ||
1576 | |||
1577 | kfree(state); | ||
1578 | kfree(client); | ||
1579 | return 0; | 1552 | return 0; |
1580 | } | 1553 | } |
1581 | 1554 | ||
1582 | /* ----------------------------------------------------------------------- */ | 1555 | static struct v4l2_i2c_driver_data v4l2_i2c_data = { |
1583 | 1556 | .name = "saa7115", | |
1584 | /* i2c implementation */ | 1557 | .driverid = I2C_DRIVERID_SAA711X, |
1585 | static struct i2c_driver i2c_driver_saa711x = { | 1558 | .command = saa7115_command, |
1586 | .driver = { | 1559 | .probe = saa7115_probe, |
1587 | .name = "saa7115", | 1560 | .remove = saa7115_remove, |
1588 | }, | 1561 | .legacy_class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL, |
1589 | .id = I2C_DRIVERID_SAA711X, | ||
1590 | .attach_adapter = saa711x_probe, | ||
1591 | .detach_client = saa711x_detach, | ||
1592 | .command = saa711x_command, | ||
1593 | }; | 1562 | }; |
1594 | 1563 | ||
1595 | |||
1596 | static int __init saa711x_init_module(void) | ||
1597 | { | ||
1598 | return i2c_add_driver(&i2c_driver_saa711x); | ||
1599 | } | ||
1600 | |||
1601 | static void __exit saa711x_cleanup_module(void) | ||
1602 | { | ||
1603 | i2c_del_driver(&i2c_driver_saa711x); | ||
1604 | } | ||
1605 | |||
1606 | module_init(saa711x_init_module); | ||
1607 | module_exit(saa711x_cleanup_module); | ||