1. 17 6月, 2015 18 次提交
    • T
      OMAPDSS: HDMI: wait for framedone when stopping video · a9fad688
      Tomi Valkeinen 提交于
      At the moment when HDMI video output is stopped, we just clear the
      enable bit and return. While it's unclear if this can cause any issues,
      I think it's still better to wait for FRAMEDONE interrupt after clearing
      the enable bit so that we're sure the HDMI IP has finished.
      
      As we don't have any ready-made irq handling for HDMI, and this only
      needs to be done when disabling the HDMI output, this patch implements a
      simple loop with sleep, polling the FRAMEDONE bit.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      a9fad688
    • T
      OMAPDSS: HDMI4: fix error handling · 9bba13f0
      Tomi Valkeinen 提交于
      Error handling in hdmi_power_on_full() is not correct, and could leave
      resources unfreed.
      
      Fix this by arranging the error labels correctly.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      9bba13f0
    • T
      OMAPDSS: DISPC: scaler debug print · e4c5ae7f
      Tomi Valkeinen 提交于
      Improve the DISPC debug print for scaling.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      e4c5ae7f
    • T
      OMAPDSS: DISPC: do only y decimation on OMAP3 · 7059e3d8
      Tomi Valkeinen 提交于
      The current driver does both x and y decimation on OMAP3 DSS. Testing
      shows that x decimation rarely works, leading to underflows.
      
      The exact reason for this is unclear, as the underflows seem to happen
      even with low pixel clock rates, and I would presume that if the DSS can
      manage a display with 140MHz pixel clock, it could manage x decimation
      with factor 2 with a low pixel clock (~30MHz).
      
      So it is possible that there is a problem somewhere else, in memory
      management, or DSS DMA, or similar. I have not found anything that would
      help this.
      
      So, to fix the downscaling scaling, this patch removes x decimation for
      OMAP3. This will limit some of the more demanding downscaling scenarios,
      but one could argue that using DSS to downscale such a large amount is
      insane in the first place, as the produced image is rather bad quality.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      7059e3d8
    • T
      OMAPDSS: DISPC: check if scaling setup failed · 3ce17b48
      Tomi Valkeinen 提交于
      The DISPC's scaling code seems to presume that decimation always
      succeeds, and so we always do find a suitable downscaling setup.
      However, this is not the case, and the algorithm can fail.
      
      When that happens, the code just proceeds with wrong results, causing
      issues later.
      
      Add the necessary checks to bail out if the scaling algorithm failed.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      3ce17b48
    • T
      OMAPDSS: DISPC: fix 64 bit issue in 5-tap · c582935c
      Tomi Valkeinen 提交于
      The DISPC driver uses 64 bit arithmetic to calculate the required clock
      rate for scaling. The code does not seem to work correctly, and instead
      calculates with 32 bit numbers, giving wrong result.
      
      Fix the code by typecasting values to u64 first, so that the
      calculations do happen in 64 bits.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      c582935c
    • T
      OMAPDSS: DISPC: fix row_inc for OMAP3 · f2aee319
      Tomi Valkeinen 提交于
      pixel_inc and row_inc work differently on OMAP2/3 and OMAP4+ DSS. On
      OMAP2/3 DSS, the pixel_inc is _not_ added by the HW at the end of the
      line, after the last pixel, whereas on OMAP4+ it is.
      
      The driver currently works for OMAP4+, but does not handle OMAP2/3
      correctly, which leads to tilted image when row_inc is used.
      
      This patch adds a flag to DISPC driver so that the pixel_inc is added
      when required.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      f2aee319
    • T
      OMAPDSS: DISPC: add check for scaling limits · ab6b2582
      Tomi Valkeinen 提交于
      On OMAP3/AM43xx some scaling factors cause underflows/synclosts. After
      studying this, I found that sometimes the driver uses three-tap scaling
      with downscaling factor smaller than x0.5. This causes issues, as x0.5
      is the limit for three-tap scaling.
      
      The driver has FEAT_PARAM_DOWNSCALE parameter, but that seems to be for
      five-tap scaling, which allows scaling down to x0.25.
      
      This patch adds checks for both horizontal and vertical scaling. For
      horizontal the HW always uses 5 taps, so the limit is x0.25.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      ab6b2582
    • T
      OMAPDSS: DISPC: fix check_horiz_timing_omap3 args · f5a73482
      Tomi Valkeinen 提交于
      After calculating the required decimation for scaling, the dispc driver
      checks once more if the resulting configuration is valid by calling
      check_horiz_timing_omap3().
      
      Earlier calls to this function have correctly used in_width and
      in_height as parameters, but the last call uses width and height. This
      causes the driver to possibly reject scaling that would work.
      
      This patch fixes the parameters.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      f5a73482
    • T
      OMAPDSS: DISPC: fix predecimation for YUV modes · c4661b33
      Tomi Valkeinen 提交于
      DISPC needs even input buffer width for YUV modes. The DISPC driver
      doesn't check this at the moment (although omapdrm does), but worse,
      when DISPC driver does x predecimation the result may be uneven. This
      causes sometimes sync losts, underflows, or just visual errors.
      
      This patch makes DISPC driver return an error if the user gives uneven
      input width for a YUV buffer. It also makes the input width even in case
      of predecimation.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      c4661b33
    • T
      OMAPDSS: DISPC: work-around for errata i631 · 3397cc6a
      Tomi Valkeinen 提交于
      Errata i631 description:
      
      "When in YUV4:2:0 format in 1D burst, the DISPC DMA skips lines when
      fetching Chroma sampling."
      
      Workaround:
      
      "If YUV4:2:0-1D burst is required: Set
      DISPC_VIDp_ATTRIBUTES[22]DOUBLESTRIDE to 0x0 and
      DISPC_VIDp_ATTRIBUTES[13:12]ROTATION to 0x1 or 0x3"
      
      The description is somewhat confusing, but testing has shown that DSS
      fetches extra rows from memory when using NV12 format in 1D mode. If the
      memory after the framebuffer is inaccessible, this leads to OCP errors.
      
      The driver always uses DOUBLESTRIDE=0 when using 1D mode, so we only
      need to handle the ROTATION part.
      
      The issue exist on all OMAP4 and OMAP5 based DSS IPs.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      3397cc6a
    • T
      OMAPDSS: simplify submodule reg/unreg code · ad4eaef7
      Tomi Valkeinen 提交于
      Now that we are using components in omapdss, there's no need for
      separate handling of dss and dispc driver init. Thus we can move the dss
      and dispc init and unit func pointers to the lists we use for the other
      dss submodules.
      
      We can now also handle errors returned by the registration functions
      properly: if registering a driver fails, we can stop processing and
      return the error.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      ad4eaef7
    • T
      OMAPDSS: componentize omapdss · 736e60dd
      Tomi Valkeinen 提交于
      omapdss kernel module contains drivers for multiple devices, one for
      each DSS submodule. The probing we have at the moment is a mess, and
      doesn't give us proper deferred probing nor ensure that all the devices
      are probed before omapfb/omapdrm start using omapdss.
      
      This patch solves the mess by using the component system for DSS
      submodules.
      
      The changes to all DSS submodules (dispc, dpi, dsi, hdmi4/5, rfbi, sdi,
      venc) are the same: probe & remove functions are changed to bind &
      unbind, and new probe & remove functions are added which call
      component_add/del.
      
      The dss_core driver (dss.c) acts as a component master. Adding and
      matching the components is simple: all dss device's child devices are
      added as components.
      
      However, we do have some dependencies between the drivers. The order in
      which they should be probed is reflected by the list in core.c
      (dss_output_drv_reg_funcs). The drivers are registered in that order,
      which causes the components to be added in that order, which makes the
      components to be bound in that order. This feels a bit fragile, and we
      probably should improve the code to manage binds in random order.
      However, for now, this works fine.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      736e60dd
    • T
      OMAPDSS: reorder uninit calls · 606ae486
      Tomi Valkeinen 提交于
      We have a list of function pointers to dss submodule uninit functions.
      It makes sense to do the uninit in the reverse order to init, but that
      is not currently the case.
      
      This patch reorders the uninit calls to be the reverse of init order.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      606ae486
    • T
      OMAPDSS: remove uses of __init/__exit · ede92695
      Tomi Valkeinen 提交于
      The following patches will add component handling to omapdss, improving
      the handling of deferred probing. However, at the moment we're using
      quite a lot of __inits and __exits in the driver, which prevent normal
      dynamic probing and removal.
      
      This patch removes most of the uses of __init and __exit, so that we can
      register drivers after module init, and so that we can unregister
      drivers even if the module is built-in.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      ede92695
    • T
      OMAPDSS: fix dss_init_ports error handling · f5a1a1f8
      Tomi Valkeinen 提交于
      The return value of dss_init_ports() is not handled at all, causing
      crashes later if the call failed.
      
      This patch adds the error handling, and we also move the call to a
      slightly earlier place to make bailing out easier.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      f5a1a1f8
    • T
      OMAPDSS: refactor dss probe function · 7e328f5a
      Tomi Valkeinen 提交于
      Refactor dss probe function by extracting the setup for video plls into
      a separate function. The call to this function is also moved to a
      slightly earlier phase, so that in error case we can bail out more
      easily.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      7e328f5a
    • T
      OMAPDSS: move 'dss_initialized' to dss driver · f99467b3
      Tomi Valkeinen 提交于
      We have a flag, 'dss_initialized', which tells omapfb and omapdrm if
      omapdss is available. At the moment it can be set even if the dss
      submodules are not all ready, in case something gets deferred.
      
      Move the flag to dss_core driver so that it'll signal the availability
      of the dss drivers move accurately.
      
      For now, it'll signal that dss_core is ready, which is not quite correct
      but still better than previously.  The following patches will add
      component system to omapdss, and after those patches 'dss_initialized'
      will signal that all the submodules are ready.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Acked-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      f99467b3
  2. 12 6月, 2015 1 次提交
  3. 03 6月, 2015 5 次提交
  4. 20 4月, 2015 2 次提交
  5. 26 2月, 2015 11 次提交
    • T
      OMAPDSS: workaround for MFLAG + NV12 issue · fe59e5cf
      Tomi Valkeinen 提交于
      It was found that having two displays enabled and having an NV12 overlay
      on one of the displays will cause underflows/synclosts. Debugging this
      pointed to some issue with MFLAG.
      
      It is unclear why this issue is happening, but it looks like there is a
      HW bug related to MFLAG and FIFO management. Disabling MFLAG makes this
      issue go away, but then we lose the benefit of MFLAG. Also forcing MFLAG
      always on makes the issue go away.
      
      Also, using certain values for MFLAG_START, MFLAG thresholds and PRELOAD
      makes the issue go away, but there was no obvious logic to which values
      work and which don't.
      
      As a workaround until more information about this is found, force MFLAG
      always on to make NV12 usable.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      fe59e5cf
    • T
      OMAPDSS: Add support for MFLAG · c64aa3a6
      Tomi Valkeinen 提交于
      OMAP5 has support for MFLAG feature, which allows DSS to dynamically
      increase the priority of DISPC's DMA traffic. At the moment we don't
      have support for it.
      
      It was noticed that on DRA7 with high bandwidth use cases we see FIFO
      underflows. Implementing MFLAG support removed those underflows.
      Interestingly, on OMAP5 uEVM no such overflows were seen.
      
      This patch adds a simple MFLAG implementation, where we use a fixed
      MFLAG threshold value based on the FIFO size. The thresholds are set to
      4/8 of fifo size for low threshold, and 5/8 of fifo size for high
      threshold.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      c64aa3a6
    • T
      OMAPDSS: setup default fifo thresholds · 47fc469b
      Tomi Valkeinen 提交于
      At the moment we don't setup FIFO thresholds by default in omapdss. It's
      supposed to be done by the user of omapdss. And that is missing from
      omapdrm, causing unoptimal thresholds to be used when using omapdrm.
      
      While I believe it's in theory better to allow the user of omapdss to
      setup the fifo thresholds, in practice we always use the same values,
      and we could as well setup the thresholds in omapdss.
      
      Furthermore, in omapdss init we always swap the FIFO used for GFX and WB
      overlays, but we don't swap the FIFO thresholds for those overlays
      (which is the reason for omapdrm using unoptimal HW reset values). So
      it would make sense to setup the thresholds to account for the swapping
      of the FIFOs.
      
      So, this patch adds code to setup default FIFO tresholds at omapdss
      init.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      47fc469b
    • T
      OMAPDSS: DISPC: lock access to DISPC_CONTROL & DISPC_CONFIG · d49cd155
      Tomi Valkeinen 提交于
      Dispc driver presumes that the callers handle locking for all normal
      functions. However, omapdrm doesn't handle this, and presumes that all
      overlay manager registers are private to that overlay manager, and thus
      presumes that configurations for overlay managers can be written via
      different threads freely.
      
      For many registers the above is true. The exceptions are DISPC_CONTROL
      and DISPC_CONFIG registers, which contain bits for both LCD and TV
      overlay managers.
      
      Fixing this properly in omapdrm means a big omapdrm rewrite. So, for
      now, add locking to dispc for the problematic registers.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Reported-by: NSomnath Mukherjee <somnath@ti.com>
      d49cd155
    • T
      OMAPDSS: DISPC: fix div by zero issue in overlay scaling · 4e1d3ca0
      Tomi Valkeinen 提交于
      omapdrm doesn't always configure the overlays correctly, causing the
      overlay setup functions to be called with zero timings. This leads to
      division by zero error.
      
      This happens, for example, when a HDMI cable is not connected, but a
      user tries to setup a plane with scaling.
      
      Fixing omapdrm is a big job, so for now let's check for the bad timings
      in DISPC and return an error.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      4e1d3ca0
    • T
      OMAPDSS: DISPC: change sync_pclk_edge default value · 386f167c
      Tomi Valkeinen 提交于
      The common 'struct videomode' does not have a flag to select when the
      sync signals should be driven.
      
      The default behavior of DISPC HW is to drive the sync signal on the
      opposite pixel clock edge from data signal, which is also what the
      videomode_to_omap_video_timings() uses.
      
      However, it looks like what panels usually expect is that the data and
      sync signals are driven on the same edge, so let's change
      videomode_to_omap_video_timings() to set the sync_pclk_edge accordingly.
      
      Note that this only affect panels drivers that use
      videomode_to_omap_video_timings(), probably when getting the video
      timings directly from DT data. The drivers can still configure the
      sync_pclk_edge independently if they so wish.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      386f167c
    • T
      OMAPDSS: DISPC: explicit handling for sync and de levels · ed351881
      Tomi Valkeinen 提交于
      When configuring the lcd timings, instead of writing enum values
      directly to the HW, use switch-case to get the value to be programmed.
      
      This is safer and also allows us to change the enum values.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      ed351881
    • T
      OMAPDSS: DISPC: remove OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES · 7a16360d
      Tomi Valkeinen 提交于
      DISPC can drive data lines either on rising or falling pixel clock edge,
      which can be configured by the user.
      
      Sync lines can also be driven on rising or falling pixel clock edge, but
      additionally the HW can be configured to drive the sync lines on
      opposite clock edge from the data lines.
      
      This opposite edge setting does not make any sense, as the same effect
      can be achieved by just setting the sync lines to be driven on the other
      edge compared to the data lines. It feels like some kind of backward
      compatibility option, even if all DSS versions seem to have the same
      implementation.
      
      To simplify the code and configuration of the signals, and to make the
      dispc timings more compatible with what is used on other platforms,
      let's just remove the whole opposite-edge support.
      
      The drivers that used OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES setting are
      changed so that they use the opposite setting from the data edge.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      7a16360d
    • T
      OMAPDSS: TFP410: fix input sync signals · 6246c8b5
      Tomi Valkeinen 提交于
      TFP410 requires that DE is active high and the data and syncs are driven
      on rising pixel clock edge. However, at the moment the driver doesn't
      request such syncs, and the end result is that the sync settings depend
      on default values, which are not right in all cases.
      
      Set the sync values explicitly.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      6246c8b5
    • T
      OMAPDSS: fix paddr check for TILER addresses · e566658f
      Tomi Valkeinen 提交于
      The DISPC driver checks that the buffer address is not 0. However, when
      using TILER, the address space is TILER specific and 0 is a valid
      address.
      
      Fix the check to allow address of 0 for TILER.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Reported-by: Nsrinivas pulukuru <srinivas.pulukuru@ti.com>
      e566658f
    • T
      OMAPDSS: fix regression with display sysfs files · a38bb793
      Tomi Valkeinen 提交于
      omapdss's sysfs directories for displays used to have 'name' file,
      giving the name for the display. This file was later renamed to
      'display_name' to avoid conflicts with i2c sysfs 'name' file. Looks like
      at least xserver-xorg-video-omap3 requires the 'name' file to be
      present.
      
      To fix the regression, this patch creates new kobjects for each display,
      allowing us to create sysfs directories for the displays. This way we
      have the whole directory for omapdss, and there will be no sysfs file
      clashes with the underlying display device's sysfs files.
      
      We can thus add the 'name' sysfs file back.
      Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
      Tested-by: NNeilBrown <neilb@suse.de>
      a38bb793
  6. 25 2月, 2015 2 次提交
  7. 23 2月, 2015 1 次提交