480c663e5b
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29122 a1c6a512-1295-4272-9138-f99709370657
151 lines
5.4 KiB
C
151 lines
5.4 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2010 by Michael Sevakis
|
|
*
|
|
* i.MX31 DVFS and DPTC driver declarations
|
|
*
|
|
* 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef _DVFS_DPTC_IMX31_H_
|
|
#define _DVFS_DPTC_IMX31_H_
|
|
|
|
/* DVFS load tracking signals */
|
|
enum DVFS_LT_SIGS
|
|
{
|
|
DVFS_LT_SIG_M3IF_M0_BUF = 0, /* Hready signal of M3IF's master #0
|
|
(L2 Cache) */
|
|
DVFS_LT_SIG_M3IF_M1 = 1, /* Hready signal of M3IF's master #1
|
|
(L2 Cache) */
|
|
DVFS_LT_SIG_MBX_MBXCLKGATE = 2, /* Hready signal of M3IF's master #2
|
|
(MBX) */
|
|
DVFS_LT_SIG_M3IF_M3 = 3, /* Hready signal of M3IF's master #3
|
|
(MAX) */
|
|
DVFS_LT_SIG_M3IF_M4 = 4, /* Hready signal of M3IF's master #4
|
|
(SDMA) */
|
|
DVFS_LT_SIG_M3IF_M5 = 5, /* Hready signal of M3IF's master #5
|
|
(mpeg4_vga_encoder) */
|
|
DVFS_LT_SIG_M3IF_M6 = 6, /* Hready signal of M3IF's master #6
|
|
(IPU) */
|
|
DVFS_LT_SIG_M3IF_M7 = 7, /* Hready signal of M3IF's master #7
|
|
(IPU) */
|
|
DVFS_LT_SIG_ARM11_P_IRQ_B_RBT_GATE = 8, /* ARM normal interrupt */
|
|
DVFS_LT_SIG_ARM11_P_FIQ_B_RBT_GATE = 9, /* ARM fast interrupt */
|
|
DVFS_LT_SIG_IPI_GPIO1_INT0 = 10, /* Interrupt line from GPIO */
|
|
DVFS_LT_SIG_IPI_INT_IPU_FUNC = 11, /* Interrupt line from IPU */
|
|
DVFS_LT_SIG_DVGP0 = 12, /* Software-controllable general-purpose
|
|
bits from the CCM */
|
|
DVFS_LT_SIG_DVGP1 = 13, /* Software-controllable general-purpose
|
|
bits from the CCM */
|
|
DVFS_LT_SIG_DVGP2 = 14, /* Software-controllable general-purpose
|
|
bits from the CCM */
|
|
DVFS_LT_SIG_DVGP3 = 15, /* Software-controllable general-purpose
|
|
bits from the CCM */
|
|
};
|
|
|
|
|
|
enum DVFS_DVGPS
|
|
{
|
|
DVFS_DVGP_0 = 0,
|
|
DVFS_DVGP_1,
|
|
DVFS_DVGP_2,
|
|
DVFS_DVGP_3,
|
|
};
|
|
|
|
union dvfs_dptc_voltage_table_entry
|
|
{
|
|
uint8_t sw[4]; /* Access as array */
|
|
|
|
struct
|
|
{
|
|
/* Chosen by PMIC pin states */
|
|
/* when SWxABDVS bit is 1: */
|
|
/* DVSSWxA DVSSWxB */
|
|
uint8_t sw1a; /* 0 0 */
|
|
uint8_t sw1advs; /* 1 0 */
|
|
uint8_t sw1bdvs; /* 0 1 */
|
|
uint8_t sw1bstby; /* 1 1 */
|
|
};
|
|
};
|
|
|
|
|
|
struct dptc_dcvr_table_entry
|
|
{
|
|
uint32_t dcvr0; /* DCVR register values for working point */
|
|
uint32_t dcvr1;
|
|
uint32_t dcvr2;
|
|
uint32_t dcvr3;
|
|
};
|
|
|
|
|
|
struct dvfs_clock_table_entry
|
|
{
|
|
uint32_t pll_val; /* Setting for target PLL */
|
|
uint32_t pdr_val; /* Post-divider for target setting */
|
|
uint32_t pll_num : 1; /* 1 = MCU PLL, 0 = Serial PLL */
|
|
uint32_t vscnt : 3; /* Voltage scaling counter, CKIL delay */
|
|
};
|
|
|
|
|
|
struct dvfs_lt_signal_descriptor
|
|
{
|
|
uint8_t weight : 3; /* Signal weight = 0-7 */
|
|
uint8_t detect : 1; /* 1 = edge-detected */
|
|
};
|
|
|
|
#define DVFS_NUM_LEVELS 4
|
|
#define DPTC_NUM_WP 17
|
|
|
|
/* 0 and 3 are *required*. DVFS hardware depends upon DVSUP pins showing
|
|
* minimum (11) and maximum (00) levels or interrupts will be continuously
|
|
* asserted. */
|
|
#define DVFS_LEVEL_0 (1u << 0)
|
|
#define DVFS_LEVEL_1 (1u << 1)
|
|
#define DVFS_LEVEL_2 (1u << 2)
|
|
#define DVFS_LEVEL_3 (1u << 3)
|
|
|
|
/* DVFS+DPTC */
|
|
void dvfs_dptc_init(void);
|
|
unsigned int dvfs_dptc_get_voltage(void);
|
|
|
|
/* DVFS */
|
|
void dvfs_start(void);
|
|
void dvfs_stop(void);
|
|
bool dvfs_enabled(void);
|
|
unsigned int dvfs_level_mask(void);
|
|
void dvfs_set_level(unsigned int level);
|
|
unsigned int dvfs_get_level(void);
|
|
void dvfs_int_mask(bool mask);
|
|
|
|
void dvfs_wfi_monitor(bool on);
|
|
void dvfs_set_lt_weight(enum DVFS_LT_SIGS index, unsigned long value);
|
|
unsigned long dvfs_get_lt_weight(enum DVFS_LT_SIGS index);
|
|
void dvfs_set_lt_detect(enum DVFS_LT_SIGS index, bool edge);
|
|
bool dvfs_get_lt_detect(enum DVFS_LT_SIGS index);
|
|
void dvfs_set_gp_bit(enum DVFS_DVGPS dvgp, bool assert);
|
|
bool dvfs_get_gp_bit(enum DVFS_DVGPS dvgp);
|
|
void dvfs_set_gp_sense(int level_code, unsigned long detect_mask);
|
|
void dvfs_get_gp_sense(int *level_code, unsigned long *detect_mask);
|
|
|
|
/* DPTC */
|
|
void dptc_start(void);
|
|
void dptc_stop(void);
|
|
bool dptc_enabled(void);
|
|
void dptc_set_wp(unsigned int wp);
|
|
unsigned int dptc_get_wp(void);
|
|
|
|
#endif /* _DVFS_DPTC_IMX31_H_ */
|