aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNibble Max <nibble.max@gmail.com>2014-11-08 06:35:08 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-11-25 09:32:56 -0500
commit344e2e5ed7b3c82ac5f7a7641e4179f3215266b0 (patch)
tree26035cccadd561d8fe9f2cc6a3cf205f27b7b8f6
parentb43a590d44d2678dc26c93a02aba88411acd18cf (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.c69
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
480static 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
496err_add_i2c_client:
497 client = NULL;
498 return client;
499}
500
501static void smi_del_i2c_client(struct i2c_client *client)
502{
503 module_put(client->dev.driver->owner);
504 i2c_unregister_device(client);
505}
506
480static const struct m88ds3103_config smi_dvbsky_m88ds3103_cfg = { 507static 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
539err_tuner_i2c_module:
540 i2c_unregister_device(tuner_client);
541err_tuner_i2c_device: 560err_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
603err_tuner_i2c_module:
604 i2c_unregister_device(tuner_client);
605err_tuner_i2c_device: 616err_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
646static void smi_fe_exit(struct smi_port *port) 660static 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