Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
[firefly-linux-kernel-4.4.55.git] / drivers / staging / gma500 / psb_irq.c
index 4597c88247218d0a496cac4d4beca6ac7700f5c5..9ea37e5888740771f71c705cc551b30496abe68e 100644 (file)
@@ -88,13 +88,12 @@ psb_enable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask)
                u32 reg = psb_pipestat(pipe);
                dev_priv->pipestat[pipe] |= mask;
                /* Enable the interrupt, clear any pending status */
-               if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+               if (gma_power_begin(dev_priv->dev, false)) {
                        u32 writeVal = PSB_RVDC32(reg);
                        writeVal |= (mask | (mask >> 16));
                        PSB_WVDC32(writeVal, reg);
                        (void) PSB_RVDC32(reg);
-                       ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+                       gma_power_end(dev_priv->dev);
                }
        }
 }
@@ -105,39 +104,36 @@ psb_disable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask)
        if ((dev_priv->pipestat[pipe] & mask) != 0) {
                u32 reg = psb_pipestat(pipe);
                dev_priv->pipestat[pipe] &= ~mask;
-               if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+               if (gma_power_begin(dev_priv->dev, false)) {
                        u32 writeVal = PSB_RVDC32(reg);
                        writeVal &= ~mask;
                        PSB_WVDC32(writeVal, reg);
                        (void) PSB_RVDC32(reg);
-                       ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+                       gma_power_end(dev_priv->dev);
                }
        }
 }
 
 void mid_enable_pipe_event(struct drm_psb_private *dev_priv, int pipe)
 {
-       if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+       if (gma_power_begin(dev_priv->dev, false)) {
                u32 pipe_event = mid_pipe_event(pipe);
                dev_priv->vdc_irq_mask |= pipe_event;
                PSB_WVDC32(~dev_priv->vdc_irq_mask, PSB_INT_MASK_R);
                PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
-               ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+               gma_power_end(dev_priv->dev);
        }
 }
 
 void mid_disable_pipe_event(struct drm_psb_private *dev_priv, int pipe)
 {
        if (dev_priv->pipestat[pipe] == 0) {
-               if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+               if (gma_power_begin(dev_priv->dev, false)) {
                        u32 pipe_event = mid_pipe_event(pipe);
                        dev_priv->vdc_irq_mask &= ~pipe_event;
                        PSB_WVDC32(~dev_priv->vdc_irq_mask, PSB_INT_MASK_R);
                        PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
-                       ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+                       gma_power_end(dev_priv->dev);
                }
        }
 }
@@ -242,7 +238,7 @@ irqreturn_t psb_irq_handler(DRM_IRQ_ARGS)
        vdc_stat &= dev_priv->vdc_irq_mask;
        spin_unlock(&dev_priv->irqmask_lock);
 
-       if (dsp_int && ospm_power_is_hw_on(OSPM_DISPLAY_ISLAND)) {
+       if (dsp_int && gma_power_is_on(dev)) {
                psb_vdc_interrupt(dev, vdc_stat);
                handled = 1;
        }
@@ -270,55 +266,29 @@ irqreturn_t psb_irq_handler(DRM_IRQ_ARGS)
 }
 
 void psb_irq_preinstall(struct drm_device *dev)
