linux/drivers/staging/sm750fb/ddk750_power.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include "ddk750_chip.h"
   3#include "ddk750_reg.h"
   4#include "ddk750_power.h"
   5
   6void ddk750_set_dpms(enum dpms state)
   7{
   8        unsigned int value;
   9
  10        if (sm750_get_chip_type() == SM750LE) {
  11                value = peek32(CRT_DISPLAY_CTRL) & ~CRT_DISPLAY_CTRL_DPMS_MASK;
  12                value |= (state << CRT_DISPLAY_CTRL_DPMS_SHIFT);
  13                poke32(CRT_DISPLAY_CTRL, value);
  14        } else {
  15                value = peek32(SYSTEM_CTRL);
  16                value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state;
  17                poke32(SYSTEM_CTRL, value);
  18        }
  19}
  20
  21static unsigned int get_power_mode(void)
  22{
  23        if (sm750_get_chip_type() == SM750LE)
  24                return 0;
  25        return peek32(POWER_MODE_CTRL) & POWER_MODE_CTRL_MODE_MASK;
  26}
  27
  28/*
  29 * SM50x can operate in one of three modes: 0, 1 or Sleep.
  30 * On hardware reset, power mode 0 is default.
  31 */
  32void sm750_set_power_mode(unsigned int mode)
  33{
  34        unsigned int ctrl = 0;
  35
  36        ctrl = peek32(POWER_MODE_CTRL) & ~POWER_MODE_CTRL_MODE_MASK;
  37
  38        if (sm750_get_chip_type() == SM750LE)
  39                return;
  40
  41        switch (mode) {
  42        case POWER_MODE_CTRL_MODE_MODE0:
  43                ctrl |= POWER_MODE_CTRL_MODE_MODE0;
  44                break;
  45
  46        case POWER_MODE_CTRL_MODE_MODE1:
  47                ctrl |= POWER_MODE_CTRL_MODE_MODE1;
  48                break;
  49
  50        case POWER_MODE_CTRL_MODE_SLEEP:
  51                ctrl |= POWER_MODE_CTRL_MODE_SLEEP;
  52                break;
  53
  54        default:
  55                break;
  56        }
  57
  58        /* Set up other fields in Power Control Register */
  59        if (mode == POWER_MODE_CTRL_MODE_SLEEP) {
  60                ctrl &= ~POWER_MODE_CTRL_OSC_INPUT;
  61#ifdef VALIDATION_CHIP
  62                ctrl &= ~POWER_MODE_CTRL_336CLK;
  63#endif
  64        } else {
  65                ctrl |= POWER_MODE_CTRL_OSC_INPUT;
  66#ifdef VALIDATION_CHIP
  67                ctrl |= POWER_MODE_CTRL_336CLK;
  68#endif
  69        }
  70
  71        /* Program new power mode. */
  72        poke32(POWER_MODE_CTRL, ctrl);
  73}
  74
  75void sm750_set_current_gate(unsigned int gate)
  76{
  77        if (get_power_mode() == POWER_MODE_CTRL_MODE_MODE1)
  78                poke32(MODE1_GATE, gate);
  79        else
  80                poke32(MODE0_GATE, gate);
  81}
  82
  83/*
  84 * This function enable/disable the 2D engine.
  85 */
  86void sm750_enable_2d_engine(unsigned int enable)
  87{
  88        u32 gate;
  89
  90        gate = peek32(CURRENT_GATE);
  91        if (enable)
  92                gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC);
  93        else
  94                gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC);
  95
  96        sm750_set_current_gate(gate);
  97}
  98
  99void sm750_enable_dma(unsigned int enable)
 100{
 101        u32 gate;
 102
 103        /* Enable DMA Gate */
 104        gate = peek32(CURRENT_GATE);
 105        if (enable)
 106                gate |= CURRENT_GATE_DMA;
 107        else
 108                gate &= ~CURRENT_GATE_DMA;
 109
 110        sm750_set_current_gate(gate);
 111}
 112
 113/*
 114 * This function enable/disable the GPIO Engine
 115 */
 116void sm750_enable_gpio(unsigned int enable)
 117{
 118        u32 gate;
 119
 120        /* Enable GPIO Gate */
 121        gate = peek32(CURRENT_GATE);
 122        if (enable)
 123                gate |= CURRENT_GATE_GPIO;
 124        else
 125                gate &= ~CURRENT_GATE_GPIO;
 126
 127        sm750_set_current_gate(gate);
 128}
 129
 130/*
 131 * This function enable/disable the I2C Engine
 132 */
 133void sm750_enable_i2c(unsigned int enable)
 134{
 135        u32 gate;
 136
 137        /* Enable I2C Gate */
 138        gate = peek32(CURRENT_GATE);
 139        if (enable)
 140                gate |= CURRENT_GATE_I2C;
 141        else
 142                gate &= ~CURRENT_GATE_I2C;
 143
 144        sm750_set_current_gate(gate);
 145}
 146