From 6b07bf28cdf71ef59fe01181734519857a093cab Mon Sep 17 00:00:00 2001 From: Robert Jarzmik Date: Sat, 18 Jan 2014 12:48:04 +0100 Subject: [PATCH 1/8] ARM: mioa701: fix frequence speedup code As barebox has become the true SPL of mioa701 board (no intermediate SPL), a bug was uncovered in the init procedure, where the CPU voltage was to be increased by commanding the I2C voltage regulator, while the I2C was shut down. Fix it by unclock-gating the power I2C bus before using it. Signed-off-by: Robert Jarzmik Signed-off-by: Sascha Hauer --- arch/arm/boards/mioa701/board.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boards/mioa701/board.c b/arch/arm/boards/mioa701/board.c index 6c877bc00..6f93900fd 100644 --- a/arch/arm/boards/mioa701/board.c +++ b/arch/arm/boards/mioa701/board.c @@ -265,6 +265,7 @@ static int mioa701_coredevice_init(void) * This requires to command the Maxim 1586 to upgrade core voltage to * 1.475 V, on the power I2C bus (device 0x14). */ + CKEN |= CKEN_PWRI2C; CCCR = CCCR_A | 0x20290; PCFR = PCFR_GPR_EN | PCFR_FVC | PCFR_DC_EN | PCFR_PI2C_EN | PCFR_OPDE; PCMD(0) = PCMD_LC | 0x1f; From 1d2c68babbc13d92589f734095ca0051cdd00ff6 Mon Sep 17 00:00:00 2001 From: Robert Jarzmik Date: Sat, 18 Jan 2014 12:48:05 +0100 Subject: [PATCH 2/8] ARM: pxa: add reset source detection Use PXA register RCSR to detect which is the reset cause. When triggering a reset, clear the former reset source first. Signed-off-by: Robert Jarzmik Signed-off-by: Sascha Hauer --- arch/arm/mach-pxa/Makefile | 1 + arch/arm/mach-pxa/common.c | 4 ++++ arch/arm/mach-pxa/reset_source.c | 41 ++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 arch/arm/mach-pxa/reset_source.c diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index 6a02a5459..ddc042ee5 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile @@ -5,3 +5,4 @@ obj-y += devices.o obj-$(CONFIG_ARCH_PXA2XX) += mfp-pxa2xx.o obj-$(CONFIG_ARCH_PXA27X) += speed-pxa27x.o +obj-$(CONFIG_RESET_SOURCE) += reset_source.o diff --git a/arch/arm/mach-pxa/common.c b/arch/arm/mach-pxa/common.c index 82e81b75d..69ec0a7c8 100644 --- a/arch/arm/mach-pxa/common.c +++ b/arch/arm/mach-pxa/common.c @@ -16,6 +16,7 @@ */ #include +#include #include #define OSMR3 0x40A0000C @@ -28,6 +29,9 @@ void reset_cpu(ulong addr) { + /* Clear last reset source */ + RCSR = RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR; + /* Initialize the watchdog and let it fire */ writel(OWER_WME, OWER); writel(OSSR_M3, OSSR); diff --git a/arch/arm/mach-pxa/reset_source.c b/arch/arm/mach-pxa/reset_source.c new file mode 100644 index 000000000..2b650c644 --- /dev/null +++ b/arch/arm/mach-pxa/reset_source.c @@ -0,0 +1,41 @@ +/* + * (C) Copyright 2014 Robert Jarzmik + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include + +static int pxa_detect_reset_source(void) +{ + u32 reg = RCSR; + + /* + * Order is important, as many bits can be set together + */ + if (reg & RCSR_GPR) + set_reset_source(RESET_RST); + else if (reg & RCSR_WDR) + set_reset_source(RESET_WDG); + else if (reg & RCSR_HWR) + set_reset_source(RESET_POR); + else if (reg & RCSR_SMR) + set_reset_source(RESET_WKE); + else + set_reset_source(RESET_UKWN); + + return 0; +} + +device_initcall(pxa_detect_reset_source); From 1f1396804f885ff932727d2c8533a966e599624a Mon Sep 17 00:00:00 2001 From: Robert Jarzmik Date: Sat, 18 Jan 2014 12:48:06 +0100 Subject: [PATCH 3/8] ARM: pxa: add poweroff capability Add the capability for the PXA architecture to poweroff. As there is no true poweroff, ie. the power regulator is not available for shut off from the core, the poweroff puts the SoC into a deep sleep mode (mode 7), where almost no current is sunk. Signed-off-by: Robert Jarzmik Signed-off-by: Sascha Hauer --- arch/arm/Kconfig | 1 + arch/arm/mach-pxa/Makefile | 1 + arch/arm/mach-pxa/common.c | 13 ++++ arch/arm/mach-pxa/include/mach/hardware.h | 4 ++ arch/arm/mach-pxa/sleep.S | 81 +++++++++++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 arch/arm/mach-pxa/sleep.S diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 93619d5c0..243cfc899 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -116,6 +116,7 @@ config ARCH_OMAP config ARCH_PXA bool "Intel/Marvell PXA based" select GENERIC_GPIO + select HAS_POWEROFF config ARCH_SOCFPGA bool "Altera SOCFPGA cyclone5" diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index ddc042ee5..6ddb6e58e 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile @@ -2,6 +2,7 @@ obj-y += clocksource.o obj-y += common.o obj-y += gpio.o obj-y += devices.o +obj-y += sleep.o obj-$(CONFIG_ARCH_PXA2XX) += mfp-pxa2xx.o obj-$(CONFIG_ARCH_PXA27X) += speed-pxa27x.o diff --git a/arch/arm/mach-pxa/common.c b/arch/arm/mach-pxa/common.c index 69ec0a7c8..0c114ed58 100644 --- a/arch/arm/mach-pxa/common.c +++ b/arch/arm/mach-pxa/common.c @@ -27,6 +27,8 @@ #define OWER_WME (1 << 0) /* Watch-dog Match Enable */ #define OSSR_M3 (1 << 3) /* Match status channel 3 */ +extern void pxa_suspend(int mode); + void reset_cpu(ulong addr) { /* Clear last reset source */ @@ -39,3 +41,14 @@ void reset_cpu(ulong addr) while (1); } + +void __noreturn poweroff() +{ + shutdown_barebox(); + + /* Clear last reset source */ + RCSR = RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR; + + pxa_suspend(PWRMODE_DEEPSLEEP); + unreachable(); +} diff --git a/arch/arm/mach-pxa/include/mach/hardware.h b/arch/arm/mach-pxa/include/mach/hardware.h index e53085cdd..c5f40d7c0 100644 --- a/arch/arm/mach-pxa/include/mach/hardware.h +++ b/arch/arm/mach-pxa/include/mach/hardware.h @@ -28,4 +28,8 @@ #define cpu_is_pxa27x() (0) #endif +#ifdef __ASSEMBLY__ +#define __REG(x) (x) +#endif + #endif /* !__MACH_HARDWARE_H */ diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S new file mode 100644 index 000000000..881033da2 --- /dev/null +++ b/arch/arm/mach-pxa/sleep.S @@ -0,0 +1,81 @@ +/* + * Low-level PXA250/210 sleep/wakeUp support + * + * Initial SA1110 code: + * Copyright (c) 2001 Cliff Brake + * + * Adapted for PXA by Nicolas Pitre: + * Copyright (c) 2002 Monta Vista Software, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License. + */ + +#include +#include +#include +#include + +#define MDREFR_KDIV 0x200a4000 // all banks +#define CCCR_SLEEP 0x00000107 // L=7 2N=2 A=0 PPDIS=0 CPDIS=0 +#define UNCACHED_PHYS_0 0 + .text + +#ifdef CONFIG_ARCH_PXA27X +/* + * pxa27x_finish_suspend() + * + * Forces CPU into sleep state. + * + * r0 = value for PWRMODE M field for desired sleep state + */ +ENTRY(pxa_suspend) + @ Put the processor to sleep + @ (also workaround for sighting 28071) + + @ prepare value for sleep mode + mov r1, r0 @ sleep mode + + @ Intel PXA270 Specification Update notes problems sleeping + @ with core operating above 91 MHz + @ (see Errata 50, ...processor does not exit from sleep...) + ldr r6, =CCCR + ldr r8, [r6] @ keep original value for resume + + ldr r7, =CCCR_SLEEP @ prepare CCCR sleep value + mov r0, #0x2 @ prepare value for CLKCFG + + @ align execution to a cache line + b pxa_cpu_do_suspend +#endif + + + .ltorg + .align 5 +pxa_cpu_do_suspend: + + @ All needed values are now in registers. + @ These last instructions should be in cache + + @ initiate the frequency change... + str r7, [r6] + mcr p14, 0, r0, c6, c0, 0 + + @ restore the original cpu speed value for resume + str r8, [r6] + + @ need 6 13-MHz cycles before changing PWRMODE + @ just set frequency to 91-MHz... 6*91/13 = 42 + + mov r0, #42 +10: subs r0, r0, #1 + bne 10b + + @ Do not reorder... + @ Intel PXA270 Specification Update notes problems performing + @ external accesses after SDRAM is put in self-refresh mode + @ (see Errata 39 ...hangs when entering self-refresh mode) + + @ enter sleep mode + mcr p14, 0, r1, c7, c0, 0 @ PWRMODE +20: b 20b @ loop waiting for sleep From 924e5ba7d4c9d5d4ccc0c2f7c8cb69372f9ecf43 Mon Sep 17 00:00:00 2001 From: Robert Jarzmik Date: Sat, 18 Jan 2014 12:48:07 +0100 Subject: [PATCH 4/8] ARM: mioa701 defconfig update Update mioa701 board for new setup : - double the barebox size to 524288 bytes - add new commands - add device tree support, for future PXA port to devicetree - add reset source Signed-off-by: Robert Jarzmik Signed-off-by: Sascha Hauer --- arch/arm/configs/mioa701_defconfig | 49 ++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/arch/arm/configs/mioa701_defconfig b/arch/arm/configs/mioa701_defconfig index 5f06b3c77..841b9be54 100644 --- a/arch/arm/configs/mioa701_defconfig +++ b/arch/arm/configs/mioa701_defconfig @@ -1,27 +1,46 @@ CONFIG_ARCH_PXA=y +CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x100000 CONFIG_AEABI=y +CONFIG_ARM_BOARD_APPEND_ATAG=y CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y CONFIG_ARM_UNWIND=y # CONFIG_BANNER is not set -CONFIG_TEXT_BASE=0xa3f00000 -CONFIG_BAREBOX_MAX_BARE_INIT_SIZE=0x262144 +CONFIG_MMU=y +CONFIG_TEXT_BASE=0xa3d00000 +CONFIG_BAREBOX_MAX_BARE_INIT_SIZE=0x80000 CONFIG_MALLOC_SIZE=0x1000000 CONFIG_EXPERIMENTAL=y +CONFIG_MODULES=y +CONFIG_KALLSYMS=y CONFIG_LONGHELP=y CONFIG_GLOB=y +CONFIG_HUSH_FANCY_PROMPT=y CONFIG_HUSH_GETOPT=y CONFIG_CMDLINE_EDITING=y CONFIG_AUTO_COMPLETE=y CONFIG_MENU=y CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/mioa701/env" +CONFIG_RESET_SOURCE=y CONFIG_DEBUG_INFO=y CONFIG_CMD_EDIT=y CONFIG_CMD_SLEEP=y +CONFIG_CMD_MSLEEP=y CONFIG_CMD_SAVEENV=y CONFIG_CMD_EXPORT=y CONFIG_CMD_PRINTENV=y CONFIG_CMD_READLINE=y +CONFIG_CMD_LET=y +CONFIG_CMD_MENU=y +CONFIG_CMD_MENU_MANAGEMENT=y +CONFIG_CMD_PASSWD=y CONFIG_CMD_TIME=y +CONFIG_CMD_GLOBAL=y +CONFIG_CMD_AUTOMOUNT=y +CONFIG_CMD_BASENAME=y +CONFIG_CMD_DIRNAME=y +CONFIG_CMD_LN=y +CONFIG_CMD_READLINK=y +CONFIG_CMD_FILETYPE=y CONFIG_CMD_ECHO_E=y CONFIG_CMD_LOADB=y CONFIG_CMD_LOADY=y @@ -29,24 +48,40 @@ CONFIG_CMD_LOADS=y CONFIG_CMD_SAVES=y CONFIG_CMD_MEMINFO=y CONFIG_CMD_IOMEM=y +CONFIG_CMD_MM=y CONFIG_CMD_CRC=y CONFIG_CMD_CRC_CMP=y CONFIG_CMD_FLASH=y +CONFIG_CMD_UBIFORMAT=y CONFIG_CMD_BOOTM_SHOW_TYPE=y CONFIG_CMD_BOOTM_VERBOSE=y CONFIG_CMD_BOOTM_INITRD=y +CONFIG_CMD_BOOTM_OFTREE=y +CONFIG_FLEXIBLE_BOOTARGS=y +CONFIG_CMD_BOOT=y CONFIG_CMD_RESET=y +CONFIG_CMD_POWEROFF=y +CONFIG_CMD_GO=y +CONFIG_CMD_OFTREE=y +CONFIG_CMD_OF_PROPERTY=y +CONFIG_CMD_OF_NODE=y +CONFIG_CMD_MEMTEST=y +CONFIG_CMD_SPLASH=y CONFIG_CMD_TIMEOUT=y CONFIG_CMD_PARTITION=y -CONFIG_CMD_SPLASH=y +CONFIG_CMD_LSMOD=y CONFIG_CMD_GPIO=y CONFIG_CMD_UNCOMPRESS=y CONFIG_CMD_LED=y +CONFIG_CMD_DETECT=y +CONFIG_OFDEVICE=y +CONFIG_OF_BAREBOX_DRIVERS=y CONFIG_DRIVER_SERIAL_PXA=y # CONFIG_SPI is not set CONFIG_MTD=y CONFIG_MTD_RAW_DEVICE=y CONFIG_MTD_DOCG3=y +CONFIG_MTD_UBI=y CONFIG_USB_GADGET=y CONFIG_USB_GADGET_SERIAL=y CONFIG_VIDEO=y @@ -55,8 +90,16 @@ CONFIG_MCI=y CONFIG_MCI_PXA=y CONFIG_LED=y CONFIG_LED_GPIO=y +CONFIG_KEYBOARD_GPIO=y CONFIG_FS_CRAMFS=y +CONFIG_FS_EXT4=y CONFIG_FS_FAT=y CONFIG_FS_FAT_WRITE=y CONFIG_FS_FAT_LFN=y +CONFIG_FS_UBIFS=y +CONFIG_FS_UBIFS_COMPRESSION_LZO=y +CONFIG_FS_UBIFS_COMPRESSION_ZLIB=y CONFIG_BZLIB=y +CONFIG_BMP=y +CONFIG_PNG=y +CONFIG_SHA256=y From 24b22cf0e865860ba2423a019c071346fdbb42f2 Mon Sep 17 00:00:00 2001 From: Robert Jarzmik Date: Sat, 18 Jan 2014 12:48:08 +0100 Subject: [PATCH 5/8] ARM: mioa701 change MTD layout As barebox has grown up in size, because UBI support is now embedded in barebox, and because the IPL is at least rewritten to be fully GPL, modify mioa701 support to take into account this new layout : - IPL is version 0.5 - MTD layout is fully changed - the boot sequence is rewritten : - the volume up button triggers console mode - upon PowerOn or Sleep exit, power key is debounced and if not help board is powered off back - sdcard environment override can now stop the autoboot sequence - mtd environment override can now stop the autoboot sequence Signed-off-by: Robert Jarzmik Signed-off-by: Sascha Hauer --- .../arm/boards/mioa701/env/bin/barebox_update | 7 ++- arch/arm/boards/mioa701/env/bin/console_mode | 6 ++ arch/arm/boards/mioa701/env/bin/init | 55 +++++++++++++++--- .../boards/mioa701/env/bin/sdcard_override | 3 + arch/arm/boards/mioa701/env/config | 3 +- arch/arm/boards/mioa701/env/data/dps1.raw.gz | Bin 1239 -> 1324 bytes 6 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 arch/arm/boards/mioa701/env/bin/console_mode diff --git a/arch/arm/boards/mioa701/env/bin/barebox_update b/arch/arm/boards/mioa701/env/bin/barebox_update index 10237709c..632c20926 100644 --- a/arch/arm/boards/mioa701/env/bin/barebox_update +++ b/arch/arm/boards/mioa701/env/bin/barebox_update @@ -1,10 +1,11 @@ #!/bin/sh # Page+OOB specific partitions -addpart /dev/mtd0.raw 1081344@3649536(msipl) -addpart /dev/mtd0.raw 270336@3649536(barebox) +addpart /dev/mtd0.raw 2162688@405504(barebox) if [ -r /barebox.BIP0 ]; then + dps1_unlock erase /dev/mtd0.raw.barebox - cp -v /barebox.BIP0 /dev/mtd0.raw.barebox + cp -v /barebox.BIPO /dev/mtd0.raw.barebox + dps1_unlock fi diff --git a/arch/arm/boards/mioa701/env/bin/console_mode b/arch/arm/boards/mioa701/env/bin/console_mode new file mode 100644 index 000000000..aa06e920b --- /dev/null +++ b/arch/arm/boards/mioa701/env/bin/console_mode @@ -0,0 +1,6 @@ +#!/bin/sh +# Script to run barebox in console mode + +splash /dev/mtd0.barebox-logo2 +echo +echo "Welcome to barebox console" diff --git a/arch/arm/boards/mioa701/env/bin/init b/arch/arm/boards/mioa701/env/bin/init index ab5d84d68..e914eae32 100644 --- a/arch/arm/boards/mioa701/env/bin/init +++ b/arch/arm/boards/mioa701/env/bin/init @@ -7,13 +7,55 @@ export PATH addpart /dev/mtd0 $mtdparts usbserial -s "Mio A701 usb gadget" -led keyboard 0 -sdcard_override +gpio_get_value 22 +is_usb_connected=$? + +gpio_get_value 93 +is_vol_up=$? fb0.enable=1 +# Phase1: Handle Vol-Up key case : drop immediately to console +if [ $is_vol_up != 0 ]; then + console_mode + exit +fi + +# Phase2: Handle Power-On case : debounce PowerUp key or Halt +if [ $global.system.reset = "POR" -o $global.system.reset = "WKE" ]; then + powerup_released=0 + + gpio_get_value 0 + is_power_up=$? + if [ $is_power_up = 0 ]; then + powerup_released=1 + fi + msleep 500 + + gpio_get_value 0 + is_power_up=$? + if [ $is_power_up = 0 ]; then + powerup_released=1 + fi + + if [ $powerup_released = 1 ]; then + echo "Power button not held, halting" + poweroff + fi +fi + +# Phase3: display logo +led keyboard 0 splash /dev/mtd0.barebox-logo +# Phase4: check for SD Card override +sdcard_override +if [ $? = 0 ]; then + console_mode + exit +fi + +# Phase5: check for MTD override mtd_env_override if [ $? = 0 ]; then echo "Switching to custom environment" @@ -21,20 +63,17 @@ if [ $? = 0 ]; then exit fi +# Phase6: check for user interrupting auto-boot echo "No custom environment found" - -gpio_get_value 22 -is_usb_connected=$? if [ $is_usb_connected != 0 ]; then echo -n "Hit any key to stop autoboot: " timeout -a $autoboot_timeout if [ $? != 0 ]; then - echo - echo "Welcome to barebox console" + console_mode exit fi fi +# Phase7: auto-boot linux kernel echo "Booting linux kernel on docg3 chip ..." -bootargs="$bootargs mtdparts=docg3.0:$mtdparts ubi.mtd=4 rootfstype=ubifs root=ubi0:linux_root ro" bootm /dev/mtd0.kernel diff --git a/arch/arm/boards/mioa701/env/bin/sdcard_override b/arch/arm/boards/mioa701/env/bin/sdcard_override index ab8353413..7003fa967 100644 --- a/arch/arm/boards/mioa701/env/bin/sdcard_override +++ b/arch/arm/boards/mioa701/env/bin/sdcard_override @@ -12,5 +12,8 @@ if [ $mci0.probe = 1 ]; then if [ -f /sdcard/barebox.env ]; then loadenv /sdcard/barebox.env /env.sd /env.sd/bin/init + exit fi fi +trigger_error_return_code +exit diff --git a/arch/arm/boards/mioa701/env/config b/arch/arm/boards/mioa701/env/config index 2cc44fd7f..92014511b 100644 --- a/arch/arm/boards/mioa701/env/config +++ b/arch/arm/boards/mioa701/env/config @@ -2,4 +2,5 @@ autoboot_timeout=3 -mtdparts="256k@3456k(barebox)ro,256k(barebox-logo),128k(barebox-env),4M(kernel),-(root)" +mtdparts="2048k@384k(barebox)ro,256k(barebox-logo),256k(barebox-logo2),128k(barebox-env),5120k(kernel),-(root)" +bootargs="$bootargs mtdparts=docg3.0:$mtdparts ubi.mtd=5 rootfstype=ubifs root=ubi0:linux_root ro" diff --git a/arch/arm/boards/mioa701/env/data/dps1.raw.gz b/arch/arm/boards/mioa701/env/data/dps1.raw.gz index 93112bfca14762534de50443d4e0b4c9333d0936..9857c83e0718d0268dd8c2082193063cd3dfbc72 100644 GIT binary patch literal 1324 zcmV+{1=IQ;iwFo+Y|>Hy17vV>F)ngpcL42GacEUl82`?__vvdcy>1KV9D1A!%r?54 zujjVx?YVHIDc)LT!~!*=OvAMd!UEskb4xU8If)^`PMCj1U=)Nx@$8LJ{t?;=B>dyu zd$_0#WYixLNVng)?@dQE{|fr&{NUp|=eytezH`p^o!>R-L27ATn|L_6uC0cMwyyc{ z^s_hL3^g<~G)&D88X6iJ8vg?Qf6&m-m`77 z_$GG?Z{||H0Sx>_tzVaK?fY_E%W8rvhm zJNRxa9gtS}yaa7K#{+YH&bMu7deXZUh8-2HLRPI3lCb8k;wU*DFefL;$p($M`!uwr zY{{IoFjnWj+&q1VhTpofgiKB((myY->{e=^IQ-*?VNMILRNn}!qe(PeK6VAe>2%!L z=C8-T*Awri2xZW#z)yqTSR_FzNFhwqg4KUaIWRN*G88DMz#!zeAKH#t%=r_`{Cf; z_9Yuzj*;dE%@3L%G(Tv5(EOnJLGy#=2h9(fA2dJwSNt#&o7W1Dj|*=meweTHL!0?( zz4A#CBoDFg>__>w!k$pJvM77|?Oce1x7G&#KhO_->E`R7xWemnV?Ol^7Fk+&3rW2R zA*WD-9ne*nU&A;?*vqRzURHMWWWt#U(lqF&pq2atdx$s=zNOrWAW^m}Ijh#g&eAph zY`gM%+bLEj(-SeaS;(X_abLJ=u0tn3pq zzH=;S$J?;JKp(ougIF&N7iAtkDA7~{a^HhHXyxNU3^hs&j|cN{o)ol_*?Cf#l6;MI z1CXN-;}P^z%Xst_jb-Que#!fi4|(W+f91j+_5SLjx=?BD&ZvK%k;c9ue|bjbqB?Ru z0&l7}+~a`^>nzN}L_sdVoP@w@b>ZJ#HPa8#-j-U literal 1239 zcmV;|1StC-iwFqP5SLE?17vV>F)ngpcL42GPiS0482{ex+hmijd6T#{>2_^iLe#A$ zxW+Z6Aju=GQZ>@G4bnpnE9B5a)%fSolbPK_@lVlh=}D9w1SOz{5PIrCv#p3ot1VLF z!Q#Fh$3sGwC?XXD>u)yMHZ6%>JjwjvW9IwKH{YB2X6E;TG(->dKbU%G;Nih25w-ns z^~>nT{Z#`41B0N^2Ll5G1A|Rq{tpHQ23x`CgTX(6N{-)I`bK_NdPlab?DnG;Eq_n6 zoC+3HI}@^pam5O(;^dpkJ>Xg$r^1}J3X$;bl>_BtBqVdJn>e(x-3eFPoyN+0FwNhv z65@lE9|HvyXL-e3ApWV+8B>J`+-W0q#yA`LK|kc_A%N$cTGMgmQ_|qDdjE86jUrJ*Hqo;F`dF2=00K-Dsaf%ahaP$IuQ=X3J+@ zEMi@Ys)3lSRI4%0g?tKQtIrnHJT3b3?xMd7-_W_V1;QNh&-hmn8|H};_PsQNIsKS3 ztaCf4FY)qx8gtX97KmDY8A6EZ-lT0ORwRg;#h-4)XcvfEn9qlnJtW# zb?h(IYV$T4^TQaUHCR`E9X#~&9hWJ9z1Y-Lvb-6@rsWlU%S-Mpe_pLF>2uZVvvhr| zf{Nn&c)Td1sQU!^Z^Vjn0{t-hn;DO^N?f^S@w<>MLijDHC836$*k>F18T8}m*E#L) zK^mbMU}dRYoKX=0QGfkaZ{^nuE*>3uiM7+=gyqJioNPMnsdcoSC@Ika{wYH@D99@ z$I}O#w}@KO!tbC?6^Er*r*hpB%1R0uq=SA4XEfecP%i4K?>UdH-E$k~un)ZU>tmWv zf$Kn<#Jh>RT=k;u=;A5?UccqzeL^O{$HDi2?*JbGABE4r*Y87M_Y3<5Ui+GiJ{Wy4 z`e5|I=!4M*qYp+Oj6N8BF#2Hh;lI)c)~3&ys|dy;h{w|97<|GzI*j;htpzo{?q}f7 z#zgH7X#a@27JqczpM<}PJton&(YM{a3h6V2o$kW-@y-{9r^}3;R6%-L*Y62|{QLI_ z8D=xML#JwaBJPZexTk8l8F&WX0v`qc3gQ#sjv`+#{0aC;_~YNHY_uaw|z*2~@V#4o&S#Hj^5y$&-((64d`CU1=a1Yu Date: Sat, 18 Jan 2014 12:48:09 +0100 Subject: [PATCH 6/8] ARM: mioa701: poweroff the board on long power press When the board is on console, a way is added to manually power off the board, on a long power key press (4s). This enables to be able to poweroff the board whatever the state, and is the only manual way (no mechanical possibility). Signed-off-by: Robert Jarzmik Signed-off-by: Sascha Hauer --- arch/arm/boards/mioa701/Makefile | 2 +- arch/arm/boards/mioa701/gpio0_poweroff.c | 81 ++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 arch/arm/boards/mioa701/gpio0_poweroff.c diff --git a/arch/arm/boards/mioa701/Makefile b/arch/arm/boards/mioa701/Makefile index 01c7a259e..307270623 100644 --- a/arch/arm/boards/mioa701/Makefile +++ b/arch/arm/boards/mioa701/Makefile @@ -1,2 +1,2 @@ -obj-y += board.o +obj-y += board.o gpio0_poweroff.o lwl-y += lowlevel.o diff --git a/arch/arm/boards/mioa701/gpio0_poweroff.c b/arch/arm/boards/mioa701/gpio0_poweroff.c new file mode 100644 index 000000000..2054548aa --- /dev/null +++ b/arch/arm/boards/mioa701/gpio0_poweroff.c @@ -0,0 +1,81 @@ +/* + * (C) 2011 Robert Jarzmik + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include "mioa701.h" + +#define POWEROFF_SECS (4 * SECOND) + +static void blink_led_keyboard(void) +{ + gpio_set_value(GPIO115_LED_nKeyboard, 0); + mdelay(400); + gpio_set_value(GPIO115_LED_nKeyboard, 1); + mdelay(400); +} + +static void try_poweroff(void) +{ + int poweroff_released = 0; + + blink_led_keyboard(); + poweroff_released |= !gpio_get_value(GPIO0_KEY_POWER); + if (poweroff_released) + return; + + gpio_set_value(GPIO115_LED_nKeyboard, 0); + mdelay(2000); + poweroff(); +} + +static void gpio0_poller_fn(struct poller_struct *poller) +{ + static uint64_t gpio0_start; + static bool gpio0_activated; + + if (!gpio_get_value(GPIO0_KEY_POWER)) { + gpio0_activated = false; + return; + } + + if (gpio0_activated) { + if (is_timeout_non_interruptible(gpio0_start, POWEROFF_SECS)) { + try_poweroff(); + gpio0_activated = false; + } + } else { + gpio0_activated = true; + gpio0_start = get_time_ns(); + } +} + +static struct poller_struct gpio0_poller = { + .func = gpio0_poller_fn, +}; + +static int gpio0_poweroff_probe(void) +{ + return poller_register(&gpio0_poller); +} + +device_initcall(gpio0_poweroff_probe); From 0099a887c03b7dfe76e06496906dbb1e5c7f5df6 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 24 Jan 2014 15:16:32 +0100 Subject: [PATCH 7/8] reset_source: rename set_reset_source to reset_source_set To get all reset source related functions into the same function namespace. Signed-off-by: Sascha Hauer --- arch/arm/mach-imx/imx1.c | 6 +++--- arch/arm/mach-pxa/reset_source.c | 10 +++++----- arch/arm/mach-samsung/reset_source.c | 6 +++--- common/reset_source.c | 8 ++++---- drivers/watchdog/im28wd.c | 8 ++++---- drivers/watchdog/imxwd.c | 6 +++--- include/reset_source.h | 4 ++-- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/arch/arm/mach-imx/imx1.c b/arch/arm/mach-imx/imx1.c index 78a024247..51bdcbf38 100644 --- a/arch/arm/mach-imx/imx1.c +++ b/arch/arm/mach-imx/imx1.c @@ -30,13 +30,13 @@ static void imx1_detect_reset_source(void) switch (val) { case RSR_EXR: - set_reset_source(RESET_RST); + reset_source_set(RESET_RST); return; case RSR_WDR: - set_reset_source(RESET_WDG); + reset_source_set(RESET_WDG); return; case 0: - set_reset_source(RESET_POR); + reset_source_set(RESET_POR); return; default: /* else keep the default 'unknown' state */ diff --git a/arch/arm/mach-pxa/reset_source.c b/arch/arm/mach-pxa/reset_source.c index 2b650c644..a90584b1a 100644 --- a/arch/arm/mach-pxa/reset_source.c +++ b/arch/arm/mach-pxa/reset_source.c @@ -25,15 +25,15 @@ static int pxa_detect_reset_source(void) * Order is important, as many bits can be set together */ if (reg & RCSR_GPR) - set_reset_source(RESET_RST); + reset_source_set(RESET_RST); else if (reg & RCSR_WDR) - set_reset_source(RESET_WDG); + reset_source_set(RESET_WDG); else if (reg & RCSR_HWR) - set_reset_source(RESET_POR); + reset_source_set(RESET_POR); else if (reg & RCSR_SMR) - set_reset_source(RESET_WKE); + reset_source_set(RESET_WKE); else - set_reset_source(RESET_UKWN); + reset_source_set(RESET_UKWN); return 0; } diff --git a/arch/arm/mach-samsung/reset_source.c b/arch/arm/mach-samsung/reset_source.c index 2456e3f60..c1365b200 100644 --- a/arch/arm/mach-samsung/reset_source.c +++ b/arch/arm/mach-samsung/reset_source.c @@ -29,21 +29,21 @@ static int s3c_detect_reset_source(void) u32 reg = readl(S3C_GPIO_BASE + S3C2440_GSTATUS2); if (reg & S3C2440_GSTATUS2_PWRST) { - set_reset_source(RESET_POR); + reset_source_set(RESET_POR); writel(S3C2440_GSTATUS2_PWRST, S3C_GPIO_BASE + S3C2440_GSTATUS2); return 0; } if (reg & S3C2440_GSTATUS2_SLEEPRST) { - set_reset_source(RESET_WKE); + reset_source_set(RESET_WKE); writel(S3C2440_GSTATUS2_SLEEPRST, S3C_GPIO_BASE + S3C2440_GSTATUS2); return 0; } if (reg & S3C2440_GSTATUS2_WDRST) { - set_reset_source(RESET_WDG); + reset_source_set(RESET_WDG); writel(S3C2440_GSTATUS2_WDRST, S3C_GPIO_BASE + S3C2440_GSTATUS2); return 0; diff --git a/common/reset_source.c b/common/reset_source.c index fdc30f485..3a11d26cb 100644 --- a/common/reset_source.c +++ b/common/reset_source.c @@ -27,18 +27,18 @@ static const char * const reset_src_names[] = { [RESET_JTAG] = "JTAG", }; -void set_reset_source(enum reset_src_type st) +void reset_source_set(enum reset_src_type st) { setenv("global.system.reset", reset_src_names[st]); } -EXPORT_SYMBOL(set_reset_source); +EXPORT_SYMBOL(reset_source_set); /* ensure this runs after the 'global' device is already registerd */ -static int init_reset_source(void) +static int reset_source_init(void) { globalvar_add_simple("system.reset", reset_src_names[RESET_UKWN]); return 0; } -coredevice_initcall(init_reset_source); +coredevice_initcall(reset_source_init); diff --git a/drivers/watchdog/im28wd.c b/drivers/watchdog/im28wd.c index 6ae4cf832..dd66e12fc 100644 --- a/drivers/watchdog/im28wd.c +++ b/drivers/watchdog/im28wd.c @@ -163,20 +163,20 @@ static void __maybe_unused imx28_detect_reset_source(const struct imx28_wd *p) if (reg & MXS_RTC_PERSISTENT0_ALARM_WAKE) { writel(MXS_RTC_PERSISTENT0_ALARM_WAKE, p->regs + MXS_RTC_PERSISTENT0 + MXS_RTC_CLR_ADDR); - set_reset_source(RESET_WKE); + reset_source_set(RESET_WKE); return; } - set_reset_source(RESET_POR); + reset_source_set(RESET_POR); return; } if (reg & MXS_RTC_PERSISTENT0_THM_RST) { writel(MXS_RTC_PERSISTENT0_THM_RST, p->regs + MXS_RTC_PERSISTENT0 + MXS_RTC_CLR_ADDR); - set_reset_source(RESET_RST); + reset_source_set(RESET_RST); return; } - set_reset_source(RESET_RST); + reset_source_set(RESET_RST); } static int imx28_wd_probe(struct device_d *dev) diff --git a/drivers/watchdog/imxwd.c b/drivers/watchdog/imxwd.c index f5910ac0a..63c5605c9 100644 --- a/drivers/watchdog/imxwd.c +++ b/drivers/watchdog/imxwd.c @@ -130,17 +130,17 @@ static void imx_watchdog_detect_reset_source(struct imx_wd *priv) u16 val = readw(priv->base + IMX21_WDOG_WSTR); if (val & WSTR_COLDSTART) { - set_reset_source(RESET_POR); + reset_source_set(RESET_POR); return; } if (val & (WSTR_HARDRESET | WSTR_WARMSTART)) { - set_reset_source(RESET_RST); + reset_source_set(RESET_RST); return; } if (val & WSTR_WDOG) { - set_reset_source(RESET_WDG); + reset_source_set(RESET_WDG); return; } diff --git a/include/reset_source.h b/include/reset_source.h index 75e7ba8d4..f3a203aea 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -23,9 +23,9 @@ enum reset_src_type { }; #ifdef CONFIG_RESET_SOURCE -void set_reset_source(enum reset_src_type); +void reset_source_set(enum reset_src_type); #else -static inline void set_reset_source(enum reset_src_type unused) +static inline void reset_source_set(enum reset_src_type unused) { } #endif From 706cef7e5bd9faafeb1ec599bf5270ea07063d56 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 24 Jan 2014 15:17:32 +0100 Subject: [PATCH 8/8] reset_source: add reset_source_get To get reset_source from C code, not only from shell. Signed-off-by: Sascha Hauer --- common/reset_source.c | 10 ++++++++++ include/reset_source.h | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/common/reset_source.c b/common/reset_source.c index 3a11d26cb..6026af196 100644 --- a/common/reset_source.c +++ b/common/reset_source.c @@ -27,8 +27,18 @@ static const char * const reset_src_names[] = { [RESET_JTAG] = "JTAG", }; +static enum reset_src_type reset_source; + +enum reset_src_type reset_source_get(void) +{ + return reset_source; +} +EXPORT_SYMBOL(reset_source_get); + void reset_source_set(enum reset_src_type st) { + reset_source = st; + setenv("global.system.reset", reset_src_names[st]); } EXPORT_SYMBOL(reset_source_set); diff --git a/include/reset_source.h b/include/reset_source.h index f3a203aea..bff7f9785 100644 --- a/include/reset_source.h +++ b/include/reset_source.h @@ -24,10 +24,16 @@ enum reset_src_type { #ifdef CONFIG_RESET_SOURCE void reset_source_set(enum reset_src_type); +enum reset_src_type reset_source_get(void); #else static inline void reset_source_set(enum reset_src_type unused) { } + +static inline enum reset_src_type reset_source_get(void) +{ + return RESET_UKWN; +} #endif #endif /* __INCLUDE_RESET_SOURCE_H */