-{
-       psb_irq_preinstall_islands(dev, OSPM_ALL_ISLANDS);
-}
-
-/**
- * FIXME: should I remove display irq enable here??
- */
-void psb_irq_preinstall_islands(struct drm_device *dev, int hw_islands)
 {
        struct drm_psb_private *dev_priv =
            (struct drm_psb_private *) dev->dev_private;
        unsigned long irqflags;
 
-       PSB_DEBUG_ENTRY("\n");
-
        spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
-       if (hw_islands & OSPM_DISPLAY_ISLAND) {
-               if (ospm_power_is_hw_on(OSPM_DISPLAY_ISLAND)) {
-                       PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
-                       if (dev->vblank_enabled[0])
-                               dev_priv->vdc_irq_mask |=
-                                               _PSB_PIPEA_EVENT_FLAG;
-                       if (dev->vblank_enabled[1])
-                               dev_priv->vdc_irq_mask |=
-                                               _MDFLD_PIPEB_EVENT_FLAG;
-                       if (dev->vblank_enabled[2])
-                               dev_priv->vdc_irq_mask |=
-                                               _MDFLD_PIPEC_EVENT_FLAG;
-               }
-       }
-/* NO I DONT WANT ANY IRQS GRRR FIXMEAC */
-       if (hw_islands & OSPM_GRAPHICS_ISLAND)
-               dev_priv->vdc_irq_mask |= _PSB_IRQ_SGX_FLAG;
-/* */
+       if (gma_power_is_on(dev))
+               PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
+       if (dev->vblank_enabled[0])
+               dev_priv->vdc_irq_mask |= _PSB_PIPEA_EVENT_FLAG;
+       if (dev->vblank_enabled[1])
+               dev_priv->vdc_irq_mask |= _MDFLD_PIPEB_EVENT_FLAG;
+       if (dev->vblank_enabled[2])
+               dev_priv->vdc_irq_mask |= _MDFLD_PIPEC_EVENT_FLAG;
+
        /*This register is safe even if display island is off*/
        PSB_WVDC32(~dev_priv->vdc_irq_mask, PSB_INT_MASK_R);
-
        spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
 }
 
 int psb_irq_postinstall(struct drm_device *dev)
 {
-       return psb_irq_postinstall_islands(dev, OSPM_ALL_ISLANDS);
-}
-
-int psb_irq_postinstall_islands(struct drm_device *dev, int hw_islands)
-{
-
        struct drm_psb_private *dev_priv =
            (struct drm_psb_private *) dev->dev_private;
        unsigned long irqflags;
@@ -327,47 +297,30 @@ int psb_irq_postinstall_islands(struct drm_device *dev, int hw_islands)
 
        spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
-       /*This register is safe even if display island is off*/
+       /* This register is safe even if display island is off */
        PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
+       PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-       if (hw_islands & OSPM_DISPLAY_ISLAND) {
-               if (true/*powermgmt_is_hw_on(dev->pdev, PSB_DISPLAY_ISLAND)*/) {
-                       PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
-
-                       if (dev->vblank_enabled[0])
-                               psb_enable_pipestat(dev_priv, 0,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
-                       else
-                               psb_disable_pipestat(dev_priv, 0,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
-
-                       if (dev->vblank_enabled[1])
-                                       psb_enable_pipestat(dev_priv, 1,
-                                           PIPE_VBLANK_INTERRUPT_ENABLE);
-                       else
-                               psb_disable_pipestat(dev_priv, 1,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
-
-                       if (dev->vblank_enabled[2])
-                               psb_enable_pipestat(dev_priv, 2,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
-                       else
-                               psb_disable_pipestat(dev_priv, 2,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
-               }
-       }
+       if (dev->vblank_enabled[0])
+               psb_enable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
+       else
+               psb_disable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
 
-       spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
+       if (dev->vblank_enabled[1])
+               psb_enable_pipestat(dev_priv, 1, PIPE_VBLANK_INTERRUPT_ENABLE);
+       else
+               psb_disable_pipestat(dev_priv, 1, PIPE_VBLANK_INTERRUPT_ENABLE);
 
+       if (dev->vblank_enabled[2])
+               psb_enable_pipestat(dev_priv, 2, PIPE_VBLANK_INTERRUPT_ENABLE);
+       else
+               psb_disable_pipestat(dev_priv, 2, PIPE_VBLANK_INTERRUPT_ENABLE);
+
+       spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
        return 0;
 }
 
 void psb_irq_uninstall(struct drm_device *dev)
-{
-       psb_irq_uninstall_islands(dev, OSPM_ALL_ISLANDS);
-}
-
-void psb_irq_uninstall_islands(struct drm_device *dev, int hw_islands)
 {
        struct drm_psb_private *dev_priv =
            (struct drm_psb_private *) dev->dev_private;
@@ -377,39 +330,29 @@ void psb_irq_uninstall_islands(struct drm_device *dev, int hw_islands)
 
        spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
-       if (hw_islands & OSPM_DISPLAY_ISLAND) {
-               if (true/*powermgmt_is_hw_on(dev->pdev, PSB_DISPLAY_ISLAND)*/) {
-                       PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
+       PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
 
-                       if (dev->vblank_enabled[0])
-                               psb_disable_pipestat(dev_priv, 0,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
+       if (dev->vblank_enabled[0])
+               psb_disable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
 
-                       if (dev->vblank_enabled[1])
-                               psb_disable_pipestat(dev_priv, 1,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
+       if (dev->vblank_enabled[1])
+               psb_disable_pipestat(dev_priv, 1, PIPE_VBLANK_INTERRUPT_ENABLE);
 
-                       if (dev->vblank_enabled[2])
-                               psb_disable_pipestat(dev_priv, 2,
-                                   PIPE_VBLANK_INTERRUPT_ENABLE);
-               }
-               dev_priv->vdc_irq_mask &= _PSB_IRQ_SGX_FLAG |
-                                         _PSB_IRQ_MSVDX_FLAG |
-                                         _LNC_IRQ_TOPAZ_FLAG;
-       }
-       /*TODO: remove following code*/
-       if (hw_islands & OSPM_GRAPHICS_ISLAND)
-               dev_priv->vdc_irq_mask &= ~_PSB_IRQ_SGX_FLAG;
+       if (dev->vblank_enabled[2])
+               psb_disable_pipestat(dev_priv, 2, PIPE_VBLANK_INTERRUPT_ENABLE);
+
+       dev_priv->vdc_irq_mask &= _PSB_IRQ_SGX_FLAG |
+                                 _PSB_IRQ_MSVDX_FLAG |
+                                 _LNC_IRQ_TOPAZ_FLAG;
 
-       /*These two registers are safe even if display island is off*/
+       /* These two registers are safe even if display island is off */
        PSB_WVDC32(~dev_priv->vdc_irq_mask, PSB_INT_MASK_R);
        PSB_WVDC32(dev_priv->vdc_irq_mask, PSB_INT_ENABLE_R);
 
        wmb();
 
-       /*This register is safe even if display island is off*/
+       /* This register is safe even if display island is off */
        PSB_WVDC32(PSB_RVDC32(PSB_INT_IDENTITY_R), PSB_INT_IDENTITY_R);
-
        spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
 }
 
@@ -420,8 +363,7 @@ void psb_irq_turn_on_dpst(struct drm_device *dev)
        u32 hist_reg;
        u32 pwm_reg;
 
-       if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+       if (gma_power_begin(dev, false)) {
                PSB_WVDC32(1 << 31, HISTOGRAM_LOGIC_CONTROL);
                hist_reg = PSB_RVDC32(HISTOGRAM_LOGIC_CONTROL);
                PSB_WVDC32(1 << 31, HISTOGRAM_INT_CONTROL);
@@ -443,7 +385,7 @@ void psb_irq_turn_on_dpst(struct drm_device *dev)
                PSB_WVDC32(pwm_reg | 0x80010100 | PWM_PHASEIN_ENABLE,
                                                        PWM_CONTROL_LOGIC);
 
-               ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+               gma_power_end(dev);
        }
 }
 
@@ -472,8 +414,7 @@ void psb_irq_turn_off_dpst(struct drm_device *dev)
        u32 hist_reg;
        u32 pwm_reg;
 
-       if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+       if (gma_power_begin(dev, false)) {
                PSB_WVDC32(0x00000000, HISTOGRAM_INT_CONTROL);
                hist_reg = PSB_RVDC32(HISTOGRAM_INT_CONTROL);
 
@@ -484,7 +425,7 @@ void psb_irq_turn_off_dpst(struct drm_device *dev)
                                                        PWM_CONTROL_LOGIC);
                pwm_reg = PSB_RVDC32(PWM_CONTROL_LOGIC);
 
-               ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+               gma_power_end(dev);
        }
 }
 
@@ -526,18 +467,16 @@ static int psb_vblank_do_wait(struct drm_device *dev,
  */
 int psb_enable_vblank(struct drm_device *dev, int pipe)
 {
-       struct drm_psb_private *dev_priv =
-           (struct drm_psb_private *) dev->dev_private;
+       struct drm_psb_private *dev_priv = dev->dev_private;
        unsigned long irqflags;
        uint32_t reg_val = 0;
        uint32_t pipeconf_reg = mid_pipeconf(pipe);
 
        PSB_DEBUG_ENTRY("\n");
 
-       if (ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
-                                                       OSPM_UHB_ONLY_IF_ON)) {
+       if (gma_power_begin(dev, false)) {
                reg_val = REG_READ(pipeconf_reg);
-               ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+               gma_power_end(dev);
        }
 
        if (!(reg_val & PIPEACONF_ENABLE))
@@ -545,7 +484,6 @@ int psb_enable_vblank(struct drm_device *dev, int pipe)
 
        spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
-       drm_psb_disable_vsync = 0;
        mid_enable_pipe_event(dev_priv, pipe);
        psb_enable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_ENABLE);
 
@@ -559,15 +497,13 @@ int psb_enable_vblank(struct drm_device *dev, int pipe)
  */
 void psb_disable_vblank(struct drm_device *dev, int pipe)
 {
-       struct drm_psb_private *dev_priv =
-           (struct drm_psb_private *) dev->dev_private;
+       struct drm_psb_private *dev_priv = dev->dev_private;
        unsigned long irqflags;
 
        PSB_DEBUG_ENTRY("\n");
 
        spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
 
-       drm_psb_disable_vsync = 1;
        mid_disable_pipe_event(dev_priv, pipe);
        psb_disable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_ENABLE);
 
@@ -603,7 +539,7 @@ u32 psb_get_vblank_counter(struct drm_device *dev, int pipe)
                return 0;
        }
 
-       if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, false))
+       if (!gma_power_begin(dev, false))
                return 0;
 
        reg_val = REG_READ(pipeconf_reg);
@@ -632,7 +568,7 @@ u32 psb_get_vblank_counter(struct drm_device *dev, int pipe)
 
 psb_get_vblank_counter_exit:
 
-       ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
+       gma_power_end(dev);
 
        return count;
 }