26 Aug, 2017

1 commit

  • The current CEC pin value (0 or 1) was part of the cec_pin struct,
    but that assumes that CEC pin monitoring can only be used with
    a driver that uses the low-level CEC pin framework.

    But hardware that has both a high-level API and can monitor the
    CEC pin at low-level at the same time does not need to depend on
    the cec pin framework.

    To support such devices remove the cur_value field from struct cec_pin
    and add a cec_pin_is_high field to cec_adapter. This also makes it
    possible to drop the '#ifdef CONFIG_CEC_PIN' in cec-api.c.

    Signed-off-by: Hans Verkuil
    Signed-off-by: Mauro Carvalho Chehab

    Hans Verkuil
     

20 Aug, 2017

1 commit

  • The free_irq() function could be called from interrupt context,
    which is invalid. Move this to the thread.

    In the interrupt handler we just request that the thread disables
    the irq. This is done through an atomic so we don't need to add
    any spinlocks.

    Signed-off-by: Hans Verkuil
    Signed-off-by: Mauro Carvalho Chehab

    Hans Verkuil
     

18 Jul, 2017

1 commit

  • Add support for CEC hardware that relies on low-level pin polling or
    GPIO interrupts.

    One example is the Allwinner SoC. But any GPIO-based CEC implementation can
    use this as well.

    A GPIO implementation is very suitable as well for debugging: it can use
    interrupts to detect state changes and report it. Userspace can then verify
    if the bus traffic is correct. This also makes error injection possible.

    The disadvantage is that it is hard to get the timings right since linux
    isn't a hard realtime system.

    In general on an idle system it works quite well, but under load the timer
    will miss its mark every so often.

    The debugfs file /sys/kernel/debug/cec/cecX/status gives some statistics
    with respect to the timer overruns.

    When the adapter is unconfigured and the low-level driver supports
    interrupts, then the interrupt will be used to detect changes. This should
    be quite accurate. But when the adapter is configured a hrtimer has to be
    used.

    The hrtimer implements a state machine where for each state the code will
    read the bus or drive the bus and go on to the next state. It will re-arm
    the timer with a delay based on the next state.

    Signed-off-by: Hans Verkuil
    Reviewed-by: Maxime Ripard
    Signed-off-by: Mauro Carvalho Chehab

    Hans Verkuil