[PATCH 6/6] m88ds3103: change .set_voltage() implementation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add some error checking and implement functionality a little bit
differently.

Signed-off-by: Antti Palosaari <crope@xxxxxx>
---
 drivers/media/dvb-frontends/m88ds3103.c | 50 ++++++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 16 deletions(-)

diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c
index 238b04e..d8fbdfd 100644
--- a/drivers/media/dvb-frontends/m88ds3103.c
+++ b/drivers/media/dvb-frontends/m88ds3103.c
@@ -1038,36 +1038,54 @@ err:
 }
 
 static int m88ds3103_set_voltage(struct dvb_frontend *fe,
-	fe_sec_voltage_t voltage)
+	fe_sec_voltage_t fe_sec_voltage)
 {
 	struct m88ds3103_priv *priv = fe->demodulator_priv;
-	u8 data;
+	int ret;
+	u8 u8tmp;
+	bool voltage_sel, voltage_en;
 
-	m88ds3103_rd_reg(priv, 0xa2, &data);
+	dev_dbg(&priv->i2c->dev, "%s: fe_sec_voltage=%d\n", __func__,
+			fe_sec_voltage);
 
-	data &= ~0x03; /* bit0 V/H, bit1 off/on */
-	if (priv->cfg->lnb_en_pol)
-		data |= 0x02;
+	if (!priv->warm) {
+		ret = -EAGAIN;
+		goto err;
+	}
 
-	switch (voltage) {
+	switch (fe_sec_voltage) {
 	case SEC_VOLTAGE_18:
-		if (priv->cfg->lnb_hv_pol == 0)
-			data |= 0x01;
+		voltage_sel = 1;
+		voltage_en = 1;
 		break;
 	case SEC_VOLTAGE_13:
-		if (priv->cfg->lnb_hv_pol)
-			data |= 0x01;
+		voltage_sel = 0;
+		voltage_en = 1;
 		break;
 	case SEC_VOLTAGE_OFF:
-		if (priv->cfg->lnb_en_pol)
-			data &= ~0x02;
-		else
-			data |= 0x02;
+		voltage_sel = 0;
+		voltage_en = 0;
 		break;
+	default:
+		dev_dbg(&priv->i2c->dev, "%s: invalid fe_sec_voltage\n",
+				__func__);
+		ret = -EINVAL;
+		goto err;
 	}
-	m88ds3103_wr_reg(priv, 0xa2, data);
+
+	/* output pin polarity */
+	voltage_sel ^= priv->cfg->lnb_hv_pol;
+	voltage_en ^= !priv->cfg->lnb_en_pol;
+
+	u8tmp = voltage_en << 1 | voltage_sel << 0;
+	ret = m88ds3103_wr_reg_mask(priv, 0xa2, u8tmp, 0x03);
+	if (ret)
+		goto err;
 
 	return 0;
+err:
+	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
+	return ret;
 }
 
 static int m88ds3103_diseqc_send_master_cmd(struct dvb_frontend *fe,
-- 
http://palosaari.fi/

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux