aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2016-02-06 17:12:05 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-03-03 07:27:35 -0500
commit426508e61cf49bd6e15bcc718b8efc651da39ae4 (patch)
treeb0647270d4c8106f2f3b49ca4ab181836a0e79c2 /drivers/media
parentd884acad4fe728b30b55d166089fb9f092b336ed (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.c79
-rw-r--r--drivers/media/dvb-frontends/rtl2832_priv.h1
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;
717err:
718 dev_dbg(&client->dev, "failed=%d\n", ret);
719 return ret;
720}
721
722static 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
735static 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
745static 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
837err_schedule_delayed_work: 797 return 0;
838 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
839 return;
840err: 798err:
841 dev_dbg(&client->dev, "failed=%d\n", ret); 799 dev_dbg(&client->dev, "failed=%d\n", ret);
800 return ret;
801}
802
803static 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
816static 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;