brcm2708: drop support for 3.3 kernel
Signed-off-by: Florian Fainelli <florian@openwrt.org> SVN-Revision: 37236
This commit is contained in:
parent
110687b491
commit
01865ae1cf
10 changed files with 0 additions and 86421 deletions
|
@ -1,248 +0,0 @@
|
|||
# CONFIG_AIO is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
# CONFIG_APM_EMULATION is not set
|
||||
CONFIG_ARCH_BCM2708=y
|
||||
CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
|
||||
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
# CONFIG_ARM_ERRATA_326103 is not set
|
||||
# CONFIG_ARM_ERRATA_364296 is not set
|
||||
CONFIG_ARM_ERRATA_411920=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=5
|
||||
CONFIG_ARM_NR_BANKS=8
|
||||
# CONFIG_ARM_SP805_WATCHDOG is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_AVERAGE=y
|
||||
# CONFIG_BACKLIGHT_ADP8860 is not set
|
||||
# CONFIG_BACKLIGHT_ADP8870 is not set
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=m
|
||||
CONFIG_BACKLIGHT_GENERIC=m
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
CONFIG_BCM2708_GPIO=y
|
||||
# CONFIG_BCM2708_NOL2CACHE is not set
|
||||
CONFIG_BCM2708_VCHIQ=y
|
||||
CONFIG_BCM2708_VCMEM=y
|
||||
CONFIG_BCM2708_WDT=y
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CMDLINE="dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rootwait"
|
||||
CONFIG_CMDLINE_FROM_BOOTLOADER=y
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
|
||||
CONFIG_CPU_32v6=y
|
||||
CONFIG_CPU_ABRT_EV6=y
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
CONFIG_CPU_CACHE_V6=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
CONFIG_CPU_HAS_PMU=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_PABRT_V6=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_TLB_V6=y
|
||||
CONFIG_CPU_USE_DOMAINS=y
|
||||
CONFIG_CPU_V6=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_BCM2708=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_WMT_GE_ROPS is not set
|
||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_FONT_8x8=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
# CONFIG_FPE_NWFPE is not set
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_FREEZER=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_GENERIC_ACL=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_GENERIC_GPIO=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GPIOLIB=y
|
||||
# CONFIG_GPIO_PL061 is not set
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAVE_AOUT=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_PFN_VALID=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
||||
CONFIG_HAVE_IRQ_WORK=y
|
||||
CONFIG_HAVE_KERNEL_GZIP=y
|
||||
CONFIG_HAVE_KERNEL_LZMA=y
|
||||
CONFIG_HAVE_KERNEL_LZO=y
|
||||
CONFIG_HAVE_KERNEL_XZ=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SPARSE_IRQ=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_KERNEL_GZIP=y
|
||||
# CONFIG_KERNEL_XZ is not set
|
||||
CONFIG_KTIME_SCALAR=y
|
||||
# CONFIG_LCD_AMS369FG06 is not set
|
||||
CONFIG_LCD_CLASS_DEVICE=m
|
||||
# CONFIG_LCD_L4F00242T03 is not set
|
||||
# CONFIG_LCD_LD9040 is not set
|
||||
# CONFIG_LCD_LMS283GF05 is not set
|
||||
# CONFIG_LCD_LTV350QV is not set
|
||||
# CONFIG_LCD_PLATFORM is not set
|
||||
# CONFIG_LCD_S6E63M0 is not set
|
||||
# CONFIG_LCD_TDO24M is not set
|
||||
# CONFIG_LCD_VGG2432A4 is not set
|
||||
CONFIG_LEDS_GPIO=y
|
||||
# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
|
||||
# CONFIG_LEDS_TRIGGER_TIMER is not set
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_MACH_BCM2708=y
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
# CONFIG_MFD_T7L66XB is not set
|
||||
CONFIG_MMC=y
|
||||
# CONFIG_MMC_BCM2708 is not set
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_BCM2708=y
|
||||
CONFIG_MMC_SDHCI_BCM2708_DMA=y
|
||||
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
# CONFIG_MTD is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_MACH_MEMORY_H=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_DEFAULT="utf8"
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_OABI_COMPAT=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
# CONFIG_PDA_POWER is not set
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
# CONFIG_SQUASHFS is not set
|
||||
# CONFIG_STAGING is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
# CONFIG_UID16 is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_XHCI is not set
|
||||
CONFIG_USB_COMMON=y
|
||||
# CONFIG_USB_DEVICEFS is not set
|
||||
CONFIG_USB_DEVICE_CLASS=y
|
||||
CONFIG_USB_DWCOTG=y
|
||||
CONFIG_USB_LIBUSUAL=y
|
||||
CONFIG_USB_NET_SMSC95XX=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_VT_CONSOLE_SLEEP=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,436 +0,0 @@
|
|||
From ed8c2d720954efc5a440912292ed11da2f50aaea Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 17 Jan 2012 19:20:57 +0000
|
||||
Subject: [PATCH 3/7] bcm2708 watchdog driver
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
---
|
||||
drivers/watchdog/Kconfig | 6 +
|
||||
drivers/watchdog/Makefile | 1 +
|
||||
drivers/watchdog/bcm2708_wdog.c | 385 +++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 392 insertions(+), 0 deletions(-)
|
||||
create mode 100644 drivers/watchdog/bcm2708_wdog.c
|
||||
|
||||
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
|
||||
index 86b0735..7675ebc 100644
|
||||
--- a/drivers/watchdog/Kconfig
|
||||
+++ b/drivers/watchdog/Kconfig
|
||||
@@ -348,6 +348,12 @@ config IMX2_WDT
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx2_wdt.
|
||||
|
||||
+config BCM2708_WDT
|
||||
+ tristate "BCM2708 Watchdog"
|
||||
+ depends on ARCH_BCM2708
|
||||
+ help
|
||||
+ Enables BCM2708 watchdog support.
|
||||
+
|
||||
# AVR32 Architecture
|
||||
|
||||
config AT32AP700X_WDT
|
||||
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
|
||||
index 55bd574..803f0bc 100644
|
||||
--- a/drivers/watchdog/Makefile
|
||||
+++ b/drivers/watchdog/Makefile
|
||||
@@ -54,6 +54,7 @@ obj-$(CONFIG_NUC900_WATCHDOG) += nuc900_wdt.o
|
||||
obj-$(CONFIG_ADX_WATCHDOG) += adx_wdt.o
|
||||
obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o
|
||||
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
|
||||
+obj-$(CONFIG_BCM2708_WDT) += bcm2708_wdog.o
|
||||
|
||||
# AVR32 Architecture
|
||||
obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o
|
||||
diff --git a/drivers/watchdog/bcm2708_wdog.c b/drivers/watchdog/bcm2708_wdog.c
|
||||
new file mode 100644
|
||||
index 0000000..dd33c35
|
||||
--- /dev/null
|
||||
+++ b/drivers/watchdog/bcm2708_wdog.c
|
||||
@@ -0,0 +1,385 @@
|
||||
+/*
|
||||
+ * Broadcom BCM2708 watchdog driver.
|
||||
+ *
|
||||
+ * (c) Copyright 2010 Broadcom Europe Ltd
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * BCM2708 watchdog driver. Loosely based on wdt driver.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/moduleparam.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/miscdevice.h>
|
||||
+#include <linux/watchdog.h>
|
||||
+#include <linux/fs.h>
|
||||
+#include <linux/ioport.h>
|
||||
+#include <linux/notifier.h>
|
||||
+#include <linux/reboot.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/uaccess.h>
|
||||
+#include <mach/platform.h>
|
||||
+
|
||||
+#include <asm/system.h>
|
||||
+
|
||||
+#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
|
||||
+#define WDOG_TICKS_TO_SECS(x) ((x) >> 16)
|
||||
+
|
||||
+static unsigned long wdog_is_open;
|
||||
+static uint32_t wdog_ticks; /* Ticks to load into wdog timer */
|
||||
+static char expect_close;
|
||||
+
|
||||
+/*
|
||||
+ * Module parameters
|
||||
+ */
|
||||
+
|
||||
+#define WD_TIMO 10 /* Default heartbeat = 60 seconds */
|
||||
+static int heartbeat = WD_TIMO; /* Heartbeat in seconds */
|
||||
+
|
||||
+module_param(heartbeat, int, 0);
|
||||
+MODULE_PARM_DESC(heartbeat,
|
||||
+ "Watchdog heartbeat in seconds. (0 < heartbeat < 65536, default="
|
||||
+ __MODULE_STRING(WD_TIMO) ")");
|
||||
+
|
||||
+static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
+module_param(nowayout, int, 0);
|
||||
+MODULE_PARM_DESC(nowayout,
|
||||
+ "Watchdog cannot be stopped once started (default="
|
||||
+ __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
||||
+
|
||||
+static DEFINE_SPINLOCK(wdog_lock);
|
||||
+
|
||||
+/**
|
||||
+ * Start the watchdog driver.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_start(unsigned long timeout)
|
||||
+{
|
||||
+ uint32_t cur;
|
||||
+ unsigned long flags;
|
||||
+ spin_lock_irqsave(&wdog_lock, flags);
|
||||
+
|
||||
+ /* enable the watchdog */
|
||||
+ iowrite32(PM_PASSWORD | (timeout & PM_WDOG_TIME_SET),
|
||||
+ __io_address(PM_WDOG));
|
||||
+ cur = ioread32(__io_address(PM_RSTC));
|
||||
+ iowrite32(PM_PASSWORD | (cur & PM_RSTC_WRCFG_CLR) |
|
||||
+ PM_RSTC_WRCFG_FULL_RESET, __io_address(PM_RSTC));
|
||||
+
|
||||
+ spin_unlock_irqrestore(&wdog_lock, flags);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Stop the watchdog driver.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_stop(void)
|
||||
+{
|
||||
+ iowrite32(PM_PASSWORD | PM_RSTC_RESET, __io_address(PM_RSTC));
|
||||
+ printk(KERN_INFO "watchdog stopped\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Reload counter one with the watchdog heartbeat. We don't bother
|
||||
+ * reloading the cascade counter.
|
||||
+ */
|
||||
+
|
||||
+static void wdog_ping(void)
|
||||
+{
|
||||
+ wdog_start(wdog_ticks);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @t: the new heartbeat value that needs to be set.
|
||||
+ *
|
||||
+ * Set a new heartbeat value for the watchdog device. If the heartbeat
|
||||
+ * value is incorrect we keep the old value and return -EINVAL. If
|
||||
+ * successful we return 0.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_set_heartbeat(int t)
|
||||
+{
|
||||
+ if (t < 1 || t > WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ heartbeat = t;
|
||||
+ wdog_ticks = SECS_TO_WDOG_TICKS(t);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @file: file handle to the watchdog
|
||||
+ * @buf: buffer to write (unused as data does not matter here
|
||||
+ * @count: count of bytes
|
||||
+ * @ppos: pointer to the position to write. No seeks allowed
|
||||
+ *
|
||||
+ * A write to a watchdog device is defined as a keepalive signal.
|
||||
+ *
|
||||
+ * if 'nowayout' is set then normally a close() is ignored. But
|
||||
+ * if you write 'V' first then the close() will stop the timer.
|
||||
+ */
|
||||
+
|
||||
+static ssize_t wdog_write(struct file *file, const char __user *buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ if (count) {
|
||||
+ if (!nowayout) {
|
||||
+ size_t i;
|
||||
+
|
||||
+ /* In case it was set long ago */
|
||||
+ expect_close = 0;
|
||||
+
|
||||
+ for (i = 0; i != count; i++) {
|
||||
+ char c;
|
||||
+ if (get_user(c, buf + i))
|
||||
+ return -EFAULT;
|
||||
+ if (c == 'V')
|
||||
+ expect_close = 42;
|
||||
+ }
|
||||
+ }
|
||||
+ wdog_ping();
|
||||
+ }
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static int wdog_get_status(void)
|
||||
+{
|
||||
+ unsigned long flags;
|
||||
+ int status = 0;
|
||||
+ spin_lock_irqsave(&wdog_lock, flags);
|
||||
+ /* FIXME: readback reset reason */
|
||||
+ spin_unlock_irqrestore(&wdog_lock, flags);
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+static uint32_t wdog_get_remaining(void)
|
||||
+{
|
||||
+ uint32_t ret = ioread32(__io_address(PM_WDOG));
|
||||
+ return ret & PM_WDOG_TIME_SET;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @file: file handle to the device
|
||||
+ * @cmd: watchdog command
|
||||
+ * @arg: argument pointer
|
||||
+ *
|
||||
+ * The watchdog API defines a common set of functions for all watchdogs
|
||||
+ * according to their available features. We only actually usefully support
|
||||
+ * querying capabilities and current status.
|
||||
+ */
|
||||
+
|
||||
+static long wdog_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
+{
|
||||
+ void __user *argp = (void __user *)arg;
|
||||
+ int __user *p = argp;
|
||||
+ int new_heartbeat;
|
||||
+ int status;
|
||||
+ int options;
|
||||
+ uint32_t remaining;
|
||||
+
|
||||
+ struct watchdog_info ident = {
|
||||
+ .options = WDIOF_SETTIMEOUT|
|
||||
+ WDIOF_MAGICCLOSE|
|
||||
+ WDIOF_KEEPALIVEPING,
|
||||
+ .firmware_version = 1,
|
||||
+ .identity = "BCM2708",
|
||||
+ };
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case WDIOC_GETSUPPORT:
|
||||
+ return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
|
||||
+ case WDIOC_GETSTATUS:
|
||||
+ status = wdog_get_status();
|
||||
+ return put_user(status, p);
|
||||
+ case WDIOC_GETBOOTSTATUS:
|
||||
+ return put_user(0, p);
|
||||
+ case WDIOC_KEEPALIVE:
|
||||
+ wdog_ping();
|
||||
+ return 0;
|
||||
+ case WDIOC_SETTIMEOUT:
|
||||
+ if (get_user(new_heartbeat, p))
|
||||
+ return -EFAULT;
|
||||
+ if (wdog_set_heartbeat(new_heartbeat))
|
||||
+ return -EINVAL;
|
||||
+ wdog_ping();
|
||||
+ /* Fall */
|
||||
+ case WDIOC_GETTIMEOUT:
|
||||
+ return put_user(heartbeat, p);
|
||||
+ case WDIOC_GETTIMELEFT:
|
||||
+ remaining = WDOG_TICKS_TO_SECS(wdog_get_remaining());
|
||||
+ return put_user(remaining, p);
|
||||
+ case WDIOC_SETOPTIONS:
|
||||
+ if (get_user(options, p))
|
||||
+ return -EFAULT;
|
||||
+ if (options & WDIOS_DISABLECARD)
|
||||
+ wdog_stop();
|
||||
+ if (options & WDIOS_ENABLECARD)
|
||||
+ wdog_start(wdog_ticks);
|
||||
+ return 0;
|
||||
+ default:
|
||||
+ return -ENOTTY;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @inode: inode of device
|
||||
+ * @file: file handle to device
|
||||
+ *
|
||||
+ * The watchdog device has been opened. The watchdog device is single
|
||||
+ * open and on opening we load the counters.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ if (test_and_set_bit(0, &wdog_is_open))
|
||||
+ return -EBUSY;
|
||||
+ /*
|
||||
+ * Activate
|
||||
+ */
|
||||
+ wdog_start(wdog_ticks);
|
||||
+ return nonseekable_open(inode, file);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @inode: inode to board
|
||||
+ * @file: file handle to board
|
||||
+ *
|
||||
+ * The watchdog has a configurable API. There is a religious dispute
|
||||
+ * between people who want their watchdog to be able to shut down and
|
||||
+ * those who want to be sure if the watchdog manager dies the machine
|
||||
+ * reboots. In the former case we disable the counters, in the latter
|
||||
+ * case you have to open it again very soon.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_release(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ if (expect_close == 42) {
|
||||
+ wdog_stop();
|
||||
+ } else {
|
||||
+ printk(KERN_CRIT
|
||||
+ "wdt: WDT device closed unexpectedly. WDT will not stop!\n");
|
||||
+ wdog_ping();
|
||||
+ }
|
||||
+ clear_bit(0, &wdog_is_open);
|
||||
+ expect_close = 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * @this: our notifier block
|
||||
+ * @code: the event being reported
|
||||
+ * @unused: unused
|
||||
+ *
|
||||
+ * Our notifier is called on system shutdowns. Turn the watchdog
|
||||
+ * off so that it does not fire during the next reboot.
|
||||
+ */
|
||||
+
|
||||
+static int wdog_notify_sys(struct notifier_block *this, unsigned long code,
|
||||
+ void *unused)
|
||||
+{
|
||||
+ if (code == SYS_DOWN || code == SYS_HALT)
|
||||
+ wdog_stop();
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Kernel Interfaces
|
||||
+ */
|
||||
+
|
||||
+
|
||||
+static const struct file_operations wdog_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = no_llseek,
|
||||
+ .write = wdog_write,
|
||||
+ .unlocked_ioctl = wdog_ioctl,
|
||||
+ .open = wdog_open,
|
||||
+ .release = wdog_release,
|
||||
+};
|
||||
+
|
||||
+static struct miscdevice wdog_miscdev = {
|
||||
+ .minor = WATCHDOG_MINOR,
|
||||
+ .name = "watchdog",
|
||||
+ .fops = &wdog_fops,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * The WDT card needs to learn about soft shutdowns in order to
|
||||
+ * turn the timebomb registers off.
|
||||
+ */
|
||||
+
|
||||
+static struct notifier_block wdog_notifier = {
|
||||
+ .notifier_call = wdog_notify_sys,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * cleanup_module:
|
||||
+ *
|
||||
+ * Unload the watchdog. You cannot do this with any file handles open.
|
||||
+ * If your watchdog is set to continue ticking on close and you unload
|
||||
+ * it, well it keeps ticking. We won't get the interrupt but the board
|
||||
+ * will not touch PC memory so all is fine. You just have to load a new
|
||||
+ * module in 60 seconds or reboot.
|
||||
+ */
|
||||
+
|
||||
+static void __exit wdog_exit(void)
|
||||
+{
|
||||
+ misc_deregister(&wdog_miscdev);
|
||||
+ unregister_reboot_notifier(&wdog_notifier);
|
||||
+}
|
||||
+
|
||||
+static int __init wdog_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Check that the heartbeat value is within it's range;
|
||||
+ if not reset to the default */
|
||||
+ if (wdog_set_heartbeat(heartbeat)) {
|
||||
+ wdog_set_heartbeat(WD_TIMO);
|
||||
+ printk(KERN_INFO "bcm2708_wdog: heartbeat value must be "
|
||||
+ "0 < heartbeat < %d, using %d\n",
|
||||
+ WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET),
|
||||
+ WD_TIMO);
|
||||
+ }
|
||||
+
|
||||
+ ret = register_reboot_notifier(&wdog_notifier);
|
||||
+ if (ret) {
|
||||
+ printk(KERN_ERR
|
||||
+ "wdt: cannot register reboot notifier (err=%d)\n", ret);
|
||||
+ goto out_reboot;
|
||||
+ }
|
||||
+
|
||||
+ ret = misc_register(&wdog_miscdev);
|
||||
+ if (ret) {
|
||||
+ printk(KERN_ERR
|
||||
+ "wdt: cannot register miscdev on minor=%d (err=%d)\n",
|
||||
+ WATCHDOG_MINOR, ret);
|
||||
+ goto out_misc;
|
||||
+ }
|
||||
+
|
||||
+ printk(KERN_INFO "bcm2708 watchdog, heartbeat=%d sec (nowayout=%d)\n",
|
||||
+ heartbeat, nowayout);
|
||||
+ return 0;
|
||||
+
|
||||
+out_misc:
|
||||
+ unregister_reboot_notifier(&wdog_notifier);
|
||||
+out_reboot:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+module_init(wdog_init);
|
||||
+module_exit(wdog_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Luke Diamand");
|
||||
+MODULE_DESCRIPTION("Driver for BCM2708 watchdog");
|
||||
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
|
||||
+MODULE_ALIAS_MISCDEV(TEMP_MINOR);
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
--
|
||||
1.7.5.4
|
||||
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,96 +0,0 @@
|
|||
From dd6079fc871e99e4b0345d3fe27701dce5dcc7d0 Mon Sep 17 00:00:00 2001
|
||||
From: popcornmix <popcornmix@gmail.com>
|
||||
Date: Tue, 17 Jan 2012 19:22:59 +0000
|
||||
Subject: [PATCH 6/7] Allow mac address to be set in smsc95xx
|
||||
|
||||
Signed-off-by: popcornmix <popcornmix@gmail.com>
|
||||
---
|
||||
drivers/net/usb/smsc95xx.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 files changed, 56 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
|
||||
index f74f3ce..5a2e12b 100644
|
||||
--- a/drivers/net/usb/smsc95xx.c
|
||||
+++ b/drivers/net/usb/smsc95xx.c
|
||||
@@ -46,6 +46,7 @@
|
||||
#define SMSC95XX_INTERNAL_PHY_ID (1)
|
||||
#define SMSC95XX_TX_OVERHEAD (8)
|
||||
#define SMSC95XX_TX_OVERHEAD_CSUM (12)
|
||||
+#define MAC_ADDR_LEN (6)
|
||||
|
||||
struct smsc95xx_priv {
|
||||
u32 mac_cr;
|
||||
@@ -63,6 +64,10 @@ static int turbo_mode = true;
|
||||
module_param(turbo_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
|
||||
|
||||
+static char *macaddr = ":";
|
||||
+module_param(macaddr, charp, 0);
|
||||
+MODULE_PARM_DESC(macaddr, "MAC address");
|
||||
+
|
||||
static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data)
|
||||
{
|
||||
u32 *buf = kmalloc(4, GFP_KERNEL);
|
||||
@@ -600,8 +605,59 @@ static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
|
||||
return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
|
||||
}
|
||||
|
||||
+/* Check the macaddr module parameter for a MAC address */
|
||||
+static int smsc95xx_is_macaddr_param(struct usbnet *dev, u8 *dev_mac)
|
||||
+{
|
||||
+ int i, j, got_num, num;
|
||||
+ u8 mtbl[MAC_ADDR_LEN];
|
||||
+
|
||||
+ if (macaddr[0] == ':')
|
||||
+ return 0;
|
||||
+
|
||||
+ i = 0;
|
||||
+ j = 0;
|
||||
+ num = 0;
|
||||
+ got_num = 0;
|
||||
+ while (j < MAC_ADDR_LEN) {
|
||||
+ if (macaddr[i] && macaddr[i] != ':') {
|
||||
+ got_num++;
|
||||
+ if ('0' <= macaddr[i] && macaddr[i] <= '9')
|
||||
+ num = num * 16 + macaddr[i] - '0';
|
||||
+ else if ('A' <= macaddr[i] && macaddr[i] <= 'F')
|
||||
+ num = num * 16 + 10 + macaddr[i] - 'A';
|
||||
+ else if ('a' <= macaddr[i] && macaddr[i] <= 'f')
|
||||
+ num = num * 16 + 10 + macaddr[i] - 'a';
|
||||
+ else
|
||||
+ break;
|
||||
+ i++;
|
||||
+ } else if (got_num == 2) {
|
||||
+ mtbl[j++] = (u8) num;
|
||||
+ num = 0;
|
||||
+ got_num = 0;
|
||||
+ i++;
|
||||
+ } else {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (j == MAC_ADDR_LEN) {
|
||||
+ netif_dbg(dev, ifup, dev->net, "Overriding MAC address with: "
|
||||
+ "%02x:%02x:%02x:%02x:%02x:%02x\n", mtbl[0], mtbl[1], mtbl[2],
|
||||
+ mtbl[3], mtbl[4], mtbl[5]);
|
||||
+ for (i = 0; i < MAC_ADDR_LEN; i++)
|
||||
+ dev_mac[i] = mtbl[i];
|
||||
+ return 1;
|
||||
+ } else {
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void smsc95xx_init_mac_address(struct usbnet *dev)
|
||||
{
|
||||
+ /* Check module parameters */
|
||||
+ if (smsc95xx_is_macaddr_param(dev, dev->net->dev_addr))
|
||||
+ return;
|
||||
+
|
||||
/* try reading mac address from EEPROM */
|
||||
if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
|
||||
dev->net->dev_addr) == 0) {
|
||||
--
|
||||
1.7.5.4
|
||||
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,11 +0,0 @@
|
|||
--- a/arch/arm/lib/Makefile
|
||||
+++ b/arch/arm/lib/Makefile
|
||||
@@ -14,7 +14,7 @@ lib-y := backtrace.o changebit.o csumip
|
||||
ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
||||
ucmpdi2.o lib1funcs.o div64.o \
|
||||
io-readsb.o io-writesb.o io-readsl.o io-writesl.o \
|
||||
- call_with_stack.o
|
||||
+ call_with_stack.o divdi3.o
|
||||
|
||||
mmu-y := clear_user.o copy_page.o getuser.o putuser.o
|
||||
|
Loading…
Reference in a new issue