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 @@
<para>
Whenever an interrupt triggers, the lowlevel arch code calls into
the generic interrupt code by calling desc->handle_irq().
This highlevel IRQ handling function only uses desc->
chip primitives
referenced by the assigned chip descriptor structure.
This highlevel IRQ handling function only uses desc->
irq_data.chip
primitives
referenced by the assigned chip descriptor structure.
</para>
</sect1>
<sect1
id=
"Highlevel_Driver_API"
>
...
...
@@ -206,11 +206,11 @@
<listitem><para>
enable_irq()
</para></listitem>
<listitem><para>
disable_irq_nosync() (SMP only)
</para></listitem>
<listitem><para>
synchronize_irq() (SMP only)
</para></listitem>
<listitem><para>
set_irq_type()
</para></listitem>
<listitem><para>
set_irq_wake()
</para></listitem>
<listitem><para>
set_irq
_data()
</para></listitem>
<listitem><para>
set_irq
_chip()
</para></listitem>
<listitem><para>
set_irq
_chip_data()
</para></listitem>
<listitem><para>
irq_
set_irq_type()
</para></listitem>
<listitem><para>
irq_
set_irq_wake()
</para></listitem>
<listitem><para>
irq_set_handler
_data()
</para></listitem>
<listitem><para>
irq_set
_chip()
</para></listitem>
<listitem><para>
irq_set
_chip_data()
</para></listitem>
</itemizedlist>
See the autogenerated function documentation for details.
</para>
...
...
@@ -225,6 +225,8 @@
<listitem><para>
handle_fasteoi_irq
</para></listitem>
<listitem><para>
handle_simple_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>
The interrupt flow handlers (either predefined or architecture
specific) are assigned to specific interrupts by the architecture
...
...
@@ -241,13 +243,13 @@
<programlisting>
default_enable(struct irq_data *data)
{
desc->chip->irq_unmask(data);
desc->
irq_data.
chip->irq_unmask(data);
}
default_disable(struct irq_data *data)
{
if (!delay_disable(data))
desc->chip->irq_mask(data);
desc->
irq_data.
chip->irq_mask(data);
}
default_ack(struct irq_data *data)
...
...
@@ -284,9 +286,9 @@ noop(struct irq_data *data))
<para>
The following control flow is implemented (simplified excerpt):
<programlisting>
desc->
chip->irq_mas
k();
handle_
IRQ
_event(desc->action);
desc->chip->irq_unmask();
desc->
irq_data.chip->irq_mask_ac
k();
handle_
irq
_event(desc->action);
desc->
irq_data.
chip->irq_unmask();
</programlisting>
</para>
</sect3>
...
...
@@ -300,8 +302,8 @@ desc->chip->irq_unmask();
<para>
The following control flow is implemented (simplified excerpt):
<programlisting>
handle_
IRQ
_event(desc->action);
desc->chip->irq_eoi();
handle_
irq
_event(desc->action);
desc->
irq_data.
chip->irq_eoi();
</programlisting>
</para>
</sect3>
...
...
@@ -315,17 +317,17 @@ desc->chip->irq_eoi();
The following control flow is implemented (simplified excerpt):
<programlisting>
if (desc->status
&
running) {
desc->
chip->irq_mas
k();
desc->
irq_data.chip->irq_mask_ac
k();
desc->status |= pending | masked;
return;
}
desc->chip->irq_ack();
desc->
irq_data.
chip->irq_ack();
desc->status |= running;
do {
if (desc->status
&
masked)
desc->chip->irq_unmask();
desc->
irq_data.
chip->irq_unmask();
desc->status
&
= ~pending;
handle_
IRQ
_event(desc->action);
handle_
irq
_event(desc->action);
} while (status
&
pending);
desc->status
&
= ~running;
</programlisting>
...
...
@@ -344,7 +346,7 @@ desc->status &= ~running;
<para>
The following control flow is implemented (simplified excerpt):
<programlisting>
handle_
IRQ
_event(desc->action);
handle_
irq
_event(desc->action);
</programlisting>
</para>
</sect3>
...
...
@@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
<para>
The following control flow is implemented (simplified excerpt):
<programlisting>
handle_IRQ_event(desc->action);
if (desc->chip->irq_eoi)
desc->chip->irq_eoi();
if (desc->irq_data.chip->irq_ack)
desc->irq_data.chip->irq_ack();
handle_irq_event(desc->action);
if (desc->irq_data.chip->irq_eoi)
desc->irq_data.chip->irq_eoi();
</programlisting>
</para>
</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
id=
"Quirks_and_optimizations"
>
<title>
Quirks and optimizations
</title>
...
...
@@ -410,6 +429,7 @@ if (desc->chip->irq_eoi)
<listitem><para>
irq_mask_ack() - Optional, recommended for performance
</para></listitem>
<listitem><para>
irq_mask()
</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_set_type() - Optional
</para></listitem>
<listitem><para>
irq_set_wake() - Optional
</para></listitem>
...
...
@@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
<chapter
id=
"doirq"
>
<title>
__do_IRQ entry point
</title>
<para>
The original implementation __do_IRQ() i
s an alternative entry
point for all types of interrupts.
The original implementation __do_IRQ() wa
s an alternative entry
point for all types of interrupts.
It not longer exists.
</para>
<para>
This handler turned out to be not suitable for all
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
interrupts.
</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
id=
"locking"
>
<title>
Locking on SMP
</title>
<para>
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
for serialization, but the generic layer does not touch it. The per-irq
structure is protected via desc->lock, by the generic layer.
defines the chip primitives. The per-irq structure is
protected via desc->lock, by the generic layer.
</para>
</chapter>
<chapter
id=
"structs"
>
...
...
arch/arm/configs/omap2plus_defconfig
浏览文件 @
b08827f4
...
...
@@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_OMAP=y
CONFIG_ARCH_OMAP2=y
CONFIG_ARCH_OMAP3=y
CONFIG_ARCH_OMAP4=y
CONFIG_OMAP_RESET_CLOCKS=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_L1_CACHE_SHIFT=5
CONFIG_ARM_ERRATA_411920=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_SMP=y
CONFIG_NR_CPUS=2
# CONFIG_LOCAL_TIMERS is not set
CONFIG_AEABI=y
CONFIG_LEDS=y
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
CONFIG_KEXEC=y
CONFIG_FPE_NWFPE=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_BINFMT_MISC=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y
CONFIG_PM_RUNTIME=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
...
...
@@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y
# CONFIG_IPV6 is not set
CONFIG_NETFILTER=y
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_H4=y
CONFIG_BT_HCIUART_BCSP=y
...
...
@@ -107,11 +63,9 @@ CONFIG_CFG80211=m
CONFIG_MAC80211=m
CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_DEFAULT_PID=y
CONFIG_MAC80211_LEDS=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_CONNECTOR=y
CONFIG_MTD=y
CONFIG_MTD_CONCAT=y
CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
...
...
@@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_EEPROM_LEGACY=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_MULTI_LUN=y
...
...
@@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_TWL4030_PWRBUTTON=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_HW_RANDOM=y
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_OMAP=y
CONFIG_SPI=y
CONFIG_SPI_OMAP24XX=y
CONFIG_DEBUG_GPIO=y
...
...
@@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y
CONFIG_WATCHDOG=y
CONFIG_OMAP_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_TPS65023=y
CONFIG_REGULATOR_TPS6507X=y
...
...
@@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_PLATFORM=y
CONFIG_DISPLAY_SUPPORT=y
# CONFIG_VGA_CONSOLE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_FONTS=y
...
...
@@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_SOUND=m
CONFIG_SND=m
CONFIG_SND_MIXER_OSS=
y
CONFIG_SND_PCM_OSS=
y
CONFIG_SND_MIXER_OSS=
m
CONFIG_SND_PCM_OSS=
m
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DEBUG=y
CONFIG_SND_USB_AUDIO=
y
CONFIG_SND_SOC=
y
CONFIG_SND_OMAP_SOC=
y
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=
y
CONFIG_SND_USB_AUDIO=
m
CONFIG_SND_SOC=
m
CONFIG_SND_OMAP_SOC=
m
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=
m
CONFIG_USB=y
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG_WHITELIST is not set
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_STORAGE=y
CONFIG_USB_LIBUSUAL=y
...
...
@@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y
CONFIG_SDIO_UART=y
CONFIG_MMC_OMAP=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_DRV_TWL92330=y
CONFIG_RTC_DRV_TWL4030=y
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set
CONFIG_INOTIFY=y
CONFIG_QUOTA=y
CONFIG_QFMT_V2=y
CONFIG_MSDOS_FS=y
...
...
@@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_PRINTK_TIME=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
CONFIG_PROVE_LOCKING=y
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_DEBUG_INFO=y
...
...
arch/arm/mach-omap2/Kconfig
浏览文件 @
b08827f4
...
...
@@ -288,6 +288,7 @@ config MACH_IGEP0030
depends on ARCH_OMAP3
default y
select OMAP_PACKAGE_CBB
select MACH_IGEP0020
config MACH_SBC3530
bool "OMAP3 SBC STALKER board"
...
...
arch/arm/mach-omap2/Makefile
浏览文件 @
b08827f4
...
...
@@ -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_IGEP0020)
+=
board-igep0020.o
\
hsmmc.o
obj-$(CONFIG_MACH_IGEP0030)
+=
board-igep0030.o
\
hsmmc.o
obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK)
+=
board-omap3touchbook.o
\
hsmmc.o
obj-$(CONFIG_MACH_OMAP_4430SDP)
+=
board-4430sdp.o
\
...
...
@@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
disp-$(CONFIG_OMAP2_DSS)
:=
display.o
obj-y
+=
$
(
disp-m
)
$
(
disp-y
)
obj-y
+=
common-board-devices.o
arch/arm/mach-omap2/board-2430sdp.c
浏览文件 @
b08827f4
...
...
@@ -41,6 +41,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define SDP2430_CS0_BASE 0x04000000
#define SECONDARY_LCD_GPIO 147
...
...
@@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = {
.
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
[]
=
{
{
I2C_BOARD_INFO
(
"isp1301_omap"
,
0x2D
),
...
...
@@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void)
{
omap_register_i2c_bus
(
1
,
100
,
sdp2430_i2c1_boardinfo
,
ARRAY_SIZE
(
sdp2430_i2c1_boardinfo
));
omap_register_i2c_bus
(
2
,
2600
,
sdp2430_i2c_boardinfo
,
ARRAY_SIZE
(
sdp2430_i2c_boardinfo
));
omap2_pmic_init
(
"twl4030"
,
&
sdp2430_twldata
);
return
0
;
}
...
...
@@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
{}
/* 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
=
{
.
otg
=
1
,
#ifdef CONFIG_USB_GADGET_OMAP
...
...
@@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = {
static
void
__init
omap_2430sdp_init
(
void
)
{
int
ret
;
omap2430_mux_init
(
board_mux
,
OMAP_PACKAGE_ZAC
);
omap_board_config
=
sdp2430_config
;
...
...
@@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void)
omap2_usbfs_init
(
&
sdp2430_usb_config
);
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
();
/* Turn off secondary LCD backlight */
ret
=
gpio_request
(
SECONDARY_LCD_GPIO
,
"Secondary LCD backlight"
);
if
(
ret
==
0
)
gpio_direction_output
(
SECONDARY_LCD_GPIO
,
0
);
gpio_request_one
(
SECONDARY_LCD_GPIO
,
GPIOF_OUT_INIT_LOW
,
"Secondary LCD backlight"
);
}
static
void
__init
omap_2430sdp_map_io
(
void
)
...
...
arch/arm/mach-omap2/board-3430sdp.c
浏览文件 @
b08827f4
...
...
@@ -19,7 +19,6 @@
#include <linux/input.h>
#include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/i2c/twl.h>
#include <linux/regulator/machine.h>
#include <linux/io.h>
...
...
@@ -48,6 +47,7 @@
#include "hsmmc.h"
#include "pm.h"
#include "control.h"
#include "common-board-devices.h"
#define CONFIG_DISABLE_HFCLK 1
...
...
@@ -123,63 +123,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
.
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_ENABLE_GPIO 5
static
unsigned
backlight_gpio
;
static
unsigned
enable_gpio
;
static
struct
gpio
sdp3430_dss_gpios
[]
__initdata
=
{
{
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
dvi_enabled
;
...
...
@@ -187,29 +138,11 @@ static void __init sdp3430_display_init(void)
{
int
r
;
enable_gpio
=
SDP3430_LCD_PANEL_ENABLE_GPIO
;
backlight_gpio
=
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
;
r
=
gpio_request
(
enable_gpio
,
"LCD reset"
);
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
);
r
=
gpio_request_array
(
sdp3430_dss_gpios
,
ARRAY_SIZE
(
sdp3430_dss_gpios
));
if
(
r
)
printk
(
KERN_ERR
"failed to get LCD control GPIOs
\n
"
);
return
;
err1:
gpio_free
(
enable_gpio
);
err0:
return
;
}
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
;
}
gpio_direction_output
(
enable_gpio
,
1
);
gpio_direction_output
(
backlight_gpio
,
1
);
gpio_direction_output
(
SDP3430_LCD_PANEL_ENABLE_GPIO
,
1
);
gpio_direction_output
(
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
,
1
);
lcd_enabled
=
1
;
...
...
@@ -231,8 +164,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
{
lcd_enabled
=
0
;
gpio_direction_output
(
enable_gpio
,
0
);
gpio_direction_output
(
backlight_gpio
,
0
);
gpio_direction_output
(
SDP3430_LCD_PANEL_ENABLE_GPIO
,
0
);
gpio_direction_output
(
SDP3430_LCD_PANEL_BACKLIGHT_GPIO
,
0
);
}
static
int
sdp3430_panel_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
...
...
@@ -360,12 +293,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
omap2_hsmmc_init
(
mmc
);
/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
gpio_request
(
gpio
+
7
,
"sub_lcd_en_bkl"
);
gpio_direction_output
(
gpio
+
7
,
0
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_LOW
,
"sub_lcd_en_bkl"
);
/* gpio + 15 is "sub_lcd_nRST" (output) */
gpio_request
(
gpio
+
15
,
"sub_lcd_nRST"
);
gpio_direction_output
(
gpio
+
15
,
0
);
gpio_request_one
(
gpio
+
15
,
GPIOF_OUT_INIT_LOW
,
"sub_lcd_nRST"
);
return
0
;
}
...
...
@@ -580,20 +511,10 @@ static struct twl4030_platform_data sdp3430_twldata = {
.
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
)
{
/* i2c1 for PMIC only */
omap_register_i2c_bus
(
1
,
2600
,
sdp3430_i2c_boardinfo
,
ARRAY_SIZE
(
sdp3430_i2c_boardinfo
));
omap3_pmic_init
(
"twl4030"
,
&
sdp3430_twldata
);
/* i2c2 on camera connector (for sensor control) and optional isp1301 */
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
/* i2c3 on display connector (for DVI, tfp410) */
...
...
@@ -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
)
{
int
gpio_pendown
;
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap_board_config
=
sdp3430_config
;
omap_board_config_size
=
ARRAY_SIZE
(
sdp3430_config
);
...
...
@@ -887,15 +804,12 @@ static void __init omap_3430sdp_init(void)
omap3430_i2c_init
();
omap_display_init
(
&
sdp3430_dss_data
);
if
(
omap_rev
()
>
OMAP3430_REV_ES1_0
)
ts_gpio
=
SDP3430_TS_GPIO_IRQ_SDPV2
;
gpio_pendown
=
SDP3430_TS_GPIO_IRQ_SDPV2
;
else
ts_gpio
=
SDP3430_TS_GPIO_IRQ_SDPV1
;
sdp3430_spi_board_info
[
0
].
irq
=
gpio_to_irq
(
ts_gpio
);
spi_register_board_info
(
sdp3430_spi_board_info
,
ARRAY_SIZE
(
sdp3430_spi_board_info
));
ads7846_dev_init
();
gpio_pendown
=
SDP3430_TS_GPIO_IRQ_SDPV1
;
omap_ads7846_init
(
1
,
gpio_pendown
,
310
,
NULL
);
board_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
board_smc91x_init
();
board_flash_init
(
sdp_flash_partitions
,
chip_sel_3430
,
0
);
sdp3430_display_init
();
...
...
arch/arm/mach-omap2/board-4430sdp.c
浏览文件 @
b08827f4
...
...
@@ -42,6 +42,7 @@
#include "hsmmc.h"
#include "timer-gp.h"
#include "control.h"
#include "common-board-devices.h"
#define ETH_KS8851_IRQ 34
#define ETH_KS8851_POWER_ON 48
...
...
@@ -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
)
{
int
status
;
/* 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
;
}
...
...
@@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = {
.
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
[]
=
{
{
I2C_BOARD_INFO
(
"tmp105"
,
0x48
),
...
...
@@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
};
static
int
__init
omap4_i2c_init
(
void
)
{
/*
* 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
));
omap4_pmic_init
(
"twl6030"
,
&
sdp4430_twldata
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
sdp4430_i2c_3_boardinfo
,
ARRAY_SIZE
(
sdp4430_i2c_3_boardinfo
));
...
...
@@ -616,19 +568,11 @@ static void __init omap_sfh7741prox_init(void)
{
int
error
;
error
=
gpio_request
(
OMAP4_SFH7741_ENABLE_GPIO
,
"sfh7741"
);
if
(
error
<
0
)
{
error
=
gpio_request_one
(
OMAP4_SFH7741_ENABLE_GPIO
,
GPIOF_OUT_INIT_LOW
,
"sfh7741"
);
if
(
error
<
0
)
pr_err
(
"%s:failed to request GPIO %d, error %d
\n
"
,
__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
)
...
...
@@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void)
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
)
{
int
status
;
status
=
gpio_request_one
(
HDMI_GPIO_HPD
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_hpd"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
HDMI_GPIO_HPD
);
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
);
status
=
gpio_request_array
(
sdp4430_hdmi_gpios
,
ARRAY_SIZE
(
sdp4430_hdmi_gpios
));
if
(
status
)
pr_err
(
"%s: Cannot request HDMI GPIOs
\n
"
,
__func__
);
return
status
;
}
...
...
arch/arm/mach-omap2/board-am3517crane.c
浏览文件 @
b08827f4
...
...
@@ -89,19 +89,13 @@ static void __init am3517_crane_init(void)
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
)
{
pr_err
(
"Can not request GPIO %d
\n
"
,
GPIO_USB_POWER
);
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
);
}
...
...
arch/arm/mach-omap2/board-am3517evm.c
浏览文件 @
b08827f4
...
...
@@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void)
int
r
;
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
)
{
printk
(
KERN_WARNING
"failed to request GPIO#%d
\n
"
,
GPIO_RTCS35390A_IRQ
);
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
);
}
...
...
@@ -242,6 +237,15 @@ static int dvi_enabled;
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
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
)
{
int
r
;
...
...
@@ -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_BKLIGHT_PWR
,
OMAP_PIN_INPUT_PULLDOWN
);
omap_mux_init_gpio
(
LCD_PANEL_PWM
,
OMAP_PIN_INPUT_PULLDOWN
);
/*
* Enable GPIO 182 = LCD Backlight Power
*/
r
=
gpio_request
(
LCD_PANEL_BKLIGHT_PWR
,
"lcd_backlight_pwr"
);
r
=
gpio_request_array
(
am3517_evm_dss_gpios
,
ARRAY_SIZE
(
am3517_evm_dss_gpios
));
if
(
r
)
{
printk
(
KERN_ERR
"failed to get
lcd_backlight_pwr
\n
"
);
printk
(
KERN_ERR
"failed to get
DSS panel control GPIOs
\n
"
);
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
"
);
return
;
err_2:
gpio_free
(
LCD_PANEL_PWM
);
err_1:
gpio_free
(
LCD_PANEL_BKLIGHT_PWR
);
}
#else
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)
unsigned
int
rate
;
struct
clk
*
gpmc_fck
;
int
eth_cs
;
int
err
;
gpmc_fck
=
clk_get
(
NULL
,
"gpmc_fck"
);
/* Always on ENABLE_ON_INIT */
if
(
IS_ERR
(
gpmc_fck
))
{
...
...
@@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void)
apollon_smc91x_resources
[
0
].
end
=
base
+
0x30f
;
udelay
(
100
);
omap_mux_init_gpio
(
74
,
0
);
if
(
gpio_request
(
APOLLON_ETHR_GPIO_IRQ
,
"SMC91x irq"
)
<
0
)
{
omap_mux_init_gpio
(
APOLLON_ETHR_GPIO_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
"
,
APOLLON_ETHR_GPIO_IRQ
);
gpmc_cs_free
(
APOLLON_ETH_CS
);
goto
out
;
}
gpio_direction_input
(
APOLLON_ETHR_GPIO_IRQ
);
out:
clk_disable
(
gpmc_fck
);
clk_put
(
gpmc_fck
);
...
...
@@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void)
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
)
{
/* LED0 - AA10 */
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
);
gpio_request
(
LED1_GPIO14
,
"LED1"
);
gpio_direction_output
(
LED1_GPIO14
,
0
);
/* LED2 - AA4 */
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
)
...
...
@@ -301,8 +299,7 @@ static void __init apollon_usb_init(void)
/* USB device */
/* DEVICE_SUSPEND */
omap_mux_init_signal
(
"mcbsp2_clkx.gpio_12"
,
0
);
gpio_request
(
12
,
"USB suspend"
);
gpio_direction_output
(
12
,
0
);
gpio_request_one
(
12
,
GPIOF_OUT_INIT_LOW
,
"USB suspend"
);
omap2_usbfs_init
(
&
apollon_usb_config
);
}
...
...
arch/arm/mach-omap2/board-cm-t35.c
浏览文件 @
b08827f4
...
...
@@ -54,6 +54,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define CM_T35_GPIO_PENDOWN 57
...
...
@@ -66,86 +67,28 @@
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static
struct
smsc911x_platform_config
cm_t35_smsc911x_config
=
{
.
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"
,
static
struct
omap_smsc911x_platform_data
cm_t35_smsc911x_cfg
=
{
.
id
=
0
,
.
num_resources
=
ARRAY_SIZE
(
cm_t35_smsc911x_resources
),
.
resource
=
cm_t35_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
cm_t35_smsc911x_config
,
},
};
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
,
},
.
cs
=
CM_T35_SMSC911X_CS
,
.
gpio_irq
=
CM_T35_SMSC911X_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
};
static
struct
platform_device
sb_t35_smsc911x_device
=
{
.
name
=
"smsc911x"
,
static
struct
omap_smsc911x_platform_data
sb_t35_smsc911x_cfg
=
{
.
id
=
1
,
.
num_resources
=
ARRAY_SIZE
(
sb_t35_smsc911x_resources
),
.
resource
=
sb_t35_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
cm_t35_smsc911x_config
,
},
.
cs
=
SB_T35_SMSC911X_CS
,
.
gpio_irq
=
SB_T35_SMSC911X_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
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
)
{
cm_t35_init_smsc911x
(
&
cm_t35_smsc911x_device
,
CM_T35_SMSC911X_CS
,
CM_T35_SMSC911X_GPIO
);
cm_t35_init_smsc911x
(
&
sb_t35_smsc911x_device
,
SB_T35_SMSC911X_CS
,
SB_T35_SMSC911X_GPIO
);
gpmc_smsc911x_init
(
&
cm_t35_smsc911x_cfg
);
gpmc_smsc911x_init
(
&
sb_t35_smsc911x_cfg
);
}
#else
static
inline
void
__init
cm_t35_init_ethernet
(
void
)
{
return
;
}
...
...
@@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void)
static
inline
void
cm_t35_init_nand
(
void
)
{}
#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_BL_GPIO 58
#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
dvi_enabled
;
...
...
@@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)
return
-
EINVAL
;
}
gpio_set_value
(
lcd_en_gpio
,
1
);
gpio_set_value
(
lcd_bl_gpio
,
1
);
gpio_set_value
(
CM_T35_LCD_EN_GPIO
,
1
);
gpio_set_value
(
CM_T35_LCD_BL_GPIO
,
1
);
lcd_enabled
=
1
;
...
...
@@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
{
lcd_enabled
=
0
;
gpio_set_value
(
lcd_bl_gpio
,
0
);
gpio_set_value
(
lcd_en_gpio
,
0
);
gpio_set_value
(
CM_T35_LCD_BL_GPIO
,
0
);
gpio_set_value
(
CM_T35_LCD_EN_GPIO
,
0
);
}
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
;
}
gpio_set_value
(
dvi_en_gpio
,
0
);
gpio_set_value
(
CM_T35_DVI_EN_GPIO
,
0
);
dvi_enabled
=
1
;
return
0
;
...
...
@@ -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
)
{
gpio_set_value
(
dvi_en_gpio
,
1
);
gpio_set_value
(
CM_T35_DVI_EN_GPIO
,
1
);
dvi_enabled
=
0
;
}
...
...
@@ -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
)
{
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
,
ARRAY_SIZE
(
cm_t35_lcd_spi_board_info
));
err
=
gpio_request
(
lcd_en_gpio
,
"LCD RST"
);
if
(
err
)
{
pr_err
(
"CM-T35: failed to get LCD reset GPIO
\n
"
);
goto
out
;
}
err
=
gpio_request
(
lcd_bl_gpio
,
"LCD BL"
);
if
(
err
)
{
pr_err
(
"CM-T35: failed to get LCD backlight control GPIO
\n
"
);
goto
err_lcd_bl
;
}
err
=
gpio_request
(
dvi_en_gpio
,
"DVI EN"
);
err
=
gpio_request_array
(
cm_t35_dss_gpios
,
ARRAY_SIZE
(
cm_t35_dss_gpios
));
if
(
err
)
{
pr_err
(
"CM-T35: failed to
get DVI reset GPIO
\n
"
);
goto
err_dvi_e
n
;
pr_err
(
"CM-T35: failed to
request DSS control GPIOs
\n
"
);
retur
n
;
}
gpio_export
(
lcd_en_gpio
,
0
);
gpio_export
(
lcd_bl_gpio
,
0
);
gpio_export
(
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
);
gpio_export
(
CM_T35_LCD_EN_GPIO
,
0
);
gpio_export
(
CM_T35_LCD_BL_GPIO
,
0
);
gpio_export
(
CM_T35_DVI_EN_GPIO
,
0
);
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
);
if
(
err
)
{
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
=
{
...
...
@@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
{
int
wlan_rst
=
gpio
+
2
;
if
((
gpio_request
(
wlan_rst
,
"WLAN RST"
)
==
0
)
&&
(
gpio_direction_output
(
wlan_rst
,
1
)
==
0
))
{
if
(
gpio_request_one
(
wlan_rst
,
GPIOF_OUT_INIT_HIGH
,
"WLAN RST"
)
==
0
)
{
gpio_export
(
wlan_rst
,
0
);
udelay
(
10
);
gpio_set_value
(
wlan_rst
,
0
);
udelay
(
10
);
...
...
@@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = {
.
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
)
{
omap_register_i2c_bus
(
1
,
2600
,
cm_t35_i2c_boardinfo
,
ARRAY_SIZE
(
cm_t35_i2c_boardinfo
));
omap3_pmic_init
(
"tps65930"
,
&
cm_t35_twldata
);
}
static
void
__init
cm_t35_init_early
(
void
)
...
...
@@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#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
=
{
};
...
...
@@ -792,12 +634,12 @@ static void __init cm_t35_init(void)
omap_serial_init
();
cm_t35_init_i2c
();
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_led
();
cm_t35_init_display
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
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)
{
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
)
{
pr_err
(
"CM-T3517: rtc cs en gpio request failed: %d
\n
"
,
err
);
return
;
}
gpio_direction_output
(
RTC_CS_EN_GPIO
,
1
);
platform_device_register
(
&
cm_t3517_rtc_device
);
}
#else
...
...
@@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void)
{
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
)
{
pr_err
(
"CM-T3517: usb hub rst gpio request failed: %d
\n
"
,
err
);
}
else
{
gpio_direction_output
(
USB_HUB_RESET_GPIO
,
0
);
udelay
(
10
);
gpio_set_value
(
USB_HUB_RESET_GPIO
,
1
);
msleep
(
1
);
...
...
arch/arm/mach-omap2/board-devkit8000.c
浏览文件 @
b08827f4
...
...
@@ -51,7 +51,6 @@
#include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/dm9000.h>
#include <linux/interrupt.h>
...
...
@@ -60,6 +59,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "common-board-devices.h"
#define NAND_BLOCK_SIZE SZ_128K
...
...
@@ -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
[]
=
{
{
.
mmc
=
1
,
...
...
@@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
devkit8000_lcd_device
.
reset_gpio
=
gpio
+
TWL4030_GPIO_MAX
+
0
;
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
)
{
devkit8000_lcd_device
.
reset_gpio
=
-
EINVAL
;
printk
(
KERN_ERR
"Failed to request GPIO for LCD_PWRN
\n
"
);
...
...
@@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* gpio + 7 is "DVI_PD" (out, active low) */
devkit8000_dvi_device
.
reset_gpio
=
gpio
+
7
;
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
)
{
devkit8000_dvi_device
.
reset_gpio
=
-
EINVAL
;
printk
(
KERN_ERR
"Failed to request GPIO for DVI PowerDown
\n
"
);
...
...
@@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = {
.
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
)
{
omap_register_i2c_bus
(
1
,
2600
,
devkit8000_i2c_boardinfo
,
ARRAY_SIZE
(
devkit8000_i2c_boardinfo
));
omap3_pmic_init
(
"tps65930"
,
&
devkit8000_twldata
);
/* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz */
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
...
...
@@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void)
#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
static
struct
resource
omap_dm9000_resources
[]
=
{
...
...
@@ -550,15 +483,15 @@ static void __init omap_dm9000_init(void)
{
unsigned
char
*
eth_addr
=
omap_dm9000_platdata
.
dev_addr
;
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
"
,
OMAP_DM9000_GPIO_IRQ
);
return
;
}
gpio_direction_input
(
OMAP_DM9000_GPIO_IRQ
);
/* init the mac address using DIE id */
omap_get_die_id
(
&
odi
);
...
...
@@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = {
&
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
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
...
...
@@ -795,14 +689,13 @@ static void __init devkit8000_init(void)
ARRAY_SIZE
(
devkit8000_devices
));
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
);
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 */
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
...
...
arch/arm/mach-omap2/board-igep0020.c
浏览文件 @
b08827f4
...
...
@@ -38,6 +38,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "sdram-numonyx-m65kxxxxam.h"
#include "common-board-devices.h"
#define IGEP2_SMSC911X_CS 5
#define IGEP2_SMSC911X_GPIO 176
...
...
@@ -54,6 +55,11 @@
#define IGEP2_RC_GPIO_WIFI_NRESET 139
#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
*
...
...
@@ -68,6 +74,7 @@
#define IGEP2_BOARD_HWREV_B 0
#define IGEP2_BOARD_HWREV_C 1
#define IGEP3_BOARD_HWREV 2
static
u8
hwrev
;
...
...
@@ -75,10 +82,19 @@ static void __init igep2_get_revision(void)
{
u8
ret
;
if
(
machine_is_igep0030
())
{
hwrev
=
IGEP3_BOARD_HWREV
;
return
;
}
omap_mux_init_gpio
(
IGEP2_GPIO_LED1_RED
,
OMAP_PIN_INPUT
);
if
((
gpio_request
(
IGEP2_GPIO_LED1_RED
,
"GPIO_HW0_REV"
)
==
0
)
&&
(
gpio_direction_input
(
IGEP2_GPIO_LED1_RED
)
==
0
))
{
if
(
gpio_request_one
(
IGEP2_GPIO_LED1_RED
,
GPIOF_IN
,
"GPIO_HW0_REV"
))
{
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_HW0_REV
\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
"
);
...
...
@@ -90,10 +106,6 @@ static void __init igep2_get_revision(void)
pr_err
(
"IGEP2: Unknown Hardware Revision
\n
"
);
hwrev
=
-
1
;
}
}
else
{
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_HW0_REV
\n
"
);
pr_err
(
"IGEP2: Unknown Hardware Revision
\n
"
);
}
gpio_free
(
IGEP2_GPIO_LED1_RED
);
}
...
...
@@ -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)
*/
static
struct
mtd_partition
igep
2
_onenand_partitions
[]
=
{
static
struct
mtd_partition
igep_onenand_partitions
[]
=
{
{
.
name
=
"X-Loader"
,
.
offset
=
0
,
...
...
@@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = {
},
};
static
struct
omap_onenand_platform_data
igep
2
_onenand_data
=
{
.
parts
=
igep
2
_onenand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
igep
2
_onenand_partitions
),
static
struct
omap_onenand_platform_data
igep_onenand_data
=
{
.
parts
=
igep_onenand_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
igep_onenand_partitions
),
.
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"
,
.
id
=
-
1
,
.
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
onenandcs
=
GPMC_CS_NUM
+
1
;
...
...
@@ -165,7 +177,7 @@ static void __init igep2_flash_init(void)
/* Check if NAND/oneNAND is configured */
if
((
ret
&
0xC00
)
==
0x800
)
/* NAND found */
pr_err
(
"IGEP
2
: Unsupported NAND found
\n
"
);
pr_err
(
"IGEP: Unsupported NAND found
\n
"
);
else
{
ret
=
gpmc_cs_read_reg
(
cs
,
GPMC_CS_CONFIG7
);
if
((
ret
&
0x3F
)
==
(
ONENAND_MAP
>>
24
))
...
...
@@ -175,85 +187,46 @@ static void __init igep2_flash_init(void)
}
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
;
}
igep
2
_onenand_data
.
cs
=
onenandcs
;
igep_onenand_data
.
cs
=
onenandcs
;
if
(
platform_device_register
(
&
igep
2
_onenand_device
)
<
0
)
pr_err
(
"IGEP
2
: Unable to register OneNAND device
\n
"
);
if
(
platform_device_register
(
&
igep_onenand_device
)
<
0
)
pr_err
(
"IGEP: Unable to register OneNAND device
\n
"
);
}
#else
static
void
__init
igep
2
_flash_init
(
void
)
{}
static
void
__init
igep_flash_init
(
void
)
{}
#endif
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static
struct
smsc911x_platform_config
igep2_smsc911x_config
=
{
.
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
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
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
cs
=
IGEP2_SMSC911X_CS
,
.
gpio_irq
=
IGEP2_SMSC911X_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
};
static
inline
void
__init
igep2_init_smsc911x
(
void
)
{
unsigned
long
cs_mem_base
;
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
);
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
}
#else
static
inline
void
__init
igep2_init_smsc911x
(
void
)
{
}
#endif
static
struct
regulator_consumer_supply
igep
2
_vmmc1_supply
=
static
struct
regulator_consumer_supply
igep_vmmc1_supply
=
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.0"
);
/* 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
=
{
.
min_uV
=
1850000
,
.
max_uV
=
3150000
,
...
...
@@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = {
|
REGULATOR_CHANGE_STATUS
,
},
.
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"
);
static
struct
regulator_init_data
igep
2
_vio
=
{
static
struct
regulator_init_data
igep_vio
=
{
.
constraints
=
{
.
min_uV
=
1800000
,
.
max_uV
=
1800000
,
...
...
@@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = {
|
REGULATOR_CHANGE_STATUS
,
},
.
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"
);
static
struct
regulator_init_data
igep
2
_vmmc2
=
{
static
struct
regulator_init_data
igep_vmmc2
=
{
.
constraints
=
{
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
,
.
always_on
=
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"
,
.
microvolts
=
3300000
,
.
gpio
=
-
EINVAL
,
.
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"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
igep
2
_vwlan
,
.
platform_data
=
&
igep_vwlan
,
},
};
...
...
@@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = {
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
#include <linux/leds.h>
static
struct
gpio_led
igep
2
_gpio_leds
[]
=
{
static
struct
gpio_led
igep_gpio_leds
[]
=
{
[
0
]
=
{
.
name
=
"gpio-led:red:d0"
,
.
gpio
=
IGEP2_GPIO_LED0_RED
,
.
default_trigger
=
"default-off"
},
[
1
]
=
{
.
name
=
"gpio-led:green:d0"
,
.
gpio
=
IGEP2_GPIO_LED0_GREEN
,
.
default_trigger
=
"default-off"
,
},
[
2
]
=
{
.
name
=
"gpio-led:red:d1"
,
.
gpio
=
IGEP2_GPIO_LED1_RED
,
.
default_trigger
=
"default-off"
,
},
[
3
]
=
{
...
...
@@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = {
},
};
static
struct
gpio_led_platform_data
igep
2
_led_pdata
=
{
.
leds
=
igep
2
_gpio_leds
,
.
num_leds
=
ARRAY_SIZE
(
igep
2
_gpio_leds
),
static
struct
gpio_led_platform_data
igep_led_pdata
=
{
.
leds
=
igep_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"
,
.
id
=
-
1
,
.
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
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
)
&&
(
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
"
);
int
i
;
if
((
gpio_request
(
IGEP2_GPIO_LED0_GREEN
,
"gpio-led:green:d0"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP2_GPIO_LED0_GREEN
,
0
)
==
0
))
gpio_export
(
IGEP2_GPIO_LED0_GREEN
,
0
);
else
pr_warning
(
"IGEP v2: Could not obtain gpio GPIO_LED0_GREEN
\n
"
);
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
;
}
if
((
gpio_request
(
IGEP2_GPIO_LED1_RED
,
"gpio-led:red:d1"
)
==
0
)
&&
(
gpio_direction_output
(
IGEP2_GPIO_LED1_RED
,
0
)
==
0
))
gpio_export
(
IGEP2_GPIO_LED1_RED
,
0
);
else
pr_warning
(
"IGEP v2: Could not obtain gpio GPIO_LED1_RED
\n
"
);
if
(
gpio_request_array
(
igep_gpio_leds
,
ARRAY_SIZE
(
igep_gpio_leds
)))
{
pr_warning
(
"IGEP v2: Could not obtain leds gpios
\n
"
);
return
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
igep_gpio_leds
);
i
++
)
gpio_export
(
igep_gpio_leds
[
i
].
gpio
,
0
);
}
#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
)
{
int
ret
;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc
[
0
].
gpio_cd
=
gpio
+
0
;
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) */
#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
))
ret
=
gpio_request_one
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
GPIOF_OUT_INIT_HIGH
,
"gpio-led:green:d1"
);
if
(
ret
==
0
)
gpio_export
(
gpio
+
TWL4030_GPIO_MAX
+
1
,
0
);
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
igep
2
_gpio_leds
[
3
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
igep_gpio_leds
[
3
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
#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
;
};
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
,
.
irq_base
=
TWL4030_GPIO_IRQ_BASE
,
.
irq_end
=
TWL4030_GPIO_IRQ_END
,
.
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
,
};
...
...
@@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = {
static
void
__init
igep2_display_init
(
void
)
{
if
(
gpio_request
(
IGEP2_GPIO_DVI_PUP
,
"GPIO_DVI_PUP"
)
&&
gpio_direction_output
(
IGEP2_GPIO_DVI_PUP
,
1
))
int
err
=
gpio_request_one
(
IGEP2_GPIO_DVI_PUP
,
GPIOF_OUT_INIT_HIGH
,
"GPIO_DVI_PUP"
);
if
(
err
)
pr_err
(
"IGEP v2: Could not obtain gpio GPIO_DVI_PUP
\n
"
);
}
static
struct
platform_device
*
igep
2
_devices
[]
__initdata
=
{
&
igep
2
_vwlan_device
,
static
struct
platform_device
*
igep_devices
[]
__initdata
=
{
&
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_devices
(
m65kxxxxam_sdrc_params
,
...
...
@@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = {
.
rep
=
1
,
};
static
struct
twl4030_platform_data
igep
2
_twldata
=
{
static
struct
twl4030_platform_data
igep_twldata
=
{
.
irq_base
=
TWL4030_IRQ_BASE
,
.
irq_end
=
TWL4030_IRQ_END
,
/* platform_data for children goes here */
.
usb
=
&
igep2_usb_data
,
.
codec
=
&
igep2_codec_data
,
.
gpio
=
&
igep2_twl4030_gpio_pdata
,
.
keypad
=
&
igep2_keypad_pdata
,
.
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
,
},
.
usb
=
&
igep_usb_data
,
.
gpio
=
&
igep_twl4030_gpio_pdata
,
.
vmmc1
=
&
igep_vmmc1
,
.
vio
=
&
igep_vio
,
};
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
;
ret
=
omap_register_i2c_bus
(
1
,
2600
,
igep2_i2c1_boardinfo
,
ARRAY_SIZE
(
igep2_i2c1_boardinfo
));
if
(
ret
)
pr_warning
(
"IGEP2: Could not register I2C1 bus (%d)
\n
"
,
ret
);
if
(
machine_is_igep0020
())
{
/*
* Bus 3 is attached to the DVI port where devices like the pico DLP
*
projector don't work reliably with 400kHz
* 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
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
};
igep_twldata
.
codec
=
&
igep2_codec_data
;
igep_twldata
.
keypad
=
&
igep2_keypad_pdata
;
igep_twldata
.
vpll2
=
&
igep2_vpll2
;
}
omap3_pmic_init
(
"twl4030"
,
&
igep_twldata
);
}
static
const
struct
usbhs_omap_board_data
usbhs_bdata
__initconst
=
{
static
const
struct
usbhs_omap_board_data
igep2_
usbhs_bdata
__initconst
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
.
port_mode
[
1
]
=
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 = {
.
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
static
struct
omap_board_mux
board_mux
[]
__initdata
=
{
{
.
reg_offset
=
OMAP_MUX_TERMINATOR
},
...
...
@@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = {
#endif
#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 */
if
(
hwrev
==
IGEP2_BOARD_HWREV_B
)
{
npd
=
IGEP2_RB_GPIO_WIFI_NPD
;
wreset
=
IGEP2_RB_GPIO_WIFI_NRESET
;
btreset
=
IGEP2_RB_GPIO_BT_NRESET
;
}
else
if
(
hwrev
==
IGEP2_BOARD_HWREV_C
)
{
npd
=
IGEP2_RC_GPIO_WIFI_NPD
;
wreset
=
IGEP2_RC_GPIO_WIFI_NRESET
;
btreset
=
IGEP2_RC_GPIO_BT_NRESET
;
igep_wlan_bt_gpios
[
0
].
gpio
=
IGEP2_RB_GPIO_WIFI_NPD
;
igep_wlan_bt_gpios
[
1
].
gpio
=
IGEP2_RB_GPIO_WIFI_NRESET
;
igep_wlan_bt_gpios
[
2
].
gpio
=
IGEP2_RB_GPIO_BT_NRESET
;
}
else
if
(
hwrev
==
IGEP2_BOARD_HWREV_C
||
machine_is_igep0030
()
)
{
igep_wlan_bt_gpios
[
0
].
gpio
=
IGEP2_RC_GPIO_WIFI_NPD
;
igep_wlan_bt_gpios
[
1
].
gpio
=
IGEP2_RC_GPIO_WIFI_NRESET
;
igep_wlan_bt_gpios
[
2
].
gpio
=
IGEP2_RC_GPIO_BT_NRESET
;
}
else
return
;
/* Set GPIO's for WLAN-BT combo module */
if
((
gpio_request
(
npd
,
"GPIO_WIFI_NPD"
)
==
0
)
&&
(
gpio_direction_output
(
npd
,
1
)
==
0
))
{
gpio_export
(
npd
,
0
);
}
else
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_WIFI_NPD
\n
"
);
err
=
gpio_request_array
(
igep_wlan_bt_gpios
,
ARRAY_SIZE
(
igep_wlan_bt_gpios
));
if
(
err
)
{
pr_warning
(
"IGEP2: Could not obtain WIFI/BT gpios
\n
"
);
return
;
}
gpio_export
(
igep_wlan_bt_gpios
[
0
].
gpio
,
0
);
gpio_export
(
igep_wlan_bt_gpios
[
1
].
gpio
,
0
);
gpio_export
(
igep_wlan_bt_gpios
[
2
].
gpio
,
0
);
if
((
gpio_request
(
wreset
,
"GPIO_WIFI_NRESET"
)
==
0
)
&&
(
gpio_direction_output
(
wreset
,
1
)
==
0
))
{
gpio_export
(
wreset
,
0
);
gpio_set_value
(
wreset
,
0
);
gpio_set_value
(
igep_wlan_bt_gpios
[
1
].
gpio
,
0
);
udelay
(
10
);
gpio_set_value
(
wreset
,
1
);
}
else
pr_warning
(
"IGEP2: Could not obtain gpio GPIO_WIFI_NRESET
\n
"
);
gpio_set_value
(
igep_wlan_bt_gpios
[
1
].
gpio
,
1
);
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
static
inline
void
__init
igep
2
_wlan_bt_init
(
void
)
{
}
static
inline
void
__init
igep_wlan_bt_init
(
void
)
{
}
#endif
static
void
__init
igep
2
_init
(
void
)
static
void
__init
igep_init
(
void
)
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
/* Get IGEP2 hardware revision */
igep2_get_revision
();
/* Register I2C busses and drivers */
igep2_i2c_init
();
platform_add_devices
(
igep2_devices
,
ARRAY_SIZE
(
igep2_devices
));
omap_display_init
(
&
igep2_dss_data
);
igep_i2c_init
();
platform_add_devices
(
igep_devices
,
ARRAY_SIZE
(
igep_devices
));
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usbhs_init
(
&
usbhs_bdata
);
usb_musb_init
(
NULL
);
igep2_flash_init
();
igep2_leds_init
();
igep2_display_init
();
igep2_init_smsc911x
();
igep_flash_init
();
igep_leds_init
();
/*
* WLAN-BT combo module from MuRata which has a Marvell WLAN
* (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"
)
.
boot_params
=
0x80000100
,
.
reserve
=
omap_reserve
,
.
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_machine
=
igep
2
_init
,
.
init_machine
=
igep_init
,
.
timer
=
&
omap_timer
,
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 @@
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/regulator/machine.h>
#include <linux/i2c/twl.h>
#include <linux/io.h>
...
...
@@ -43,47 +42,19 @@
#include <asm/delay.h>
#include <plat/usb.h>
#include <plat/gpmc-smsc911x.h>
#include "board-flash.h"
#include "mux.h"
#include "hsmmc.h"
#include "control.h"
#include "common-board-devices.h"
#define LDP_SMSC911X_CS 1
#define LDP_SMSC911X_GPIO 152
#define DEBUG_BASE 0x08000000
#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
[]
=
{
KEY
(
0
,
0
,
KEY_1
),
KEY
(
1
,
0
,
KEY_2
),
...
...
@@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = {
},
};
static
int
ts_gpio
;
/**
* @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 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
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
cs
=
LDP_SMSC911X_CS
,
.
gpio_irq
=
LDP_SMSC911X_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
SMSC911X_USE_32BIT
,
};
static
inline
void
__init
ldp_init_smsc911x
(
void
)
{
int
eth_cs
;
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
);
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
}
static
struct
platform_device
ldp_lcd_device
=
{
...
...
@@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = {
.
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
)
{
omap_register_i2c_bus
(
1
,
2600
,
ldp_i2c_boardinfo
,
ARRAY_SIZE
(
ldp_i2c_boardinfo
));
omap3_pmic_init
(
"twl4030"
,
&
ldp_twldata
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
return
0
;
...
...
@@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
};
static
struct
platform_device
*
ldp_devices
[]
__initdata
=
{
&
ldp_smsc911x_device
,
&
ldp_lcd_device
,
&
ldp_gpio_keys_device
,
};
...
...
@@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#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
[]
=
{
/* All the partition sizes are listed in terms of NAND block size */
{
...
...
@@ -446,13 +334,9 @@ static void __init omap_ldp_init(void)
ldp_init_smsc911x
();
omap_i2c_init
();
platform_add_devices
(
ldp_devices
,
ARRAY_SIZE
(
ldp_devices
));
ts_gpio
=
54
;
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_ads7846_init
(
1
,
54
,
310
,
NULL
);
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
board_nand_init
(
ldp_nand_partitions
,
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)
static
char
announce
[]
__initdata
=
KERN_INFO
"TUSB 6010
\n
"
;
/* 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
)
{
printk
(
KERN_ERR
"Could not get TUSB power GPIO%i
\n
"
,
TUSB6010_GPIO_ENABLE
);
return
;
}
gpio_direction_output
(
TUSB6010_GPIO_ENABLE
,
0
);
tusb_set_power
(
0
);
ret
=
tusb6010_setup_interface
(
&
tusb_data
,
TUSB6010_REFCLK_19
,
2
,
...
...
@@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = {
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
;
...
...
@@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void)
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
)
return
;
gpio_direction_output
(
N8X0_SLOT_SWITCH_GPIO
,
0
);
if
(
machine_is_nokia_n810
())
{
err
=
gpio_request
(
N810_EMMC_VSD_GPIO
,
"MMC slot 2 Vddf"
);
err
=
gpio_request_array
(
n810_emmc_gpios
,
ARRAY_SIZE
(
n810_emmc_gpios
));
if
(
err
)
{
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
)
{
gpio_free
(
N8X0_SLOT_SWITCH_GPIO
);
gpio_free
(
N810_EMMC_VSD_GPIO
);
return
;
}
gpio_direction_output
(
N810_EMMC_VIO_GPIO
,
0
);
}
mmc_data
[
0
]
=
&
mmc1_data
;
...
...
arch/arm/mach-omap2/board-omap3beagle.c
浏览文件 @
b08827f4
...
...
@@ -52,6 +52,7 @@
#include "hsmmc.h"
#include "timer-gp.h"
#include "pm.h"
#include "common-board-devices.h"
#define NAND_BLOCK_SIZE SZ_128K
...
...
@@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void)
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
)
{
int
ret
;
...
...
@@ -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
(
173
,
OMAP_PIN_INPUT_PULLUP
);
ret
=
gpio_request
(
171
,
"rev_id_0"
);
if
(
ret
<
0
)
goto
fail0
;
ret
=
gpio_request
(
172
,
"rev_id_1"
);
if
(
ret
<
0
)
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
);
ret
=
gpio_request_array
(
omap3_beagle_rev_gpios
,
ARRAY_SIZE
(
omap3_beagle_rev_gpios
));
if
(
ret
<
0
)
{
printk
(
KERN_ERR
"Unable to get revision detection GPIO pins
\n
"
);
omap3_beagle_version
=
OMAP3BEAGLE_BOARD_UNKN
;
return
;
}
beagle_rev
=
gpio_get_value
(
171
)
|
(
gpio_get_value
(
172
)
<<
1
)
|
(
gpio_get_value
(
173
)
<<
2
);
...
...
@@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void)
printk
(
KERN_INFO
"OMAP3 Beagle Rev: unknown %hd
\n
"
,
beagle_rev
);
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
[]
=
{
...
...
@@ -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 */
static
int
beagle_enable_dvi
(
struct
omap_dss_device
*
dssdev
)
...
...
@@ -243,13 +221,10 @@ static void __init beagle_display_init(void)
{
int
r
;
r
=
gpio_request
(
beagle_dvi_device
.
reset_gpio
,
"DVI reset"
);
if
(
r
<
0
)
{
r
=
gpio_request_one
(
beagle_dvi_device
.
reset_gpio
,
GPIOF_OUT_INIT_LOW
,
"DVI reset"
);
if
(
r
<
0
)
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"
...
...
@@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[];
static
int
beagle_twl_gpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
ngpio
)
{
int
r
;
int
r
,
usb_pwr_level
;
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
mmc
[
0
].
gpio_wp
=
-
EINVAL
;
...
...
@@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev,
beagle_vmmc1_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
* 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
)
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
usb_pwr_level
=
GPIOF_OUT_INIT_HIGH
;
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
:
* gpio + 2 control varies depending on the board rev as below
:
* P7/P8 revisions(prototype): Camera EN
* A2+ revisions (production): LDO (supplies
DVI, serial, led blocks)
* A2+ revisions (production): LDO (
DVI, serial, led blocks)
*/
if
(
omap3_beagle_get_rev
()
==
OMAP3BEAGLE_BOARD_XM
)
{
r
=
gpio_request
(
gpio
+
1
,
"nDVI_PWR_EN"
);
if
(
!
r
)
{
r
=
gpio_direction_output
(
gpio
+
1
,
0
);
if
(
r
)
gpio_free
(
gpio
+
1
);
}
r
=
gpio_request_one
(
gpio
+
1
,
GPIOF_OUT_INIT_LOW
,
"nDVI_PWR_EN"
);
if
(
r
)
pr_err
(
"%s: unable to configure nDVI_PWR_EN
\n
"
,
__func__
);
r
=
gpio_request
(
gpio
+
2
,
"DVI_LDO_EN"
);
if
(
!
r
)
{
r
=
gpio_direction_output
(
gpio
+
2
,
1
);
if
(
r
)
gpio_free
(
gpio
+
2
);
}
r
=
gpio_request_one
(
gpio
+
2
,
GPIOF_OUT_INIT_HIGH
,
"DVI_LDO_EN"
);
if
(
r
)
pr_err
(
"%s: unable to configure DVI_LDO_EN
\n
"
,
__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
;
}
...
...
@@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = {
.
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
[]
=
{
{
I2C_BOARD_INFO
(
"eeprom"
,
0x50
),
...
...
@@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
static
int
__init
omap3_beagle_i2c_init
(
void
)
{
omap_register_i2c_bus
(
1
,
2600
,
beagle_i2c_boardinfo
,
ARRAY_SIZE
(
beagle_i2c_boardinfo
));
omap3_pmic_init
(
"twl4030"
,
&
beagle_twldata
);
/* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz */
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 = {
&
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
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
...
...
@@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#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
)
{
int
r
=
0
;
...
...
@@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void)
omap_serial_init
();
omap_mux_init_gpio
(
170
,
OMAP_PIN_INPUT
);
gpio_request
(
170
,
"DVI_nPD"
);
/* 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
);
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 */
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
...
...
arch/arm/mach-omap2/board-omap3evm.c
浏览文件 @
b08827f4
...
...
@@ -50,6 +50,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define OMAP3_EVM_TS_GPIO 175
#define OMAP3_EVM_EHCI_VBUS 22
...
...
@@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void)
}
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
static
struct
resource
omap3evm_smsc911x_resources
[]
=
{
[
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
=
{
.
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
),
};
#include <plat/gpmc-smsc911x.h>
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
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
cs
=
OMAP3EVM_SMSC911X_CS
,
.
gpio_irq
=
OMAP3EVM_ETHR_GPIO_IRQ
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
SMSC911X_USE_32BIT
|
SMSC911X_SAVE_MAC_ADDRESS
,
};
static
inline
void
__init
omap3evm_init_smsc911x
(
void
)
{
int
eth_cs
,
eth_rst
;
struct
clk
*
l3ck
;
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"
);
if
(
IS_ERR
(
l3ck
))
rate
=
100000000
;
...
...
@@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void)
/* Configure ethernet controller reset gpio */
if
(
cpu_is_omap3430
())
{
if
(
gpio_request
(
eth_rst
,
"SMSC911x gpio"
)
<
0
)
{
pr_err
(
KERN_ERR
"Failed to request %d for smsc911x
\n
"
,
eth_rst
);
return
;
}
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
;
if
(
get_omap3_evm_rev
()
==
OMAP3EVM_BOARD_GEN_1
)
smsc911x_cfg
.
gpio_reset
=
OMAP3EVM_GEN1_ETHR_GPIO_RST
;
else
smsc911x_cfg
.
gpio_reset
=
OMAP3EVM_GEN2_ETHR_GPIO_RST
;
}
gpio_direction_input
(
OMAP3EVM_ETHR_GPIO_IRQ
);
platform_device_register
(
&
omap3evm_smsc911x_device
);
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
}
#else
...
...
@@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }
#define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
#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
dvi_enabled
;
...
...
@@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void)
{
int
r
;
r
=
gpio_request
(
OMAP3EVM_LCD_PANEL_RESB
,
"lcd_panel_resb"
);
if
(
r
)
{
printk
(
KERN_ERR
"failed to get lcd_panel_resb
\n
"
);
return
;
}
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
);
r
=
gpio_request_array
(
omap3_evm_dss_gpios
,
ARRAY_SIZE
(
omap3_evm_dss_gpios
));
if
(
r
)
printk
(
KERN_ERR
"failed to get lcd_panel_* gpios
\n
"
);
}
static
int
omap3_evm_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
...
...
@@ -448,7 +358,7 @@ static struct platform_device leds_gpio = {
static
int
omap3evm_twl_gpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
ngpio
)
{
int
r
;
int
r
,
lcd_bl_en
;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
omap_mux_init_gpio
(
63
,
OMAP_PIN_INPUT
);
...
...
@@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
*/
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
r
=
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"EN_LCD_BKL"
);
if
(
!
r
)
r
=
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
(
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
)
?
1
:
0
);
lcd_bl_en
=
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
?
GPIOF_OUT_INIT_HIGH
:
GPIOF_OUT_INIT_LOW
;
r
=
gpio_request_one
(
gpio
+
TWL4030_GPIO_MAX
,
lcd_bl_en
,
"EN_LCD_BKL"
);
if
(
r
)
printk
(
KERN_ERR
"failed to get/set lcd_bkl gpio
\n
"
);
/* gpio + 7 == DVI Enable */
gpio_request
(
gpio
+
7
,
"EN_DVI"
);
gpio_direction_output
(
gpio
+
7
,
0
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_LOW
,
"EN_DVI"
);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
...
...
@@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = {
.
vdac
=
&
omap3_evm_vdac
,
.
vpll2
=
&
omap3_evm_vpll2
,
.
vio
=
&
omap3evm_vio
,
};
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
,
},
.
vmmc1
=
&
omap3evm_vmmc1
,
.
vsim
=
&
omap3evm_vsim
,
};
static
int
__init
omap3_evm_i2c_init
(
void
)
{
/*
* 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
));
omap3_pmic_init
(
"twl4030"
,
&
omap3evm_twldata
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
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
=
{
};
...
...
@@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = {
.
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
)
{
omap3_evm_get_revision
();
...
...
@@ -841,9 +694,6 @@ static void __init omap3_evm_init(void)
omap_display_init
(
&
omap3_evm_dss_data
);
spi_register_board_info
(
omap3evm_spi_board_info
,
ARRAY_SIZE
(
omap3evm_spi_board_info
));
omap_serial_init
();
/* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
...
...
@@ -851,16 +701,12 @@ static void __init omap3_evm_init(void)
if
(
get_omap3_evm_rev
()
>=
OMAP3EVM_BOARD_GEN_2
)
{
/* enable EHCI VBUS using GPIO22 */
omap_mux_init_gpio
(
22
,
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
);
omap_mux_init_gpio
(
OMAP3_EVM_EHCI_VBUS
,
OMAP_PIN_INPUT_PULLUP
);
/* Select EHCI port on main board */
omap_mux_init_gpio
(
61
,
OMAP_PIN_INPUT_PULLUP
);
gpio_request
(
OMAP3_EVM_EHCI_SELECT
,
"select EHCI port"
);
gpio_
direction_output
(
OMAP3_EVM_EHCI_SELECT
,
0
);
gpio_set_value
(
OMAP3_EVM_EHCI_SELECT
,
0
);
omap_mux_init_gpio
(
OMAP3_EVM_EHCI_SELECT
,
OMAP_PIN_INPUT_PULLUP
);
gpio_
request_array
(
omap3_evm_ehci_gpios
,
ARRAY_SIZE
(
omap3_evm_ehci_gpios
)
);
/* setup EHCI phy reset config */
omap_mux_init_gpio
(
21
,
OMAP_PIN_INPUT_PULLUP
);
...
...
@@ -876,7 +722,7 @@ static void __init omap3_evm_init(void)
}
usb_musb_init
(
&
musb_board_data
);
usbhs_init
(
&
usbhs_bdata
);
ads7846_dev_init
(
);
omap_ads7846_init
(
1
,
OMAP3_EVM_TS_GPIO
,
310
,
NULL
);
omap3evm_init_smsc911x
();
omap3_evm_display_init
();
...
...
arch/arm/mach-omap2/board-omap3logic.c
浏览文件 @
b08827f4
...
...
@@ -37,6 +37,7 @@
#include "hsmmc.h"
#include "timer-gp.h"
#include "control.h"
#include "common-board-devices.h"
#include <plat/mux.h>
#include <plat/board.h>
...
...
@@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = {
.
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
)
{
omap_register_i2c_bus
(
1
,
2600
,
omap3logic_i2c_boardinfo
,
ARRAY_SIZE
(
omap3logic_i2c_boardinfo
));
omap3_pmic_init
(
"twl4030"
,
&
omap3logic_twldata
);
return
0
;
}
...
...
@@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
.
cs
=
OMAP3LOGIC_SMSC911X_CS
,
.
gpio_irq
=
-
EINVAL
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
IORESOURCE_IRQ_LOWLEVEL
,
};
/* TODO/FIXME (comment by Peter Barada, LogicPD):
...
...
arch/arm/mach-omap2/board-omap3pandora.c
浏览文件 @
b08827f4
...
...
@@ -22,7 +22,6 @@
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/regulator/machine.h>
#include <linux/i2c/twl.h>
#include <linux/wl12xx.h>
...
...
@@ -52,6 +51,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define PANDORA_WIFI_IRQ_GPIO 21
#define PANDORA_WIFI_NRESET_GPIO 23
...
...
@@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
/* gpio + 13 drives 32kHz buffer for wifi module */
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
)
{
pr_err
(
"Cannot get GPIO line %d, ret=%d
\n
"
,
gpio_32khz
,
ret
);
goto
fail
;
}
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
-
ENODEV
;
}
return
0
;
fail_direction:
gpio_free
(
gpio_32khz
);
fail:
return
-
ENODEV
;
}
static
struct
twl4030_gpio_platform_data
omap3pandora_gpio_data
=
{
...
...
@@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = {
.
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
[]
=
{
{
I2C_BOARD_INFO
(
"bq27500"
,
0x55
),
...
...
@@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
static
int
__init
omap3pandora_i2c_init
(
void
)
{
omap_register_i2c_bus
(
1
,
2600
,
omap3pandora_i2c_boardinfo
,
ARRAY_SIZE
(
omap3pandora_i2c_boardinfo
));
omap3_pmic_init
(
"tps65950"
,
&
omap3pandora_twldata
);
/* i2c2 pins are not connected */
omap_register_i2c_bus
(
3
,
100
,
omap3pandora_i2c3_boardinfo
,
ARRAY_SIZE
(
omap3pandora_i2c3_boardinfo
));
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
=
{
{
.
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"
,
.
bus_num
=
1
,
.
chip_select
=
1
,
...
...
@@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void)
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
)
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
);
if
(
pandora_wl1251_pdata
.
irq
<
0
)
goto
fail_irq
;
...
...
@@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#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
)
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
...
...
@@ -705,9 +629,9 @@ static void __init omap3pandora_init(void)
omap_serial_init
();
spi_register_board_info
(
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
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
gpmc_nand_init
(
&
pandora_nand_data
);
/* Ensure SDRC pins are mux'd for self-refresh */
...
...
arch/arm/mach-omap2/board-omap3stalker.c
浏览文件 @
b08827f4
...
...
@@ -45,7 +45,6 @@
#include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/interrupt.h>
#include <linux/smsc911x.h>
#include <linux/i2c/at24.h>
...
...
@@ -54,52 +53,28 @@
#include "mux.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "common-board-devices.h"
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <plat/gpmc-smsc911x.h>
#define OMAP3STALKER_ETHR_START 0x2c000000
#define OMAP3STALKER_ETHR_SIZE 1024
#define OMAP3STALKER_ETHR_GPIO_IRQ 19
#define OMAP3STALKER_SMC911X_CS 5
static
struct
resource
omap3stalker_smsc911x_resources
[]
=
{
[
0
]
=
{
.
start
=
OMAP3STALKER_ETHR_START
,
.
end
=
(
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
,
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
cs
=
OMAP3STALKER_SMC911X_CS
,
.
gpio_irq
=
OMAP3STALKER_ETHR_GPIO_IRQ
,
.
gpio_reset
=
-
EINVAL
,
.
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
)
{
int
eth_cs
;
struct
clk
*
l3ck
;
unsigned
int
rate
;
eth_cs
=
OMAP3STALKER_SMC911X_CS
;
l3ck
=
clk_get
(
NULL
,
"l3_ck"
);
if
(
IS_ERR
(
l3ck
))
rate
=
100000000
;
...
...
@@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void)
rate
=
clk_get_rate
(
l3ck
);
omap_mux_init_gpio
(
19
,
OMAP_PIN_INPUT_PULLUP
);
if
(
gpio_request
(
OMAP3STALKER_ETHR_GPIO_IRQ
,
"SMC911x irq"
)
<
0
)
{
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
);
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
}
#else
...
...
@@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev,
*/
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"EN_LCD_BKL"
);
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
0
);
gpio_request
_one
(
gpio
+
TWL4030_GPIO_MAX
,
GPIOF_OUT_INIT_LOW
,
"EN_LCD_BKL"
);
/* gpio + 7 == DVI Enable */
gpio_request
(
gpio
+
7
,
"EN_DVI"
);
gpio_direction_output
(
gpio
+
7
,
0
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_LOW
,
"EN_DVI"
);
/* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
...
...
@@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = {
.
codec
=
&
omap3stalker_codec_data
,
.
vdac
=
&
omap3_stalker_vdac
,
.
vpll2
=
&
omap3_stalker_vpll2
,
};
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
,
},
.
vmmc1
=
&
omap3stalker_vmmc1
,
.
vsim
=
&
omap3stalker_vsim
,
};
static
struct
at24_platform_data
fram_info
=
{
...
...
@@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
static
int
__init
omap3_stalker_i2c_init
(
void
)
{
/*
* 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
));
omap3_pmic_init
(
"twl4030"
,
&
omap3stalker_twldata
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
omap3stalker_i2c_boardinfo3
,
ARRAY_SIZE
(
omap3stalker_i2c_boardinfo3
));
...
...
@@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void)
}
#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
=
{
};
...
...
@@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#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
)
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CUS
);
...
...
@@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void)
ARRAY_SIZE
(
omap3_stalker_devices
));
omap_display_init
(
&
omap3_stalker_dss_data
);
spi_register_board_info
(
omap3stalker_spi_board_info
,
ARRAY_SIZE
(
omap3stalker_spi_board_info
));
omap_serial_init
();
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
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
(
18
,
OMAP_PIN_INPUT_PULLUP
);
...
...
arch/arm/mach-omap2/board-omap3touchbook.c
浏览文件 @
b08827f4
...
...
@@ -52,6 +52,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "timer-gp.h"
#include "common-board-devices.h"
#include <asm/setup.h>
...
...
@@ -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"
static
struct
omap2_hsmmc_info
mmc
[]
=
{
...
...
@@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev,
/* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
gpio_request
(
gpio
+
1
,
"EHCI_nOC"
);
gpio_direction_input
(
gpio
+
1
);
gpio_request_one
(
gpio
+
1
,
GPIOF_IN
,
"EHCI_nOC"
);
/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
gpio_request
(
gpio
+
TWL4030_GPIO_MAX
,
"nEN_USB_PWR"
);
gpio_direction_output
(
gpio
+
TWL4030_GPIO_MAX
,
0
);
gpio_request
_one
(
gpio
+
TWL4030_GPIO_MAX
,
GPIOF_OUT_INIT_LOW
,
"nEN_USB_PWR"
);
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds
[
2
].
gpio
=
gpio
+
TWL4030_GPIO_MAX
+
1
;
...
...
@@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = {
.
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
[]
=
{
{
I2C_BOARD_INFO
(
"bq27200"
,
0x55
),
...
...
@@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
static
int
__init
omap3_touchbook_i2c_init
(
void
)
{
/* Standard TouchBook bus */
omap_register_i2c_bus
(
1
,
2600
,
touchbook_i2c_boardinfo
,
ARRAY_SIZE
(
touchbook_i2c_boardinfo
));
omap3_pmic_init
(
"twl4030"
,
&
touchbook_twldata
);
/* Additional TouchBook bus */
omap_register_i2c_bus
(
3
,
100
,
touchBook_i2c_boardinfo
,
...
...
@@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void)
return
0
;
}
static
void
__init
omap3_ads7846_init
(
void
)
{
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
=
{
static
struct
ads7846_platform_data
ads7846_pdata
=
{
.
x_min
=
100
,
.
y_min
=
265
,
.
x_max
=
3950
,
...
...
@@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = {
.
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
[]
=
{
{
.
name
=
"touchbook::usr0"
,
...
...
@@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = {
&
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
=
{
.
port_mode
[
0
]
=
OMAP_EHCI_PORT_MODE_PHY
,
...
...
@@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
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
(
r
<
0
)
{
if
(
gpio_request_one
(
pwr_off
,
GPIOF_OUT_INIT_LOW
,
"DVI reset"
)
<
0
)
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
)
...
...
@@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p)
}
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
)
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
...
...
@@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void)
omap_serial_init
();
omap_mux_init_gpio
(
170
,
OMAP_PIN_INPUT
);
gpio_request
(
176
,
"DVI_nPD"
);
/* 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 */
spi_register_board_info
(
omap3_ads7846_spi_board_info
,
ARRAY_SIZE
(
omap3_ads7846_spi_board_info
));
omap3_ads7846_init
();
usb_musb_init
(
&
musb_board_data
);
omap_ads7846_init
(
4
,
OMAP3_TS_GPIO
,
310
,
&
ads7846_pdata
);
usb_musb_init
(
NULL
);
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 */
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
...
...
arch/arm/mach-omap2/board-omap4panda.c
浏览文件 @
b08827f4
...
...
@@ -46,6 +46,7 @@
#include "hsmmc.h"
#include "control.h"
#include "mux.h"
#include "common-board-devices.h"
#define GPIO_HUB_POWER 1
#define GPIO_HUB_NRESET 62
...
...
@@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.
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
)
{
int
ret
;
...
...
@@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void)
phy_ref_clk
=
clk_get
(
NULL
,
"auxclk3_ck"
);
if
(
IS_ERR
(
phy_ref_clk
))
{
pr_err
(
"Cannot request auxclk3
\n
"
);
goto
error1
;
return
;
}
clk_set_rate
(
phy_ref_clk
,
19200000
);
clk_enable
(
phy_ref_clk
);
/* disable the power to the usb hub prior to init */
ret
=
gpio_request
(
GPIO_HUB_POWER
,
"hub_power"
);
/* disable the power to the usb hub prior to init and reset phy+hub */
ret
=
gpio_request_array
(
panda_ehci_gpios
,
ARRAY_SIZE
(
panda_ehci_gpios
));
if
(
ret
)
{
pr_err
(
"
Cannot request GPIO %d
\n
"
,
GPIO_HUB_POWER
);
goto
error1
;
pr_err
(
"
Unable to initialize EHCI power/reset
\n
"
);
return
;
}
gpio_export
(
GPIO_HUB_POWER
,
0
);
gpio_direction_output
(
GPIO_HUB_POWER
,
0
);
gpio_set_value
(
GPIO_HUB_POWER
,
0
);
/* reset phy+hub */
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_POWER
,
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
);
usbhs_init
(
&
usbhs_bdata
);
/* enable power to hub */
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
=
{
...
...
@@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = {
.
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
* 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[] = {
static
int
__init
omap4_panda_i2c_init
(
void
)
{
/*
* 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
));
omap4_pmic_init
(
"twl6030"
,
&
omap4_panda_twldata
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
/*
* 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)
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
)
{
int
status
;
status
=
gpio_request_one
(
HDMI_GPIO_HPD
,
GPIOF_OUT_INIT_HIGH
,
"hdmi_gpio_hpd"
);
if
(
status
)
{
pr_err
(
"Cannot request GPIO %d
\n
"
,
HDMI_GPIO_HPD
);
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
);
status
=
gpio_request_array
(
panda_hdmi_gpios
,
ARRAY_SIZE
(
panda_hdmi_gpios
));
if
(
status
)
pr_err
(
"Cannot request HDMI GPIOs
\n
"
);
return
status
;
}
...
...
arch/arm/mach-omap2/board-overo.c
浏览文件 @
b08827f4
...
...
@@ -56,6 +56,7 @@
#include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define OVERO_GPIO_BT_XGATE 15
#define OVERO_GPIO_W2W_NRESET 16
...
...
@@ -74,30 +75,6 @@
#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
(
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 */
static
struct
regulator_consumer_supply
ads7846_supply
=
REGULATOR_SUPPLY
(
"vcc"
,
"spi1.0"
);
...
...
@@ -128,14 +105,7 @@ static struct platform_device vads7846_device = {
static
void
__init
overo_ads7846_init
(
void
)
{
if
((
gpio_request
(
OVERO_GPIO_PENDOWN
,
"ADS7846_PENDOWN"
)
==
0
)
&&
(
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
;
}
omap_ads7846_init
(
1
,
OVERO_GPIO_PENDOWN
,
0
,
NULL
);
platform_device_register
(
&
vads7846_device
);
}
...
...
@@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; }
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static
struct
resource
overo_smsc911x_resources
[]
=
{
{
.
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"
,
static
struct
omap_smsc911x_platform_data
smsc911x_cfg
=
{
.
id
=
0
,
.
num_resources
=
ARRAY_SIZE
(
overo_smsc911x_resources
),
.
resource
=
overo_smsc911x_resources
,
.
dev
=
{
.
platform_data
=
&
overo_smsc911x_config
,
},
.
cs
=
OVERO_SMSC911X_CS
,
.
gpio_irq
=
OVERO_SMSC911X_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
SMSC911X_USE_32BIT
,
};
static
struct
platform_device
overo_smsc911x2_device
=
{
.
name
=
"smsc911x"
,
static
struct
omap_smsc911x_platform_data
smsc911x2_cfg
=
{
.
id
=
1
,
.
num_resources
=
ARRAY_SIZE
(
overo_smsc911x2_resources
),
.
resource
=
overo_smsc911x2_resources
,
.
dev
=
{
.
platform_data
=
&
overo_smsc911x_config
,
},
};
static
struct
platform_device
*
smsc911x_devices
[]
=
{
&
overo_smsc911x_device
,
&
overo_smsc911x2_device
,
.
cs
=
OVERO_SMSC911X2_CS
,
.
gpio_irq
=
OVERO_SMSC911X2_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
flags
=
SMSC911X_USE_32BIT
,
};
static
inline
void
__init
overo_init_smsc911x
(
void
)
static
void
__init
overo_init_smsc911x
(
void
)
{
unsigned
long
cs_mem_base
,
cs_mem_base2
;
/* 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
));
gpmc_smsc911x_init
(
&
smsc911x_cfg
);
gpmc_smsc911x_init
(
&
smsc911x2_cfg
);
}
#else
...
...
@@ -259,21 +151,20 @@ static int dvi_enabled;
#define OVERO_GPIO_LCD_EN 144
#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
)
{
if
((
gpio_request
(
OVERO_GPIO_LCD_EN
,
"OVERO_GPIO_LCD_EN"
)
==
0
)
&&
(
gpio_direction_output
(
OVERO_GPIO_LCD_EN
,
1
)
==
0
))
gpio_export
(
OVERO_GPIO_LCD_EN
,
0
);
else
printk
(
KERN_ERR
"could not obtain gpio for "
"OVERO_GPIO_LCD_EN
\n
"
);
if
(
gpio_request_array
(
overo_dss_gpios
,
ARRAY_SIZE
(
overo_dss_gpios
)))
{
printk
(
KERN_ERR
"could not obtain DSS control GPIOs
\n
"
);
return
;
}
if
((
gpio_request
(
OVERO_GPIO_LCD_BL
,
"OVERO_GPIO_LCD_BL"
)
==
0
)
&&
(
gpio_direction_output
(
OVERO_GPIO_LCD_BL
,
1
)
==
0
))
gpio_export
(
OVERO_GPIO_LCD_EN
,
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
)
...
...
@@ -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
[]
=
{
{
.
mmc
=
1
,
...
...
@@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = {
.
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
)
{
omap_register_i2c_bus
(
1
,
2600
,
overo_i2c_boardinfo
,
ARRAY_SIZE
(
overo_i2c_boardinfo
));
omap3_pmic_init
(
"tps65950"
,
&
overo_twldata
);
/* i2c2 pins are used for gpio */
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
return
0
;
}
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) || \
defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
{
...
...
@@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#endif
static
struct
omap_musb_board_data
musb_board_data
=
{
.
interface_type
=
MUSB_INTERFACE_ULPI
,
.
mode
=
MUSB_OTG
,
.
power
=
100
,
static
struct
gpio
overo_bt_gpios
[]
__initdata
=
{
{
OVERO_GPIO_BT_XGATE
,
GPIOF_OUT_INIT_LOW
,
"lcd enable"
},
{
OVERO_GPIO_BT_NRESET
,
GPIOF_OUT_INIT_HIGH
,
"lcd bl enable"
},
};
static
void
__init
overo_init
(
void
)
{
int
ret
;
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
overo_i2c_init
();
omap_display_init
(
&
overo_dss_data
);
omap_serial_init
();
overo_flash_init
();
usb_musb_init
(
&
musb_board_data
);
omap_nand_flash_init
(
0
,
overo_nand_partitions
,
ARRAY_SIZE
(
overo_nand_partitions
));
usb_musb_init
(
NULL
);
usbhs_init
(
&
usbhs_bdata
);
overo_spi_init
();
overo_ads7846_init
();
...
...
@@ -748,9 +580,9 @@ static void __init overo_init(void)
omap_mux_init_signal
(
"sdrc_cke0"
,
OMAP_PIN_OUTPUT
);
omap_mux_init_signal
(
"sdrc_cke1"
,
OMAP_PIN_OUTPUT
);
if
((
gpio_request
(
OVERO_GPIO_W2W_NRESET
,
"OVERO_GPIO_W2W_NRESET"
)
==
0
)
&&
(
gpio_direction_output
(
OVERO_GPIO_W2W_NRESET
,
1
)
==
0
)
)
{
ret
=
gpio_request_one
(
OVERO_GPIO_W2W_NRESET
,
GPIOF_OUT_INIT_HIGH
,
"OVERO_GPIO_W2W_NRESET"
);
if
(
ret
==
0
)
{
gpio_export
(
OVERO_GPIO_W2W_NRESET
,
0
);
gpio_set_value
(
OVERO_GPIO_W2W_NRESET
,
0
);
udelay
(
10
);
...
...
@@ -760,25 +592,20 @@ static void __init overo_init(void)
"OVERO_GPIO_W2W_NRESET
\n
"
);
}
if
((
gpio_request
(
OVERO_GPIO_BT_XGATE
,
"OVERO_GPIO_BT_XGATE"
)
==
0
)
&&
(
gpio_direction_output
(
OVERO_GPIO_BT_XGATE
,
0
)
==
0
))
ret
=
gpio_request_array
(
overo_bt_gpios
,
ARRAY_SIZE
(
overo_bt_gpios
));
if
(
ret
)
{
pr_err
(
"%s: could not obtain BT gpios
\n
"
,
__func__
);
}
else
{
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_set_value
(
OVERO_GPIO_BT_NRESET
,
0
);
mdelay
(
6
);
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
)
&&
(
gpio_direction_output
(
OVERO_GPIO_USBH_CPEN
,
1
)
==
0
))
ret
=
gpio_request_one
(
OVERO_GPIO_USBH_CPEN
,
GPIOF_OUT_INIT_HIGH
,
"OVERO_GPIO_USBH_CPEN"
);
if
(
ret
==
0
)
gpio_export
(
OVERO_GPIO_USBH_CPEN
,
0
);
else
printk
(
KERN_ERR
"could not obtain gpio for "
...
...
arch/arm/mach-omap2/board-rm680.c
浏览文件 @
b08827f4
...
...
@@ -31,6 +31,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "sdram-nokia.h"
#include "common-board-devices.h"
static
struct
regulator_consumer_supply
rm680_vemmc_consumers
[]
=
{
REGULATOR_SUPPLY
(
"vmmc"
,
"omap_hsmmc.1"
),
...
...
@@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = {
/* 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
)
{
omap_register_i2c_bus
(
1
,
2900
,
rm680_twl_i2c_board_info
,
ARRAY_SIZE
(
rm680_twl_i2c_board_info
));
omap_pmic_init
(
1
,
2900
,
"twl5031"
,
INT_34XX_SYS_NIRQ
,
&
rm680_twl_data
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
}
...
...
@@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = {
};
#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
)
{
omap3_mux_init
(
board_mux
,
OMAP_PACKAGE_CBB
);
omap_serial_init
();
usb_musb_init
(
&
rm680_musb_data
);
usb_musb_init
(
NULL
);
rm680_peripherals_init
();
}
...
...
arch/arm/mach-omap2/board-rx51-peripherals.c
浏览文件 @
b08827f4
...
...
@@ -43,6 +43,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define SYSTEM_REV_B_USES_VAUX3 0x1699
#define SYSTEM_REV_S_USES_VAUX3 0x8
...
...
@@ -557,10 +558,8 @@ static __init void rx51_init_si4713(void)
static
int
rx51_twlgpio_setup
(
struct
device
*
dev
,
unsigned
gpio
,
unsigned
n
)
{
/* FIXME this gpio setup is just a placeholder for now */
gpio_request
(
gpio
+
6
,
"backlight_pwm"
);
gpio_direction_output
(
gpio
+
6
,
0
);
gpio_request
(
gpio
+
7
,
"speaker_en"
);
gpio_direction_output
(
gpio
+
7
,
1
);
gpio_request_one
(
gpio
+
6
,
GPIOF_OUT_INIT_LOW
,
"backlight_pwm"
);
gpio_request_one
(
gpio
+
7
,
GPIOF_OUT_INIT_HIGH
,
"speaker_en"
);
return
0
;
}
...
...
@@ -777,15 +776,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module =
.
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 */
static
struct
aic3x_setup_data
rx51_aic34_setup
=
{
.
gpio_func
[
0
]
=
AIC3X_GPIO1_FUNC_DISABLED
,
...
...
@@ -833,8 +823,7 @@ static int __init rx51_i2c_init(void)
rx51_twldata
.
vaux3
=
&
rx51_vaux3_cam
;
}
rx51_twldata
.
vmmc2
=
&
rx51_vmmc2
;
omap_register_i2c_bus
(
1
,
2200
,
rx51_peripherals_i2c_board_info_1
,
ARRAY_SIZE
(
rx51_peripherals_i2c_board_info_1
));
omap_pmic_init
(
1
,
2200
,
"twl5030"
,
INT_34XX_SYS_NIRQ
,
&
rx51_twldata
);
omap_register_i2c_bus
(
2
,
100
,
rx51_peripherals_i2c_board_info_2
,
ARRAY_SIZE
(
rx51_peripherals_i2c_board_info_2
));
omap_register_i2c_bus
(
3
,
400
,
NULL
,
0
);
...
...
@@ -921,26 +910,20 @@ static void rx51_wl1251_set_power(bool 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
)
{
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
)
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
);
if
(
irq
<
0
)
goto
err_irq
;
...
...
@@ -952,10 +935,7 @@ static void __init rx51_init_wl1251(void)
err_irq:
gpio_free
(
RX51_WL1251_IRQ_GPIO
);
err_power:
gpio_free
(
RX51_WL1251_POWER_GPIO
);
error:
printk
(
KERN_ERR
"wl1251 board initialisation failed
\n
"
);
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)
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__
);
return
0
;
}
gpio_direction_output
(
RX51_LCD_RESET_GPIO
,
1
);
omap_display_init
(
&
rx51_dss_board_info
);
return
0
;
}
...
...
arch/arm/mach-omap2/board-zoom-debugboard.c
浏览文件 @
b08827f4
...
...
@@ -15,6 +15,7 @@
#include <linux/interrupt.h>
#include <plat/gpmc.h>
#include <plat/gpmc-smsc911x.h>
#include <mach/board-zoom.h>
...
...
@@ -26,60 +27,16 @@
#define DEBUG_BASE 0x08000000
#define ZOOM_ETHR_START DEBUG_BASE
static
struct
resource
zoom_smsc911x_resources
[]
=
{
[
0
]
=
{
.
start
=
ZOOM_ETHR_START
,
.
end
=
ZOOM_ETHR_START
+
SZ_4K
,
.
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
,
static
struct
omap_smsc911x_platform_data
zoom_smsc911x_cfg
=
{
.
cs
=
ZOOM_SMSC911X_CS
,
.
gpio_irq
=
ZOOM_SMSC911X_GPIO
,
.
gpio_reset
=
-
EINVAL
,
.
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
)
{
int
eth_cs
;
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
);
gpmc_smsc911x_init
(
&
zoom_smsc911x_cfg
);
}
static
struct
plat_serial8250_port
serial_platform_data
[]
=
{
...
...
@@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void)
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
"
,
quart_gpio
);
return
;
}
gpio_direction_input
(
quart_gpio
);
}
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
;
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"
"board detect
\n
"
,
debug_board_detect
);
return
0
;
}
gpio_direction_input
(
debug_board_detect
);
if
(
!
gpio_get_value
(
debug_board_detect
))
{
ret
=
0
;
...
...
@@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void)
}
static
struct
platform_device
*
zoom_devices
[]
__initdata
=
{
&
zoom_smsc911x_device
,
&
zoom_debugboard_serial_device
,
};
...
...
arch/arm/mach-omap2/board-zoom-display.c
浏览文件 @
b08827f4
...
...
@@ -21,34 +21,19 @@
#define LCD_PANEL_RESET_GPIO_PILOT 55
#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
)
{
int
ret
;
unsigned
char
lcd_panel_reset_gpio
;
lcd_panel_reset_gpio
=
(
omap_rev
()
>
OMAP3430_REV_ES3_0
)
?
zoom_lcd_gpios
[
0
].
gpio
=
(
omap_rev
()
>
OMAP3430_REV_ES3_0
)
?
LCD_PANEL_RESET_GPIO_PROD
:
LCD_PANEL_RESET_GPIO_PILOT
;
ret
=
gpio_request
(
lcd_panel_reset_gpio
,
"lcd reset"
);
if
(
ret
)
{
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
);
if
(
gpio_request_array
(
zoom_lcd_gpios
,
ARRAY_SIZE
(
zoom_lcd_gpios
)))
pr_err
(
"%s: Failed to get LCD GPIOs.
\n
"
,
__func__
);
}
static
int
zoom_panel_enable_lcd
(
struct
omap_dss_device
*
dssdev
)
...
...
arch/arm/mach-omap2/board-zoom-peripherals.c
浏览文件 @
b08827f4
...
...
@@ -31,6 +31,7 @@
#include "mux.h"
#include "hsmmc.h"
#include "common-board-devices.h"
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
...
...
@@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev,
zoom_vsim_supply
.
dev
=
mmc
[
0
].
dev
;
zoom_vmmc2_supply
.
dev
=
mmc
[
1
].
dev
;
ret
=
gpio_request
(
LCD_PANEL_ENABLE_GPIO
,
"lcd enable"
);
if
(
ret
)
{
ret
=
gpio_request_one
(
LCD_PANEL_ENABLE_GPIO
,
GPIOF_OUT_INIT_LOW
,
"lcd enable"
);
if
(
ret
)
pr_err
(
"Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).
\n
"
,
LCD_PANEL_ENABLE_GPIO
);
return
ret
;
}
gpio_direction_output
(
LCD_PANEL_ENABLE_GPIO
,
0
);
return
ret
;
}
...
...
@@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = {
.
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
)
{
if
(
machine_is_omap_zoom2
())
{
...
...
@@ -365,19 +355,12 @@ static int __init omap_i2c_init(void)
zoom_audio_data
.
hs_extmute
=
1
;
zoom_audio_data
.
set_hs_extmute
=
zoom2_set_hs_extmute
;
}
omap_register_i2c_bus
(
1
,
2400
,
zoom_i2c_boardinfo
,
ARRAY_SIZE
(
zoom_i2c_boardinfo
));
omap_pmic_init
(
1
,
2400
,
"twl5030"
,
INT_34XX_SYS_NIRQ
,
&
zoom_twldata
);
omap_register_i2c_bus
(
2
,
400
,
NULL
,
0
);
omap_register_i2c_bus
(
3
,
400
,
NULL
,
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
)
{
/* T2 interrupt line (keypad) */
...
...
@@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void)
omap_i2c_init
();
platform_device_register
(
&
omap_vwlan_device
);
usb_musb_init
(
&
musb_board_data
);
usb_musb_init
(
NULL
);
enable_board_wakeup_source
();
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)
sdrc_cs0
->
rfr_ctrl
,
sdrc_cs0
->
actim_ctrla
,
sdrc_cs0
->
actim_ctrlb
,
sdrc_cs0
->
mr
,
0
,
0
,
0
,
0
);
clk
->
rate
=
rate
;
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)
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
;
gpio_direction_input
(
gpmc_cfg
->
gpio_irq
);
gpmc_smc91x_resources
[
1
].
start
=
gpio_to_irq
(
gpmc_cfg
->
gpio_irq
);
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
)
goto
free2
;
gpio_direction_output
(
gpmc_cfg
->
gpio_pwrdwn
,
0
);
}
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
)
goto
free3
;
gpio_direction_output
(
gpmc_cfg
->
gpio_reset
,
0
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
1
);
msleep
(
100
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
0
);
...
...
arch/arm/mach-omap2/gpmc-smsc911x.c
浏览文件 @
b08827f4
...
...
@@ -10,6 +10,7 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#define pr_fmt(fmt) "%s: " fmt, __func__
#include <linux/kernel.h>
#include <linux/platform_device.h>
...
...
@@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = {
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
flags
=
IORESOURCE_IRQ
,
.
flags
=
IORESOURCE_IRQ
|
IORESOURCE_IRQ_LOWLEVEL
,
},
};
...
...
@@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {
.
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
* assume that pin multiplexing is done in the board-*.c file,
...
...
@@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = {
*/
void
__init
gpmc_smsc911x_init
(
struct
omap_smsc911x_platform_data
*
board_data
)
{
struct
platform_device
*
pdev
;
unsigned
long
cs_mem_base
;
int
ret
;
gpmc_cfg
=
board_data
;
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
;
}
gpmc_smsc911x_resources
[
0
].
start
=
cs_mem_base
+
0x0
;
gpmc_smsc911x_resources
[
0
].
end
=
cs_mem_base
+
0xff
;
if
(
gpio_request
(
gpmc_cfg
->
gpio_irq
,
"smsc911x irq"
)
<
0
)
{
printk
(
KERN_ERR
"Failed to request GPIO%d for smsc911x IRQ
\n
"
,
gpmc_cfg
->
gpio_irq
);
if
(
gpio_request_one
(
gpmc_cfg
->
gpio_irq
,
GPIOF_IN
,
"smsc911x irq"
))
{
pr_err
(
"Failed to request IRQ GPIO%d
\n
"
,
gpmc_cfg
->
gpio_irq
);
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
].
flags
|=
(
gpmc_cfg
->
flags
&
IRQF_TRIGGER_MASK
);
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
)
{
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
);
goto
free2
;
}
gpio_direction_output
(
gpmc_cfg
->
gpio_reset
,
1
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
0
);
msleep
(
100
);
gpio_set_value
(
gpmc_cfg
->
gpio_reset
,
1
);
}
if
(
platform_device_register
(
&
gpmc_smsc911x_device
)
<
0
)
{
printk
(
KERN_ERR
"Unable to register smsc911x device
\n
"
);
if
(
gpmc_cfg
->
flags
)
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
);
goto
free2
;
}
...
...
@@ -109,5 +103,5 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
free1:
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)
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) */
static
void
omap_ack_irq
(
struct
irq_data
*
d
)
{
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
)
{
omap_mask_irq
(
d
);
irq_gc_mask_disable_reg
(
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
)
{
unsigned
long
tmp
;
...
...
@@ -186,11 +121,31 @@ int omap_irq_pending(void)
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
)
{
unsigned
long
nr_of_irqs
=
0
;
unsigned
int
nr_banks
=
0
;
int
i
;
int
i
,
j
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
irq_banks
);
i
++
)
{
unsigned
long
base
=
0
;
...
...
@@ -215,17 +170,15 @@ void __init omap_init_irq(void)
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_banks
++
;
}
printk
(
KERN_INFO
"Total of %ld interrupts on %d active controller%s
\n
"
,
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
...
...
arch/arm/mach-omap2/omap_l3_noc.c
浏览文件 @
b08827f4
...
...
@@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
char
*
source_name
;
/* Get the Type of interrupt */
if
(
irq
==
l3
->
app_irq
)
inttype
=
L3_APPLICATION_ERROR
;
else
inttype
=
L3_DEBUG_ERROR
;
inttype
=
irq
==
l3
->
app_irq
?
L3_APPLICATION_ERROR
:
L3_DEBUG_ERROR
;
for
(
i
=
0
;
i
<
L3_MODULES
;
i
++
)
{
/*
...
...
@@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
err_src
=
j
;
/* 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
);
switch
(
(
std_err_main
&
CUSTOM_ERROR
)
)
{
switch
(
std_err_main
&
CUSTOM_ERROR
)
{
case
STANDARD_ERROR
:
source_name
=
l3_targ_stderrlog_main_name
[
i
][
err_src
];
...
...
@@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
l3
=
kzalloc
(
sizeof
(
*
l3
),
GFP_KERNEL
);
if
(
!
l3
)
ret
=
-
ENOMEM
;
ret
urn
-
ENOMEM
;
platform_set_drvdata
(
pdev
,
l3
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 0
\n
"
);
ret
=
-
ENODEV
;
goto
err
1
;
goto
err
0
;
}
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
"
);
ret
=
-
ENOMEM
;
goto
err
2
;
goto
err
0
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
1
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 1
\n
"
);
ret
=
-
ENODEV
;
goto
err
3
;
goto
err
1
;
}
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
"
);
ret
=
-
ENOMEM
;
goto
err
4
;
goto
err
1
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
2
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource 2
\n
"
);
ret
=
-
ENODEV
;
goto
err
5
;
goto
err
2
;
}
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
"
);
ret
=
-
ENOMEM
;
goto
err
6
;
goto
err
2
;
}
/*
...
...
@@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
if
(
ret
)
{
pr_crit
(
"L3: request_irq failed to register for 0x%x
\n
"
,
OMAP44XX_IRQ_L3_DBG
);
goto
err
7
;
goto
err
3
;
}
l3
->
debug_irq
=
irq
;
...
...
@@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
if
(
ret
)
{
pr_crit
(
"L3: request_irq failed to register for 0x%x
\n
"
,
OMAP44XX_IRQ_L3_APP
);
goto
err
8
;
goto
err
4
;
}
l3
->
app_irq
=
irq
;
goto
err0
;
err8:
err7:
iounmap
(
l3
->
l3_base
[
2
]);
err6:
err5:
iounmap
(
l3
->
l3_base
[
1
]);
return
0
;
err4:
free_irq
(
l3
->
debug_irq
,
l3
);
err3:
iounmap
(
l3
->
l3_base
[
0
]);
iounmap
(
l3
->
l3_base
[
2
]);
err2:
iounmap
(
l3
->
l3_base
[
1
]);
err1:
kfree
(
l3
);
iounmap
(
l3
->
l3_base
[
0
]
);
err0:
kfree
(
l3
);
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,
u8
multi
=
error
&
L3_ERROR_LOG_MULTI
;
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_initiator_string
(
initid
),
multi
?
"Multiple Errors"
:
""
,
...
...
@@ -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
)
{
struct
omap3_l3
*
l3
=
_l3
;
u64
status
,
clear
;
u64
error
;
u64
error_addr
;
u64
err_source
=
0
;
void
__iomem
*
base
;
int
int_type
;
irqreturn_t
ret
=
IRQ_NONE
;
if
(
irq
==
l3
->
app_irq
)
int_type
=
L3_APPLICATION_ERROR
;
else
int_type
=
L3_DEBUG_ERROR
;
int_type
=
irq
==
l3
->
app_irq
?
L3_APPLICATION_ERROR
:
L3_DEBUG_ERROR
;
if
(
!
int_type
)
{
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)
base
=
l3
->
rt
+
*
(
omap3_l3_bases
[
int_type
]
+
err_source
);
error
=
omap3_l3_readll
(
base
,
L3_ERROR_LOG
);
if
(
error
)
{
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)
}
/* Clear the status register */
clear
=
((
L3_AGENT_STATUS_CLEAR_IA
<<
int_type
)
|
(
L3_AGENT_STATUS_CLEAR_TA
));
clear
=
(
L3_AGENT_STATUS_CLEAR_IA
<<
int_type
)
|
L3_AGENT_STATUS_CLEAR_TA
;
omap3_l3_writell
(
base
,
L3_AGENT_STATUS
,
clear
);
/* clear the error log register */
...
...
@@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
int
ret
;
l3
=
kzalloc
(
sizeof
(
*
l3
),
GFP_KERNEL
);
if
(
!
l3
)
{
ret
=
-
ENOMEM
;
goto
err0
;
}
if
(
!
l3
)
return
-
ENOMEM
;
platform_set_drvdata
(
pdev
,
l3
);
...
...
@@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't find resource
\n
"
);
ret
=
-
ENODEV
;
goto
err
1
;
goto
err
0
;
}
l3
->
rt
=
ioremap
(
res
->
start
,
resource_size
(
res
));
if
(
!
(
l3
->
rt
)
)
{
if
(
!
l3
->
rt
)
{
dev_err
(
&
pdev
->
dev
,
"ioremap failed
\n
"
);
ret
=
-
ENOMEM
;
goto
err
2
;
goto
err
0
;
}
l3
->
debug_irq
=
platform_get_irq
(
pdev
,
0
);
...
...
@@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
"l3-debug-irq"
,
l3
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"couldn't request debug irq
\n
"
);
goto
err
3
;
goto
err
1
;
}
l3
->
app_irq
=
platform_get_irq
(
pdev
,
1
);
ret
=
request_irq
(
l3
->
app_irq
,
omap3_l3_app_irq
,
IRQF_DISABLED
|
IRQF_TRIGGER_RISING
,
"l3-app-irq"
,
l3
);
if
(
ret
)
{
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:
free_irq
(
l3
->
debug_irq
,
l3
);
err1:
kfree
(
l3
);
iounmap
(
l3
->
rt
);
err0:
kfree
(
l3
);
return
ret
;
}
...
...
arch/arm/mach-omap2/pm44xx.c
浏览文件 @
b08827f4
...
...
@@ -105,13 +105,11 @@ static int __init omap4_pm_init(void)
pr_err
(
"Power Management for TI OMAP4.
\n
"
);
#ifdef CONFIG_PM
ret
=
pwrdm_for_each
(
pwrdms_setup
,
NULL
);
if
(
ret
)
{
pr_err
(
"Failed to setup powerdomains
\n
"
);
goto
err2
;
}
#endif
#ifdef CONFIG_SUSPEND
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)
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
);
pm_runtime_enable
(
&
pdev
->
dev
);
...
...
@@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
ret
=
sr_late_init
(
sr_info
);
if
(
ret
)
{
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)
vdd_dbg_dir
=
omap_voltage_get_dbgdir
(
sr_info
->
voltdm
);
if
(
!
vdd_dbg_dir
)
{
ret
=
-
EINVAL
;
goto
err_
release_region
;
goto
err_
iounmap
;
}
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)
dev_err
(
&
pdev
->
dev
,
"%s: Unable to create debugfs directory
\n
"
,
__func__
);
ret
=
PTR_ERR
(
sr_info
->
dbg_dir
);
goto
err_
release_region
;
goto
err_
iounmap
;
}
(
void
)
debugfs_create_file
(
"autocomp"
,
S_IRUGO
|
S_IWUSR
,
...
...
@@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
dev_err
(
&
pdev
->
dev
,
"%s: Unable to create debugfs directory"
"for n-values
\n
"
,
__func__
);
ret
=
PTR_ERR
(
nvalue_dir
);
goto
err_
release_region
;
goto
err_
debugfs
;
}
omap_voltage_get_volttable
(
sr_info
->
voltdm
,
&
volt_data
);
...
...
@@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
"entries for n-values
\n
"
,
__func__
,
sr_info
->
voltdm
->
name
);
ret
=
-
ENODATA
;
goto
err_
release_region
;
goto
err_
debugfs
;
}
for
(
i
=
0
;
i
<
sr_info
->
nvalue_count
;
i
++
)
{
...
...
@@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev)
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:
release_mem_region
(
mem
->
start
,
resource_size
(
mem
));
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)
}
}
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_device
*
od
;
...
...
@@ -116,6 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
struct
device
*
dev
;
int
bus_id
=
-
1
;
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
())
{
}
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,
);
/* IRQ */
status
=
gpio_request
(
irq
,
"TUSB6010 irq"
);
status
=
gpio_request
_one
(
irq
,
GPIOF_IN
,
"TUSB6010 irq"
);
if
(
status
<
0
)
{
printk
(
error
,
3
,
status
);
return
status
;
}
gpio_direction_input
(
irq
);
tusb_resources
[
2
].
start
=
irq
+
IH_GPIO_BASE
;
/* 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)
}
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
)
{
pr_warning
(
"PMIC function to convert vsel to voltage"
...
...
arch/arm/plat-omap/include/plat/gpmc-smsc911x.h
浏览文件 @
b08827f4
...
...
@@ -14,14 +14,14 @@
#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__
struct
omap_smsc911x_platform_data
{
int
id
;
int
cs
;
int
gpio_irq
;
int
gpio_reset
;
u32
flags
;
};
#if defined(CONFIG_SMSC911X) || \
defined(CONFIG_SMSC911X_MODULE)
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
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)
DEBUG_LL_OMAP1
(
3
,
sx1
);
/* omap2 based boards using UART1 */
DEBUG_LL_OMAP2
(
1
,
omap2evm
);
DEBUG_LL_OMAP2
(
1
,
omap_2430sdp
);
DEBUG_LL_OMAP2
(
1
,
omap_apollon
);
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)
clk_enable
(
obj
->
clk
);
errs
=
iommu_report_fault
(
obj
,
&
da
);
clk_disable
(
obj
->
clk
);
if
(
errs
==
0
)
return
IRQ_HANDLED
;
/* Fault callback or TLB/PTE Dynamic loading */
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
objs-y$(CONFIG_MACH_OMAP_2430SDP)
+=
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_OMAP2EVM)
+=
lcd_omap2evm.o
objs-y$(CONFIG_MACH_OMAP3EVM)
+=
lcd_omap3evm.o
objs-y$(CONFIG_MACH_OMAP3_BEAGLE)
+=
lcd_omap3beagle.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);
* Bits which can be modified via irq_set/clear/modify_status_flags()
* IRQ_LEVEL - Interrupt is level type. Will be also
* 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
* it from affinity setting
* IRQ_NOPROBE - Interrupt cannot be probed by autoprobing
* IRQ_NOREQUEST - Interrupt cannot be requested via
* request_irq()
* IRQ_NOTHREAD - Interrupt cannot be threaded
* IRQ_NOAUTOEN - Interrupt is not automatically enabled in
* request/setup_irq()
* IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set)
...
...
@@ -85,6 +86,7 @@ enum {
IRQ_NO_BALANCING
=
(
1
<<
13
),
IRQ_MOVE_PCNTXT
=
(
1
<<
14
),
IRQ_NESTED_THREAD
=
(
1
<<
15
),
IRQ_NOTHREAD
=
(
1
<<
16
),
};
#define IRQF_MODIFY_MASK \
...
...
@@ -261,23 +263,6 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
* struct irq_chip - hardware interrupt chip descriptor
*
* @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_shutdown: shut down the interrupt (defaults to ->disable 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)
* @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_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
* @flags: chip specific flags
*
...
...
@@ -324,6 +312,10 @@ struct irq_chip {
void
(
*
irq_cpu_online
)(
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
);
unsigned
long
flags
;
...
...
@@ -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.
* (a chained handler is automatically enabled and set to
* IRQ_NOREQUEST
and IRQ_NOPROBE
)
* IRQ_NOREQUEST
, IRQ_NOPROBE, and IRQ_NOTHREAD
)
*/
static
inline
void
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)
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
)
{
if
(
nest
)
...
...
@@ -573,6 +575,145 @@ static inline int irq_reserve_irq(unsigned int irq)
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_S390 */
...
...
include/linux/irqdesc.h
浏览文件 @
b08827f4
...
...
@@ -16,16 +16,18 @@ struct timer_rand_state;
* @irq_data: per irq and chip data passed down to chip functions
* @timer_rand_state: pointer to timer rand state struct
* @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
* @status: status information
* @core_internal_state__do_not_mess_with_it: core internal status information
* @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
* @last_unhandled: aging timer for unhandled count
* @irqs_unhandled: stats field for spurious unhandled interrupts
* @lock: locking for SMP
* @affinity_hint: hint to user space for preferred irq affinity
* @affinity_notify: context for notification of affinity changes
* @pending_mask: pending rebalanced interrupts
* @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
+=
generic-chip.o
obj-$(CONFIG_GENERIC_IRQ_PROBE)
+=
autoprobe.o
obj-$(CONFIG_PROC_FS)
+=
proc.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,
if
(
handle
!=
handle_bad_irq
&&
is_chained
)
{
irq_settings_set_noprobe
(
desc
);
irq_settings_set_norequest
(
desc
);
irq_settings_set_nothread
(
desc
);
irq_startup
(
desc
);
}
out:
...
...
kernel/irq/debug.h
浏览文件 @
b08827f4
...
...
@@ -27,6 +27,7 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
P
(
IRQ_PER_CPU
);
P
(
IRQ_NOPROBE
);
P
(
IRQ_NOREQUEST
);
P
(
IRQ_NOTHREAD
);
P
(
IRQ_NOAUTOEN
);
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,6 +900,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
*/
new
->
handler
=
irq_nested_primary_handler
;
}
else
{
if
(
irq_settings_can_thread
(
desc
))
irq_setup_forced_threading
(
new
);
}
...
...
kernel/irq/settings.h
浏览文件 @
b08827f4
...
...
@@ -8,6 +8,7 @@ enum {
_IRQ_LEVEL
=
IRQ_LEVEL
,
_IRQ_NOPROBE
=
IRQ_NOPROBE
,
_IRQ_NOREQUEST
=
IRQ_NOREQUEST
,
_IRQ_NOTHREAD
=
IRQ_NOTHREAD
,
_IRQ_NOAUTOEN
=
IRQ_NOAUTOEN
,
_IRQ_MOVE_PCNTXT
=
IRQ_MOVE_PCNTXT
,
_IRQ_NO_BALANCING
=
IRQ_NO_BALANCING
,
...
...
@@ -20,6 +21,7 @@ enum {
#define IRQ_LEVEL GOT_YOU_MORON
#define IRQ_NOPROBE GOT_YOU_MORON
#define IRQ_NOREQUEST GOT_YOU_MORON
#define IRQ_NOTHREAD GOT_YOU_MORON
#define IRQ_NOAUTOEN GOT_YOU_MORON
#define IRQ_NESTED_THREAD GOT_YOU_MORON
#undef IRQF_MODIFY_MASK
...
...
@@ -94,6 +96,21 @@ static inline void irq_settings_set_norequest(struct irq_desc *desc)
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
)
{
return
!
(
desc
->
status_use_accessors
&
_IRQ_NOPROBE
);
...
...
sound/soc/omap/Kconfig
浏览文件 @
b08827f4
...
...
@@ -65,14 +65,6 @@ config SND_OMAP_SOC_OVERO
Say Y if you want to add support for SoC audio on the
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
tristate "SoC Audio support for OMAP3EVM board"
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3EVM
...
...
sound/soc/omap/Makefile
浏览文件 @
b08827f4
...
...
@@ -13,7 +13,6 @@ snd-soc-rx51-objs := rx51.o
snd-soc-ams-delta-objs
:=
ams-delta.o
snd-soc-osk5912-objs
:=
osk5912.o
snd-soc-overo-objs
:=
overo.o
snd-soc-omap2evm-objs
:=
omap2evm.o
snd-soc-omap3evm-objs
:=
omap3evm.o
snd-soc-am3517evm-objs
:=
am3517evm.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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录