lkml.org 
[lkml]   [2011]   [Jul]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 41/49] gma500: tidying up the power stuff a spot
    Date
    From: Alan Cox <alan@linux.intel.com>

    In particular don't destroy static mutexes, it upsets things

    Signed-off-by: Alan Cox <alan@linux.intel.com>
    ---

    drivers/staging/gma500/power.c | 33 +++++++++++++--------------------
    1 files changed, 13 insertions(+), 20 deletions(-)

    diff --git a/drivers/staging/gma500/power.c b/drivers/staging/gma500/power.c
    index fc2324e..0eee7fb 100644
    --- a/drivers/staging/gma500/power.c
    +++ b/drivers/staging/gma500/power.c
    @@ -27,6 +27,7 @@
    * Massively reworked
    * Alan Cox <alan@linux.intel.com>
    */
    +
    #include "psb_powermgmt.h"
    #include "psb_drv.h"
    #include "psb_reg.h"
    @@ -34,7 +35,8 @@
    #include <linux/mutex.h>
    #include <linux/pm_runtime.h>

    -static struct mutex power_mutex;
    +static struct mutex power_mutex; /* Serialize power ops */
    +static struct mutex power_ctrl_mutex; /* Serialize power claim */

    /**
    * gma_power_init - initialise power manager
    @@ -46,8 +48,7 @@ void gma_power_init(struct drm_device *dev)
    {
    struct drm_psb_private *dev_priv = dev->dev_private;

    - /* FIXME: need to sort out fetching apm_reg for both platforms ?? */
    -
    + /* FIXME: Move APM/OSPM base into relevant device code */
    dev_priv->apm_base = dev_priv->apm_reg & 0xffff;
    dev_priv->ospm_base &= 0xffff;

    @@ -55,6 +56,7 @@ void gma_power_init(struct drm_device *dev)
    dev_priv->display_count = 0; /* Currently no users */
    dev_priv->suspended = false; /* And not suspended */
    mutex_init(&power_mutex);
    + mutex_init(&power_ctrl_mutex);

    dev_priv->ops->init_pm(dev);
    }
    @@ -67,23 +69,15 @@ void gma_power_init(struct drm_device *dev)
    */
    void gma_power_uninit(struct drm_device *dev)
    {
    - mutex_destroy(&power_mutex);
    pm_runtime_disable(&dev->pdev->dev);
    pm_runtime_set_suspended(&dev->pdev->dev);
    }

    -
    -
    -
    /**
    * gma_suspend_display - suspend the display logic
    * @dev: our DRM device
    *
    * Suspend the display logic of the graphics interface
    - *
    - * FIXME: This ought to be replaced by a dev_priv-> ops interface
    - * where the various platforms register their save/restore methods
    - * and keep them in their own support files.
    */
    static void gma_suspend_display(struct drm_device *dev)
    {
    @@ -210,7 +204,6 @@ int gma_power_suspend(struct pci_dev *pdev, pm_message_t state)
    return 0;
    }

    -
    /**
    * gma_power_resume - resume power
    * @pdev: PCI device
    @@ -230,8 +223,6 @@ int gma_power_resume(struct pci_dev *pdev)
    return 0;
    }

    -
    -
    /**
    * gma_power_is_on - returne true if power is on
    * @dev: our DRM device
    @@ -244,7 +235,6 @@ bool gma_power_is_on(struct drm_device *dev)
    return dev_priv->display_power;
    }

    -
    /**
    * gma_power_begin - begin requiring power
    * @dev: our DRM device
    @@ -252,22 +242,22 @@ bool gma_power_is_on(struct drm_device *dev)
    *
    * Begin an action that requires the display power island is enabled.
    * We refcount the islands.
    - *
    - * FIXME: locking
    */
    bool gma_power_begin(struct drm_device *dev, bool force_on)
    {
    struct drm_psb_private *dev_priv = dev->dev_private;
    int ret;

    + mutex_lock(&power_ctrl_mutex);
    /* Power already on ? */
    if (dev_priv->display_power) {
    dev_priv->display_count++;
    pm_runtime_get(&dev->pdev->dev);
    + mutex_unlock(&power_ctrl_mutex);
    return true;
    }
    if (force_on == false)
    - return false;
    + goto out_false;

    /* Ok power up needed */
    ret = gma_resume_pci(dev->pdev);
    @@ -276,12 +266,14 @@ bool gma_power_begin(struct drm_device *dev, bool force_on)
    psb_irq_postinstall(dev);
    pm_runtime_get(&dev->pdev->dev);
    dev_priv->display_count++;
    + mutex_unlock(&power_ctrl_mutex);
    return true;
    }
    +out_false:
    + mutex_unlock(&power_ctrl_mutex);
    return false;
    }

    -
    /**
    * gma_power_end - end use of power
    * @dev: Our DRM device
    @@ -292,8 +284,10 @@ bool gma_power_begin(struct drm_device *dev, bool force_on)
    void gma_power_end(struct drm_device *dev)
    {
    struct drm_psb_private *dev_priv = dev->dev_private;
    + mutex_lock(&power_ctrl_mutex);
    dev_priv->display_count--;
    WARN_ON(dev_priv->display_count < 0);
    + mutex_unlock(&power_ctrl_mutex);
    pm_runtime_put(&dev->pdev->dev);
    }

    @@ -317,4 +311,3 @@ int psb_runtime_idle(struct device *dev)
    else
    return 1;
    }
    -


    \
     
     \ /
      Last update: 2011-07-05 16:55    [W:0.044 / U:30.768 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site