push(@command, "DEF:$classline[1]=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
if ($count eq "1") {
- push(@command, "AREA:$classline[1]$color:Klasse $classline[1] -".sprintf("%15s",$classline[8]));
+ push(@command, "AREA:$classline[1]$color:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
} else {
- push(@command, "STACK:$classline[1]$color:Klasse $classline[1] -".sprintf("%15s",$classline[8]));
+ push(@command, "STACK:$classline[1]$color:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
}
#
# Automatically generated file; DO NOT EDIT.
-# Linux/arm 3.10.27-ipfire-multi Kernel Configuration
+# Linux/arm 3.10.29-ipfire-multi Kernel Configuration
#
CONFIG_ARM=y
CONFIG_MIGHT_HAVE_PCI=y
CONFIG_ARM_IMX6Q_CPUFREQ=m
# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set
CONFIG_ARM_OMAP2PLUS_CPUFREQ=y
-CONFIG_CPU_IDLE=y
+# CONFIG_CPU_IDLE is not set
CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_BACKLIGHT_LM3639 is not set
# CONFIG_BACKLIGHT_LP855X is not set
# CONFIG_BACKLIGHT_PANDORA is not set
+# CONFIG_BACKLIGHT_TLC59108 is not set
#
# Console display driver support
CONFIG_ARM_UNWIND=y
CONFIG_OLD_MCOUNT=y
# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_LL=y
-# CONFIG_DEBUG_ZYNQ_UART0 is not set
-# CONFIG_DEBUG_ZYNQ_UART1 is not set
-# CONFIG_DEBUG_IMX51_UART is not set
-# CONFIG_DEBUG_IMX53_UART is not set
-# CONFIG_DEBUG_IMX6Q_UART is not set
-CONFIG_DEBUG_OMAP2PLUS_UART=y
-# CONFIG_DEBUG_VEXPRESS_UART0_DETECT is not set
-# CONFIG_DEBUG_VEXPRESS_UART0_CA9 is not set
-# CONFIG_DEBUG_VEXPRESS_UART0_RS1 is not set
-# CONFIG_DEBUG_VT8500_UART0 is not set
-# CONFIG_DEBUG_ICEDCC is not set
-# CONFIG_DEBUG_SEMIHOSTING is not set
+# CONFIG_DEBUG_LL is not set
CONFIG_DEBUG_IMX_UART_PORT=1
-# CONFIG_DEBUG_OMAP2UART1 is not set
-# CONFIG_DEBUG_OMAP2UART2 is not set
-# CONFIG_DEBUG_OMAP2UART3 is not set
-# CONFIG_DEBUG_OMAP3UART3 is not set
-CONFIG_DEBUG_OMAP4UART3=y
-# CONFIG_DEBUG_OMAP3UART4 is not set
-# CONFIG_DEBUG_OMAP4UART4 is not set
-# CONFIG_DEBUG_TI81XXUART1 is not set
-# CONFIG_DEBUG_TI81XXUART2 is not set
-# CONFIG_DEBUG_TI81XXUART3 is not set
-# CONFIG_DEBUG_AM33XXUART1 is not set
-# CONFIG_DEBUG_ZOOM_UART is not set
-CONFIG_DEBUG_LL_INCLUDE="debug/omap2plus.S"
+CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
-CONFIG_EARLY_PRINTK=y
CONFIG_OC_ETM=y
# CONFIG_PID_IN_CONTEXTIDR is not set
#
# Automatically generated file; DO NOT EDIT.
-# Linux/x86 3.10.30 Kernel Configuration
+# Linux/x86 3.10.30-ipfire Kernel Configuration
#
# CONFIG_64BIT is not set
CONFIG_X86_32=y
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_SCSI_FLASHPOINT is not set
CONFIG_VMWARE_PVSCSI=m
+CONFIG_HYPERV_STORAGE=m
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
CONFIG_FCOE=m
#
# CONFIG_WAN is not set
CONFIG_VMXNET3=m
+CONFIG_HYPERV_NET=m
CONFIG_ISDN=y
CONFIG_ISDN_I4L=m
CONFIG_ISDN_PPP=y
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_BROADSHEET is not set
# CONFIG_FB_AUO_K190X is not set
+CONFIG_FB_HYPERV=m
# CONFIG_EXYNOS_VIDEO is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=m
# CONFIG_HID_STEELSERIES is not set
CONFIG_HID_SUNPLUS=m
# CONFIG_HID_GREENASIA is not set
+# CONFIG_HID_HYPERV_MOUSE is not set
# CONFIG_HID_SMARTJOYPLUS is not set
CONFIG_HID_TIVO=m
CONFIG_HID_TOPSEED=m
CONFIG_LEDS_LM3530=m
CONFIG_LEDS_LM3533=m
CONFIG_LEDS_LM3642=m
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_GPIO is not set
+CONFIG_LEDS_PCA9532=m
+CONFIG_LEDS_PCA9532_GPIO=y
+CONFIG_LEDS_GPIO=m
CONFIG_LEDS_LP3944=m
CONFIG_LEDS_LP55XX_COMMON=m
CONFIG_LEDS_LP5521=m
CONFIG_LEDS_LP5523=m
CONFIG_LEDS_LP5562=m
CONFIG_LEDS_CLEVO_MAIL=m
-# CONFIG_LEDS_PCA955X is not set
+CONFIG_LEDS_PCA955X=m
CONFIG_LEDS_PCA9633=m
-# CONFIG_LEDS_BD2802 is not set
+CONFIG_LEDS_BD2802=m
CONFIG_LEDS_INTEL_SS4200=m
CONFIG_LEDS_LT3593=m
CONFIG_LEDS_DELL_NETBOOKS=m
#
# Microsoft Hyper-V guest support
#
-# CONFIG_HYPERV is not set
+CONFIG_HYPERV=m
+CONFIG_HYPERV_UTILS=m
+CONFIG_HYPERV_BALLOON=m
CONFIG_STAGING=y
CONFIG_ET131X=m
CONFIG_SLICOSS=m
#
# Automatically generated file; DO NOT EDIT.
-# Linux/x86 3.10.11-ipfire Kernel Configuration
+# Linux/x86 3.10.30-ipfire Kernel Configuration
#
# CONFIG_64BIT is not set
CONFIG_X86_32=y
CONFIG_L2TP_IP=m
CONFIG_L2TP_ETH=m
CONFIG_STP=y
-CONFIG_GARP=y
+CONFIG_GARP=m
CONFIG_BRIDGE=y
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_SCSI_FLASHPOINT is not set
CONFIG_VMWARE_PVSCSI=m
+CONFIG_HYPERV_STORAGE=m
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
CONFIG_FCOE=m
# CONFIG_BCACHE_DEBUG is not set
# CONFIG_BCACHE_EDEBUG is not set
# CONFIG_BCACHE_CLOSURES_DEBUG is not set
+CONFIG_BLK_DEV_DM_BUILTIN=y
CONFIG_BLK_DEV_DM=y
# CONFIG_DM_DEBUG is not set
CONFIG_DM_BUFIO=m
CONFIG_XEN_NETDEV_FRONTEND=m
CONFIG_XEN_NETDEV_BACKEND=m
CONFIG_VMXNET3=m
+CONFIG_HYPERV_NET=m
CONFIG_ISDN=y
CONFIG_ISDN_I4L=m
CONFIG_ISDN_PPP=y
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_BROADSHEET is not set
# CONFIG_FB_AUO_K190X is not set
+CONFIG_FB_HYPERV=m
# CONFIG_EXYNOS_VIDEO is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=m
# CONFIG_HID_STEELSERIES is not set
CONFIG_HID_SUNPLUS=m
# CONFIG_HID_GREENASIA is not set
+# CONFIG_HID_HYPERV_MOUSE is not set
# CONFIG_HID_SMARTJOYPLUS is not set
CONFIG_HID_TIVO=m
CONFIG_HID_TOPSEED=m
CONFIG_LEDS_LM3530=m
CONFIG_LEDS_LM3533=m
CONFIG_LEDS_LM3642=m
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_GPIO is not set
+CONFIG_LEDS_PCA9532=m
+CONFIG_LEDS_PCA9532_GPIO=y
+CONFIG_LEDS_GPIO=m
CONFIG_LEDS_LP3944=m
CONFIG_LEDS_LP55XX_COMMON=m
CONFIG_LEDS_LP5521=m
CONFIG_LEDS_LP5523=m
CONFIG_LEDS_LP5562=m
CONFIG_LEDS_CLEVO_MAIL=m
-# CONFIG_LEDS_PCA955X is not set
+CONFIG_LEDS_PCA955X=m
CONFIG_LEDS_PCA9633=m
-# CONFIG_LEDS_BD2802 is not set
+CONFIG_LEDS_BD2802=m
CONFIG_LEDS_INTEL_SS4200=m
CONFIG_LEDS_LT3593=m
CONFIG_LEDS_DELL_NETBOOKS=m
#
# DMA Clients
#
-CONFIG_NET_DMA=y
CONFIG_ASYNC_TX_DMA=y
# CONFIG_DMATEST is not set
CONFIG_DCA=m
#
# Microsoft Hyper-V guest support
#
-# CONFIG_HYPERV is not set
+CONFIG_HYPERV=m
+CONFIG_HYPERV_UTILS=m
+CONFIG_HYPERV_BALLOON=m
#
# Xen driver support
#lib/modules/KVER-ipfire/kernel/drivers/firmware/edd.ko
#lib/modules/KVER-ipfire/kernel/drivers/firmware/iscsi_ibft.ko
#lib/modules/KVER-ipfire/kernel/drivers/gpio
+#lib/modules/KVER-ipfire/kernel/drivers/gpio/gpio-cs5535.ko
#lib/modules/KVER-ipfire/kernel/drivers/gpio/gpio-ich.ko
#lib/modules/KVER-ipfire/kernel/drivers/gpio/gpio-sch.ko
#lib/modules/KVER-ipfire/kernel/drivers/gpio/gpio-ts5500.ko
#lib/modules/KVER-ipfire/kernel/drivers/hsi/clients
#lib/modules/KVER-ipfire/kernel/drivers/hsi/clients/hsi_char.ko
#lib/modules/KVER-ipfire/kernel/drivers/hsi/hsi.ko
+#lib/modules/KVER-ipfire/kernel/drivers/hv
+#lib/modules/KVER-ipfire/kernel/drivers/hv/hv_balloon.ko
+#lib/modules/KVER-ipfire/kernel/drivers/hv/hv_utils.ko
+#lib/modules/KVER-ipfire/kernel/drivers/hv/hv_vmbus.ko
#lib/modules/KVER-ipfire/kernel/drivers/hwmon
#lib/modules/KVER-ipfire/kernel/drivers/hwmon/abituguru.ko
#lib/modules/KVER-ipfire/kernel/drivers/hwmon/abituguru3.ko
#lib/modules/KVER-ipfire/kernel/drivers/isdn/mISDN/mISDN_dsp.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds
#lib/modules/KVER-ipfire/kernel/drivers/leds/dell-led.ko
+#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-bd2802.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-blinkm.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-clevo-mail.ko
+#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-gpio.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-lm3530.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-lm3533.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-lm355x.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-lp55xx-common.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-lt3593.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-ot200.ko
+#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-pca9532.ko
+#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-pca955x.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-pca9633.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-ss4200.ko
#lib/modules/KVER-ipfire/kernel/drivers/leds/leds-tca6507.ko
#lib/modules/KVER-ipfire/kernel/drivers/net/ethernet/wiznet/w5300.ko
#lib/modules/KVER-ipfire/kernel/drivers/net/ethernet/xircom
#lib/modules/KVER-ipfire/kernel/drivers/net/ethernet/xircom/xirc2ps_cs.ko
+#lib/modules/KVER-ipfire/kernel/drivers/net/hyperv
+#lib/modules/KVER-ipfire/kernel/drivers/net/hyperv/hv_netvsc.ko
#lib/modules/KVER-ipfire/kernel/drivers/net/ifb.ko
#lib/modules/KVER-ipfire/kernel/drivers/net/imq.ko
#lib/modules/KVER-ipfire/kernel/drivers/net/macvlan.ko
#lib/modules/KVER-ipfire/kernel/drivers/scsi/gdth.ko
#lib/modules/KVER-ipfire/kernel/drivers/scsi/hpsa.ko
#lib/modules/KVER-ipfire/kernel/drivers/scsi/hptiop.ko
-#lib/modules/KVER-ipfire/kernel/drivers/scsi/imm.ko
+#lib/modules/KVER-ipfire/kernel/drivers/scsi/hv_storvsc.ko
#lib/modules/KVER-ipfire/kernel/drivers/scsi/in2000.ko
#lib/modules/KVER-ipfire/kernel/drivers/scsi/initio.ko
#lib/modules/KVER-ipfire/kernel/drivers/scsi/ipr.ko
#lib/modules/KVER-ipfire/kernel/drivers/video/geode/gxfb.ko
#lib/modules/KVER-ipfire/kernel/drivers/video/geode/lxfb.ko
#lib/modules/KVER-ipfire/kernel/drivers/video/hgafb.ko
+#lib/modules/KVER-ipfire/kernel/drivers/video/hyperv_fb.ko
#lib/modules/KVER-ipfire/kernel/drivers/video/i740fb.ko
#lib/modules/KVER-ipfire/kernel/drivers/video/kyro
#lib/modules/KVER-ipfire/kernel/drivers/video/kyro/kyrofb.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/hsi/clients
#lib/modules/KVER-ipfire-pae/kernel/drivers/hsi/clients/hsi_char.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/hsi/hsi.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/hv
+#lib/modules/KVER-ipfire-pae/kernel/drivers/hv/hv_balloon.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/hv/hv_utils.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/hv/hv_vmbus.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/hwmon
#lib/modules/KVER-ipfire-pae/kernel/drivers/hwmon/abituguru.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/hwmon/abituguru3.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/isdn/mISDN/mISDN_dsp.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/dell-led.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-bd2802.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-blinkm.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-clevo-mail.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-gpio.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-lm3530.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-lm3533.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-lm355x.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-lp55xx-common.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-lt3593.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-ot200.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-pca9532.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-pca955x.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-pca9633.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-ss4200.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/leds/leds-tca6507.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/net/ethernet/wiznet/w5300.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/net/ethernet/xircom
#lib/modules/KVER-ipfire-pae/kernel/drivers/net/ethernet/xircom/xirc2ps_cs.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/net/hyperv
+#lib/modules/KVER-ipfire-pae/kernel/drivers/net/hyperv/hv_netvsc.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/net/ifb.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/net/imq.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/net/macvlan.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/gdth.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/hpsa.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/hptiop.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/hv_storvsc.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/imm.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/in2000.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/scsi/initio.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/video/geode/gxfb.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/video/geode/lxfb.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/video/hgafb.ko
+#lib/modules/KVER-ipfire-pae/kernel/drivers/video/hyperv_fb.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/video/i740fb.ko
#lib/modules/KVER-ipfire-pae/kernel/drivers/video/kyro
#lib/modules/KVER-ipfire-pae/kernel/drivers/video/kyro/kyrofb.ko
+++ /dev/null
-#usr/lib/perl5/site_perl/5.12.3/PDF
-#usr/lib/perl5/site_perl/5.12.3/PDF/Create
-usr/lib/perl5/site_perl/5.12.3/PDF/Create.pm
-usr/lib/perl5/site_perl/5.12.3/PDF/Create/Outline.pm
-usr/lib/perl5/site_perl/5.12.3/PDF/Create/Page.pm
-#usr/lib/perl5/site_perl/5.12.3/PDF/Image
-usr/lib/perl5/site_perl/5.12.3/PDF/Image/GIF.pm
-usr/lib/perl5/site_perl/5.12.3/PDF/Image/JPEG.pm
-#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/PDF
-#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/PDF/Create
-#usr/lib/perl5/site_perl/5.12.3/MACHINE-linux-thread-multi/auto/PDF/Create/.packlist
-#usr/share/man/man3/PDF::Create.3
fatload mmc 0:1 0x82000000 zImage-ipfire-multi
fatload mmc 0:1 0x85000000 uInit-ipfire-multi
#fatload mmc 0:1 ${fdtaddr} omap4-${board_name}.dtb
-setenv bootargs vram=32M earlyprintk console=tty1 rootwait smsc95xx.macaddr=$usbethaddr root=/dev/mmcblk0p3 ro
+setenv bootargs video=800x600 console=tty1 rootwait smsc95xx.macaddr=$usbethaddr root=/dev/mmcblk0p3 ro
# Pandaboard has serious Problems in dt mode with kernel 3.10.x
#bootz 0x82000000 0x85000000 ${fdtaddr}
bootz 0x82000000 0x85000000
my $lines=0;
print "<center><table>";
my $modem=$_;
+ my @pfile = `grep . /sys/class/atm/$modem/parameters/* 2>/dev/null`;
+ foreach (@pfile){
+ chomp($_);
+ my $param= `echo $_ | cut -d'/' -f7 | cut -d':' -f1`;
+ my $value= `cat /sys/class/atm/$modem/parameters/$param`;
+ chomp($param);
+ chomp($value);
+ if (!($param =~"uevent")
+ && !($param =~"resource")
+ && !($param eq "")
+ ) {
+
+ $lines++;
+ if ($lines % 2){
+ print "<tr bgcolor='$color{'color22'}'>";
+ }else{
+ print "<tr bgcolor='$color{'color20'}'>";
+ }
+ print "<td align='left'>$param</td><td align='left'>$value</td> ";
+ }
+ }
my @pfile = `grep . /sys/class/atm/$modem/device/* 2>/dev/null`;
foreach (@pfile){
chomp($_);
&& !($param =~"bInterface")
&& !($param =~"bAlternateSetting")
&& !($param =~"bNumEndpoints")
+ && !($param =~"config matches")
+ && !($param =~"resource")
&& !($param eq "")
) {
print "<TABLE WIDTH='100%' border='0' class='tbl'>";
print "<tr><th width='5%'><b>Flag</b></th>";
print "<th width='5%'><b>Code</b></th>";
-print "<th width='40%'><b>Country</b></th>";
+print "<th width='40%'><b>$Lang::tr{'country'}</b></th>";
print "<th><b> </b></th>";
print "<th width='5%'><b>Flag</b></th>";
print "<th width='5%'><b>Code</b></th>";
-print "<th width='40%'><b>Country</b></th></tr>";
+print "<th width='40%'><b>$Lang::tr{'country'}</b></th></tr>";
@flaglist = <$flagdir/*>;
my $HOSTNAME = (gethostbyaddr(pack("C4", split(/\./, $ipaddr)), 2))[0];
if ( "$HOSTNAME" ne "" ) {
print <<END;
- <tr><td><b>Hostname:</b><td align='center'>$HOSTNAME</td><td></td>
+ <tr><td><b>$Lang::tr{'hostname'}:</b><td align='center'>$HOSTNAME</td><td></td>
END
}
chomp($GATEWAY);
close TMP;
print <<END;
- <tr><td><b>Gateway:</b><td align='center'>$GATEWAY</td><td></td></tr>
+ <tr><td><b>$Lang::tr{'gateway'}:</b><td align='center'>$GATEWAY</td><td></td></tr>
END
}
#Read DNS server 1
&Header::openbox('100%', 'left', $Lang::tr{'log'});
print "<p><b>$Lang::tr{'firewall hits'} $date: $lines</b></p>";
-$start = $lines - ${Header::viewsize} if ($start >= $lines - ${Header::viewsize});
+my $lastPageIndex = $lines - ${Header::viewsize};
+$start = $lastPageIndex if ($start >= $lastPageIndex);
$start = 0 if ($start < 0);
my $prev;
}
my $next;
- if ($start == $lines - ${Header::viewsize}) {
+ if ($start == $lastPageIndex) {
$next = -1;
} else {
$next = $start + ${Header::viewsize};
<th align='center' class='boldbase'><b>$Lang::tr{'proto'}</b></th>
<th align='center' class='boldbase'><b>$Lang::tr{'source'}<br/>$Lang::tr{'destination'}</b></th>
<th align='center' class='boldbase'><b>$Lang::tr{'src port'}<br />$Lang::tr{'dst port'}</b></th>
- <th align='center' class='boldbase'><b>Flag</b></th>
+ <th align='center' class='boldbase'><b>$Lang::tr{'country'}</b></th>
<th align='center' class='boldbase'><b>$Lang::tr{'mac address'}</b></th>
</tr>
END
print "<td align='center' width='50%'>";
if ($prev != -1) {
+ print "<a href='/cgi-bin/logs.cgi/firewalllog.dat?0,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'first'}</a> ";
print "<a href='/cgi-bin/logs.cgi/firewalllog.dat?$prev,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'older'}</a>"; }
else {
- print "$Lang::tr{'older'}"; }
+ print "$Lang::tr{'first'} $Lang::tr{'older'}"; }
print "</td>\n";
print "<td align='center' width='50%'>";
if ($next >= 0) {
- print "<a href='/cgi-bin/logs.cgi/firewalllog.dat?$next,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'newer'}</a>"; }
+ print "<a href='/cgi-bin/logs.cgi/firewalllog.dat?$next,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'newer'}</a> ";
+ print "<a href='/cgi-bin/logs.cgi/firewalllog.dat?$lastPageIndex,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'last'}</a>"; }
else {
- print "$Lang::tr{'newer'}"; }
+ print "$Lang::tr{'newer'} $Lang::tr{'last'} "; }
print "</td>\n";
print <<END
<table width='100%' class='tbl'>
<tr>
<th width='10%' align='center' class='boldbase'></th>
-<th width='30%' align='center' class='boldbase'><b>IP</b></th>
-<th width='10%' align='center' class='boldbase'><b>Flag</b></th>
+<th width='30%' align='center' class='boldbase'><b>$Lang::tr{'ip address'}</b></th>
+<th width='10%' align='center' class='boldbase'><b>$Lang::tr{'country'}</b></th>
<th width='10%' align='center' class='boldbase'><b>Count</b></th>
-<th width='30%' align='center' class='boldbase'><b>Percent</b></th>
+<th width='30%' align='center' class='boldbase'><b>$Lang::tr{'percentage'}</b></th>
</tr>
END
;
<table width='100%' CLASS='tbl'>
<tr>
<th width='10%' align='center' class='boldbase'></th>
-<th width='33%' align='center' class='boldbase'><b>Port</b></th>
-<th width='33%' align='center' class='boldbase'><b>Count</b></th>
-<th width='33%' align='center' class='boldbase'><b>Percent</b></th>
+<th width='33%' align='center' class='boldbase'><b>$Lang::tr{'port'}</b></th>
+<th width='33%' align='center' class='boldbase'><b>count</b></th>
+<th width='33%' align='center' class='boldbase'><b>$Lang::tr{'percentage'}</b></th>
</tr>
END
;
for(my $i = 1; $i <= $#iostat1; $i++){
if ( $i eq '1' ){
- print "<tr><td align='center' class='boldbase'><b>Device</b></td><td align='center' class='boldbase'><b>MB read</b></td><td align='center' class='boldbase'><b>MB writen</b></td></tr>";
+ print "<tr><td align='center' class='boldbase'><b>$Lang::tr{'device'}</b></td><td align='center' class='boldbase'><b>MB read</b></td><td align='center' class='boldbase'><b>MB writen</b></td></tr>";
}else{
print "<tr><td align='center'>$iostat1[$i]</td><td align='center'>$iostat2[$i]</td><td align='center'>$iostat3[$i]</td></tr>";
}
if ( $status[1]=~/standby/){
my $ftime = localtime((stat("/var/run/hddshutdown-$disk"))[9]);
- print"<b>Disk $disk status:<font color='#FF0000'>".$status[1]."</font></b> (since $ftime)";
+ print"<b>Disk $disk status:<font color='#FF0000'>".$status[1]."</font></b> ($Lang::tr{'since'} $ftime)";
}else{
print"<b>Disk $disk status:<font color='#00FF00'>".$status[1]."</font></b>";
}
<tr>
<td class='base'>fragment <br></td>
<td><input type='TEXT' name='FRAGMENT' value='$cgiparams{'FRAGMENT'}' size='10' /></td>
- <td>Default: <span class="base">1300</span></td>
+ <td>$Lang::tr{'openvpn default'}: <span class="base">1300</span></td>
</tr>
<tr>
<td class='base'>mssfix</td>
<td><input type='checkbox' name='MSSFIX' $checked{'MSSFIX'}{'on'} /></td>
- <td>Default: on</td>
+ <td>$Lang::tr{'openvpn default'}: on</td>
</tr>
<tr>
<td class='base'>$Lang::tr{'net to net vpn'} (Upload Client Package)</td></tr>
<tr><td> </td><td class='base'><input type='file' name='FH' size='30'></td></tr>
<tr><td> </td><td>Import Connection Name <img src='/blob.gif' /></td></tr>
- <tr><td> </td><td class='base'><input type='text' name='n2nname' size='30'>Default : Client Packagename</td></tr>
+ <tr><td> </td><td class='base'><input type='text' name='n2nname' size='30'>$Lang::tr{'openvpn default'}: Client Packagename</td></tr>
<tr><td colspan='3'><hr /></td></tr>
<tr><td align='right' colspan='3'><input type='submit' name='ACTION' value='$Lang::tr{'add'}' /></td></tr>
<tr><td class='base' colspan='3' align='left'><img src='/blob.gif' alt='*' /> $Lang::tr{'this field may be blank'}</td></tr>
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<table width='66%'>
<tr><td width='100%' colspan='3'>$Lang::tr{'no filter pass'}
- <tr><td width='33%' align='right'>Download:<td width='33%' align='left'><select name='DEFCLASS_INC'>
+ <tr><td width='33%' align='right'>$Lang::tr{'download'}:<td width='33%' align='left'><select name='DEFCLASS_INC'>
END
;
for ( $c = 200 ; $c <= 220 ; $c++ )
}
print <<END
</select><td width='33%' align='center'>
- <tr><td width='33%' align='right'>Upload:<td width='33%' align='left'><select name='DEFCLASS_OUT'>
+ <tr><td width='33%' align='right'>$Lang::tr{'upload'}:<td width='33%' align='left'><select name='DEFCLASS_OUT'>
END
;
for ( $c = 100 ; $c <= 120 ; $c++ )
'firewall rules' => 'Firewallregeln',
'firewallhits' => 'Firewalltreffer',
'firmware' => 'Firmware',
+'first' => 'Erste',
'firmware upload' => 'Hochladen der Firmware/Treiber',
'fixed ip lease added' => 'Feste IP-Zuordnung hinzugefügt',
'fixed ip lease modified' => 'Feste IP-Zuordnung geändert',
'lan' => 'LAN',
'lang' => 'de',
'languagepurpose' => 'Wählen Sie eine Sprache, in der IPFire angezeigt werden soll:',
+'last' => 'Letzte',
'last activity' => 'Letzte Aktivität',
'lateprompting' => 'Late prompting',
'lease expires' => 'Zuordnung verfällt',
'firewallhits' => 'firewallhits',
'firmware' => 'Firmware',
'firmware upload' => 'Upload Firmware/Drivers',
+'first' => 'First',
'fixed ip lease added' => 'Fixed IP lease added',
'fixed ip lease modified' => 'Fixed IP lease modified',
'fixed ip lease removed' => 'Fixed IP lease removed',
'lan' => 'LAN',
'lang' => 'en',
'languagepurpose' => 'Select the language you wish IPFire to display in:',
+'last' => 'Last',
'last activity' => 'Last Activity',
'lateprompting' => 'Lateprompting',
'lease expires' => 'Lease expires',
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/fireinfo-0001-Exclude-some-more-invalid-patterns.patch
+
cd $(DIR_APP) && [ -x "configure" ] || sh ./autogen.sh
cd $(DIR_APP) && ./configure --prefix=/usr
cd $(DIR_APP) && make $(MAKETUNING)
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh970992.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh989558.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh989558-2.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh886968.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh905575.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh905874.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh916986.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh928318.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh947882.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh952422.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh966775.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh966778.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh970090.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-resolv-stack_chk_fail.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-remove-ctors-dtors-output-sections.patch
# Add LED trigger
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10.9-ledtrig-netdev-1.patch
+ # cs5535audio spams syslog if no ac97 was present (geos router)
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10.30_cs5535audio_fix_logspam_on_geos.patch
+
# Fix uevent PHYSDEVDRIVER
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2.33_ipg-fix-driver-name.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-2.6.32.27_mcs7830-fix-driver-name.patch
ifeq "$(KCFG)" "-multi"
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10.27-fs-exec-atomic64-operand-requires-impossible-reload.patch
-# cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2-0001-panda-wlan-fix.patch
-# cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2-0002-panda-i2c.patch
-# cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2-panda-reboot.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10-smsc95xx-add_mac_addr_param.patch
+ # Patchset for Omap (beagle/panda).
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/0002-omap2-twl-common-Add-default-power-configuration.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/sakoman/0001-OMAP-DSS2-add-bootarg-for-selecting-svideo.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/sakoman/0002-video-add-timings-for-hd720.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0001-Beagle-expansion-add-buddy-param-for-expansionboard-.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0002-Beagle-expansion-add-zippy.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0003-Beagle-expansion-add-zippy2.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0004-Beagle-expansion-add-trainer.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0005-Beagle-expansion-add-CircuitCo-ulcd-Support.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0006-Beagle-expansion-add-wifi.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0007-Beagle-expansion-add-beaglefpga.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0008-Beagle-expansion-add-spidev.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0009-Beagle-expansion-add-Aptina-li5m03-camera.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0010-Beagle-expansion-add-LSR-COM6L-Adapter-Board.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0011-Beagle-expansion-LSR-COM6L-Adapter-Board-also-initia.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0001-meego-modedb-add-Toshiba-LTA070B220F-800x480-support.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0002-backlight-Add-TLC59108-backlight-control-driver.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0003-tlc59108-adjust-for-beagleboard-uLCD7.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0004-zeroMAP-Open-your-eyes.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0005-ARM-OMAP-Beagle-use-TWL4030-generic-reset-script.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0006-DSS2-use-DSI-PLL-for-DPI-with-OMAP3.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0001-panda-fix-wl12xx-regulator.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0002-ti-st-st-kim-fixing-firmware-path.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0003-Panda-expansion-add-spidev.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0004-HACK-PandaES-disable-cpufreq-so-board-will-boot.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0006-ARM-hw_breakpoint-Enable-debug-powerdown-only-if-sys.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0007-Revert-regulator-twl-Remove-TWL6030_FIXED_RESOURCE.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0008-Revert-regulator-twl-Remove-another-unused-variable-.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0009-Revert-regulator-twl-Remove-references-to-the-twl403.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0010-Revert-regulator-twl-Remove-references-to-32kHz-cloc.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0011-panda-spidev-setup-pinmux.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/sgx/0001-arm-Export-cache-flush-management-symbols-when-MULTI.patch
+
# Patchset for Wandboard.
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/dts/0001-imx6qdl-wandboard-dts-backport.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/dts/0002-ARM-dts-imx6qdl-wandboard-add-gpio-lines-to-wandboar.patch
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
PROG = nginx
-PAK_VER = 2
+PAK_VER = 3
###############################################################################
# Top-level Rules
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
- cd $(DIR_APP) && tar xvf $(DIR_SRC)/cache/nginx_tcp_proxy_module.tar.bz2 -C $(DIR_APP)
cd $(DIR_APP) && ./configure \
--prefix=/usr/share/nginx/ \
--conf-path=/etc/nginx/nginx.conf \
cd $(DIR_APP) && make install
mkdir -p /var/log/nginx /var/spool/nginx
cp /usr/src/config/nginx/nginx /etc/init.d/
-# chown http:http /var/log/nginx
@rm -rf $(DIR_APP)
@$(POSTBUILD)
+++ /dev/null
-###############################################################################
-# #
-# IPFire.org - A linux based firewall #
-# Copyright (C) 2011 IPFire Team <info@ipfire.org> #
-# #
-# This program is free software: you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation, either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# This program is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with this program. If not, see <http://www.gnu.org/licenses/>. #
-# #
-###############################################################################
-
-###############################################################################
-# Definitions
-###############################################################################
-
-include Config
-
-VER = 1.08
-
-THISAPP = PDF-Create-$(VER)
-DL_FILE = $(THISAPP).tar.gz
-DL_FROM = $(URL_IPFIRE)
-DIR_APP = $(DIR_SRC)/$(THISAPP)
-TARGET = $(DIR_INFO)/$(THISAPP)
-PROG = perl-PDF-Create
-PAK_VER = 1
-
-DEPS = ""
-
-###############################################################################
-# Top-level Rules
-###############################################################################
-
-objects = $(DL_FILE)
-
-$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-
-$(DL_FILE)_MD5 = abb86ba75690529b8ae4c3388541a244
-
-install : $(TARGET)
-
-check : $(patsubst %,$(DIR_CHK)/%,$(objects))
-
-download :$(patsubst %,$(DIR_DL)/%,$(objects))
-
-md5 : $(subst %,%_MD5,$(objects))
-
-dist:
- @$(PAK)
-
-###############################################################################
-# Downloading, checking, md5sum
-###############################################################################
-
-$(patsubst %,$(DIR_CHK)/%,$(objects)) :
- @$(CHECK)
-
-$(patsubst %,$(DIR_DL)/%,$(objects)) :
- @$(LOAD)
-
-$(subst %,%_MD5,$(objects)) :
- @$(MD5)
-
-###############################################################################
-# Installation Details
-###############################################################################
-
-$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
- @$(PREBUILD)
- @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
- cd $(DIR_APP) && perl Makefile.PL
- cd $(DIR_APP) && make $(MAKETUNING)
- cd $(DIR_APP) && make install
- @rm -rf $(DIR_APP)
- @$(POSTBUILD)
# along with IPFire; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
-# Copyright (C) 2007-2013 IPFire Team <info@ipfire.org>. #
+# Copyright (C) 2007-2014 IPFire Team <info@ipfire.org>. #
# #
############################################################################
#
NAME="IPFire" # Software name
SNAME="ipfire" # Short name
VERSION="2.15" # Version number
-CORE="76-beta1" # Core Level (Filename)
+CORE="76-beta2" # Core Level (Filename)
PAKFIRE_CORE="76" # Core Level (PAKFIRE)
GIT_BRANCH=`git rev-parse --abbrev-ref HEAD` # Git Branch
SLOGAN="www.ipfire.org" # Software slogan
ipfiremake perl-DBD-mysql
ipfiremake perl-DBD-SQLite
ipfiremake perl-File-ReadBackwards
- ipfiremake perl-PDF-Create
ipfiremake cacti
ipfiremake icecc
ipfiremake openvmtools
fi
}
+# enable LED
+enable_led ()
+{
+ if [ -d "/sys/class/leds/$1" ]; then
+ echo "1" > /sys/class/leds/$1/brightness
+ fi
+}
+
case "${1}" in
start)
# Alix LED start
setup_netdev_trigger alix:2 ${RED_DEV} rx
setup_netdev_trigger alix:3 ${RED_DEV} tx
+ # Geos LED start
+ setup_heartbeat_trigger geos:1
+ setup_netdev_trigger geos:2 ${RED_DEV} rx
+ setup_netdev_trigger geos:3 ${RED_DEV} tx
+
# Dreamplug
setup_netdev_trigger dreamplug:green:wlan ${GREEN_DEV} tx rx
setup_netdev_trigger dreamplug:blue:wlanap ${BLUE_DEV} tx rx
stop)
# Alix LED stop
disable_led_trigger alix:1
+ enable_led alix:1
disable_led_trigger alix:2
disable_led_trigger alix:3
+ # Geos LED stop
+ disable_led_trigger geos:1
+ enable_led geos:1
+ disable_led_trigger geos:2
+ disable_led_trigger geos:3
+
# Dreamplug
disable_led_trigger dreamplug:green:wlan
disable_led_trigger dreamplug:blue:wlanap
--- /dev/null
+From 220ffe76a48c72171d7724f7f602a2fdd8bbca6a Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Sat, 15 Feb 2014 18:37:54 +0100
+Subject: [PATCH] Exclude some more invalid patterns.
+
+---
+ src/fireinfo/system.py | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/src/fireinfo/system.py b/src/fireinfo/system.py
+index 40ff7b0..c875f96 100644
+--- a/src/fireinfo/system.py
++++ b/src/fireinfo/system.py
+@@ -44,12 +44,17 @@ INVALID_ID_STRINGS = (
+ "Chassis", "chassis",
+ "Not Applicable",
+ "None", "empty",
++ "XXXXX",
+ "01010101-0101-0101-0101-010101010101",
+ "00020003-0004-0005-0006-000700080009",
+ "03000200-0400-0500-0006-000700080009",
+ "0000000", "00000000",
+ )
+
++INVALID_ID_STRINGS_EXACT_MATCH = (
++ "NA",
++)
++
+ class Singleton(type):
+ def __init__(cls, name, bases, dict):
+ super(Singleton, cls).__init__(name, bases, dict)
+@@ -234,12 +239,18 @@ class System(object):
+ if id is None:
+ continue
+
+- for i in INVALID_ID_STRINGS:
+- if i in id:
++ for i in INVALID_ID_STRINGS_EXACT_MATCH:
++ if id == i:
+ id = None
+ break
+
+ if id:
++ for i in INVALID_ID_STRINGS:
++ if i in id:
++ id = None
++ break
++
++ if id:
+ _ids.append(id)
+
+ ids = _ids
+--
+1.8.3.1
+
--- /dev/null
+diff -Nrup a/elf/dl-load.c b/elf/dl-load.c
+--- a/elf/dl-load.c 2013-01-10 08:57:20.098898830 -0500
++++ b/elf/dl-load.c 2013-01-10 12:04:48.155962895 -0500
+@@ -819,7 +819,7 @@ lose (int code, int fd, const char *name
+ {
+ r->r_state = RT_CONSISTENT;
+ _dl_debug_state ();
+- LIBC_PROBE (rtld_map_complete, 2, nsid, r);
++ LIBC_PROBE (rtld_map_complete, 3, nsid, r, NULL);
+ }
+
+ _dl_signal_error (code, name, NULL, msg);
+diff -Nrup a/elf/dl-open.c b/elf/dl-open.c
+--- a/elf/dl-open.c 2013-01-10 08:57:19.917897417 -0500
++++ b/elf/dl-open.c 2013-01-10 12:06:04.644775710 -0500
+@@ -298,7 +298,7 @@ dl_open_worker (void *a)
+ struct r_debug *r = _dl_debug_initialize (0, args->nsid);
+ r->r_state = RT_CONSISTENT;
+ _dl_debug_state ();
+- LIBC_PROBE (rtld_map_complete, 2, args->nsid, r);
++ LIBC_PROBE (rtld_map_complete, 3, args->nsid, r, new);
+
+ /* Only do lazy relocation if `LD_BIND_NOW' is not set. */
+ int reloc_mode = mode & __RTLD_AUDIT;
+@@ -472,7 +472,7 @@ TLS generation counter wrapped! Please
+
+ /* Notify the debugger all new objects have been relocated. */
+ if (relocation_in_progress)
+- LIBC_PROBE (rtld_reloc_complete, 2, args->nsid, r);
++ LIBC_PROBE (rtld_reloc_complete, 3, args->nsid, r, new);
+
+ /* Run the initializer functions of new objects. */
+ _dl_init (new, args->argc, args->argv, args->env);
--- /dev/null
+diff -rup a/sysdeps/ieee754/dbl-64/slowexp.c b/sysdeps/ieee754/dbl-64/slowexp.c
+--- a/sysdeps/ieee754/dbl-64/slowexp.c 2012-01-01 05:16:32.000000000 -0700
++++ b/sysdeps/ieee754/dbl-64/slowexp.c 2012-03-13 11:57:51.225330782 -0600
+@@ -31,6 +31,8 @@
+ #include "mpa.h"
+ #include "math_private.h"
+
++#include <stap-probe.h>
++
+ void __mpexp(mp_no *x, mp_no *y, int p);
+
+ /*Converting from double precision to Multi-precision and calculating e^x */
+@@ -61,12 +63,21 @@ __slowexp(double x) {
+ __sub(&mpy,&mpcor,&mpz,p);
+ __mp_dbl(&mpw, &w, p);
+ __mp_dbl(&mpz, &z, p);
+- if (w == z) return w;
++ if (w == z) {
++ /* Track how often we get to the slow exp code plus
++ its input/output values. */
++ LIBC_PROBE (slowexp_p6, 2, &x, &w);
++ return w;
++ }
+ else { /* if calculating is not exactly */
+ p = 32;
+ __dbl_mp(x,&mpx,p);
+ __mpexp(&mpx, &mpy, p);
+ __mp_dbl(&mpy, &res, p);
++
++ /* Track how often we get to the uber-slow exp code plus
++ its input/output values. */
++ LIBC_PROBE (slowexp_p32, 2, &x, &res);
+ return res;
+ }
+ }
+diff -rup a/sysdeps/ieee754/dbl-64/slowpow.c b/sysdeps/ieee754/dbl-64/slowpow.c
+--- a/sysdeps/ieee754/dbl-64/slowpow.c 2012-01-01 05:16:32.000000000 -0700
++++ b/sysdeps/ieee754/dbl-64/slowpow.c 2012-03-13 11:57:59.865284437 -0600
+@@ -35,6 +35,8 @@
+ #include "mpa.h"
+ #include "math_private.h"
+
++#include <stap-probe.h>
++
+ void __mpexp(mp_no *x, mp_no *y, int p);
+ void __mplog(mp_no *x, mp_no *y, int p);
+ double ulog(double);
+@@ -66,7 +68,12 @@ __slowpow(double x, double y, double z)
+ __mp_dbl(&mpr, &res, p);
+ __sub(&mpp,&eps,&mpr1,p); /* pp -eps =r1 */
+ __mp_dbl(&mpr1, &res1, p); /* converting into double precision */
+- if (res == res1) return res;
++ if (res == res1) {
++ /* Track how often we get to the slow pow code plus
++ its input/output values. */
++ LIBC_PROBE (slowpow_p10, 4, &x, &y, &z, &res);
++ return res;
++ }
+
+ p = 32; /* if we get here result wasn't calculated exactly, continue */
+ __dbl_mp(x,&mpx,p); /* for more exact calculation */
+@@ -76,5 +83,10 @@ __slowpow(double x, double y, double z)
+ __mul(&mpy,&mpz,&mpw,p); /* y*z =w */
+ __mpexp(&mpw, &mpp, p); /* e^w=pp */
+ __mp_dbl(&mpp, &res, p); /* converting into double precision */
++
++ /* Track how often we get to the uber-slow pow code plus
++ its input/output values. */
++ LIBC_PROBE (slowpow_p32, 4, &x, &y, &z, &res);
++
+ return res;
+ }
--- /dev/null
+#
+# Backported from upstream.
+#
+# - Add en_US.UTF-8 as pre-requisite for regression test:
+#
+# commit 62c4a69dc2aea24776cbf0e951d41709a7408cc6
+# Author: Joseph Myers <joseph@codesourcery.com>
+# Date: Thu Nov 1 00:22:04 2012 +0000
+#
+# Build en_US.UTF-8 locale for testing.
+#
+# - Fix buffer overrun:
+#
+# commit a445af0bc722d620afed7683cd320c0e4c7c6059
+# Author: Andreas Schwab <schwab@suse.de>
+# Date: Tue Jan 29 14:45:15 2013 +0100
+#
+# Fix buffer overrun in regexp matcher
+#
+# ChangeLog/
+# 2013-02-12 Andreas Schwab <schwab@suse.de>
+#
+# [BZ #15078]
+# * posix/regexec.c (extend_buffers): Add parameter min_len.
+# (check_matching): Pass minimum needed length.
+# (clean_state_log_if_needed): Likewise.
+# (get_subexp): Likewise.
+# * posix/Makefile (tests): Add bug-regex34.
+# (bug-regex34-ENV): Define.
+# * posix/bug-regex34.c: New file.
+#
+diff -urN glibc-2.12-2-gc4ccff1.orig/localedata/Makefile glibc-2.12-2-gc4ccff1/localedata/Makefile
+--- glibc-2.12-2-gc4ccff1.orig/localedata/Makefile 2013-07-24 20:40:37.364888120 -0400
++++ glibc-2.12-2-gc4ccff1/localedata/Makefile 2013-07-24 20:59:54.713289753 -0400
+@@ -133,7 +133,7 @@
+ ifeq (no,$(cross-compiling))
+ # We have to generate locales
+ LOCALES := de_DE.ISO-8859-1 de_DE.UTF-8 en_US.ANSI_X3.4-1968 \
+- en_US.ISO-8859-1 ja_JP.EUC-JP da_DK.ISO-8859-1 \
++ en_US.ISO-8859-1 en_US.UTF-8 ja_JP.EUC-JP da_DK.ISO-8859-1 \
+ hr_HR.ISO-8859-2 sv_SE.ISO-8859-1 ja_JP.SJIS fr_FR.ISO-8859-1 \
+ vi_VN.TCVN5712-1 nb_NO.ISO-8859-1 nn_NO.ISO-8859-1 \
+ tr_TR.UTF-8 cs_CZ.UTF-8 zh_TW.EUC-TW fa_IR.UTF-8 fr_FR.UTF-8 \
+diff -urN glibc-2.12-2-gc4ccff1.orig/posix/bug-regex34.c glibc-2.12-2-gc4ccff1/posix/bug-regex34.c
+--- glibc-2.12-2-gc4ccff1.orig/posix/bug-regex34.c 1969-12-31 19:00:00.000000000 -0500
++++ glibc-2.12-2-gc4ccff1/posix/bug-regex34.c 2013-07-24 20:59:54.713289753 -0400
+@@ -0,0 +1,46 @@
++/* Test re_search with multi-byte characters in UTF-8.
++ Copyright (C) 2013 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library 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
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define _GNU_SOURCE 1
++#include <stdio.h>
++#include <string.h>
++#include <locale.h>
++#include <regex.h>
++
++static int
++do_test (void)
++{
++ struct re_pattern_buffer r;
++ /* ကျွန်ုပ်x */
++ const char *s = "\xe1\x80\x80\xe1\x80\xbb\xe1\x80\xbd\xe1\x80\x94\xe1\x80\xba\xe1\x80\xaf\xe1\x80\x95\xe1\x80\xbax";
++
++ if (setlocale (LC_ALL, "en_US.UTF-8") == NULL)
++ {
++ puts ("setlocale failed");
++ return 1;
++ }
++ memset (&r, 0, sizeof (r));
++
++ re_compile_pattern ("[^x]x", 5, &r);
++ /* This was triggering a buffer overflow. */
++ re_search (&r, s, strlen (s), 0, strlen (s), 0);
++ return 0;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+diff -urN glibc-2.12-2-gc4ccff1.orig/posix/Makefile glibc-2.12-2-gc4ccff1/posix/Makefile
+--- glibc-2.12-2-gc4ccff1.orig/posix/Makefile 2013-07-24 20:40:37.399888098 -0400
++++ glibc-2.12-2-gc4ccff1/posix/Makefile 2013-07-24 21:00:43.267265979 -0400
+@@ -94,7 +94,7 @@
+ tst-rfc3484-3 \
+ tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \
+ bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \
+- bug-getopt5
++ bug-getopt5 bug-regex34
+ xtests := bug-ga2
+ ifeq (yes,$(build-shared))
+ test-srcs := globtest
+@@ -199,6 +199,7 @@
+ bug-regex25-ENV = LOCPATH=$(common-objpfx)localedata
+ bug-regex26-ENV = LOCPATH=$(common-objpfx)localedata
+ bug-regex30-ENV = LOCPATH=$(common-objpfx)localedata
++bug-regex34-ENV = LOCPATH=$(common-objpfx)localedata
+ tst-rxspencer-ARGS = --utf8 rxspencer/tests
+ tst-rxspencer-ENV = LOCPATH=$(common-objpfx)localedata
+ tst-pcre-ARGS = PCRE.tests
+diff -urN glibc-2.12-2-gc4ccff1.orig/posix/regexec.c glibc-2.12-2-gc4ccff1/posix/regexec.c
+--- glibc-2.12-2-gc4ccff1.orig/posix/regexec.c 2013-07-24 20:40:37.396888100 -0400
++++ glibc-2.12-2-gc4ccff1/posix/regexec.c 2013-07-24 21:02:53.005156187 -0400
+@@ -198,7 +198,7 @@
+ static int check_node_accept (const re_match_context_t *mctx,
+ const re_token_t *node, int idx)
+ internal_function;
+-static reg_errcode_t extend_buffers (re_match_context_t *mctx)
++static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len)
+ internal_function;
+ \f
+ /* Entry point for POSIX code. */
+@@ -1160,7 +1160,7 @@
+ || (BE (next_char_idx >= mctx->input.valid_len, 0)
+ && mctx->input.valid_len < mctx->input.len))
+ {
+- err = extend_buffers (mctx);
++ err = extend_buffers (mctx, next_char_idx + 1);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ assert (err == REG_ESPACE);
+@@ -1737,7 +1737,7 @@
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ reg_errcode_t err;
+- err = extend_buffers (mctx);
++ err = extend_buffers (mctx, next_state_log_idx + 1);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+@@ -2791,7 +2791,7 @@
+ if (bkref_str_off >= mctx->input.len)
+ break;
+
+- err = extend_buffers (mctx);
++ err = extend_buffers (mctx, bkref_str_off + 1);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+@@ -4099,7 +4099,7 @@
+
+ static reg_errcode_t
+ internal_function __attribute_warn_unused_result__
+-extend_buffers (re_match_context_t *mctx)
++extend_buffers (re_match_context_t *mctx, int min_len)
+ {
+ reg_errcode_t ret;
+ re_string_t *pstr = &mctx->input;
+@@ -4108,8 +4108,10 @@
+ if (BE (INT_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0))
+ return REG_ESPACE;
+
+- /* Double the lengthes of the buffers. */
+- ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
++ /* Double the lengthes of the buffers, but allocate at least MIN_LEN. */
++ ret = re_string_realloc_buffers (pstr,
++ MAX (min_len,
++ MIN (pstr->len, pstr->bufs_len * 2)));
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
--- /dev/null
+commit cf7c9078a5acdbb435498ace92cd81009637a971
+Author: Ulrich Drepper <drepper@redhat.com>
+Date: Fri Nov 19 09:35:39 2010 -0500
+
+ Define MAP_HUGETLB.
+
+ * sysdeps/unix/sysv/linux/i386/bits/mman.h: Define MAP_HUGETLB.
+ * sysdeps/unix/sysv/linux/x86_64/bits/mman.h: Likewise.
+
+commit dd62fda6cc83b3afa150a4be7d273ab118bf9825
+Author: Anton Blanchard <anton@samba.org>
+Date: Tue Mar 27 18:37:16 2012 -0700
+
+ Define MAP_STACK and MAP_HUGETLB on powerpc, s390, sh and sparc.
+
+ * sysdeps/unix/sysv/linux/powerpc/bits/mman.h: Define MAP_STACK and
+ MAP_HUGETLB.
+ * sysdeps/unix/sysv/linux/s390/bits/mman.h: Likewise.
+ * sysdeps/unix/sysv/linux/sh/bits/mman.h: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/bits/mman.h: Likewise.
+
+commit 7e4fc5890e07549e5ad98b4244e3e0ed5c709e6a
+Author: Mike Frysinger <vapier@gentoo.org>
+Date: Mon Apr 16 22:44:23 2012 -0400
+
+ ia64: add MAP_{STACK,HUGETLB} to bits/mman.h
+
+ Just adding new bit flags that newer kernels define.
+
+ Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/unix/sysv/linux/ia64/bits/mman.h (MAP_STACK): Define.
+ (MAP_HUGETLB): Likewise.
+
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/powerpc/bits/mman.h 2013-07-23 04:01:42.440052942 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/powerpc/bits/mman.h 2013-07-23 22:26:42.317789260 -0300
+@@ -65,6 +65,8 @@
+ # define MAP_NORESERVE 0x00040 /* Don't check for reservations. */
+ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
++# define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/s390/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/s390/bits/mman.h 2013-07-23 04:01:42.447052393 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/s390/bits/mman.h 2013-07-23 22:26:42.335787833 -0300
+@@ -64,6 +64,8 @@
+ # define MAP_NORESERVE 0x04000 /* Don't check for reservations. */
+ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
++# define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sh/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/sh/bits/mman.h 2010-05-04 08:27:23.000000000 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sh/bits/mman.h 2013-07-23 22:26:42.336787753 -0300
+@@ -64,6 +64,8 @@
+ # define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
+ # define MAP_POPULATE 0x8000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
++# define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sparc/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/sparc/bits/mman.h 2010-05-04 08:27:23.000000000 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/sparc/bits/mman.h 2013-07-23 22:26:42.337787674 -0300
+@@ -66,6 +66,8 @@
+ # define _MAP_NEW 0x80000000 /* Binary compatibility with SunOS. */
+ # define MAP_POPULATE 0x8000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
++# define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/i386/bits/mman.h 2013-07-23 04:01:42.406055607 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/i386/bits/mman.h 2013-07-23 22:32:37.407630135 -0300
+@@ -64,6 +64,7 @@
+ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
+ # define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/x86_64/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/x86_64/bits/mman.h 2013-07-23 04:01:42.493048788 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/x86_64/bits/mman.h 2013-07-23 22:32:37.433628073 -0300
+@@ -65,6 +65,7 @@
+ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
+ # define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
+Index: glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/ia64/bits/mman.h
+===================================================================
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/unix/sysv/linux/ia64/bits/mman.h 2010-05-04 08:27:23.000000000 -0300
++++ glibc-2.12-2-gc4ccff1/sysdeps/unix/sysv/linux/ia64/bits/mman.h 2013-07-23 22:37:28.643530951 -0300
+@@ -65,6 +65,8 @@
+ # define MAP_NORESERVE 0x04000 /* Don't check for reservations. */
+ # define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
+ # define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
++# define MAP_STACK 0x20000 /* Allocation is for a stack. */
++# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
+ #endif
+
+ /* Flags to `msync'. */
--- /dev/null
+diff --git a/resolv/res_init.c b/resolv/res_init.c
+index 40dbe7d..202569d 100644
+--- a/resolv/res_init.c
++++ b/resolv/res_init.c
+@@ -176,13 +176,6 @@ __res_vinit(res_state statp, int preinit) {
+ statp->id = res_randomid();
+ }
+
+-#ifdef USELOOPBACK
+- statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
+-#else
+- statp->nsaddr.sin_addr.s_addr = INADDR_ANY;
+-#endif
+- statp->nsaddr.sin_family = AF_INET;
+- statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
+ statp->nscount = 0;
+ statp->ndots = 1;
+ statp->pfcode = 0;
+@@ -433,6 +426,12 @@ __res_vinit(res_state statp, int preinit) {
+ #endif
+ (void) fclose(fp);
+ }
++ if (__builtin_expect(statp->nscount == 0, 0)) {
++ statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
++ statp->nsaddr.sin_family = AF_INET;
++ statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
++ statp->nscount = 1;
++ }
+ if (statp->defdname[0] == 0 &&
+ __gethostname(buf, sizeof(statp->defdname) - 1) == 0 &&
+ (cp = strchr(buf, '.')) != NULL)
--- /dev/null
+#
+# Backport from upstream:
+#
+# From 1cef1b19089528db11f221e938f60b9b048945d7 Mon Sep 17 00:00:00 2001
+# From: Andreas Schwab <schwab@suse.de>
+# Date: Thu, 21 Mar 2013 15:50:27 +0100
+# Subject: [PATCH] Fix stack overflow in getaddrinfo with many results
+#
+# ---
+# ChangeLog | 6 ++++++
+# NEWS | 5 ++++-
+# sysdeps/posix/getaddrinfo.c | 23 +++++++++++++++++++++--
+# 3 files changed, 31 insertions(+), 3 deletions(-)
+#
+# 2013-04-03 Andreas Schwab <schwab@suse.de>
+#
+# [BZ #15330]
+# * sysdeps/posix/getaddrinfo.c (getaddrinfo): Allocate results and
+# order arrays from heap if bigger than alloca cutoff.
+#
+diff -urN glibc-2.12-2-gc4ccff1.orig/sysdeps/posix/getaddrinfo.c glibc-2.12-2-gc4ccff1/sysdeps/posix/getaddrinfo.c
+--- glibc-2.12-2-gc4ccff1.orig/sysdeps/posix/getaddrinfo.c 2013-07-24 20:40:37.601887975 -0400
++++ glibc-2.12-2-gc4ccff1/sysdeps/posix/getaddrinfo.c 2013-07-24 20:54:32.722447705 -0400
+@@ -2386,11 +2386,27 @@
+ __typeof (once) old_once = once;
+ __libc_once (once, gaiconf_init);
+ /* Sort results according to RFC 3484. */
+- struct sort_result results[nresults];
+- size_t order[nresults];
++ struct sort_result *results;
++ size_t *order;
+ struct addrinfo *q;
+ struct addrinfo *last = NULL;
+ char *canonname = NULL;
++ bool malloc_results;
++
++ malloc_results
++ = !__libc_use_alloca (nresults * (sizeof (*results) + sizeof (*order)));
++ if (malloc_results)
++ {
++ results = malloc (nresults * (sizeof (*results) + sizeof (*order)));
++ if (results == NULL)
++ {
++ free (in6ai);
++ return EAI_MEMORY;
++ }
++ }
++ else
++ results = alloca (nresults * (sizeof (*results) + sizeof (*order)));
++ order = (size_t *) (results + nresults);
+
+ /* If we have information about deprecated and temporary addresses
+ sort the array now. */
+@@ -2557,6 +2573,9 @@
+
+ /* Fill in the canonical name into the new first entry. */
+ p->ai_canonname = canonname;
++
++ if (malloc_results)
++ free (results);
+ }
+
+ free (in6ai);
--- /dev/null
+diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
+index af454b6..249bd19 100644
+--- a/sysdeps/unix/sysv/linux/getsysstats.c
++++ b/sysdeps/unix/sysv/linux/getsysstats.c
+@@ -35,6 +34,7 @@
+
+ #include <atomic.h>
+ #include <not-cancel.h>
++#include <kernel-features.h>
+
+
+ /* How we can determine the number of available processors depends on
+@@ -49,8 +49,6 @@
+ But not all systems have support for the /proc filesystem. If it
+ is not available we simply return 1 since there is no way. */
+
+-#include <not-cancel.h>
+-
+
+ /* Other architectures use different formats for /proc/cpuinfo. This
+ provides a hook for alternative parsers. */
+@@ -128,6 +126,15 @@ next_line (int fd, char *const buffer, char **cp, char **re,
+ int
+ __get_nprocs ()
+ {
++ static int cached_result;
++ static time_t timestamp;
++
++ time_t now = time (NULL);
++ time_t prev = timestamp;
++ atomic_read_barrier ();
++ if (now == prev)
++ return cached_result;
++
+ /* XXX Here will come a test for the new system call. */
+
+ const size_t buffer_size = __libc_use_alloca (8192) ? 8192 : 512;
+@@ -135,20 +142,65 @@ __get_nprocs ()
+ char *buffer_end = buffer + buffer_size;
+ char *cp = buffer_end;
+ char *re = buffer_end;
+- int result = 1;
+
+ #ifdef O_CLOEXEC
+ const int flags = O_RDONLY | O_CLOEXEC;
+ #else
+ const int flags = O_RDONLY;
+ #endif
++ int fd = open_not_cancel_2 ("/sys/devices/system/cpu/online", flags);
++ char *l;
++ int result = 0;
++ if (fd != -1)
++ {
++ l = next_line (fd, buffer, &cp, &re, buffer_end);
++ if (l != NULL)
++ do
++ {
++ char *endp;
++ unsigned long int n = strtoul (l, &endp, 10);
++ if (l == endp)
++ {
++ result = 0;
++ break;
++ }
++
++ unsigned long int m = n;
++ if (*endp == '-')
++ {
++ l = endp + 1;
++ m = strtoul (l, &endp, 10);
++ if (l == endp)
++ {
++ result = 0;
++ break;
++ }
++ }
++
++ result += m - n + 1;
++
++ l = endp;
++ while (l < re && isspace (*l))
++ ++l;
++ }
++ while (l < re);
++
++ close_not_cancel_no_status (fd);
++
++ if (result > 0)
++ goto out;
++ }
++
++ cp = buffer_end;
++ re = buffer_end;
++ result = 1;
++
+ /* The /proc/stat format is more uniform, use it by default. */
+- int fd = open_not_cancel_2 ("/proc/stat", flags);
++ fd = open_not_cancel_2 ("/proc/stat", flags);
+ if (fd != -1)
+ {
+ result = 0;
+
+- char *l;
+ while ((l = next_line (fd, buffer, &cp, &re, buffer_end)) != NULL)
+ /* The current format of /proc/stat has all the cpu* entries
+ at the front. We assume here that stays this way. */
+@@ -169,6 +221,11 @@ __get_nprocs ()
+ }
+ }
+
++ out:
++ cached_result = result;
++ atomic_write_barrier ();
++ timestamp = now;
++
+ return result;
+ }
+ weak_alias (__get_nprocs, get_nprocs)
+@@ -236,7 +293,7 @@ phys_pages_info (const char *format)
+ long int result = -1;
+
+ /* If we haven't found an appropriate entry return 1. */
+- FILE *fp = fopen ("/proc/meminfo", "rc");
++ FILE *fp = fopen ("/proc/meminfo", "rce");
+ if (fp != NULL)
+ {
+ /* No threads use this stream. */
--- /dev/null
+diff -pruN glibc-2.12-2-gc4ccff1/math/math_private.h glibc-2.12-2-gc4ccff1.new/math/math_private.h
+--- glibc-2.12-2-gc4ccff1/math/math_private.h 2013-06-07 08:35:52.785442441 -0400
++++ glibc-2.12-2-gc4ccff1.new/math/math_private.h 2013-06-07 08:29:35.621042340 -0400
+@@ -394,4 +394,31 @@ extern void __docos (double __x, double
+ #define libc_feupdateenvf(e) (void) feupdateenv (e)
+ #define libc_feupdateenvl(e) (void) feupdateenv (e)
+
++/* Save and set the rounding mode. The use of fenv_t to store the old mode
++ allows a target-specific version of this function to avoid converting the
++ rounding mode from the fpu format. By default we have no choice but to
++ manipulate the entire env. */
++
++#ifndef libc_feholdsetround
++# define libc_feholdsetround(e, r, c) libc_feholdexcept_setround(e, r)
++#endif
++#ifndef libc_feholdsetroundf
++# define libc_feholdsetroundf(e, r, c) libc_feholdexcept_setroundf(e, r)
++#endif
++#ifndef libc_feholdsetroundl
++# define libc_feholdsetroundl(e, r, c) libc_feholdexcept_setroundl(e, r)
++#endif
++
++/* ... and the reverse. */
++
++#ifndef libc_feresetround
++# define libc_feresetround(e, c) libc_feupdateenv(e)
++#endif
++#ifndef libc_feresetroundf
++# define libc_feresetroundf(e, c) libc_feupdateenvf(e)
++#endif
++#ifndef libc_feresetroundl
++# define libc_feresetroundl(e, c) libc_feupdateenvl(e)
++#endif
++
+ #endif /* _MATH_PRIVATE_H_ */
+diff -pruN glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/e_exp.c glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/e_exp.c
+--- glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/e_exp.c 2013-06-07 08:35:52.785442441 -0400
++++ glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/e_exp.c 2013-06-07 08:30:21.976222459 -0400
+@@ -57,7 +57,8 @@ double __ieee754_exp(double x) {
+ fenv_t env;
+ double retval;
+
+- libc_feholdexcept_setround (&env, FE_TONEAREST);
++ int changed;
++ libc_feholdsetround (&env, FE_TONEAREST, changed);
+
+ junk1.x = x;
+ m = junk1.i[HIGH_HALF];
+@@ -152,7 +153,7 @@ double __ieee754_exp(double x) {
+ else { retval = __slowexp(x); goto ret; }
+ }
+ ret:
+- libc_feupdateenv (&env);
++ libc_feresetround (&env, changed);
+ return retval;
+ }
+
+diff -pruN glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/e_pow.c glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/e_pow.c
+--- glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/e_pow.c 2013-06-07 08:35:52.785442441 -0400
++++ glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/e_pow.c 2013-06-07 08:31:00.294939087 -0400
+@@ -83,7 +83,8 @@ double __ieee754_pow(double x, double y)
+ fenv_t env;
+ double retval;
+
+- libc_feholdexcept_setround (&env, FE_TONEAREST);
++ int changed;
++ libc_feholdsetround (&env, FE_TONEAREST, changed);
+
+ z = log1(x,&aa,&error); /* x^y =e^(y log (X)) */
+ t = y*134217729.0;
+@@ -100,7 +101,7 @@ double __ieee754_pow(double x, double y)
+ t = __exp1(a1,a2,1.9e16*error); /* return -10 or 0 if wasn't computed exactly */
+ retval = (t>0)?t:power1(x,y);
+
+- libc_feupdateenv (&env);
++ libc_feresetround (&env, changed);
+ return retval;
+ }
+
+diff -pruN glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/s_sin.c glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/s_sin.c
+--- glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/s_sin.c 2013-06-07 08:35:52.786442462 -0400
++++ glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/s_sin.c 2013-06-07 08:32:08.254822633 -0400
+@@ -101,7 +101,8 @@ double __sin(double x){
+ fenv_t env;
+ double retval = 0;
+
+- libc_feholdexcept_setround (&env, FE_TONEAREST);
++ int changed;
++ libc_feholdsetround (&env, FE_TONEAREST, changed);
+
+ u.x = x;
+ m = u.i[HIGH_HALF];
+@@ -355,7 +356,7 @@ double __sin(double x){
+ }
+
+ ret:
+- libc_feupdateenv (&env);
++ libc_feresetround (&env, changed);
+ return retval;
+ }
+
+@@ -374,7 +375,8 @@ double __cos(double x)
+ fenv_t env;
+ double retval = 0;
+
+- libc_feholdexcept_setround (&env, FE_TONEAREST);
++ int changed;
++ libc_feholdsetround (&env, FE_TONEAREST, changed);
+
+ u.x = x;
+ m = u.i[HIGH_HALF];
+@@ -623,7 +625,7 @@ double __cos(double x)
+ }
+
+ ret:
+- libc_feupdateenv (&env);
++ libc_feresetround (&env, changed);
+ return retval;
+ }
+
+diff -pruN glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/s_tan.c glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/s_tan.c
+--- glibc-2.12-2-gc4ccff1/sysdeps/ieee754/dbl-64/s_tan.c 2013-06-07 08:35:52.786442462 -0400
++++ glibc-2.12-2-gc4ccff1.new/sysdeps/ieee754/dbl-64/s_tan.c 2013-06-07 08:32:39.736162619 -0400
+@@ -66,7 +66,8 @@ double tan(double x) {
+ int __branred(double, double *, double *);
+ int __mpranred(double, mp_no *, int);
+
+- libc_feholdexcept_setround (&env, FE_TONEAREST);
++ int changed;
++ libc_feholdsetround (&env, FE_TONEAREST, changed);
+
+ /* x=+-INF, x=NaN */
+ num.d = x; ux = num.i[HIGH_HALF];
+@@ -495,7 +496,7 @@ double tan(double x) {
+ goto ret;
+
+ ret:
+- libc_feupdateenv (&env);
++ libc_feresetround (&env, changed);
+ return retval;
+ }
+
+diff -pruN glibc-2.12-2-gc4ccff1/sysdeps/x86_64/fpu/math_private.h glibc-2.12-2-gc4ccff1.new/sysdeps/x86_64/fpu/math_private.h
+--- glibc-2.12-2-gc4ccff1/sysdeps/x86_64/fpu/math_private.h 2013-06-07 08:35:52.787442488 -0400
++++ glibc-2.12-2-gc4ccff1.new/sysdeps/x86_64/fpu/math_private.h 2013-06-07 08:34:35.370109759 -0400
+@@ -139,3 +139,31 @@ do { \
+ #undef libc_feupdateenvf
+ #define libc_feupdateenvf(e) libc_feupdateenv (e)
+ // #define libc_feupdateenvl(e) (void) feupdateenv (e)
++
++#undef libc_feholdsetround
++#define libc_feholdsetround(e, r, c) \
++({ \
++ unsigned int mxcsr, new_mxcsr; \
++ asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ new_mxcsr = (mxcsr & ~0x6000) | ((r) << 3); \
++ if (__builtin_expect (new_mxcsr != mxcsr, 0)) \
++ { \
++ (e)->__mxcsr = mxcsr; \
++ asm volatile ("ldmxcsr %0" : : "m" (*&new_mxcsr)); \
++ c = 1; \
++ } \
++ else \
++ c = 0; \
++})
++
++#undef libc_feresetround
++#define libc_feresetround(e, c) \
++({ \
++ if (__builtin_expect (c, 0)) \
++ { \
++ unsigned int mxcsr; \
++ asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
++ mxcsr = (mxcsr & ~0x6000) | ((e)->__mxcsr & 0x6000); \
++ asm volatile ("ldmxcsr %0" : : "m" (*&mxcsr)); \
++ } \
++})
--- /dev/null
+commit 3056dcdb783a177158a5617657d1a33f872358d6
+Author: Ulrich Drepper <drepper@redhat.com>
+Date: Mon Nov 22 11:11:24 2010 -0500
+
+ Fix multiple nss_compat initgroups() bugs
+
+ Compat initgroups() is completely broken; the code will always set
+ skip_initgroups_dyn to true, so initgroups() will never be actually
+ called, but due to the nature of the code, setgrent() won't be called
+ either - thus, subsequent invocations of initgroups() will not return
+ the NIS group list anymore.
+
+ This is a simple patch that makes sure skip_initgroups_dyn is set only
+ in case initgroups is not available; it also attempts to handle the
+ unavailability of other NSS interfaces better.
+
+ Conflicts:
+
+ ChangeLog
+
+diff --git a/nis/nss_compat/compat-initgroups.c b/nis/nss_compat/compat-initgroups.c
+index 07a3b92..de8d95c 100644
+--- a/nis/nss_compat/compat-initgroups.c
++++ b/nis/nss_compat/compat-initgroups.c
+@@ -474,18 +474,21 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
+ /* If the selected module does not support getgrent_r or
+ initgroups_dyn, abort. We cannot find the needed group
+ entries. */
+- if (nss_getgrent_r == NULL && nss_initgroups_dyn == NULL)
++ if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL)
++ {
++ if (nss_setgrent != NULL)
++ {
++ nss_setgrent (1);
++ ent->need_endgrent = true;
++ }
++ ent->skip_initgroups_dyn = true;
++ }
++
++ if (ent->skip_initgroups_dyn && nss_getgrent_r == NULL)
+ return NSS_STATUS_UNAVAIL;
+
+ ent->files = false;
+
+- if (nss_initgroups_dyn == NULL && nss_setgrent != NULL)
+- {
+- nss_setgrent (1);
+- ent->need_endgrent = true;
+- }
+- ent->skip_initgroups_dyn = true;
+-
+ return getgrent_next_nss (ent, buffer, buflen, user, group,
+ start, size, groupsp, limit, errnop);
+ }
--- /dev/null
+diff -pruN glibc-2.18/nscd/aicache.c glibc-2.18.new/nscd/aicache.c
+--- glibc-2.18/nscd/aicache.c 2013-08-11 04:22:55.000000000 +0530
++++ glibc-2.18.new/nscd/aicache.c 2013-08-26 11:10:25.843470413 +0530
+@@ -25,6 +25,7 @@
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/mman.h>
++#include <resolv/res_hconf.h>
+
+ #include "dbg_log.h"
+ #include "nscd.h"
+@@ -100,8 +101,11 @@ addhstaiX (struct database_dyn *db, int
+ no_more = __nss_database_lookup ("hosts", NULL,
+ "dns [!UNAVAIL=return] files", &nip);
+
++ /* Initialize configurations. */
++ if (__builtin_expect (!_res_hconf.initialized, 0))
++ _res_hconf_init ();
+ if (__res_maybe_init (&_res, 0) == -1)
+- no_more = 1;
++ no_more = 1;
+
+ /* If we are looking for both IPv4 and IPv6 address we don't want
+ the lookup functions to automatically promote IPv4 addresses to
--- /dev/null
+From 2e908aeebd6804296e7d14a96de6be1e2de38e93 Mon Sep 17 00:00:00 2001
+From: Matthias Brugger <matthias.bgg@gmail.com>
+Date: Wed, 23 Jan 2013 19:50:38 +0100
+Subject: [PATCH 2/2] omap2: twl-common: Add default power configuration
+
+This patch adds a generic power script configuration.
+When rebooting an OMAP3530 at 125 MHz, the reboot hangs.
+With the generic power script, TWL4030 will be reset
+when a warm reset occures. This way the OMAP3530 does not
+hang on reboot.
+
+Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
+---
+ arch/arm/mach-omap2/twl-common.c | 38 ++++++++++++++++++++++++++++++++++++++
+ arch/arm/mach-omap2/twl-common.h | 1 +
+ 2 files changed, 39 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c
+index e49b40b..f096beb 100644
+--- a/arch/arm/mach-omap2/twl-common.c
++++ b/arch/arm/mach-omap2/twl-common.c
+@@ -120,6 +120,41 @@ static struct twl4030_audio_data omap3_audio_pdata = {
+ .codec = &omap3_codec,
+ };
+
++static struct twl4030_ins wrst_seq[] __initdata = {
++ {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_OFF), 2},
++ {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_WRST), 15},
++ {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_WRST), 15},
++ {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_WRST), 0x60},
++ {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 2},
++ {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_ACTIVE), 2},
++};
++
++static struct twl4030_script wrst_script __initdata = {
++ .script = wrst_seq,
++ .size = ARRAY_SIZE(wrst_seq),
++ .flags = TWL4030_WRST_SCRIPT,
++};
++
++static struct twl4030_script *omap3_power_scripts[] __initdata = {
++ &wrst_script,
++};
++
++static struct twl4030_resconfig omap3_rconfig[] = {
++ { .resource = RES_HFCLKOUT, .devgroup = DEV_GRP_P3, .type = -1,
++ .type2 = -1 },
++ { .resource = RES_VDD1, .devgroup = DEV_GRP_P1, .type = -1,
++ .type2 = -1 },
++ { .resource = RES_VDD2, .devgroup = DEV_GRP_P1, .type = -1,
++ .type2 = -1 },
++ { 0, 0},
++};
++
++static struct twl4030_power_data omap3_power_pdata = {
++ .scripts = omap3_power_scripts,
++ .num = ARRAY_SIZE(omap3_power_scripts),
++ .resource_config = omap3_rconfig,
++};
++
+ static struct regulator_consumer_supply omap3_vdda_dac_supplies[] = {
+ REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
+ };
+@@ -224,6 +259,9 @@ void __init omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,
+ if (pdata_flags & TWL_COMMON_PDATA_AUDIO && !pmic_data->audio)
+ pmic_data->audio = &omap3_audio_pdata;
+
++ if (pdata_flags & TWL_COMMON_PDATA_POWER && !pmic_data->power)
++ pmic_data->power = &omap3_power_pdata;
++
+ /* Common regulator configurations */
+ if (regulators_flags & TWL_COMMON_REGULATOR_VDAC && !pmic_data->vdac)
+ pmic_data->vdac = &omap3_vdac_idata;
+diff --git a/arch/arm/mach-omap2/twl-common.h b/arch/arm/mach-omap2/twl-common.h
+index dcfbad5..dbeb905 100644
+--- a/arch/arm/mach-omap2/twl-common.h
++++ b/arch/arm/mach-omap2/twl-common.h
+@@ -7,6 +7,7 @@
+ #define TWL_COMMON_PDATA_BCI (1 << 1)
+ #define TWL_COMMON_PDATA_MADC (1 << 2)
+ #define TWL_COMMON_PDATA_AUDIO (1 << 3)
++#define TWL_COMMON_PDATA_POWER (1 << 4)
+
+ /* Common LDO regulators for TWL4030/TWL6030 */
+ #define TWL_COMMON_REGULATOR_VDAC (1 << 0)
+--
+1.7.10.4
+
--- /dev/null
+From 369b60c157f67a71a6f302ab9843ae2de1805a2a Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Mon, 22 Oct 2012 15:43:00 +0200
+Subject: [PATCH 1/6] omap3isp: Use the common clock framework
+
+Expose the two ISP external clocks XCLKA and XCLKB as common clocks for
+subdev drivers.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Mike Turquette <mturquette@linaro.org>
+---
+ drivers/media/platform/omap3isp/isp.c | 277 ++++++++++++++++++++++++---------
+ drivers/media/platform/omap3isp/isp.h | 22 ++-
+ include/media/omap3isp.h | 10 +-
+ 3 files changed, 225 insertions(+), 84 deletions(-)
+
+diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c
+index 6e5ad8e..1d7dbd5 100644
+--- a/drivers/media/platform/omap3isp/isp.c
++++ b/drivers/media/platform/omap3isp/isp.c
+@@ -55,6 +55,7 @@
+ #include <asm/cacheflush.h>
+
+ #include <linux/clk.h>
++#include <linux/clkdev.h>
+ #include <linux/delay.h>
+ #include <linux/device.h>
+ #include <linux/dma-mapping.h>
+@@ -148,6 +149,201 @@ void omap3isp_flush(struct isp_device *isp)
+ isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
+ }
+
++/* -----------------------------------------------------------------------------
++ * XCLK
++ */
++
++#define to_isp_xclk(_hw) container_of(_hw, struct isp_xclk, hw)
++
++static void isp_xclk_update(struct isp_xclk *xclk, u32 divider)
++{
++ switch (xclk->id) {
++ case ISP_XCLK_A:
++ isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
++ ISPTCTRL_CTRL_DIVA_MASK,
++ divider << ISPTCTRL_CTRL_DIVA_SHIFT);
++ break;
++ case ISP_XCLK_B:
++ isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
++ ISPTCTRL_CTRL_DIVB_MASK,
++ divider << ISPTCTRL_CTRL_DIVB_SHIFT);
++ break;
++ }
++}
++
++static int isp_xclk_prepare(struct clk_hw *hw)
++{
++ struct isp_xclk *xclk = to_isp_xclk(hw);
++
++ omap3isp_get(xclk->isp);
++
++ return 0;
++}
++
++static void isp_xclk_unprepare(struct clk_hw *hw)
++{
++ struct isp_xclk *xclk = to_isp_xclk(hw);
++
++ omap3isp_put(xclk->isp);
++}
++
++static int isp_xclk_enable(struct clk_hw *hw)
++{
++ struct isp_xclk *xclk = to_isp_xclk(hw);
++ unsigned long flags;
++
++ spin_lock_irqsave(&xclk->lock, flags);
++ isp_xclk_update(xclk, xclk->divider);
++ xclk->enabled = true;
++ spin_unlock_irqrestore(&xclk->lock, flags);
++
++ return 0;
++}
++
++static void isp_xclk_disable(struct clk_hw *hw)
++{
++ struct isp_xclk *xclk = to_isp_xclk(hw);
++ unsigned long flags;
++
++ spin_lock_irqsave(&xclk->lock, flags);
++ isp_xclk_update(xclk, 0);
++ xclk->enabled = false;
++ spin_unlock_irqrestore(&xclk->lock, flags);
++}
++
++static unsigned long isp_xclk_recalc_rate(struct clk_hw *hw,
++ unsigned long parent_rate)
++{
++ struct isp_xclk *xclk = to_isp_xclk(hw);
++
++ return parent_rate / xclk->divider;
++}
++
++static u32 isp_xclk_calc_divider(unsigned long *rate, unsigned long parent_rate)
++{
++ u32 divider;
++
++ if (*rate >= parent_rate) {
++ *rate = parent_rate;
++ return ISPTCTRL_CTRL_DIV_BYPASS;
++ }
++
++ divider = DIV_ROUND_CLOSEST(parent_rate, *rate);
++ if (divider >= ISPTCTRL_CTRL_DIV_BYPASS)
++ divider = ISPTCTRL_CTRL_DIV_BYPASS - 1;
++
++ *rate = parent_rate / divider;
++ return divider;
++}
++
++static long isp_xclk_round_rate(struct clk_hw *hw, unsigned long rate,
++ unsigned long *parent_rate)
++{
++ isp_xclk_calc_divider(&rate, *parent_rate);
++ return rate;
++}
++
++static int isp_xclk_set_rate(struct clk_hw *hw, unsigned long rate,
++ unsigned long parent_rate)
++{
++ struct isp_xclk *xclk = to_isp_xclk(hw);
++ unsigned long flags;
++ u32 divider;
++
++ divider = isp_xclk_calc_divider(&rate, parent_rate);
++
++ spin_lock_irqsave(&xclk->lock, flags);
++
++ xclk->divider = divider;
++ if (xclk->enabled)
++ isp_xclk_update(xclk, divider);
++
++ spin_unlock_irqrestore(&xclk->lock, flags);
++
++ dev_dbg(xclk->isp->dev, "%s: cam_xclk%c set to %lu Hz (div %u)\n",
++ __func__, xclk->id == ISP_XCLK_A ? 'a' : 'b', rate, divider);
++ return 0;
++}
++
++static const struct clk_ops isp_xclk_ops = {
++ .prepare = isp_xclk_prepare,
++ .unprepare = isp_xclk_unprepare,
++ .enable = isp_xclk_enable,
++ .disable = isp_xclk_disable,
++ .recalc_rate = isp_xclk_recalc_rate,
++ .round_rate = isp_xclk_round_rate,
++ .set_rate = isp_xclk_set_rate,
++};
++
++static const char *isp_xclk_parent_name = "cam_mclk";
++
++static const struct clk_init_data isp_xclk_init_data = {
++ .name = "cam_xclk",
++ .ops = &isp_xclk_ops,
++ .parent_names = &isp_xclk_parent_name,
++ .num_parents = 1,
++};
++
++static int isp_xclk_init(struct isp_device *isp)
++{
++ struct isp_platform_data *pdata = isp->pdata;
++ struct clk_init_data init;
++ unsigned int i;
++
++ for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
++ struct isp_xclk *xclk = &isp->xclks[i];
++ struct clk *clk;
++
++ xclk->isp = isp;
++ xclk->id = i == 0 ? ISP_XCLK_A : ISP_XCLK_B;
++ xclk->divider = 1;
++ spin_lock_init(&xclk->lock);
++
++ init.name = i == 0 ? "cam_xclka" : "cam_xclkb";
++ init.ops = &isp_xclk_ops;
++ init.parent_names = &isp_xclk_parent_name;
++ init.num_parents = 1;
++
++ xclk->hw.init = &init;
++
++ clk = devm_clk_register(isp->dev, &xclk->hw);
++ if (IS_ERR(clk))
++ return PTR_ERR(clk);
++
++ if (pdata->xclks[i].con_id == NULL &&
++ pdata->xclks[i].dev_id == NULL)
++ continue;
++
++ xclk->lookup = kzalloc(sizeof(*xclk->lookup), GFP_KERNEL);
++ if (xclk->lookup == NULL)
++ return -ENOMEM;
++
++ xclk->lookup->con_id = pdata->xclks[i].con_id;
++ xclk->lookup->dev_id = pdata->xclks[i].dev_id;
++ xclk->lookup->clk = clk;
++
++ clkdev_add(xclk->lookup);
++ }
++
++ return 0;
++}
++
++static void isp_xclk_cleanup(struct isp_device *isp)
++{
++ unsigned int i;
++
++ for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
++ struct isp_xclk *xclk = &isp->xclks[i];
++
++ if (xclk->lookup)
++ clkdev_drop(xclk->lookup);
++ }
++}
++
++/* -----------------------------------------------------------------------------
++ * Interrupts
++ */
++
+ /*
+ * isp_enable_interrupts - Enable ISP interrupts.
+ * @isp: OMAP3 ISP device
+@@ -180,80 +376,6 @@ static void isp_disable_interrupts(struct isp_device *isp)
+ isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE);
+ }
+
+-/**
+- * isp_set_xclk - Configures the specified cam_xclk to the desired frequency.
+- * @isp: OMAP3 ISP device
+- * @xclk: Desired frequency of the clock in Hz. 0 = stable low, 1 is stable high
+- * @xclksel: XCLK to configure (0 = A, 1 = B).
+- *
+- * Configures the specified MCLK divisor in the ISP timing control register
+- * (TCTRL_CTRL) to generate the desired xclk clock value.
+- *
+- * Divisor = cam_mclk_hz / xclk
+- *
+- * Returns the final frequency that is actually being generated
+- **/
+-static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
+-{
+- u32 divisor;
+- u32 currentxclk;
+- unsigned long mclk_hz;
+-
+- if (!omap3isp_get(isp))
+- return 0;
+-
+- mclk_hz = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]);
+-
+- if (xclk >= mclk_hz) {
+- divisor = ISPTCTRL_CTRL_DIV_BYPASS;
+- currentxclk = mclk_hz;
+- } else if (xclk >= 2) {
+- divisor = mclk_hz / xclk;
+- if (divisor >= ISPTCTRL_CTRL_DIV_BYPASS)
+- divisor = ISPTCTRL_CTRL_DIV_BYPASS - 1;
+- currentxclk = mclk_hz / divisor;
+- } else {
+- divisor = xclk;
+- currentxclk = 0;
+- }
+-
+- switch (xclksel) {
+- case ISP_XCLK_A:
+- isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
+- ISPTCTRL_CTRL_DIVA_MASK,
+- divisor << ISPTCTRL_CTRL_DIVA_SHIFT);
+- dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n",
+- currentxclk);
+- break;
+- case ISP_XCLK_B:
+- isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
+- ISPTCTRL_CTRL_DIVB_MASK,
+- divisor << ISPTCTRL_CTRL_DIVB_SHIFT);
+- dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n",
+- currentxclk);
+- break;
+- case ISP_XCLK_NONE:
+- default:
+- omap3isp_put(isp);
+- dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested "
+- "xclk. Must be 0 (A) or 1 (B).\n");
+- return -EINVAL;
+- }
+-
+- /* Do we go from stable whatever to clock? */
+- if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2)
+- omap3isp_get(isp);
+- /* Stopping the clock. */
+- else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2)
+- omap3isp_put(isp);
+-
+- isp->xclk_divisor[xclksel - 1] = divisor;
+-
+- omap3isp_put(isp);
+-
+- return currentxclk;
+-}
+-
+ /*
+ * isp_core_init - ISP core settings
+ * @isp: OMAP3 ISP device
+@@ -1969,6 +2091,7 @@ static int isp_remove(struct platform_device *pdev)
+
+ isp_unregister_entities(isp);
+ isp_cleanup_modules(isp);
++ isp_xclk_cleanup(isp);
+
+ __omap3isp_get(isp, false);
+ iommu_detach_device(isp->domain, &pdev->dev);
+@@ -2042,7 +2165,6 @@ static int isp_probe(struct platform_device *pdev)
+ }
+
+ isp->autoidle = autoidle;
+- isp->platform_cb.set_xclk = isp_set_xclk;
+
+ mutex_init(&isp->isp_mutex);
+ spin_lock_init(&isp->stat_lock);
+@@ -2093,6 +2215,10 @@ static int isp_probe(struct platform_device *pdev)
+ if (ret < 0)
+ goto error_isp;
+
++ ret = isp_xclk_init(isp);
++ if (ret < 0)
++ goto error_isp;
++
+ /* Memory resources */
+ for (m = 0; m < ARRAY_SIZE(isp_res_maps); m++)
+ if (isp->revision == isp_res_maps[m].isp_rev)
+@@ -2162,6 +2288,7 @@ detach_dev:
+ free_domain:
+ iommu_domain_free(isp->domain);
+ error_isp:
++ isp_xclk_cleanup(isp);
+ omap3isp_put(isp);
+ error:
+ platform_set_drvdata(pdev, NULL);
+diff --git a/drivers/media/platform/omap3isp/isp.h b/drivers/media/platform/omap3isp/isp.h
+index c77e1f2..cd3eff4 100644
+--- a/drivers/media/platform/omap3isp/isp.h
++++ b/drivers/media/platform/omap3isp/isp.h
+@@ -29,6 +29,7 @@
+
+ #include <media/omap3isp.h>
+ #include <media/v4l2-device.h>
++#include <linux/clk-provider.h>
+ #include <linux/device.h>
+ #include <linux/io.h>
+ #include <linux/iommu.h>
+@@ -125,8 +126,20 @@ struct isp_reg {
+ u32 val;
+ };
+
+-struct isp_platform_callback {
+- u32 (*set_xclk)(struct isp_device *isp, u32 xclk, u8 xclksel);
++enum isp_xclk_id {
++ ISP_XCLK_A,
++ ISP_XCLK_B,
++};
++
++struct isp_xclk {
++ struct isp_device *isp;
++ struct clk_hw hw;
++ struct clk_lookup *lookup;
++ enum isp_xclk_id id;
++
++ spinlock_t lock; /* Protects enabled and divider */
++ bool enabled;
++ unsigned int divider;
+ };
+
+ /*
+@@ -149,6 +162,7 @@ struct isp_platform_callback {
+ * @cam_mclk: Pointer to camera functional clock structure.
+ * @csi2_fck: Pointer to camera CSI2 complexIO clock structure.
+ * @l3_ick: Pointer to OMAP3 L3 bus interface clock.
++ * @xclks: External clocks provided by the ISP
+ * @irq: Currently attached ISP ISR callbacks information structure.
+ * @isp_af: Pointer to current settings for ISP AutoFocus SCM.
+ * @isp_hist: Pointer to current settings for ISP Histogram SCM.
+@@ -185,12 +199,12 @@ struct isp_device {
+ int has_context;
+ int ref_count;
+ unsigned int autoidle;
+- u32 xclk_divisor[2]; /* Two clocks, a and b. */
+ #define ISP_CLK_CAM_ICK 0
+ #define ISP_CLK_CAM_MCLK 1
+ #define ISP_CLK_CSI2_FCK 2
+ #define ISP_CLK_L3_ICK 3
+ struct clk *clock[4];
++ struct isp_xclk xclks[2];
+
+ /* ISP modules */
+ struct ispstat isp_af;
+@@ -209,8 +223,6 @@ struct isp_device {
+ unsigned int subclk_resources;
+
+ struct iommu_domain *domain;
+-
+- struct isp_platform_callback platform_cb;
+ };
+
+ #define v4l2_dev_to_isp_device(dev) \
+diff --git a/include/media/omap3isp.h b/include/media/omap3isp.h
+index 9584269..c9d06d9 100644
+--- a/include/media/omap3isp.h
++++ b/include/media/omap3isp.h
+@@ -29,10 +29,6 @@
+ struct i2c_board_info;
+ struct isp_device;
+
+-#define ISP_XCLK_NONE 0
+-#define ISP_XCLK_A 1
+-#define ISP_XCLK_B 2
+-
+ enum isp_interface_type {
+ ISP_INTERFACE_PARALLEL,
+ ISP_INTERFACE_CSI2A_PHY2,
+@@ -153,7 +149,13 @@ struct isp_v4l2_subdevs_group {
+ } bus; /* gcc < 4.6.0 chokes on anonymous union initializers */
+ };
+
++struct isp_platform_xclk {
++ const char *dev_id;
++ const char *con_id;
++};
++
+ struct isp_platform_data {
++ struct isp_platform_xclk xclks[2];
+ struct isp_v4l2_subdevs_group *subdevs;
+ void (*set_constraints)(struct isp_device *isp, bool enable);
+ };
+--
+1.7.10.4
+
--- /dev/null
+From 7c44c8a989ad01bd7cd02370d4ca4a742db218be Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Tue, 25 Sep 2012 15:46:34 +0200
+Subject: [PATCH 2/6] mt9m032: Fix PLL setup
+
+The MT9M032 PLL was assumed to be identical to the MT9P031 PLL but
+differs significantly. Update the registers definitions and PLL limits
+according to the datasheet.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9m032.c | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/media/i2c/mt9m032.c b/drivers/media/i2c/mt9m032.c
+index f80c1d7e..30d755a 100644
+--- a/drivers/media/i2c/mt9m032.c
++++ b/drivers/media/i2c/mt9m032.c
+@@ -87,7 +87,7 @@
+ #define MT9M032_RESTART 0x0b
+ #define MT9M032_RESET 0x0d
+ #define MT9M032_PLL_CONFIG1 0x11
+-#define MT9M032_PLL_CONFIG1_OUTDIV_MASK 0x3f
++#define MT9M032_PLL_CONFIG1_PREDIV_MASK 0x3f
+ #define MT9M032_PLL_CONFIG1_MUL_SHIFT 8
+ #define MT9M032_READ_MODE1 0x1e
+ #define MT9M032_READ_MODE2 0x20
+@@ -106,6 +106,8 @@
+ #define MT9M032_GAIN_AMUL_SHIFT 6
+ #define MT9M032_GAIN_ANALOG_MASK 0x3f
+ #define MT9M032_FORMATTER1 0x9e
++#define MT9M032_FORMATTER1_PLL_P1_6 (1 << 8)
++#define MT9M032_FORMATTER1_PARALLEL (1 << 12)
+ #define MT9M032_FORMATTER2 0x9f
+ #define MT9M032_FORMATTER2_DOUT_EN 0x1000
+ #define MT9M032_FORMATTER2_PIXCLK_EN 0x2000
+@@ -121,8 +123,6 @@
+ #define MT9P031_PLL_CONTROL_PWROFF 0x0050
+ #define MT9P031_PLL_CONTROL_PWRON 0x0051
+ #define MT9P031_PLL_CONTROL_USEPLL 0x0052
+-#define MT9P031_PLL_CONFIG2 0x11
+-#define MT9P031_PLL_CONFIG2_P1_DIV_MASK 0x1f
+
+ struct mt9m032 {
+ struct v4l2_subdev subdev;
+@@ -255,13 +255,14 @@ static int mt9m032_setup_pll(struct mt9m032 *sensor)
+ .n_max = 64,
+ .m_min = 16,
+ .m_max = 255,
+- .p1_min = 1,
+- .p1_max = 128,
++ .p1_min = 6,
++ .p1_max = 7,
+ };
+
+ struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
+ struct mt9m032_platform_data *pdata = sensor->pdata;
+ struct aptina_pll pll;
++ u16 reg_val;
+ int ret;
+
+ pll.ext_clock = pdata->ext_clock;
+@@ -274,18 +275,19 @@ static int mt9m032_setup_pll(struct mt9m032 *sensor)
+ sensor->pix_clock = pdata->pix_clock;
+
+ ret = mt9m032_write(client, MT9M032_PLL_CONFIG1,
+- (pll.m << MT9M032_PLL_CONFIG1_MUL_SHIFT)
+- | (pll.p1 - 1));
+- if (!ret)
+- ret = mt9m032_write(client, MT9P031_PLL_CONFIG2, pll.n - 1);
++ (pll.m << MT9M032_PLL_CONFIG1_MUL_SHIFT) |
++ ((pll.n - 1) & MT9M032_PLL_CONFIG1_PREDIV_MASK));
+ if (!ret)
+ ret = mt9m032_write(client, MT9P031_PLL_CONTROL,
+ MT9P031_PLL_CONTROL_PWRON |
+ MT9P031_PLL_CONTROL_USEPLL);
+ if (!ret) /* more reserved, Continuous, Master Mode */
+ ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8006);
+- if (!ret) /* Set 14-bit mode, select 7 divider */
+- ret = mt9m032_write(client, MT9M032_FORMATTER1, 0x111e);
++ if (!ret) {
++ reg_val = (pll.p1 == 6 ? MT9M032_FORMATTER1_PLL_P1_6 : 0)
++ | MT9M032_FORMATTER1_PARALLEL | 0x001e; /* 14-bit */
++ ret = mt9m032_write(client, MT9M032_FORMATTER1, reg_val);
++ }
+
+ return ret;
+ }
+--
+1.7.10.4
+
--- /dev/null
+From 1115becbb4875d62abb10f94a9510c81f376606f Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Wed, 26 Sep 2012 10:54:17 +0200
+Subject: [PATCH 3/6] mt9m032: Define MT9M032_READ_MODE1 bits
+
+Replace hardcoded values with #define's.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9m032.c | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/media/i2c/mt9m032.c b/drivers/media/i2c/mt9m032.c
+index 30d755a..de150d3 100644
+--- a/drivers/media/i2c/mt9m032.c
++++ b/drivers/media/i2c/mt9m032.c
+@@ -90,6 +90,24 @@
+ #define MT9M032_PLL_CONFIG1_PREDIV_MASK 0x3f
+ #define MT9M032_PLL_CONFIG1_MUL_SHIFT 8
+ #define MT9M032_READ_MODE1 0x1e
++#define MT9M032_READ_MODE1_OUTPUT_BAD_FRAMES (1 << 13)
++#define MT9M032_READ_MODE1_MAINTAIN_FRAME_RATE (1 << 12)
++#define MT9M032_READ_MODE1_XOR_LINE_VALID (1 << 11)
++#define MT9M032_READ_MODE1_CONT_LINE_VALID (1 << 10)
++#define MT9M032_READ_MODE1_INVERT_TRIGGER (1 << 9)
++#define MT9M032_READ_MODE1_SNAPSHOT (1 << 8)
++#define MT9M032_READ_MODE1_GLOBAL_RESET (1 << 7)
++#define MT9M032_READ_MODE1_BULB_EXPOSURE (1 << 6)
++#define MT9M032_READ_MODE1_INVERT_STROBE (1 << 5)
++#define MT9M032_READ_MODE1_STROBE_ENABLE (1 << 4)
++#define MT9M032_READ_MODE1_STROBE_START_TRIG1 (0 << 2)
++#define MT9M032_READ_MODE1_STROBE_START_EXP (1 << 2)
++#define MT9M032_READ_MODE1_STROBE_START_SHUTTER (2 << 2)
++#define MT9M032_READ_MODE1_STROBE_START_TRIG2 (3 << 2)
++#define MT9M032_READ_MODE1_STROBE_END_TRIG1 (0 << 0)
++#define MT9M032_READ_MODE1_STROBE_END_EXP (1 << 0)
++#define MT9M032_READ_MODE1_STROBE_END_SHUTTER (2 << 0)
++#define MT9M032_READ_MODE1_STROBE_END_TRIG2 (3 << 0)
+ #define MT9M032_READ_MODE2 0x20
+ #define MT9M032_READ_MODE2_VFLIP_SHIFT 15
+ #define MT9M032_READ_MODE2_HFLIP_SHIFT 14
+@@ -282,7 +300,9 @@ static int mt9m032_setup_pll(struct mt9m032 *sensor)
+ MT9P031_PLL_CONTROL_PWRON |
+ MT9P031_PLL_CONTROL_USEPLL);
+ if (!ret) /* more reserved, Continuous, Master Mode */
+- ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8006);
++ ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8000 |
++ MT9M032_READ_MODE1_STROBE_START_EXP |
++ MT9M032_READ_MODE1_STROBE_END_SHUTTER);
+ if (!ret) {
+ reg_val = (pll.p1 == 6 ? MT9M032_FORMATTER1_PLL_P1_6 : 0)
+ | MT9M032_FORMATTER1_PARALLEL | 0x001e; /* 14-bit */
+--
+1.7.10.4
+
--- /dev/null
+From d3f188f38eaa34acf6375d5d88fe27971aae1170 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Fri, 21 Dec 2012 20:34:06 +0100
+Subject: [PATCH 4/6] mt9p031: Use devm_* managed helpers
+
+Replace kzalloc and gpio_request_one by their managed equivalents.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9p031.c | 13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
+index e328332..e0bad59 100644
+--- a/drivers/media/i2c/mt9p031.c
++++ b/drivers/media/i2c/mt9p031.c
+@@ -927,7 +927,7 @@ static int mt9p031_probe(struct i2c_client *client,
+ return -EIO;
+ }
+
+- mt9p031 = kzalloc(sizeof(*mt9p031), GFP_KERNEL);
++ mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL);
+ if (mt9p031 == NULL)
+ return -ENOMEM;
+
+@@ -1001,8 +1001,8 @@ static int mt9p031_probe(struct i2c_client *client,
+ mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
+
+ if (pdata->reset != -1) {
+- ret = gpio_request_one(pdata->reset, GPIOF_OUT_INIT_LOW,
+- "mt9p031_rst");
++ ret = devm_gpio_request_one(&client->dev, pdata->reset,
++ GPIOF_OUT_INIT_LOW, "mt9p031_rst");
+ if (ret < 0)
+ goto done;
+
+@@ -1013,12 +1013,8 @@ static int mt9p031_probe(struct i2c_client *client,
+
+ done:
+ if (ret < 0) {
+- if (mt9p031->reset != -1)
+- gpio_free(mt9p031->reset);
+-
+ v4l2_ctrl_handler_free(&mt9p031->ctrls);
+ media_entity_cleanup(&mt9p031->subdev.entity);
+- kfree(mt9p031);
+ }
+
+ return ret;
+@@ -1032,9 +1028,6 @@ static int mt9p031_remove(struct i2c_client *client)
+ v4l2_ctrl_handler_free(&mt9p031->ctrls);
+ v4l2_device_unregister_subdev(subdev);
+ media_entity_cleanup(&subdev->entity);
+- if (mt9p031->reset != -1)
+- gpio_free(mt9p031->reset);
+- kfree(mt9p031);
+
+ return 0;
+ }
+--
+1.7.10.4
+
--- /dev/null
+From 9ff2bc0c9458f0eecde6d9b52a899fd2bb1dd3a3 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Tue, 8 May 2012 15:10:36 +0200
+Subject: [PATCH 5/6] mt9p031: Add support for regulators
+
+Enable the regulators when powering the sensor up, and disable them when
+powering it down.
+
+The regulators are mandatory. Boards that don't allow controlling the
+sensor power lines must provide fixed voltage regulators.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9p031.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
+index e0bad59..ecf4492 100644
+--- a/drivers/media/i2c/mt9p031.c
++++ b/drivers/media/i2c/mt9p031.c
+@@ -19,6 +19,7 @@
+ #include <linux/i2c.h>
+ #include <linux/log2.h>
+ #include <linux/pm.h>
++#include <linux/regulator/consumer.h>
+ #include <linux/slab.h>
+ #include <linux/videodev2.h>
+
+@@ -121,6 +122,10 @@ struct mt9p031 {
+ struct mutex power_lock; /* lock to protect power_count */
+ int power_count;
+
++ struct regulator *vaa;
++ struct regulator *vdd;
++ struct regulator *vdd_io;
++
+ enum mt9p031_model model;
+ struct aptina_pll pll;
+ int reset;
+@@ -264,6 +269,11 @@ static int mt9p031_power_on(struct mt9p031 *mt9p031)
+ usleep_range(1000, 2000);
+ }
+
++ /* Bring up the supplies */
++ regulator_enable(mt9p031->vdd);
++ regulator_enable(mt9p031->vdd_io);
++ regulator_enable(mt9p031->vaa);
++
+ /* Emable clock */
+ if (mt9p031->pdata->set_xclk)
+ mt9p031->pdata->set_xclk(&mt9p031->subdev,
+@@ -285,6 +295,10 @@ static void mt9p031_power_off(struct mt9p031 *mt9p031)
+ usleep_range(1000, 2000);
+ }
+
++ regulator_disable(mt9p031->vaa);
++ regulator_disable(mt9p031->vdd_io);
++ regulator_disable(mt9p031->vdd);
++
+ if (mt9p031->pdata->set_xclk)
+ mt9p031->pdata->set_xclk(&mt9p031->subdev, 0);
+ }
+@@ -937,6 +951,16 @@ static int mt9p031_probe(struct i2c_client *client,
+ mt9p031->model = did->driver_data;
+ mt9p031->reset = -1;
+
++ mt9p031->vaa = devm_regulator_get(&client->dev, "vaa");
++ mt9p031->vdd = devm_regulator_get(&client->dev, "vdd");
++ mt9p031->vdd_io = devm_regulator_get(&client->dev, "vdd_io");
++
++ if (IS_ERR(mt9p031->vaa) || IS_ERR(mt9p031->vdd) ||
++ IS_ERR(mt9p031->vdd_io)) {
++ dev_err(&client->dev, "Unable to get regulators\n");
++ return -ENODEV;
++ }
++
+ v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);
+
+ v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
+--
+1.7.10.4
+
--- /dev/null
+From 6cd62f5ae305142c0490e80caa04f99f00029b68 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Fri, 21 Dec 2012 20:11:55 +0100
+Subject: [PATCH 6/6] mt9p031: Use the common clock framework
+
+Configure the device external clock using the common clock framework
+instead of a board code callback function.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Sakari Ailus <sakari.ailus@iki.fi>
+---
+ drivers/media/i2c/mt9p031.c | 21 ++++++++++++++-------
+ include/media/mt9p031.h | 2 --
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
+index ecf4492..28cf95b 100644
+--- a/drivers/media/i2c/mt9p031.c
++++ b/drivers/media/i2c/mt9p031.c
+@@ -12,6 +12,7 @@
+ * published by the Free Software Foundation.
+ */
+
++#include <linux/clk.h>
+ #include <linux/delay.h>
+ #include <linux/device.h>
+ #include <linux/gpio.h>
+@@ -122,6 +123,7 @@ struct mt9p031 {
+ struct mutex power_lock; /* lock to protect power_count */
+ int power_count;
+
++ struct clk *clk;
+ struct regulator *vaa;
+ struct regulator *vdd;
+ struct regulator *vdd_io;
+@@ -200,7 +202,7 @@ static int mt9p031_reset(struct mt9p031 *mt9p031)
+ 0);
+ }
+
+-static int mt9p031_pll_setup(struct mt9p031 *mt9p031)
++static int mt9p031_clk_setup(struct mt9p031 *mt9p031)
+ {
+ static const struct aptina_pll_limits limits = {
+ .ext_clock_min = 6000000,
+@@ -221,6 +223,12 @@ static int mt9p031_pll_setup(struct mt9p031 *mt9p031)
+ struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
+ struct mt9p031_platform_data *pdata = mt9p031->pdata;
+
++ mt9p031->clk = devm_clk_get(&client->dev, NULL);
++ if (IS_ERR(mt9p031->clk))
++ return PTR_ERR(mt9p031->clk);
++
++ clk_set_rate(mt9p031->clk, pdata->ext_freq);
++
+ mt9p031->pll.ext_clock = pdata->ext_freq;
+ mt9p031->pll.pix_clock = pdata->target_freq;
+
+@@ -275,9 +283,8 @@ static int mt9p031_power_on(struct mt9p031 *mt9p031)
+ regulator_enable(mt9p031->vaa);
+
+ /* Emable clock */
+- if (mt9p031->pdata->set_xclk)
+- mt9p031->pdata->set_xclk(&mt9p031->subdev,
+- mt9p031->pdata->ext_freq);
++ if (mt9p031->clk)
++ clk_prepare_enable(mt9p031->clk);
+
+ /* Now RESET_BAR must be high */
+ if (mt9p031->reset != -1) {
+@@ -299,8 +306,8 @@ static void mt9p031_power_off(struct mt9p031 *mt9p031)
+ regulator_disable(mt9p031->vdd_io);
+ regulator_disable(mt9p031->vdd);
+
+- if (mt9p031->pdata->set_xclk)
+- mt9p031->pdata->set_xclk(&mt9p031->subdev, 0);
++ if (mt9p031->clk)
++ clk_disable_unprepare(mt9p031->clk);
+ }
+
+ static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
+@@ -1033,7 +1040,7 @@ static int mt9p031_probe(struct i2c_client *client,
+ mt9p031->reset = pdata->reset;
+ }
+
+- ret = mt9p031_pll_setup(mt9p031);
++ ret = mt9p031_clk_setup(mt9p031);
+
+ done:
+ if (ret < 0) {
+diff --git a/include/media/mt9p031.h b/include/media/mt9p031.h
+index 0c97b19..b1e63f2 100644
+--- a/include/media/mt9p031.h
++++ b/include/media/mt9p031.h
+@@ -5,13 +5,11 @@ struct v4l2_subdev;
+
+ /*
+ * struct mt9p031_platform_data - MT9P031 platform data
+- * @set_xclk: Clock frequency set callback
+ * @reset: Chip reset GPIO (set to -1 if not used)
+ * @ext_freq: Input clock frequency
+ * @target_freq: Pixel clock frequency
+ */
+ struct mt9p031_platform_data {
+- int (*set_xclk)(struct v4l2_subdev *subdev, int hz);
+ int reset;
+ int ext_freq;
+ int target_freq;
+--
+1.7.10.4
+
--- /dev/null
+From 6ac98647956cbff190954b4cac6bd71fdbb8647b Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Wed, 23 Mar 2011 08:37:54 -0500
+Subject: [PATCH 1/5] meego: modedb add Toshiba LTA070B220F 800x480 support
+
+ from http://wiki.meego.com/ARM/Meego_on_Beagleboard_from_scratch
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/modedb.c | 4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
+index 5b686de..69ad1ec 100644
+--- a/drivers/video/modedb.c
++++ b/drivers/video/modedb.c
+@@ -293,6 +293,10 @@ static const struct fb_videomode modedb[] = {
+ /* 864x480 @ 60 Hz, 35.15 kHz hsync */
+ { NULL, 60, 864, 480, 27777, 1, 1, 1, 1, 0, 0,
+ 0, FB_VMODE_NONINTERLACED },
++
++ /* 800x480 @ 60 Hz, Toshiba LTA070B220F 7 inch LCD */
++ { NULL, 60, 800, 480, 32787, 48, 80, 33, 31, 32, 2,
++ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+ };
+
+ #ifdef CONFIG_FB_MODE_HELPERS
+--
+1.7.7.6
+
--- /dev/null
+From e989473bea15beef8d480b822a619e7b8fca860c Mon Sep 17 00:00:00 2001
+From: "Manjunathappa, Prakash" <prakash.pm@ti.com>
+Date: Mon, 1 Aug 2011 18:25:11 +0530
+Subject: [PATCH 2/5] backlight: Add TLC59108 backlight control driver
+
+This patch adds support for I2C configurable TLC59108 backlight
+control driver.
+
+Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
+Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
+---
+ drivers/video/backlight/Kconfig | 8 ++
+ drivers/video/backlight/Makefile | 1 +
+ drivers/video/backlight/tlc59108.c | 160 ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 169 insertions(+)
+ create mode 100644 drivers/video/backlight/tlc59108.c
+
+diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
+index db10d01..04a2275 100644
+--- a/drivers/video/backlight/Kconfig
++++ b/drivers/video/backlight/Kconfig
+@@ -418,6 +418,14 @@ config BACKLIGHT_AS3711
+ If you have an Austrian Microsystems AS3711 say Y to enable the
+ backlight driver.
+
++config BACKLIGHT_TLC59108
++ tristate "TLC59108 LCD Backlight Driver"
++ depends on I2C && BACKLIGHT_CLASS_DEVICE
++ default n
++ help
++ If you have an LCD Panel with backlight control via TLC59108,
++ say Y to enable its LCD control driver.
++
+ endif # BACKLIGHT_CLASS_DEVICE
+
+ endif # BACKLIGHT_LCD_SUPPORT
+diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
+index 96c4d62..3687852 100644
+--- a/drivers/video/backlight/Makefile
++++ b/drivers/video/backlight/Makefile
+@@ -41,6 +41,7 @@ obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o
+ obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o
+ obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o
+ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o
++obj-$(CONFIG_BACKLIGHT_TLC59108) += tlc59108.o
+ obj-$(CONFIG_BACKLIGHT_OT200) += ot200_bl.o
+ obj-$(CONFIG_BACKLIGHT_PANDORA) += pandora_bl.o
+ obj-$(CONFIG_BACKLIGHT_PCF50633) += pcf50633-backlight.o
+diff --git a/drivers/video/backlight/tlc59108.c b/drivers/video/backlight/tlc59108.c
+new file mode 100644
+index 0000000..4f4ea34
+--- /dev/null
++++ b/drivers/video/backlight/tlc59108.c
+@@ -0,0 +1,160 @@
++/*
++ * ti81xxhdmi_tlc59108.c
++ *
++ * Copyright (C) 2011 Texas Instruments
++ * Author: Senthil Natarajan
++ *
++ * tlc59108 HDMI Driver
++ *
++ * 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, see <http://www.gnu.org/licenses/>.
++ * History:
++ *
++ * Senthil Natarajan<senthil.n@ti.com> July 2011 I2C driver for tlc59108
++ * backlight control
++ */
++
++#include <linux/i2c.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/backlight.h>
++#include <linux/fb.h>
++
++#define tlc59108_MODULE_NAME "tlc59108"
++#define TLC59108_MODE1 0x00
++#define TLC59108_PWM2 0x04
++#define TLC59108_LEDOUT0 0x0c
++#define TLC59108_LEDOUT1 0x0d
++#define TLC59108_MAX_BRIGHTNESS 0xFF
++
++struct tlc59108_bl {
++ struct i2c_client *client;
++ struct backlight_device *bl;
++};
++
++static void tlc59108_bl_set_backlight(struct tlc59108_bl *data, int brightness)
++{
++ /* Set Mode1 Register */
++ i2c_smbus_write_byte_data(data->client, TLC59108_MODE1, 0x00);
++
++ /* Set LEDOUT0 Register */
++ i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x21);
++
++ /* Set Backlight Duty Cycle*/
++ i2c_smbus_write_byte_data(data->client, TLC59108_PWM2,
++ brightness & 0xff);
++}
++
++static int tlc59108_bl_get_brightness(struct backlight_device *dev)
++{
++ struct backlight_properties *props = &dev->props;
++
++ return props->brightness;
++}
++
++static int tlc59108_bl_update_status(struct backlight_device *dev)
++{
++ struct backlight_properties *props = &dev->props;
++ struct tlc59108_bl *data = dev_get_drvdata(&dev->dev);
++ int brightness = props->brightness;
++
++ tlc59108_bl_set_backlight(data, brightness);
++
++ return 0;
++}
++
++static const struct backlight_ops bl_ops = {
++ .get_brightness = tlc59108_bl_get_brightness,
++ .update_status = tlc59108_bl_update_status,
++};
++
++static int tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
++{
++ struct backlight_properties props;
++ struct tlc59108_bl *data = kzalloc(sizeof(struct tlc59108_bl),
++ GFP_KERNEL);
++ int ret = 0;
++
++ if (!data)
++ return -ENOMEM;
++
++ i2c_set_clientdata(c, data);
++ data->client = c;
++
++ memset(&props, 0, sizeof(struct backlight_properties));
++ props.max_brightness = TLC59108_MAX_BRIGHTNESS;
++ props.type = BACKLIGHT_RAW;
++ data->bl = backlight_device_register("tlc59108-bl", &c->dev, data,
++ &bl_ops, &props);
++ if (IS_ERR(data->bl)) {
++ ret = PTR_ERR(data->bl);
++ goto err_reg;
++ }
++
++ data->bl->props.brightness = TLC59108_MAX_BRIGHTNESS;
++
++ backlight_update_status(data->bl);
++
++ return 0;
++
++err_reg:
++ data->bl = NULL;
++ kfree(data);
++ return ret;
++}
++
++static int tlc59108_remove(struct i2c_client *c)
++{
++ struct tlc59108_bl *data = i2c_get_clientdata(c);
++
++ backlight_device_unregister(data->bl);
++ data->bl = NULL;
++
++ kfree(data);
++
++ return 0;
++}
++
++/* I2C Device ID table */
++static const struct i2c_device_id tlc59108_id[] = {
++ { "tlc59108", 0 },
++ { }
++};
++MODULE_DEVICE_TABLE(i2c, tlc59108_id);
++
++/* I2C driver data */
++static struct i2c_driver tlc59108_driver = {
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = tlc59108_MODULE_NAME,
++ },
++ .probe = tlc59108_probe,
++ .remove = tlc59108_remove,
++ .id_table = tlc59108_id,
++};
++
++static int __init tlc59108_init(void)
++{
++ return i2c_add_driver(&tlc59108_driver);
++}
++
++static void __exit tlc59108_exit(void)
++{
++ i2c_del_driver(&tlc59108_driver);
++}
++
++module_init(tlc59108_init);
++module_exit(tlc59108_exit);
++
++MODULE_DESCRIPTION("LCD/Backlight control for TLC59108");
++MODULE_AUTHOR("Senthil Natarajan <senthil.n@ti.com>");
++MODULE_LICENSE("GPL v2");
+--
+1.7.10.4
+
--- /dev/null
+From 40cbddde06a9f0e1845810b904502f922fc3288f Mon Sep 17 00:00:00 2001
+From: Koen Kooi <koen@dominion.thruhere.net>
+Date: Fri, 27 Apr 2012 21:30:00 +0200
+Subject: [PATCH 3/5] tlc59108: adjust for beagleboard+uLCD7
+
+Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
+---
+ drivers/video/backlight/tlc59108.c | 46 ++++++++++++++++++++++++-----------
+ 1 files changed, 31 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/video/backlight/tlc59108.c b/drivers/video/backlight/tlc59108.c
+index 4f4ea34..40a21e7 100644
+--- a/drivers/video/backlight/tlc59108.c
++++ b/drivers/video/backlight/tlc59108.c
+@@ -29,9 +29,16 @@
+ #include <linux/backlight.h>
+ #include <linux/fb.h>
+
+-#define tlc59108_MODULE_NAME "tlc59108"
+ #define TLC59108_MODE1 0x00
+-#define TLC59108_PWM2 0x04
++#define TLC59108_MODE2 0x01
++#define TLC59108_PWM0 0x02
++#define TLC59108_PWM1 0x03
++#define TLC59108_PWM2 0x04
++#define TLC59108_PWM3 0x05
++#define TLC59108_PWM4 0x06
++#define TLC59108_PWM5 0x07
++#define TLC59108_PWM6 0x08
++#define TLC59108_PWM7 0x09
+ #define TLC59108_LEDOUT0 0x0c
+ #define TLC59108_LEDOUT1 0x0d
+ #define TLC59108_MAX_BRIGHTNESS 0xFF
+@@ -43,15 +50,9 @@ struct tlc59108_bl {
+
+ static void tlc59108_bl_set_backlight(struct tlc59108_bl *data, int brightness)
+ {
+- /* Set Mode1 Register */
+- i2c_smbus_write_byte_data(data->client, TLC59108_MODE1, 0x00);
+-
+- /* Set LEDOUT0 Register */
+- i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x21);
+-
+ /* Set Backlight Duty Cycle*/
+ i2c_smbus_write_byte_data(data->client, TLC59108_PWM2,
+- brightness & 0xff);
++ 0xff - brightness );
+ }
+
+ static int tlc59108_bl_get_brightness(struct backlight_device *dev)
+@@ -65,8 +66,18 @@ static int tlc59108_bl_update_status(struct backlight_device *dev)
+ {
+ struct backlight_properties *props = &dev->props;
+ struct tlc59108_bl *data = dev_get_drvdata(&dev->dev);
++
+ int brightness = props->brightness;
+
++ if (dev->props.state & BL_CORE_FBBLANK) {
++ brightness = 0;
++ /* Set LEDOUT0 Register */
++ i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x10);
++ } else {
++ /* Set LEDOUT0 Register */
++ i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x30);
++ }
++
+ tlc59108_bl_set_backlight(data, brightness);
+
+ return 0;
+@@ -77,7 +88,7 @@ static const struct backlight_ops bl_ops = {
+ .update_status = tlc59108_bl_update_status,
+ };
+
+-static int tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
++static int __devinit tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
+ {
+ struct backlight_properties props;
+ struct tlc59108_bl *data = kzalloc(sizeof(struct tlc59108_bl),
+@@ -104,6 +115,11 @@ static int tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
+
+ backlight_update_status(data->bl);
+
++ i2c_smbus_write_byte_data(data->client, TLC59108_MODE1, 0x00);
++ i2c_smbus_write_byte_data(data->client, TLC59108_PWM2, 0x80);
++ i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT1, 0x05);
++ i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT1, 0x15);
++
+ return 0;
+
+ err_reg:
+@@ -125,7 +141,7 @@ static int tlc59108_remove(struct i2c_client *c)
+ }
+
+ /* I2C Device ID table */
+-static const struct i2c_device_id tlc59108_id[] = {
++static struct i2c_device_id tlc59108_id[] = {
+ { "tlc59108", 0 },
+ { }
+ };
+@@ -134,12 +150,12 @@ MODULE_DEVICE_TABLE(i2c, tlc59108_id);
+ /* I2C driver data */
+ static struct i2c_driver tlc59108_driver = {
+ .driver = {
+- .owner = THIS_MODULE,
+- .name = tlc59108_MODULE_NAME,
++ .owner = THIS_MODULE,
++ .name = "tlc59108"
+ },
++ .id_table = tlc59108_id,
+ .probe = tlc59108_probe,
+ .remove = tlc59108_remove,
+- .id_table = tlc59108_id,
+ };
+
+ static int __init tlc59108_init(void)
+@@ -157,4 +173,4 @@ module_exit(tlc59108_exit);
+
+ MODULE_DESCRIPTION("LCD/Backlight control for TLC59108");
+ MODULE_AUTHOR("Senthil Natarajan <senthil.n@ti.com>");
+-MODULE_LICENSE("GPL v2");
++MODULE_LICENSE("GPL");
+--
+1.7.7.6
+
--- /dev/null
+From 81ff7627ad0d958a5c156cb7d880af8707e14f47 Mon Sep 17 00:00:00 2001
+From: Alexander Holler <holler@ahsoftware.de>
+Date: Wed, 4 Jul 2012 00:03:04 +0200
+Subject: [PATCH 4/5] zeroMAP: Open your eyes!
+
+Signed-off-by: Alexander Holler <holler@ahsoftware.de>
+---
+ kernel/printk.c | 7 +++++++
+ 1 files changed, 7 insertions(+), 0 deletions(-)
+
+diff --git a/kernel/printk.c b/kernel/printk.c
+index 22e070f..3678740 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -1759,6 +1759,13 @@ static int __init console_setup(char *str)
+ char *s, *options, *brl_options = NULL;
+ int idx;
+
++#ifdef CONFIG_SERIAL_OMAP
++ if (!strncmp(str, "tty0", 4) && '0' <= str[4] && '9' >= str[4]) {
++ str[3] = 'O';
++ pr_warn("We are opening your eyes, assuming you want to use an OMAP based serial driver and not a zeroMAP based one! ;)\n");
++ pr_warn("Which means 'tty0%s' was changed to 'ttyO%s' automagically for your pleasure.\n", str+4, str+4);
++ }
++#endif
+ #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+ if (!memcmp(str, "brl,", 4)) {
+ brl_options = "";
+--
+1.7.7.6
+
--- /dev/null
+From f2ec859cb99e6137d78b457f8a6693e69e3b1f33 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Thu, 24 Jan 2013 09:43:51 -0600
+Subject: [PATCH 5/5] ARM: OMAP: Beagle: use TWL4030 generic reset script
+
+Enable TWL_COMMON_PDATA_POWER such that OMAP3530 revisions of the
+Beagle (Bx/Cx) will not hang on reboot when running at 125 Mhz.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 5b57885..9a2c80b 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -831,7 +831,7 @@ static int __init omap3_beagle_i2c_init(void)
+ {
+ omap3_pmic_get_config(&beagle_twldata,
+ TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
+- TWL_COMMON_PDATA_AUDIO,
++ TWL_COMMON_PDATA_AUDIO | TWL_COMMON_PDATA_POWER,
+ TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
+
+ beagle_twldata.vpll2->constraints.name = "VDVI";
+--
+1.7.10.4
+
--- /dev/null
+From 40d889a09a05765138f3b737becadfe927c9b004 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 19 Mar 2013 13:40:50 -0500
+Subject: [PATCH 6/6] DSS2: use DSI PLL for DPI with OMAP3
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/omap2/dss/dpi.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
+index 757b57f..12ed14f 100644
+--- a/drivers/video/omap2/dss/dpi.c
++++ b/drivers/video/omap2/dss/dpi.c
+@@ -58,10 +58,6 @@ static struct platform_device *dpi_get_dsidev(enum omap_channel channel)
+ */
+ switch (omapdss_get_version()) {
+ case OMAPDSS_VER_OMAP24xx:
+- case OMAPDSS_VER_OMAP34xx_ES1:
+- case OMAPDSS_VER_OMAP34xx_ES3:
+- case OMAPDSS_VER_OMAP3630:
+- case OMAPDSS_VER_AM35xx:
+ return NULL;
+
+ case OMAPDSS_VER_OMAP4430_ES1:
+--
+1.7.10.4
+
--- /dev/null
+From c070885eaf883884f89a77e2f71def5b447f914b Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:25:27 -0600
+Subject: [PATCH 01/10] Beagle: expansion: add buddy param for expansionboard
+ names
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index c3558f9..29d549c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -23,6 +23,7 @@
+ #include <linux/pwm.h>
+ #include <linux/leds_pwm.h>
+ #include <linux/gpio.h>
++#include <linux/irq.h>
+ #include <linux/input.h>
+ #include <linux/gpio_keys.h>
+ #include <linux/opp.h>
+@@ -191,6 +192,8 @@ static void __init omap3_beagle_init_rev(void)
+ }
+ }
+
++char expansionboard_name[16];
++
+ static struct mtd_partition omap3beagle_nand_partitions[] = {
+ /* All the partition sizes are listed in terms of NAND block size */
+ {
+@@ -470,6 +473,18 @@ static struct omap_board_mux board_mux[] __initdata = {
+ };
+ #endif
+
++static int __init expansionboard_setup(char *str)
++{
++ if (!machine_is_omap3_beagle())
++ return 0;
++
++ if (!str)
++ return -EINVAL;
++ strncpy(expansionboard_name, str, 16);
++ pr_info("Beagle expansionboard: %s\n", expansionboard_name);
++ return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+ int r = 0;
+@@ -559,6 +574,8 @@ static void __init omap3_beagle_init(void)
+ pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+ }
+
++early_param("buddy", expansionboard_setup);
++
+ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
+ /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
+ .atag_offset = 0x100,
+--
+1.7.10.4
+
--- /dev/null
+From e71075202707e044a28604bd929fd6f7a89adeae Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Mon, 21 Jan 2013 11:47:02 -0600
+Subject: [PATCH 02/10] Beagle: expansion: add zippy
+
+v2: add #include <linux/regulator/fixed.h>
+build fix from Pantelis Antoniou <panto@antoniou-consulting.com>
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 164 +++++++++++++++++++++++++++++--
+ 1 file changed, 158 insertions(+), 6 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 4e6e767..b3685ed 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -37,6 +37,7 @@
+ #include <linux/usb/nop-usb-xceiv.h>
+
+ #include <linux/regulator/machine.h>
++#include <linux/regulator/fixed.h>
+ #include <linux/i2c/twl.h>
+
+ #include <asm/mach-types.h>
+@@ -195,6 +196,86 @@ static void __init omap3_beagle_init_rev(void)
+
+ char expansionboard_name[16];
+
++enum {
++ EXPANSION_MMC_NONE = 0,
++ EXPANSION_MMC_ZIPPY,
++ EXPANSION_MMC_WIFI,
++};
++
++enum {
++ EXPANSION_I2C_NONE = 0,
++ EXPANSION_I2C_ZIPPY,
++};
++
++static struct {
++ int mmc_settings;
++ int i2c_settings;
++} expansion_config = {
++ .mmc_settings = EXPANSION_MMC_NONE,
++ .i2c_settings = EXPANSION_I2C_NONE,
++};
++
++//rcn-ee: this is just a fake regulator, the zippy hardware provides 3.3/1.8 with jumper..
++static struct fixed_voltage_config beagle_vzippy = {
++ .supply_name = "vzippy",
++ .microvolts = 3300000, /* 3.3V */
++ .startup_delay = 70000, /* 70ms */
++ .enable_high = 1,
++ .enabled_at_boot = 0,
++ .init_data = &beagle_vmmc2,
++};
++
++static struct platform_device omap_zippy_device = {
++ .name = "reg-fixed-voltage",
++ .id = 1,
++ .dev = {
++ .platform_data = &beagle_vzippy,
++ },
++};
++
++#define OMAP3BEAGLE_GPIO_ZIPPY_MMC_WP 141
++#define OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD 162
++
++#if IS_ENABLED(CONFIG_ENC28J60)
++#include <linux/platform_data/spi-omap2-mcspi.h>
++#include <linux/spi/spi.h>
++
++#define OMAP3BEAGLE_GPIO_ENC28J60_IRQ 157
++
++static struct omap2_mcspi_device_config enc28j60_spi_chip_info = {
++ .turbo_mode = 0,
++};
++
++static struct spi_board_info omap3beagle_zippy_spi_board_info[] __initdata = {
++ {
++ .modalias = "enc28j60",
++ .bus_num = 4,
++ .chip_select = 0,
++ .max_speed_hz = 20000000,
++ .controller_data = &enc28j60_spi_chip_info,
++ },
++};
++
++static void __init omap3beagle_enc28j60_init(void)
++{
++ if ((gpio_request(OMAP3BEAGLE_GPIO_ENC28J60_IRQ, "ENC28J60_IRQ") == 0) &&
++ (gpio_direction_input(OMAP3BEAGLE_GPIO_ENC28J60_IRQ) == 0)) {
++ gpio_export(OMAP3BEAGLE_GPIO_ENC28J60_IRQ, 0);
++ omap3beagle_zippy_spi_board_info[0].irq = gpio_to_irq(OMAP3BEAGLE_GPIO_ENC28J60_IRQ);
++ irq_set_irq_type(omap3beagle_zippy_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING);
++ } else {
++ pr_err("Beagle expansionboard: could not obtain gpio for ENC28J60_IRQ\n");
++ return;
++ }
++
++ spi_register_board_info(omap3beagle_zippy_spi_board_info,
++ ARRAY_SIZE(omap3beagle_zippy_spi_board_info));
++}
++
++#else
++static inline void __init omap3beagle_enc28j60_init(void) { return; }
++#endif
++
+ static struct mtd_partition omap3beagle_nand_partitions[] = {
+ /* All the partition sizes are listed in terms of NAND block size */
+ {
+@@ -271,6 +352,23 @@ static struct omap2_hsmmc_info mmc[] = {
+ {} /* Terminator */
+ };
+
++static struct omap2_hsmmc_info mmc_zippy[] = {
++ {
++ .mmc = 1,
++ .caps = MMC_CAP_4_BIT_DATA,
++ .gpio_wp = -EINVAL,
++ .deferred = true,
++ },
++ {
++ .mmc = 2,
++ .caps = MMC_CAP_4_BIT_DATA,
++ .gpio_wp = OMAP3BEAGLE_GPIO_ZIPPY_MMC_WP,
++ .gpio_cd = OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD,
++ .transceiver = true,
++ .deferred = true,
++ },
++ {} /* Terminator */
++};
+ static struct regulator_consumer_supply beagle_vmmc1_supply[] = {
+ REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
+ };
+@@ -301,10 +399,21 @@ static int beagle_twl_gpio_setup(struct device *dev,
+ {
+ int r;
+
+- mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
+- /* gpio + 0 is "mmc0_cd" (input/IRQ) */
+- mmc[0].gpio_cd = gpio + 0;
+- omap_hsmmc_late_init(mmc);
++ switch (expansion_config.mmc_settings) {
++ case EXPANSION_MMC_ZIPPY:
++ mmc_zippy[0].gpio_wp = beagle_config.mmc1_gpio_wp;
++ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
++ mmc_zippy[0].gpio_cd = gpio + 0;
++
++ omap_hsmmc_late_init(mmc_zippy);
++ break;
++ default:
++ mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
++ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
++ mmc[0].gpio_cd = gpio + 0;
++
++ omap_hsmmc_late_init(mmc);
++ }
+
+ /*
+ * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
+@@ -396,6 +505,14 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
+ },
+ };
+
++static struct i2c_board_info __initdata zippy_i2c2_rtc[] = {
++#if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE)
++ {
++ I2C_BOARD_INFO("ds1307", 0x68),
++ },
++#endif
++};
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+ omap3_pmic_get_config(&beagle_twldata,
+@@ -406,6 +523,15 @@ static int __init omap3_beagle_i2c_init(void)
+ beagle_twldata.vpll2->constraints.name = "VDVI";
+
+ omap3_pmic_init("twl4030", &beagle_twldata);
++
++ switch (expansion_config.i2c_settings) {
++ case EXPANSION_I2C_ZIPPY:
++ omap_register_i2c_bus(2, 400, zippy_i2c2_rtc, ARRAY_SIZE(zippy_i2c2_rtc));
++ break;
++ default:
++ omap_register_i2c_bus(2, 400, NULL, 0);
++ }
++
+ /* 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));
+@@ -548,10 +674,30 @@ static void __init omap3_beagle_init(void)
+ omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+ omap3_beagle_init_rev();
+
++ if (!strcmp(expansionboard_name, "zippy"))
++ {
++ pr_info("Beagle expansionboard: initializing zippy mmc\n");
++ platform_device_register(&omap_zippy_device);
++
++ expansion_config.i2c_settings = EXPANSION_I2C_ZIPPY;
++ expansion_config.mmc_settings = EXPANSION_MMC_ZIPPY;
++
++ omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_WP, OMAP_PIN_INPUT);
++ omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
++ }
++
+ if (gpio_is_valid(beagle_config.mmc1_gpio_wp))
+ omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
+- mmc[0].caps = beagle_config.mmc_caps;
+- omap_hsmmc_init(mmc);
++
++ switch (expansion_config.mmc_settings) {
++ case EXPANSION_MMC_ZIPPY:
++ mmc_zippy[0].caps = beagle_config.mmc_caps;
++ omap_hsmmc_init(mmc_zippy);
++ break;
++ default:
++ mmc[0].caps = beagle_config.mmc_caps;
++ omap_hsmmc_init(mmc);
++ }
+
+ omap3_beagle_i2c_init();
+
+@@ -566,6 +712,12 @@ static void __init omap3_beagle_init(void)
+ omap_sdrc_init(mt46h32m32lf6_sdrc_params,
+ mt46h32m32lf6_sdrc_params);
+
++ if (!strcmp(expansionboard_name, "zippy"))
++ {
++ pr_info("Beagle expansionboard: initializing enc28j60\n");
++ omap3beagle_enc28j60_init();
++ }
++
+ usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+ usb_musb_init(NULL);
+
+--
+1.7.10.4
+
--- /dev/null
+From 45bed17e65e1a83f753896e250f3458654dcb229 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:32:15 -0600
+Subject: [PATCH 03/10] Beagle: expansion: add zippy2
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 48 ++++++++++++++++++++++++++++++-
+ 1 file changed, 47 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index b3685ed..74da505 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -276,6 +276,46 @@ static void __init omap3beagle_enc28j60_init(void)
+ static inline void __init omap3beagle_enc28j60_init(void) { return; }
+ #endif
+
++#if IS_ENABLED(CONFIG_KS8851)
++#include <linux/platform_data/spi-omap2-mcspi.h>
++#include <linux/spi/spi.h>
++
++#define OMAP3BEAGLE_GPIO_KS8851_IRQ 157
++
++static struct omap2_mcspi_device_config ks8851_spi_chip_info = {
++ .turbo_mode = 0,
++};
++
++static struct spi_board_info omap3beagle_zippy2_spi_board_info[] __initdata = {
++ {
++ .modalias = "ks8851",
++ .bus_num = 4,
++ .chip_select = 0,
++ .max_speed_hz = 36000000,
++ .controller_data = &ks8851_spi_chip_info,
++ },
++};
++
++static void __init omap3beagle_ks8851_init(void)
++{
++ if ((gpio_request(OMAP3BEAGLE_GPIO_KS8851_IRQ, "KS8851_IRQ") == 0) &&
++ (gpio_direction_input(OMAP3BEAGLE_GPIO_KS8851_IRQ) == 0)) {
++ gpio_export(OMAP3BEAGLE_GPIO_KS8851_IRQ, 0);
++ omap3beagle_zippy2_spi_board_info[0].irq = gpio_to_irq(OMAP3BEAGLE_GPIO_KS8851_IRQ);
++ irq_set_irq_type(omap3beagle_zippy2_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING);
++ } else {
++ pr_err("Beagle expansionboard: could not obtain gpio for KS8851_IRQ\n");
++ return;
++ }
++
++ spi_register_board_info(omap3beagle_zippy2_spi_board_info,
++ ARRAY_SIZE(omap3beagle_zippy2_spi_board_info));
++}
++
++#else
++static inline void __init omap3beagle_ks8851_init(void) { return; }
++#endif
++
+ static struct mtd_partition omap3beagle_nand_partitions[] = {
+ /* All the partition sizes are listed in terms of NAND block size */
+ {
+@@ -674,7 +714,7 @@ static void __init omap3_beagle_init(void)
+ omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+ omap3_beagle_init_rev();
+
+- if (!strcmp(expansionboard_name, "zippy"))
++ if ((!strcmp(expansionboard_name, "zippy")) || (!strcmp(expansionboard_name, "zippy2")))
+ {
+ pr_info("Beagle expansionboard: initializing zippy mmc\n");
+ platform_device_register(&omap_zippy_device);
+@@ -718,6 +758,12 @@ static void __init omap3_beagle_init(void)
+ omap3beagle_enc28j60_init();
+ }
+
++ if (!strcmp(expansionboard_name, "zippy2"))
++ {
++ pr_info("Beagle expansionboard: initializing ks_8851\n");
++ omap3beagle_ks8851_init();
++ }
++
+ usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+ usb_musb_init(NULL);
+
+--
+1.7.10.4
+
--- /dev/null
+From 4d9b4e5795e322ed3efed9b8402f604e2e53cc6f Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:33:24 -0600
+Subject: [PATCH 04/10] Beagle: expansion: add trainer
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 31 +++++++++++++++++++++++++++++++
+ 1 file changed, 31 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 74da505..b5ed547 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -764,6 +764,37 @@ static void __init omap3_beagle_init(void)
+ omap3beagle_ks8851_init();
+ }
+
++ if (!strcmp(expansionboard_name, "trainer"))
++ {
++ pr_info("Beagle expansionboard: exporting GPIOs 130-141,162 to userspace\n");
++ gpio_request(130, "sysfs");
++ gpio_export(130, 1);
++ gpio_request(131, "sysfs");
++ gpio_export(131, 1);
++ gpio_request(132, "sysfs");
++ gpio_export(132, 1);
++ gpio_request(133, "sysfs");
++ gpio_export(133, 1);
++ gpio_request(134, "sysfs");
++ gpio_export(134, 1);
++ gpio_request(135, "sysfs");
++ gpio_export(135, 1);
++ gpio_request(136, "sysfs");
++ gpio_export(136, 1);
++ gpio_request(137, "sysfs");
++ gpio_export(137, 1);
++ gpio_request(138, "sysfs");
++ gpio_export(138, 1);
++ gpio_request(139, "sysfs");
++ gpio_export(139, 1);
++ gpio_request(140, "sysfs");
++ gpio_export(140, 1);
++ gpio_request(141, "sysfs");
++ gpio_export(141, 1);
++ gpio_request(162, "sysfs");
++ gpio_export(162, 1);
++ }
++
+ usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+ usb_musb_init(NULL);
+
+--
+1.7.10.4
+
--- /dev/null
+From a53e7913a95faefde1ee87a7ea048c04b0850066 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:42:03 -0600
+Subject: [PATCH 05/10] Beagle: expansion: add CircuitCo ulcd Support
+
+This of a cleanup, squashed both ulcd commits into one:
+
+======================================================================
+
+expansion: add ulcd
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+
+======================================================================
+
+beagleboard: fix uLCD7 support
+Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
+
+======================================================================
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 136 ++++++++++++++++++++++
+ drivers/video/omap2/displays/panel-generic-dpi.c | 27 +++++
+ 2 files changed, 163 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 0f9b253..b2807c2 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -118,12 +118,16 @@ static struct {
+ int dvi_pd_gpio;
+ int usr_button_gpio;
+ int mmc_caps;
++ char *lcd_driver_name;
++ int lcd_pwren;
+ } beagle_config = {
+ .mmc1_gpio_wp = -EINVAL,
+ .usb_pwr_level = 0,
+ .dvi_pd_gpio = -EINVAL,
+ .usr_button_gpio = 4,
+ .mmc_caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
++ .lcd_driver_name = "",
++ .lcd_pwren = 156,
+ };
+
+ static struct gpio omap3_beagle_rev_gpios[] __initdata = {
+@@ -195,6 +199,7 @@ static void __init omap3_beagle_init_rev(void)
+ }
+
+ char expansionboard_name[16];
++char expansionboard2_name[16];
+
+ enum {
+ EXPANSION_MMC_NONE = 0,
+@@ -205,6 +210,7 @@ enum {
+ enum {
+ EXPANSION_I2C_NONE = 0,
+ EXPANSION_I2C_ZIPPY,
++ EXPANSION_I2C_7ULCD,
+ };
+
+ static struct {
+@@ -369,9 +375,53 @@ static struct omap_dss_device beagle_tv_device = {
+ .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
+ };
+
++static int beagle_enable_lcd(struct omap_dss_device *dssdev)
++{
++ if (gpio_is_valid(beagle_config.lcd_pwren)) {
++ pr_info("%s: Enabling LCD\n", __FUNCTION__);
++ gpio_set_value(beagle_config.lcd_pwren, 0);
++ } else {
++ pr_info("%s: Invalid LCD enable GPIO: %d\n",
++ __FUNCTION__, beagle_config.lcd_pwren);
++ }
++
++ return 0;
++}
++
++static void beagle_disable_lcd(struct omap_dss_device *dssdev)
++{
++ if (gpio_is_valid(beagle_config.lcd_pwren)) {
++ pr_info("%s: Disabling LCD\n", __FUNCTION__);
++ gpio_set_value(beagle_config.lcd_pwren, 1);
++ } else {
++ pr_info("%s: Invalid LCD enable GPIO: %d\n",
++ __FUNCTION__, beagle_config.lcd_pwren);
++ }
++
++ return;
++}
++
++static struct panel_generic_dpi_data lcd_panel = {
++ .name = "tfc_s9700rtwv35tr-01b",
++ .platform_enable = beagle_enable_lcd,
++ .platform_disable = beagle_disable_lcd,
++};
++
++static struct omap_dss_device beagle_lcd_device = {
++ .type = OMAP_DISPLAY_TYPE_DPI,
++ .name = "lcd",
++ .driver_name = "generic_dpi_panel",
++ .phy.dpi.data_lines = 24,
++ .platform_enable = beagle_enable_lcd,
++ .platform_disable = beagle_disable_lcd,
++ .reset_gpio = -EINVAL,
++ .data = &lcd_panel,
++};
++
+ static struct omap_dss_device *beagle_dss_devices[] = {
+ &beagle_dvi_device,
+ &beagle_tv_device,
++ &beagle_lcd_device,
+ };
+
+ static struct omap_dss_board_info beagle_dss_data = {
+@@ -553,6 +603,53 @@ static struct i2c_board_info __initdata zippy_i2c2_rtc[] = {
+ #endif
+ };
+
++#if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
++/* Touchscreen */
++#include <linux/i2c/tsc2007.h>
++
++#define OMAP3BEAGLE_TSC2007_GPIO 157
++
++static int omap3beagle_tsc2007_get_pendown_state(void)
++{
++ return !gpio_get_value(OMAP3BEAGLE_TSC2007_GPIO);
++}
++
++static struct tsc2007_platform_data tsc2007_info = {
++ .model = 2007,
++ .x_plate_ohms = 180,
++ .get_pendown_state = omap3beagle_tsc2007_get_pendown_state,
++};
++
++static struct i2c_board_info __initdata beagle_i2c2_bbtoys_ulcd[] = {
++ {
++ I2C_BOARD_INFO("tlc59108", 0x40),
++ },
++ {
++ I2C_BOARD_INFO("tsc2007", 0x48),
++ .platform_data = &tsc2007_info,
++ },
++};
++
++static void __init omap3beagle_tsc2007_init(void)
++{
++ int r;
++
++ omap_mux_init_gpio(OMAP3BEAGLE_TSC2007_GPIO, OMAP_PIN_INPUT_PULLUP);
++
++ r = gpio_request_one(OMAP3BEAGLE_TSC2007_GPIO, GPIOF_IN, "tsc2007_pen_down");
++ if (r < 0) {
++ pr_err("Beagle expansionboard: failed to request GPIO#%d for "
++ "tsc2007 pen down IRQ\n", OMAP3BEAGLE_TSC2007_GPIO);
++ return;
++ }
++
++ beagle_i2c2_bbtoys_ulcd[0].irq = gpio_to_irq(OMAP3BEAGLE_TSC2007_GPIO);
++ irq_set_irq_type(gpio_to_irq(OMAP3BEAGLE_TSC2007_GPIO), IRQ_TYPE_EDGE_FALLING);
++}
++#else
++static struct i2c_board_info __initdata beagle_i2c2_bbtoys_ulcd[] = {};
++#endif
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+ omap3_pmic_get_config(&beagle_twldata,
+@@ -565,6 +662,10 @@ static int __init omap3_beagle_i2c_init(void)
+ omap3_pmic_init("twl4030", &beagle_twldata);
+
+ switch (expansion_config.i2c_settings) {
++ case EXPANSION_I2C_7ULCD:
++ omap_register_i2c_bus(2, 400, beagle_i2c2_bbtoys_ulcd,
++ ARRAY_SIZE(beagle_i2c2_bbtoys_ulcd));
++ break;
+ case EXPANSION_I2C_ZIPPY:
+ omap_register_i2c_bus(2, 400, zippy_i2c2_rtc, ARRAY_SIZE(zippy_i2c2_rtc));
+ break;
+@@ -661,6 +762,18 @@ static int __init expansionboard_setup(char *str)
+ return 0;
+ }
+
++static int __init expansionboard2_setup(char *str)
++{
++ if (!machine_is_omap3_beagle())
++ return 0;
++
++ if (!str)
++ return -EINVAL;
++ strncpy(expansionboard2_name, str, 16);
++ pr_info("Beagle expansionboard2: %s\n", expansionboard2_name);
++ return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+ int r = 0;
+@@ -726,6 +839,20 @@ static void __init omap3_beagle_init(void)
+ omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
+ }
+
++ if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
++ {
++ int r;
++ expansion_config.i2c_settings = EXPANSION_I2C_7ULCD;
++
++ /* TODO: set lcd_driver_name by command line or device tree */
++ beagle_config.lcd_driver_name = "tfc_s9700rtwv35tr-01b",
++ lcd_panel.name = beagle_config.lcd_driver_name;
++
++ r = gpio_request_one(beagle_config.lcd_pwren, GPIOF_OUT_INIT_LOW, "LCD power");
++ if (r < 0)
++ pr_err("Beagle expansionboard: Unable to get LCD power enable GPIO\n");
++ }
++
+ if (gpio_is_valid(beagle_config.mmc1_gpio_wp))
+ omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
+
+@@ -795,6 +922,14 @@ static void __init omap3_beagle_init(void)
+ gpio_export(162, 1);
+ }
+
++ if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
++ {
++ #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
++ pr_info("Beagle expansionboard: initializing touchscreen: tsc2007\n");
++ omap3beagle_tsc2007_init();
++ #endif
++ }
++
+ usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+ usb_musb_init(NULL);
+
+@@ -816,6 +951,7 @@ static void __init omap3_beagle_init(void)
+ }
+
+ early_param("buddy", expansionboard_setup);
++early_param("buddy2", expansionboard2_setup);
+
+ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
+ /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
+diff --git a/drivers/video/omap2/displays/panel-generic-dpi.c b/drivers/video/omap2/displays/panel-generic-dpi.c
+index 97363f7..614031f 100644
+--- a/drivers/video/omap2/displays/panel-generic-dpi.c
++++ b/drivers/video/omap2/displays/panel-generic-dpi.c
+@@ -515,6 +515,33 @@ static struct panel_config generic_dpi_panels[] = {
+ },
+ .name = "primeview_pd104slf",
+ },
++
++ /* ThreeFiveCorp S9700RTWV35TR-01B */
++ {
++ {
++ .x_res = 800,
++ .y_res = 480,
++
++ .pixel_clock = 30000,
++
++ .hsw = 49,
++ .hfp = 41,
++ .hbp = 40,
++
++ .vsw = 4,
++ .vfp = 14,
++ .vbp = 29,
++
++ .vsync_level = OMAPDSS_SIG_ACTIVE_LOW,
++ .hsync_level = OMAPDSS_SIG_ACTIVE_LOW,
++ .data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE,
++ .de_level = OMAPDSS_SIG_ACTIVE_HIGH,
++ .sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES,
++ },
++ .power_on_delay = 50,
++ .power_off_delay = 100,
++ .name = "tfc_s9700rtwv35tr-01b",
++ },
+ };
+
+ struct panel_drv_data {
+--
+1.7.10.4
+
--- /dev/null
+From f78cd93d767cd75969c4661723cfce46071e5b1b Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:48:52 -0600
+Subject: [PATCH 06/10] Beagle: expansion: add wifi
+
+build fixes from Pantelis Antoniou <panto@antoniou-consulting.com>
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 119 +++++++++++++++++++++++++++++++
+ 1 file changed, 119 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index a8de97e..2322d6c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -221,6 +221,73 @@ static struct {
+ .i2c_settings = EXPANSION_I2C_NONE,
+ };
+
++#if IS_ENABLED(CONFIG_WL12XX)
++#include <linux/regulator/fixed.h>
++#include <linux/ti_wilink_st.h>
++#include <linux/wl12xx.h>
++
++#define OMAP_BEAGLE_WLAN_EN_GPIO (139)
++#define OMAP_BEAGLE_BT_EN_GPIO (138)
++#define OMAP_BEAGLE_WLAN_IRQ_GPIO (137)
++#define OMAP_BEAGLE_FM_EN_BT_WU (136)
++
++struct wl12xx_platform_data omap_beagle_wlan_data __initdata = {
++ .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
++};
++
++static struct ti_st_plat_data wilink_platform_data = {
++ .nshutdown_gpio = OMAP_BEAGLE_BT_EN_GPIO,
++ .dev_name = "/dev/ttyO1",
++ .flow_cntrl = 1,
++ .baud_rate = 3000000,
++ .chip_enable = NULL,
++ .suspend = NULL,
++ .resume = NULL,
++};
++
++static struct platform_device wl12xx_device = {
++ .name = "kim",
++ .id = -1,
++ .dev.platform_data = &wilink_platform_data,
++};
++
++static struct platform_device btwilink_device = {
++ .name = "btwilink",
++ .id = -1,
++};
++#endif
++
++static struct regulator_consumer_supply beagle_vmmc2_supply =
++ REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
++
++static struct regulator_init_data beagle_vmmc2 = {
++ .constraints = {
++ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = &beagle_vmmc2_supply,
++};
++
++#if IS_ENABLED(CONFIG_WL12XX)
++static struct fixed_voltage_config beagle_vwlan = {
++ .supply_name = "vwl1271",
++ .microvolts = 1800000, /* 1.8V */
++ .gpio = OMAP_BEAGLE_WLAN_EN_GPIO,
++ .startup_delay = 70000, /* 70ms */
++ .enable_high = 1,
++ .enabled_at_boot = 0,
++ .init_data = &beagle_vmmc2,
++};
++
++static struct platform_device omap_vwlan_device = {
++ .name = "reg-fixed-voltage",
++ .id = 1,
++ .dev = {
++ .platform_data = &beagle_vwlan,
++ },
++};
++#endif
++
+ //rcn-ee: this is just a fake regulator, the zippy hardware provides 3.3/1.8 with jumper..
+ static struct fixed_voltage_config beagle_vzippy = {
+ .supply_name = "vzippy",
+@@ -459,6 +526,26 @@ static struct omap2_hsmmc_info mmc_zippy[] = {
+ },
+ {} /* Terminator */
+ };
++
++static struct omap2_hsmmc_info mmcbbt[] = {
++ {
++ .mmc = 1,
++ .caps = MMC_CAP_4_BIT_DATA,
++ .gpio_wp = -EINVAL,
++ .deferred = true,
++ },
++ {
++ .name = "wl1271",
++ .mmc = 2,
++ .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
++ .gpio_wp = -EINVAL,
++ .gpio_cd = -EINVAL,
++ .ocr_mask = MMC_VDD_165_195,
++ .nonremovable = true,
++ },
++ {} /* Terminator */
++};
++
+ static struct regulator_consumer_supply beagle_vmmc1_supply[] = {
+ REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
+ };
+@@ -490,6 +577,13 @@ static int beagle_twl_gpio_setup(struct device *dev,
+ int r;
+
+ switch (expansion_config.mmc_settings) {
++ case EXPANSION_MMC_WIFI:
++ mmcbbt[0].gpio_wp = beagle_config.mmc1_gpio_wp;
++ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
++ mmcbbt[0].gpio_cd = gpio + 0;
++
++ omap_hsmmc_late_init(mmcbbt);
++ break;
+ case EXPANSION_MMC_ZIPPY:
+ mmc_zippy[0].gpio_wp = beagle_config.mmc1_gpio_wp;
+ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
+@@ -839,6 +933,13 @@ static void __init omap3_beagle_init(void)
+ omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
+ }
+
++ if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++ {
++ #if IS_ENABLED(CONFIG_WL12XX)
++ expansion_config.mmc_settings = EXPANSION_MMC_WIFI;
++ #endif
++ }
++
+ if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+ {
+ int r;
+@@ -857,6 +958,10 @@ static void __init omap3_beagle_init(void)
+ omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
+
+ switch (expansion_config.mmc_settings) {
++ case EXPANSION_MMC_WIFI:
++ mmcbbt[0].caps = beagle_config.mmc_caps;
++ omap_hsmmc_init(mmcbbt);
++ break;
+ case EXPANSION_MMC_ZIPPY:
+ mmc_zippy[0].caps = beagle_config.mmc_caps;
+ omap_hsmmc_init(mmc_zippy);
+@@ -922,6 +1027,20 @@ static void __init omap3_beagle_init(void)
+ gpio_export(162, 1);
+ }
+
++ if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++ {
++ #if IS_ENABLED(CONFIG_WL12XX)
++ omap_beagle_wlan_data.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
++ if (wl12xx_set_platform_data(&omap_beagle_wlan_data))
++ pr_err("error setting wl12xx data\n");
++ pr_info("Beagle expansionboard: registering wl12xx bt platform device\n");
++ platform_device_register(&wl12xx_device);
++ platform_device_register(&btwilink_device);
++ pr_info("Beagle expansionboard: registering wl12xx wifi platform device\n");
++ platform_device_register(&omap_vwlan_device);
++ #endif
++ }
++
+ if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+ {
+ #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
+--
+1.7.10.4
+
--- /dev/null
+From 0c361e9db10f9ec3598bf062a605a451857ee06e Mon Sep 17 00:00:00 2001
+From: Bas van der Doorn <bas@doornvd.com>
+Date: Tue, 11 Dec 2012 06:52:22 -0600
+Subject: [PATCH 07/10] Beagle: expansion: add beaglefpga
+
+Added SPI dev and McBSP 3 mux when FPGA is detected
+
+Signed-off-by: Bas van der Doorn <bas@doornvd.com>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 76 +++++++++++++++++++++++++++++++
+ 1 file changed, 76 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 2322d6c..c257f3c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -44,6 +44,7 @@
+ #include <asm/mach/arch.h>
+ #include <asm/mach/map.h>
+ #include <asm/mach/flash.h>
++#include <linux/spi/spi.h>
+
+ #include <video/omapdss.h>
+ #include <video/omap-panel-data.h>
+@@ -916,6 +917,68 @@ static int __init beagle_opp_init(void)
+ }
+ omap_device_initcall(beagle_opp_init);
+
++static void __init omap3_beagle_config_mcspi3_mux(void)
++{
++ /* NOTE: Clock pins need to be in input mode */
++ omap_mux_init_signal("sdmmc2_clk.mcspi3_clk", OMAP_PIN_INPUT);
++ omap_mux_init_signal("sdmmc2_cmd.mcspi3_simo", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("sdmmc2_dat0.mcspi3_somi", OMAP_PIN_INPUT_PULLUP);
++ omap_mux_init_signal("sdmmc2_dat2.mcspi3_cs1", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("sdmmc2_dat3.mcspi3_cs0", OMAP_PIN_OUTPUT);
++}
++
++static void __init omap3_beagle_config_mcspi4_mux(void)
++{
++ /* NOTE: Clock pins need to be in input mode */
++ omap_mux_init_signal("mcbsp1_clkr.mcspi4_clk", OMAP_PIN_INPUT);
++ omap_mux_init_signal("mcbsp1_dx.mcspi4_simo", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("mcbsp1_dr.mcspi4_somi", OMAP_PIN_INPUT_PULLUP);
++ omap_mux_init_signal("mcbsp1_fsx.mcspi4_cs0", OMAP_PIN_OUTPUT);
++}
++
++static void __init omap3_beagle_config_mcbsp3_mux(void)
++{
++ omap_mux_init_signal("mcbsp3_fsx.uart2_rx", OMAP_PIN_INPUT);
++ omap_mux_init_signal("uart2_cts.mcbsp3_dx", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("uart2_rts.mcbsp3_dr", OMAP_PIN_INPUT);
++ /* NOTE: Clock pins need to be in input mode */
++ omap_mux_init_signal("uart2_tx.mcbsp3_clkx", OMAP_PIN_INPUT);
++}
++
++static void __init omap3_beagle_config_fpga_mux(void)
++{
++ omap3_beagle_config_mcbsp3_mux();
++ omap3_beagle_config_mcspi3_mux();
++ omap3_beagle_config_mcspi4_mux();
++}
++
++static struct spi_board_info beagle_mcspi_board_info[] = {
++ /* spi 3.0 */
++ {
++ .modalias = "spidev",
++ .max_speed_hz = 48000000, //48 Mbps
++ .bus_num = 3,
++ .chip_select = 0,
++ .mode = SPI_MODE_1,
++ },
++ /* spi 3.1 */
++ {
++ .modalias = "spidev",
++ .max_speed_hz = 48000000, //48 Mbps
++ .bus_num = 3,
++ .chip_select = 1,
++ .mode = SPI_MODE_1,
++ },
++ /* spi 4.0 */
++ {
++ .modalias = "spidev",
++ .max_speed_hz = 48000000, //48 Mbps
++ .bus_num = 4,
++ .chip_select = 0,
++ .mode = SPI_MODE_1,
++ },
++};
++
+ static void __init omap3_beagle_init(void)
+ {
+ omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+@@ -1041,6 +1104,19 @@ static void __init omap3_beagle_init(void)
+ #endif
+ }
+
++ if (!strcmp(expansionboard_name, "beaglefpga"))
++ {
++ #if IS_ENABLED(CONFIG_SPI_SPIDEV)
++ pr_info("Beagle expansionboard: enabling SPIdev for McSPI3/4 and pin muxing for McBSP3 slave mode\n");
++
++ /* FPGA pin settings configure McSPI 3, McSPI 4 and McBSP 3 */
++ omap3_beagle_config_fpga_mux();
++
++ /* register McSPI 3 and McSPI 4 for FPGA programming and control */
++ spi_register_board_info(beagle_mcspi_board_info, ARRAY_SIZE(beagle_mcspi_board_info));
++ #endif
++ }
++
+ if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+ {
+ #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
+--
+1.7.10.4
+
--- /dev/null
+From 5258354e6e4d0b55334099868668a166d967c1d2 Mon Sep 17 00:00:00 2001
+From: Russell Hay <russell.hay@gmail.com>
+Date: Tue, 11 Dec 2012 06:53:58 -0600
+Subject: [PATCH 08/10] Beagle: expansion: add spidev
+
+Signed-off-by: Russell Hay <russell.hay@gmail.com>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index c257f3c..3e0313ee 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -1117,6 +1117,16 @@ static void __init omap3_beagle_init(void)
+ #endif
+ }
+
++ if (!strcmp(expansionboard_name, "spidev"))
++ {
++ #if IS_ENABLED(CONFIG_SPI_SPIDEV)
++ pr_info("Beagle expansionboard: registering spidev\n");
++ omap3_beagle_config_mcspi3_mux();
++ omap3_beagle_config_mcspi4_mux();
++ spi_register_board_info(beagle_mcspi_board_info, ARRAY_SIZE(beagle_mcspi_board_info));
++ #endif
++ }
++
+ if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+ {
+ #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
+--
+1.7.10.4
+
--- /dev/null
+From cc6ced0a1cbaea65a507ec3fe543a5b98d760d23 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:58:15 -0600
+Subject: [PATCH 09/10] Beagle: expansion: add Aptina li5m03 camera
+
+Based on:
+https://github.com/Aptina/BeagleBoard-xM/blob/master/tools/0266-Adding-MT9P031-Support-files.patch
+
+And on Max Galemin's patch
+https://github.com/MaxGalemin/buildroot/blob/master/board/beagleboard/xm/kernel-patches/linux-0003-Add-support-for-MT9P031-Aptina-image-sensor-driver.patch
+
+And Koen Kooi Previous work's
+https://github.com/beagleboard/kernel/blob/beagleboard-3.2/patches/camera/0003-beagleboard-fix-i2c2-init.patch
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 142 +++++++++++++++++++++++++++++++
+ 1 file changed, 142 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 3e0313ee..4fb5eae 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -201,6 +201,7 @@ static void __init omap3_beagle_init_rev(void)
+
+ char expansionboard_name[16];
+ char expansionboard2_name[16];
++char camera_name[16];
+
+ enum {
+ EXPANSION_MMC_NONE = 0,
+@@ -555,6 +556,14 @@ static struct regulator_consumer_supply beagle_vsim_supply[] = {
+ REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
+ };
+
++static struct regulator_consumer_supply beagle_vaux3_supply = {
++ .supply = "cam_1v8",
++};
++
++static struct regulator_consumer_supply beagle_vaux4_supply = {
++ .supply = "cam_2v8",
++};
++
+ static struct gpio_led gpio_leds[];
+
+ /* PHY's VCC regulator might be added later, so flag that we need it */
+@@ -677,11 +686,43 @@ static struct regulator_init_data beagle_vsim = {
+ .consumer_supplies = beagle_vsim_supply,
+ };
+
++/* VAUX3 for CAM_1V8 */
++static struct regulator_init_data beagle_vaux3 = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .apply_uV = true,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL
++ | REGULATOR_MODE_STANDBY,
++ .valid_ops_mask = REGULATOR_CHANGE_MODE
++ | REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = &beagle_vaux3_supply,
++};
++
++/* VAUX4 for CAM_2V8 */
++static struct regulator_init_data beagle_vaux4 = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .apply_uV = true,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL
++ | REGULATOR_MODE_STANDBY,
++ .valid_ops_mask = REGULATOR_CHANGE_MODE
++ | REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = &beagle_vaux4_supply,
++};
++
+ static struct twl4030_platform_data beagle_twldata = {
+ /* platform_data for children goes here */
+ .gpio = &beagle_gpio_data,
+ .vmmc1 = &beagle_vmmc1,
+ .vsim = &beagle_vsim,
++ .vaux3 = &beagle_vaux3,
++ .vaux4 = &beagle_vaux4,
+ };
+
+ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
+@@ -745,6 +786,61 @@ static void __init omap3beagle_tsc2007_init(void)
+ static struct i2c_board_info __initdata beagle_i2c2_bbtoys_ulcd[] = {};
+ #endif
+
++#if IS_ENABLED(CONFIG_VIDEO_MT9P031)
++/* needed for: omap3_beagle_late_initcall */
++#include "devices.h"
++#include <media/omap3isp.h>
++#include <media/mt9p031.h>
++/* needed for: v4l2_dev_to_isp_device */
++#include "../../../drivers/media/platform/omap3isp/isp.h"
++
++#define MT9P031_RESET_GPIO 98
++#define MT9P031_EXT_FREQ 21000000
++#define MT9P031_TARGET_FREQ 48000000
++
++#define MT9P031_I2C_ADDR 0x48
++#define MT9P031_I2C_BUS 2
++
++static struct regulator *reg_1v8, *reg_2v8;
++
++static struct mt9p031_platform_data beagle_mt9p031_platform_data = {
++ .reset = MT9P031_RESET_GPIO,
++ .ext_freq = MT9P031_EXT_FREQ,
++ .target_freq = MT9P031_TARGET_FREQ,
++};
++
++static struct i2c_board_info mt9p031_camera_i2c_device = {
++ I2C_BOARD_INFO("mt9p031", MT9P031_I2C_ADDR),
++ .platform_data = &beagle_mt9p031_platform_data,
++};
++
++static struct isp_subdev_i2c_board_info mt9p031_camera_subdevs[] = {
++ {
++ .board_info = &mt9p031_camera_i2c_device,
++ .i2c_adapter_id = MT9P031_I2C_BUS,
++ },
++ { NULL, 0, },
++};
++
++static struct isp_v4l2_subdevs_group beagle_camera_subdevs[] = {
++ {
++ .subdevs = mt9p031_camera_subdevs,
++ .interface = ISP_INTERFACE_PARALLEL,
++ .bus = {
++ .parallel = {
++ .data_lane_shift = 0,
++ .clk_pol = 1,
++ }
++ },
++ },
++ { },
++};
++
++static struct isp_platform_data beagle_isp_platform_data = {
++ .subdevs = beagle_camera_subdevs,
++};
++#endif
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+ omap3_pmic_get_config(&beagle_twldata,
+@@ -869,6 +965,18 @@ static int __init expansionboard2_setup(char *str)
+ return 0;
+ }
+
++static int __init camera_setup(char *str)
++{
++ if (!machine_is_omap3_beagle())
++ return 0;
++
++ if (!str)
++ return -EINVAL;
++ strncpy(camera_name, str, 16);
++ pr_info("Beagle camera: %s\n", camera_name);
++ return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+ int r = 0;
+@@ -1155,8 +1263,42 @@ static void __init omap3_beagle_init(void)
+ pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+ }
+
++static int __init omap3_beagle_late_initcall(void)
++{
++ if (!machine_is_omap3_beagle())
++ return 0;
++
++ if (!cpu_is_omap3630())
++ return 0;
++
++#if IS_ENABLED(CONFIG_VIDEO_MT9P031)
++ if ((!strcmp(camera_name, "lbcm5m1")) || (!strcmp(camera_name, "li5m03")))
++ {
++ pr_info("Beagle camera: MT9P031 init\n");
++
++ reg_1v8 = regulator_get(NULL, "cam_1v8");
++ if (IS_ERR(reg_1v8))
++ pr_err("%s: cannot get cam_1v8 regulator\n", __func__);
++ else
++ regulator_enable(reg_1v8);
++
++ reg_2v8 = regulator_get(NULL, "cam_2v8");
++ if (IS_ERR(reg_2v8))
++ pr_err("%s: cannot get cam_2v8 regulator\n", __func__);
++ else
++ regulator_enable(reg_2v8);
++
++ omap3_init_camera(&beagle_isp_platform_data);
++ }
++#endif
++ return 0;
++}
++
+ early_param("buddy", expansionboard_setup);
+ early_param("buddy2", expansionboard2_setup);
++early_param("camera", camera_setup);
++
++late_initcall(omap3_beagle_late_initcall);
+
+ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
+ /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
+--
+1.7.10.4
+
--- /dev/null
+From f2e2294733d926e627dcda6425f58611b185c7fc Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 07:02:40 -0600
+Subject: [PATCH 10/10] Beagle: expansion: add LSR COM6L Adapter Board
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 60 ++++++++++++++++++++++++++++---
+ 1 file changed, 55 insertions(+), 5 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 0ac1b49..5a7e7b5 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -202,6 +202,7 @@ static void __init omap3_beagle_init_rev(void)
+ char expansionboard_name[16];
+ char expansionboard2_name[16];
+ char camera_name[16];
++char wl12xx_name[16];
+
+ enum {
+ EXPANSION_MMC_NONE = 0,
+@@ -237,6 +238,10 @@ struct wl12xx_platform_data omap_beagle_wlan_data __initdata = {
+ .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
+ };
+
++struct wl12xx_platform_data omap_beagle_wlan_data_26mhz __initdata = {
++ .board_ref_clock = WL12XX_REFCLOCK_26, /* 26 MHz */
++};
++
+ static struct ti_st_plat_data wilink_platform_data = {
+ .nshutdown_gpio = OMAP_BEAGLE_BT_EN_GPIO,
+ .dev_name = "/dev/ttyO1",
+@@ -987,6 +992,18 @@ static int __init camera_setup(char *str)
+ return 0;
+ }
+
++static int __init wl12xx_setup(char *str)
++{
++ if (!machine_is_omap3_beagle())
++ return 0;
++
++ if (!str)
++ return -EINVAL;
++ strncpy(wl12xx_name, str, 16);
++ pr_info("Beagle wl12xx clk: %s\n", wl12xx_name);
++ return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+ int r = 0;
+@@ -1114,9 +1131,29 @@ static void __init omap3_beagle_init(void)
+ omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
+ }
+
+- if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++ if ((!strcmp(expansionboard_name, "bbtoys-wifi")) || (!strcmp(expansionboard_name, "lsr-com6l-adpt")))
+ {
+ #if IS_ENABLED(CONFIG_WL12XX)
++ pr_info("Beagle expansion: wl12xx: setting up gpio pinmux\n");
++
++ omap_mux_init_gpio(OMAP_BEAGLE_FM_EN_BT_WU, OMAP_PIN_OUTPUT);
++ omap_mux_init_gpio(OMAP_BEAGLE_BT_EN_GPIO, OMAP_PIN_OUTPUT);
++ omap_mux_init_gpio(OMAP_BEAGLE_WLAN_EN_GPIO, OMAP_PIN_OUTPUT);
++
++ omap_mux_init_gpio(OMAP_BEAGLE_WLAN_IRQ_GPIO, OMAP_PIN_INPUT_PULLUP);
++
++ /* WLAN SDIO: MMC2 CLK */
++ omap_mux_init_signal("sdmmc2_clk.sdmmc2_clk", OMAP_PIN_INPUT_PULLUP);
++
++ /* WLAN SDIO: MMC2 CMD */
++ omap_mux_init_signal("sdmmc2_cmd.sdmmc2_cmd", OMAP_PIN_INPUT_PULLUP);
++
++ /* WLAN SDIO: MMC2 DAT[0-3] */
++ omap_mux_init_signal("sdmmc2_dat0.sdmmc2_dat0", OMAP_PIN_INPUT_PULLUP);
++ omap_mux_init_signal("sdmmc2_dat1.sdmmc2_dat1", OMAP_PIN_INPUT_PULLUP);
++ omap_mux_init_signal("sdmmc2_dat2.sdmmc2_dat2", OMAP_PIN_INPUT_PULLUP);
++ omap_mux_init_signal("sdmmc2_dat3.sdmmc2_dat3", OMAP_PIN_INPUT_PULLUP);
++
+ expansion_config.mmc_settings = EXPANSION_MMC_WIFI;
+ #endif
+ }
+@@ -1208,12 +1245,24 @@ static void __init omap3_beagle_init(void)
+ gpio_export(162, 1);
+ }
+
+- if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++ if ((!strcmp(expansionboard_name, "bbtoys-wifi")) || (!strcmp(expansionboard_name, "lsr-com6l-adpt")))
+ {
+ #if IS_ENABLED(CONFIG_WL12XX)
+- omap_beagle_wlan_data.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
+- if (wl12xx_set_platform_data(&omap_beagle_wlan_data))
+- pr_err("error setting wl12xx data\n");
++ pr_info("Beagle expansionboard: initializing wl12xx platform\n");
++
++ if (!strcmp(wl12xx_name, "wl12xx_26mhz")) {
++ pr_info("wl12xx: 26Mhz reference clock (TiWi5)\n");
++ omap_beagle_wlan_data_26mhz.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
++ if (wl12xx_set_platform_data(&omap_beagle_wlan_data_26mhz))
++ pr_err("error setting wl12xx data\n");
++ } else {
++ pr_info("wl12xx: 38.4Mhz reference clock (TiWi2/TiWi-BLE)\n");
++ pr_info("wl12xx: for (TiWi5) support pass kernel [wl12xx_clk=wl12xx_26mhz]\n");
++ omap_beagle_wlan_data.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
++ if (wl12xx_set_platform_data(&omap_beagle_wlan_data))
++ pr_err("error setting wl12xx data\n");
++ }
++
+ pr_info("Beagle expansionboard: registering wl12xx bt platform device\n");
+ platform_device_register(&wl12xx_device);
+ platform_device_register(&btwilink_device);
+@@ -1307,6 +1356,7 @@ static int __init omap3_beagle_late_initcall(void)
+ early_param("buddy", expansionboard_setup);
+ early_param("buddy2", expansionboard2_setup);
+ early_param("camera", camera_setup);
++early_param("wl12xx_clk", wl12xx_setup);
+
+ late_initcall(omap3_beagle_late_initcall);
+
+--
+1.7.10.4
+
--- /dev/null
+From 89eb49ac0268518799984fa035ac3fea0ae758ec Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Mon, 21 Jan 2013 11:52:20 -0600
+Subject: [PATCH 11/11] Beagle: expansion: LSR COM6L Adapter Board also
+ initialize the 24c256 eeprom
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 5a7e7b5..6797488 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -39,6 +39,7 @@
+ #include <linux/regulator/machine.h>
+ #include <linux/regulator/fixed.h>
+ #include <linux/i2c/twl.h>
++#include <linux/i2c/at24.h>
+
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+@@ -214,6 +215,7 @@ enum {
+ EXPANSION_I2C_NONE = 0,
+ EXPANSION_I2C_ZIPPY,
+ EXPANSION_I2C_7ULCD,
++ EXPANSION_I2C_COM6L,
+ };
+
+ static struct {
+@@ -856,6 +858,20 @@ static struct isp_platform_data beagle_isp_platform_data = {
+ };
+ #endif
+
++static struct at24_platform_data beagle_at24_eeprom_info = {
++ .byte_len = (256*1024) / 8,
++ .page_size = 64,
++ .flags = AT24_FLAG_ADDR16,
++ .context = (void *)NULL,
++};
++
++static struct i2c_board_info __initdata com6l_adpt_eeprom[] = {
++ {
++ I2C_BOARD_INFO("24c256", 0x50),
++ .platform_data = &beagle_at24_eeprom_info,
++ },
++};
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+ omap3_pmic_get_config(&beagle_twldata,
+@@ -875,6 +891,9 @@ static int __init omap3_beagle_i2c_init(void)
+ case EXPANSION_I2C_ZIPPY:
+ omap_register_i2c_bus(2, 400, zippy_i2c2_rtc, ARRAY_SIZE(zippy_i2c2_rtc));
+ break;
++ case EXPANSION_I2C_COM6L:
++ omap_register_i2c_bus(2, 400, com6l_adpt_eeprom, ARRAY_SIZE(com6l_adpt_eeprom));
++ break;
+ default:
+ omap_register_i2c_bus(2, 400, NULL, 0);
+ }
+@@ -1155,6 +1174,7 @@ static void __init omap3_beagle_init(void)
+ omap_mux_init_signal("sdmmc2_dat3.sdmmc2_dat3", OMAP_PIN_INPUT_PULLUP);
+
+ expansion_config.mmc_settings = EXPANSION_MMC_WIFI;
++ expansion_config.i2c_settings = EXPANSION_I2C_COM6L;
+ #endif
+ }
+
+--
+1.7.10.4
+
--- /dev/null
+From d78f1a01cc52ebad5d59edad772f2b403bfe67bd Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Wed, 12 Dec 2012 11:34:29 -0600
+Subject: [PATCH 11/11] WIP: Beagle: expansion: extend spidev to uart2
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 4fa880a..e4cfd5f 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -1162,6 +1162,16 @@ static void __init omap3_beagle_init(void)
+ if (gpio_is_valid(beagle_config.dvi_pd_gpio))
+ omap_mux_init_gpio(beagle_config.dvi_pd_gpio, OMAP_PIN_OUTPUT);
+ omap_display_init(&beagle_dss_data);
++
++ if (!strcmp(expansionboard_name, "spidev"))
++ {
++ pr_info("Beagle expansion: spidev: enable uart2/ttyO1\n");
++ omap_mux_init_signal("uart2_tx.uart2_tx", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("uart2_rts.uart2_rts", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("uart2_cts.uart2_cts", OMAP_PIN_INPUT);
++ omap_mux_init_signal("mcbsp3_fsx.uart2_rx", OMAP_PIN_INPUT);
++ }
++
+ omap_serial_init();
+ omap_sdrc_init(mt46h32m32lf6_sdrc_params,
+ mt46h32m32lf6_sdrc_params);
+@@ -1248,7 +1258,7 @@ static void __init omap3_beagle_init(void)
+
+ if (!strcmp(expansionboard_name, "spidev"))
+ {
+- pr_info("Beagle expansionboard: registering spidev\n");
++ pr_info("Beagle expansionboard: spidev: enabling spi3/spi4\n");
+ omap3_beagle_config_mcspi3_mux();
+ omap3_beagle_config_mcspi4_mux();
+ spi_register_board_info(beagle_mcspi_board_info, ARRAY_SIZE(beagle_mcspi_board_info));
+--
+1.7.10.4
+
--- /dev/null
+From a3abd1593e381deb4b1f358a55069988996eeae4 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 2 Aug 2011 21:55:34 -0500
+Subject: [PATCH 1/2] panda: fix wl12xx regulator
+
+pulled from: http://elinux.org/Panda_How_to_kernel_3_0_rel
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/twl-common.c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c
+index e49b40b..0fd1a70 100644
+--- a/arch/arm/mach-omap2/twl-common.c
++++ b/arch/arm/mach-omap2/twl-common.c
+@@ -360,6 +360,7 @@ static struct regulator_init_data omap4_vusb_idata = {
+ static struct regulator_init_data omap4_clk32kg_idata = {
+ .constraints = {
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
++ .always_on = true,
+ },
+ };
+
+--
+1.7.7.6
+
--- /dev/null
+From 8de5d11f076ee25182df805ab78e0823ce4dd2be Mon Sep 17 00:00:00 2001
+From: Ricardo Salveti de Araujo <ricardo.salveti@linaro.org>
+Date: Tue, 25 Oct 2011 10:06:39 +0200
+Subject: [PATCH 2/2] ti-st/st-kim: fixing firmware path
+
+Signed-off-by: Ricardo Salveti de Araujo <ricardo.salveti@linaro.org>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/misc/ti-st/st_kim.c | 4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c
+index 9ff942a..f673464 100644
+--- a/drivers/misc/ti-st/st_kim.c
++++ b/drivers/misc/ti-st/st_kim.c
+@@ -244,7 +244,7 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
+ if (version & 0x8000)
+ maj_ver |= 0x0008;
+
+- sprintf(bts_scr_name, "TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);
++ sprintf(bts_scr_name, "ti-connectivity/TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);
+
+ /* to be accessed later via sysfs entry */
+ kim_gdata->version.full = version;
+@@ -287,7 +287,7 @@ static long download_firmware(struct kim_data_s *kim_gdata)
+ long len = 0;
+ unsigned char *ptr = NULL;
+ unsigned char *action_ptr = NULL;
+- unsigned char bts_scr_name[30] = { 0 }; /* 30 char long bts scr name? */
++ unsigned char bts_scr_name[50] = { 0 }; /* 50 char long bts scr name? */
+ int wr_room_space;
+ int cmd_size;
+ unsigned long timeout;
+--
+1.7.7.6
+
--- /dev/null
+From 3304f2feba4999fc1013911f0cf0d9acc33a0117 Mon Sep 17 00:00:00 2001
+From: Adrien Ferre <ferre.adrien@gmail.com>
+Date: Mon, 25 Mar 2013 12:00:38 -0500
+Subject: [PATCH 3/3] Panda: expansion: add spidev
+
+I've made a patch to enable spidev on pandaboards using buddy=spidev just like for beagle.
+
+https://github.com/RobertCNelson/stable-kernel/issues/22
+
+Signed-off-by: Adrien Ferre <ferre.adrien@gmail.com>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap4panda.c | 43 ++++++++++++++++++++++++++++++++
+ 1 file changed, 43 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
+index 1e2c75e..3563f86 100644
+--- a/arch/arm/mach-omap2/board-omap4panda.c
++++ b/arch/arm/mach-omap2/board-omap4panda.c
+@@ -22,6 +22,7 @@
+ #include <linux/clk.h>
+ #include <linux/io.h>
+ #include <linux/leds.h>
++#include <linux/irq.h>
+ #include <linux/gpio.h>
+ #include <linux/usb/otg.h>
+ #include <linux/i2c/twl.h>
+@@ -35,6 +36,7 @@
+ #include <linux/wl12xx.h>
+ #include <linux/irqchip/arm-gic.h>
+ #include <linux/platform_data/omap-abe-twl6040.h>
++#include <linux/spi/spi.h>
+
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+@@ -54,6 +56,8 @@
+ #define GPIO_WIFI_PMENA 43
+ #define GPIO_WIFI_IRQ 53
+
++char expboard_name[16];
++
+ /* wl127x BT, FM, GPS connectivity chip */
+ static struct ti_st_plat_data wilink_platform_data = {
+ .nshutdown_gpio = 46,
+@@ -99,6 +103,25 @@ static struct platform_device leds_gpio = {
+ },
+ };
+
++static struct spi_board_info panda_mcspi_board_info[] = {
++ /* spi 1.0 */
++ {
++ .modalias = "spidev",
++ .max_speed_hz = 48000000, //48 Mbps
++ .bus_num = 1,
++ .chip_select = 0,
++ .mode = SPI_MODE_1,
++ },
++ /* spi 1.1 */
++ {
++ .modalias = "spidev",
++ .max_speed_hz = 48000000, //48 Mbps
++ .bus_num = 1,
++ .chip_select = 1,
++ .mode = SPI_MODE_1,
++ },
++};
++
+ static struct omap_abe_twl6040_data panda_abe_audio_data = {
+ /* Audio out */
+ .has_hs = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,
+@@ -161,6 +184,18 @@ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
+ .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
+ };
+
++static int __init expansionboard_setup(char *str)
++{
++ if (!machine_is_omap4_panda())
++ return 0;
++
++ if (!str)
++ return -EINVAL;
++ strncpy(expboard_name, str, 16);
++ pr_info("Panda expansionboard: %s\n", expboard_name);
++ return 0;
++}
++
+ static void __init omap4_ehci_init(void)
+ {
+ int ret;
+@@ -435,11 +470,19 @@ static void __init omap4_panda_init(void)
+ omap_sdrc_init(NULL, NULL);
+ omap4_twl6030_hsmmc_init(mmc);
+ omap4_ehci_init();
++ if (!strcmp(expboard_name, "spidev")) {
++ #if IS_ENABLED(CONFIG_SPI_SPIDEV)
++ pr_info("Panda expansionboard: spidev: enabling spi3/spi4\n");
++ spi_register_board_info(panda_mcspi_board_info, ARRAY_SIZE(panda_mcspi_board_info));
++ #endif
++ }
+ usb_bind_phy("musb-hdrc.2.auto", 0, "omap-usb2.3.auto");
+ usb_musb_init(&musb_board_data);
+ omap4_panda_display_init();
+ }
+
++early_param("buddy", expansionboard_setup);
++
+ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
+ /* Maintainer: David Anders - Texas Instruments Inc */
+ .atag_offset = 0x100,
+--
+1.7.10.4
+
--- /dev/null
+From 359104632fa556e3c5c78e4016c2585896225716 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Mon, 1 Apr 2013 12:17:50 -0500
+Subject: [PATCH 4/4] HACK: PandaES: disable cpufreq so board will boot
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/cpufreq/omap-cpufreq.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c
+index 0279d18..0a8ac09 100644
+--- a/drivers/cpufreq/omap-cpufreq.c
++++ b/drivers/cpufreq/omap-cpufreq.c
+@@ -31,6 +31,8 @@
+ #include <asm/smp_plat.h>
+ #include <asm/cpu.h>
+
++#include "../../arch/arm/mach-omap2/soc.h"
++
+ /* OPP tolerance in percentage */
+ #define OPP_TOLERANCE 4
+
+@@ -246,6 +248,11 @@ static struct cpufreq_driver omap_driver = {
+
+ static int omap_cpufreq_probe(struct platform_device *pdev)
+ {
++ if (cpu_is_omap446x()) {
++ pr_err("%s: unsupported Silicon?\n", __func__);
++ return -EINVAL;
++ }
++
+ mpu_dev = get_cpu_device(0);
+ if (!mpu_dev) {
+ pr_warning("%s: unable to get the mpu device\n", __func__);
+--
+1.7.10.4
+
--- /dev/null
+From 76c1d8cdfa0967b04ca8168a77bb101d4ea71150 Mon Sep 17 00:00:00 2001
+From: Santosh Shilimkar <santosh.shilimkar@ti.com>
+Date: Mon, 18 Mar 2013 06:51:30 +0000
+Subject: [PATCH 6/6] ARM: hw_breakpoint: Enable debug powerdown only if
+ system supports 'has_ossr'
+
+On Friday 15 March 2013 10:30 AM, Will Deacon wrote:
+> On Thu, Mar 14, 2013 at 01:08:00PM +0530, Santosh Shilimkar wrote:
+>> Will,
+>
+> Hi guys,
+>
+> I'm out of the office at the moment and have really terrible connectivity,
+> so I can't do too much until next week. However, I don't think adding the
+> has_ossr check is the right fix for this problem.
+>
+>> On Wednesday 13 March 2013 05:59 PM, Lokesh Vutla wrote:
+>>> Hi Dietmar,
+>>> On Wednesday 13 March 2013 05:35 PM, Dietmar Eggemann wrote:
+>>>> On 13/03/13 06:52, Lokesh Vutla wrote:
+>>>>> Commit {9a6eb31 ARM: hw_breakpoint: Debug powerdown support for
+>>>>> self-hosted
+>>>>> debug} introduces debug powerdown support for self-hosted debug.
+>>>>> While merging the patch 'has_ossr' check was removed which
+>>>>> was needed for hardwares which doesn't support self-hosted debug.
+>>>>> Pandaboard (A9) is one such hardware and Dietmar's orginial
+>>>>> patch did mention this issue.
+>>>>> Without that check on Panda with CPUIDLE enabled, a flood of
+>>>>> below messages thrown.
+>>>>>
+>>>>> [ 3.597930] hw-breakpoint: CPU 0 failed to disable vector catch
+>>>>> [ 3.597991] hw-breakpoint: CPU 1 failed to disable vector catch
+>
+> Ok, so this means that we've taken an undefined instruction exception while
+> trying to reset the debug registers on the PM_EXIT path. Now, the code there
+> deals with CPUs that don't have the save/restore registers just fine, so
+> that shouldn't have anything to do with this problem, particularly if the
+> bit that is tripping us up is related to clearing vector catch.
+>
+Agree.
+
+> Furthermore, I was under the impression that hw_breakpoint did actually
+> work on panda, which implies that a cold boot *does* manage to reset the
+> registers (can you please confirm this by looking in your dmesg during
+> boot?). In that case, it seems as though a PM cycle is powering down a
+> bunch of debug logic that was powered up during boot, and then we trip over
+> because we can't access the register bank.
+>
+Actually it seems to be without PM. Thanks to analysis from Lokesh, the issue
+can be seen even with just suspend or cpu hotplug. So cold boot as such is
+fine.
+
+> The proper solution to this problem requires us to establish exactly what is
+> turning off the debug registers, and then having an OMAP PM notifier to
+> enable it again. Assuming this has always been the case, I expect hardware
+> debug across PM fails silently with older kernels.
+>
+This has been always the case it seems with CPU power cycle.
+After the CPU is power cycled, 'DBGAUTHSTATUS' reads '0xaa' rather
+than '0xaf' which means 'DBGEN = 0' and hence code fails to enable
+monitor mode. This happens on both secure and GP devices and it can not
+be patched since the secure code is ROM'ed. We didn't notice so far
+because hw_breakpoint support was not default enabled on OMAP till the
+multi-platform build.
+
+>> I was also wondering whether we should just warn once rather
+>> than continuous warnings in the notifier. Patch is end of the
+>> email.
+>
+> Could do, but I'd like to see a fix for the real issue before we simply hide
+> the warnings :)
+>
+Agree here too. As evident above, the feature won't work on OMAP4
+devices with PM and hence some solution is needed.
+
+What you think of below ?
+
+>From d74b4264f6a5967b0f7ada96aad77ab0ac30dbed Mon Sep 17 00:00:00 2001
+From: Santosh Shilimkar <santosh.shilimkar@ti.com>
+Date: Mon, 18 Mar 2013 11:59:04 +0530
+Subject: [PATCH] ARM: hw_breakpoints: Check for CPU debug availability before
+ enabling it
+
+CPU debug features like hardware break, watchpoints can be used only when
+the debug mode is enabled and available for non-secure mode.
+
+Hence check 'DBGAUTHSTATUS.DBGEN' before proceeding to enable the
+features.
+
+Thanks to Will for pointers and Lokesh for the analysis of the issue on
+OMAP4 where after a CPU power cycle, debug mode gets disabled.
+
+Cc: Will Deacon <Will.Deacon@arm.com>
+
+Tested-by: Lokesh Vutla <lokeshvutla@ti.com>
+Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
+---
+ arch/arm/kernel/hw_breakpoint.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c
+index 96093b7..683a7cf 100644
+--- a/arch/arm/kernel/hw_breakpoint.c
++++ b/arch/arm/kernel/hw_breakpoint.c
+@@ -930,6 +930,14 @@ static void reset_ctrl_regs(void *unused)
+ int i, raw_num_brps, err = 0, cpu = smp_processor_id();
+ u32 val;
+
++ /* Check if we have access to CPU debug features */
++ ARM_DBG_READ(c7, c14, 6, val);
++ if ((val & 0x1) == 0) {
++ pr_warn_once("CPU %d debug is unavailable\n", cpu);
++ cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
++ return;
++ }
++
+ /*
+ * v7 debug contains save and restore registers so that debug state
+ * can be maintained across low-power modes without leaving the debug
+--
+1.7.10.4
+
--- /dev/null
+From 42d8b74383b670412107c943efd2fec46aa04158 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:46 -0500
+Subject: [PATCH 07/10] Revert "regulator: twl: Remove TWL6030_FIXED_RESOURCE"
+
+This reverts commit d1924519fe1dada0cfd9a228bf2ff1ea15840c84.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/regulator/twl-regulator.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index fb6e67d..7ce7edf 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -933,6 +933,19 @@ static const struct twlreg_info TWLFIXED_INFO_##label = { \
+ }, \
+ }
+
++#define TWL6030_FIXED_RESOURCE(label, offset, turnon_delay) \
++static struct twlreg_info TWLRES_INFO_##label = { \
++ .base = offset, \
++ .desc = { \
++ .name = #label, \
++ .id = TWL6030_REG_##label, \
++ .ops = &twl6030_fixed_resource, \
++ .type = REGULATOR_VOLTAGE, \
++ .owner = THIS_MODULE, \
++ .enable_time = turnon_delay, \
++ }, \
++ }
++
+ #define TWL6025_ADJUSTABLE_SMPS(label, offset) \
+ static const struct twlreg_info TWLSMPS_INFO_##label = { \
+ .base = offset, \
+--
+1.7.10.4
+
--- /dev/null
+From 48e4598f1b8e9dd486d551b76c5f5021d0dc946d Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:48 -0500
+Subject: [PATCH 08/10] Revert "regulator: twl: Remove another unused variable
+ warning"
+
+This reverts commit 029dd3cefa46ecdd879f9b4e2df3bdf4371cc22c.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/regulator/twl-regulator.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index 7ce7edf..124a2f2 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -633,6 +633,13 @@ static struct regulator_ops twl6030fixed_ops = {
+ .get_status = twl6030reg_get_status,
+ };
+
++static struct regulator_ops twl6030_fixed_resource = {
++ .enable = twl6030reg_enable,
++ .disable = twl6030reg_disable,
++ .is_enabled = twl6030reg_is_enabled,
++ .get_status = twl6030reg_get_status,
++};
++
+ /*
+ * SMPS status and control
+ */
+--
+1.7.10.4
+
--- /dev/null
+From 76cc643690032d9789bbd17c9a3542cae4b0603e Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:51 -0500
+Subject: [PATCH 09/10] Revert "regulator: twl: Remove references to the
+ twl4030 regulator"
+
+This reverts commit e76ab829cc2d8b6350a3f01fffb208df4d7d8c1b.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/regulator/twl-regulator.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index 124a2f2..5a18317 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -1021,6 +1021,7 @@ TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 0);
+ TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 0);
+ TWL6030_FIXED_LDO(V1V8, 0x16, 1800, 0);
+ TWL6030_FIXED_LDO(V2V1, 0x1c, 2100, 0);
++TWL6030_FIXED_RESOURCE(CLK32KG, 0x8C, 0);
+ TWL6025_ADJUSTABLE_SMPS(SMPS3, 0x34);
+ TWL6025_ADJUSTABLE_SMPS(SMPS4, 0x10);
+ TWL6025_ADJUSTABLE_SMPS(VIO, 0x16);
+--
+1.7.10.4
+
--- /dev/null
+From ffdb3fad79cf70dcc943764f075215d6525435be Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:54 -0500
+Subject: [PATCH 10/10] Revert "regulator: twl: Remove references to 32kHz
+ clock from DT bindings"
+
+This reverts commit 0e8e5c34cf1a8beaaf0a6a05c053592693bf8cb4.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ Documentation/devicetree/bindings/regulator/twl-regulator.txt | 1 +
+ drivers/regulator/twl-regulator.c | 2 ++
+ 2 files changed, 3 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/regulator/twl-regulator.txt b/Documentation/devicetree/bindings/regulator/twl-regulator.txt
+index 658749b..0c3395d 100644
+--- a/Documentation/devicetree/bindings/regulator/twl-regulator.txt
++++ b/Documentation/devicetree/bindings/regulator/twl-regulator.txt
+@@ -15,6 +15,7 @@ For twl6030 regulators/LDOs
+ - "ti,twl6030-vusb" for VUSB LDO
+ - "ti,twl6030-v1v8" for V1V8 LDO
+ - "ti,twl6030-v2v1" for V2V1 LDO
++ - "ti,twl6030-clk32kg" for CLK32KG RESOURCE
+ - "ti,twl6030-vdd1" for VDD1 SMPS
+ - "ti,twl6030-vdd2" for VDD2 SMPS
+ - "ti,twl6030-vdd3" for VDD3 SMPS
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index 5a18317..40f27bb 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -1054,6 +1054,7 @@ static u8 twl_get_smps_mult(void)
+ #define TWL6030_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6030, label)
+ #define TWL6025_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6025, label)
+ #define TWLFIXED_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLFIXED, label)
++#define TWLRES_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLRES, label)
+ #define TWLSMPS_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLSMPS, label)
+
+ static const struct of_device_id twl_of_match[] = {
+@@ -1101,6 +1102,7 @@ static const struct of_device_id twl_of_match[] = {
+ TWLFIXED_OF_MATCH("ti,twl6030-vusb", VUSB),
+ TWLFIXED_OF_MATCH("ti,twl6030-v1v8", V1V8),
+ TWLFIXED_OF_MATCH("ti,twl6030-v2v1", V2V1),
++ TWLRES_OF_MATCH("ti,twl6030-clk32kg", CLK32KG),
+ TWLSMPS_OF_MATCH("ti,twl6025-smps3", SMPS3),
+ TWLSMPS_OF_MATCH("ti,twl6025-smps4", SMPS4),
+ TWLSMPS_OF_MATCH("ti,twl6025-vio", VIO),
+--
+1.7.10.4
+
--- /dev/null
+From 9f5066a898b77f2fe2b1f0946bb6afebe3d08f6d Mon Sep 17 00:00:00 2001
+From: Yann <yann.wanwanscappel@free.fr>
+Date: Sat, 8 Jun 2013 13:06:37 -0500
+Subject: [PATCH 7/7] panda: spidev: setup pinmux
+
+It works fine on my board, I've been able to perform data transfers using the spidev_test program provided in kernel documentation
+(shortcut between SIMO and SOMI to perform an hardware loopback). I also checked that CS0 and CS1 and CLK are properly driven using my scope.
+
+The clock is strangely configured as input, but it is also the case for omap3 beagle board, so I guess this is fine.
+
+Signed-off-by: Yann <yann.wanwanscappel@free.fr>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap4panda.c | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
+index 3563f86..10bb576 100644
+--- a/arch/arm/mach-omap2/board-omap4panda.c
++++ b/arch/arm/mach-omap2/board-omap4panda.c
+@@ -103,6 +103,16 @@ static struct platform_device leds_gpio = {
+ },
+ };
+
++static void __init omap4_panda_config_mcspi1_mux(void)
++{
++ /* NOTE: Clock pins need to be in input mode */
++ omap_mux_init_signal("mcspi1_clk", OMAP_PIN_INPUT);
++ omap_mux_init_signal("mcspi1_simo", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("mcspi1_somi", OMAP_PIN_INPUT_PULLUP);
++ omap_mux_init_signal("mcspi1_cs0", OMAP_PIN_OUTPUT);
++ omap_mux_init_signal("mcspi1_cs1", OMAP_PIN_OUTPUT);
++}
++
+ static struct spi_board_info panda_mcspi_board_info[] = {
+ /* spi 1.0 */
+ {
+@@ -472,7 +482,8 @@ static void __init omap4_panda_init(void)
+ omap4_ehci_init();
+ if (!strcmp(expboard_name, "spidev")) {
+ #if IS_ENABLED(CONFIG_SPI_SPIDEV)
+- pr_info("Panda expansionboard: spidev: enabling spi3/spi4\n");
++ pr_info("Panda expansionboard: spidev: enabling spi1.0 and spi1.1\n");
++ omap4_panda_config_mcspi1_mux();
+ spi_register_board_info(panda_mcspi_board_info, ARRAY_SIZE(panda_mcspi_board_info));
+ #endif
+ }
+--
+1.7.10.4
+
--- /dev/null
+From 6bce72b21600d9f52ae60d5bf80d00152eb75b50 Mon Sep 17 00:00:00 2001
+From: Steve Sakoman <steve@sakoman.com>
+Date: Tue, 19 Jan 2010 21:19:15 -0800
+Subject: [PATCH 1/2] OMAP: DSS2: add bootarg for selecting svideo
+
+ OMAP: DSS2: add bootarg for selecting svideo or composite for tv output
+ also add pal-16 and ntsc-16 omapfb.mode settings for 16bpp
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/omap2/dss/venc.c | 22 ++++++++++++++++++++++
+ drivers/video/omap2/omapfb/omapfb-main.c | 10 +++++++++-
+ 2 files changed, 31 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index 56efa3b..d46f7f8 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -86,6 +86,11 @@
+ #define VENC_OUTPUT_TEST 0xC8
+ #define VENC_DAC_B__DAC_C 0xC8
+
++static char *tv_connection;
++
++module_param_named(tvcable, tv_connection, charp, 0);
++MODULE_PARM_DESC(tvcable, "TV connection type (svideo, composite)");
++
+ struct venc_config {
+ u32 f_control;
+ u32 vidout_ctrl;
+@@ -465,6 +470,23 @@ static int venc_power_on(struct omap_dss_device *dssdev)
+ if (r)
+ goto err2;
+
++ /* Allow the TV output to be overriden */
++ if (tv_connection) {
++ if (strcmp(tv_connection, "svideo") == 0) {
++ printk(KERN_INFO
++ "omapdss: tv output is svideo.\n");
++ dssdev->phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO;
++ } else if (strcmp(tv_connection, "composite") == 0) {
++ printk(KERN_INFO
++ "omapdss: tv output is composite.\n");
++ dssdev->phy.venc.type = OMAP_DSS_VENC_TYPE_COMPOSITE;
++ } else {
++ printk(KERN_INFO
++ "omapdss: unsupported output type'%s'.\n",
++ tv_connection);
++ }
++ }
++
+ return 0;
+
+ err2:
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index bc225e4..34d6679 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -2032,7 +2032,15 @@ static int omapfb_mode_to_timings(const char *mode_str,
+ int r;
+
+ #ifdef CONFIG_OMAP2_DSS_VENC
+- if (strcmp(mode_str, "pal") == 0) {
++ if (strcmp(mode_str, "pal-16") == 0) {
++ *timings = omap_dss_pal_timings;
++ *bpp = 16;
++ return 0;
++ } else if (strcmp(mode_str, "ntsc-16") == 0) {
++ *timings = omap_dss_ntsc_timings;
++ *bpp = 16;
++ return 0;
++ } else if (strcmp(mode_str, "pal") == 0) {
+ *timings = omap_dss_pal_timings;
+ *bpp = 24;
+ return 0;
+--
+1.7.7.6
+
--- /dev/null
+From 747de06d5cc69b2407684ba0455fff5c1d6af797 Mon Sep 17 00:00:00 2001
+From: Steve Sakoman <steve@sakoman.com>
+Date: Sat, 19 Dec 2009 06:52:43 -0800
+Subject: [PATCH 2/2] video: add timings for hd720
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/modedb.c | 4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
+index a9a907c..5b686de 100644
+--- a/drivers/video/modedb.c
++++ b/drivers/video/modedb.c
+@@ -103,6 +103,10 @@ static const struct fb_videomode modedb[] = {
+ { NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 0,
+ FB_VMODE_NONINTERLACED },
+
++ /* 1280x720 @ 60 Hz, 45 kHz hsync, CEA 681-E Format 4 */
++ { "hd720", 60, 1280, 720, 13468, 220, 110, 20, 5, 40, 5, 0,
++ FB_VMODE_NONINTERLACED },
++
+ /* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */
+ { NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12, 0,
+ FB_VMODE_INTERLACED },
+--
+1.7.7.6
+
--- /dev/null
+From 29885f2f3d700341d322274db6ad085e601c0994 Mon Sep 17 00:00:00 2001
+From: Pantelis Antoniou <panto@antoniou-consulting.com>
+Date: Fri, 4 Jan 2013 00:32:33 +0200
+Subject: [PATCH 3/3] arm: Export cache flush management symbols when
+ !MULTI_CACHE
+
+When compiling a kernel without CONFIG_MULTI_CACHE enabled the
+dma access functions end up not being exported. Fix it.
+
+Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
+---
+ arch/arm/kernel/setup.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
+index da1d1aa..dcb678c 100644
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -923,3 +923,12 @@ const struct seq_operations cpuinfo_op = {
+ .stop = c_stop,
+ .show = c_show
+ };
++
++/* export the cache management functions */
++#ifndef MULTI_CACHE
++
++EXPORT_SYMBOL(__glue(_CACHE,_dma_map_area));
++EXPORT_SYMBOL(__glue(_CACHE,_dma_unmap_area));
++EXPORT_SYMBOL(__glue(_CACHE,_dma_flush_range));
++
++#endif
+--
+1.7.10.4
+
--- /dev/null
+diff -Naur linux-3.10.30.org/sound/pci/cs5535audio/cs5535audio.c linux-3.10.30/sound/pci/cs5535audio/cs5535audio.c
+--- linux-3.10.30.org/sound/pci/cs5535audio/cs5535audio.c 2014-02-13 22:48:15.000000000 +0100
++++ linux-3.10.30/sound/pci/cs5535audio/cs5535audio.c 2014-02-15 12:45:49.545688703 +0100
+@@ -83,8 +83,8 @@
+ break;
+ udelay(1);
+ } while (--timeout);
+- if (!timeout)
+- snd_printk(KERN_ERR "Failure writing to cs5535 codec\n");
++// if (!timeout)
++// snd_printk(KERN_ERR "Failure writing to cs5535 codec\n");
+ }
+
+ static unsigned short snd_cs5535audio_codec_read(struct cs5535audio *cs5535au,
+@@ -108,9 +108,9 @@
+ break;
+ udelay(1);
+ } while (--timeout);
+- if (!timeout)
+- snd_printk(KERN_ERR "Failure reading codec reg 0x%x,"
+- "Last value=0x%x\n", reg, val);
++// if (!timeout)
++// snd_printk(KERN_ERR "Failure reading codec reg 0x%x,"
++// "Last value=0x%x\n", reg, val);
+
+ return (unsigned short) val;
+ }