Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
155b2fd3
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
155b2fd3
编写于
9月 16, 2014
作者:
S
Shawn Guo
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'imx/soc' into imx/dt
上级
ee641009
64546e9f
变更
39
隐藏空白更改
内联
并排
Showing
39 changed file
with
521 addition
and
1990 deletion
+521
-1990
arch/arm/boot/dts/vf610-twr.dts
arch/arm/boot/dts/vf610-twr.dts
+0
-1
arch/arm/configs/imx_v4_v5_defconfig
arch/arm/configs/imx_v4_v5_defconfig
+2
-14
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/imx_v6_v7_defconfig
+4
-6
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Kconfig
+8
-103
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/Makefile
+3
-7
arch/arm/mach-imx/anatop.c
arch/arm/mach-imx/anatop.c
+13
-0
arch/arm/mach-imx/board-pcm038.h
arch/arm/mach-imx/board-pcm038.h
+0
-36
arch/arm/mach-imx/clk-gate-exclusive.c
arch/arm/mach-imx/clk-gate-exclusive.c
+94
-0
arch/arm/mach-imx/clk-imx6q.c
arch/arm/mach-imx/clk-imx6q.c
+82
-17
arch/arm/mach-imx/clk-imx6sl.c
arch/arm/mach-imx/clk-imx6sl.c
+86
-17
arch/arm/mach-imx/clk-imx6sx.c
arch/arm/mach-imx/clk-imx6sx.c
+54
-9
arch/arm/mach-imx/clk-pllv3.c
arch/arm/mach-imx/clk-pllv3.c
+0
-37
arch/arm/mach-imx/clk-vf610.c
arch/arm/mach-imx/clk-vf610.c
+19
-2
arch/arm/mach-imx/clk.h
arch/arm/mach-imx/clk.h
+3
-0
arch/arm/mach-imx/common.h
arch/arm/mach-imx/common.h
+0
-2
arch/arm/mach-imx/cpuidle-imx6q.c
arch/arm/mach-imx/cpuidle-imx6q.c
+0
-4
arch/arm/mach-imx/eukrea-baseboards.h
arch/arm/mach-imx/eukrea-baseboards.h
+1
-9
arch/arm/mach-imx/eukrea_mbimx27-baseboard.c
arch/arm/mach-imx/eukrea_mbimx27-baseboard.c
+0
-351
arch/arm/mach-imx/imx1-dt.c
arch/arm/mach-imx/imx1-dt.c
+26
-0
arch/arm/mach-imx/iomux-imx31.c
arch/arm/mach-imx/iomux-imx31.c
+0
-7
arch/arm/mach-imx/iomux-v1.c
arch/arm/mach-imx/iomux-v1.c
+0
-2
arch/arm/mach-imx/iomux-v3.c
arch/arm/mach-imx/iomux-v3.c
+0
-2
arch/arm/mach-imx/mach-armadillo5x0.c
arch/arm/mach-imx/mach-armadillo5x0.c
+1
-1
arch/arm/mach-imx/mach-cpuimx27.c
arch/arm/mach-imx/mach-cpuimx27.c
+0
-321
arch/arm/mach-imx/mach-imx6sx.c
arch/arm/mach-imx/mach-imx6sx.c
+3
-0
arch/arm/mach-imx/mach-mx1ads.c
arch/arm/mach-imx/mach-mx1ads.c
+0
-154
arch/arm/mach-imx/mach-mx31_3ds.c
arch/arm/mach-imx/mach-mx31_3ds.c
+2
-2
arch/arm/mach-imx/mach-mx31lite.c
arch/arm/mach-imx/mach-mx31lite.c
+1
-1
arch/arm/mach-imx/mach-mxt_td60.c
arch/arm/mach-imx/mach-mxt_td60.c
+0
-273
arch/arm/mach-imx/mach-pcm037.c
arch/arm/mach-imx/mach-pcm037.c
+2
-2
arch/arm/mach-imx/mach-pcm038.c
arch/arm/mach-imx/mach-pcm038.c
+0
-358
arch/arm/mach-imx/mxc.h
arch/arm/mach-imx/mxc.h
+2
-0
arch/arm/mach-imx/pcm970-baseboard.c
arch/arm/mach-imx/pcm970-baseboard.c
+0
-231
arch/arm/mach-imx/platsmp.c
arch/arm/mach-imx/platsmp.c
+0
-10
arch/arm/mach-imx/time.c
arch/arm/mach-imx/time.c
+26
-5
include/dt-bindings/clock/imx6qdl-clock.h
include/dt-bindings/clock/imx6qdl-clock.h
+32
-3
include/dt-bindings/clock/imx6sl-clock.h
include/dt-bindings/clock/imx6sl-clock.h
+29
-1
include/dt-bindings/clock/imx6sx-clock.h
include/dt-bindings/clock/imx6sx-clock.h
+24
-1
include/dt-bindings/clock/vf610-clock.h
include/dt-bindings/clock/vf610-clock.h
+4
-1
未找到文件。
arch/arm/boot/dts/vf610-twr.dts
浏览文件 @
155b2fd3
...
...
@@ -76,7 +76,6 @@
simple
-
audio
-
card
,
cpu
{
sound
-
dai
=
<&
sai2
>;
master
-
clkdir
-
out
;
frame
-
master
;
bitclock
-
master
;
};
...
...
arch/arm/configs/imx_v4_v5_defconfig
浏览文件 @
155b2fd3
...
...
@@ -21,8 +21,6 @@ CONFIG_ARCH_MULTI_V4T=y
CONFIG_ARCH_MULTI_V5=y
# CONFIG_ARCH_MULTI_V7 is not set
CONFIG_ARCH_MXC=y
CONFIG_MXC_IRQ_PRIOR=y
CONFIG_ARCH_MX1ADS=y
CONFIG_MACH_SCB9328=y
CONFIG_MACH_APF9328=y
CONFIG_MACH_MX21ADS=y
...
...
@@ -30,10 +28,6 @@ CONFIG_MACH_MX25_3DS=y
CONFIG_MACH_EUKREA_CPUIMX25SD=y
CONFIG_MACH_IMX25_DT=y
CONFIG_MACH_MX27ADS=y
CONFIG_MACH_PCM038=y
CONFIG_MACH_CPUIMX27=y
CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2=y
CONFIG_MACH_EUKREA_CPUIMX27_USEUART4=y
CONFIG_MACH_MX27_3DS=y
CONFIG_MACH_IMX27_VISSTRIM_M10=y
CONFIG_MACH_PCA100=y
...
...
@@ -43,8 +37,6 @@ CONFIG_PREEMPT=y
CONFIG_AEABI=y
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_FPE_NWFPE=y
CONFIG_FPE_NWFPE_XP=y
CONFIG_PM_DEBUG=y
CONFIG_NET=y
CONFIG_PACKET=y
...
...
@@ -63,6 +55,7 @@ CONFIG_NETFILTER=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_IMX_WEIM=y
CONFIG_MTD=y
CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_BLOCK=y
...
...
@@ -78,8 +71,8 @@ CONFIG_MTD_NAND_MXC=y
CONFIG_MTD_UBI=y
CONFIG_EEPROM_AT24=y
CONFIG_EEPROM_AT25=y
CONFIG_ATA=y
CONFIG_BLK_DEV_SD=y
CONFIG_ATA=y
CONFIG_PATA_IMX=y
CONFIG_NETDEVICES=y
CONFIG_CS89x0=y
...
...
@@ -102,10 +95,8 @@ CONFIG_SERIAL_8250=m
CONFIG_SERIAL_IMX=y
CONFIG_SERIAL_IMX_CONSOLE=y
# CONFIG_HW_RANDOM is not set
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_IMX=y
CONFIG_SPI=y
CONFIG_SPI_IMX=y
CONFIG_SPI_SPIDEV=y
CONFIG_GPIO_SYSFS=y
...
...
@@ -132,10 +123,7 @@ CONFIG_VIDEO_CODA=y
CONFIG_SOC_CAMERA_OV2640=y
CONFIG_FB=y
CONFIG_FB_IMX=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_L4F00242T03=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y
CONFIG_SOUND=y
...
...
arch/arm/configs/imx_v6_v7_defconfig
浏览文件 @
155b2fd3
...
...
@@ -32,8 +32,8 @@ CONFIG_MACH_IMX35_DT=y
CONFIG_MACH_PCM043=y
CONFIG_MACH_MX35_3DS=y
CONFIG_MACH_VPR200=y
CONFIG_SOC_IMX51=y
CONFIG_SOC_IMX50=y
CONFIG_SOC_IMX51=y
CONFIG_SOC_IMX53=y
CONFIG_SOC_IMX6Q=y
CONFIG_SOC_IMX6SL=y
...
...
@@ -105,7 +105,6 @@ CONFIG_EEPROM_AT24=y
CONFIG_EEPROM_AT25=y
# CONFIG_SCSI_PROC_FS is not set
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y
...
...
@@ -153,14 +152,12 @@ CONFIG_SERIAL_IMX_CONSOLE=y
CONFIG_SERIAL_FSL_LPUART=y
CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_MXC_RNGA=y
# CONFIG_I2C_COMPAT is not set
CONFIG_I2C_CHARDEV=y
# CONFIG_I2C_HELPER_AUTO is not set
CONFIG_I2C_ALGOPCF=m
CONFIG_I2C_ALGOPCA=m
CONFIG_I2C_IMX=y
CONFIG_SPI=y
CONFIG_SPI_IMX=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_MC9S08DZ60=y
...
...
@@ -198,7 +195,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_L4F00242T03=y
CONFIG_LCD_PLATFORM=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_PWM=y
CONFIG_BACKLIGHT_GPIO=y
CONFIG_FRAMEBUFFER_CONSOLE=y
...
...
@@ -206,6 +202,7 @@ CONFIG_LOGO=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_FSL_SAI=y
CONFIG_SND_IMX_SOC=y
CONFIG_SND_SOC_PHYCORE_AC97=y
CONFIG_SND_SOC_EUKREA_TLV320=y
...
...
@@ -213,6 +210,7 @@ CONFIG_SND_SOC_IMX_WM8962=y
CONFIG_SND_SOC_IMX_SGTL5000=y
CONFIG_SND_SOC_IMX_SPDIF=y
CONFIG_SND_SOC_IMX_MC13783=y
CONFIG_SND_SIMPLE_CARD=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_MXC=y
...
...
@@ -240,6 +238,7 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y
CONFIG_LEDS_TRIGGER_GPIO=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_INTF_DEV_UIE_EMUL=y
CONFIG_RTC_DRV_ISL1208=y
CONFIG_RTC_DRV_PCF8563=y
CONFIG_RTC_DRV_MC13XXX=y
CONFIG_RTC_DRV_MXC=y
...
...
@@ -254,7 +253,6 @@ CONFIG_DRM_IMX_FB_HELPER=y
CONFIG_DRM_IMX_PARALLEL_DISPLAY=y
CONFIG_DRM_IMX_TVE=y
CONFIG_DRM_IMX_LDB=y
CONFIG_DRM_IMX_IPUV3_CORE=y
CONFIG_DRM_IMX_IPUV3=y
CONFIG_DRM_IMX_HDMI=y
# CONFIG_IOMMU_SUPPORT is not set
...
...
arch/arm/mach-imx/Kconfig
浏览文件 @
155b2fd3
...
...
@@ -69,6 +69,7 @@ config SOC_IMX1
select CPU_ARM920T
select IMX_HAVE_IOMUX_V1
select MXC_AVIC
select PINCTRL_IMX1
config SOC_IMX21
bool
...
...
@@ -108,17 +109,6 @@ config SOC_IMX35
if ARCH_MULTI_V4T
comment "MX1 platforms:"
config MACH_MXLADS
bool
config ARCH_MX1ADS
bool "MX1ADS platform"
select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_IMX_UART
select MACH_MXLADS
select SOC_IMX1
help
Say Y here if you are using Motorola MX1ADS/MXLADS boards
config MACH_SCB9328
bool "Synertronixx scb9328"
...
...
@@ -135,6 +125,13 @@ config MACH_APF9328
help
Say Yes here if you are using the Armadeus APF9328 development board
config MACH_IMX1_DT
bool "Support i.MX1 platforms from device tree"
select SOC_IMX1
help
Include support for Freescale i.MX1 based platforms
using the device tree for discovery.
endif
if ARCH_MULTI_V5
...
...
@@ -223,86 +220,6 @@ config MACH_MX27ADS
Include support for MX27ADS platform. This includes specific
configurations for the board and its peripherals.
config MACH_PCM038
bool "Phytec phyCORE-i.MX27 CPU module (pcm038)"
select IMX_HAVE_PLATFORM_IMX2_WDT
select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_MXC_EHCI
select IMX_HAVE_PLATFORM_MXC_NAND
select IMX_HAVE_PLATFORM_MXC_W1
select IMX_HAVE_PLATFORM_SPI_IMX
select USB_ULPI_VIEWPORT if USB_ULPI
select SOC_IMX27
help
Include support for phyCORE-i.MX27 (aka pcm038) platform. This
includes specific configurations for the module and its peripherals.
choice
prompt "Baseboard"
depends on MACH_PCM038
default MACH_PCM970_BASEBOARD
config MACH_PCM970_BASEBOARD
bool "PHYTEC PCM970 development board"
select IMX_HAVE_PLATFORM_IMX_FB
select IMX_HAVE_PLATFORM_MXC_MMC
help
This adds board specific devices that can be found on Phytec's
PCM970 evaluation board.
endchoice
config MACH_CPUIMX27
bool "Eukrea CPUIMX27 module"
select IMX_HAVE_PLATFORM_FSL_USB2_UDC
select IMX_HAVE_PLATFORM_IMX2_WDT
select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_MXC_EHCI
select IMX_HAVE_PLATFORM_MXC_NAND
select IMX_HAVE_PLATFORM_MXC_W1
select USB_ULPI_VIEWPORT if USB_ULPI
select SOC_IMX27
help
Include support for Eukrea CPUIMX27 platform. This includes
specific configurations for the module and its peripherals.
config MACH_EUKREA_CPUIMX27_USESDHC2
bool "CPUIMX27 integrates SDHC2 module"
depends on MACH_CPUIMX27
select IMX_HAVE_PLATFORM_MXC_MMC
help
This adds support for the internal SDHC2 used on CPUIMX27
for wifi or eMMC.
config MACH_EUKREA_CPUIMX27_USEUART4
bool "CPUIMX27 integrates UART4 module"
depends on MACH_CPUIMX27
help
This adds support for the internal UART4 used on CPUIMX27
for bluetooth.
choice
prompt "Baseboard"
depends on MACH_CPUIMX27
default MACH_EUKREA_MBIMX27_BASEBOARD
config MACH_EUKREA_MBIMX27_BASEBOARD
bool "Eukrea MBIMX27 development board"
select IMX_HAVE_PLATFORM_IMX_FB
select IMX_HAVE_PLATFORM_IMX_KEYPAD
select IMX_HAVE_PLATFORM_IMX_SSI
select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_MXC_MMC
select IMX_HAVE_PLATFORM_SPI_IMX
select LEDS_GPIO_REGISTER
help
This adds board specific devices that can be found on Eukrea's
MBIMX27 evaluation board.
endchoice
config MACH_MX27_3DS
bool "MX27PDK platform"
select IMX_HAVE_PLATFORM_FSL_USB2_UDC
...
...
@@ -359,18 +276,6 @@ config MACH_PCA100
Include support for phyCARD-s (aka pca100) platform. This
includes specific configurations for the module and its peripherals.
config MACH_MXT_TD60
bool "Maxtrack i-MXT TD60"
select IMX_HAVE_PLATFORM_IMX_FB
select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_MXC_MMC
select IMX_HAVE_PLATFORM_MXC_NAND
select SOC_IMX27
help
Include support for i-MXT (aka td60) platform. This
includes specific configurations for the module and its peripherals.
config MACH_IMX27_DT
bool "Support i.MX27 platforms from device tree"
select SOC_IMX27
...
...
arch/arm/mach-imx/Makefile
浏览文件 @
155b2fd3
...
...
@@ -16,7 +16,8 @@ obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o clk-imx51-imx53.o $(imx5-pm-y)
obj-$(CONFIG_COMMON_CLK)
+=
clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o
\
clk-pfd.o clk-busy.o clk.o
\
clk-fixup-div.o clk-fixup-mux.o
clk-fixup-div.o clk-fixup-mux.o
\
clk-gate-exclusive.o
obj-$(CONFIG_IMX_HAVE_IOMUX_V1)
+=
iomux-v1.o
obj-$(CONFIG_ARCH_MXC_IOMUX_V3)
+=
iomux-v3.o
...
...
@@ -41,9 +42,9 @@ obj-y += ssi-fiq-ksym.o
endif
# i.MX1 based machines
obj-$(CONFIG_ARCH_MX1ADS)
+=
mach-mx1ads.o
obj-$(CONFIG_MACH_SCB9328)
+=
mach-scb9328.o
obj-$(CONFIG_MACH_APF9328)
+=
mach-apf9328.o
obj-$(CONFIG_MACH_IMX1_DT)
+=
imx1-dt.o
# i.MX21 based machines
obj-$(CONFIG_MACH_MX21ADS)
+=
mach-mx21ads.o
...
...
@@ -56,14 +57,9 @@ obj-$(CONFIG_MACH_IMX25_DT) += imx25-dt.o
# i.MX27 based machines
obj-$(CONFIG_MACH_MX27ADS)
+=
mach-mx27ads.o
obj-$(CONFIG_MACH_PCM038)
+=
mach-pcm038.o
obj-$(CONFIG_MACH_PCM970_BASEBOARD)
+=
pcm970-baseboard.o
obj-$(CONFIG_MACH_MX27_3DS)
+=
mach-mx27_3ds.o
obj-$(CONFIG_MACH_IMX27_VISSTRIM_M10)
+=
mach-imx27_visstrim_m10.o
obj-$(CONFIG_MACH_CPUIMX27)
+=
mach-cpuimx27.o
obj-$(CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD)
+=
eukrea_mbimx27-baseboard.o
obj-$(CONFIG_MACH_PCA100)
+=
mach-pca100.o
obj-$(CONFIG_MACH_MXT_TD60)
+=
mach-mxt_td60.o
obj-$(CONFIG_MACH_IMX27_DT)
+=
imx27-dt.o
# i.MX31 based machines
...
...
arch/arm/mach-imx/anatop.c
浏览文件 @
155b2fd3
...
...
@@ -104,6 +104,19 @@ void __init imx_init_revision_from_anatop(void)
case
2
:
revision
=
IMX_CHIP_REVISION_1_2
;
break
;
case
3
:
revision
=
IMX_CHIP_REVISION_1_3
;
break
;
case
4
:
revision
=
IMX_CHIP_REVISION_1_4
;
break
;
case
5
:
/*
* i.MX6DQ TO1.5 is defined as Rev 1.3 in Data Sheet, marked
* as 'D' in Part Number last character.
*/
revision
=
IMX_CHIP_REVISION_1_5
;
break
;
default:
revision
=
IMX_CHIP_REVISION_UNKNOWN
;
}
...
...
arch/arm/mach-imx/board-pcm038.h
已删除
100644 → 0
浏览文件 @
ee641009
/*
* Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#ifndef __ASM_ARCH_MXC_BOARD_PCM038_H__
#define __ASM_ARCH_MXC_BOARD_PCM038_H__
#ifndef __ASSEMBLY__
/*
* This CPU module needs a baseboard to work. After basic initializing
* its own devices, it calls the baseboard's init function.
* TODO: Add your own baseboard init function and call it from
* inside pcm038_init().
*
* This example here is for the development board. Refer pcm970-baseboard.c
*/
extern
void
pcm970_baseboard_init
(
void
);
#endif
#endif
/* __ASM_ARCH_MXC_BOARD_PCM038_H__ */
arch/arm/mach-imx/clk-gate-exclusive.c
0 → 100644
浏览文件 @
155b2fd3
/*
* Copyright 2014 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/slab.h>
#include "clk.h"
/**
* struct clk_gate_exclusive - i.MX specific gate clock which is mutually
* exclusive with other gate clocks
*
* @gate: the parent class
* @exclusive_mask: mask of gate bits which are mutually exclusive to this
* gate clock
*
* The imx exclusive gate clock is a subclass of basic clk_gate
* with an addtional mask to indicate which other gate bits in the same
* register is mutually exclusive to this gate clock.
*/
struct
clk_gate_exclusive
{
struct
clk_gate
gate
;
u32
exclusive_mask
;
};
static
int
clk_gate_exclusive_enable
(
struct
clk_hw
*
hw
)
{
struct
clk_gate
*
gate
=
container_of
(
hw
,
struct
clk_gate
,
hw
);
struct
clk_gate_exclusive
*
exgate
=
container_of
(
gate
,
struct
clk_gate_exclusive
,
gate
);
u32
val
=
readl
(
gate
->
reg
);
if
(
val
&
exgate
->
exclusive_mask
)
return
-
EBUSY
;
return
clk_gate_ops
.
enable
(
hw
);
}
static
void
clk_gate_exclusive_disable
(
struct
clk_hw
*
hw
)
{
clk_gate_ops
.
disable
(
hw
);
}
static
int
clk_gate_exclusive_is_enabled
(
struct
clk_hw
*
hw
)
{
return
clk_gate_ops
.
is_enabled
(
hw
);
}
static
const
struct
clk_ops
clk_gate_exclusive_ops
=
{
.
enable
=
clk_gate_exclusive_enable
,
.
disable
=
clk_gate_exclusive_disable
,
.
is_enabled
=
clk_gate_exclusive_is_enabled
,
};
struct
clk
*
imx_clk_gate_exclusive
(
const
char
*
name
,
const
char
*
parent
,
void
__iomem
*
reg
,
u8
shift
,
u32
exclusive_mask
)
{
struct
clk_gate_exclusive
*
exgate
;
struct
clk_gate
*
gate
;
struct
clk
*
clk
;
struct
clk_init_data
init
;
if
(
exclusive_mask
==
0
)
return
ERR_PTR
(
-
EINVAL
);
exgate
=
kzalloc
(
sizeof
(
*
exgate
),
GFP_KERNEL
);
if
(
!
exgate
)
return
ERR_PTR
(
-
ENOMEM
);
gate
=
&
exgate
->
gate
;
init
.
name
=
name
;
init
.
ops
=
&
clk_gate_exclusive_ops
;
init
.
flags
=
CLK_SET_RATE_PARENT
;
init
.
parent_names
=
parent
?
&
parent
:
NULL
;
init
.
num_parents
=
parent
?
1
:
0
;
gate
->
reg
=
reg
;
gate
->
bit_idx
=
shift
;
gate
->
lock
=
&
imx_ccm_lock
;
gate
->
hw
.
init
=
&
init
;
exgate
->
exclusive_mask
=
exclusive_mask
;
clk
=
clk_register
(
NULL
,
&
gate
->
hw
);
if
(
IS_ERR
(
clk
))
kfree
(
exgate
);
return
clk
;
}
arch/arm/mach-imx/clk-imx6q.c
浏览文件 @
155b2fd3
...
...
@@ -64,7 +64,7 @@ static const char *cko2_sels[] = {
"ipu2"
,
"vdo_axi"
,
"osc"
,
"gpu2d_core"
,
"gpu3d_core"
,
"usdhc2"
,
"ssi1"
,
"ssi2"
,
"ssi3"
,
"gpu3d_shader"
,
"vpu_axi"
,
"can_root"
,
"ldb_di0"
,
"ldb_di1"
,
"esai"
,
"eim_slow"
,
"ldb_di0"
,
"ldb_di1"
,
"esai
_extal
"
,
"eim_slow"
,
"uart_serial"
,
"spdif"
,
"asrc"
,
"hsi_tx"
,
};
static
const
char
*
cko_sels
[]
=
{
"cko1"
,
"cko2"
,
};
...
...
@@ -73,6 +73,14 @@ static const char *lvds_sels[] = {
"pll4_audio"
,
"pll5_video"
,
"pll8_mlb"
,
"enet_ref"
,
"pcie_ref_125m"
,
"sata_ref_100m"
,
};
static
const
char
*
pll_bypass_src_sels
[]
=
{
"osc"
,
"lvds1_in"
,
"lvds2_in"
,
"dummy"
,
};
static
const
char
*
pll1_bypass_sels
[]
=
{
"pll1"
,
"pll1_bypass_src"
,
};
static
const
char
*
pll2_bypass_sels
[]
=
{
"pll2"
,
"pll2_bypass_src"
,
};
static
const
char
*
pll3_bypass_sels
[]
=
{
"pll3"
,
"pll3_bypass_src"
,
};
static
const
char
*
pll4_bypass_sels
[]
=
{
"pll4"
,
"pll4_bypass_src"
,
};
static
const
char
*
pll5_bypass_sels
[]
=
{
"pll5"
,
"pll5_bypass_src"
,
};
static
const
char
*
pll6_bypass_sels
[]
=
{
"pll6"
,
"pll6_bypass_src"
,
};
static
const
char
*
pll7_bypass_sels
[]
=
{
"pll7"
,
"pll7_bypass_src"
,
};
static
struct
clk
*
clk
[
IMX6QDL_CLK_END
];
static
struct
clk_onecell_data
clk_data
;
...
...
@@ -107,6 +115,10 @@ static struct clk_div_table video_div_table[] = {
};
static
unsigned
int
share_count_esai
;
static
unsigned
int
share_count_asrc
;
static
unsigned
int
share_count_ssi1
;
static
unsigned
int
share_count_ssi2
;
static
unsigned
int
share_count_ssi3
;
static
void
__init
imx6q_clocks_init
(
struct
device_node
*
ccm_node
)
{
...
...
@@ -119,6 +131,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk
[
IMX6QDL_CLK_CKIL
]
=
imx_obtain_fixed_clock
(
"ckil"
,
0
);
clk
[
IMX6QDL_CLK_CKIH
]
=
imx_obtain_fixed_clock
(
"ckih1"
,
0
);
clk
[
IMX6QDL_CLK_OSC
]
=
imx_obtain_fixed_clock
(
"osc"
,
0
);
/* Clock source from external clock via CLK1/2 PADs */
clk
[
IMX6QDL_CLK_ANACLK1
]
=
imx_obtain_fixed_clock
(
"anaclk1"
,
0
);
clk
[
IMX6QDL_CLK_ANACLK2
]
=
imx_obtain_fixed_clock
(
"anaclk2"
,
0
);
np
=
of_find_compatible_node
(
NULL
,
NULL
,
"fsl,imx6q-anatop"
);
base
=
of_iomap
(
np
,
0
);
...
...
@@ -132,14 +147,47 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
video_div_table
[
2
].
div
=
1
;
};
/* type name parent_name base div_mask */
clk
[
IMX6QDL_CLK_PLL1_SYS
]
=
imx_clk_pllv3
(
IMX_PLLV3_SYS
,
"pll1_sys"
,
"osc"
,
base
,
0x7f
);
clk
[
IMX6QDL_CLK_PLL2_BUS
]
=
imx_clk_pllv3
(
IMX_PLLV3_GENERIC
,
"pll2_bus"
,
"osc"
,
base
+
0x30
,
0x1
);
clk
[
IMX6QDL_CLK_PLL3_USB_OTG
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll3_usb_otg"
,
"osc"
,
base
+
0x10
,
0x3
);
clk
[
IMX6QDL_CLK_PLL4_AUDIO
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll4_audio"
,
"osc"
,
base
+
0x70
,
0x7f
);
clk
[
IMX6QDL_CLK_PLL5_VIDEO
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll5_video"
,
"osc"
,
base
+
0xa0
,
0x7f
);
clk
[
IMX6QDL_CLK_PLL6_ENET
]
=
imx_clk_pllv3
(
IMX_PLLV3_ENET
,
"pll6_enet"
,
"osc"
,
base
+
0xe0
,
0x3
);
clk
[
IMX6QDL_CLK_PLL7_USB_HOST
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7_usb_host"
,
"osc"
,
base
+
0x20
,
0x3
);
clk
[
IMX6QDL_PLL1_BYPASS_SRC
]
=
imx_clk_mux
(
"pll1_bypass_src"
,
base
+
0x00
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clk
[
IMX6QDL_PLL2_BYPASS_SRC
]
=
imx_clk_mux
(
"pll2_bypass_src"
,
base
+
0x30
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clk
[
IMX6QDL_PLL3_BYPASS_SRC
]
=
imx_clk_mux
(
"pll3_bypass_src"
,
base
+
0x10
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clk
[
IMX6QDL_PLL4_BYPASS_SRC
]
=
imx_clk_mux
(
"pll4_bypass_src"
,
base
+
0x70
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clk
[
IMX6QDL_PLL5_BYPASS_SRC
]
=
imx_clk_mux
(
"pll5_bypass_src"
,
base
+
0xa0
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clk
[
IMX6QDL_PLL6_BYPASS_SRC
]
=
imx_clk_mux
(
"pll6_bypass_src"
,
base
+
0xe0
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clk
[
IMX6QDL_PLL7_BYPASS_SRC
]
=
imx_clk_mux
(
"pll7_bypass_src"
,
base
+
0x20
,
14
,
2
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
/* type name parent_name base div_mask */
clk
[
IMX6QDL_CLK_PLL1
]
=
imx_clk_pllv3
(
IMX_PLLV3_SYS
,
"pll1"
,
"pll1_bypass_src"
,
base
+
0x00
,
0x7f
);
clk
[
IMX6QDL_CLK_PLL2
]
=
imx_clk_pllv3
(
IMX_PLLV3_GENERIC
,
"pll2"
,
"pll2_bypass_src"
,
base
+
0x30
,
0x1
);
clk
[
IMX6QDL_CLK_PLL3
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll3"
,
"pll3_bypass_src"
,
base
+
0x10
,
0x3
);
clk
[
IMX6QDL_CLK_PLL4
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll4"
,
"pll4_bypass_src"
,
base
+
0x70
,
0x7f
);
clk
[
IMX6QDL_CLK_PLL5
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll5"
,
"pll5_bypass_src"
,
base
+
0xa0
,
0x7f
);
clk
[
IMX6QDL_CLK_PLL6
]
=
imx_clk_pllv3
(
IMX_PLLV3_ENET
,
"pll6"
,
"pll6_bypass_src"
,
base
+
0xe0
,
0x3
);
clk
[
IMX6QDL_CLK_PLL7
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7"
,
"pll7_bypass_src"
,
base
+
0x20
,
0x3
);
clk
[
IMX6QDL_PLL1_BYPASS
]
=
imx_clk_mux_flags
(
"pll1_bypass"
,
base
+
0x00
,
16
,
1
,
pll1_bypass_sels
,
ARRAY_SIZE
(
pll1_bypass_sels
),
CLK_SET_RATE_PARENT
);
clk
[
IMX6QDL_PLL2_BYPASS
]
=
imx_clk_mux_flags
(
"pll2_bypass"
,
base
+
0x30
,
16
,
1
,
pll2_bypass_sels
,
ARRAY_SIZE
(
pll2_bypass_sels
),
CLK_SET_RATE_PARENT
);
clk
[
IMX6QDL_PLL3_BYPASS
]
=
imx_clk_mux_flags
(
"pll3_bypass"
,
base
+
0x10
,
16
,
1
,
pll3_bypass_sels
,
ARRAY_SIZE
(
pll3_bypass_sels
),
CLK_SET_RATE_PARENT
);
clk
[
IMX6QDL_PLL4_BYPASS
]
=
imx_clk_mux_flags
(
"pll4_bypass"
,
base
+
0x70
,
16
,
1
,
pll4_bypass_sels
,
ARRAY_SIZE
(
pll4_bypass_sels
),
CLK_SET_RATE_PARENT
);
clk
[
IMX6QDL_PLL5_BYPASS
]
=
imx_clk_mux_flags
(
"pll5_bypass"
,
base
+
0xa0
,
16
,
1
,
pll5_bypass_sels
,
ARRAY_SIZE
(
pll5_bypass_sels
),
CLK_SET_RATE_PARENT
);
clk
[
IMX6QDL_PLL6_BYPASS
]
=
imx_clk_mux_flags
(
"pll6_bypass"
,
base
+
0xe0
,
16
,
1
,
pll6_bypass_sels
,
ARRAY_SIZE
(
pll6_bypass_sels
),
CLK_SET_RATE_PARENT
);
clk
[
IMX6QDL_PLL7_BYPASS
]
=
imx_clk_mux_flags
(
"pll7_bypass"
,
base
+
0x20
,
16
,
1
,
pll7_bypass_sels
,
ARRAY_SIZE
(
pll7_bypass_sels
),
CLK_SET_RATE_PARENT
);
/* Do not bypass PLLs initially */
clk_set_parent
(
clk
[
IMX6QDL_PLL1_BYPASS
],
clk
[
IMX6QDL_CLK_PLL1
]);
clk_set_parent
(
clk
[
IMX6QDL_PLL2_BYPASS
],
clk
[
IMX6QDL_CLK_PLL2
]);
clk_set_parent
(
clk
[
IMX6QDL_PLL3_BYPASS
],
clk
[
IMX6QDL_CLK_PLL3
]);
clk_set_parent
(
clk
[
IMX6QDL_PLL4_BYPASS
],
clk
[
IMX6QDL_CLK_PLL4
]);
clk_set_parent
(
clk
[
IMX6QDL_PLL5_BYPASS
],
clk
[
IMX6QDL_CLK_PLL5
]);
clk_set_parent
(
clk
[
IMX6QDL_PLL6_BYPASS
],
clk
[
IMX6QDL_CLK_PLL6
]);
clk_set_parent
(
clk
[
IMX6QDL_PLL7_BYPASS
],
clk
[
IMX6QDL_CLK_PLL7
]);
clk
[
IMX6QDL_CLK_PLL1_SYS
]
=
imx_clk_gate
(
"pll1_sys"
,
"pll1_bypass"
,
base
+
0x00
,
13
);
clk
[
IMX6QDL_CLK_PLL2_BUS
]
=
imx_clk_gate
(
"pll2_bus"
,
"pll2_bypass"
,
base
+
0x30
,
13
);
clk
[
IMX6QDL_CLK_PLL3_USB_OTG
]
=
imx_clk_gate
(
"pll3_usb_otg"
,
"pll3_bypass"
,
base
+
0x10
,
13
);
clk
[
IMX6QDL_CLK_PLL4_AUDIO
]
=
imx_clk_gate
(
"pll4_audio"
,
"pll4_bypass"
,
base
+
0x70
,
13
);
clk
[
IMX6QDL_CLK_PLL5_VIDEO
]
=
imx_clk_gate
(
"pll5_video"
,
"pll5_bypass"
,
base
+
0xa0
,
13
);
clk
[
IMX6QDL_CLK_PLL6_ENET
]
=
imx_clk_gate
(
"pll6_enet"
,
"pll6_bypass"
,
base
+
0xe0
,
13
);
clk
[
IMX6QDL_CLK_PLL7_USB_HOST
]
=
imx_clk_gate
(
"pll7_usb_host"
,
"pll7_bypass"
,
base
+
0x20
,
13
);
/*
* Bit 20 is the reserved and read-only bit, we do this only for:
...
...
@@ -176,8 +224,11 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
* the "output_enable" bit as a gate, even though it's really just
* enabling clock output.
*/
clk
[
IMX6QDL_CLK_LVDS1_GATE
]
=
imx_clk_gate
(
"lvds1_gate"
,
"lvds1_sel"
,
base
+
0x160
,
10
);
clk
[
IMX6QDL_CLK_LVDS2_GATE
]
=
imx_clk_gate
(
"lvds2_gate"
,
"lvds2_sel"
,
base
+
0x160
,
11
);
clk
[
IMX6QDL_CLK_LVDS1_GATE
]
=
imx_clk_gate_exclusive
(
"lvds1_gate"
,
"lvds1_sel"
,
base
+
0x160
,
10
,
BIT
(
12
));
clk
[
IMX6QDL_CLK_LVDS2_GATE
]
=
imx_clk_gate_exclusive
(
"lvds2_gate"
,
"lvds2_sel"
,
base
+
0x160
,
11
,
BIT
(
13
));
clk
[
IMX6QDL_CLK_LVDS1_IN
]
=
imx_clk_gate_exclusive
(
"lvds1_in"
,
"anaclk1"
,
base
+
0x160
,
12
,
BIT
(
10
));
clk
[
IMX6QDL_CLK_LVDS2_IN
]
=
imx_clk_gate_exclusive
(
"lvds2_in"
,
"anaclk2"
,
base
+
0x160
,
13
,
BIT
(
11
));
/* name parent_name reg idx */
clk
[
IMX6QDL_CLK_PLL2_PFD0_352M
]
=
imx_clk_pfd
(
"pll2_pfd0_352m"
,
"pll2_bus"
,
base
+
0x100
,
0
);
...
...
@@ -194,6 +245,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk
[
IMX6QDL_CLK_PLL3_80M
]
=
imx_clk_fixed_factor
(
"pll3_80m"
,
"pll3_usb_otg"
,
1
,
6
);
clk
[
IMX6QDL_CLK_PLL3_60M
]
=
imx_clk_fixed_factor
(
"pll3_60m"
,
"pll3_usb_otg"
,
1
,
8
);
clk
[
IMX6QDL_CLK_TWD
]
=
imx_clk_fixed_factor
(
"twd"
,
"arm"
,
1
,
2
);
clk
[
IMX6QDL_CLK_GPT_3M
]
=
imx_clk_fixed_factor
(
"gpt_3m"
,
"osc"
,
1
,
8
);
if
(
cpu_is_imx6dl
())
{
clk
[
IMX6QDL_CLK_GPU2D_AXI
]
=
imx_clk_fixed_factor
(
"gpu2d_axi"
,
"mmdc_ch0_axi_podf"
,
1
,
1
);
clk
[
IMX6QDL_CLK_GPU3D_AXI
]
=
imx_clk_fixed_factor
(
"gpu3d_axi"
,
"mmdc_ch0_axi_podf"
,
1
,
1
);
...
...
@@ -317,7 +369,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
/* name parent_name reg shift */
clk
[
IMX6QDL_CLK_APBH_DMA
]
=
imx_clk_gate2
(
"apbh_dma"
,
"usdhc3"
,
base
+
0x68
,
4
);
clk
[
IMX6QDL_CLK_ASRC
]
=
imx_clk_gate2
(
"asrc"
,
"asrc_podf"
,
base
+
0x68
,
6
);
clk
[
IMX6QDL_CLK_ASRC
]
=
imx_clk_gate2_shared
(
"asrc"
,
"asrc_podf"
,
base
+
0x68
,
6
,
&
share_count_asrc
);
clk
[
IMX6QDL_CLK_ASRC_IPG
]
=
imx_clk_gate2_shared
(
"asrc_ipg"
,
"ahb"
,
base
+
0x68
,
6
,
&
share_count_asrc
);
clk
[
IMX6QDL_CLK_ASRC_MEM
]
=
imx_clk_gate2_shared
(
"asrc_mem"
,
"ahb"
,
base
+
0x68
,
6
,
&
share_count_asrc
);
clk
[
IMX6QDL_CLK_CAN1_IPG
]
=
imx_clk_gate2
(
"can1_ipg"
,
"ipg"
,
base
+
0x68
,
14
);
clk
[
IMX6QDL_CLK_CAN1_SERIAL
]
=
imx_clk_gate2
(
"can1_serial"
,
"can_root"
,
base
+
0x68
,
16
);
clk
[
IMX6QDL_CLK_CAN2_IPG
]
=
imx_clk_gate2
(
"can2_ipg"
,
"ipg"
,
base
+
0x68
,
18
);
...
...
@@ -331,8 +385,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
else
clk
[
IMX6Q_CLK_ECSPI5
]
=
imx_clk_gate2
(
"ecspi5"
,
"ecspi_root"
,
base
+
0x6c
,
8
);
clk
[
IMX6QDL_CLK_ENET
]
=
imx_clk_gate2
(
"enet"
,
"ipg"
,
base
+
0x6c
,
10
);
clk
[
IMX6QDL_CLK_ESAI
]
=
imx_clk_gate2_shared
(
"esai"
,
"esai_podf"
,
base
+
0x6c
,
16
,
&
share_count_esai
);
clk
[
IMX6QDL_CLK_ESAI_AHB
]
=
imx_clk_gate2_shared
(
"esai_ahb"
,
"ahb"
,
base
+
0x6c
,
16
,
&
share_count_esai
);
clk
[
IMX6QDL_CLK_ESAI_EXTAL
]
=
imx_clk_gate2_shared
(
"esai_extal"
,
"esai_podf"
,
base
+
0x6c
,
16
,
&
share_count_esai
);
clk
[
IMX6QDL_CLK_ESAI_IPG
]
=
imx_clk_gate2_shared
(
"esai_ipg"
,
"ipg"
,
base
+
0x6c
,
16
,
&
share_count_esai
);
clk
[
IMX6QDL_CLK_ESAI_MEM
]
=
imx_clk_gate2_shared
(
"esai_mem"
,
"ahb"
,
base
+
0x6c
,
16
,
&
share_count_esai
);
clk
[
IMX6QDL_CLK_GPT_IPG
]
=
imx_clk_gate2
(
"gpt_ipg"
,
"ipg"
,
base
+
0x6c
,
20
);
clk
[
IMX6QDL_CLK_GPT_IPG_PER
]
=
imx_clk_gate2
(
"gpt_ipg_per"
,
"ipg_per"
,
base
+
0x6c
,
22
);
if
(
cpu_is_imx6dl
())
...
...
@@ -388,9 +443,12 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk
[
IMX6QDL_CLK_SDMA
]
=
imx_clk_gate2
(
"sdma"
,
"ahb"
,
base
+
0x7c
,
6
);
clk
[
IMX6QDL_CLK_SPBA
]
=
imx_clk_gate2
(
"spba"
,
"ipg"
,
base
+
0x7c
,
12
);
clk
[
IMX6QDL_CLK_SPDIF
]
=
imx_clk_gate2
(
"spdif"
,
"spdif_podf"
,
base
+
0x7c
,
14
);
clk
[
IMX6QDL_CLK_SSI1_IPG
]
=
imx_clk_gate2
(
"ssi1_ipg"
,
"ipg"
,
base
+
0x7c
,
18
);
clk
[
IMX6QDL_CLK_SSI2_IPG
]
=
imx_clk_gate2
(
"ssi2_ipg"
,
"ipg"
,
base
+
0x7c
,
20
);
clk
[
IMX6QDL_CLK_SSI3_IPG
]
=
imx_clk_gate2
(
"ssi3_ipg"
,
"ipg"
,
base
+
0x7c
,
22
);
clk
[
IMX6QDL_CLK_SSI1_IPG
]
=
imx_clk_gate2_shared
(
"ssi1_ipg"
,
"ipg"
,
base
+
0x7c
,
18
,
&
share_count_ssi1
);
clk
[
IMX6QDL_CLK_SSI2_IPG
]
=
imx_clk_gate2_shared
(
"ssi2_ipg"
,
"ipg"
,
base
+
0x7c
,
20
,
&
share_count_ssi2
);
clk
[
IMX6QDL_CLK_SSI3_IPG
]
=
imx_clk_gate2_shared
(
"ssi3_ipg"
,
"ipg"
,
base
+
0x7c
,
22
,
&
share_count_ssi3
);
clk
[
IMX6QDL_CLK_SSI1
]
=
imx_clk_gate2_shared
(
"ssi1"
,
"ssi1_podf"
,
base
+
0x7c
,
18
,
&
share_count_ssi1
);
clk
[
IMX6QDL_CLK_SSI2
]
=
imx_clk_gate2_shared
(
"ssi2"
,
"ssi2_podf"
,
base
+
0x7c
,
20
,
&
share_count_ssi2
);
clk
[
IMX6QDL_CLK_SSI3
]
=
imx_clk_gate2_shared
(
"ssi3"
,
"ssi3_podf"
,
base
+
0x7c
,
22
,
&
share_count_ssi3
);
clk
[
IMX6QDL_CLK_UART_IPG
]
=
imx_clk_gate2
(
"uart_ipg"
,
"ipg"
,
base
+
0x7c
,
24
);
clk
[
IMX6QDL_CLK_UART_SERIAL
]
=
imx_clk_gate2
(
"uart_serial"
,
"uart_serial_podf"
,
base
+
0x7c
,
26
);
clk
[
IMX6QDL_CLK_USBOH3
]
=
imx_clk_gate2
(
"usboh3"
,
"ipg"
,
base
+
0x80
,
0
);
...
...
@@ -404,6 +462,13 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
clk
[
IMX6QDL_CLK_CKO1
]
=
imx_clk_gate
(
"cko1"
,
"cko1_podf"
,
base
+
0x60
,
7
);
clk
[
IMX6QDL_CLK_CKO2
]
=
imx_clk_gate
(
"cko2"
,
"cko2_podf"
,
base
+
0x60
,
24
);
/*
* The gpt_3m clock is not available on i.MX6Q TO1.0. Let's point it
* to clock gpt_ipg_per to ease the gpt driver code.
*/
if
(
cpu_is_imx6q
()
&&
imx_get_soc_revision
()
==
IMX_CHIP_REVISION_1_0
)
clk
[
IMX6QDL_CLK_GPT_3M
]
=
clk
[
IMX6QDL_CLK_GPT_IPG_PER
];
imx_check_clocks
(
clk
,
ARRAY_SIZE
(
clk
));
clk_data
.
clks
=
clk
;
...
...
arch/arm/mach-imx/clk-imx6sl.c
浏览文件 @
155b2fd3
...
...
@@ -43,11 +43,13 @@ static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy",
static
const
char
*
periph2_clk2_sels
[]
=
{
"pll3_usb_otg"
,
"pll2_bus"
,
};
static
const
char
*
periph_sels
[]
=
{
"pre_periph_sel"
,
"periph_clk2_podf"
,
};
static
const
char
*
periph2_sels
[]
=
{
"pre_periph2_sel"
,
"periph2_clk2_podf"
,
};
static
const
char
*
csi_lcdif_sels
[]
=
{
"mmdc"
,
"pll2_pfd2"
,
"pll3_120m"
,
"pll3_pfd1"
,
};
static
const
char
*
csi_sels
[]
=
{
"osc"
,
"pll2_pfd2"
,
"pll3_120m"
,
"pll3_pfd1"
,
};
static
const
char
*
lcdif_axi_sels
[]
=
{
"pll2_bus"
,
"pll2_pfd2"
,
"pll3_usb_otg"
,
"pll3_pfd1"
,
};
static
const
char
*
usdhc_sels
[]
=
{
"pll2_pfd2"
,
"pll2_pfd0"
,
};
static
const
char
*
ssi_sels
[]
=
{
"pll3_pfd2"
,
"pll3_pfd3"
,
"pll4_audio_div"
,
"dummy"
,
};
static
const
char
*
perclk_sels
[]
=
{
"ipg"
,
"osc"
,
};
static
const
char
*
epdc_pxp_sels
[]
=
{
"mmdc"
,
"pll3_usb_otg"
,
"pll5_video_div"
,
"pll2_pfd0"
,
"pll2_pfd2"
,
"pll3_pfd1"
,
};
static
const
char
*
pxp_axi_sels
[]
=
{
"pll2_bus"
,
"pll3_usb_otg"
,
"pll5_video_div"
,
"pll2_pfd0"
,
"pll2_pfd2"
,
"pll3_pfd3"
,
};
static
const
char
*
epdc_axi_sels
[]
=
{
"pll2_bus"
,
"pll3_usb_otg"
,
"pll5_video_div"
,
"pll2_pfd0"
,
"pll2_pfd2"
,
"pll3_pfd2"
,
};
static
const
char
*
gpu2d_ovg_sels
[]
=
{
"pll3_pfd1"
,
"pll3_usb_otg"
,
"pll2_bus"
,
"pll2_pfd2"
,
};
static
const
char
*
gpu2d_sels
[]
=
{
"pll2_pfd2"
,
"pll3_usb_otg"
,
"pll3_pfd1"
,
"pll2_bus"
,
};
static
const
char
*
lcdif_pix_sels
[]
=
{
"pll2_bus"
,
"pll3_usb_otg"
,
"pll5_video_div"
,
"pll2_pfd0"
,
"pll3_pfd0"
,
"pll3_pfd1"
,
};
...
...
@@ -55,6 +57,20 @@ static const char *epdc_pix_sels[] = { "pll2_bus", "pll3_usb_otg", "pll5_video_d
static
const
char
*
audio_sels
[]
=
{
"pll4_audio_div"
,
"pll3_pfd2"
,
"pll3_pfd3"
,
"pll3_usb_otg"
,
};
static
const
char
*
ecspi_sels
[]
=
{
"pll3_60m"
,
"osc"
,
};
static
const
char
*
uart_sels
[]
=
{
"pll3_80m"
,
"osc"
,
};
static
const
char
*
lvds_sels
[]
=
{
"pll1_sys"
,
"pll2_bus"
,
"pll2_pfd0"
,
"pll2_pfd1"
,
"pll2_pfd2"
,
"dummy"
,
"pll4_audio"
,
"pll5_video"
,
"dummy"
,
"enet_ref"
,
"dummy"
,
"dummy"
,
"pll3_usb_otg"
,
"pll7_usb_host"
,
"pll3_pfd0"
,
"pll3_pfd1"
,
"pll3_pfd2"
,
"pll3_pfd3"
,
"osc"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
};
static
const
char
*
pll_bypass_src_sels
[]
=
{
"osc"
,
"lvds1_in"
,
};
static
const
char
*
pll1_bypass_sels
[]
=
{
"pll1"
,
"pll1_bypass_src"
,
};
static
const
char
*
pll2_bypass_sels
[]
=
{
"pll2"
,
"pll2_bypass_src"
,
};
static
const
char
*
pll3_bypass_sels
[]
=
{
"pll3"
,
"pll3_bypass_src"
,
};
static
const
char
*
pll4_bypass_sels
[]
=
{
"pll4"
,
"pll4_bypass_src"
,
};
static
const
char
*
pll5_bypass_sels
[]
=
{
"pll5"
,
"pll5_bypass_src"
,
};
static
const
char
*
pll6_bypass_sels
[]
=
{
"pll6"
,
"pll6_bypass_src"
,
};
static
const
char
*
pll7_bypass_sels
[]
=
{
"pll7"
,
"pll7_bypass_src"
,
};
static
struct
clk_div_table
clk_enet_ref_table
[]
=
{
{
.
val
=
0
,
.
div
=
20
,
},
...
...
@@ -79,6 +95,10 @@ static struct clk_div_table video_div_table[] = {
{
}
};
static
unsigned
int
share_count_ssi1
;
static
unsigned
int
share_count_ssi2
;
static
unsigned
int
share_count_ssi3
;
static
struct
clk
*
clks
[
IMX6SL_CLK_END
];
static
struct
clk_onecell_data
clk_data
;
static
void
__iomem
*
ccm_base
;
...
...
@@ -175,20 +195,59 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
clks
[
IMX6SL_CLK_DUMMY
]
=
imx_clk_fixed
(
"dummy"
,
0
);
clks
[
IMX6SL_CLK_CKIL
]
=
imx_obtain_fixed_clock
(
"ckil"
,
0
);
clks
[
IMX6SL_CLK_OSC
]
=
imx_obtain_fixed_clock
(
"osc"
,
0
);
/* Clock source from external clock via CLK1 PAD */
clks
[
IMX6SL_CLK_ANACLK1
]
=
imx_obtain_fixed_clock
(
"anaclk1"
,
0
);
np
=
of_find_compatible_node
(
NULL
,
NULL
,
"fsl,imx6sl-anatop"
);
base
=
of_iomap
(
np
,
0
);
WARN_ON
(
!
base
);
anatop_base
=
base
;
/* type name parent base div_mask */
clks
[
IMX6SL_CLK_PLL1_SYS
]
=
imx_clk_pllv3
(
IMX_PLLV3_SYS
,
"pll1_sys"
,
"osc"
,
base
,
0x7f
);
clks
[
IMX6SL_CLK_PLL2_BUS
]
=
imx_clk_pllv3
(
IMX_PLLV3_GENERIC
,
"pll2_bus"
,
"osc"
,
base
+
0x30
,
0x1
);
clks
[
IMX6SL_CLK_PLL3_USB_OTG
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll3_usb_otg"
,
"osc"
,
base
+
0x10
,
0x3
);
clks
[
IMX6SL_CLK_PLL4_AUDIO
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll4_audio"
,
"osc"
,
base
+
0x70
,
0x7f
);
clks
[
IMX6SL_CLK_PLL5_VIDEO
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll5_video"
,
"osc"
,
base
+
0xa0
,
0x7f
);
clks
[
IMX6SL_CLK_PLL6_ENET
]
=
imx_clk_pllv3
(
IMX_PLLV3_ENET
,
"pll6_enet"
,
"osc"
,
base
+
0xe0
,
0x3
);
clks
[
IMX6SL_CLK_PLL7_USB_HOST
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7_usb_host"
,
"osc"
,
base
+
0x20
,
0x3
);
clks
[
IMX6SL_PLL1_BYPASS_SRC
]
=
imx_clk_mux
(
"pll1_bypass_src"
,
base
+
0x00
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SL_PLL2_BYPASS_SRC
]
=
imx_clk_mux
(
"pll2_bypass_src"
,
base
+
0x30
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SL_PLL3_BYPASS_SRC
]
=
imx_clk_mux
(
"pll3_bypass_src"
,
base
+
0x10
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SL_PLL4_BYPASS_SRC
]
=
imx_clk_mux
(
"pll4_bypass_src"
,
base
+
0x70
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SL_PLL5_BYPASS_SRC
]
=
imx_clk_mux
(
"pll5_bypass_src"
,
base
+
0xa0
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SL_PLL6_BYPASS_SRC
]
=
imx_clk_mux
(
"pll6_bypass_src"
,
base
+
0xe0
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SL_PLL7_BYPASS_SRC
]
=
imx_clk_mux
(
"pll7_bypass_src"
,
base
+
0x20
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
/* type name parent_name base div_mask */
clks
[
IMX6SL_CLK_PLL1
]
=
imx_clk_pllv3
(
IMX_PLLV3_SYS
,
"pll1"
,
"pll1_bypass_src"
,
base
+
0x00
,
0x7f
);
clks
[
IMX6SL_CLK_PLL2
]
=
imx_clk_pllv3
(
IMX_PLLV3_GENERIC
,
"pll2"
,
"pll2_bypass_src"
,
base
+
0x30
,
0x1
);
clks
[
IMX6SL_CLK_PLL3
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll3"
,
"pll3_bypass_src"
,
base
+
0x10
,
0x3
);
clks
[
IMX6SL_CLK_PLL4
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll4"
,
"pll4_bypass_src"
,
base
+
0x70
,
0x7f
);
clks
[
IMX6SL_CLK_PLL5
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll5"
,
"pll5_bypass_src"
,
base
+
0xa0
,
0x7f
);
clks
[
IMX6SL_CLK_PLL6
]
=
imx_clk_pllv3
(
IMX_PLLV3_ENET
,
"pll6"
,
"pll6_bypass_src"
,
base
+
0xe0
,
0x3
);
clks
[
IMX6SL_CLK_PLL7
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7"
,
"pll7_bypass_src"
,
base
+
0x20
,
0x3
);
clks
[
IMX6SL_PLL1_BYPASS
]
=
imx_clk_mux_flags
(
"pll1_bypass"
,
base
+
0x00
,
16
,
1
,
pll1_bypass_sels
,
ARRAY_SIZE
(
pll1_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SL_PLL2_BYPASS
]
=
imx_clk_mux_flags
(
"pll2_bypass"
,
base
+
0x30
,
16
,
1
,
pll2_bypass_sels
,
ARRAY_SIZE
(
pll2_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SL_PLL3_BYPASS
]
=
imx_clk_mux_flags
(
"pll3_bypass"
,
base
+
0x10
,
16
,
1
,
pll3_bypass_sels
,
ARRAY_SIZE
(
pll3_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SL_PLL4_BYPASS
]
=
imx_clk_mux_flags
(
"pll4_bypass"
,
base
+
0x70
,
16
,
1
,
pll4_bypass_sels
,
ARRAY_SIZE
(
pll4_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SL_PLL5_BYPASS
]
=
imx_clk_mux_flags
(
"pll5_bypass"
,
base
+
0xa0
,
16
,
1
,
pll5_bypass_sels
,
ARRAY_SIZE
(
pll5_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SL_PLL6_BYPASS
]
=
imx_clk_mux_flags
(
"pll6_bypass"
,
base
+
0xe0
,
16
,
1
,
pll6_bypass_sels
,
ARRAY_SIZE
(
pll6_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SL_PLL7_BYPASS
]
=
imx_clk_mux_flags
(
"pll7_bypass"
,
base
+
0x20
,
16
,
1
,
pll7_bypass_sels
,
ARRAY_SIZE
(
pll7_bypass_sels
),
CLK_SET_RATE_PARENT
);
/* Do not bypass PLLs initially */
clk_set_parent
(
clks
[
IMX6SL_PLL1_BYPASS
],
clks
[
IMX6SL_CLK_PLL1
]);
clk_set_parent
(
clks
[
IMX6SL_PLL2_BYPASS
],
clks
[
IMX6SL_CLK_PLL2
]);
clk_set_parent
(
clks
[
IMX6SL_PLL3_BYPASS
],
clks
[
IMX6SL_CLK_PLL3
]);
clk_set_parent
(
clks
[
IMX6SL_PLL4_BYPASS
],
clks
[
IMX6SL_CLK_PLL4
]);
clk_set_parent
(
clks
[
IMX6SL_PLL5_BYPASS
],
clks
[
IMX6SL_CLK_PLL5
]);
clk_set_parent
(
clks
[
IMX6SL_PLL6_BYPASS
],
clks
[
IMX6SL_CLK_PLL6
]);
clk_set_parent
(
clks
[
IMX6SL_PLL7_BYPASS
],
clks
[
IMX6SL_CLK_PLL7
]);
clks
[
IMX6SL_CLK_PLL1_SYS
]
=
imx_clk_gate
(
"pll1_sys"
,
"pll1_bypass"
,
base
+
0x00
,
13
);
clks
[
IMX6SL_CLK_PLL2_BUS
]
=
imx_clk_gate
(
"pll2_bus"
,
"pll2_bypass"
,
base
+
0x30
,
13
);
clks
[
IMX6SL_CLK_PLL3_USB_OTG
]
=
imx_clk_gate
(
"pll3_usb_otg"
,
"pll3_bypass"
,
base
+
0x10
,
13
);
clks
[
IMX6SL_CLK_PLL4_AUDIO
]
=
imx_clk_gate
(
"pll4_audio"
,
"pll4_bypass"
,
base
+
0x70
,
13
);
clks
[
IMX6SL_CLK_PLL5_VIDEO
]
=
imx_clk_gate
(
"pll5_video"
,
"pll5_bypass"
,
base
+
0xa0
,
13
);
clks
[
IMX6SL_CLK_PLL6_ENET
]
=
imx_clk_gate
(
"pll6_enet"
,
"pll6_bypass"
,
base
+
0xe0
,
13
);
clks
[
IMX6SL_CLK_PLL7_USB_HOST
]
=
imx_clk_gate
(
"pll7_usb_host"
,
"pll7_bypass"
,
base
+
0x20
,
13
);
clks
[
IMX6SL_CLK_LVDS1_SEL
]
=
imx_clk_mux
(
"lvds1_sel"
,
base
+
0x160
,
0
,
5
,
lvds_sels
,
ARRAY_SIZE
(
lvds_sels
));
clks
[
IMX6SL_CLK_LVDS1_OUT
]
=
imx_clk_gate_exclusive
(
"lvds1_out"
,
"lvds1_sel"
,
base
+
0x160
,
10
,
BIT
(
12
));
clks
[
IMX6SL_CLK_LVDS1_IN
]
=
imx_clk_gate_exclusive
(
"lvds1_in"
,
"anaclk1"
,
base
+
0x160
,
12
,
BIT
(
10
));
/*
* usbphy1 and usbphy2 are implemented as dummy gates using reserve
...
...
@@ -241,8 +300,8 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
clks
[
IMX6SL_CLK_PRE_PERIPH_SEL
]
=
imx_clk_mux
(
"pre_periph_sel"
,
base
+
0x18
,
18
,
2
,
pre_periph_sels
,
ARRAY_SIZE
(
pre_periph_sels
));
clks
[
IMX6SL_CLK_PERIPH2_CLK2_SEL
]
=
imx_clk_mux
(
"periph2_clk2_sel"
,
base
+
0x18
,
20
,
1
,
periph2_clk2_sels
,
ARRAY_SIZE
(
periph2_clk2_sels
));
clks
[
IMX6SL_CLK_PERIPH_CLK2_SEL
]
=
imx_clk_mux
(
"periph_clk2_sel"
,
base
+
0x18
,
12
,
2
,
periph_clk2_sels
,
ARRAY_SIZE
(
periph_clk2_sels
));
clks
[
IMX6SL_CLK_CSI_SEL
]
=
imx_clk_mux
(
"csi_sel"
,
base
+
0x3c
,
9
,
2
,
csi_
lcdif_sels
,
ARRAY_SIZE
(
csi_lcdif
_sels
));
clks
[
IMX6SL_CLK_LCDIF_AXI_SEL
]
=
imx_clk_mux
(
"lcdif_axi_sel"
,
base
+
0x3c
,
14
,
2
,
csi_lcdif_sels
,
ARRAY_SIZE
(
csi_lcdif
_sels
));
clks
[
IMX6SL_CLK_CSI_SEL
]
=
imx_clk_mux
(
"csi_sel"
,
base
+
0x3c
,
9
,
2
,
csi_
sels
,
ARRAY_SIZE
(
csi
_sels
));
clks
[
IMX6SL_CLK_LCDIF_AXI_SEL
]
=
imx_clk_mux
(
"lcdif_axi_sel"
,
base
+
0x3c
,
14
,
2
,
lcdif_axi_sels
,
ARRAY_SIZE
(
lcdif_axi
_sels
));
clks
[
IMX6SL_CLK_USDHC1_SEL
]
=
imx_clk_fixup_mux
(
"usdhc1_sel"
,
base
+
0x1c
,
16
,
1
,
usdhc_sels
,
ARRAY_SIZE
(
usdhc_sels
),
imx_cscmr1_fixup
);
clks
[
IMX6SL_CLK_USDHC2_SEL
]
=
imx_clk_fixup_mux
(
"usdhc2_sel"
,
base
+
0x1c
,
17
,
1
,
usdhc_sels
,
ARRAY_SIZE
(
usdhc_sels
),
imx_cscmr1_fixup
);
clks
[
IMX6SL_CLK_USDHC3_SEL
]
=
imx_clk_fixup_mux
(
"usdhc3_sel"
,
base
+
0x1c
,
18
,
1
,
usdhc_sels
,
ARRAY_SIZE
(
usdhc_sels
),
imx_cscmr1_fixup
);
...
...
@@ -251,8 +310,8 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
clks
[
IMX6SL_CLK_SSI2_SEL
]
=
imx_clk_fixup_mux
(
"ssi2_sel"
,
base
+
0x1c
,
12
,
2
,
ssi_sels
,
ARRAY_SIZE
(
ssi_sels
),
imx_cscmr1_fixup
);
clks
[
IMX6SL_CLK_SSI3_SEL
]
=
imx_clk_fixup_mux
(
"ssi3_sel"
,
base
+
0x1c
,
14
,
2
,
ssi_sels
,
ARRAY_SIZE
(
ssi_sels
),
imx_cscmr1_fixup
);
clks
[
IMX6SL_CLK_PERCLK_SEL
]
=
imx_clk_fixup_mux
(
"perclk_sel"
,
base
+
0x1c
,
6
,
1
,
perclk_sels
,
ARRAY_SIZE
(
perclk_sels
),
imx_cscmr1_fixup
);
clks
[
IMX6SL_CLK_PXP_AXI_SEL
]
=
imx_clk_mux
(
"pxp_axi_sel"
,
base
+
0x34
,
6
,
3
,
epdc_pxp_sels
,
ARRAY_SIZE
(
epdc_pxp
_sels
));
clks
[
IMX6SL_CLK_EPDC_AXI_SEL
]
=
imx_clk_mux
(
"epdc_axi_sel"
,
base
+
0x34
,
15
,
3
,
epdc_
pxp_sels
,
ARRAY_SIZE
(
epdc_pxp
_sels
));
clks
[
IMX6SL_CLK_PXP_AXI_SEL
]
=
imx_clk_mux
(
"pxp_axi_sel"
,
base
+
0x34
,
6
,
3
,
pxp_axi_sels
,
ARRAY_SIZE
(
pxp_axi
_sels
));
clks
[
IMX6SL_CLK_EPDC_AXI_SEL
]
=
imx_clk_mux
(
"epdc_axi_sel"
,
base
+
0x34
,
15
,
3
,
epdc_
axi_sels
,
ARRAY_SIZE
(
epdc_axi
_sels
));
clks
[
IMX6SL_CLK_GPU2D_OVG_SEL
]
=
imx_clk_mux
(
"gpu2d_ovg_sel"
,
base
+
0x18
,
4
,
2
,
gpu2d_ovg_sels
,
ARRAY_SIZE
(
gpu2d_ovg_sels
));
clks
[
IMX6SL_CLK_GPU2D_SEL
]
=
imx_clk_mux
(
"gpu2d_sel"
,
base
+
0x18
,
8
,
2
,
gpu2d_sels
,
ARRAY_SIZE
(
gpu2d_sels
));
clks
[
IMX6SL_CLK_LCDIF_PIX_SEL
]
=
imx_clk_mux
(
"lcdif_pix_sel"
,
base
+
0x38
,
6
,
3
,
lcdif_pix_sels
,
ARRAY_SIZE
(
lcdif_pix_sels
));
...
...
@@ -337,9 +396,12 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
clks
[
IMX6SL_CLK_SDMA
]
=
imx_clk_gate2
(
"sdma"
,
"ipg"
,
base
+
0x7c
,
6
);
clks
[
IMX6SL_CLK_SPBA
]
=
imx_clk_gate2
(
"spba"
,
"ipg"
,
base
+
0x7c
,
12
);
clks
[
IMX6SL_CLK_SPDIF
]
=
imx_clk_gate2
(
"spdif"
,
"spdif0_podf"
,
base
+
0x7c
,
14
);
clks
[
IMX6SL_CLK_SSI1
]
=
imx_clk_gate2
(
"ssi1"
,
"ssi1_podf"
,
base
+
0x7c
,
18
);
clks
[
IMX6SL_CLK_SSI2
]
=
imx_clk_gate2
(
"ssi2"
,
"ssi2_podf"
,
base
+
0x7c
,
20
);
clks
[
IMX6SL_CLK_SSI3
]
=
imx_clk_gate2
(
"ssi3"
,
"ssi3_podf"
,
base
+
0x7c
,
22
);
clks
[
IMX6SL_CLK_SSI1_IPG
]
=
imx_clk_gate2_shared
(
"ssi1_ipg"
,
"ipg"
,
base
+
0x7c
,
18
,
&
share_count_ssi1
);
clks
[
IMX6SL_CLK_SSI2_IPG
]
=
imx_clk_gate2_shared
(
"ssi2_ipg"
,
"ipg"
,
base
+
0x7c
,
20
,
&
share_count_ssi2
);
clks
[
IMX6SL_CLK_SSI3_IPG
]
=
imx_clk_gate2_shared
(
"ssi3_ipg"
,
"ipg"
,
base
+
0x7c
,
22
,
&
share_count_ssi3
);
clks
[
IMX6SL_CLK_SSI1
]
=
imx_clk_gate2_shared
(
"ssi1"
,
"ssi1_podf"
,
base
+
0x7c
,
18
,
&
share_count_ssi1
);
clks
[
IMX6SL_CLK_SSI2
]
=
imx_clk_gate2_shared
(
"ssi2"
,
"ssi2_podf"
,
base
+
0x7c
,
20
,
&
share_count_ssi2
);
clks
[
IMX6SL_CLK_SSI3
]
=
imx_clk_gate2_shared
(
"ssi3"
,
"ssi3_podf"
,
base
+
0x7c
,
22
,
&
share_count_ssi3
);
clks
[
IMX6SL_CLK_UART
]
=
imx_clk_gate2
(
"uart"
,
"ipg"
,
base
+
0x7c
,
24
);
clks
[
IMX6SL_CLK_UART_SERIAL
]
=
imx_clk_gate2
(
"uart_serial"
,
"uart_root"
,
base
+
0x7c
,
26
);
clks
[
IMX6SL_CLK_USBOH3
]
=
imx_clk_gate2
(
"usboh3"
,
"ipg"
,
base
+
0x80
,
0
);
...
...
@@ -375,6 +437,13 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
/* Audio-related clocks configuration */
clk_set_parent
(
clks
[
IMX6SL_CLK_SPDIF0_SEL
],
clks
[
IMX6SL_CLK_PLL3_PFD3
]);
/* set PLL5 video as lcdif pix parent clock */
clk_set_parent
(
clks
[
IMX6SL_CLK_LCDIF_PIX_SEL
],
clks
[
IMX6SL_CLK_PLL5_VIDEO_DIV
]);
clk_set_parent
(
clks
[
IMX6SL_CLK_LCDIF_AXI_SEL
],
clks
[
IMX6SL_CLK_PLL2_PFD2
]);
/* Set initial power mode */
imx6q_set_lpm
(
WAIT_CLOCKED
);
}
...
...
arch/arm/mach-imx/clk-imx6sx.c
浏览文件 @
155b2fd3
...
...
@@ -81,6 +81,14 @@ static const char *lvds_sels[] = {
"arm"
,
"pll1_sys"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"dummy"
,
"pll5_video_div"
,
"dummy"
,
"dummy"
,
"pcie_ref_125m"
,
"dummy"
,
"usbphy1"
,
"usbphy2"
,
};
static
const
char
*
pll_bypass_src_sels
[]
=
{
"osc"
,
"lvds1_in"
,
};
static
const
char
*
pll1_bypass_sels
[]
=
{
"pll1"
,
"pll1_bypass_src"
,
};
static
const
char
*
pll2_bypass_sels
[]
=
{
"pll2"
,
"pll2_bypass_src"
,
};
static
const
char
*
pll3_bypass_sels
[]
=
{
"pll3"
,
"pll3_bypass_src"
,
};
static
const
char
*
pll4_bypass_sels
[]
=
{
"pll4"
,
"pll4_bypass_src"
,
};
static
const
char
*
pll5_bypass_sels
[]
=
{
"pll5"
,
"pll5_bypass_src"
,
};
static
const
char
*
pll6_bypass_sels
[]
=
{
"pll6"
,
"pll6_bypass_src"
,
};
static
const
char
*
pll7_bypass_sels
[]
=
{
"pll7"
,
"pll7_bypass_src"
,
};
static
struct
clk
*
clks
[
IMX6SX_CLK_CLK_END
];
static
struct
clk_onecell_data
clk_data
;
...
...
@@ -143,18 +151,54 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
clks
[
IMX6SX_CLK_IPP_DI0
]
=
of_clk_get_by_name
(
ccm_node
,
"ipp_di0"
);
clks
[
IMX6SX_CLK_IPP_DI1
]
=
of_clk_get_by_name
(
ccm_node
,
"ipp_di1"
);
/* Clock source from external clock via CLK1 PAD */
clks
[
IMX6SX_CLK_ANACLK1
]
=
imx_obtain_fixed_clock
(
"anaclk1"
,
0
);
np
=
of_find_compatible_node
(
NULL
,
NULL
,
"fsl,imx6sx-anatop"
);
base
=
of_iomap
(
np
,
0
);
WARN_ON
(
!
base
);
/* type name parent_name base div_mask */
clks
[
IMX6SX_CLK_PLL1_SYS
]
=
imx_clk_pllv3
(
IMX_PLLV3_SYS
,
"pll1_sys"
,
"osc"
,
base
,
0x7f
);
clks
[
IMX6SX_CLK_PLL2_BUS
]
=
imx_clk_pllv3
(
IMX_PLLV3_GENERIC
,
"pll2_bus"
,
"osc"
,
base
+
0x30
,
0x1
);
clks
[
IMX6SX_CLK_PLL3_USB_OTG
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll3_usb_otg"
,
"osc"
,
base
+
0x10
,
0x3
);
clks
[
IMX6SX_CLK_PLL4_AUDIO
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll4_audio"
,
"osc"
,
base
+
0x70
,
0x7f
);
clks
[
IMX6SX_CLK_PLL5_VIDEO
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll5_video"
,
"osc"
,
base
+
0xa0
,
0x7f
);
clks
[
IMX6SX_CLK_PLL6_ENET
]
=
imx_clk_pllv3
(
IMX_PLLV3_ENET
,
"pll6_enet"
,
"osc"
,
base
+
0xe0
,
0x3
);
clks
[
IMX6SX_CLK_PLL7_USB_HOST
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7_usb_host"
,
"osc"
,
base
+
0x20
,
0x3
);
clks
[
IMX6SX_PLL1_BYPASS_SRC
]
=
imx_clk_mux
(
"pll1_bypass_src"
,
base
+
0x00
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SX_PLL2_BYPASS_SRC
]
=
imx_clk_mux
(
"pll2_bypass_src"
,
base
+
0x30
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SX_PLL3_BYPASS_SRC
]
=
imx_clk_mux
(
"pll3_bypass_src"
,
base
+
0x10
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SX_PLL4_BYPASS_SRC
]
=
imx_clk_mux
(
"pll4_bypass_src"
,
base
+
0x70
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SX_PLL5_BYPASS_SRC
]
=
imx_clk_mux
(
"pll5_bypass_src"
,
base
+
0xa0
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SX_PLL6_BYPASS_SRC
]
=
imx_clk_mux
(
"pll6_bypass_src"
,
base
+
0xe0
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
clks
[
IMX6SX_PLL7_BYPASS_SRC
]
=
imx_clk_mux
(
"pll7_bypass_src"
,
base
+
0x20
,
14
,
1
,
pll_bypass_src_sels
,
ARRAY_SIZE
(
pll_bypass_src_sels
));
/* type name parent_name base div_mask */
clks
[
IMX6SX_CLK_PLL1
]
=
imx_clk_pllv3
(
IMX_PLLV3_SYS
,
"pll1"
,
"pll1_bypass_src"
,
base
+
0x00
,
0x7f
);
clks
[
IMX6SX_CLK_PLL2
]
=
imx_clk_pllv3
(
IMX_PLLV3_GENERIC
,
"pll2"
,
"pll2_bypass_src"
,
base
+
0x30
,
0x1
);
clks
[
IMX6SX_CLK_PLL3
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll3"
,
"pll3_bypass_src"
,
base
+
0x10
,
0x3
);
clks
[
IMX6SX_CLK_PLL4
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll4"
,
"pll4_bypass_src"
,
base
+
0x70
,
0x7f
);
clks
[
IMX6SX_CLK_PLL5
]
=
imx_clk_pllv3
(
IMX_PLLV3_AV
,
"pll5"
,
"pll5_bypass_src"
,
base
+
0xa0
,
0x7f
);
clks
[
IMX6SX_CLK_PLL6
]
=
imx_clk_pllv3
(
IMX_PLLV3_ENET
,
"pll6"
,
"pll6_bypass_src"
,
base
+
0xe0
,
0x3
);
clks
[
IMX6SX_CLK_PLL7
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7"
,
"pll7_bypass_src"
,
base
+
0x20
,
0x3
);
clks
[
IMX6SX_PLL1_BYPASS
]
=
imx_clk_mux_flags
(
"pll1_bypass"
,
base
+
0x00
,
16
,
1
,
pll1_bypass_sels
,
ARRAY_SIZE
(
pll1_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SX_PLL2_BYPASS
]
=
imx_clk_mux_flags
(
"pll2_bypass"
,
base
+
0x30
,
16
,
1
,
pll2_bypass_sels
,
ARRAY_SIZE
(
pll2_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SX_PLL3_BYPASS
]
=
imx_clk_mux_flags
(
"pll3_bypass"
,
base
+
0x10
,
16
,
1
,
pll3_bypass_sels
,
ARRAY_SIZE
(
pll3_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SX_PLL4_BYPASS
]
=
imx_clk_mux_flags
(
"pll4_bypass"
,
base
+
0x70
,
16
,
1
,
pll4_bypass_sels
,
ARRAY_SIZE
(
pll4_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SX_PLL5_BYPASS
]
=
imx_clk_mux_flags
(
"pll5_bypass"
,
base
+
0xa0
,
16
,
1
,
pll5_bypass_sels
,
ARRAY_SIZE
(
pll5_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SX_PLL6_BYPASS
]
=
imx_clk_mux_flags
(
"pll6_bypass"
,
base
+
0xe0
,
16
,
1
,
pll6_bypass_sels
,
ARRAY_SIZE
(
pll6_bypass_sels
),
CLK_SET_RATE_PARENT
);
clks
[
IMX6SX_PLL7_BYPASS
]
=
imx_clk_mux_flags
(
"pll7_bypass"
,
base
+
0x20
,
16
,
1
,
pll7_bypass_sels
,
ARRAY_SIZE
(
pll7_bypass_sels
),
CLK_SET_RATE_PARENT
);
/* Do not bypass PLLs initially */
clk_set_parent
(
clks
[
IMX6SX_PLL1_BYPASS
],
clks
[
IMX6SX_CLK_PLL1
]);
clk_set_parent
(
clks
[
IMX6SX_PLL2_BYPASS
],
clks
[
IMX6SX_CLK_PLL2
]);
clk_set_parent
(
clks
[
IMX6SX_PLL3_BYPASS
],
clks
[
IMX6SX_CLK_PLL3
]);
clk_set_parent
(
clks
[
IMX6SX_PLL4_BYPASS
],
clks
[
IMX6SX_CLK_PLL4
]);
clk_set_parent
(
clks
[
IMX6SX_PLL5_BYPASS
],
clks
[
IMX6SX_CLK_PLL5
]);
clk_set_parent
(
clks
[
IMX6SX_PLL6_BYPASS
],
clks
[
IMX6SX_CLK_PLL6
]);
clk_set_parent
(
clks
[
IMX6SX_PLL7_BYPASS
],
clks
[
IMX6SX_CLK_PLL7
]);
clks
[
IMX6SX_CLK_PLL1_SYS
]
=
imx_clk_gate
(
"pll1_sys"
,
"pll1_bypass"
,
base
+
0x00
,
13
);
clks
[
IMX6SX_CLK_PLL2_BUS
]
=
imx_clk_gate
(
"pll2_bus"
,
"pll2_bypass"
,
base
+
0x30
,
13
);
clks
[
IMX6SX_CLK_PLL3_USB_OTG
]
=
imx_clk_gate
(
"pll3_usb_otg"
,
"pll3_bypass"
,
base
+
0x10
,
13
);
clks
[
IMX6SX_CLK_PLL4_AUDIO
]
=
imx_clk_gate
(
"pll4_audio"
,
"pll4_bypass"
,
base
+
0x70
,
13
);
clks
[
IMX6SX_CLK_PLL5_VIDEO
]
=
imx_clk_gate
(
"pll5_video"
,
"pll5_bypass"
,
base
+
0xa0
,
13
);
clks
[
IMX6SX_CLK_PLL6_ENET
]
=
imx_clk_gate
(
"pll6_enet"
,
"pll6_bypass"
,
base
+
0xe0
,
13
);
clks
[
IMX6SX_CLK_PLL7_USB_HOST
]
=
imx_clk_gate
(
"pll7_usb_host"
,
"pll7_bypass"
,
base
+
0x20
,
13
);
/*
* Bit 20 is the reserved and read-only bit, we do this only for:
...
...
@@ -176,7 +220,8 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
clks
[
IMX6SX_CLK_PCIE_REF
]
=
imx_clk_fixed_factor
(
"pcie_ref"
,
"pll6_enet"
,
1
,
5
);
clks
[
IMX6SX_CLK_PCIE_REF_125M
]
=
imx_clk_gate
(
"pcie_ref_125m"
,
"pcie_ref"
,
base
+
0xe0
,
19
);
clks
[
IMX6SX_CLK_LVDS1_OUT
]
=
imx_clk_gate
(
"lvds1_out"
,
"lvds1_sel"
,
base
+
0x160
,
10
);
clks
[
IMX6SX_CLK_LVDS1_OUT
]
=
imx_clk_gate_exclusive
(
"lvds1_out"
,
"lvds1_sel"
,
base
+
0x160
,
10
,
BIT
(
12
));
clks
[
IMX6SX_CLK_LVDS1_IN
]
=
imx_clk_gate_exclusive
(
"lvds1_in"
,
"anaclk1"
,
base
+
0x160
,
12
,
BIT
(
10
));
clks
[
IMX6SX_CLK_ENET_REF
]
=
clk_register_divider_table
(
NULL
,
"enet_ref"
,
"pll6_enet"
,
0
,
base
+
0xe0
,
0
,
2
,
0
,
clk_enet_ref_table
,
...
...
arch/arm/mach-imx/clk-pllv3.c
浏览文件 @
155b2fd3
...
...
@@ -23,8 +23,6 @@
#define PLL_DENOM_OFFSET 0x20
#define BM_PLL_POWER (0x1 << 12)
#define BM_PLL_ENABLE (0x1 << 13)
#define BM_PLL_BYPASS (0x1 << 16)
#define BM_PLL_LOCK (0x1 << 31)
/**
...
...
@@ -84,10 +82,6 @@ static int clk_pllv3_prepare(struct clk_hw *hw)
if
(
ret
)
return
ret
;
val
=
readl_relaxed
(
pll
->
base
);
val
&=
~
BM_PLL_BYPASS
;
writel_relaxed
(
val
,
pll
->
base
);
return
0
;
}
...
...
@@ -97,7 +91,6 @@ static void clk_pllv3_unprepare(struct clk_hw *hw)
u32
val
;
val
=
readl_relaxed
(
pll
->
base
);
val
|=
BM_PLL_BYPASS
;
if
(
pll
->
powerup_set
)
val
&=
~
BM_PLL_POWER
;
else
...
...
@@ -105,28 +98,6 @@ static void clk_pllv3_unprepare(struct clk_hw *hw)
writel_relaxed
(
val
,
pll
->
base
);
}
static
int
clk_pllv3_enable
(
struct
clk_hw
*
hw
)
{
struct
clk_pllv3
*
pll
=
to_clk_pllv3
(
hw
);
u32
val
;
val
=
readl_relaxed
(
pll
->
base
);
val
|=
BM_PLL_ENABLE
;
writel_relaxed
(
val
,
pll
->
base
);
return
0
;
}
static
void
clk_pllv3_disable
(
struct
clk_hw
*
hw
)
{
struct
clk_pllv3
*
pll
=
to_clk_pllv3
(
hw
);
u32
val
;
val
=
readl_relaxed
(
pll
->
base
);
val
&=
~
BM_PLL_ENABLE
;
writel_relaxed
(
val
,
pll
->
base
);
}
static
unsigned
long
clk_pllv3_recalc_rate
(
struct
clk_hw
*
hw
,
unsigned
long
parent_rate
)
{
...
...
@@ -169,8 +140,6 @@ static int clk_pllv3_set_rate(struct clk_hw *hw, unsigned long rate,
static
const
struct
clk_ops
clk_pllv3_ops
=
{
.
prepare
=
clk_pllv3_prepare
,
.
unprepare
=
clk_pllv3_unprepare
,
.
enable
=
clk_pllv3_enable
,
.
disable
=
clk_pllv3_disable
,
.
recalc_rate
=
clk_pllv3_recalc_rate
,
.
round_rate
=
clk_pllv3_round_rate
,
.
set_rate
=
clk_pllv3_set_rate
,
...
...
@@ -225,8 +194,6 @@ static int clk_pllv3_sys_set_rate(struct clk_hw *hw, unsigned long rate,
static
const
struct
clk_ops
clk_pllv3_sys_ops
=
{
.
prepare
=
clk_pllv3_prepare
,
.
unprepare
=
clk_pllv3_unprepare
,
.
enable
=
clk_pllv3_enable
,
.
disable
=
clk_pllv3_disable
,
.
recalc_rate
=
clk_pllv3_sys_recalc_rate
,
.
round_rate
=
clk_pllv3_sys_round_rate
,
.
set_rate
=
clk_pllv3_sys_set_rate
,
...
...
@@ -299,8 +266,6 @@ static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
static
const
struct
clk_ops
clk_pllv3_av_ops
=
{
.
prepare
=
clk_pllv3_prepare
,
.
unprepare
=
clk_pllv3_unprepare
,
.
enable
=
clk_pllv3_enable
,
.
disable
=
clk_pllv3_disable
,
.
recalc_rate
=
clk_pllv3_av_recalc_rate
,
.
round_rate
=
clk_pllv3_av_round_rate
,
.
set_rate
=
clk_pllv3_av_set_rate
,
...
...
@@ -315,8 +280,6 @@ static unsigned long clk_pllv3_enet_recalc_rate(struct clk_hw *hw,
static
const
struct
clk_ops
clk_pllv3_enet_ops
=
{
.
prepare
=
clk_pllv3_prepare
,
.
unprepare
=
clk_pllv3_unprepare
,
.
enable
=
clk_pllv3_enable
,
.
disable
=
clk_pllv3_disable
,
.
recalc_rate
=
clk_pllv3_enet_recalc_rate
,
};
...
...
arch/arm/mach-imx/clk-vf610.c
浏览文件 @
155b2fd3
...
...
@@ -58,6 +58,8 @@
#define PFD_PLL1_BASE (anatop_base + 0x2b0)
#define PFD_PLL2_BASE (anatop_base + 0x100)
#define PFD_PLL3_BASE (anatop_base + 0xf0)
#define PLL3_CTRL (anatop_base + 0x10)
#define PLL7_CTRL (anatop_base + 0x20)
static
void
__iomem
*
anatop_base
;
static
void
__iomem
*
ccm_base
;
...
...
@@ -98,9 +100,15 @@ static struct clk_div_table pll4_main_div_table[] = {
static
struct
clk
*
clk
[
VF610_CLK_END
];
static
struct
clk_onecell_data
clk_data
;
static
unsigned
int
const
clks_init_on
[]
__initconst
=
{
VF610_CLK_SYS_BUS
,
VF610_CLK_DDR_SEL
,
};
static
void
__init
vf610_clocks_init
(
struct
device_node
*
ccm_node
)
{
struct
device_node
*
np
;
int
i
;
clk
[
VF610_CLK_DUMMY
]
=
imx_clk_fixed
(
"dummy"
,
0
);
clk
[
VF610_CLK_SIRC_128K
]
=
imx_clk_fixed
(
"sirc_128k"
,
128000
);
...
...
@@ -148,6 +156,9 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
clk
[
VF610_CLK_PLL5_MAIN
]
=
imx_clk_fixed_factor
(
"pll5_main"
,
"fast_clk_sel"
,
125
,
6
);
/* pll6: default 960Mhz */
clk
[
VF610_CLK_PLL6_MAIN
]
=
imx_clk_fixed_factor
(
"pll6_main"
,
"fast_clk_sel"
,
40
,
1
);
/* pll7: USB1 PLL at 480MHz */
clk
[
VF610_CLK_PLL7_MAIN
]
=
imx_clk_pllv3
(
IMX_PLLV3_USB
,
"pll7_main"
,
"fast_clk_sel"
,
PLL7_CTRL
,
0x2
);
clk
[
VF610_CLK_PLL1_PFD_SEL
]
=
imx_clk_mux
(
"pll1_pfd_sel"
,
CCM_CCSR
,
16
,
3
,
pll1_sels
,
5
);
clk
[
VF610_CLK_PLL2_PFD_SEL
]
=
imx_clk_mux
(
"pll2_pfd_sel"
,
CCM_CCSR
,
19
,
3
,
pll2_sels
,
5
);
clk
[
VF610_CLK_SYS_SEL
]
=
imx_clk_mux
(
"sys_sel"
,
CCM_CCSR
,
0
,
3
,
sys_sels
,
ARRAY_SIZE
(
sys_sels
));
...
...
@@ -160,8 +171,11 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
clk
[
VF610_CLK_PLL4_MAIN_DIV
]
=
clk_register_divider_table
(
NULL
,
"pll4_main_div"
,
"pll4_main"
,
0
,
CCM_CACRR
,
6
,
3
,
0
,
pll4_main_div_table
,
&
imx_ccm_lock
);
clk
[
VF610_CLK_PLL6_MAIN_DIV
]
=
imx_clk_divider
(
"pll6_main_div"
,
"pll6_main"
,
CCM_CACRR
,
21
,
1
);
clk
[
VF610_CLK_USBC0
]
=
imx_clk_gate2
(
"usbc0"
,
"pll3_main"
,
CCM_CCGR1
,
CCM_CCGRx_CGn
(
4
));
clk
[
VF610_CLK_USBC1
]
=
imx_clk_gate2
(
"usbc1"
,
"pll3_main"
,
CCM_CCGR7
,
CCM_CCGRx_CGn
(
4
));
clk
[
VF610_CLK_USBPHY0
]
=
imx_clk_gate
(
"usbphy0"
,
"pll3_main"
,
PLL3_CTRL
,
6
);
clk
[
VF610_CLK_USBPHY1
]
=
imx_clk_gate
(
"usbphy1"
,
"pll7_main"
,
PLL7_CTRL
,
6
);
clk
[
VF610_CLK_USBC0
]
=
imx_clk_gate2
(
"usbc0"
,
"ipg_bus"
,
CCM_CCGR1
,
CCM_CCGRx_CGn
(
4
));
clk
[
VF610_CLK_USBC1
]
=
imx_clk_gate2
(
"usbc1"
,
"ipg_bus"
,
CCM_CCGR7
,
CCM_CCGRx_CGn
(
4
));
clk
[
VF610_CLK_QSPI0_SEL
]
=
imx_clk_mux
(
"qspi0_sel"
,
CCM_CSCMR1
,
22
,
2
,
qspi_sels
,
4
);
clk
[
VF610_CLK_QSPI0_EN
]
=
imx_clk_gate
(
"qspi0_en"
,
"qspi0_sel"
,
CCM_CSCDR3
,
4
);
...
...
@@ -322,6 +336,9 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
clk_set_parent
(
clk
[
VF610_CLK_SAI2_SEL
],
clk
[
VF610_CLK_AUDIO_EXT
]);
clk_set_parent
(
clk
[
VF610_CLK_SAI3_SEL
],
clk
[
VF610_CLK_AUDIO_EXT
]);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
clks_init_on
);
i
++
)
clk_prepare_enable
(
clk
[
clks_init_on
[
i
]]);
/* Add the clocks to provider list */
clk_data
.
clks
=
clk
;
clk_data
.
clk_num
=
ARRAY_SIZE
(
clk
);
...
...
arch/arm/mach-imx/clk.h
浏览文件 @
155b2fd3
...
...
@@ -36,6 +36,9 @@ struct clk *clk_register_gate2(struct device *dev, const char *name,
struct
clk
*
imx_obtain_fixed_clock
(
const
char
*
name
,
unsigned
long
rate
);
struct
clk
*
imx_clk_gate_exclusive
(
const
char
*
name
,
const
char
*
parent
,
void
__iomem
*
reg
,
u8
shift
,
u32
exclusive_mask
);
static
inline
struct
clk
*
imx_clk_gate2
(
const
char
*
name
,
const
char
*
parent
,
void
__iomem
*
reg
,
u8
shift
)
{
...
...
arch/arm/mach-imx/common.h
浏览文件 @
155b2fd3
...
...
@@ -98,11 +98,9 @@ void imx_set_cpu_arg(int cpu, u32 arg);
void
v7_secondary_startup
(
void
);
void
imx_scu_map_io
(
void
);
void
imx_smp_prepare
(
void
);
void
imx_scu_standby_enable
(
void
);
#else
static
inline
void
imx_scu_map_io
(
void
)
{}
static
inline
void
imx_smp_prepare
(
void
)
{}
static
inline
void
imx_scu_standby_enable
(
void
)
{}
#endif
void
imx_src_init
(
void
);
void
imx_gpc_init
(
void
);
...
...
arch/arm/mach-imx/cpuidle-imx6q.c
浏览文件 @
155b2fd3
...
...
@@ -66,10 +66,6 @@ static struct cpuidle_driver imx6q_cpuidle_driver = {
int
__init
imx6q_cpuidle_init
(
void
)
{
/* Need to enable SCU standby for entering WAIT modes */
if
(
!
cpu_is_imx6sx
())
imx_scu_standby_enable
();
/* Set INT_MEM_CLK_LPM bit to get a reliable WAIT mode support */
imx6q_set_int_mem_clk_lpm
(
true
);
...
...
arch/arm/mach-imx/eukrea-baseboards.h
浏览文件 @
155b2fd3
...
...
@@ -27,23 +27,15 @@
* This CPU module needs a baseboard to work. After basic initializing
* its own devices, it calls baseboard's init function.
* TODO: Add your own baseboard init function and call it from
* inside eukrea_cpuimx25_init() eukrea_cpuimx27_init()
* eukrea_cpuimx35_init() eukrea_cpuimx51_init()
* or eukrea_cpuimx51sd_init().
* inside eukrea_cpuimx25_init() or eukrea_cpuimx35_init()
*
* This example here is for the development board. Refer
* mach-mx25/eukrea_mbimxsd-baseboard.c for cpuimx25
* mach-imx/eukrea_mbimx27-baseboard.c for cpuimx27
* mach-mx3/eukrea_mbimxsd-baseboard.c for cpuimx35
* mach-mx5/eukrea_mbimx51-baseboard.c for cpuimx51
* mach-mx5/eukrea_mbimxsd-baseboard.c for cpuimx51sd
*/
extern
void
eukrea_mbimxsd25_baseboard_init
(
void
);
extern
void
eukrea_mbimx27_baseboard_init
(
void
);
extern
void
eukrea_mbimxsd35_baseboard_init
(
void
);
extern
void
eukrea_mbimx51_baseboard_init
(
void
);
extern
void
eukrea_mbimxsd51_baseboard_init
(
void
);
#endif
...
...
arch/arm/mach-imx/eukrea_mbimx27-baseboard.c
已删除
100644 → 0
浏览文件 @
ee641009
/*
* Copyright (C) 2009-2010 Eric Benard - eric@eukrea.com
*
* Based on pcm970-baseboard.c which is :
* Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/backlight.h>
#include <video/platform_lcd.h>
#include <asm/mach/arch.h>
#include "common.h"
#include "devices-imx27.h"
#include "hardware.h"
#include "iomux-mx27.h"
static
const
int
eukrea_mbimx27_pins
[]
__initconst
=
{
/* UART2 */
PE3_PF_UART2_CTS
,
PE4_PF_UART2_RTS
,
PE6_PF_UART2_TXD
,
PE7_PF_UART2_RXD
,
/* UART3 */
PE8_PF_UART3_TXD
,
PE9_PF_UART3_RXD
,
PE10_PF_UART3_CTS
,
PE11_PF_UART3_RTS
,
/* UART4 */
#if !defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4)
PB26_AF_UART4_RTS
,
PB28_AF_UART4_TXD
,
PB29_AF_UART4_CTS
,
PB31_AF_UART4_RXD
,
#endif
/* SDHC1*/
PE18_PF_SD1_D0
,
PE19_PF_SD1_D1
,
PE20_PF_SD1_D2
,
PE21_PF_SD1_D3
,
PE22_PF_SD1_CMD
,
PE23_PF_SD1_CLK
,
/* display */
PA5_PF_LSCLK
,
PA6_PF_LD0
,
PA7_PF_LD1
,
PA8_PF_LD2
,
PA9_PF_LD3
,
PA10_PF_LD4
,
PA11_PF_LD5
,
PA12_PF_LD6
,
PA13_PF_LD7
,
PA14_PF_LD8
,
PA15_PF_LD9
,
PA16_PF_LD10
,
PA17_PF_LD11
,
PA18_PF_LD12
,
PA19_PF_LD13
,
PA20_PF_LD14
,
PA21_PF_LD15
,
PA22_PF_LD16
,
PA23_PF_LD17
,
PA28_PF_HSYNC
,
PA29_PF_VSYNC
,
PA30_PF_CONTRAST
,
PA31_PF_OE_ACD
,
/* SPI1 */
PD29_PF_CSPI1_SCLK
,
PD30_PF_CSPI1_MISO
,
PD31_PF_CSPI1_MOSI
,
/* SSI4 */
#if defined(CONFIG_SND_SOC_EUKREA_TLV320) \
|| defined(CONFIG_SND_SOC_EUKREA_TLV320_MODULE)
PC16_PF_SSI4_FS
,
PC17_PF_SSI4_RXD
|
GPIO_PUEN
,
PC18_PF_SSI4_TXD
|
GPIO_PUEN
,
PC19_PF_SSI4_CLK
,
#endif
};
static
const
uint32_t
eukrea_mbimx27_keymap
[]
=
{
KEY
(
0
,
0
,
KEY_UP
),
KEY
(
0
,
1
,
KEY_DOWN
),
KEY
(
1
,
0
,
KEY_RIGHT
),
KEY
(
1
,
1
,
KEY_LEFT
),
};
static
const
struct
matrix_keymap_data
eukrea_mbimx27_keymap_data
__initconst
=
{
.
keymap
=
eukrea_mbimx27_keymap
,
.
keymap_size
=
ARRAY_SIZE
(
eukrea_mbimx27_keymap
),
};
static
const
struct
gpio_led
eukrea_mbimx27_gpio_leds
[]
__initconst
=
{
{
.
name
=
"led1"
,
.
default_trigger
=
"heartbeat"
,
.
active_low
=
1
,
.
gpio
=
GPIO_PORTF
|
16
,
},
{
.
name
=
"led2"
,
.
default_trigger
=
"none"
,
.
active_low
=
1
,
.
gpio
=
GPIO_PORTF
|
19
,
},
};
static
const
struct
gpio_led_platform_data
eukrea_mbimx27_gpio_led_info
__initconst
=
{
.
leds
=
eukrea_mbimx27_gpio_leds
,
.
num_leds
=
ARRAY_SIZE
(
eukrea_mbimx27_gpio_leds
),
};
static
struct
imx_fb_videomode
eukrea_mbimx27_modes
[]
=
{
{
.
mode
=
{
.
name
=
"CMO-QVGA"
,
.
refresh
=
60
,
.
xres
=
320
,
.
yres
=
240
,
.
pixclock
=
156000
,
.
hsync_len
=
30
,
.
left_margin
=
38
,
.
right_margin
=
20
,
.
vsync_len
=
3
,
.
upper_margin
=
15
,
.
lower_margin
=
4
,
},
.
pcr
=
0xFAD08B80
,
.
bpp
=
16
,
},
{
.
mode
=
{
.
name
=
"DVI-VGA"
,
.
refresh
=
60
,
.
xres
=
640
,
.
yres
=
480
,
.
pixclock
=
32000
,
.
hsync_len
=
1
,
.
left_margin
=
35
,
.
right_margin
=
0
,
.
vsync_len
=
1
,
.
upper_margin
=
7
,
.
lower_margin
=
0
,
},
.
pcr
=
0xFA208B80
,
.
bpp
=
16
,
},
{
.
mode
=
{
.
name
=
"DVI-SVGA"
,
.
refresh
=
60
,
.
xres
=
800
,
.
yres
=
600
,
.
pixclock
=
25000
,
.
hsync_len
=
1
,
.
left_margin
=
35
,
.
right_margin
=
0
,
.
vsync_len
=
1
,
.
upper_margin
=
7
,
.
lower_margin
=
0
,
},
.
pcr
=
0xFA208B80
,
.
bpp
=
16
,
},
};
static
const
struct
imx_fb_platform_data
eukrea_mbimx27_fb_data
__initconst
=
{
.
mode
=
eukrea_mbimx27_modes
,
.
num_modes
=
ARRAY_SIZE
(
eukrea_mbimx27_modes
),
.
pwmr
=
0x00A903FF
,
.
lscr1
=
0x00120300
,
.
dmacr
=
0x00040060
,
};
static
void
eukrea_mbimx27_bl_set_intensity
(
int
intensity
)
{
if
(
intensity
)
gpio_direction_output
(
GPIO_PORTE
|
5
,
1
);
else
gpio_direction_output
(
GPIO_PORTE
|
5
,
0
);
}
static
struct
generic_bl_info
eukrea_mbimx27_bl_info
=
{
.
name
=
"eukrea_mbimx27-bl"
,
.
max_intensity
=
0xff
,
.
default_intensity
=
0xff
,
.
set_bl_intensity
=
eukrea_mbimx27_bl_set_intensity
,
};
static
struct
platform_device
eukrea_mbimx27_bl_dev
=
{
.
name
=
"generic-bl"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
eukrea_mbimx27_bl_info
,
},
};
static
void
eukrea_mbimx27_lcd_power_set
(
struct
plat_lcd_data
*
pd
,
unsigned
int
power
)
{
if
(
power
)
gpio_direction_output
(
GPIO_PORTA
|
25
,
1
);
else
gpio_direction_output
(
GPIO_PORTA
|
25
,
0
);
}
static
struct
plat_lcd_data
eukrea_mbimx27_lcd_power_data
=
{
.
set_power
=
eukrea_mbimx27_lcd_power_set
,
};
static
struct
platform_device
eukrea_mbimx27_lcd_powerdev
=
{
.
name
=
"platform-lcd"
,
.
dev
.
platform_data
=
&
eukrea_mbimx27_lcd_power_data
,
};
static
const
struct
imxuart_platform_data
uart_pdata
__initconst
=
{
.
flags
=
IMXUART_HAVE_RTSCTS
,
};
#define ADS7846_PENDOWN (GPIO_PORTD | 25)
static
void
__maybe_unused
ads7846_dev_init
(
void
)
{
if
(
gpio_request
(
ADS7846_PENDOWN
,
"ADS7846 pendown"
)
<
0
)
{
printk
(
KERN_ERR
"can't get ads7846 pen down GPIO
\n
"
);
return
;
}
gpio_direction_input
(
ADS7846_PENDOWN
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
ADS7846_PENDOWN
);
}
static
struct
ads7846_platform_data
ads7846_config
__initdata
=
{
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
};
static
struct
spi_board_info
__maybe_unused
eukrea_mbimx27_spi_board_info
[]
__initdata
=
{
[
0
]
=
{
.
modalias
=
"ads7846"
,
.
bus_num
=
0
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
/* irq number is run-time assigned */
.
platform_data
=
&
ads7846_config
,
.
mode
=
SPI_MODE_2
,
},
};
static
int
eukrea_mbimx27_spi_cs
[]
=
{
GPIO_PORTD
|
28
};
static
const
struct
spi_imx_master
eukrea_mbimx27_spi0_data
__initconst
=
{
.
chipselect
=
eukrea_mbimx27_spi_cs
,
.
num_chipselect
=
ARRAY_SIZE
(
eukrea_mbimx27_spi_cs
),
};
static
struct
i2c_board_info
eukrea_mbimx27_i2c_devices
[]
=
{
{
I2C_BOARD_INFO
(
"tlv320aic23"
,
0x1a
),
},
};
static
const
struct
imxmmc_platform_data
sdhc_pdata
__initconst
=
{
.
dat3_card_detect
=
1
,
};
static
const
struct
imx_ssi_platform_data
eukrea_mbimx27_ssi_pdata
__initconst
=
{
.
flags
=
IMX_SSI_DMA
|
IMX_SSI_USE_I2S_SLAVE
,
};
/*
* system init for baseboard usage. Will be called by cpuimx27 init.
*
* Add platform devices present on this baseboard and init
* them from CPU side as far as required to use them later on
*/
void
__init
eukrea_mbimx27_baseboard_init
(
void
)
{
mxc_gpio_setup_multiple_pins
(
eukrea_mbimx27_pins
,
ARRAY_SIZE
(
eukrea_mbimx27_pins
),
"MBIMX27"
);
imx27_add_imx_uart1
(
&
uart_pdata
);
imx27_add_imx_uart2
(
&
uart_pdata
);
#if !defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4)
imx27_add_imx_uart3
(
&
uart_pdata
);
#endif
imx27_add_imx_fb
(
&
eukrea_mbimx27_fb_data
);
imx27_add_mxc_mmc
(
0
,
&
sdhc_pdata
);
i2c_register_board_info
(
0
,
eukrea_mbimx27_i2c_devices
,
ARRAY_SIZE
(
eukrea_mbimx27_i2c_devices
));
imx27_add_imx_ssi
(
0
,
&
eukrea_mbimx27_ssi_pdata
);
#if defined(CONFIG_TOUCHSCREEN_ADS7846) \
|| defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
/* ADS7846 Touchscreen controller init */
mxc_gpio_mode
(
GPIO_PORTD
|
25
|
GPIO_GPIO
|
GPIO_IN
);
ads7846_dev_init
();
#endif
/* SPI_CS0 init */
mxc_gpio_mode
(
GPIO_PORTD
|
28
|
GPIO_GPIO
|
GPIO_OUT
);
imx27_add_spi_imx0
(
&
eukrea_mbimx27_spi0_data
);
eukrea_mbimx27_spi_board_info
[
0
].
irq
=
gpio_to_irq
(
IMX_GPIO_NR
(
4
,
25
));
spi_register_board_info
(
eukrea_mbimx27_spi_board_info
,
ARRAY_SIZE
(
eukrea_mbimx27_spi_board_info
));
/* Leds configuration */
mxc_gpio_mode
(
GPIO_PORTF
|
16
|
GPIO_GPIO
|
GPIO_OUT
);
mxc_gpio_mode
(
GPIO_PORTF
|
19
|
GPIO_GPIO
|
GPIO_OUT
);
/* Backlight */
mxc_gpio_mode
(
GPIO_PORTE
|
5
|
GPIO_GPIO
|
GPIO_OUT
);
gpio_request
(
GPIO_PORTE
|
5
,
"backlight"
);
platform_device_register
(
&
eukrea_mbimx27_bl_dev
);
/* LCD Reset */
mxc_gpio_mode
(
GPIO_PORTA
|
25
|
GPIO_GPIO
|
GPIO_OUT
);
gpio_request
(
GPIO_PORTA
|
25
,
"lcd_enable"
);
platform_device_register
(
&
eukrea_mbimx27_lcd_powerdev
);
imx27_add_imx_keypad
(
&
eukrea_mbimx27_keymap_data
);
gpio_led_register_device
(
-
1
,
&
eukrea_mbimx27_gpio_led_info
);
imx_add_platform_device
(
"eukrea_tlv320"
,
0
,
NULL
,
0
,
NULL
,
0
);
}
arch/arm/mach-imx/imx1-dt.c
0 → 100644
浏览文件 @
155b2fd3
/*
* Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
*
* 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.
*/
#include <linux/of_platform.h>
#include <asm/mach/arch.h>
#include "common.h"
static
const
char
*
const
imx1_dt_board_compat
[]
__initconst
=
{
"fsl,imx1"
,
NULL
};
DT_MACHINE_START
(
IMX1_DT
,
"Freescale i.MX1 (Device Tree Support)"
)
.
map_io
=
mx1_map_io
,
.
init_early
=
imx1_init_early
,
.
init_irq
=
mx1_init_irq
,
.
dt_compat
=
imx1_dt_board_compat
,
.
restart
=
mxc_restart
,
MACHINE_END
arch/arm/mach-imx/iomux-imx31.c
浏览文件 @
155b2fd3
...
...
@@ -64,7 +64,6 @@ int mxc_iomux_mode(unsigned int pin_mode)
return
ret
;
}
EXPORT_SYMBOL
(
mxc_iomux_mode
);
/*
* This function configures the pad value for a IOMUX pin.
...
...
@@ -90,7 +89,6 @@ void mxc_iomux_set_pad(enum iomux_pins pin, u32 config)
spin_unlock
(
&
gpio_mux_lock
);
}
EXPORT_SYMBOL
(
mxc_iomux_set_pad
);
/*
* allocs a single pin:
...
...
@@ -116,7 +114,6 @@ int mxc_iomux_alloc_pin(unsigned int pin, const char *label)
return
0
;
}
EXPORT_SYMBOL
(
mxc_iomux_alloc_pin
);
int
mxc_iomux_setup_multiple_pins
(
const
unsigned
int
*
pin_list
,
unsigned
count
,
const
char
*
label
)
...
...
@@ -137,7 +134,6 @@ int mxc_iomux_setup_multiple_pins(const unsigned int *pin_list, unsigned count,
mxc_iomux_release_multiple_pins
(
pin_list
,
i
);
return
ret
;
}
EXPORT_SYMBOL
(
mxc_iomux_setup_multiple_pins
);
void
mxc_iomux_release_pin
(
unsigned
int
pin
)
{
...
...
@@ -146,7 +142,6 @@ void mxc_iomux_release_pin(unsigned int pin)
if
(
pad
<
(
PIN_MAX
+
1
))
clear_bit
(
pad
,
mxc_pin_alloc_map
);
}
EXPORT_SYMBOL
(
mxc_iomux_release_pin
);
void
mxc_iomux_release_multiple_pins
(
const
unsigned
int
*
pin_list
,
int
count
)
{
...
...
@@ -158,7 +153,6 @@ void mxc_iomux_release_multiple_pins(const unsigned int *pin_list, int count)
p
++
;
}
}
EXPORT_SYMBOL
(
mxc_iomux_release_multiple_pins
);
/*
* This function enables/disables the general purpose function for a particular
...
...
@@ -178,4 +172,3 @@ void mxc_iomux_set_gpr(enum iomux_gp_func gp, bool en)
__raw_writel
(
l
,
IOMUXGPR
);
spin_unlock
(
&
gpio_mux_lock
);
}
EXPORT_SYMBOL
(
mxc_iomux_set_gpr
);
arch/arm/mach-imx/iomux-v1.c
浏览文件 @
155b2fd3
...
...
@@ -153,7 +153,6 @@ int mxc_gpio_mode(int gpio_mode)
return
0
;
}
EXPORT_SYMBOL
(
mxc_gpio_mode
);
static
int
imx_iomuxv1_setup_multiple
(
const
int
*
list
,
unsigned
count
)
{
...
...
@@ -178,7 +177,6 @@ int mxc_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
ret
=
imx_iomuxv1_setup_multiple
(
pin_list
,
count
);
return
ret
;
}
EXPORT_SYMBOL
(
mxc_gpio_setup_multiple_pins
);
int
__init
imx_iomuxv1_init
(
void
__iomem
*
base
,
int
numports
)
{
...
...
arch/arm/mach-imx/iomux-v3.c
浏览文件 @
155b2fd3
...
...
@@ -55,7 +55,6 @@ int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
return
0
;
}
EXPORT_SYMBOL
(
mxc_iomux_v3_setup_pad
);
int
mxc_iomux_v3_setup_multiple_pads
(
iomux_v3_cfg_t
*
pad_list
,
unsigned
count
)
{
...
...
@@ -71,7 +70,6 @@ int mxc_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t *pad_list, unsigned count)
}
return
0
;
}
EXPORT_SYMBOL
(
mxc_iomux_v3_setup_multiple_pads
);
void
mxc_iomux_v3_init
(
void
__iomem
*
iomux_v3_base
)
{
...
...
arch/arm/mach-imx/mach-armadillo5x0.c
浏览文件 @
155b2fd3
...
...
@@ -537,7 +537,7 @@ static void __init armadillo5x0_init(void)
gpio_free
(
ARMADILLO5X0_RTC_GPIO
);
}
if
(
armadillo5x0_i2c_rtc
.
irq
==
0
)
pr_warn
ing
(
"armadillo5x0_init: failed to get RTC IRQ
\n
"
);
pr_warn
(
"armadillo5x0_init: failed to get RTC IRQ
\n
"
);
i2c_register_board_info
(
1
,
&
armadillo5x0_i2c_rtc
,
1
);
/* USB */
...
...
arch/arm/mach-imx/mach-cpuimx27.c
已删除
100644 → 0
浏览文件 @
ee641009
/*
* Copyright (C) 2009 Eric Benard - eric@eukrea.com
*
* Based on pcm038.c which is :
* Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
* Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <linux/i2c.h>
#include <linux/io.h>
#include <linux/mtd/plat-ram.h>
#include <linux/mtd/physmap.h>
#include <linux/platform_device.h>
#include <linux/serial_8250.h>
#include <linux/usb/otg.h>
#include <linux/usb/ulpi.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include <asm/mach/map.h>
#include "common.h"
#include "devices-imx27.h"
#include "ehci.h"
#include "eukrea-baseboards.h"
#include "hardware.h"
#include "iomux-mx27.h"
#include "ulpi.h"
static
const
int
eukrea_cpuimx27_pins
[]
__initconst
=
{
/* UART1 */
PE12_PF_UART1_TXD
,
PE13_PF_UART1_RXD
,
PE14_PF_UART1_CTS
,
PE15_PF_UART1_RTS
,
/* UART4 */
#if defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4)
PB26_AF_UART4_RTS
,
PB28_AF_UART4_TXD
,
PB29_AF_UART4_CTS
,
PB31_AF_UART4_RXD
,
#endif
/* FEC */
PD0_AIN_FEC_TXD0
,
PD1_AIN_FEC_TXD1
,
PD2_AIN_FEC_TXD2
,
PD3_AIN_FEC_TXD3
,
PD4_AOUT_FEC_RX_ER
,
PD5_AOUT_FEC_RXD1
,
PD6_AOUT_FEC_RXD2
,
PD7_AOUT_FEC_RXD3
,
PD8_AF_FEC_MDIO
,
PD9_AIN_FEC_MDC
,
PD10_AOUT_FEC_CRS
,
PD11_AOUT_FEC_TX_CLK
,
PD12_AOUT_FEC_RXD0
,
PD13_AOUT_FEC_RX_DV
,
PD14_AOUT_FEC_RX_CLK
,
PD15_AOUT_FEC_COL
,
PD16_AIN_FEC_TX_ER
,
PF23_AIN_FEC_TX_EN
,
/* I2C1 */
PD17_PF_I2C_DATA
,
PD18_PF_I2C_CLK
,
/* SDHC2 */
#if defined(CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2)
PB4_PF_SD2_D0
,
PB5_PF_SD2_D1
,
PB6_PF_SD2_D2
,
PB7_PF_SD2_D3
,
PB8_PF_SD2_CMD
,
PB9_PF_SD2_CLK
,
#endif
#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
/* Quad UART's IRQ */
GPIO_PORTB
|
22
|
GPIO_GPIO
|
GPIO_IN
,
GPIO_PORTB
|
23
|
GPIO_GPIO
|
GPIO_IN
,
GPIO_PORTB
|
27
|
GPIO_GPIO
|
GPIO_IN
,
GPIO_PORTB
|
30
|
GPIO_GPIO
|
GPIO_IN
,
#endif
/* OTG */
PC7_PF_USBOTG_DATA5
,
PC8_PF_USBOTG_DATA6
,
PC9_PF_USBOTG_DATA0
,
PC10_PF_USBOTG_DATA2
,
PC11_PF_USBOTG_DATA1
,
PC12_PF_USBOTG_DATA4
,
PC13_PF_USBOTG_DATA3
,
PE0_PF_USBOTG_NXT
,
PE1_PF_USBOTG_STP
,
PE2_PF_USBOTG_DIR
,
PE24_PF_USBOTG_CLK
,
PE25_PF_USBOTG_DATA7
,
/* USBH2 */
PA0_PF_USBH2_CLK
,
PA1_PF_USBH2_DIR
,
PA2_PF_USBH2_DATA7
,
PA3_PF_USBH2_NXT
,
PA4_PF_USBH2_STP
,
PD19_AF_USBH2_DATA4
,
PD20_AF_USBH2_DATA3
,
PD21_AF_USBH2_DATA6
,
PD22_AF_USBH2_DATA0
,
PD23_AF_USBH2_DATA2
,
PD24_AF_USBH2_DATA1
,
PD26_AF_USBH2_DATA5
,
};
static
struct
physmap_flash_data
eukrea_cpuimx27_flash_data
=
{
.
width
=
2
,
};
static
struct
resource
eukrea_cpuimx27_flash_resource
=
{
.
start
=
0xc0000000
,
.
end
=
0xc3ffffff
,
.
flags
=
IORESOURCE_MEM
,
};
static
struct
platform_device
eukrea_cpuimx27_nor_mtd_device
=
{
.
name
=
"physmap-flash"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
eukrea_cpuimx27_flash_data
,
},
.
num_resources
=
1
,
.
resource
=
&
eukrea_cpuimx27_flash_resource
,
};
static
const
struct
imxuart_platform_data
uart_pdata
__initconst
=
{
.
flags
=
IMXUART_HAVE_RTSCTS
,
};
static
const
struct
mxc_nand_platform_data
cpuimx27_nand_board_info
__initconst
=
{
.
width
=
1
,
.
hw_ecc
=
1
,
};
static
struct
platform_device
*
platform_devices
[]
__initdata
=
{
&
eukrea_cpuimx27_nor_mtd_device
,
};
static
const
struct
imxi2c_platform_data
cpuimx27_i2c1_data
__initconst
=
{
.
bitrate
=
100000
,
};
static
struct
i2c_board_info
eukrea_cpuimx27_i2c_devices
[]
=
{
{
I2C_BOARD_INFO
(
"pcf8563"
,
0x51
),
},
};
#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
static
struct
plat_serial8250_port
serial_platform_data
[]
=
{
{
.
mapbase
=
(
unsigned
long
)(
MX27_CS3_BASE_ADDR
+
0x200000
),
/* irq number is run-time assigned */
.
uartclk
=
14745600
,
.
regshift
=
1
,
.
iotype
=
UPIO_MEM
,
.
flags
=
UPF_BOOT_AUTOCONF
|
UPF_SKIP_TEST
|
UPF_IOREMAP
,
},
{
.
mapbase
=
(
unsigned
long
)(
MX27_CS3_BASE_ADDR
+
0x400000
),
/* irq number is run-time assigned */
.
uartclk
=
14745600
,
.
regshift
=
1
,
.
iotype
=
UPIO_MEM
,
.
flags
=
UPF_BOOT_AUTOCONF
|
UPF_SKIP_TEST
|
UPF_IOREMAP
,
},
{
.
mapbase
=
(
unsigned
long
)(
MX27_CS3_BASE_ADDR
+
0x800000
),
/* irq number is run-time assigned */
.
uartclk
=
14745600
,
.
regshift
=
1
,
.
iotype
=
UPIO_MEM
,
.
flags
=
UPF_BOOT_AUTOCONF
|
UPF_SKIP_TEST
|
UPF_IOREMAP
,
},
{
.
mapbase
=
(
unsigned
long
)(
MX27_CS3_BASE_ADDR
+
0x1000000
),
/* irq number is run-time assigned */
.
uartclk
=
14745600
,
.
regshift
=
1
,
.
iotype
=
UPIO_MEM
,
.
flags
=
UPF_BOOT_AUTOCONF
|
UPF_SKIP_TEST
|
UPF_IOREMAP
,
},
{
}
};
static
struct
platform_device
serial_device
=
{
.
name
=
"serial8250"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
serial_platform_data
,
},
};
#endif
static
int
eukrea_cpuimx27_otg_init
(
struct
platform_device
*
pdev
)
{
return
mx27_initialize_usb_hw
(
pdev
->
id
,
MXC_EHCI_INTERFACE_DIFF_UNI
);
}
static
struct
mxc_usbh_platform_data
otg_pdata
__initdata
=
{
.
init
=
eukrea_cpuimx27_otg_init
,
.
portsc
=
MXC_EHCI_MODE_ULPI
,
};
static
int
eukrea_cpuimx27_usbh2_init
(
struct
platform_device
*
pdev
)
{
return
mx27_initialize_usb_hw
(
pdev
->
id
,
MXC_EHCI_INTERFACE_DIFF_UNI
);
}
static
struct
mxc_usbh_platform_data
usbh2_pdata
__initdata
=
{
.
init
=
eukrea_cpuimx27_usbh2_init
,
.
portsc
=
MXC_EHCI_MODE_ULPI
,
};
static
const
struct
fsl_usb2_platform_data
otg_device_pdata
__initconst
=
{
.
operating_mode
=
FSL_USB2_DR_DEVICE
,
.
phy_mode
=
FSL_USB2_PHY_ULPI
,
};
static
bool
otg_mode_host
__initdata
;
static
int
__init
eukrea_cpuimx27_otg_mode
(
char
*
options
)
{
if
(
!
strcmp
(
options
,
"host"
))
otg_mode_host
=
true
;
else
if
(
!
strcmp
(
options
,
"device"
))
otg_mode_host
=
false
;
else
pr_info
(
"otg_mode neither
\"
host
\"
nor
\"
device
\"
. "
"Defaulting to device
\n
"
);
return
1
;
}
__setup
(
"otg_mode="
,
eukrea_cpuimx27_otg_mode
);
static
void
__init
eukrea_cpuimx27_init
(
void
)
{
imx27_soc_init
();
mxc_gpio_setup_multiple_pins
(
eukrea_cpuimx27_pins
,
ARRAY_SIZE
(
eukrea_cpuimx27_pins
),
"CPUIMX27"
);
imx27_add_imx_uart0
(
&
uart_pdata
);
imx27_add_mxc_nand
(
&
cpuimx27_nand_board_info
);
i2c_register_board_info
(
0
,
eukrea_cpuimx27_i2c_devices
,
ARRAY_SIZE
(
eukrea_cpuimx27_i2c_devices
));
imx27_add_imx_i2c
(
0
,
&
cpuimx27_i2c1_data
);
imx27_add_fec
(
NULL
);
platform_add_devices
(
platform_devices
,
ARRAY_SIZE
(
platform_devices
));
imx27_add_imx2_wdt
();
imx27_add_mxc_w1
();
#if defined(CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2)
/* SDHC2 can be used for Wifi */
imx27_add_mxc_mmc
(
1
,
NULL
);
#endif
#if defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4)
/* in which case UART4 is also used for Bluetooth */
imx27_add_imx_uart3
(
&
uart_pdata
);
#endif
#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
serial_platform_data
[
0
].
irq
=
IMX_GPIO_NR
(
2
,
23
);
serial_platform_data
[
1
].
irq
=
IMX_GPIO_NR
(
2
,
22
);
serial_platform_data
[
2
].
irq
=
IMX_GPIO_NR
(
2
,
27
);
serial_platform_data
[
3
].
irq
=
IMX_GPIO_NR
(
2
,
30
);
platform_device_register
(
&
serial_device
);
#endif
if
(
otg_mode_host
)
{
otg_pdata
.
otg
=
imx_otg_ulpi_create
(
ULPI_OTG_DRVVBUS
|
ULPI_OTG_DRVVBUS_EXT
);
if
(
otg_pdata
.
otg
)
imx27_add_mxc_ehci_otg
(
&
otg_pdata
);
}
else
{
imx27_add_fsl_usb2_udc
(
&
otg_device_pdata
);
}
usbh2_pdata
.
otg
=
imx_otg_ulpi_create
(
ULPI_OTG_DRVVBUS
|
ULPI_OTG_DRVVBUS_EXT
);
if
(
usbh2_pdata
.
otg
)
imx27_add_mxc_ehci_hs
(
2
,
&
usbh2_pdata
);
#ifdef CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD
eukrea_mbimx27_baseboard_init
();
#endif
}
static
void
__init
eukrea_cpuimx27_timer_init
(
void
)
{
mx27_clocks_init
(
26000000
);
}
MACHINE_START
(
EUKREA_CPUIMX27
,
"EUKREA CPUIMX27"
)
.
atag_offset
=
0x100
,
.
map_io
=
mx27_map_io
,
.
init_early
=
imx27_init_early
,
.
init_irq
=
mx27_init_irq
,
.
init_time
=
eukrea_cpuimx27_timer_init
,
.
init_machine
=
eukrea_cpuimx27_init
,
.
restart
=
mxc_restart
,
MACHINE_END
arch/arm/mach-imx/mach-imx6sx.c
浏览文件 @
155b2fd3
...
...
@@ -42,6 +42,9 @@ static void __init imx6sx_init_irq(void)
static
void
__init
imx6sx_init_late
(
void
)
{
imx6q_cpuidle_init
();
if
(
IS_ENABLED
(
CONFIG_ARM_IMX6Q_CPUFREQ
))
platform_device_register_simple
(
"imx6q-cpufreq"
,
-
1
,
NULL
,
0
);
}
static
const
char
*
const
imx6sx_dt_compat
[]
__initconst
=
{
...
...
arch/arm/mach-imx/mach-mx1ads.c
已删除
100644 → 0
浏览文件 @
ee641009
/*
* arch/arm/mach-imx/mach-mx1ads.c
*
* Initially based on:
* linux-2.6.7-imx/arch/arm/mach-imx/scb9328.c
* Copyright (c) 2004 Sascha Hauer <sascha@saschahauer.de>
*
* 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 <linux/i2c.h>
#include <linux/i2c/pcf857x.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/mtd/physmap.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include "common.h"
#include "devices-imx1.h"
#include "hardware.h"
#include "iomux-mx1.h"
static
const
int
mx1ads_pins
[]
__initconst
=
{
/* UART1 */
PC9_PF_UART1_CTS
,
PC10_PF_UART1_RTS
,
PC11_PF_UART1_TXD
,
PC12_PF_UART1_RXD
,
/* UART2 */
PB28_PF_UART2_CTS
,
PB29_PF_UART2_RTS
,
PB30_PF_UART2_TXD
,
PB31_PF_UART2_RXD
,
/* I2C */
PA15_PF_I2C_SDA
,
PA16_PF_I2C_SCL
,
/* SPI */
PC13_PF_SPI1_SPI_RDY
,
PC14_PF_SPI1_SCLK
,
PC15_PF_SPI1_SS
,
PC16_PF_SPI1_MISO
,
PC17_PF_SPI1_MOSI
,
};
/*
* UARTs platform data
*/
static
const
struct
imxuart_platform_data
uart0_pdata
__initconst
=
{
.
flags
=
IMXUART_HAVE_RTSCTS
,
};
static
const
struct
imxuart_platform_data
uart1_pdata
__initconst
=
{
.
flags
=
IMXUART_HAVE_RTSCTS
,
};
/*
* Physmap flash
*/
static
const
struct
physmap_flash_data
mx1ads_flash_data
__initconst
=
{
.
width
=
4
,
/* bankwidth in bytes */
};
static
const
struct
resource
flash_resource
__initconst
=
{
.
start
=
MX1_CS0_PHYS
,
.
end
=
MX1_CS0_PHYS
+
SZ_32M
-
1
,
.
flags
=
IORESOURCE_MEM
,
};
/*
* I2C
*/
static
struct
pcf857x_platform_data
pcf857x_data
[]
=
{
{
.
gpio_base
=
4
*
32
,
},
{
.
gpio_base
=
4
*
32
+
16
,
}
};
static
const
struct
imxi2c_platform_data
mx1ads_i2c_data
__initconst
=
{
.
bitrate
=
100000
,
};
static
struct
i2c_board_info
mx1ads_i2c_devices
[]
=
{
{
I2C_BOARD_INFO
(
"pcf8575"
,
0x22
),
.
platform_data
=
&
pcf857x_data
[
0
],
},
{
I2C_BOARD_INFO
(
"pcf8575"
,
0x24
),
.
platform_data
=
&
pcf857x_data
[
1
],
},
};
/*
* Board init
*/
static
void
__init
mx1ads_init
(
void
)
{
imx1_soc_init
();
mxc_gpio_setup_multiple_pins
(
mx1ads_pins
,
ARRAY_SIZE
(
mx1ads_pins
),
"mx1ads"
);
/* UART */
imx1_add_imx_uart0
(
&
uart0_pdata
);
imx1_add_imx_uart1
(
&
uart1_pdata
);
/* Physmap flash */
platform_device_register_resndata
(
NULL
,
"physmap-flash"
,
0
,
&
flash_resource
,
1
,
&
mx1ads_flash_data
,
sizeof
(
mx1ads_flash_data
));
/* I2C */
i2c_register_board_info
(
0
,
mx1ads_i2c_devices
,
ARRAY_SIZE
(
mx1ads_i2c_devices
));
imx1_add_imx_i2c
(
&
mx1ads_i2c_data
);
}
static
void
__init
mx1ads_timer_init
(
void
)
{
mx1_clocks_init
(
32000
);
}
MACHINE_START
(
MX1ADS
,
"Freescale MX1ADS"
)
/* Maintainer: Sascha Hauer, Pengutronix */
.
atag_offset
=
0x100
,
.
map_io
=
mx1_map_io
,
.
init_early
=
imx1_init_early
,
.
init_irq
=
mx1_init_irq
,
.
init_time
=
mx1ads_timer_init
,
.
init_machine
=
mx1ads_init
,
.
restart
=
mxc_restart
,
MACHINE_END
MACHINE_START
(
MXLADS
,
"Freescale MXLADS"
)
.
atag_offset
=
0x100
,
.
map_io
=
mx1_map_io
,
.
init_early
=
imx1_init_early
,
.
init_irq
=
mx1_init_irq
,
.
init_time
=
mx1ads_timer_init
,
.
init_machine
=
mx1ads_init
,
.
restart
=
mxc_restart
,
MACHINE_END
arch/arm/mach-imx/mach-mx31_3ds.c
浏览文件 @
155b2fd3
...
...
@@ -307,7 +307,7 @@ static int mx31_3ds_sdhc1_init(struct device *dev,
ret
=
gpio_request_array
(
mx31_3ds_sdhc1_gpios
,
ARRAY_SIZE
(
mx31_3ds_sdhc1_gpios
));
if
(
ret
)
{
pr_warn
ing
(
"Unable to request the SD/MMC GPIOs.
\n
"
);
pr_warn
(
"Unable to request the SD/MMC GPIOs.
\n
"
);
return
ret
;
}
...
...
@@ -316,7 +316,7 @@ static int mx31_3ds_sdhc1_init(struct device *dev,
IRQF_TRIGGER_FALLING
|
IRQF_TRIGGER_RISING
,
"sdhc1-detect"
,
data
);
if
(
ret
)
{
pr_warn
ing
(
"Unable to request the SD/MMC card-detect IRQ.
\n
"
);
pr_warn
(
"Unable to request the SD/MMC card-detect IRQ.
\n
"
);
goto
gpio_free
;
}
...
...
arch/arm/mach-imx/mach-mx31lite.c
浏览文件 @
155b2fd3
...
...
@@ -270,7 +270,7 @@ static void __init mx31lite_init(void)
/* SMSC9117 IRQ pin */
ret
=
gpio_request
(
IOMUX_TO_GPIO
(
MX31_PIN_SFS6
),
"sms9117-irq"
);
if
(
ret
)
pr_warn
ing
(
"could not get LAN irq gpio
\n
"
);
pr_warn
(
"could not get LAN irq gpio
\n
"
);
else
{
gpio_direction_input
(
IOMUX_TO_GPIO
(
MX31_PIN_SFS6
));
smsc911x_resources
[
1
].
start
=
...
...
arch/arm/mach-imx/mach-mxt_td60.c
已删除
100644 → 0
浏览文件 @
ee641009
/*
* Copyright (C) 2000 Deep Blue Solutions Ltd
* Copyright (C) 2002 Shane Nay (shane@minirl.com)
* Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
*
* 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.
*/
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/i2c.h>
#include <linux/irq.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include <asm/mach/map.h>
#include <linux/gpio.h>
#include <linux/platform_data/pca953x.h>
#include "common.h"
#include "devices-imx27.h"
#include "hardware.h"
#include "iomux-mx27.h"
static
const
int
mxt_td60_pins
[]
__initconst
=
{
/* UART0 */
PE12_PF_UART1_TXD
,
PE13_PF_UART1_RXD
,
PE14_PF_UART1_CTS
,
PE15_PF_UART1_RTS
,
/* UART1 */
PE3_PF_UART2_CTS
,
PE4_PF_UART2_RTS
,
PE6_PF_UART2_TXD
,
PE7_PF_UART2_RXD
,
/* UART2 */
PE8_PF_UART3_TXD
,
PE9_PF_UART3_RXD
,
PE10_PF_UART3_CTS
,
PE11_PF_UART3_RTS
,
/* FEC */
PD0_AIN_FEC_TXD0
,
PD1_AIN_FEC_TXD1
,
PD2_AIN_FEC_TXD2
,
PD3_AIN_FEC_TXD3
,
PD4_AOUT_FEC_RX_ER
,
PD5_AOUT_FEC_RXD1
,
PD6_AOUT_FEC_RXD2
,
PD7_AOUT_FEC_RXD3
,
PD8_AF_FEC_MDIO
,
PD9_AIN_FEC_MDC
,
PD10_AOUT_FEC_CRS
,
PD11_AOUT_FEC_TX_CLK
,
PD12_AOUT_FEC_RXD0
,
PD13_AOUT_FEC_RX_DV
,
PD14_AOUT_FEC_RX_CLK
,
PD15_AOUT_FEC_COL
,
PD16_AIN_FEC_TX_ER
,
PF23_AIN_FEC_TX_EN
,
/* I2C1 */
PD17_PF_I2C_DATA
,
PD18_PF_I2C_CLK
,
/* I2C2 */
PC5_PF_I2C2_SDA
,
PC6_PF_I2C2_SCL
,
/* FB */
PA5_PF_LSCLK
,
PA6_PF_LD0
,
PA7_PF_LD1
,
PA8_PF_LD2
,
PA9_PF_LD3
,
PA10_PF_LD4
,
PA11_PF_LD5
,
PA12_PF_LD6
,
PA13_PF_LD7
,
PA14_PF_LD8
,
PA15_PF_LD9
,
PA16_PF_LD10
,
PA17_PF_LD11
,
PA18_PF_LD12
,
PA19_PF_LD13
,
PA20_PF_LD14
,
PA21_PF_LD15
,
PA22_PF_LD16
,
PA23_PF_LD17
,
PA25_PF_CLS
,
PA27_PF_SPL_SPR
,
PA28_PF_HSYNC
,
PA29_PF_VSYNC
,
PA30_PF_CONTRAST
,
PA31_PF_OE_ACD
,
/* OWIRE */
PE16_AF_OWIRE
,
/* SDHC1*/
PE18_PF_SD1_D0
,
PE19_PF_SD1_D1
,
PE20_PF_SD1_D2
,
PE21_PF_SD1_D3
,
PE22_PF_SD1_CMD
,
PE23_PF_SD1_CLK
,
PF8_AF_ATA_IORDY
,
/* SDHC2*/
PB4_PF_SD2_D0
,
PB5_PF_SD2_D1
,
PB6_PF_SD2_D2
,
PB7_PF_SD2_D3
,
PB8_PF_SD2_CMD
,
PB9_PF_SD2_CLK
,
};
static
const
struct
mxc_nand_platform_data
mxt_td60_nand_board_info
__initconst
=
{
.
width
=
1
,
.
hw_ecc
=
1
,
};
static
const
struct
imxi2c_platform_data
mxt_td60_i2c0_data
__initconst
=
{
.
bitrate
=
100000
,
};
/* PCA9557 */
static
int
mxt_td60_pca9557_setup
(
struct
i2c_client
*
client
,
unsigned
gpio_base
,
unsigned
ngpio
,
void
*
context
)
{
static
int
mxt_td60_gpio_value
[]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
1
};
int
n
;
for
(
n
=
0
;
n
<
ARRAY_SIZE
(
mxt_td60_gpio_value
);
++
n
)
{
gpio_request
(
gpio_base
+
n
,
"MXT_TD60 GPIO Exp"
);
if
(
mxt_td60_gpio_value
[
n
]
<
0
)
gpio_direction_input
(
gpio_base
+
n
);
else
gpio_direction_output
(
gpio_base
+
n
,
mxt_td60_gpio_value
[
n
]);
gpio_export
(
gpio_base
+
n
,
0
);
}
return
0
;
}
static
struct
pca953x_platform_data
mxt_td60_pca9557_pdata
=
{
.
gpio_base
=
240
,
/* place PCA9557 after all MX27 gpio pins */
.
invert
=
0
,
/* Do not invert */
.
setup
=
mxt_td60_pca9557_setup
,
};
static
struct
i2c_board_info
mxt_td60_i2c_devices
[]
=
{
{
I2C_BOARD_INFO
(
"pca9557"
,
0x18
),
.
platform_data
=
&
mxt_td60_pca9557_pdata
,
},
};
static
const
struct
imxi2c_platform_data
mxt_td60_i2c1_data
__initconst
=
{
.
bitrate
=
100000
,
};
static
struct
i2c_board_info
mxt_td60_i2c2_devices
[]
=
{
};
static
struct
imx_fb_videomode
mxt_td60_modes
[]
=
{
{
.
mode
=
{
.
name
=
"Chimei LW700AT9003"
,
.
refresh
=
60
,
.
xres
=
800
,
.
yres
=
480
,
.
pixclock
=
30303
,
.
hsync_len
=
64
,
.
left_margin
=
0x67
,
.
right_margin
=
0x68
,
.
vsync_len
=
16
,
.
upper_margin
=
0x0f
,
.
lower_margin
=
0x0f
,
},
.
bpp
=
16
,
.
pcr
=
0xFA208B83
,
},
};
static
const
struct
imx_fb_platform_data
mxt_td60_fb_data
__initconst
=
{
.
mode
=
mxt_td60_modes
,
.
num_modes
=
ARRAY_SIZE
(
mxt_td60_modes
),
/*
* - HSYNC active high
* - VSYNC active high
* - clk notenabled while idle
* - clock inverted
* - data not inverted
* - data enable low active
* - enable sharp mode
*/
.
pwmr
=
0x00A903FF
,
.
lscr1
=
0x00120300
,
.
dmacr
=
0x00020010
,
};
static
int
mxt_td60_sdhc1_init
(
struct
device
*
dev
,
irq_handler_t
detect_irq
,
void
*
data
)
{
return
request_irq
(
gpio_to_irq
(
IMX_GPIO_NR
(
6
,
8
)),
detect_irq
,
IRQF_TRIGGER_FALLING
,
"sdhc1-card-detect"
,
data
);
}
static
void
mxt_td60_sdhc1_exit
(
struct
device
*
dev
,
void
*
data
)
{
free_irq
(
gpio_to_irq
(
IMX_GPIO_NR
(
6
,
8
)),
data
);
}
static
const
struct
imxmmc_platform_data
sdhc1_pdata
__initconst
=
{
.
init
=
mxt_td60_sdhc1_init
,
.
exit
=
mxt_td60_sdhc1_exit
,
};
static
const
struct
imxuart_platform_data
uart_pdata
__initconst
=
{
.
flags
=
IMXUART_HAVE_RTSCTS
,
};
static
void
__init
mxt_td60_board_init
(
void
)
{
imx27_soc_init
();
mxc_gpio_setup_multiple_pins
(
mxt_td60_pins
,
ARRAY_SIZE
(
mxt_td60_pins
),
"MXT_TD60"
);
imx27_add_imx_uart0
(
&
uart_pdata
);
imx27_add_imx_uart1
(
&
uart_pdata
);
imx27_add_imx_uart2
(
&
uart_pdata
);
imx27_add_mxc_nand
(
&
mxt_td60_nand_board_info
);
i2c_register_board_info
(
0
,
mxt_td60_i2c_devices
,
ARRAY_SIZE
(
mxt_td60_i2c_devices
));
i2c_register_board_info
(
1
,
mxt_td60_i2c2_devices
,
ARRAY_SIZE
(
mxt_td60_i2c2_devices
));
imx27_add_imx_i2c
(
0
,
&
mxt_td60_i2c0_data
);
imx27_add_imx_i2c
(
1
,
&
mxt_td60_i2c1_data
);
imx27_add_imx_fb
(
&
mxt_td60_fb_data
);
imx27_add_mxc_mmc
(
0
,
&
sdhc1_pdata
);
imx27_add_fec
(
NULL
);
}
static
void
__init
mxt_td60_timer_init
(
void
)
{
mx27_clocks_init
(
26000000
);
}
MACHINE_START
(
MXT_TD60
,
"Maxtrack i-MXT TD60"
)
/* maintainer: Maxtrack Industrial */
.
atag_offset
=
0x100
,
.
map_io
=
mx27_map_io
,
.
init_early
=
imx27_init_early
,
.
init_irq
=
mx27_init_irq
,
.
init_time
=
mxt_td60_timer_init
,
.
init_machine
=
mxt_td60_board_init
,
.
restart
=
mxc_restart
,
MACHINE_END
arch/arm/mach-imx/mach-pcm037.c
浏览文件 @
155b2fd3
...
...
@@ -58,7 +58,7 @@ static int __init pcm037_variant_setup(char *str)
if
(
!
strcmp
(
"eet"
,
str
))
pcm037_instance
=
PCM037_EET
;
else
if
(
strcmp
(
"pcm970"
,
str
))
pr_warn
ing
(
"Unknown pcm037 baseboard variant %s
\n
"
,
str
);
pr_warn
(
"Unknown pcm037 baseboard variant %s
\n
"
,
str
);
return
1
;
}
...
...
@@ -624,7 +624,7 @@ static void __init pcm037_init(void)
/* LAN9217 IRQ pin */
ret
=
gpio_request
(
IOMUX_TO_GPIO
(
MX31_PIN_GPIO3_1
),
"lan9217-irq"
);
if
(
ret
)
pr_warn
ing
(
"could not get LAN irq gpio
\n
"
);
pr_warn
(
"could not get LAN irq gpio
\n
"
);
else
{
gpio_direction_input
(
IOMUX_TO_GPIO
(
MX31_PIN_GPIO3_1
));
smsc911x_resources
[
1
].
start
=
...
...
arch/arm/mach-imx/mach-pcm038.c
已删除
100644 → 0
浏览文件 @
ee641009
/*
* Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
* Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <linux/i2c.h>
#include <linux/platform_data/at24.h>
#include <linux/io.h>
#include <linux/mtd/plat-ram.h>
#include <linux/mtd/physmap.h>
#include <linux/platform_device.h>
#include <linux/regulator/machine.h>
#include <linux/mfd/mc13783.h>
#include <linux/spi/spi.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/time.h>
#include "board-pcm038.h"
#include "common.h"
#include "devices-imx27.h"
#include "ehci.h"
#include "hardware.h"
#include "iomux-mx27.h"
#include "ulpi.h"
static
const
int
pcm038_pins
[]
__initconst
=
{
/* UART1 */
PE12_PF_UART1_TXD
,
PE13_PF_UART1_RXD
,
PE14_PF_UART1_CTS
,
PE15_PF_UART1_RTS
,
/* UART2 */
PE3_PF_UART2_CTS
,
PE4_PF_UART2_RTS
,
PE6_PF_UART2_TXD
,
PE7_PF_UART2_RXD
,
/* UART3 */
PE8_PF_UART3_TXD
,
PE9_PF_UART3_RXD
,
PE10_PF_UART3_CTS
,
PE11_PF_UART3_RTS
,
/* FEC */
PD0_AIN_FEC_TXD0
,
PD1_AIN_FEC_TXD1
,
PD2_AIN_FEC_TXD2
,
PD3_AIN_FEC_TXD3
,
PD4_AOUT_FEC_RX_ER
,
PD5_AOUT_FEC_RXD1
,
PD6_AOUT_FEC_RXD2
,
PD7_AOUT_FEC_RXD3
,
PD8_AF_FEC_MDIO
,
PD9_AIN_FEC_MDC
,
PD10_AOUT_FEC_CRS
,
PD11_AOUT_FEC_TX_CLK
,
PD12_AOUT_FEC_RXD0
,
PD13_AOUT_FEC_RX_DV
,
PD14_AOUT_FEC_RX_CLK
,
PD15_AOUT_FEC_COL
,
PD16_AIN_FEC_TX_ER
,
PF23_AIN_FEC_TX_EN
,
/* I2C2 */
PC5_PF_I2C2_SDA
,
PC6_PF_I2C2_SCL
,
/* SPI1 */
PD25_PF_CSPI1_RDY
,
PD29_PF_CSPI1_SCLK
,
PD30_PF_CSPI1_MISO
,
PD31_PF_CSPI1_MOSI
,
/* SSI1 */
PC20_PF_SSI1_FS
,
PC21_PF_SSI1_RXD
,
PC22_PF_SSI1_TXD
,
PC23_PF_SSI1_CLK
,
/* SSI4 */
PC16_PF_SSI4_FS
,
PC17_PF_SSI4_RXD
,
PC18_PF_SSI4_TXD
,
PC19_PF_SSI4_CLK
,
/* USB host */
PA0_PF_USBH2_CLK
,
PA1_PF_USBH2_DIR
,
PA2_PF_USBH2_DATA7
,
PA3_PF_USBH2_NXT
,
PA4_PF_USBH2_STP
,
PD19_AF_USBH2_DATA4
,
PD20_AF_USBH2_DATA3
,
PD21_AF_USBH2_DATA6
,
PD22_AF_USBH2_DATA0
,
PD23_AF_USBH2_DATA2
,
PD24_AF_USBH2_DATA1
,
PD26_AF_USBH2_DATA5
,
};
/*
* Phytec's PCM038 comes with 2MiB battery buffered SRAM,
* 16 bit width
*/
static
struct
platdata_mtd_ram
pcm038_sram_data
=
{
.
bankwidth
=
2
,
};
static
struct
resource
pcm038_sram_resource
=
{
.
start
=
MX27_CS1_BASE_ADDR
,
.
end
=
MX27_CS1_BASE_ADDR
+
512
*
1024
-
1
,
.
flags
=
IORESOURCE_MEM
,
};
static
struct
platform_device
pcm038_sram_mtd_device
=
{
.
name
=
"mtd-ram"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
pcm038_sram_data
,
},
.
num_resources
=
1
,
.
resource
=
&
pcm038_sram_resource
,
};
/*
* Phytec's phyCORE-i.MX27 comes with 32MiB flash,
* 16 bit width
*/
static
struct
physmap_flash_data
pcm038_flash_data
=
{
.
width
=
2
,
};
static
struct
resource
pcm038_flash_resource
=
{
.
start
=
0xc0000000
,
.
end
=
0xc1ffffff
,
.
flags
=
IORESOURCE_MEM
,
};
static
struct
platform_device
pcm038_nor_mtd_device
=
{
.
name
=
"physmap-flash"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
pcm038_flash_data
,
},
.
num_resources
=
1
,
.
resource
=
&
pcm038_flash_resource
,
};
static
const
struct
imxuart_platform_data
uart_pdata
__initconst
=
{
.
flags
=
IMXUART_HAVE_RTSCTS
,
};
static
const
struct
mxc_nand_platform_data
pcm038_nand_board_info
__initconst
=
{
.
width
=
1
,
.
hw_ecc
=
1
,
};
static
struct
platform_device
*
platform_devices
[]
__initdata
=
{
&
pcm038_nor_mtd_device
,
&
pcm038_sram_mtd_device
,
};
/* On pcm038 there's a sram attached to CS1, we enable the chipselect here and
* setup other stuffs to access the sram. */
static
void
__init
pcm038_init_sram
(
void
)
{
__raw_writel
(
0x0000d843
,
MX27_IO_ADDRESS
(
MX27_WEIM_CSCRxU
(
1
)));
__raw_writel
(
0x22252521
,
MX27_IO_ADDRESS
(
MX27_WEIM_CSCRxL
(
1
)));
__raw_writel
(
0x22220a00
,
MX27_IO_ADDRESS
(
MX27_WEIM_CSCRxA
(
1
)));
}
static
const
struct
imxi2c_platform_data
pcm038_i2c1_data
__initconst
=
{
.
bitrate
=
100000
,
};
static
struct
at24_platform_data
board_eeprom
=
{
.
byte_len
=
4096
,
.
page_size
=
32
,
.
flags
=
AT24_FLAG_ADDR16
,
};
static
struct
i2c_board_info
pcm038_i2c_devices
[]
=
{
{
I2C_BOARD_INFO
(
"at24"
,
0x52
),
/* E0=0, E1=1, E2=0 */
.
platform_data
=
&
board_eeprom
,
},
{
I2C_BOARD_INFO
(
"pcf8563"
,
0x51
),
},
{
I2C_BOARD_INFO
(
"lm75"
,
0x4a
),
}
};
static
int
pcm038_spi_cs
[]
=
{
GPIO_PORTD
+
28
};
static
const
struct
spi_imx_master
pcm038_spi0_data
__initconst
=
{
.
chipselect
=
pcm038_spi_cs
,
.
num_chipselect
=
ARRAY_SIZE
(
pcm038_spi_cs
),
};
static
struct
regulator_consumer_supply
sdhc1_consumers
[]
=
{
{
.
dev_name
=
"imx21-mmc.1"
,
.
supply
=
"sdhc_vcc"
,
},
};
static
struct
regulator_init_data
sdhc1_data
=
{
.
constraints
=
{
.
min_uV
=
3000000
,
.
max_uV
=
3400000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_MODE
|
REGULATOR_CHANGE_STATUS
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_FAST
,
.
always_on
=
0
,
.
boot_on
=
0
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
sdhc1_consumers
),
.
consumer_supplies
=
sdhc1_consumers
,
};
static
struct
regulator_consumer_supply
cam_consumers
[]
=
{
{
.
dev_name
=
NULL
,
.
supply
=
"imx_cam_vcc"
,
},
};
static
struct
regulator_init_data
cam_data
=
{
.
constraints
=
{
.
min_uV
=
3000000
,
.
max_uV
=
3400000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_MODE
|
REGULATOR_CHANGE_STATUS
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_FAST
,
.
always_on
=
0
,
.
boot_on
=
0
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
cam_consumers
),
.
consumer_supplies
=
cam_consumers
,
};
static
struct
mc13xxx_regulator_init_data
pcm038_regulators
[]
=
{
{
.
id
=
MC13783_REG_VCAM
,
.
init_data
=
&
cam_data
,
},
{
.
id
=
MC13783_REG_VMMC1
,
.
init_data
=
&
sdhc1_data
,
},
};
static
struct
mc13xxx_platform_data
pcm038_pmic
=
{
.
regulators
=
{
.
regulators
=
pcm038_regulators
,
.
num_regulators
=
ARRAY_SIZE
(
pcm038_regulators
),
},
.
flags
=
MC13XXX_USE_ADC
|
MC13XXX_USE_TOUCHSCREEN
,
};
static
struct
spi_board_info
pcm038_spi_board_info
[]
__initdata
=
{
{
.
modalias
=
"mc13783"
,
/* irq number is run-time assigned */
.
max_speed_hz
=
300000
,
.
bus_num
=
0
,
.
chip_select
=
0
,
.
platform_data
=
&
pcm038_pmic
,
.
mode
=
SPI_CS_HIGH
,
}
};
static
int
pcm038_usbh2_init
(
struct
platform_device
*
pdev
)
{
return
mx27_initialize_usb_hw
(
pdev
->
id
,
MXC_EHCI_POWER_PINS_ENABLED
|
MXC_EHCI_INTERFACE_DIFF_UNI
);
}
static
const
struct
mxc_usbh_platform_data
usbh2_pdata
__initconst
=
{
.
init
=
pcm038_usbh2_init
,
.
portsc
=
MXC_EHCI_MODE_ULPI
,
};
static
void
__init
pcm038_init
(
void
)
{
imx27_soc_init
();
mxc_gpio_setup_multiple_pins
(
pcm038_pins
,
ARRAY_SIZE
(
pcm038_pins
),
"PCM038"
);
pcm038_init_sram
();
imx27_add_imx_uart0
(
&
uart_pdata
);
imx27_add_imx_uart1
(
&
uart_pdata
);
imx27_add_imx_uart2
(
&
uart_pdata
);
mxc_gpio_mode
(
PE16_AF_OWIRE
);
imx27_add_mxc_nand
(
&
pcm038_nand_board_info
);
/* only the i2c master 1 is used on this CPU card */
i2c_register_board_info
(
1
,
pcm038_i2c_devices
,
ARRAY_SIZE
(
pcm038_i2c_devices
));
imx27_add_imx_i2c
(
1
,
&
pcm038_i2c1_data
);
/* PE18 for user-LED D40 */
mxc_gpio_mode
(
GPIO_PORTE
|
18
|
GPIO_GPIO
|
GPIO_OUT
);
mxc_gpio_mode
(
GPIO_PORTD
|
28
|
GPIO_GPIO
|
GPIO_OUT
);
/* MC13783 IRQ */
mxc_gpio_mode
(
GPIO_PORTB
|
23
|
GPIO_GPIO
|
GPIO_IN
);
imx27_add_spi_imx0
(
&
pcm038_spi0_data
);
pcm038_spi_board_info
[
0
].
irq
=
gpio_to_irq
(
IMX_GPIO_NR
(
2
,
23
));
spi_register_board_info
(
pcm038_spi_board_info
,
ARRAY_SIZE
(
pcm038_spi_board_info
));
imx27_add_mxc_ehci_hs
(
2
,
&
usbh2_pdata
);
imx27_add_fec
(
NULL
);
platform_add_devices
(
platform_devices
,
ARRAY_SIZE
(
platform_devices
));
imx27_add_imx2_wdt
();
imx27_add_mxc_w1
();
#ifdef CONFIG_MACH_PCM970_BASEBOARD
pcm970_baseboard_init
();
#endif
}
static
void
__init
pcm038_timer_init
(
void
)
{
mx27_clocks_init
(
26000000
);
}
MACHINE_START
(
PCM038
,
"phyCORE-i.MX27"
)
.
atag_offset
=
0x100
,
.
map_io
=
mx27_map_io
,
.
init_early
=
imx27_init_early
,
.
init_irq
=
mx27_init_irq
,
.
init_time
=
pcm038_timer_init
,
.
init_machine
=
pcm038_init
,
.
restart
=
mxc_restart
,
MACHINE_END
arch/arm/mach-imx/mxc.h
浏览文件 @
155b2fd3
...
...
@@ -43,6 +43,8 @@
#define IMX_CHIP_REVISION_1_1 0x11
#define IMX_CHIP_REVISION_1_2 0x12
#define IMX_CHIP_REVISION_1_3 0x13
#define IMX_CHIP_REVISION_1_4 0x14
#define IMX_CHIP_REVISION_1_5 0x15
#define IMX_CHIP_REVISION_2_0 0x20
#define IMX_CHIP_REVISION_2_1 0x21
#define IMX_CHIP_REVISION_2_2 0x22
...
...
arch/arm/mach-imx/pcm970-baseboard.c
已删除
100644 → 0
浏览文件 @
ee641009
/*
* Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/platform_device.h>
#include <linux/can/platform/sja1000.h>
#include <asm/mach/arch.h>
#include "common.h"
#include "devices-imx27.h"
#include "hardware.h"
#include "iomux-mx27.h"
static
const
int
pcm970_pins
[]
__initconst
=
{
/* SDHC */
PB4_PF_SD2_D0
,
PB5_PF_SD2_D1
,
PB6_PF_SD2_D2
,
PB7_PF_SD2_D3
,
PB8_PF_SD2_CMD
,
PB9_PF_SD2_CLK
,
/* display */
PA5_PF_LSCLK
,
PA6_PF_LD0
,
PA7_PF_LD1
,
PA8_PF_LD2
,
PA9_PF_LD3
,
PA10_PF_LD4
,
PA11_PF_LD5
,
PA12_PF_LD6
,
PA13_PF_LD7
,
PA14_PF_LD8
,
PA15_PF_LD9
,
PA16_PF_LD10
,
PA17_PF_LD11
,
PA18_PF_LD12
,
PA19_PF_LD13
,
PA20_PF_LD14
,
PA21_PF_LD15
,
PA22_PF_LD16
,
PA23_PF_LD17
,
PA24_PF_REV
,
PA25_PF_CLS
,
PA26_PF_PS
,
PA27_PF_SPL_SPR
,
PA28_PF_HSYNC
,
PA29_PF_VSYNC
,
PA30_PF_CONTRAST
,
PA31_PF_OE_ACD
,
/*
* it seems the data line misses a pullup, so we must enable
* the internal pullup as a local workaround
*/
PD17_PF_I2C_DATA
|
GPIO_PUEN
,
PD18_PF_I2C_CLK
,
/* Camera */
PB10_PF_CSI_D0
,
PB11_PF_CSI_D1
,
PB12_PF_CSI_D2
,
PB13_PF_CSI_D3
,
PB14_PF_CSI_D4
,
PB15_PF_CSI_MCLK
,
PB16_PF_CSI_PIXCLK
,
PB17_PF_CSI_D5
,
PB18_PF_CSI_D6
,
PB19_PF_CSI_D7
,
PB20_PF_CSI_VSYNC
,
PB21_PF_CSI_HSYNC
,
};
static
int
pcm970_sdhc2_get_ro
(
struct
device
*
dev
)
{
return
gpio_get_value
(
GPIO_PORTC
+
28
);
}
static
int
pcm970_sdhc2_init
(
struct
device
*
dev
,
irq_handler_t
detect_irq
,
void
*
data
)
{
int
ret
;
ret
=
request_irq
(
gpio_to_irq
(
IMX_GPIO_NR
(
3
,
29
)),
detect_irq
,
IRQF_TRIGGER_FALLING
,
"imx-mmc-detect"
,
data
);
if
(
ret
)
return
ret
;
ret
=
gpio_request
(
GPIO_PORTC
+
28
,
"imx-mmc-ro"
);
if
(
ret
)
{
free_irq
(
gpio_to_irq
(
IMX_GPIO_NR
(
3
,
29
)),
data
);
return
ret
;
}
gpio_direction_input
(
GPIO_PORTC
+
28
);
return
0
;
}
static
void
pcm970_sdhc2_exit
(
struct
device
*
dev
,
void
*
data
)
{
free_irq
(
gpio_to_irq
(
IMX_GPIO_NR
(
3
,
29
)),
data
);
gpio_free
(
GPIO_PORTC
+
28
);
}
static
const
struct
imxmmc_platform_data
sdhc_pdata
__initconst
=
{
.
get_ro
=
pcm970_sdhc2_get_ro
,
.
init
=
pcm970_sdhc2_init
,
.
exit
=
pcm970_sdhc2_exit
,
};
static
struct
imx_fb_videomode
pcm970_modes
[]
=
{
{
.
mode
=
{
.
name
=
"Sharp-LQ035Q7"
,
.
refresh
=
60
,
.
xres
=
240
,
.
yres
=
320
,
.
pixclock
=
188679
,
/* in ps (5.3MHz) */
.
hsync_len
=
7
,
.
left_margin
=
5
,
.
right_margin
=
16
,
.
vsync_len
=
1
,
.
upper_margin
=
7
,
.
lower_margin
=
9
,
},
/*
* - HSYNC active high
* - VSYNC active high
* - clk notenabled while idle
* - clock not inverted
* - data not inverted
* - data enable low active
* - enable sharp mode
*/
.
pcr
=
0xF00080C0
,
.
bpp
=
16
,
},
{
.
mode
=
{
.
name
=
"TX090"
,
.
refresh
=
60
,
.
xres
=
240
,
.
yres
=
320
,
.
pixclock
=
38255
,
.
left_margin
=
144
,
.
right_margin
=
0
,
.
upper_margin
=
7
,
.
lower_margin
=
40
,
.
hsync_len
=
96
,
.
vsync_len
=
1
,
},
/*
* - HSYNC active low (1 << 22)
* - VSYNC active low (1 << 23)
* - clk notenabled while idle
* - clock not inverted
* - data not inverted
* - data enable low active
* - enable sharp mode
*/
.
pcr
=
0xF0008080
|
(
1
<<
22
)
|
(
1
<<
23
)
|
(
1
<<
19
),
.
bpp
=
32
,
},
};
static
const
struct
imx_fb_platform_data
pcm038_fb_data
__initconst
=
{
.
mode
=
pcm970_modes
,
.
num_modes
=
ARRAY_SIZE
(
pcm970_modes
),
.
pwmr
=
0x00A903FF
,
.
lscr1
=
0x00120300
,
.
dmacr
=
0x00020010
,
};
static
struct
resource
pcm970_sja1000_resources
[]
=
{
{
.
start
=
MX27_CS4_BASE_ADDR
,
.
end
=
MX27_CS4_BASE_ADDR
+
0x100
-
1
,
.
flags
=
IORESOURCE_MEM
,
},
{
/* irq number is run-time assigned */
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWEDGE
,
},
};
static
struct
sja1000_platform_data
pcm970_sja1000_platform_data
=
{
.
osc_freq
=
16000000
,
.
ocr
=
OCR_TX1_PULLDOWN
|
OCR_TX0_PUSHPULL
,
.
cdr
=
CDR_CBP
,
};
static
struct
platform_device
pcm970_sja1000
=
{
.
name
=
"sja1000_platform"
,
.
dev
=
{
.
platform_data
=
&
pcm970_sja1000_platform_data
,
},
.
resource
=
pcm970_sja1000_resources
,
.
num_resources
=
ARRAY_SIZE
(
pcm970_sja1000_resources
),
};
/*
* system init for baseboard usage. Will be called by pcm038 init.
*
* Add platform devices present on this baseboard and init
* them from CPU side as far as required to use them later on
*/
void
__init
pcm970_baseboard_init
(
void
)
{
mxc_gpio_setup_multiple_pins
(
pcm970_pins
,
ARRAY_SIZE
(
pcm970_pins
),
"PCM970"
);
imx27_add_imx_fb
(
&
pcm038_fb_data
);
mxc_gpio_mode
(
GPIO_PORTC
|
28
|
GPIO_GPIO
|
GPIO_IN
);
imx27_add_mxc_mmc
(
1
,
&
sdhc_pdata
);
pcm970_sja1000_resources
[
1
].
start
=
gpio_to_irq
(
IMX_GPIO_NR
(
5
,
19
));
pcm970_sja1000_resources
[
1
].
end
=
gpio_to_irq
(
IMX_GPIO_NR
(
5
,
19
));
platform_device_register
(
&
pcm970_sja1000
);
}
arch/arm/mach-imx/platsmp.c
浏览文件 @
155b2fd3
...
...
@@ -20,8 +20,6 @@
#include "common.h"
#include "hardware.h"
#define SCU_STANDBY_ENABLE (1 << 5)
u32
g_diag_reg
;
static
void
__iomem
*
scu_base
;
...
...
@@ -45,14 +43,6 @@ void __init imx_scu_map_io(void)
scu_base
=
IMX_IO_ADDRESS
(
base
);
}
void
imx_scu_standby_enable
(
void
)
{
u32
val
=
readl_relaxed
(
scu_base
);
val
|=
SCU_STANDBY_ENABLE
;
writel_relaxed
(
val
,
scu_base
);
}
static
int
imx_boot_secondary
(
unsigned
int
cpu
,
struct
task_struct
*
idle
)
{
imx_set_cpu_jump
(
cpu
,
v7_secondary_startup
);
...
...
arch/arm/mach-imx/time.c
浏览文件 @
155b2fd3
...
...
@@ -60,17 +60,22 @@
#define MX2_TSTAT_CAPT (1 << 1)
#define MX2_TSTAT_COMP (1 << 0)
/* MX31, MX35, MX25, MX5 */
/* MX31, MX35, MX25, MX5
, MX6
*/
#define V2_TCTL_WAITEN (1 << 3)
/* Wait enable mode */
#define V2_TCTL_CLK_IPG (1 << 6)
#define V2_TCTL_CLK_PER (2 << 6)
#define V2_TCTL_CLK_OSC_DIV8 (5 << 6)
#define V2_TCTL_FRR (1 << 9)
#define V2_TCTL_24MEN (1 << 10)
#define V2_TPRER_PRE24M 12
#define V2_IR 0x0c
#define V2_TSTAT 0x08
#define V2_TSTAT_OF1 (1 << 0)
#define V2_TCN 0x24
#define V2_TCMP 0x10
#define V2_TIMER_RATE_OSC_DIV8 3000000
#define timer_is_v1() (cpu_is_mx1() || cpu_is_mx21() || cpu_is_mx27())
#define timer_is_v2() (!timer_is_v1())
...
...
@@ -312,10 +317,22 @@ static void __init _mxc_timer_init(int irq,
__raw_writel
(
0
,
timer_base
+
MXC_TCTL
);
__raw_writel
(
0
,
timer_base
+
MXC_TPRER
);
/* see datasheet note */
if
(
timer_is_v2
())
tctl_val
=
V2_TCTL_CLK_PER
|
V2_TCTL_FRR
|
V2_TCTL_WAITEN
|
MXC_TCTL_TEN
;
else
if
(
timer_is_v2
())
{
tctl_val
=
V2_TCTL_FRR
|
V2_TCTL_WAITEN
|
MXC_TCTL_TEN
;
if
(
clk_get_rate
(
clk_per
)
==
V2_TIMER_RATE_OSC_DIV8
)
{
tctl_val
|=
V2_TCTL_CLK_OSC_DIV8
;
if
(
cpu_is_imx6dl
()
||
cpu_is_imx6sx
())
{
/* 24 / 8 = 3 MHz */
__raw_writel
(
7
<<
V2_TPRER_PRE24M
,
timer_base
+
MXC_TPRER
);
tctl_val
|=
V2_TCTL_24MEN
;
}
}
else
{
tctl_val
|=
V2_TCTL_CLK_PER
;
}
}
else
{
tctl_val
=
MX1_2_TCTL_FRR
|
MX1_2_TCTL_CLK_PCLK1
|
MXC_TCTL_TEN
;
}
__raw_writel
(
tctl_val
,
timer_base
+
MXC_TCTL
);
...
...
@@ -349,9 +366,13 @@ static void __init mxc_timer_init_dt(struct device_node *np)
WARN_ON
(
!
timer_base
);
irq
=
irq_of_parse_and_map
(
np
,
0
);
clk_per
=
of_clk_get_by_name
(
np
,
"per"
);
clk_ipg
=
of_clk_get_by_name
(
np
,
"ipg"
);
/* Try osc_per first, and fall back to per otherwise */
clk_per
=
of_clk_get_by_name
(
np
,
"osc_per"
);
if
(
IS_ERR
(
clk_per
))
clk_per
=
of_clk_get_by_name
(
np
,
"per"
);
_mxc_timer_init
(
irq
,
clk_per
,
clk_ipg
);
}
CLOCKSOURCE_OF_DECLARE
(
mx1_timer
,
"fsl,imx1-gpt"
,
mxc_timer_init_dt
);
...
...
include/dt-bindings/clock/imx6qdl-clock.h
浏览文件 @
155b2fd3
...
...
@@ -128,7 +128,7 @@
#define IMX6Q_CLK_ECSPI5 116
#define IMX6DL_CLK_I2C4 116
#define IMX6QDL_CLK_ENET 117
#define IMX6QDL_CLK_ESAI 118
#define IMX6QDL_CLK_ESAI
_EXTAL
118
#define IMX6QDL_CLK_GPT_IPG 119
#define IMX6QDL_CLK_GPT_IPG_PER 120
#define IMX6QDL_CLK_GPU2D_CORE 121
...
...
@@ -218,7 +218,36 @@
#define IMX6QDL_CLK_LVDS2_SEL 205
#define IMX6QDL_CLK_LVDS1_GATE 206
#define IMX6QDL_CLK_LVDS2_GATE 207
#define IMX6QDL_CLK_ESAI_AHB 208
#define IMX6QDL_CLK_END 209
#define IMX6QDL_CLK_ESAI_IPG 208
#define IMX6QDL_CLK_ESAI_MEM 209
#define IMX6QDL_CLK_ASRC_IPG 210
#define IMX6QDL_CLK_ASRC_MEM 211
#define IMX6QDL_CLK_LVDS1_IN 212
#define IMX6QDL_CLK_LVDS2_IN 213
#define IMX6QDL_CLK_ANACLK1 214
#define IMX6QDL_CLK_ANACLK2 215
#define IMX6QDL_PLL1_BYPASS_SRC 216
#define IMX6QDL_PLL2_BYPASS_SRC 217
#define IMX6QDL_PLL3_BYPASS_SRC 218
#define IMX6QDL_PLL4_BYPASS_SRC 219
#define IMX6QDL_PLL5_BYPASS_SRC 220
#define IMX6QDL_PLL6_BYPASS_SRC 221
#define IMX6QDL_PLL7_BYPASS_SRC 222
#define IMX6QDL_CLK_PLL1 223
#define IMX6QDL_CLK_PLL2 224
#define IMX6QDL_CLK_PLL3 225
#define IMX6QDL_CLK_PLL4 226
#define IMX6QDL_CLK_PLL5 227
#define IMX6QDL_CLK_PLL6 228
#define IMX6QDL_CLK_PLL7 229
#define IMX6QDL_PLL1_BYPASS 230
#define IMX6QDL_PLL2_BYPASS 231
#define IMX6QDL_PLL3_BYPASS 232
#define IMX6QDL_PLL4_BYPASS 233
#define IMX6QDL_PLL5_BYPASS 234
#define IMX6QDL_PLL6_BYPASS 235
#define IMX6QDL_PLL7_BYPASS 236
#define IMX6QDL_CLK_GPT_3M 237
#define IMX6QDL_CLK_END 238
#endif
/* __DT_BINDINGS_CLOCK_IMX6QDL_H */
include/dt-bindings/clock/imx6sl-clock.h
浏览文件 @
155b2fd3
...
...
@@ -146,6 +146,34 @@
#define IMX6SL_CLK_PLL4_AUDIO_DIV 133
#define IMX6SL_CLK_SPBA 134
#define IMX6SL_CLK_ENET 135
#define IMX6SL_CLK_END 136
#define IMX6SL_CLK_LVDS1_SEL 136
#define IMX6SL_CLK_LVDS1_OUT 137
#define IMX6SL_CLK_LVDS1_IN 138
#define IMX6SL_CLK_ANACLK1 139
#define IMX6SL_PLL1_BYPASS_SRC 140
#define IMX6SL_PLL2_BYPASS_SRC 141
#define IMX6SL_PLL3_BYPASS_SRC 142
#define IMX6SL_PLL4_BYPASS_SRC 143
#define IMX6SL_PLL5_BYPASS_SRC 144
#define IMX6SL_PLL6_BYPASS_SRC 145
#define IMX6SL_PLL7_BYPASS_SRC 146
#define IMX6SL_CLK_PLL1 147
#define IMX6SL_CLK_PLL2 148
#define IMX6SL_CLK_PLL3 149
#define IMX6SL_CLK_PLL4 150
#define IMX6SL_CLK_PLL5 151
#define IMX6SL_CLK_PLL6 152
#define IMX6SL_CLK_PLL7 153
#define IMX6SL_PLL1_BYPASS 154
#define IMX6SL_PLL2_BYPASS 155
#define IMX6SL_PLL3_BYPASS 156
#define IMX6SL_PLL4_BYPASS 157
#define IMX6SL_PLL5_BYPASS 158
#define IMX6SL_PLL6_BYPASS 159
#define IMX6SL_PLL7_BYPASS 160
#define IMX6SL_CLK_SSI1_IPG 161
#define IMX6SL_CLK_SSI2_IPG 162
#define IMX6SL_CLK_SSI3_IPG 163
#define IMX6SL_CLK_END 164
#endif
/* __DT_BINDINGS_CLOCK_IMX6SL_H */
include/dt-bindings/clock/imx6sx-clock.h
浏览文件 @
155b2fd3
...
...
@@ -251,6 +251,29 @@
#define IMX6SX_CLK_SAI2_IPG 238
#define IMX6SX_CLK_ESAI_IPG 239
#define IMX6SX_CLK_ESAI_MEM 240
#define IMX6SX_CLK_CLK_END 241
#define IMX6SX_CLK_LVDS1_IN 241
#define IMX6SX_CLK_ANACLK1 242
#define IMX6SX_PLL1_BYPASS_SRC 243
#define IMX6SX_PLL2_BYPASS_SRC 244
#define IMX6SX_PLL3_BYPASS_SRC 245
#define IMX6SX_PLL4_BYPASS_SRC 246
#define IMX6SX_PLL5_BYPASS_SRC 247
#define IMX6SX_PLL6_BYPASS_SRC 248
#define IMX6SX_PLL7_BYPASS_SRC 249
#define IMX6SX_CLK_PLL1 250
#define IMX6SX_CLK_PLL2 251
#define IMX6SX_CLK_PLL3 252
#define IMX6SX_CLK_PLL4 253
#define IMX6SX_CLK_PLL5 254
#define IMX6SX_CLK_PLL6 255
#define IMX6SX_CLK_PLL7 256
#define IMX6SX_PLL1_BYPASS 257
#define IMX6SX_PLL2_BYPASS 258
#define IMX6SX_PLL3_BYPASS 259
#define IMX6SX_PLL4_BYPASS 260
#define IMX6SX_PLL5_BYPASS 261
#define IMX6SX_PLL6_BYPASS 262
#define IMX6SX_PLL7_BYPASS 263
#define IMX6SX_CLK_CLK_END 264
#endif
/* __DT_BINDINGS_CLOCK_IMX6SX_H */
include/dt-bindings/clock/vf610-clock.h
浏览文件 @
155b2fd3
...
...
@@ -166,6 +166,9 @@
#define VF610_CLK_DMAMUX3 153
#define VF610_CLK_FLEXCAN0_EN 154
#define VF610_CLK_FLEXCAN1_EN 155
#define VF610_CLK_END 156
#define VF610_CLK_PLL7_MAIN 156
#define VF610_CLK_USBPHY0 157
#define VF610_CLK_USBPHY1 158
#define VF610_CLK_END 159
#endif
/* __DT_BINDINGS_CLOCK_VF610_H */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录