lkml.org 
[lkml]   [2017]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 42/83] [media] cx88: Fix regression in initial video standard setting
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

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

    From: Devin Heitmueller <dheitmueller@kernellabs.com>

    commit 4e0973a918b9a42e217093f078e04a61e5dd95a5 upstream.

    Setting initial standard at the top of cx8800_initdev would cause the
    first call to cx88_set_tvnorm() to return without programming any
    registers (leaving the driver saying it's set to NTSC but the hardware
    isn't programmed). Even worse, any subsequent attempt to explicitly
    set it to NTSC-M will return success but actually fail to program the
    underlying registers unless first changing the standard to something
    other than NTSC-M.

    Set the initial standard later in the process, and make sure the field
    is zero at the beginning to ensure that the call always goes through.

    This regression was introduced in the following commit:

    commit ccd6f1d488e7 ("[media] cx88: move width, height and field to core
    struct")

    Author: Hans Verkuil <hans.verkuil@cisco.com>

    [media] cx88: move width, height and field to core struct

    Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
    Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/media/pci/cx88/cx88-cards.c | 9 ++++++++-
    drivers/media/pci/cx88/cx88-video.c | 2 +-
    2 files changed, 9 insertions(+), 2 deletions(-)

    --- a/drivers/media/pci/cx88/cx88-cards.c
    +++ b/drivers/media/pci/cx88/cx88-cards.c
    @@ -3691,7 +3691,14 @@ struct cx88_core *cx88_core_create(struc
    core->nr = nr;
    sprintf(core->name, "cx88[%d]", core->nr);

    - core->tvnorm = V4L2_STD_NTSC_M;
    + /*
    + * Note: Setting initial standard here would cause first call to
    + * cx88_set_tvnorm() to return without programming any registers. Leave
    + * it blank for at this point and it will get set later in
    + * cx8800_initdev()
    + */
    + core->tvnorm = 0;
    +
    core->width = 320;
    core->height = 240;
    core->field = V4L2_FIELD_INTERLACED;
    --- a/drivers/media/pci/cx88/cx88-video.c
    +++ b/drivers/media/pci/cx88/cx88-video.c
    @@ -1429,7 +1429,7 @@ static int cx8800_initdev(struct pci_dev

    /* initial device configuration */
    mutex_lock(&core->lock);
    - cx88_set_tvnorm(core, core->tvnorm);
    + cx88_set_tvnorm(core, V4L2_STD_NTSC_M);
    v4l2_ctrl_handler_setup(&core->video_hdl);
    v4l2_ctrl_handler_setup(&core->audio_hdl);
    cx88_video_mux(core, 0);

    \
     
     \ /
      Last update: 2017-07-25 22:56    [W:4.021 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site