Skip to contentSkip to conversation

Thoughts about suspending DVB C PCI device transparently

DISCUSSION Marko Ristola 2 participants 2 messages Jul 11, 2010 – Nov 20, 2010 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

Hi all.

Once in a time I wrote into Mantis driver Suspend / resume code. The idea was, that bridge driver (mantis_dvb.c) will handle the suspend / resume transparently to the application.

With a PCI device this was rather easy to achieve. With xine, there was just a glitch with video and audio after resume.

So after suspend, frontend was tuned into the original frequency, and the DMA transfer state was restored.

Suspend:
1. Turn off possible DMA transfer if active (feeds > 0)
2. Remember tuner power on state.
3. Do tuner and fronted power off.

Resume:
1. Restore frontend and tuner power.
2. (feeds > 0)? Set frequency for the tuner.
3. (feeds > 0)? Restore DMA transfer into previous state.

What do you think about this?
I need some feedback: is it worth coding? Other needed code is usual suspend / resume stuff.

Is it worth powering off the tuner, if it isn't
used?

For my current usage, powering off the unused tuner gives more power savings than implementing suspend/resume.

Marko Ristola

------------------------------

// suspend to standby, ram or disk.
int mantis_dvb_suspend(struct mantis_pci *mantis, pm_message_t
prevState, pm_message_t mesg)

{
        if (mantis->feeds > 0)

mantis_dma_stop(mantis);

        if (mantis->has_power)
                mantis_fe_powerdown(mantis); // power off tuner.

        return 0;
}

void mantis_dvb_resume(struct mantis_pci *mantis, pm_message_t prevMesg)

{
       // power on frontend and tuner.
       mantis_frontend_tuner_init(mantis);

       if (mantis->feeds > 0 && mantis->fe->ops.tuner_ops.init)
                (mantis->fe->ops.init)(mantis->fe);

        if (mantis->feeds > 0) {
                (mantis->fe->ops.set_frontend)(mantis->fe, NULL);
mantis_dma_start(mantis);
        }
}
#1 lore raw

Hi,

found this old email when searching for suspend issues, seems like a good idea. Just wondering - how many eg dvb drivers are there with working suspend/hibernate (all buses, not just PCI)? Me thinks only a small fraction, the rest will crash unless blacklisted by pm-utils?

Would it be worth to code a generic approach working around drivers that need to be blacklisted? It seems that because of eg firmware loading this might be the only way to get dvb drivers behave?

Richard

Quoted 66 lines

Once in a time I wrote into Mantis driver Suspend / resume code. The idea was, that bridge driver (mantis_dvb.c) will handle the suspend / resume transparently to the application.

With a PCI device this was rather easy to achieve. With xine, there was just a glitch with video and audio after resume.

So after suspend, frontend was tuned into the original frequency, and the DMA transfer state was restored.

Suspend:
1. Turn off possible DMA transfer if active (feeds > 0)
2. Remember tuner power on state.
3. Do tuner and fronted power off.

Resume:
1. Restore frontend and tuner power.
2. (feeds > 0)? Set frequency for the tuner.
3. (feeds > 0)? Restore DMA transfer into previous state.

What do you think about this?
I need some feedback: is it worth coding? Other needed code is usual suspend / resume stuff.

Is it worth powering off the tuner, if it isn't
used?

For my current usage, powering off the unused tuner gives more power savings than implementing suspend/resume.

Marko Ristola

------------------------------

// suspend to standby, ram or disk.
int mantis_dvb_suspend(struct mantis_pci *mantis, pm_message_t
prevState, pm_message_t mesg)

{
        if (mantis->feeds > 0)

mantis_dma_stop(mantis);

        if (mantis->has_power)
                mantis_fe_powerdown(mantis); // power off tuner.

        return 0;
}

void mantis_dvb_resume(struct mantis_pci *mantis, pm_message_t prevMesg)

{
       // power on frontend and tuner.
       mantis_frontend_tuner_init(mantis);

       if (mantis->feeds > 0 && mantis->fe->ops.tuner_ops.init)
                (mantis->fe->ops.init)(mantis->fe);

        if (mantis->feeds > 0) {
                (mantis->fe->ops.set_frontend)(mantis->fe, NULL);
mantis_dma_start(mantis);
        }
}

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html