summaryrefslogtreecommitdiffstats
path: root/drivers/staging/sm750fb/ddk750_power.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/sm750fb/ddk750_power.c')
-rw-r--r--drivers/staging/sm750fb/ddk750_power.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/drivers/staging/sm750fb/ddk750_power.c b/drivers/staging/sm750fb/ddk750_power.c
new file mode 100644
index 000000000..12834f78e
--- /dev/null
+++ b/drivers/staging/sm750fb/ddk750_power.c
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "ddk750_chip.h"
+#include "ddk750_reg.h"
+#include "ddk750_power.h"
+
+void ddk750_set_dpms(enum dpms state)
+{
+ unsigned int value;
+
+ if (sm750_get_chip_type() == SM750LE) {
+ value = peek32(CRT_DISPLAY_CTRL) & ~CRT_DISPLAY_CTRL_DPMS_MASK;
+ value |= (state << CRT_DISPLAY_CTRL_DPMS_SHIFT);
+ poke32(CRT_DISPLAY_CTRL, value);
+ } else {
+ value = peek32(SYSTEM_CTRL);
+ value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state;
+ poke32(SYSTEM_CTRL, value);
+ }
+}
+
+static unsigned int get_power_mode(void)
+{
+ if (sm750_get_chip_type() == SM750LE)
+ return 0;
+ return peek32(POWER_MODE_CTRL) & POWER_MODE_CTRL_MODE_MASK;
+}
+
+/*
+ * SM50x can operate in one of three modes: 0, 1 or Sleep.
+ * On hardware reset, power mode 0 is default.
+ */
+void sm750_set_power_mode(unsigned int mode)
+{
+ unsigned int ctrl = 0;
+
+ ctrl = peek32(POWER_MODE_CTRL) & ~POWER_MODE_CTRL_MODE_MASK;
+
+ if (sm750_get_chip_type() == SM750LE)
+ return;
+
+ switch (mode) {
+ case POWER_MODE_CTRL_MODE_MODE0:
+ ctrl |= POWER_MODE_CTRL_MODE_MODE0;
+ break;
+
+ case POWER_MODE_CTRL_MODE_MODE1:
+ ctrl |= POWER_MODE_CTRL_MODE_MODE1;
+ break;
+
+ case POWER_MODE_CTRL_MODE_SLEEP:
+ ctrl |= POWER_MODE_CTRL_MODE_SLEEP;
+ break;
+
+ default:
+ break;
+ }
+
+ /* Set up other fields in Power Control Register */
+ if (mode == POWER_MODE_CTRL_MODE_SLEEP) {
+ ctrl &= ~POWER_MODE_CTRL_OSC_INPUT;
+#ifdef VALIDATION_CHIP
+ ctrl &= ~POWER_MODE_CTRL_336CLK;
+#endif
+ } else {
+ ctrl |= POWER_MODE_CTRL_OSC_INPUT;
+#ifdef VALIDATION_CHIP
+ ctrl |= POWER_MODE_CTRL_336CLK;
+#endif
+ }
+
+ /* Program new power mode. */
+ poke32(POWER_MODE_CTRL, ctrl);
+}
+
+void sm750_set_current_gate(unsigned int gate)
+{
+ if (get_power_mode() == POWER_MODE_CTRL_MODE_MODE1)
+ poke32(MODE1_GATE, gate);
+ else
+ poke32(MODE0_GATE, gate);
+}
+
+/*
+ * This function enable/disable the 2D engine.
+ */
+void sm750_enable_2d_engine(unsigned int enable)
+{
+ u32 gate;
+
+ gate = peek32(CURRENT_GATE);
+ if (enable)
+ gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC);
+ else
+ gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC);
+
+ sm750_set_current_gate(gate);
+}
+
+void sm750_enable_dma(unsigned int enable)
+{
+ u32 gate;
+
+ /* Enable DMA Gate */
+ gate = peek32(CURRENT_GATE);
+ if (enable)
+ gate |= CURRENT_GATE_DMA;
+ else
+ gate &= ~CURRENT_GATE_DMA;
+
+ sm750_set_current_gate(gate);
+}
+
+/*
+ * This function enable/disable the GPIO Engine
+ */
+void sm750_enable_gpio(unsigned int enable)
+{
+ u32 gate;
+
+ /* Enable GPIO Gate */
+ gate = peek32(CURRENT_GATE);
+ if (enable)
+ gate |= CURRENT_GATE_GPIO;
+ else
+ gate &= ~CURRENT_GATE_GPIO;
+
+ sm750_set_current_gate(gate);
+}
+
+/*
+ * This function enable/disable the I2C Engine
+ */
+void sm750_enable_i2c(unsigned int enable)
+{
+ u32 gate;
+
+ /* Enable I2C Gate */
+ gate = peek32(CURRENT_GATE);
+ if (enable)
+ gate |= CURRENT_GATE_I2C;
+ else
+ gate &= ~CURRENT_GATE_I2C;
+
+ sm750_set_current_gate(gate);
+}