diff options
author | Nibble Max <nibble.max@gmail.com> | 2014-11-08 06:35:08 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-11-25 09:32:56 -0500 |
commit | 344e2e5ed7b3c82ac5f7a7641e4179f3215266b0 (patch) | |
tree | 26035cccadd561d8fe9f2cc6a3cf205f27b7b8f6 | |
parent | b43a590d44d2678dc26c93a02aba88411acd18cf (diff) |
[media] smipcie: use add_i2c_client and del_i2c_client functions
v2:
-no change, just resend with other patches.
"add_i2c_client" and "del_i2c_client" functions make code shorter and easy to maintain.
Signed-off-by: Nibble Max <nibble.max@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/pci/smipcie/smipcie.c | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/drivers/media/pci/smipcie/smipcie.c b/drivers/media/pci/smipcie/smipcie.c index 8dc6afa50edb..39614a47af1e 100644 --- a/drivers/media/pci/smipcie/smipcie.c +++ b/drivers/media/pci/smipcie/smipcie.c | |||
@@ -477,6 +477,33 @@ static irqreturn_t smi_irq_handler(int irq, void *dev_id) | |||
477 | return IRQ_HANDLED; | 477 | return IRQ_HANDLED; |
478 | } | 478 | } |
479 | 479 | ||
480 | static struct i2c_client *smi_add_i2c_client(struct i2c_adapter *adapter, | ||
481 | struct i2c_board_info *info) | ||
482 | { | ||
483 | struct i2c_client *client; | ||
484 | |||
485 | request_module(info->type); | ||
486 | client = i2c_new_device(adapter, info); | ||
487 | if (client == NULL || client->dev.driver == NULL) | ||
488 | goto err_add_i2c_client; | ||
489 | |||
490 | if (!try_module_get(client->dev.driver->owner)) { | ||
491 | i2c_unregister_device(client); | ||
492 | goto err_add_i2c_client; | ||
493 | } | ||
494 | return client; | ||
495 | |||
496 | err_add_i2c_client: | ||
497 | client = NULL; | ||
498 | return client; | ||
499 | } | ||
500 | |||
501 | static void smi_del_i2c_client(struct i2c_client *client) | ||
502 | { | ||
503 | module_put(client->dev.driver->owner); | ||
504 | i2c_unregister_device(client); | ||
505 | } | ||
506 | |||
480 | static const struct m88ds3103_config smi_dvbsky_m88ds3103_cfg = { | 507 | static const struct m88ds3103_config smi_dvbsky_m88ds3103_cfg = { |
481 | .i2c_addr = 0x68, | 508 | .i2c_addr = 0x68, |
482 | .clock = 27000000, | 509 | .clock = 27000000, |
@@ -517,18 +544,12 @@ static int smi_dvbsky_m88ds3103_fe_attach(struct smi_port *port) | |||
517 | strlcpy(tuner_info.type, "m88ts2022", I2C_NAME_SIZE); | 544 | strlcpy(tuner_info.type, "m88ts2022", I2C_NAME_SIZE); |
518 | tuner_info.addr = 0x60; | 545 | tuner_info.addr = 0x60; |
519 | tuner_info.platform_data = &m88ts2022_config; | 546 | tuner_info.platform_data = &m88ts2022_config; |
520 | request_module("m88ts2022"); | 547 | tuner_client = smi_add_i2c_client(tuner_i2c_adapter, &tuner_info); |
521 | tuner_client = i2c_new_device(tuner_i2c_adapter, &tuner_info); | 548 | if (!tuner_client) { |
522 | if (tuner_client == NULL || tuner_client->dev.driver == NULL) { | ||
523 | ret = -ENODEV; | 549 | ret = -ENODEV; |
524 | goto err_tuner_i2c_device; | 550 | goto err_tuner_i2c_device; |
525 | } | 551 | } |
526 | 552 | ||
527 | if (!try_module_get(tuner_client->dev.driver->owner)) { | ||
528 | ret = -ENODEV; | ||
529 | goto err_tuner_i2c_module; | ||
530 | } | ||
531 | |||
532 | /* delegate signal strength measurement to tuner */ | 553 | /* delegate signal strength measurement to tuner */ |
533 | port->fe->ops.read_signal_strength = | 554 | port->fe->ops.read_signal_strength = |
534 | port->fe->ops.tuner_ops.get_rf_strength; | 555 | port->fe->ops.tuner_ops.get_rf_strength; |
@@ -536,8 +557,6 @@ static int smi_dvbsky_m88ds3103_fe_attach(struct smi_port *port) | |||
536 | port->i2c_client_tuner = tuner_client; | 557 | port->i2c_client_tuner = tuner_client; |
537 | return ret; | 558 | return ret; |
538 | 559 | ||
539 | err_tuner_i2c_module: | ||
540 | i2c_unregister_device(tuner_client); | ||
541 | err_tuner_i2c_device: | 560 | err_tuner_i2c_device: |
542 | dvb_frontend_detach(port->fe); | 561 | dvb_frontend_detach(port->fe); |
543 | return ret; | 562 | return ret; |
@@ -581,18 +600,12 @@ static int smi_dvbsky_m88rs6000_fe_attach(struct smi_port *port) | |||
581 | strlcpy(tuner_info.type, "m88rs6000t", I2C_NAME_SIZE); | 600 | strlcpy(tuner_info.type, "m88rs6000t", I2C_NAME_SIZE); |
582 | tuner_info.addr = 0x21; | 601 | tuner_info.addr = 0x21; |
583 | tuner_info.platform_data = &m88rs6000t_config; | 602 | tuner_info.platform_data = &m88rs6000t_config; |
584 | request_module("m88rs6000t"); | 603 | tuner_client = smi_add_i2c_client(tuner_i2c_adapter, &tuner_info); |
585 | tuner_client = i2c_new_device(tuner_i2c_adapter, &tuner_info); | 604 | if (!tuner_client) { |
586 | if (tuner_client == NULL || tuner_client->dev.driver == NULL) { | ||
587 | ret = -ENODEV; | 605 | ret = -ENODEV; |
588 | goto err_tuner_i2c_device; | 606 | goto err_tuner_i2c_device; |
589 | } | 607 | } |
590 | 608 | ||
591 | if (!try_module_get(tuner_client->dev.driver->owner)) { | ||
592 | ret = -ENODEV; | ||
593 | goto err_tuner_i2c_module; | ||
594 | } | ||
595 | |||
596 | /* delegate signal strength measurement to tuner */ | 609 | /* delegate signal strength measurement to tuner */ |
597 | port->fe->ops.read_signal_strength = | 610 | port->fe->ops.read_signal_strength = |
598 | port->fe->ops.tuner_ops.get_rf_strength; | 611 | port->fe->ops.tuner_ops.get_rf_strength; |
@@ -600,8 +613,6 @@ static int smi_dvbsky_m88rs6000_fe_attach(struct smi_port *port) | |||
600 | port->i2c_client_tuner = tuner_client; | 613 | port->i2c_client_tuner = tuner_client; |
601 | return ret; | 614 | return ret; |
602 | 615 | ||
603 | err_tuner_i2c_module: | ||
604 | i2c_unregister_device(tuner_client); | ||
605 | err_tuner_i2c_device: | 616 | err_tuner_i2c_device: |
606 | dvb_frontend_detach(port->fe); | 617 | dvb_frontend_detach(port->fe); |
607 | return ret; | 618 | return ret; |
@@ -631,7 +642,10 @@ static int smi_fe_init(struct smi_port *port) | |||
631 | /* register dvb frontend */ | 642 | /* register dvb frontend */ |
632 | ret = dvb_register_frontend(adap, port->fe); | 643 | ret = dvb_register_frontend(adap, port->fe); |
633 | if (ret < 0) { | 644 | if (ret < 0) { |
634 | i2c_unregister_device(port->i2c_client_tuner); | 645 | if (port->i2c_client_tuner) |
646 | smi_del_i2c_client(port->i2c_client_tuner); | ||
647 | if (port->i2c_client_demod) | ||
648 | smi_del_i2c_client(port->i2c_client_demod); | ||
635 | dvb_frontend_detach(port->fe); | 649 | dvb_frontend_detach(port->fe); |
636 | return ret; | 650 | return ret; |
637 | } | 651 | } |
@@ -645,15 +659,12 @@ static int smi_fe_init(struct smi_port *port) | |||
645 | 659 | ||
646 | static void smi_fe_exit(struct smi_port *port) | 660 | static void smi_fe_exit(struct smi_port *port) |
647 | { | 661 | { |
648 | struct i2c_client *tuner_client; | ||
649 | |||
650 | dvb_unregister_frontend(port->fe); | 662 | dvb_unregister_frontend(port->fe); |
651 | /* remove I2C tuner */ | 663 | /* remove I2C demod and tuner */ |
652 | tuner_client = port->i2c_client_tuner; | 664 | if (port->i2c_client_tuner) |
653 | if (tuner_client) { | 665 | smi_del_i2c_client(port->i2c_client_tuner); |
654 | module_put(tuner_client->dev.driver->owner); | 666 | if (port->i2c_client_demod) |
655 | i2c_unregister_device(tuner_client); | 667 | smi_del_i2c_client(port->i2c_client_demod); |
656 | } | ||
657 | dvb_frontend_detach(port->fe); | 668 | dvb_frontend_detach(port->fe); |
658 | } | 669 | } |
659 | 670 | ||