Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d28677ff authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab
Browse files

[media] m88ds3103: change .set_voltage() implementation



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

Cc: Nibble Max <nibble.max@gmail.com>
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 6380b975
Loading
Loading
Loading
Loading
+34 −16
Original line number Diff line number Diff line
@@ -1038,36 +1038,54 @@ static int m88ds3103_set_tone(struct dvb_frontend *fe,
}

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

	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,