Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] DVB: dvb_frontend: add parameters_out

- Holds the parameters detected by the demod.
- Updated on every call to get_frontend, either through ioctl or when
a frontend event occurs.
- Reset to input parameters after every call to set_frontend, tune or
search/track.

Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Andreas Oberritter and committed by
Mauro Carvalho Chehab
a5959dbe 50727719

+11 -6
+11 -6
drivers/media/dvb/dvb-core/dvb_frontend.c
··· 106 106 /* thread/frontend values */ 107 107 struct dvb_device *dvbdev; 108 108 struct dvb_frontend_parameters parameters_in; 109 + struct dvb_frontend_parameters parameters_out; 109 110 struct dvb_fe_events events; 110 111 struct semaphore sem; 111 112 struct list_head list_head; ··· 161 160 162 161 e = &events->events[events->eventw]; 163 162 164 - memcpy (&e->parameters, &fepriv->parameters_in, 165 - sizeof (struct dvb_frontend_parameters)); 166 - 167 163 if (status & FE_HAS_LOCK) 168 164 if (fe->ops.get_frontend) 169 - fe->ops.get_frontend(fe, &e->parameters); 165 + fe->ops.get_frontend(fe, &fepriv->parameters_out); 166 + 167 + e->parameters = fepriv->parameters_out; 170 168 171 169 events->eventw = wp; 172 170 ··· 353 353 fepriv->parameters_in.inversion = fepriv->inversion; 354 354 if (fe->ops.set_frontend) 355 355 fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters_in); 356 + fepriv->parameters_out = fepriv->parameters_in; 356 357 if (fe_set_err < 0) { 357 358 fepriv->state = FESTATE_ERROR; 358 359 return fe_set_err; ··· 385 384 if (fe->ops.set_frontend) 386 385 retval = fe->ops.set_frontend(fe, 387 386 &fepriv->parameters_in); 387 + fepriv->parameters_out = fepriv->parameters_in; 388 388 if (retval < 0) 389 389 fepriv->state = FESTATE_ERROR; 390 390 else ··· 602 600 603 601 if (fe->ops.tune) 604 602 fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s); 603 + if (params) 604 + fepriv->parameters_out = *params; 605 605 606 606 if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) { 607 607 dprintk("%s: state changed, adding current state\n", __func__); ··· 643 639 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN; 644 640 fepriv->delay = HZ / 2; 645 641 } 642 + fepriv->parameters_out = fepriv->parameters_in; 646 643 fe->ops.read_status(fe, &s); 647 644 if (s != fepriv->status) { 648 645 dvb_frontend_add_event(fe, s); /* update event list */ ··· 1885 1880 1886 1881 case FE_GET_FRONTEND: 1887 1882 if (fe->ops.get_frontend) { 1888 - memcpy (parg, &fepriv->parameters_in, sizeof (struct dvb_frontend_parameters)); 1889 - err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg); 1883 + err = fe->ops.get_frontend(fe, &fepriv->parameters_out); 1884 + memcpy(parg, &fepriv->parameters_out, sizeof(struct dvb_frontend_parameters)); 1890 1885 } 1891 1886 break; 1892 1887