blob: b6a3929e8bb7db52d37f5f80d0ba2282f4f43731 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2006 by Daniel Ankers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include <stdbool.h>
#include "system.h"
#include "cpu.h"
#include "ascodec.h"
#include "as3514.h"
#include "power.h"
#include "synaptics-mep.h"
#include "lcd.h"
#include "logf.h"
void power_init(void)
{
#ifndef BOOTLOADER
/* Power on and initialize the touchpad here because we need it for
both buttons and button lights */
DEV_INIT2 &= ~0x800;
char byte = ascodec_read(AS3514_CVDD_DCDC3);
byte = (byte & ~0x18) | 0x08;
ascodec_write(AS3514_CVDD_DCDC3, byte);
/* LEDs for REW, FFWD, MENU */
GPIOD_ENABLE |= (0x40 | 0x20 | 0x04);
GPIOD_OUTPUT_VAL |= (0x40 | 0x20 | 0x04);
GPIOD_OUTPUT_EN |= (0x40 | 0x20 | 0x04);
udelay(20000);
GPIOL_ENABLE |= 0x10;
GPIOL_OUTPUT_VAL &= ~0x10;
GPIOL_OUTPUT_EN |= 0x10;
udelay(100000);
/* enable DATA, ACK, CLK lines */
GPIOD_ENABLE |= (0x10 | 0x08 | 0x02);
GPIOD_OUTPUT_EN |= 0x08; /* ACK */
GPIOD_OUTPUT_VAL |= 0x08; /* high */
GPIOD_OUTPUT_EN &= ~0x02; /* CLK */
GPIOD_OUTPUT_EN |= 0x10; /* DATA */
GPIOD_OUTPUT_VAL |= 0x10; /* high */
if (!touchpad_init())
{
logf("touchpad not ready");
}
/* Setups specifically for buttons are handled in button-sa9200.c */
#endif
}
void power_off(void)
{
char byte;
/* Backlight off */
ascodec_write(AS3514_DCDC15, 0);
#ifdef HAVE_LCD_SLEEP
/* LCD off/sleep (otherwise the image slowly fades out) */
lcd_sleep();
#endif
/* Send shutdown command to PMU */
byte = ascodec_read(AS3514_SYSTEM);
byte &= ~0x1;
ascodec_write(AS3514_SYSTEM, byte);
/* Stop interrupts on both cores */
disable_interrupt(IRQ_FIQ_STATUS);
COP_INT_DIS = -1;
CPU_INT_DIS = -1;
/* Halt everything and wait for device to power off */
while (1)
{
COP_CTL = 0x40000000;
CPU_CTL = 0x40000000;
}
}
unsigned int power_input_status(void)
{
unsigned int status = POWER_INPUT_NONE;
/* GPIOF indicates that the connector is present,
GPIOB indicates that there's power there too.
Same status bits for both USB and the charger. */
if (!(GPIOF_INPUT_VAL & 0x80) && (GPIOB_INPUT_VAL & 0x40))
status = POWER_INPUT_MAIN_CHARGER;
return status;
}
void ide_power_enable(bool on)
{
(void)on;
}
|