Skip to content

Commit

Permalink
[media] stb6100: get rid of get_state()/set_state()
Browse files Browse the repository at this point in the history
It is tricky to get rid of those ops here, as the stv0299 driver
wants to set frequency in separate from setting the bandwidth.

So, we use a small trick: we temporarely fill the cache with
0 for either frequency or bandwidth and add some logic at
set_params to only change the property(ies) that aren't zero.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  • Loading branch information
Mauro Carvalho Chehab committed Nov 17, 2015
1 parent b2d3afc commit 65f0f68
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 72 deletions.
46 changes: 10 additions & 36 deletions drivers/media/dvb-frontends/stb6100.c
Original file line number Diff line number Diff line change
Expand Up @@ -502,49 +502,22 @@ static int stb6100_init(struct dvb_frontend *fe)
* iqsense = 1
* tunerstep = 125000
*/
state->bandwidth = 36000000; /* Hz */
state->bandwidth = 36000000; /* Hz */
state->reference = refclk / 1000; /* kHz */

/* Set default bandwidth. Modified, PN 13-May-10 */
return 0;
}

static int stb6100_get_state(struct dvb_frontend *fe,
enum tuner_param param,
struct tuner_state *state)
static int stb6100_set_params(struct dvb_frontend *fe)
{
switch (param) {
case DVBFE_TUNER_FREQUENCY:
stb6100_get_frequency(fe, &state->frequency);
break;
case DVBFE_TUNER_BANDWIDTH:
stb6100_get_bandwidth(fe, &state->bandwidth);
break;
default:
break;
}
struct dtv_frontend_properties *c = &fe->dtv_property_cache;

return 0;
}
if (c->frequency > 0)
stb6100_set_frequency(fe, c->frequency);

static int stb6100_set_state(struct dvb_frontend *fe,
enum tuner_param param,
struct tuner_state *state)
{
struct stb6100_state *tstate = fe->tuner_priv;

switch (param) {
case DVBFE_TUNER_FREQUENCY:
stb6100_set_frequency(fe, state->frequency);
tstate->frequency = state->frequency;
break;
case DVBFE_TUNER_BANDWIDTH:
stb6100_set_bandwidth(fe, state->bandwidth);
tstate->bandwidth = state->bandwidth;
break;
default:
break;
}
if (c->bandwidth_hz > 0)
stb6100_set_bandwidth(fe, c->bandwidth_hz);

return 0;
}
Expand All @@ -560,8 +533,9 @@ static struct dvb_tuner_ops stb6100_ops = {
.init = stb6100_init,
.sleep = stb6100_sleep,
.get_status = stb6100_get_status,
.get_state = stb6100_get_state,
.set_state = stb6100_set_state,
.set_params = stb6100_set_params,
.get_frequency = stb6100_get_frequency,
.get_bandwidth = stb6100_get_bandwidth,
.release = stb6100_release
};

Expand Down
37 changes: 21 additions & 16 deletions drivers/media/dvb-frontends/stb6100_cfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,21 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <linux/dvb/frontend.h>
#include "dvb_frontend.h"

static int stb6100_get_frequency(struct dvb_frontend *fe, u32 *frequency)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state t_state;
int err = 0;

if (tuner_ops->get_state) {
err = tuner_ops->get_state(fe, DVBFE_TUNER_FREQUENCY, &t_state);
if (tuner_ops->get_frequency) {
err = tuner_ops->get_frequency(fe, frequency);
if (err < 0) {
printk("%s: Invalid parameter\n", __func__);
return err;
}
*frequency = t_state.frequency;
}
return 0;
}
Expand All @@ -41,13 +42,16 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state t_state;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
u32 bw = c->bandwidth_hz;
int err = 0;

t_state.frequency = frequency;
c->frequency = frequency;
c->bandwidth_hz = 0; /* Don't adjust the bandwidth */

