Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-07-07 Thread Mauro Carvalho Chehab
Em 06-07-2011 16:59, Marko Ristola escreveu:
 06.07.2011 21:17, Devin Heitmueller kirjoitti:
 On Wed, Jul 6, 2011 at 1:53 PM, Marko Ristola marko.rist...@kolumbus.fi 
 wrote:


 All that said, I believe that you are correct in that the business
 logic needs to ultimately be decided by the bridge driver, rather than
 having the dvb/tuner core blindly calling the sleep routines against
 the tuner and demod drivers without a full understanding of what
 impact it has on the board as a whole.
 
 You wrote it nicely and compactly.
 
 What do you think about tracking coarse last busy time rather than figuring 
 out accurate idle time?
 
 dvb_frontend.c and V4L side would just poll the device:
 bridge-wake(). wake() will just store current busy timestamp to the 
 bridge device
 with coarse accuracy, if subdevices are already at active state.
 If subdevices are powered off, it will first power them on and resume them, 
 and then store busy timestamp.
 
 Bridge device would have a delayed task: Check after 3 minutes: If I 
 haven't been busy
 for three minutes, I'll go to sleep. I'll suspend the subdevices and power 
 them off.
 
 The delayed task would refresh itself: check again after last awake time + 
 3 minutes.
 
 Delayed task could be further developed to support multiple suspend states.

There is still an issue: Devices that support FM radio may stay closed, but 
with radio
powered on. This is supported since the beginning by radio application (part of 
xawtv package).

If the device is on radio mode, the only reliable way to power the device off 
is if the
device is muted.

IMO, the proper solution is to provide a core resource locking mechanism, that 
will keep
track about what device resources are in usage (tuner, analog audio/video 
demods, digital
demods, sec, radio reception, i2c buses, etc), and some mechanisms like the 
above that will
power the subdevice off when it is not being used for a given amount of time (a 
Kconfig option
can be added so set the time to X minutes or to disable such mechanism, in 
order to preserve
back compatibility).

Having a core mechanism helps to assure that it will be properly implemented on 
all places.

This locking mechanism will be controlled by the bridge driver.

It is easy to say, but it may be hard to implement, as it may require some 
changes at both the
V4L/DVB core and at the drivers. 


One special case for the locking mechanisms that may or may not be covered by 
such core
resource locking is the access to the I2C buses. Currently, the DVB, V4L and 
remote controller
stacks may try to use resources behind I2C at the same time. The I2C core has a 
locking schema,
but it works only if a transaction is atomically commanded. So, if it requires 
multiple I2C 
transfers, all of them need to be grouped into one i2c xfer call. Complex 
operations like firmware
transfers are protected by the I2C locking, so one driver might be generating 
RC polling events
while a firmware is being transferring, causing it to fail.

Regards,
Mauro
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-07-07 Thread Marko Ristola

Hi.

IMO, your thoughts about core resource locking mechanism sound good.
I say here some thoughts and examples how the resource locking mechanism might 
work.

IMHO, It's good enough now if we are heading to a solution.
At least I would not alone find a proper concept.

07.07.2011 18:14, Mauro Carvalho Chehab kirjoitti:
 Em 06-07-2011 16:59, Marko Ristola escreveu:
 06.07.2011 21:17, Devin Heitmueller kirjoitti:
 On Wed, Jul 6, 2011 at 1:53 PM, Marko Ristola marko.rist...@kolumbus.fi 
 wrote:

 
 IMO, the proper solution is to provide a core resource locking mechanism, 
 that will keep
 track about what device resources are in usage (tuner, analog audio/video 
 demods, digital
 demods, sec, radio reception, i2c buses, etc), and some mechanisms like the 
 above that will
 power the subdevice off when it is not being used for a given amount of time 
 (a Kconfig option
 can be added so set the time to X minutes or to disable such mechanism, in 
 order to preserve
 back compatibility).
 

 One special case for the locking mechanisms that may or may not be covered by 
 such core
 resource locking is the access to the I2C buses. Currently, the DVB, V4L and 
 remote controller
 stacks may try to use resources behind I2C at the same time. The I2C core has 
 a locking schema,
 but it works only if a transaction is atomically commanded. So, if it 
 requires multiple I2C 
 transfers, all of them need to be grouped into one i2c xfer call. Complex 
 operations like firmware
 transfers are protected by the I2C locking, so one driver might be generating 
 RC polling events
 while a firmware is being transferring, causing it to fail.

A generic locking schema could have shared/exclusive locks by name (device 
name, pointer ?).
A generic resource set of named locks could contain these locks.

Firmware load would take an exclusive lock on I2C master for the whole 
transfer.
RC polling would take a shared lock on I2C master and an exclusive lock on 
RC UART device.
Or if there is no need to share I2C device, RC polling would just take 
exclusive lock on I2C Master.

