File Index
Files and directories
Sign in
FILE

ddk750_power.c

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/sm750fb/ddk750_power.c C
  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}
~/ Read-only file preview.