diff options
| author | Rod Whitby <rod@whitby.id.au> | 2006-01-04 11:52:21 +0000 |
|---|---|---|
| committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2006-01-04 11:52:21 +0000 |
| commit | c435f0f5b01e8df3a0a3a567077741b1f8d4be04 (patch) | |
| tree | bd7cd04d63a93dd7f51382adde25509170bca359 /packages | |
| parent | 13505c0756b7eca3af798862c7bf666dae3ec29e (diff) | |
ixp4xx-kernel: Initial version - patches need to be cleaned up to coexist with other ixp4xx machines, updated patchsets to match 2.6.15, removed some patches, and combined some others.
Diffstat (limited to 'packages')
19 files changed, 7708 insertions, 0 deletions
diff --git a/packages/linux/ixp4xx-kernel.inc b/packages/linux/ixp4xx-kernel.inc new file mode 100644 index 0000000000..54679ebfdf --- /dev/null +++ b/packages/linux/ixp4xx-kernel.inc @@ -0,0 +1,198 @@ +# ixp4xx-kernel.inc +# +# Standard definitions for any IXP4xx Linux kernel. +# Include this file in a .bb which specifies, at least, +# PN,PV,PR for the desired kernel +# +# Define the following *before* including this file as +# required: +# +# IXP4XX_PATCHES - full list of patches to apply +# +# IXP4XX_SUFFIX - the suffix to add after 'zImage-' in the +# deploy/images directory - defaults to "ixp4xx" +# +# -------------------------------------------------------------- +# +# Within this file bitbake variables local to the file are +# named N1K_FOO +# +SECTION = "kernel" +DESCRIPTION = "Linux kernel for the Intel IXP4xx device" +LICENSE = "GPL" +MAINTAINER = "NSLU2-Linux <www.nslu2-linux.org>" + +DEPENDS += "devio-native" + +# Linux kernel source has the general form linux-X.Y.Z-patchP, +# X.Y is the major version number, Z (which may have multiple +# parts) is a sub-version and 'patch' is something like 'mm' or +# 'ac' with a patch version. The original bz2 archive will be +# in a directory/file vX.Y/linux-X.Y.Z.tar.bz2. The unpacked +# source will be in the directory linux-X.Y.Z and this directory +# name corresponds to the module directory (in /lib/modules). +# +# The corresponding .bb file should be called: +# +# package_X.Y.Z-patchP +# +# Giving PN=package PV=X.Y.Z-patchP (and PR is set in the .bb +# file). Files, including the all important defconfig, are +# searched for in the following directories (last one first): +# +# ixp4xx-kernel/files +# ixp4xx-kernel/X.Y +# ixp4xx-kernel/X.Y.Z +# ixp4xx-kernel/X.Y.Z-patch +# ixp4xx-kernel/X.Y.Z-patchP +# package-X.Y.Z-patchP +# +# This allows sharing of patch files and other useful source! +# To share a file or patch with an earlier version put it in +# the shared directory - e.g. to use foo.patch on 2.6.11.2 and +# 2.6.11.4 it should be in directory ixp4xx-kernel/2.6.11. +# +# Note that when there are multiple patches the X.Y.Z-patch form +# uses base-patch (e.g. 2.6.12-mm) whereas X.Y.Z-patchP has the +# full form, for example 2.6.12-rc3-mm1 (in the same case). + +#PN=package-name +#PV=package-version (full) + +# The patch has the general form (rcN|preN|acN|mmN|bkN)* with the +# separate patch items being separated by '-' characters. The +# rc patch is first and has the important property that it +# requires the *preceding* kernel base version and that this +# will be the source directory name. +python () { + # The patches list may be empty. This code starts with the base + # kernel version and steps through the patches. Because the rc and + # pre patches actually require the *preceding* kernel version the code + # fixes that up appropriately. + pv = bb.data.getVar("PV",d,1).split('-') + kernel = pv[0].split('.') + base = pv[0] + name = [base] + major = '.'.join(name[0].split('.')[0:2]) + minor = '.'.join(name[0].split('.')[0:3]) + patch_uri = [ None ] + filedir = "${FILE_DIRNAME}/ixp4xx-kernel/%s" + # This entry will become the last one (everything is inserted before it) + filepath = [ filedir % "files" ] + pref = 10 + mmac = 0 + for patch in pv[1:]: + name.append(patch) + pname = '-'.join(name) + if patch[0:2] == "rc" or patch[0:3] == "pre": + patch_uri.append("ftp://ftp.kernel.org/pub/linux/kernel/v%s/testing/patch-%s.bz2;patch=1;pname=%s" % (major, pname, pname)) + kernel[-1] = str(int(kernel[-1]) - 1) + if patch[0:2] == "rc" and pref == 10: + pref = 6 + filepath[0:0] = [ filedir % name[0] ] + filepath[0:0] = [ filedir % (name[0] + "-rc") ] + else: + pref = 2 + elif patch[0:2] == "bk" or patch[0:3] == "git": + patch_uri.append("ftp://ftp.kernel.org/pub/linux/kernel/v%s/snapshots/patch-%s.bz2;patch=1;pname=%s" % (major, pname, pname)) + pref = 2 + elif patch[0:2] == "ac": + patch_uri.append("ftp://ftp.kernel.org/pub/linux/kernel/people/alan/linux-%s/%s/patch-%s" % (major, base, pname)) + mmac = 2 + filepath[0:0] = [ filedir % (name[0] + "-ac") ] + elif patch[0:2] == "mm": + patch_uri.append("ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/%s/%s/%s/%s.bz2;patch=1;pname=%s" % (major, base, pname, pname, pname)) + mmac = 2 + filepath[0:0] = [ filedir % (name[0] + "-mm") ] + else: + raise bb.build.FuncFailed("ixp4xx-kernel: patch %s not recognized in %s" % (patch, '-'.join(pv))) + filepath[0:0] = [ filedir % pname ] + base = pname + + base = '.'.join(kernel) + patch_uri[0] = "ftp://ftp.kernel.org/pub/linux/kernel/v%s/linux-%s.tar.bz2" % (major, base) + filepath[-1:-1] = [ filedir % base ] + if base != minor: + filepath[-1:-1] = [ filedir % minor ] + filepath[-1:-1] = [ filedir % major ] + + bb.data.setVar("IXP4XX_SRCMAJ", major, d) + # bb.note("IXP4XX_SRCMAJ := %s" % major) + bb.data.setVar("IXP4XX_SRCVER", base, d) + # bb.note("IXP4XX_SRCVER := %s" % base) + bb.data.setVar("IXP4XX_SRCURI", ' '.join(patch_uri), d) + # bb.note("IXP4XX_SRCURI := %s" % ' '.join(patch_uri)) + bb.data.setVar("IXP4XX_FILESPATH", ':'.join(filepath), d) + # bb.note("IXP4XX_FILESPATH := %s" % ' '.join(filepath)) + bb.data.setVar("DEFAULT_PREFERENCE", pref-mmac, d) + # bb.note("DEFAULT_PREFERENCE := %s" % (pref-mmac)) +} + +# FILESPATH: this list is in order last-searched-first, therefore +# the first entry is the *latest* and/or most specific +FILESPATH = "${IXP4XX_FILESPATH}:${FILE_DIRNAME}/ixp4xx-kernel/" + +# The working directory will be the 'base' version (which may not be the +# same as implied by the PV variable because it corresponds to the prior +# minor version for rc and pre patched versions). +S = "${WORKDIR}/linux-${IXP4XX_SRCVER}" + +# IXP4XX_PATCHES is a list of additional patches to apply +IXP4XX_PATCHES ?= "" + +IXP4XX_SUFFIX ?= "ixp4xx" + +SRC_URI = "${IXP4XX_SRCURI}" +SRC_URI += "${IXP4XX_PATCHES}" +SRC_URI += "file://defconfig" + +COMPATIBLE_HOST = 'arm.*-linux' + +inherit kernel + +ARCH = "arm" +KERNEL_IMAGETYPE = "zImage" +# To specify the console set KERNEL_CONSOLE in the .bb file. +# CMDLINE_ROOT contains the boot options, CMDLINE_KERNEL_OPTIONS +# contains the things for a specific kernel. +# CMDLINE_KERNEL_OPTIONS ?= "reboot=s" +CMDLINE_KERNEL_OPTIONS ?= +CMDLINE_ROOT = "root=/dev/mtdblock2 rw rootfstype=jffs2 mem=64M@0x00000000 init=/linuxrc" +CMDLINE_DEBUG = +CMDLINE = "${CMDLINE_ROOT} ${CMDLINE_KERNEL_OPTIONS} ${CMDLINE_DEBUG} ${CMDLINE_CONSOLE}" + +# Add the architecture compiler flags to KERNEL_CC and KERNEL_LD as +# required. Notice that this has to be done for each separately built +# module as well! +KERNEL_CC += "${TARGET_CC_KERNEL_ARCH}" +KERNEL_LD += "${TARGET_LD_KERNEL_ARCH}" + +# Set EXTRAVERSION and LOCALVERSION to "" so that the kernel version +# remains pinned to the x.y.z form, also turn off the directory +# printing which provides almost all the output of an incremental build. +EXTRA_OEMAKE += "EXTRAVERSION=" +EXTRA_OEMAKE += "LOCALVERSION=" +EXTRA_OEMAKE += "MAKEFLAGS='--no-print-directory'" + +# Override KERNEL_RELEASE from kernel.bbclass to match: +KERNEL_RELEASE = "${KERNEL_VERSION}" + +do_configure_prepend() { + rm -f ${S}/.config + echo "CONFIG_CMDLINE=\"${CMDLINE}\"" >>'${S}/.config' + if test '${ARCH_BYTE_SEX}' = be + then + echo 'CONFIG_CPU_BIG_ENDIAN=y' >>'${S}/.config' + fi + sed -e '/CONFIG_CPU_BIG_ENDIAN/d' -e '/CONFIG_CMDLINE=/d' '${WORKDIR}/defconfig' >>'${S}/.config' + rm -rf ${S}/include/asm-arm/arch ${S}/include/asm-arm/proc \ + ${S}/include/asm-arm/.proc ${S}/include/asm-arm/.arch +} + +do_deploy[dirs] = "${S}" +do_deploy() { + install -d ${DEPLOY_DIR}/images + install -m 644 arch/${ARCH}/boot/${KERNEL_IMAGETYPE} ${DEPLOY_DIR}/images/${KERNEL_IMAGETYPE}-${IXP4XX_SUFFIX} +} + +addtask deploy before do_build after do_compile diff --git a/packages/linux/ixp4xx-kernel/.mtn2git_empty b/packages/linux/ixp4xx-kernel/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/ixp4xx-kernel/.mtn2git_empty diff --git a/packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty b/packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/ixp4xx-kernel/2.6.15/.mtn2git_empty 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 new file mode 100644 index 0000000000..30d34952d5 --- /dev/null +++ b/packages/linux/ixp4xx-kernel/2.6.15/00-memory-h-page-shift.patch @@ -0,0 +1,91 @@ +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 <rod@whitby.id.au> + +--- 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 new file mode 100644 index 0000000000..077aa00816 --- /dev/null +++ b/packages/linux/ixp4xx-kernel/2.6.15/10-mtdpart-redboot-fis-byteswap.patch @@ -0,0 +1,77 @@ +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 <jbowler@acm.org> +Signed-off-by: Andrew Morton <akpm@osdl.org> +Modified slightly and +Signed-off-by: David Woodhouse <dwmw2@infradead.org> + +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 +@@ -1,5 +1,5 @@ + /* +- * $Id: redboot.c,v 1.18 2005/11/07 11:14:21 gleixner Exp $ ++ * $Id: redboot.c,v 1.19 2005/12/01 10:03:51 dwmw2 Exp $ + * + * Parse RedBoot-style Flash Image System (FIS) tables and + * produce a Linux partition array to match. +@@ -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/19-jffs2-force-be.patch b/packages/linux/ixp4xx-kernel/2.6.15/19-jffs2-force-be.patch new file mode 100644 index 0000000000..09379031dd --- /dev/null +++ b/packages/linux/ixp4xx-kernel/2.6.15/19-jffs2-force-be.patch @@ -0,0 +1,13 @@ +--- linux-2.6.15/fs/jffs2/nodelist.h 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.15/fs/jffs2/nodelist.h 1970-01-01 00:00:00.000000000 +0000 +@@ -44,7 +44,9 @@ + #define D2(x) + #endif + +-#define JFFS2_NATIVE_ENDIAN ++#undef JFFS2_NATIVE_ENDIAN ++#define JFFS2_BIG_ENDIAN 1 ++#undef JFFS2_LITTLE_ENDIAN + + /* Note we handle mode bits conversion from JFFS2 (i.e. Linux) to/from + whatever OS we're actually running on here too. */ 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 new file mode 100644 index 0000000000..feea3f2f8b --- /dev/null +++ b/packages/linux/ixp4xx-kernel/2.6.15/40-rtc-class.patch @@ -0,0 +1,2719 @@ +--- linux-nslu2.orig/include/linux/rtc.h 2006-01-03 15:31:18.000000000 +0100 ++++ linux-nslu2/include/linux/rtc.h 2006-01-03 15:34:24.000000000 +0100 +@@ -91,8 +91,81 @@ 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 <linux/device.h> ++#include <linux/seq_file.h> ++#include <linux/cdev.h> ++#include <linux/poll.h> ++ ++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 rw_semaphore lock; ++ struct class_device class_dev; ++ 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); ++ + typedef struct rtc_task { + void (*func)(void *private_data); + void *private_data; +--- linux-nslu2.orig/drivers/Kconfig 2006-01-03 15:31:19.000000000 +0100 ++++ linux-nslu2/drivers/Kconfig 2006-01-04 01:27:31.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-03 15:33:32.000000000 +0100 ++++ linux-nslu2/drivers/Makefile 2006-01-04 01:27:31.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-03 15:45:19.000000000 +0100 +@@ -0,0 +1,141 @@ ++/* ++ * RTC subsystem, base class ++ * ++ * Copyright (C) 2005 Tower Technologies ++ * Author: Alessandro Zummo <a.zummo@towertech.it> ++ * ++ * 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 <linux/module.h> ++#include <linux/rtc.h> ++#include <linux/kdev_t.h> ++#include <linux/idr.h> ++ ++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_rwsem(&rtc->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_write(&rtc->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 <a.zummo@towerteh.it>"); ++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-04 01:27:21.000000000 +0100 +@@ -0,0 +1,93 @@ ++# ++# 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. ++ ++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_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-04 01:27:21.000000000 +0100 +@@ -0,0 +1,15 @@ ++# ++# Makefile for RTC class/drivers. ++# ++ ++obj-y += utils.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 ++ +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-nslu2/drivers/rtc/interface.c 2006-01-03 15:34:24.000000000 +0100 +@@ -0,0 +1,189 @@ ++/* ++ * RTC subsystem, interface functions ++ * ++ * Copyright (C) 2005 Tower Technologies ++ * Author: Alessandro Zummo <a.zummo@towertech.it> ++ * ++ * 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 <linux/rtc.h> ++ ++extern struct class *rtc_class; ++ ++int rtc_read_time(struct class_device *class_dev, struct rtc_time *tm) ++{ ++ int err = -EINVAL; ++ struct rtc_class_ops *ops = to_rtc_device(class_dev)->ops; ++ ++ if (ops->read_time) { ++ memset(tm, 0, sizeof(struct rtc_time)); ++ err = ops->read_time(class_dev->dev, tm); ++ } ++ return err; ++} ++EXPORT_SYMBOL(rtc_read_time); ++ ++int rtc_set_time(struct class_device *class_dev, struct rtc_time *tm) ++{ ++ int err; ++ struct rtc_class_ops *ops = to_rtc_device(class_dev)->ops; ++ ++ err = rtc_valid_tm(tm); ++ if (err == 0 && ops->set_time) ++ err = ops->set_time(class_dev->dev, tm); ++ ++ return err; ++} ++EXPORT_SYMBOL(rtc_set_time); ++ ++int rtc_read_alarm(struct class_device *class_dev, struct rtc_wkalrm *alarm) ++{ ++ struct rtc_class_ops *ops = to_rtc_device(class_dev)->ops; ++ int err = -EINVAL; ++ ++ if (ops->read_alarm) { ++ memset(alarm, 0, sizeof(struct rtc_wkalrm)); ++ err = ops->read_alarm(class_dev->dev, alarm); ++ } ++ return err; ++} ++EXPORT_SYMBOL(rtc_read_alarm); ++ ++int rtc_set_alarm(struct class_device *class_dev, struct rtc_wkalrm *alarm) ++{ ++ int err = -EINVAL; ++ struct rtc_class_ops *ops = to_rtc_device(class_dev)->ops; ++ ++ if (ops->set_alarm) ++ err = ops->set_alarm(class_dev->dev, alarm); ++ 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; ++ } ++ } ++ up(&rtc_class->sem); ++ ++ return class_dev; ++} ++EXPORT_SYMBOL(rtc_open); ++ ++void rtc_close(struct class_device *class_dev) |
