On 2018-01-17 16:02, Antti Palosaari wrote: > > > On 01/17/2018 11:52 PM, Brad Love wrote: >> Some tuners produce inverted spectrum, but the si2168 is not >> currently set up to accept it. This adds an optional parameter >> to set the frontend up to receive inverted spectrum. >> >> Parameter is optional and only boards who enable inversion >> will utilize this. >> >> Signed-off-by: Brad Love <brad@xxxxxxxxxxxxxxxx> >> --- >> Changes since v1: >> - Embarassing build failure due to missing declaration. >> >> drivers/media/dvb-frontends/si2168.c | 3 +++ >> drivers/media/dvb-frontends/si2168.h | 3 +++ >> 2 files changed, 6 insertions(+) >> >> diff --git a/drivers/media/dvb-frontends/si2168.c >> b/drivers/media/dvb-frontends/si2168.c >> index c041e79..048b815 100644 >> --- a/drivers/media/dvb-frontends/si2168.c >> +++ b/drivers/media/dvb-frontends/si2168.c >> @@ -213,6 +213,7 @@ static int si2168_set_frontend(struct >> dvb_frontend *fe) >> struct i2c_client *client = fe->demodulator_priv; >> struct si2168_dev *dev = i2c_get_clientdata(client); >> struct dtv_frontend_properties *c = &fe->dtv_property_cache; >> + struct si2168_config *config = client->dev.platform_data; > > hmmm, are you sure platform data pointer points is const? I usually > tend to store all config information to device state. Then there is no > need to care if pointer is valid or not anymore. > > And inversion happens when those wires are cross-connected It just dawned on me that the platform_data is stack allocated and therefore not safe to access outside of probe. I will fix this momentarily. I was informed by one of our hardware guys that the two models in patch 2/2 are inverted spectrum, so I guess they have wires cross-connected. I can verify this again to be sure. > >> int ret; >> struct si2168_cmd cmd; >> u8 bandwidth, delivery_system; >> @@ -339,6 +340,8 @@ static int si2168_set_frontend(struct >> dvb_frontend *fe) >> memcpy(cmd.args, "\x14\x00\x0a\x10\x00\x00", 6); >> cmd.args[4] = delivery_system | bandwidth; >> + if (config->spectral_inversion) >> + cmd.args[5] |= 1; >> cmd.wlen = 6; >> cmd.rlen = 4; >> ret = si2168_cmd_execute(client, &cmd); >> diff --git a/drivers/media/dvb-frontends/si2168.h >> b/drivers/media/dvb-frontends/si2168.h >> index f48f0fb..d519edd 100644 >> --- a/drivers/media/dvb-frontends/si2168.h >> +++ b/drivers/media/dvb-frontends/si2168.h >> @@ -46,6 +46,9 @@ struct si2168_config { >> /* TS clock gapped */ >> bool ts_clock_gapped; >> + >> + /* Inverted spectrum */ >> + bool spectral_inversion; >> }; >> #endif >> >