From 9dfa73e4fc85c0c33f921974d011ede59aba0276 Mon Sep 17 00:00:00 2001 From: Rod Whitby Date: Sat, 30 Jun 2007 13:19:16 +0000 Subject: ixp4xx-kernel: Removed obsolete kernel versions --- packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty | 0 .../2.6.15/00-memory-h-page-shift.patch | 91 - .../2.6.15/10-mtdpart-redboot-fis-byteswap.patch | 70 - .../11-mtdpart-redboot-config-byteswap.patch | 74 - .../2.6.15/15-jffs2-endian-config.patch | 80 - .../linux/ixp4xx-kernel/2.6.15/40-rtc-class.patch | 3208 ---- .../ixp4xx-kernel/2.6.15/45-eeprom-notifier.patch | 184 - .../2.6.15/48-setup-byteswap-cmdline.patch | 48 - .../ixp4xx-kernel/2.6.15/50-nas100d-arch.patch | 453 - .../ixp4xx-kernel/2.6.15/55-rtc-pcf8563.patch | 174 - .../ixp4xx-kernel/2.6.15/60-ixp4xx-beeper.patch | 238 - .../ixp4xx-kernel/2.6.15/60-nas100d-i2c.patch | 531 - .../ixp4xx-kernel/2.6.15/60-nas100d-ide.patch | 155 - .../ixp4xx-kernel/2.6.15/60-nas100d-rtc.patch | 21 - .../ixp4xx-kernel/2.6.15/65-loft-config.patch | 84 - .../ixp4xx-kernel/2.6.15/81-nslu2-power.patch | 12 - .../ixp4xx-kernel/2.6.15/82-nas100d-power.patch | 12 - packages/linux/ixp4xx-kernel/2.6.15/85-timer.patch | 280 - .../linux/ixp4xx-kernel/2.6.15/91-maclist.patch | 570 - .../ixp4xx-kernel/2.6.15/92-nas100d-maclist.patch | 72 - .../ixp4xx-kernel/2.6.15/92-nslu2-maclist.patch | 80 - .../ixp4xx-kernel/2.6.15/93-loft-maclist.patch | 96 - .../ixp4xx-kernel/2.6.15/94-nas100d-setup.patch | 71 - .../ixp4xx-kernel/2.6.15/94-nslu2-setup.patch | 72 - .../ixp4xx-kernel/2.6.15/95-ixp4xx-leds.patch | 260 - .../ixp4xx-kernel/2.6.15/950-leds-timer.patch | 151 - .../2.6.15/951-ixp4xx-leds-cpu-activity.patch | 592 - .../linux/ixp4xx-kernel/2.6.15/96-loft-leds.patch | 62 - .../ixp4xx-kernel/2.6.15/96-nas100d-leds.patch | 78 - .../linux/ixp4xx-kernel/2.6.15/96-nslu2-leds.patch | 89 - packages/linux/ixp4xx-kernel/2.6.15/defconfig | 1696 -- packages/linux/ixp4xx-kernel/2.6.16/.mtn2git_empty | 0 .../2.6.16/06-remove-extraversion.patch | 11 - .../ixp4xx-kernel/2.6.16/10-ixp4xx-fix-irq.patch | 25 - .../11-mtdpart-redboot-config-byteswap.patch | 74 - .../2.6.16/15-jffs2-endian-config.patch | 85 - .../linux/ixp4xx-kernel/2.6.16/40-rtc-class.patch | 5846 ------ .../2.6.16/45-eeprom-new-notifier.patch | 209 - .../2.6.16/48-setup-byteswap-cmdline.patch | 51 - .../ixp4xx-kernel/2.6.16/50-hwmon-ad741x.patch | 378 - .../ixp4xx-kernel/2.6.16/65-loft-config.patch | 90 - .../linux/ixp4xx-kernel/2.6.16/75-dsmg600.patch | 353 - .../2.6.16/83-nas100d-memory-fixup.patch | 66 - .../ixp4xx-kernel/2.6.16/84-nas100d-cmdline.patch | 31 - packages/linux/ixp4xx-kernel/2.6.16/85-timer.patch | 280 - .../linux/ixp4xx-kernel/2.6.16/91-maclist.patch | 573 - .../ixp4xx-kernel/2.6.16/92-nas100d-mac.patch | 84 - .../ixp4xx-kernel/2.6.16/92-nas100d-maclist.patch | 77 - .../linux/ixp4xx-kernel/2.6.16/92-nslu2-mac.patch | 87 - .../ixp4xx-kernel/2.6.16/92-nslu2-maclist.patch | 81 - .../linux/ixp4xx-kernel/2.6.16/94-loft-setup.patch | 214 - .../ixp4xx-kernel/2.6.16/94-nslu2-setup.patch | 74 - .../2.6.16/951-ixp4xx-leds-cpu-activity.patch | 596 - .../ixp4xx-kernel/2.6.16/96-nas100d-leds.patch | 82 - .../linux/ixp4xx-kernel/2.6.16/96-nslu2-leds.patch | 89 - .../ixp4xx-kernel/2.6.16/96-pata-ixp4xx.patch | 299 - .../ixp4xx-kernel/2.6.16/97-ds101-buttons.patch | 122 - .../linux/ixp4xx-kernel/2.6.16/97-ds101-doc.patch | 43 - .../ixp4xx-kernel/2.6.16/97-ds101-includes.patch | 120 - .../linux/ixp4xx-kernel/2.6.16/97-ds101-pci.patch | 72 - .../ixp4xx-kernel/2.6.16/97-ds101-setup.patch | 290 - packages/linux/ixp4xx-kernel/2.6.16/97-ds101.patch | 457 - .../ixp4xx-kernel/2.6.16/copypage-xscale.patch | 21 - packages/linux/ixp4xx-kernel/2.6.16/defconfig | 1771 -- .../linux/ixp4xx-kernel/2.6.16/leds-class.patch | 1862 -- .../ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch | 13671 -------------- .../ixp4xx-kernel/2.6.16/patch-2.6.16-rc6-ide1 | 18684 ------------------- packages/linux/ixp4xx-kernel/2.6.19/series | 47 - packages/linux/ixp4xx-kernel/2.6.20/series | 43 - packages/linux/ixp4xx-kernel_2.6.15.3.bb | 59 - packages/linux/ixp4xx-kernel_2.6.16.bb | 48 - packages/linux/ixp4xx-kernel_2.6.17.bb | 38 - packages/linux/ixp4xx-kernel_2.6.19.bb | 1 - 73 files changed, 56708 deletions(-) delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/00-memory-h-page-shift.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/10-mtdpart-redboot-fis-byteswap.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/11-mtdpart-redboot-config-byteswap.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/15-jffs2-endian-config.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/40-rtc-class.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/45-eeprom-notifier.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/48-setup-byteswap-cmdline.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/50-nas100d-arch.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/55-rtc-pcf8563.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/60-ixp4xx-beeper.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/60-nas100d-i2c.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/60-nas100d-ide.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/60-nas100d-rtc.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/65-loft-config.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/81-nslu2-power.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/82-nas100d-power.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/85-timer.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/91-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/92-nas100d-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/92-nslu2-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/93-loft-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/94-nas100d-setup.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/94-nslu2-setup.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/95-ixp4xx-leds.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/950-leds-timer.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/951-ixp4xx-leds-cpu-activity.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/96-loft-leds.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/96-nas100d-leds.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/96-nslu2-leds.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.15/defconfig delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/.mtn2git_empty delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/06-remove-extraversion.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/10-ixp4xx-fix-irq.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/11-mtdpart-redboot-config-byteswap.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/15-jffs2-endian-config.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/40-rtc-class.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/45-eeprom-new-notifier.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/48-setup-byteswap-cmdline.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/50-hwmon-ad741x.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/65-loft-config.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/75-dsmg600.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/83-nas100d-memory-fixup.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/84-nas100d-cmdline.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/85-timer.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/91-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/92-nas100d-mac.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/92-nas100d-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/92-nslu2-mac.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/92-nslu2-maclist.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/94-loft-setup.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/94-nslu2-setup.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/951-ixp4xx-leds-cpu-activity.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/96-nas100d-leds.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/96-nslu2-leds.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/96-pata-ixp4xx.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/97-ds101-buttons.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/97-ds101-doc.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/97-ds101-includes.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/97-ds101-pci.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/97-ds101-setup.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/97-ds101.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/copypage-xscale.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/defconfig delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/leds-class.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch delete mode 100644 packages/linux/ixp4xx-kernel/2.6.16/patch-2.6.16-rc6-ide1 delete mode 100644 packages/linux/ixp4xx-kernel/2.6.19/series delete mode 100644 packages/linux/ixp4xx-kernel/2.6.20/series delete mode 100644 packages/linux/ixp4xx-kernel_2.6.15.3.bb delete mode 100644 packages/linux/ixp4xx-kernel_2.6.16.bb delete mode 100644 packages/linux/ixp4xx-kernel_2.6.17.bb diff --git a/packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty b/packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/linux/ixp4xx-kernel/2.6.15/00-memory-h-page-shift.patch b/packages/linux/ixp4xx-kernel/2.6.15/00-memory-h-page-shift.patch deleted file mode 100644 index 30d34952d5..0000000000 --- a/packages/linux/ixp4xx-kernel/2.6.15/00-memory-h-page-shift.patch +++ /dev/null @@ -1,91 +0,0 @@ -http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=3218/1 - -PAGE_SHIFT is undeclared in include/asm-arm/arch-ixp4xx/memory.h, identified by the following kernel compilation error: - -CC [M] sound/core/memory.o -In file included from include/asm/memory.h:27, -from include/asm/io.h:28, -from sound/core/memory.c:24: -include/asm/arch/memory.h: In function `__arch_adjust_zones': -include/asm/arch/memory.h:28: error: `PAGE_SHIFT' undeclared (first use -in this function) - -This patch replaces my previous attempt at fixing this problem (Patch 3214/1) and is based on the following feedback: - -Russell King wrote: -> The error you see came up on SA1100. The best solution was to move -> the __arch_adjust_zones() function out of line. I suggest ixp4xx -> does the same. - -I have moved the function out of line into arch/arm/mach-ixp4xx/common-pci.c as suggested. - -Signed-off-by: Rod Whitby - ---- linux-2.6.15-rc7/include/asm-arm/arch-ixp4xx/memory.h~ 2005-12-30 05:18:27.000000000 +1030 -+++ linux-2.6.15-rc7/include/asm-arm/arch-ixp4xx/memory.h 2005-12-30 05:36:04.000000000 +1030 -@@ -16,31 +16,10 @@ - - #ifndef __ASSEMBLY__ - --/* -- * Only first 64MB of memory can be accessed via PCI. -- * We use GFP_DMA to allocate safe buffers to do map/unmap. -- * This is really ugly and we need a better way of specifying -- * DMA-capable regions of memory. -- */ --static inline void __arch_adjust_zones(int node, unsigned long *zone_size, -- unsigned long *zhole_size) --{ -- unsigned int sz = SZ_64M >> PAGE_SHIFT; -- -- /* -- * Only adjust if > 64M on current system -- */ -- if (node || (zone_size[0] <= sz)) -- return; -- -- zone_size[1] = zone_size[0] - sz; -- zone_size[0] = sz; -- zhole_size[1] = zhole_size[0]; -- zhole_size[0] = 0; --} -+void ixp4xx_adjust_zones(int node, unsigned long *size, unsigned long *holes); - - #define arch_adjust_zones(node, size, holes) \ -- __arch_adjust_zones(node, size, holes) -+ ixp4xx_adjust_zones(node, size, holes) - - #define ISA_DMA_THRESHOLD (SZ_64M - 1) - ---- linux-2.6.15-rc7/arch/arm/mach-ixp4xx/common-pci.c~ 2005-12-30 05:16:03.000000000 +1030 -+++ linux-2.6.15-rc7/arch/arm/mach-ixp4xx/common-pci.c 2005-12-30 05:43:55.000000000 +1030 -@@ -341,6 +341,29 @@ int dma_needs_bounce(struct device *dev, - return (dev->bus == &pci_bus_type ) && ((dma_addr + size) >= SZ_64M); - } - -+/* -+ * Only first 64MB of memory can be accessed via PCI. -+ * We use GFP_DMA to allocate safe buffers to do map/unmap. -+ * This is really ugly and we need a better way of specifying -+ * DMA-capable regions of memory. -+ */ -+void __init ixp4xx_adjust_zones(int node, unsigned long *zone_size, -+ unsigned long *zhole_size) -+{ -+ unsigned int sz = SZ_64M >> PAGE_SHIFT; -+ -+ /* -+ * Only adjust if > 64M on current system -+ */ -+ if (node || (zone_size[0] <= sz)) -+ return; -+ -+ zone_size[1] = zone_size[0] - sz; -+ zone_size[0] = sz; -+ zhole_size[1] = zhole_size[0]; -+ zhole_size[0] = 0; -+} -+ - void __init ixp4xx_pci_preinit(void) - { - unsigned long processor_id; diff --git a/packages/linux/ixp4xx-kernel/2.6.15/10-mtdpart-redboot-fis-byteswap.patch b/packages/linux/ixp4xx-kernel/2.6.15/10-mtdpart-redboot-fis-byteswap.patch deleted file mode 100644 index 3fa0535abf..0000000000 --- a/packages/linux/ixp4xx-kernel/2.6.15/10-mtdpart-redboot-fis-byteswap.patch +++ /dev/null @@ -1,70 +0,0 @@ -drivers/mtd/redboot.c: recognise a foreign byte sex partition table - -The RedBoot boot loader writes flash partition tables containing native -byte sex 32 bit values. When booting an opposite byte sex kernel (e.g. an -LE kernel from BE RedBoot) the current MTD driver fails to handle the -partition table and therefore is unable to generate the correct partition -map for the flash. - -The patch recognises that the FIS directory (the partition table) is -byte-reversed by examining the partition table size, which is known to be -one erase block (this is an assumption made elsewhere in redboot.c). If -the size matches the erase block after byte swapping the value then -byte-reversal is assumed, if not no further action is taken. The patched -code is fail safe; should redboot.c be changed to support a partition table -with a modified size field the test will fail and the partition table will -be assumed to have the host byte sex. - -If byte-reversal is detected the patch byte swaps the remainder of the 32 -bit fields in the copy of the table; this copy is then used to set up the -MTD partition map. - -Signed-off-by: John Bowler -Signed-off-by: Andrew Morton -Modified slightly and -Signed-off-by: David Woodhouse - -Index: drivers/mtd/redboot.c -=================================================================== -RCS file: /home/cvs/mtd/drivers/mtd/redboot.c,v -retrieving revision 1.18 -retrieving revision 1.19 -diff -u -p -r1.18 -r1.19 ---- linux-2.6.15/drivers/mtd/redboot.c 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.15/drivers/mtd/redboot.c 1970-01-01 00:00:00.000000000 +0000 -@@ -89,8 +89,32 @@ static int parse_redboot_partitions(stru - i = numslots; - break; - } -- if (!memcmp(buf[i].name, "FIS directory", 14)) -+ if (!memcmp(buf[i].name, "FIS directory", 14)) { -+ /* This is apparently the FIS directory entry for the -+ * FIS directory itself. The FIS directory size is -+ * one erase block; if the buf[i].size field is -+ * swab32(erasesize) then we know we are looking at -+ * a byte swapped FIS directory - swap all the entries! -+ * (NOTE: this is 'size' not 'data_length'; size is -+ * the full size of the entry.) -+ */ -+ if (swab32(buf[i].size) == master->erasesize) { -+ int j; -+ for (j = 0; j < numslots && buf[j].name[0] != 0xff; ++j) { -+ /* The unsigned long fields were written with the -+ * wrong byte sex, name and pad have no byte sex. -+ */ -+ swab32s(&buf[j].flash_base); -+ swab32s(&buf[j].mem_base); -+ swab32s(&buf[j].size); -+ swab32s(&buf[j].entry_point); -+ swab32s(&buf[j].data_length); -+ swab32s(&buf[j].desc_cksum); -+ swab32s(&buf[j].file_cksum); -+ } -+ } - break; -+ } - } - if (i == numslots) { - /* Didn't find it */ - - diff --git a/packages/linux/ixp4xx-kernel/2.6.15/11-mtdpart-redboot-config-byteswap.patch b/packages/linux/ixp4xx-kernel/2.6.15/11-mtdpart-redboot-config-byteswap.patch deleted file mode 100644 index e258567462..0000000000 --- a/packages/linux/ixp4xx-kernel/2.6.15/11-mtdpart-redboot-config-byteswap.patch +++ /dev/null @@ -1,74 +0,0 @@ -A more robust test for swapped RedBoot FIS directory partitions. This -changes the test to check the flash_base value for the FIS directory, -since we know where the FIS directory base is we can work out whether -the flash address stored in the directory itself is byte swapped under -most circumstances. If the value is 0 the directory is at the start -of the flash and the test fails. In this case the fallback is to use -the original test made slightly more robust. - -Signed-off-by: John Bowler - ---- linux-2.6.15/drivers/mtd/redboot.c 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.15/drivers/mtd/redboot.c 1970-01-01 00:00:00.000000000 +0000 -@@ -91,14 +91,41 @@ static int parse_redboot_partitions(stru - } - if (!memcmp(buf[i].name, "FIS directory", 14)) { - /* This is apparently the FIS directory entry for the -- * FIS directory itself. The FIS directory size is -- * one erase block; if the buf[i].size field is -- * swab32(erasesize) then we know we are looking at -- * a byte swapped FIS directory - swap all the entries! -- * (NOTE: this is 'size' not 'data_length'; size is -- * the full size of the entry.) -+ * FIS directory itself. To discover whether the entries -+ * in this are native byte sex or byte swapped look at -+ * the flash_base field - we know the FIS directory is -+ * at 'offset' within the flash. - */ -- if (swab32(buf[i].size) == master->erasesize) { -+ int maybe_native, maybe_swapped; -+ if (fis_origin != 0) { -+ maybe_native = -+ buf[i].flash_base == fis_origin + offset; -+ maybe_swapped = -+ swab32(buf[i].flash_base) == fis_origin + offset; -+ } else if (offset != 0 || buf[i].flash_base != 0) { -+ maybe_native = -+ (buf[i].flash_base & (master->size-1)) == offset; -+ maybe_swapped = -+ (swab32(buf[i].flash_base) & (master->size-1)) == offset; -+ } else { -+ /* The FIS directory is at the start of the flash and -+ * the 'flash_base' field is 0. The critical case is when -+ * we are booting off this flash, but then we don't expect -+ * this because the boot loader is pretty much always at -+ * the start! Since the FIS directory is always less than -+ * or equal to one erase block do the following: -+ */ -+ maybe_native = buf[i].size <= master->erasesize; -+ maybe_swapped = swab32(buf[i].size) <= master->erasesize; -+ } -+ -+ if (maybe_native && maybe_swapped) -+ printk(KERN_WARNING "RedBoot directory 0x%lx(0x%lx) assumed native\n", -+ buf[i].flash_base, buf[i].size); -+ else if (!maybe_native && !maybe_swapped) -+ printk(KERN_ERR "RedBoot directory 0x%lx(0x%lx) forced native\n", -+ buf[i].flash_base, buf[i].size); -+ else if (maybe_swapped) { - int j; - for (j = 0; j < numslots && buf[j].name[0] != 0xff; ++j) { - /* The unsigned long fields were written with the -@@ -112,7 +139,11 @@ static int parse_redboot_partitions(stru - swab32s(&buf[j].desc_cksum); - swab32s(&buf[j].file_cksum); - } -- } -+ printk(KERN_NOTICE "RedBoot directory 0x%lx(0x%lx) swapped\n", -+ buf[i].flash_base, buf[i].size); -+ } else -+ printk(KERN_NOTICE "RedBoot directory 0x%lx(0x%lx) native\n", -+ buf[i].flash_base, buf[i].size); - break; - } - } diff --git a/packages/linux/ixp4xx-kernel/2.6.15/15-jffs2-endian-config.patch b/packages/linux/ixp4xx-kernel/2.6.15/15-jffs2-endian-config.patch deleted file mode 100644 index 76e9c7e439..0000000000 --- a/packages/linux/ixp4xx-kernel/2.6.15/15-jffs2-endian-config.patch +++ /dev/null @@ -1,80 +0,0 @@ -This patch allows the endianness of the JFSS2 filesystem to be -specified by config options. - -It defaults to native-endian (the previously hard-coded option). - -Some architectures (in particular, the NSLU2) benefit from having a -single known endianness of JFFS2 filesystem (for data, not -executables) independent of the endianness of the processor (ARM -processors can be switched to either endianness at run-time). - -Signed-off-by: Rod Whitby - ---- linux-2.6.15/fs/Kconfig~ 2006-01-03 13:51:10.000000000 +1030 -+++ linux-2.6.15/fs/Kconfig 2006-01-05 01:35:36.000000000 +1030 -@@ -1132,6 +1132,31 @@ config JFFS2_CMODE_SIZE - - endchoice - -+choice -+ prompt "JFFS2 endianness" -+ default JFFS2_NATIVE_ENDIAN -+ depends on JFFS2_FS -+ help -+ You can set here the default endianness of JFFS2 from -+ the available options. Don't touch if unsure. -+ -+config JFFS2_NATIVE_ENDIAN -+ bool "native endian" -+ help -+ Uses a native endian bytestream. -+ -+config JFFS2_BIG_ENDIAN -+ bool "big endian" -+ help -+ Uses a big endian bytestream. -+ -+config JFFS2_LITTLE_ENDIAN -+ bool "little endian" -+ help -+ Uses a little endian bytestream. -+ -+endchoice -+ - config CRAMFS - tristate "Compressed ROM file system support (cramfs)" - select ZLIB_INFLATE ---- linux-2.6.15/fs/jffs2/nodelist.h~ 2006-01-05 01:37:06.000000000 +1030 -+++ linux-2.6.15/fs/jffs2/nodelist.h 2006-01-05 01:37:54.000000000 +1030 -@@ -29,12 +29,10 @@ - #include "os-linux.h" - #endif - --#define JFFS2_NATIVE_ENDIAN -- - /* Note we handle mode bits conversion from JFFS2 (i.e. Linux) to/from - whatever OS we're actually running on here too. */ - --#if defined(JFFS2_NATIVE_ENDIAN) -+#if defined(CONFIG_JFFS2_NATIVE_ENDIAN) - #define cpu_to_je16(x) ((jint16_t){x}) - #define cpu_to_je32(x) ((jint32_t){x}) - #define cpu_to_jemode(x) ((jmode_t){os_to_jffs2_mode(x)}) -@@ -42,7 +40,7 @@ - #define je16_to_cpu(x) ((x).v16) - #define je32_to_cpu(x) ((x).v32) - #define jemode_to_cpu(x) (jffs2_to_os_mode((x).m)) --#elif defined(JFFS2_BIG_ENDIAN) -+#elif defined(CONFIG_JFFS2_BIG_ENDIAN) - #define cpu_to_je16(x) ((jint16_t){cpu_to_be16(x)}) - #define cpu_to_je32(x) ((jint32_t){cpu_to_be32(x)}) - #define cpu_to_jemode(x) ((jmode_t){cpu_to_be32(os_to_jffs2_mode(x))}) -@@ -50,7 +48,7 @@ - #define je16_to_cpu(x) (be16_to_cpu(x.v16)) - #define je32_to_cpu(x) (be32_to_cpu(x.v32)) - #define jemode_to_cpu(x) (be32_to_cpu(jffs2_to_os_mode((x).m))) --#elif defined(JFFS2_LITTLE_ENDIAN) -+#elif defined(CONFIG_JFFS2_LITTLE_ENDIAN) - #define cpu_to_je16(x) ((jint16_t){cpu_to_le16(x)}) - #define cpu_to_je32(x) ((jint32_t){cpu_to_le32(x)}) - #define cpu_to_jemode(x) ((jmode_t){cpu_to_le32(os_to_jffs2_mode(x))}) diff --git a/packages/linux/ixp4xx-kernel/2.6.15/40-rtc-class.patch b/packages/linux/ixp4xx-kernel/2.6.15/40-rtc-class.patch deleted file mode 100644 index 3b36813564..0000000000 --- a/packages/linux/ixp4xx-kernel/2.6.15/40-rtc-class.patch +++ /dev/null @@ -1,3208 +0,0 @@ ---- linux-nslu2.orig/include/linux/rtc.h 2006-01-20 12:04:18.000000000 +0100 -+++ linux-nslu2/include/linux/rtc.h 2006-01-20 20:23:24.000000000 +0100 -@@ -91,8 +91,91 @@ struct rtc_pll_info { - #define RTC_PLL_GET _IOR('p', 0x11, struct rtc_pll_info) /* Get PLL correction */ - #define RTC_PLL_SET _IOW('p', 0x12, struct rtc_pll_info) /* Set PLL correction */ - -+/* interrupt flags */ -+#define RTC_IRQF 0x80 /* any of the following is active */ -+#define RTC_PF 0x40 -+#define RTC_AF 0x20 -+#define RTC_UF 0x10 -+ - #ifdef __KERNEL__ - -+#include -+#include -+#include -+#include -+ -+struct rtc_class_ops { -+ int (*open)(struct device *); -+ void (*release)(struct device *); -+ int (*ioctl)(struct device *, unsigned int, unsigned long); -+ int (*read_time)(struct device *, struct rtc_time *); -+ int (*set_time)(struct device *, struct rtc_time *); -+ int (*read_alarm)(struct device *, struct rtc_wkalrm *); -+ int (*set_alarm)(struct device *, struct rtc_wkalrm *); -+ int (*proc)(struct device *, struct seq_file *); -+ int (*set_mmss)(struct device *, unsigned long secs); -+ int (*irq_set_state)(struct device *, int enabled); -+ int (*irq_set_freq)(struct device *, int freq); -+}; -+ -+#define RTC_DEVICE_NAME_SIZE 20 -+struct rtc_task; -+ -+struct rtc_device -+{ -+ int id; -+ struct module *owner; -+ struct class_device class_dev; -+ struct semaphore ops_lock; -+ struct rtc_class_ops *ops; -+ char name[RTC_DEVICE_NAME_SIZE]; -+ -+ struct cdev char_dev; -+ struct semaphore char_sem; -+ -+ unsigned long irq_data; -+ spinlock_t irq_lock; -+ wait_queue_head_t irq_queue; -+ struct fasync_struct *async_queue; -+ -+ spinlock_t irq_task_lock; -+ struct rtc_task *irq_task; -+ int irq_freq; -+}; -+#define to_rtc_device(d) container_of(d, struct rtc_device, class_dev) -+ -+extern struct rtc_device *rtc_device_register(char *name, -+ struct device *dev, -+ struct rtc_class_ops *ops, -+ struct module *owner); -+extern void rtc_device_unregister(struct rtc_device *rdev); -+extern int rtc_interface_register(struct class_interface *intf); -+ -+extern int rtc_month_days(unsigned int month, unsigned int year); -+extern int rtc_valid_tm(struct rtc_time *tm); -+extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time); -+extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm); -+ -+extern int rtc_read_time(struct class_device *class_dev, struct rtc_time *tm); -+extern int rtc_set_time(struct class_device *class_dev, struct rtc_time *tm); -+extern int rtc_read_alarm(struct class_device *class_dev, -+ struct rtc_wkalrm *alrm); -+extern int rtc_set_alarm(struct class_device *class_dev, -+ struct rtc_wkalrm *alrm); -+extern void rtc_update_irq(struct class_device *class_dev, -+ unsigned long num, unsigned long events); -+ -+extern struct class_device *rtc_open(char *name); -+extern void rtc_close(struct class_device *class_dev); -+extern int rtc_irq_register(struct class_device *class_dev, -+ struct rtc_task *task); -+extern void rtc_irq_unregister(struct class_device *class_dev, -+ struct rtc_task *task); -+extern int rtc_irq_set_state(struct class_device *class_dev, -+ struct rtc_task *task, int enabled); -+extern int rtc_irq_set_freq(struct class_device *class_dev, -+ struct rtc_task *task, int freq); -+ - typedef struct rtc_task { - void (*func)(void *private_data); - void *private_data; ---- linux-nslu2.orig/drivers/Kconfig 2006-01-20 12:04:18.000000000 +0100 -+++ linux-nslu2/drivers/Kconfig 2006-01-20 20:23:24.000000000 +0100 -@@ -66,4 +66,6 @@ source "drivers/infiniband/Kconfig" - - source "drivers/sn/Kconfig" - -+source "drivers/rtc/Kconfig" -+ - endmenu ---- linux-nslu2.orig/drivers/Makefile 2006-01-20 12:04:18.000000000 +0100 -+++ linux-nslu2/drivers/Makefile 2006-01-20 20:23:24.000000000 +0100 -@@ -54,6 +54,7 @@ obj-$(CONFIG_USB_GADGET) += usb/gadget/ - obj-$(CONFIG_GAMEPORT) += input/gameport/ - obj-$(CONFIG_INPUT) += input/ - obj-$(CONFIG_I2O) += message/ -+obj-y += rtc/ - obj-$(CONFIG_I2C) += i2c/ - obj-$(CONFIG_W1) += w1/ - obj-$(CONFIG_HWMON) += hwmon/ ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/class.c 2006-01-20 20:23:24.000000000 +0100 -@@ -0,0 +1,143 @@ -+/* -+ * RTC subsystem, base class -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * class skeleton from drivers/hwmon/hwmon.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; version 2 of the License. -+*/ -+ -+#include -+#include -+#include -+#include -+ -+static DEFINE_IDR(rtc_idr); -+static DECLARE_MUTEX(idr_lock); -+struct class *rtc_class; -+ -+static void rtc_device_release(struct class_device *class_dev) -+{ -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ down(&idr_lock); -+ idr_remove(&rtc_idr, rtc->id); -+ up(&idr_lock); -+ kfree(rtc); -+} -+ -+/** -+ * rtc_device_register - register w/ RTC class -+ * @dev: the device to register -+ * -+ * rtc_device_unregister() must be called when the class device is no -+ * longer needed. -+ * -+ * Returns the pointer to the new struct class device. -+ */ -+struct rtc_device *rtc_device_register(char *name, struct device *dev, -+ struct rtc_class_ops *ops, -+ struct module *owner) -+{ -+ struct rtc_device *rtc; -+ int id, err; -+ -+ if (idr_pre_get(&rtc_idr, GFP_KERNEL) == 0) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ -+ -+ down(&idr_lock); -+ err = idr_get_new(&rtc_idr, NULL, &id); -+ up(&idr_lock); -+ -+ if (err < 0) -+ goto exit; -+ -+ id = id & MAX_ID_MASK; -+ -+ if ((rtc = kzalloc(sizeof(struct rtc_device), GFP_KERNEL)) == NULL) { -+ err = -ENOMEM; -+ goto exit_idr; -+ } -+ -+ rtc->id = id; -+ rtc->ops = ops; -+ rtc->owner = owner; -+ rtc->class_dev.dev = dev; -+ rtc->class_dev.class = rtc_class; -+ rtc->class_dev.release = rtc_device_release; -+ -+ init_MUTEX(&rtc->ops_lock); -+ spin_lock_init(&rtc->irq_lock); -+ spin_lock_init(&rtc->irq_task_lock); -+ -+ strlcpy(rtc->name, name, RTC_DEVICE_NAME_SIZE); -+ snprintf(rtc->class_dev.class_id, BUS_ID_SIZE, "rtc%d", id); -+ -+ if ((err = class_device_register(&rtc->class_dev))) -+ goto exit_kfree; -+ -+ dev_info(dev, "rtc core: registered %s as %s\n", -+ rtc->name, rtc->class_dev.class_id); -+ -+ return rtc; -+ -+exit_kfree: -+ kfree(rtc); -+ -+exit_idr: -+ idr_remove(&rtc_idr, id); -+ -+exit: -+ return ERR_PTR(err); -+} -+EXPORT_SYMBOL_GPL(rtc_device_register); -+ -+ -+/** -+ * rtc_device_unregister - removes the previously registered RTC class device -+ * -+ * @rtc: the RTC class device to destroy -+ */ -+void rtc_device_unregister(struct rtc_device *rtc) -+{ -+ down(&rtc->ops_lock); -+ rtc->ops = NULL; -+ up(&rtc->ops_lock); -+ class_device_unregister(&rtc->class_dev); -+} -+EXPORT_SYMBOL_GPL(rtc_device_unregister); -+ -+int rtc_interface_register(struct class_interface *intf) -+{ -+ intf->class = rtc_class; -+ return class_interface_register(intf); -+} -+EXPORT_SYMBOL_GPL(rtc_interface_register); -+ -+static int __init rtc_init(void) -+{ -+ rtc_class = class_create(THIS_MODULE, "rtc"); -+ if (IS_ERR(rtc_class)) { -+ printk(KERN_ERR "%s: couldn't create class\n", __FILE__); -+ return PTR_ERR(rtc_class); -+ } -+ return 0; -+} -+ -+static void __exit rtc_exit(void) -+{ -+ class_destroy(rtc_class); -+} -+ -+module_init(rtc_init); -+module_exit(rtc_exit); -+ -+MODULE_AUTHOR("Alessandro Zummo "); -+MODULE_DESCRIPTION("RTC class support"); -+MODULE_LICENSE("GPL"); ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/Kconfig 2006-01-20 21:26:12.000000000 +0100 -@@ -0,0 +1,121 @@ -+# -+# RTC class/drivers configuration -+# -+ -+menu "Real Time Clock" -+ -+config RTC_CLASS -+ tristate "RTC class" -+ depends on EXPERIMENTAL -+ default y -+ help -+ Generic RTC class support. If you say yes here, you will -+ be allowed to plug one or more RTCs to your system. You will -+ probably want to enable one of more of the interfaces below. -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-class. -+ -+config RTC_HCTOSYS -+ bool "Set system time from RTC on startup" -+ depends on RTC_CLASS = y -+ default y -+ help -+ If you say yes here, the system time will be set using -+ the value read from the specified RTC device. This is useful -+ in order to avoid unnecessary fschk runs. -+ -+config RTC_HCTOSYS_DEVICE -+ string "The RTC to read the time from" -+ depends on RTC_HCTOSYS = y -+ default "rtc0" -+ help -+ The RTC device that will be used as the source for -+ the system time, usually rtc0. -+ -+comment "RTC interfaces" -+ depends on RTC_CLASS -+ -+config RTC_INTF_SYSFS -+ tristate "sysfs" -+ depends on RTC_CLASS && SYSFS -+ default RTC_CLASS -+ help -+ Say yes here if you want to use your RTC using the sysfs -+ interface, /sys/class/rtc/rtcX . -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-sysfs. -+ -+config RTC_INTF_PROC -+ tristate "proc" -+ depends on RTC_CLASS && PROC_FS -+ default RTC_CLASS -+ help -+ Say yes here if you want to use your RTC using the proc -+ interface, /proc/driver/rtc . -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-proc. -+ -+config RTC_INTF_DEV -+ tristate "dev" -+ depends on RTC_CLASS -+ default RTC_CLASS -+ help -+ Say yes here if you want to use your RTC using the dev -+ interface, /dev/rtc . -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-dev. -+ -+comment "RTC drivers" -+ depends on RTC_CLASS -+ -+config RTC_DRV_X1205 -+ tristate "Xicor/Intersil X1205 RTC chip" -+ depends on RTC_CLASS && I2C -+ help -+ If you say yes here you get support for the -+ Xicor/Intersil X1205 RTC chip. -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-x1205. -+ -+config RTC_DRV_DS1672 -+ tristate "Dallas/Maxim DS1672" -+ depends on RTC_CLASS && I2C -+ help -+ If you say yes here you get support for the -+ Dallas/Maxim DS1672 timekeeping chip. -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-ds1672. -+ -+config RTC_DRV_PCF8563 -+ tristate "Philips PCF8563/Epson RTC8564" -+ depends on RTC_CLASS && I2C -+ help -+ If you say yes here you get support for the -+ Philips PCF8563 RTC chip. The Epson RTC8564 -+ should work as well. -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-pcf8563. -+ -+config RTC_DRV_TEST -+ tristate "Test driver/device" -+ depends on RTC_CLASS -+ help -+ If you say yes here you get support for the -+ RTC test driver. It's a software RTC which can be -+ used to test the RTC subsystem APIs. It gets -+ the time from the system clock. -+ You want this driver only if you are doing development -+ on the RTC subsystem. Please read the source code -+ for further details. -+ -+ This driver can also be built as a module. If so, the module -+ will be called rtc-test. -+ -+endmenu ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/Makefile 2006-01-20 21:26:12.000000000 +0100 -@@ -0,0 +1,17 @@ -+# -+# Makefile for RTC class/drivers. -+# -+ -+obj-y += utils.o -+obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o -+obj-$(CONFIG_RTC_CLASS) += rtc-core.o -+rtc-core-y := class.o interface.o -+obj-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o -+obj-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o -+obj-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o -+ -+obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o -+obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o -+obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o -+obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o -+ ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/interface.c 2006-01-20 21:26:14.000000000 +0100 -@@ -0,0 +1,232 @@ -+/* -+ * RTC subsystem, interface functions -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * based on arch/arm/common/rtctime.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; version 2 of the License. -+*/ -+ -+#include -+ -+extern struct class *rtc_class; -+ -+int rtc_read_time(struct class_device *class_dev, struct rtc_time *tm) -+{ -+ int err; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ if ((err = down_interruptible(&rtc->ops_lock))) -+ return err; -+ -+ if (!rtc->ops) -+ err = -ENODEV; -+ else if (!rtc->ops->read_time) -+ err = -EINVAL; -+ else { -+ memset(tm, 0, sizeof(struct rtc_time)); -+ err = rtc->ops->read_time(class_dev->dev, tm); -+ } -+ -+ up(&rtc->ops_lock); -+ return err; -+} -+EXPORT_SYMBOL(rtc_read_time); -+ -+int rtc_set_time(struct class_device *class_dev, struct rtc_time *tm) -+{ -+ int err; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ if ((err = rtc_valid_tm(tm)) != 0) -+ return err; -+ -+ if ((err = down_interruptible(&rtc->ops_lock))) -+ return err; -+ -+ if (!rtc->ops) -+ err = -ENODEV; -+ else if (!rtc->ops->set_time) -+ err = -EINVAL; -+ else -+ err = rtc->ops->set_time(class_dev->dev, tm); -+ -+ up(&rtc->ops_lock); -+ return err; -+} -+EXPORT_SYMBOL(rtc_set_time); -+ -+int rtc_read_alarm(struct class_device *class_dev, struct rtc_wkalrm *alarm) -+{ -+ int err; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ if ((err = down_interruptible(&rtc->ops_lock))) -+ return err; -+ -+ if (rtc->ops == NULL) -+ err = -ENODEV; -+ else if (!rtc->ops->read_alarm) -+ err = -EINVAL; -+ else { -+ memset(alarm, 0, sizeof(struct rtc_wkalrm)); -+ err = rtc->ops->read_alarm(class_dev->dev, alarm); -+ } -+ -+ up(&rtc->ops_lock); -+ return err; -+} -+EXPORT_SYMBOL(rtc_read_alarm); -+ -+int rtc_set_alarm(struct class_device *class_dev, struct rtc_wkalrm *alarm) -+{ -+ int err; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ if ((err = down_interruptible(&rtc->ops_lock))) -+ return err; -+ -+ if (!rtc->ops) -+ err = -ENODEV; -+ else if (!rtc->ops->set_alarm) -+ err = -EINVAL; -+ else -+ err = rtc->ops->set_alarm(class_dev->dev, alarm); -+ -+ up(&rtc->ops_lock); -+ return err; -+} -+EXPORT_SYMBOL(rtc_set_alarm); -+ -+void rtc_update_irq(struct class_device *class_dev, -+ unsigned long num, unsigned long events) -+{ -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ spin_lock(&rtc->irq_lock); -+ rtc->irq_data = (rtc->irq_data + (num << 8)) | events; -+ spin_unlock(&rtc->irq_lock); -+ -+ spin_lock(&rtc->irq_task_lock); -+ if (rtc->irq_task) -+ rtc->irq_task->func(rtc->irq_task->private_data); -+ spin_unlock(&rtc->irq_task_lock); -+ -+ wake_up_interruptible(&rtc->irq_queue); -+ kill_fasync(&rtc->async_queue, SIGIO, POLL_IN); -+} -+EXPORT_SYMBOL(rtc_update_irq); -+ -+struct class_device *rtc_open(char *name) -+{ -+ struct class_device *class_dev = NULL, -+ *class_dev_tmp; -+ -+ down(&rtc_class->sem); -+ list_for_each_entry(class_dev_tmp, &rtc_class->children, node) { -+ if (strncmp(class_dev_tmp->class_id, name, BUS_ID_SIZE) == 0) { -+ class_dev = class_dev_tmp; -+ break; -+ } -+ } -+ -+ if (class_dev) { -+ if (!try_module_get(to_rtc_device(class_dev)->owner)) -+ class_dev = NULL; -+ } -+ up(&rtc_class->sem); -+ -+ return class_dev; -+} -+EXPORT_SYMBOL(rtc_open); -+ -+void rtc_close(struct class_device *class_dev) -+{ -+ module_put(to_rtc_device(class_dev)->owner); -+} -+EXPORT_SYMBOL(rtc_close); -+ -+int rtc_irq_register(struct class_device *class_dev, struct rtc_task *task) -+{ -+ int retval = -EBUSY; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ if (task == NULL || task->func == NULL) -+ return -EINVAL; -+ -+ spin_lock(&rtc->irq_task_lock); -+ if (rtc->irq_task == NULL) { -+ rtc->irq_task = task; -+ retval = 0; -+ } -+ spin_unlock(&rtc->irq_task_lock); -+ -+ return retval; -+} -+EXPORT_SYMBOL(rtc_irq_register); -+ -+void rtc_irq_unregister(struct class_device *class_dev, struct rtc_task *task) -+{ -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ spin_lock(&rtc->irq_task_lock); -+ if (rtc->irq_task == task) -+ rtc->irq_task = NULL; -+ spin_unlock(&rtc->irq_task_lock); -+} -+EXPORT_SYMBOL(rtc_irq_unregister); -+ -+int rtc_irq_set_state(struct class_device *class_dev, struct rtc_task *task, int enabled) -+{ -+ int err = 0; -+ unsigned long flags; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ spin_lock_irqsave(&rtc->irq_task_lock, flags); -+ if (rtc->irq_task != task) -+ err = -ENXIO; -+ spin_unlock_irqrestore(&rtc->irq_task_lock, flags); -+ -+ if (err == 0) -+ err = rtc->ops->irq_set_state(class_dev->dev, enabled); -+ -+ return err; -+} -+EXPORT_SYMBOL(rtc_irq_set_state); -+ -+int rtc_irq_set_freq(struct class_device *class_dev, struct rtc_task *task, int freq) -+{ -+ int err = 0, tmp = 0; -+ unsigned long flags; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ /* allowed range is 2-8192 */ -+ if (freq < 2 || freq > 8192) -+ return -EINVAL; -+ -+/* if ((freq > rtc_max_user_freq) && (!capable(CAP_SYS_RESOURCE))) -+ return -EACCES; -+*/ -+ /* check if freq is a power of 2 */ -+ while (freq > (1 << tmp)) -+ tmp++; -+ -+ if (freq != (1 << tmp)) -+ return -EINVAL; -+ -+ spin_lock_irqsave(&rtc->irq_task_lock, flags); -+ if (rtc->irq_task != task) -+ err = -ENXIO; -+ spin_unlock_irqrestore(&rtc->irq_task_lock, flags); -+ -+ if (err == 0) { -+ if ((err = rtc->ops->irq_set_freq(class_dev->dev, freq)) == 0) -+ rtc->irq_freq = freq; -+ } -+ return err; -+ -+} ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/utils.c 2006-01-20 20:23:24.000000000 +0100 -@@ -0,0 +1,97 @@ -+/* -+ * RTC subsystem, utility functions -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * based on arch/arm/common/rtctime.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; version 2 of the License. -+*/ -+ -+#include -+ -+static const unsigned char rtc_days_in_month[] = { -+ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 -+}; -+ -+#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400) -+#define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400)) -+ -+int rtc_month_days(unsigned int month, unsigned int year) -+{ -+ return rtc_days_in_month[month] + (LEAP_YEAR(year) && month == 1); -+} -+EXPORT_SYMBOL(rtc_month_days); -+ -+/* -+ * Convert seconds since 01-01-1970 00:00:00 to Gregorian date. -+ */ -+void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) -+{ -+ int days, month, year; -+ -+ days = time / 86400; -+ time -= days * 86400; -+ -+ tm->tm_wday = (days + 4) % 7; -+ -+ year = 1970 + days / 365; -+ days -= (year - 1970) * 365 -+ + LEAPS_THRU_END_OF(year - 1) -+ - LEAPS_THRU_END_OF(1970 - 1); -+ if (days < 0) { -+ year -= 1; -+ days += 365 + LEAP_YEAR(year); -+ } -+ tm->tm_year = year - 1900; -+ tm->tm_yday = days + 1; -+ -+ for (month = 0; month < 11; month++) { -+ int newdays; -+ -+ newdays = days - rtc_month_days(month, year); -+ if (newdays < 0) -+ break; -+ days = newdays; -+ } -+ tm->tm_mon = month; -+ tm->tm_mday = days + 1; -+ -+ tm->tm_hour = time / 3600; -+ time -= tm->tm_hour * 3600; -+ tm->tm_min = time / 60; -+ tm->tm_sec = time - tm->tm_min * 60; -+} -+EXPORT_SYMBOL(rtc_time_to_tm); -+ -+/* -+ * Does the rtc_time represent a valid date/time? -+ */ -+int rtc_valid_tm(struct rtc_time *tm) -+{ -+ if (tm->tm_year < 70 || -+ tm->tm_mon >= 12 || -+ tm->tm_mday < 1 || -+ tm->tm_mday > rtc_month_days(tm->tm_mon, tm->tm_year + 1900) || -+ tm->tm_hour >= 24 || -+ tm->tm_min >= 60 || -+ tm->tm_sec >= 60) -+ return -EINVAL; -+ -+ return 0; -+} -+EXPORT_SYMBOL(rtc_valid_tm); -+ -+/* -+ * Convert Gregorian date to seconds since 01-01-1970 00:00:00. -+ */ -+int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time) -+{ -+ *time = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, -+ tm->tm_hour, tm->tm_min, tm->tm_sec); -+ return 0; -+} -+EXPORT_SYMBOL(rtc_tm_to_time); ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/hctosys.c 2006-01-20 20:23:24.000000000 +0100 -@@ -0,0 +1,61 @@ -+/* -+ * RTC subsystem, initialize system time on startup -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * 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; version 2 of the License. -+*/ -+ -+#include -+ -+/* IMPORTANT: the RTC only stores whole seconds. It is arbitrary -+ * whether it stores the most close value or the value with partial -+ * seconds truncated. However, it is important that we use it to store -+ * the truncated value. This is because otherwise it is necessary, -+ * in an rtc sync function, to read both xtime.tv_sec and -+ * xtime.tv_nsec. On some processors (i.e. ARM), an atomic read -+ * of >32bits is not possible. So storing the most close value would -+ * slow down the sync API. So here we have the truncated value and -+ * the best guess is to add 0.5s. -+ */ -+ -+static int __init rtc_hctosys(void) -+{ -+ int err; -+ struct class_device *class_dev = rtc_open(CONFIG_RTC_HCTOSYS_DEVICE); -+ -+ if (class_dev) { -+ struct rtc_time tm; -+ -+ if ((err = rtc_read_time(class_dev, &tm)) == 0) { -+ struct timespec tv; -+ -+ tv.tv_nsec = NSEC_PER_SEC >> 1; -+ -+ rtc_tm_to_time(&tm, &tv.tv_sec); -+ -+ do_settimeofday(&tv); -+ -+ dev_info(class_dev->dev, -+ "setting the system clock to " -+ "%d-%02d-%02d %02d:%02d:%02d (%d)\n", -+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, -+ tm.tm_hour, tm.tm_min, tm.tm_sec, tv.tv_sec); -+ } -+ else -+ dev_err(class_dev->dev, -+ "unable to set the system clock\n"); -+ -+ rtc_close(class_dev); -+ } -+ else -+ printk("%s: unable to open rtc device (%s)\n", -+ __FILE__, CONFIG_RTC_HCTOSYS_DEVICE); -+ -+ return 0; -+} -+ -+late_initcall(rtc_hctosys); ---- linux-nslu2.orig/arch/arm/Kconfig 2006-01-20 21:25:46.000000000 +0100 -+++ linux-nslu2/arch/arm/Kconfig 2006-01-20 21:26:12.000000000 +0100 -@@ -748,6 +748,8 @@ source "drivers/usb/Kconfig" - - source "drivers/mmc/Kconfig" - -+source "drivers/rtc/Kconfig" -+ - endmenu - - source "fs/Kconfig" ---- linux-nslu2.orig/arch/arm/common/rtctime.c 2006-01-20 21:25:46.000000000 +0100 -+++ linux-nslu2/arch/arm/common/rtctime.c 2006-01-20 21:26:12.000000000 +0100 -@@ -40,89 +40,6 @@ static struct rtc_ops *rtc_ops; - - #define rtc_epoch 1900UL - --static const unsigned char days_in_month[] = { -- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 --}; -- --#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400) --#define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400)) -- --static int month_days(unsigned int month, unsigned int year) --{ -- return days_in_month[month] + (LEAP_YEAR(year) && month == 1); --} -- --/* -- * Convert seconds since 01-01-1970 00:00:00 to Gregorian date. -- */ --void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) --{ -- int days, month, year; -- -- days = time / 86400; -- time -= days * 86400; -- -- tm->tm_wday = (days + 4) % 7; -- -- year = 1970 + days / 365; -- days -= (year - 1970) * 365 -- + LEAPS_THRU_END_OF(year - 1) -- - LEAPS_THRU_END_OF(1970 - 1); -- if (days < 0) { -- year -= 1; -- days += 365 + LEAP_YEAR(year); -- } -- tm->tm_year = year - 1900; -- tm->tm_yday = days + 1; -- -- for (month = 0; month < 11; month++) { -- int newdays; -- -- newdays = days - month_days(month, year); -- if (newdays < 0) -- break; -- days = newdays; -- } -- tm->tm_mon = month; -- tm->tm_mday = days + 1; -- -- tm->tm_hour = time / 3600; -- time -= tm->tm_hour * 3600; -- tm->tm_min = time / 60; -- tm->tm_sec = time - tm->tm_min * 60; --} --EXPORT_SYMBOL(rtc_time_to_tm); -- --/* -- * Does the rtc_time represent a valid date/time? -- */ --int rtc_valid_tm(struct rtc_time *tm) --{ -- if (tm->tm_year < 70 || -- tm->tm_mon >= 12 || -- tm->tm_mday < 1 || -- tm->tm_mday > month_days(tm->tm_mon, tm->tm_year + 1900) || -- tm->tm_hour >= 24 || -- tm->tm_min >= 60 || -- tm->tm_sec >= 60) -- return -EINVAL; -- -- return 0; --} --EXPORT_SYMBOL(rtc_valid_tm); -- --/* -- * Convert Gregorian date to seconds since 01-01-1970 00:00:00. -- */ --int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time) --{ -- *time = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, -- tm->tm_hour, tm->tm_min, tm->tm_sec); -- -- return 0; --} --EXPORT_SYMBOL(rtc_tm_to_time); -- - /* - * Calculate the next alarm time given the requested alarm time mask - * and the current time. -@@ -141,13 +58,13 @@ void rtc_next_alarm_time(struct rtc_time - next->tm_sec = alrm->tm_sec; - } - --static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm) -+static inline int rtc_arm_read_time(struct rtc_ops *ops, struct rtc_time *tm) - { - memset(tm, 0, sizeof(struct rtc_time)); - return ops->read_time(tm); - } - --static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm) -+static inline int rtc_arm_set_time(struct rtc_ops *ops, struct rtc_time *tm) - { - int ret; - -@@ -158,7 +75,7 @@ static inline int rtc_set_time(struct rt - return ret; - } - --static inline int rtc_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) -+static inline int rtc_arm_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) - { - int ret = -EINVAL; - if (ops->read_alarm) { -@@ -168,7 +85,7 @@ static inline int rtc_read_alarm(struct - return ret; - } - --static inline int rtc_set_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) -+static inline int rtc_arm_set_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm) - { - int ret = -EINVAL; - if (ops->set_alarm) -@@ -256,7 +173,7 @@ static int rtc_ioctl(struct inode *inode - - switch (cmd) { - case RTC_ALM_READ: -- ret = rtc_read_alarm(ops, &alrm); -+ ret = rtc_arm_read_alarm(ops, &alrm); - if (ret) - break; - ret = copy_to_user(uarg, &alrm.time, sizeof(tm)); -@@ -278,11 +195,11 @@ static int rtc_ioctl(struct inode *inode - alrm.time.tm_wday = -1; - alrm.time.tm_yday = -1; - alrm.time.tm_isdst = -1; -- ret = rtc_set_alarm(ops, &alrm); -+ ret = rtc_arm_set_alarm(ops, &alrm); - break; - - case RTC_RD_TIME: -- ret = rtc_read_time(ops, &tm); -+ ret = rtc_arm_read_time(ops, &tm); - if (ret) - break; - ret = copy_to_user(uarg, &tm, sizeof(tm)); -@@ -300,7 +217,7 @@ static int rtc_ioctl(struct inode *inode - ret = -EFAULT; - break; - } -- ret = rtc_set_time(ops, &tm); -+ ret = rtc_arm_set_time(ops, &tm); - break; - - case RTC_EPOCH_SET: -@@ -331,11 +248,11 @@ static int rtc_ioctl(struct inode *inode - ret = -EFAULT; - break; - } -- ret = rtc_set_alarm(ops, &alrm); -+ ret = rtc_arm_set_alarm(ops, &alrm); - break; - - case RTC_WKALM_RD: -- ret = rtc_read_alarm(ops, &alrm); -+ ret = rtc_arm_read_alarm(ops, &alrm); - if (ret) - break; - ret = copy_to_user(uarg, &alrm, sizeof(alrm)); -@@ -351,7 +268,7 @@ static int rtc_ioctl(struct inode *inode - return ret; - } - --static int rtc_open(struct inode *inode, struct file *file) -+static int rtc_arm_open(struct inode *inode, struct file *file) - { - int ret; - -@@ -406,7 +323,7 @@ static struct file_operations rtc_fops = - .read = rtc_read, - .poll = rtc_poll, - .ioctl = rtc_ioctl, -- .open = rtc_open, -+ .open = rtc_arm_open, - .release = rtc_release, - .fasync = rtc_fasync, - }; -@@ -425,7 +342,7 @@ static int rtc_read_proc(char *page, cha - struct rtc_time tm; - char *p = page; - -- if (rtc_read_time(ops, &tm) == 0) { -+ if (rtc_arm_read_time(ops, &tm) == 0) { - p += sprintf(p, - "rtc_time\t: %02d:%02d:%02d\n" - "rtc_date\t: %04d-%02d-%02d\n" -@@ -435,7 +352,7 @@ static int rtc_read_proc(char *page, cha - rtc_epoch); - } - -- if (rtc_read_alarm(ops, &alrm) == 0) { -+ if (rtc_arm_read_alarm(ops, &alrm) == 0) { - p += sprintf(p, "alrm_time\t: "); - if ((unsigned int)alrm.time.tm_hour <= 24) - p += sprintf(p, "%02d:", alrm.time.tm_hour); ---- linux-nslu2.orig/include/asm-arm/rtc.h 2006-01-20 21:25:46.000000000 +0100 -+++ linux-nslu2/include/asm-arm/rtc.h 2006-01-20 21:26:12.000000000 +0100 -@@ -25,9 +25,6 @@ struct rtc_ops { - int (*proc)(char *buf); - }; - --void rtc_time_to_tm(unsigned long, struct rtc_time *); --int rtc_tm_to_time(struct rtc_time *, unsigned long *); --int rtc_valid_tm(struct rtc_time *); - void rtc_next_alarm_time(struct rtc_time *, struct rtc_time *, struct rtc_time *); - void rtc_update(unsigned long, unsigned long); - int register_rtc(struct rtc_ops *); ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/rtc-sysfs.c 2006-01-20 21:26:12.000000000 +0100 -@@ -0,0 +1,128 @@ -+/* -+ * RTC subsystem, sysfs interface -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * 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; version 2 of the License. -+*/ -+ -+#include -+#include -+ -+/* device attributes */ -+ -+static ssize_t rtc_sysfs_show_name(struct class_device *dev, char *buf) -+{ -+ return sprintf(buf, "%s\n", to_rtc_device(dev)->name); -+} -+static CLASS_DEVICE_ATTR(name, S_IRUGO, rtc_sysfs_show_name, NULL); -+ -+static ssize_t rtc_sysfs_show_date(struct class_device *dev, char *buf) -+{ -+ ssize_t retval = -ENODEV; -+ struct rtc_device *rtc = to_rtc_device(dev); -+ struct rtc_time tm; -+ -+ if ((retval = down_interruptible(&rtc->ops_lock))) -+ return retval; -+ -+ if (rtc->ops && ((retval = rtc_read_time(dev, &tm)) == 0)) { -+ retval = sprintf(buf, "%04d-%02d-%02d\n", -+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); -+ } -+ -+ up(&rtc->ops_lock); -+ -+ return retval; -+} -+static CLASS_DEVICE_ATTR(date, S_IRUGO, rtc_sysfs_show_date, NULL); -+ -+static ssize_t rtc_sysfs_show_time(struct class_device *dev, char *buf) -+{ -+ ssize_t retval = -ENODEV; -+ struct rtc_device *rtc = to_rtc_device(dev); -+ struct rtc_time tm; -+ -+ if ((retval = down_interruptible(&rtc->ops_lock))) -+ return retval; -+ -+ if (rtc->ops && ((retval = rtc_read_time(dev, &tm)) == 0)) { -+ retval = sprintf(buf, "%02d:%02d:%02d\n", -+ tm.tm_hour, tm.tm_min, tm.tm_sec); -+ } -+ -+ up(&rtc->ops_lock); -+ -+ return retval; -+} -+static CLASS_DEVICE_ATTR(time, S_IRUGO, rtc_sysfs_show_time, NULL); -+ -+static ssize_t rtc_sysfs_show_since_epoch(struct class_device *dev, char *buf) -+{ -+ ssize_t retval = -ENODEV; -+ struct rtc_device *rtc = to_rtc_device(dev); -+ struct rtc_time tm; -+ -+ if ((retval = down_interruptible(&rtc->ops_lock))) -+ return retval; -+ -+ if (rtc->ops && ((retval = rtc_read_time(dev, &tm)) == 0)) { -+ unsigned long time; -+ rtc_tm_to_time(&tm, &time); -+ retval = sprintf(buf, "%lu\n", time); -+ } -+ -+ up(&rtc->ops_lock); -+ -+ return retval; -+} -+static CLASS_DEVICE_ATTR(since_epoch, S_IRUGO, rtc_sysfs_show_since_epoch, NULL); -+ -+/* insertion/removal hooks */ -+ -+static int __devinit rtc_sysfs_add_device(struct class_device *class_dev, -+ struct class_interface *class_intf) -+{ -+ class_device_create_file(class_dev, &class_device_attr_name); -+ class_device_create_file(class_dev, &class_device_attr_date); -+ class_device_create_file(class_dev, &class_device_attr_time); -+ class_device_create_file(class_dev, &class_device_attr_since_epoch); -+ dev_info(class_dev->dev, "rtc intf: sysfs\n"); -+ return 0; -+} -+ -+static void rtc_sysfs_remove_device(struct class_device *class_dev, -+ struct class_interface *class_intf) -+{ -+ class_device_remove_file(class_dev, &class_device_attr_name); -+ class_device_remove_file(class_dev, &class_device_attr_date); -+ class_device_remove_file(class_dev, &class_device_attr_time); -+ class_device_remove_file(class_dev, &class_device_attr_since_epoch); -+} -+ -+/* interface registration */ -+ -+struct class_interface rtc_sysfs_interface = { -+ .add = &rtc_sysfs_add_device, -+ .remove = &rtc_sysfs_remove_device, -+}; -+ -+static int __init rtc_sysfs_init(void) -+{ -+ return rtc_interface_register(&rtc_sysfs_interface); -+} -+ -+static void __exit rtc_sysfs_exit(void) -+{ -+ class_interface_unregister(&rtc_sysfs_interface); -+} -+ -+module_init(rtc_sysfs_init); -+module_exit(rtc_sysfs_exit); -+ -+MODULE_AUTHOR("Alessandro Zummo "); -+MODULE_DESCRIPTION("RTC class sysfs interface"); -+MODULE_LICENSE("GPL"); ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/rtc-proc.c 2006-01-20 21:26:12.000000000 +0100 -@@ -0,0 +1,158 @@ -+/* -+ * RTC subsystem, proc interface -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * based on arch/arm/common/rtctime.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; version 2 of the License. -+*/ -+ -+#include -+#include -+#include -+#include -+ -+static struct class_device *rtc_dev = NULL; -+static DECLARE_MUTEX(rtc_sem); -+ -+static int rtc_proc_show(struct seq_file *seq, void *offset) -+{ -+ struct class_device *class_dev = seq->private; -+ struct rtc_class_ops *ops = to_rtc_device(class_dev)->ops; -+ struct rtc_wkalrm alrm; -+ struct rtc_time tm; -+ -+ if (rtc_read_time(class_dev, &tm) == 0) { -+ seq_printf(seq, -+ "rtc_time\t: %02d:%02d:%02d\n" -+ "rtc_date\t: %04d-%02d-%02d\n", -+ tm.tm_hour, tm.tm_min, tm.tm_sec, -+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); -+ } -+ -+ if (rtc_read_alarm(class_dev, &alrm) == 0) { -+ seq_printf(seq, "alrm_time\t: "); -+ if ((unsigned int)alrm.time.tm_hour <= 24) -+ seq_printf(seq, "%02d:", alrm.time.tm_hour); -+ else -+ seq_printf(seq, "**:"); -+ if ((unsigned int)alrm.time.tm_min <= 59) -+ seq_printf(seq, "%02d:", alrm.time.tm_min); -+ else -+ seq_printf(seq, "**:"); -+ if ((unsigned int)alrm.time.tm_sec <= 59) -+ seq_printf(seq, "%02d\n", alrm.time.tm_sec); -+ else -+ seq_printf(seq, "**\n"); -+ -+ seq_printf(seq, "alrm_date\t: "); -+ if ((unsigned int)alrm.time.tm_year <= 200) -+ seq_printf(seq, "%04d-", alrm.time.tm_year + 1900); -+ else -+ seq_printf(seq, "****-"); -+ if ((unsigned int)alrm.time.tm_mon <= 11) -+ seq_printf(seq, "%02d-", alrm.time.tm_mon + 1); -+ else -+ seq_printf(seq, "**-"); -+ if ((unsigned int)alrm.time.tm_mday <= 31) -+ seq_printf(seq, "%02d\n", alrm.time.tm_mday); -+ else -+ seq_printf(seq, "**\n"); -+ seq_printf(seq, "alrm_wakeup\t: %s\n", -+ alrm.enabled ? "yes" : "no"); -+ seq_printf(seq, "alrm_pending\t: %s\n", -+ alrm.pending ? "yes" : "no"); -+ } -+ -+ if (ops->proc) -+ ops->proc(class_dev->dev, seq); -+ -+ return 0; -+} -+ -+static int rtc_proc_open(struct inode *inode, struct file *file) -+{ -+ struct class_device *class_dev = PDE(inode)->data; -+ -+ if (!try_module_get(THIS_MODULE)) -+ return -ENODEV; -+ -+ return single_open(file, rtc_proc_show, class_dev); -+} -+ -+static int rtc_proc_release(struct inode *inode, struct file *file) -+{ -+ int res = single_release(inode, file); -+ module_put(THIS_MODULE); -+ return res; -+} -+ -+static struct file_operations rtc_proc_fops = { -+ .open = rtc_proc_open, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = rtc_proc_release, -+}; -+ -+static int rtc_proc_add_device(struct class_device *class_dev, -+ struct class_interface *class_intf) -+{ -+ down(&rtc_sem); -+ if (rtc_dev == NULL) { -+ struct proc_dir_entry *ent; -+ -+ rtc_dev = class_dev; -+ -+ if ((ent = create_proc_entry("driver/rtc", 0, NULL))) { -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ -+ ent->proc_fops = &rtc_proc_fops; -+ ent->owner = rtc->owner; -+ ent->data = class_dev; -+ -+ dev_info(class_dev->dev, "rtc intf: proc\n"); -+ } -+ else -+ rtc_dev = NULL; -+ } -+ up(&rtc_sem); -+ -+ return 0; -+} -+ -+static void rtc_proc_remove_device(struct class_device *class_dev, -+ struct class_interface *class_intf) -+{ -+ down(&rtc_sem); -+ if (rtc_dev == class_dev) { -+ remove_proc_entry("driver/rtc", NULL); -+ rtc_dev = NULL; -+ } -+ up(&rtc_sem); -+} -+ -+struct class_interface rtc_proc_interface = { -+ .add = &rtc_proc_add_device, -+ .remove = &rtc_proc_remove_device, -+}; -+ -+static int __init rtc_proc_init(void) -+{ -+ return rtc_interface_register(&rtc_proc_interface); -+} -+ -+static void __exit rtc_proc_exit(void) -+{ -+ class_interface_unregister(&rtc_proc_interface); -+} -+ -+module_init(rtc_proc_init); -+module_exit(rtc_proc_exit); -+ -+MODULE_AUTHOR("Alessandro Zummo "); -+MODULE_DESCRIPTION("RTC class proc interface"); -+MODULE_LICENSE("GPL"); ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-nslu2/drivers/rtc/rtc-dev.c 2006-01-20 21:26:12.000000000 +0100 -@@ -0,0 +1,372 @@ -+/* -+ * RTC subsystem, dev interface -+ * -+ * Copyright (C) 2005 Tower Technologies -+ * Author: Alessandro Zummo -+ * -+ * based on arch/arm/common/rtctime.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; version 2 of the License. -+*/ -+ -+#include -+#include -+ -+static dev_t rtc_devt; -+ -+#define RTC_DEV_MAX 16 /* 16 RTCs should be enough for everyone... */ -+ -+static int rtc_dev_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct rtc_device *rtc = container_of(inode->i_cdev, -+ struct rtc_device, char_dev); -+ struct rtc_class_ops *ops = rtc->ops; -+ -+ /* We keep the lock as long as the device is in use -+ * and return immediately if busy -+ */ -+ if (down_trylock(&rtc->char_sem)) -+ return -EBUSY; -+ -+ file->private_data = &rtc->class_dev; -+ -+ err = ops->open ? ops->open(rtc->class_dev.dev) : 0; -+ if (err == 0) { -+ -+ spin_lock_irq(&rtc->irq_lock); -+ rtc->irq_data = 0; -+ spin_unlock_irq(&rtc->irq_lock); -+ -+ return 0; -+ } -+ -+ /* something has gone wrong, release the lock */ -+ up(&rtc->char_sem); -+ return err; -+} -+ -+ -+static ssize_t -+rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) -+{ -+ struct rtc_device *rtc = to_rtc_device(file->private_data); -+ -+ DECLARE_WAITQUEUE(wait, current); -+ unsigned long data; -+ ssize_t ret; -+ -+ if (count < sizeof(unsigned long)) -+ return -EINVAL; -+ -+ add_wait_queue(&rtc->irq_queue, &wait); -+ do { -+ __set_current_state(TASK_INTERRUPTIBLE); -+ -+ spin_lock_irq(&rtc->irq_lock); -+ data = rtc->irq_data; -+ rtc->irq_data = 0; -+ spin_unlock_irq(&rtc->irq_lock); -+ -+ if (data != 0) { -+ ret = 0; -+ break; -+ } -+ if (file->f_flags & O_NONBLOCK) { -+ ret = -EAGAIN; -+ break; -+ } -+ if (signal_pending(current)) { -+ ret = -ERESTARTSYS; -+ break; -+ } -+ schedule(); -+ } while (1); -+ set_current_state(TASK_RUNNING); -+ remove_wait_queue(&rtc->irq_queue, &wait); -+ -+ if (ret == 0) { -+ ret = put_user(data, (unsigned long __user *)buf); -+ if (ret == 0) -+ ret = sizeof(unsigned long); -+ } -+ return ret; -+} -+ -+static unsigned int rtc_dev_poll(struct file *file, poll_table *wait) -+{ -+ struct rtc_device *rtc = to_rtc_device(file->private_data); -+ unsigned long data; -+ -+ poll_wait(file, &rtc->irq_queue, wait); -+ -+ spin_lock_irq(&rtc->irq_lock); -+ data = rtc->irq_data; -+ spin_unlock_irq(&rtc->irq_lock); -+ -+ return data != 0 ? POLLIN | POLLRDNORM : 0; -+} -+ -+static int rtc_dev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ int err = 0; -+ struct class_device *class_dev = file->private_data; -+ struct rtc_device *rtc = to_rtc_device(class_dev); -+ struct rtc_class_ops *ops = rtc->ops; -+ struct rtc_time tm; -+ struct rtc_wkalrm alarm; -+ void __user *uarg = (void __user *) arg; -+ -+ /* avoid conflicting IRQ users */ -+ if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { -+ spin_lock(&rtc->irq_task_lock); -+ if (rtc->irq_task) -+ err = -EBUSY; -+ spin_unlock(&rtc->irq_task_lock); -+ -+ if (err < 0) -+ return err; -+ } -+ -+ /* try the driver's ioctl interface */ -+ if (ops->ioctl) { -+ err = ops->ioctl(class_dev->dev, cmd, arg); -+ if (err < 0 && err != -EINVAL) -+ return err; -+