If I2C bus must be quiesced for 10ms after frontend's tuning action, I2C 
master exclusive lock
could be held 10ms after last I2C transfer. i2c/bridge1 state should be 
protected if the frontend
is behind an I2C bridge.

The existing I2C xfer mutex would be as it is now: it is a lower level lock, no 
regressions to come.

Taking a shared lock of tuner_power_switch would mark that the device must 
not be turned off.
While holding the shared lock, no deferred watch would be needed.
While releasing tuner_power_switch lock, usage timestamp on that name should 
be updated.
If there are no more tuner_power_switch holders, delayed task could be 
activated and
run after 3 minutes to power the device off if needed.

Bridge drivers that don't have full runtime power saving support, would
not introduce a callback which a delayed task would run to turn power off / 
on.

 
 Regards,
 Mauro

IMO, suspend / resume code must be a separate thing.

We might want to suspend the laptop while watching a DVB channel.
We don't want to have runtime power management active while watching a DVB 
channel.

Suspend quiesces the device possibly in one phase. It needs to have the device
in a good state before suspending: take an exclusive I2C Master
lock before going to suspend. While resuming, release I2C Master lock.

So even though these details are incomplete, suspend/resume could perhaps
be integrated with the generic advanced locking scheme.

Regards,
Marko
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-07-06 Thread Marko Ristola

Hi.

I think that you could reuse lots of code with smart suspend / resume.

What do you think about this DVB power saving case (about the concept, don't 
look at details, please):

- One device has responsibility to do the power off when it can be done 
(mantis_core.ko)
- In my case there is only one frontend tda10021.ko to take care of.

- dvb_frontend.c would call fe-sleep(fe). The callback goes into 
mantis_core.ko.
- mantis_core.ko will traverse all devices on it's responsibility, all 
(tda10021.ko) are idle.
= suspend tda10021.ko by calling tda10021-sleep() and do additional power off 
things.

- When dvb_frontend.c wants tuner to be woken up,
  mantis_core.ko does hardware resets and power on first and then resumes 
tda10021-init(fe).

I implemented something that worked a few years ago with suspend / resume.
In mantis_dvb.c's driver probe function I modified tuner_ops to enable these 
runtime powersaving features:
+   mantis-fe-ops.tuner_ops.sleep = 
mantis_dvb_tuner_sleep;
+   mantis-fe-ops.tuner_ops.init = mantis_dvb_tuner_init;

That way mantis_core.ko had all needed details to do any advanced power savings 
I wanted.

Suspend / resume worked well: During resume there was only a glitch at the 
picture and sound
and the TV channel watching continued. tda10021 (was cu1216 at that time)
restored the original TV channel. It took DVB FE_LOCK during resume.
Suspended DMA transfer was recovered before returning into userspace.

So I think that you need a single device (mantis_core.ko) that can see the 
whole picture,
in what states the subdevices are: can you touch the power button?.
With DVB this is easy because dvb_frontend.c tells when a frontend is idle and 
when it is not.

The similar idea of some kind of watchdog that is able to track when a single 
device (frontend) is used and when it is not used, would be sufficient.

The topmost driver (mantis_core.ko in my case) would then be responsible to 
track multiple frontends
(subdevices), if they all are idle or not, with suitable mutex protection.
Then this driver could easilly suspend/resume these subdevices and press power 
switch when necessary.


So the clash between DVB and V4L devices would be solved:
Both DVB and V4L calls a (different) sleep() function on mantis_core.ko
mantis_core.ko will turn power off when both frontends are sleeping.
If only one sleeps, the one can be put to sleep or suspended, but power
button can't be touched.

What do you think?

I did this easy case mantis_core.ko solution in about Summer 2007.
It needs a rewrite and testing, if I take it from the dust.

Regards,
Marko Ristola

16.06.2011 15:51, Devin Heitmueller wrote:
 On Thu, Jun 16, 2011 at 7:14 AM, Mauro Carvalho Chehab
 mche...@redhat.com wrote:
 One possible logic that would solve the scripting would be to use a watchdog
 to monitor ioctl activities. If not used for a while, it could send a s_power
 to put the device to sleep, but this may not solve all our problems.

 So, I agree with Devin: we need to add an option to explicitly control the
 power management logic of the device, having 3 modes of operation:
POWER_AUTO - use the watchdogs to poweroff
POWER_ON - explicitly powers on whatever subdevices are needed in
   order to make the V4L ready to stream;
