[linux-dvb] [patch/rfc] frontend powermanagement

Gerd Knorr kraxel at bytesex.org
Thu Feb 17 14:04:33 CET 2005


Johannes Stezenbach <js at linuxtv.org> writes:

> Gerd Knorr wrote:
> > +void dvb_suspend_frontend(struct dvb_frontend* fe)
> > +{
> > +	if (fe->ops->sleep)
> > +		fe->ops->sleep(fe);
> > +}
> 
> Does the PM core allow us to call this after the dvb_frontend_thread
> has been put in the refridgerator? If not we might have to
> add a FESTATE_FREEZER.

I'm pretty sure the processes and also the kernel threads are already
frozen at that point, will double-check when actually testing that
stuff through.

> I also see the follwoing:
>                 if (dvb_powerdown_on_sleep)
>                         if (fe->ops->set_voltage)
>                                 fe->ops->set_voltage(fe, SEC_VOLTAGE_OFF);
> 
> You might wat to add this to dvb_suspend_frontend() (and maybe call
> dvb_suspend_frontend() then from the dvb_frontend_thread()).

Calling from the thread isn't an option I think (see above).

> One problem is of course that it won't work with DiSEqC (the app
> would have to resend the DiSEqC sequence after wakeup; since DiSEqC
> sequences can be arbitrarily complex the drivers make no effort to
> remember them for automatic re-send.)

Good point.  Hmm.

> We could add a flag to enum fe_status to signal this condition to
> the app after wakeup.

Yes, one possible way to handle that.  I'd check whenever some generic
thing exists to inform apps about suspend/resume before actually
adding that.

> Or we don't power down the LNB, but that's lousy power management then.

It would't help anyway, at least for the suspend-to-disk case where
the whole machine will be powered off ;)

> > +	if (fe->ops->init)
> > +		fe->ops->init(fe);
> 
> dvb_frontend_init();

Ok.

> > +	fepriv->state = FESTATE_RETUNE;
> > +	dvb_frontend_wakeup(fe);
> > +	dvb_frontend_add_event (fe, 0);	    
> > +	fepriv->status = 0;
> 
> I see this is the same sequence as in FE_SET_FRONTEND,

Yes, there I've taken it from ;)

> I wonder if it should be (in both places):
> 
> 	fepriv->state = FESTATE_RETUNE;
> 	fepriv->status = 0;
> 	dvb_frontend_add_event (fe, 0);
> 	dvb_frontend_wakeup(fe);
> 
> since dvb_frontend_thread() can change fepriv->status and generate
> events after wakeup.

Maybe also move that into a small helper function called from both
places then?

  Gerd

-- 
#define printk(args...) fprintf(stderr, ## args)




More information about the linux-dvb mailing list