if (tuner_ops->set_state) {
err = tuner_ops->set_state(fe, DVBFE_TUNER_FREQUENCY, &t_state);
if (tuner_ops->set_params) {
err = tuner_ops->set_params(fe);
c->bandwidth_hz = bw;
if (err < 0) {
printk("%s: Invalid parameter\n", __func__);
return err;
Expand All @@ -60,16 +64,14 @@ static int stb6100_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state t_state;
int err = 0;

if (tuner_ops->get_state) {
err = tuner_ops->get_state(fe, DVBFE_TUNER_BANDWIDTH, &t_state);
if (tuner_ops->get_bandwidth) {
err = tuner_ops->get_bandwidth(fe, bandwidth);
if (err < 0) {
printk("%s: Invalid parameter\n", __func__);
return err;
}
*bandwidth = t_state.bandwidth;
}
return 0;
}
Expand All @@ -78,13 +80,16 @@ static int stb6100_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state t_state;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
u32 freq = c->frequency;
int err = 0;

t_state.bandwidth = bandwidth;
c->bandwidth_hz = bandwidth;
c->frequency = 0; /* Don't adjust the frequency */

if (tuner_ops->set_state) {
err = tuner_ops->set_state(fe, DVBFE_TUNER_BANDWIDTH, &t_state);
if (tuner_ops->set_params) {
err = tuner_ops->set_params(fe);
c->frequency = freq;
if (err < 0) {
printk("%s: Invalid parameter\n", __func__);
return err;
Expand Down
43 changes: 23 additions & 20 deletions drivers/media/dvb-frontends/stb6100_proc.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,27 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <linux/dvb/frontend.h>
#include "dvb_frontend.h"

static int stb6100_get_freq(struct dvb_frontend *fe, u32 *frequency)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state state;
int err = 0;

if (tuner_ops->get_state) {
if (tuner_ops->get_frequency) {
if (frontend_ops->i2c_gate_ctrl)
frontend_ops->i2c_gate_ctrl(fe, 1);

err = tuner_ops->get_state(fe, DVBFE_TUNER_FREQUENCY, &state);
err = tuner_ops->get_frequency(fe, frequency);
if (err < 0) {
printk(KERN_ERR "%s: Invalid parameter\n", __func__);
printk("%s: Invalid parameter\n", __func__);
return err;
}

if (frontend_ops->i2c_gate_ctrl)
frontend_ops->i2c_gate_ctrl(fe, 0);

*frequency = state.frequency;
}

return 0;
Expand All @@ -47,18 +47,21 @@ static int stb6100_set_freq(struct dvb_frontend *fe, u32 frequency)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state state;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
u32 bw = c->bandwidth_hz;
int err = 0;

state.frequency = frequency;
c->frequency = frequency;
c->bandwidth_hz = 0; /* Don't adjust the bandwidth */

if (tuner_ops->set_state) {
if (tuner_ops->set_params) {
if (frontend_ops->i2c_gate_ctrl)
frontend_ops->i2c_gate_ctrl(fe, 1);

err = tuner_ops->set_state(fe, DVBFE_TUNER_FREQUENCY, &state);
err = tuner_ops->set_params(fe);
c->bandwidth_hz = bw;
if (err < 0) {
printk(KERN_ERR "%s: Invalid parameter\n", __func__);
printk("%s: Invalid parameter\n", __func__);
return err;
}

Expand All @@ -74,23 +77,20 @@ static int stb6100_get_bandw(struct dvb_frontend *fe, u32 *bandwidth)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state state;
int err = 0;

if (tuner_ops->get_state) {
if (tuner_ops->get_bandwidth) {
if (frontend_ops->i2c_gate_ctrl)
frontend_ops->i2c_gate_ctrl(fe, 1);

err = tuner_ops->get_state(fe, DVBFE_TUNER_BANDWIDTH, &state);
err = tuner_ops->get_bandwidth(fe, bandwidth);
if (err < 0) {
printk(KERN_ERR "%s: Invalid parameter\n", __func__);
return err;
}

if (frontend_ops->i2c_gate_ctrl)
frontend_ops->i2c_gate_ctrl(fe, 0);

*bandwidth = state.bandwidth;
}

return 0;
Expand All @@ -100,16 +100,19 @@ static int stb6100_set_bandw(struct dvb_frontend *fe, u32 bandwidth)
{
struct dvb_frontend_ops *frontend_ops = &fe->ops;
struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
struct tuner_state state;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
u32 freq = c->frequency;
int err = 0;

state.bandwidth = bandwidth;
c->bandwidth_hz = bandwidth;
c->frequency = 0; /* Don't adjust the frequency */

if (tuner_ops->set_state) {
if (tuner_ops->set_params) {
if (frontend_ops->i2c_gate_ctrl)
frontend_ops->i2c_gate_ctrl(fe, 1);

err = tuner_ops->set_state(fe, DVBFE_TUNER_BANDWIDTH, &state);
err = tuner_ops->set_params(fe);
c->frequency = freq;
if (err < 0) {
printk(KERN_ERR "%s: Invalid parameter\n", __func__);
return err;
Expand Down

0 comments on commit 65f0f68

Please sign in to comment.