POWER_OFF - Put all subdevices to power-off if they support it.

 After implementing such logic, and keeping the default as POWER_ON, we may
 announce that the default will change to POWER_AUTO, and give some time for
 userspace apps/scripts that need to use a different mode to change their
 behaviour. That means that, for example, radio -qf will need to change to
 POWER_ON mode, and radio -m should call POWER_OFF.
 
 I've considered this idea before, and it's not bad in theory.  The one
 thing you will definitely have to watch out for is causing a race
 between DVB and V4L for hybrid tuners.  In other words, you can have a
 user switching from analog to digital and you don't want the tuner to
 get powered down a few seconds after they started streaming video from
 DVB.
 
 Any such solution would have to take the above into account.  We've
 got a history of race conditions like this and I definitely don't want
 to see a new one introduced.
 
 Devin
 

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


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-07-06 Thread Devin Heitmueller
On Wed, Jul 6, 2011 at 1:53 PM, Marko Ristola marko.rist...@kolumbus.fi wrote:

 Hi.

 I think that you could reuse lots of code with smart suspend / resume.

 What do you think about this DVB power saving case (about the concept, don't 
 look at details, please):

 - One device has responsibility to do the power off when it can be done 
 (mantis_core.ko)
 - In my case there is only one frontend tda10021.ko to take care of.

 - dvb_frontend.c would call fe-sleep(fe). The callback goes into 
 mantis_core.ko.
 - mantis_core.ko will traverse all devices on it's responsibility, all 
 (tda10021.ko) are idle.
 = suspend tda10021.ko by calling tda10021-sleep() and do additional power 
 off things.

 - When dvb_frontend.c wants tuner to be woken up,
  mantis_core.ko does hardware resets and power on first and then resumes 
 tda10021-init(fe).

 I implemented something that worked a few years ago with suspend / resume.
 In mantis_dvb.c's driver probe function I modified tuner_ops to enable these 
 runtime powersaving features:
 +                       mantis-fe-ops.tuner_ops.sleep = 
 mantis_dvb_tuner_sleep;
 +                       mantis-fe-ops.tuner_ops.init = 
 mantis_dvb_tuner_init;

 That way mantis_core.ko had all needed details to do any advanced power 
 savings I wanted.

 Suspend / resume worked well: During resume there was only a glitch at the 
 picture and sound
 and the TV channel watching continued. tda10021 (was cu1216 at that time)
 restored the original TV channel. It took DVB FE_LOCK during resume.
 Suspended DMA transfer was recovered before returning into userspace.

 So I think that you need a single device (mantis_core.ko) that can see the 
 whole picture,
 in what states the subdevices are: can you touch the power button?.
 With DVB this is easy because dvb_frontend.c tells when a frontend is idle 
 and when it is not.

 The similar idea of some kind of watchdog that is able to track when a single
 device (frontend) is used and when it is not used, would be sufficient.

 The topmost driver (mantis_core.ko in my case) would then be responsible to 
 track multiple frontends
 (subdevices), if they all are idle or not, with suitable mutex protection.
 Then this driver could easilly suspend/resume these subdevices and press 
 power switch when necessary.


 So the clash between DVB and V4L devices would be solved:
 Both DVB and V4L calls a (different) sleep() function on mantis_core.ko
 mantis_core.ko will turn power off when both frontends are sleeping.
 If only one sleeps, the one can be put to sleep or suspended, but power
 button can't be touched.

 What do you think?

 I did this easy case mantis_core.ko solution in about Summer 2007.
 It needs a rewrite and testing, if I take it from the dust.

 Regards,
 Marko Ristola

Hi Marko,

This is one of those ideas that sounds good in theory but in practice
getting it to work with all the different types of boards is really a
challenge.  It would need to take into account devices with multiple
frontends, shared tuners between V4L and DVB, shared tuners between
different DVB frontends, etc.

For example, the DVB frontend call to sleep the demod is actually
deferred.  This exposes all sorts of fun races with applications such
as MythTV which switch between DVB and V4L modes in fast succession.
For example, on the HVR-950Q I debugged an issue last year where
switching from DVB to V4L would close the DVB frontend device,
immediately open the V4L device, start tuning the V4L device, and then
a couple hundred milliseconds later the sleep call would arrive from
the DVB frontend thread which would screw up the tuner state.

In other words, the locking is not trivial and you need to take into
account the various threads that can be running.  Taking the above
example, if you had deferred freeing up the device until the sleep
call arrived, then the DVB close would have returned immediately, and
the V4L open would have failed because the device was still in use.

Also, you need to take into consideration that bringing some devices
out of sleep can be a *very* time consuming operation.  This is mostly
due to loading of firmware, which on some devices can take upwards of
ten seconds due to large blobs and slow i2c busses.  Hence if you have
too granular a power management strategy you end up with a situation
where you are continuously calling a resume routine which takes ten
seconds.  This adds up quickly if for example you call v4l2-ctl half a
dozen times before starting streaming.

All that said, I believe that you are correct in that the business
logic needs to ultimately be decided by the bridge driver, rather than
having the dvb/tuner core blindly calling the sleep routines against
the tuner and demod drivers without a full understanding of what
impact it has on the board as a whole.

Cheers,

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a 

Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-07-06 Thread Marko Ristola
06.07.2011 21:17, Devin Heitmueller kirjoitti:
 On Wed, Jul 6, 2011 at 1:53 PM, Marko Ristola marko.rist...@kolumbus.fi 
 wrote:

 
 All that said, I believe that you are correct in that the business
 logic needs to ultimately be decided by the bridge driver, rather than
 having the dvb/tuner core blindly calling the sleep routines against
 the tuner and demod drivers without a full understanding of what
 impact it has on the board as a whole.

You wrote it nicely and compactly.

What do you think about tracking coarse last busy time rather than figuring out 
accurate idle time?

dvb_frontend.c and V4L side would just poll the device:
bridge-wake(). wake() will just store current busy timestamp to the bridge 
device
with coarse accuracy, if subdevices are already at active state.
If subdevices are powered off, it will first power them on and resume them, and 
then store busy timestamp.

Bridge device would have a delayed task: Check after 3 minutes: If I haven't 
been busy
for three minutes, I'll go to sleep. I'll suspend the subdevices and power them 
off.

The delayed task would refresh itself: check again after last awake time + 3 
minutes.

Delayed task could be further developed to support multiple suspend states.

 
 Cheers,
 
 Devin
 


Marko
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-16 Thread Hans Verkuil
On Wednesday, June 15, 2011 22:49:39 Devin Heitmueller wrote:
 On Wed, Jun 15, 2011 at 4:37 PM, Hans Verkuil hverk...@xs4all.nl wrote:
  But the driver has that information, so it should act accordingly.
 
  So on first open you can check whether the current input has a tuner and
  power on the tuner in that case. On S_INPUT you can also poweron/off 
  accordingly
  (bit iffy against the spec, though). So in that case the first use case 
  would
  actually work. It does require that tuner-core.c supports s_power(1), of 
  course.
 
 This will get messy, and is almost certain to get screwed up and cause
 regressions at least on some devices.

I don't see why this should be messy. Anyway, this is all theoretical as long
as tuner-core doesn't support s_power(1). Let's get that in first.

  BTW, I noticed in tuner-core.c that the g_tuner op doesn't wake-up the tuner
  when called. I think it should be added, even though most (all?) tuners will
  need time before they can return anything sensible.
 
 Bear in mind that some tuners can take several seconds to load
 firmware when powered up.  You don't want a situation where the tuner
 is reloading firmware continuously, the net result being that calls to
 v4l2-ctl that used to take milliseconds now take multiple seconds.

Yes, but calling VIDIOC_G_TUNER is a good time to wake up the tuner :-)

  BTW2: it's not a good idea to just broadcast s_power to all subdevs. That 
  should
  be done to the tuner(s) only since other subdevs might also implement 
  s_power.
  For now it's pretty much just tuners and some sensors, though.
 
  You know, this really needs to be a standardized module option and/or sysfs
  entry: 'always on', 'wake up on first open', 'wake up on first use'.
 
 That would definitely be useful, but it shouldn't be a module option
 since you can have multiple devices using the same module.

Of course, I forgot about that.

 It really
 should be an addition to the V4L API.

This would actually for once be a good use of sysfs.

Regards,

Hans
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-16 Thread Mauro Carvalho Chehab
Em 16-06-2011 03:21, Hans Verkuil escreveu:
 On Wednesday, June 15, 2011 22:49:39 Devin Heitmueller wrote:
 On Wed, Jun 15, 2011 at 4:37 PM, Hans Verkuil hverk...@xs4all.nl wrote:
 But the driver has that information, so it should act accordingly.

 So on first open you can check whether the current input has a tuner and
 power on the tuner in that case. On S_INPUT you can also poweron/off 
 accordingly
 (bit iffy against the spec, though). So in that case the first use case 
 would
 actually work. It does require that tuner-core.c supports s_power(1), of 
 course.

 This will get messy, and is almost certain to get screwed up and cause
 regressions at least on some devices.
 
 I don't see why this should be messy. Anyway, this is all theoretical as long
 as tuner-core doesn't support s_power(1). Let's get that in first.

