ARM: arm-soc: Merge branch 'next/clk' into next/pm
Merge together a couple of the smaller pm/clock branches into one. Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
4a76411ea3
|
@ -625,7 +625,6 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = ams_delta_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = ams_delta_init,
|
||||
.init_late = ams_delta_init_late,
|
||||
|
|
|
@ -27,10 +27,10 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/mux.h>
|
||||
#include <mach/flash.h>
|
||||
#include <plat/fpga.h>
|
||||
#include <../plat-omap/fpga.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
@ -123,9 +123,9 @@ static struct resource smc91x_resources[] = {
|
|||
|
||||
static void __init fsample_init_smc91x(void)
|
||||
{
|
||||
fpga_write(1, H2P2_DBG_FPGA_LAN_RESET);
|
||||
__raw_writeb(1, H2P2_DBG_FPGA_LAN_RESET);
|
||||
mdelay(50);
|
||||
fpga_write(fpga_read(H2P2_DBG_FPGA_LAN_RESET) & ~1,
|
||||
__raw_writeb(__raw_readb(H2P2_DBG_FPGA_LAN_RESET) & ~1,
|
||||
H2P2_DBG_FPGA_LAN_RESET);
|
||||
mdelay(50);
|
||||
}
|
||||
|
@ -362,7 +362,6 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap_fsample_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_fsample_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -81,7 +81,6 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap16xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_generic_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -13,12 +13,11 @@
|
|||
*/
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
#include <linux/i2c/tps65010.h>
|
||||
|
||||
#include <plat/mmc.h>
|
||||
|
||||
#include "board-h2.h"
|
||||
#include "mmc.h"
|
||||
|
||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
#include <mach/flash.h>
|
||||
|
@ -50,6 +50,7 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "board-h2.h"
|
||||
#include "dma.h"
|
||||
|
||||
/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */
|
||||
#define OMAP1610_ETHR_START 0x04000300
|
||||
|
@ -458,7 +459,6 @@ MACHINE_START(OMAP_H2, "TI-H2")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap16xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = h2_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -16,9 +16,8 @@
|
|||
|
||||
#include <linux/i2c/tps65010.h>
|
||||
|
||||
#include <plat/mmc.h>
|
||||
|
||||
#include "board-h3.h"
|
||||
#include "mmc.h"
|
||||
|
||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||
|
||||
|
|
|
@ -41,9 +41,9 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/flash.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
@ -452,7 +452,6 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap16xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = h3_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
|
||||
#include <mach/omap7xx.h>
|
||||
#include <plat/mmc.h>
|
||||
#include "mmc.h"
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/usb.h>
|
||||
|
@ -600,7 +600,6 @@ MACHINE_START(HERALD, "HTC Herald")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = htcherald_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = htcherald_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -33,16 +33,16 @@
|
|||
|
||||
#include <mach/mux.h>
|
||||
#include <mach/flash.h>
|
||||
#include <plat/fpga.h>
|
||||
#include <plat/tc.h>
|
||||
#include <../plat-omap/fpga.h>
|
||||
#include <mach/tc.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
#include <plat/mmc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h>
|
||||
|
||||
#include "iomap.h"
|
||||
#include "common.h"
|
||||
#include "mmc.h"
|
||||
|
||||
/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */
|
||||
#define INNOVATOR1610_ETHR_START 0x04000300
|
||||
|
@ -215,7 +215,7 @@ static struct platform_device *innovator1510_devices[] __initdata = {
|
|||
|
||||
static int innovator_get_pendown_state(void)
|
||||
{
|
||||
return !(fpga_read(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));
|
||||
return !(__raw_readb(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));
|
||||
}
|
||||
|
||||
static const struct ads7846_platform_data innovator1510_ts_info = {
|
||||
|
@ -279,7 +279,7 @@ static struct platform_device *innovator1610_devices[] __initdata = {
|
|||
static void __init innovator_init_smc91x(void)
|
||||
{
|
||||
if (cpu_is_omap1510()) {
|
||||
fpga_write(fpga_read(OMAP1510_FPGA_RST) & ~1,
|
||||
__raw_writeb(__raw_readb(OMAP1510_FPGA_RST) & ~1,
|
||||
OMAP1510_FPGA_RST);
|
||||
udelay(750);
|
||||
} else {
|
||||
|
@ -335,10 +335,10 @@ static int mmc_set_power(struct device *dev, int slot, int power_on,
|
|||
int vdd)
|
||||
{
|
||||
if (power_on)
|
||||
fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3),
|
||||
__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) | (1 << 3),
|
||||
OMAP1510_FPGA_POWER);
|
||||
else
|
||||
fpga_write(fpga_read(OMAP1510_FPGA_POWER) & ~(1 << 3),
|
||||
__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) & ~(1 << 3),
|
||||
OMAP1510_FPGA_POWER);
|
||||
|
||||
return 0;
|
||||
|
@ -390,14 +390,14 @@ static void __init innovator_init(void)
|
|||
omap_cfg_reg(UART3_TX);
|
||||
omap_cfg_reg(UART3_RX);
|
||||
|
||||
reg = fpga_read(OMAP1510_FPGA_POWER);
|
||||
reg = __raw_readb(OMAP1510_FPGA_POWER);
|
||||
reg |= OMAP1510_FPGA_PCR_COM1_EN;
|
||||
fpga_write(reg, OMAP1510_FPGA_POWER);
|
||||
__raw_writeb(reg, OMAP1510_FPGA_POWER);
|
||||
udelay(10);
|
||||
|
||||
reg = fpga_read(OMAP1510_FPGA_POWER);
|
||||
reg = __raw_readb(OMAP1510_FPGA_POWER);
|
||||
reg |= OMAP1510_FPGA_PCR_COM2_EN;
|
||||
fpga_write(reg, OMAP1510_FPGA_POWER);
|
||||
__raw_writeb(reg, OMAP1510_FPGA_POWER);
|
||||
udelay(10);
|
||||
|
||||
platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices));
|
||||
|
@ -437,6 +437,7 @@ static void __init innovator_init(void)
|
|||
*/
|
||||
static void __init innovator_map_io(void)
|
||||
{
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
omap15xx_map_io();
|
||||
|
||||
iotable_init(innovator1510_io_desc, ARRAY_SIZE(innovator1510_io_desc));
|
||||
|
@ -444,9 +445,10 @@ static void __init innovator_map_io(void)
|
|||
|
||||
/* Dump the Innovator FPGA rev early - useful info for support. */
|
||||
pr_debug("Innovator FPGA Rev %d.%d Board Rev %d\n",
|
||||
fpga_read(OMAP1510_FPGA_REV_HIGH),
|
||||
fpga_read(OMAP1510_FPGA_REV_LOW),
|
||||
fpga_read(OMAP1510_FPGA_BOARD_REV));
|
||||
__raw_readb(OMAP1510_FPGA_REV_HIGH),
|
||||
__raw_readb(OMAP1510_FPGA_REV_LOW),
|
||||
__raw_readb(OMAP1510_FPGA_BOARD_REV));
|
||||
#endif
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
|
||||
|
@ -454,7 +456,6 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = innovator_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = innovator_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -29,13 +29,13 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "clock.h"
|
||||
#include "mmc.h"
|
||||
|
||||
#define ADS7846_PENDOWN_GPIO 15
|
||||
|
||||
|
@ -251,7 +251,6 @@ MACHINE_START(NOKIA770, "Nokia 770")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap16xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_nokia770_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h>
|
||||
|
@ -606,7 +606,6 @@ MACHINE_START(OMAP_OSK, "TI-OSK")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap16xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = osk_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -36,8 +36,8 @@
|
|||
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat/dma.h>
|
||||
#include <mach/tc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/irda.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
|
||||
|
@ -45,6 +45,7 @@
|
|||
#include <mach/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "dma.h"
|
||||
|
||||
#define PALMTE_USBDETECT_GPIO 0
|
||||
#define PALMTE_USB_OR_DC_GPIO 1
|
||||
|
@ -264,7 +265,6 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_palmte_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -28,16 +28,16 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/platform_data/omap1_bl.h>
|
||||
#include <linux/platform_data/leds-omap.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/led.h>
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
|
||||
|
@ -45,6 +45,7 @@
|
|||
#include <mach/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "dma.h"
|
||||
|
||||
#define PALMTT_USBDETECT_GPIO 0
|
||||
#define PALMTT_CABLE_GPIO 1
|
||||
|
@ -310,7 +311,6 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_palmtt_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -38,8 +38,8 @@
|
|||
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <linux/platform_data/keypad-omap.h>
|
||||
|
||||
|
@ -47,6 +47,7 @@
|
|||
#include <mach/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "dma.h"
|
||||
|
||||
#define PALMZ71_USBDETECT_GPIO 0
|
||||
#define PALMZ71_PENIRQ_GPIO 6
|
||||
|
@ -326,7 +327,6 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_palmz71_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -28,9 +28,9 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/fpga.h>
|
||||
#include <../plat-omap/fpga.h>
|
||||
#include <mach/flash.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
@ -231,9 +231,9 @@ static struct omap_lcd_config perseus2_lcd_config __initdata = {
|
|||
|
||||
static void __init perseus2_init_smc91x(void)
|
||||
{
|
||||
fpga_write(1, H2P2_DBG_FPGA_LAN_RESET);
|
||||
__raw_writeb(1, H2P2_DBG_FPGA_LAN_RESET);
|
||||
mdelay(50);
|
||||
fpga_write(fpga_read(H2P2_DBG_FPGA_LAN_RESET) & ~1,
|
||||
__raw_writeb(__raw_readb(H2P2_DBG_FPGA_LAN_RESET) & ~1,
|
||||
H2P2_DBG_FPGA_LAN_RESET);
|
||||
mdelay(50);
|
||||
}
|
||||
|
@ -324,7 +324,6 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap_perseus2_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_perseus2_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -16,9 +16,10 @@
|
|||
#include <linux/platform_device.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <mach/board-sx1.h>
|
||||
|
||||
#include "mmc.h"
|
||||
|
||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||
|
||||
static int mmc_set_power(struct device *dev, int slot, int power_on,
|
||||
|
|
|
@ -36,15 +36,16 @@
|
|||
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/irda.h>
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/board-sx1.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "dma.h"
|
||||
|
||||
/* Write to I2C device */
|
||||
int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value)
|
||||
|
@ -403,7 +404,6 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = omap_sx1_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include <mach/board-voiceblue.h>
|
||||
#include <mach/flash.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h>
|
||||
|
@ -286,7 +286,6 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
|
|||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
.init_machine = voiceblue_init,
|
||||
.init_late = omap1_init_late,
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -21,14 +22,11 @@
|
|||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/clock.h>
|
||||
#include <plat/sram.h>
|
||||
#include <plat/clkdev_omap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "soc.h"
|
||||
#include "iomap.h"
|
||||
#include "clock.h"
|
||||
#include "opp.h"
|
||||
|
@ -36,6 +34,10 @@
|
|||
__u32 arm_idlect1_mask;
|
||||
struct clk *api_ck_p, *ck_dpll1_p, *ck_ref_p;
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
static DEFINE_SPINLOCK(clockfw_lock);
|
||||
|
||||
/*
|
||||
* Omap1 specific clock functions
|
||||
*/
|
||||
|
@ -607,3 +609,497 @@ void omap1_clk_disable_unused(struct clk *clk)
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
ret = omap1_clk_enable(clk);
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_enable);
|
||||
|
||||
void clk_disable(struct clk *clk)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
if (clk->usecount == 0) {
|
||||
pr_err("Trying disable clock %s with 0 usecount\n",
|
||||
clk->name);
|
||||
WARN_ON(1);
|
||||
goto out;
|
||||
}
|
||||
|
||||
omap1_clk_disable(clk);
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_disable);
|
||||
|
||||
unsigned long clk_get_rate(struct clk *clk)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long ret;
|
||||
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
ret = clk->rate;
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_get_rate);
|
||||
|
||||
/*
|
||||
* Optional clock functions defined in include/linux/clk.h
|
||||
*/
|
||||
|
||||
long clk_round_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
unsigned long flags;
|
||||
long ret;
|
||||
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
ret = omap1_clk_round_rate(clk, rate);
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_round_rate);
|
||||
|
||||
int clk_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return ret;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
ret = omap1_clk_set_rate(clk, rate);
|
||||
if (ret == 0)
|
||||
propagate_rate(clk);
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_set_rate);
|
||||
|
||||
int clk_set_parent(struct clk *clk, struct clk *parent)
|
||||
{
|
||||
WARN_ONCE(1, "clk_set_parent() not implemented for OMAP1\n");
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_set_parent);
|
||||
|
||||
struct clk *clk_get_parent(struct clk *clk)
|
||||
{
|
||||
return clk->parent;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_get_parent);
|
||||
|
||||
/*
|
||||
* OMAP specific clock functions shared between omap1 and omap2
|
||||
*/
|
||||
|
||||
int __initdata mpurate;
|
||||
|
||||
/*
|
||||
* By default we use the rate set by the bootloader.
|
||||
* You can override this with mpurate= cmdline option.
|
||||
*/
|
||||
static int __init omap_clk_setup(char *str)
|
||||
{
|
||||
get_option(&str, &mpurate);
|
||||
|
||||
if (!mpurate)
|
||||
return 1;
|
||||
|
||||
if (mpurate < 1000)
|
||||
mpurate *= 1000000;
|
||||
|
||||
return 1;
|
||||
}
|
||||
__setup("mpurate=", omap_clk_setup);
|
||||
|
||||
/* Used for clocks that always have same value as the parent clock */
|
||||
unsigned long followparent_recalc(struct clk *clk)
|
||||
{
|
||||
return clk->parent->rate;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used for clocks that have the same value as the parent clock,
|
||||
* divided by some factor
|
||||
*/
|
||||
unsigned long omap_fixed_divisor_recalc(struct clk *clk)
|
||||
{
|
||||
WARN_ON(!clk->fixed_div);
|
||||
|
||||
return clk->parent->rate / clk->fixed_div;
|
||||
}
|
||||
|
||||
void clk_reparent(struct clk *child, struct clk *parent)
|
||||
{
|
||||
list_del_init(&child->sibling);
|
||||
if (parent)
|
||||
list_add(&child->sibling, &parent->children);
|
||||
child->parent = parent;
|
||||
|
||||
/* now do the debugfs renaming to reattach the child
|
||||
to the proper parent */
|
||||
}
|
||||
|
||||
/* Propagate rate to children */
|
||||
void propagate_rate(struct clk *tclk)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &tclk->children, sibling) {
|
||||
if (clkp->recalc)
|
||||
clkp->rate = clkp->recalc(clkp);
|
||||
propagate_rate(clkp);
|
||||
}
|
||||
}
|
||||
|
||||
static LIST_HEAD(root_clks);
|
||||
|
||||
/**
|
||||
* recalculate_root_clocks - recalculate and propagate all root clocks
|
||||
*
|
||||
* Recalculates all root clocks (clocks with no parent), which if the
|
||||
* clock's .recalc is set correctly, should also propagate their rates.
|
||||
* Called at init.
|
||||
*/
|
||||
void recalculate_root_clocks(void)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &root_clks, sibling) {
|
||||
if (clkp->recalc)
|
||||
clkp->rate = clkp->recalc(clkp);
|
||||
propagate_rate(clkp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_preinit - initialize any fields in the struct clk before clk init
|
||||
* @clk: struct clk * to initialize
|
||||
*
|
||||
* Initialize any struct clk fields needed before normal clk initialization
|
||||
* can run. No return value.
|
||||
*/
|
||||
void clk_preinit(struct clk *clk)
|
||||
{
|
||||
INIT_LIST_HEAD(&clk->children);
|
||||
}
|
||||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* trap out already registered clocks
|
||||
*/
|
||||
if (clk->node.next || clk->node.prev)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
if (clk->parent)
|
||||
list_add(&clk->sibling, &clk->parent->children);
|
||||
else
|
||||
list_add(&clk->sibling, &root_clks);
|
||||
|
||||
list_add(&clk->node, &clocks);
|
||||
if (clk->init)
|
||||
clk->init(clk);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_register);
|
||||
|
||||
void clk_unregister(struct clk *clk)
|
||||
{
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
return;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_del(&clk->sibling);
|
||||
list_del(&clk->node);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
void clk_enable_init_clocks(void)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &clocks, node)
|
||||
if (clkp->flags & ENABLE_ON_INIT)
|
||||
clk_enable(clkp);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_clk_get_by_name - locate OMAP struct clk by its name
|
||||
* @name: name of the struct clk to locate
|
||||
*
|
||||
* Locate an OMAP struct clk by its name. Assumes that struct clk
|
||||
* names are unique. Returns NULL if not found or a pointer to the
|
||||
* struct clk if found.
|
||||
*/
|
||||
struct clk *omap_clk_get_by_name(const char *name)
|
||||
{
|
||||
struct clk *c;
|
||||
struct clk *ret = NULL;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
list_for_each_entry(c, &clocks, node) {
|
||||
if (!strcmp(c->name, name)) {
|
||||
ret = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int omap_clk_enable_autoidle_all(void)
|
||||
{
|
||||
struct clk *c;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
|
||||
list_for_each_entry(c, &clocks, node)
|
||||
if (c->ops->allow_idle)
|
||||
c->ops->allow_idle(c);
|
||||
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int omap_clk_disable_autoidle_all(void)
|
||||
{
|
||||
struct clk *c;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
|
||||
list_for_each_entry(c, &clocks, node)
|
||||
if (c->ops->deny_idle)
|
||||
c->ops->deny_idle(c);
|
||||
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Low level helpers
|
||||
*/
|
||||
static int clkll_enable_null(struct clk *clk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void clkll_disable_null(struct clk *clk)
|
||||
{
|
||||
}
|
||||
|
||||
const struct clkops clkops_null = {
|
||||
.enable = clkll_enable_null,
|
||||
.disable = clkll_disable_null,
|
||||
};
|
||||
|
||||
/*
|
||||
* Dummy clock
|
||||
*
|
||||
* Used for clock aliases that are needed on some OMAPs, but not others
|
||||
*/
|
||||
struct clk dummy_ck = {
|
||||
.name = "dummy",
|
||||
.ops = &clkops_null,
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_OMAP_RESET_CLOCKS
|
||||
/*
|
||||
* Disable any unused clocks left on by the bootloader
|
||||
*/
|
||||
static int __init clk_disable_unused(void)
|
||||
{
|
||||
struct clk *ck;
|
||||
unsigned long flags;
|
||||
|
||||
pr_info("clock: disabling unused clocks to save power\n");
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
list_for_each_entry(ck, &clocks, node) {
|
||||
if (ck->ops == &clkops_null)
|
||||
continue;
|
||||
|
||||
if (ck->usecount > 0 || !ck->enable_reg)
|
||||
continue;
|
||||
|
||||
omap1_clk_disable_unused(ck);
|
||||
}
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(clk_disable_unused);
|
||||
late_initcall(omap_clk_enable_autoidle_all);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
|
||||
/*
|
||||
* debugfs support to trace clock tree hierarchy and attributes
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
static struct dentry *clk_debugfs_root;
|
||||
|
||||
static int clk_dbg_show_summary(struct seq_file *s, void *unused)
|
||||
{
|
||||
struct clk *c;
|
||||
struct clk *pa;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
seq_printf(s, "%-30s %-30s %-10s %s\n",
|
||||
"clock-name", "parent-name", "rate", "use-count");
|
||||
|
||||
list_for_each_entry(c, &clocks, node) {
|
||||
pa = c->parent;
|
||||
seq_printf(s, "%-30s %-30s %-10lu %d\n",
|
||||
c->name, pa ? pa->name : "none", c->rate,
|
||||
c->usecount);
|
||||
}
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int clk_dbg_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, clk_dbg_show_summary, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations debug_clock_fops = {
|
||||
.open = clk_dbg_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int clk_debugfs_register_one(struct clk *c)
|
||||
{
|
||||
int err;
|
||||
struct dentry *d;
|
||||
struct clk *pa = c->parent;
|
||||
|
||||
d = debugfs_create_dir(c->name, pa ? pa->dent : clk_debugfs_root);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
c->dent = d;
|
||||
|
||||
d = debugfs_create_u8("usecount", S_IRUGO, c->dent, (u8 *)&c->usecount);
|
||||
if (!d) {
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate);
|
||||
if (!d) {
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags);
|
||||
if (!d) {
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
debugfs_remove_recursive(c->dent);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int clk_debugfs_register(struct clk *c)
|
||||
{
|
||||
int err;
|
||||
struct clk *pa = c->parent;
|
||||
|
||||
if (pa && !pa->dent) {
|
||||
err = clk_debugfs_register(pa);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!c->dent) {
|
||||
err = clk_debugfs_register_one(c);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init clk_debugfs_init(void)
|
||||
{
|
||||
struct clk *c;
|
||||
struct dentry *d;
|
||||
int err;
|
||||
|
||||
d = debugfs_create_dir("clock", NULL);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
clk_debugfs_root = d;
|
||||
|
||||
list_for_each_entry(c, &clocks, node) {
|
||||
err = clk_debugfs_register(c);
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
d = debugfs_create_file("summary", S_IRUGO,
|
||||
d, NULL, &debug_clock_fops);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
err_out:
|
||||
debugfs_remove_recursive(clk_debugfs_root);
|
||||
return err;
|
||||
}
|
||||
late_initcall(clk_debugfs_init);
|
||||
|
||||
#endif /* defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) */
|
||||
|
|
|
@ -14,8 +14,184 @@
|
|||
#define __ARCH_ARM_MACH_OMAP1_CLOCK_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <linux/clkdev.h>
|
||||
|
||||
struct module;
|
||||
struct clk;
|
||||
|
||||
struct omap_clk {
|
||||
u16 cpu;
|
||||
struct clk_lookup lk;
|
||||
};
|
||||
|
||||
#define CLK(dev, con, ck, cp) \
|
||||
{ \
|
||||
.cpu = cp, \
|
||||
.lk = { \
|
||||
.dev_id = dev, \
|
||||
.con_id = con, \
|
||||
.clk = ck, \
|
||||
}, \
|
||||
}
|
||||
|
||||
/* Platform flags for the clkdev-OMAP integration code */
|
||||
#define CK_310 (1 << 0)
|
||||
#define CK_7XX (1 << 1) /* 7xx, 850 */
|
||||
#define CK_1510 (1 << 2)
|
||||
#define CK_16XX (1 << 3) /* 16xx, 17xx, 5912 */
|
||||
#define CK_1710 (1 << 4) /* 1710 extra for rate selection */
|
||||
|
||||
|
||||
/* Temporary, needed during the common clock framework conversion */
|
||||
#define __clk_get_name(clk) (clk->name)
|
||||
#define __clk_get_parent(clk) (clk->parent)
|
||||
#define __clk_get_rate(clk) (clk->rate)
|
||||
|
||||
/**
|
||||
* struct clkops - some clock function pointers
|
||||
* @enable: fn ptr that enables the current clock in hardware
|
||||
* @disable: fn ptr that enables the current clock in hardware
|
||||
* @find_idlest: function returning the IDLEST register for the clock's IP blk
|
||||
* @find_companion: function returning the "companion" clk reg for the clock
|
||||
* @allow_idle: fn ptr that enables autoidle for the current clock in hardware
|
||||
* @deny_idle: fn ptr that disables autoidle for the current clock in hardware
|
||||
*
|
||||
* A "companion" clk is an accompanying clock to the one being queried
|
||||
* that must be enabled for the IP module connected to the clock to
|
||||
* become accessible by the hardware. Neither @find_idlest nor
|
||||
* @find_companion should be needed; that information is IP
|
||||
* block-specific; the hwmod code has been created to handle this, but
|
||||
* until hwmod data is ready and drivers have been converted to use PM
|
||||
* runtime calls in place of clk_enable()/clk_disable(), @find_idlest and
|
||||
* @find_companion must, unfortunately, remain.
|
||||
*/
|
||||
struct clkops {
|
||||
int (*enable)(struct clk *);
|
||||
void (*disable)(struct clk *);
|
||||
void (*find_idlest)(struct clk *, void __iomem **,
|
||||
u8 *, u8 *);
|
||||
void (*find_companion)(struct clk *, void __iomem **,
|
||||
u8 *);
|
||||
void (*allow_idle)(struct clk *);
|
||||
void (*deny_idle)(struct clk *);
|
||||
};
|
||||
|
||||
/*
|
||||
* struct clk.flags possibilities
|
||||
*
|
||||
* XXX document the rest of the clock flags here
|
||||
*
|
||||
* CLOCK_CLKOUTX2: (OMAP4 only) DPLL CLKOUT and CLKOUTX2 GATE_CTRL
|
||||
* bits share the same register. This flag allows the
|
||||
* omap4_dpllmx*() code to determine which GATE_CTRL bit field
|
||||
* should be used. This is a temporary solution - a better approach
|
||||
* would be to associate clock type-specific data with the clock,
|
||||
* similar to the struct dpll_data approach.
|
||||
*/
|
||||
#define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */
|
||||
#define CLOCK_IDLE_CONTROL (1 << 1)
|
||||
#define CLOCK_NO_IDLE_PARENT (1 << 2)
|
||||
#define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */
|
||||
#define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */
|
||||
#define CLOCK_CLKOUTX2 (1 << 5)
|
||||
|
||||
/**
|
||||
* struct clk - OMAP struct clk
|
||||
* @node: list_head connecting this clock into the full clock list
|
||||
* @ops: struct clkops * for this clock
|
||||
* @name: the name of the clock in the hardware (used in hwmod data and debug)
|
||||
* @parent: pointer to this clock's parent struct clk
|
||||
* @children: list_head connecting to the child clks' @sibling list_heads
|
||||
* @sibling: list_head connecting this clk to its parent clk's @children
|
||||
* @rate: current clock rate
|
||||
* @enable_reg: register to write to enable the clock (see @enable_bit)
|
||||
* @recalc: fn ptr that returns the clock's current rate
|
||||
* @set_rate: fn ptr that can change the clock's current rate
|
||||
* @round_rate: fn ptr that can round the clock's current rate
|
||||
* @init: fn ptr to do clock-specific initialization
|
||||
* @enable_bit: bitshift to write to enable/disable the clock (see @enable_reg)
|
||||
* @usecount: number of users that have requested this clock to be enabled
|
||||
* @fixed_div: when > 0, this clock's rate is its parent's rate / @fixed_div
|
||||
* @flags: see "struct clk.flags possibilities" above
|
||||
* @rate_offset: bitshift for rate selection bitfield (OMAP1 only)
|
||||
* @src_offset: bitshift for source selection bitfield (OMAP1 only)
|
||||
*
|
||||
* XXX @rate_offset, @src_offset should probably be removed and OMAP1
|
||||
* clock code converted to use clksel.
|
||||
*
|
||||
* XXX @usecount is poorly named. It should be "enable_count" or
|
||||
* something similar. "users" in the description refers to kernel
|
||||
* code (core code or drivers) that have called clk_enable() and not
|
||||
* yet called clk_disable(); the usecount of parent clocks is also
|
||||
* incremented by the clock code when clk_enable() is called on child
|
||||
* clocks and decremented by the clock code when clk_disable() is
|
||||
* called on child clocks.
|
||||
*
|
||||
* XXX @clkdm, @usecount, @children, @sibling should be marked for
|
||||
* internal use only.
|
||||
*
|
||||
* @children and @sibling are used to optimize parent-to-child clock
|
||||
* tree traversals. (child-to-parent traversals use @parent.)
|
||||
*
|
||||
* XXX The notion of the clock's current rate probably needs to be
|
||||
* separated from the clock's target rate.
|
||||
*/
|
||||
struct clk {
|
||||
struct list_head node;
|
||||
const struct clkops *ops;
|
||||
const char *name;
|
||||
struct clk *parent;
|
||||
struct list_head children;
|
||||
struct list_head sibling; /* node for children */
|
||||
unsigned long rate;
|
||||
void __iomem *enable_reg;
|
||||
unsigned long (*recalc)(struct clk *);
|
||||
int (*set_rate)(struct clk *, unsigned long);
|
||||
long (*round_rate)(struct clk *, unsigned long);
|
||||
void (*init)(struct clk *);
|
||||
u8 enable_bit;
|
||||
s8 usecount;
|
||||
u8 fixed_div;
|
||||
u8 flags;
|
||||
u8 rate_offset;
|
||||
u8 src_offset;
|
||||
#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
|
||||
struct dentry *dent; /* For visible tree hierarchy */
|
||||
#endif
|
||||
};
|
||||
|
||||
struct clk_functions {
|
||||
int (*clk_enable)(struct clk *clk);
|
||||
void (*clk_disable)(struct clk *clk);
|
||||
long (*clk_round_rate)(struct clk *clk, unsigned long rate);
|
||||
int (*clk_set_rate)(struct clk *clk, unsigned long rate);
|
||||
int (*clk_set_parent)(struct clk *clk, struct clk *parent);
|
||||
void (*clk_allow_idle)(struct clk *clk);
|
||||
void (*clk_deny_idle)(struct clk *clk);
|
||||
void (*clk_disable_unused)(struct clk *clk);
|
||||
};
|
||||
|
||||
extern int mpurate;
|
||||
|
||||
extern int clk_init(struct clk_functions *custom_clocks);
|
||||
extern void clk_preinit(struct clk *clk);
|
||||
extern int clk_register(struct clk *clk);
|
||||
extern void clk_reparent(struct clk *child, struct clk *parent);
|
||||
extern void clk_unregister(struct clk *clk);
|
||||
extern void propagate_rate(struct clk *clk);
|
||||
extern void recalculate_root_clocks(void);
|
||||
extern unsigned long followparent_recalc(struct clk *clk);
|
||||
extern void clk_enable_init_clocks(void);
|
||||
unsigned long omap_fixed_divisor_recalc(struct clk *clk);
|
||||
extern struct clk *omap_clk_get_by_name(const char *name);
|
||||
extern int omap_clk_enable_autoidle_all(void);
|
||||
extern int omap_clk_disable_autoidle_all(void);
|
||||
|
||||
extern const struct clkops clkops_null;
|
||||
|
||||
extern struct clk dummy_ck;
|
||||
|
||||
int omap1_clk_init(void);
|
||||
void omap1_clk_late_init(void);
|
||||
|
|
|
@ -22,14 +22,13 @@
|
|||
|
||||
#include <asm/mach-types.h> /* for machine_is_* */
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/clkdev_omap.h>
|
||||
#include <plat/sram.h> /* for omap_sram_reprogram_clock() */
|
||||
#include "soc.h"
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/usb.h> /* for OTG_BASE */
|
||||
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "iomap.h"
|
||||
#include "clock.h"
|
||||
|
||||
|
@ -765,14 +764,6 @@ static struct omap_clk omap_clks[] = {
|
|||
* init
|
||||
*/
|
||||
|
||||
static struct clk_functions omap1_clk_functions = {
|
||||
.clk_enable = omap1_clk_enable,
|
||||
.clk_disable = omap1_clk_disable,
|
||||
.clk_round_rate = omap1_clk_round_rate,
|
||||
.clk_set_rate = omap1_clk_set_rate,
|
||||
.clk_disable_unused = omap1_clk_disable_unused,
|
||||
};
|
||||
|
||||
static void __init omap1_show_rates(void)
|
||||
{
|
||||
pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
|
||||
|
@ -803,8 +794,6 @@ int __init omap1_clk_init(void)
|
|||
if (!cpu_is_omap15xx())
|
||||
omap_writew(0, SOFT_REQ_REG2);
|
||||
|
||||
clk_init(&omap1_clk_functions);
|
||||
|
||||
/* By default all idlect1 clocks are allowed to idle */
|
||||
arm_idlect1_mask = ~0;
|
||||
|
||||
|
|
|
@ -26,8 +26,11 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP1_COMMON_H
|
||||
#define __ARCH_ARM_MACH_OMAP1_COMMON_H
|
||||
|
||||
#include <plat/common.h>
|
||||
#include "../plat-omap/common.h"
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/i2c-omap.h>
|
||||
|
||||
#include "../plat-omap/i2c.h"
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
|
||||
void omap7xx_map_io(void);
|
||||
|
@ -38,6 +41,7 @@ static inline void omap7xx_map_io(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
void omap1510_fpga_init_irq(void);
|
||||
void omap15xx_map_io(void);
|
||||
#else
|
||||
static inline void omap15xx_map_io(void)
|
||||
|
@ -90,4 +94,6 @@ extern int ocpi_enable(void);
|
|||
static inline int ocpi_enable(void) { return 0; }
|
||||
#endif
|
||||
|
||||
extern u32 omap1_get_reset_sources(void);
|
||||
|
||||
#endif /* __ARCH_ARM_MACH_OMAP1_COMMON_H */
|
||||
|
|
|
@ -17,19 +17,23 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <linux/platform_data/omap-wd-timer.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/mmc.h>
|
||||
|
||||
#include <mach/omap7xx.h>
|
||||
#include <mach/camera.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "clock.h"
|
||||
#include "dma.h"
|
||||
#include "mmc.h"
|
||||
|
||||
#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
|
||||
|
||||
|
@ -175,6 +179,13 @@ static int __init omap_mmc_add(const char *name, int id, unsigned long base,
|
|||
res[3].name = "tx";
|
||||
res[3].flags = IORESOURCE_DMA;
|
||||
|
||||
if (cpu_is_omap7xx())
|
||||
data->slots[0].features = MMC_OMAP7XX;
|
||||
if (cpu_is_omap15xx())
|
||||
data->slots[0].features = MMC_OMAP15XX;
|
||||
if (cpu_is_omap16xx())
|
||||
data->slots[0].features = MMC_OMAP16XX;
|
||||
|
||||
ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res));
|
||||
if (ret == 0)
|
||||
ret = platform_device_add_data(pdev, data, sizeof(*data));
|
||||
|
@ -439,18 +450,31 @@ static struct resource wdt_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device omap_wdt_device = {
|
||||
.name = "omap_wdt",
|
||||
.id = -1,
|
||||
.name = "omap_wdt",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(wdt_resources),
|
||||
.resource = wdt_resources,
|
||||
};
|
||||
|
||||
static int __init omap_init_wdt(void)
|
||||
{
|
||||
struct omap_wd_timer_platform_data pdata;
|
||||
int ret;
|
||||
|
||||
if (!cpu_is_omap16xx())
|
||||
return -ENODEV;
|
||||
|
||||
return platform_device_register(&omap_wdt_device);
|
||||
pdata.read_reset_sources = omap1_get_reset_sources;
|
||||
|
||||
ret = platform_device_register(&omap_wdt_device);
|
||||
if (!ret) {
|
||||
ret = platform_device_add_data(&omap_wdt_device, &pdata,
|
||||
sizeof(pdata));
|
||||
if (ret)
|
||||
platform_device_del(&omap_wdt_device);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
subsys_initcall(omap_init_wdt);
|
||||
#endif
|
||||
|
|
|
@ -25,11 +25,13 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/dma.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/tc.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include "dma.h"
|
||||
|
||||
#define OMAP1_DMA_BASE (0xfffed800)
|
||||
#define OMAP1_LOGICAL_DMA_CH_COUNT 17
|
||||
#define OMAP1_DMA_STRIDE 0x40
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* OMAP1 DMA channel definitions
|
||||
*
|
||||
* 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, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __OMAP1_DMA_CHANNEL_H
|
||||
#define __OMAP1_DMA_CHANNEL_H
|
||||
|
||||
/* DMA channels for omap1 */
|
||||
#define OMAP_DMA_NO_DEVICE 0
|
||||
#define OMAP_DMA_MCSI1_TX 1
|
||||
#define OMAP_DMA_MCSI1_RX 2
|
||||
#define OMAP_DMA_I2C_RX 3
|
||||
#define OMAP_DMA_I2C_TX 4
|
||||
#define OMAP_DMA_EXT_NDMA_REQ 5
|
||||
#define OMAP_DMA_EXT_NDMA_REQ2 6
|
||||
#define OMAP_DMA_UWIRE_TX 7
|
||||
#define OMAP_DMA_MCBSP1_TX 8
|
||||
#define OMAP_DMA_MCBSP1_RX 9
|
||||
#define OMAP_DMA_MCBSP3_TX 10
|
||||
#define OMAP_DMA_MCBSP3_RX 11
|
||||
#define OMAP_DMA_UART1_TX 12
|
||||
#define OMAP_DMA_UART1_RX 13
|
||||
#define OMAP_DMA_UART2_TX 14
|
||||
#define OMAP_DMA_UART2_RX 15
|
||||
#define OMAP_DMA_MCBSP2_TX 16
|
||||
#define OMAP_DMA_MCBSP2_RX 17
|
||||
#define OMAP_DMA_UART3_TX 18
|
||||
#define OMAP_DMA_UART3_RX 19
|
||||
#define OMAP_DMA_CAMERA_IF_RX 20
|
||||
#define OMAP_DMA_MMC_TX 21
|
||||
#define OMAP_DMA_MMC_RX 22
|
||||
#define OMAP_DMA_NAND 23
|
||||
#define OMAP_DMA_IRQ_LCD_LINE 24
|
||||
#define OMAP_DMA_MEMORY_STICK 25
|
||||
#define OMAP_DMA_USB_W2FC_RX0 26
|
||||
#define OMAP_DMA_USB_W2FC_RX1 27
|
||||
#define OMAP_DMA_USB_W2FC_RX2 28
|
||||
#define OMAP_DMA_USB_W2FC_TX0 29
|
||||
#define OMAP_DMA_USB_W2FC_TX1 30
|
||||
#define OMAP_DMA_USB_W2FC_TX2 31
|
||||
|
||||
/* These are only for 1610 */
|
||||
#define OMAP_DMA_CRYPTO_DES_IN 32
|
||||
#define OMAP_DMA_SPI_TX 33
|
||||
#define OMAP_DMA_SPI_RX 34
|
||||
#define OMAP_DMA_CRYPTO_HASH 35
|
||||
#define OMAP_DMA_CCP_ATTN 36
|
||||
#define OMAP_DMA_CCP_FIFO_NOT_EMPTY 37
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_0 38
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_0 39
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_1 40
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_1 41
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_2 42
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_2 43
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_3 44
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_3 45
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_4 46
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_4 47
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_5 48
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_5 49
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_6 50
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_6 51
|
||||
#define OMAP_DMA_CMT_APE_TX_CHAN_7 52
|
||||
#define OMAP_DMA_CMT_APE_RV_CHAN_7 53
|
||||
#define OMAP_DMA_MMC2_TX 54
|
||||
#define OMAP_DMA_MMC2_RX 55
|
||||
#define OMAP_DMA_CRYPTO_DES_OUT 56
|
||||
|
||||
#endif /* __OMAP1_DMA_CHANNEL_H */
|
|
@ -10,7 +10,7 @@
|
|||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/flash.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
|
|
@ -27,11 +27,12 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <plat/fpga.h>
|
||||
#include <../plat-omap/fpga.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "iomap.h"
|
||||
#include "common.h"
|
||||
|
||||
static void fpga_mask_irq(struct irq_data *d)
|
||||
{
|
||||
|
|
|
@ -19,11 +19,25 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <plat/i2c.h>
|
||||
#include <linux/i2c-omap.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/cpu.h>
|
||||
#include "soc.h"
|
||||
|
||||
void __init omap1_i2c_mux_pins(int bus_id)
|
||||
#include "../plat-omap/i2c.h"
|
||||
|
||||
#define OMAP_I2C_SIZE 0x3f
|
||||
#define OMAP1_I2C_BASE 0xfffb3800
|
||||
#define OMAP1_INT_I2C (32 + 4)
|
||||
|
||||
static const char name[] = "omap_i2c";
|
||||
|
||||
static struct resource i2c_resources[2] = {
|
||||
};
|
||||
|
||||
static struct platform_device omap_i2c_devices[1] = {
|
||||
};
|
||||
|
||||
static void __init omap1_i2c_mux_pins(int bus_id)
|
||||
{
|
||||
if (cpu_is_omap7xx()) {
|
||||
omap_cfg_reg(I2C_7XX_SDA);
|
||||
|
@ -33,3 +47,44 @@ void __init omap1_i2c_mux_pins(int bus_id)
|
|||
omap_cfg_reg(I2C_SCL);
|
||||
}
|
||||
}
|
||||
|
||||
int __init omap_i2c_add_bus(struct omap_i2c_bus_platform_data *pdata,
|
||||
int bus_id)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct resource *res;
|
||||
|
||||
omap1_i2c_mux_pins(bus_id);
|
||||
|
||||
pdev = &omap_i2c_devices[bus_id - 1];
|
||||
pdev->id = bus_id;
|
||||
pdev->name = name;
|
||||
pdev->num_resources = ARRAY_SIZE(i2c_resources);
|
||||
res = i2c_resources;
|
||||
res[0].start = OMAP1_I2C_BASE;
|
||||
res[0].end = res[0].start + OMAP_I2C_SIZE;
|
||||
res[0].flags = IORESOURCE_MEM;
|
||||
res[1].start = OMAP1_INT_I2C;
|
||||
res[1].flags = IORESOURCE_IRQ;
|
||||
pdev->resource = res;
|
||||
|
||||
/* all OMAP1 have IP version 1 register set */
|
||||
pdata->rev = OMAP_I2C_IP_VERSION_1;
|
||||
|
||||
/* all OMAP1 I2C are implemented like this */
|
||||
pdata->flags = OMAP_I2C_FLAG_NO_FIFO |
|
||||
OMAP_I2C_FLAG_SIMPLE_CLOCK |
|
||||
OMAP_I2C_FLAG_16BIT_DATA_REG |
|
||||
OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK;
|
||||
|
||||
/* how the cpu bus is wired up differs for 7xx only */
|
||||
|
||||
if (cpu_is_omap7xx())
|
||||
pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_1;
|
||||
else
|
||||
pdata->flags |= OMAP_I2C_FLAG_BUS_SHIFT_2;
|
||||
|
||||
pdev->dev.platform_data = pdata;
|
||||
|
||||
return platform_device_register(pdev);
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <asm/system_info.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include "soc.h"
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#include <plat/serial.h>
|
||||
#include "serial.h"
|
||||
|
||||
.pushsection .data
|
||||
omap_uart_phys: .word 0x0
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include <asm/sizes.h>
|
||||
#ifndef __ASSEMBLER__
|
||||
#include <asm/types.h>
|
||||
#include <plat/cpu.h>
|
||||
#include "../../mach-omap1/soc.h"
|
||||
|
||||
/*
|
||||
* NOTE: Please use ioremap + __raw_read/write where possible instead of these
|
||||
|
@ -51,7 +51,7 @@ extern void omap_writeb(u8 v, u32 pa);
|
|||
extern void omap_writew(u16 v, u32 pa);
|
||||
extern void omap_writel(u32 v, u32 pa);
|
||||
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
|
||||
/* Almost all documentation for chip and board memory maps assumes
|
||||
* BM is clear. Most devel boards have a switch to control booting
|
||||
|
@ -72,7 +72,7 @@ static inline u32 omap_cs3_phys(void)
|
|||
|
||||
#endif /* ifndef __ASSEMBLER__ */
|
||||
|
||||
#include <plat/serial.h>
|
||||
#include <mach/serial.h>
|
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------------------
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
* because of the strncmp().
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_OMAP15XX) && !defined(__ASSEMBLER__)
|
||||
#include <plat/cpu.h>
|
||||
#include "../../mach-omap1/soc.h"
|
||||
|
||||
/*
|
||||
* OMAP-1510 Local Bus address offset
|
||||
|
|
|
@ -45,5 +45,118 @@
|
|||
|
||||
#define OMAP1510_DSP_MMU_BASE (0xfffed200)
|
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------------------
|
||||
* OMAP-1510 FPGA
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
#define OMAP1510_FPGA_BASE 0xE8000000 /* VA */
|
||||
#define OMAP1510_FPGA_SIZE SZ_4K
|
||||
#define OMAP1510_FPGA_START 0x08000000 /* PA */
|
||||
|
||||
/* Revision */
|
||||
#define OMAP1510_FPGA_REV_LOW IOMEM(OMAP1510_FPGA_BASE + 0x0)
|
||||
#define OMAP1510_FPGA_REV_HIGH IOMEM(OMAP1510_FPGA_BASE + 0x1)
|
||||
#define OMAP1510_FPGA_LCD_PANEL_CONTROL IOMEM(OMAP1510_FPGA_BASE + 0x2)
|
||||
#define OMAP1510_FPGA_LED_DIGIT IOMEM(OMAP1510_FPGA_BASE + 0x3)
|
||||
#define INNOVATOR_FPGA_HID_SPI IOMEM(OMAP1510_FPGA_BASE + 0x4)
|
||||
#define OMAP1510_FPGA_POWER IOMEM(OMAP1510_FPGA_BASE + 0x5)
|
||||
|
||||
/* Interrupt status */
|
||||
#define OMAP1510_FPGA_ISR_LO IOMEM(OMAP1510_FPGA_BASE + 0x6)
|
||||
#define OMAP1510_FPGA_ISR_HI IOMEM(OMAP1510_FPGA_BASE + 0x7)
|
||||
|
||||
/* Interrupt mask */
|
||||
#define OMAP1510_FPGA_IMR_LO IOMEM(OMAP1510_FPGA_BASE + 0x8)
|
||||
#define OMAP1510_FPGA_IMR_HI IOMEM(OMAP1510_FPGA_BASE + 0x9)
|
||||
|
||||
/* Reset registers */
|
||||
#define OMAP1510_FPGA_HOST_RESET IOMEM(OMAP1510_FPGA_BASE + 0xa)
|
||||
#define OMAP1510_FPGA_RST IOMEM(OMAP1510_FPGA_BASE + 0xb)
|
||||
|
||||
#define OMAP1510_FPGA_AUDIO IOMEM(OMAP1510_FPGA_BASE + 0xc)
|
||||
#define OMAP1510_FPGA_DIP IOMEM(OMAP1510_FPGA_BASE + 0xe)
|
||||
#define OMAP1510_FPGA_FPGA_IO IOMEM(OMAP1510_FPGA_BASE + 0xf)
|
||||
#define OMAP1510_FPGA_UART1 IOMEM(OMAP1510_FPGA_BASE + 0x14)
|
||||
#define OMAP1510_FPGA_UART2 IOMEM(OMAP1510_FPGA_BASE + 0x15)
|
||||
#define OMAP1510_FPGA_OMAP1510_STATUS IOMEM(OMAP1510_FPGA_BASE + 0x16)
|
||||
#define OMAP1510_FPGA_BOARD_REV IOMEM(OMAP1510_FPGA_BASE + 0x18)
|
||||
#define INNOVATOR_FPGA_CAM_USB_CONTROL IOMEM(OMAP1510_FPGA_BASE + 0x20c)
|
||||
#define OMAP1510P1_PPT_DATA IOMEM(OMAP1510_FPGA_BASE + 0x100)
|
||||
#define OMAP1510P1_PPT_STATUS IOMEM(OMAP1510_FPGA_BASE + 0x101)
|
||||
#define OMAP1510P1_PPT_CONTROL IOMEM(OMAP1510_FPGA_BASE + 0x102)
|
||||
|
||||
#define OMAP1510_FPGA_TOUCHSCREEN IOMEM(OMAP1510_FPGA_BASE + 0x204)
|
||||
|
||||
#define INNOVATOR_FPGA_INFO IOMEM(OMAP1510_FPGA_BASE + 0x205)
|
||||
#define INNOVATOR_FPGA_LCD_BRIGHT_LO IOMEM(OMAP1510_FPGA_BASE + 0x206)
|
||||
#define INNOVATOR_FPGA_LCD_BRIGHT_HI IOMEM(OMAP1510_FPGA_BASE + 0x207)
|
||||
#define INNOVATOR_FPGA_LED_GRN_LO IOMEM(OMAP1510_FPGA_BASE + 0x208)
|
||||
#define INNOVATOR_FPGA_LED_GRN_HI IOMEM(OMAP1510_FPGA_BASE + 0x209)
|
||||
#define INNOVATOR_FPGA_LED_RED_LO IOMEM(OMAP1510_FPGA_BASE + 0x20a)
|
||||
#define INNOVATOR_FPGA_LED_RED_HI IOMEM(OMAP1510_FPGA_BASE + 0x20b)
|
||||
#define INNOVATOR_FPGA_EXP_CONTROL IOMEM(OMAP1510_FPGA_BASE + 0x20d)
|
||||
#define INNOVATOR_FPGA_ISR2 IOMEM(OMAP1510_FPGA_BASE + 0x20e)
|
||||
#define INNOVATOR_FPGA_IMR2 IOMEM(OMAP1510_FPGA_BASE + 0x210)
|
||||
|
||||
#define OMAP1510_FPGA_ETHR_START (OMAP1510_FPGA_START + 0x300)
|
||||
|
||||
/*
|
||||
* Power up Giga UART driver, turn on HID clock.
|
||||
* Turn off BT power, since we're not using it and it
|
||||
* draws power.
|
||||
*/
|
||||
#define OMAP1510_FPGA_RESET_VALUE 0x42
|
||||
|
||||
#define OMAP1510_FPGA_PCR_IF_PD0 (1 << 7)
|
||||
#define OMAP1510_FPGA_PCR_COM2_EN (1 << 6)
|
||||
#define OMAP1510_FPGA_PCR_COM1_EN (1 << 5)
|
||||
#define OMAP1510_FPGA_PCR_EXP_PD0 (1 << 4)
|
||||
#define OMAP1510_FPGA_PCR_EXP_PD1 (1 << 3)
|
||||
#define OMAP1510_FPGA_PCR_48MHZ_CLK (1 << 2)
|
||||
#define OMAP1510_FPGA_PCR_4MHZ_CLK (1 << 1)
|
||||
#define OMAP1510_FPGA_PCR_RSRVD_BIT0 (1 << 0)
|
||||
|
||||
/*
|
||||
* Innovator/OMAP1510 FPGA HID register bit definitions
|
||||
*/
|
||||
#define OMAP1510_FPGA_HID_SCLK (1<<0) /* output */
|
||||
#define OMAP1510_FPGA_HID_MOSI (1<<1) /* output */
|
||||
#define OMAP1510_FPGA_HID_nSS (1<<2) /* output 0/1 chip idle/select */
|
||||
#define OMAP1510_FPGA_HID_nHSUS (1<<3) /* output 0/1 host active/suspended */
|
||||
#define OMAP1510_FPGA_HID_MISO (1<<4) /* input */
|
||||
#define OMAP1510_FPGA_HID_ATN (1<<5) /* input 0/1 chip idle/ATN */
|
||||
#define OMAP1510_FPGA_HID_rsrvd (1<<6)
|
||||
#define OMAP1510_FPGA_HID_RESETn (1<<7) /* output - 0/1 USAR reset/run */
|
||||
|
||||
/* The FPGA IRQ is cascaded through GPIO_13 */
|
||||
#define OMAP1510_INT_FPGA (IH_GPIO_BASE + 13)
|
||||
|
||||
/* IRQ Numbers for interrupts muxed through the FPGA */
|
||||
#define OMAP1510_INT_FPGA_ATN (OMAP_FPGA_IRQ_BASE + 0)
|
||||
#define OMAP1510_INT_FPGA_ACK (OMAP_FPGA_IRQ_BASE + 1)
|
||||
#define OMAP1510_INT_FPGA2 (OMAP_FPGA_IRQ_BASE + 2)
|
||||
#define OMAP1510_INT_FPGA3 (OMAP_FPGA_IRQ_BASE + 3)
|
||||
#define OMAP1510_INT_FPGA4 (OMAP_FPGA_IRQ_BASE + 4)
|
||||
#define OMAP1510_INT_FPGA5 (OMAP_FPGA_IRQ_BASE + 5)
|
||||
#define OMAP1510_INT_FPGA6 (OMAP_FPGA_IRQ_BASE + 6)
|
||||
#define OMAP1510_INT_FPGA7 (OMAP_FPGA_IRQ_BASE + 7)
|
||||
#define OMAP1510_INT_FPGA8 (OMAP_FPGA_IRQ_BASE + 8)
|
||||
#define OMAP1510_INT_FPGA9 (OMAP_FPGA_IRQ_BASE + 9)
|
||||
#define OMAP1510_INT_FPGA10 (OMAP_FPGA_IRQ_BASE + 10)
|
||||
#define OMAP1510_INT_FPGA11 (OMAP_FPGA_IRQ_BASE + 11)
|
||||
#define OMAP1510_INT_FPGA12 (OMAP_FPGA_IRQ_BASE + 12)
|
||||
#define OMAP1510_INT_ETHER (OMAP_FPGA_IRQ_BASE + 13)
|
||||
#define OMAP1510_INT_FPGAUART1 (OMAP_FPGA_IRQ_BASE + 14)
|
||||
#define OMAP1510_INT_FPGAUART2 (OMAP_FPGA_IRQ_BASE + 15)
|
||||
#define OMAP1510_INT_FPGA_TS (OMAP_FPGA_IRQ_BASE + 16)
|
||||
#define OMAP1510_INT_FPGA17 (OMAP_FPGA_IRQ_BASE + 17)
|
||||
#define OMAP1510_INT_FPGA_CAM (OMAP_FPGA_IRQ_BASE + 18)
|
||||
#define OMAP1510_INT_FPGA_RTC_A (OMAP_FPGA_IRQ_BASE + 19)
|
||||
#define OMAP1510_INT_FPGA_RTC_B (OMAP_FPGA_IRQ_BASE + 20)
|
||||
#define OMAP1510_INT_FPGA_CD (OMAP_FPGA_IRQ_BASE + 21)
|
||||
#define OMAP1510_INT_FPGA22 (OMAP_FPGA_IRQ_BASE + 22)
|
||||
#define OMAP1510_INT_FPGA23 (OMAP_FPGA_IRQ_BASE + 23)
|
||||
|
||||
#endif /* __ASM_ARCH_OMAP15XX_H */
|
||||
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Texas Instruments
|
||||
* Added OMAP4 support- Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_SERIAL_H
|
||||
#define __ASM_ARCH_SERIAL_H
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
/*
|
||||
* Memory entry used for the DEBUG_LL UART configuration, relative to
|
||||
* start of RAM. See also uncompress.h and debug-macro.S.
|
||||
*
|
||||
* Note that using a memory location for storing the UART configuration
|
||||
* has at least two limitations:
|
||||
*
|
||||
* 1. Kernel uncompress code cannot overlap OMAP_UART_INFO as the
|
||||
* uncompress code could then partially overwrite itself
|
||||
* 2. We assume printascii is called at least once before paging_init,
|
||||
* and addruart has a chance to read OMAP_UART_INFO
|
||||
*/
|
||||
#define OMAP_UART_INFO_OFS 0x3ffc
|
||||
|
||||
/* OMAP1 serial ports */
|
||||
#define OMAP1_UART1_BASE 0xfffb0000
|
||||
#define OMAP1_UART2_BASE 0xfffb0800
|
||||
#define OMAP1_UART3_BASE 0xfffb9800
|
||||
|
||||
#define OMAP_PORT_SHIFT 2
|
||||
#define OMAP7XX_PORT_SHIFT 0
|
||||
|
||||
#define OMAP1510_BASE_BAUD (12000000/16)
|
||||
#define OMAP16XX_BASE_BAUD (48000000/16)
|
||||
|
||||
/*
|
||||
* DEBUG_LL port encoding stored into the UART1 scratchpad register by
|
||||
* decomp_setup in uncompress.h
|
||||
*/
|
||||
#define OMAP1UART1 11
|
||||
#define OMAP1UART2 12
|
||||
#define OMAP1UART3 13
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
extern void omap_serial_init(void);
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,5 +1,122 @@
|
|||
/*
|
||||
* arch/arm/mach-omap1/include/mach/uncompress.h
|
||||
* arch/arm/plat-omap/include/mach/uncompress.h
|
||||
*
|
||||
* Serial port stubs for kernel decompress status messages
|
||||
*
|
||||
* Initially based on:
|
||||
* linux-2.4.15-rmk1-dsplinux1.6/arch/arm/plat-omap/include/mach1510/uncompress.h
|
||||
* Copyright (C) 2000 RidgeRun, Inc.
|
||||
* Author: Greg Lonnon <glonnon@ridgerun.com>
|
||||
*
|
||||
* Rewritten by:
|
||||
* Author: <source@mvista.com>
|
||||
* 2004 (c) MontaVista Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <plat/uncompress.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/serial_reg.h>
|
||||
|
||||
#include <asm/memory.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include "serial.h"
|
||||
|
||||
#define MDR1_MODE_MASK 0x07
|
||||
|
||||
volatile u8 *uart_base;
|
||||
int uart_shift;
|
||||
|
||||
/*
|
||||
* Store the DEBUG_LL uart number into memory.
|
||||
* See also debug-macro.S, and serial.c for related code.
|
||||
*/
|
||||
static void set_omap_uart_info(unsigned char port)
|
||||
{
|
||||
/*
|
||||
* Get address of some.bss variable and round it down
|
||||
* a la CONFIG_AUTO_ZRELADDR.
|
||||
*/
|
||||
u32 ram_start = (u32)&uart_shift & 0xf8000000;
|
||||
u32 *uart_info = (u32 *)(ram_start + OMAP_UART_INFO_OFS);
|
||||
*uart_info = port;
|
||||
}
|
||||
|
||||
static void putc(int c)
|
||||
{
|
||||
if (!uart_base)
|
||||
return;
|
||||
|
||||
/* Check for UART 16x mode */
|
||||
if ((uart_base[UART_OMAP_MDR1 << uart_shift] & MDR1_MODE_MASK) != 0)
|
||||
return;
|
||||
|
||||
while (!(uart_base[UART_LSR << uart_shift] & UART_LSR_THRE))
|
||||
barrier();
|
||||
uart_base[UART_TX << uart_shift] = c;
|
||||
}
|
||||
|
||||
static inline void flush(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Macros to configure UART1 and debug UART
|
||||
*/
|
||||
#define _DEBUG_LL_ENTRY(mach, dbg_uart, dbg_shft, dbg_id) \
|
||||
if (machine_is_##mach()) { \
|
||||
uart_base = (volatile u8 *)(dbg_uart); \
|
||||
uart_shift = (dbg_shft); \
|
||||
port = (dbg_id); \
|
||||
set_omap_uart_info(port); \
|
||||
break; \
|
||||
}
|
||||
|
||||
#define DEBUG_LL_OMAP7XX(p, mach) \
|
||||
_DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP7XX_PORT_SHIFT, \
|
||||
OMAP1UART##p)
|
||||
|
||||
#define DEBUG_LL_OMAP1(p, mach) \
|
||||
_DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP_PORT_SHIFT, \
|
||||
OMAP1UART##p)
|
||||
|
||||
static inline void arch_decomp_setup(void)
|
||||
{
|
||||
int port = 0;
|
||||
|
||||
/*
|
||||
* Initialize the port based on the machine ID from the bootloader.
|
||||
* Note that we're using macros here instead of switch statement
|
||||
* as machine_is functions are optimized out for the boards that
|
||||
* are not selected.
|
||||
*/
|
||||
do {
|
||||
/* omap7xx/8xx based boards using UART1 with shift 0 */
|
||||
DEBUG_LL_OMAP7XX(1, herald);
|
||||
DEBUG_LL_OMAP7XX(1, omap_perseus2);
|
||||
|
||||
/* omap15xx/16xx based boards using UART1 */
|
||||
DEBUG_LL_OMAP1(1, ams_delta);
|
||||
DEBUG_LL_OMAP1(1, nokia770);
|
||||
DEBUG_LL_OMAP1(1, omap_h2);
|
||||
DEBUG_LL_OMAP1(1, omap_h3);
|
||||
DEBUG_LL_OMAP1(1, omap_innovator);
|
||||
DEBUG_LL_OMAP1(1, omap_osk);
|
||||
DEBUG_LL_OMAP1(1, omap_palmte);
|
||||
DEBUG_LL_OMAP1(1, omap_palmz71);
|
||||
|
||||
/* omap15xx/16xx based boards using UART2 */
|
||||
DEBUG_LL_OMAP1(2, omap_palmtt);
|
||||
|
||||
/* omap15xx/16xx based boards using UART3 */
|
||||
DEBUG_LL_OMAP1(3, sx1);
|
||||
} while (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* nothing to do
|
||||
*/
|
||||
#define arch_decomp_wdog()
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat/dma.h>
|
||||
#include <mach/tc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
|
||||
#include "iomap.h"
|
||||
#include "common.h"
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include "soc.h"
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
|
|
|
@ -27,11 +27,13 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/dma.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/lcdc.h>
|
||||
|
||||
#include "dma.h"
|
||||
|
||||
int omap_lcd_dma_running(void)
|
||||
{
|
||||
/*
|
||||
|
|
|
@ -19,14 +19,15 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <plat/dma.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/cpu.h>
|
||||
#include "soc.h"
|
||||
#include <linux/platform_data/asoc-ti-mcbsp.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include "iomap.h"
|
||||
#include "dma.h"
|
||||
|
||||
#define DPS_RSTCT2_PER_EN (1 << 0)
|
||||
#define DSP_RSTCT2_WD_PER_EN (1 << 1)
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
#include <linux/mmc/host.h>
|
||||
#include <linux/platform_data/mmc-omap.h>
|
||||
|
||||
#define OMAP15XX_NR_MMC 1
|
||||
#define OMAP16XX_NR_MMC 2
|
||||
#define OMAP1_MMC_SIZE 0x080
|
||||
#define OMAP1_MMC1_BASE 0xfffb7800
|
||||
#define OMAP1_MMC2_BASE 0xfffb7c00 /* omap16xx only */
|
||||
|
||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||
void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||
int nr_controllers);
|
||||
#else
|
||||
static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||
int nr_controllers)
|
||||
{
|
||||
}
|
||||
#endif
|
|
@ -10,7 +10,7 @@
|
|||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <plat/clkdev_omap.h>
|
||||
#include "clock.h"
|
||||
#include "opp.h"
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
|
|
@ -49,17 +49,17 @@
|
|||
#include <asm/mach/time.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/clock.h>
|
||||
#include <plat/sram.h>
|
||||
#include <plat/tc.h>
|
||||
#include <mach/tc.h>
|
||||
#include <mach/mux.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <plat/dmtimer.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "iomap.h"
|
||||
#include "clock.h"
|
||||
#include "pm.h"
|
||||
|
||||
static unsigned int arm_sleep_save[ARM_SLEEP_SAVE_SIZE];
|
||||
|
|
|
@ -19,8 +19,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
#include "soc.h"
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
static int omap1_pm_runtime_suspend(struct device *dev)
|
||||
|
|
|
@ -4,12 +4,24 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/prcm.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "iomap.h"
|
||||
#include "common.h"
|
||||
|
||||
/* ARM_SYSST bit shifts related to SoC reset sources */
|
||||
#define ARM_SYSST_POR_SHIFT 5
|
||||
#define ARM_SYSST_EXT_RST_SHIFT 4
|
||||
#define ARM_SYSST_ARM_WDRST_SHIFT 2
|
||||
#define ARM_SYSST_GLOB_SWRST_SHIFT 1
|
||||
|
||||
/* Standardized reset source bits (across all OMAP SoCs) */
|
||||
#define OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT 0
|
||||
#define OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT 1
|
||||
#define OMAP_MPU_WD_RST_SRC_ID_SHIFT 3
|
||||
#define OMAP_EXTWARM_RST_SRC_ID_SHIFT 5
|
||||
|
||||
|
||||
void omap1_restart(char mode, const char *cmd)
|
||||
{
|
||||
/*
|
||||
|
@ -23,3 +35,28 @@ void omap1_restart(char mode, const char *cmd)
|
|||
|
||||
omap_writew(1, ARM_RSTCT1);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap1_get_reset_sources - return the source of the SoC's last reset
|
||||
*
|
||||
* Returns bits that represent the last reset source for the SoC. The
|
||||
* format is standardized across OMAPs for use by the OMAP watchdog.
|
||||
*/
|
||||
u32 omap1_get_reset_sources(void)
|
||||
{
|
||||
u32 ret = 0;
|
||||
u16 rs;
|
||||
|
||||
rs = __raw_readw(OMAP1_IO_ADDRESS(ARM_SYSST));
|
||||
|
||||
if (rs & (1 << ARM_SYSST_POR_SHIFT))
|
||||
ret |= 1 << OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT;
|
||||
if (rs & (1 << ARM_SYSST_EXT_RST_SHIFT))
|
||||
ret |= 1 << OMAP_EXTWARM_RST_SRC_ID_SHIFT;
|
||||
if (rs & (1 << ARM_SYSST_ARM_WDRST_SHIFT))
|
||||
ret |= 1 << OMAP_MPU_WD_RST_SRC_ID_SHIFT;
|
||||
if (rs & (1 << ARM_SYSST_GLOB_SWRST_SHIFT))
|
||||
ret |= 1 << OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
#include <plat/fpga.h>
|
||||
|
||||
#include "pm.h"
|
||||
|
||||
|
|
|
@ -0,0 +1,229 @@
|
|||
/*
|
||||
* OMAP cpu type detection
|
||||
*
|
||||
* Copyright (C) 2004, 2008 Nokia Corporation
|
||||
*
|
||||
* Copyright (C) 2009-11 Texas Instruments.
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
*
|
||||
* Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>
|
||||
*
|
||||
* 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, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_OMAP_CPU_H
|
||||
#define __ASM_ARCH_OMAP_CPU_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/*
|
||||
* Test if multicore OMAP support is needed
|
||||
*/
|
||||
#undef MULTI_OMAP1
|
||||
#undef OMAP_NAME
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
# ifdef OMAP_NAME
|
||||
# undef MULTI_OMAP1
|
||||
# define MULTI_OMAP1
|
||||
# else
|
||||
# define OMAP_NAME omap730
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_OMAP850
|
||||
# ifdef OMAP_NAME
|
||||
# undef MULTI_OMAP1
|
||||
# define MULTI_OMAP1
|
||||
# else
|
||||
# define OMAP_NAME omap850
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
# ifdef OMAP_NAME
|
||||
# undef MULTI_OMAP1
|
||||
# define MULTI_OMAP1
|
||||
# else
|
||||
# define OMAP_NAME omap1510
|
||||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_OMAP16XX
|
||||
# ifdef OMAP_NAME
|
||||
# undef MULTI_OMAP1
|
||||
# define MULTI_OMAP1
|
||||
# else
|
||||
# define OMAP_NAME omap16xx
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* omap_rev bits:
|
||||
* CPU id bits (0730, 1510, 1710, 2422...) [31:16]
|
||||
* CPU revision (See _REV_ defined in cpu.h) [15:08]
|
||||
* CPU class bits (15xx, 16xx, 24xx, 34xx...) [07:00]
|
||||
*/
|
||||
unsigned int omap_rev(void);
|
||||
|
||||
/*
|
||||
* Get the CPU revision for OMAP devices
|
||||
*/
|
||||
#define GET_OMAP_REVISION() ((omap_rev() >> 8) & 0xff)
|
||||
|
||||
/*
|
||||
* Macros to group OMAP into cpu classes.
|
||||
* These can be used in most places.
|
||||
* cpu_is_omap7xx(): True for OMAP730, OMAP850
|
||||
* cpu_is_omap15xx(): True for OMAP1510, OMAP5910 and OMAP310
|
||||
* cpu_is_omap16xx(): True for OMAP1610, OMAP5912 and OMAP1710
|
||||
*/
|
||||
#define GET_OMAP_CLASS (omap_rev() & 0xff)
|
||||
|
||||
#define IS_OMAP_CLASS(class, id) \
|
||||
static inline int is_omap ##class (void) \
|
||||
{ \
|
||||
return (GET_OMAP_CLASS == (id)) ? 1 : 0; \
|
||||
}
|
||||
|
||||
#define GET_OMAP_SUBCLASS ((omap_rev() >> 20) & 0x0fff)
|
||||
|
||||
#define IS_OMAP_SUBCLASS(subclass, id) \
|
||||
static inline int is_omap ##subclass (void) \
|
||||
{ \
|
||||
return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0; \
|
||||
}
|
||||
|
||||
IS_OMAP_CLASS(7xx, 0x07)
|
||||
IS_OMAP_CLASS(15xx, 0x15)
|
||||
IS_OMAP_CLASS(16xx, 0x16)
|
||||
|
||||
#define cpu_is_omap7xx() 0
|
||||
#define cpu_is_omap15xx() 0
|
||||
#define cpu_is_omap16xx() 0
|
||||
|
||||
#if defined(MULTI_OMAP1)
|
||||
# if defined(CONFIG_ARCH_OMAP730)
|
||||
# undef cpu_is_omap7xx
|
||||
# define cpu_is_omap7xx() is_omap7xx()
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP850)
|
||||
# undef cpu_is_omap7xx
|
||||
# define cpu_is_omap7xx() is_omap7xx()
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP15XX)
|
||||
# undef cpu_is_omap15xx
|
||||
# define cpu_is_omap15xx() is_omap15xx()
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP16XX)
|
||||
# undef cpu_is_omap16xx
|
||||
# define cpu_is_omap16xx() is_omap16xx()
|
||||
# endif
|
||||
#else
|
||||
# if defined(CONFIG_ARCH_OMAP730)
|
||||
# undef cpu_is_omap7xx
|
||||
# define cpu_is_omap7xx() 1
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP850)
|
||||
# undef cpu_is_omap7xx
|
||||
# define cpu_is_omap7xx() 1
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP15XX)
|
||||
# undef cpu_is_omap15xx
|
||||
# define cpu_is_omap15xx() 1
|
||||
# endif
|
||||
# if defined(CONFIG_ARCH_OMAP16XX)
|
||||
# undef cpu_is_omap16xx
|
||||
# define cpu_is_omap16xx() 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Macros to detect individual cpu types.
|
||||
* These are only rarely needed.
|
||||
* cpu_is_omap310(): True for OMAP310
|
||||
* cpu_is_omap1510(): True for OMAP1510
|
||||
* cpu_is_omap1610(): True for OMAP1610
|
||||
* cpu_is_omap1611(): True for OMAP1611
|
||||
* cpu_is_omap5912(): True for OMAP5912
|
||||
* cpu_is_omap1621(): True for OMAP1621
|
||||
* cpu_is_omap1710(): True for OMAP1710
|
||||
*/
|
||||
#define GET_OMAP_TYPE ((omap_rev() >> 16) & 0xffff)
|
||||
|
||||
#define IS_OMAP_TYPE(type, id) \
|
||||
static inline int is_omap ##type (void) \
|
||||
{ \
|
||||
return (GET_OMAP_TYPE == (id)) ? 1 : 0; \
|
||||
}
|
||||
|
||||
IS_OMAP_TYPE(310, 0x0310)
|
||||
IS_OMAP_TYPE(1510, 0x1510)
|
||||
IS_OMAP_TYPE(1610, 0x1610)
|
||||
IS_OMAP_TYPE(1611, 0x1611)
|
||||
IS_OMAP_TYPE(5912, 0x1611)
|
||||
IS_OMAP_TYPE(1621, 0x1621)
|
||||
IS_OMAP_TYPE(1710, 0x1710)
|
||||
|
||||
#define cpu_is_omap310() 0
|
||||
#define cpu_is_omap1510() 0
|
||||
#define cpu_is_omap1610() 0
|
||||
#define cpu_is_omap5912() 0
|
||||
#define cpu_is_omap1611() 0
|
||||
#define cpu_is_omap1621() 0
|
||||
#define cpu_is_omap1710() 0
|
||||
|
||||
/* These are needed to compile common code */
|
||||
#ifdef CONFIG_ARCH_OMAP1
|
||||
#define cpu_is_omap242x() 0
|
||||
#define cpu_is_omap2430() 0
|
||||
#define cpu_is_omap243x() 0
|
||||
#define cpu_is_omap24xx() 0
|
||||
#define cpu_is_omap34xx() 0
|
||||
#define cpu_is_omap44xx() 0
|
||||
#define soc_is_omap54xx() 0
|
||||
#define soc_is_am33xx() 0
|
||||
#define cpu_class_is_omap1() 1
|
||||
#define cpu_class_is_omap2() 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Whether we have MULTI_OMAP1 or not, we still need to distinguish
|
||||
* between 310 vs. 1510 and 1611B/5912 vs. 1710.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP15XX)
|
||||
# undef cpu_is_omap310
|
||||
# undef cpu_is_omap1510
|
||||
# define cpu_is_omap310() is_omap310()
|
||||
# define cpu_is_omap1510() is_omap1510()
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
# undef cpu_is_omap1610
|
||||
# undef cpu_is_omap1611
|
||||
# undef cpu_is_omap5912
|
||||
# undef cpu_is_omap1621
|
||||
# undef cpu_is_omap1710
|
||||
# define cpu_is_omap1610() is_omap1610()
|
||||
# define cpu_is_omap1611() is_omap1611()
|
||||
# define cpu_is_omap5912() is_omap5912()
|
||||
# define cpu_is_omap1621() is_omap1621()
|
||||
# define cpu_is_omap1710() is_omap1710()
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif
|
|
@ -34,6 +34,7 @@ config ARCH_OMAP2
|
|||
select CPU_V6
|
||||
select MULTI_IRQ_HANDLER
|
||||
select SOC_HAS_OMAP2_SDRC
|
||||
select COMMON_CLK
|
||||
|
||||
config ARCH_OMAP3
|
||||
bool "TI OMAP3"
|
||||
|
@ -47,6 +48,7 @@ config ARCH_OMAP3
|
|||
select PM_OPP if PM
|
||||
select PM_RUNTIME if CPU_IDLE
|
||||
select SOC_HAS_OMAP2_SDRC
|
||||
select COMMON_CLK
|
||||
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
||||
|
||||
config ARCH_OMAP4
|
||||
|
@ -68,6 +70,7 @@ config ARCH_OMAP4
|
|||
select PM_OPP if PM
|
||||
select PM_RUNTIME if CPU_IDLE
|
||||
select USB_ARCH_HAS_EHCI if USB_SUPPORT
|
||||
select COMMON_CLK
|
||||
|
||||
config SOC_OMAP5
|
||||
bool "TI OMAP5"
|
||||
|
@ -77,6 +80,7 @@ config SOC_OMAP5
|
|||
select CPU_V7
|
||||
select HAVE_SMP
|
||||
select SOC_HAS_REALTIME_COUNTER
|
||||
select COMMON_CLK
|
||||
|
||||
comment "OMAP Core Type"
|
||||
depends on ARCH_OMAP2
|
||||
|
@ -111,6 +115,7 @@ config SOC_AM33XX
|
|||
select ARM_CPU_SUSPEND if PM
|
||||
select CPU_V7
|
||||
select MULTI_IRQ_HANDLER
|
||||
select COMMON_CLK
|
||||
|
||||
config OMAP_PACKAGE_ZAF
|
||||
bool
|
||||
|
|
|
@ -4,30 +4,37 @@
|
|||
|
||||
# Common support
|
||||
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \
|
||||
common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o
|
||||
common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \
|
||||
omap_device.o
|
||||
|
||||
# INTCPS IP block support - XXX should be moved to drivers/
|
||||
obj-$(CONFIG_ARCH_OMAP2) += irq.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += irq.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += irq.o
|
||||
omap-2-3-common = irq.o
|
||||
hwmod-common = omap_hwmod.o \
|
||||
omap_hwmod_common_data.o
|
||||
clock-common = clock.o clock_common_data.o \
|
||||
clkt_dpll.o clkt_clksel.o
|
||||
secure-common = omap-smc.o omap-secure.o
|
||||
|
||||
# Secure monitor API support
|
||||
obj-$(CONFIG_ARCH_OMAP3) += omap-smc.o omap-secure.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += omap-smc.o omap-secure.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += omap-smc.o omap-secure.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common)
|
||||
obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common)
|
||||
obj-$(CONFIG_SOC_OMAP5) += prm44xx.o $(hwmod-common) $(secure-common)
|
||||
|
||||
ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)
|
||||
obj-y += mcbsp.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_TWL4030_CORE) += omap_twl.o
|
||||
obj-$(CONFIG_TWL4030_CORE) += omap_twl.o
|
||||
obj-$(CONFIG_SOC_HAS_OMAP2_SDRC) += sdrc.o
|
||||
|
||||
# SMP support ONLY available for OMAP4
|
||||
|
||||
obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += omap4-common.o omap-wakeupgen.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += omap4-common.o omap-wakeupgen.o
|
||||
omap-4-5-common = omap4-common.o omap-wakeupgen.o \
|
||||
sleep44xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(omap-4-5-common)
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(omap-4-5-common)
|
||||
|
||||
plus_sec := $(call as-instr,.arch_extension sec,+sec)
|
||||
AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec)
|
||||
|
@ -43,6 +50,11 @@ AFLAGS_sram242x.o :=-Wa,-march=armv6
|
|||
AFLAGS_sram243x.o :=-Wa,-march=armv6
|
||||
AFLAGS_sram34xx.o :=-Wa,-march=armv7-a
|
||||
|
||||
# Restart code (OMAP4/5 currently in omap4-common.c)
|
||||
obj-$(CONFIG_SOC_OMAP2420) += omap2-restart.o
|
||||
obj-$(CONFIG_SOC_OMAP2430) += omap2-restart.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += omap3-restart.o
|
||||
|
||||
# Pin multiplexing
|
||||
obj-$(CONFIG_SOC_OMAP2420) += mux2420.o
|
||||
obj-$(CONFIG_SOC_OMAP2430) += mux2430.o
|
||||
|
@ -52,7 +64,6 @@ obj-$(CONFIG_ARCH_OMAP4) += mux44xx.o
|
|||
# SMS/SDRC
|
||||
obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o
|
||||
# obj-$(CONFIG_ARCH_OMAP3) += sdrc3xxx.o
|
||||
obj-$(CONFIG_SOC_HAS_OMAP2_SDRC) += sdrc.o
|
||||
|
||||
# OPP table initialization
|
||||
ifeq ($(CONFIG_PM_OPP),y)
|
||||
|
@ -63,15 +74,15 @@ endif
|
|||
|
||||
# Power Management
|
||||
ifeq ($(CONFIG_PM),y)
|
||||
obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o sleep24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += sleep44xx.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += omap-mpuss-lowpower.o sleep44xx.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += omap-mpuss-lowpower.o
|
||||
obj-$(CONFIG_PM_DEBUG) += pm-debug.o
|
||||
|
||||
obj-$(CONFIG_POWER_AVS_OMAP) += sr_device.o
|
||||
obj-$(CONFIG_POWER_AVS_OMAP_CLASS3) += smartreflex-class3.o
|
||||
obj-$(CONFIG_POWER_AVS_OMAP_CLASS3) += smartreflex-class3.o
|
||||
|
||||
AFLAGS_sleep24xx.o :=-Wa,-march=armv6
|
||||
AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a$(plus_sec)
|
||||
|
@ -83,76 +94,82 @@ endif
|
|||
endif
|
||||
|
||||
ifeq ($(CONFIG_CPU_IDLE),y)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += cpuidle34xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += cpuidle44xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += cpuidle34xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += cpuidle44xx.o
|
||||
endif
|
||||
|
||||
# PRCM
|
||||
obj-y += prcm.o prm_common.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += cm2xxx_3xxx.o prm2xxx_3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += cm2xxx_3xxx.o prm2xxx_3xxx.o
|
||||
obj-y += prm_common.o cm_common.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += prm2xxx_3xxx.o prm2xxx.o cm2xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += prm2xxx_3xxx.o prm3xxx.o cm3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += vc3xxx_data.o vp3xxx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += prm33xx.o cm33xx.o
|
||||
omap-prcm-4-5-common = cminst44xx.o cm44xx.o prm44xx.o \
|
||||
prcm_mpu44xx.o prminst44xx.o \
|
||||
vc44xx_data.o vp44xx_data.o \
|
||||
prm44xx.o
|
||||
vc44xx_data.o vp44xx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(omap-prcm-4-5-common)
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(omap-prcm-4-5-common)
|
||||
|
||||
# OMAP voltage domains
|
||||
obj-y += voltage.o vc.o vp.o
|
||||
voltagedomain-common := voltage.o vc.o vp.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP2) += voltagedomains2xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += voltagedomains3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += voltagedomains44xx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += voltagedomains33xx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += $(voltagedomain-common)
|
||||
obj-$(CONFIG_SOC_AM33XX) += voltagedomains33xx_data.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(voltagedomain-common)
|
||||
|
||||
# OMAP powerdomain framework
|
||||
obj-y += powerdomain.o powerdomain-common.o
|
||||
powerdomain-common += powerdomain.o powerdomain-common.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(powerdomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += powerdomain2xxx_3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += powerdomains2xxx_3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += powerdomain2xxx_3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(powerdomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += powerdomains3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += powerdomains2xxx_3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += powerdomain44xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(powerdomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += powerdomains44xx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += powerdomain33xx.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += $(powerdomain-common)
|
||||
obj-$(CONFIG_SOC_AM33XX) += powerdomains33xx_data.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += powerdomain44xx.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(powerdomain-common)
|
||||
|
||||
# PRCM clockdomain control
|
||||
obj-y += clockdomain.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clockdomain2xxx_3xxx.o
|
||||
clockdomain-common += clockdomain.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(clockdomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clockdomains2xxx_3xxx_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2420) += clockdomains2420_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2430) += clockdomains2430_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clockdomain2xxx_3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(clockdomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clockdomains2xxx_3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clockdomains3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += clockdomain44xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(clockdomain-common)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += clockdomains44xx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += clockdomain33xx.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += $(clockdomain-common)
|
||||
obj-$(CONFIG_SOC_AM33XX) += clockdomains33xx_data.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += clockdomain44xx.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(clockdomain-common)
|
||||
|
||||
# Clock framework
|
||||
obj-y += clock.o clock_common_data.o \
|
||||
clkt_dpll.o clkt_clksel.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clock2xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpllcore.o clkt2xxx_sys.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_sys.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpllcore.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_virt_prcm_set.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_apll.o clkt2xxx_osc.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clkt2xxx_dpll.o clkt_iclk.o
|
||||
obj-$(CONFIG_SOC_OMAP2420) += clock2420_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2430) += clock2430.o clock2430_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clock3xxx.o
|
||||
obj-$(CONFIG_SOC_OMAP2420) += cclock2420_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2430) += clock2430.o cclock2430_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o clkt34xx_dpll3m2.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clock3517.o clock36xx.o clkt_iclk.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += dpll3xxx.o clock3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += clock44xx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clock3517.o clock36xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += dpll3xxx.o cclock3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clkt_iclk.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) cclock44xx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += dpll3xxx.o dpll44xx.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += dpll3xxx.o clock33xx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += $(clock-common) dpll3xxx.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += cclock33xx_data.o
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(clock-common)
|
||||
obj-$(CONFIG_SOC_OMAP5) += dpll3xxx.o dpll44xx.o
|
||||
|
||||
# OMAP2 clock rate set data (old "OPP" data)
|
||||
|
@ -160,7 +177,6 @@ obj-$(CONFIG_SOC_OMAP2420) += opp2420_data.o
|
|||
obj-$(CONFIG_SOC_OMAP2430) += opp2430_data.o
|
||||
|
||||
# hwmod data
|
||||
obj-y += omap_hwmod_common_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_ipblock_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_3xxx_ipblock_data.o
|
||||
obj-$(CONFIG_SOC_OMAP2420) += omap_hwmod_2xxx_interconnect_data.o
|
||||
|
@ -206,10 +222,10 @@ obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
|
|||
obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o
|
||||
obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o
|
||||
obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o
|
||||
obj-$(CONFIG_MACH_DEVKIT8000) += board-devkit8000.o
|
||||
obj-$(CONFIG_MACH_DEVKIT8000) += board-devkit8000.o
|
||||
obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o
|
||||
obj-$(CONFIG_MACH_OMAP3530_LV_SOM) += board-omap3logic.o
|
||||
obj-$(CONFIG_MACH_OMAP3_TORPEDO) += board-omap3logic.o
|
||||
obj-$(CONFIG_MACH_OMAP3530_LV_SOM) += board-omap3logic.o
|
||||
obj-$(CONFIG_MACH_OMAP3_TORPEDO) += board-omap3logic.o
|
||||
obj-$(CONFIG_MACH_ENCORE) += board-omap3encore.o
|
||||
obj-$(CONFIG_MACH_OVERO) += board-overo.o
|
||||
obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o
|
||||
|
|
|
@ -21,5 +21,6 @@
|
|||
#define AM33XX_SCM_BASE 0x44E10000
|
||||
#define AM33XX_CTRL_BASE AM33XX_SCM_BASE
|
||||
#define AM33XX_PRCM_BASE 0x44E00000
|
||||
#define AM33XX_TAP_BASE (AM33XX_CTRL_BASE + 0x3FC)
|
||||
|
||||
#endif /* __ASM_ARCH_AM33XX_H */
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <asm/system.h>
|
||||
#include <plat/omap_device.h>
|
||||
#include "omap_device.h"
|
||||
#include "am35xx.h"
|
||||
#include "control.h"
|
||||
#include "am35xx-emac.h"
|
||||
|
|
|
@ -34,8 +34,7 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-smc91x.h"
|
||||
|
||||
#include <video/omapdss.h>
|
||||
|
@ -287,5 +286,5 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")
|
|||
.init_machine = omap_2430sdp_init,
|
||||
.init_late = omap2430_init_late,
|
||||
.timer = &omap2_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -30,15 +30,15 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/usb.h>
|
||||
#include "common.h"
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-smc91x.h"
|
||||
|
||||
#include "soc.h"
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-qimonda-hyb18m512160af-6.h"
|
||||
|
@ -597,5 +597,5 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
|
|||
.init_machine = omap_3430sdp_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -18,9 +18,8 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "gpmc-smc91x.h"
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
#include "board-zoom.h"
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
|
@ -213,5 +212,5 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board")
|
|||
.init_machine = omap_sdp_init,
|
||||
.init_late = omap3630_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/leds.h>
|
||||
#include <linux/leds_pwm.h>
|
||||
#include <linux/platform_data/omap4-keypad.h>
|
||||
#include <linux/usb/musb.h>
|
||||
|
||||
#include <asm/hardware/gic.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -34,8 +35,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
#include "omap4-keypad.h"
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-nokia-dsi.h>
|
||||
|
@ -45,6 +44,7 @@
|
|||
|
||||
#include "soc.h"
|
||||
#include "mux.h"
|
||||
#include "mmc.h"
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
@ -881,5 +881,5 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")
|
|||
.init_machine = omap_4430sdp_init,
|
||||
.init_late = omap4430_init_late,
|
||||
.timer = &omap4_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "am35xx-emac.h"
|
||||
#include "mux.h"
|
||||
|
@ -94,5 +93,5 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD")
|
|||
.init_machine = am3517_crane_init,
|
||||
.init_late = am35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/can/platform/ti_hecc.h>
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/usb/musb.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
|
||||
#include "am35xx.h"
|
||||
|
@ -33,7 +34,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
@ -393,5 +393,5 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
|
|||
.init_machine = am3517_evm_init,
|
||||
.init_late = am35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -28,14 +28,14 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/smc91x.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_data/leds-omap.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <plat/led.h>
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
|
@ -338,5 +338,5 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")
|
|||
.init_machine = omap_apollon_init,
|
||||
.init_late = omap2420_init_late,
|
||||
.timer = &omap2_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -38,10 +38,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
@ -49,10 +46,13 @@
|
|||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-nand.h"
|
||||
|
||||
#define CM_T35_GPIO_PENDOWN 57
|
||||
#define SB_T35_USB_HUB_RESET_GPIO 167
|
||||
|
@ -181,7 +181,7 @@ static struct omap_nand_platform_data cm_t35_nand_data = {
|
|||
|
||||
static void __init cm_t35_init_nand(void)
|
||||
{
|
||||
if (gpmc_nand_init(&cm_t35_nand_data) < 0)
|
||||
if (gpmc_nand_init(&cm_t35_nand_data, NULL) < 0)
|
||||
pr_err("CM-T35: Unable to register NAND device\n");
|
||||
}
|
||||
#else
|
||||
|
@ -753,18 +753,18 @@ MACHINE_START(CM_T35, "Compulab CM-T35")
|
|||
.init_machine = cm_t35_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(CM_T3730, "Compulab CM-T3730")
|
||||
.atag_offset = 0x100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3630_init_early,
|
||||
.init_irq = omap3_init_irq,
|
||||
.atag_offset = 0x100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3630_init_early,
|
||||
.init_irq = omap3_init_irq,
|
||||
.handle_irq = omap3_intc_handle_irq,
|
||||
.init_machine = cm_t3730_init,
|
||||
.init_machine = cm_t3730_init,
|
||||
.init_late = omap3630_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -39,9 +39,8 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
|
||||
#include "am35xx.h"
|
||||
|
||||
|
@ -49,6 +48,7 @@
|
|||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "am35xx-emac.h"
|
||||
#include "gpmc-nand.h"
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
static struct gpio_led cm_t3517_leds[] = {
|
||||
|
@ -240,7 +240,7 @@ static struct omap_nand_platform_data cm_t3517_nand_data = {
|
|||
|
||||
static void __init cm_t3517_init_nand(void)
|
||||
{
|
||||
if (gpmc_nand_init(&cm_t3517_nand_data) < 0)
|
||||
if (gpmc_nand_init(&cm_t3517_nand_data, NULL) < 0)
|
||||
pr_err("CM-T3517: NAND initialization failed\n");
|
||||
}
|
||||
#else
|
||||
|
@ -298,5 +298,5 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517")
|
|||
.init_machine = cm_t3517_init,
|
||||
.init_late = am35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -39,9 +39,8 @@
|
|||
#include <asm/mach/flash.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <plat/usb.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
@ -55,8 +54,11 @@
|
|||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "board-flash.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define NAND_CS 0
|
||||
|
||||
#define OMAP_DM9000_GPIO_IRQ 25
|
||||
#define OMAP3_DEVKIT_TS_GPIO 27
|
||||
|
||||
|
@ -621,8 +623,9 @@ static void __init devkit8000_init(void)
|
|||
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
omap_nand_flash_init(NAND_BUSWIDTH_16, devkit8000_nand_partitions,
|
||||
ARRAY_SIZE(devkit8000_nand_partitions));
|
||||
board_nand_init(devkit8000_nand_partitions,
|
||||
ARRAY_SIZE(devkit8000_nand_partitions), NAND_CS,
|
||||
NAND_BUSWIDTH_16, NULL);
|
||||
omap_twl4030_audio_init("omap3beagle");
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
|
@ -640,5 +643,5 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
|
|||
.init_machine = devkit8000_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_secure_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -17,14 +17,14 @@
|
|||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <linux/platform_data/mtd-onenand-omap2.h>
|
||||
#include <plat/tc.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "common.h"
|
||||
#include "board-flash.h"
|
||||
#include "gpmc-onenand.h"
|
||||
#include "gpmc-nand.h"
|
||||
|
||||
#define REG_FPGA_REV 0x10
|
||||
#define REG_FPGA_DIP_SWITCH_INPUT2 0x60
|
||||
|
@ -104,36 +104,35 @@ __init board_onenand_init(struct mtd_partition *onenand_parts,
|
|||
defined(CONFIG_MTD_NAND_OMAP2_MODULE)
|
||||
|
||||
/* Note that all values in this struct are in nanoseconds */
|
||||
static struct gpmc_timings nand_timings = {
|
||||
struct gpmc_timings nand_default_timings[1] = {
|
||||
{
|
||||
.sync_clk = 0,
|
||||
|
||||
.sync_clk = 0,
|
||||
.cs_on = 0,
|
||||
.cs_rd_off = 36,
|
||||
.cs_wr_off = 36,
|
||||
|
||||
.cs_on = 0,
|
||||
.cs_rd_off = 36,
|
||||
.cs_wr_off = 36,
|
||||
.adv_on = 6,
|
||||
.adv_rd_off = 24,
|
||||
.adv_wr_off = 36,
|
||||
|
||||
.adv_on = 6,
|
||||
.adv_rd_off = 24,
|
||||
.adv_wr_off = 36,
|
||||
.we_off = 30,
|
||||
.oe_off = 48,
|
||||
|
||||
.we_off = 30,
|
||||
.oe_off = 48,
|
||||
.access = 54,
|
||||
.rd_cycle = 72,
|
||||
.wr_cycle = 72,
|
||||
|
||||
.access = 54,
|
||||
.rd_cycle = 72,
|
||||
.wr_cycle = 72,
|
||||
|
||||
.wr_access = 30,
|
||||
.wr_data_mux_bus = 0,
|
||||
.wr_access = 30,
|
||||
.wr_data_mux_bus = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_nand_platform_data board_nand_data = {
|
||||
.gpmc_t = &nand_timings,
|
||||
};
|
||||
static struct omap_nand_platform_data board_nand_data;
|
||||
|
||||
void
|
||||
__init board_nand_init(struct mtd_partition *nand_parts,
|
||||
u8 nr_parts, u8 cs, int nand_type)
|
||||
__init board_nand_init(struct mtd_partition *nand_parts, u8 nr_parts, u8 cs,
|
||||
int nand_type, struct gpmc_timings *gpmc_t)
|
||||
{
|
||||
board_nand_data.cs = cs;
|
||||
board_nand_data.parts = nand_parts;
|
||||
|
@ -141,7 +140,7 @@ __init board_nand_init(struct mtd_partition *nand_parts,
|
|||
board_nand_data.devsize = nand_type;
|
||||
|
||||
board_nand_data.ecc_opt = OMAP_ECC_HAMMING_CODE_DEFAULT;
|
||||
gpmc_nand_init(&board_nand_data);
|
||||
gpmc_nand_init(&board_nand_data, gpmc_t);
|
||||
}
|
||||
#endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */
|
||||
|
||||
|
@ -238,5 +237,6 @@ void __init board_flash_init(struct flash_partitions partition_info[],
|
|||
pr_err("NAND: Unable to find configuration in GPMC\n");
|
||||
else
|
||||
board_nand_init(partition_info[2].parts,
|
||||
partition_info[2].nr_parts, nandcs, nand_type);
|
||||
partition_info[2].nr_parts, nandcs,
|
||||
nand_type, nand_default_timings);
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
*/
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
|
||||
#define PDC_NOR 1
|
||||
#define PDC_NAND 2
|
||||
|
@ -40,12 +40,14 @@ static inline void board_flash_init(struct flash_partitions part[],
|
|||
#if defined(CONFIG_MTD_NAND_OMAP2) || \
|
||||
defined(CONFIG_MTD_NAND_OMAP2_MODULE)
|
||||
extern void board_nand_init(struct mtd_partition *nand_parts,
|
||||
u8 nr_parts, u8 cs, int nand_type);
|
||||
u8 nr_parts, u8 cs, int nand_type, struct gpmc_timings *gpmc_t);
|
||||
extern struct gpmc_timings nand_default_timings[];
|
||||
#else
|
||||
static inline void board_nand_init(struct mtd_partition *nand_parts,
|
||||
u8 nr_parts, u8 cs, int nand_type)
|
||||
u8 nr_parts, u8 cs, int nand_type, struct gpmc_timings *gpmc_t)
|
||||
{
|
||||
}
|
||||
#define nand_default_timings NULL
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
|
||||
|
|
|
@ -57,7 +57,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")
|
|||
.init_machine = omap_generic_init,
|
||||
.timer = &omap2_timer,
|
||||
.dt_compat = omap242x_boards_compat,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
|
@ -76,7 +76,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")
|
|||
.init_machine = omap_generic_init,
|
||||
.timer = &omap2_timer,
|
||||
.dt_compat = omap243x_boards_compat,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
|
@ -95,7 +95,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")
|
|||
.init_machine = omap_generic_init,
|
||||
.timer = &omap3_timer,
|
||||
.dt_compat = omap3_boards_compat,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
|
@ -134,7 +134,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")
|
|||
.init_late = omap4430_init_late,
|
||||
.timer = &omap4_timer,
|
||||
.dt_compat = omap4_boards_compat,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
|
@ -154,6 +154,6 @@ DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)")
|
|||
.init_machine = omap_generic_init,
|
||||
.timer = &omap5_timer,
|
||||
.dt_compat = omap5_boards_compat,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
|
|
@ -26,14 +26,13 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/mfd/menelaus.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/menelaus.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include "debug-devices.h"
|
||||
|
||||
#include <video/omapdss.h>
|
||||
|
@ -42,6 +41,7 @@
|
|||
#include "common.h"
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
#include "gpmc.h"
|
||||
|
||||
#define H4_FLASH_CS 0
|
||||
#define H4_SMC91X_CS 1
|
||||
|
@ -386,5 +386,5 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
|
|||
.init_machine = omap_h4_init,
|
||||
.init_late = omap2420_init_late,
|
||||
.timer = &omap2_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -29,20 +29,19 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
#include <linux/platform_data/mtd-onenand-omap2.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "gpmc.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "sdram-numonyx-m65kxxxxam.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "board-flash.h"
|
||||
#include "control.h"
|
||||
#include "gpmc-onenand.h"
|
||||
|
||||
#define IGEP2_SMSC911X_CS 5
|
||||
#define IGEP2_SMSC911X_GPIO 176
|
||||
|
@ -175,7 +174,7 @@ static void __init igep_flash_init(void)
|
|||
pr_info("IGEP: initializing NAND memory device\n");
|
||||
board_nand_init(igep_flash_partitions,
|
||||
ARRAY_SIZE(igep_flash_partitions),
|
||||
0, NAND_BUSWIDTH_16);
|
||||
0, NAND_BUSWIDTH_16, nand_default_timings);
|
||||
} else if (mux == IGEP_SYSBOOT_ONENAND) {
|
||||
pr_info("IGEP: initializing OneNAND memory device\n");
|
||||
board_onenand_init(igep_flash_partitions,
|
||||
|
@ -652,7 +651,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board")
|
|||
.init_machine = igep_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(IGEP0030, "IGEP OMAP3 module")
|
||||
|
@ -665,5 +664,5 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module")
|
|||
.init_machine = igep_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -35,9 +35,8 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include <mach/board-zoom.h>
|
||||
#include <plat/usb.h>
|
||||
#include "board-zoom.h"
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-smsc911x.h"
|
||||
|
||||
#include <video/omapdss.h>
|
||||
|
@ -420,8 +419,8 @@ static void __init omap_ldp_init(void)
|
|||
omap_serial_init();
|
||||
omap_sdrc_init(NULL, NULL);
|
||||
usb_musb_init(NULL);
|
||||
board_nand_init(ldp_nand_partitions,
|
||||
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
|
||||
board_nand_init(ldp_nand_partitions, ARRAY_SIZE(ldp_nand_partitions),
|
||||
ZOOM_NAND_CS, 0, nand_default_timings);
|
||||
|
||||
omap_hsmmc_init(mmc);
|
||||
ldp_display_init();
|
||||
|
@ -437,5 +436,5 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board")
|
|||
.init_machine = omap_ldp_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -22,16 +22,17 @@
|
|||
#include <linux/usb/musb.h>
|
||||
#include <linux/platform_data/spi-omap2-mcspi.h>
|
||||
#include <linux/platform_data/mtd-onenand-omap2.h>
|
||||
#include <linux/mfd/menelaus.h>
|
||||
#include <sound/tlv320aic3x.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/menelaus.h>
|
||||
#include <plat/mmc.h>
|
||||
#include "mmc.h"
|
||||
|
||||
#include "mux.h"
|
||||
#include "gpmc-onenand.h"
|
||||
|
||||
#define TUSB6010_ASYNC_CS 1
|
||||
#define TUSB6010_SYNC_CS 4
|
||||
|
@ -689,7 +690,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800")
|
|||
.init_machine = n8x0_init_machine,
|
||||
.init_late = omap2420_init_late,
|
||||
.timer = &omap2_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(NOKIA_N810, "Nokia N810")
|
||||
|
@ -702,7 +703,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810")
|
|||
.init_machine = n8x0_init_machine,
|
||||
.init_late = omap2420_init_late,
|
||||
.timer = &omap2_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
|
||||
|
@ -715,5 +716,5 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
|
|||
.init_machine = n8x0_init_machine,
|
||||
.init_late = omap2420_init_late,
|
||||
.timer = &omap2_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap2xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -39,19 +39,22 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/omap_device.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "omap_device.h"
|
||||
#include "gpmc.h"
|
||||
#include "soc.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "pm.h"
|
||||
#include "board-flash.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define NAND_CS 0
|
||||
|
||||
/*
|
||||
* OMAP3 Beagle revision
|
||||
* Run time detection of Beagle revision is done by reading GPIO.
|
||||
|
@ -518,8 +521,9 @@ static void __init omap3_beagle_init(void)
|
|||
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions,
|
||||
ARRAY_SIZE(omap3beagle_nand_partitions));
|
||||
board_nand_init(omap3beagle_nand_partitions,
|
||||
ARRAY_SIZE(omap3beagle_nand_partitions), NAND_CS,
|
||||
NAND_BUSWIDTH_16, NULL);
|
||||
omap_twl4030_audio_init("omap3beagle");
|
||||
|
||||
/* Ensure msecure is mux'd to be able to set the RTC. */
|
||||
|
@ -541,5 +545,5 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
|
|||
.init_machine = omap3_beagle_init,
|
||||
.init_late = omap3_init_late,
|
||||
.timer = &omap3_secure_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/usb/musb.h>
|
||||
#include <linux/usb/nop-usb-xceiv.h>
|
||||
#include <linux/smsc911x.h>
|
||||
|
||||
|
@ -45,17 +46,20 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/usb.h>
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include "common.h"
|
||||
#include <linux/platform_data/spi-omap2-mcspi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "board-flash.h"
|
||||
|
||||
#define NAND_CS 0
|
||||
|
||||
#define OMAP3_EVM_TS_GPIO 175
|
||||
#define OMAP3_EVM_EHCI_VBUS 22
|
||||
|
@ -731,8 +735,9 @@ static void __init omap3_evm_init(void)
|
|||
}
|
||||
usb_musb_init(&musb_board_data);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3evm_nand_partitions,
|
||||
ARRAY_SIZE(omap3evm_nand_partitions));
|
||||
board_nand_init(omap3evm_nand_partitions,
|
||||
ARRAY_SIZE(omap3evm_nand_partitions), NAND_CS,
|
||||
NAND_BUSWIDTH_16, NULL);
|
||||
|
||||
omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);
|
||||
omap3evm_init_smsc911x();
|
||||
|
@ -752,5 +757,5 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM")
|
|||
.init_machine = omap3_evm_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -34,16 +34,13 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include "gpmc-smsc911x.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/sdrc.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-smsc911x.h"
|
||||
|
||||
#define OMAP3LOGIC_SMSC911X_CS 1
|
||||
|
||||
|
@ -235,7 +232,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
|
|||
.init_machine = omap3logic_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
|
||||
|
@ -248,5 +245,5 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
|
|||
.init_machine = omap3logic_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
|
||||
|
@ -50,6 +49,7 @@
|
|||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "gpmc-nand.h"
|
||||
|
||||
#define PANDORA_WIFI_IRQ_GPIO 21
|
||||
#define PANDORA_WIFI_NRESET_GPIO 23
|
||||
|
@ -602,7 +602,7 @@ static void __init omap3pandora_init(void)
|
|||
omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
usb_musb_init(NULL);
|
||||
gpmc_nand_init(&pandora_nand_data);
|
||||
gpmc_nand_init(&pandora_nand_data, NULL);
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
@ -619,5 +619,5 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
|
|||
.init_machine = omap3pandora_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -40,9 +40,8 @@
|
|||
#include <asm/mach/flash.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <plat/usb.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
@ -428,5 +427,5 @@ MACHINE_START(SBC3530, "OMAP3 STALKER")
|
|||
.init_machine = omap3_stalker_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_secure_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -44,12 +44,12 @@
|
|||
#include <asm/system_info.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
#include <linux/platform_data/mtd-nand-omap2.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "board-flash.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
@ -59,6 +59,8 @@
|
|||
#define TB_BL_PWM_TIMER 9
|
||||
#define TB_KILL_POWER_GPIO 168
|
||||
|
||||
#define NAND_CS 0
|
||||
|
||||
static unsigned long touchbook_revision;
|
||||
|
||||
static struct mtd_partition omap3touchbook_nand_partitions[] = {
|
||||
|
@ -365,8 +367,9 @@ static void __init omap3_touchbook_init(void)
|
|||
omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3touchbook_nand_partitions,
|
||||
ARRAY_SIZE(omap3touchbook_nand_partitions));
|
||||
board_nand_init(omap3touchbook_nand_partitions,
|
||||
ARRAY_SIZE(omap3touchbook_nand_partitions), NAND_CS,
|
||||
NAND_BUSWIDTH_16, NULL);
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
@ -384,5 +387,5 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")
|
|||
.init_machine = omap3_touchbook_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.timer = &omap3_secure_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/ti_wilink_st.h>
|
||||
#include <linux/usb/musb.h>
|
||||
#include <linux/wl12xx.h>
|
||||
#include <linux/platform_data/omap-abe-twl6040.h>
|
||||
|
||||
|
@ -38,12 +39,11 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <video/omapdss.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "soc.h"
|
||||
#include "mmc.h"
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
#include "mux.h"
|
||||
|
@ -524,5 +524,5 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
|
|||
.init_machine = omap4_panda_init,
|
||||
.init_late = omap4430_init_late,
|
||||
.timer = &omap4_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -49,14 +49,17 @@
|
|||
#include <video/omapdss.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <video/omap-panel-tfp410.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "gpmc.h"
|
||||
#include "hsmmc.h"
|
||||
#include "board-flash.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define NAND_CS 0
|
||||
|
||||
#define OVERO_GPIO_BT_XGATE 15
|
||||
#define OVERO_GPIO_W2W_NRESET 16
|
||||
#define OVERO_GPIO_PENDOWN 114
|
||||
|
@ -495,8 +498,8 @@ static void __init overo_init(void)
|
|||
omap_serial_init();
|
||||
omap_sdrc_init(mt46h32m32lf6_sdrc_params,
|
||||
mt46h32m32lf6_sdrc_params);
|
||||
omap_nand_flash_init(0, overo_nand_partitions,
|
||||
ARRAY_SIZE(overo_nand_partitions));
|
||||
board_nand_init(overo_nand_partitions,
|
||||
ARRAY_SIZE(overo_nand_partitions), NAND_CS, 0, NULL);
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
overo_spi_init();
|
||||
|
@ -550,5 +553,5 @@ MACHINE_START(OVERO, "Gumstix Overo")
|
|||
.init_machine = overo_init,
|
||||
.init_late = omap35xx_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -22,17 +22,14 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include "common.h"
|
||||
#include <plat/serial.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "gpmc.h"
|
||||
#include "mmc.h"
|
||||
#include "hsmmc.h"
|
||||
#include "sdram-nokia.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "gpmc-onenand.h"
|
||||
|
||||
static struct regulator_consumer_supply rm680_vemmc_consumers[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
|
@ -151,7 +148,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")
|
|||
.init_machine = rm680_init,
|
||||
.init_late = omap3630_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(NOKIA_RM696, "Nokia RM-696 board")
|
||||
|
@ -164,5 +161,5 @@ MACHINE_START(NOKIA_RM696, "Nokia RM-696 board")
|
|||
.init_machine = rm680_init,
|
||||
.init_late = omap3630_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -31,9 +31,7 @@
|
|||
#include <asm/system_info.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/omap-pm.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
#include "gpmc-smc91x.h"
|
||||
|
||||
#include "board-rx51.h"
|
||||
|
@ -52,8 +50,11 @@
|
|||
#endif
|
||||
|
||||
#include "mux.h"
|
||||
#include "omap-pm.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-onenand.h"
|
||||
|
||||
#define SYSTEM_REV_B_USES_VAUX3 0x1699
|
||||
#define SYSTEM_REV_S_USES_VAUX3 0x8
|
||||
|
|
|
@ -17,18 +17,18 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/usb/musb.h>
|
||||
#include <linux/platform_data/spi-omap2-mcspi.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat-omap/dma-omap.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "mux.h"
|
||||
#include "gpmc.h"
|
||||
#include "pm.h"
|
||||
#include "sdram-nokia.h"
|
||||
|
||||
|
@ -127,5 +127,5 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")
|
|||
.init_machine = rx51_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -14,13 +14,14 @@
|
|||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/usb/musb.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
|
||||
static struct omap_musb_board_data musb_board_data = {
|
||||
.set_phy_power = ti81xx_musb_phy_power,
|
||||
|
@ -45,7 +46,7 @@ MACHINE_START(TI8168EVM, "ti8168evm")
|
|||
.timer = &omap3_timer,
|
||||
.init_machine = ti81xx_evm_init,
|
||||
.init_late = ti81xx_init_late,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(TI8148EVM, "ti8148evm")
|
||||
|
@ -57,5 +58,5 @@ MACHINE_START(TI8148EVM, "ti8148evm")
|
|||
.timer = &omap3_timer,
|
||||
.init_machine = ti81xx_evm_init,
|
||||
.init_late = ti81xx_init_late,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap44xx_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#include <plat/gpmc.h>
|
||||
#include "gpmc.h"
|
||||
#include "gpmc-smsc911x.h"
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
#include "board-zoom.h"
|
||||
|
||||
#include "soc.h"
|
||||
#include "common.h"
|
||||
|
|
|
@ -16,8 +16,9 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/platform_data/spi-omap2-mcspi.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <mach/board-zoom.h>
|
||||
#include "board-zoom.h"
|
||||
|
||||
#include "soc.h"
|
||||
#include "common.h"
|
||||
|
||||
#define LCD_PANEL_RESET_GPIO_PROD 96
|
||||
|
|
|
@ -26,9 +26,8 @@
|
|||
#include <asm/mach/map.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
#include "board-zoom.h"
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
|
|
|
@ -22,9 +22,8 @@
|
|||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "common.h"
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
#include "board-zoom.h"
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
|
@ -113,8 +112,9 @@ static void __init omap_zoom_init(void)
|
|||
usbhs_init(&usbhs_bdata);
|
||||
}
|
||||
|
||||
board_nand_init(zoom_nand_partitions, ARRAY_SIZE(zoom_nand_partitions),
|
||||
ZOOM_NAND_CS, NAND_BUSWIDTH_16);
|
||||
board_nand_init(zoom_nand_partitions,
|
||||
ARRAY_SIZE(zoom_nand_partitions), ZOOM_NAND_CS,
|
||||
NAND_BUSWIDTH_16, nand_default_timings);
|
||||
zoom_debugboard_init();
|
||||
zoom_peripherals_init();
|
||||
|
||||
|
@ -138,7 +138,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")
|
|||
.init_machine = omap_zoom_init,
|
||||
.init_late = omap3430_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")
|
||||
|
@ -151,5 +151,5 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")
|
|||
.init_machine = omap_zoom_init,
|
||||
.init_late = omap3630_init_late,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
.restart = omap3xxx_restart,
|
||||
MACHINE_END
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,961 @@
|
|||
/*
|
||||
* AM33XX Clock data
|
||||
*
|
||||
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
|
||||
* Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
*
|
||||
* 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 version 2.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/clk-private.h>
|
||||
#include <linux/clkdev.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include "am33xx.h"
|
||||
#include "soc.h"
|
||||
#include "iomap.h"
|
||||
#include "clock.h"
|
||||
#include "control.h"
|
||||
#include "cm.h"
|
||||
#include "cm33xx.h"
|
||||
#include "cm-regbits-33xx.h"
|
||||
#include "prm.h"
|
||||
|
||||
/* Modulemode control */
|
||||
#define AM33XX_MODULEMODE_HWCTRL_SHIFT 0
|
||||
#define AM33XX_MODULEMODE_SWCTRL_SHIFT 1
|
||||
|
||||
/*LIST_HEAD(clocks);*/
|
||||
|
||||
/* Root clocks */
|
||||
|
||||
/* RTC 32k */
|
||||
DEFINE_CLK_FIXED_RATE(clk_32768_ck, CLK_IS_ROOT, 32768, 0x0);
|
||||
|
||||
/* On-Chip 32KHz RC OSC */
|
||||
DEFINE_CLK_FIXED_RATE(clk_rc32k_ck, CLK_IS_ROOT, 32000, 0x0);
|
||||
|
||||
/* Crystal input clks */
|
||||
DEFINE_CLK_FIXED_RATE(virt_19200000_ck, CLK_IS_ROOT, 19200000, 0x0);
|
||||
|
||||
DEFINE_CLK_FIXED_RATE(virt_24000000_ck, CLK_IS_ROOT, 24000000, 0x0);
|
||||
|
||||
DEFINE_CLK_FIXED_RATE(virt_25000000_ck, CLK_IS_ROOT, 25000000, 0x0);
|
||||
|
||||
DEFINE_CLK_FIXED_RATE(virt_26000000_ck, CLK_IS_ROOT, 26000000, 0x0);
|
||||
|
||||
/* Oscillator clock */
|
||||
/* 19.2, 24, 25 or 26 MHz */
|
||||
static const char *sys_clkin_ck_parents[] = {
|
||||
"virt_19200000_ck", "virt_24000000_ck", "virt_25000000_ck",
|
||||
"virt_26000000_ck",
|
||||
};
|
||||
|
||||
/*
|
||||
* sys_clk in: input to the dpll and also used as funtional clock for,
|
||||
* adc_tsc, smartreflex0-1, timer1-7, mcasp0-1, dcan0-1, cefuse
|
||||
*
|
||||
*/
|
||||
DEFINE_CLK_MUX(sys_clkin_ck, sys_clkin_ck_parents, NULL, 0x0,
|
||||
AM33XX_CTRL_REGADDR(AM33XX_CONTROL_STATUS),
|
||||
AM33XX_CONTROL_STATUS_SYSBOOT1_SHIFT,
|
||||
AM33XX_CONTROL_STATUS_SYSBOOT1_WIDTH,
|
||||
0, NULL);
|
||||
|
||||
/* External clock - 12 MHz */
|
||||
DEFINE_CLK_FIXED_RATE(tclkin_ck, CLK_IS_ROOT, 12000000, 0x0);
|
||||
|
||||
/* Module clocks and DPLL outputs */
|
||||
|
||||
/* DPLL_CORE */
|
||||
static struct dpll_data dpll_core_dd = {
|
||||
.mult_div1_reg = AM33XX_CM_CLKSEL_DPLL_CORE,
|
||||
.clk_bypass = &sys_clkin_ck,
|
||||
.clk_ref = &sys_clkin_ck,
|
||||
.control_reg = AM33XX_CM_CLKMODE_DPLL_CORE,
|
||||
.modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
||||
.idlest_reg = AM33XX_CM_IDLEST_DPLL_CORE,
|
||||
.mult_mask = AM33XX_DPLL_MULT_MASK,
|
||||
.div1_mask = AM33XX_DPLL_DIV_MASK,
|
||||
.enable_mask = AM33XX_DPLL_EN_MASK,
|
||||
.idlest_mask = AM33XX_ST_DPLL_CLK_MASK,
|
||||
.max_multiplier = 2047,
|
||||
.max_divider = 128,
|
||||
.min_divider = 1,
|
||||
};
|
||||
|
||||
/* CLKDCOLDO output */
|
||||
static const char *dpll_core_ck_parents[] = {
|
||||
"sys_clkin_ck",
|
||||
};
|
||||
|
||||
static struct clk dpll_core_ck;
|
||||
|
||||
static const struct clk_ops dpll_core_ck_ops = {
|
||||
.recalc_rate = &omap3_dpll_recalc,
|
||||
.get_parent = &omap2_init_dpll_parent,
|
||||
};
|
||||
|
||||
static struct clk_hw_omap dpll_core_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &dpll_core_ck,
|
||||
},
|
||||
.dpll_data = &dpll_core_dd,
|
||||
.ops = &clkhwops_omap3_dpll,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(dpll_core_ck, dpll_core_ck_parents, dpll_core_ck_ops);
|
||||
|
||||
static const char *dpll_core_x2_ck_parents[] = {
|
||||
"dpll_core_ck",
|
||||
};
|
||||
|
||||
static struct clk dpll_core_x2_ck;
|
||||
|
||||
static const struct clk_ops dpll_x2_ck_ops = {
|
||||
.recalc_rate = &omap3_clkoutx2_recalc,
|
||||
};
|
||||
|
||||
static struct clk_hw_omap dpll_core_x2_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &dpll_core_x2_ck,
|
||||
},
|
||||
.flags = CLOCK_CLKOUTX2,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(dpll_core_x2_ck, dpll_core_x2_ck_parents, dpll_x2_ck_ops);
|
||||
|
||||
DEFINE_CLK_DIVIDER(dpll_core_m4_ck, "dpll_core_x2_ck", &dpll_core_x2_ck,
|
||||
0x0, AM33XX_CM_DIV_M4_DPLL_CORE,
|
||||
AM33XX_HSDIVIDER_CLKOUT1_DIV_SHIFT,
|
||||
AM33XX_HSDIVIDER_CLKOUT1_DIV_WIDTH, CLK_DIVIDER_ONE_BASED,
|
||||
NULL);
|
||||
|
||||
DEFINE_CLK_DIVIDER(dpll_core_m5_ck, "dpll_core_x2_ck", &dpll_core_x2_ck,
|
||||
0x0, AM33XX_CM_DIV_M5_DPLL_CORE,
|
||||
AM33XX_HSDIVIDER_CLKOUT2_DIV_SHIFT,
|
||||
AM33XX_HSDIVIDER_CLKOUT2_DIV_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED, NULL);
|
||||
|
||||
DEFINE_CLK_DIVIDER(dpll_core_m6_ck, "dpll_core_x2_ck", &dpll_core_x2_ck,
|
||||
0x0, AM33XX_CM_DIV_M6_DPLL_CORE,
|
||||
AM33XX_HSDIVIDER_CLKOUT3_DIV_SHIFT,
|
||||
AM33XX_HSDIVIDER_CLKOUT3_DIV_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED, NULL);
|
||||
|
||||
|
||||
/* DPLL_MPU */
|
||||
static struct dpll_data dpll_mpu_dd = {
|
||||
.mult_div1_reg = AM33XX_CM_CLKSEL_DPLL_MPU,
|
||||
.clk_bypass = &sys_clkin_ck,
|
||||
.clk_ref = &sys_clkin_ck,
|
||||
.control_reg = AM33XX_CM_CLKMODE_DPLL_MPU,
|
||||
.modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
||||
.idlest_reg = AM33XX_CM_IDLEST_DPLL_MPU,
|
||||
.mult_mask = AM33XX_DPLL_MULT_MASK,
|
||||
.div1_mask = AM33XX_DPLL_DIV_MASK,
|
||||
.enable_mask = AM33XX_DPLL_EN_MASK,
|
||||
.idlest_mask = AM33XX_ST_DPLL_CLK_MASK,
|
||||
.max_multiplier = 2047,
|
||||
.max_divider = 128,
|
||||
.min_divider = 1,
|
||||
};
|
||||
|
||||
/* CLKOUT: fdpll/M2 */
|
||||
static struct clk dpll_mpu_ck;
|
||||
|
||||
static const struct clk_ops dpll_mpu_ck_ops = {
|
||||
.enable = &omap3_noncore_dpll_enable,
|
||||
.disable = &omap3_noncore_dpll_disable,
|
||||
.recalc_rate = &omap3_dpll_recalc,
|
||||
.round_rate = &omap2_dpll_round_rate,
|
||||
.set_rate = &omap3_noncore_dpll_set_rate,
|
||||
.get_parent = &omap2_init_dpll_parent,
|
||||
};
|
||||
|
||||
static struct clk_hw_omap dpll_mpu_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &dpll_mpu_ck,
|
||||
},
|
||||
.dpll_data = &dpll_mpu_dd,
|
||||
.ops = &clkhwops_omap3_dpll,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(dpll_mpu_ck, dpll_core_ck_parents, dpll_mpu_ck_ops);
|
||||
|
||||
/*
|
||||
* TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2
|
||||
* and ALT_CLK1/2)
|
||||
*/
|
||||
DEFINE_CLK_DIVIDER(dpll_mpu_m2_ck, "dpll_mpu_ck", &dpll_mpu_ck,
|
||||
0x0, AM33XX_CM_DIV_M2_DPLL_MPU, AM33XX_DPLL_CLKOUT_DIV_SHIFT,
|
||||
AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
|
||||
|
||||
/* DPLL_DDR */
|
||||
static struct dpll_data dpll_ddr_dd = {
|
||||
.mult_div1_reg = AM33XX_CM_CLKSEL_DPLL_DDR,
|
||||
.clk_bypass = &sys_clkin_ck,
|
||||
.clk_ref = &sys_clkin_ck,
|
||||
.control_reg = AM33XX_CM_CLKMODE_DPLL_DDR,
|
||||
.modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
||||
.idlest_reg = AM33XX_CM_IDLEST_DPLL_DDR,
|
||||
.mult_mask = AM33XX_DPLL_MULT_MASK,
|
||||
.div1_mask = AM33XX_DPLL_DIV_MASK,
|
||||
.enable_mask = AM33XX_DPLL_EN_MASK,
|
||||
.idlest_mask = AM33XX_ST_DPLL_CLK_MASK,
|
||||
.max_multiplier = 2047,
|
||||
.max_divider = 128,
|
||||
.min_divider = 1,
|
||||
};
|
||||
|
||||
/* CLKOUT: fdpll/M2 */
|
||||
static struct clk dpll_ddr_ck;
|
||||
|
||||
static const struct clk_ops dpll_ddr_ck_ops = {
|
||||
.recalc_rate = &omap3_dpll_recalc,
|
||||
.get_parent = &omap2_init_dpll_parent,
|
||||
.round_rate = &omap2_dpll_round_rate,
|
||||
.set_rate = &omap3_noncore_dpll_set_rate,
|
||||
};
|
||||
|
||||
static struct clk_hw_omap dpll_ddr_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &dpll_ddr_ck,
|
||||
},
|
||||
.dpll_data = &dpll_ddr_dd,
|
||||
.ops = &clkhwops_omap3_dpll,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(dpll_ddr_ck, dpll_core_ck_parents, dpll_ddr_ck_ops);
|
||||
|
||||
/*
|
||||
* TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2
|
||||
* and ALT_CLK1/2)
|
||||
*/
|
||||
DEFINE_CLK_DIVIDER(dpll_ddr_m2_ck, "dpll_ddr_ck", &dpll_ddr_ck,
|
||||
0x0, AM33XX_CM_DIV_M2_DPLL_DDR,
|
||||
AM33XX_DPLL_CLKOUT_DIV_SHIFT, AM33XX_DPLL_CLKOUT_DIV_WIDTH,
|
||||
CLK_DIVIDER_ONE_BASED, NULL);
|
||||
|
||||
/* emif_fck functional clock */
|
||||
DEFINE_CLK_FIXED_FACTOR(dpll_ddr_m2_div2_ck, "dpll_ddr_m2_ck", &dpll_ddr_m2_ck,
|
||||
0x0, 1, 2);
|
||||
|
||||
/* DPLL_DISP */
|
||||
static struct dpll_data dpll_disp_dd = {
|
||||
.mult_div1_reg = AM33XX_CM_CLKSEL_DPLL_DISP,
|
||||
.clk_bypass = &sys_clkin_ck,
|
||||
.clk_ref = &sys_clkin_ck,
|
||||
.control_reg = AM33XX_CM_CLKMODE_DPLL_DISP,
|
||||
.modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
||||
.idlest_reg = AM33XX_CM_IDLEST_DPLL_DISP,
|
||||
.mult_mask = AM33XX_DPLL_MULT_MASK,
|
||||
.div1_mask = AM33XX_DPLL_DIV_MASK,
|
||||
.enable_mask = AM33XX_DPLL_EN_MASK,
|
||||
.idlest_mask = AM33XX_ST_DPLL_CLK_MASK,
|
||||
.max_multiplier = 2047,
|
||||
.max_divider = 128,
|
||||
.min_divider = 1,
|
||||
};
|
||||
|
||||
/* CLKOUT: fdpll/M2 */
|
||||
static struct clk dpll_disp_ck;
|
||||
|
||||
static struct clk_hw_omap dpll_disp_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &dpll_disp_ck,
|
||||
},
|
||||
.dpll_data = &dpll_disp_dd,
|
||||
.ops = &clkhwops_omap3_dpll,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(dpll_disp_ck, dpll_core_ck_parents, dpll_ddr_ck_ops);
|
||||
|
||||
/*
|
||||
* TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2
|
||||
* and ALT_CLK1/2)
|
||||
*/
|
||||
DEFINE_CLK_DIVIDER(dpll_disp_m2_ck, "dpll_disp_ck", &dpll_disp_ck, 0x0,
|
||||
AM33XX_CM_DIV_M2_DPLL_DISP, AM33XX_DPLL_CLKOUT_DIV_SHIFT,
|
||||
AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
|
||||
|
||||
/* DPLL_PER */
|
||||
static struct dpll_data dpll_per_dd = {
|
||||
.mult_div1_reg = AM33XX_CM_CLKSEL_DPLL_PERIPH,
|
||||
.clk_bypass = &sys_clkin_ck,
|
||||
.clk_ref = &sys_clkin_ck,
|
||||
.control_reg = AM33XX_CM_CLKMODE_DPLL_PER,
|
||||
.modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
||||
.idlest_reg = AM33XX_CM_IDLEST_DPLL_PER,
|
||||
.mult_mask = AM33XX_DPLL_MULT_PERIPH_MASK,
|
||||
.div1_mask = AM33XX_DPLL_PER_DIV_MASK,
|
||||
.enable_mask = AM33XX_DPLL_EN_MASK,
|
||||
.idlest_mask = AM33XX_ST_DPLL_CLK_MASK,
|
||||
.max_multiplier = 2047,
|
||||
.max_divider = 128,
|
||||
.min_divider = 1,
|
||||
.flags = DPLL_J_TYPE,
|
||||
};
|
||||
|
||||
/* CLKDCOLDO */
|
||||
static struct clk dpll_per_ck;
|
||||
|
||||
static struct clk_hw_omap dpll_per_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &dpll_per_ck,
|
||||
},
|
||||
.dpll_data = &dpll_per_dd,
|
||||
.ops = &clkhwops_omap3_dpll,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(dpll_per_ck, dpll_core_ck_parents, dpll_ddr_ck_ops);
|
||||
|
||||
/* CLKOUT: fdpll/M2 */
|
||||
DEFINE_CLK_DIVIDER(dpll_per_m2_ck, "dpll_per_ck", &dpll_per_ck, 0x0,
|
||||
AM33XX_CM_DIV_M2_DPLL_PER, AM33XX_DPLL_CLKOUT_DIV_SHIFT,
|
||||
AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED,
|
||||
NULL);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(dpll_per_m2_div4_wkupdm_ck, "dpll_per_m2_ck",
|
||||
&dpll_per_m2_ck, 0x0, 1, 4);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(dpll_per_m2_div4_ck, "dpll_per_m2_ck",
|
||||
&dpll_per_m2_ck, 0x0, 1, 4);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(dpll_core_m4_div2_ck, "dpll_core_m4_ck",
|
||||
&dpll_core_m4_ck, 0x0, 1, 2);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(l4_rtc_gclk, "dpll_core_m4_ck", &dpll_core_m4_ck, 0x0,
|
||||
1, 2);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(clk_24mhz, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0, 1,
|
||||
8);
|
||||
|
||||
/*
|
||||
* Below clock nodes describes clockdomains derived out
|
||||
* of core clock.
|
||||
*/
|
||||
static const struct clk_ops clk_ops_null = {
|
||||
};
|
||||
|
||||
static const char *l3_gclk_parents[] = {
|
||||
"dpll_core_m4_ck"
|
||||
};
|
||||
|
||||
static struct clk l3_gclk;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(l3_gclk, NULL);
|
||||
DEFINE_STRUCT_CLK(l3_gclk, l3_gclk_parents, clk_ops_null);
|
||||
|
||||
static struct clk l4hs_gclk;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(l4hs_gclk, NULL);
|
||||
DEFINE_STRUCT_CLK(l4hs_gclk, l3_gclk_parents, clk_ops_null);
|
||||
|
||||
static const char *l3s_gclk_parents[] = {
|
||||
"dpll_core_m4_div2_ck"
|
||||
};
|
||||
|
||||
static struct clk l3s_gclk;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(l3s_gclk, NULL);
|
||||
DEFINE_STRUCT_CLK(l3s_gclk, l3s_gclk_parents, clk_ops_null);
|
||||
|
||||
static struct clk l4fw_gclk;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(l4fw_gclk, NULL);
|
||||
DEFINE_STRUCT_CLK(l4fw_gclk, l3s_gclk_parents, clk_ops_null);
|
||||
|
||||
static struct clk l4ls_gclk;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(l4ls_gclk, NULL);
|
||||
DEFINE_STRUCT_CLK(l4ls_gclk, l3s_gclk_parents, clk_ops_null);
|
||||
|
||||
static struct clk sysclk_div_ck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(sysclk_div_ck, NULL);
|
||||
DEFINE_STRUCT_CLK(sysclk_div_ck, l3_gclk_parents, clk_ops_null);
|
||||
|
||||
/*
|
||||
* In order to match the clock domain with hwmod clockdomain entry,
|
||||
* separate clock nodes is required for the modules which are
|
||||
* directly getting their funtioncal clock from sys_clkin.
|
||||
*/
|
||||
static struct clk adc_tsc_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(adc_tsc_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(adc_tsc_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
static struct clk dcan0_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(dcan0_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(dcan0_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
static struct clk dcan1_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(dcan1_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(dcan1_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
static struct clk mcasp0_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(mcasp0_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(mcasp0_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
static struct clk mcasp1_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(mcasp1_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(mcasp1_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
static struct clk smartreflex0_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(smartreflex0_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(smartreflex0_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
static struct clk smartreflex1_fck;
|
||||
DEFINE_STRUCT_CLK_HW_OMAP(smartreflex1_fck, NULL);
|
||||
DEFINE_STRUCT_CLK(smartreflex1_fck, dpll_core_ck_parents, clk_ops_null);
|
||||
|
||||
/*
|
||||
* Modules clock nodes
|
||||
*
|
||||
* The following clock leaf nodes are added for the moment because:
|
||||
*
|
||||
* - hwmod data is not present for these modules, either hwmod
|
||||
* control is not required or its not populated.
|
||||
* - Driver code is not yet migrated to use hwmod/runtime pm
|
||||
* - Modules outside kernel access (to disable them by default)
|
||||
*
|
||||
* - debugss
|
||||
* - mmu (gfx domain)
|
||||
* - cefuse
|
||||
* - usbotg_fck (its additional clock and not really a modulemode)
|
||||
* - ieee5000
|
||||
*/
|
||||
DEFINE_CLK_GATE(debugss_ick, "dpll_core_m4_ck", &dpll_core_m4_ck, 0x0,
|
||||
AM33XX_CM_WKUP_DEBUGSS_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,
|
||||
0x0, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(mmu_fck, "dpll_core_m4_ck", &dpll_core_m4_ck, 0x0,
|
||||
AM33XX_CM_GFX_MMUDATA_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,
|
||||
0x0, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(cefuse_fck, "sys_clkin_ck", &sys_clkin_ck, 0x0,
|
||||
AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,
|
||||
0x0, NULL);
|
||||
|
||||
/*
|
||||
* clkdiv32 is generated from fixed division of 732.4219
|
||||
*/
|
||||
DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732);
|
||||
|
||||
DEFINE_CLK_GATE(clkdiv32k_ick, "clkdiv32k_ck", &clkdiv32k_ck, 0x0,
|
||||
AM33XX_CM_PER_CLKDIV32K_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,
|
||||
0x0, NULL);
|
||||
|
||||
/* "usbotg_fck" is an additional clock and not really a modulemode */
|
||||
DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0,
|
||||
AM33XX_CM_CLKDCOLDO_DPLL_PER, AM33XX_ST_DPLL_CLKDCOLDO_SHIFT,
|
||||
0x0, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(ieee5000_fck, "dpll_core_m4_div2_ck", &dpll_core_m4_div2_ck,
|
||||
0x0, AM33XX_CM_PER_IEEE5000_CLKCTRL,
|
||||
AM33XX_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
|
||||
|
||||
/* Timers */
|
||||
static const struct clksel timer1_clkmux_sel[] = {
|
||||
{ .parent = &sys_clkin_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &clkdiv32k_ick, .rates = div_1_1_rates },
|
||||
{ .parent = &tclkin_ck, .rates = div_1_2_rates },
|
||||
{ .parent = &clk_rc32k_ck, .rates = div_1_3_rates },
|
||||
{ .parent = &clk_32768_ck, .rates = div_1_4_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static const char *timer1_ck_parents[] = {
|
||||
"sys_clkin_ck", "clkdiv32k_ick", "tclkin_ck", "clk_rc32k_ck",
|
||||
"clk_32768_ck",
|
||||
};
|
||||
|
||||
static struct clk timer1_fck;
|
||||
|
||||
static const struct clk_ops timer1_fck_ops = {
|
||||
.recalc_rate = &omap2_clksel_recalc,
|
||||
.get_parent = &omap2_clksel_find_parent_index,
|
||||
.set_parent = &omap2_clksel_set_parent,
|
||||
.init = &omap2_init_clk_clkdm,
|
||||
};
|
||||
|
||||
static struct clk_hw_omap timer1_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer1_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer1_clkmux_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER1MS_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_2_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer1_fck, timer1_ck_parents, timer1_fck_ops);
|
||||
|
||||
static const struct clksel timer2_to_7_clk_sel[] = {
|
||||
{ .parent = &tclkin_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &sys_clkin_ck, .rates = div_1_1_rates },
|
||||
{ .parent = &clkdiv32k_ick, .rates = div_1_2_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static const char *timer2_to_7_ck_parents[] = {
|
||||
"tclkin_ck", "sys_clkin_ck", "clkdiv32k_ick",
|
||||
};
|
||||
|
||||
static struct clk timer2_fck;
|
||||
|
||||
static struct clk_hw_omap timer2_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer2_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer2_to_7_clk_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER2_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer2_fck, timer2_to_7_ck_parents, timer1_fck_ops);
|
||||
|
||||
static struct clk timer3_fck;
|
||||
|
||||
static struct clk_hw_omap timer3_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer3_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer2_to_7_clk_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER3_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer3_fck, timer2_to_7_ck_parents, timer1_fck_ops);
|
||||
|
||||
static struct clk timer4_fck;
|
||||
|
||||
static struct clk_hw_omap timer4_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer4_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer2_to_7_clk_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER4_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer4_fck, timer2_to_7_ck_parents, timer1_fck_ops);
|
||||
|
||||
static struct clk timer5_fck;
|
||||
|
||||
static struct clk_hw_omap timer5_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer5_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer2_to_7_clk_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER5_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer5_fck, timer2_to_7_ck_parents, timer1_fck_ops);
|
||||
|
||||
static struct clk timer6_fck;
|
||||
|
||||
static struct clk_hw_omap timer6_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer6_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer2_to_7_clk_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER6_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer6_fck, timer2_to_7_ck_parents, timer1_fck_ops);
|
||||
|
||||
static struct clk timer7_fck;
|
||||
|
||||
static struct clk_hw_omap timer7_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &timer7_fck,
|
||||
},
|
||||
.clkdm_name = "l4ls_clkdm",
|
||||
.clksel = timer2_to_7_clk_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_TIMER7_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(timer7_fck, timer2_to_7_ck_parents, timer1_fck_ops);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(cpsw_125mhz_gclk,
|
||||
"dpll_core_m5_ck",
|
||||
&dpll_core_m5_ck,
|
||||
0x0,
|
||||
1, 2);
|
||||
|
||||
static const struct clk_ops cpsw_fck_ops = {
|
||||
.recalc_rate = &omap2_clksel_recalc,
|
||||
.get_parent = &omap2_clksel_find_parent_index,
|
||||
.set_parent = &omap2_clksel_set_parent,
|
||||
};
|
||||
|
||||
static const struct clksel cpsw_cpts_rft_clkmux_sel[] = {
|
||||
{ .parent = &dpll_core_m5_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &dpll_core_m4_ck, .rates = div_1_1_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static const char *cpsw_cpts_rft_ck_parents[] = {
|
||||
"dpll_core_m5_ck", "dpll_core_m4_ck",
|
||||
};
|
||||
|
||||
static struct clk cpsw_cpts_rft_clk;
|
||||
|
||||
static struct clk_hw_omap cpsw_cpts_rft_clk_hw = {
|
||||
.hw = {
|
||||
.clk = &cpsw_cpts_rft_clk,
|
||||
},
|
||||
.clkdm_name = "cpsw_125mhz_clkdm",
|
||||
.clksel = cpsw_cpts_rft_clkmux_sel,
|
||||
.clksel_reg = AM33XX_CM_CPTS_RFT_CLKSEL,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_0_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(cpsw_cpts_rft_clk, cpsw_cpts_rft_ck_parents, cpsw_fck_ops);
|
||||
|
||||
|
||||
/* gpio */
|
||||
static const char *gpio0_ck_parents[] = {
|
||||
"clk_rc32k_ck", "clk_32768_ck", "clkdiv32k_ick",
|
||||
};
|
||||
|
||||
static const struct clksel gpio0_dbclk_mux_sel[] = {
|
||||
{ .parent = &clk_rc32k_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &clk_32768_ck, .rates = div_1_1_rates },
|
||||
{ .parent = &clkdiv32k_ick, .rates = div_1_2_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static const struct clk_ops gpio_fck_ops = {
|
||||
.recalc_rate = &omap2_clksel_recalc,
|
||||
.get_parent = &omap2_clksel_find_parent_index,
|
||||
.set_parent = &omap2_clksel_set_parent,
|
||||
.init = &omap2_init_clk_clkdm,
|
||||
};
|
||||
|
||||
static struct clk gpio0_dbclk_mux_ck;
|
||||
|
||||
static struct clk_hw_omap gpio0_dbclk_mux_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &gpio0_dbclk_mux_ck,
|
||||
},
|
||||
.clkdm_name = "l4_wkup_clkdm",
|
||||
.clksel = gpio0_dbclk_mux_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_GPIO0_DBCLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(gpio0_dbclk_mux_ck, gpio0_ck_parents, gpio_fck_ops);
|
||||
|
||||
DEFINE_CLK_GATE(gpio0_dbclk, "gpio0_dbclk_mux_ck", &gpio0_dbclk_mux_ck, 0x0,
|
||||
AM33XX_CM_WKUP_GPIO0_CLKCTRL,
|
||||
AM33XX_OPTFCLKEN_GPIO0_GDBCLK_SHIFT, 0x0, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(gpio1_dbclk, "clkdiv32k_ick", &clkdiv32k_ick, 0x0,
|
||||
AM33XX_CM_PER_GPIO1_CLKCTRL,
|
||||
AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_SHIFT, 0x0, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(gpio2_dbclk, "clkdiv32k_ick", &clkdiv32k_ick, 0x0,
|
||||
AM33XX_CM_PER_GPIO2_CLKCTRL,
|
||||
AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_SHIFT, 0x0, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(gpio3_dbclk, "clkdiv32k_ick", &clkdiv32k_ick, 0x0,
|
||||
AM33XX_CM_PER_GPIO3_CLKCTRL,
|
||||
AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_SHIFT, 0x0, NULL);
|
||||
|
||||
|
||||
static const char *pruss_ck_parents[] = {
|
||||
"l3_gclk", "dpll_disp_m2_ck",
|
||||
};
|
||||
|
||||
static const struct clksel pruss_ocp_clk_mux_sel[] = {
|
||||
{ .parent = &l3_gclk, .rates = div_1_0_rates },
|
||||
{ .parent = &dpll_disp_m2_ck, .rates = div_1_1_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static struct clk pruss_ocp_gclk;
|
||||
|
||||
static struct clk_hw_omap pruss_ocp_gclk_hw = {
|
||||
.hw = {
|
||||
.clk = &pruss_ocp_gclk,
|
||||
},
|
||||
.clkdm_name = "pruss_ocp_clkdm",
|
||||
.clksel = pruss_ocp_clk_mux_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_PRUSS_OCP_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_0_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(pruss_ocp_gclk, pruss_ck_parents, gpio_fck_ops);
|
||||
|
||||
static const char *lcd_ck_parents[] = {
|
||||
"dpll_disp_m2_ck", "dpll_core_m5_ck", "dpll_per_m2_ck",
|
||||
};
|
||||
|
||||
static const struct clksel lcd_clk_mux_sel[] = {
|
||||
{ .parent = &dpll_disp_m2_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &dpll_core_m5_ck, .rates = div_1_1_rates },
|
||||
{ .parent = &dpll_per_m2_ck, .rates = div_1_2_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static struct clk lcd_gclk;
|
||||
|
||||
static struct clk_hw_omap lcd_gclk_hw = {
|
||||
.hw = {
|
||||
.clk = &lcd_gclk,
|
||||
},
|
||||
.clkdm_name = "lcdc_clkdm",
|
||||
.clksel = lcd_clk_mux_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_LCDC_PIXEL_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(lcd_gclk, lcd_ck_parents, gpio_fck_ops);
|
||||
|
||||
DEFINE_CLK_FIXED_FACTOR(mmc_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0, 1, 2);
|
||||
|
||||
static const char *gfx_ck_parents[] = {
|
||||
"dpll_core_m4_ck", "dpll_per_m2_ck",
|
||||
};
|
||||
|
||||
static const struct clksel gfx_clksel_sel[] = {
|
||||
{ .parent = &dpll_core_m4_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &dpll_per_m2_ck, .rates = div_1_1_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static struct clk gfx_fclk_clksel_ck;
|
||||
|
||||
static struct clk_hw_omap gfx_fclk_clksel_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &gfx_fclk_clksel_ck,
|
||||
},
|
||||
.clksel = gfx_clksel_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_GFX_FCLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_GFX_FCLK_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(gfx_fclk_clksel_ck, gfx_ck_parents, gpio_fck_ops);
|
||||
|
||||
static const struct clk_div_table div_1_0_2_1_rates[] = {
|
||||
{ .div = 1, .val = 0, },
|
||||
{ .div = 2, .val = 1, },
|
||||
{ .div = 0 },
|
||||
};
|
||||
|
||||
DEFINE_CLK_DIVIDER_TABLE(gfx_fck_div_ck, "gfx_fclk_clksel_ck",
|
||||
&gfx_fclk_clksel_ck, 0x0, AM33XX_CLKSEL_GFX_FCLK,
|
||||
AM33XX_CLKSEL_0_0_SHIFT, AM33XX_CLKSEL_0_0_WIDTH,
|
||||
0x0, div_1_0_2_1_rates, NULL);
|
||||
|
||||
static const char *sysclkout_ck_parents[] = {
|
||||
"clk_32768_ck", "l3_gclk", "dpll_ddr_m2_ck", "dpll_per_m2_ck",
|
||||
"lcd_gclk",
|
||||
};
|
||||
|
||||
static const struct clksel sysclkout_pre_sel[] = {
|
||||
{ .parent = &clk_32768_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &l3_gclk, .rates = div_1_1_rates },
|
||||
{ .parent = &dpll_ddr_m2_ck, .rates = div_1_2_rates },
|
||||
{ .parent = &dpll_per_m2_ck, .rates = div_1_3_rates },
|
||||
{ .parent = &lcd_gclk, .rates = div_1_4_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static struct clk sysclkout_pre_ck;
|
||||
|
||||
static struct clk_hw_omap sysclkout_pre_ck_hw = {
|
||||
.hw = {
|
||||
.clk = &sysclkout_pre_ck,
|
||||
},
|
||||
.clksel = sysclkout_pre_sel,
|
||||
.clksel_reg = AM33XX_CM_CLKOUT_CTRL,
|
||||
.clksel_mask = AM33XX_CLKOUT2SOURCE_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(sysclkout_pre_ck, sysclkout_ck_parents, gpio_fck_ops);
|
||||
|
||||
/* Divide by 8 clock rates with default clock is 1/1*/
|
||||
static const struct clk_div_table div8_rates[] = {
|
||||
{ .div = 1, .val = 0, },
|
||||
{ .div = 2, .val = 1, },
|
||||
{ .div = 3, .val = 2, },
|
||||
{ .div = 4, .val = 3, },
|
||||
{ .div = 5, .val = 4, },
|
||||
{ .div = 6, .val = 5, },
|
||||
{ .div = 7, .val = 6, },
|
||||
{ .div = 8, .val = 7, },
|
||||
{ .div = 0 },
|
||||
};
|
||||
|
||||
DEFINE_CLK_DIVIDER_TABLE(clkout2_div_ck, "sysclkout_pre_ck", &sysclkout_pre_ck,
|
||||
0x0, AM33XX_CM_CLKOUT_CTRL, AM33XX_CLKOUT2DIV_SHIFT,
|
||||
AM33XX_CLKOUT2DIV_WIDTH, 0x0, div8_rates, NULL);
|
||||
|
||||
DEFINE_CLK_GATE(clkout2_ck, "clkout2_div_ck", &clkout2_div_ck, 0x0,
|
||||
AM33XX_CM_CLKOUT_CTRL, AM33XX_CLKOUT2EN_SHIFT, 0x0, NULL);
|
||||
|
||||
static const char *wdt_ck_parents[] = {
|
||||
"clk_rc32k_ck", "clkdiv32k_ick",
|
||||
};
|
||||
|
||||
static const struct clksel wdt_clkmux_sel[] = {
|
||||
{ .parent = &clk_rc32k_ck, .rates = div_1_0_rates },
|
||||
{ .parent = &clkdiv32k_ick, .rates = div_1_1_rates },
|
||||
{ .parent = NULL },
|
||||
};
|
||||
|
||||
static struct clk wdt1_fck;
|
||||
|
||||
static struct clk_hw_omap wdt1_fck_hw = {
|
||||
.hw = {
|
||||
.clk = &wdt1_fck,
|
||||
},
|
||||
.clkdm_name = "l4_wkup_clkdm",
|
||||
.clksel = wdt_clkmux_sel,
|
||||
.clksel_reg = AM33XX_CLKSEL_WDT1_CLK,
|
||||
.clksel_mask = AM33XX_CLKSEL_0_1_MASK,
|
||||
};
|
||||
|
||||
DEFINE_STRUCT_CLK(wdt1_fck, wdt_ck_parents, gpio_fck_ops);
|
||||
|
||||
/*
|
||||
* clkdev
|
||||
*/
|
||||
static struct omap_clk am33xx_clks[] = {
|
||||
CLK(NULL, "clk_32768_ck", &clk_32768_ck, CK_AM33XX),
|
||||
CLK(NULL, "clk_rc32k_ck", &clk_rc32k_ck, CK_AM33XX),
|
||||
CLK(NULL, "virt_19200000_ck", &virt_19200000_ck, CK_AM33XX),
|
||||
CLK(NULL, "virt_24000000_ck", &virt_24000000_ck, CK_AM33XX),
|
||||
CLK(NULL, "virt_25000000_ck", &virt_25000000_ck, CK_AM33XX),
|
||||
CLK(NULL, "virt_26000000_ck", &virt_26000000_ck, CK_AM33XX),
|
||||
CLK(NULL, "sys_clkin_ck", &sys_clkin_ck, CK_AM33XX),
|
||||
CLK(NULL, "tclkin_ck", &tclkin_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_core_ck", &dpll_core_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_core_x2_ck", &dpll_core_x2_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_core_m4_ck", &dpll_core_m4_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_core_m5_ck", &dpll_core_m5_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_core_m6_ck", &dpll_core_m6_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_mpu_ck", &dpll_mpu_ck, CK_AM33XX),
|
||||
CLK("cpu0", NULL, &dpll_mpu_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_mpu_m2_ck", &dpll_mpu_m2_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_ddr_ck", &dpll_ddr_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_ddr_m2_ck", &dpll_ddr_m2_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_ddr_m2_div2_ck", &dpll_ddr_m2_div2_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_disp_ck", &dpll_disp_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_disp_m2_ck", &dpll_disp_m2_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_per_ck", &dpll_per_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_per_m2_ck", &dpll_per_m2_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_per_m2_div4_wkupdm_ck", &dpll_per_m2_div4_wkupdm_ck, CK_AM33XX),
|
||||
CLK(NULL, "dpll_per_m2_div4_ck", &dpll_per_m2_div4_ck, CK_AM33XX),
|
||||
CLK(NULL, "adc_tsc_fck", &adc_tsc_fck, CK_AM33XX),
|
||||
CLK(NULL, "cefuse_fck", &cefuse_fck, CK_AM33XX),
|
||||
CLK(NULL, "clkdiv32k_ck", &clkdiv32k_ck, CK_AM33XX),
|
||||
CLK(NULL, "clkdiv32k_ick", &clkdiv32k_ick, CK_AM33XX),
|
||||
CLK(NULL, "dcan0_fck", &dcan0_fck, CK_AM33XX),
|
||||
CLK("481cc000.d_can", NULL, &dcan0_fck, CK_AM33XX),
|
||||
CLK(NULL, "dcan1_fck", &dcan1_fck, CK_AM33XX),
|
||||
CLK("481d0000.d_can", NULL, &dcan1_fck, CK_AM33XX),
|
||||
CLK(NULL, "debugss_ick", &debugss_ick, CK_AM33XX),
|
||||
CLK(NULL, "pruss_ocp_gclk", &pruss_ocp_gclk, CK_AM33XX),
|
||||
CLK(NULL, "mcasp0_fck", &mcasp0_fck, CK_AM33XX),
|
||||
CLK(NULL, "mcasp1_fck", &mcasp1_fck, CK_AM33XX),
|
||||
CLK(NULL, "mmu_fck", &mmu_fck, CK_AM33XX),
|
||||
CLK(NULL, "smartreflex0_fck", &smartreflex0_fck, CK_AM33XX),
|
||||
CLK(NULL, "smartreflex1_fck", &smartreflex1_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer1_fck", &timer1_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer2_fck", &timer2_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer3_fck", &timer3_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer4_fck", &timer4_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer5_fck", &timer5_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer6_fck", &timer6_fck, CK_AM33XX),
|
||||
CLK(NULL, "timer7_fck", &timer7_fck, CK_AM33XX),
|
||||
CLK(NULL, "usbotg_fck", &usbotg_fck, CK_AM33XX),
|
||||
CLK(NULL, "ieee5000_fck", &ieee5000_fck, CK_AM33XX),
|
||||
CLK(NULL, "wdt1_fck", &wdt1_fck, CK_AM33XX),
|
||||
CLK(NULL, "l4_rtc_gclk", &l4_rtc_gclk, CK_AM33XX),
|
||||
CLK(NULL, "l3_gclk", &l3_gclk, CK_AM33XX),
|
||||
CLK(NULL, "dpll_core_m4_div2_ck", &dpll_core_m4_div2_ck, CK_AM33XX),
|
||||
CLK(NULL, "l4hs_gclk", &l4hs_gclk, CK_AM33XX),
|
||||
CLK(NULL, "l3s_gclk", &l3s_gclk, CK_AM33XX),
|
||||
CLK(NULL, "l4fw_gclk", &l4fw_gclk, CK_AM33XX),
|
||||
CLK(NULL, "l4ls_gclk", &l4ls_gclk, CK_AM33XX),
|
||||
CLK(NULL, "clk_24mhz", &clk_24mhz, CK_AM33XX),
|
||||
CLK(NULL, "sysclk_div_ck", &sysclk_div_ck, CK_AM33XX),
|
||||
CLK(NULL, "cpsw_125mhz_gclk", &cpsw_125mhz_gclk, CK_AM33XX),
|
||||
CLK(NULL, "cpsw_cpts_rft_clk", &cpsw_cpts_rft_clk, CK_AM33XX),
|
||||
CLK(NULL, "gpio0_dbclk_mux_ck", &gpio0_dbclk_mux_ck, CK_AM33XX),
|
||||
CLK(NULL, "gpio0_dbclk", &gpio0_dbclk, CK_AM33XX),
|
||||
CLK(NULL, "gpio1_dbclk", &gpio1_dbclk, CK_AM33XX),
|
||||
CLK(NULL, "gpio2_dbclk", &gpio2_dbclk, CK_AM33XX),
|
||||
CLK(NULL, "gpio3_dbclk", &gpio3_dbclk, CK_AM33XX),
|
||||
CLK(NULL, "lcd_gclk", &lcd_gclk, CK_AM33XX),
|
||||
CLK(NULL, "mmc_clk", &mmc_clk, CK_AM33XX),
|
||||
CLK(NULL, "gfx_fclk_clksel_ck", &gfx_fclk_clksel_ck, CK_AM33XX),
|
||||
CLK(NULL, "gfx_fck_div_ck", &gfx_fck_div_ck, CK_AM33XX),
|
||||
CLK(NULL, "sysclkout_pre_ck", &sysclkout_pre_ck, CK_AM33XX),
|
||||
CLK(NULL, "clkout2_div_ck", &clkout2_div_ck, CK_AM33XX),
|
||||
CLK(NULL, "timer_32k_ck", &clkdiv32k_ick, CK_AM33XX),
|
||||
CLK(NULL, "timer_sys_ck", &sys_clkin_ck, CK_AM33XX),
|
||||
};
|
||||
|
||||
|
||||
static const char *enable_init_clks[] = {
|
||||
"dpll_ddr_m2_ck",
|
||||
"dpll_mpu_m2_ck",
|
||||
"l3_gclk",
|
||||
"l4hs_gclk",
|
||||
"l4fw_gclk",
|
||||
"l4ls_gclk",
|
||||
};
|
||||
|
||||
int __init am33xx_clk_init(void)
|
||||
{
|
||||
struct omap_clk *c;
|
||||
u32 cpu_clkflg;
|
||||
|
||||
if (soc_is_am33xx()) {
|
||||
cpu_mask = RATE_IN_AM33XX;
|
||||
cpu_clkflg = CK_AM33XX;
|
||||
}
|
||||
|
||||
for (c = am33xx_clks; c < am33xx_clks + ARRAY_SIZE(am33xx_clks); c++) {
|
||||
if (c->cpu & cpu_clkflg) {
|
||||
clkdev_add(&c->lk);
|
||||
if (!__clk_init(NULL, c->lk.clk))
|
||||
omap2_init_clk_hw_omap_clocks(c->lk.clk);
|
||||
}
|
||||
}
|
||||
|
||||
omap2_clk_disable_autoidle_all();
|
||||
|
||||
omap2_clk_enable_init_clocks(enable_init_clks,
|
||||
ARRAY_SIZE(enable_init_clks));
|
||||
|
||||
/* TRM ERRATA: Timer 3 & 6 default parent (TCLKIN) may not be always
|
||||
* physically present, in such a case HWMOD enabling of
|
||||
* clock would be failure with default parent. And timer
|
||||
* probe thinks clock is already enabled, this leads to
|
||||
* crash upon accessing timer 3 & 6 registers in probe.
|
||||
* Fix by setting parent of both these timers to master
|
||||
* oscillator clock.
|
||||
*/
|
||||
|
||||
clk_set_parent(&timer3_fck, &sys_clkin_ck);
|
||||
clk_set_parent(&timer6_fck, &sys_clkin_ck);
|
||||
|
||||
return 0;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -21,12 +21,10 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/prcm.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
#include "cm2xxx_3xxx.h"
|
||||
#include "cm2xxx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
||||
/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */
|
||||
|
@ -38,92 +36,90 @@
|
|||
#define APLLS_CLKIN_13MHZ 2
|
||||
#define APLLS_CLKIN_12MHZ 3
|
||||
|
||||
void __iomem *cm_idlest_pll;
|
||||
|
||||
/* Private functions */
|
||||
|
||||
/* Enable an APLL if off */
|
||||
static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask)
|
||||
/**
|
||||
* omap2xxx_clk_apll_locked - is the APLL locked?
|
||||
* @hw: struct clk_hw * of the APLL to check
|
||||
*
|
||||
* If the APLL IP block referred to by @hw indicates that it's locked,
|
||||
* return true; otherwise, return false.
|
||||
*/
|
||||
static bool omap2xxx_clk_apll_locked(struct clk_hw *hw)
|
||||
{
|
||||
u32 cval, apll_mask;
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 r, apll_mask;
|
||||
|
||||
apll_mask = EN_APLL_LOCKED << clk->enable_bit;
|
||||
|
||||
cval = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
r = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
|
||||
if ((cval & apll_mask) == apll_mask)
|
||||
return 0; /* apll already enabled */
|
||||
|
||||
cval &= ~apll_mask;
|
||||
cval |= apll_mask;
|
||||
omap2_cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
|
||||
|
||||
omap2_cm_wait_idlest(cm_idlest_pll, status_mask,
|
||||
OMAP24XX_CM_IDLEST_VAL, __clk_get_name(clk));
|
||||
|
||||
/*
|
||||
* REVISIT: Should we return an error code if omap2_wait_clock_ready()
|
||||
* fails?
|
||||
*/
|
||||
return 0;
|
||||
return ((r & apll_mask) == apll_mask) ? true : false;
|
||||
}
|
||||
|
||||
static int omap2_clk_apll96_enable(struct clk *clk)
|
||||
int omap2_clk_apll96_enable(struct clk_hw *hw)
|
||||
{
|
||||
return omap2_clk_apll_enable(clk, OMAP24XX_ST_96M_APLL_MASK);
|
||||
return omap2xxx_cm_apll96_enable();
|
||||
}
|
||||
|
||||
static int omap2_clk_apll54_enable(struct clk *clk)
|
||||
int omap2_clk_apll54_enable(struct clk_hw *hw)
|
||||
{
|
||||
return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL_MASK);
|
||||
return omap2xxx_cm_apll54_enable();
|
||||
}
|
||||
|
||||
static void _apll96_allow_idle(struct clk *clk)
|
||||
static void _apll96_allow_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
omap2xxx_cm_set_apll96_auto_low_power_stop();
|
||||
}
|
||||
|
||||
static void _apll96_deny_idle(struct clk *clk)
|
||||
static void _apll96_deny_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
omap2xxx_cm_set_apll96_disable_autoidle();
|
||||
}
|
||||
|
||||
static void _apll54_allow_idle(struct clk *clk)
|
||||
static void _apll54_allow_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
omap2xxx_cm_set_apll54_auto_low_power_stop();
|
||||
}
|
||||
|
||||
static void _apll54_deny_idle(struct clk *clk)
|
||||
static void _apll54_deny_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
omap2xxx_cm_set_apll54_disable_autoidle();
|
||||
}
|
||||
|
||||
/* Stop APLL */
|
||||
static void omap2_clk_apll_disable(struct clk *clk)
|
||||
void omap2_clk_apll96_disable(struct clk_hw *hw)
|
||||
{
|
||||
u32 cval;
|
||||
omap2xxx_cm_apll96_disable();
|
||||
}
|
||||
|
||||
cval = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
cval &= ~(EN_APLL_LOCKED << clk->enable_bit);
|
||||
omap2_cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
|
||||
void omap2_clk_apll54_disable(struct clk_hw *hw)
|
||||
{
|
||||
omap2xxx_cm_apll54_disable();
|
||||
}
|
||||
|
||||
unsigned long omap2_clk_apll54_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
return (omap2xxx_clk_apll_locked(hw)) ? 54000000 : 0;
|
||||
}
|
||||
|
||||
unsigned long omap2_clk_apll96_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
return (omap2xxx_clk_apll_locked(hw)) ? 96000000 : 0;
|
||||
}
|
||||
|
||||
/* Public data */
|
||||
|
||||
const struct clkops clkops_apll96 = {
|
||||
.enable = omap2_clk_apll96_enable,
|
||||
.disable = omap2_clk_apll_disable,
|
||||
.allow_idle = _apll96_allow_idle,
|
||||
.deny_idle = _apll96_deny_idle,
|
||||
};
|
||||
|
||||
const struct clkops clkops_apll54 = {
|
||||
.enable = omap2_clk_apll54_enable,
|
||||
.disable = omap2_clk_apll_disable,
|
||||
const struct clk_hw_omap_ops clkhwops_apll54 = {
|
||||
.allow_idle = _apll54_allow_idle,
|
||||
.deny_idle = _apll54_deny_idle,
|
||||
};
|
||||
|
||||
const struct clk_hw_omap_ops clkhwops_apll96 = {
|
||||
.allow_idle = _apll96_allow_idle,
|
||||
.deny_idle = _apll96_deny_idle,
|
||||
};
|
||||
|
||||
/* Public functions */
|
||||
|
||||
u32 omap2xxx_get_apll_clkin(void)
|
||||
|
|
|
@ -14,10 +14,8 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "cm2xxx_3xxx.h"
|
||||
#include "cm2xxx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
||||
/* Private functions */
|
||||
|
@ -31,7 +29,7 @@
|
|||
* REVISIT: DPLL can optionally enter low-power bypass by writing 0x1
|
||||
* instead. Add some mechanism to optionally enter this mode.
|
||||
*/
|
||||
static void _allow_idle(struct clk *clk)
|
||||
static void _allow_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
if (!clk || !clk->dpll_data)
|
||||
return;
|
||||
|
@ -45,7 +43,7 @@ static void _allow_idle(struct clk *clk)
|
|||
*
|
||||
* Disable DPLL automatic idle control. No return value.
|
||||
*/
|
||||
static void _deny_idle(struct clk *clk)
|
||||
static void _deny_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
if (!clk || !clk->dpll_data)
|
||||
return;
|
||||
|
@ -55,9 +53,7 @@ static void _deny_idle(struct clk *clk)
|
|||
|
||||
|
||||
/* Public data */
|
||||
|
||||
const struct clkops clkops_omap2xxx_dpll_ops = {
|
||||
const struct clk_hw_omap_ops clkhwops_omap2xxx_dpll = {
|
||||
.allow_idle = _allow_idle,
|
||||
.deny_idle = _deny_idle,
|
||||
};
|
||||
|
||||
|
|
|
@ -25,21 +25,26 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/sram.h>
|
||||
#include <plat/sdrc.h>
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
#include "opp2xxx.h"
|
||||
#include "cm2xxx_3xxx.h"
|
||||
#include "cm2xxx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
#include "sdrc.h"
|
||||
|
||||
/* #define DOWN_VARIABLE_DPLL 1 */ /* Experimental */
|
||||
|
||||
/*
|
||||
* dpll_core_ck: pointer to the combined dpll_ck + core_ck on OMAP2xxx
|
||||
* (currently defined as "dpll_ck" in the OMAP2xxx clock tree). Set
|
||||
* during dpll_ck init and used later by omap2xxx_clk_get_core_rate().
|
||||
*/
|
||||
static struct clk_hw_omap *dpll_core_ck;
|
||||
|
||||
/**
|
||||
* omap2xxx_clk_get_core_rate - return the CORE_CLK rate
|
||||
* @clk: pointer to the combined dpll_ck + core_ck (currently "dpll_ck")
|
||||
*
|
||||
* Returns the CORE_CLK rate. CORE_CLK can have one of three rate
|
||||
* sources on OMAP2xxx: the DPLL CLKOUT rate, DPLL CLKOUTX2, or 32KHz
|
||||
|
@ -47,12 +52,14 @@
|
|||
* struct clk *dpll_ck, which is a composite clock of dpll_ck and
|
||||
* core_ck.
|
||||
*/
|
||||
unsigned long omap2xxx_clk_get_core_rate(struct clk *clk)
|
||||
unsigned long omap2xxx_clk_get_core_rate(void)
|
||||
{
|
||||
long long core_clk;
|
||||
u32 v;
|
||||
|
||||
core_clk = omap2_get_dpll_rate(clk);
|
||||
WARN_ON(!dpll_core_ck);
|
||||
|
||||
core_clk = omap2_get_dpll_rate(dpll_core_ck);
|
||||
|
||||
v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
v &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
|
@ -98,19 +105,22 @@ static long omap2_dpllcore_round_rate(unsigned long target_rate)
|
|||
|
||||
}
|
||||
|
||||
unsigned long omap2_dpllcore_recalc(struct clk *clk)
|
||||
unsigned long omap2_dpllcore_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
return omap2xxx_clk_get_core_rate(clk);
|
||||
return omap2xxx_clk_get_core_rate();
|
||||
}
|
||||
|
||||
int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate)
|
||||
int omap2_reprogram_dpllcore(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 cur_rate, low, mult, div, valid_rate, done_rate;
|
||||
u32 bypass = 0;
|
||||
struct prcm_config tmpset;
|
||||
const struct dpll_data *dd;
|
||||
|
||||
cur_rate = omap2xxx_clk_get_core_rate(dclk);
|
||||
cur_rate = omap2xxx_clk_get_core_rate();
|
||||
mult = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
mult &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
|
||||
|
@ -171,3 +181,19 @@ int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2xxx_clkt_dpllcore_init - clk init function for dpll_ck
|
||||
* @clk: struct clk *dpll_ck
|
||||
*
|
||||
* Store a local copy of @clk in dpll_core_ck so other code can query
|
||||
* the core rate without having to clk_get(), which can sleep. Must
|
||||
* only be called once. No return value. XXX If the clock
|
||||
* registration process is ever changed such that dpll_ck is no longer
|
||||
* statically defined, this code may need to change to increment some
|
||||
* kind of use count on dpll_ck.
|
||||
*/
|
||||
void omap2xxx_clkt_dpllcore_init(struct clk_hw *hw)
|
||||
{
|
||||
WARN(dpll_core_ck, "dpll_core_ck already set - should never happen");
|
||||
dpll_core_ck = to_clk_hw_omap(hw);
|
||||
}
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
#include "prm2xxx_3xxx.h"
|
||||
|
@ -37,7 +35,7 @@
|
|||
* clk_enable/clk_disable()-based usecounting for osc_ck should be
|
||||
* replaced with autoidle-based usecounting.
|
||||
*/
|
||||
static int omap2_enable_osc_ck(struct clk *clk)
|
||||
int omap2_enable_osc_ck(struct clk_hw *clk)
|
||||
{
|
||||
u32 pcc;
|
||||
|
||||
|
@ -55,7 +53,7 @@ static int omap2_enable_osc_ck(struct clk *clk)
|
|||
* clk_enable/clk_disable()-based usecounting for osc_ck should be
|
||||
* replaced with autoidle-based usecounting.
|
||||
*/
|
||||
static void omap2_disable_osc_ck(struct clk *clk)
|
||||
void omap2_disable_osc_ck(struct clk_hw *clk)
|
||||
{
|
||||
u32 pcc;
|
||||
|
||||
|
@ -64,13 +62,8 @@ static void omap2_disable_osc_ck(struct clk *clk)
|
|||
__raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
|
||||
}
|
||||
|
||||
const struct clkops clkops_oscck = {
|
||||
.enable = omap2_enable_osc_ck,
|
||||
.disable = omap2_disable_osc_ck,
|
||||
};
|
||||
|
||||
unsigned long omap2_osc_clk_recalc(struct clk *clk)
|
||||
unsigned long omap2_osc_clk_recalc(struct clk_hw *clk,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
return omap2xxx_get_apll_clkin() * omap2xxx_get_sysclkdiv();
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,6 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
#include "prm2xxx_3xxx.h"
|
||||
|
@ -42,9 +40,8 @@ u32 omap2xxx_get_sysclkdiv(void)
|
|||
return div;
|
||||
}
|
||||
|
||||
unsigned long omap2xxx_sys_clk_recalc(struct clk *clk)
|
||||
unsigned long omap2xxx_sys_clk_recalc(struct clk_hw *clk,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
return clk->parent->rate / omap2xxx_get_sysclkdiv();
|
||||
return parent_rate / omap2xxx_get_sysclkdiv();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* OMAP2xxx DVFS virtual clock functions
|
||||
*
|
||||
* Copyright (C) 2005-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2005-2008, 2012 Texas Instruments, Inc.
|
||||
* Copyright (C) 2004-2010 Nokia Corporation
|
||||
*
|
||||
* Contacts:
|
||||
|
@ -33,27 +33,34 @@
|
|||
#include <linux/cpufreq.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/sram.h>
|
||||
#include <plat/sdrc.h>
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "soc.h"
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
#include "opp2xxx.h"
|
||||
#include "cm2xxx_3xxx.h"
|
||||
#include "cm2xxx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
#include "sdrc.h"
|
||||
|
||||
const struct prcm_config *curr_prcm_set;
|
||||
const struct prcm_config *rate_table;
|
||||
|
||||
/*
|
||||
* sys_ck_rate: the rate of the external high-frequency clock
|
||||
* oscillator on the board. Set by the SoC-specific clock init code.
|
||||
* Once set during a boot, will not change.
|
||||
*/
|
||||
static unsigned long sys_ck_rate;
|
||||
|
||||
/**
|
||||
* omap2_table_mpu_recalc - just return the MPU speed
|
||||
* @clk: virt_prcm_set struct clk
|
||||
*
|
||||
* Set virt_prcm_set's rate to the mpu_speed field of the current PRCM set.
|
||||
*/
|
||||
unsigned long omap2_table_mpu_recalc(struct clk *clk)
|
||||
unsigned long omap2_table_mpu_recalc(struct clk_hw *clk,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
return curr_prcm_set->mpu_speed;
|
||||
}
|
||||
|
@ -65,18 +72,18 @@ unsigned long omap2_table_mpu_recalc(struct clk *clk)
|
|||
* Some might argue L3-DDR, others ARM, others IVA. This code is simple and
|
||||
* just uses the ARM rates.
|
||||
*/
|
||||
long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
|
||||
long omap2_round_to_table_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
{
|
||||
const struct prcm_config *ptr;
|
||||
long highest_rate, sys_clk_rate;
|
||||
long highest_rate;
|
||||
|
||||
highest_rate = -EINVAL;
|
||||
sys_clk_rate = __clk_get_rate(sclk);
|
||||
|
||||
for (ptr = rate_table; ptr->mpu_speed; ptr++) {
|
||||
if (!(ptr->flags & cpu_mask))
|
||||
continue;
|
||||
if (ptr->xtal_speed != sys_clk_rate)
|
||||
if (ptr->xtal_speed != sys_ck_rate)
|
||||
continue;
|
||||
|
||||
highest_rate = ptr->mpu_speed;
|
||||
|
@ -89,21 +96,19 @@ long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
|
|||
}
|
||||
|
||||
/* Sets basic clocks based on the specified rate */
|
||||
int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
||||
int omap2_select_table_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
u32 cur_rate, done_rate, bypass = 0, tmp;
|
||||
const struct prcm_config *prcm;
|
||||
unsigned long found_speed = 0;
|
||||
unsigned long flags;
|
||||
long sys_clk_rate;
|
||||
|
||||
sys_clk_rate = __clk_get_rate(sclk);
|
||||
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
|
||||
if (prcm->xtal_speed != sys_clk_rate)
|
||||
if (prcm->xtal_speed != sys_ck_rate)
|
||||
continue;
|
||||
|
||||
if (prcm->mpu_speed <= rate) {
|
||||
|
@ -119,7 +124,7 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
|||
}
|
||||
|
||||
curr_prcm_set = prcm;
|
||||
cur_rate = omap2xxx_clk_get_core_rate(dclk);
|
||||
cur_rate = omap2xxx_clk_get_core_rate();
|
||||
|
||||
if (prcm->dpll_speed == cur_rate / 2) {
|
||||
omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL, 1);
|
||||
|
@ -169,3 +174,50 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2xxx_clkt_vps_check_bootloader_rate - determine which of the rate
|
||||
* table sets matches the current CORE DPLL hardware rate
|
||||
*
|
||||
* Check the MPU rate set by bootloader. Sets the 'curr_prcm_set'
|
||||
* global to point to the active rate set when found; otherwise, sets
|
||||
* it to NULL. No return value;
|
||||
*/
|
||||
void omap2xxx_clkt_vps_check_bootloader_rates(void)
|
||||
{
|
||||
const struct prcm_config *prcm = NULL;
|
||||
unsigned long rate;
|
||||
|
||||
rate = omap2xxx_clk_get_core_rate();
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
if (prcm->xtal_speed != sys_ck_rate)
|
||||
continue;
|
||||
if (prcm->dpll_speed <= rate)
|
||||
break;
|
||||
}
|
||||
curr_prcm_set = prcm;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2xxx_clkt_vps_late_init - store a copy of the sys_ck rate
|
||||
*
|
||||
* Store a copy of the sys_ck rate for later use by the OMAP2xxx DVFS
|
||||
* code. (The sys_ck rate does not -- or rather, must not -- change
|
||||
* during kernel runtime.) Must be called after we have a valid
|
||||
* sys_ck rate, but before the virt_prcm_set clock rate is
|
||||
* recalculated. No return value.
|
||||
*/
|
||||
void omap2xxx_clkt_vps_late_init(void)
|
||||
{
|
||||
struct clk *c;
|
||||
|
||||
c = clk_get(NULL, "sys_ck");
|
||||
if (IS_ERR(c)) {
|
||||
WARN(1, "could not locate sys_ck\n");
|
||||
} else {
|
||||
sys_ck_rate = clk_get_rate(c);
|
||||
clk_put(c);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,9 +21,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/sram.h>
|
||||
#include <plat/sdrc.h>
|
||||
#include "../plat-omap/sram.h"
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock3xxx.h"
|
||||
|
@ -47,8 +45,10 @@
|
|||
* Program the DPLL M2 divider with the rounded target rate. Returns
|
||||
* -EINVAL upon error, or 0 upon success.
|
||||
*/
|
||||
int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
||||
int omap3_core_dpll_m2_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 new_div = 0;
|
||||
u32 unlock_dll = 0;
|
||||
u32 c;
|
||||
|
@ -66,7 +66,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
|||
return -EINVAL;
|
||||
|
||||
sdrcrate = __clk_get_rate(sdrc_ick_p);
|
||||
clkrate = __clk_get_rate(clk);
|
||||
clkrate = __clk_get_rate(hw->clk);
|
||||
if (rate > clkrate)
|
||||
sdrcrate <<= ((rate / clkrate) >> 1);
|
||||
else
|
||||
|
@ -115,8 +115,6 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
|||
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
|
||||
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
|
||||
0, 0, 0, 0);
|
||||
clk->rate = rate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,12 +41,10 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
/* Private functions */
|
||||
|
@ -60,11 +58,14 @@
|
|||
* the element associated with the supplied parent clock address.
|
||||
* Returns a pointer to the struct clksel on success or NULL on error.
|
||||
*/
|
||||
static const struct clksel *_get_clksel_by_parent(struct clk *clk,
|
||||
static const struct clksel *_get_clksel_by_parent(struct clk_hw_omap *clk,
|
||||
struct clk *src_clk)
|
||||
{
|
||||
const struct clksel *clks;
|
||||
|
||||
if (!src_clk)
|
||||
return NULL;
|
||||
|
||||
for (clks = clk->clksel; clks->parent; clks++)
|
||||
if (clks->parent == src_clk)
|
||||
break; /* Found the requested parent */
|
||||
|
@ -72,71 +73,13 @@ static const struct clksel *_get_clksel_by_parent(struct clk *clk,
|
|||
if (!clks->parent) {
|
||||
/* This indicates a data problem */
|
||||
WARN(1, "clock: %s: could not find parent clock %s in clksel array\n",
|
||||
__clk_get_name(clk), __clk_get_name(src_clk));
|
||||
__clk_get_name(clk->hw.clk), __clk_get_name(src_clk));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return clks;
|
||||
}
|
||||
|
||||
/**
|
||||
* _get_div_and_fieldval() - find the new clksel divisor and field value to use
|
||||
* @src_clk: planned new parent struct clk *
|
||||
* @clk: struct clk * that is being reparented
|
||||
* @field_val: pointer to a u32 to contain the register data for the divisor
|
||||
*
|
||||
* Given an intended new parent struct clk * @src_clk, and the struct
|
||||
* clk * @clk to the clock that is being reparented, find the
|
||||
* appropriate rate divisor for the new clock (returned as the return
|
||||
* value), and the corresponding register bitfield data to program to
|
||||
* reach that divisor (returned in the u32 pointed to by @field_val).
|
||||
* Returns 0 on error, or returns the newly-selected divisor upon
|
||||
* success (in this latter case, the corresponding register bitfield
|
||||
* value is passed back in the variable pointed to by @field_val)
|
||||
*/
|
||||
static u8 _get_div_and_fieldval(struct clk *src_clk, struct clk *clk,
|
||||
u32 *field_val)
|
||||
{
|
||||
const struct clksel *clks;
|
||||
const struct clksel_rate *clkr, *max_clkr = NULL;
|
||||
u8 max_div = 0;
|
||||
|
||||
clks = _get_clksel_by_parent(clk, src_clk);
|
||||
if (!clks)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Find the highest divisor (e.g., the one resulting in the
|
||||
* lowest rate) to use as the default. This should avoid
|
||||
* clock rates that are too high for the device. XXX A better
|
||||
* solution here would be to try to determine if there is a
|
||||
* divisor matching the original clock rate before the parent
|
||||
* switch, and if it cannot be found, to fall back to the
|
||||
* highest divisor.
|
||||
*/
|
||||
for (clkr = clks->rates; clkr->div; clkr++) {
|
||||
if (!(clkr->flags & cpu_mask))
|
||||
continue;
|
||||
|
||||
if (clkr->div > max_div) {
|
||||
max_div = clkr->div;
|
||||
max_clkr = clkr;
|
||||
}
|
||||
}
|
||||
|
||||
if (max_div == 0) {
|
||||
/* This indicates an error in the clksel data */
|
||||
WARN(1, "clock: %s: could not find divisor for parent %s\n",
|
||||
__clk_get_name(clk),
|
||||
__clk_get_name(__clk_get_parent(src_clk)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
*field_val = max_clkr->val;
|
||||
|
||||
return max_div;
|
||||
}
|
||||
|
||||
/**
|
||||
* _write_clksel_reg() - program a clock's clksel register in hardware
|
||||
* @clk: struct clk * to program
|
||||
|
@ -150,7 +93,7 @@ static u8 _get_div_and_fieldval(struct clk *src_clk, struct clk *clk,
|
|||
* take into account any time the hardware might take to switch the
|
||||
* clock source.
|
||||
*/
|
||||
static void _write_clksel_reg(struct clk *clk, u32 field_val)
|
||||
static void _write_clksel_reg(struct clk_hw_omap *clk, u32 field_val)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
|
@ -173,13 +116,14 @@ static void _write_clksel_reg(struct clk *clk, u32 field_val)
|
|||
* before calling. Returns 0 on error or returns the actual integer divisor
|
||||
* upon success.
|
||||
*/
|
||||
static u32 _clksel_to_divisor(struct clk *clk, u32 field_val)
|
||||
static u32 _clksel_to_divisor(struct clk_hw_omap *clk, u32 field_val)
|
||||
{
|
||||
const struct clksel *clks;
|
||||
const struct clksel_rate *clkr;
|
||||
struct clk *parent;
|
||||
|
||||
parent = __clk_get_parent(clk);
|
||||
parent = __clk_get_parent(clk->hw.clk);
|
||||
|
||||
clks = _get_clksel_by_parent(clk, parent);
|
||||
if (!clks)
|
||||
return 0;
|
||||
|
@ -195,7 +139,8 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val)
|
|||
if (!clkr->div) {
|
||||
/* This indicates a data error */
|
||||
WARN(1, "clock: %s: could not find fieldval %d for parent %s\n",
|
||||
__clk_get_name(clk), field_val, __clk_get_name(parent));
|
||||
__clk_get_name(clk->hw.clk), field_val,
|
||||
__clk_get_name(parent));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -212,7 +157,7 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val)
|
|||
* register field value _before_ left-shifting (i.e., LSB is at bit
|
||||
* 0); or returns 0xFFFFFFFF (~0) upon error.
|
||||
*/
|
||||
static u32 _divisor_to_clksel(struct clk *clk, u32 div)
|
||||
static u32 _divisor_to_clksel(struct clk_hw_omap *clk, u32 div)
|
||||
{
|
||||
const struct clksel *clks;
|
||||
const struct clksel_rate *clkr;
|
||||
|
@ -221,7 +166,7 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div)
|
|||
/* should never happen */
|
||||
WARN_ON(div == 0);
|
||||
|
||||
parent = __clk_get_parent(clk);
|
||||
parent = __clk_get_parent(clk->hw.clk);
|
||||
clks = _get_clksel_by_parent(clk, parent);
|
||||
if (!clks)
|
||||
return ~0;
|
||||
|
@ -236,7 +181,8 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div)
|
|||
|
||||
if (!clkr->div) {
|
||||
pr_err("clock: %s: could not find divisor %d for parent %s\n",
|
||||
__clk_get_name(clk), div, __clk_get_name(parent));
|
||||
__clk_get_name(clk->hw.clk), div,
|
||||
__clk_get_name(parent));
|
||||
return ~0;
|
||||
}
|
||||
|
||||
|
@ -251,7 +197,7 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div)
|
|||
* into the hardware, convert it into the actual divisor value, and
|
||||
* return it; or return 0 on error.
|
||||
*/
|
||||
static u32 _read_divisor(struct clk *clk)
|
||||
static u32 _read_divisor(struct clk_hw_omap *clk)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
|
@ -279,7 +225,8 @@ static u32 _read_divisor(struct clk *clk)
|
|||
*
|
||||
* Returns the rounded clock rate or returns 0xffffffff on error.
|
||||
*/
|
||||
u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
|
||||
u32 omap2_clksel_round_rate_div(struct clk_hw_omap *clk,
|
||||
unsigned long target_rate,
|
||||
u32 *new_div)
|
||||
{
|
||||
unsigned long test_rate;
|
||||
|
@ -290,9 +237,9 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
|
|||
unsigned long parent_rate;
|
||||
const char *clk_name;
|
||||
|
||||
parent = __clk_get_parent(clk);
|
||||
parent = __clk_get_parent(clk->hw.clk);
|
||||
clk_name = __clk_get_name(clk->hw.clk);
|
||||
parent_rate = __clk_get_rate(parent);
|
||||
clk_name = __clk_get_name(clk);
|
||||
|
||||
if (!clk->clksel || !clk->clksel_mask)
|
||||
return ~0;
|
||||
|
@ -343,27 +290,35 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
|
|||
*/
|
||||
|
||||
/**
|
||||
* omap2_init_clksel_parent() - set a clksel clk's parent field from the hdwr
|
||||
* @clk: OMAP clock struct ptr to use
|
||||
* omap2_clksel_find_parent_index() - return the array index of the current
|
||||
* hardware parent of @hw
|
||||
* @hw: struct clk_hw * to find the current hardware parent of
|
||||
*
|
||||
* Given a pointer @clk to a source-selectable struct clk, read the
|
||||
* hardware register and determine what its parent is currently set
|
||||
* to. Update @clk's .parent field with the appropriate clk ptr. No
|
||||
* return value.
|
||||
* Given a struct clk_hw pointer @hw to the 'hw' member of a struct
|
||||
* clk_hw_omap record representing a source-selectable hardware clock,
|
||||
* read the hardware register and determine what its parent is
|
||||
* currently set to. Intended to be called only by the common clock
|
||||
* framework struct clk_hw_ops.get_parent function pointer. Return
|
||||
* the array index of this parent clock upon success -- there is no
|
||||
* way to return an error, so if we encounter an error, just WARN()
|
||||
* and pretend that we know that we're doing.
|
||||
*/
|
||||
void omap2_init_clksel_parent(struct clk *clk)
|
||||
u8 omap2_clksel_find_parent_index(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
const struct clksel *clks;
|
||||
const struct clksel_rate *clkr;
|
||||
u32 r, found = 0;
|
||||
struct clk *parent;
|
||||
const char *clk_name;
|
||||
int ret = 0, f = 0;
|
||||
|
||||
if (!clk->clksel || !clk->clksel_mask)
|
||||
return;
|
||||
parent = __clk_get_parent(hw->clk);
|
||||
clk_name = __clk_get_name(hw->clk);
|
||||
|
||||
parent = __clk_get_parent(clk);
|
||||
clk_name = __clk_get_name(clk);
|
||||
/* XXX should be able to return an error */
|
||||
WARN((!clk->clksel || !clk->clksel_mask),
|
||||
"clock: %s: attempt to call on a non-clksel clock", clk_name);
|
||||
|
||||
r = __raw_readl(clk->clksel_reg) & clk->clksel_mask;
|
||||
r >>= __ffs(clk->clksel_mask);
|
||||
|
@ -374,27 +329,21 @@ void omap2_init_clksel_parent(struct clk *clk)
|
|||
continue;
|
||||
|
||||
if (clkr->val == r) {
|
||||
if (parent != clks->parent) {
|
||||
pr_debug("clock: %s: inited parent to %s (was %s)\n",
|
||||
clk_name,
|
||||
__clk_get_name(clks->parent),
|
||||
((parent) ?
|
||||
__clk_get_name(parent) :
|
||||
"NULL"));
|
||||
clk_reparent(clk, clks->parent);
|
||||
}
|
||||
found = 1;
|
||||
ret = f;
|
||||
}
|
||||
}
|
||||
f++;
|
||||
}
|
||||
|
||||
/* This indicates a data error */
|
||||
WARN(!found, "clock: %s: init parent: could not find regval %0x\n",
|
||||
clk_name, r);
|
||||
|
||||
return;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* omap2_clksel_recalc() - function ptr to pass via struct clk .recalc field
|
||||
* @clk: struct clk *
|
||||
|
@ -404,21 +353,23 @@ void omap2_init_clksel_parent(struct clk *clk)
|
|||
* function. Returns the clock's current rate, based on its parent's rate
|
||||
* and its current divisor setting in the hardware.
|
||||
*/
|
||||
unsigned long omap2_clksel_recalc(struct clk *clk)
|
||||
unsigned long omap2_clksel_recalc(struct clk_hw *hw, unsigned long parent_rate)
|
||||
{
|
||||
unsigned long rate;
|
||||
u32 div = 0;
|
||||
struct clk *parent;
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
|
||||
if (!parent_rate)
|
||||
return 0;
|
||||
|
||||
div = _read_divisor(clk);
|
||||
if (div == 0)
|
||||
return __clk_get_rate(clk);
|
||||
if (!div)
|
||||
rate = parent_rate;
|
||||
else
|
||||
rate = parent_rate / div;
|
||||
|
||||
parent = __clk_get_parent(clk);
|
||||
rate = __clk_get_rate(parent) / div;
|
||||
|
||||
pr_debug("clock: %s: recalc'd rate is %ld (div %d)\n",
|
||||
__clk_get_name(clk), rate, div);
|
||||
pr_debug("%s: recalc'd %s's rate to %lu (div %d)\n", __func__,
|
||||
__clk_get_name(hw->clk), rate, div);
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
@ -434,8 +385,10 @@ unsigned long omap2_clksel_recalc(struct clk *clk)
|
|||
*
|
||||
* Returns the rounded clock rate or returns 0xffffffff on error.
|
||||
*/
|
||||
long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate)
|
||||
long omap2_clksel_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||
unsigned long *parent_rate)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 new_div;
|
||||
|
||||
return omap2_clksel_round_rate_div(clk, target_rate, &new_div);
|
||||
|
@ -456,8 +409,10 @@ long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate)
|
|||
* is changed, they will all be affected without any notification.
|
||||
* Returns -EINVAL upon error, or 0 upon success.
|
||||
*/
|
||||
int omap2_clksel_set_rate(struct clk *clk, unsigned long rate)
|
||||
int omap2_clksel_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 field_val, validrate, new_div = 0;
|
||||
|
||||
if (!clk->clksel || !clk->clksel_mask)
|
||||
|
@ -473,10 +428,8 @@ int omap2_clksel_set_rate(struct clk *clk, unsigned long rate)
|
|||
|
||||
_write_clksel_reg(clk, field_val);
|
||||
|
||||
clk->rate = __clk_get_rate(__clk_get_parent(clk)) / new_div;
|
||||
|
||||
pr_debug("clock: %s: set rate to %ld\n", __clk_get_name(clk),
|
||||
__clk_get_rate(clk));
|
||||
pr_debug("clock: %s: set rate to %ld\n", __clk_get_name(hw->clk),
|
||||
__clk_get_rate(hw->clk));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -501,32 +454,13 @@ int omap2_clksel_set_rate(struct clk *clk, unsigned long rate)
|
|||
* affected without any notification. Returns -EINVAL upon error, or
|
||||
* 0 upon success.
|
||||
*/
|
||||
int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent)
|
||||
int omap2_clksel_set_parent(struct clk_hw *hw, u8 field_val)
|
||||
{
|
||||
u32 field_val = 0;
|
||||
u32 parent_div;
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
|
||||
if (!clk->clksel || !clk->clksel_mask)
|
||||
return -EINVAL;
|
||||
|
||||
parent_div = _get_div_and_fieldval(new_parent, clk, &field_val);
|
||||
if (!parent_div)
|
||||
return -EINVAL;
|
||||
|
||||
_write_clksel_reg(clk, field_val);
|
||||
|
||||
clk_reparent(clk, new_parent);
|
||||
|
||||
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
||||
clk->rate = __clk_get_rate(new_parent);
|
||||
|
||||
if (parent_div > 0)
|
||||
__clk_get_rate(clk) /= parent_div;
|
||||
|
||||
pr_debug("clock: %s: set parent to %s (new rate %ld)\n",
|
||||
__clk_get_name(clk),
|
||||
__clk_get_name(__clk_get_parent(clk)),
|
||||
__clk_get_rate(clk));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -16,13 +16,11 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "clock.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
@ -78,7 +76,7 @@
|
|||
* (assuming that it is counting N upwards), or -2 if the enclosing loop
|
||||
* should skip to the next iteration (again assuming N is increasing).
|
||||
*/
|
||||
static int _dpll_test_fint(struct clk *clk, u8 n)
|
||||
static int _dpll_test_fint(struct clk_hw_omap *clk, u8 n)
|
||||
{
|
||||
struct dpll_data *dd;
|
||||
long fint, fint_min, fint_max;
|
||||
|
@ -87,7 +85,7 @@ static int _dpll_test_fint(struct clk *clk, u8 n)
|
|||
dd = clk->dpll_data;
|
||||
|
||||
/* DPLL divider must result in a valid jitter correction val */
|
||||
fint = __clk_get_rate(__clk_get_parent(clk)) / n;
|
||||
fint = __clk_get_rate(__clk_get_parent(clk->hw.clk)) / n;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
/* Should not be called for OMAP2, so warn if it is called */
|
||||
|
@ -188,15 +186,15 @@ static int _dpll_test_mult(int *m, int n, unsigned long *new_rate,
|
|||
}
|
||||
|
||||
/* Public functions */
|
||||
|
||||
void omap2_init_dpll_parent(struct clk *clk)
|
||||
u8 omap2_init_dpll_parent(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
u32 v;
|
||||
struct dpll_data *dd;
|
||||
|
||||
dd = clk->dpll_data;
|
||||
if (!dd)
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
v = __raw_readl(dd->control_reg);
|
||||
v &= dd->enable_mask;
|
||||
|
@ -206,18 +204,18 @@ void omap2_init_dpll_parent(struct clk *clk)
|
|||
if (cpu_is_omap24xx()) {
|
||||
if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
|
||||
v == OMAP2XXX_EN_DPLL_FRBYPASS)
|
||||
clk_reparent(clk, dd->clk_bypass);
|
||||
return 1;
|
||||
} else if (cpu_is_omap34xx()) {
|
||||
if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
|
||||
v == OMAP3XXX_EN_DPLL_FRBYPASS)
|
||||
clk_reparent(clk, dd->clk_bypass);
|
||||
return 1;
|
||||
} else if (soc_is_am33xx() || cpu_is_omap44xx()) {
|
||||
if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
|
||||
v == OMAP4XXX_EN_DPLL_FRBYPASS ||
|
||||
v == OMAP4XXX_EN_DPLL_MNBYPASS)
|
||||
clk_reparent(clk, dd->clk_bypass);
|
||||
return 1;
|
||||
}
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -234,7 +232,7 @@ void omap2_init_dpll_parent(struct clk *clk)
|
|||
* locked, or the appropriate bypass rate if the DPLL is bypassed, or 0
|
||||
* if the clock @clk is not a DPLL.
|
||||
*/
|
||||
u32 omap2_get_dpll_rate(struct clk *clk)
|
||||
unsigned long omap2_get_dpll_rate(struct clk_hw_omap *clk)
|
||||
{
|
||||
long long dpll_clk;
|
||||
u32 dpll_mult, dpll_div, v;
|
||||
|
@ -290,8 +288,10 @@ u32 omap2_get_dpll_rate(struct clk *clk)
|
|||
* (expensive) function again. Returns ~0 if the target rate cannot
|
||||
* be rounded, or the rounded rate upon success.
|
||||
*/
|
||||
long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate)
|
||||
long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||
unsigned long *parent_rate)
|
||||
{
|
||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||
int m, n, r, scaled_max_m;
|
||||
unsigned long scaled_rt_rp;
|
||||
unsigned long new_rate = 0;
|
||||
|
@ -305,7 +305,7 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate)
|
|||
dd = clk->dpll_data;
|
||||
|
||||
ref_rate = __clk_get_rate(dd->clk_ref);
|
||||
clk_name = __clk_get_name(clk);
|
||||
clk_name = __clk_get_name(hw->clk);
|
||||
pr_debug("clock: %s: starting DPLL round_rate, target rate %ld\n",
|
||||
clk_name, target_rate);
|
||||
|
||||
|
|
|
@ -11,11 +11,9 @@
|
|||
#undef DEBUG
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
#include <plat/prcm.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
|
@ -25,7 +23,7 @@
|
|||
/* Private functions */
|
||||
|
||||
/* XXX */
|
||||
void omap2_clkt_iclk_allow_idle(struct clk *clk)
|
||||
void omap2_clkt_iclk_allow_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
u32 v, r;
|
||||
|
||||
|
@ -37,7 +35,7 @@ void omap2_clkt_iclk_allow_idle(struct clk *clk)
|
|||
}
|
||||
|
||||
/* XXX */
|
||||
void omap2_clkt_iclk_deny_idle(struct clk *clk)
|
||||
void omap2_clkt_iclk_deny_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
u32 v, r;
|
||||
|
||||
|
@ -50,33 +48,17 @@ void omap2_clkt_iclk_deny_idle(struct clk *clk)
|
|||
|
||||
/* Public data */
|
||||
|
||||
const struct clkops clkops_omap2_iclk_dflt_wait = {
|
||||
.enable = omap2_dflt_clk_enable,
|
||||
.disable = omap2_dflt_clk_disable,
|
||||
.find_companion = omap2_clk_dflt_find_companion,
|
||||
const struct clk_hw_omap_ops clkhwops_iclk = {
|
||||
.allow_idle = omap2_clkt_iclk_allow_idle,
|
||||
.deny_idle = omap2_clkt_iclk_deny_idle,
|
||||
};
|
||||
|
||||
const struct clk_hw_omap_ops clkhwops_iclk_wait = {
|
||||
.allow_idle = omap2_clkt_iclk_allow_idle,
|
||||
.deny_idle = omap2_clkt_iclk_deny_idle,
|
||||
.find_idlest = omap2_clk_dflt_find_idlest,
|
||||
.allow_idle = omap2_clkt_iclk_allow_idle,
|
||||
.deny_idle = omap2_clkt_iclk_deny_idle,
|
||||
};
|
||||
|
||||
const struct clkops clkops_omap2_iclk_dflt = {
|
||||
.enable = omap2_dflt_clk_enable,
|
||||
.disable = omap2_dflt_clk_disable,
|
||||
.allow_idle = omap2_clkt_iclk_allow_idle,
|
||||
.deny_idle = omap2_clkt_iclk_deny_idle,
|
||||
};
|
||||
|
||||
const struct clkops clkops_omap2_iclk_idle_only = {
|
||||
.allow_idle = omap2_clkt_iclk_allow_idle,
|
||||
.deny_idle = omap2_clkt_iclk_deny_idle,
|
||||
};
|
||||
|
||||
const struct clkops clkops_omap2_mdmclk_dflt_wait = {
|
||||
.enable = omap2_dflt_clk_enable,
|
||||
.disable = omap2_dflt_clk_disable,
|
||||
.find_companion = omap2_clk_dflt_find_companion,
|
||||
.find_idlest = omap2_clk_dflt_find_idlest,
|
||||
.allow_idle = omap2_clkt_iclk_allow_idle,
|
||||
.deny_idle = omap2_clkt_iclk_deny_idle,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue