Message ID | 1526149500-9256-1-git-send-email-thomas.hollstegge@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Em Sat, 12 May 2018 20:24:58 +0200 Thomas Hollstegge <thomas.hollstegge@gmail.com> escreveu: > Some devices require a higher TS clock frequency to demodulate some > muxes. This adds two optional parameters to control the TS clock > frequency mode as well as the frequency. > > Signed-off-by: Thomas Hollstegge <thomas.hollstegge@gmail.com> > --- > drivers/media/dvb-frontends/si2168.c | 20 +++++++++++++++++++- > drivers/media/dvb-frontends/si2168.h | 8 ++++++++ > drivers/media/dvb-frontends/si2168_priv.h | 2 ++ > 3 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c > index 324493e..b05e677 100644 > --- a/drivers/media/dvb-frontends/si2168.c > +++ b/drivers/media/dvb-frontends/si2168.c > @@ -92,13 +92,15 @@ static int si2168_ts_bus_ctrl(struct dvb_frontend *fe, int acquire) > dev_dbg(&client->dev, "%s acquire: %d\n", __func__, acquire); > > /* set TS_MODE property */ > - memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6); > + memcpy(cmd.args, "\x14\x00\x01\x10\x00\x00", 6); > if (acquire) > cmd.args[4] |= dev->ts_mode; > else > cmd.args[4] |= SI2168_TS_TRISTATE; > if (dev->ts_clock_gapped) > cmd.args[4] |= 0x40; > + cmd.args[4] |= (dev->ts_clock_mode & 0x03) << 4; > + Hmm... looking at this patch and on the next one, it seems that the clock mode is either 1 (AUTO) or 2 (MANUAL), right? If so, I would just do, instead: if (dev->ts_clock_freq) cmd.args[4] = SI2168_TS_CLOCK_MODE_AUTO_ADAPT << 4; else cmd.args[4] = SI2168_TS_CLOCK_MODE_MANUAL << 4; And get rid of dev->ts_clock_mode parameter. That seems more error-prune, as just specifying ts_clock_freq is enough for the driver to do the right thing. > cmd.wlen = 6; > cmd.rlen = 4; > ret = si2168_cmd_execute(client, &cmd); > @@ -398,6 +400,18 @@ static int si2168_set_frontend(struct dvb_frontend *fe) > if (ret) > goto err; > > + /* set TS frequency */ > + if (dev->ts_clock_freq) { > + memcpy(cmd.args, "\x14\x00\x0d\x10", 4); > + cmd.args[4] = ((dev->ts_clock_freq / 10000) >> 0) & 0xff; > + cmd.args[5] = ((dev->ts_clock_freq / 10000) >> 8) & 0xff; > + cmd.wlen = 6; > + cmd.rlen = 4; > + ret = si2168_cmd_execute(client, &cmd); > + if (ret) > + goto err; > + } > + > memcpy(cmd.args, "\x14\x00\x08\x10\xd7\x05", 6); > cmd.args[5] |= dev->ts_clock_inv ? 0x00 : 0x10; > cmd.wlen = 6; > @@ -806,6 +820,10 @@ static int si2168_probe(struct i2c_client *client, > dev->ts_mode = config->ts_mode; > dev->ts_clock_inv = config->ts_clock_inv; > dev->ts_clock_gapped = config->ts_clock_gapped; > + dev->ts_clock_mode = config->ts_clock_mode; > + if (dev->ts_clock_mode == 0) > + dev->ts_clock_mode = SI2168_TS_CLOCK_MODE_AUTO_ADAPT; > + dev->ts_clock_freq = config->ts_clock_freq; > dev->spectral_inversion = config->spectral_inversion; > > dev_info(&client->dev, "Silicon Labs Si2168-%c%d%d successfully identified\n", > diff --git a/drivers/media/dvb-frontends/si2168.h b/drivers/media/dvb-frontends/si2168.h > index d519edd..3f52ee8 100644 > --- a/drivers/media/dvb-frontends/si2168.h > +++ b/drivers/media/dvb-frontends/si2168.h > @@ -47,6 +47,14 @@ struct si2168_config { > /* TS clock gapped */ > bool ts_clock_gapped; > > + /* TS clock mode */ > +#define SI2168_TS_CLOCK_MODE_AUTO_ADAPT 0x01 > +#define SI2168_TS_CLOCK_MODE_MANUAL 0x02 > + u8 ts_clock_mode; > + > + /* TS clock frequency (for manual mode) */ > + u32 ts_clock_freq; > + > /* Inverted spectrum */ > bool spectral_inversion; > }; > diff --git a/drivers/media/dvb-frontends/si2168_priv.h b/drivers/media/dvb-frontends/si2168_priv.h > index 2d362e1..8173d6c 100644 > --- a/drivers/media/dvb-frontends/si2168_priv.h > +++ b/drivers/media/dvb-frontends/si2168_priv.h > @@ -48,6 +48,8 @@ struct si2168_dev { > u8 ts_mode; > bool ts_clock_inv; > bool ts_clock_gapped; > + u8 ts_clock_mode; > + u32 ts_clock_freq; > bool spectral_inversion; > }; > Thanks, Mauro
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index 324493e..b05e677 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c @@ -92,13 +92,15 @@ static int si2168_ts_bus_ctrl(struct dvb_frontend *fe, int acquire) dev_dbg(&client->dev, "%s acquire: %d\n", __func__, acquire); /* set TS_MODE property */ - memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6); + memcpy(cmd.args, "\x14\x00\x01\x10\x00\x00", 6); if (acquire) cmd.args[4] |= dev->ts_mode; else cmd.args[4] |= SI2168_TS_TRISTATE; if (dev->ts_clock_gapped) cmd.args[4] |= 0x40; + cmd.args[4] |= (dev->ts_clock_mode & 0x03) << 4; + cmd.wlen = 6; cmd.rlen = 4; ret = si2168_cmd_execute(client, &cmd); @@ -398,6 +400,18 @@ static int si2168_set_frontend(struct dvb_frontend *fe) if (ret) goto err; + /* set TS frequency */ + if (dev->ts_clock_freq) { + memcpy(cmd.args, "\x14\x00\x0d\x10", 4); + cmd.args[4] = ((dev->ts_clock_freq / 10000) >> 0) & 0xff; + cmd.args[5] = ((dev->ts_clock_freq / 10000) >> 8) & 0xff; + cmd.wlen = 6; + cmd.rlen = 4; + ret = si2168_cmd_execute(client, &cmd); + if (ret) + goto err; + } + memcpy(cmd.args, "\x14\x00\x08\x10\xd7\x05", 6); cmd.args[5] |= dev->ts_clock_inv ? 0x00 : 0x10; cmd.wlen = 6; @@ -806,6 +820,10 @@ static int si2168_probe(struct i2c_client *client, dev->ts_mode = config->ts_mode; dev->ts_clock_inv = config->ts_clock_inv; dev->ts_clock_gapped = config->ts_clock_gapped; + dev->ts_clock_mode = config->ts_clock_mode; + if (dev->ts_clock_mode == 0) + dev->ts_clock_mode = SI2168_TS_CLOCK_MODE_AUTO_ADAPT; + dev->ts_clock_freq = config->ts_clock_freq; dev->spectral_inversion = config->spectral_inversion; dev_info(&client->dev, "Silicon Labs Si2168-%c%d%d successfully identified\n", diff --git a/drivers/media/dvb-frontends/si2168.h b/drivers/media/dvb-frontends/si2168.h index d519edd..3f52ee8 100644 --- a/drivers/media/dvb-frontends/si2168.h +++ b/drivers/media/dvb-frontends/si2168.h @@ -47,6 +47,14 @@ struct si2168_config { /* TS clock gapped */ bool ts_clock_gapped; + /* TS clock mode */ +#define SI2168_TS_CLOCK_MODE_AUTO_ADAPT 0x01 +#define SI2168_TS_CLOCK_MODE_MANUAL 0x02 + u8 ts_clock_mode; + + /* TS clock frequency (for manual mode) */ + u32 ts_clock_freq; + /* Inverted spectrum */ bool spectral_inversion; }; diff --git a/drivers/media/dvb-frontends/si2168_priv.h b/drivers/media/dvb-frontends/si2168_priv.h index 2d362e1..8173d6c 100644 --- a/drivers/media/dvb-frontends/si2168_priv.h +++ b/drivers/media/dvb-frontends/si2168_priv.h @@ -48,6 +48,8 @@ struct si2168_dev { u8 ts_mode; bool ts_clock_inv; bool ts_clock_gapped; + u8 ts_clock_mode; + u32 ts_clock_freq; bool spectral_inversion; };
Some devices require a higher TS clock frequency to demodulate some muxes. This adds two optional parameters to control the TS clock frequency mode as well as the frequency. Signed-off-by: Thomas Hollstegge <thomas.hollstegge@gmail.com> --- drivers/media/dvb-frontends/si2168.c | 20 +++++++++++++++++++- drivers/media/dvb-frontends/si2168.h | 8 ++++++++ drivers/media/dvb-frontends/si2168_priv.h | 2 ++ 3 files changed, 29 insertions(+), 1 deletion(-)