Adding s_power to tuner-core is the easiest part. The hardest one is to decide
what would be the proper behaviour. See bellow.

 BTW, I noticed in tuner-core.c that the g_tuner op doesn't wake-up the tuner
 when called. I think it should be added, even though most (all?) tuners will
 need time before they can return anything sensible.

 Bear in mind that some tuners can take several seconds to load
 firmware when powered up.  You don't want a situation where the tuner
 is reloading firmware continuously, the net result being that calls to
 v4l2-ctl that used to take milliseconds now take multiple seconds.

The question is not when to wake up the tuner, but when to put it to sleep.
Really, the big issue is on USB devices, where we don't want to spend lots
of power while the device is not active. Some devices even become hot when
the tuner is not sleeping. As Devin pointed, some devices like tm6000 take
about 30-45 seconds for loading a firmware (ok, it is a broken design. We should
not take it as a good example).

Currently, there's no way to know when a radio device is being used or not.
Even for video, scripts that call v4l-ctl or v4l2-ctl and then start some
userspace application are there for years. We have even an example for
that at the v4l-utils: contrib/v4l_rec.pl.

One possible logic that would solve the scripting would be to use a watchdog
to monitor ioctl activities. If not used for a while, it could send a s_power
to put the device to sleep, but this may not solve all our problems.

So, I agree with Devin: we need to add an option to explicitly control the
power management logic of the device, having 3 modes of operation:
POWER_AUTO - use the watchdogs to poweroff
POWER_ON - explicitly powers on whatever subdevices are needed in
   order to make the V4L ready to stream;
POWER_OFF - Put all subdevices to power-off if they support it.

After implementing such logic, and keeping the default as POWER_ON, we may
announce that the default will change to POWER_AUTO, and give some time for
userspace apps/scripts that need to use a different mode to change their
behaviour. That means that, for example, radio -qf will need to change to
POWER_ON mode, and radio -m should call POWER_OFF.

It would be good if the API would also provide a way to warn userspace that
a given device supports it or not (maybe at VIDIOC_QUERYCTL?).

I think that such API can be implemented as a new V4L control.

 Yes, but calling VIDIOC_G_TUNER is a good time to wake up the tuner :-)

Not really. Several popular devices load firmware based on the standard (the 
ones based
on xc2028/xc3028/xc4000). So, before sending any tuner command, a VIDIOC_S_STD 
is needed.

 BTW2: it's not a good idea to just broadcast s_power to all subdevs. That 
 should
 be done to the tuner(s) only since other subdevs might also implement 
 s_power.
 For now it's pretty much just tuners and some sensors, though.

 You know, this really needs to be a standardized module option and/or sysfs
 entry: 'always on', 'wake up on first open', 'wake up on first use'.

 That would definitely be useful, but it shouldn't be a module option
 since you can have multiple devices using the same module.
 
 Of course, I forgot about that.
 
 It really
 should be an addition to the V4L API.
 
 This would actually for once be a good use of sysfs.
 
 Regards,
 
   Hans

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


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-16 Thread Devin Heitmueller
On Thu, Jun 16, 2011 at 7:14 AM, Mauro Carvalho Chehab
mche...@redhat.com wrote:
 One possible logic that would solve the scripting would be to use a watchdog
 to monitor ioctl activities. If not used for a while, it could send a s_power
 to put the device to sleep, but this may not solve all our problems.

 So, I agree with Devin: we need to add an option to explicitly control the
 power management logic of the device, having 3 modes of operation:
        POWER_AUTO - use the watchdogs to poweroff
        POWER_ON - explicitly powers on whatever subdevices are needed in
                   order to make the V4L ready to stream;
        POWER_OFF - Put all subdevices to power-off if they support it.

 After implementing such logic, and keeping the default as POWER_ON, we may
 announce that the default will change to POWER_AUTO, and give some time for
 userspace apps/scripts that need to use a different mode to change their
 behaviour. That means that, for example, radio -qf will need to change to
 POWER_ON mode, and radio -m should call POWER_OFF.

I've considered this idea before, and it's not bad in theory.  The one
thing you will definitely have to watch out for is causing a race
between DVB and V4L for hybrid tuners.  In other words, you can have a
user switching from analog to digital and you don't want the tuner to
get powered down a few seconds after they started streaming video from
DVB.

Any such solution would have to take the above into account.  We've
got a history of race conditions like this and I definitely don't want
to see a new one introduced.

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-15 Thread Hans Verkuil
On Saturday, June 11, 2011 19:08:04 Devin Heitmueller wrote:
 On Sat, Jun 11, 2011 at 1:02 PM, Hans Verkuil hverk...@xs4all.nl wrote:
  OK, but how do you get it into standby in the first place? (I must be 
  missing
  something here...)
 
 The tuner core puts the chip into standby when the last V4L filehandle
 is closed.  Yes, I realize this violates the V4L spec since you should
 be able to make multiple calls with something like v4l2-ctl, but
 nobody has ever come up with a better mechanism for knowing when to
 put the device to sleep.

