diff options
author | Antti Palosaari <crope@iki.fi> | 2016-02-06 17:12:05 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2016-03-03 07:27:35 -0500 |
commit | 426508e61cf49bd6e15bcc718b8efc651da39ae4 (patch) | |
tree | b0647270d4c8106f2f3b49ca4ab181836a0e79c2 /drivers/media | |
parent | d884acad4fe728b30b55d166089fb9f092b336ed (diff) |
[media] rtl2832: move stats polling to read status
Do statistics polling on read status in order to avoid
unnecessary delayed work.
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832.c | 79 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832_priv.h | 1 |
2 files changed, 30 insertions, 50 deletions
diff --git a/drivers/media/dvb-frontends/rtl2832.c b/drivers/media/dvb-frontends/rtl2832.c index 8c6971121ed5..7c96f7679669 100644 --- a/drivers/media/dvb-frontends/rtl2832.c +++ b/drivers/media/dvb-frontends/rtl2832.c | |||
@@ -408,8 +408,6 @@ static int rtl2832_init(struct dvb_frontend *fe) | |||
408 | c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 408 | c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
409 | c->post_bit_count.len = 1; | 409 | c->post_bit_count.len = 1; |
410 | c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 410 | c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
411 | /* start statistics polling */ | ||
412 | schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000)); | ||
413 | dev->sleeping = false; | 411 | dev->sleeping = false; |
414 | 412 | ||
415 | return 0; | 413 | return 0; |
@@ -427,8 +425,6 @@ static int rtl2832_sleep(struct dvb_frontend *fe) | |||
427 | dev_dbg(&client->dev, "\n"); | 425 | dev_dbg(&client->dev, "\n"); |
428 | 426 | ||
429 | dev->sleeping = true; | 427 | dev->sleeping = true; |
430 | /* stop statistics polling */ | ||
431 | cancel_delayed_work_sync(&dev->stat_work); | ||
432 | dev->fe_status = 0; | 428 | dev->fe_status = 0; |
433 | 429 | ||
434 | ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1); | 430 | ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1); |
@@ -691,8 +687,11 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status) | |||
691 | { | 687 | { |
692 | struct rtl2832_dev *dev = fe->demodulator_priv; | 688 | struct rtl2832_dev *dev = fe->demodulator_priv; |
693 | struct i2c_client *client = dev->client; | 689 | struct i2c_client *client = dev->client; |
690 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
694 | int ret; | 691 | int ret; |
695 | u32 uninitialized_var(tmp); | 692 | u32 uninitialized_var(tmp); |
693 | u8 u8tmp, buf[2]; | ||
694 | u16 u16tmp; | ||
696 | 695 | ||
697 | dev_dbg(&client->dev, "\n"); | 696 | dev_dbg(&client->dev, "\n"); |
698 | 697 | ||
@@ -713,45 +712,6 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status) | |||
713 | } | 712 | } |
714 | 713 | ||
715 | dev->fe_status = *status; | 714 | dev->fe_status = *status; |
716 | return 0; | ||
717 | err: | ||
718 | dev_dbg(&client->dev, "failed=%d\n", ret); | ||
719 | return ret; | ||
720 | } | ||
721 | |||
722 | static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr) | ||
723 | { | ||
724 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
725 | |||
726 | /* report SNR in resolution of 0.1 dB */ | ||
727 | if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) | ||
728 | *snr = div_s64(c->cnr.stat[0].svalue, 100); | ||
729 | else | ||
730 | *snr = 0; | ||
731 | |||
732 | return 0; | ||
733 | } | ||
734 | |||
735 | static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber) | ||
736 | { | ||
737 | struct rtl2832_dev *dev = fe->demodulator_priv; | ||
738 | |||
739 | *ber = (dev->post_bit_error - dev->post_bit_error_prev); | ||
740 | dev->post_bit_error_prev = dev->post_bit_error; | ||
741 | |||
742 | return 0; | ||
743 | } | ||
744 | |||
745 | static void rtl2832_stat_work(struct work_struct *work) | ||
746 | { | ||
747 | struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, stat_work.work); | ||
748 | struct i2c_client *client = dev->client; | ||
749 | struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache; | ||
750 | int ret, tmp; | ||
751 | u8 u8tmp, buf[2]; | ||
752 | u16 u16tmp; | ||
753 | |||
754 | dev_dbg(&client->dev, "\n"); | ||
755 | 715 | ||
756 | /* signal strength */ | 716 | /* signal strength */ |
757 | if (dev->fe_status & FE_HAS_SIGNAL) { | 717 | if (dev->fe_status & FE_HAS_SIGNAL) { |
@@ -788,11 +748,11 @@ static void rtl2832_stat_work(struct work_struct *work) | |||
788 | 748 | ||
789 | constellation = (u8tmp >> 2) & 0x03; /* [3:2] */ | 749 | constellation = (u8tmp >> 2) & 0x03; /* [3:2] */ |
790 | if (constellation > CONSTELLATION_NUM - 1) | 750 | if (constellation > CONSTELLATION_NUM - 1) |
791 | goto err_schedule_delayed_work; | 751 | goto err; |
792 | 752 | ||
793 | hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */ | 753 | hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */ |
794 | if (hierarchy > HIERARCHY_NUM - 1) | 754 | if (hierarchy > HIERARCHY_NUM - 1) |
795 | goto err_schedule_delayed_work; | 755 | goto err; |
796 | 756 | ||
797 | ret = rtl2832_bulk_read(client, 0x40c, buf, 2); | 757 | ret = rtl2832_bulk_read(client, 0x40c, buf, 2); |
798 | if (ret) | 758 | if (ret) |
@@ -834,11 +794,33 @@ static void rtl2832_stat_work(struct work_struct *work) | |||
834 | c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | 794 | c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
835 | } | 795 | } |
836 | 796 | ||
837 | err_schedule_delayed_work: | 797 | return 0; |
838 | schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000)); | ||
839 | return; | ||
840 | err: | 798 | err: |
841 | dev_dbg(&client->dev, "failed=%d\n", ret); | 799 | dev_dbg(&client->dev, "failed=%d\n", ret); |
800 | return ret; | ||
801 | } | ||
802 | |||
803 | static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr) | ||
804 | { | ||
805 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
806 | |||
807 | /* report SNR in resolution of 0.1 dB */ | ||
808 | if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) | ||
809 | *snr = div_s64(c->cnr.stat[0].svalue, 100); | ||
810 | else | ||
811 | *snr = 0; | ||
812 | |||
813 | return 0; | ||
814 | } | ||
815 | |||
816 | static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber) | ||
817 | { | ||
818 | struct rtl2832_dev *dev = fe->demodulator_priv; | ||
819 | |||
820 | *ber = (dev->post_bit_error - dev->post_bit_error_prev); | ||
821 | dev->post_bit_error_prev = dev->post_bit_error; | ||
822 | |||
823 | return 0; | ||
842 | } | 824 | } |
843 | 825 | ||
844 | /* | 826 | /* |
@@ -1235,7 +1217,6 @@ static int rtl2832_probe(struct i2c_client *client, | |||
1235 | dev->pdata = client->dev.platform_data; | 1217 | dev->pdata = client->dev.platform_data; |
1236 | dev->sleeping = true; | 1218 | dev->sleeping = true; |
1237 | INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work); | 1219 | INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work); |
1238 | INIT_DELAYED_WORK(&dev->stat_work, rtl2832_stat_work); | ||
1239 | /* create regmap */ | 1220 | /* create regmap */ |
1240 | mutex_init(&dev->regmap_mutex); | 1221 | mutex_init(&dev->regmap_mutex); |
1241 | dev->regmap_config.reg_bits = 8, | 1222 | dev->regmap_config.reg_bits = 8, |
diff --git a/drivers/media/dvb-frontends/rtl2832_priv.h b/drivers/media/dvb-frontends/rtl2832_priv.h index 5dcd3a41d23f..6b875f462f8b 100644 --- a/drivers/media/dvb-frontends/rtl2832_priv.h +++ b/drivers/media/dvb-frontends/rtl2832_priv.h | |||
@@ -38,7 +38,6 @@ struct rtl2832_dev { | |||
38 | struct regmap *regmap; | 38 | struct regmap *regmap; |
39 | struct i2c_adapter *i2c_adapter_tuner; | 39 | struct i2c_adapter *i2c_adapter_tuner; |
40 | struct dvb_frontend fe; | 40 | struct dvb_frontend fe; |
41 | struct delayed_work stat_work; | ||
42 | enum fe_status fe_status; | 41 | enum fe_status fe_status; |
43 | u64 post_bit_error_prev; /* for old DVBv3 read_ber() calculation */ | 42 | u64 post_bit_error_prev; /* for old DVBv3 read_ber() calculation */ |
44 | u64 post_bit_error; | 43 | u64 post_bit_error; |