mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
[Blackfin] arch: Functional power management support: Add CPU and platform voltage scaling support
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
parent
19d6d7d53c
commit
14b03204c8
15 changed files with 468 additions and 28 deletions
|
@ -967,6 +967,17 @@ menu "CPU Frequency scaling"
|
||||||
|
|
||||||
source "drivers/cpufreq/Kconfig"
|
source "drivers/cpufreq/Kconfig"
|
||||||
|
|
||||||
|
config CPU_VOLTAGE
|
||||||
|
bool "CPU Voltage scaling"
|
||||||
|
depends on EXPERIMENTAL
|
||||||
|
depends on CPU_FREQ
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Say Y here if you want CPU voltage scaling according to the CPU frequency.
|
||||||
|
This option violates the PLL BYPASS recommendation in the Blackfin Processor
|
||||||
|
manuals. There is a theoretical risk that during VDDINT transitions
|
||||||
|
the PLL may unlock.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "net/Kconfig"
|
source "net/Kconfig"
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/nand.h>
|
#include <asm/nand.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
#include <linux/spi/ad7877.h>
|
#include <linux/spi/ad7877.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -839,7 +840,32 @@ static struct platform_device bfin_gpios_device = {
|
||||||
.resource = &bfin_gpios_resources,
|
.resource = &bfin_gpios_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_100, 400000000),
|
||||||
|
VRPAIR(VLEV_105, 426000000),
|
||||||
|
VRPAIR(VLEV_110, 500000000),
|
||||||
|
VRPAIR(VLEV_115, 533000000),
|
||||||
|
VRPAIR(VLEV_120, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *stamp_devices[] __initdata = {
|
static struct platform_device *stamp_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
|
#if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
|
||||||
&bf5xx_nand_device,
|
&bf5xx_nand_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
@ -341,7 +342,37 @@ static struct platform_device bfin_pata_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 376000000),
|
||||||
|
VRPAIR(VLEV_095, 426000000),
|
||||||
|
VRPAIR(VLEV_100, 426000000),
|
||||||
|
VRPAIR(VLEV_105, 476000000),
|
||||||
|
VRPAIR(VLEV_110, 476000000),
|
||||||
|
VRPAIR(VLEV_115, 476000000),
|
||||||
|
VRPAIR(VLEV_120, 600000000),
|
||||||
|
VRPAIR(VLEV_125, 600000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *cm_bf533_devices[] __initdata = {
|
static struct platform_device *cm_bf533_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
||||||
&bfin_uart_device,
|
&bfin_uart_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
@ -350,7 +351,37 @@ static struct platform_device i2c_gpio_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 376000000),
|
||||||
|
VRPAIR(VLEV_095, 426000000),
|
||||||
|
VRPAIR(VLEV_100, 426000000),
|
||||||
|
VRPAIR(VLEV_105, 476000000),
|
||||||
|
VRPAIR(VLEV_110, 476000000),
|
||||||
|
VRPAIR(VLEV_115, 476000000),
|
||||||
|
VRPAIR(VLEV_120, 600000000),
|
||||||
|
VRPAIR(VLEV_125, 600000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *ezkit_devices[] __initdata = {
|
static struct platform_device *ezkit_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
&smc91x_device,
|
&smc91x_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
@ -516,7 +517,37 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 376000000),
|
||||||
|
VRPAIR(VLEV_095, 426000000),
|
||||||
|
VRPAIR(VLEV_100, 426000000),
|
||||||
|
VRPAIR(VLEV_105, 476000000),
|
||||||
|
VRPAIR(VLEV_110, 476000000),
|
||||||
|
VRPAIR(VLEV_115, 476000000),
|
||||||
|
VRPAIR(VLEV_120, 600000000),
|
||||||
|
VRPAIR(VLEV_125, 600000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *stamp_devices[] __initdata = {
|
static struct platform_device *stamp_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||||
&rtc_device,
|
&rtc_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
@ -428,7 +429,37 @@ static struct platform_device bfin_pata_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 376000000),
|
||||||
|
VRPAIR(VLEV_095, 426000000),
|
||||||
|
VRPAIR(VLEV_100, 426000000),
|
||||||
|
VRPAIR(VLEV_105, 476000000),
|
||||||
|
VRPAIR(VLEV_110, 476000000),
|
||||||
|
VRPAIR(VLEV_115, 476000000),
|
||||||
|
VRPAIR(VLEV_120, 500000000),
|
||||||
|
VRPAIR(VLEV_125, 533000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *cm_bf537_devices[] __initdata = {
|
static struct platform_device *cm_bf537_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
|
#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
|
||||||
&hitachi_fb_device,
|
&hitachi_fb_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
#include <linux/spi/ad7877.h>
|
#include <linux/spi/ad7877.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -817,7 +818,37 @@ static struct platform_device bfin_pata_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 376000000),
|
||||||
|
VRPAIR(VLEV_095, 426000000),
|
||||||
|
VRPAIR(VLEV_100, 426000000),
|
||||||
|
VRPAIR(VLEV_105, 476000000),
|
||||||
|
VRPAIR(VLEV_110, 476000000),
|
||||||
|
VRPAIR(VLEV_115, 476000000),
|
||||||
|
VRPAIR(VLEV_120, 500000000),
|
||||||
|
VRPAIR(VLEV_125, 533000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *stamp_devices[] __initdata = {
|
static struct platform_device *stamp_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
|
#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
|
||||||
&bfin_pcmcia_cf_device,
|
&bfin_pcmcia_cf_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <asm/nand.h>
|
#include <asm/nand.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
#include <asm/mach/bf54x_keys.h>
|
#include <asm/mach/bf54x_keys.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/spi/ad7877.h>
|
#include <linux/spi/ad7877.h>
|
||||||
|
|
||||||
|
@ -590,7 +591,38 @@ static struct platform_device bfin_device_gpiokeys = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Internal VLEV BF54XSBBC1533
|
||||||
|
****temporarily using these values until data sheet is updated
|
||||||
|
*/
|
||||||
|
VRPAIR(VLEV_085, 150000000),
|
||||||
|
VRPAIR(VLEV_090, 250000000),
|
||||||
|
VRPAIR(VLEV_110, 276000000),
|
||||||
|
VRPAIR(VLEV_115, 301000000),
|
||||||
|
VRPAIR(VLEV_120, 525000000),
|
||||||
|
VRPAIR(VLEV_125, 550000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *cm_bf548_devices[] __initdata = {
|
static struct platform_device *cm_bf548_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||||
&rtc_device,
|
&rtc_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include <asm/nand.h>
|
#include <asm/nand.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
#include <asm/mach/bf54x_keys.h>
|
#include <asm/mach/bf54x_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
|
@ -689,7 +690,38 @@ static struct platform_device bfin_gpios_device = {
|
||||||
.resource = &bfin_gpios_resources,
|
.resource = &bfin_gpios_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Internal VLEV BF54XSBBC1533
|
||||||
|
****temporarily using these values until data sheet is updated
|
||||||
|
*/
|
||||||
|
VRPAIR(VLEV_085, 150000000),
|
||||||
|
VRPAIR(VLEV_090, 250000000),
|
||||||
|
VRPAIR(VLEV_110, 276000000),
|
||||||
|
VRPAIR(VLEV_115, 301000000),
|
||||||
|
VRPAIR(VLEV_120, 525000000),
|
||||||
|
VRPAIR(VLEV_125, 550000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *ezkit_devices[] __initdata = {
|
static struct platform_device *ezkit_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
||||||
&rtc_device,
|
&rtc_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
@ -339,8 +340,37 @@ static struct platform_device bfin_pata_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 300000000),
|
||||||
|
VRPAIR(VLEV_095, 313000000),
|
||||||
|
VRPAIR(VLEV_100, 350000000),
|
||||||
|
VRPAIR(VLEV_105, 400000000),
|
||||||
|
VRPAIR(VLEV_110, 444000000),
|
||||||
|
VRPAIR(VLEV_115, 450000000),
|
||||||
|
VRPAIR(VLEV_120, 475000000),
|
||||||
|
VRPAIR(VLEV_125, 500000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *cm_bf561_devices[] __initdata = {
|
static struct platform_device *cm_bf561_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
|
#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
|
||||||
&hitachi_fb_device,
|
&hitachi_fb_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/bfin5xx_spi.h>
|
#include <asm/bfin5xx_spi.h>
|
||||||
#include <asm/portmux.h>
|
#include <asm/portmux.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name the Board for the /proc/cpuinfo
|
* Name the Board for the /proc/cpuinfo
|
||||||
|
@ -443,7 +444,37 @@ static struct platform_device i2c_gpio_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const unsigned int cclk_vlev_datasheet[] =
|
||||||
|
{
|
||||||
|
VRPAIR(VLEV_085, 250000000),
|
||||||
|
VRPAIR(VLEV_090, 300000000),
|
||||||
|
VRPAIR(VLEV_095, 313000000),
|
||||||
|
VRPAIR(VLEV_100, 350000000),
|
||||||
|
VRPAIR(VLEV_105, 400000000),
|
||||||
|
VRPAIR(VLEV_110, 444000000),
|
||||||
|
VRPAIR(VLEV_115, 450000000),
|
||||||
|
VRPAIR(VLEV_120, 475000000),
|
||||||
|
VRPAIR(VLEV_125, 500000000),
|
||||||
|
VRPAIR(VLEV_130, 600000000),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
|
||||||
|
.tuple_tab = cclk_vlev_datasheet,
|
||||||
|
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
|
||||||
|
.vr_settling_time = 25 /* us */,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bfin_dpmc = {
|
||||||
|
.name = "bfin dpmc",
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bfin_dmpc_vreg_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *ezkit_devices[] __initdata = {
|
static struct platform_device *ezkit_devices[] __initdata = {
|
||||||
|
|
||||||
|
&bfin_dpmc,
|
||||||
|
|
||||||
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
||||||
&smc91x_device,
|
&smc91x_device,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,5 +6,6 @@ obj-y := \
|
||||||
cache.o cacheinit.o entry.o \
|
cache.o cacheinit.o entry.o \
|
||||||
interrupt.o lock.o irqpanic.o arch_checks.o ints-priority.o
|
interrupt.o lock.o irqpanic.o arch_checks.o ints-priority.o
|
||||||
|
|
||||||
obj-$(CONFIG_PM) += pm.o dpmc.o
|
obj-$(CONFIG_PM) += pm.o dpmc_modes.o
|
||||||
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
|
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
|
||||||
|
obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o
|
||||||
|
|
137
arch/blackfin/mach-common/dpmc.c
Normal file
137
arch/blackfin/mach-common/dpmc.c
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2008 Analog Devices Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the GPL-2 or later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/cdev.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/cpufreq.h>
|
||||||
|
|
||||||
|
#include <asm/delay.h>
|
||||||
|
#include <asm/dpmc.h>
|
||||||
|
|
||||||
|
#define DRIVER_NAME "bfin dpmc"
|
||||||
|
|
||||||
|
#define dprintk(msg...) \
|
||||||
|
cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, DRIVER_NAME, msg)
|
||||||
|
|
||||||
|
struct bfin_dpmc_platform_data *pdata;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bfin_set_vlev - Update VLEV field in VR_CTL Reg.
|
||||||
|
* Avoid BYPASS sequence
|
||||||
|
*/
|
||||||
|
static void bfin_set_vlev(unsigned int vlev)
|
||||||
|
{
|
||||||
|
unsigned pll_lcnt;
|
||||||
|
|
||||||
|
pll_lcnt = bfin_read_PLL_LOCKCNT();
|
||||||
|
|
||||||
|
bfin_write_PLL_LOCKCNT(1);
|
||||||
|
bfin_write_VR_CTL((bfin_read_VR_CTL() & ~VLEV) | vlev);
|
||||||
|
bfin_write_PLL_LOCKCNT(pll_lcnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bfin_get_vlev - Get CPU specific VLEV from platform device data
|
||||||
|
*/
|
||||||
|
static unsigned int bfin_get_vlev(unsigned int freq)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!pdata)
|
||||||
|
goto err_out;
|
||||||
|
|
||||||
|
freq >>= 16;
|
||||||
|
|
||||||
|
for (i = 0; i < pdata->tabsize; i++)
|
||||||
|
if (freq <= (pdata->tuple_tab[i] & 0xFFFF))
|
||||||
|
return pdata->tuple_tab[i] >> 16;
|
||||||
|
|
||||||
|
err_out:
|
||||||
|
printk(KERN_WARNING "DPMC: No suitable CCLK VDDINT voltage pair found\n");
|
||||||
|
return VLEV_120;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_FREQ
|
||||||
|
static int
|
||||||
|
vreg_cpufreq_notifier(struct notifier_block *nb, unsigned long val, void *data)
|
||||||
|
{
|
||||||
|
struct cpufreq_freqs *freq = data;
|
||||||
|
|
||||||
|
if (val == CPUFREQ_PRECHANGE && freq->old < freq->new) {
|
||||||
|
bfin_set_vlev(bfin_get_vlev(freq->new));
|
||||||
|
udelay(pdata->vr_settling_time); /* Wait until Volatge settled */
|
||||||
|
|
||||||
|
} else if (val == CPUFREQ_POSTCHANGE && freq->old > freq->new)
|
||||||
|
bfin_set_vlev(bfin_get_vlev(freq->new));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct notifier_block vreg_cpufreq_notifier_block = {
|
||||||
|
.notifier_call = vreg_cpufreq_notifier
|
||||||
|
};
|
||||||
|
#endif /* CONFIG_CPU_FREQ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bfin_dpmc_probe -
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int __devinit bfin_dpmc_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
if (pdev->dev.platform_data)
|
||||||
|
pdata = pdev->dev.platform_data;
|
||||||
|
else
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return cpufreq_register_notifier(&vreg_cpufreq_notifier_block,
|
||||||
|
CPUFREQ_TRANSITION_NOTIFIER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bfin_dpmc_remove -
|
||||||
|
*/
|
||||||
|
static int __devexit bfin_dpmc_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
pdata = NULL;
|
||||||
|
return cpufreq_unregister_notifier(&vreg_cpufreq_notifier_block,
|
||||||
|
CPUFREQ_TRANSITION_NOTIFIER);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct platform_driver bfin_dpmc_device_driver = {
|
||||||
|
.probe = bfin_dpmc_probe,
|
||||||
|
.remove = __devexit_p(bfin_dpmc_remove),
|
||||||
|
.driver = {
|
||||||
|
.name = DRIVER_NAME,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bfin_dpmc_init - Init driver
|
||||||
|
*/
|
||||||
|
static int __init bfin_dpmc_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&bfin_dpmc_device_driver);
|
||||||
|
}
|
||||||
|
module_init(bfin_dpmc_init);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bfin_dpmc_exit - break down driver
|
||||||
|
*/
|
||||||
|
static void __exit bfin_dpmc_exit(void)
|
||||||
|
{
|
||||||
|
platform_driver_unregister(&bfin_dpmc_device_driver);
|
||||||
|
}
|
||||||
|
module_exit(bfin_dpmc_exit);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
|
||||||
|
MODULE_DESCRIPTION("cpu power management driver for Blackfin");
|
||||||
|
MODULE_LICENSE("GPL");
|
|
@ -1,30 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* File: arch/blackfin/mach-common/dpmc.S
|
* Copyright 2004-2008 Analog Devices Inc.
|
||||||
* Based on:
|
|
||||||
* Author: LG Soft India
|
|
||||||
*
|
*
|
||||||
* Created: ?
|
* Licensed under the GPL-2 or later.
|
||||||
* Description: Watchdog Timer APIs
|
|
||||||
*
|
|
||||||
* Modified:
|
|
||||||
* Copyright 2004-2006 Analog Devices Inc.
|
|
||||||
*
|
|
||||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
||||||
*
|
|
||||||
* 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 program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see the file COPYING, or write
|
|
||||||
* to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* include/asm-blackfin/dpmc.h - Miscellaneous IOCTL commands for Dynamic Power
|
* include/asm-blackfin/dpmc.h - Miscellaneous IOCTL commands for Dynamic Power
|
||||||
* Management Controller Driver.
|
* Management Controller Driver.
|
||||||
* Copyright (C) 2004 Analog Device Inc.
|
* Copyright (C) 2004-2008 Analog Device Inc.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef _BLACKFIN_DPMC_H_
|
#ifndef _BLACKFIN_DPMC_H_
|
||||||
|
@ -65,6 +65,14 @@ void disable_wdog_timer(void);
|
||||||
extern unsigned long get_cclk(void);
|
extern unsigned long get_cclk(void);
|
||||||
extern unsigned long get_sclk(void);
|
extern unsigned long get_sclk(void);
|
||||||
|
|
||||||
|
struct bfin_dpmc_platform_data {
|
||||||
|
const unsigned int *tuple_tab;
|
||||||
|
unsigned short tabsize;
|
||||||
|
unsigned short vr_settling_time; /* in us */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VRPAIR(vlev, freq) (((vlev) << 16) | ((freq) >> 16))
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#endif /*_BLACKFIN_DPMC_H_*/
|
#endif /*_BLACKFIN_DPMC_H_*/
|
||||||
|
|
Loading…
Reference in a new issue