Why would that violate the spec? If the last filehandle is closed, then
you can safely poweroff the tuner. The only exception is when you have a radio
tuner whose audio output is hooked up to some line-in: there you can't power off
the tuner.

 
 We've been forced to choose between the purist perspective, which is
 properly preserving state, never powering down the tuner and sucking
 up 500ma on the USB port when not using the tuner, versus powering
 down the tuner when the last party closes the filehandle, which
 preserves power but breaks v4l2 conformance and in some cases is
 highly noticeable with tuners that require firmware to be reloaded
 when being powered back up.

Seems fine to me. What isn't fine is that a driver like e.g. em28xx powers off
the tuner but doesn't power it on again on the next open. It won't do that
until the first S_FREQUENCY/S_TUNER/S_STD call.

Devin, Mauro, is there anything wrong with adding support for s_power(1) and
calling it in em28xx? A similar power up would be needed in cx23885, au0828,
cx88 and cx231xx.

Mauro, if you agree with this patch, then I'll add it to the tuner patch series.

Tested with em28xx.

Regards,

Hans

diff --git a/drivers/media/video/em28xx/em28xx-video.c 
b/drivers/media/video/em28xx/em28xx-video.c
index 7b6461d..6f3f51b 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -2111,6 +2111,7 @@ static int em28xx_v4l2_open(struct file *filp)
em28xx_wake_i2c(dev);
 
}
+   v4l2_device_call_all(dev-v4l2_dev, 0, core, s_power, 1);
if (fh-radio) {
em28xx_videodbg(video_open: setting radio device\n);
v4l2_device_call_all(dev-v4l2_dev, 0, tuner, s_radio);
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c
index 9b0d833..9006c9a 100644
--- a/drivers/media/video/tuner-core.c
+++ b/drivers/media/video/tuner-core.c
@@ -1057,16 +1057,20 @@ static int tuner_s_radio(struct v4l2_subdev *sd)
 /**
  * tuner_s_power - controls the power state of the tuner
  * @sd: pointer to struct v4l2_subdev
- * @on: a zero value puts the tuner to sleep
+ * @on: a zero value puts the tuner to sleep, non-zero wakes it up
  */
 static int tuner_s_power(struct v4l2_subdev *sd, int on)
 {
struct tuner *t = to_tuner(sd);
struct analog_demod_ops *analog_ops = t-fe.ops.analog_ops;
 
-   /* FIXME: Why this function don't wake the tuner if on != 0 ? */
-   if (on)
+   if (on) {
+   if (t-standby  set_mode(t, t-mode) == 0) {
+   tuner_dbg(Waking up tuner\n);
+   set_freq(t, 0);
+   }
return 0;
+   }
 
tuner_dbg(Putting tuner to sleep\n);
t-standby = true;
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-15 Thread Devin Heitmueller
On Wed, Jun 15, 2011 at 3:55 PM, Hans Verkuil hverk...@xs4all.nl wrote:
 Why would that violate the spec? If the last filehandle is closed, then
 you can safely poweroff the tuner. The only exception is when you have a radio
 tuner whose audio output is hooked up to some line-in: there you can't power 
 off
 the tuner.

The use case that some expect to work is:

v4l2-ctl set standard
v4l2-ctl set frequency
cat /dev/video0  out.mpg

By powering off the tuner after v4l2-ctl closes the device node, the
cat won't work as expected because the tuner will be powered down.

 We've been forced to choose between the purist perspective, which is
 properly preserving state, never powering down the tuner and sucking
 up 500ma on the USB port when not using the tuner, versus powering
 down the tuner when the last party closes the filehandle, which
 preserves power but breaks v4l2 conformance and in some cases is
 highly noticeable with tuners that require firmware to be reloaded
 when being powered back up.

 Seems fine to me. What isn't fine is that a driver like e.g. em28xx powers off
 the tuner but doesn't power it on again on the next open. It won't do that
 until the first S_FREQUENCY/S_TUNER/S_STD call.

You don't want to power up the tuner unless you know the user intends
to use it.  For example, you don't want to power up the tuner if the
user intends to capture on composite/s-video input (as this consumes
considerably more power).

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-15 Thread Hans Verkuil
On Wednesday, June 15, 2011 22:09:45 Devin Heitmueller wrote:
 On Wed, Jun 15, 2011 at 3:55 PM, Hans Verkuil hverk...@xs4all.nl wrote:
  Why would that violate the spec? If the last filehandle is closed, then
  you can safely poweroff the tuner. The only exception is when you have a 
  radio
  tuner whose audio output is hooked up to some line-in: there you can't 
  power off
  the tuner.
 
 The use case that some expect to work is:
 
 v4l2-ctl set standard
 v4l2-ctl set frequency
 cat /dev/video0  out.mpg
 
 By powering off the tuner after v4l2-ctl closes the device node, the
 cat won't work as expected because the tuner will be powered down.
 
  We've been forced to choose between the purist perspective, which is
  properly preserving state, never powering down the tuner and sucking
  up 500ma on the USB port when not using the tuner, versus powering
  down the tuner when the last party closes the filehandle, which
  preserves power but breaks v4l2 conformance and in some cases is
  highly noticeable with tuners that require firmware to be reloaded
  when being powered back up.
 
  Seems fine to me. What isn't fine is that a driver like e.g. em28xx powers 
  off
  the tuner but doesn't power it on again on the next open. It won't do that
  until the first S_FREQUENCY/S_TUNER/S_STD call.
 
 You don't want to power up the tuner unless you know the user intends
 to use it.  For example, you don't want to power up the tuner if the
 user intends to capture on composite/s-video input (as this consumes
 considerably more power).

But the driver has that information, so it should act accordingly.

So on first open you can check whether the current input has a tuner and
power on the tuner in that case. On S_INPUT you can also poweron/off accordingly
(bit iffy against the spec, though). So in that case the first use case would
actually work. It does require that tuner-core.c supports s_power(1), of course.

BTW, I noticed in tuner-core.c that the g_tuner op doesn't wake-up the tuner
when called. I think it should be added, even though most (all?) tuners will
need time before they can return anything sensible.

BTW2: it's not a good idea to just broadcast s_power to all subdevs. That should
be done to the tuner(s) only since other subdevs might also implement s_power.
For now it's pretty much just tuners and some sensors, though.

You know, this really needs to be a standardized module option and/or sysfs
entry: 'always on', 'wake up on first open', 'wake up on first use'.

Regards,

Hans
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-15 Thread Devin Heitmueller
On Wed, Jun 15, 2011 at 4:37 PM, Hans Verkuil hverk...@xs4all.nl wrote:
 But the driver has that information, so it should act accordingly.

 So on first open you can check whether the current input has a tuner and
 power on the tuner in that case. On S_INPUT you can also poweron/off 
 accordingly
 (bit iffy against the spec, though). So in that case the first use case would
 actually work. It does require that tuner-core.c supports s_power(1), of 
 course.

This will get messy, and is almost certain to get screwed up and cause
regressions at least on some devices.

 BTW, I noticed in tuner-core.c that the g_tuner op doesn't wake-up the tuner
 when called. I think it should be added, even though most (all?) tuners will
 need time before they can return anything sensible.

Bear in mind that some tuners can take several seconds to load
firmware when powered up.  You don't want a situation where the tuner
is reloading firmware continuously, the net result being that calls to
v4l2-ctl that used to take milliseconds now take multiple seconds.

 BTW2: it's not a good idea to just broadcast s_power to all subdevs. That 
 should
 be done to the tuner(s) only since other subdevs might also implement s_power.
 For now it's pretty much just tuners and some sensors, though.

 You know, this really needs to be a standardized module option and/or sysfs
 entry: 'always on', 'wake up on first open', 'wake up on first use'.

That would definitely be useful, but it shouldn't be a module option
since you can have multiple devices using the same module.  It really
should be an addition to the V4L API.

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-11 Thread Devin Heitmueller
On Sat, Jun 11, 2011 at 11:05 AM, Hans Verkuil hverk...@xs4all.nl wrote:
 Second version of this patch series.

 It's the same as RFCv1, except that I dropped the g_frequency and
 g_tuner/s_tuner patches (patch 3, 6 and 7 in the original patch series)
 because I need to think more on those, and I added a new fix for tuner_resume
 which was broken as well.

Hi Hans,

I appreciate your taking the time to refactor this code (no doubt it
really needed it).  All that I ask is that you please actually *try*
the resulting patches with VLC and a tuner that supports standby in
order to ensure that it didn't cause any regressions.  This stuff was
brittle to begin with, and there are lots of opportunities for
obscure/unexpected effects resulting from what appear to be sane
changes.

The last series of patches that went in were in response to this stuff
being very broken, and I would hate to see a regression in existing
applications after we finally got it working.

Thanks,

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-11 Thread Hans Verkuil
On Saturday, June 11, 2011 17:32:10 Devin Heitmueller wrote:
 On Sat, Jun 11, 2011 at 11:05 AM, Hans Verkuil hverk...@xs4all.nl wrote:
  Second version of this patch series.
 
  It's the same as RFCv1, except that I dropped the g_frequency and
  g_tuner/s_tuner patches (patch 3, 6 and 7 in the original patch series)
  because I need to think more on those, and I added a new fix for 
  tuner_resume
  which was broken as well.
 
 Hi Hans,
 
 I appreciate your taking the time to refactor this code (no doubt it
 really needed it).  All that I ask is that you please actually *try*
 the resulting patches with VLC and a tuner that supports standby in
 order to ensure that it didn't cause any regressions.

That's easier said than done. I don't think I have tuners of that type.

Do you happen to know not-too-expensive cards that you can buy that have
this sort of tuners? It may be useful to be able to test this myself.

 This stuff was
 brittle to begin with, and there are lots of opportunities for
 obscure/unexpected effects resulting from what appear to be sane
 changes.
 
 The last series of patches that went in were in response to this stuff
 being very broken, and I would hate to see a regression in existing
 applications after we finally got it working.

Yeah, it seems that whenever you touch this tuner code something breaks
for at least one card. There is so much legacy here...

Regards,

Hans
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-11 Thread Andy Walls
Hans Verkuil hverk...@xs4all.nl wrote:

On Saturday, June 11, 2011 17:32:10 Devin Heitmueller wrote:
 On Sat, Jun 11, 2011 at 11:05 AM, Hans Verkuil hverk...@xs4all.nl
wrote:
  Second version of this patch series.
 
  It's the same as RFCv1, except that I dropped the g_frequency and
  g_tuner/s_tuner patches (patch 3, 6 and 7 in the original patch
series)
  because I need to think more on those, and I added a new fix for
tuner_resume
  which was broken as well.
 
 Hi Hans,
 
 I appreciate your taking the time to refactor this code (no doubt it
 really needed it).  All that I ask is that you please actually *try*
 the resulting patches with VLC and a tuner that supports standby in
 order to ensure that it didn't cause any regressions.

That's easier said than done. I don't think I have tuners of that type.

Do you happen to know not-too-expensive cards that you can buy that
have
this sort of tuners? It may be useful to be able to test this myself.

 This stuff was
 brittle to begin with, and there are lots of opportunities for
 obscure/unexpected effects resulting from what appear to be sane
 changes.
 
 The last series of patches that went in were in response to this
stuff
 being very broken, and I would hate to see a regression in existing
 applications after we finally got it working.

Yeah, it seems that whenever you touch this tuner code something breaks
for at least one card. There is so much legacy here...

Regards,

   Hans
--
To unsubscribe from this list: send the line unsubscribe linux-media
in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Devin,

I think I have a Gotview or compro card with an xc2028.  Is that tuner capable 
of standby?  Would the cx18 or ivtv driver need to actively support using stand 
by?

-Andy
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-11 Thread Devin Heitmueller
On Sat, Jun 11, 2011 at 12:06 PM, Andy Walls awa...@md.metrocast.net wrote:
 Devin,

 I think I have a Gotview or compro card with an xc2028.  Is that tuner 
 capable of standby?  Would the cx18 or ivtv driver need to actively support 
 using stand by?

An xc2028/xc3028 should be fine, as that does support standby.  The
problems we saw with VLC were related to calls like G_TUNER returning
prematurely if the device was in standby, leaving the returned
structure populated with garbage.

FWIW, I don't dispute your assertion that Hans found legitimate bugs -
just that we need to be careful to not cause regressions in the cases
that the last round of bug fixes addressed.

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-11 Thread Devin Heitmueller
On Sat, Jun 11, 2011 at 11:53 AM, Hans Verkuil hverk...@xs4all.nl wrote:
 Do you happen to know not-too-expensive cards that you can buy that have
 this sort of tuners? It may be useful to be able to test this myself.

Anything with an xc3028 or xc5000 would have this issue.  I don't
really keep close track of current shipping DVB products, but the 3028
was definitely very chip in products from a couple of years ago.

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFCv2 PATCH 0/5] tuner-core: fix s_std and s_tuner

2011-06-11 Thread Devin Heitmueller
On Sat, Jun 11, 2011 at 1:02 PM, Hans Verkuil hverk...@xs4all.nl wrote:
 OK, but how do you get it into standby in the first place? (I must be missing
 something here...)

The tuner core puts the chip into standby when the last V4L filehandle
is closed.  Yes, I realize this violates the V4L spec since you should
be able to make multiple calls with something like v4l2-ctl, but
nobody has ever come up with a better mechanism for knowing when to
put the device to sleep.

We've been forced to choose between the purist perspective, which is
properly preserving state, never powering down the tuner and sucking
up 500ma on the USB port when not using the tuner, versus powering
down the tuner when the last party closes the filehandle, which
preserves power but breaks v4l2 conformance and in some cases is
highly noticeable with tuners that require firmware to be reloaded
when being powered back up.

Devin

-- 
Devin J. Heitmueller - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html