blob: b3c3791b95bdf72794e23fdc1239f2be757f5766 [file] [log] [blame]
Sudip Mukherjee81dee672015-03-03 16:21:06 +05301#include "ddk750_help.h"
2#include "ddk750_reg.h"
3#include "ddk750_power.h"
4
5void ddk750_setDPMS(DPMS_t state)
6{
7 unsigned int value;
Juston Li40403c12015-07-14 21:14:48 -07008
Juston Li8c11f5a2015-07-14 21:14:35 -07009 if (getChipType() == SM750LE) {
Mike Rapoportcdce1f12016-02-10 18:34:19 +020010 value = PEEK32(CRT_DISPLAY_CTRL) & ~CRT_DISPLAY_CTRL_DPMS_MASK;
11 value |= (state << CRT_DISPLAY_CTRL_DPMS_SHIFT);
12 POKE32(CRT_DISPLAY_CTRL, value);
Juston Li6338a7812015-07-14 21:14:36 -070013 } else {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053014 value = PEEK32(SYSTEM_CTRL);
Mike Rapoporta8856ff2016-01-17 20:04:19 +020015 value = (value & ~SYSTEM_CTRL_DPMS_MASK) | state;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053016 POKE32(SYSTEM_CTRL, value);
17 }
18}
19
Mike Rapoport228a4cf82015-09-30 08:24:58 +030020static unsigned int getPowerMode(void)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053021{
Juston Li9ccc5f42015-07-14 21:14:33 -070022 if (getChipType() == SM750LE)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053023 return 0;
Mike Rapoportf41b17f2016-01-17 20:04:31 +020024 return PEEK32(POWER_MODE_CTRL) & POWER_MODE_CTRL_MODE_MASK;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053025}
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 setPowerMode(unsigned int powerMode)
33{
Juston Li78376532015-07-14 21:14:30 -070034 unsigned int control_value = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053035
Mike Rapoportf41b17f2016-01-17 20:04:31 +020036 control_value = PEEK32(POWER_MODE_CTRL) & ~POWER_MODE_CTRL_MODE_MASK;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053037
Juston Li9ccc5f42015-07-14 21:14:33 -070038 if (getChipType() == SM750LE)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053039 return;
40
Juston Li259fef32015-07-14 21:14:45 -070041 switch (powerMode) {
Juston Li78376532015-07-14 21:14:30 -070042 case POWER_MODE_CTRL_MODE_MODE0:
Mike Rapoportf41b17f2016-01-17 20:04:31 +020043 control_value |= POWER_MODE_CTRL_MODE_MODE0;
Juston Li78376532015-07-14 21:14:30 -070044 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053045
Juston Li78376532015-07-14 21:14:30 -070046 case POWER_MODE_CTRL_MODE_MODE1:
Mike Rapoportf41b17f2016-01-17 20:04:31 +020047 control_value |= POWER_MODE_CTRL_MODE_MODE1;
Juston Li78376532015-07-14 21:14:30 -070048 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053049
Juston Li78376532015-07-14 21:14:30 -070050 case POWER_MODE_CTRL_MODE_SLEEP:
Mike Rapoportf41b17f2016-01-17 20:04:31 +020051 control_value |= POWER_MODE_CTRL_MODE_SLEEP;
Juston Li78376532015-07-14 21:14:30 -070052 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053053
Juston Li78376532015-07-14 21:14:30 -070054 default:
55 break;
56 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +053057
Juston Li78376532015-07-14 21:14:30 -070058 /* Set up other fields in Power Control Register */
Juston Li259fef32015-07-14 21:14:45 -070059 if (powerMode == POWER_MODE_CTRL_MODE_SLEEP) {
Mike Rapoport776980c2016-01-17 20:04:30 +020060 control_value &= ~POWER_MODE_CTRL_OSC_INPUT;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053061#ifdef VALIDATION_CHIP
Mike Rapoport776980c2016-01-17 20:04:30 +020062 control_value &= ~POWER_MODE_CTRL_336CLK;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053063#endif
Juston Li259fef32015-07-14 21:14:45 -070064 } else {
Mike Rapoport776980c2016-01-17 20:04:30 +020065 control_value |= POWER_MODE_CTRL_OSC_INPUT;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053066#ifdef VALIDATION_CHIP
Mike Rapoport776980c2016-01-17 20:04:30 +020067 control_value |= POWER_MODE_CTRL_336CLK;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053068#endif
Juston Li78376532015-07-14 21:14:30 -070069 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +053070
Juston Li78376532015-07-14 21:14:30 -070071 /* Program new power mode. */
72 POKE32(POWER_MODE_CTRL, control_value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053073}
74
75void setCurrentGate(unsigned int gate)
76{
Juston Li78376532015-07-14 21:14:30 -070077 unsigned int gate_reg;
78 unsigned int mode;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053079
Juston Li78376532015-07-14 21:14:30 -070080 /* Get current power mode. */
81 mode = getPowerMode();
Sudip Mukherjee81dee672015-03-03 16:21:06 +053082
Juston Li259fef32015-07-14 21:14:45 -070083 switch (mode) {
Juston Li78376532015-07-14 21:14:30 -070084 case POWER_MODE_CTRL_MODE_MODE0:
85 gate_reg = MODE0_GATE;
86 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053087
Juston Li78376532015-07-14 21:14:30 -070088 case POWER_MODE_CTRL_MODE_MODE1:
89 gate_reg = MODE1_GATE;
90 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053091
Juston Li78376532015-07-14 21:14:30 -070092 default:
93 gate_reg = MODE0_GATE;
94 break;
95 }
96 POKE32(gate_reg, gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053097}
98
99
100
101/*
102 * This function enable/disable the 2D engine.
103 */
104void enable2DEngine(unsigned int enable)
105{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530106 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530107
Juston Li78376532015-07-14 21:14:30 -0700108 gate = PEEK32(CURRENT_GATE);
Sandhya Bankar69988ba2016-03-06 15:07:44 +0530109 if (enable)
Mike Rapoport90946e52016-01-17 20:04:25 +0200110 gate |= (CURRENT_GATE_DE | CURRENT_GATE_CSC);
Sandhya Bankar69988ba2016-03-06 15:07:44 +0530111 else
Mike Rapoport90946e52016-01-17 20:04:25 +0200112 gate &= ~(CURRENT_GATE_DE | CURRENT_GATE_CSC);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530113
Juston Li78376532015-07-14 21:14:30 -0700114 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530115}
116
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530117void enableDMA(unsigned int enable)
118{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530119 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530120
Juston Li78376532015-07-14 21:14:30 -0700121 /* Enable DMA Gate */
122 gate = PEEK32(CURRENT_GATE);
123 if (enable)
Mike Rapoport90946e52016-01-17 20:04:25 +0200124 gate |= CURRENT_GATE_DMA;
Juston Li78376532015-07-14 21:14:30 -0700125 else
Mike Rapoport90946e52016-01-17 20:04:25 +0200126 gate &= ~CURRENT_GATE_DMA;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530127
Juston Li78376532015-07-14 21:14:30 -0700128 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530129}
130
131/*
132 * This function enable/disable the GPIO Engine
133 */
134void enableGPIO(unsigned int enable)
135{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530136 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530137
Juston Li78376532015-07-14 21:14:30 -0700138 /* Enable GPIO Gate */
139 gate = PEEK32(CURRENT_GATE);
140 if (enable)
Mike Rapoport90946e52016-01-17 20:04:25 +0200141 gate |= CURRENT_GATE_GPIO;
Juston Li78376532015-07-14 21:14:30 -0700142 else
Mike Rapoport90946e52016-01-17 20:04:25 +0200143 gate &= ~CURRENT_GATE_GPIO;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530144
Juston Li78376532015-07-14 21:14:30 -0700145 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530146}
147
148/*
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530149 * This function enable/disable the I2C Engine
150 */
151void enableI2C(unsigned int enable)
152{
Amitoj Kaur Chawlaf7415542015-10-18 21:27:57 +0530153 u32 gate;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530154
Juston Li78376532015-07-14 21:14:30 -0700155 /* Enable I2C Gate */
156 gate = PEEK32(CURRENT_GATE);
157 if (enable)
Mike Rapoport90946e52016-01-17 20:04:25 +0200158 gate |= CURRENT_GATE_I2C;
Juston Li78376532015-07-14 21:14:30 -0700159 else
Mike Rapoport90946e52016-01-17 20:04:25 +0200160 gate &= ~CURRENT_GATE_I2C;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530161
Juston Li78376532015-07-14 21:14:30 -0700162 setCurrentGate(gate);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530163}
164
165