Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
b08827f4
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
b08827f4
编写于
5月 17, 2011
作者:
T
Tony Lindgren
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'devel-fixes', 'devel-cleanup' and 'devel-genirq' into for-next
上级
75c0b3b4
5fd2a84a
7be13ad0
667a11fa
变更
60
隐藏空白更改
内联
并排
Showing
60 changed file
with
1547 addition
and
3166 deletion
+1547
-3166
Documentation/DocBook/genericirq.tmpl
Documentation/DocBook/genericirq.tmpl
+47
-35
arch/arm/configs/omap2plus_defconfig
arch/arm/configs/omap2plus_defconfig
+7
-76
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/Kconfig
+1
-0
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/Makefile
+2
-2
arch/arm/mach-omap2/board-2430sdp.c
arch/arm/mach-omap2/board-2430sdp.c
+5
-22
arch/arm/mach-omap2/board-3430sdp.c
arch/arm/mach-omap2/board-3430sdp.c
+23
-109
arch/arm/mach-omap2/board-4430sdp.c
arch/arm/mach-omap2/board-4430sdp.c
+25
-89
arch/arm/mach-omap2/board-am3517crane.c
arch/arm/mach-omap2/board-am3517crane.c
+2
-8
arch/arm/mach-omap2/board-am3517evm.c
arch/arm/mach-omap2/board-am3517evm.c
+16
-38
arch/arm/mach-omap2/board-apollon.c
arch/arm/mach-omap2/board-apollon.c
+13
-16
arch/arm/mach-omap2/board-cm-t35.c
arch/arm/mach-omap2/board-cm-t35.c
+39
-197
arch/arm/mach-omap2/board-cm-t3517.c
arch/arm/mach-omap2/board-cm-t3517.c
+4
-5
arch/arm/mach-omap2/board-devkit8000.c
arch/arm/mach-omap2/board-devkit8000.c
+12
-119
arch/arm/mach-omap2/board-igep0020.c
arch/arm/mach-omap2/board-igep0020.c
+227
-222
arch/arm/mach-omap2/board-igep0030.c
arch/arm/mach-omap2/board-igep0030.c
+0
-458
arch/arm/mach-omap2/board-ldp.c
arch/arm/mach-omap2/board-ldp.c
+11
-127
arch/arm/mach-omap2/board-n8x0.c
arch/arm/mach-omap2/board-n8x0.c
+11
-17
arch/arm/mach-omap2/board-omap3beagle.c
arch/arm/mach-omap2/board-omap3beagle.c
+50
-144
arch/arm/mach-omap2/board-omap3evm.c
arch/arm/mach-omap2/board-omap3evm.c
+44
-198
arch/arm/mach-omap2/board-omap3logic.c
arch/arm/mach-omap2/board-omap3logic.c
+2
-12
arch/arm/mach-omap2/board-omap3pandora.c
arch/arm/mach-omap2/board-omap3pandora.c
+7
-83
arch/arm/mach-omap2/board-omap3stalker.c
arch/arm/mach-omap2/board-omap3stalker.c
+16
-117
arch/arm/mach-omap2/board-omap3touchbook.c
arch/arm/mach-omap2/board-omap3touchbook.c
+13
-108
arch/arm/mach-omap2/board-omap4panda.c
arch/arm/mach-omap2/board-omap4panda.c
+23
-56
arch/arm/mach-omap2/board-overo.c
arch/arm/mach-omap2/board-overo.c
+46
-219
arch/arm/mach-omap2/board-rm680.c
arch/arm/mach-omap2/board-rm680.c
+3
-18
arch/arm/mach-omap2/board-rx51-peripherals.c
arch/arm/mach-omap2/board-rx51-peripherals.c
+11
-31
arch/arm/mach-omap2/board-rx51-video.c
arch/arm/mach-omap2/board-rx51-video.c
+2
-3
arch/arm/mach-omap2/board-zoom-debugboard.c
arch/arm/mach-omap2/board-zoom-debugboard.c
+9
-56
arch/arm/mach-omap2/board-zoom-display.c
arch/arm/mach-omap2/board-zoom-display.c
+8
-23
arch/arm/mach-omap2/board-zoom-peripherals.c
arch/arm/mach-omap2/board-zoom-peripherals.c
+6
-23
arch/arm/mach-omap2/clkt34xx_dpll3m2.c
arch/arm/mach-omap2/clkt34xx_dpll3m2.c
+1
-0
arch/arm/mach-omap2/common-board-devices.c
arch/arm/mach-omap2/common-board-devices.c
+163
-0
arch/arm/mach-omap2/common-board-devices.h
arch/arm/mach-omap2/common-board-devices.h
+35
-0
arch/arm/mach-omap2/gpmc-smc91x.c
arch/arm/mach-omap2/gpmc-smc91x.c
+5
-6
arch/arm/mach-omap2/gpmc-smsc911x.c
arch/arm/mach-omap2/gpmc-smsc911x.c
+19
-25
arch/arm/mach-omap2/irq.c
arch/arm/mach-omap2/irq.c
+25
-72
arch/arm/mach-omap2/omap_l3_noc.c
arch/arm/mach-omap2/omap_l3_noc.c
+23
-28
arch/arm/mach-omap2/omap_l3_smx.c
arch/arm/mach-omap2/omap_l3_smx.c
+15
-27
arch/arm/mach-omap2/pm44xx.c
arch/arm/mach-omap2/pm44xx.c
+0
-2
arch/arm/mach-omap2/smartreflex.c
arch/arm/mach-omap2/smartreflex.c
+18
-5
arch/arm/mach-omap2/usb-musb.c
arch/arm/mach-omap2/usb-musb.c
+13
-1
arch/arm/mach-omap2/usb-tusb6010.c
arch/arm/mach-omap2/usb-tusb6010.c
+1
-2
arch/arm/mach-omap2/voltage.c
arch/arm/mach-omap2/voltage.c
+0
-1
arch/arm/plat-omap/include/plat/gpmc-smsc911x.h
arch/arm/plat-omap/include/plat/gpmc-smsc911x.h
+2
-2
arch/arm/plat-omap/include/plat/uncompress.h
arch/arm/plat-omap/include/plat/uncompress.h
+0
-1
arch/arm/plat-omap/iommu.c
arch/arm/plat-omap/iommu.c
+2
-0
drivers/video/omap/Makefile
drivers/video/omap/Makefile
+0
-1
drivers/video/omap/lcd_omap2evm.c
drivers/video/omap/lcd_omap2evm.c
+0
-192
include/linux/irq.h
include/linux/irq.h
+160
-19
include/linux/irqdesc.h
include/linux/irqdesc.h
+4
-2
kernel/irq/Makefile
kernel/irq/Makefile
+1
-0
kernel/irq/chip.c
kernel/irq/chip.c
+1
-0
kernel/irq/debug.h
kernel/irq/debug.h
+1
-0
kernel/irq/generic-chip.c
kernel/irq/generic-chip.c
+354
-0
kernel/irq/manage.c
kernel/irq/manage.c
+2
-1
kernel/irq/settings.h
kernel/irq/settings.h
+17
-0
sound/soc/omap/Kconfig
sound/soc/omap/Kconfig
+0
-8
sound/soc/omap/Makefile
sound/soc/omap/Makefile
+0
-1
sound/soc/omap/omap2evm.c
sound/soc/omap/omap2evm.c
+0
-139
未找到文件。
Documentation/DocBook/genericirq.tmpl
浏览文件 @
b08827f4
...
@@ -191,8 +191,8 @@
...
@@ -191,8 +191,8 @@
<para>
<para>
Whenever an interrupt triggers, the lowlevel arch code calls into
Whenever an interrupt triggers, the lowlevel arch code calls into
the generic interrupt code by calling desc->handle_irq().
the generic interrupt code by calling desc->handle_irq().
This highlevel IRQ handling function only uses desc->
chip primitives
This highlevel IRQ handling function only uses desc->
irq_data.chip
referenced by the assigned chip descriptor structure.
primitives
referenced by the assigned chip descriptor structure.
</para>
</para>
</sect1>
</sect1>
<sect1
id=
"Highlevel_Driver_API"
>
<sect1
id=
"Highlevel_Driver_API"
>
...
@@ -206,11 +206,11 @@
...
@@ -206,11 +206,11 @@
<listitem><para>
enable_irq()
</para></listitem>
<listitem><para>
enable_irq()
</para></listitem>
<listitem><para>
disable_irq_nosync() (SMP only)
</para></listitem>
<listitem><para>
disable_irq_nosync() (SMP only)
</para></listitem>
<listitem><para>
synchronize_irq() (SMP only)
</para></listitem>
<listitem><para>
synchronize_irq() (SMP only)
</para></listitem>
<listitem><para>
set_irq_type()
</para></listitem>
<listitem><para>
irq_
set_irq_type()
</para></listitem>
<listitem><para>
set_irq_wake()
</para></listitem>
<listitem><para>
irq_
set_irq_wake()
</para></listitem>
<listitem><para>
set_irq
_data()
</para></listitem>
<listitem><para>
irq_set_handler
_data()
</para></listitem>
<listitem><para>
set_irq
_chip()
</para></listitem>
<listitem><para>
irq_set
_chip()
</para></listitem>
<listitem><para>
set_irq
_chip_data()
</para></listitem>
<listitem><para>
irq_set
_chip_data()
</para></listitem>
</itemizedlist>
</itemizedlist>
See the autogenerated function documentation for details.
See the autogenerated function documentation for details.
</para>
</para>
...
@@ -225,6 +225,8 @@
...
@@ -225,6 +225,8 @@
<listitem><para>
handle_fasteoi_irq
</para></listitem>
<listitem><para>
handle_fasteoi_irq
</para></listitem>
<listitem><para>
handle_simple_irq
</para></listitem>
<listitem><para>
handle_simple_irq
</para></listitem>
<listitem><para>
handle_percpu_irq
</para></listitem>
<listitem><para>
handle_percpu_irq
</para></listitem>
<listitem><para>
handle_edge_eoi_irq
</para></listitem>
<listitem><para>
handle_bad_irq
</para></listitem>
</itemizedlist>
</itemizedlist>
The interrupt flow handlers (either predefined or architecture
The interrupt flow handlers (either predefined or architecture
specific) are assigned to specific interrupts by the architecture
specific) are assigned to specific interrupts by the architecture
...
@@ -241,13 +243,13 @@
...
@@ -241,13 +243,13 @@
<programlisting>
<programlisting>
default_enable(struct irq_data *data)
default_enable(struct irq_data *data)
{
{
desc->chip->irq_unmask(data);
desc->
irq_data.
chip->irq_unmask(data);
}
}
default_disable(struct irq_data *data)
default_disable(struct irq_data *data)
{
{
if (!delay_disable(data))
if (!delay_disable(data))
desc->chip->irq_mask(data);
desc->
irq_data.
chip->irq_mask(data);
}
}
default_ack(struct irq_data *data)
default_ack(struct irq_data *data)
...
@@ -284,9 +286,9 @@ noop(struct irq_data *data))
...
@@ -284,9 +286,9 @@ noop(struct irq_data *data))
<para>
<para>
The following control flow is implemented (simplified excerpt):
The following control flow is implemented (simplified excerpt):
<programlisting>
<programlisting>
desc->
chip->irq_mas
k();
desc->
irq_data.chip->irq_mask_ac
k();
handle_
IRQ
_event(desc->action);
handle_
irq
_event(desc->action);
desc->chip->irq_unmask();
desc->
irq_data.
chip->irq_unmask();
</programlisting>
</programlisting>
</para>
</para>
</sect3>
</sect3>
...
@@ -300,8 +302,8 @@ desc->chip->irq_unmask();
...
@@ -300,8 +302,8 @@ desc->chip->irq_unmask();
<para>
<para>
The following control flow is implemented (simplified excerpt):
The following control flow is implemented (simplified excerpt):
<programlisting>
<programlisting>
handle_
IRQ
_event(desc->action);
handle_
irq
_event(desc->action);
desc->chip->irq_eoi();
desc->
irq_data.
chip->irq_eoi();
</programlisting>
</programlisting>
</para>
</para>
</sect3>
</sect3>
...
@@ -315,17 +317,17 @@ desc->chip->irq_eoi();
...
@@ -315,17 +317,17 @@ desc->chip->irq_eoi();
The following control flow is implemented (simplified excerpt):
The following control flow is implemented (simplified excerpt):
<programlisting>
<programlisting>
if (desc->status
&
running) {
if (desc->status
&
running) {
desc->
chip->irq_mas
k();
desc->
irq_data.chip->irq_mask_ac
k();
desc->status |= pending | masked;
desc->status |= pending | masked;
return;
return;
}
}
desc->chip->irq_ack();
desc->
irq_data.
chip->irq_ack();
desc->status |= running;
desc->status |= running;
do {
do {
if (desc->status
&
masked)
if (desc->status
&
masked)
desc->chip->irq_unmask();
desc->
irq_data.
chip->irq_unmask();
desc->status
&
= ~pending;
desc->status
&
= ~pending;
handle_
IRQ
_event(desc->action);
handle_
irq
_event(desc->action);
} while (status
&
pending);
} while (status
&
pending);
desc->status
&
= ~running;
desc->status
&
= ~running;
</programlisting>
</programlisting>
...
@@ -344,7 +346,7 @@ desc->status &= ~running;
...
@@ -344,7 +346,7 @@ desc->status &= ~running;
<para>
<para>
The following control flow is implemented (simplified excerpt):
The following control flow is implemented (simplified excerpt):
<programlisting>
<programlisting>
handle_
IRQ
_event(desc->action);
handle_
irq
_event(desc->action);
</programlisting>
</programlisting>
</para>
</para>
</sect3>
</sect3>
...
@@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
...
@@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
<para>
<para>
The following control flow is implemented (simplified excerpt):
The following control flow is implemented (simplified excerpt):
<programlisting>
<programlisting>
handle_IRQ_event(desc->action);
if (desc->irq_data.chip->irq_ack)
if (desc->chip->irq_eoi)
desc->irq_data.chip->irq_ack();
desc->chip->irq_eoi();
handle_irq_event(desc->action);
if (desc->irq_data.chip->irq_eoi)
desc->irq_data.chip->irq_eoi();
</programlisting>
</programlisting>
</para>
</para>
</sect3>
</sect3>
<sect3
id=
"EOI_Edge_IRQ_flow_handler"
>
<title>
EOI Edge IRQ flow handler
</title>
<para>
handle_edge_eoi_irq provides an abnomination of the edge
handler which is solely used to tame a badly wreckaged
irq controller on powerpc/cell.
</para>
</sect3>
<sect3
id=
"BAD_IRQ_flow_handler"
>
<title>
Bad IRQ flow handler
</title>
<para>
handle_bad_irq is used for spurious interrupts which
have no real handler assigned..
</para>
</sect3>
</sect2>
</sect2>
<sect2
id=
"Quirks_and_optimizations"
>
<sect2
id=
"Quirks_and_optimizations"
>
<title>
Quirks and optimizations
</title>
<title>
Quirks and optimizations
</title>
...
@@ -410,6 +429,7 @@ if (desc->chip->irq_eoi)
...
@@ -410,6 +429,7 @@ if (desc->chip->irq_eoi)
<listitem><para>
irq_mask_ack() - Optional, recommended for performance
</para></listitem>
<listitem><para>
irq_mask_ack() - Optional, recommended for performance
</para></listitem>
<listitem><para>
irq_mask()
</para></listitem>
<listitem><para>
irq_mask()
</para></listitem>
<listitem><para>
irq_unmask()
</para></listitem>
<listitem><para>
irq_unmask()
</para></listitem>
<listitem><para>
irq_eoi() - Optional, required for eoi flow handlers
</para></listitem>
<listitem><para>
irq_retrigger() - Optional
</para></listitem>
<listitem><para>
irq_retrigger() - Optional
</para></listitem>
<listitem><para>
irq_set_type() - Optional
</para></listitem>
<listitem><para>
irq_set_type() - Optional
</para></listitem>
<listitem><para>
irq_set_wake() - Optional
</para></listitem>
<listitem><para>
irq_set_wake() - Optional
</para></listitem>
...
@@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
...
@@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
<chapter
id=
"doirq"
>
<chapter
id=
"doirq"
>
<title>
__do_IRQ entry point
</title>
<title>
__do_IRQ entry point
</title>
<para>
<para>
The original implementation __do_IRQ() i
s an alternative entry
The original implementation __do_IRQ() wa
s an alternative entry
point for all types of interrupts.
point for all types of interrupts.
It not longer exists.
</para>
</para>
<para>
<para>
This handler turned out to be not suitable for all
This handler turned out to be not suitable for all
interrupt hardware and was therefore reimplemented with split
interrupt hardware and was therefore reimplemented with split
functionality for e
gd
e/level/simple/percpu interrupts. This is not
functionality for e
dg
e/level/simple/percpu interrupts. This is not
only a functional optimization. It also shortens code paths for
only a functional optimization. It also shortens code paths for
interrupts.
interrupts.
</para>
</para>
<para>
To make use of the split implementation, replace the call to
__do_IRQ by a call to desc->handle_irq() and associate
the appropriate handler function to desc->handle_irq().
In most cases the generic handler implementations should
be sufficient.
</para>
</chapter>
</chapter>
<chapter
id=
"locking"
>
<chapter
id=
"locking"
>
<title>
Locking on SMP
</title>
<title>
Locking on SMP
</title>
<para>
<para>
The locking of chip registers is up to the architecture that
The locking of chip registers is up to the architecture that
defines the chip primitives. There is a chip->lock field that can be used
defines the chip primitives. The per-irq structure is
for serialization, but the generic layer does not touch it. The per-irq
protected via desc->lock, by the generic layer.
structure is protected via desc->lock, by the generic layer.
</para>
</para>
</chapter>
</chapter>
<chapter
id=
"structs"
>
<chapter
id=
"structs"
>
...
...
arch/arm/configs/omap2plus_defconfig
浏览文件 @
b08827f4
...
@@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y
...
@@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_MODULE_SRCVERSION_ALL=y
# CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_OMAP=y
CONFIG_ARCH_OMAP=y
CONFIG_ARCH_OMAP2=y
CONFIG_ARCH_OMAP3=y
CONFIG_ARCH_OMAP4=y
CONFIG_OMAP_RESET_CLOCKS=y
CONFIG_OMAP_RESET_CLOCKS=y
CONFIG_OMAP_MUX_DEBUG=y
CONFIG_OMAP_MUX_DEBUG=y
CONFIG_OMAP_32K_TIMER=y
CONFIG_MACH_OMAP_GENERIC=y
CONFIG_ARCH_OMAP2420=y
CONFIG_ARCH_OMAP2430=y
CONFIG_ARCH_OMAP3430=y
CONFIG_MACH_OMAP_H4=y
CONFIG_MACH_OMAP_APOLLON=y
CONFIG_MACH_OMAP_2430SDP=y
CONFIG_MACH_OMAP3_BEAGLE=y
CONFIG_MACH_DEVKIT8000=y
CONFIG_MACH_OMAP_LDP=y
CONFIG_MACH_OVERO=y
CONFIG_MACH_OMAP3EVM=y
CONFIG_MACH_OMAP3517EVM=y
CONFIG_MACH_OMAP3_PANDORA=y
CONFIG_MACH_OMAP3_TOUCHBOOK=y
CONFIG_MACH_OMAP_3430SDP=y
CONFIG_MACH_NOKIA_N8X0=y
CONFIG_MACH_NOKIA_RX51=y
CONFIG_MACH_OMAP_ZOOM2=y
CONFIG_MACH_OMAP_ZOOM3=y
CONFIG_MACH_CM_T35=y
CONFIG_MACH_IGEP0020=y
CONFIG_MACH_SBC3530=y
CONFIG_MACH_OMAP_3630SDP=y
CONFIG_MACH_OMAP_4430SDP=y
CONFIG_ARM_THUMBEE=y
CONFIG_ARM_THUMBEE=y
CONFIG_ARM_L1_CACHE_SHIFT=5
CONFIG_ARM_ERRATA_411920=y
CONFIG_ARM_ERRATA_411920=y
CONFIG_NO_HZ=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_SMP=y
CONFIG_SMP=y
CONFIG_NR_CPUS=2
CONFIG_NR_CPUS=2
# CONFIG_LOCAL_TIMERS is not set
CONFIG_AEABI=y
CONFIG_LEDS=y
CONFIG_LEDS=y
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
CONFIG_KEXEC=y
CONFIG_KEXEC=y
CONFIG_FPE_NWFPE=y
CONFIG_FPE_NWFPE=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_BINFMT_MISC=y
CONFIG_BINFMT_MISC=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y
CONFIG_PM_DEBUG=y
CONFIG_PM_RUNTIME=y
CONFIG_NET=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_UNIX=y
...
@@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y
...
@@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y
# CONFIG_IPV6 is not set
# CONFIG_IPV6 is not set
CONFIG_NETFILTER=y
CONFIG_NETFILTER=y
CONFIG_BT=m
CONFIG_BT=m
CONFIG_BT_L2CAP=m
CONFIG_BT_SCO=m
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
CONFIG_BT_HCIUART_BCSP=y
...
@@ -107,11 +63,9 @@ CONFIG_CFG80211=m
...
@@ -107,11 +63,9 @@ CONFIG_CFG80211=m
CONFIG_MAC80211=m
CONFIG_MAC80211=m
CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_DEFAULT_PID=y
CONFIG_MAC80211_RC_DEFAULT_PID=y
CONFIG_MAC80211_LEDS=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_CONNECTOR=y
CONFIG_CONNECTOR=y
CONFIG_MTD=y
CONFIG_MTD=y
CONFIG_MTD_CONCAT=y
CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_BLOCK=y
...
@@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y
...
@@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_EEPROM_LEGACY=y
CONFIG_SCSI=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_MULTI_LUN=y
...
@@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y
...
@@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_TWL4030_PWRBUTTON=y
CONFIG_INPUT_TWL4030_PWRBUTTON=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_SERIAL_8250=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_8250_RSA=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM=y
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_OMAP=y
CONFIG_SPI=y
CONFIG_SPI=y
CONFIG_SPI_OMAP24XX=y
CONFIG_SPI_OMAP24XX=y
CONFIG_DEBUG_GPIO=y
CONFIG_DEBUG_GPIO=y
...
@@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y
...
@@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG=y
CONFIG_OMAP_WATCHDOG=y
CONFIG_OMAP_WATCHDOG=y
CONFIG_TWL4030_WATCHDOG=y
CONFIG_TWL4030_WATCHDOG=y
CONFIG_MENELAUS=y
CONFIG_TWL4030_CORE=y
CONFIG_TWL4030_POWER=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_TWL4030=y
CONFIG_REGULATOR_TWL4030=y
CONFIG_REGULATOR_TPS65023=y
CONFIG_REGULATOR_TPS65023=y
CONFIG_REGULATOR_TPS6507X=y
CONFIG_REGULATOR_TPS6507X=y
...
@@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
...
@@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_PLATFORM=y
CONFIG_LCD_PLATFORM=y
CONFIG_DISPLAY_SUPPORT=y
CONFIG_DISPLAY_SUPPORT=y
# CONFIG_VGA_CONSOLE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_FONTS=y
CONFIG_FONTS=y
...
@@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y
...
@@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SOUND=m
CONFIG_SND=m
CONFIG_SND=m
CONFIG_SND_MIXER_OSS=
y
CONFIG_SND_MIXER_OSS=
m
CONFIG_SND_PCM_OSS=
y
CONFIG_SND_PCM_OSS=
m
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DEBUG=y
CONFIG_SND_DEBUG=y
CONFIG_SND_USB_AUDIO=
y
CONFIG_SND_USB_AUDIO=
m
CONFIG_SND_SOC=
y
CONFIG_SND_SOC=
m
CONFIG_SND_OMAP_SOC=
y
CONFIG_SND_OMAP_SOC=
m
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=
y
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=
m
CONFIG_USB=y
CONFIG_USB=y
CONFIG_USB_DEBUG=y
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_SUSPEND=y
CONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG_WHITELIST is not set
CONFIG_USB_MON=y
CONFIG_USB_MON=y
# CONFIG_USB_MUSB_HDRC is not set
# CONFIG_USB_MUSB_OTG is not set
# CONFIG_USB_GADGET_MUSB_HDRC is not set
CONFIG_USB_MUSB_DEBUG=y
CONFIG_USB_WDM=y
CONFIG_USB_WDM=y
CONFIG_USB_STORAGE=y
CONFIG_USB_STORAGE=y
CONFIG_USB_LIBUSUAL=y
CONFIG_USB_LIBUSUAL=y
...
@@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y
...
@@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y
CONFIG_SDIO_UART=y
CONFIG_SDIO_UART=y
CONFIG_MMC_OMAP=y
CONFIG_MMC_OMAP=y
CONFIG_MMC_OMAP_HS=y
CONFIG_MMC_OMAP_HS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_TWL92330=y
CONFIG_RTC_DRV_TWL92330=y
CONFIG_RTC_DRV_TWL4030=y
CONFIG_RTC_DRV_TWL4030=y
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set
# CONFIG_EXT3_FS_XATTR is not set
CONFIG_INOTIFY=y
CONFIG_QUOTA=y
CONFIG_QUOTA=y
CONFIG_QFMT_V2=y
CONFIG_QFMT_V2=y
CONFIG_MSDOS_FS=y
CONFIG_MSDOS_FS=y
...
@@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y
...
@@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_1=y
CONFIG_PRINTK_TIME=y
CONFIG_PRINTK_TIME=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_KERNEL=y
CONFIG_SCHEDSTATS=y
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
CONFIG_TIMER_STATS=y
CONFIG_PROVE_LOCKING=y
CONFIG_PROVE_LOCKING=y
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO=y
...
...
arch/arm/mach-omap2/Kconfig
浏览文件 @
b08827f4
...
@@ -288,6 +288,7 @@ config MACH_IGEP0030
...
@@ -288,6 +288,7 @@ config MACH_IGEP0030
depends on ARCH_OMAP3
depends on ARCH_OMAP3
default y
default y
select OMAP_PACKAGE_CBB
select OMAP_PACKAGE_CBB
select MACH_IGEP0020
config MACH_SBC3530
config MACH_SBC3530
bool "OMAP3 SBC STALKER board"
bool "OMAP3 SBC STALKER board"
...
...
arch/arm/mach-omap2/Makefile
浏览文件 @
b08827f4
...
@@ -229,8 +229,6 @@ obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
...
@@ -229,8 +229,6 @@ obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
obj-$(CONFIG_MACH_CM_T3517)
+=
board-cm-t3517.o
obj-$(CONFIG_MACH_CM_T3517)
+=
board-cm-t3517.o
obj-$(CONFIG_MACH_IGEP0020)
+=
board-igep0020.o
\
obj-$(CONFIG_MACH_IGEP0020)
+=
board-igep0020.o
\
hsmmc.o
hsmmc.o
obj-$(CONFIG_MACH_IGEP0030)
+=
board-igep0030.o
\
hsmmc.o
obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK)
+=
board-omap3touchbook.o
\
obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK)
+=
board-omap3touchbook.o
\
hsmmc.o
hsmmc.o
obj-$(CONFIG_MACH_OMAP_4430SDP)
+=
board-4430sdp.o
\
obj-$(CONFIG_MACH_OMAP_4430SDP)
+=
board-4430sdp.o
\
...
@@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
...
@@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
disp-$(CONFIG_OMAP2_DSS)
:=
display.o
disp-$(CONFIG_OMAP2_DSS)
:=
display.o
obj-y
+=
$
(
disp-m
)
$
(
disp-y
)
obj-y
+=
$
(
disp-m
)
$
(
disp-y
)
obj-y
+=
common-board-devices.o
arch/arm/mach-omap2/board-2430sdp.c
浏览文件 @
b08827f4
...
@@ -41,6 +41,7 @@
...
@@ -41,6 +41,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define SDP2430_CS0_BASE 0x04000000
#define SDP2430_CS0_BASE 0x04000000
#define SECONDARY_LCD_GPIO 147
#define SECONDARY_LCD_GPIO 147
...
@@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = {
...
@@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = {
.
vmmc1
=
&
sdp2430_vmmc1
,
.
vmmc1
=
&
sdp2430_vmmc1
,
};
};
static
struct
i2c_board_info
__initdata
sdp2430_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_24XX_SYS_NIRQ
,
.
platform_data
=
&
sdp2430_twldata
,
},
};
static
struct
i2c_board_info
__initdata
sdp2430_i2c1_boardinfo
[]
=
{
static
struct
i2c_board_info
__initdata
sdp2430_i2c1_boardinfo
[]
=
{
{
{
I2C_BOARD_INFO
(
"isp1301_omap"
,
0x2D
),
I2C_BOARD_INFO
(
"isp1301_omap"
,
0x2D
),
...
@@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void)
...
@@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void)
{
{
omap_register_i2c_bus
(
1
,
100
,
sdp2430_i2c1_boardinfo
,
omap_register_i2c_bus
(
1
,
100
,
sdp2430_i2c1_boardinfo
,
ARRAY_SIZE
(
sdp2430_i2c1_boardinfo
));
ARRAY_SIZE
(
sdp2430_i2c1_boardinfo
));
omap_register_i2c_bus
(
2
,
2600
,
sdp2430_i2c_boardinfo
,
omap2_pmic_init
(
"twl4030"
,
&
sdp2430_twldata
);
ARRAY_SIZE
(
sdp2430_i2c_boardinfo
));
return
0
;
return
0
;
}
}
...
@@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
...
@@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
{}
/* Terminator */
{}
/* Terminator */
};
};
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
struct
omap_usb_config
sdp2430_usb_config
__initdata
=
{
static
struct
omap_usb_config
sdp2430_usb_config
__initdata
=
{
.
otg
=
1
,
.
otg
=
1
,
#ifdef CONFIG_USB_GADGET_OMAP
#ifdef CONFIG_USB_GADGET_OMAP
...
@@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = {
static
void
__init
omap_2430sdp_init
(
void
)
static
void
__init
omap_2430sdp_init
(
void
)
{
{
int
ret
;
omap2430_mux_init
(
board_mux
,
OMAP_PACKAGE_ZAC
);
omap2430_mux_init
(
board_mux
,
OMAP_PACKAGE_ZAC
);
omap_board_config
=
sdp2430_config
;
omap_board_config
=
sdp2430_config
;
...
@@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void)
...
@@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void)
omap2_usbfs_init
(
&
sdp2430_usb_config
);
omap2_usbfs_init
(
&
sdp2430_usb_config
);
omap_mux_init_signal
(
"usb0hs_stp"
,
OMAP_PULL_ENA
|
OMAP_PULL_UP
);
omap_mux_init_signal
(
"usb0hs_stp"
,
OMAP_PULL_ENA
|
OMAP_PULL_UP
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
board_smc91x_init
();
board_smc91x_init
();
/* Turn off secondary LCD backlight */
/* Turn off secondary LCD backlight */
ret
=
gpio_request
(
SECONDARY_LCD_GPIO
,
"Secondary LCD backlight"
);
gpio_request_one
(
SECONDARY_LCD_GPIO
,
GPIOF_OUT_INIT_LOW
,
if
(
ret
==
0
)
"Secondary LCD backlight"
);
gpio_direction_output
(
SECONDARY_LCD_GPIO
,
0
);
}
}
static
void
__init
omap_2430sdp_map_io
(
void
)
static
void
__init
omap_2430sdp_map_io
(
void
)
...
...
arch/arm/mach-omap2/board-3430sdp.c
浏览文件 @
b08827f4
...
@@ -19,7 +19,6 @@
...
@@ -19,7 +19,6 @@
#include <linux/input.h>
#include <linux/input.h>
#include <linux/input/matrix_keypad.h>
#include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/i2c/twl.h>
#include <linux/i2c/twl.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/machine.h>
#include <linux/io.h>
#include <linux/io.h>
...
@@ -48,6 +47,7 @@
...
@@ -48,6 +47,7 @@
#include "hsmmc.h"
#include "hsmmc.h"
#include "pm.h"
#include "pm.h"
#include "control.h"
#include "control.h"
#include "common-board-devices.h"
#define CONFIG_DISABLE_HFCLK 1
#define CONFIG_DISABLE_HFCLK 1
...
@@ -123,63 +123,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
...
@@ -123,63 +123,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
.
rep
=
1
,
.
rep
=
1
,
};
};
static
int
ts_gpio
;
/* Needed for ads7846_get_pendown_state */
/**
* @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
*
* @return - void. If request gpio fails then Flag KERN_ERR.
*/
static
void
ads7846_dev_init
(
void
)
{
if
(
gpio_request
(
ts_gpio
,
"ADS7846 pendown"
)
<
0
)
{
printk
(
KERN_ERR
"can't get ads746 pen down GPIO
\n
"
);
return
;
}
gpio_direction_input
(
ts_gpio
);
gpio_set_debounce
(
ts_gpio
,
310
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
ts_gpio
);
}
static
struct
ads7846_platform_data
tsc2046_config
__initdata
=
{
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
.
wakeup
=
true
,
};
static
struct
omap2_mcspi_device_config
tsc2046_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
sdp3430_spi_board_info
[]
__initdata
=
{
[
0
]
=
{
/*
* TSC2046 operates at a max freqency of 2MHz, so
* operate slightly below at 1.5MHz
*/
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
tsc2046_mcspi_config
,
.
irq
=
0
,
.
platform_data
=
&
tsc2046_config
,
},
};
#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8
#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8
#define SDP3430_LCD_PANEL_ENABLE_GPIO 5
#define SDP3430_LCD_PANEL_ENABLE_GPIO 5
static
unsigned
backlight_gpio
;
static
struct
gpio
sdp3430_dss_gpios
[]
__initdata
=
{
static
unsigned
enable_gpio
;
{
SDP3430_LCD_PANEL_ENABLE_GPIO
,
GPIOF_OUT_INIT_LOW
,
"LCD reset"
},
{
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
,
GPIOF_OUT_INIT_LOW
,
"LCD Backlight"
},
};
static
int
lcd_enabled
;
static
int
lcd_enabled
;
static
int
dvi_enabled
;
static
int
dvi_enabled
;
...
@@ -187,29 +138,11 @@ static void __init sdp3430_display_init(void)
...
@@ -187,29 +138,11 @@ static void __init sdp3430_display_init(void)
{
{
int
r
;
int
r
;
enable_gpio
=
SDP3430_LCD_PANEL_ENABLE_GPIO
;
r
=
gpio_request_array
(
sdp3430_dss_gpios
,
backlight_gpio
=
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
;
ARRAY_SIZE
(
sdp3430_dss_gpios
));
if
(
r
)
r
=
gpio_request
(
enable_gpio
,
"LCD reset"
);
printk
(
KERN_ERR
"failed to get LCD control GPIOs
\n
"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get LCD reset GPIO
\n
"
);
goto
err0
;
}
r
=
gpio_request
(
backlight_gpio
,
"LCD Backlight"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get LCD backlight GPIO
\n
"
);
goto
err1
;
}
gpio_direction_output
(
enable_gpio
,
0
);
gpio_direction_output
(
backlight_gpio
,
0
);
return
;
err1:
gpio_free
(
enable_gpio
);
err0:
return
;
}
}
static
int
sdp3430_panel_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
static
int
sdp3430_panel_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
...
@@ -219,8 +152,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
...
@@ -219,8 +152,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
return
-
EINVAL
;
return
-
EINVAL
;
}
}
gpio_direction_output
(
enable_gpio
,
1
);
gpio_direction_output
(
SDP3430_LCD_PANEL_ENABLE_GPIO
,
1
);
gpio_direction_output
(
backlight_gpio
,
1
);
gpio_direction_output
(
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
,
1
);
lcd_enabled
=
1
;
lcd_enabled
=
1
;
...
@@ -231,8 +164,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
...
@@ -231,8 +164,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
{
{
lcd_enabled
=
0
;
lcd_enabled
=
0
;
gpio_direction_output
(
enable_gpio
,
0
);
gpio_direction_output
(
SDP3430_LCD_PANEL_ENABLE_GPIO
,
0
);
gpio_direction_output
(
backlight_gpio
,
0
);
gpio_direction_output
(
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
,
0
);
}
}
static
int
sdp3430_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
static
int
sdp3430_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
...
@@ -360,12 +293,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
...
@@ -360,12 +293,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
omap2_hsmmc_init
(
mmc
);
omap2_hsmmc_init
(
mmc
);
/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
gpio_request
(
gpio
+
7
,
"sub_lcd_en_bkl"
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_LOW
,
"sub_lcd_en_bkl"
);
gpio_direction_output
(
gpio
+
7
,
0
);
/* gpio + 15 is "sub_lcd_nRST" (output) */
/* gpio + 15 is "sub_lcd_nRST" (output) */
gpio_request
(
gpio
+
15
,
"sub_lcd_nRST"
);
gpio_request_one
(
gpio
+
15
,
GPIOF_OUT_INIT_LOW
,
"sub_lcd_nRST"
);
gpio_direction_output
(
gpio
+
15
,
0
);
return
0
;
return
0
;
}
}
...
@@ -580,20 +511,10 @@ static struct twl4030_platform_data sdp3430_twldata = {
...
@@ -580,20 +511,10 @@ static struct twl4030_platform_data sdp3430_twldata = {
.
vpll2
=
&
sdp3430_vpll2
,
.
vpll2
=
&
sdp3430_vpll2
,
};
};
static
struct
i2c_board_info
__initdata
sdp3430_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
sdp3430_twldata
,
},
};
static
int
__init
omap3430_i2c_init
(
void
)
static
int
__init
omap3430_i2c_init
(
void
)
{
{
/* i2c1 for PMIC only */
/* i2c1 for PMIC only */
omap_register_i2c_bus
(
1
,
2600
,
sdp3430_i2c_boardinfo
,
omap3_pmic_init
(
"twl4030"
,
&
sdp3430_twldata
);
ARRAY_SIZE
(
sdp3430_i2c_boardinfo
));
/* i2c2 on camera connector (for sensor control) and optional isp1301 */
/* i2c2 on camera connector (for sensor control) and optional isp1301 */
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
/* i2c3 on display connector (for DVI, tfp410) */
/* i2c3 on display connector (for DVI, tfp410) */
...
@@ -872,14 +793,10 @@ static struct flash_partitions sdp_flash_partitions[] = {
...
@@ -872,14 +793,10 @@ static struct flash_partitions sdp_flash_partitions[] = {
},
},
};
};
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
void
__init
omap_3430sdp_init
(
void
)
static
void
__init
omap_3430sdp_init
(
void
)
{
{
int
gpio_pendown
;
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap_board_config
=
sdp3430_config
;
omap_board_config
=
sdp3430_config
;
omap_board_config_size
=
ARRAY_SIZE
(
sdp3430_config
);
omap_board_config_size
=
ARRAY_SIZE
(
sdp3430_config
);
...
@@ -887,15 +804,12 @@ static void __init omap_3430sdp_init(void)
...
@@ -887,15 +804,12 @@ static void __init omap_3430sdp_init(void)
omap3430_i2c_init
();
omap3430_i2c_init
();
omap_display_init
(
&
sdp3430_dss_data
);
omap_display_init
(
&
sdp3430_dss_data
);
if
(
omap_rev
()
>
OMAP3430_REV_ES1_0
)
if
(
omap_rev
()
>
OMAP3430_REV_ES1_0
)
ts_gpio
=
SDP3430_TS_GPIO_IRQ_SDPV2
;
gpio_pendown
=
SDP3430_TS_GPIO_IRQ_SDPV2
;
else
else
ts_gpio
=
SDP3430_TS_GPIO_IRQ_SDPV1
;
gpio_pendown
=
SDP3430_TS_GPIO_IRQ_SDPV1
;
sdp3430_spi_board_info
[
0
].
irq
=
gpio_to_irq
(
ts_gpio
);
omap_ads7846_init
(
1
,
gpio_pendown
,
310
,
NULL
);
spi_register_board_info
(
sdp3430_spi_board_info
,
ARRAY_SIZE
(
sdp3430_spi_board_info
));
ads7846_dev_init
();
board_serial_init
();
board_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
board_smc91x_init
();
board_smc91x_init
();
board_flash_init
(
sdp_flash_partitions
,
chip_sel_3430
,
0
);
board_flash_init
(
sdp_flash_partitions
,
chip_sel_3430
,
0
);
sdp3430_display_init
();
sdp3430_display_init
();
...
...
arch/arm/mach-omap2/board-4430sdp.c
浏览文件 @
b08827f4
...
@@ -42,6 +42,7 @@
...
@@ -42,6 +42,7 @@
#include "hsmmc.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "timer-gp.h"
#include "control.h"
#include "control.h"
#include "common-board-devices.h"
#define ETH_KS8851_IRQ 34
#define ETH_KS8851_IRQ 34
#define ETH_KS8851_POWER_ON 48
#define ETH_KS8851_POWER_ON 48
...
@@ -251,58 +252,22 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = {
...
@@ -251,58 +252,22 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = {
},
},
};
};
static
struct
gpio
sdp4430_eth_gpios
[]
__initdata
=
{
{
ETH_KS8851_POWER_ON
,
GPIOF_OUT_INIT_HIGH
,
"eth_power"
},
{
ETH_KS8851_QUART
,
GPIOF_OUT_INIT_HIGH
,
"quart"
},
{
ETH_KS8851_IRQ
,
GPIOF_IN
,
"eth_irq"
},
};
static
int
omap_ethernet_init
(
void
)
static
int
omap_ethernet_init
(
void
)
{
{
int
status
;
int
status
;
/* Request of GPIO lines */
/* Request of GPIO lines */
status
=
gpio_request_array
(
sdp4430_eth_gpios
,
ARRAY_SIZE
(
sdp4430_eth_gpios
));
if
(
status
)
pr_err
(
"Cannot request ETH GPIOs
\n
"
);
status
=
gpio_request
(
ETH_KS8851_POWER_ON
,
"eth_power"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
ETH_KS8851_POWER_ON
);
return
status
;
}
status
=
gpio_request
(
ETH_KS8851_QUART
,
"quart"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
ETH_KS8851_QUART
);
goto
error1
;
}
status
=
gpio_request
(
ETH_KS8851_IRQ
,
"eth_irq"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
ETH_KS8851_IRQ
);
goto
error2
;
}
/* Configuration of requested GPIO lines */
status
=
gpio_direction_output
(
ETH_KS8851_POWER_ON
,
1
);
if
(
status
)
{
pr_err
(
"Cannot set output GPIO %d
\n
"
,
ETH_KS8851_IRQ
);
goto
error3
;
}
status
=
gpio_direction_output
(
ETH_KS8851_QUART
,
1
);
if
(
status
)
{
pr_err
(
"Cannot set output GPIO %d
\n
"
,
ETH_KS8851_QUART
);
goto
error3
;
}
status
=
gpio_direction_input
(
ETH_KS8851_IRQ
);
if
(
status
)
{
pr_err
(
"Cannot set input GPIO %d
\n
"
,
ETH_KS8851_IRQ
);
goto
error3
;
}
return
0
;
error3:
gpio_free
(
ETH_KS8851_IRQ
);
error2:
gpio_free
(
ETH_KS8851_QUART
);
error1:
gpio_free
(
ETH_KS8851_POWER_ON
);
return
status
;
return
status
;
}
}
...
@@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = {
...
@@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = {
.
usb
=
&
omap4_usbphy_data
.
usb
=
&
omap4_usbphy_data
};
};
static
struct
i2c_board_info
__initdata
sdp4430_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl6030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
OMAP44XX_IRQ_SYS_1N
,
.
platform_data
=
&
sdp4430_twldata
,
},
};
static
struct
i2c_board_info
__initdata
sdp4430_i2c_3_boardinfo
[]
=
{
static
struct
i2c_board_info
__initdata
sdp4430_i2c_3_boardinfo
[]
=
{
{
{
I2C_BOARD_INFO
(
"tmp105"
,
0x48
),
I2C_BOARD_INFO
(
"tmp105"
,
0x48
),
...
@@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
...
@@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
};
};
static
int
__init
omap4_i2c_init
(
void
)
static
int
__init
omap4_i2c_init
(
void
)
{
{
/*
omap4_pmic_init
(
"twl6030"
,
&
sdp4430_twldata
);
* Phoenix Audio IC needs I2C1 to
* start with 400 KHz or less
*/
omap_register_i2c_bus
(
1
,
400
,
sdp4430_i2c_boardinfo
,
ARRAY_SIZE
(
sdp4430_i2c_boardinfo
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
sdp4430_i2c_3_boardinfo
,
omap_register_i2c_bus
(
3
,
400
,
sdp4430_i2c_3_boardinfo
,
ARRAY_SIZE
(
sdp4430_i2c_3_boardinfo
));
ARRAY_SIZE
(
sdp4430_i2c_3_boardinfo
));
...
@@ -614,21 +566,13 @@ static int __init omap4_i2c_init(void)
...
@@ -614,21 +566,13 @@ static int __init omap4_i2c_init(void)
static
void
__init
omap_sfh7741prox_init
(
void
)
static
void
__init
omap_sfh7741prox_init
(
void
)
{
{
int
error
;
int
error
;
error
=
gpio_request
(
OMAP4_SFH7741_ENABLE_GPIO
,
"sfh7741"
);
error
=
gpio_request_one
(
OMAP4_SFH7741_ENABLE_GPIO
,
if
(
error
<
0
)
{
GPIOF_OUT_INIT_LOW
,
"sfh7741"
);
if
(
error
<
0
)
pr_err
(
"%s:failed to request GPIO %d, error %d
\n
"
,
pr_err
(
"%s:failed to request GPIO %d, error %d
\n
"
,
__func__
,
OMAP4_SFH7741_ENABLE_GPIO
,
error
);
__func__
,
OMAP4_SFH7741_ENABLE_GPIO
,
error
);
return
;
}
error
=
gpio_direction_output
(
OMAP4_SFH7741_ENABLE_GPIO
,
0
);
if
(
error
<
0
)
{
pr_err
(
"%s: GPIO configuration failed: GPIO %d,error %d
\n
"
,
__func__
,
OMAP4_SFH7741_ENABLE_GPIO
,
error
);
gpio_free
(
OMAP4_SFH7741_ENABLE_GPIO
);
}
}
}
static
void
sdp4430_hdmi_mux_init
(
void
)
static
void
sdp4430_hdmi_mux_init
(
void
)
...
@@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void)
...
@@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void)
OMAP_PIN_INPUT_PULLUP
);
OMAP_PIN_INPUT_PULLUP
);
}
}
static
struct
gpio
sdp4430_hdmi_gpios
[]
=
{
{
HDMI_GPIO_HPD
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_hpd"
},
{
HDMI_GPIO_LS_OE
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_ls_oe"
},
};
static
int
sdp4430_panel_enable_hdmi
(
struct
omap_dss_device
*
dssdev
)
static
int
sdp4430_panel_enable_hdmi
(
struct
omap_dss_device
*
dssdev
)
{
{
int
status
;
int
status
;
status
=
gpio_request_one
(
HDMI_GPIO_HPD
,
GPIOF_OUT_INIT_HIGH
,
status
=
gpio_request_array
(
sdp4430_hdmi_gpios
,
"hdmi_gpio_hpd"
);
ARRAY_SIZE
(
sdp4430_hdmi_gpios
));
if
(
status
)
{
if
(
status
)
pr_err
(
"Cannot request GPIO %d
\n
"
,
HDMI_GPIO_HPD
);
pr_err
(
"%s: Cannot request HDMI GPIOs
\n
"
,
__func__
);
return
status
;
}
status
=
gpio_request_one
(
HDMI_GPIO_LS_OE
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_ls_oe"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
HDMI_GPIO_LS_OE
);
goto
error1
;
}
return
0
;
error1:
gpio_free
(
HDMI_GPIO_HPD
);
return
status
;
return
status
;
}
}
...
...
arch/arm/mach-omap2/board-am3517crane.c
浏览文件 @
b08827f4
...
@@ -89,19 +89,13 @@ static void __init am3517_crane_init(void)
...
@@ -89,19 +89,13 @@ static void __init am3517_crane_init(void)
return
;
return
;
}
}
ret
=
gpio_request
(
GPIO_USB_POWER
,
"usb_ehci_enable"
);
ret
=
gpio_request_one
(
GPIO_USB_POWER
,
GPIOF_OUT_INIT_HIGH
,
"usb_ehci_enable"
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
pr_err
(
"Can not request GPIO %d
\n
"
,
GPIO_USB_POWER
);
pr_err
(
"Can not request GPIO %d
\n
"
,
GPIO_USB_POWER
);
return
;
return
;
}
}
ret
=
gpio_direction_output
(
GPIO_USB_POWER
,
1
);
if
(
ret
<
0
)
{
gpio_free
(
GPIO_USB_POWER
);
pr_err
(
"Unable to initialize EHCI power
\n
"
);
return
;
}
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
}
}
...
...
arch/arm/mach-omap2/board-am3517evm.c
浏览文件 @
b08827f4
...
@@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void)
...
@@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void)
int
r
;
int
r
;
omap_mux_init_gpio
(
GPIO_RTCS35390A_IRQ
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
GPIO_RTCS35390A_IRQ
,
OMAP_PIN_INPUT_PULLUP
);
r
=
gpio_request
(
GPIO_RTCS35390A_IRQ
,
"rtcs35390a-irq"
);
r
=
gpio_request_one
(
GPIO_RTCS35390A_IRQ
,
GPIOF_IN
,
"rtcs35390a-irq"
);
if
(
r
<
0
)
{
if
(
r
<
0
)
{
printk
(
KERN_WARNING
"failed to request GPIO#%d
\n
"
,
printk
(
KERN_WARNING
"failed to request GPIO#%d
\n
"
,
GPIO_RTCS35390A_IRQ
);
GPIO_RTCS35390A_IRQ
);
return
;
return
;
}
}
r
=
gpio_direction_input
(
GPIO_RTCS35390A_IRQ
);
if
(
r
<
0
)
{
printk
(
KERN_WARNING
"GPIO#%d cannot be configured as input
\n
"
,
GPIO_RTCS35390A_IRQ
);
gpio_free
(
GPIO_RTCS35390A_IRQ
);
return
;
}
am3517evm_i2c1_boardinfo
[
0
].
irq
=
gpio_to_irq
(
GPIO_RTCS35390A_IRQ
);
am3517evm_i2c1_boardinfo
[
0
].
irq
=
gpio_to_irq
(
GPIO_RTCS35390A_IRQ
);
}
}
...
@@ -242,6 +237,15 @@ static int dvi_enabled;
...
@@ -242,6 +237,15 @@ static int dvi_enabled;
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
static
struct
gpio
am3517_evm_dss_gpios
[]
__initdata
=
{
/* GPIO 182 = LCD Backlight Power */
{
LCD_PANEL_BKLIGHT_PWR
,
GPIOF_OUT_INIT_HIGH
,
"lcd_backlight_pwr"
},
/* GPIO 181 = LCD Panel PWM */
{
LCD_PANEL_PWM
,
GPIOF_OUT_INIT_HIGH
,
"lcd bl enable"
},
/* GPIO 176 = LCD Panel Power enable pin */
{
LCD_PANEL_PWR
,
GPIOF_OUT_INIT_HIGH
,
"dvi enable"
},
};
static
void
__init
am3517_evm_display_init
(
void
)
static
void
__init
am3517_evm_display_init
(
void
)
{
{
int
r
;
int
r
;
...
@@ -249,41 +253,15 @@ static void __init am3517_evm_display_init(void)
...
@@ -249,41 +253,15 @@ static void __init am3517_evm_display_init(void)
omap_mux_init_gpio
(
LCD_PANEL_PWR
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
LCD_PANEL_PWR
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
LCD_PANEL_BKLIGHT_PWR
,
OMAP_PIN_INPUT_PULLDOWN
);
omap_mux_init_gpio
(
LCD_PANEL_BKLIGHT_PWR
,
OMAP_PIN_INPUT_PULLDOWN
);
omap_mux_init_gpio
(
LCD_PANEL_PWM
,
OMAP_PIN_INPUT_PULLDOWN
);
omap_mux_init_gpio
(
LCD_PANEL_PWM
,
OMAP_PIN_INPUT_PULLDOWN
);
/*
* Enable GPIO 182 = LCD Backlight Power
r
=
gpio_request_array
(
am3517_evm_dss_gpios
,
*/
ARRAY_SIZE
(
am3517_evm_dss_gpios
));
r
=
gpio_request
(
LCD_PANEL_BKLIGHT_PWR
,
"lcd_backlight_pwr"
);
if
(
r
)
{
if
(
r
)
{
printk
(
KERN_ERR
"failed to get
lcd_backlight_pwr
\n
"
);
printk
(
KERN_ERR
"failed to get
DSS panel control GPIOs
\n
"
);
return
;
return
;
}
}
gpio_direction_output
(
LCD_PANEL_BKLIGHT_PWR
,
1
);
/*
* Enable GPIO 181 = LCD Panel PWM
*/
r
=
gpio_request
(
LCD_PANEL_PWM
,
"lcd_pwm"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_pwm
\n
"
);
goto
err_1
;
}
gpio_direction_output
(
LCD_PANEL_PWM
,
1
);
/*
* Enable GPIO 176 = LCD Panel Power enable pin
*/
r
=
gpio_request
(
LCD_PANEL_PWR
,
"lcd_panel_pwr"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_pwr
\n
"
);
goto
err_2
;
}
gpio_direction_output
(
LCD_PANEL_PWR
,
1
);
printk
(
KERN_INFO
"Display initialized successfully
\n
"
);
printk
(
KERN_INFO
"Display initialized successfully
\n
"
);
return
;
err_2:
gpio_free
(
LCD_PANEL_PWM
);
err_1:
gpio_free
(
LCD_PANEL_BKLIGHT_PWR
);
}
}
#else
#else
static
void
__init
am3517_evm_display_init
(
void
)
{}
static
void
__init
am3517_evm_display_init
(
void
)
{}
...
...
arch/arm/mach-omap2/board-apollon.c
浏览文件 @
b08827f4
...
@@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void)
...
@@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void)
unsigned
int
rate
;
unsigned
int
rate
;
struct
clk
*
gpmc_fck
;
struct
clk
*
gpmc_fck
;
int
eth_cs
;
int
eth_cs
;
int
err
;
gpmc_fck
=
clk_get
(
NULL
,
"gpmc_fck"
);
/* Always on ENABLE_ON_INIT */
gpmc_fck
=
clk_get
(
NULL
,
"gpmc_fck"
);
/* Always on ENABLE_ON_INIT */
if
(
IS_ERR
(
gpmc_fck
))
{
if
(
IS_ERR
(
gpmc_fck
))
{
...
@@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void)
...
@@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void)
apollon_smc91x_resources
[
0
].
end
=
base
+
0x30f
;
apollon_smc91x_resources
[
0
].
end
=
base
+
0x30f
;
udelay
(
100
);
udelay
(
100
);
omap_mux_init_gpio
(
74
,
0
);
omap_mux_init_gpio
(
APOLLON_ETHR_GPIO_IRQ
,
0
);
if
(
gpio_request
(
APOLLON_ETHR_GPIO_IRQ
,
"SMC91x irq"
)
<
0
)
{
err
=
gpio_request_one
(
APOLLON_ETHR_GPIO_IRQ
,
GPIOF_IN
,
"SMC91x irq"
);
if
(
err
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for smc91x IRQ
\n
"
,
printk
(
KERN_ERR
"Failed to request GPIO%d for smc91x IRQ
\n
"
,
APOLLON_ETHR_GPIO_IRQ
);
APOLLON_ETHR_GPIO_IRQ
);
gpmc_cs_free
(
APOLLON_ETH_CS
);
gpmc_cs_free
(
APOLLON_ETH_CS
);
goto
out
;
}
}
gpio_direction_input
(
APOLLON_ETHR_GPIO_IRQ
);
out:
out:
clk_disable
(
gpmc_fck
);
clk_disable
(
gpmc_fck
);
clk_put
(
gpmc_fck
);
clk_put
(
gpmc_fck
);
...
@@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void)
...
@@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void)
omap2_init_common_devices
(
NULL
,
NULL
);
omap2_init_common_devices
(
NULL
,
NULL
);
}
}
static
struct
gpio
apollon_gpio_leds
[]
__initdata
=
{
{
LED0_GPIO13
,
GPIOF_OUT_INIT_LOW
,
"LED0"
},
/* LED0 - AA10 */
{
LED1_GPIO14
,
GPIOF_OUT_INIT_LOW
,
"LED1"
},
/* LED1 - AA6 */
{
LED2_GPIO15
,
GPIOF_OUT_INIT_LOW
,
"LED2"
},
/* LED2 - AA4 */
};
static
void
__init
apollon_led_init
(
void
)
static
void
__init
apollon_led_init
(
void
)
{
{
/* LED0 - AA10 */
omap_mux_init_signal
(
"vlynq_clk.gpio_13"
,
0
);
omap_mux_init_signal
(
"vlynq_clk.gpio_13"
,
0
);
gpio_request
(
LED0_GPIO13
,
"LED0"
);
gpio_direction_output
(
LED0_GPIO13
,
0
);
/* LED1 - AA6 */
omap_mux_init_signal
(
"vlynq_rx1.gpio_14"
,
0
);
omap_mux_init_signal
(
"vlynq_rx1.gpio_14"
,
0
);
gpio_request
(
LED1_GPIO14
,
"LED1"
);
gpio_direction_output
(
LED1_GPIO14
,
0
);
/* LED2 - AA4 */
omap_mux_init_signal
(
"vlynq_rx0.gpio_15"
,
0
);
omap_mux_init_signal
(
"vlynq_rx0.gpio_15"
,
0
);
gpio_request
(
LED2_GPIO15
,
"LED2"
);
gpio_
direction_output
(
LED2_GPIO15
,
0
);
gpio_
request_array
(
apollon_gpio_leds
,
ARRAY_SIZE
(
apollon_gpio_leds
)
);
}
}
static
void
__init
apollon_usb_init
(
void
)
static
void
__init
apollon_usb_init
(
void
)
...
@@ -301,8 +299,7 @@ static void __init apollon_usb_init(void)
...
@@ -301,8 +299,7 @@ static void __init apollon_usb_init(void)
/* USB device */
/* USB device */
/* DEVICE_SUSPEND */
/* DEVICE_SUSPEND */
omap_mux_init_signal
(
"mcbsp2_clkx.gpio_12"
,
0
);
omap_mux_init_signal
(
"mcbsp2_clkx.gpio_12"
,
0
);
gpio_request
(
12
,
"USB suspend"
);
gpio_request_one
(
12
,
GPIOF_OUT_INIT_LOW
,
"USB suspend"
);
gpio_direction_output
(
12
,
0
);
omap2_usbfs_init
(
&
apollon_usb_config
);
omap2_usbfs_init
(
&
apollon_usb_config
);
}
}
...
...
arch/arm/mach-omap2/board-cm-t35.c
浏览文件 @
b08827f4
...
@@ -54,6 +54,7 @@
...
@@ -54,6 +54,7 @@
#include "mux.h"
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define CM_T35_GPIO_PENDOWN 57
#define CM_T35_GPIO_PENDOWN 57
...
@@ -66,86 +67,28 @@
...
@@ -66,86 +67,28 @@
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h>
#include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static
struct
smsc911x_platform_config
cm_t35_smsc911x_config
=
{
static
struct
omap_smsc911x_platform_data
cm_t35_smsc911x_cfg
=
{
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
};
static
struct
resource
cm_t35_smsc911x_resources
[]
=
{
{
.
flags
=
IORESOURCE_MEM
,
},
{
.
start
=
OMAP_GPIO_IRQ
(
CM_T35_SMSC911X_GPIO
),
.
end
=
OMAP_GPIO_IRQ
(
CM_T35_SMSC911X_GPIO
),
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
static
struct
platform_device
cm_t35_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
0
,
.
id
=
0
,
.
num_resources
=
ARRAY_SIZE
(
cm_t35_smsc911x_resources
),
.
cs
=
CM_T35_SMSC911X_CS
,
.
resource
=
cm_t35_smsc911x_resources
,
.
gpio_irq
=
CM_T35_SMSC911X_GPIO
,
.
dev
=
{
.
gpio_reset
=
-
EINVAL
,
.
platform_data
=
&
cm_t35_smsc911x_config
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
},
};
static
struct
resource
sb_t35_smsc911x_resources
[]
=
{
{
.
flags
=
IORESOURCE_MEM
,
},
{
.
start
=
OMAP_GPIO_IRQ
(
SB_T35_SMSC911X_GPIO
),
.
end
=
OMAP_GPIO_IRQ
(
SB_T35_SMSC911X_GPIO
),
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
};
static
struct
platform_device
sb_t35_smsc911x_device
=
{
static
struct
omap_smsc911x_platform_data
sb_t35_smsc911x_cfg
=
{
.
name
=
"smsc911x"
,
.
id
=
1
,
.
id
=
1
,
.
num_resources
=
ARRAY_SIZE
(
sb_t35_smsc911x_resources
),
.
cs
=
SB_T35_SMSC911X_CS
,
.
resource
=
sb_t35_smsc911x_resources
,
.
gpio_irq
=
SB_T35_SMSC911X_GPIO
,
.
dev
=
{
.
gpio_reset
=
-
EINVAL
,
.
platform_data
=
&
cm_t35_smsc911x_config
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
},
};
};
static
void
__init
cm_t35_init_smsc911x
(
struct
platform_device
*
dev
,
int
cs
,
int
irq_gpio
)
{
unsigned
long
cs_mem_base
;
if
(
gpmc_cs_request
(
cs
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
pr_err
(
"CM-T35: Failed request for GPMC mem for smsc911x
\n
"
);
return
;
}
dev
->
resource
[
0
].
start
=
cs_mem_base
+
0x0
;
dev
->
resource
[
0
].
end
=
cs_mem_base
+
0xff
;
if
((
gpio_request
(
irq_gpio
,
"ETH IRQ"
)
==
0
)
&&
(
gpio_direction_input
(
irq_gpio
)
==
0
))
{
gpio_export
(
irq_gpio
,
0
);
}
else
{
pr_err
(
"CM-T35: could not obtain gpio for SMSC911X IRQ
\n
"
);
return
;
}
platform_device_register
(
dev
);
}
static
void
__init
cm_t35_init_ethernet
(
void
)
static
void
__init
cm_t35_init_ethernet
(
void
)
{
{
cm_t35_init_smsc911x
(
&
cm_t35_smsc911x_device
,
gpmc_smsc911x_init
(
&
cm_t35_smsc911x_cfg
);
CM_T35_SMSC911X_CS
,
CM_T35_SMSC911X_GPIO
);
gpmc_smsc911x_init
(
&
sb_t35_smsc911x_cfg
);
cm_t35_init_smsc911x
(
&
sb_t35_smsc911x_device
,
SB_T35_SMSC911X_CS
,
SB_T35_SMSC911X_GPIO
);
}
}
#else
#else
static
inline
void
__init
cm_t35_init_ethernet
(
void
)
{
return
;
}
static
inline
void
__init
cm_t35_init_ethernet
(
void
)
{
return
;
}
...
@@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void)
...
@@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void)
static
inline
void
cm_t35_init_nand
(
void
)
{}
static
inline
void
cm_t35_init_nand
(
void
)
{}
#endif
#endif
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
#include <linux/spi/ads7846.h>
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
CM_T35_GPIO_PENDOWN
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
3
,
.
debounce_rep
=
1
,
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
};
static
struct
spi_board_info
cm_t35_spi_board_info
[]
__initdata
=
{
{
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
CM_T35_GPIO_PENDOWN
),
.
platform_data
=
&
ads7846_config
,
},
};
static
void
__init
cm_t35_init_ads7846
(
void
)
{
if
((
gpio_request
(
CM_T35_GPIO_PENDOWN
,
"ADS7846_PENDOWN"
)
==
0
)
&&
(
gpio_direction_input
(
CM_T35_GPIO_PENDOWN
)
==
0
))
{
gpio_export
(
CM_T35_GPIO_PENDOWN
,
0
);
}
else
{
pr_err
(
"CM-T35: could not obtain gpio for ADS7846_PENDOWN
\n
"
);
return
;
}
spi_register_board_info
(
cm_t35_spi_board_info
,
ARRAY_SIZE
(
cm_t35_spi_board_info
));
}
#else
static
inline
void
cm_t35_init_ads7846
(
void
)
{}
#endif
#define CM_T35_LCD_EN_GPIO 157
#define CM_T35_LCD_EN_GPIO 157
#define CM_T35_LCD_BL_GPIO 58
#define CM_T35_LCD_BL_GPIO 58
#define CM_T35_DVI_EN_GPIO 54
#define CM_T35_DVI_EN_GPIO 54
static
int
lcd_bl_gpio
;
static
int
lcd_en_gpio
;
static
int
dvi_en_gpio
;
static
int
lcd_enabled
;
static
int
lcd_enabled
;
static
int
dvi_enabled
;
static
int
dvi_enabled
;
...
@@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)
...
@@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)
return
-
EINVAL
;
return
-
EINVAL
;
}
}
gpio_set_value
(
lcd_en_gpio
,
1
);
gpio_set_value
(
CM_T35_LCD_EN_GPIO
,
1
);
gpio_set_value
(
lcd_bl_gpio
,
1
);
gpio_set_value
(
CM_T35_LCD_BL_GPIO
,
1
);
lcd_enabled
=
1
;
lcd_enabled
=
1
;
...
@@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
...
@@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
{
{
lcd_enabled
=
0
;
lcd_enabled
=
0
;
gpio_set_value
(
lcd_bl_gpio
,
0
);
gpio_set_value
(
CM_T35_LCD_BL_GPIO
,
0
);
gpio_set_value
(
lcd_en_gpio
,
0
);
gpio_set_value
(
CM_T35_LCD_EN_GPIO
,
0
);
}
}
static
int
cm_t35_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
static
int
cm_t35_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
...
@@ -331,7 +215,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
...
@@ -331,7 +215,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
return
-
EINVAL
;
return
-
EINVAL
;
}
}
gpio_set_value
(
dvi_en_gpio
,
0
);
gpio_set_value
(
CM_T35_DVI_EN_GPIO
,
0
);
dvi_enabled
=
1
;
dvi_enabled
=
1
;
return
0
;
return
0
;
...
@@ -339,7 +223,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
...
@@ -339,7 +223,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
static
void
cm_t35_panel_disable_dvi
(
struct
omap_dss_device
*
dssdev
)
static
void
cm_t35_panel_disable_dvi
(
struct
omap_dss_device
*
dssdev
)
{
{
gpio_set_value
(
dvi_en_gpio
,
1
);
gpio_set_value
(
CM_T35_DVI_EN_GPIO
,
1
);
dvi_enabled
=
0
;
dvi_enabled
=
0
;
}
}
...
@@ -421,62 +305,38 @@ static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = {
...
@@ -421,62 +305,38 @@ static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = {
},
},
};
};
static
struct
gpio
cm_t35_dss_gpios
[]
__initdata
=
{
{
CM_T35_LCD_EN_GPIO
,
GPIOF_OUT_INIT_LOW
,
"lcd enable"
},
{
CM_T35_LCD_BL_GPIO
,
GPIOF_OUT_INIT_LOW
,
"lcd bl enable"
},
{
CM_T35_DVI_EN_GPIO
,
GPIOF_OUT_INIT_HIGH
,
"dvi enable"
},
};
static
void
__init
cm_t35_init_display
(
void
)
static
void
__init
cm_t35_init_display
(
void
)
{
{
int
err
;
int
err
;
lcd_en_gpio
=
CM_T35_LCD_EN_GPIO
;
lcd_bl_gpio
=
CM_T35_LCD_BL_GPIO
;
dvi_en_gpio
=
CM_T35_DVI_EN_GPIO
;
spi_register_board_info
(
cm_t35_lcd_spi_board_info
,
spi_register_board_info
(
cm_t35_lcd_spi_board_info
,
ARRAY_SIZE
(
cm_t35_lcd_spi_board_info
));
ARRAY_SIZE
(
cm_t35_lcd_spi_board_info
));
err
=
gpio_request
(
lcd_en_gpio
,
"LCD RST"
);
err
=
gpio_request_array
(
cm_t35_dss_gpios
,
if
(
err
)
{
ARRAY_SIZE
(
cm_t35_dss_gpios
));
pr_err
(
"CM-T35: failed to get LCD reset GPIO
\n
"
);
goto
out
;
}
err
=
gpio_request
(
lcd_bl_gpio
,
"LCD BL"
);
if
(
err
)
{
if
(
err
)
{
pr_err
(
"CM-T35: failed to get LCD backlight control GPIO
\n
"
);
pr_err
(
"CM-T35: failed to request DSS control GPIOs
\n
"
);
goto
err_lcd_bl
;
return
;
}
err
=
gpio_request
(
dvi_en_gpio
,
"DVI EN"
);
if
(
err
)
{
pr_err
(
"CM-T35: failed to get DVI reset GPIO
\n
"
);
goto
err_dvi_en
;
}
}
gpio_export
(
lcd_en_gpio
,
0
);
gpio_export
(
CM_T35_LCD_EN_GPIO
,
0
);
gpio_export
(
lcd_bl_gpio
,
0
);
gpio_export
(
CM_T35_LCD_BL_GPIO
,
0
);
gpio_export
(
dvi_en_gpio
,
0
);
gpio_export
(
CM_T35_DVI_EN_GPIO
,
0
);
gpio_direction_output
(
lcd_en_gpio
,
0
);
gpio_direction_output
(
lcd_bl_gpio
,
0
);
gpio_direction_output
(
dvi_en_gpio
,
1
);
msleep
(
50
);
msleep
(
50
);
gpio_set_value
(
lcd_en_gpio
,
1
);
gpio_set_value
(
CM_T35_LCD_EN_GPIO
,
1
);
err
=
omap_display_init
(
&
cm_t35_dss_data
);
err
=
omap_display_init
(
&
cm_t35_dss_data
);
if
(
err
)
{
if
(
err
)
{
pr_err
(
"CM-T35: failed to register DSS device
\n
"
);
pr_err
(
"CM-T35: failed to register DSS device
\n
"
);
g
oto
err_dev_reg
;
g
pio_free_array
(
cm_t35_dss_gpios
,
ARRAY_SIZE
(
cm_t35_dss_gpios
))
;
}
}
return
;
err_dev_reg:
gpio_free
(
dvi_en_gpio
);
err_dvi_en:
gpio_free
(
lcd_bl_gpio
);
err_lcd_bl:
gpio_free
(
lcd_en_gpio
);
out:
return
;
}
}
static
struct
regulator_consumer_supply
cm_t35_vmmc1_supply
=
{
static
struct
regulator_consumer_supply
cm_t35_vmmc1_supply
=
{
...
@@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
...
@@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
{
{
int
wlan_rst
=
gpio
+
2
;
int
wlan_rst
=
gpio
+
2
;
if
((
gpio_request
(
wlan_rst
,
"WLAN RST"
)
==
0
)
&&
if
(
gpio_request_one
(
wlan_rst
,
GPIOF_OUT_INIT_HIGH
,
"WLAN RST"
)
==
0
)
{
(
gpio_direction_output
(
wlan_rst
,
1
)
==
0
))
{
gpio_export
(
wlan_rst
,
0
);
gpio_export
(
wlan_rst
,
0
);
udelay
(
10
);
udelay
(
10
);
gpio_set_value
(
wlan_rst
,
0
);
gpio_set_value
(
wlan_rst
,
0
);
udelay
(
10
);
udelay
(
10
);
...
@@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = {
...
@@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = {
.
vpll2
=
&
cm_t35_vpll2
,
.
vpll2
=
&
cm_t35_vpll2
,
};
};
static
struct
i2c_board_info
__initdata
cm_t35_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"tps65930"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
cm_t35_twldata
,
},
};
static
void
__init
cm_t35_init_i2c
(
void
)
static
void
__init
cm_t35_init_i2c
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
cm_t35_i2c_boardinfo
,
omap3_pmic_init
(
"tps65930"
,
&
cm_t35_twldata
);
ARRAY_SIZE
(
cm_t35_i2c_boardinfo
));
}
}
static
void
__init
cm_t35_init_early
(
void
)
static
void
__init
cm_t35_init_early
(
void
)
...
@@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
struct
omap_board_config_kernel
cm_t35_config
[]
__initdata
=
{
static
struct
omap_board_config_kernel
cm_t35_config
[]
__initdata
=
{
};
};
...
@@ -792,12 +634,12 @@ static void __init cm_t35_init(void)
...
@@ -792,12 +634,12 @@ static void __init cm_t35_init(void)
omap_serial_init
();
omap_serial_init
();
cm_t35_init_i2c
();
cm_t35_init_i2c
();
cm_t35_init_nand
();
cm_t35_init_nand
();
cm_t35_init_ads7846
(
);
omap_ads7846_init
(
1
,
CM_T35_GPIO_PENDOWN
,
0
,
NULL
);
cm_t35_init_ethernet
();
cm_t35_init_ethernet
();
cm_t35_init_led
();
cm_t35_init_led
();
cm_t35_init_display
();
cm_t35_init_display
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
}
}
...
...
arch/arm/mach-omap2/board-cm-t3517.c
浏览文件 @
b08827f4
...
@@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void)
...
@@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void)
{
{
int
err
;
int
err
;
err
=
gpio_request
(
RTC_CS_EN_GPIO
,
"rtc cs en"
);
err
=
gpio_request_one
(
RTC_CS_EN_GPIO
,
GPIOF_OUT_INIT_HIGH
,
"rtc cs en"
);
if
(
err
)
{
if
(
err
)
{
pr_err
(
"CM-T3517: rtc cs en gpio request failed: %d
\n
"
,
err
);
pr_err
(
"CM-T3517: rtc cs en gpio request failed: %d
\n
"
,
err
);
return
;
return
;
}
}
gpio_direction_output
(
RTC_CS_EN_GPIO
,
1
);
platform_device_register
(
&
cm_t3517_rtc_device
);
platform_device_register
(
&
cm_t3517_rtc_device
);
}
}
#else
#else
...
@@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void)
...
@@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void)
{
{
int
err
;
int
err
;
err
=
gpio_request
(
USB_HUB_RESET_GPIO
,
"usb hub rst"
);
err
=
gpio_request_one
(
USB_HUB_RESET_GPIO
,
GPIOF_OUT_INIT_LOW
,
"usb hub rst"
);
if
(
err
)
{
if
(
err
)
{
pr_err
(
"CM-T3517: usb hub rst gpio request failed: %d
\n
"
,
err
);
pr_err
(
"CM-T3517: usb hub rst gpio request failed: %d
\n
"
,
err
);
}
else
{
}
else
{
gpio_direction_output
(
USB_HUB_RESET_GPIO
,
0
);
udelay
(
10
);
udelay
(
10
);
gpio_set_value
(
USB_HUB_RESET_GPIO
,
1
);
gpio_set_value
(
USB_HUB_RESET_GPIO
,
1
);
msleep
(
1
);
msleep
(
1
);
...
...
arch/arm/mach-omap2/board-devkit8000.c
浏览文件 @
b08827f4
...
@@ -51,7 +51,6 @@
...
@@ -51,7 +51,6 @@
#include <plat/mcspi.h>
#include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h>
#include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/dm9000.h>
#include <linux/dm9000.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
...
@@ -60,6 +59,7 @@
...
@@ -60,6 +59,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "timer-gp.h"
#include "common-board-devices.h"
#define NAND_BLOCK_SIZE SZ_128K
#define NAND_BLOCK_SIZE SZ_128K
...
@@ -97,13 +97,6 @@ static struct mtd_partition devkit8000_nand_partitions[] = {
...
@@ -97,13 +97,6 @@ static struct mtd_partition devkit8000_nand_partitions[] = {
},
},
};
};
static
struct
omap_nand_platform_data
devkit8000_nand_data
=
{
.
options
=
NAND_BUSWIDTH_16
,
.
parts
=
devkit8000_nand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
devkit8000_nand_partitions
),
.
dma_channel
=
-
1
,
/* disable DMA in OMAP NAND driver */
};
static
struct
omap2_hsmmc_info
mmc
[]
=
{
static
struct
omap2_hsmmc_info
mmc
[]
=
{
{
{
.
mmc
=
1
,
.
mmc
=
1
,
...
@@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
...
@@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
devkit8000_lcd_device
.
reset_gpio
=
gpio
+
TWL4030_GPIO_MAX
+
0
;
devkit8000_lcd_device
.
reset_gpio
=
gpio
+
TWL4030_GPIO_MAX
+
0
;
ret
=
gpio_request_one
(
devkit8000_lcd_device
.
reset_gpio
,
ret
=
gpio_request_one
(
devkit8000_lcd_device
.
reset_gpio
,
GPIOF_DIR_OUT
|
GPIOF
_INIT_LOW
,
"LCD_PWREN"
);
GPIOF_OUT
_INIT_LOW
,
"LCD_PWREN"
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
devkit8000_lcd_device
.
reset_gpio
=
-
EINVAL
;
devkit8000_lcd_device
.
reset_gpio
=
-
EINVAL
;
printk
(
KERN_ERR
"Failed to request GPIO for LCD_PWRN
\n
"
);
printk
(
KERN_ERR
"Failed to request GPIO for LCD_PWRN
\n
"
);
...
@@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
...
@@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* gpio + 7 is "DVI_PD" (out, active low) */
/* gpio + 7 is "DVI_PD" (out, active low) */
devkit8000_dvi_device
.
reset_gpio
=
gpio
+
7
;
devkit8000_dvi_device
.
reset_gpio
=
gpio
+
7
;
ret
=
gpio_request_one
(
devkit8000_dvi_device
.
reset_gpio
,
ret
=
gpio_request_one
(
devkit8000_dvi_device
.
reset_gpio
,
GPIOF_DIR_OUT
|
GPIOF
_INIT_LOW
,
"DVI PowerDown"
);
GPIOF_OUT
_INIT_LOW
,
"DVI PowerDown"
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
devkit8000_dvi_device
.
reset_gpio
=
-
EINVAL
;
devkit8000_dvi_device
.
reset_gpio
=
-
EINVAL
;
printk
(
KERN_ERR
"Failed to request GPIO for DVI PowerDown
\n
"
);
printk
(
KERN_ERR
"Failed to request GPIO for DVI PowerDown
\n
"
);
...
@@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = {
...
@@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = {
.
keypad
=
&
devkit8000_kp_data
,
.
keypad
=
&
devkit8000_kp_data
,
};
};
static
struct
i2c_board_info
__initdata
devkit8000_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"tps65930"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
devkit8000_twldata
,
},
};
static
int
__init
devkit8000_i2c_init
(
void
)
static
int
__init
devkit8000_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
devkit8000_i2c_boardinfo
,
omap3_pmic_init
(
"tps65930"
,
&
devkit8000_twldata
);
ARRAY_SIZE
(
devkit8000_i2c_boardinfo
));
/* Bus 3 is attached to the DVI port where devices like the pico DLP
/* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz */
* projector don't work reliably with 400kHz */
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
...
@@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void)
...
@@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void)
#endif
#endif
}
}
static
void
__init
devkit8000_ads7846_init
(
void
)
{
int
gpio
=
OMAP3_DEVKIT_TS_GPIO
;
int
ret
;
ret
=
gpio_request
(
gpio
,
"ads7846_pen_down"
);
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO %d for "
"ads7846 pen down IRQ
\n
"
,
gpio
);
return
;
}
gpio_direction_input
(
gpio
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
OMAP3_DEVKIT_TS_GPIO
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
5
,
.
debounce_rep
=
1
,
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
.
settle_delay_usecs
=
150
,
};
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
devkit8000_spi_board_info
[]
__initdata
=
{
{
.
modalias
=
"ads7846"
,
.
bus_num
=
2
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
OMAP3_DEVKIT_TS_GPIO
),
.
platform_data
=
&
ads7846_config
,
}
};
#define OMAP_DM9000_BASE 0x2c000000
#define OMAP_DM9000_BASE 0x2c000000
static
struct
resource
omap_dm9000_resources
[]
=
{
static
struct
resource
omap_dm9000_resources
[]
=
{
...
@@ -550,14 +483,14 @@ static void __init omap_dm9000_init(void)
...
@@ -550,14 +483,14 @@ static void __init omap_dm9000_init(void)
{
{
unsigned
char
*
eth_addr
=
omap_dm9000_platdata
.
dev_addr
;
unsigned
char
*
eth_addr
=
omap_dm9000_platdata
.
dev_addr
;
struct
omap_die_id
odi
;
struct
omap_die_id
odi
;
int
ret
;
if
(
gpio_request
(
OMAP_DM9000_GPIO_IRQ
,
"dm9000 irq"
)
<
0
)
{
ret
=
gpio_request_one
(
OMAP_DM9000_GPIO_IRQ
,
GPIOF_IN
,
"dm9000 irq"
);
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for dm9000 IRQ
\n
"
,
printk
(
KERN_ERR
"Failed to request GPIO%d for dm9000 IRQ
\n
"
,
OMAP_DM9000_GPIO_IRQ
);
OMAP_DM9000_GPIO_IRQ
);
return
;
return
;
}
}
gpio_direction_input
(
OMAP_DM9000_GPIO_IRQ
);
/* init the mac address using DIE id */
/* init the mac address using DIE id */
omap_get_die_id
(
&
odi
);
omap_get_die_id
(
&
odi
);
...
@@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = {
...
@@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = {
&
omap_dm9000_dev
,
&
omap_dm9000_dev
,
};
};
static
void
__init
devkit8000_flash_init
(
void
)
{
u8
cs
=
0
;
u8
nandcs
=
GPMC_CS_NUM
+
1
;
/* find out the chip-select on which NAND exists */
while
(
cs
<
GPMC_CS_NUM
)
{
u32
ret
=
0
;
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG1
);
if
((
ret
&
0xC00
)
==
0x800
)
{
printk
(
KERN_INFO
"Found NAND on CS%d
\n
"
,
cs
);
if
(
nandcs
>
GPMC_CS_NUM
)
nandcs
=
cs
;
}
cs
++
;
}
if
(
nandcs
>
GPMC_CS_NUM
)
{
printk
(
KERN_INFO
"NAND: Unable to find configuration "
"in GPMC
\n
"
);
return
;
}
if
(
nandcs
<
GPMC_CS_NUM
)
{
devkit8000_nand_data
.
cs
=
nandcs
;
printk
(
KERN_INFO
"Registering NAND on CS%d
\n
"
,
nandcs
);
if
(
gpmc_nand_init
(
&
devkit8000_nand_data
)
<
0
)
printk
(
KERN_ERR
"Unable to register NAND device
\n
"
);
}
}
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
...
@@ -795,14 +689,13 @@ static void __init devkit8000_init(void)
...
@@ -795,14 +689,13 @@ static void __init devkit8000_init(void)
ARRAY_SIZE
(
devkit8000_devices
));
ARRAY_SIZE
(
devkit8000_devices
));
omap_display_init
(
&
devkit8000_dss_data
);
omap_display_init
(
&
devkit8000_dss_data
);
spi_register_board_info
(
devkit8000_spi_board_info
,
ARRAY_SIZE
(
devkit8000_spi_board_info
));
devkit8000_ads7846_init
(
);
omap_ads7846_init
(
2
,
OMAP3_DEVKIT_TS_GPIO
,
0
,
NULL
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
devkit8000_flash_init
();
omap_nand_flash_init
(
NAND_BUSWIDTH_16
,
devkit8000_nand_partitions
,
ARRAY_SIZE
(
devkit8000_nand_partitions
));
/* Ensure SDRC pins are mux'd for self-refresh */
/* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
...
...
arch/arm/mach-omap2/board-igep0020.c
浏览文件 @
b08827f4
...
@@ -38,6 +38,7 @@
...
@@ -38,6 +38,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "sdram-numonyx-m65kxxxxam.h"
#include "sdram-numonyx-m65kxxxxam.h"
#include "common-board-devices.h"
#define IGEP2_SMSC911X_CS 5
#define IGEP2_SMSC911X_CS 5
#define IGEP2_SMSC911X_GPIO 176
#define IGEP2_SMSC911X_GPIO 176
...
@@ -54,6 +55,11 @@
...
@@ -54,6 +55,11 @@
#define IGEP2_RC_GPIO_WIFI_NRESET 139
#define IGEP2_RC_GPIO_WIFI_NRESET 139
#define IGEP2_RC_GPIO_BT_NRESET 137
#define IGEP2_RC_GPIO_BT_NRESET 137
#define IGEP3_GPIO_LED0_GREEN 54
#define IGEP3_GPIO_LED0_RED 53
#define IGEP3_GPIO_LED1_RED 16
#define IGEP3_GPIO_USBH_NRESET 183
/*
/*
* IGEP2 Hardware Revision Table
* IGEP2 Hardware Revision Table
*
*
...
@@ -68,6 +74,7 @@
...
@@ -68,6 +74,7 @@
#define IGEP2_BOARD_HWREV_B 0
#define IGEP2_BOARD_HWREV_B 0
#define IGEP2_BOARD_HWREV_C 1
#define IGEP2_BOARD_HWREV_C 1
#define IGEP3_BOARD_HWREV 2
static
u8
hwrev
;
static
u8
hwrev
;
...
@@ -75,24 +82,29 @@ static void __init igep2_get_revision(void)
...
@@ -75,24 +82,29 @@ static void __init igep2_get_revision(void)
{
{
u8
ret
;
u8
ret
;
if
(
machine_is_igep0030
())
{
hwrev
=
IGEP3_BOARD_HWREV
;
return
;
}
omap_mux_init_gpio
(
IGEP2_GPIO_LED1_RED
,
OMAP_PIN_INPUT
);
omap_mux_init_gpio
(
IGEP2_GPIO_LED1_RED
,
OMAP_PIN_INPUT
);
if
((
gpio_request
(
IGEP2_GPIO_LED1_RED
,
"GPIO_HW0_REV"
)
==
0
)
&&
if
(
gpio_request_one
(
IGEP2_GPIO_LED1_RED
,
GPIOF_IN
,
"GPIO_HW0_REV"
))
{
(
gpio_direction_input
(
IGEP2_GPIO_LED1_RED
)
==
0
))
{
ret
=
gpio_get_value
(
IGEP2_GPIO_LED1_RED
);
if
(
ret
==
0
)
{
pr_info
(
"IGEP2: Hardware Revision C (B-NON compatible)
\n
"
);
hwrev
=
IGEP2_BOARD_HWREV_C
;
}
else
if
(
ret
==
1
)
{
pr_info
(
"IGEP2: Hardware Revision B/C (B compatible)
\n
"
);
hwrev
=
IGEP2_BOARD_HWREV_B
;
}
else
{
pr_err
(
"IGEP2: Unknown Hardware Revision
\n
"
);
hwrev
=
-
1
;
}
}
else
{
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_HW0_REV
\n
"
);
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_HW0_REV
\n
"
);
pr_err
(
"IGEP2: Unknown Hardware Revision
\n
"
);
pr_err
(
"IGEP2: Unknown Hardware Revision
\n
"
);
return
;
}
ret
=
gpio_get_value
(
IGEP2_GPIO_LED1_RED
);
if
(
ret
==
0
)
{
pr_info
(
"IGEP2: Hardware Revision C (B-NON compatible)
\n
"
);
hwrev
=
IGEP2_BOARD_HWREV_C
;
}
else
if
(
ret
==
1
)
{
pr_info
(
"IGEP2: Hardware Revision B/C (B compatible)
\n
"
);
hwrev
=
IGEP2_BOARD_HWREV_B
;
}
else
{
pr_err
(
"IGEP2: Unknown Hardware Revision
\n
"
);
hwrev
=
-
1
;
}
}
gpio_free
(
IGEP2_GPIO_LED1_RED
);
gpio_free
(
IGEP2_GPIO_LED1_RED
);
...
@@ -111,7 +123,7 @@ static void __init igep2_get_revision(void)
...
@@ -111,7 +123,7 @@ static void __init igep2_get_revision(void)
* So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
* So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
*/
*/
static
struct
mtd_partition
igep
2
_onenand_partitions
[]
=
{
static
struct
mtd_partition
igep_onenand_partitions
[]
=
{
{
{
.
name
=
"X-Loader"
,
.
name
=
"X-Loader"
,
.
offset
=
0
,
.
offset
=
0
,
...
@@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = {
...
@@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = {
},
},
};
};
static
struct
omap_onenand_platform_data
igep
2
_onenand_data
=
{
static
struct
omap_onenand_platform_data
igep_onenand_data
=
{
.
parts
=
igep
2
_onenand_partitions
,
.
parts
=
igep_onenand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
igep
2
_onenand_partitions
),
.
nr_parts
=
ARRAY_SIZE
(
igep_onenand_partitions
),
.
dma_channel
=
-
1
,
/* disable DMA in OMAP OneNAND driver */
.
dma_channel
=
-
1
,
/* disable DMA in OMAP OneNAND driver */
};
};
static
struct
platform_device
igep
2
_onenand_device
=
{
static
struct
platform_device
igep_onenand_device
=
{
.
name
=
"omap2-onenand"
,
.
name
=
"omap2-onenand"
,
.
id
=
-
1
,
.
id
=
-
1
,
.
dev
=
{
.
dev
=
{
.
platform_data
=
&
igep
2
_onenand_data
,
.
platform_data
=
&
igep_onenand_data
,
},
},
};
};
static
void
__init
igep
2
_flash_init
(
void
)
static
void
__init
igep_flash_init
(
void
)
{
{
u8
cs
=
0
;
u8
cs
=
0
;
u8
onenandcs
=
GPMC_CS_NUM
+
1
;
u8
onenandcs
=
GPMC_CS_NUM
+
1
;
...
@@ -165,7 +177,7 @@ static void __init igep2_flash_init(void)
...
@@ -165,7 +177,7 @@ static void __init igep2_flash_init(void)
/* Check if NAND/oneNAND is configured */
/* Check if NAND/oneNAND is configured */
if
((
ret
&
0xC00
)
==
0x800
)
if
((
ret
&
0xC00
)
==
0x800
)
/* NAND found */
/* NAND found */
pr_err
(
"IGEP
2
: Unsupported NAND found
\n
"
);
pr_err
(
"IGEP: Unsupported NAND found
\n
"
);
else
{
else
{
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG7
);
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG7
);
if
((
ret
&
0x3F
)
==
(
ONENAND_MAP
>>
24
))
if
((
ret
&
0x3F
)
==
(
ONENAND_MAP
>>
24
))
...
@@ -175,85 +187,46 @@ static void __init igep2_flash_init(void)
...
@@ -175,85 +187,46 @@ static void __init igep2_flash_init(void)
}
}
if
(
onenandcs
>
GPMC_CS_NUM
)
{
if
(
onenandcs
>
GPMC_CS_NUM
)
{
pr_err
(
"IGEP
2
: Unable to find configuration in GPMC
\n
"
);
pr_err
(
"IGEP: Unable to find configuration in GPMC
\n
"
);
return
;
return
;
}
}
igep
2
_onenand_data
.
cs
=
onenandcs
;
igep_onenand_data
.
cs
=
onenandcs
;
if
(
platform_device_register
(
&
igep
2
_onenand_device
)
<
0
)
if
(
platform_device_register
(
&
igep_onenand_device
)
<
0
)
pr_err
(
"IGEP
2
: Unable to register OneNAND device
\n
"
);
pr_err
(
"IGEP: Unable to register OneNAND device
\n
"
);
}
}
#else
#else
static
void
__init
igep
2
_flash_init
(
void
)
{}
static
void
__init
igep_flash_init
(
void
)
{}
#endif
#endif
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h>
#include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static
struct
smsc911x_platform_config
igep2_smsc911x_config
=
{
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
cs
=
IGEP2_SMSC911X_CS
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
gpio_irq
=
IGEP2_SMSC911X_GPIO
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
.
gpio_reset
=
-
EINVAL
,
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
};
static
struct
resource
igep2_smsc911x_resources
[]
=
{
{
.
flags
=
IORESOURCE_MEM
,
},
{
.
start
=
OMAP_GPIO_IRQ
(
IGEP2_SMSC911X_GPIO
),
.
end
=
OMAP_GPIO_IRQ
(
IGEP2_SMSC911X_GPIO
),
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
static
struct
platform_device
igep2_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
0
,
.
num_resources
=
ARRAY_SIZE
(
igep2_smsc911x_resources
),
.
resource
=
igep2_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
igep2_smsc911x_config
,
},
};
};
static
inline
void
__init
igep2_init_smsc911x
(
void
)
static
inline
void
__init
igep2_init_smsc911x
(
void
)
{
{
unsigned
long
cs_mem_base
;
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
if
(
gpmc_cs_request
(
IGEP2_SMSC911X_CS
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
pr_err
(
"IGEP v2: Failed request for GPMC mem for smsc911x
\n
"
);
gpmc_cs_free
(
IGEP2_SMSC911X_CS
);
return
;
}
igep2_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
igep2_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
if
((
gpio_request
(
IGEP2_SMSC911X_GPIO
,
"SMSC911X IRQ"
)
==
0
)
&&
(
gpio_direction_input
(
IGEP2_SMSC911X_GPIO
)
==
0
))
{
gpio_export
(
IGEP2_SMSC911X_GPIO
,
0
);
}
else
{
pr_err
(
"IGEP v2: Could not obtain gpio for for SMSC911X IRQ
\n
"
);
return
;
}
platform_device_register
(
&
igep2_smsc911x_device
);
}
}
#else
#else
static
inline
void
__init
igep2_init_smsc911x
(
void
)
{
}
static
inline
void
__init
igep2_init_smsc911x
(
void
)
{
}
#endif
#endif
static
struct
regulator_consumer_supply
igep
2
_vmmc1_supply
=
static
struct
regulator_consumer_supply
igep_vmmc1_supply
=
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.0"
);
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.0"
);
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
static
struct
regulator_init_data
igep
2
_vmmc1
=
{
static
struct
regulator_init_data
igep_vmmc1
=
{
.
constraints
=
{
.
constraints
=
{
.
min_uV
=
1850000
,
.
min_uV
=
1850000
,
.
max_uV
=
3150000
,
.
max_uV
=
3150000
,
...
@@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = {
...
@@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = {
|
REGULATOR_CHANGE_STATUS
,
|
REGULATOR_CHANGE_STATUS
,
},
},
.
num_consumer_supplies
=
1
,
.
num_consumer_supplies
=
1
,
.
consumer_supplies
=
&
igep
2
_vmmc1_supply
,
.
consumer_supplies
=
&
igep_vmmc1_supply
,
};
};
static
struct
regulator_consumer_supply
igep
2
_vio_supply
=
static
struct
regulator_consumer_supply
igep_vio_supply
=
REGULATOR_SUPPLY
(
"vmmc_aux"
,
"omap_hsmmc.1"
);
REGULATOR_SUPPLY
(
"vmmc_aux"
,
"omap_hsmmc.1"
);
static
struct
regulator_init_data
igep
2
_vio
=
{
static
struct
regulator_init_data
igep_vio
=
{
.
constraints
=
{
.
constraints
=
{
.
min_uV
=
1800000
,
.
min_uV
=
1800000
,
.
max_uV
=
1800000
,
.
max_uV
=
1800000
,
...
@@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = {
...
@@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = {
|
REGULATOR_CHANGE_STATUS
,
|
REGULATOR_CHANGE_STATUS
,
},
},
.
num_consumer_supplies
=
1
,
.
num_consumer_supplies
=
1
,
.
consumer_supplies
=
&
igep
2
_vio_supply
,
.
consumer_supplies
=
&
igep_vio_supply
,
};
};
static
struct
regulator_consumer_supply
igep
2
_vmmc2_supply
=
static
struct
regulator_consumer_supply
igep_vmmc2_supply
=
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.1"
);
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.1"
);
static
struct
regulator_init_data
igep
2
_vmmc2
=
{
static
struct
regulator_init_data
igep_vmmc2
=
{
.
constraints
=
{
.
constraints
=
{
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
,
.
always_on
=
1
,
.
always_on
=
1
,
},
},
.
num_consumer_supplies
=
1
,
.
num_consumer_supplies
=
1
,
.
consumer_supplies
=
&
igep
2
_vmmc2_supply
,
.
consumer_supplies
=
&
igep_vmmc2_supply
,
};
};
static
struct
fixed_voltage_config
igep
2
_vwlan
=
{
static
struct
fixed_voltage_config
igep_vwlan
=
{
.
supply_name
=
"vwlan"
,
.
supply_name
=
"vwlan"
,
.
microvolts
=
3300000
,
.
microvolts
=
3300000
,
.
gpio
=
-
EINVAL
,
.
gpio
=
-
EINVAL
,
.
enabled_at_boot
=
1
,
.
enabled_at_boot
=
1
,
.
init_data
=
&
igep
2
_vmmc2
,
.
init_data
=
&
igep_vmmc2
,
};
};
static
struct
platform_device
igep
2
_vwlan_device
=
{
static
struct
platform_device
igep_vwlan_device
=
{
.
name
=
"reg-fixed-voltage"
,
.
name
=
"reg-fixed-voltage"
,
.
id
=
0
,
.
id
=
0
,
.
dev
=
{
.
dev
=
{
.
platform_data
=
&
igep
2
_vwlan
,
.
platform_data
=
&
igep_vwlan
,
},
},
};
};
...
@@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = {
...
@@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = {
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
#include <linux/leds.h>
#include <linux/leds.h>
static
struct
gpio_led
igep
2
_gpio_leds
[]
=
{
static
struct
gpio_led
igep_gpio_leds
[]
=
{
[
0
]
=
{
[
0
]
=
{
.
name
=
"gpio-led:red:d0"
,
.
name
=
"gpio-led:red:d0"
,
.
gpio
=
IGEP2_GPIO_LED0_RED
,
.
default_trigger
=
"default-off"
.
default_trigger
=
"default-off"
},
},
[
1
]
=
{
[
1
]
=
{
.
name
=
"gpio-led:green:d0"
,
.
name
=
"gpio-led:green:d0"
,
.
gpio
=
IGEP2_GPIO_LED0_GREEN
,
.
default_trigger
=
"default-off"
,
.
default_trigger
=
"default-off"
,
},
},
[
2
]
=
{
[
2
]
=
{
.
name
=
"gpio-led:red:d1"
,
.
name
=
"gpio-led:red:d1"
,
.
gpio
=
IGEP2_GPIO_LED1_RED
,
.
default_trigger
=
"default-off"
,
.
default_trigger
=
"default-off"
,
},
},
[
3
]
=
{
[
3
]
=
{
...
@@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = {
...
@@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = {
},
},
};
};
static
struct
gpio_led_platform_data
igep
2
_led_pdata
=
{
static
struct
gpio_led_platform_data
igep_led_pdata
=
{
.
leds
=
igep
2
_gpio_leds
,
.
leds
=
igep_gpio_leds
,
.
num_leds
=
ARRAY_SIZE
(
igep
2
_gpio_leds
),
.
num_leds
=
ARRAY_SIZE
(
igep_gpio_leds
),
};
};
static
struct
platform_device
igep
2
_led_device
=
{
static
struct
platform_device
igep_led_device
=
{
.
name
=
"leds-gpio"
,
.
name
=
"leds-gpio"
,
.
id
=
-
1
,
.
id
=
-
1
,
.
dev
=
{
.
dev
=
{
.
platform_data
=
&
igep
2
_led_pdata
,
.
platform_data
=
&
igep_led_pdata
,
},
},
};
};
static
void
__init
igep
2
_leds_init
(
void
)
static
void
__init
igep_leds_init
(
void
)
{
{
platform_device_register
(
&
igep2_led_device
);
if
(
machine_is_igep0020
())
{
igep_gpio_leds
[
0
].
gpio
=
IGEP2_GPIO_LED0_RED
;
igep_gpio_leds
[
1
].
gpio
=
IGEP2_GPIO_LED0_GREEN
;
igep_gpio_leds
[
2
].
gpio
=
IGEP2_GPIO_LED1_RED
;
}
else
{
igep_gpio_leds
[
0
].
gpio
=
IGEP3_GPIO_LED0_RED
;
igep_gpio_leds
[
1
].
gpio
=
IGEP3_GPIO_LED0_GREEN
;
igep_gpio_leds
[
2
].
gpio
=
IGEP3_GPIO_LED1_RED
;
}
platform_device_register
(
&
igep_led_device
);
}
}
#else
#else
static
inline
void
igep2_leds_init
(
void
)
static
struct
gpio
igep_gpio_leds
[]
__initdata
=
{
{
-
EINVAL
,
GPIOF_OUT_INIT_LOW
,
"gpio-led:red:d0"
},
{
-
EINVAL
,
GPIOF_OUT_INIT_LOW
,
"gpio-led:green:d0"
},
{
-
EINVAL
,
GPIOF_OUT_INIT_LOW
,
"gpio-led:red:d1"
},
};
static
inline
void
igep_leds_init
(
void
)
{
{
if
((
gpio_request
(
IGEP2_GPIO_LED0_RED
,
"gpio-led:red:d0"
)
==
0
)
&&
int
i
;
(
gpio_direction_output
(
IGEP2_GPIO_LED0_RED
,
0
)
==
0
))
gpio_export
(
IGEP2_GPIO_LED0_RED
,
0
);
else
pr_warning
(
"IGEP v2: Could not obtain gpio GPIO_LED0_RED
\n
"
);
if
((
gpio_request
(
IGEP2_GPIO_LED0_GREEN
,
"gpio-led:green:d0"
)
==
0
)
&&
if
(
machine_is_igep0020
())
{
(
gpio_direction_output
(
IGEP2_GPIO_LED0_GREEN
,
0
)
==
0
))
igep_gpio_leds
[
0
].
gpio
=
IGEP2_GPIO_LED0_RED
;
gpio_export
(
IGEP2_GPIO_LED0_GREEN
,
0
);
igep_gpio_leds
[
1
].
gpio
=
IGEP2_GPIO_LED0_GREEN
;
else
igep_gpio_leds
[
2
].
gpio
=
IGEP2_GPIO_LED1_RED
;
pr_warning
(
"IGEP v2: Could not obtain gpio GPIO_LED0_GREEN
\n
"
);
}
else
{
igep_gpio_leds
[
0
].
gpio
=
IGEP3_GPIO_LED0_RED
;
igep_gpio_leds
[
1
].
gpio
=
IGEP3_GPIO_LED0_GREEN
;
igep_gpio_leds
[
2
].
gpio
=
IGEP3_GPIO_LED1_RED
;
}
if
((
gpio_request
(
IGEP2_GPIO_LED1_RED
,
"gpio-led:red:d1"
)
==
0
)
&&
if
(
gpio_request_array
(
igep_gpio_leds
,
ARRAY_SIZE
(
igep_gpio_leds
)))
{
(
gpio_direction_output
(
IGEP2_GPIO_LED1_RED
,
0
)
==
0
))
pr_warning
(
"IGEP v2: Could not obtain leds gpios
\n
"
);
gpio_export
(
IGEP2_GPIO_LED1_RED
,
0
);
return
;
else
}
pr_warning
(
"IGEP v2: Could not obtain gpio GPIO_LED1_RED
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
igep_gpio_leds
);
i
++
)
gpio_export
(
igep_gpio_leds
[
i
].
gpio
,
0
);
}
}
#endif
#endif
static
int
igep2_twl_gpio_setup
(
struct
device
*
dev
,
static
struct
gpio
igep2_twl_gpios
[]
=
{
{
-
EINVAL
,
GPIOF_IN
,
"GPIO_EHCI_NOC"
},
{
-
EINVAL
,
GPIOF_OUT_INIT_LOW
,
"GPIO_USBH_CPEN"
},
};
static
int
igep_twl_gpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
ngpio
)
unsigned
gpio
,
unsigned
ngpio
)
{
{
int
ret
;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc
[
0
].
gpio_cd
=
gpio
+
0
;
mmc
[
0
].
gpio_cd
=
gpio
+
0
;
omap2_hsmmc_init
(
mmc
);
omap2_hsmmc_init
(
mmc
);
/*
* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
if
((
gpio_request
(
gpio
+
1
,
"GPIO_EHCI_NOC"
)
<
0
)
||
(
gpio_direction_input
(
gpio
+
1
)
<
0
))
pr_err
(
"IGEP2: Could not obtain gpio for EHCI NOC"
);
/*
* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
* (out, active low)
*/
if
((
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"GPIO_USBH_CPEN"
)
<
0
)
||
(
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
0
)
<
0
))
pr_err
(
"IGEP2: Could not obtain gpio for USBH_CPEN"
);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
if
((
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
"gpio-led:green:d1"
)
==
0
)
ret
=
gpio_request_one
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
GPIOF_OUT_INIT_HIGH
,
&&
(
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
1
)
==
0
))
"gpio-led:green:d1"
);
if
(
ret
==
0
)
gpio_export
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
0
);
gpio_export
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
0
);
else
else
pr_warning
(
"IGEP
v2
: Could not obtain gpio GPIO_LED1_GREEN
\n
"
);
pr_warning
(
"IGEP: Could not obtain gpio GPIO_LED1_GREEN
\n
"
);
#else
#else
igep
2
_gpio_leds
[
3
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
igep_gpio_leds
[
3
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
#endif
#endif
if
(
machine_is_igep0030
())
return
0
;
/*
* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
igep2_twl_gpios
[
0
].
gpio
=
gpio
+
1
;
/* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN (out, active low) */
igep2_twl_gpios
[
1
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
;
ret
=
gpio_request_array
(
igep2_twl_gpios
,
ARRAY_SIZE
(
igep2_twl_gpios
));
if
(
ret
<
0
)
pr_err
(
"IGEP2: Could not obtain gpio for USBH_CPEN"
);
return
0
;
return
0
;
};
};
static
struct
twl4030_gpio_platform_data
igep
2
_twl4030_gpio_pdata
=
{
static
struct
twl4030_gpio_platform_data
igep_twl4030_gpio_pdata
=
{
.
gpio_base
=
OMAP_MAX_GPIO_LINES
,
.
gpio_base
=
OMAP_MAX_GPIO_LINES
,
.
irq_base
=
TWL4030_GPIO_IRQ_BASE
,
.
irq_base
=
TWL4030_GPIO_IRQ_BASE
,
.
irq_end
=
TWL4030_GPIO_IRQ_END
,
.
irq_end
=
TWL4030_GPIO_IRQ_END
,
.
use_leds
=
true
,
.
use_leds
=
true
,
.
setup
=
igep
2
_twl_gpio_setup
,
.
setup
=
igep_twl_gpio_setup
,
};
};
static
struct
twl4030_usb_data
igep
2
_usb_data
=
{
static
struct
twl4030_usb_data
igep_usb_data
=
{
.
usb_mode
=
T2_USB_MODE_ULPI
,
.
usb_mode
=
T2_USB_MODE_ULPI
,
};
};
...
@@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = {
...
@@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = {
static
void
__init
igep2_display_init
(
void
)
static
void
__init
igep2_display_init
(
void
)
{
{
if
(
gpio_request
(
IGEP2_GPIO_DVI_PUP
,
"GPIO_DVI_PUP"
)
&&
int
err
=
gpio_request_one
(
IGEP2_GPIO_DVI_PUP
,
GPIOF_OUT_INIT_HIGH
,
gpio_direction_output
(
IGEP2_GPIO_DVI_PUP
,
1
))
"GPIO_DVI_PUP"
);
if
(
err
)
pr_err
(
"IGEP v2: Could not obtain gpio GPIO_DVI_PUP
\n
"
);
pr_err
(
"IGEP v2: Could not obtain gpio GPIO_DVI_PUP
\n
"
);
}
}
static
struct
platform_device
*
igep
2
_devices
[]
__initdata
=
{
static
struct
platform_device
*
igep_devices
[]
__initdata
=
{
&
igep
2
_vwlan_device
,
&
igep_vwlan_device
,
};
};
static
void
__init
igep
2
_init_early
(
void
)
static
void
__init
igep_init_early
(
void
)
{
{
omap2_init_common_infrastructure
();
omap2_init_common_infrastructure
();
omap2_init_common_devices
(
m65kxxxxam_sdrc_params
,
omap2_init_common_devices
(
m65kxxxxam_sdrc_params
,
...
@@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = {
...
@@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = {
.
rep
=
1
,
.
rep
=
1
,
};
};
static
struct
twl4030_platform_data
igep
2
_twldata
=
{
static
struct
twl4030_platform_data
igep_twldata
=
{
.
irq_base
=
TWL4030_IRQ_BASE
,
.
irq_base
=
TWL4030_IRQ_BASE
,
.
irq_end
=
TWL4030_IRQ_END
,
.
irq_end
=
TWL4030_IRQ_END
,
/* platform_data for children goes here */
/* platform_data for children goes here */
.
usb
=
&
igep2_usb_data
,
.
usb
=
&
igep_usb_data
,
.
codec
=
&
igep2_codec_data
,
.
gpio
=
&
igep_twl4030_gpio_pdata
,
.
gpio
=
&
igep2_twl4030_gpio_pdata
,
.
vmmc1
=
&
igep_vmmc1
,
.
keypad
=
&
igep2_keypad_pdata
,
.
vio
=
&
igep_vio
,
.
vmmc1
=
&
igep2_vmmc1
,
.
vpll2
=
&
igep2_vpll2
,
.
vio
=
&
igep2_vio
,
};
static
struct
i2c_board_info
__initdata
igep2_i2c1_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
igep2_twldata
,
},
};
};
static
struct
i2c_board_info
__initdata
igep2_i2c3_boardinfo
[]
=
{
static
struct
i2c_board_info
__initdata
igep2_i2c3_boardinfo
[]
=
{
...
@@ -590,32 +574,29 @@ static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
...
@@ -590,32 +574,29 @@ static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
},
},
};
};
static
void
__init
igep
2
_i2c_init
(
void
)
static
void
__init
igep_i2c_init
(
void
)
{
{
int
ret
;
int
ret
;
ret
=
omap_register_i2c_bus
(
1
,
2600
,
igep2_i2c1_boardinfo
,
if
(
machine_is_igep0020
())
{
ARRAY_SIZE
(
igep2_i2c1_boardinfo
));
/*
if
(
ret
)
* Bus 3 is attached to the DVI port where devices like the
pr_warning
(
"IGEP2: Could not register I2C1 bus (%d)
\n
"
,
ret
);
* pico DLP projector don't work reliably with 400kHz
*/
ret
=
omap_register_i2c_bus
(
3
,
100
,
igep2_i2c3_boardinfo
,
ARRAY_SIZE
(
igep2_i2c3_boardinfo
));
if
(
ret
)
pr_warning
(
"IGEP2: Could not register I2C3 bus (%d)
\n
"
,
ret
);
igep_twldata
.
codec
=
&
igep2_codec_data
;
igep_twldata
.
keypad
=
&
igep2_keypad_pdata
;
igep_twldata
.
vpll2
=
&
igep2_vpll2
;
}
/*
omap3_pmic_init
(
"twl4030"
,
&
igep_twldata
);
* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz
*/
ret
=
omap_register_i2c_bus
(
3
,
100
,
igep2_i2c3_boardinfo
,
ARRAY_SIZE
(
igep2_i2c3_boardinfo
));
if
(
ret
)
pr_warning
(
"IGEP2: Could not register I2C3 bus (%d)
\n
"
,
ret
);
}
}
static
struct
omap_musb_board_data
musb_board_data
=
{
static
const
struct
usbhs_omap_board_data
igep2_usbhs_bdata
__initconst
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
1
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
port_mode
[
1
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
port_mode
[
2
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
port_mode
[
2
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
...
@@ -626,6 +607,17 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
...
@@ -626,6 +607,17 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.
reset_gpio_port
[
2
]
=
-
EINVAL
,
.
reset_gpio_port
[
2
]
=
-
EINVAL
,
};
};
static
const
struct
usbhs_omap_board_data
igep3_usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
port_mode
[
1
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
2
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
phy_reset
=
true
,
.
reset_gpio_port
[
0
]
=
-
EINVAL
,
.
reset_gpio_port
[
1
]
=
IGEP3_GPIO_USBH_NRESET
,
.
reset_gpio_port
[
2
]
=
-
EINVAL
,
};
#ifdef CONFIG_OMAP_MUX
#ifdef CONFIG_OMAP_MUX
static
struct
omap_board_mux
board_mux
[]
__initdata
=
{
static
struct
omap_board_mux
board_mux
[]
__initdata
=
{
{
.
reg_offset
=
OMAP_MUX_TERMINATOR
},
{
.
reg_offset
=
OMAP_MUX_TERMINATOR
},
...
@@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = {
#endif
#endif
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
static
struct
gpio
igep_wlan_bt_gpios
[]
__initdata
=
{
{
-
EINVAL
,
GPIOF_OUT_INIT_HIGH
,
"GPIO_WIFI_NPD"
},
{
-
EINVAL
,
GPIOF_OUT_INIT_HIGH
,
"GPIO_WIFI_NRESET"
},
{
-
EINVAL
,
GPIOF_OUT_INIT_HIGH
,
"GPIO_BT_NRESET"
},
};
static
void
__init
igep
2
_wlan_bt_init
(
void
)
static
void
__init
igep_wlan_bt_init
(
void
)
{
{
unsigned
npd
,
wreset
,
btreset
;
int
err
;
/* GPIO's for WLAN-BT combo depends on hardware revision */
/* GPIO's for WLAN-BT combo depends on hardware revision */
if
(
hwrev
==
IGEP2_BOARD_HWREV_B
)
{
if
(
hwrev
==
IGEP2_BOARD_HWREV_B
)
{
npd
=
IGEP2_RB_GPIO_WIFI_NPD
;
igep_wlan_bt_gpios
[
0
].
gpio
=
IGEP2_RB_GPIO_WIFI_NPD
;
wreset
=
IGEP2_RB_GPIO_WIFI_NRESET
;
igep_wlan_bt_gpios
[
1
].
gpio
=
IGEP2_RB_GPIO_WIFI_NRESET
;
btreset
=
IGEP2_RB_GPIO_BT_NRESET
;
igep_wlan_bt_gpios
[
2
].
gpio
=
IGEP2_RB_GPIO_BT_NRESET
;
}
else
if
(
hwrev
==
IGEP2_BOARD_HWREV_C
)
{
}
else
if
(
hwrev
==
IGEP2_BOARD_HWREV_C
||
machine_is_igep0030
()
)
{
npd
=
IGEP2_RC_GPIO_WIFI_NPD
;
igep_wlan_bt_gpios
[
0
].
gpio
=
IGEP2_RC_GPIO_WIFI_NPD
;
wreset
=
IGEP2_RC_GPIO_WIFI_NRESET
;
igep_wlan_bt_gpios
[
1
].
gpio
=
IGEP2_RC_GPIO_WIFI_NRESET
;
btreset
=
IGEP2_RC_GPIO_BT_NRESET
;
igep_wlan_bt_gpios
[
2
].
gpio
=
IGEP2_RC_GPIO_BT_NRESET
;
}
else
}
else
return
;
return
;
/* Set GPIO's for WLAN-BT combo module */
err
=
gpio_request_array
(
igep_wlan_bt_gpios
,
if
((
gpio_request
(
npd
,
"GPIO_WIFI_NPD"
)
==
0
)
&&
ARRAY_SIZE
(
igep_wlan_bt_gpios
));
(
gpio_direction_output
(
npd
,
1
)
==
0
))
{
if
(
err
)
{
gpio_export
(
npd
,
0
);
pr_warning
(
"IGEP2: Could not obtain WIFI/BT gpios
\n
"
);
}
else
return
;
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_WIFI_NPD
\n
"
);
}
if
((
gpio_request
(
wreset
,
"GPIO_WIFI_NRESET"
)
==
0
)
&&
gpio_export
(
igep_wlan_bt_gpios
[
0
].
gpio
,
0
);
(
gpio_direction_output
(
wreset
,
1
)
==
0
))
{
gpio_export
(
igep_wlan_bt_gpios
[
1
].
gpio
,
0
);
gpio_export
(
wreset
,
0
);
gpio_export
(
igep_wlan_bt_gpios
[
2
].
gpio
,
0
);
gpio_set_value
(
wreset
,
0
);
udelay
(
10
);
gpio_set_value
(
igep_wlan_bt_gpios
[
1
].
gpio
,
0
);
gpio_set_value
(
wreset
,
1
);
udelay
(
10
);
}
else
gpio_set_value
(
igep_wlan_bt_gpios
[
1
].
gpio
,
1
);
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_WIFI_NRESET
\n
"
);
if
((
gpio_request
(
btreset
,
"GPIO_BT_NRESET"
)
==
0
)
&&
(
gpio_direction_output
(
btreset
,
1
)
==
0
))
{
gpio_export
(
btreset
,
0
);
}
else
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_BT_NRESET
\n
"
);
}
}
#else
#else
static
inline
void
__init
igep
2
_wlan_bt_init
(
void
)
{
}
static
inline
void
__init
igep_wlan_bt_init
(
void
)
{
}
#endif
#endif
static
void
__init
igep
2
_init
(
void
)
static
void
__init
igep_init
(
void
)
{
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
/* Get IGEP2 hardware revision */
/* Get IGEP2 hardware revision */
igep2_get_revision
();
igep2_get_revision
();
/* Register I2C busses and drivers */
/* Register I2C busses and drivers */
igep2_i2c_init
();
igep_i2c_init
();
platform_add_devices
(
igep2_devices
,
ARRAY_SIZE
(
igep2_devices
));
platform_add_devices
(
igep_devices
,
ARRAY_SIZE
(
igep_devices
));
omap_display_init
(
&
igep2_dss_data
);
omap_serial_init
();
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
igep2_flash_init
();
igep_flash_init
();
igep2_leds_init
();
igep_leds_init
();
igep2_display_init
();
igep2_init_smsc911x
();
/*
/*
* WLAN-BT combo module from MuRata which has a Marvell WLAN
* WLAN-BT combo module from MuRata which has a Marvell WLAN
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
*/
*/
igep
2
_wlan_bt_init
();
igep_wlan_bt_init
();
if
(
machine_is_igep0020
())
{
omap_display_init
(
&
igep2_dss_data
);
igep2_display_init
();
igep2_init_smsc911x
();
usbhs_init
(
&
igep2_usbhs_bdata
);
}
else
{
usbhs_init
(
&
igep3_usbhs_bdata
);
}
}
}
MACHINE_START
(
IGEP0020
,
"IGEP v2 board"
)
MACHINE_START
(
IGEP0020
,
"IGEP v2 board"
)
.
boot_params
=
0x80000100
,
.
boot_params
=
0x80000100
,
.
reserve
=
omap_reserve
,
.
reserve
=
omap_reserve
,
.
map_io
=
omap3_map_io
,
.
map_io
=
omap3_map_io
,
.
init_early
=
igep2_init_early
,
.
init_early
=
igep_init_early
,
.
init_irq
=
omap_init_irq
,
.
init_machine
=
igep_init
,
.
timer
=
&
omap_timer
,
MACHINE_END
MACHINE_START
(
IGEP0030
,
"IGEP OMAP3 module"
)
.
boot_params
=
0x80000100
,
.
reserve
=
omap_reserve
,
.
map_io
=
omap3_map_io
,
.
init_early
=
igep_init_early
,
.
init_irq
=
omap_init_irq
,
.
init_irq
=
omap_init_irq
,
.
init_machine
=
igep
2
_init
,
.
init_machine
=
igep_init
,
.
timer
=
&
omap_timer
,
.
timer
=
&
omap_timer
,
MACHINE_END
MACHINE_END
arch/arm/mach-omap2/board-igep0030.c
已删除
100644 → 0
浏览文件 @
75c0b3b4
/*
* Copyright (C) 2010 - ISEE 2007 SL
*
* Modified from mach-omap2/board-generic.c
*
* 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/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h>
#include <linux/i2c/twl.h>
#include <linux/mmc/host.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <plat/board.h>
#include <plat/common.h>
#include <plat/gpmc.h>
#include <plat/usb.h>
#include <plat/onenand.h>
#include "mux.h"
#include "hsmmc.h"
#include "sdram-numonyx-m65kxxxxam.h"
#define IGEP3_GPIO_LED0_GREEN 54
#define IGEP3_GPIO_LED0_RED 53
#define IGEP3_GPIO_LED1_RED 16
#define IGEP3_GPIO_WIFI_NPD 138
#define IGEP3_GPIO_WIFI_NRESET 139
#define IGEP3_GPIO_BT_NRESET 137
#define IGEP3_GPIO_USBH_NRESET 183
#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
#define ONENAND_MAP 0x20000000
/*
* x2 Flash built-in COMBO POP MEMORY
* Since the device is equipped with two DataRAMs, and two-plane NAND
* Flash memory array, these two component enables simultaneous program
* of 4KiB. Plane1 has only even blocks such as block0, block2, block4
* while Plane2 has only odd blocks such as block1, block3, block5.
* So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
*/
static
struct
mtd_partition
igep3_onenand_partitions
[]
=
{
{
.
name
=
"X-Loader"
,
.
offset
=
0
,
.
size
=
2
*
(
64
*
(
2
*
2048
))
},
{
.
name
=
"U-Boot"
,
.
offset
=
MTDPART_OFS_APPEND
,
.
size
=
6
*
(
64
*
(
2
*
2048
)),
},
{
.
name
=
"Environment"
,
.
offset
=
MTDPART_OFS_APPEND
,
.
size
=
2
*
(
64
*
(
2
*
2048
)),
},
{
.
name
=
"Kernel"
,
.
offset
=
MTDPART_OFS_APPEND
,
.
size
=
12
*
(
64
*
(
2
*
2048
)),
},
{
.
name
=
"File System"
,
.
offset
=
MTDPART_OFS_APPEND
,
.
size
=
MTDPART_SIZ_FULL
,
},
};
static
struct
omap_onenand_platform_data
igep3_onenand_pdata
=
{
.
parts
=
igep3_onenand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
igep3_onenand_partitions
),
.
onenand_setup
=
NULL
,
.
dma_channel
=
-
1
,
/* disable DMA in OMAP OneNAND driver */
};
static
struct
platform_device
igep3_onenand_device
=
{
.
name
=
"omap2-onenand"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
&
igep3_onenand_pdata
,
},
};
static
void
__init
igep3_flash_init
(
void
)
{
u8
cs
=
0
;
u8
onenandcs
=
GPMC_CS_NUM
+
1
;
for
(
cs
=
0
;
cs
<
GPMC_CS_NUM
;
cs
++
)
{
u32
ret
;
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG1
);
/* Check if NAND/oneNAND is configured */
if
((
ret
&
0xC00
)
==
0x800
)
/* NAND found */
pr_err
(
"IGEP3: Unsupported NAND found
\n
"
);
else
{
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG7
);
if
((
ret
&
0x3F
)
==
(
ONENAND_MAP
>>
24
))
/* OneNAND found */
onenandcs
=
cs
;
}
}
if
(
onenandcs
>
GPMC_CS_NUM
)
{
pr_err
(
"IGEP3: Unable to find configuration in GPMC
\n
"
);
return
;
}
igep3_onenand_pdata
.
cs
=
onenandcs
;
if
(
platform_device_register
(
&
igep3_onenand_device
)
<
0
)
pr_err
(
"IGEP3: Unable to register OneNAND device
\n
"
);
}
#else
static
void
__init
igep3_flash_init
(
void
)
{}
#endif
static
struct
regulator_consumer_supply
igep3_vmmc1_supply
=
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.0"
);
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
static
struct
regulator_init_data
igep3_vmmc1
=
{
.
constraints
=
{
.
min_uV
=
1850000
,
.
max_uV
=
3150000
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_STANDBY
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_MODE
|
REGULATOR_CHANGE_STATUS
,
},
.
num_consumer_supplies
=
1
,
.
consumer_supplies
=
&
igep3_vmmc1_supply
,
};
static
struct
regulator_consumer_supply
igep3_vio_supply
=
REGULATOR_SUPPLY
(
"vmmc_aux"
,
"omap_hsmmc.1"
);
static
struct
regulator_init_data
igep3_vio
=
{
.
constraints
=
{
.
min_uV
=
1800000
,
.
max_uV
=
1800000
,
.
apply_uV
=
1
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_STANDBY
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_MODE
|
REGULATOR_CHANGE_STATUS
,
},
.
num_consumer_supplies
=
1
,
.
consumer_supplies
=
&
igep3_vio_supply
,
};
static
struct
regulator_consumer_supply
igep3_vmmc2_supply
=
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.1"
);
static
struct
regulator_init_data
igep3_vmmc2
=
{
.
constraints
=
{
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
,
.
always_on
=
1
,
},
.
num_consumer_supplies
=
1
,
.
consumer_supplies
=
&
igep3_vmmc2_supply
,
};
static
struct
fixed_voltage_config
igep3_vwlan
=
{
.
supply_name
=
"vwlan"
,
.
microvolts
=
3300000
,
.
gpio
=
-
EINVAL
,
.
enabled_at_boot
=
1
,
.
init_data
=
&
igep3_vmmc2
,
};
static
struct
platform_device
igep3_vwlan_device
=
{
.
name
=
"reg-fixed-voltage"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
igep3_vwlan
,
},
};
static
struct
omap2_hsmmc_info
mmc
[]
=
{
[
0
]
=
{
.
mmc
=
1
,
.
caps
=
MMC_CAP_4_BIT_DATA
,
.
gpio_cd
=
-
EINVAL
,
.
gpio_wp
=
-
EINVAL
,
},
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
[
1
]
=
{
.
mmc
=
2
,
.
caps
=
MMC_CAP_4_BIT_DATA
,
.
gpio_cd
=
-
EINVAL
,
.
gpio_wp
=
-
EINVAL
,
},
#endif
{}
/* Terminator */
};
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
#include <linux/leds.h>
static
struct
gpio_led
igep3_gpio_leds
[]
=
{
[
0
]
=
{
.
name
=
"gpio-led:red:d0"
,
.
gpio
=
IGEP3_GPIO_LED0_RED
,
.
default_trigger
=
"default-off"
},
[
1
]
=
{
.
name
=
"gpio-led:green:d0"
,
.
gpio
=
IGEP3_GPIO_LED0_GREEN
,
.
default_trigger
=
"default-off"
,
},
[
2
]
=
{
.
name
=
"gpio-led:red:d1"
,
.
gpio
=
IGEP3_GPIO_LED1_RED
,
.
default_trigger
=
"default-off"
,
},
[
3
]
=
{
.
name
=
"gpio-led:green:d1"
,
.
default_trigger
=
"heartbeat"
,
.
gpio
=
-
EINVAL
,
/* gets replaced */
},
};
static
struct
gpio_led_platform_data
igep3_led_pdata
=
{
.
leds
=
igep3_gpio_leds
,
.
num_leds
=
ARRAY_SIZE
(
igep3_gpio_leds
),
};
static
struct
platform_device
igep3_led_device
=
{
.
name
=
"leds-gpio"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
&
igep3_led_pdata
,
},
};
static
void
__init
igep3_leds_init
(
void
)
{
platform_device_register
(
&
igep3_led_device
);
}
#else
static
inline
void
igep3_leds_init
(
void
)
{
if
((
gpio_request
(
IGEP3_GPIO_LED0_RED
,
"gpio-led:red:d0"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP3_GPIO_LED0_RED
,
1
)
==
0
))
{
gpio_export
(
IGEP3_GPIO_LED0_RED
,
0
);
gpio_set_value
(
IGEP3_GPIO_LED0_RED
,
1
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_LED0_RED
\n
"
);
if
((
gpio_request
(
IGEP3_GPIO_LED0_GREEN
,
"gpio-led:green:d0"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP3_GPIO_LED0_GREEN
,
1
)
==
0
))
{
gpio_export
(
IGEP3_GPIO_LED0_GREEN
,
0
);
gpio_set_value
(
IGEP3_GPIO_LED0_GREEN
,
1
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_LED0_GREEN
\n
"
);
if
((
gpio_request
(
IGEP3_GPIO_LED1_RED
,
"gpio-led:red:d1"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP3_GPIO_LED1_RED
,
1
)
==
0
))
{
gpio_export
(
IGEP3_GPIO_LED1_RED
,
0
);
gpio_set_value
(
IGEP3_GPIO_LED1_RED
,
1
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_LED1_RED
\n
"
);
}
#endif
static
int
igep3_twl4030_gpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
ngpio
)
{
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc
[
0
].
gpio_cd
=
gpio
+
0
;
omap2_hsmmc_init
(
mmc
);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
if
((
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
"gpio-led:green:d1"
)
==
0
)
&&
(
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
1
)
==
0
))
{
gpio_export
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
0
);
gpio_set_value
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
0
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_LED1_GREEN
\n
"
);
#else
igep3_gpio_leds
[
3
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
#endif
return
0
;
};
static
struct
twl4030_gpio_platform_data
igep3_twl4030_gpio_pdata
=
{
.
gpio_base
=
OMAP_MAX_GPIO_LINES
,
.
irq_base
=
TWL4030_GPIO_IRQ_BASE
,
.
irq_end
=
TWL4030_GPIO_IRQ_END
,
.
use_leds
=
true
,
.
setup
=
igep3_twl4030_gpio_setup
,
};
static
struct
twl4030_usb_data
igep3_twl4030_usb_data
=
{
.
usb_mode
=
T2_USB_MODE_ULPI
,
};
static
struct
platform_device
*
igep3_devices
[]
__initdata
=
{
&
igep3_vwlan_device
,
};
static
void
__init
igep3_init_early
(
void
)
{
omap2_init_common_infrastructure
();
omap2_init_common_devices
(
m65kxxxxam_sdrc_params
,
m65kxxxxam_sdrc_params
);
}
static
struct
twl4030_platform_data
igep3_twl4030_pdata
=
{
.
irq_base
=
TWL4030_IRQ_BASE
,
.
irq_end
=
TWL4030_IRQ_END
,
/* platform_data for children goes here */
.
usb
=
&
igep3_twl4030_usb_data
,
.
gpio
=
&
igep3_twl4030_gpio_pdata
,
.
vmmc1
=
&
igep3_vmmc1
,
.
vio
=
&
igep3_vio
,
};
static
struct
i2c_board_info
__initdata
igep3_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
igep3_twl4030_pdata
,
},
};
static
int
__init
igep3_i2c_init
(
void
)
{
omap_register_i2c_bus
(
1
,
2600
,
igep3_i2c_boardinfo
,
ARRAY_SIZE
(
igep3_i2c_boardinfo
));
return
0
;
}
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
static
void
__init
igep3_wifi_bt_init
(
void
)
{
/* Configure MUX values for W-LAN + Bluetooth GPIO's */
omap_mux_init_gpio
(
IGEP3_GPIO_WIFI_NPD
,
OMAP_PIN_OUTPUT
);
omap_mux_init_gpio
(
IGEP3_GPIO_WIFI_NRESET
,
OMAP_PIN_OUTPUT
);
omap_mux_init_gpio
(
IGEP3_GPIO_BT_NRESET
,
OMAP_PIN_OUTPUT
);
/* Set GPIO's for W-LAN + Bluetooth combo module */
if
((
gpio_request
(
IGEP3_GPIO_WIFI_NPD
,
"GPIO_WIFI_NPD"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP3_GPIO_WIFI_NPD
,
1
)
==
0
))
{
gpio_export
(
IGEP3_GPIO_WIFI_NPD
,
0
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_WIFI_NPD
\n
"
);
if
((
gpio_request
(
IGEP3_GPIO_WIFI_NRESET
,
"GPIO_WIFI_NRESET"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP3_GPIO_WIFI_NRESET
,
1
)
==
0
))
{
gpio_export
(
IGEP3_GPIO_WIFI_NRESET
,
0
);
gpio_set_value
(
IGEP3_GPIO_WIFI_NRESET
,
0
);
udelay
(
10
);
gpio_set_value
(
IGEP3_GPIO_WIFI_NRESET
,
1
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_WIFI_NRESET
\n
"
);
if
((
gpio_request
(
IGEP3_GPIO_BT_NRESET
,
"GPIO_BT_NRESET"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP3_GPIO_BT_NRESET
,
1
)
==
0
))
{
gpio_export
(
IGEP3_GPIO_BT_NRESET
,
0
);
}
else
pr_warning
(
"IGEP3: Could not obtain gpio GPIO_BT_NRESET
\n
"
);
}
#else
void
__init
igep3_wifi_bt_init
(
void
)
{}
#endif
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
port_mode
[
1
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
2
]
=
OMAP_USBHS_PORT_MODE_UNUSED
,
.
phy_reset
=
true
,
.
reset_gpio_port
[
0
]
=
-
EINVAL
,
.
reset_gpio_port
[
1
]
=
IGEP3_GPIO_USBH_NRESET
,
.
reset_gpio_port
[
2
]
=
-
EINVAL
,
};
#ifdef CONFIG_OMAP_MUX
static
struct
omap_board_mux
board_mux
[]
__initdata
=
{
OMAP3_MUX
(
I2C2_SDA
,
OMAP_MUX_MODE4
|
OMAP_PIN_OUTPUT
),
{
.
reg_offset
=
OMAP_MUX_TERMINATOR
},
};
#endif
static
void
__init
igep3_init
(
void
)
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
/* Register I2C busses and drivers */
igep3_i2c_init
();
platform_add_devices
(
igep3_devices
,
ARRAY_SIZE
(
igep3_devices
));
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usbhs_init
(
&
usbhs_bdata
);
igep3_flash_init
();
igep3_leds_init
();
/*
* WLAN-BT combo module from MuRata which has a Marvell WLAN
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
*/
igep3_wifi_bt_init
();
}
MACHINE_START
(
IGEP0030
,
"IGEP OMAP3 module"
)
.
boot_params
=
0x80000100
,
.
reserve
=
omap_reserve
,
.
map_io
=
omap3_map_io
,
.
init_early
=
igep3_init_early
,
.
init_irq
=
omap_init_irq
,
.
init_machine
=
igep3_init
,
.
timer
=
&
omap_timer
,
MACHINE_END
arch/arm/mach-omap2/board-ldp.c
浏览文件 @
b08827f4
...
@@ -22,7 +22,6 @@
...
@@ -22,7 +22,6 @@
#include <linux/err.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/clk.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/machine.h>
#include <linux/i2c/twl.h>
#include <linux/i2c/twl.h>
#include <linux/io.h>
#include <linux/io.h>
...
@@ -43,47 +42,19 @@
...
@@ -43,47 +42,19 @@
#include <asm/delay.h>
#include <asm/delay.h>
#include <plat/usb.h>
#include <plat/usb.h>
#include <plat/gpmc-smsc911x.h>
#include "board-flash.h"
#include "board-flash.h"
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "control.h"
#include "control.h"
#include "common-board-devices.h"
#define LDP_SMSC911X_CS 1
#define LDP_SMSC911X_CS 1
#define LDP_SMSC911X_GPIO 152
#define LDP_SMSC911X_GPIO 152
#define DEBUG_BASE 0x08000000
#define DEBUG_BASE 0x08000000
#define LDP_ETHR_START DEBUG_BASE
#define LDP_ETHR_START DEBUG_BASE
static
struct
resource
ldp_smsc911x_resources
[]
=
{
[
0
]
=
{
.
start
=
LDP_ETHR_START
,
.
end
=
LDP_ETHR_START
+
SZ_4K
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
0
,
.
end
=
0
,
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
static
struct
smsc911x_platform_config
ldp_smsc911x_config
=
{
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
flags
=
SMSC911X_USE_32BIT
,
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
};
static
struct
platform_device
ldp_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
ldp_smsc911x_resources
),
.
resource
=
ldp_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
ldp_smsc911x_config
,
},
};
static
uint32_t
board_keymap
[]
=
{
static
uint32_t
board_keymap
[]
=
{
KEY
(
0
,
0
,
KEY_1
),
KEY
(
0
,
0
,
KEY_1
),
KEY
(
1
,
0
,
KEY_2
),
KEY
(
1
,
0
,
KEY_2
),
...
@@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = {
...
@@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = {
},
},
};
};
static
int
ts_gpio
;
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
cs
=
LDP_SMSC911X_CS
,
/**
.
gpio_irq
=
LDP_SMSC911X_GPIO
,
* @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
.
gpio_reset
=
-
EINVAL
,
*
.
flags
=
SMSC911X_USE_32BIT
,
* @return - void. If request gpio fails then Flag KERN_ERR.
*/
static
void
ads7846_dev_init
(
void
)
{
if
(
gpio_request
(
ts_gpio
,
"ads7846 irq"
)
<
0
)
{
printk
(
KERN_ERR
"can't get ads746 pen down GPIO
\n
"
);
return
;
}
gpio_direction_input
(
ts_gpio
);
gpio_set_debounce
(
ts_gpio
,
310
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
ts_gpio
);
}
static
struct
ads7846_platform_data
tsc2046_config
__initdata
=
{
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
};
static
struct
omap2_mcspi_device_config
tsc2046_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
ldp_spi_board_info
[]
__initdata
=
{
[
0
]
=
{
/*
* TSC2046 operates at a max freqency of 2MHz, so
* operate slightly below at 1.5MHz
*/
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
tsc2046_mcspi_config
,
.
irq
=
0
,
.
platform_data
=
&
tsc2046_config
,
},
};
};
static
inline
void
__init
ldp_init_smsc911x
(
void
)
static
inline
void
__init
ldp_init_smsc911x
(
void
)
{
{
int
eth_cs
;
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
unsigned
long
cs_mem_base
;
int
eth_gpio
=
0
;
eth_cs
=
LDP_SMSC911X_CS
;
if
(
gpmc_cs_request
(
eth_cs
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPMC mem for smsc911x
\n
"
);
return
;
}
ldp_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
ldp_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
udelay
(
100
);
eth_gpio
=
LDP_SMSC911X_GPIO
;
ldp_smsc911x_resources
[
1
].
start
=
OMAP_GPIO_IRQ
(
eth_gpio
);
if
(
gpio_request
(
eth_gpio
,
"smsc911x irq"
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for smsc911x IRQ
\n
"
,
eth_gpio
);
return
;
}
gpio_direction_input
(
eth_gpio
);
}
}
static
struct
platform_device
ldp_lcd_device
=
{
static
struct
platform_device
ldp_lcd_device
=
{
...
@@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = {
...
@@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = {
.
keypad
=
&
ldp_kp_twl4030_data
,
.
keypad
=
&
ldp_kp_twl4030_data
,
};
};
static
struct
i2c_board_info
__initdata
ldp_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
ldp_twldata
,
},
};
static
int
__init
omap_i2c_init
(
void
)
static
int
__init
omap_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
ldp_i2c_boardinfo
,
omap3_pmic_init
(
"twl4030"
,
&
ldp_twldata
);
ARRAY_SIZE
(
ldp_i2c_boardinfo
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
return
0
;
return
0
;
...
@@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
...
@@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
};
};
static
struct
platform_device
*
ldp_devices
[]
__initdata
=
{
static
struct
platform_device
*
ldp_devices
[]
__initdata
=
{
&
ldp_smsc911x_device
,
&
ldp_lcd_device
,
&
ldp_lcd_device
,
&
ldp_gpio_keys_device
,
&
ldp_gpio_keys_device
,
};
};
...
@@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
struct
mtd_partition
ldp_nand_partitions
[]
=
{
static
struct
mtd_partition
ldp_nand_partitions
[]
=
{
/* All the partition sizes are listed in terms of NAND block size */
/* All the partition sizes are listed in terms of NAND block size */
{
{
...
@@ -446,13 +334,9 @@ static void __init omap_ldp_init(void)
...
@@ -446,13 +334,9 @@ static void __init omap_ldp_init(void)
ldp_init_smsc911x
();
ldp_init_smsc911x
();
omap_i2c_init
();
omap_i2c_init
();
platform_add_devices
(
ldp_devices
,
ARRAY_SIZE
(
ldp_devices
));
platform_add_devices
(
ldp_devices
,
ARRAY_SIZE
(
ldp_devices
));
ts_gpio
=
54
;
omap_ads7846_init
(
1
,
54
,
310
,
NULL
);
ldp_spi_board_info
[
0
].
irq
=
gpio_to_irq
(
ts_gpio
);
spi_register_board_info
(
ldp_spi_board_info
,
ARRAY_SIZE
(
ldp_spi_board_info
));
ads7846_dev_init
();
omap_serial_init
();
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
board_nand_init
(
ldp_nand_partitions
,
board_nand_init
(
ldp_nand_partitions
,
ARRAY_SIZE
(
ldp_nand_partitions
),
ZOOM_NAND_CS
,
0
);
ARRAY_SIZE
(
ldp_nand_partitions
),
ZOOM_NAND_CS
,
0
);
...
...
arch/arm/mach-omap2/board-n8x0.c
浏览文件 @
b08827f4
...
@@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void)
...
@@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void)
static
char
announce
[]
__initdata
=
KERN_INFO
"TUSB 6010
\n
"
;
static
char
announce
[]
__initdata
=
KERN_INFO
"TUSB 6010
\n
"
;
/* PM companion chip power control pin */
/* PM companion chip power control pin */
ret
=
gpio_request
(
TUSB6010_GPIO_ENABLE
,
"TUSB6010 enable"
);
ret
=
gpio_request_one
(
TUSB6010_GPIO_ENABLE
,
GPIOF_OUT_INIT_LOW
,
"TUSB6010 enable"
);
if
(
ret
!=
0
)
{
if
(
ret
!=
0
)
{
printk
(
KERN_ERR
"Could not get TUSB power GPIO%i
\n
"
,
printk
(
KERN_ERR
"Could not get TUSB power GPIO%i
\n
"
,
TUSB6010_GPIO_ENABLE
);
TUSB6010_GPIO_ENABLE
);
return
;
return
;
}
}
gpio_direction_output
(
TUSB6010_GPIO_ENABLE
,
0
);
tusb_set_power
(
0
);
tusb_set_power
(
0
);
ret
=
tusb6010_setup_interface
(
&
tusb_data
,
TUSB6010_REFCLK_19
,
2
,
ret
=
tusb6010_setup_interface
(
&
tusb_data
,
TUSB6010_REFCLK_19
,
2
,
...
@@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = {
...
@@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = {
static
struct
omap_mmc_platform_data
*
mmc_data
[
OMAP24XX_NR_MMC
];
static
struct
omap_mmc_platform_data
*
mmc_data
[
OMAP24XX_NR_MMC
];
static
void
__init
n8x0_mmc_init
(
void
)
static
struct
gpio
n810_emmc_gpios
[]
__initdata
=
{
{
N810_EMMC_VSD_GPIO
,
GPIOF_OUT_INIT_LOW
,
"MMC slot 2 Vddf"
},
{
N810_EMMC_VIO_GPIO
,
GPIOF_OUT_INIT_LOW
,
"MMC slot 2 Vdd"
},
};
static
void
__init
n8x0_mmc_init
(
void
)
{
{
int
err
;
int
err
;
...
@@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void)
...
@@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void)
mmc1_data
.
slots
[
1
].
ban_openended
=
1
;
mmc1_data
.
slots
[
1
].
ban_openended
=
1
;
}
}
err
=
gpio_request
(
N8X0_SLOT_SWITCH_GPIO
,
"MMC slot switch"
);
err
=
gpio_request_one
(
N8X0_SLOT_SWITCH_GPIO
,
GPIOF_OUT_INIT_LOW
,
"MMC slot switch"
);
if
(
err
)
if
(
err
)
return
;
return
;
gpio_direction_output
(
N8X0_SLOT_SWITCH_GPIO
,
0
);
if
(
machine_is_nokia_n810
())
{
if
(
machine_is_nokia_n810
())
{
err
=
gpio_request
(
N810_EMMC_VSD_GPIO
,
"MMC slot 2 Vddf"
);
err
=
gpio_request_array
(
n810_emmc_gpios
,
if
(
err
)
{
ARRAY_SIZE
(
n810_emmc_gpios
));
gpio_free
(
N8X0_SLOT_SWITCH_GPIO
);
return
;
}
gpio_direction_output
(
N810_EMMC_VSD_GPIO
,
0
);
err
=
gpio_request
(
N810_EMMC_VIO_GPIO
,
"MMC slot 2 Vdd"
);
if
(
err
)
{
if
(
err
)
{
gpio_free
(
N8X0_SLOT_SWITCH_GPIO
);
gpio_free
(
N8X0_SLOT_SWITCH_GPIO
);
gpio_free
(
N810_EMMC_VSD_GPIO
);
return
;
return
;
}
}
gpio_direction_output
(
N810_EMMC_VIO_GPIO
,
0
);
}
}
mmc_data
[
0
]
=
&
mmc1_data
;
mmc_data
[
0
]
=
&
mmc1_data
;
...
...
arch/arm/mach-omap2/board-omap3beagle.c
浏览文件 @
b08827f4
...
@@ -52,6 +52,7 @@
...
@@ -52,6 +52,7 @@
#include "hsmmc.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "timer-gp.h"
#include "pm.h"
#include "pm.h"
#include "common-board-devices.h"
#define NAND_BLOCK_SIZE SZ_128K
#define NAND_BLOCK_SIZE SZ_128K
...
@@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void)
...
@@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void)
return
omap3_beagle_version
;
return
omap3_beagle_version
;
}
}
static
struct
gpio
omap3_beagle_rev_gpios
[]
__initdata
=
{
{
171
,
GPIOF_IN
,
"rev_id_0"
},
{
172
,
GPIOF_IN
,
"rev_id_1"
},
{
173
,
GPIOF_IN
,
"rev_id_2"
},
};
static
void
__init
omap3_beagle_init_rev
(
void
)
static
void
__init
omap3_beagle_init_rev
(
void
)
{
{
int
ret
;
int
ret
;
...
@@ -88,21 +95,13 @@ static void __init omap3_beagle_init_rev(void)
...
@@ -88,21 +95,13 @@ static void __init omap3_beagle_init_rev(void)
omap_mux_init_gpio
(
172
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
172
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
173
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
173
,
OMAP_PIN_INPUT_PULLUP
);
ret
=
gpio_request
(
171
,
"rev_id_0"
);
ret
=
gpio_request_array
(
omap3_beagle_rev_gpios
,
if
(
ret
<
0
)
ARRAY_SIZE
(
omap3_beagle_rev_gpios
));
goto
fail0
;
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"Unable to get revision detection GPIO pins
\n
"
);
ret
=
gpio_request
(
172
,
"rev_id_1"
);
omap3_beagle_version
=
OMAP3BEAGLE_BOARD_UNKN
;
if
(
ret
<
0
)
return
;
goto
fail1
;
}
ret
=
gpio_request
(
173
,
"rev_id_2"
);
if
(
ret
<
0
)
goto
fail2
;
gpio_direction_input
(
171
);
gpio_direction_input
(
172
);
gpio_direction_input
(
173
);
beagle_rev
=
gpio_get_value
(
171
)
|
(
gpio_get_value
(
172
)
<<
1
)
beagle_rev
=
gpio_get_value
(
171
)
|
(
gpio_get_value
(
172
)
<<
1
)
|
(
gpio_get_value
(
173
)
<<
2
);
|
(
gpio_get_value
(
173
)
<<
2
);
...
@@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void)
...
@@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void)
printk
(
KERN_INFO
"OMAP3 Beagle Rev: unknown %hd
\n
"
,
beagle_rev
);
printk
(
KERN_INFO
"OMAP3 Beagle Rev: unknown %hd
\n
"
,
beagle_rev
);
omap3_beagle_version
=
OMAP3BEAGLE_BOARD_UNKN
;
omap3_beagle_version
=
OMAP3BEAGLE_BOARD_UNKN
;
}
}
return
;
fail2:
gpio_free
(
172
);
fail1:
gpio_free
(
171
);
fail0:
printk
(
KERN_ERR
"Unable to get revision detection GPIO pins
\n
"
);
omap3_beagle_version
=
OMAP3BEAGLE_BOARD_UNKN
;
return
;
}
}
static
struct
mtd_partition
omap3beagle_nand_partitions
[]
=
{
static
struct
mtd_partition
omap3beagle_nand_partitions
[]
=
{
...
@@ -173,15 +160,6 @@ static struct mtd_partition omap3beagle_nand_partitions[] = {
...
@@ -173,15 +160,6 @@ static struct mtd_partition omap3beagle_nand_partitions[] = {
},
},
};
};
static
struct
omap_nand_platform_data
omap3beagle_nand_data
=
{
.
options
=
NAND_BUSWIDTH_16
,
.
parts
=
omap3beagle_nand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
omap3beagle_nand_partitions
),
.
dma_channel
=
-
1
,
/* disable DMA in OMAP NAND driver */
.
nand_setup
=
NULL
,
.
dev_ready
=
NULL
,
};
/* DSS */
/* DSS */
static
int
beagle_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
static
int
beagle_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
...
@@ -243,13 +221,10 @@ static void __init beagle_display_init(void)
...
@@ -243,13 +221,10 @@ static void __init beagle_display_init(void)
{
{
int
r
;
int
r
;
r
=
gpio_request
(
beagle_dvi_device
.
reset_gpio
,
"DVI reset"
);
r
=
gpio_request_one
(
beagle_dvi_device
.
reset_gpio
,
GPIOF_OUT_INIT_LOW
,
if
(
r
<
0
)
{
"DVI reset"
);
if
(
r
<
0
)
printk
(
KERN_ERR
"Unable to get DVI reset GPIO
\n
"
);
printk
(
KERN_ERR
"Unable to get DVI reset GPIO
\n
"
);
return
;
}
gpio_direction_output
(
beagle_dvi_device
.
reset_gpio
,
0
);
}
}
#include "sdram-micron-mt46h32m32lf-6.h"
#include "sdram-micron-mt46h32m32lf-6.h"
...
@@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[];
...
@@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[];
static
int
beagle_twl_gpio_setup
(
struct
device
*
dev
,
static
int
beagle_twl_gpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
ngpio
)
unsigned
gpio
,
unsigned
ngpio
)
{
{
int
r
;
int
r
,
usb_pwr_level
;
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
mmc
[
0
].
gpio_wp
=
-
EINVAL
;
mmc
[
0
].
gpio_wp
=
-
EINVAL
;
...
@@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev,
...
@@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev,
beagle_vmmc1_supply
.
dev
=
mmc
[
0
].
dev
;
beagle_vmmc1_supply
.
dev
=
mmc
[
0
].
dev
;
beagle_vsim_supply
.
dev
=
mmc
[
0
].
dev
;
beagle_vsim_supply
.
dev
=
mmc
[
0
].
dev
;
/* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
if
(
omap3_beagle_get_rev
()
!=
OMAP3BEAGLE_BOARD_XM
)
{
r
=
gpio_request
(
gpio
+
1
,
"EHCI_nOC"
);
if
(
!
r
)
{
r
=
gpio_direction_input
(
gpio
+
1
);
if
(
r
)
gpio_free
(
gpio
+
1
);
}
if
(
r
)
pr_err
(
"%s: unable to configure EHCI_nOC
\n
"
,
__func__
);
}
/*
/*
* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
* high / others active low)
* high / others active low)
*/
* DVI reset GPIO is different between beagle revisions
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"nEN_USB_PWR"
);
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
1
);
else
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
0
);
/* DVI reset GPIO is different between beagle revisions */
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
beagle_dvi_device
.
reset_gpio
=
129
;
else
beagle_dvi_device
.
reset_gpio
=
170
;
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
/*
* gpio + 1 on Xm controls the TFP410's enable line (active low)
* gpio + 2 control varies depending on the board rev as follows:
* P7/P8 revisions(prototype): Camera EN
* A2+ revisions (production): LDO (supplies DVI, serial, led blocks)
*/
*/
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
r
=
gpio_request
(
gpio
+
1
,
"nDVI_PWR_EN"
);
usb_pwr_level
=
GPIOF_OUT_INIT_HIGH
;
if
(
!
r
)
{
beagle_dvi_device
.
reset_gpio
=
129
;
r
=
gpio_direction_output
(
gpio
+
1
,
0
);
/*
if
(
r
)
* gpio + 1 on Xm controls the TFP410's enable line (active low)
gpio_free
(
gpio
+
1
);
* gpio + 2 control varies depending on the board rev as below:
}
* P7/P8 revisions(prototype): Camera EN
* A2+ revisions (production): LDO (DVI, serial, led blocks)
*/
r
=
gpio_request_one
(
gpio
+
1
,
GPIOF_OUT_INIT_LOW
,
"nDVI_PWR_EN"
);
if
(
r
)
if
(
r
)
pr_err
(
"%s: unable to configure nDVI_PWR_EN
\n
"
,
pr_err
(
"%s: unable to configure nDVI_PWR_EN
\n
"
,
__func__
);
__func__
);
r
=
gpio_request
(
gpio
+
2
,
"DVI_LDO_EN"
);
r
=
gpio_request_one
(
gpio
+
2
,
GPIOF_OUT_INIT_HIGH
,
if
(
!
r
)
{
"DVI_LDO_EN"
);
r
=
gpio_direction_output
(
gpio
+
2
,
1
);
if
(
r
)
gpio_free
(
gpio
+
2
);
}
if
(
r
)
if
(
r
)
pr_err
(
"%s: unable to configure DVI_LDO_EN
\n
"
,
pr_err
(
"%s: unable to configure DVI_LDO_EN
\n
"
,
__func__
);
__func__
);
}
else
{
usb_pwr_level
=
GPIOF_OUT_INIT_LOW
;
beagle_dvi_device
.
reset_gpio
=
170
;
/*
* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
if
(
gpio_request_one
(
gpio
+
1
,
GPIOF_IN
,
"EHCI_nOC"
))
pr_err
(
"%s: unable to configure EHCI_nOC
\n
"
,
__func__
);
}
}
gpio_request_one
(
gpio
+
TWL4030_GPIO_MAX
,
usb_pwr_level
,
"nEN_USB_PWR"
);
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
return
0
;
return
0
;
}
}
...
@@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = {
...
@@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = {
.
vpll2
=
&
beagle_vpll2
,
.
vpll2
=
&
beagle_vpll2
,
};
};
static
struct
i2c_board_info
__initdata
beagle_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
beagle_twldata
,
},
};
static
struct
i2c_board_info
__initdata
beagle_i2c_eeprom
[]
=
{
static
struct
i2c_board_info
__initdata
beagle_i2c_eeprom
[]
=
{
{
{
I2C_BOARD_INFO
(
"eeprom"
,
0x50
),
I2C_BOARD_INFO
(
"eeprom"
,
0x50
),
...
@@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
...
@@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
static
int
__init
omap3_beagle_i2c_init
(
void
)
static
int
__init
omap3_beagle_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
beagle_i2c_boardinfo
,
omap3_pmic_init
(
"twl4030"
,
&
beagle_twldata
);
ARRAY_SIZE
(
beagle_i2c_boardinfo
));
/* Bus 3 is attached to the DVI port where devices like the pico DLP
/* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz */
* projector don't work reliably with 400kHz */
omap_register_i2c_bus
(
3
,
100
,
beagle_i2c_eeprom
,
ARRAY_SIZE
(
beagle_i2c_eeprom
));
omap_register_i2c_bus
(
3
,
100
,
beagle_i2c_eeprom
,
ARRAY_SIZE
(
beagle_i2c_eeprom
));
...
@@ -551,39 +496,6 @@ static struct platform_device *omap3_beagle_devices[] __initdata = {
...
@@ -551,39 +496,6 @@ static struct platform_device *omap3_beagle_devices[] __initdata = {
&
keys_gpio
,
&
keys_gpio
,
};
};
static
void
__init
omap3beagle_flash_init
(
void
)
{
u8
cs
=
0
;
u8
nandcs
=
GPMC_CS_NUM
+
1
;
/* find out the chip-select on which NAND exists */
while
(
cs
<
GPMC_CS_NUM
)
{
u32
ret
=
0
;
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG1
);
if
((
ret
&
0xC00
)
==
0x800
)
{
printk
(
KERN_INFO
"Found NAND on CS%d
\n
"
,
cs
);
if
(
nandcs
>
GPMC_CS_NUM
)
nandcs
=
cs
;
}
cs
++
;
}
if
(
nandcs
>
GPMC_CS_NUM
)
{
printk
(
KERN_INFO
"NAND: Unable to find configuration "
"in GPMC
\n
"
);
return
;
}
if
(
nandcs
<
GPMC_CS_NUM
)
{
omap3beagle_nand_data
.
cs
=
nandcs
;
printk
(
KERN_INFO
"Registering NAND on CS%d
\n
"
,
nandcs
);
if
(
gpmc_nand_init
(
&
omap3beagle_nand_data
)
<
0
)
printk
(
KERN_ERR
"Unable to register NAND device
\n
"
);
}
}
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
...
@@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
void
__init
beagle_opp_init
(
void
)
static
void
__init
beagle_opp_init
(
void
)
{
{
int
r
=
0
;
int
r
=
0
;
...
@@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void)
...
@@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void)
omap_serial_init
();
omap_serial_init
();
omap_mux_init_gpio
(
170
,
OMAP_PIN_INPUT
);
omap_mux_init_gpio
(
170
,
OMAP_PIN_INPUT
);
gpio_request
(
170
,
"DVI_nPD"
);
/* REVISIT leave DVI powered down until it's needed ... */
/* REVISIT leave DVI powered down until it's needed ... */
gpio_
direction_output
(
170
,
true
);
gpio_
request_one
(
170
,
GPIOF_OUT_INIT_HIGH
,
"DVI_nPD"
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
omap3beagle_flash_init
();
omap_nand_flash_init
(
NAND_BUSWIDTH_16
,
omap3beagle_nand_partitions
,
ARRAY_SIZE
(
omap3beagle_nand_partitions
));
/* Ensure SDRC pins are mux'd for self-refresh */
/* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
...
...
arch/arm/mach-omap2/board-omap3evm.c
浏览文件 @
b08827f4
...
@@ -50,6 +50,7 @@
...
@@ -50,6 +50,7 @@
#include "mux.h"
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define OMAP3_EVM_TS_GPIO 175
#define OMAP3_EVM_TS_GPIO 175
#define OMAP3_EVM_EHCI_VBUS 22
#define OMAP3_EVM_EHCI_VBUS 22
...
@@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void)
...
@@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void)
}
}
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
static
struct
resource
omap3evm_smsc911x_resources
[]
=
{
#include <plat/gpmc-smsc911x.h>
[
0
]
=
{
.
start
=
OMAP3EVM_ETHR_START
,
.
end
=
(
OMAP3EVM_ETHR_START
+
OMAP3EVM_ETHR_SIZE
-
1
),
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
OMAP_GPIO_IRQ
(
OMAP3EVM_ETHR_GPIO_IRQ
),
.
end
=
OMAP_GPIO_IRQ
(
OMAP3EVM_ETHR_GPIO_IRQ
),
.
flags
=
(
IORESOURCE_IRQ
|
IRQF_TRIGGER_LOW
),
},
};
static
struct
smsc911x_platform_config
smsc911x_config
=
{
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
.
cs
=
OMAP3EVM_SMSC911X_CS
,
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
gpio_irq
=
OMAP3EVM_ETHR_GPIO_IRQ
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
(
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
),
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
};
static
struct
platform_device
omap3evm_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
omap3evm_smsc911x_resources
),
.
resource
=
&
omap3evm_smsc911x_resources
[
0
],
.
dev
=
{
.
platform_data
=
&
smsc911x_config
,
},
};
};
static
inline
void
__init
omap3evm_init_smsc911x
(
void
)
static
inline
void
__init
omap3evm_init_smsc911x
(
void
)
{
{
int
eth_cs
,
eth_rst
;
struct
clk
*
l3ck
;
struct
clk
*
l3ck
;
unsigned
int
rate
;
unsigned
int
rate
;
if
(
get_omap3_evm_rev
()
==
OMAP3EVM_BOARD_GEN_1
)
eth_rst
=
OMAP3EVM_GEN1_ETHR_GPIO_RST
;
else
eth_rst
=
OMAP3EVM_GEN2_ETHR_GPIO_RST
;
eth_cs
=
OMAP3EVM_SMSC911X_CS
;
l3ck
=
clk_get
(
NULL
,
"l3_ck"
);
l3ck
=
clk_get
(
NULL
,
"l3_ck"
);
if
(
IS_ERR
(
l3ck
))
if
(
IS_ERR
(
l3ck
))
rate
=
100000000
;
rate
=
100000000
;
...
@@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void)
...
@@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void)
/* Configure ethernet controller reset gpio */
/* Configure ethernet controller reset gpio */
if
(
cpu_is_omap3430
())
{
if
(
cpu_is_omap3430
())
{
if
(
gpio_request
(
eth_rst
,
"SMSC911x gpio"
)
<
0
)
{
if
(
get_omap3_evm_rev
()
==
OMAP3EVM_BOARD_GEN_1
)
pr_err
(
KERN_ERR
"Failed to request %d for smsc911x
\n
"
,
smsc911x_cfg
.
gpio_reset
=
OMAP3EVM_GEN1_ETHR_GPIO_RST
;
eth_rst
);
else
return
;
smsc911x_cfg
.
gpio_reset
=
OMAP3EVM_GEN2_ETHR_GPIO_RST
;
}
if
(
gpio_direction_output
(
eth_rst
,
1
)
<
0
)
{
pr_err
(
KERN_ERR
"Failed to set direction of %d for"
\
" smsc911x
\n
"
,
eth_rst
);
return
;
}
/* reset pulse to ethernet controller*/
usleep_range
(
150
,
220
);
gpio_set_value
(
eth_rst
,
0
);
usleep_range
(
150
,
220
);
gpio_set_value
(
eth_rst
,
1
);
usleep_range
(
1
,
2
);
}
if
(
gpio_request
(
OMAP3EVM_ETHR_GPIO_IRQ
,
"SMSC911x irq"
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for smsc911x IRQ
\n
"
,
OMAP3EVM_ETHR_GPIO_IRQ
);
return
;
}
}
gpio_direction_input
(
OMAP3EVM_ETHR_GPIO_IRQ
);
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
platform_device_register
(
&
omap3evm_smsc911x_device
);
}
}
#else
#else
...
@@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }
...
@@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }
#define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
#define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
#define OMAP3EVM_DVI_PANEL_EN_GPIO 199
#define OMAP3EVM_DVI_PANEL_EN_GPIO 199
static
struct
gpio
omap3_evm_dss_gpios
[]
__initdata
=
{
{
OMAP3EVM_LCD_PANEL_RESB
,
GPIOF_OUT_INIT_HIGH
,
"lcd_panel_resb"
},
{
OMAP3EVM_LCD_PANEL_INI
,
GPIOF_OUT_INIT_HIGH
,
"lcd_panel_ini"
},
{
OMAP3EVM_LCD_PANEL_QVGA
,
GPIOF_OUT_INIT_LOW
,
"lcd_panel_qvga"
},
{
OMAP3EVM_LCD_PANEL_LR
,
GPIOF_OUT_INIT_HIGH
,
"lcd_panel_lr"
},
{
OMAP3EVM_LCD_PANEL_UD
,
GPIOF_OUT_INIT_HIGH
,
"lcd_panel_ud"
},
{
OMAP3EVM_LCD_PANEL_ENVDD
,
GPIOF_OUT_INIT_LOW
,
"lcd_panel_envdd"
},
};
static
int
lcd_enabled
;
static
int
lcd_enabled
;
static
int
dvi_enabled
;
static
int
dvi_enabled
;
...
@@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void)
...
@@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void)
{
{
int
r
;
int
r
;
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_RESB
,
"lcd_panel_resb"
);
r
=
gpio_request_array
(
omap3_evm_dss_gpios
,
if
(
r
)
{
ARRAY_SIZE
(
omap3_evm_dss_gpios
));
printk
(
KERN_ERR
"failed to get lcd_panel_resb
\n
"
);
if
(
r
)
return
;
printk
(
KERN_ERR
"failed to get lcd_panel_* gpios
\n
"
);
}
gpio_direction_output
(
OMAP3EVM_LCD_PANEL_RESB
,
1
);
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_INI
,
"lcd_panel_ini"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_ini
\n
"
);
goto
err_1
;
}
gpio_direction_output
(
OMAP3EVM_LCD_PANEL_INI
,
1
);
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_QVGA
,
"lcd_panel_qvga"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_qvga
\n
"
);
goto
err_2
;
}
gpio_direction_output
(
OMAP3EVM_LCD_PANEL_QVGA
,
0
);
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_LR
,
"lcd_panel_lr"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_lr
\n
"
);
goto
err_3
;
}
gpio_direction_output
(
OMAP3EVM_LCD_PANEL_LR
,
1
);
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_UD
,
"lcd_panel_ud"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_ud
\n
"
);
goto
err_4
;
}
gpio_direction_output
(
OMAP3EVM_LCD_PANEL_UD
,
1
);
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_ENVDD
,
"lcd_panel_envdd"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_envdd
\n
"
);
goto
err_5
;
}
gpio_direction_output
(
OMAP3EVM_LCD_PANEL_ENVDD
,
0
);
return
;
err_5:
gpio_free
(
OMAP3EVM_LCD_PANEL_UD
);
err_4:
gpio_free
(
OMAP3EVM_LCD_PANEL_LR
);
err_3:
gpio_free
(
OMAP3EVM_LCD_PANEL_QVGA
);
err_2:
gpio_free
(
OMAP3EVM_LCD_PANEL_INI
);
err_1:
gpio_free
(
OMAP3EVM_LCD_PANEL_RESB
);
}
}
static
int
omap3_evm_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
static
int
omap3_evm_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
...
@@ -448,7 +358,7 @@ static struct platform_device leds_gpio = {
...
@@ -448,7 +358,7 @@ static struct platform_device leds_gpio = {
static
int
omap3evm_twl_gpio_setup
(
struct
device
*
dev
,
static
int
omap3evm_twl_gpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
ngpio
)
unsigned
gpio
,
unsigned
ngpio
)
{
{
int
r
;
int
r
,
lcd_bl_en
;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
omap_mux_init_gpio
(
63
,
OMAP_PIN_INPUT
);
omap_mux_init_gpio
(
63
,
OMAP_PIN_INPUT
);
...
@@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
...
@@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
*/
*/
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
r
=
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"EN_LCD_BKL"
);
lcd_bl_en
=
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
?
if
(
!
r
)
GPIOF_OUT_INIT_HIGH
:
GPIOF_OUT_INIT_LOW
;
r
=
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
r
=
gpio_request_one
(
gpio
+
TWL4030_GPIO_MAX
,
lcd_bl_en
,
"EN_LCD_BKL"
);
(
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
)
?
1
:
0
);
if
(
r
)
if
(
r
)
printk
(
KERN_ERR
"failed to get/set lcd_bkl gpio
\n
"
);
printk
(
KERN_ERR
"failed to get/set lcd_bkl gpio
\n
"
);
/* gpio + 7 == DVI Enable */
/* gpio + 7 == DVI Enable */
gpio_request
(
gpio
+
7
,
"EN_DVI"
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_LOW
,
"EN_DVI"
);
gpio_direction_output
(
gpio
+
7
,
0
);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
...
@@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = {
...
@@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = {
.
vdac
=
&
omap3_evm_vdac
,
.
vdac
=
&
omap3_evm_vdac
,
.
vpll2
=
&
omap3_evm_vpll2
,
.
vpll2
=
&
omap3_evm_vpll2
,
.
vio
=
&
omap3evm_vio
,
.
vio
=
&
omap3evm_vio
,
};
.
vmmc1
=
&
omap3evm_vmmc1
,
.
vsim
=
&
omap3evm_vsim
,
static
struct
i2c_board_info
__initdata
omap3evm_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
omap3evm_twldata
,
},
};
};
static
int
__init
omap3_evm_i2c_init
(
void
)
static
int
__init
omap3_evm_i2c_init
(
void
)
{
{
/*
omap3_pmic_init
(
"twl4030"
,
&
omap3evm_twldata
);
* REVISIT: These entries can be set in omap3evm_twl_data
* after a merge with MFD tree
*/
omap3evm_twldata
.
vmmc1
=
&
omap3evm_vmmc1
;
omap3evm_twldata
.
vsim
=
&
omap3evm_vsim
;
omap_register_i2c_bus
(
1
,
2600
,
omap3evm_i2c_boardinfo
,
ARRAY_SIZE
(
omap3evm_i2c_boardinfo
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
return
0
;
return
0
;
}
}
static
void
ads7846_dev_init
(
void
)
{
if
(
gpio_request
(
OMAP3_EVM_TS_GPIO
,
"ADS7846 pendown"
)
<
0
)
printk
(
KERN_ERR
"can't get ads7846 pen down GPIO
\n
"
);
gpio_direction_input
(
OMAP3_EVM_TS_GPIO
);
gpio_set_debounce
(
OMAP3_EVM_TS_GPIO
,
310
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
OMAP3_EVM_TS_GPIO
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
3
,
.
debounce_rep
=
1
,
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
.
settle_delay_usecs
=
150
,
.
wakeup
=
true
,
};
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
omap3evm_spi_board_info
[]
=
{
[
0
]
=
{
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
OMAP3_EVM_TS_GPIO
),
.
platform_data
=
&
ads7846_config
,
},
};
static
struct
omap_board_config_kernel
omap3_evm_config
[]
__initdata
=
{
static
struct
omap_board_config_kernel
omap3_evm_config
[]
__initdata
=
{
};
};
...
@@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = {
...
@@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = {
.
power
=
100
,
.
power
=
100
,
};
};
static
struct
gpio
omap3_evm_ehci_gpios
[]
__initdata
=
{
{
OMAP3_EVM_EHCI_VBUS
,
GPIOF_OUT_INIT_HIGH
,
"enable EHCI VBUS"
},
{
OMAP3_EVM_EHCI_SELECT
,
GPIOF_OUT_INIT_LOW
,
"select EHCI port"
},
};
static
void
__init
omap3_evm_init
(
void
)
static
void
__init
omap3_evm_init
(
void
)
{
{
omap3_evm_get_revision
();
omap3_evm_get_revision
();
...
@@ -841,9 +694,6 @@ static void __init omap3_evm_init(void)
...
@@ -841,9 +694,6 @@ static void __init omap3_evm_init(void)
omap_display_init
(
&
omap3_evm_dss_data
);
omap_display_init
(
&
omap3_evm_dss_data
);
spi_register_board_info
(
omap3evm_spi_board_info
,
ARRAY_SIZE
(
omap3evm_spi_board_info
));
omap_serial_init
();
omap_serial_init
();
/* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
/* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
...
@@ -851,16 +701,12 @@ static void __init omap3_evm_init(void)
...
@@ -851,16 +701,12 @@ static void __init omap3_evm_init(void)
if
(
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
)
{
if
(
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
)
{
/* enable EHCI VBUS using GPIO22 */
/* enable EHCI VBUS using GPIO22 */
omap_mux_init_gpio
(
22
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
OMAP3_EVM_EHCI_VBUS
,
OMAP_PIN_INPUT_PULLUP
);
gpio_request
(
OMAP3_EVM_EHCI_VBUS
,
"enable EHCI VBUS"
);
gpio_direction_output
(
OMAP3_EVM_EHCI_VBUS
,
0
);
gpio_set_value
(
OMAP3_EVM_EHCI_VBUS
,
1
);
/* Select EHCI port on main board */
/* Select EHCI port on main board */
omap_mux_init_gpio
(
61
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
OMAP3_EVM_EHCI_SELECT
,
gpio_request
(
OMAP3_EVM_EHCI_SELECT
,
"select EHCI port"
);
OMAP_PIN_INPUT_PULLUP
);
gpio_
direction_output
(
OMAP3_EVM_EHCI_SELECT
,
0
);
gpio_
request_array
(
omap3_evm_ehci_gpios
,
gpio_set_value
(
OMAP3_EVM_EHCI_SELECT
,
0
);
ARRAY_SIZE
(
omap3_evm_ehci_gpios
)
);
/* setup EHCI phy reset config */
/* setup EHCI phy reset config */
omap_mux_init_gpio
(
21
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
21
,
OMAP_PIN_INPUT_PULLUP
);
...
@@ -876,7 +722,7 @@ static void __init omap3_evm_init(void)
...
@@ -876,7 +722,7 @@ static void __init omap3_evm_init(void)
}
}
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
&
musb_board_data
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
ads7846_dev_init
(
);
omap_ads7846_init
(
1
,
OMAP3_EVM_TS_GPIO
,
310
,
NULL
);
omap3evm_init_smsc911x
();
omap3evm_init_smsc911x
();
omap3_evm_display_init
();
omap3_evm_display_init
();
...
...
arch/arm/mach-omap2/board-omap3logic.c
浏览文件 @
b08827f4
...
@@ -37,6 +37,7 @@
...
@@ -37,6 +37,7 @@
#include "hsmmc.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "timer-gp.h"
#include "control.h"
#include "control.h"
#include "common-board-devices.h"
#include <plat/mux.h>
#include <plat/mux.h>
#include <plat/board.h>
#include <plat/board.h>
...
@@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = {
...
@@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = {
.
vmmc1
=
&
omap3logic_vmmc1
,
.
vmmc1
=
&
omap3logic_vmmc1
,
};
};
static
struct
i2c_board_info
__initdata
omap3logic_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
omap3logic_twldata
,
},
};
static
int
__init
omap3logic_i2c_init
(
void
)
static
int
__init
omap3logic_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
omap3logic_i2c_boardinfo
,
omap3_pmic_init
(
"twl4030"
,
&
omap3logic_twldata
);
ARRAY_SIZE
(
omap3logic_i2c_boardinfo
));
return
0
;
return
0
;
}
}
...
@@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
...
@@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
.
cs
=
OMAP3LOGIC_SMSC911X_CS
,
.
cs
=
OMAP3LOGIC_SMSC911X_CS
,
.
gpio_irq
=
-
EINVAL
,
.
gpio_irq
=
-
EINVAL
,
.
gpio_reset
=
-
EINVAL
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
IORESOURCE_IRQ_LOWLEVEL
,
};
};
/* TODO/FIXME (comment by Peter Barada, LogicPD):
/* TODO/FIXME (comment by Peter Barada, LogicPD):
...
...
arch/arm/mach-omap2/board-omap3pandora.c
浏览文件 @
b08827f4
...
@@ -22,7 +22,6 @@
...
@@ -22,7 +22,6 @@
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/machine.h>
#include <linux/i2c/twl.h>
#include <linux/i2c/twl.h>
#include <linux/wl12xx.h>
#include <linux/wl12xx.h>
...
@@ -52,6 +51,7 @@
...
@@ -52,6 +51,7 @@
#include "mux.h"
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define PANDORA_WIFI_IRQ_GPIO 21
#define PANDORA_WIFI_IRQ_GPIO 21
#define PANDORA_WIFI_NRESET_GPIO 23
#define PANDORA_WIFI_NRESET_GPIO 23
...
@@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
...
@@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
/* gpio + 13 drives 32kHz buffer for wifi module */
/* gpio + 13 drives 32kHz buffer for wifi module */
gpio_32khz
=
gpio
+
13
;
gpio_32khz
=
gpio
+
13
;
ret
=
gpio_request
(
gpio_32khz
,
"wifi 32kHz"
);
ret
=
gpio_request
_one
(
gpio_32khz
,
GPIOF_OUT_INIT_HIGH
,
"wifi 32kHz"
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
pr_err
(
"Cannot get GPIO line %d, ret=%d
\n
"
,
gpio_32khz
,
ret
);
pr_err
(
"Cannot get GPIO line %d, ret=%d
\n
"
,
gpio_32khz
,
ret
);
goto
fail
;
return
-
ENODEV
;
}
ret
=
gpio_direction_output
(
gpio_32khz
,
1
);
if
(
ret
<
0
)
{
pr_err
(
"Cannot set GPIO line %d, ret=%d
\n
"
,
gpio_32khz
,
ret
);
goto
fail_direction
;
}
}
return
0
;
return
0
;
fail_direction:
gpio_free
(
gpio_32khz
);
fail:
return
-
ENODEV
;
}
}
static
struct
twl4030_gpio_platform_data
omap3pandora_gpio_data
=
{
static
struct
twl4030_gpio_platform_data
omap3pandora_gpio_data
=
{
...
@@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = {
...
@@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = {
.
bci
=
&
pandora_bci_data
,
.
bci
=
&
pandora_bci_data
,
};
};
static
struct
i2c_board_info
__initdata
omap3pandora_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"tps65950"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
omap3pandora_twldata
,
},
};
static
struct
i2c_board_info
__initdata
omap3pandora_i2c3_boardinfo
[]
=
{
static
struct
i2c_board_info
__initdata
omap3pandora_i2c3_boardinfo
[]
=
{
{
{
I2C_BOARD_INFO
(
"bq27500"
,
0x55
),
I2C_BOARD_INFO
(
"bq27500"
,
0x55
),
...
@@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
...
@@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
static
int
__init
omap3pandora_i2c_init
(
void
)
static
int
__init
omap3pandora_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
omap3pandora_i2c_boardinfo
,
omap3_pmic_init
(
"tps65950"
,
&
omap3pandora_twldata
);
ARRAY_SIZE
(
omap3pandora_i2c_boardinfo
));
/* i2c2 pins are not connected */
/* i2c2 pins are not connected */
omap_register_i2c_bus
(
3
,
100
,
omap3pandora_i2c3_boardinfo
,
omap_register_i2c_bus
(
3
,
100
,
omap3pandora_i2c3_boardinfo
,
ARRAY_SIZE
(
omap3pandora_i2c3_boardinfo
));
ARRAY_SIZE
(
omap3pandora_i2c3_boardinfo
));
return
0
;
return
0
;
}
}
static
void
__init
omap3pandora_ads7846_init
(
void
)
{
int
gpio
=
OMAP3_PANDORA_TS_GPIO
;
int
ret
;
ret
=
gpio_request
(
gpio
,
"ads7846_pen_down"
);
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO %d for "
"ads7846 pen down IRQ
\n
"
,
gpio
);
return
;
}
gpio_direction_input
(
gpio
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
OMAP3_PANDORA_TS_GPIO
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
3
,
.
debounce_rep
=
1
,
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
};
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
omap3pandora_spi_board_info
[]
__initdata
=
{
static
struct
spi_board_info
omap3pandora_spi_board_info
[]
__initdata
=
{
{
{
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
OMAP3_PANDORA_TS_GPIO
),
.
platform_data
=
&
ads7846_config
,
},
{
.
modalias
=
"tpo_td043mtea1_panel_spi"
,
.
modalias
=
"tpo_td043mtea1_panel_spi"
,
.
bus_num
=
1
,
.
bus_num
=
1
,
.
chip_select
=
1
,
.
chip_select
=
1
,
...
@@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void)
...
@@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void)
memset
(
&
pandora_wl1251_pdata
,
0
,
sizeof
(
pandora_wl1251_pdata
));
memset
(
&
pandora_wl1251_pdata
,
0
,
sizeof
(
pandora_wl1251_pdata
));
ret
=
gpio_request
(
PANDORA_WIFI_IRQ_GPIO
,
"wl1251 irq"
);
ret
=
gpio_request
_one
(
PANDORA_WIFI_IRQ_GPIO
,
GPIOF_IN
,
"wl1251 irq"
);
if
(
ret
<
0
)
if
(
ret
<
0
)
goto
fail
;
goto
fail
;
ret
=
gpio_direction_input
(
PANDORA_WIFI_IRQ_GPIO
);
if
(
ret
<
0
)
goto
fail_irq
;
pandora_wl1251_pdata
.
irq
=
gpio_to_irq
(
PANDORA_WIFI_IRQ_GPIO
);
pandora_wl1251_pdata
.
irq
=
gpio_to_irq
(
PANDORA_WIFI_IRQ_GPIO
);
if
(
pandora_wl1251_pdata
.
irq
<
0
)
if
(
pandora_wl1251_pdata
.
irq
<
0
)
goto
fail_irq
;
goto
fail_irq
;
...
@@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
void
__init
omap3pandora_init
(
void
)
static
void
__init
omap3pandora_init
(
void
)
{
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
...
@@ -705,9 +629,9 @@ static void __init omap3pandora_init(void)
...
@@ -705,9 +629,9 @@ static void __init omap3pandora_init(void)
omap_serial_init
();
omap_serial_init
();
spi_register_board_info
(
omap3pandora_spi_board_info
,
spi_register_board_info
(
omap3pandora_spi_board_info
,
ARRAY_SIZE
(
omap3pandora_spi_board_info
));
ARRAY_SIZE
(
omap3pandora_spi_board_info
));
omap
3pandora_ads7846_init
(
);
omap
_ads7846_init
(
1
,
OMAP3_PANDORA_TS_GPIO
,
0
,
NULL
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
gpmc_nand_init
(
&
pandora_nand_data
);
gpmc_nand_init
(
&
pandora_nand_data
);
/* Ensure SDRC pins are mux'd for self-refresh */
/* Ensure SDRC pins are mux'd for self-refresh */
...
...
arch/arm/mach-omap2/board-omap3stalker.c
浏览文件 @
b08827f4
...
@@ -45,7 +45,6 @@
...
@@ -45,7 +45,6 @@
#include <plat/mcspi.h>
#include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h>
#include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/smsc911x.h>
#include <linux/smsc911x.h>
#include <linux/i2c/at24.h>
#include <linux/i2c/at24.h>
...
@@ -54,52 +53,28 @@
...
@@ -54,52 +53,28 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "timer-gp.h"
#include "common-board-devices.h"
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <plat/gpmc-smsc911x.h>
#define OMAP3STALKER_ETHR_START 0x2c000000
#define OMAP3STALKER_ETHR_START 0x2c000000
#define OMAP3STALKER_ETHR_SIZE 1024
#define OMAP3STALKER_ETHR_SIZE 1024
#define OMAP3STALKER_ETHR_GPIO_IRQ 19
#define OMAP3STALKER_ETHR_GPIO_IRQ 19
#define OMAP3STALKER_SMC911X_CS 5
#define OMAP3STALKER_SMC911X_CS 5
static
struct
resource
omap3stalker_smsc911x_resources
[]
=
{
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
[
0
]
=
{
.
cs
=
OMAP3STALKER_SMC911X_CS
,
.
start
=
OMAP3STALKER_ETHR_START
,
.
gpio_irq
=
OMAP3STALKER_ETHR_GPIO_IRQ
,
.
end
=
.
gpio_reset
=
-
EINVAL
,
(
OMAP3STALKER_ETHR_START
+
OMAP3STALKER_ETHR_SIZE
-
1
),
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
OMAP_GPIO_IRQ
(
OMAP3STALKER_ETHR_GPIO_IRQ
),
.
end
=
OMAP_GPIO_IRQ
(
OMAP3STALKER_ETHR_GPIO_IRQ
),
.
flags
=
(
IORESOURCE_IRQ
|
IRQF_TRIGGER_LOW
),
},
};
static
struct
smsc911x_platform_config
smsc911x_config
=
{
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
flags
=
(
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
),
.
flags
=
(
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
),
};
};
static
struct
platform_device
omap3stalker_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
omap3stalker_smsc911x_resources
),
.
resource
=
&
omap3stalker_smsc911x_resources
[
0
],
.
dev
=
{
.
platform_data
=
&
smsc911x_config
,
},
};
static
inline
void
__init
omap3stalker_init_eth
(
void
)
static
inline
void
__init
omap3stalker_init_eth
(
void
)
{
{
int
eth_cs
;
struct
clk
*
l3ck
;
struct
clk
*
l3ck
;
unsigned
int
rate
;
unsigned
int
rate
;
eth_cs
=
OMAP3STALKER_SMC911X_CS
;
l3ck
=
clk_get
(
NULL
,
"l3_ck"
);
l3ck
=
clk_get
(
NULL
,
"l3_ck"
);
if
(
IS_ERR
(
l3ck
))
if
(
IS_ERR
(
l3ck
))
rate
=
100000000
;
rate
=
100000000
;
...
@@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void)
...
@@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void)
rate
=
clk_get_rate
(
l3ck
);
rate
=
clk_get_rate
(
l3ck
);
omap_mux_init_gpio
(
19
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
19
,
OMAP_PIN_INPUT_PULLUP
);
if
(
gpio_request
(
OMAP3STALKER_ETHR_GPIO_IRQ
,
"SMC911x irq"
)
<
0
)
{
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
printk
(
KERN_ERR
"Failed to request GPIO%d for smc911x IRQ
\n
"
,
OMAP3STALKER_ETHR_GPIO_IRQ
);
return
;
}
gpio_direction_input
(
OMAP3STALKER_ETHR_GPIO_IRQ
);
platform_device_register
(
&
omap3stalker_smsc911x_device
);
}
}
#else
#else
...
@@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev,
...
@@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev,
*/
*/
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"EN_LCD_BKL"
);
gpio_request
_one
(
gpio
+
TWL4030_GPIO_MAX
,
GPIOF_OUT_INIT_LOW
,
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
0
);
"EN_LCD_BKL"
);
/* gpio + 7 == DVI Enable */
/* gpio + 7 == DVI Enable */
gpio_request
(
gpio
+
7
,
"EN_DVI"
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_LOW
,
"EN_DVI"
);
gpio_direction_output
(
gpio
+
7
,
0
);
/* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
/* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
...
@@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = {
...
@@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = {
.
codec
=
&
omap3stalker_codec_data
,
.
codec
=
&
omap3stalker_codec_data
,
.
vdac
=
&
omap3_stalker_vdac
,
.
vdac
=
&
omap3_stalker_vdac
,
.
vpll2
=
&
omap3_stalker_vpll2
,
.
vpll2
=
&
omap3_stalker_vpll2
,
};
.
vmmc1
=
&
omap3stalker_vmmc1
,
.
vsim
=
&
omap3stalker_vsim
,
static
struct
i2c_board_info
__initdata
omap3stalker_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
omap3stalker_twldata
,
},
};
};
static
struct
at24_platform_data
fram_info
=
{
static
struct
at24_platform_data
fram_info
=
{
...
@@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
...
@@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
static
int
__init
omap3_stalker_i2c_init
(
void
)
static
int
__init
omap3_stalker_i2c_init
(
void
)
{
{
/*
omap3_pmic_init
(
"twl4030"
,
&
omap3stalker_twldata
);
* REVISIT: These entries can be set in omap3evm_twl_data
* after a merge with MFD tree
*/
omap3stalker_twldata
.
vmmc1
=
&
omap3stalker_vmmc1
;
omap3stalker_twldata
.
vsim
=
&
omap3stalker_vsim
;
omap_register_i2c_bus
(
1
,
2600
,
omap3stalker_i2c_boardinfo
,
ARRAY_SIZE
(
omap3stalker_i2c_boardinfo
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
omap3stalker_i2c_boardinfo3
,
omap_register_i2c_bus
(
3
,
400
,
omap3stalker_i2c_boardinfo3
,
ARRAY_SIZE
(
omap3stalker_i2c_boardinfo3
));
ARRAY_SIZE
(
omap3stalker_i2c_boardinfo3
));
...
@@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void)
...
@@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void)
}
}
#define OMAP3_STALKER_TS_GPIO 175
#define OMAP3_STALKER_TS_GPIO 175
static
void
ads7846_dev_init
(
void
)
{
if
(
gpio_request
(
OMAP3_STALKER_TS_GPIO
,
"ADS7846 pendown"
)
<
0
)
printk
(
KERN_ERR
"can't get ads7846 pen down GPIO
\n
"
);
gpio_direction_input
(
OMAP3_STALKER_TS_GPIO
);
gpio_set_debounce
(
OMAP3_STALKER_TS_GPIO
,
310
);
}
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
OMAP3_STALKER_TS_GPIO
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
3
,
.
debounce_rep
=
1
,
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
.
settle_delay_usecs
=
150
,
};
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
omap3stalker_spi_board_info
[]
=
{
[
0
]
=
{
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
OMAP3_STALKER_TS_GPIO
),
.
platform_data
=
&
ads7846_config
,
},
};
static
struct
omap_board_config_kernel
omap3_stalker_config
[]
__initdata
=
{
static
struct
omap_board_config_kernel
omap3_stalker_config
[]
__initdata
=
{
};
};
...
@@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
void
__init
omap3_stalker_init
(
void
)
static
void
__init
omap3_stalker_init
(
void
)
{
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CUS
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CUS
);
...
@@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void)
...
@@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void)
ARRAY_SIZE
(
omap3_stalker_devices
));
ARRAY_SIZE
(
omap3_stalker_devices
));
omap_display_init
(
&
omap3_stalker_dss_data
);
omap_display_init
(
&
omap3_stalker_dss_data
);
spi_register_board_info
(
omap3stalker_spi_board_info
,
ARRAY_SIZE
(
omap3stalker_spi_board_info
));
omap_serial_init
();
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
ads7846_dev_init
(
);
omap_ads7846_init
(
1
,
OMAP3_STALKER_TS_GPIO
,
310
,
NULL
);
omap_mux_init_gpio
(
21
,
OMAP_PIN_OUTPUT
);
omap_mux_init_gpio
(
21
,
OMAP_PIN_OUTPUT
);
omap_mux_init_gpio
(
18
,
OMAP_PIN_INPUT_PULLUP
);
omap_mux_init_gpio
(
18
,
OMAP_PIN_INPUT_PULLUP
);
...
...
arch/arm/mach-omap2/board-omap3touchbook.c
浏览文件 @
b08827f4
...
@@ -52,6 +52,7 @@
...
@@ -52,6 +52,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "timer-gp.h"
#include "common-board-devices.h"
#include <asm/setup.h>
#include <asm/setup.h>
...
@@ -95,15 +96,6 @@ static struct mtd_partition omap3touchbook_nand_partitions[] = {
...
@@ -95,15 +96,6 @@ static struct mtd_partition omap3touchbook_nand_partitions[] = {
},
},
};
};
static
struct
omap_nand_platform_data
omap3touchbook_nand_data
=
{
.
options
=
NAND_BUSWIDTH_16
,
.
parts
=
omap3touchbook_nand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
omap3touchbook_nand_partitions
),
.
dma_channel
=
-
1
,
/* disable DMA in OMAP NAND driver */
.
nand_setup
=
NULL
,
.
dev_ready
=
NULL
,
};
#include "sdram-micron-mt46h32m32lf-6.h"
#include "sdram-micron-mt46h32m32lf-6.h"
static
struct
omap2_hsmmc_info
mmc
[]
=
{
static
struct
omap2_hsmmc_info
mmc
[]
=
{
...
@@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev,
...
@@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev,
/* REVISIT: need ehci-omap hooks for external VBUS
/* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
* power switch and overcurrent detect
*/
*/
gpio_request_one
(
gpio
+
1
,
GPIOF_IN
,
"EHCI_nOC"
);
gpio_request
(
gpio
+
1
,
"EHCI_nOC"
);
gpio_direction_input
(
gpio
+
1
);
/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"nEN_USB_PWR"
);
gpio_request
_one
(
gpio
+
TWL4030_GPIO_MAX
,
GPIOF_OUT_INIT_LOW
,
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
0
);
"nEN_USB_PWR"
);
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
...
@@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = {
...
@@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = {
.
vpll2
=
&
touchbook_vpll2
,
.
vpll2
=
&
touchbook_vpll2
,
};
};
static
struct
i2c_board_info
__initdata
touchbook_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl4030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
touchbook_twldata
,
},
};
static
struct
i2c_board_info
__initdata
touchBook_i2c_boardinfo
[]
=
{
static
struct
i2c_board_info
__initdata
touchBook_i2c_boardinfo
[]
=
{
{
{
I2C_BOARD_INFO
(
"bq27200"
,
0x55
),
I2C_BOARD_INFO
(
"bq27200"
,
0x55
),
...
@@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
...
@@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
static
int
__init
omap3_touchbook_i2c_init
(
void
)
static
int
__init
omap3_touchbook_i2c_init
(
void
)
{
{
/* Standard TouchBook bus */
/* Standard TouchBook bus */
omap_register_i2c_bus
(
1
,
2600
,
touchbook_i2c_boardinfo
,
omap3_pmic_init
(
"twl4030"
,
&
touchbook_twldata
);
ARRAY_SIZE
(
touchbook_i2c_boardinfo
));
/* Additional TouchBook bus */
/* Additional TouchBook bus */
omap_register_i2c_bus
(
3
,
100
,
touchBook_i2c_boardinfo
,
omap_register_i2c_bus
(
3
,
100
,
touchBook_i2c_boardinfo
,
...
@@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void)
...
@@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void)
return
0
;
return
0
;
}
}
static
void
__init
omap3_ads7846_init
(
void
)
static
struct
ads7846_platform_data
ads7846_pdata
=
{
{
if
(
gpio_request
(
OMAP3_TS_GPIO
,
"ads7846_pen_down"
))
{
printk
(
KERN_ERR
"Failed to request GPIO %d for "
"ads7846 pen down IRQ
\n
"
,
OMAP3_TS_GPIO
);
return
;
}
gpio_direction_input
(
OMAP3_TS_GPIO
);
gpio_set_debounce
(
OMAP3_TS_GPIO
,
310
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_min
=
100
,
.
x_min
=
100
,
.
y_min
=
265
,
.
y_min
=
265
,
.
x_max
=
3950
,
.
x_max
=
3950
,
...
@@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = {
...
@@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = {
.
keep_vref_on
=
1
,
.
keep_vref_on
=
1
,
};
};
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
spi_board_info
omap3_ads7846_spi_board_info
[]
__initdata
=
{
{
.
modalias
=
"ads7846"
,
.
bus_num
=
4
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
OMAP3_TS_GPIO
),
.
platform_data
=
&
ads7846_config
,
}
};
static
struct
gpio_led
gpio_leds
[]
=
{
static
struct
gpio_led
gpio_leds
[]
=
{
{
{
.
name
=
"touchbook::usr0"
,
.
name
=
"touchbook::usr0"
,
...
@@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = {
...
@@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = {
&
keys_gpio
,
&
keys_gpio
,
};
};
static
void
__init
omap3touchbook_flash_init
(
void
)
{
u8
cs
=
0
;
u8
nandcs
=
GPMC_CS_NUM
+
1
;
/* find out the chip-select on which NAND exists */
while
(
cs
<
GPMC_CS_NUM
)
{
u32
ret
=
0
;
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG1
);
if
((
ret
&
0xC00
)
==
0x800
)
{
printk
(
KERN_INFO
"Found NAND on CS%d
\n
"
,
cs
);
if
(
nandcs
>
GPMC_CS_NUM
)
nandcs
=
cs
;
}
cs
++
;
}
if
(
nandcs
>
GPMC_CS_NUM
)
{
printk
(
KERN_INFO
"NAND: Unable to find configuration "
"in GPMC
\n
"
);
return
;
}
if
(
nandcs
<
GPMC_CS_NUM
)
{
omap3touchbook_nand_data
.
cs
=
nandcs
;
printk
(
KERN_INFO
"Registering NAND on CS%d
\n
"
,
nandcs
);
if
(
gpmc_nand_init
(
&
omap3touchbook_nand_data
)
<
0
)
printk
(
KERN_ERR
"Unable to register NAND device
\n
"
);
}
}
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
...
@@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
...
@@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
static
void
omap3_touchbook_poweroff
(
void
)
static
void
omap3_touchbook_poweroff
(
void
)
{
{
int
r
;
int
pwr_off
=
TB_KILL_POWER_GPIO
;
r
=
gpio_request
(
TB_KILL_POWER_GPIO
,
"DVI reset"
);
if
(
gpio_request_one
(
pwr_off
,
GPIOF_OUT_INIT_LOW
,
"DVI reset"
)
<
0
)
if
(
r
<
0
)
{
printk
(
KERN_ERR
"Unable to get kill power GPIO
\n
"
);
printk
(
KERN_ERR
"Unable to get kill power GPIO
\n
"
);
return
;
}
gpio_direction_output
(
TB_KILL_POWER_GPIO
,
0
);
}
}
static
int
__init
early_touchbook_revision
(
char
*
p
)
static
int
__init
early_touchbook_revision
(
char
*
p
)
...
@@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p)
...
@@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p)
}
}
early_param
(
"tbr"
,
early_touchbook_revision
);
early_param
(
"tbr"
,
early_touchbook_revision
);
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
void
__init
omap3_touchbook_init
(
void
)
static
void
__init
omap3_touchbook_init
(
void
)
{
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
...
@@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void)
...
@@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void)
omap_serial_init
();
omap_serial_init
();
omap_mux_init_gpio
(
170
,
OMAP_PIN_INPUT
);
omap_mux_init_gpio
(
170
,
OMAP_PIN_INPUT
);
gpio_request
(
176
,
"DVI_nPD"
);
/* REVISIT leave DVI powered down until it's needed ... */
/* REVISIT leave DVI powered down until it's needed ... */
gpio_
direction_output
(
176
,
true
);
gpio_
request_one
(
176
,
GPIOF_OUT_INIT_HIGH
,
"DVI_nPD"
);
/* Touchscreen and accelerometer */
/* Touchscreen and accelerometer */
spi_register_board_info
(
omap3_ads7846_spi_board_info
,
omap_ads7846_init
(
4
,
OMAP3_TS_GPIO
,
310
,
&
ads7846_pdata
);
ARRAY_SIZE
(
omap3_ads7846_spi_board_info
));
usb_musb_init
(
NULL
);
omap3_ads7846_init
();
usb_musb_init
(
&
musb_board_data
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
omap3touchbook_flash_init
();
omap_nand_flash_init
(
NAND_BUSWIDTH_16
,
omap3touchbook_nand_partitions
,
ARRAY_SIZE
(
omap3touchbook_nand_partitions
));
/* Ensure SDRC pins are mux'd for self-refresh */
/* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
...
...
arch/arm/mach-omap2/board-omap4panda.c
浏览文件 @
b08827f4
...
@@ -46,6 +46,7 @@
...
@@ -46,6 +46,7 @@
#include "hsmmc.h"
#include "hsmmc.h"
#include "control.h"
#include "control.h"
#include "mux.h"
#include "mux.h"
#include "common-board-devices.h"
#define GPIO_HUB_POWER 1
#define GPIO_HUB_POWER 1
#define GPIO_HUB_NRESET 62
#define GPIO_HUB_NRESET 62
...
@@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
...
@@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.
reset_gpio_port
[
2
]
=
-
EINVAL
.
reset_gpio_port
[
2
]
=
-
EINVAL
};
};
static
struct
gpio
panda_ehci_gpios
[]
__initdata
=
{
{
GPIO_HUB_POWER
,
GPIOF_OUT_INIT_LOW
,
"hub_power"
},
{
GPIO_HUB_NRESET
,
GPIOF_OUT_INIT_LOW
,
"hub_nreset"
},
};
static
void
__init
omap4_ehci_init
(
void
)
static
void
__init
omap4_ehci_init
(
void
)
{
{
int
ret
;
int
ret
;
...
@@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void)
...
@@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void)
phy_ref_clk
=
clk_get
(
NULL
,
"auxclk3_ck"
);
phy_ref_clk
=
clk_get
(
NULL
,
"auxclk3_ck"
);
if
(
IS_ERR
(
phy_ref_clk
))
{
if
(
IS_ERR
(
phy_ref_clk
))
{
pr_err
(
"Cannot request auxclk3
\n
"
);
pr_err
(
"Cannot request auxclk3
\n
"
);
goto
error1
;
return
;
}
}
clk_set_rate
(
phy_ref_clk
,
19200000
);
clk_set_rate
(
phy_ref_clk
,
19200000
);
clk_enable
(
phy_ref_clk
);
clk_enable
(
phy_ref_clk
);
/* disable the power to the usb hub prior to init */
/* disable the power to the usb hub prior to init and reset phy+hub */
ret
=
gpio_request
(
GPIO_HUB_POWER
,
"hub_power"
);
ret
=
gpio_request_array
(
panda_ehci_gpios
,
ARRAY_SIZE
(
panda_ehci_gpios
));
if
(
ret
)
{
if
(
ret
)
{
pr_err
(
"
Cannot request GPIO %d
\n
"
,
GPIO_HUB_POWER
);
pr_err
(
"
Unable to initialize EHCI power/reset
\n
"
);
goto
error1
;
return
;
}
}
gpio_export
(
GPIO_HUB_POWER
,
0
);
gpio_direction_output
(
GPIO_HUB_POWER
,
0
);
gpio_set_value
(
GPIO_HUB_POWER
,
0
);
/* reset phy+hub */
gpio_export
(
GPIO_HUB_POWER
,
0
);
ret
=
gpio_request
(
GPIO_HUB_NRESET
,
"hub_nreset"
);
if
(
ret
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
GPIO_HUB_NRESET
);
goto
error2
;
}
gpio_export
(
GPIO_HUB_NRESET
,
0
);
gpio_export
(
GPIO_HUB_NRESET
,
0
);
gpio_direction_output
(
GPIO_HUB_NRESET
,
0
);
gpio_set_value
(
GPIO_HUB_NRESET
,
0
);
gpio_set_value
(
GPIO_HUB_NRESET
,
1
);
gpio_set_value
(
GPIO_HUB_NRESET
,
1
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
/* enable power to hub */
/* enable power to hub */
gpio_set_value
(
GPIO_HUB_POWER
,
1
);
gpio_set_value
(
GPIO_HUB_POWER
,
1
);
return
;
error2:
gpio_free
(
GPIO_HUB_POWER
);
error1:
pr_err
(
"Unable to initialize EHCI power/reset
\n
"
);
return
;
}
}
static
struct
omap_musb_board_data
musb_board_data
=
{
static
struct
omap_musb_board_data
musb_board_data
=
{
...
@@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = {
...
@@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = {
.
usb
=
&
omap4_usbphy_data
,
.
usb
=
&
omap4_usbphy_data
,
};
};
static
struct
i2c_board_info
__initdata
omap4_panda_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl6030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
OMAP44XX_IRQ_SYS_1N
,
.
platform_data
=
&
omap4_panda_twldata
,
},
};
/*
/*
* Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
* Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
* is connected as I2C slave device, and can be accessed at address 0x50
* is connected as I2C slave device, and can be accessed at address 0x50
...
@@ -429,12 +409,7 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
...
@@ -429,12 +409,7 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
static
int
__init
omap4_panda_i2c_init
(
void
)
static
int
__init
omap4_panda_i2c_init
(
void
)
{
{
/*
omap4_pmic_init
(
"twl6030"
,
&
omap4_panda_twldata
);
* Phoenix Audio IC needs I2C1 to
* start with 400 KHz or less
*/
omap_register_i2c_bus
(
1
,
400
,
omap4_panda_i2c_boardinfo
,
ARRAY_SIZE
(
omap4_panda_i2c_boardinfo
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
/*
/*
* Bus 3 is attached to the DVI port where devices like the pico DLP
* Bus 3 is attached to the DVI port where devices like the pico DLP
...
@@ -651,27 +626,19 @@ static void omap4_panda_hdmi_mux_init(void)
...
@@ -651,27 +626,19 @@ static void omap4_panda_hdmi_mux_init(void)
OMAP_PIN_INPUT_PULLUP
);
OMAP_PIN_INPUT_PULLUP
);
}
}
static
struct
gpio
panda_hdmi_gpios
[]
=
{
{
HDMI_GPIO_HPD
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_hpd"
},
{
HDMI_GPIO_LS_OE
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_ls_oe"
},
};
static
int
omap4_panda_panel_enable_hdmi
(
struct
omap_dss_device
*
dssdev
)
static
int
omap4_panda_panel_enable_hdmi
(
struct
omap_dss_device
*
dssdev
)
{
{
int
status
;
int
status
;
status
=
gpio_request_one
(
HDMI_GPIO_HPD
,
GPIOF_OUT_INIT_HIGH
,
status
=
gpio_request_array
(
panda_hdmi_gpios
,
"hdmi_gpio_hpd"
);
ARRAY_SIZE
(
panda_hdmi_gpios
));
if
(
status
)
{
if
(
status
)
pr_err
(
"Cannot request GPIO %d
\n
"
,
HDMI_GPIO_HPD
);
pr_err
(
"Cannot request HDMI GPIOs
\n
"
);
return
status
;
}
status
=
gpio_request_one
(
HDMI_GPIO_LS_OE
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_ls_oe"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
HDMI_GPIO_LS_OE
);
goto
error1
;
}
return
0
;
error1:
gpio_free
(
HDMI_GPIO_HPD
);
return
status
;
return
status
;
}
}
...
...
arch/arm/mach-omap2/board-overo.c
浏览文件 @
b08827f4
...
@@ -56,6 +56,7 @@
...
@@ -56,6 +56,7 @@
#include "mux.h"
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define OVERO_GPIO_BT_XGATE 15
#define OVERO_GPIO_BT_XGATE 15
#define OVERO_GPIO_W2W_NRESET 16
#define OVERO_GPIO_W2W_NRESET 16
...
@@ -74,30 +75,6 @@
...
@@ -74,30 +75,6 @@
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
#include <linux/spi/ads7846.h>
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
int
ads7846_get_pendown_state
(
void
)
{
return
!
gpio_get_value
(
OVERO_GPIO_PENDOWN
);
}
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
3
,
.
debounce_rep
=
1
,
.
get_pendown_state
=
ads7846_get_pendown_state
,
.
keep_vref_on
=
1
,
};
/* fixed regulator for ads7846 */
/* fixed regulator for ads7846 */
static
struct
regulator_consumer_supply
ads7846_supply
=
static
struct
regulator_consumer_supply
ads7846_supply
=
REGULATOR_SUPPLY
(
"vcc"
,
"spi1.0"
);
REGULATOR_SUPPLY
(
"vcc"
,
"spi1.0"
);
...
@@ -128,14 +105,7 @@ static struct platform_device vads7846_device = {
...
@@ -128,14 +105,7 @@ static struct platform_device vads7846_device = {
static
void
__init
overo_ads7846_init
(
void
)
static
void
__init
overo_ads7846_init
(
void
)
{
{
if
((
gpio_request
(
OVERO_GPIO_PENDOWN
,
"ADS7846_PENDOWN"
)
==
0
)
&&
omap_ads7846_init
(
1
,
OVERO_GPIO_PENDOWN
,
0
,
NULL
);
(
gpio_direction_input
(
OVERO_GPIO_PENDOWN
)
==
0
))
{
gpio_export
(
OVERO_GPIO_PENDOWN
,
0
);
}
else
{
printk
(
KERN_ERR
"could not obtain gpio for ADS7846_PENDOWN
\n
"
);
return
;
}
platform_device_register
(
&
vads7846_device
);
platform_device_register
(
&
vads7846_device
);
}
}
...
@@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; }
...
@@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; }
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h>
#include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static
struct
resource
overo_smsc911x_resources
[]
=
{
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
{
.
name
=
"smsc911x-memory"
,
.
flags
=
IORESOURCE_MEM
,
},
{
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
static
struct
resource
overo_smsc911x2_resources
[]
=
{
{
.
name
=
"smsc911x2-memory"
,
.
flags
=
IORESOURCE_MEM
,
},
{
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
static
struct
smsc911x_platform_config
overo_smsc911x_config
=
{
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
flags
=
SMSC911X_USE_32BIT
,
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
};
static
struct
platform_device
overo_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
0
,
.
id
=
0
,
.
num_resources
=
ARRAY_SIZE
(
overo_smsc911x_resources
),
.
cs
=
OVERO_SMSC911X_CS
,
.
resource
=
overo_smsc911x_resources
,
.
gpio_irq
=
OVERO_SMSC911X_GPIO
,
.
dev
=
{
.
gpio_reset
=
-
EINVAL
,
.
platform_data
=
&
overo_smsc911x_config
,
.
flags
=
SMSC911X_USE_32BIT
,
},
};
};
static
struct
platform_device
overo_smsc911x2_device
=
{
static
struct
omap_smsc911x_platform_data
smsc911x2_cfg
=
{
.
name
=
"smsc911x"
,
.
id
=
1
,
.
id
=
1
,
.
num_resources
=
ARRAY_SIZE
(
overo_smsc911x2_resources
),
.
cs
=
OVERO_SMSC911X2_CS
,
.
resource
=
overo_smsc911x2_resources
,
.
gpio_irq
=
OVERO_SMSC911X2_GPIO
,
.
dev
=
{
.
gpio_reset
=
-
EINVAL
,
.
platform_data
=
&
overo_smsc911x_config
,
.
flags
=
SMSC911X_USE_32BIT
,
},
};
};
static
struct
platform_device
*
smsc911x_devices
[]
=
{
static
void
__init
overo_init_smsc911x
(
void
)
&
overo_smsc911x_device
,
&
overo_smsc911x2_device
,
};
static
inline
void
__init
overo_init_smsc911x
(
void
)
{
{
unsigned
long
cs_mem_base
,
cs_mem_base2
;
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
gpmc_smsc911x_init
(
&
smsc911x2_cfg
);
/* set up first smsc911x chip */
if
(
gpmc_cs_request
(
OVERO_SMSC911X_CS
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
printk
(
KERN_ERR
"Failed request for GPMC mem for smsc911x
\n
"
);
return
;
}
overo_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
overo_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
if
((
gpio_request
(
OVERO_SMSC911X_GPIO
,
"SMSC911X IRQ"
)
==
0
)
&&
(
gpio_direction_input
(
OVERO_SMSC911X_GPIO
)
==
0
))
{
gpio_export
(
OVERO_SMSC911X_GPIO
,
0
);
}
else
{
printk
(
KERN_ERR
"could not obtain gpio for SMSC911X IRQ
\n
"
);
return
;
}
overo_smsc911x_resources
[
1
].
start
=
OMAP_GPIO_IRQ
(
OVERO_SMSC911X_GPIO
);
overo_smsc911x_resources
[
1
].
end
=
0
;
/* set up second smsc911x chip */
if
(
gpmc_cs_request
(
OVERO_SMSC911X2_CS
,
SZ_16M
,
&
cs_mem_base2
)
<
0
)
{
printk
(
KERN_ERR
"Failed request for GPMC mem for smsc911x2
\n
"
);
return
;
}
overo_smsc911x2_resources
[
0
].
start
=
cs_mem_base2
+
0x0
;
overo_smsc911x2_resources
[
0
].
end
=
cs_mem_base2
+
0xff
;
if
((
gpio_request
(
OVERO_SMSC911X2_GPIO
,
"SMSC911X2 IRQ"
)
==
0
)
&&
(
gpio_direction_input
(
OVERO_SMSC911X2_GPIO
)
==
0
))
{
gpio_export
(
OVERO_SMSC911X2_GPIO
,
0
);
}
else
{
printk
(
KERN_ERR
"could not obtain gpio for SMSC911X2 IRQ
\n
"
);
return
;
}
overo_smsc911x2_resources
[
1
].
start
=
OMAP_GPIO_IRQ
(
OVERO_SMSC911X2_GPIO
);
overo_smsc911x2_resources
[
1
].
end
=
0
;
platform_add_devices
(
smsc911x_devices
,
ARRAY_SIZE
(
smsc911x_devices
));
}
}
#else
#else
...
@@ -259,21 +151,20 @@ static int dvi_enabled;
...
@@ -259,21 +151,20 @@ static int dvi_enabled;
#define OVERO_GPIO_LCD_EN 144
#define OVERO_GPIO_LCD_EN 144
#define OVERO_GPIO_LCD_BL 145
#define OVERO_GPIO_LCD_BL 145
static
struct
gpio
overo_dss_gpios
[]
__initdata
=
{
{
OVERO_GPIO_LCD_EN
,
GPIOF_OUT_INIT_HIGH
,
"OVERO_GPIO_LCD_EN"
},
{
OVERO_GPIO_LCD_BL
,
GPIOF_OUT_INIT_HIGH
,
"OVERO_GPIO_LCD_BL"
},
};
static
void
__init
overo_display_init
(
void
)
static
void
__init
overo_display_init
(
void
)
{
{
if
((
gpio_request
(
OVERO_GPIO_LCD_EN
,
"OVERO_GPIO_LCD_EN"
)
==
0
)
&&
if
(
gpio_request_array
(
overo_dss_gpios
,
ARRAY_SIZE
(
overo_dss_gpios
)))
{
(
gpio_direction_output
(
OVERO_GPIO_LCD_EN
,
1
)
==
0
))
printk
(
KERN_ERR
"could not obtain DSS control GPIOs
\n
"
);
gpio_export
(
OVERO_GPIO_LCD_EN
,
0
);
return
;
else
}
printk
(
KERN_ERR
"could not obtain gpio for "
"OVERO_GPIO_LCD_EN
\n
"
);
if
((
gpio_request
(
OVERO_GPIO_LCD_BL
,
"OVERO_GPIO_LCD_BL"
)
==
0
)
&&
gpio_export
(
OVERO_GPIO_LCD_EN
,
0
);
(
gpio_direction_output
(
OVERO_GPIO_LCD_BL
,
1
)
==
0
))
gpio_export
(
OVERO_GPIO_LCD_BL
,
0
);
gpio_export
(
OVERO_GPIO_LCD_BL
,
0
);
else
printk
(
KERN_ERR
"could not obtain gpio for "
"OVERO_GPIO_LCD_BL
\n
"
);
}
}
static
int
overo_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
static
int
overo_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
...
@@ -412,45 +303,6 @@ static struct mtd_partition overo_nand_partitions[] = {
...
@@ -412,45 +303,6 @@ static struct mtd_partition overo_nand_partitions[] = {
},
},
};
};
static
struct
omap_nand_platform_data
overo_nand_data
=
{
.
parts
=
overo_nand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
overo_nand_partitions
),
.
dma_channel
=
-
1
,
/* disable DMA in OMAP NAND driver */
};
static
void
__init
overo_flash_init
(
void
)
{
u8
cs
=
0
;
u8
nandcs
=
GPMC_CS_NUM
+
1
;
/* find out the chip-select on which NAND exists */
while
(
cs
<
GPMC_CS_NUM
)
{
u32
ret
=
0
;
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG1
);
if
((
ret
&
0xC00
)
==
0x800
)
{
printk
(
KERN_INFO
"Found NAND on CS%d
\n
"
,
cs
);
if
(
nandcs
>
GPMC_CS_NUM
)
nandcs
=
cs
;
}
cs
++
;
}
if
(
nandcs
>
GPMC_CS_NUM
)
{
printk
(
KERN_INFO
"NAND: Unable to find configuration "
"in GPMC
\n
"
);
return
;
}
if
(
nandcs
<
GPMC_CS_NUM
)
{
overo_nand_data
.
cs
=
nandcs
;
printk
(
KERN_INFO
"Registering NAND on CS%d
\n
"
,
nandcs
);
if
(
gpmc_nand_init
(
&
overo_nand_data
)
<
0
)
printk
(
KERN_ERR
"Unable to register NAND device
\n
"
);
}
}
static
struct
omap2_hsmmc_info
mmc
[]
=
{
static
struct
omap2_hsmmc_info
mmc
[]
=
{
{
{
.
mmc
=
1
,
.
mmc
=
1
,
...
@@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = {
...
@@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = {
.
vpll2
=
&
overo_vpll2
,
.
vpll2
=
&
overo_vpll2
,
};
};
static
struct
i2c_board_info
__initdata
overo_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"tps65950"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
overo_twldata
,
},
};
static
int
__init
overo_i2c_init
(
void
)
static
int
__init
overo_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2600
,
overo_i2c_boardinfo
,
omap3_pmic_init
(
"tps65950"
,
&
overo_twldata
);
ARRAY_SIZE
(
overo_i2c_boardinfo
));
/* i2c2 pins are used for gpio */
/* i2c2 pins are used for gpio */
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
return
0
;
return
0
;
}
}
static
struct
spi_board_info
overo_spi_board_info
[]
__initdata
=
{
static
struct
spi_board_info
overo_spi_board_info
[]
__initdata
=
{
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
{
.
modalias
=
"ads7846"
,
.
bus_num
=
1
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
OMAP_GPIO_IRQ
(
OVERO_GPIO_PENDOWN
),
.
platform_data
=
&
ads7846_config
,
},
#endif
#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
{
{
...
@@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
static
struct
gpio
overo_bt_gpios
[]
__initdata
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
{
OVERO_GPIO_BT_XGATE
,
GPIOF_OUT_INIT_LOW
,
"lcd enable"
},
.
mode
=
MUSB_OTG
,
{
OVERO_GPIO_BT_NRESET
,
GPIOF_OUT_INIT_HIGH
,
"lcd bl enable"
},
.
power
=
100
,
};
};
static
void
__init
overo_init
(
void
)
static
void
__init
overo_init
(
void
)
{
{
int
ret
;
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
overo_i2c_init
();
overo_i2c_init
();
omap_display_init
(
&
overo_dss_data
);
omap_display_init
(
&
overo_dss_data
);
omap_serial_init
();
omap_serial_init
();
overo_flash_init
();
omap_nand_flash_init
(
0
,
overo_nand_partitions
,
usb_musb_init
(
&
musb_board_data
);
ARRAY_SIZE
(
overo_nand_partitions
));
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
usbhs_init
(
&
usbhs_bdata
);
overo_spi_init
();
overo_spi_init
();
overo_ads7846_init
();
overo_ads7846_init
();
...
@@ -748,9 +580,9 @@ static void __init overo_init(void)
...
@@ -748,9 +580,9 @@ static void __init overo_init(void)
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke1"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke1"
,
OMAP_PIN_OUTPUT
);
if
((
gpio_request
(
OVERO_GPIO_W2W_NRESET
,
ret
=
gpio_request_one
(
OVERO_GPIO_W2W_NRESET
,
GPIOF_OUT_INIT_HIGH
,
"OVERO_GPIO_W2W_NRESET"
)
==
0
)
&&
"OVERO_GPIO_W2W_NRESET"
);
(
gpio_direction_output
(
OVERO_GPIO_W2W_NRESET
,
1
)
==
0
)
)
{
if
(
ret
==
0
)
{
gpio_export
(
OVERO_GPIO_W2W_NRESET
,
0
);
gpio_export
(
OVERO_GPIO_W2W_NRESET
,
0
);
gpio_set_value
(
OVERO_GPIO_W2W_NRESET
,
0
);
gpio_set_value
(
OVERO_GPIO_W2W_NRESET
,
0
);
udelay
(
10
);
udelay
(
10
);
...
@@ -760,25 +592,20 @@ static void __init overo_init(void)
...
@@ -760,25 +592,20 @@ static void __init overo_init(void)
"OVERO_GPIO_W2W_NRESET
\n
"
);
"OVERO_GPIO_W2W_NRESET
\n
"
);
}
}
if
((
gpio_request
(
OVERO_GPIO_BT_XGATE
,
"OVERO_GPIO_BT_XGATE"
)
==
0
)
&&
ret
=
gpio_request_array
(
overo_bt_gpios
,
ARRAY_SIZE
(
overo_bt_gpios
));
(
gpio_direction_output
(
OVERO_GPIO_BT_XGATE
,
0
)
==
0
))
if
(
ret
)
{
pr_err
(
"%s: could not obtain BT gpios
\n
"
,
__func__
);
}
else
{
gpio_export
(
OVERO_GPIO_BT_XGATE
,
0
);
gpio_export
(
OVERO_GPIO_BT_XGATE
,
0
);
else
printk
(
KERN_ERR
"could not obtain gpio for OVERO_GPIO_BT_XGATE
\n
"
);
if
((
gpio_request
(
OVERO_GPIO_BT_NRESET
,
"OVERO_GPIO_BT_NRESET"
)
==
0
)
&&
(
gpio_direction_output
(
OVERO_GPIO_BT_NRESET
,
1
)
==
0
))
{
gpio_export
(
OVERO_GPIO_BT_NRESET
,
0
);
gpio_export
(
OVERO_GPIO_BT_NRESET
,
0
);
gpio_set_value
(
OVERO_GPIO_BT_NRESET
,
0
);
gpio_set_value
(
OVERO_GPIO_BT_NRESET
,
0
);
mdelay
(
6
);
mdelay
(
6
);
gpio_set_value
(
OVERO_GPIO_BT_NRESET
,
1
);
gpio_set_value
(
OVERO_GPIO_BT_NRESET
,
1
);
}
else
{
printk
(
KERN_ERR
"could not obtain gpio for "
"OVERO_GPIO_BT_NRESET
\n
"
);
}
}
if
((
gpio_request
(
OVERO_GPIO_USBH_CPEN
,
"OVERO_GPIO_USBH_CPEN"
)
==
0
)
&&
ret
=
gpio_request_one
(
OVERO_GPIO_USBH_CPEN
,
GPIOF_OUT_INIT_HIGH
,
(
gpio_direction_output
(
OVERO_GPIO_USBH_CPEN
,
1
)
==
0
))
"OVERO_GPIO_USBH_CPEN"
);
if
(
ret
==
0
)
gpio_export
(
OVERO_GPIO_USBH_CPEN
,
0
);
gpio_export
(
OVERO_GPIO_USBH_CPEN
,
0
);
else
else
printk
(
KERN_ERR
"could not obtain gpio for "
printk
(
KERN_ERR
"could not obtain gpio for "
...
...
arch/arm/mach-omap2/board-rm680.c
浏览文件 @
b08827f4
...
@@ -31,6 +31,7 @@
...
@@ -31,6 +31,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "sdram-nokia.h"
#include "sdram-nokia.h"
#include "common-board-devices.h"
static
struct
regulator_consumer_supply
rm680_vemmc_consumers
[]
=
{
static
struct
regulator_consumer_supply
rm680_vemmc_consumers
[]
=
{
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.1"
),
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.1"
),
...
@@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = {
...
@@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = {
/* add rest of the children here */
/* add rest of the children here */
};
};
static
struct
i2c_board_info
__initdata
rm680_twl_i2c_board_info
[]
=
{
{
I2C_BOARD_INFO
(
"twl5031"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
rm680_twl_data
,
},
};
static
void
__init
rm680_i2c_init
(
void
)
static
void
__init
rm680_i2c_init
(
void
)
{
{
omap_register_i2c_bus
(
1
,
2900
,
rm680_twl_i2c_board_info
,
omap_pmic_init
(
1
,
2900
,
"twl5031"
,
INT_34XX_SYS_NIRQ
,
&
rm680_twl_data
);
ARRAY_SIZE
(
rm680_twl_i2c_board_info
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
}
}
...
@@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = {
...
@@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = {
};
};
#endif
#endif
static
struct
omap_musb_board_data
rm680_musb_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_PERIPHERAL
,
.
power
=
100
,
};
static
void
__init
rm680_init
(
void
)
static
void
__init
rm680_init
(
void
)
{
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap_serial_init
();
omap_serial_init
();
usb_musb_init
(
&
rm680_musb_data
);
usb_musb_init
(
NULL
);
rm680_peripherals_init
();
rm680_peripherals_init
();
}
}
...
...
arch/arm/mach-omap2/board-rx51-peripherals.c
浏览文件 @
b08827f4
...
@@ -43,6 +43,7 @@
...
@@ -43,6 +43,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define SYSTEM_REV_B_USES_VAUX3 0x1699
#define SYSTEM_REV_B_USES_VAUX3 0x1699
#define SYSTEM_REV_S_USES_VAUX3 0x8
#define SYSTEM_REV_S_USES_VAUX3 0x8
...
@@ -557,10 +558,8 @@ static __init void rx51_init_si4713(void)
...
@@ -557,10 +558,8 @@ static __init void rx51_init_si4713(void)
static
int
rx51_twlgpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
n
)
static
int
rx51_twlgpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
n
)
{
{
/* FIXME this gpio setup is just a placeholder for now */
/* FIXME this gpio setup is just a placeholder for now */
gpio_request
(
gpio
+
6
,
"backlight_pwm"
);
gpio_request_one
(
gpio
+
6
,
GPIOF_OUT_INIT_LOW
,
"backlight_pwm"
);
gpio_direction_output
(
gpio
+
6
,
0
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_HIGH
,
"speaker_en"
);
gpio_request
(
gpio
+
7
,
"speaker_en"
);
gpio_direction_output
(
gpio
+
7
,
1
);
return
0
;
return
0
;
}
}
...
@@ -777,15 +776,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module =
...
@@ -777,15 +776,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module =
.
power_gpio
=
98
,
.
power_gpio
=
98
,
};
};
static
struct
i2c_board_info
__initdata
rx51_peripherals_i2c_board_info_1
[]
=
{
{
I2C_BOARD_INFO
(
"twl5030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
rx51_twldata
,
},
};
/* Audio setup data */
/* Audio setup data */
static
struct
aic3x_setup_data
rx51_aic34_setup
=
{
static
struct
aic3x_setup_data
rx51_aic34_setup
=
{
.
gpio_func
[
0
]
=
AIC3X_GPIO1_FUNC_DISABLED
,
.
gpio_func
[
0
]
=
AIC3X_GPIO1_FUNC_DISABLED
,
...
@@ -833,8 +823,7 @@ static int __init rx51_i2c_init(void)
...
@@ -833,8 +823,7 @@ static int __init rx51_i2c_init(void)
rx51_twldata
.
vaux3
=
&
rx51_vaux3_cam
;
rx51_twldata
.
vaux3
=
&
rx51_vaux3_cam
;
}
}
rx51_twldata
.
vmmc2
=
&
rx51_vmmc2
;
rx51_twldata
.
vmmc2
=
&
rx51_vmmc2
;
omap_register_i2c_bus
(
1
,
2200
,
rx51_peripherals_i2c_board_info_1
,
omap_pmic_init
(
1
,
2200
,
"twl5030"
,
INT_34XX_SYS_NIRQ
,
&
rx51_twldata
);
ARRAY_SIZE
(
rx51_peripherals_i2c_board_info_1
));
omap_register_i2c_bus
(
2
,
100
,
rx51_peripherals_i2c_board_info_2
,
omap_register_i2c_bus
(
2
,
100
,
rx51_peripherals_i2c_board_info_2
,
ARRAY_SIZE
(
rx51_peripherals_i2c_board_info_2
));
ARRAY_SIZE
(
rx51_peripherals_i2c_board_info_2
));
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
...
@@ -921,26 +910,20 @@ static void rx51_wl1251_set_power(bool enable)
...
@@ -921,26 +910,20 @@ static void rx51_wl1251_set_power(bool enable)
gpio_set_value
(
RX51_WL1251_POWER_GPIO
,
enable
);
gpio_set_value
(
RX51_WL1251_POWER_GPIO
,
enable
);
}
}
static
struct
gpio
rx51_wl1251_gpios
[]
__initdata
=
{
{
RX51_WL1251_POWER_GPIO
,
GPIOF_OUT_INIT_LOW
,
"wl1251 power"
},
{
RX51_WL1251_IRQ_GPIO
,
GPIOF_IN
,
"wl1251 irq"
},
};
static
void
__init
rx51_init_wl1251
(
void
)
static
void
__init
rx51_init_wl1251
(
void
)
{
{
int
irq
,
ret
;
int
irq
,
ret
;
ret
=
gpio_request
(
RX51_WL1251_POWER_GPIO
,
"wl1251 power"
);
ret
=
gpio_request_array
(
rx51_wl1251_gpios
,
ARRAY_SIZE
(
rx51_wl1251_gpios
));
if
(
ret
<
0
)
if
(
ret
<
0
)
goto
error
;
goto
error
;
ret
=
gpio_direction_output
(
RX51_WL1251_POWER_GPIO
,
0
);
if
(
ret
<
0
)
goto
err_power
;
ret
=
gpio_request
(
RX51_WL1251_IRQ_GPIO
,
"wl1251 irq"
);
if
(
ret
<
0
)
goto
err_power
;
ret
=
gpio_direction_input
(
RX51_WL1251_IRQ_GPIO
);
if
(
ret
<
0
)
goto
err_irq
;
irq
=
gpio_to_irq
(
RX51_WL1251_IRQ_GPIO
);
irq
=
gpio_to_irq
(
RX51_WL1251_IRQ_GPIO
);
if
(
irq
<
0
)
if
(
irq
<
0
)
goto
err_irq
;
goto
err_irq
;
...
@@ -952,10 +935,7 @@ static void __init rx51_init_wl1251(void)
...
@@ -952,10 +935,7 @@ static void __init rx51_init_wl1251(void)
err_irq:
err_irq:
gpio_free
(
RX51_WL1251_IRQ_GPIO
);
gpio_free
(
RX51_WL1251_IRQ_GPIO
);
err_power:
gpio_free
(
RX51_WL1251_POWER_GPIO
);
gpio_free
(
RX51_WL1251_POWER_GPIO
);
error:
error:
printk
(
KERN_ERR
"wl1251 board initialisation failed
\n
"
);
printk
(
KERN_ERR
"wl1251 board initialisation failed
\n
"
);
wl1251_pdata
.
set_power
=
NULL
;
wl1251_pdata
.
set_power
=
NULL
;
...
...
arch/arm/mach-omap2/board-rx51-video.c
浏览文件 @
b08827f4
...
@@ -76,13 +76,12 @@ static int __init rx51_video_init(void)
...
@@ -76,13 +76,12 @@ static int __init rx51_video_init(void)
return
0
;
return
0
;
}
}
if
(
gpio_request
(
RX51_LCD_RESET_GPIO
,
"LCD ACX565AKM reset"
))
{
if
(
gpio_request_one
(
RX51_LCD_RESET_GPIO
,
GPIOF_OUT_INIT_HIGH
,
"LCD ACX565AKM reset"
))
{
pr_err
(
"%s failed to get LCD Reset GPIO
\n
"
,
__func__
);
pr_err
(
"%s failed to get LCD Reset GPIO
\n
"
,
__func__
);
return
0
;
return
0
;
}
}
gpio_direction_output
(
RX51_LCD_RESET_GPIO
,
1
);
omap_display_init
(
&
rx51_dss_board_info
);
omap_display_init
(
&
rx51_dss_board_info
);
return
0
;
return
0
;
}
}
...
...
arch/arm/mach-omap2/board-zoom-debugboard.c
浏览文件 @
b08827f4
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <plat/gpmc.h>
#include <plat/gpmc.h>
#include <plat/gpmc-smsc911x.h>
#include <mach/board-zoom.h>
#include <mach/board-zoom.h>
...
@@ -26,60 +27,16 @@
...
@@ -26,60 +27,16 @@
#define DEBUG_BASE 0x08000000
#define DEBUG_BASE 0x08000000
#define ZOOM_ETHR_START DEBUG_BASE
#define ZOOM_ETHR_START DEBUG_BASE
static
struct
resource
zoom_smsc911x_resources
[]
=
{
static
struct
omap_smsc911x_platform_data
zoom_smsc911x_cfg
=
{
[
0
]
=
{
.
cs
=
ZOOM_SMSC911X_CS
,
.
start
=
ZOOM_ETHR_START
,
.
gpio_irq
=
ZOOM_SMSC911X_GPIO
,
.
end
=
ZOOM_ETHR_START
+
SZ_4K
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
static
struct
smsc911x_platform_config
zoom_smsc911x_config
=
{
.
irq_polarity
=
SMSC911X_IRQ_POLARITY_ACTIVE_LOW
,
.
irq_type
=
SMSC911X_IRQ_TYPE_OPEN_DRAIN
,
.
flags
=
SMSC911X_USE_32BIT
,
.
flags
=
SMSC911X_USE_32BIT
,
.
phy_interface
=
PHY_INTERFACE_MODE_MII
,
};
static
struct
platform_device
zoom_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
zoom_smsc911x_resources
),
.
resource
=
zoom_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
zoom_smsc911x_config
,
},
};
};
static
inline
void
__init
zoom_init_smsc911x
(
void
)
static
inline
void
__init
zoom_init_smsc911x
(
void
)
{
{
int
eth_cs
;
gpmc_smsc911x_init
(
&
zoom_smsc911x_cfg
);
unsigned
long
cs_mem_base
;
int
eth_gpio
=
0
;
eth_cs
=
ZOOM_SMSC911X_CS
;
if
(
gpmc_cs_request
(
eth_cs
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPMC mem for smsc911x
\n
"
);
return
;
}
zoom_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
zoom_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
eth_gpio
=
ZOOM_SMSC911X_GPIO
;
zoom_smsc911x_resources
[
1
].
start
=
OMAP_GPIO_IRQ
(
eth_gpio
);
if
(
gpio_request
(
eth_gpio
,
"smsc911x irq"
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for smsc911x IRQ
\n
"
,
eth_gpio
);
return
;
}
gpio_direction_input
(
eth_gpio
);
}
}
static
struct
plat_serial8250_port
serial_platform_data
[]
=
{
static
struct
plat_serial8250_port
serial_platform_data
[]
=
{
...
@@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void)
...
@@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void)
quart_gpio
=
ZOOM_QUADUART_GPIO
;
quart_gpio
=
ZOOM_QUADUART_GPIO
;
if
(
gpio_request
(
quart_gpio
,
"TL16CP754C GPIO"
)
<
0
)
{
if
(
gpio_request
_one
(
quart_gpio
,
GPIOF_IN
,
"TL16CP754C GPIO"
)
<
0
)
printk
(
KERN_ERR
"Failed to request GPIO%d for TL16CP754C
\n
"
,
printk
(
KERN_ERR
"Failed to request GPIO%d for TL16CP754C
\n
"
,
quart_gpio
);
quart_gpio
);
return
;
}
gpio_direction_input
(
quart_gpio
);
}
}
static
inline
int
omap_zoom_debugboard_detect
(
void
)
static
inline
int
omap_zoom_debugboard_detect
(
void
)
...
@@ -135,12 +89,12 @@ static inline int omap_zoom_debugboard_detect(void)
...
@@ -135,12 +89,12 @@ static inline int omap_zoom_debugboard_detect(void)
debug_board_detect
=
ZOOM_SMSC911X_GPIO
;
debug_board_detect
=
ZOOM_SMSC911X_GPIO
;
if
(
gpio_request
(
debug_board_detect
,
"Zoom debug board detect"
)
<
0
)
{
if
(
gpio_request_one
(
debug_board_detect
,
GPIOF_IN
,
"Zoom debug board detect"
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for Zoom debug"
printk
(
KERN_ERR
"Failed to request GPIO%d for Zoom debug"
"board detect
\n
"
,
debug_board_detect
);
"board detect
\n
"
,
debug_board_detect
);
return
0
;
return
0
;
}
}
gpio_direction_input
(
debug_board_detect
);
if
(
!
gpio_get_value
(
debug_board_detect
))
{
if
(
!
gpio_get_value
(
debug_board_detect
))
{
ret
=
0
;
ret
=
0
;
...
@@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void)
...
@@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void)
}
}
static
struct
platform_device
*
zoom_devices
[]
__initdata
=
{
static
struct
platform_device
*
zoom_devices
[]
__initdata
=
{
&
zoom_smsc911x_device
,
&
zoom_debugboard_serial_device
,
&
zoom_debugboard_serial_device
,
};
};
...
...
arch/arm/mach-omap2/board-zoom-display.c
浏览文件 @
b08827f4
...
@@ -21,34 +21,19 @@
...
@@ -21,34 +21,19 @@
#define LCD_PANEL_RESET_GPIO_PILOT 55
#define LCD_PANEL_RESET_GPIO_PILOT 55
#define LCD_PANEL_QVGA_GPIO 56
#define LCD_PANEL_QVGA_GPIO 56
static
struct
gpio
zoom_lcd_gpios
[]
__initdata
=
{
{
-
EINVAL
,
GPIOF_OUT_INIT_HIGH
,
"lcd reset"
},
{
LCD_PANEL_QVGA_GPIO
,
GPIOF_OUT_INIT_HIGH
,
"lcd qvga"
},
};
static
void
zoom_lcd_panel_init
(
void
)
static
void
zoom_lcd_panel_init
(
void
)
{
{
int
ret
;
zoom_lcd_gpios
[
0
].
gpio
=
(
omap_rev
()
>
OMAP3430_REV_ES3_0
)
?
unsigned
char
lcd_panel_reset_gpio
;
lcd_panel_reset_gpio
=
(
omap_rev
()
>
OMAP3430_REV_ES3_0
)
?
LCD_PANEL_RESET_GPIO_PROD
:
LCD_PANEL_RESET_GPIO_PROD
:
LCD_PANEL_RESET_GPIO_PILOT
;
LCD_PANEL_RESET_GPIO_PILOT
;
ret
=
gpio_request
(
lcd_panel_reset_gpio
,
"lcd reset"
);
if
(
gpio_request_array
(
zoom_lcd_gpios
,
ARRAY_SIZE
(
zoom_lcd_gpios
)))
if
(
ret
)
{
pr_err
(
"%s: Failed to get LCD GPIOs.
\n
"
,
__func__
);
pr_err
(
"Failed to get LCD reset GPIO (gpio%d).
\n
"
,
lcd_panel_reset_gpio
);
return
;
}
gpio_direction_output
(
lcd_panel_reset_gpio
,
1
);
ret
=
gpio_request
(
LCD_PANEL_QVGA_GPIO
,
"lcd qvga"
);
if
(
ret
)
{
pr_err
(
"Failed to get LCD_PANEL_QVGA_GPIO (gpio%d).
\n
"
,
LCD_PANEL_QVGA_GPIO
);
goto
err0
;
}
gpio_direction_output
(
LCD_PANEL_QVGA_GPIO
,
1
);
return
;
err0:
gpio_free
(
lcd_panel_reset_gpio
);
}
}
static
int
zoom_panel_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
static
int
zoom_panel_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
...
...
arch/arm/mach-omap2/board-zoom-peripherals.c
浏览文件 @
b08827f4
...
@@ -31,6 +31,7 @@
...
@@ -31,6 +31,7 @@
#include "mux.h"
#include "mux.h"
#include "hsmmc.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
...
@@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev,
...
@@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev,
zoom_vsim_supply
.
dev
=
mmc
[
0
].
dev
;
zoom_vsim_supply
.
dev
=
mmc
[
0
].
dev
;
zoom_vmmc2_supply
.
dev
=
mmc
[
1
].
dev
;
zoom_vmmc2_supply
.
dev
=
mmc
[
1
].
dev
;
ret
=
gpio_request
(
LCD_PANEL_ENABLE_GPIO
,
"lcd enable"
);
ret
=
gpio_request_one
(
LCD_PANEL_ENABLE_GPIO
,
GPIOF_OUT_INIT_LOW
,
if
(
ret
)
{
"lcd enable"
);
if
(
ret
)
pr_err
(
"Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).
\n
"
,
pr_err
(
"Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).
\n
"
,
LCD_PANEL_ENABLE_GPIO
);
LCD_PANEL_ENABLE_GPIO
);
return
ret
;
}
gpio_direction_output
(
LCD_PANEL_ENABLE_GPIO
,
0
);
return
ret
;
return
ret
;
}
}
...
@@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = {
...
@@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = {
.
vdac
=
&
zoom_vdac
,
.
vdac
=
&
zoom_vdac
,
};
};
static
struct
i2c_board_info
__initdata
zoom_i2c_boardinfo
[]
=
{
{
I2C_BOARD_INFO
(
"twl5030"
,
0x48
),
.
flags
=
I2C_CLIENT_WAKE
,
.
irq
=
INT_34XX_SYS_NIRQ
,
.
platform_data
=
&
zoom_twldata
,
},
};
static
int
__init
omap_i2c_init
(
void
)
static
int
__init
omap_i2c_init
(
void
)
{
{
if
(
machine_is_omap_zoom2
())
{
if
(
machine_is_omap_zoom2
())
{
...
@@ -365,19 +355,12 @@ static int __init omap_i2c_init(void)
...
@@ -365,19 +355,12 @@ static int __init omap_i2c_init(void)
zoom_audio_data
.
hs_extmute
=
1
;
zoom_audio_data
.
hs_extmute
=
1
;
zoom_audio_data
.
set_hs_extmute
=
zoom2_set_hs_extmute
;
zoom_audio_data
.
set_hs_extmute
=
zoom2_set_hs_extmute
;
}
}
omap_register_i2c_bus
(
1
,
2400
,
zoom_i2c_boardinfo
,
omap_pmic_init
(
1
,
2400
,
"twl5030"
,
INT_34XX_SYS_NIRQ
,
&
zoom_twldata
);
ARRAY_SIZE
(
zoom_i2c_boardinfo
));
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
return
0
;
return
0
;
}
}
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
static
void
enable_board_wakeup_source
(
void
)
static
void
enable_board_wakeup_source
(
void
)
{
{
/* T2 interrupt line (keypad) */
/* T2 interrupt line (keypad) */
...
@@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void)
...
@@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void)
omap_i2c_init
();
omap_i2c_init
();
platform_device_register
(
&
omap_vwlan_device
);
platform_device_register
(
&
omap_vwlan_device
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
enable_board_wakeup_source
();
enable_board_wakeup_source
();
omap_serial_init
();
omap_serial_init
();
}
}
arch/arm/mach-omap2/clkt34xx_dpll3m2.c
浏览文件 @
b08827f4
...
@@ -115,6 +115,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
...
@@ -115,6 +115,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
sdrc_cs0
->
rfr_ctrl
,
sdrc_cs0
->
actim_ctrla
,
sdrc_cs0
->
rfr_ctrl
,
sdrc_cs0
->
actim_ctrla
,
sdrc_cs0
->
actim_ctrlb
,
sdrc_cs0
->
mr
,
sdrc_cs0
->
actim_ctrlb
,
sdrc_cs0
->
mr
,
0
,
0
,
0
,
0
);
0
,
0
,
0
,
0
);
clk
->
rate
=
rate
;
return
0
;
return
0
;
}
}
...
...
arch/arm/mach-omap2/common-board-devices.c
0 → 100644
浏览文件 @
b08827f4
/*
* common-board-devices.c
*
* Copyright (C) 2011 CompuLab, Ltd.
* Author: Mike Rapoport <mike@compulab.co.il>
*
* 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.
*
* 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 St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
#include <linux/i2c.h>
#include <linux/i2c/twl.h>
#include <linux/gpio.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <plat/i2c.h>
#include <plat/mcspi.h>
#include <plat/nand.h>
#include "common-board-devices.h"
static
struct
i2c_board_info
__initdata
pmic_i2c_board_info
=
{
.
addr
=
0x48
,
.
flags
=
I2C_CLIENT_WAKE
,
};
void
__init
omap_pmic_init
(
int
bus
,
u32
clkrate
,
const
char
*
pmic_type
,
int
pmic_irq
,
struct
twl4030_platform_data
*
pmic_data
)
{
strncpy
(
pmic_i2c_board_info
.
type
,
pmic_type
,
sizeof
(
pmic_i2c_board_info
.
type
));
pmic_i2c_board_info
.
irq
=
pmic_irq
;
pmic_i2c_board_info
.
platform_data
=
pmic_data
;
omap_register_i2c_bus
(
bus
,
clkrate
,
&
pmic_i2c_board_info
,
1
);
}
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
static
struct
omap2_mcspi_device_config
ads7846_mcspi_config
=
{
.
turbo_mode
=
0
,
.
single_channel
=
1
,
/* 0: slave, 1: master */
};
static
struct
ads7846_platform_data
ads7846_config
=
{
.
x_max
=
0x0fff
,
.
y_max
=
0x0fff
,
.
x_plate_ohms
=
180
,
.
pressure_max
=
255
,
.
debounce_max
=
10
,
.
debounce_tol
=
3
,
.
debounce_rep
=
1
,
.
gpio_pendown
=
-
EINVAL
,
.
keep_vref_on
=
1
,
};
static
struct
spi_board_info
ads7846_spi_board_info
__initdata
=
{
.
modalias
=
"ads7846"
,
.
bus_num
=
-
EINVAL
,
.
chip_select
=
0
,
.
max_speed_hz
=
1500000
,
.
controller_data
=
&
ads7846_mcspi_config
,
.
irq
=
-
EINVAL
,
.
platform_data
=
&
ads7846_config
,
};
void
__init
omap_ads7846_init
(
int
bus_num
,
int
gpio_pendown
,
int
gpio_debounce
,
struct
ads7846_platform_data
*
board_pdata
)
{
struct
spi_board_info
*
spi_bi
=
&
ads7846_spi_board_info
;
int
err
;
err
=
gpio_request
(
gpio_pendown
,
"TS PenDown"
);
if
(
err
)
{
pr_err
(
"Could not obtain gpio for TS PenDown: %d
\n
"
,
err
);
return
;
}
gpio_direction_input
(
gpio_pendown
);
gpio_export
(
gpio_pendown
,
0
);
if
(
gpio_debounce
)
gpio_set_debounce
(
gpio_pendown
,
gpio_debounce
);
ads7846_config
.
gpio_pendown
=
gpio_pendown
;
spi_bi
->
bus_num
=
bus_num
;
spi_bi
->
irq
=
OMAP_GPIO_IRQ
(
gpio_pendown
);
if
(
board_pdata
)
spi_bi
->
platform_data
=
board_pdata
;
spi_register_board_info
(
&
ads7846_spi_board_info
,
1
);
}
#else
void
__init
omap_ads7846_init
(
int
bus_num
,
int
gpio_pendown
,
int
gpio_debounce
,
struct
ads7846_platform_data
*
board_pdata
)
{
}
#endif
#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
static
struct
omap_nand_platform_data
nand_data
=
{
.
dma_channel
=
-
1
,
/* disable DMA in OMAP NAND driver */
};
void
__init
omap_nand_flash_init
(
int
options
,
struct
mtd_partition
*
parts
,
int
nr_parts
)
{
u8
cs
=
0
;
u8
nandcs
=
GPMC_CS_NUM
+
1
;
/* find out the chip-select on which NAND exists */
while
(
cs
<
GPMC_CS_NUM
)
{
u32
ret
=
0
;
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG1
);
if
((
ret
&
0xC00
)
==
0x800
)
{
printk
(
KERN_INFO
"Found NAND on CS%d
\n
"
,
cs
);
if
(
nandcs
>
GPMC_CS_NUM
)
nandcs
=
cs
;
}
cs
++
;
}
if
(
nandcs
>
GPMC_CS_NUM
)
{
printk
(
KERN_INFO
"NAND: Unable to find configuration "
"in GPMC
\n
"
);
return
;
}
if
(
nandcs
<
GPMC_CS_NUM
)
{
nand_data
.
cs
=
nandcs
;
nand_data
.
parts
=
parts
;
nand_data
.
nr_parts
=
nr_parts
;
nand_data
.
options
=
options
;
printk
(
KERN_INFO
"Registering NAND on CS%d
\n
"
,
nandcs
);
if
(
gpmc_nand_init
(
&
nand_data
)
<
0
)
printk
(
KERN_ERR
"Unable to register NAND device
\n
"
);
}
}
#else
void
__init
omap_nand_flash_init
(
int
options
,
struct
mtd_partition
*
parts
,
int
nr_parts
)
{
}
#endif
arch/arm/mach-omap2/common-board-devices.h
0 → 100644
浏览文件 @
b08827f4
#ifndef __OMAP_COMMON_BOARD_DEVICES__
#define __OMAP_COMMON_BOARD_DEVICES__
struct
twl4030_platform_data
;
struct
mtd_partition
;
void
omap_pmic_init
(
int
bus
,
u32
clkrate
,
const
char
*
pmic_type
,
int
pmic_irq
,
struct
twl4030_platform_data
*
pmic_data
);
static
inline
void
omap2_pmic_init
(
const
char
*
pmic_type
,
struct
twl4030_platform_data
*
pmic_data
)
{
omap_pmic_init
(
2
,
2600
,
pmic_type
,
INT_24XX_SYS_NIRQ
,
pmic_data
);
}
static
inline
void
omap3_pmic_init
(
const
char
*
pmic_type
,
struct
twl4030_platform_data
*
pmic_data
)
{
omap_pmic_init
(
1
,
2600
,
pmic_type
,
INT_34XX_SYS_NIRQ
,
pmic_data
);
}
static
inline
void
omap4_pmic_init
(
const
char
*
pmic_type
,
struct
twl4030_platform_data
*
pmic_data
)
{
/* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */
omap_pmic_init
(
1
,
400
,
pmic_type
,
OMAP44XX_IRQ_SYS_1N
,
pmic_data
);
}
struct
ads7846_platform_data
;
void
omap_ads7846_init
(
int
bus_num
,
int
gpio_pendown
,
int
gpio_debounce
,
struct
ads7846_platform_data
*
board_pdata
);
void
omap_nand_flash_init
(
int
opts
,
struct
mtd_partition
*
parts
,
int
n_parts
);
#endif
/* __OMAP_COMMON_BOARD_DEVICES__ */
arch/arm/mach-omap2/gpmc-smc91x.c
浏览文件 @
b08827f4
...
@@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data)
...
@@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data)
goto
free1
;
goto
free1
;
}
}
if
(
gpio_request
(
gpmc_cfg
->
gpio_irq
,
"SMC91X irq"
)
<
0
)
if
(
gpio_request
_one
(
gpmc_cfg
->
gpio_irq
,
GPIOF_IN
,
"SMC91X irq"
)
<
0
)
goto
free1
;
goto
free1
;
gpio_direction_input
(
gpmc_cfg
->
gpio_irq
);
gpmc_smc91x_resources
[
1
].
start
=
gpio_to_irq
(
gpmc_cfg
->
gpio_irq
);
gpmc_smc91x_resources
[
1
].
start
=
gpio_to_irq
(
gpmc_cfg
->
gpio_irq
);
if
(
gpmc_cfg
->
gpio_pwrdwn
)
{
if
(
gpmc_cfg
->
gpio_pwrdwn
)
{
ret
=
gpio_request
(
gpmc_cfg
->
gpio_pwrdwn
,
"SMC91X powerdown"
);
ret
=
gpio_request_one
(
gpmc_cfg
->
gpio_pwrdwn
,
GPIOF_OUT_INIT_LOW
,
"SMC91X powerdown"
);
if
(
ret
)
if
(
ret
)
goto
free2
;
goto
free2
;
gpio_direction_output
(
gpmc_cfg
->
gpio_pwrdwn
,
0
);
}
}
if
(
gpmc_cfg
->
gpio_reset
)
{
if
(
gpmc_cfg
->
gpio_reset
)
{
ret
=
gpio_request
(
gpmc_cfg
->
gpio_reset
,
"SMC91X reset"
);
ret
=
gpio_request_one
(
gpmc_cfg
->
gpio_reset
,
GPIOF_OUT_INIT_LOW
,
"SMC91X reset"
);
if
(
ret
)
if
(
ret
)
goto
free3
;
goto
free3
;
gpio_direction_output
(
gpmc_cfg
->
gpio_reset
,
0
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
1
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
1
);
msleep
(
100
);
msleep
(
100
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
0
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
0
);
...
...
arch/arm/mach-omap2/gpmc-smsc911x.c
浏览文件 @
b08827f4
...
@@ -10,6 +10,7 @@
...
@@ -10,6 +10,7 @@
* it under the terms of the GNU General Public License version 2 as
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
* published by the Free Software Foundation.
*/
*/
#define pr_fmt(fmt) "%s: " fmt, __func__
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
...
@@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = {
...
@@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = {
.
flags
=
IORESOURCE_MEM
,
.
flags
=
IORESOURCE_MEM
,
},
},
[
1
]
=
{
[
1
]
=
{
.
flags
=
IORESOURCE_IRQ
,
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
},
};
};
...
@@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {
...
@@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {
.
flags
=
SMSC911X_USE_16BIT
,
.
flags
=
SMSC911X_USE_16BIT
,
};
};
static
struct
platform_device
gpmc_smsc911x_device
=
{
.
name
=
"smsc911x"
,
.
id
=
-
1
,
.
num_resources
=
ARRAY_SIZE
(
gpmc_smsc911x_resources
),
.
resource
=
gpmc_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
gpmc_smsc911x_config
,
},
};
/*
/*
* Initialize smsc911x device connected to the GPMC. Note that we
* Initialize smsc911x device connected to the GPMC. Note that we
* assume that pin multiplexing is done in the board-*.c file,
* assume that pin multiplexing is done in the board-*.c file,
...
@@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = {
...
@@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = {
*/
*/
void
__init
gpmc_smsc911x_init
(
struct
omap_smsc911x_platform_data
*
board_data
)
void
__init
gpmc_smsc911x_init
(
struct
omap_smsc911x_platform_data
*
board_data
)
{
{
struct
platform_device
*
pdev
;
unsigned
long
cs_mem_base
;
unsigned
long
cs_mem_base
;
int
ret
;
int
ret
;
gpmc_cfg
=
board_data
;
gpmc_cfg
=
board_data
;
if
(
gpmc_cs_request
(
gpmc_cfg
->
cs
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
if
(
gpmc_cs_request
(
gpmc_cfg
->
cs
,
SZ_16M
,
&
cs_mem_base
)
<
0
)
{
pr
intk
(
KERN_ERR
"Failed to request GPMC mem for smsc911x
\n
"
);
pr
_err
(
"Failed to request GPMC mem region
\n
"
);
return
;
return
;
}
}
gpmc_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
gpmc_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
gpmc_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
gpmc_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
if
(
gpio_request
(
gpmc_cfg
->
gpio_irq
,
"smsc911x irq"
)
<
0
)
{
if
(
gpio_request_one
(
gpmc_cfg
->
gpio_irq
,
GPIOF_IN
,
"smsc911x irq"
))
{
printk
(
KERN_ERR
"Failed to request GPIO%d for smsc911x IRQ
\n
"
,
pr_err
(
"Failed to request IRQ GPIO%d
\n
"
,
gpmc_cfg
->
gpio_irq
);
gpmc_cfg
->
gpio_irq
);
goto
free1
;
goto
free1
;
}
}
gpio_direction_input
(
gpmc_cfg
->
gpio_irq
);
gpmc_smsc911x_resources
[
1
].
start
=
gpio_to_irq
(
gpmc_cfg
->
gpio_irq
);
gpmc_smsc911x_resources
[
1
].
start
=
gpio_to_irq
(
gpmc_cfg
->
gpio_irq
);
gpmc_smsc911x_resources
[
1
].
flags
|=
(
gpmc_cfg
->
flags
&
IRQF_TRIGGER_MASK
);
if
(
gpio_is_valid
(
gpmc_cfg
->
gpio_reset
))
{
if
(
gpio_is_valid
(
gpmc_cfg
->
gpio_reset
))
{
ret
=
gpio_request
(
gpmc_cfg
->
gpio_reset
,
"smsc911x reset"
);
ret
=
gpio_request_one
(
gpmc_cfg
->
gpio_reset
,
GPIOF_OUT_INIT_HIGH
,
"smsc911x reset"
);
if
(
ret
)
{
if
(
ret
)
{
pr
intk
(
KERN_ERR
"Failed to request GPIO%d for smsc911x reset
\n
"
,
pr
_err
(
"Failed to request reset GPIO%d
\n
"
,
gpmc_cfg
->
gpio_reset
);
gpmc_cfg
->
gpio_reset
);
goto
free2
;
goto
free2
;
}
}
gpio_direction_output
(
gpmc_cfg
->
gpio_reset
,
1
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
0
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
0
);
msleep
(
100
);
msleep
(
100
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
1
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
1
);
}
}
if
(
platform_device_register
(
&
gpmc_smsc911x_device
)
<
0
)
{
if
(
gpmc_cfg
->
flags
)
printk
(
KERN_ERR
"Unable to register smsc911x device
\n
"
);
gpmc_smsc911x_config
.
flags
=
gpmc_cfg
->
flags
;
pdev
=
platform_device_register_resndata
(
NULL
,
"smsc911x"
,
gpmc_cfg
->
id
,
gpmc_smsc911x_resources
,
ARRAY_SIZE
(
gpmc_smsc911x_resources
),
&
gpmc_smsc911x_config
,
sizeof
(
gpmc_smsc911x_config
));
if
(
!
pdev
)
{
pr_err
(
"Unable to register platform device
\n
"
);
gpio_free
(
gpmc_cfg
->
gpio_reset
);
gpio_free
(
gpmc_cfg
->
gpio_reset
);
goto
free2
;
goto
free2
;
}
}
...
@@ -109,5 +103,5 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
...
@@ -109,5 +103,5 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
free1:
free1:
gpmc_cs_free
(
gpmc_cfg
->
cs
);
gpmc_cs_free
(
gpmc_cfg
->
cs
);
pr
intk
(
KERN_ERR
"Could not initialize smsc911x
\n
"
);
pr
_err
(
"Could not initialize smsc911x device
\n
"
);
}
}
arch/arm/mach-omap2/irq.c
浏览文件 @
b08827f4
...
@@ -73,83 +73,18 @@ static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
...
@@ -73,83 +73,18 @@ static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
return
__raw_readl
(
bank
->
base_reg
+
reg
);
return
__raw_readl
(
bank
->
base_reg
+
reg
);
}
}
static
int
previous_irq
;
/*
* On 34xx we can get occasional spurious interrupts if the ack from
* an interrupt handler does not get posted before we unmask. Warn about
* the interrupt handlers that need to flush posted writes.
*/
static
int
omap_check_spurious
(
unsigned
int
irq
)
{
u32
sir
,
spurious
;
sir
=
intc_bank_read_reg
(
&
irq_banks
[
0
],
INTC_SIR
);
spurious
=
sir
>>
7
;
if
(
spurious
)
{
printk
(
KERN_WARNING
"Spurious irq %i: 0x%08x, please flush "
"posted write for irq %i
\n
"
,
irq
,
sir
,
previous_irq
);
return
spurious
;
}
return
0
;
}
/* XXX: FIQ and additional INTC support (only MPU at the moment) */
/* XXX: FIQ and additional INTC support (only MPU at the moment) */
static
void
omap_ack_irq
(
struct
irq_data
*
d
)
static
void
omap_ack_irq
(
struct
irq_data
*
d
)
{
{
intc_bank_write_reg
(
0x1
,
&
irq_banks
[
0
],
INTC_CONTROL
);
intc_bank_write_reg
(
0x1
,
&
irq_banks
[
0
],
INTC_CONTROL
);
}
}
static
void
omap_mask_irq
(
struct
irq_data
*
d
)
{
unsigned
int
irq
=
d
->
irq
;
int
offset
=
irq
&
(
~
(
IRQ_BITS_PER_REG
-
1
));
if
(
cpu_is_omap34xx
()
&&
!
cpu_is_ti816x
())
{
int
spurious
=
0
;
/*
* INT_34XX_GPT12_IRQ is also the spurious irq. Maybe because
* it is the highest irq number?
*/
if
(
irq
==
INT_34XX_GPT12_IRQ
)
spurious
=
omap_check_spurious
(
irq
);
if
(
!
spurious
)
previous_irq
=
irq
;
}
irq
&=
(
IRQ_BITS_PER_REG
-
1
);
intc_bank_write_reg
(
1
<<
irq
,
&
irq_banks
[
0
],
INTC_MIR_SET0
+
offset
);
}
static
void
omap_unmask_irq
(
struct
irq_data
*
d
)
{
unsigned
int
irq
=
d
->
irq
;
int
offset
=
irq
&
(
~
(
IRQ_BITS_PER_REG
-
1
));
irq
&=
(
IRQ_BITS_PER_REG
-
1
);
intc_bank_write_reg
(
1
<<
irq
,
&
irq_banks
[
0
],
INTC_MIR_CLEAR0
+
offset
);
}
static
void
omap_mask_ack_irq
(
struct
irq_data
*
d
)
static
void
omap_mask_ack_irq
(
struct
irq_data
*
d
)
{
{
omap_mask_irq
(
d
);
irq_gc_mask_disable_reg
(
d
);
omap_ack_irq
(
d
);
omap_ack_irq
(
d
);
}
}
static
struct
irq_chip
omap_irq_chip
=
{
.
name
=
"INTC"
,
.
irq_ack
=
omap_mask_ack_irq
,
.
irq_mask
=
omap_mask_irq
,
.
irq_unmask
=
omap_unmask_irq
,
};
static
void
__init
omap_irq_bank_init_one
(
struct
omap_irq_bank
*
bank
)
static
void
__init
omap_irq_bank_init_one
(
struct
omap_irq_bank
*
bank
)
{
{
unsigned
long
tmp
;
unsigned
long
tmp
;
...
@@ -186,11 +121,31 @@ int omap_irq_pending(void)
...
@@ -186,11 +121,31 @@ int omap_irq_pending(void)
return
0
;
return
0
;
}
}
static
__init
void
omap_alloc_gc
(
void
__iomem
*
base
,
unsigned
int
irq_start
,
unsigned
int
num
)
{
struct
irq_chip_generic
*
gc
;
struct
irq_chip_type
*
ct
;
gc
=
irq_alloc_generic_chip
(
"INTC"
,
1
,
irq_start
,
base
,
handle_level_irq
);
ct
=
gc
->
chip_types
;
ct
->
chip
.
irq_ack
=
omap_mask_ack_irq
;
ct
->
chip
.
irq_mask
=
irq_gc_mask_disable_reg
;
ct
->
chip
.
irq_unmask
=
irq_gc_unmask_enable_reg
;
ct
->
regs
.
ack
=
INTC_CONTROL
;
ct
->
regs
.
enable
=
INTC_MIR_CLEAR0
;
ct
->
regs
.
disable
=
INTC_MIR_SET0
;
irq_setup_generic_chip
(
gc
,
IRQ_MSK
(
num
),
IRQ_GC_INIT_MASK_CACHE
,
IRQ_NOREQUEST
|
IRQ_NOPROBE
,
0
);
}
void
__init
omap_init_irq
(
void
)
void
__init
omap_init_irq
(
void
)
{
{
unsigned
long
nr_of_irqs
=
0
;
unsigned
long
nr_of_irqs
=
0
;
unsigned
int
nr_banks
=
0
;
unsigned
int
nr_banks
=
0
;
int
i
;
int
i
,
j
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
irq_banks
);
i
++
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
irq_banks
);
i
++
)
{
unsigned
long
base
=
0
;
unsigned
long
base
=
0
;
...
@@ -215,17 +170,15 @@ void __init omap_init_irq(void)
...
@@ -215,17 +170,15 @@ void __init omap_init_irq(void)
omap_irq_bank_init_one
(
bank
);
omap_irq_bank_init_one
(
bank
);
for
(
i
=
0
,
j
=
0
;
i
<
bank
->
nr_irqs
;
i
+=
32
,
j
+=
0x20
)
omap_alloc_gc
(
bank
->
base_reg
+
j
,
i
,
32
);
nr_of_irqs
+=
bank
->
nr_irqs
;
nr_of_irqs
+=
bank
->
nr_irqs
;
nr_banks
++
;
nr_banks
++
;
}
}
printk
(
KERN_INFO
"Total of %ld interrupts on %d active controller%s
\n
"
,
printk
(
KERN_INFO
"Total of %ld interrupts on %d active controller%s
\n
"
,
nr_of_irqs
,
nr_banks
,
nr_banks
>
1
?
"s"
:
""
);
nr_of_irqs
,
nr_banks
,
nr_banks
>
1
?
"s"
:
""
);
for
(
i
=
0
;
i
<
nr_of_irqs
;
i
++
)
{
irq_set_chip_and_handler
(
i
,
&
omap_irq_chip
,
handle_level_irq
);
set_irq_flags
(
i
,
IRQF_VALID
);
}
}
}
#ifdef CONFIG_ARCH_OMAP3
#ifdef CONFIG_ARCH_OMAP3
...
...
arch/arm/mach-omap2/omap_l3_noc.c
浏览文件 @
b08827f4
...
@@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
...
@@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
char
*
source_name
;
char
*
source_name
;
/* Get the Type of interrupt */
/* Get the Type of interrupt */
if
(
irq
==
l3
->
app_irq
)
inttype
=
irq
==
l3
->
app_irq
?
L3_APPLICATION_ERROR
:
L3_DEBUG_ERROR
;
inttype
=
L3_APPLICATION_ERROR
;
else
inttype
=
L3_DEBUG_ERROR
;
for
(
i
=
0
;
i
<
L3_MODULES
;
i
++
)
{
for
(
i
=
0
;
i
<
L3_MODULES
;
i
++
)
{
/*
/*
...
@@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
...
@@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
err_src
=
j
;
err_src
=
j
;
/* Read the stderrlog_main_source from clk domain */
/* Read the stderrlog_main_source from clk domain */
std_err_main_addr
=
base
+
(
*
(
l3_targ
[
i
]
+
err_src
)
);
std_err_main_addr
=
base
+
*
(
l3_targ
[
i
]
+
err_src
);
std_err_main
=
readl
(
std_err_main_addr
);
std_err_main
=
readl
(
std_err_main_addr
);
switch
(
(
std_err_main
&
CUSTOM_ERROR
)
)
{
switch
(
std_err_main
&
CUSTOM_ERROR
)
{
case
STANDARD_ERROR
:
case
STANDARD_ERROR
:
source_name
=
source_name
=
l3_targ_stderrlog_main_name
[
i
][
err_src
];
l3_targ_stderrlog_main_name
[
i
][
err_src
];
...
@@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
...
@@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
l3
=
kzalloc
(
sizeof
(
*
l3
),
GFP_KERNEL
);
l3
=
kzalloc
(
sizeof
(
*
l3
),
GFP_KERNEL
);
if
(
!
l3
)
if
(
!
l3
)
ret
=
-
ENOMEM
;
ret
urn
-
ENOMEM
;
platform_set_drvdata
(
pdev
,
l3
);
platform_set_drvdata
(
pdev
,
l3
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 0
\n
"
);
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 0
\n
"
);
ret
=
-
ENODEV
;
ret
=
-
ENODEV
;
goto
err
1
;
goto
err
0
;
}
}
l3
->
l3_base
[
0
]
=
ioremap
(
res
->
start
,
resource_size
(
res
));
l3
->
l3_base
[
0
]
=
ioremap
(
res
->
start
,
resource_size
(
res
));
if
(
!
(
l3
->
l3_base
[
0
])
)
{
if
(
!
l3
->
l3_base
[
0
]
)
{
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err
2
;
goto
err
0
;
}
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
1
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
1
);
if
(
!
res
)
{
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 1
\n
"
);
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 1
\n
"
);
ret
=
-
ENODEV
;
ret
=
-
ENODEV
;
goto
err
3
;
goto
err
1
;
}
}
l3
->
l3_base
[
1
]
=
ioremap
(
res
->
start
,
resource_size
(
res
));
l3
->
l3_base
[
1
]
=
ioremap
(
res
->
start
,
resource_size
(
res
));
if
(
!
(
l3
->
l3_base
[
1
])
)
{
if
(
!
l3
->
l3_base
[
1
]
)
{
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err
4
;
goto
err
1
;
}
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
2
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
2
);
if
(
!
res
)
{
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 2
\n
"
);
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 2
\n
"
);
ret
=
-
ENODEV
;
ret
=
-
ENODEV
;
goto
err
5
;
goto
err
2
;
}
}
l3
->
l3_base
[
2
]
=
ioremap
(
res
->
start
,
resource_size
(
res
));
l3
->
l3_base
[
2
]
=
ioremap
(
res
->
start
,
resource_size
(
res
));
if
(
!
(
l3
->
l3_base
[
2
])
)
{
if
(
!
l3
->
l3_base
[
2
]
)
{
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err
6
;
goto
err
2
;
}
}
/*
/*
...
@@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
...
@@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
if
(
ret
)
{
if
(
ret
)
{
pr_crit
(
"L3: request_irq failed to register for 0x%x
\n
"
,
pr_crit
(
"L3: request_irq failed to register for 0x%x
\n
"
,
OMAP44XX_IRQ_L3_DBG
);
OMAP44XX_IRQ_L3_DBG
);
goto
err
7
;
goto
err
3
;
}
}
l3
->
debug_irq
=
irq
;
l3
->
debug_irq
=
irq
;
...
@@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
...
@@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
if
(
ret
)
{
if
(
ret
)
{
pr_crit
(
"L3: request_irq failed to register for 0x%x
\n
"
,
pr_crit
(
"L3: request_irq failed to register for 0x%x
\n
"
,
OMAP44XX_IRQ_L3_APP
);
OMAP44XX_IRQ_L3_APP
);
goto
err
8
;
goto
err
4
;
}
}
l3
->
app_irq
=
irq
;
l3
->
app_irq
=
irq
;
goto
err0
;
return
0
;
err8:
err7:
iounmap
(
l3
->
l3_base
[
2
]);
err6:
err5:
iounmap
(
l3
->
l3_base
[
1
]);
err4:
err4:
free_irq
(
l3
->
debug_irq
,
l3
);
err3:
err3:
iounmap
(
l3
->
l3_base
[
0
]);
iounmap
(
l3
->
l3_base
[
2
]);
err2:
err2:
iounmap
(
l3
->
l3_base
[
1
]);
err1:
err1:
kfree
(
l3
);
iounmap
(
l3
->
l3_base
[
0
]
);
err0:
err0:
kfree
(
l3
);
return
ret
;
return
ret
;
}
}
...
...
arch/arm/mach-omap2/omap_l3_smx.c
浏览文件 @
b08827f4
...
@@ -155,7 +155,7 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
...
@@ -155,7 +155,7 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
u8
multi
=
error
&
L3_ERROR_LOG_MULTI
;
u8
multi
=
error
&
L3_ERROR_LOG_MULTI
;
u32
address
=
omap3_l3_decode_addr
(
error_addr
);
u32
address
=
omap3_l3_decode_addr
(
error_addr
);
WARN
(
true
,
"%s
Error
seen by %s %s at address %x
\n
"
,
WARN
(
true
,
"%s seen by %s %s at address %x
\n
"
,
omap3_l3_code_string
(
code
),
omap3_l3_code_string
(
code
),
omap3_l3_initiator_string
(
initid
),
omap3_l3_initiator_string
(
initid
),
multi
?
"Multiple Errors"
:
""
,
multi
?
"Multiple Errors"
:
""
,
...
@@ -167,21 +167,15 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
...
@@ -167,21 +167,15 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
static
irqreturn_t
omap3_l3_app_irq
(
int
irq
,
void
*
_l3
)
static
irqreturn_t
omap3_l3_app_irq
(
int
irq
,
void
*
_l3
)
{
{
struct
omap3_l3
*
l3
=
_l3
;
struct
omap3_l3
*
l3
=
_l3
;
u64
status
,
clear
;
u64
status
,
clear
;
u64
error
;
u64
error
;
u64
error_addr
;
u64
error_addr
;
u64
err_source
=
0
;
u64
err_source
=
0
;
void
__iomem
*
base
;
void
__iomem
*
base
;
int
int_type
;
int
int_type
;
irqreturn_t
ret
=
IRQ_NONE
;
irqreturn_t
ret
=
IRQ_NONE
;
if
(
irq
==
l3
->
app_irq
)
int_type
=
irq
==
l3
->
app_irq
?
L3_APPLICATION_ERROR
:
L3_DEBUG_ERROR
;
int_type
=
L3_APPLICATION_ERROR
;
else
int_type
=
L3_DEBUG_ERROR
;
if
(
!
int_type
)
{
if
(
!
int_type
)
{
status
=
omap3_l3_readll
(
l3
->
rt
,
L3_SI_FLAG_STATUS_0
);
status
=
omap3_l3_readll
(
l3
->
rt
,
L3_SI_FLAG_STATUS_0
);
/*
/*
...
@@ -202,7 +196,6 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
...
@@ -202,7 +196,6 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
base
=
l3
->
rt
+
*
(
omap3_l3_bases
[
int_type
]
+
err_source
);
base
=
l3
->
rt
+
*
(
omap3_l3_bases
[
int_type
]
+
err_source
);
error
=
omap3_l3_readll
(
base
,
L3_ERROR_LOG
);
error
=
omap3_l3_readll
(
base
,
L3_ERROR_LOG
);
if
(
error
)
{
if
(
error
)
{
error_addr
=
omap3_l3_readll
(
base
,
L3_ERROR_LOG_ADDR
);
error_addr
=
omap3_l3_readll
(
base
,
L3_ERROR_LOG_ADDR
);
...
@@ -210,9 +203,8 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
...
@@ -210,9 +203,8 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
}
}
/* Clear the status register */
/* Clear the status register */
clear
=
((
L3_AGENT_STATUS_CLEAR_IA
<<
int_type
)
|
clear
=
(
L3_AGENT_STATUS_CLEAR_IA
<<
int_type
)
|
(
L3_AGENT_STATUS_CLEAR_TA
));
L3_AGENT_STATUS_CLEAR_TA
;
omap3_l3_writell
(
base
,
L3_AGENT_STATUS
,
clear
);
omap3_l3_writell
(
base
,
L3_AGENT_STATUS
,
clear
);
/* clear the error log register */
/* clear the error log register */
...
@@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
...
@@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
int
ret
;
int
ret
;
l3
=
kzalloc
(
sizeof
(
*
l3
),
GFP_KERNEL
);
l3
=
kzalloc
(
sizeof
(
*
l3
),
GFP_KERNEL
);
if
(
!
l3
)
{
if
(
!
l3
)
ret
=
-
ENOMEM
;
return
-
ENOMEM
;
goto
err0
;
}
platform_set_drvdata
(
pdev
,
l3
);
platform_set_drvdata
(
pdev
,
l3
);
...
@@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
...
@@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
if
(
!
res
)
{
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource
\n
"
);
dev_err
(
&
pdev
->
dev
,
"couldn't find resource
\n
"
);
ret
=
-
ENODEV
;
ret
=
-
ENODEV
;
goto
err
1
;
goto
err
0
;
}
}
l3
->
rt
=
ioremap
(
res
->
start
,
resource_size
(
res
));
l3
->
rt
=
ioremap
(
res
->
start
,
resource_size
(
res
));
if
(
!
(
l3
->
rt
)
)
{
if
(
!
l3
->
rt
)
{
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err
2
;
goto
err
0
;
}
}
l3
->
debug_irq
=
platform_get_irq
(
pdev
,
0
);
l3
->
debug_irq
=
platform_get_irq
(
pdev
,
0
);
...
@@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
...
@@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
"l3-debug-irq"
,
l3
);
"l3-debug-irq"
,
l3
);
if
(
ret
)
{
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't request debug irq
\n
"
);
dev_err
(
&
pdev
->
dev
,
"couldn't request debug irq
\n
"
);
goto
err
3
;
goto
err
1
;
}
}
l3
->
app_irq
=
platform_get_irq
(
pdev
,
1
);
l3
->
app_irq
=
platform_get_irq
(
pdev
,
1
);
ret
=
request_irq
(
l3
->
app_irq
,
omap3_l3_app_irq
,
ret
=
request_irq
(
l3
->
app_irq
,
omap3_l3_app_irq
,
IRQF_DISABLED
|
IRQF_TRIGGER_RISING
,
IRQF_DISABLED
|
IRQF_TRIGGER_RISING
,
"l3-app-irq"
,
l3
);
"l3-app-irq"
,
l3
);
if
(
ret
)
{
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't request app irq
\n
"
);
dev_err
(
&
pdev
->
dev
,
"couldn't request app irq
\n
"
);
goto
err
4
;
goto
err
2
;
}
}
goto
err
0
;
return
0
;
err4:
err3:
iounmap
(
l3
->
rt
);
err2:
err2:
free_irq
(
l3
->
debug_irq
,
l3
);
err1:
err1:
kfree
(
l3
);
iounmap
(
l3
->
rt
);
err0:
err0:
kfree
(
l3
);
return
ret
;
return
ret
;
}
}
...
...
arch/arm/mach-omap2/pm44xx.c
浏览文件 @
b08827f4
...
@@ -105,13 +105,11 @@ static int __init omap4_pm_init(void)
...
@@ -105,13 +105,11 @@ static int __init omap4_pm_init(void)
pr_err
(
"Power Management for TI OMAP4.
\n
"
);
pr_err
(
"Power Management for TI OMAP4.
\n
"
);
#ifdef CONFIG_PM
ret
=
pwrdm_for_each
(
pwrdms_setup
,
NULL
);
ret
=
pwrdm_for_each
(
pwrdms_setup
,
NULL
);
if
(
ret
)
{
if
(
ret
)
{
pr_err
(
"Failed to setup powerdomains
\n
"
);
pr_err
(
"Failed to setup powerdomains
\n
"
);
goto
err2
;
goto
err2
;
}
}
#endif
#ifdef CONFIG_SUSPEND
#ifdef CONFIG_SUSPEND
suspend_set_ops
(
&
omap_pm_ops
);
suspend_set_ops
(
&
omap_pm_ops
);
...
...
arch/arm/mach-omap2/smartreflex.c
浏览文件 @
b08827f4
...
@@ -847,6 +847,14 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -847,6 +847,14 @@ static int __init omap_sr_probe(struct platform_device *pdev)
goto
err_free_devinfo
;
goto
err_free_devinfo
;
}
}
mem
=
request_mem_region
(
mem
->
start
,
resource_size
(
mem
),
dev_name
(
&
pdev
->
dev
));
if
(
!
mem
)
{
dev_err
(
&
pdev
->
dev
,
"%s: no mem region
\n
"
,
__func__
);
ret
=
-
EBUSY
;
goto
err_free_devinfo
;
}
irq
=
platform_get_resource
(
pdev
,
IORESOURCE_IRQ
,
0
);
irq
=
platform_get_resource
(
pdev
,
IORESOURCE_IRQ
,
0
);
pm_runtime_enable
(
&
pdev
->
dev
);
pm_runtime_enable
(
&
pdev
->
dev
);
...
@@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
ret
=
sr_late_init
(
sr_info
);
ret
=
sr_late_init
(
sr_info
);
if
(
ret
)
{
if
(
ret
)
{
pr_warning
(
"%s: Error in SR late init
\n
"
,
__func__
);
pr_warning
(
"%s: Error in SR late init
\n
"
,
__func__
);
goto
err_release_region
;
return
ret
;
}
}
}
}
...
@@ -896,7 +904,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -896,7 +904,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
vdd_dbg_dir
=
omap_voltage_get_dbgdir
(
sr_info
->
voltdm
);
vdd_dbg_dir
=
omap_voltage_get_dbgdir
(
sr_info
->
voltdm
);
if
(
!
vdd_dbg_dir
)
{
if
(
!
vdd_dbg_dir
)
{
ret
=
-
EINVAL
;
ret
=
-
EINVAL
;
goto
err_
release_region
;
goto
err_
iounmap
;
}
}
sr_info
->
dbg_dir
=
debugfs_create_dir
(
"smartreflex"
,
vdd_dbg_dir
);
sr_info
->
dbg_dir
=
debugfs_create_dir
(
"smartreflex"
,
vdd_dbg_dir
);
...
@@ -904,7 +912,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -904,7 +912,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
dev_err
(
&
pdev
->
dev
,
"%s: Unable to create debugfs directory
\n
"
,
dev_err
(
&
pdev
->
dev
,
"%s: Unable to create debugfs directory
\n
"
,
__func__
);
__func__
);
ret
=
PTR_ERR
(
sr_info
->
dbg_dir
);
ret
=
PTR_ERR
(
sr_info
->
dbg_dir
);
goto
err_
release_region
;
goto
err_
iounmap
;
}
}
(
void
)
debugfs_create_file
(
"autocomp"
,
S_IRUGO
|
S_IWUSR
,
(
void
)
debugfs_create_file
(
"autocomp"
,
S_IRUGO
|
S_IWUSR
,
...
@@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
dev_err
(
&
pdev
->
dev
,
"%s: Unable to create debugfs directory"
dev_err
(
&
pdev
->
dev
,
"%s: Unable to create debugfs directory"
"for n-values
\n
"
,
__func__
);
"for n-values
\n
"
,
__func__
);
ret
=
PTR_ERR
(
nvalue_dir
);
ret
=
PTR_ERR
(
nvalue_dir
);
goto
err_
release_region
;
goto
err_
debugfs
;
}
}
omap_voltage_get_volttable
(
sr_info
->
voltdm
,
&
volt_data
);
omap_voltage_get_volttable
(
sr_info
->
voltdm
,
&
volt_data
);
...
@@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
"entries for n-values
\n
"
,
"entries for n-values
\n
"
,
__func__
,
sr_info
->
voltdm
->
name
);
__func__
,
sr_info
->
voltdm
->
name
);
ret
=
-
ENODATA
;
ret
=
-
ENODATA
;
goto
err_
release_region
;
goto
err_
debugfs
;
}
}
for
(
i
=
0
;
i
<
sr_info
->
nvalue_count
;
i
++
)
{
for
(
i
=
0
;
i
<
sr_info
->
nvalue_count
;
i
++
)
{
...
@@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev)
...
@@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev)
return
ret
;
return
ret
;
err_debugfs:
debugfs_remove_recursive
(
sr_info
->
dbg_dir
);
err_iounmap:
list_del
(
&
sr_info
->
node
);
iounmap
(
sr_info
->
base
);
err_release_region:
err_release_region:
release_mem_region
(
mem
->
start
,
resource_size
(
mem
));
release_mem_region
(
mem
->
start
,
resource_size
(
mem
));
err_free_devinfo:
err_free_devinfo:
...
...
arch/arm/mach-omap2/usb-musb.c
浏览文件 @
b08827f4
...
@@ -108,7 +108,13 @@ static void usb_musb_mux_init(struct omap_musb_board_data *board_data)
...
@@ -108,7 +108,13 @@ static void usb_musb_mux_init(struct omap_musb_board_data *board_data)
}
}
}
}
void
__init
usb_musb_init
(
struct
omap_musb_board_data
*
board_data
)
static
struct
omap_musb_board_data
musb_default_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
void
__init
usb_musb_init
(
struct
omap_musb_board_data
*
musb_board_data
)
{
{
struct
omap_hwmod
*
oh
;
struct
omap_hwmod
*
oh
;
struct
omap_device
*
od
;
struct
omap_device
*
od
;
...
@@ -116,6 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
...
@@ -116,6 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
struct
device
*
dev
;
struct
device
*
dev
;
int
bus_id
=
-
1
;
int
bus_id
=
-
1
;
const
char
*
oh_name
,
*
name
;
const
char
*
oh_name
,
*
name
;
struct
omap_musb_board_data
*
board_data
;
if
(
musb_board_data
)
board_data
=
musb_board_data
;
else
board_data
=
&
musb_default_board_data
;
if
(
cpu_is_omap3517
()
||
cpu_is_omap3505
())
{
if
(
cpu_is_omap3517
()
||
cpu_is_omap3505
())
{
}
else
if
(
cpu_is_omap44xx
())
{
}
else
if
(
cpu_is_omap44xx
())
{
...
...
arch/arm/mach-omap2/usb-tusb6010.c
浏览文件 @
b08827f4
...
@@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,
...
@@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,
);
);
/* IRQ */
/* IRQ */
status
=
gpio_request
(
irq
,
"TUSB6010 irq"
);
status
=
gpio_request
_one
(
irq
,
GPIOF_IN
,
"TUSB6010 irq"
);
if
(
status
<
0
)
{
if
(
status
<
0
)
{
printk
(
error
,
3
,
status
);
printk
(
error
,
3
,
status
);
return
status
;
return
status
;
}
}
gpio_direction_input
(
irq
);
tusb_resources
[
2
].
start
=
irq
+
IH_GPIO_BASE
;
tusb_resources
[
2
].
start
=
irq
+
IH_GPIO_BASE
;
/* set up memory timings ... can speed them up later */
/* set up memory timings ... can speed them up later */
...
...
arch/arm/mach-omap2/voltage.c
浏览文件 @
b08827f4
...
@@ -148,7 +148,6 @@ static int vp_volt_debug_get(void *data, u64 *val)
...
@@ -148,7 +148,6 @@ static int vp_volt_debug_get(void *data, u64 *val)
}
}
vsel
=
vdd
->
read_reg
(
prm_mod_offs
,
vdd
->
vp_data
->
voltage
);
vsel
=
vdd
->
read_reg
(
prm_mod_offs
,
vdd
->
vp_data
->
voltage
);
pr_notice
(
"curr_vsel = %x
\n
"
,
vsel
);
if
(
!
vdd
->
pmic_info
->
vsel_to_uv
)
{
if
(
!
vdd
->
pmic_info
->
vsel_to_uv
)
{
pr_warning
(
"PMIC function to convert vsel to voltage"
pr_warning
(
"PMIC function to convert vsel to voltage"
...
...
arch/arm/plat-omap/include/plat/gpmc-smsc911x.h
浏览文件 @
b08827f4
...
@@ -14,14 +14,14 @@
...
@@ -14,14 +14,14 @@
#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__
#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__
struct
omap_smsc911x_platform_data
{
struct
omap_smsc911x_platform_data
{
int
id
;
int
cs
;
int
cs
;
int
gpio_irq
;
int
gpio_irq
;
int
gpio_reset
;
int
gpio_reset
;
u32
flags
;
u32
flags
;
};
};
#if defined(CONFIG_SMSC911X) || \
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
defined(CONFIG_SMSC911X_MODULE)
extern
void
gpmc_smsc911x_init
(
struct
omap_smsc911x_platform_data
*
d
);
extern
void
gpmc_smsc911x_init
(
struct
omap_smsc911x_platform_data
*
d
);
...
...
arch/arm/plat-omap/include/plat/uncompress.h
浏览文件 @
b08827f4
...
@@ -129,7 +129,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id)
...
@@ -129,7 +129,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id)
DEBUG_LL_OMAP1
(
3
,
sx1
);
DEBUG_LL_OMAP1
(
3
,
sx1
);
/* omap2 based boards using UART1 */
/* omap2 based boards using UART1 */
DEBUG_LL_OMAP2
(
1
,
omap2evm
);
DEBUG_LL_OMAP2
(
1
,
omap_2430sdp
);
DEBUG_LL_OMAP2
(
1
,
omap_2430sdp
);
DEBUG_LL_OMAP2
(
1
,
omap_apollon
);
DEBUG_LL_OMAP2
(
1
,
omap_apollon
);
DEBUG_LL_OMAP2
(
1
,
omap_h4
);
DEBUG_LL_OMAP2
(
1
,
omap_h4
);
...
...
arch/arm/plat-omap/iommu.c
浏览文件 @
b08827f4
...
@@ -793,6 +793,8 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
...
@@ -793,6 +793,8 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
clk_enable
(
obj
->
clk
);
clk_enable
(
obj
->
clk
);
errs
=
iommu_report_fault
(
obj
,
&
da
);
errs
=
iommu_report_fault
(
obj
,
&
da
);
clk_disable
(
obj
->
clk
);
clk_disable
(
obj
->
clk
);
if
(
errs
==
0
)
return
IRQ_HANDLED
;
/* Fault callback or TLB/PTE Dynamic loading */
/* Fault callback or TLB/PTE Dynamic loading */
if
(
obj
->
isr
&&
!
obj
->
isr
(
obj
,
da
,
errs
,
obj
->
isr_priv
))
if
(
obj
->
isr
&&
!
obj
->
isr
(
obj
,
da
,
errs
,
obj
->
isr_priv
))
...
...
drivers/video/omap/Makefile
浏览文件 @
b08827f4
...
@@ -30,7 +30,6 @@ objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o
...
@@ -30,7 +30,6 @@ objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o
objs-y$(CONFIG_MACH_OMAP_2430SDP)
+=
lcd_2430sdp.o
objs-y$(CONFIG_MACH_OMAP_2430SDP)
+=
lcd_2430sdp.o
objs-y$(CONFIG_MACH_OMAP_3430SDP)
+=
lcd_2430sdp.o
objs-y$(CONFIG_MACH_OMAP_3430SDP)
+=
lcd_2430sdp.o
objs-y$(CONFIG_MACH_OMAP_LDP)
+=
lcd_ldp.o
objs-y$(CONFIG_MACH_OMAP_LDP)
+=
lcd_ldp.o
objs-y$(CONFIG_MACH_OMAP2EVM)
+=
lcd_omap2evm.o
objs-y$(CONFIG_MACH_OMAP3EVM)
+=
lcd_omap3evm.o
objs-y$(CONFIG_MACH_OMAP3EVM)
+=
lcd_omap3evm.o
objs-y$(CONFIG_MACH_OMAP3_BEAGLE)
+=
lcd_omap3beagle.o
objs-y$(CONFIG_MACH_OMAP3_BEAGLE)
+=
lcd_omap3beagle.o
objs-y$(CONFIG_FB_OMAP_LCD_MIPID)
+=
lcd_mipid.o
objs-y$(CONFIG_FB_OMAP_LCD_MIPID)
+=
lcd_mipid.o
...
...
drivers/video/omap/lcd_omap2evm.c
已删除
100644 → 0
浏览文件 @
75c0b3b4
/*
* LCD panel support for the MISTRAL OMAP2EVM board
*
* Author: Arun C <arunedarath@mistralsolutions.com>
*
* Derived from drivers/video/omap/lcd_omap3evm.c
* Derived from drivers/video/omap/lcd-apollon.c
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/i2c/twl.h>
#include <plat/mux.h>
#include <asm/mach-types.h>
#include "omapfb.h"
#define LCD_PANEL_ENABLE_GPIO 154
#define LCD_PANEL_LR 128
#define LCD_PANEL_UD 129
#define LCD_PANEL_INI 152
#define LCD_PANEL_QVGA 148
#define LCD_PANEL_RESB 153
#define TWL_LED_LEDEN 0x00
#define TWL_PWMA_PWMAON 0x00
#define TWL_PWMA_PWMAOFF 0x01
static
unsigned
int
bklight_level
;
static
int
omap2evm_panel_init
(
struct
lcd_panel
*
panel
,
struct
omapfb_device
*
fbdev
)
{
gpio_request
(
LCD_PANEL_ENABLE_GPIO
,
"LCD enable"
);
gpio_request
(
LCD_PANEL_LR
,
"LCD lr"
);
gpio_request
(
LCD_PANEL_UD
,
"LCD ud"
);
gpio_request
(
LCD_PANEL_INI
,
"LCD ini"
);
gpio_request
(
LCD_PANEL_QVGA
,
"LCD qvga"
);
gpio_request
(
LCD_PANEL_RESB
,
"LCD resb"
);
gpio_direction_output
(
LCD_PANEL_ENABLE_GPIO
,
1
);
gpio_direction_output
(
LCD_PANEL_RESB
,
1
);
gpio_direction_output
(
LCD_PANEL_INI
,
1
);
gpio_direction_output
(
LCD_PANEL_QVGA
,
0
);
gpio_direction_output
(
LCD_PANEL_LR
,
1
);
gpio_direction_output
(
LCD_PANEL_UD
,
1
);
twl_i2c_write_u8
(
TWL4030_MODULE_LED
,
0x11
,
TWL_LED_LEDEN
);
twl_i2c_write_u8
(
TWL4030_MODULE_PWMA
,
0x01
,
TWL_PWMA_PWMAON
);
twl_i2c_write_u8
(
TWL4030_MODULE_PWMA
,
0x02
,
TWL_PWMA_PWMAOFF
);
bklight_level
=
100
;
return
0
;
}
static
void
omap2evm_panel_cleanup
(
struct
lcd_panel
*
panel
)
{
gpio_free
(
LCD_PANEL_RESB
);
gpio_free
(
LCD_PANEL_QVGA
);
gpio_free
(
LCD_PANEL_INI
);
gpio_free
(
LCD_PANEL_UD
);
gpio_free
(
LCD_PANEL_LR
);
gpio_free
(
LCD_PANEL_ENABLE_GPIO
);
}
static
int
omap2evm_panel_enable
(
struct
lcd_panel
*
panel
)
{
gpio_set_value
(
LCD_PANEL_ENABLE_GPIO
,
0
);
return
0
;
}
static
void
omap2evm_panel_disable
(
struct
lcd_panel
*
panel
)
{
gpio_set_value
(
LCD_PANEL_ENABLE_GPIO
,
1
);
}
static
unsigned
long
omap2evm_panel_get_caps
(
struct
lcd_panel
*
panel
)
{
return
0
;
}
static
int
omap2evm_bklight_setlevel
(
struct
lcd_panel
*
panel
,
unsigned
int
level
)
{
u8
c
;
if
((
level
>=
0
)
&&
(
level
<=
100
))
{
c
=
(
125
*
(
100
-
level
))
/
100
+
2
;
twl_i2c_write_u8
(
TWL4030_MODULE_PWMA
,
c
,
TWL_PWMA_PWMAOFF
);
bklight_level
=
level
;
}
return
0
;
}
static
unsigned
int
omap2evm_bklight_getlevel
(
struct
lcd_panel
*
panel
)
{
return
bklight_level
;
}
static
unsigned
int
omap2evm_bklight_getmaxlevel
(
struct
lcd_panel
*
panel
)
{
return
100
;
}
struct
lcd_panel
omap2evm_panel
=
{
.
name
=
"omap2evm"
,
.
config
=
OMAP_LCDC_PANEL_TFT
|
OMAP_LCDC_INV_VSYNC
|
OMAP_LCDC_INV_HSYNC
,
.
bpp
=
16
,
.
data_lines
=
18
,
.
x_res
=
480
,
.
y_res
=
640
,
.
hsw
=
3
,
.
hfp
=
0
,
.
hbp
=
28
,
.
vsw
=
2
,
.
vfp
=
1
,
.
vbp
=
0
,
.
pixel_clock
=
20000
,
.
init
=
omap2evm_panel_init
,
.
cleanup
=
omap2evm_panel_cleanup
,
.
enable
=
omap2evm_panel_enable
,
.
disable
=
omap2evm_panel_disable
,
.
get_caps
=
omap2evm_panel_get_caps
,
.
set_bklight_level
=
omap2evm_bklight_setlevel
,
.
get_bklight_level
=
omap2evm_bklight_getlevel
,
.
get_bklight_max
=
omap2evm_bklight_getmaxlevel
,
};
static
int
omap2evm_panel_probe
(
struct
platform_device
*
pdev
)
{
omapfb_register_panel
(
&
omap2evm_panel
);
return
0
;
}
static
int
omap2evm_panel_remove
(
struct
platform_device
*
pdev
)
{
return
0
;
}
static
int
omap2evm_panel_suspend
(
struct
platform_device
*
pdev
,
pm_message_t
mesg
)
{
return
0
;
}
static
int
omap2evm_panel_resume
(
struct
platform_device
*
pdev
)
{
return
0
;
}
struct
platform_driver
omap2evm_panel_driver
=
{
.
probe
=
omap2evm_panel_probe
,
.
remove
=
omap2evm_panel_remove
,
.
suspend
=
omap2evm_panel_suspend
,
.
resume
=
omap2evm_panel_resume
,
.
driver
=
{
.
name
=
"omap2evm_lcd"
,
.
owner
=
THIS_MODULE
,
},
};
static
int
__init
omap2evm_panel_drv_init
(
void
)
{
return
platform_driver_register
(
&
omap2evm_panel_driver
);
}
static
void
__exit
omap2evm_panel_drv_exit
(
void
)
{
platform_driver_unregister
(
&
omap2evm_panel_driver
);
}
module_init
(
omap2evm_panel_drv_init
);
module_exit
(
omap2evm_panel_drv_exit
);
include/linux/irq.h
浏览文件 @
b08827f4
...
@@ -53,12 +53,13 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data);
...
@@ -53,12 +53,13 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data);
* Bits which can be modified via irq_set/clear/modify_status_flags()
* Bits which can be modified via irq_set/clear/modify_status_flags()
* IRQ_LEVEL - Interrupt is level type. Will be also
* IRQ_LEVEL - Interrupt is level type. Will be also
* updated in the code when the above trigger
* updated in the code when the above trigger
* bits are modified via set_irq_type()
* bits are modified via
irq_
set_irq_type()
* IRQ_PER_CPU - Mark an interrupt PER_CPU. Will protect
* IRQ_PER_CPU - Mark an interrupt PER_CPU. Will protect
* it from affinity setting
* it from affinity setting
* IRQ_NOPROBE - Interrupt cannot be probed by autoprobing
* IRQ_NOPROBE - Interrupt cannot be probed by autoprobing
* IRQ_NOREQUEST - Interrupt cannot be requested via
* IRQ_NOREQUEST - Interrupt cannot be requested via
* request_irq()
* request_irq()
* IRQ_NOTHREAD - Interrupt cannot be threaded
* IRQ_NOAUTOEN - Interrupt is not automatically enabled in
* IRQ_NOAUTOEN - Interrupt is not automatically enabled in
* request/setup_irq()
* request/setup_irq()
* IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set)
* IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set)
...
@@ -85,6 +86,7 @@ enum {
...
@@ -85,6 +86,7 @@ enum {
IRQ_NO_BALANCING
=
(
1
<<
13
),
IRQ_NO_BALANCING
=
(
1
<<
13
),
IRQ_MOVE_PCNTXT
=
(
1
<<
14
),
IRQ_MOVE_PCNTXT
=
(
1
<<
14
),
IRQ_NESTED_THREAD
=
(
1
<<
15
),
IRQ_NESTED_THREAD
=
(
1
<<
15
),
IRQ_NOTHREAD
=
(
1
<<
16
),
};
};
#define IRQF_MODIFY_MASK \
#define IRQF_MODIFY_MASK \
...
@@ -261,23 +263,6 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
...
@@ -261,23 +263,6 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
* struct irq_chip - hardware interrupt chip descriptor
* struct irq_chip - hardware interrupt chip descriptor
*
*
* @name: name for /proc/interrupts
* @name: name for /proc/interrupts
* @startup: deprecated, replaced by irq_startup
* @shutdown: deprecated, replaced by irq_shutdown
* @enable: deprecated, replaced by irq_enable
* @disable: deprecated, replaced by irq_disable
* @ack: deprecated, replaced by irq_ack
* @mask: deprecated, replaced by irq_mask
* @mask_ack: deprecated, replaced by irq_mask_ack
* @unmask: deprecated, replaced by irq_unmask
* @eoi: deprecated, replaced by irq_eoi
* @end: deprecated, will go away with __do_IRQ()
* @set_affinity: deprecated, replaced by irq_set_affinity
* @retrigger: deprecated, replaced by irq_retrigger
* @set_type: deprecated, replaced by irq_set_type
* @set_wake: deprecated, replaced by irq_wake
* @bus_lock: deprecated, replaced by irq_bus_lock
* @bus_sync_unlock: deprecated, replaced by irq_bus_sync_unlock
*
* @irq_startup: start up the interrupt (defaults to ->enable if NULL)
* @irq_startup: start up the interrupt (defaults to ->enable if NULL)
* @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL)
* @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL)
* @irq_enable: enable the interrupt (defaults to chip->unmask if NULL)
* @irq_enable: enable the interrupt (defaults to chip->unmask if NULL)
...
@@ -295,6 +280,9 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
...
@@ -295,6 +280,9 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
* @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
* @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
* @irq_cpu_online: configure an interrupt source for a secondary CPU
* @irq_cpu_online: configure an interrupt source for a secondary CPU
* @irq_cpu_offline: un-configure an interrupt source for a secondary CPU
* @irq_cpu_offline: un-configure an interrupt source for a secondary CPU
* @irq_suspend: function called from core code on suspend once per chip
* @irq_resume: function called from core code on resume once per chip
* @irq_pm_shutdown: function called from core code on shutdown once per chip
* @irq_print_chip: optional to print special chip info in show_interrupts
* @irq_print_chip: optional to print special chip info in show_interrupts
* @flags: chip specific flags
* @flags: chip specific flags
*
*
...
@@ -324,6 +312,10 @@ struct irq_chip {
...
@@ -324,6 +312,10 @@ struct irq_chip {
void
(
*
irq_cpu_online
)(
struct
irq_data
*
data
);
void
(
*
irq_cpu_online
)(
struct
irq_data
*
data
);
void
(
*
irq_cpu_offline
)(
struct
irq_data
*
data
);
void
(
*
irq_cpu_offline
)(
struct
irq_data
*
data
);
void
(
*
irq_suspend
)(
struct
irq_data
*
data
);
void
(
*
irq_resume
)(
struct
irq_data
*
data
);
void
(
*
irq_pm_shutdown
)(
struct
irq_data
*
data
);
void
(
*
irq_print_chip
)(
struct
irq_data
*
data
,
struct
seq_file
*
p
);
void
(
*
irq_print_chip
)(
struct
irq_data
*
data
,
struct
seq_file
*
p
);
unsigned
long
flags
;
unsigned
long
flags
;
...
@@ -439,7 +431,7 @@ irq_set_handler(unsigned int irq, irq_flow_handler_t handle)
...
@@ -439,7 +431,7 @@ irq_set_handler(unsigned int irq, irq_flow_handler_t handle)
/*
/*
* Set a highlevel chained flow handler for a given IRQ.
* Set a highlevel chained flow handler for a given IRQ.
* (a chained handler is automatically enabled and set to
* (a chained handler is automatically enabled and set to
* IRQ_NOREQUEST
and IRQ_NOPROBE
)
* IRQ_NOREQUEST
, IRQ_NOPROBE, and IRQ_NOTHREAD
)
*/
*/
static
inline
void
static
inline
void
irq_set_chained_handler
(
unsigned
int
irq
,
irq_flow_handler_t
handle
)
irq_set_chained_handler
(
unsigned
int
irq
,
irq_flow_handler_t
handle
)
...
@@ -469,6 +461,16 @@ static inline void irq_set_probe(unsigned int irq)
...
@@ -469,6 +461,16 @@ static inline void irq_set_probe(unsigned int irq)
irq_modify_status
(
irq
,
IRQ_NOPROBE
,
0
);
irq_modify_status
(
irq
,
IRQ_NOPROBE
,
0
);
}
}
static
inline
void
irq_set_nothread
(
unsigned
int
irq
)
{
irq_modify_status
(
irq
,
0
,
IRQ_NOTHREAD
);
}
static
inline
void
irq_set_thread
(
unsigned
int
irq
)
{
irq_modify_status
(
irq
,
IRQ_NOTHREAD
,
0
);
}
static
inline
void
irq_set_nested_thread
(
unsigned
int
irq
,
bool
nest
)
static
inline
void
irq_set_nested_thread
(
unsigned
int
irq
,
bool
nest
)
{
{
if
(
nest
)
if
(
nest
)
...
@@ -573,6 +575,145 @@ static inline int irq_reserve_irq(unsigned int irq)
...
@@ -573,6 +575,145 @@ static inline int irq_reserve_irq(unsigned int irq)
return
irq_reserve_irqs
(
irq
,
1
);
return
irq_reserve_irqs
(
irq
,
1
);
}
}
#ifndef irq_reg_writel
# define irq_reg_writel(val, addr) writel(val, addr)
#endif
#ifndef irq_reg_readl
# define irq_reg_readl(addr) readl(addr)
#endif
/**
* struct irq_chip_regs - register offsets for struct irq_gci
* @enable: Enable register offset to reg_base
* @disable: Disable register offset to reg_base
* @mask: Mask register offset to reg_base
* @ack: Ack register offset to reg_base
* @eoi: Eoi register offset to reg_base
* @type: Type configuration register offset to reg_base
* @polarity: Polarity configuration register offset to reg_base
*/
struct
irq_chip_regs
{
unsigned
long
enable
;
unsigned
long
disable
;
unsigned
long
mask
;
unsigned
long
ack
;
unsigned
long
eoi
;
unsigned
long
type
;
unsigned
long
polarity
;
};
/**
* struct irq_chip_type - Generic interrupt chip instance for a flow type
* @chip: The real interrupt chip which provides the callbacks
* @regs: Register offsets for this chip
* @handler: Flow handler associated with this chip
* @type: Chip can handle these flow types
*
* A irq_generic_chip can have several instances of irq_chip_type when
* it requires different functions and register offsets for different
* flow types.
*/
struct
irq_chip_type
{
struct
irq_chip
chip
;
struct
irq_chip_regs
regs
;
irq_flow_handler_t
handler
;
u32
type
;
};
/**
* struct irq_chip_generic - Generic irq chip data structure
* @lock: Lock to protect register and cache data access
* @reg_base: Register base address (virtual)
* @irq_base: Interrupt base nr for this chip
* @irq_cnt: Number of interrupts handled by this chip
* @mask_cache: Cached mask register
* @type_cache: Cached type register
* @polarity_cache: Cached polarity register
* @wake_enabled: Interrupt can wakeup from suspend
* @wake_active: Interrupt is marked as an wakeup from suspend source
* @num_ct: Number of available irq_chip_type instances (usually 1)
* @private: Private data for non generic chip callbacks
* @list: List head for keeping track of instances
* @chip_types: Array of interrupt irq_chip_types
*
* Note, that irq_chip_generic can have multiple irq_chip_type
* implementations which can be associated to a particular irq line of
* an irq_chip_generic instance. That allows to share and protect
* state in an irq_chip_generic instance when we need to implement
* different flow mechanisms (level/edge) for it.
*/
struct
irq_chip_generic
{
raw_spinlock_t
lock
;
void
__iomem
*
reg_base
;
unsigned
int
irq_base
;
unsigned
int
irq_cnt
;
u32
mask_cache
;
u32
type_cache
;
u32
polarity_cache
;
u32
wake_enabled
;
u32
wake_active
;
unsigned
int
num_ct
;
void
*
private
;
struct
list_head
list
;
struct
irq_chip_type
chip_types
[
0
];
};
/**
* enum irq_gc_flags - Initialization flags for generic irq chips
* @IRQ_GC_INIT_MASK_CACHE: Initialize the mask_cache by reading mask reg
* @IRQ_GC_INIT_NESTED_LOCK: Set the lock class of the irqs to nested for
* irq chips which need to call irq_set_wake() on
* the parent irq. Usually GPIO implementations
*/
enum
irq_gc_flags
{
IRQ_GC_INIT_MASK_CACHE
=
1
<<
0
,
IRQ_GC_INIT_NESTED_LOCK
=
1
<<
1
,
};
/* Generic chip callback functions */
void
irq_gc_noop
(
struct
irq_data
*
d
);
void
irq_gc_mask_disable_reg
(
struct
irq_data
*
d
);
void
irq_gc_mask_set_bit
(
struct
irq_data
*
d
);
void
irq_gc_mask_clr_bit
(
struct
irq_data
*
d
);
void
irq_gc_unmask_enable_reg
(
struct
irq_data
*
d
);
void
irq_gc_ack
(
struct
irq_data
*
d
);
void
irq_gc_mask_disable_reg_and_ack
(
struct
irq_data
*
d
);
void
irq_gc_eoi
(
struct
irq_data
*
d
);
int
irq_gc_set_wake
(
struct
irq_data
*
d
,
unsigned
int
on
);
/* Setup functions for irq_chip_generic */
struct
irq_chip_generic
*
irq_alloc_generic_chip
(
const
char
*
name
,
int
nr_ct
,
unsigned
int
irq_base
,
void
__iomem
*
reg_base
,
irq_flow_handler_t
handler
);
void
irq_setup_generic_chip
(
struct
irq_chip_generic
*
gc
,
u32
msk
,
enum
irq_gc_flags
flags
,
unsigned
int
clr
,
unsigned
int
set
);
int
irq_setup_alt_chip
(
struct
irq_data
*
d
,
unsigned
int
type
);
void
irq_remove_generic_chip
(
struct
irq_chip_generic
*
gc
,
u32
msk
,
unsigned
int
clr
,
unsigned
int
set
);
static
inline
struct
irq_chip_type
*
irq_data_get_chip_type
(
struct
irq_data
*
d
)
{
return
container_of
(
d
->
chip
,
struct
irq_chip_type
,
chip
);
}
#define IRQ_MSK(n) (u32)((n) < 32 ? ((1 << (n)) - 1) : UINT_MAX)
#ifdef CONFIG_SMP
static
inline
void
irq_gc_lock
(
struct
irq_chip_generic
*
gc
)
{
raw_spin_lock
(
&
gc
->
lock
);
}
static
inline
void
irq_gc_unlock
(
struct
irq_chip_generic
*
gc
)
{
raw_spin_unlock
(
&
gc
->
lock
);
}
#else
static
inline
void
irq_gc_lock
(
struct
irq_chip_generic
*
gc
)
{
}
static
inline
void
irq_gc_unlock
(
struct
irq_chip_generic
*
gc
)
{
}
#endif
#endif
/* CONFIG_GENERIC_HARDIRQS */
#endif
/* CONFIG_GENERIC_HARDIRQS */
#endif
/* !CONFIG_S390 */
#endif
/* !CONFIG_S390 */
...
...
include/linux/irqdesc.h
浏览文件 @
b08827f4
...
@@ -16,16 +16,18 @@ struct timer_rand_state;
...
@@ -16,16 +16,18 @@ struct timer_rand_state;
* @irq_data: per irq and chip data passed down to chip functions
* @irq_data: per irq and chip data passed down to chip functions
* @timer_rand_state: pointer to timer rand state struct
* @timer_rand_state: pointer to timer rand state struct
* @kstat_irqs: irq stats per cpu
* @kstat_irqs: irq stats per cpu
* @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()]
* @handle_irq: highlevel irq-events handler
* @preflow_handler: handler called before the flow handler (currently used by sparc)
* @action: the irq action chain
* @action: the irq action chain
* @status: status information
* @status: status information
* @core_internal_state__do_not_mess_with_it: core internal status information
* @core_internal_state__do_not_mess_with_it: core internal status information
* @depth: disable-depth, for nested irq_disable() calls
* @depth: disable-depth, for nested irq_disable() calls
* @wake_depth: enable depth, for multiple set_irq_wake() callers
* @wake_depth: enable depth, for multiple
irq_
set_irq_wake() callers
* @irq_count: stats field to detect stalled irqs
* @irq_count: stats field to detect stalled irqs
* @last_unhandled: aging timer for unhandled count
* @last_unhandled: aging timer for unhandled count
* @irqs_unhandled: stats field for spurious unhandled interrupts
* @irqs_unhandled: stats field for spurious unhandled interrupts
* @lock: locking for SMP
* @lock: locking for SMP
* @affinity_hint: hint to user space for preferred irq affinity
* @affinity_notify: context for notification of affinity changes
* @affinity_notify: context for notification of affinity changes
* @pending_mask: pending rebalanced interrupts
* @pending_mask: pending rebalanced interrupts
* @threads_oneshot: bitfield to handle shared oneshot threads
* @threads_oneshot: bitfield to handle shared oneshot threads
...
...
kernel/irq/Makefile
浏览文件 @
b08827f4
obj-y
:=
irqdesc.o handle.o manage.o spurious.o resend.o chip.o dummychip.o devres.o
obj-y
:=
irqdesc.o handle.o manage.o spurious.o resend.o chip.o dummychip.o devres.o
obj-y
+=
generic-chip.o
obj-$(CONFIG_GENERIC_IRQ_PROBE)
+=
autoprobe.o
obj-$(CONFIG_GENERIC_IRQ_PROBE)
+=
autoprobe.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
obj-$(CONFIG_GENERIC_PENDING_IRQ)
+=
migration.o
obj-$(CONFIG_GENERIC_PENDING_IRQ)
+=
migration.o
...
...
kernel/irq/chip.c
浏览文件 @
b08827f4
...
@@ -573,6 +573,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
...
@@ -573,6 +573,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
if
(
handle
!=
handle_bad_irq
&&
is_chained
)
{
if
(
handle
!=
handle_bad_irq
&&
is_chained
)
{
irq_settings_set_noprobe
(
desc
);
irq_settings_set_noprobe
(
desc
);
irq_settings_set_norequest
(
desc
);
irq_settings_set_norequest
(
desc
);
irq_settings_set_nothread
(
desc
);
irq_startup
(
desc
);
irq_startup
(
desc
);
}
}
out:
out:
...
...
kernel/irq/debug.h
浏览文件 @
b08827f4
...
@@ -27,6 +27,7 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
...
@@ -27,6 +27,7 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
P
(
IRQ_PER_CPU
);
P
(
IRQ_PER_CPU
);
P
(
IRQ_NOPROBE
);
P
(
IRQ_NOPROBE
);
P
(
IRQ_NOREQUEST
);
P
(
IRQ_NOREQUEST
);
P
(
IRQ_NOTHREAD
);
P
(
IRQ_NOAUTOEN
);
P
(
IRQ_NOAUTOEN
);
PS
(
IRQS_AUTODETECT
);
PS
(
IRQS_AUTODETECT
);
...
...
kernel/irq/generic-chip.c
0 → 100644
浏览文件 @
b08827f4
/*
* Library implementing the most common irq chip callback functions
*
* Copyright (C) 2011, Thomas Gleixner
*/
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <linux/syscore_ops.h>
#include "internals.h"
static
LIST_HEAD
(
gc_list
);
static
DEFINE_RAW_SPINLOCK
(
gc_lock
);
static
inline
struct
irq_chip_regs
*
cur_regs
(
struct
irq_data
*
d
)
{
return
&
container_of
(
d
->
chip
,
struct
irq_chip_type
,
chip
)
->
regs
;
}
/**
* irq_gc_noop - NOOP function
* @d: irq_data
*/
void
irq_gc_noop
(
struct
irq_data
*
d
)
{
}
/**
* irq_gc_mask_disable_reg - Mask chip via disable register
* @d: irq_data
*
* Chip has separate enable/disable registers instead of a single mask
* register.
*/
void
irq_gc_mask_disable_reg
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
disable
);
gc
->
mask_cache
&=
~
mask
;
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_mask_set_mask_bit - Mask chip via setting bit in mask register
* @d: irq_data
*
* Chip has a single mask register. Values of this register are cached
* and protected by gc->lock
*/
void
irq_gc_mask_set_bit
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
gc
->
mask_cache
|=
mask
;
irq_reg_writel
(
gc
->
mask_cache
,
gc
->
reg_base
+
cur_regs
(
d
)
->
mask
);
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_mask_set_mask_bit - Mask chip via clearing bit in mask register
* @d: irq_data
*
* Chip has a single mask register. Values of this register are cached
* and protected by gc->lock
*/
void
irq_gc_mask_clr_bit
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
gc
->
mask_cache
&=
~
mask
;
irq_reg_writel
(
gc
->
mask_cache
,
gc
->
reg_base
+
cur_regs
(
d
)
->
mask
);
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_unmask_enable_reg - Unmask chip via enable register
* @d: irq_data
*
* Chip has separate enable/disable registers instead of a single mask
* register.
*/
void
irq_gc_unmask_enable_reg
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
enable
);
gc
->
mask_cache
|=
mask
;
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_ack - Ack pending interrupt
* @d: irq_data
*/
void
irq_gc_ack
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
ack
);
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_mask_disable_reg_and_ack- Mask and ack pending interrupt
* @d: irq_data
*/
void
irq_gc_mask_disable_reg_and_ack
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
mask
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
ack
);
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_eoi - EOI interrupt
* @d: irq_data
*/
void
irq_gc_eoi
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
irq_gc_lock
(
gc
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
eoi
);
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_set_wake - Set/clr wake bit for an interrupt
* @d: irq_data
*
* For chips where the wake from suspend functionality is not
* configured in a separate register and the wakeup active state is
* just stored in a bitmask.
*/
int
irq_gc_set_wake
(
struct
irq_data
*
d
,
unsigned
int
on
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
if
(
!
(
mask
&
gc
->
wake_enabled
))
return
-
EINVAL
;
irq_gc_lock
(
gc
);
if
(
on
)
gc
->
wake_active
|=
mask
;
else
gc
->
wake_active
&=
~
mask
;
irq_gc_unlock
(
gc
);
return
0
;
}
/**
* irq_alloc_generic_chip - Allocate a generic chip and initialize it
* @name: Name of the irq chip
* @num_ct: Number of irq_chip_type instances associated with this
* @irq_base: Interrupt base nr for this chip
* @reg_base: Register base address (virtual)
* @handler: Default flow handler associated with this chip
*
* Returns an initialized irq_chip_generic structure. The chip defaults
* to the primary (index 0) irq_chip_type and @handler
*/
struct
irq_chip_generic
*
irq_alloc_generic_chip
(
const
char
*
name
,
int
num_ct
,
unsigned
int
irq_base
,
void
__iomem
*
reg_base
,
irq_flow_handler_t
handler
)
{
struct
irq_chip_generic
*
gc
;
unsigned
long
sz
=
sizeof
(
*
gc
)
+
num_ct
*
sizeof
(
struct
irq_chip_type
);
gc
=
kzalloc
(
sz
,
GFP_KERNEL
);
if
(
gc
)
{
raw_spin_lock_init
(
&
gc
->
lock
);
gc
->
num_ct
=
num_ct
;
gc
->
irq_base
=
irq_base
;
gc
->
reg_base
=
reg_base
;
gc
->
chip_types
->
chip
.
name
=
name
;
gc
->
chip_types
->
handler
=
handler
;
}
return
gc
;
}
/*
* Separate lockdep class for interrupt chip which can nest irq_desc
* lock.
*/
static
struct
lock_class_key
irq_nested_lock_class
;
/**
* irq_setup_generic_chip - Setup a range of interrupts with a generic chip
* @gc: Generic irq chip holding all data
* @msk: Bitmask holding the irqs to initialize relative to gc->irq_base
* @flags: Flags for initialization
* @clr: IRQ_* bits to clear
* @set: IRQ_* bits to set
*
* Set up max. 32 interrupts starting from gc->irq_base. Note, this
* initializes all interrupts to the primary irq_chip_type and its
* associated handler.
*/
void
irq_setup_generic_chip
(
struct
irq_chip_generic
*
gc
,
u32
msk
,
enum
irq_gc_flags
flags
,
unsigned
int
clr
,
unsigned
int
set
)
{
struct
irq_chip_type
*
ct
=
gc
->
chip_types
;
unsigned
int
i
;
raw_spin_lock
(
&
gc_lock
);
list_add_tail
(
&
gc
->
list
,
&
gc_list
);
raw_spin_unlock
(
&
gc_lock
);
/* Init mask cache ? */
if
(
flags
&
IRQ_GC_INIT_MASK_CACHE
)
gc
->
mask_cache
=
irq_reg_readl
(
gc
->
reg_base
+
ct
->
regs
.
mask
);
for
(
i
=
gc
->
irq_base
;
msk
;
msk
>>=
1
,
i
++
)
{
if
(
!
msk
&
0x01
)
continue
;
if
(
flags
&
IRQ_GC_INIT_NESTED_LOCK
)
irq_set_lockdep_class
(
i
,
&
irq_nested_lock_class
);
irq_set_chip_and_handler
(
i
,
&
ct
->
chip
,
ct
->
handler
);
irq_set_chip_data
(
i
,
gc
);
irq_modify_status
(
i
,
clr
,
set
);
}
gc
->
irq_cnt
=
i
-
gc
->
irq_base
;
}
/**
* irq_setup_alt_chip - Switch to alternative chip
* @d: irq_data for this interrupt
* @type Flow type to be initialized
*
* Only to be called from chip->irq_set_type() callbacks.
*/
int
irq_setup_alt_chip
(
struct
irq_data
*
d
,
unsigned
int
type
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
struct
irq_chip_type
*
ct
=
gc
->
chip_types
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
gc
->
num_ct
;
i
++
,
ct
++
)
{
if
(
ct
->
type
&
type
)
{
d
->
chip
=
&
ct
->
chip
;
irq_data_to_desc
(
d
)
->
handle_irq
=
ct
->
handler
;
return
0
;
}
}
return
-
EINVAL
;
}
/**
* irq_remove_generic_chip - Remove a chip
* @gc: Generic irq chip holding all data
* @msk: Bitmask holding the irqs to initialize relative to gc->irq_base
* @clr: IRQ_* bits to clear
* @set: IRQ_* bits to set
*
* Remove up to 32 interrupts starting from gc->irq_base.
*/
void
irq_remove_generic_chip
(
struct
irq_chip_generic
*
gc
,
u32
msk
,
unsigned
int
clr
,
unsigned
int
set
)
{
unsigned
int
i
=
gc
->
irq_base
;
raw_spin_lock
(
&
gc_lock
);
list_del
(
&
gc
->
list
);
raw_spin_unlock
(
&
gc_lock
);
for
(;
msk
;
msk
>>=
1
,
i
++
)
{
if
(
!
msk
&
0x01
)
continue
;
/* Remove handler first. That will mask the irq line */
irq_set_handler
(
i
,
NULL
);
irq_set_chip
(
i
,
&
no_irq_chip
);
irq_set_chip_data
(
i
,
NULL
);
irq_modify_status
(
i
,
clr
,
set
);
}
}
#ifdef CONFIG_PM
static
int
irq_gc_suspend
(
void
)
{
struct
irq_chip_generic
*
gc
;
list_for_each_entry
(
gc
,
&
gc_list
,
list
)
{
struct
irq_chip_type
*
ct
=
gc
->
chip_types
;
if
(
ct
->
chip
.
irq_suspend
)
ct
->
chip
.
irq_suspend
(
irq_get_irq_data
(
gc
->
irq_base
));
}
return
0
;
}
static
void
irq_gc_resume
(
void
)
{
struct
irq_chip_generic
*
gc
;
list_for_each_entry
(
gc
,
&
gc_list
,
list
)
{
struct
irq_chip_type
*
ct
=
gc
->
chip_types
;
if
(
ct
->
chip
.
irq_resume
)
ct
->
chip
.
irq_resume
(
irq_get_irq_data
(
gc
->
irq_base
));
}
}
#else
#define irq_gc_suspend NULL
#define irq_gc_resume NULL
#endif
static
void
irq_gc_shutdown
(
void
)
{
struct
irq_chip_generic
*
gc
;
list_for_each_entry
(
gc
,
&
gc_list
,
list
)
{
struct
irq_chip_type
*
ct
=
gc
->
chip_types
;
if
(
ct
->
chip
.
irq_pm_shutdown
)
ct
->
chip
.
irq_pm_shutdown
(
irq_get_irq_data
(
gc
->
irq_base
));
}
}
static
struct
syscore_ops
irq_gc_syscore_ops
=
{
.
suspend
=
irq_gc_suspend
,
.
resume
=
irq_gc_resume
,
.
shutdown
=
irq_gc_shutdown
,
};
static
int
__init
irq_gc_init_ops
(
void
)
{
register_syscore_ops
(
&
irq_gc_syscore_ops
);
return
0
;
}
device_initcall
(
irq_gc_init_ops
);
kernel/irq/manage.c
浏览文件 @
b08827f4
...
@@ -900,7 +900,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
...
@@ -900,7 +900,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
*/
*/
new
->
handler
=
irq_nested_primary_handler
;
new
->
handler
=
irq_nested_primary_handler
;
}
else
{
}
else
{
irq_setup_forced_threading
(
new
);
if
(
irq_settings_can_thread
(
desc
))
irq_setup_forced_threading
(
new
);
}
}
/*
/*
...
...
kernel/irq/settings.h
浏览文件 @
b08827f4
...
@@ -8,6 +8,7 @@ enum {
...
@@ -8,6 +8,7 @@ enum {
_IRQ_LEVEL
=
IRQ_LEVEL
,
_IRQ_LEVEL
=
IRQ_LEVEL
,
_IRQ_NOPROBE
=
IRQ_NOPROBE
,
_IRQ_NOPROBE
=
IRQ_NOPROBE
,
_IRQ_NOREQUEST
=
IRQ_NOREQUEST
,
_IRQ_NOREQUEST
=
IRQ_NOREQUEST
,
_IRQ_NOTHREAD
=
IRQ_NOTHREAD
,
_IRQ_NOAUTOEN
=
IRQ_NOAUTOEN
,
_IRQ_NOAUTOEN
=
IRQ_NOAUTOEN
,
_IRQ_MOVE_PCNTXT
=
IRQ_MOVE_PCNTXT
,
_IRQ_MOVE_PCNTXT
=
IRQ_MOVE_PCNTXT
,
_IRQ_NO_BALANCING
=
IRQ_NO_BALANCING
,
_IRQ_NO_BALANCING
=
IRQ_NO_BALANCING
,
...
@@ -20,6 +21,7 @@ enum {
...
@@ -20,6 +21,7 @@ enum {
#define IRQ_LEVEL GOT_YOU_MORON
#define IRQ_LEVEL GOT_YOU_MORON
#define IRQ_NOPROBE GOT_YOU_MORON
#define IRQ_NOPROBE GOT_YOU_MORON
#define IRQ_NOREQUEST GOT_YOU_MORON
#define IRQ_NOREQUEST GOT_YOU_MORON
#define IRQ_NOTHREAD GOT_YOU_MORON
#define IRQ_NOAUTOEN GOT_YOU_MORON
#define IRQ_NOAUTOEN GOT_YOU_MORON
#define IRQ_NESTED_THREAD GOT_YOU_MORON
#define IRQ_NESTED_THREAD GOT_YOU_MORON
#undef IRQF_MODIFY_MASK
#undef IRQF_MODIFY_MASK
...
@@ -94,6 +96,21 @@ static inline void irq_settings_set_norequest(struct irq_desc *desc)
...
@@ -94,6 +96,21 @@ static inline void irq_settings_set_norequest(struct irq_desc *desc)
desc
->
status_use_accessors
|=
_IRQ_NOREQUEST
;
desc
->
status_use_accessors
|=
_IRQ_NOREQUEST
;
}
}
static
inline
bool
irq_settings_can_thread
(
struct
irq_desc
*
desc
)
{
return
!
(
desc
->
status_use_accessors
&
_IRQ_NOTHREAD
);
}
static
inline
void
irq_settings_clr_nothread
(
struct
irq_desc
*
desc
)
{
desc
->
status_use_accessors
&=
~
_IRQ_NOTHREAD
;
}
static
inline
void
irq_settings_set_nothread
(
struct
irq_desc
*
desc
)
{
desc
->
status_use_accessors
|=
_IRQ_NOTHREAD
;
}
static
inline
bool
irq_settings_can_probe
(
struct
irq_desc
*
desc
)
static
inline
bool
irq_settings_can_probe
(
struct
irq_desc
*
desc
)
{
{
return
!
(
desc
->
status_use_accessors
&
_IRQ_NOPROBE
);
return
!
(
desc
->
status_use_accessors
&
_IRQ_NOPROBE
);
...
...
sound/soc/omap/Kconfig
浏览文件 @
b08827f4
...
@@ -65,14 +65,6 @@ config SND_OMAP_SOC_OVERO
...
@@ -65,14 +65,6 @@ config SND_OMAP_SOC_OVERO
Say Y if you want to add support for SoC audio on the
Say Y if you want to add support for SoC audio on the
Gumstix Overo or CompuLab CM-T35
Gumstix Overo or CompuLab CM-T35
config SND_OMAP_SOC_OMAP2EVM
tristate "SoC Audio support for OMAP2EVM board"
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP2EVM
select SND_OMAP_SOC_MCBSP
select SND_SOC_TWL4030
help
Say Y if you want to add support for SoC audio on the omap2evm board.
config SND_OMAP_SOC_OMAP3EVM
config SND_OMAP_SOC_OMAP3EVM
tristate "SoC Audio support for OMAP3EVM board"
tristate "SoC Audio support for OMAP3EVM board"
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3EVM
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3EVM
...
...
sound/soc/omap/Makefile
浏览文件 @
b08827f4
...
@@ -13,7 +13,6 @@ snd-soc-rx51-objs := rx51.o
...
@@ -13,7 +13,6 @@ snd-soc-rx51-objs := rx51.o
snd-soc-ams-delta-objs
:=
ams-delta.o
snd-soc-ams-delta-objs
:=
ams-delta.o
snd-soc-osk5912-objs
:=
osk5912.o
snd-soc-osk5912-objs
:=
osk5912.o
snd-soc-overo-objs
:=
overo.o
snd-soc-overo-objs
:=
overo.o
snd-soc-omap2evm-objs
:=
omap2evm.o
snd-soc-omap3evm-objs
:=
omap3evm.o
snd-soc-omap3evm-objs
:=
omap3evm.o
snd-soc-am3517evm-objs
:=
am3517evm.o
snd-soc-am3517evm-objs
:=
am3517evm.o
snd-soc-sdp3430-objs
:=
sdp3430.o
snd-soc-sdp3430-objs
:=
sdp3430.o
...
...
sound/soc/omap/omap2evm.c
已删除
100644 → 0
浏览文件 @
75c0b3b4
/*
* omap2evm.c -- SoC audio machine driver for omap2evm board
*
* Author: Arun KS <arunks@mistralsolutions.com>
*
* Based on sound/soc/omap/overo.c by Steve Sakoman
*
* 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.
*
* 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 St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <mach/gpio.h>
#include <plat/mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
static
int
omap2evm_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
int
ret
;
/* Set codec DAI configuration */
ret
=
snd_soc_dai_set_fmt
(
codec_dai
,
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBM_CFM
);
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"can't set codec DAI configuration
\n
"
);
return
ret
;
}
/* Set cpu DAI configuration */
ret
=
snd_soc_dai_set_fmt
(
cpu_dai
,
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBM_CFM
);
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"can't set cpu DAI configuration
\n
"
);
return
ret
;
}
/* Set the codec system clock for DAC and ADC */
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
0
,
26000000
,
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"can't set codec system clock
\n
"
);
return
ret
;
}
return
0
;
}
static
struct
snd_soc_ops
omap2evm_ops
=
{
.
hw_params
=
omap2evm_hw_params
,
};
/* Digital audio interface glue - connects codec <--> CPU */
static
struct
snd_soc_dai_link
omap2evm_dai
=
{
.
name
=
"TWL4030"
,
.
stream_name
=
"TWL4030"
,
.
cpu_dai_name
=
"omap-mcbsp-dai.1"
,
.
codec_dai_name
=
"twl4030-hifi"
,
.
platform_name
=
"omap-pcm-audio"
,
.
codec_name
=
"twl4030-codec"
,
.
ops
=
&
omap2evm_ops
,
};
/* Audio machine driver */
static
struct
snd_soc_card
snd_soc_omap2evm
=
{
.
name
=
"omap2evm"
,
.
dai_link
=
&
omap2evm_dai
,
.
num_links
=
1
,
};
static
struct
platform_device
*
omap2evm_snd_device
;
static
int
__init
omap2evm_soc_init
(
void
)
{
int
ret
;
if
(
!
machine_is_omap2evm
())
return
-
ENODEV
;
printk
(
KERN_INFO
"omap2evm SoC init
\n
"
);
omap2evm_snd_device
=
platform_device_alloc
(
"soc-audio"
,
-
1
);
if
(
!
omap2evm_snd_device
)
{
printk
(
KERN_ERR
"Platform device allocation failed
\n
"
);
return
-
ENOMEM
;
}
platform_set_drvdata
(
omap2evm_snd_device
,
&
snd_soc_omap2evm
);
ret
=
platform_device_add
(
omap2evm_snd_device
);
if
(
ret
)
goto
err1
;
return
0
;
err1:
printk
(
KERN_ERR
"Unable to add platform device
\n
"
);
platform_device_put
(
omap2evm_snd_device
);
return
ret
;
}
module_init
(
omap2evm_soc_init
);
static
void
__exit
omap2evm_soc_exit
(
void
)
{
platform_device_unregister
(
omap2evm_snd_device
);
}
module_exit
(
omap2evm_soc_exit
);
MODULE_AUTHOR
(
"Arun KS <arunks@mistralsolutions.com>"
);
MODULE_DESCRIPTION
(
"ALSA SoC omap2evm"
);
MODULE_LICENSE
(
"GPL"
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录