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

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

 



It is easier to understand for using "voltage_dis" to keep the same logic for voltage selection and off/on.

>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;
bool voltage_sel, voltage_dis;
> 
>-	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;
voltage_dis = 0;
> 		break;
> 	case SEC_VOLTAGE_13:
>-		if (priv->cfg->lnb_hv_pol)
>-			data |= 0x01;
>+		voltage_sel = 0;
>+		voltage_en = 1;
voltage_dis = 0;
> 		break;
> 	case SEC_VOLTAGE_OFF:
>-		if (priv->cfg->lnb_en_pol)
>-			data &= ~0x02;
>-		else
>-			data |= 0x02;
>+		voltage_sel = 0;
>+		voltage_en = 0;
voltage_dis = 1;
> 		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;
voltage_dis ^= priv->cfg->lnb_en_pol;
>+
>+	u8tmp = voltage_en << 1 | voltage_sel << 0;
u8tmp = voltage_dis << 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

--
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