Cleaned powerpc patches, re-added those that are needed, and removed the single not needed one.
Cleaned the fs-asfs patch. Added support for the genesi/efika board, patches scheduled for merge in 2.6.20. Note: the 0002-Add-USB-OHCI-glue-for-OpenFirmware-devices.diff patch seems a bit ugly, and may have an impact on modular usb/ohci build. I am monitoring for fixes of this problem, but if one doesn' t come soon, it should be disabled for 2.6.19 or 2.6.19-rc6 uploads. svn path=/dists/trunk/linux-2.6/; revision=7873
This commit is contained in:
parent
00dc229bbf
commit
3047145cb4
|
@ -8,6 +8,9 @@ linux-2.6 (2.6.19~rc6-1~experimental.1) UNRELEASED; urgency=low
|
|||
* arm/footbridge: Unset SATA.
|
||||
* arm/s3c2410: Likewise.
|
||||
|
||||
[ Sven Luther ]
|
||||
* [powerpc] Added Genesi Efika support patch
|
||||
|
||||
-- Bastian Blank <waldi@debian.org> Sun, 19 Nov 2006 12:05:33 +0100
|
||||
|
||||
linux-2.6 (2.6.18-6) UNRELEASED; urgency=low
|
||||
|
|
|
@ -18,29 +18,29 @@
|
|||
# Upstream status: This patch stays a debian specific patch for now,
|
||||
# but it is not in a form where it could go upstream.
|
||||
#
|
||||
--- linux-2.6.17/arch/powerpc/Makefile.orig 2006-04-12 16:57:16.000000000 +0000
|
||||
+++ linux-2.6.17/arch/powerpc/Makefile 2006-04-12 16:58:53.000000000 +0000
|
||||
@@ -147,7 +147,7 @@
|
||||
--- linux-2.6.19-rc6/arch/powerpc/Makefile.orig 2006-11-24 17:43:15.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/arch/powerpc/Makefile 2006-11-24 17:44:32.000000000 +0100
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
CPPFLAGS_vmlinux.lds := -Upowerpc
|
||||
|
||||
-BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage vmlinux.bin
|
||||
+BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage vmlinux.bin mkvmlinuz_support_install
|
||||
-BOOT_TARGETS = zImage zImage.initrd uImage
|
||||
+BOOT_TARGETS = zImage zImage.initrd uImage mkvmlinuz_support_install
|
||||
|
||||
PHONY += $(BOOT_TARGETS)
|
||||
|
||||
--- linux-2.6.16/arch/powerpc/boot/Makefile.orig 2006-04-12 16:40:11.000000000 +0000
|
||||
+++ linux-2.6.16/arch/powerpc/boot/Makefile 2006-04-12 19:23:06.000000000 +0000
|
||||
@@ -213,3 +213,23 @@
|
||||
sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)"
|
||||
--- linux-2.6.19-rc6/arch/powerpc/boot/Makefile.orig 2006-11-24 17:42:40.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/arch/powerpc/boot/Makefile 2006-11-24 17:45:45.000000000 +0100
|
||||
@@ -176,3 +176,23 @@
|
||||
|
||||
clean-files += $(addprefix $(objtree)/, $(obj-boot) vmlinux.strip)
|
||||
clean-files += $(addprefix $(objtree)/, $(obj-boot) vmlinux.strip.gz)
|
||||
clean-files += $(addprefix $(objtree)/, $(obj-boot) vmlinux.bin.gz)
|
||||
+
|
||||
+#-----------------------------------------------------------
|
||||
+# install mkvmlinuz support files
|
||||
+#-----------------------------------------------------------
|
||||
+quiet_cmd_mkvmlinuz = INSTALL mkvmlinuz support files
|
||||
+ cmd_mkvmlinuz = cp -f $? $(INSTALL_MKVMLINUZ)
|
||||
+ cmd_mkvmlinuz = cp -f $? $(INSTALL_MKVMLINUZ)
|
||||
+
|
||||
+mkvmlinuz-obj-sec = $(foreach section, $(1), $(patsubst %,$(obj)/mkvmlinuz-kernel-%.o, $(section)))
|
||||
+mkvmlinuz-src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/mkvmlinuz-kernel-%.c, $(section)))
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
## DP: Upstream status: submitted but no reply. Submitted again on 2005.03.22.
|
||||
## DP: Reference: http://home.elka.pw.edu.pl/~mszyprow/programy/asfs/
|
||||
|
||||
diff -urN linux-2.6.18/Documentation/filesystems/00-INDEX linux-2.6.18-asfs-1.0b11/Documentation/filesystems/00-INDEX
|
||||
--- linux-2.6.18/Documentation/filesystems/00-INDEX 2006-09-22 22:47:41.000000000 +0200
|
||||
+++ linux-2.6.18-asfs-1.0b11/Documentation/filesystems/00-INDEX 2006-09-22 22:53:21.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/Documentation/filesystems/00-INDEX linux-2.6.19-rc6/Documentation/filesystems/00-INDEX
|
||||
--- linux-2.6.19-rc6/Documentation/filesystems/00-INDEX 2006-11-16 05:03:40.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/Documentation/filesystems/00-INDEX 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -10,6 +10,8 @@
|
||||
- info and examples for the distributed AFS (Andrew File System) fs.
|
||||
affs.txt
|
||||
|
@ -18,9 +18,9 @@ diff -urN linux-2.6.18/Documentation/filesystems/00-INDEX linux-2.6.18-asfs-1.0b
|
|||
automount-support.txt
|
||||
- information about filesystem automount support.
|
||||
befs.txt
|
||||
diff -urN linux-2.6.18/Documentation/filesystems/asfs.txt linux-2.6.18-asfs-1.0b11/Documentation/filesystems/asfs.txt
|
||||
--- linux-2.6.18/Documentation/filesystems/asfs.txt 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/Documentation/filesystems/asfs.txt 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/Documentation/filesystems/asfs.txt linux-2.6.19-rc6/Documentation/filesystems/asfs.txt
|
||||
--- linux-2.6.19-rc6/Documentation/filesystems/asfs.txt 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/Documentation/filesystems/asfs.txt 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,161 @@
|
||||
+
|
||||
+Amiga SmartFileSystem, Linux implementation
|
||||
|
@ -183,9 +183,209 @@ diff -urN linux-2.6.18/Documentation/filesystems/asfs.txt linux-2.6.18-asfs-1.0b
|
|||
+The ASFS driver is realased under the terms of of the GNU General
|
||||
+Public License. See source code for more details.
|
||||
+
|
||||
diff -urN linux-2.6.18/fs/asfs/adminspace.c linux-2.6.18-asfs-1.0b11/fs/asfs/adminspace.c
|
||||
--- linux-2.6.18/fs/asfs/adminspace.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/adminspace.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/Kconfig linux-2.6.19-rc6/fs/Kconfig
|
||||
--- linux-2.6.19-rc6/fs/Kconfig 2006-11-16 05:03:40.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/Kconfig 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -1111,6 +1111,53 @@
|
||||
To compile this file system support as a module, choose M here: the
|
||||
module will be called ecryptfs.
|
||||
|
||||
+config ASFS_FS
|
||||
+ tristate "Amiga SFS file system support (EXPERIMENTAL)"
|
||||
+ select NLS
|
||||
+ depends on EXPERIMENTAL
|
||||
+ help
|
||||
+
|
||||
+ The Amiga Smart FileSystem (SFS) is the file system used on hard
|
||||
+ disks by Amiga(tm) and MorphOS(tm) systems. Say Y if you want
|
||||
+ to be able to read files from an Amiga SFS partition on your hard
|
||||
+ drive.
|
||||
+
|
||||
+ For more information read <file:Documentation/filesystems/asfs.txt>
|
||||
+
|
||||
+ To compile this file system support as a module, choose M here: the
|
||||
+ module will be called asfs.
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
+config ASFS_DEFAULT_CODEPAGE
|
||||
+ string "Default codepage for SFS"
|
||||
+ depends on ASFS_FS
|
||||
+ default ""
|
||||
+ help
|
||||
+ This option should be set to the codepage of your SFS filesystems.
|
||||
+ It can be overridden with the 'codepage' mount option. Leave it blank
|
||||
+ or enter 'none' to disable filename converting.
|
||||
+
|
||||
+ Use full codepage name (for example 'cp1251' instead of '1251') here,
|
||||
+ this allows to specify any character set, not only numbered one (like
|
||||
+ 'iso8859-2').
|
||||
+
|
||||
+ If unsure, leave it blank.
|
||||
+
|
||||
+config ASFS_RW
|
||||
+ bool "Amiga SFS write support (DANGEROUS)"
|
||||
+ depends on ASFS_FS
|
||||
+ help
|
||||
+
|
||||
+ If you say Y here, you will be able to write to ASFS file
|
||||
+ systems as well as read from them. The read-write support in ASFS
|
||||
+ is in beta stage. This means that useing it to write files to SFS
|
||||
+ partitions is DANGEROUS and COULD corrupt the filesystem.
|
||||
+
|
||||
+ For more information read <file:Documentation/filesystems/asfs.txt>
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
config HFS_FS
|
||||
tristate "Apple Macintosh file system support (EXPERIMENTAL)"
|
||||
depends on BLOCK && EXPERIMENTAL
|
||||
diff -Nur linux-2.6.19-rc6/fs/Makefile linux-2.6.19-rc6/fs/Makefile
|
||||
--- linux-2.6.19-rc6/fs/Makefile 2006-11-16 05:03:40.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/Makefile 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -96,6 +96,7 @@
|
||||
obj-$(CONFIG_JFFS_FS) += jffs/
|
||||
obj-$(CONFIG_JFFS2_FS) += jffs2/
|
||||
obj-$(CONFIG_AFFS_FS) += affs/
|
||||
+obj-$(CONFIG_ASFS_FS) += asfs/
|
||||
obj-$(CONFIG_ROMFS_FS) += romfs/
|
||||
obj-$(CONFIG_QNX4FS_FS) += qnx4/
|
||||
obj-$(CONFIG_AUTOFS_FS) += autofs/
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/Changes linux-2.6.19-rc6/fs/asfs/Changes
|
||||
--- linux-2.6.19-rc6/fs/asfs/Changes 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/Changes 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,116 @@
|
||||
+
|
||||
+Amiga Smart File System, Linux implementation
|
||||
+
|
||||
+Please direct bug reports to: marek@amiga.pl
|
||||
+
|
||||
+History:
|
||||
+
|
||||
+v1.0beta11 (22.09.2006)
|
||||
+- adapted to 2.6.18 kernel VFS changes
|
||||
+- made some functions static to reduce overhead in kernel namespace
|
||||
+
|
||||
+v1.0beta10 (13.06.2005)
|
||||
+- fixed ugly bug introduced in beta9 that caused kernel crash on x86
|
||||
+ (thanks to Emiliano for reporting it!)
|
||||
+
|
||||
+v1.0beta9 (17.03.2005)
|
||||
+- added NLS support (thanks to Pavel Fedin!)
|
||||
+
|
||||
+v1.0beta8 (07.01.2005)
|
||||
+- adapted to 2.6.10 kernel VFS changes
|
||||
+- added workaround for buggy Mandrake kernel headers
|
||||
+
|
||||
+v1.0beta7 (25.06.2004)
|
||||
+- small changes in documentation
|
||||
+- code clean up: bitfuncs.c, super.c, inode.c, *.h, Makefile, added
|
||||
+ asfs_ prefix to function names, made some functions static
|
||||
+ (big thanks to Christoph Hellwig for advice!)
|
||||
+- fixed minor bugs (inode leak in super.c, not-realesed buffer during
|
||||
+ object renaming in inode.c)
|
||||
+- now files/dirs are created with global ownership/permission bits
|
||||
+
|
||||
+v1.0beta6 (04.06.2004)
|
||||
+- fixed: ASFS_SB(sb)->flags was always zero in 2.6.x code
|
||||
+
|
||||
+v1.0beta5 (07.05.2004)
|
||||
+- finally fixed a problem with file size attrib. not being written
|
||||
+ to disk
|
||||
+- fixed some problems with GCC 3.x and debug enabled
|
||||
+
|
||||
+v1.0beta4 (12.04.2004)
|
||||
+- removed dummy asfs_notify_change (this fixes major bug introduced
|
||||
+ in 1.0beta3 - file size wasn't written to disk) until it will
|
||||
+ be implemented completely
|
||||
+
|
||||
+v1.0beta3 (22.03.2004) - still beta
|
||||
+- updated for 2.6.x kernels VFS changes
|
||||
+- code clean-up
|
||||
+- added dummy asfs_notify_change (chmod now returns no errors)
|
||||
+- added symlinks write support
|
||||
+- fixed: ASFS_SB(sb)->flags was always zero
|
||||
+
|
||||
+v1.0beta2 (11.01.2004) - special version for Pegasos][ kernel
|
||||
+- separated read and write functions, can be compiled also
|
||||
+ as read-only fs
|
||||
+
|
||||
+v1.0beta1 (02.12.2003) - first public beta with write support
|
||||
+- added dentry hashing/comparing routines
|
||||
+- code clean-up
|
||||
+
|
||||
+v1.0aplha4 (30.11.2003) - preparing for first public beta
|
||||
+- fixed some problems with renaming/moving files
|
||||
+- fixed two major bugs, which didn't occur when fs was mounted
|
||||
+ on loopback device (newly allocated blocks were not written to
|
||||
+ disk and state bits were not set correctly on newly mapped file
|
||||
+ blocks)
|
||||
+- fixed many small bugs in io code (some buffers were not freed)
|
||||
+- added/modified sb locks in asfs_lookup and asfs_getblock
|
||||
+- fixed serious bug in file block allocation routines
|
||||
+
|
||||
+v1.0aplha3 (23.11.2003)
|
||||
+- added (hopefully) all byteswap code, should now work again on
|
||||
+ little-endian systems (also with write support!)
|
||||
+- updated documentation
|
||||
+
|
||||
+v1.0alpha2 (13.11.2003)
|
||||
+- now alocates file blocks in chunks during one request
|
||||
+- fixed some dead-locks, other fixes
|
||||
+
|
||||
+v1.0alpha (02.11.2003) - first working version with full write support
|
||||
+- too much to list it here ;)
|
||||
+
|
||||
+... (working on write support)
|
||||
+
|
||||
+v0.7 (12.10.2003) - internal realase
|
||||
+- added asfs_breadcheck, modified asfs_get_node, asfs_search_BTree,
|
||||
+ no more from_be32/16 macros, other...
|
||||
+- code splitted into several files
|
||||
+
|
||||
+v0.6 (04.09.2003) - final read-only version
|
||||
+- added support for HashTables, directory scaning should be
|
||||
+ MUCH faster now
|
||||
+- added checking of block IDs before reading any data from block
|
||||
+
|
||||
+v0.5 (19.07.2003)
|
||||
+- added simple but effective extent cache - real speed-up
|
||||
+ in reading large files
|
||||
+- added read support for symlinks - based on AFFS symlinks
|
||||
+
|
||||
+v0.4 (10.07.2003)
|
||||
+- third code clean-up (thanks to Roman Zippel for advice)
|
||||
+- now uses generic readpage and readinode routines
|
||||
+
|
||||
+v0.3beta (17.06.2003)
|
||||
+- second code clean-up
|
||||
+
|
||||
+v0.2beta2 (15.06.2003)
|
||||
+- fixed yet another stupid bug - driver can't read root block on little-endian systems
|
||||
+v0.2beta (15.06.2003)
|
||||
+- fixed stupid bug - now files have 'file' flag (S_IFREG) set...
|
||||
+- added mount options to set uid, gid and mode of files and dirs
|
||||
+- made hidden files & dirs really hidden (= not listed in directories)
|
||||
+- code clean-up
|
||||
+
|
||||
+v0.1beta (11.06.2003)
|
||||
+- after many kernel crashes, finally got it!
|
||||
+- first working read-only filesystem driver
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/Makefile linux-2.6.19-rc6/fs/asfs/Makefile
|
||||
--- linux-2.6.19-rc6/fs/asfs/Makefile 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/Makefile 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,8 @@
|
||||
+#
|
||||
+# Makefile for the linux asfs filesystem routines.
|
||||
+#
|
||||
+
|
||||
+obj-$(CONFIG_ASFS_FS) += asfs.o
|
||||
+
|
||||
+asfs-y += dir.o extents.o file.o inode.o namei.o nodes.o objects.o super.o symlink.o
|
||||
+asfs-$(CONFIG_ASFS_RW) += adminspace.o bitfuncs.o
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/adminspace.c linux-2.6.19-rc6/fs/asfs/adminspace.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/adminspace.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/adminspace.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,446 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -633,9 +833,9 @@ diff -urN linux-2.6.18/fs/asfs/adminspace.c linux-2.6.18-asfs-1.0b11/fs/asfs/adm
|
|||
+}
|
||||
+
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/asfs_fs.h linux-2.6.18-asfs-1.0b11/fs/asfs/asfs_fs.h
|
||||
--- linux-2.6.18/fs/asfs/asfs_fs.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/asfs_fs.h 2006-09-22 23:18:03.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/asfs_fs.h linux-2.6.19-rc6/fs/asfs/asfs_fs.h
|
||||
--- linux-2.6.19-rc6/fs/asfs/asfs_fs.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/asfs_fs.h 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,217 @@
|
||||
+#ifndef __LINUX_ASFS_FS_H
|
||||
+#define __LINUX_ASFS_FS_H
|
||||
|
@ -854,10 +1054,9 @@ diff -urN linux-2.6.18/fs/asfs/asfs_fs.h linux-2.6.18-asfs-1.0b11/fs/asfs/asfs_f
|
|||
+int asfs_write_symlink(struct inode *symfile, const char *symname);
|
||||
+
|
||||
+#endif
|
||||
Pliki binarne linux-2.6.18/fs/asfs/asfs.ko i linux-2.6.18-asfs-1.0b11/fs/asfs/asfs.ko siê ró¿ni±
|
||||
diff -urN linux-2.6.18/fs/asfs/bitfuncs.c linux-2.6.18-asfs-1.0b11/fs/asfs/bitfuncs.c
|
||||
--- linux-2.6.18/fs/asfs/bitfuncs.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/bitfuncs.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/bitfuncs.c linux-2.6.19-rc6/fs/asfs/bitfuncs.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/bitfuncs.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/bitfuncs.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,171 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -1030,9 +1229,9 @@ diff -urN linux-2.6.18/fs/asfs/bitfuncs.c linux-2.6.18-asfs-1.0b11/fs/asfs/bitfu
|
|||
+ }
|
||||
+ return (orgbits - bits);
|
||||
+}
|
||||
diff -urN linux-2.6.18/fs/asfs/bitfuncs.h linux-2.6.18-asfs-1.0b11/fs/asfs/bitfuncs.h
|
||||
--- linux-2.6.18/fs/asfs/bitfuncs.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/bitfuncs.h 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/bitfuncs.h linux-2.6.19-rc6/fs/asfs/bitfuncs.h
|
||||
--- linux-2.6.19-rc6/fs/asfs/bitfuncs.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/bitfuncs.h 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,59 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -1093,129 +1292,9 @@ diff -urN linux-2.6.18/fs/asfs/bitfuncs.h linux-2.6.18-asfs-1.0b11/fs/asfs/bitfu
|
|||
+int bmset(u32 *, int, int, int);
|
||||
+
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/Changes linux-2.6.18-asfs-1.0b11/fs/asfs/Changes
|
||||
--- linux-2.6.18/fs/asfs/Changes 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/Changes 2006-09-22 23:24:31.000000000 +0200
|
||||
@@ -0,0 +1,116 @@
|
||||
+
|
||||
+Amiga Smart File System, Linux implementation
|
||||
+
|
||||
+Please direct bug reports to: marek@amiga.pl
|
||||
+
|
||||
+History:
|
||||
+
|
||||
+v1.0beta11 (22.09.2006)
|
||||
+- adapted to 2.6.18 kernel VFS changes
|
||||
+- made some functions static to reduce overhead in kernel namespace
|
||||
+
|
||||
+v1.0beta10 (13.06.2005)
|
||||
+- fixed ugly bug introduced in beta9 that caused kernel crash on x86
|
||||
+ (thanks to Emiliano for reporting it!)
|
||||
+
|
||||
+v1.0beta9 (17.03.2005)
|
||||
+- added NLS support (thanks to Pavel Fedin!)
|
||||
+
|
||||
+v1.0beta8 (07.01.2005)
|
||||
+- adapted to 2.6.10 kernel VFS changes
|
||||
+- added workaround for buggy Mandrake kernel headers
|
||||
+
|
||||
+v1.0beta7 (25.06.2004)
|
||||
+- small changes in documentation
|
||||
+- code clean up: bitfuncs.c, super.c, inode.c, *.h, Makefile, added
|
||||
+ asfs_ prefix to function names, made some functions static
|
||||
+ (big thanks to Christoph Hellwig for advice!)
|
||||
+- fixed minor bugs (inode leak in super.c, not-realesed buffer during
|
||||
+ object renaming in inode.c)
|
||||
+- now files/dirs are created with global ownership/permission bits
|
||||
+
|
||||
+v1.0beta6 (04.06.2004)
|
||||
+- fixed: ASFS_SB(sb)->flags was always zero in 2.6.x code
|
||||
+
|
||||
+v1.0beta5 (07.05.2004)
|
||||
+- finally fixed a problem with file size attrib. not being written
|
||||
+ to disk
|
||||
+- fixed some problems with GCC 3.x and debug enabled
|
||||
+
|
||||
+v1.0beta4 (12.04.2004)
|
||||
+- removed dummy asfs_notify_change (this fixes major bug introduced
|
||||
+ in 1.0beta3 - file size wasn't written to disk) until it will
|
||||
+ be implemented completely
|
||||
+
|
||||
+v1.0beta3 (22.03.2004) - still beta
|
||||
+- updated for 2.6.x kernels VFS changes
|
||||
+- code clean-up
|
||||
+- added dummy asfs_notify_change (chmod now returns no errors)
|
||||
+- added symlinks write support
|
||||
+- fixed: ASFS_SB(sb)->flags was always zero
|
||||
+
|
||||
+v1.0beta2 (11.01.2004) - special version for Pegasos][ kernel
|
||||
+- separated read and write functions, can be compiled also
|
||||
+ as read-only fs
|
||||
+
|
||||
+v1.0beta1 (02.12.2003) - first public beta with write support
|
||||
+- added dentry hashing/comparing routines
|
||||
+- code clean-up
|
||||
+
|
||||
+v1.0aplha4 (30.11.2003) - preparing for first public beta
|
||||
+- fixed some problems with renaming/moving files
|
||||
+- fixed two major bugs, which didn't occur when fs was mounted
|
||||
+ on loopback device (newly allocated blocks were not written to
|
||||
+ disk and state bits were not set correctly on newly mapped file
|
||||
+ blocks)
|
||||
+- fixed many small bugs in io code (some buffers were not freed)
|
||||
+- added/modified sb locks in asfs_lookup and asfs_getblock
|
||||
+- fixed serious bug in file block allocation routines
|
||||
+
|
||||
+v1.0aplha3 (23.11.2003)
|
||||
+- added (hopefully) all byteswap code, should now work again on
|
||||
+ little-endian systems (also with write support!)
|
||||
+- updated documentation
|
||||
+
|
||||
+v1.0alpha2 (13.11.2003)
|
||||
+- now alocates file blocks in chunks during one request
|
||||
+- fixed some dead-locks, other fixes
|
||||
+
|
||||
+v1.0alpha (02.11.2003) - first working version with full write support
|
||||
+- too much to list it here ;)
|
||||
+
|
||||
+... (working on write support)
|
||||
+
|
||||
+v0.7 (12.10.2003) - internal realase
|
||||
+- added asfs_breadcheck, modified asfs_get_node, asfs_search_BTree,
|
||||
+ no more from_be32/16 macros, other...
|
||||
+- code splitted into several files
|
||||
+
|
||||
+v0.6 (04.09.2003) - final read-only version
|
||||
+- added support for HashTables, directory scaning should be
|
||||
+ MUCH faster now
|
||||
+- added checking of block IDs before reading any data from block
|
||||
+
|
||||
+v0.5 (19.07.2003)
|
||||
+- added simple but effective extent cache - real speed-up
|
||||
+ in reading large files
|
||||
+- added read support for symlinks - based on AFFS symlinks
|
||||
+
|
||||
+v0.4 (10.07.2003)
|
||||
+- third code clean-up (thanks to Roman Zippel for advice)
|
||||
+- now uses generic readpage and readinode routines
|
||||
+
|
||||
+v0.3beta (17.06.2003)
|
||||
+- second code clean-up
|
||||
+
|
||||
+v0.2beta2 (15.06.2003)
|
||||
+- fixed yet another stupid bug - driver can't read root block on little-endian systems
|
||||
+v0.2beta (15.06.2003)
|
||||
+- fixed stupid bug - now files have 'file' flag (S_IFREG) set...
|
||||
+- added mount options to set uid, gid and mode of files and dirs
|
||||
+- made hidden files & dirs really hidden (= not listed in directories)
|
||||
+- code clean-up
|
||||
+
|
||||
+v0.1beta (11.06.2003)
|
||||
+- after many kernel crashes, finally got it!
|
||||
+- first working read-only filesystem driver
|
||||
diff -urN linux-2.6.18/fs/asfs/dir.c linux-2.6.18-asfs-1.0b11/fs/asfs/dir.c
|
||||
--- linux-2.6.18/fs/asfs/dir.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/dir.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/dir.c linux-2.6.19-rc6/fs/asfs/dir.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/dir.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/dir.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,240 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -1457,9 +1536,9 @@ diff -urN linux-2.6.18/fs/asfs/dir.c linux-2.6.18-asfs-1.0b11/fs/asfs/dir.c
|
|||
+ d_add(dentry, inode);
|
||||
+ return ERR_PTR(res);
|
||||
+}
|
||||
diff -urN linux-2.6.18/fs/asfs/extents.c linux-2.6.18-asfs-1.0b11/fs/asfs/extents.c
|
||||
--- linux-2.6.18/fs/asfs/extents.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/extents.c 2006-09-22 23:22:48.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/extents.c linux-2.6.19-rc6/fs/asfs/extents.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/extents.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/extents.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,586 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -2047,9 +2126,9 @@ diff -urN linux-2.6.18/fs/asfs/extents.c linux-2.6.18-asfs-1.0b11/fs/asfs/extent
|
|||
+ return errorcode;
|
||||
+}
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/file.c linux-2.6.18-asfs-1.0b11/fs/asfs/file.c
|
||||
--- linux-2.6.18/fs/asfs/file.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/file.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/file.c linux-2.6.19-rc6/fs/asfs/file.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/file.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/file.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,251 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -2302,9 +2381,9 @@ diff -urN linux-2.6.18/fs/asfs/file.c linux-2.6.18-asfs-1.0b11/fs/asfs/file.c
|
|||
+}
|
||||
+
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/inode.c linux-2.6.18-asfs-1.0b11/fs/asfs/inode.c
|
||||
--- linux-2.6.18/fs/asfs/inode.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/inode.c 2006-09-22 23:22:35.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/inode.c linux-2.6.19-rc6/fs/asfs/inode.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/inode.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/inode.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,436 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -2742,21 +2821,9 @@ diff -urN linux-2.6.18/fs/asfs/inode.c linux-2.6.18-asfs-1.0b11/fs/asfs/inode.c
|
|||
+}
|
||||
+*/
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/Makefile linux-2.6.18-asfs-1.0b11/fs/asfs/Makefile
|
||||
--- linux-2.6.18/fs/asfs/Makefile 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/Makefile 2006-09-22 22:52:37.000000000 +0200
|
||||
@@ -0,0 +1,8 @@
|
||||
+#
|
||||
+# Makefile for the linux asfs filesystem routines.
|
||||
+#
|
||||
+
|
||||
+obj-$(CONFIG_ASFS_FS) += asfs.o
|
||||
+
|
||||
+asfs-y += dir.o extents.o file.o inode.o namei.o nodes.o objects.o super.o symlink.o
|
||||
+asfs-$(CONFIG_ASFS_RW) += adminspace.o bitfuncs.o
|
||||
diff -urN linux-2.6.18/fs/asfs/namei.c linux-2.6.18-asfs-1.0b11/fs/asfs/namei.c
|
||||
--- linux-2.6.18/fs/asfs/namei.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/namei.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/namei.c linux-2.6.19-rc6/fs/asfs/namei.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/namei.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/namei.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,197 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -2955,9 +3022,9 @@ diff -urN linux-2.6.18/fs/asfs/namei.c linux-2.6.18-asfs-1.0b11/fs/asfs/namei.c
|
|||
+ to[limit-1] = '\0';
|
||||
+ }
|
||||
+}
|
||||
diff -urN linux-2.6.18/fs/asfs/nodes.c linux-2.6.18-asfs-1.0b11/fs/asfs/nodes.c
|
||||
--- linux-2.6.18/fs/asfs/nodes.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/nodes.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/nodes.c linux-2.6.19-rc6/fs/asfs/nodes.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/nodes.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/nodes.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,455 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -3414,9 +3481,9 @@ diff -urN linux-2.6.18/fs/asfs/nodes.c linux-2.6.18-asfs-1.0b11/fs/asfs/nodes.c
|
|||
+}
|
||||
+
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/objects.c linux-2.6.18-asfs-1.0b11/fs/asfs/objects.c
|
||||
--- linux-2.6.18/fs/asfs/objects.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/objects.c 2006-09-22 23:22:42.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/objects.c linux-2.6.19-rc6/fs/asfs/objects.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/objects.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/objects.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,765 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -4183,9 +4250,9 @@ diff -urN linux-2.6.18/fs/asfs/objects.c linux-2.6.18-asfs-1.0b11/fs/asfs/object
|
|||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/asfs/super.c linux-2.6.18-asfs-1.0b11/fs/asfs/super.c
|
||||
--- linux-2.6.18/fs/asfs/super.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/super.c 2006-09-22 23:22:22.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/super.c linux-2.6.19-rc6/fs/asfs/super.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/super.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/super.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,497 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -4684,9 +4751,9 @@ diff -urN linux-2.6.18/fs/asfs/super.c linux-2.6.18-asfs-1.0b11/fs/asfs/super.c
|
|||
+
|
||||
+module_init(init_asfs_fs)
|
||||
+module_exit(exit_asfs_fs)
|
||||
diff -urN linux-2.6.18/fs/asfs/symlink.c linux-2.6.18-asfs-1.0b11/fs/asfs/symlink.c
|
||||
--- linux-2.6.18/fs/asfs/symlink.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/asfs/symlink.c 2006-09-22 22:52:37.000000000 +0200
|
||||
diff -Nur linux-2.6.19-rc6/fs/asfs/symlink.c linux-2.6.19-rc6/fs/asfs/symlink.c
|
||||
--- linux-2.6.19-rc6/fs/asfs/symlink.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/fs/asfs/symlink.c 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,235 @@
|
||||
+/*
|
||||
+ *
|
||||
|
@ -4923,77 +4990,8 @@ diff -urN linux-2.6.18/fs/asfs/symlink.c linux-2.6.18-asfs-1.0b11/fs/asfs/symlin
|
|||
+}
|
||||
+
|
||||
+#endif
|
||||
diff -urN linux-2.6.18/fs/Kconfig linux-2.6.18-asfs-1.0b11/fs/Kconfig
|
||||
--- linux-2.6.18/fs/Kconfig 2006-09-22 22:48:22.000000000 +0200
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/Kconfig 2006-09-22 22:52:37.000000000 +0200
|
||||
@@ -955,6 +955,53 @@
|
||||
To compile this file system support as a module, choose M here: the
|
||||
module will be called affs. If unsure, say N.
|
||||
|
||||
+config ASFS_FS
|
||||
+ tristate "Amiga SFS file system support (EXPERIMENTAL)"
|
||||
+ select NLS
|
||||
+ depends on EXPERIMENTAL
|
||||
+ help
|
||||
+
|
||||
+ The Amiga Smart FileSystem (SFS) is the file system used on hard
|
||||
+ disks by Amiga(tm) and MorphOS(tm) systems. Say Y if you want
|
||||
+ to be able to read files from an Amiga SFS partition on your hard
|
||||
+ drive.
|
||||
+
|
||||
+ For more information read <file:Documentation/filesystems/asfs.txt>
|
||||
+
|
||||
+ To compile this file system support as a module, choose M here: the
|
||||
+ module will be called asfs.
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
+config ASFS_DEFAULT_CODEPAGE
|
||||
+ string "Default codepage for SFS"
|
||||
+ depends on ASFS_FS
|
||||
+ default ""
|
||||
+ help
|
||||
+ This option should be set to the codepage of your SFS filesystems.
|
||||
+ It can be overridden with the 'codepage' mount option. Leave it blank
|
||||
+ or enter 'none' to disable filename converting.
|
||||
+
|
||||
+ Use full codepage name (for example 'cp1251' instead of '1251') here,
|
||||
+ this allows to specify any character set, not only numbered one (like
|
||||
+ 'iso8859-2').
|
||||
+
|
||||
+ If unsure, leave it blank.
|
||||
+
|
||||
+config ASFS_RW
|
||||
+ bool "Amiga SFS write support (DANGEROUS)"
|
||||
+ depends on ASFS_FS
|
||||
+ help
|
||||
+
|
||||
+ If you say Y here, you will be able to write to ASFS file
|
||||
+ systems as well as read from them. The read-write support in ASFS
|
||||
+ is in beta stage. This means that useing it to write files to SFS
|
||||
+ partitions is DANGEROUS and COULD corrupt the filesystem.
|
||||
+
|
||||
+ For more information read <file:Documentation/filesystems/asfs.txt>
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
config HFS_FS
|
||||
tristate "Apple Macintosh file system support (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
diff -urN linux-2.6.18/fs/Makefile linux-2.6.18-asfs-1.0b11/fs/Makefile
|
||||
--- linux-2.6.18/fs/Makefile 2006-09-22 22:48:22.000000000 +0200
|
||||
+++ linux-2.6.18-asfs-1.0b11/fs/Makefile 2006-09-22 22:52:37.000000000 +0200
|
||||
@@ -85,6 +85,7 @@
|
||||
obj-$(CONFIG_JFFS_FS) += jffs/
|
||||
obj-$(CONFIG_JFFS2_FS) += jffs2/
|
||||
obj-$(CONFIG_AFFS_FS) += affs/
|
||||
+obj-$(CONFIG_ASFS_FS) += asfs/
|
||||
obj-$(CONFIG_ROMFS_FS) += romfs/
|
||||
obj-$(CONFIG_QNX4FS_FS) += qnx4/
|
||||
obj-$(CONFIG_AUTOFS_FS) += autofs/
|
||||
diff -urN linux-2.6.18/include/linux/amigasfs.h linux-2.6.18-asfs-1.0b11/include/linux/amigasfs.h
|
||||
--- linux-2.6.18/include/linux/amigasfs.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.18-asfs-1.0b11/include/linux/amigasfs.h 2006-09-22 22:52:37.000000000 +0200
|
||||
--- linux-2.6.19-rc6/include/linux/amigasfs.h 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-2.6.19-rc6/include/linux/amigasfs.h 2006-11-24 18:19:03.000000000 +0100
|
||||
@@ -0,0 +1,276 @@
|
||||
+#ifndef __LINUX_AMIGASFS_H
|
||||
+#define __LINUX_AMIGASFS_H
|
||||
|
@ -5271,6 +5269,3 @@ diff -urN linux-2.6.18/include/linux/amigasfs.h linux-2.6.18-asfs-1.0b11/include
|
|||
+};
|
||||
+
|
||||
+#endif
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
From 9f3ff0ffed7c1fc1dbf3c0628f1a22a20d0846ce Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 12:40:48 +0100
|
||||
Subject: [PATCH] Fix compilation issue when PPC_MPC52xx and PPC_MERGE are selected
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
include/asm-ppc/io.h | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h
|
||||
index a4c411b..8ed380c 100644
|
||||
--- a/include/asm-ppc/io.h
|
||||
+++ b/include/asm-ppc/io.h
|
||||
@@ -26,7 +26,7 @@ #define PREP_PCI_DRAM_OFFSET 0x80000000
|
||||
|
||||
#if defined(CONFIG_4xx)
|
||||
#include <asm/ibm4xx.h>
|
||||
-#elif defined(CONFIG_PPC_MPC52xx)
|
||||
+#elif defined(CONFIG_PPC_MPC52xx) && !defined(CONFIG_PPC_MERGE)
|
||||
#include <asm/mpc52xx.h>
|
||||
#elif defined(CONFIG_8xx)
|
||||
#include <asm/mpc8xx.h>
|
||||
--
|
||||
1.4.3.2
|
||||
|
360
debian/patches/features/powerpc/efika/0002-Add-USB-OHCI-glue-for-OpenFirmware-devices.diff
vendored
Normal file
360
debian/patches/features/powerpc/efika/0002-Add-USB-OHCI-glue-for-OpenFirmware-devices.diff
vendored
Normal file
|
@ -0,0 +1,360 @@
|
|||
From bc515daf6d0845b0ddb739f3ba822b66f84344a7 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 12:55:37 +0100
|
||||
Subject: [PATCH] Add USB/OHCI glue for OpenFirmware devices
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
drivers/usb/host/Kconfig | 19 +++
|
||||
drivers/usb/host/ohci-hcd.c | 6 +
|
||||
drivers/usb/host/ohci-ppc-of.c | 285 ++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 310 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
|
||||
index cf10cbc..f5ef6f5 100644
|
||||
--- a/drivers/usb/host/Kconfig
|
||||
+++ b/drivers/usb/host/Kconfig
|
||||
@@ -106,6 +106,25 @@ config USB_OHCI_HCD_PPC_SOC
|
||||
Enables support for the USB controller on the MPC52xx or
|
||||
STB03xxx processor chip. If unsure, say Y.
|
||||
|
||||
+config USB_OHCI_HCD_PPC_OF
|
||||
+ bool "OHCI support for PPC USB controller for OpenFirmware platform"
|
||||
+ depends on USB_OHCI_HCD && PPC_OF
|
||||
+ default y
|
||||
+ ---help---
|
||||
+ Enables support for the USB controller PowerPC OpenFirmware platform
|
||||
+
|
||||
+config USB_OHCI_HCD_PPC_OF_BE
|
||||
+ bool "Support big endian HC"
|
||||
+ depends on USB_OHCI_HCD_PPC_OF
|
||||
+ default y
|
||||
+ select USB_OHCI_BIG_ENDIAN
|
||||
+
|
||||
+config USB_OHCI_HCD_PPC_OF_LE
|
||||
+ bool "Support little endian HC"
|
||||
+ depends on USB_OHCI_HCD_PPC_OF
|
||||
+ default n
|
||||
+ select USB_OHCI_LITTLE_ENDIAN
|
||||
+
|
||||
config USB_OHCI_HCD_PCI
|
||||
bool "OHCI support for PCI-bus USB controllers"
|
||||
depends on USB_OHCI_HCD && PCI && (STB03xxx || PPC_MPC52xx)
|
||||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
|
||||
index 9be6b30..04413b6 100644
|
||||
--- a/drivers/usb/host/ohci-hcd.c
|
||||
+++ b/drivers/usb/host/ohci-hcd.c
|
||||
@@ -930,6 +930,10 @@ #ifdef CONFIG_USB_OHCI_HCD_PPC_SOC
|
||||
#include "ohci-ppc-soc.c"
|
||||
#endif
|
||||
|
||||
+#ifdef CONFIG_USB_OHCI_HCD_PPC_OF
|
||||
+#include "ohci-ppc-of.c"
|
||||
+#endif
|
||||
+
|
||||
#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261)
|
||||
#include "ohci-at91.c"
|
||||
#endif
|
||||
@@ -950,6 +954,8 @@ #if !(defined(CONFIG_PCI) \
|
||||
|| defined (CONFIG_ARCH_AT91RM9200) \
|
||||
|| defined (CONFIG_ARCH_AT91SAM9261) \
|
||||
|| defined (CONFIG_ARCH_PNX4008) \
|
||||
+ || defined (CONFIG_USB_OHCI_HCD_PPC_OF_LE) \
|
||||
+ || defined (CONFIG_USB_OHCI_HCD_PPC_OF_BE) \
|
||||
)
|
||||
#error "missing bus glue for ohci-hcd"
|
||||
#endif
|
||||
diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c
|
||||
new file mode 100644
|
||||
index 0000000..30ce520
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/host/ohci-ppc-of.c
|
||||
@@ -0,0 +1,285 @@
|
||||
+/*
|
||||
+ * OHCI HCD (Host Controller Driver) for USB.
|
||||
+ *
|
||||
+ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
|
||||
+ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
|
||||
+ * (C) Copyright 2002 Hewlett-Packard Company
|
||||
+ * (C) Copyright 2003-2005 MontaVista Software Inc.
|
||||
+ *
|
||||
+ * Probe and init OHCI Big endian HC from OpenFirmware device tree
|
||||
+ * Tested on Efika 5k2
|
||||
+ *
|
||||
+ * Modified by Dale Farnsworth <dale@farnsworth.org> from ohci-sa1111.c
|
||||
+ *
|
||||
+ * This file is licenced under the GPL.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/signal.h>
|
||||
+
|
||||
+#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
+#include <asm/prom.h>
|
||||
+
|
||||
+/* configure so an HC device and id are always provided */
|
||||
+/* always called with process context; sleeping is OK */
|
||||
+
|
||||
+/*
|
||||
+ * usb_hcd_ppc_of_probe - initialize On-Chip HCDs
|
||||
+ * Context: !in_interrupt()
|
||||
+ *
|
||||
+ * Allocates basic resources for this USB host controller.
|
||||
+ *
|
||||
+ * Store this function in the HCD's struct pci_driver as probe().
|
||||
+ */
|
||||
+static int usb_hcd_ppc_of_probe(const struct hc_driver *driver,
|
||||
+ struct of_device *dev, int is_bigendian)
|
||||
+{
|
||||
+ int retval;
|
||||
+ struct usb_hcd *hcd;
|
||||
+ struct ohci_hcd *ohci;
|
||||
+ struct resource res;
|
||||
+ int irq;
|
||||
+ int ret;
|
||||
+
|
||||
+ pr_debug("initializing PPC-OF USB Controller\n");
|
||||
+
|
||||
+ if ((ret = of_address_to_resource(dev->node, 0, &res)) != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ hcd = usb_create_hcd(driver, &dev->dev, "PPC-OF USB");
|
||||
+ if (!hcd)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ hcd->rsrc_start = res.start;
|
||||
+ hcd->rsrc_len = res.end - res.start + 1;
|
||||
+
|
||||
+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
|
||||
+ pr_debug(__FILE__ ": request_mem_region failed\n");
|
||||
+ retval = -EBUSY;
|
||||
+ goto err1;
|
||||
+ }
|
||||
+
|
||||
+ irq = irq_of_parse_and_map(dev->node, 0);
|
||||
+ if (irq == NO_IRQ) {
|
||||
+ retval = -EBUSY;
|
||||
+ goto err2;
|
||||
+ }
|
||||
+
|
||||
+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
|
||||
+ if (!hcd->regs) {
|
||||
+ pr_debug(__FILE__ ": ioremap failed\n");
|
||||
+ retval = -ENOMEM;
|
||||
+ goto err2;
|
||||
+ }
|
||||
+
|
||||
+ ohci = hcd_to_ohci(hcd);
|
||||
+ if (is_bigendian)
|
||||
+ ohci->flags |= OHCI_BIG_ENDIAN;
|
||||
+
|
||||
+ ohci_hcd_init(ohci);
|
||||
+
|
||||
+ retval = usb_add_hcd(hcd, irq, 0);
|
||||
+ if (retval == 0)
|
||||
+ return retval;
|
||||
+
|
||||
+ pr_debug("Removing PPC-OF USB Controller\n");
|
||||
+
|
||||
+ iounmap(hcd->regs);
|
||||
+ err2:
|
||||
+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||
+ err1:
|
||||
+ usb_put_hcd(hcd);
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* may be called without controller electrically present */
|
||||
+/* may be called with controller, bus, and devices active */
|
||||
+
|
||||
+/*
|
||||
+ * usb_hcd_ppc_of_remove - shutdown processing for On-Chip HCDs
|
||||
+ * @pdev: USB Host Controller being removed
|
||||
+ * Context: !in_interrupt()
|
||||
+ *
|
||||
+ * Reverses the effect of usb_hcd_ppc_of_probe().
|
||||
+ * It is always called from a thread
|
||||
+ * context, normally "rmmod", "apmd", or something similar.
|
||||
+ *
|
||||
+ */
|
||||
+static void usb_hcd_ppc_of_remove(struct usb_hcd *hcd,
|
||||
+ struct of_device *op)
|
||||
+{
|
||||
+ usb_remove_hcd(hcd);
|
||||
+
|
||||
+ pr_debug("stopping PPC-OF USB Controller\n");
|
||||
+
|
||||
+ iounmap(hcd->regs);
|
||||
+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||
+ usb_put_hcd(hcd);
|
||||
+}
|
||||
+
|
||||
+static int __devinit
|
||||
+ohci_ppc_of_start(struct usb_hcd *hcd)
|
||||
+{
|
||||
+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
||||
+ int ret;
|
||||
+
|
||||
+ if ((ret = ohci_init(ohci)) < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ if ((ret = ohci_run(ohci)) < 0) {
|
||||
+ err("can't start %s", ohci_to_hcd(ohci)->self.bus_name);
|
||||
+ ohci_stop(hcd);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct hc_driver ohci_ppc_of_hc_driver = {
|
||||
+ .description = hcd_name,
|
||||
+ .hcd_priv_size = sizeof(struct ohci_hcd),
|
||||
+
|
||||
+ /*
|
||||
+ * generic hardware linkage
|
||||
+ */
|
||||
+ .irq = ohci_irq,
|
||||
+ .flags = HCD_USB11 | HCD_MEMORY,
|
||||
+
|
||||
+ /*
|
||||
+ * basic lifecycle operations
|
||||
+ */
|
||||
+ .start = ohci_ppc_of_start,
|
||||
+ .stop = ohci_stop,
|
||||
+ .shutdown = ohci_shutdown,
|
||||
+
|
||||
+ /*
|
||||
+ * managing i/o requests and associated device resources
|
||||
+ */
|
||||
+ .urb_enqueue = ohci_urb_enqueue,
|
||||
+ .urb_dequeue = ohci_urb_dequeue,
|
||||
+ .endpoint_disable = ohci_endpoint_disable,
|
||||
+
|
||||
+ /*
|
||||
+ * scheduling support
|
||||
+ */
|
||||
+ .get_frame_number = ohci_get_frame,
|
||||
+
|
||||
+ /*
|
||||
+ * root hub support
|
||||
+ */
|
||||
+ .hub_status_data = ohci_hub_status_data,
|
||||
+ .hub_control = ohci_hub_control,
|
||||
+ .hub_irq_enable = ohci_rhsc_enable,
|
||||
+#ifdef CONFIG_PM
|
||||
+ .bus_suspend = ohci_bus_suspend,
|
||||
+ .bus_resume = ohci_bus_resume,
|
||||
+#endif
|
||||
+ .start_port_reset = ohci_start_port_reset,
|
||||
+};
|
||||
+
|
||||
+
|
||||
+
|
||||
+static int ohci_hcd_ppc_of_drv_remove(struct of_device *op)
|
||||
+{
|
||||
+ struct usb_hcd *hcd = dev_get_drvdata(&op->dev);
|
||||
+ dev_set_drvdata(&op->dev, NULL);
|
||||
+
|
||||
+ usb_hcd_ppc_of_remove(hcd, op);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ohci_hcd_ppc_of_drv_shutdown(struct of_device *op)
|
||||
+{
|
||||
+ struct usb_hcd *hcd = dev_get_drvdata(&op->dev);
|
||||
+
|
||||
+ if (hcd->driver->shutdown)
|
||||
+ hcd->driver->shutdown(hcd);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ *
|
||||
+*/
|
||||
+
|
||||
+static struct of_device_id ohci_hcd_ppc_of_match[] = {
|
||||
+#ifdef CONFIG_USB_OHCI_HCD_PPC_OF_BE
|
||||
+ {
|
||||
+ .name = "usb",
|
||||
+ .compatible = "ohci-bigendian",
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "usb",
|
||||
+ .compatible = "ohci-be",
|
||||
+ },
|
||||
+#endif
|
||||
+#ifdef CONFIG_USB_OHCI_HCD_PPC_OF_LE
|
||||
+ {
|
||||
+ .name = "usb",
|
||||
+ .compatible = "ohci-littledian",
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "usb",
|
||||
+ .compatible = "ohci-le",
|
||||
+ },
|
||||
+#endif
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
+static int __devinit
|
||||
+ohci_hcd_ppc_of_drv_probe(struct of_device *op, const struct of_device_id *match)
|
||||
+{
|
||||
+ struct device_node *dev;
|
||||
+ int ret;
|
||||
+ int is_bigendian;
|
||||
+
|
||||
+ if (usb_disabled())
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ dev = op->node;
|
||||
+ is_bigendian = 0;
|
||||
+
|
||||
+ if ( device_is_compatible(dev, "ohci-bigendian") )
|
||||
+ is_bigendian = 1;
|
||||
+
|
||||
+ if ( device_is_compatible(dev, "ohci-be") )
|
||||
+ is_bigendian = 1;
|
||||
+
|
||||
+ ret = usb_hcd_ppc_of_probe(&ohci_ppc_of_hc_driver, op, is_bigendian);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static struct of_platform_driver ohci_hcd_ppc_of_driver = {
|
||||
+ .name = "ppc-of-ohci",
|
||||
+ .match_table = ohci_hcd_ppc_of_match,
|
||||
+ .probe = ohci_hcd_ppc_of_drv_probe,
|
||||
+ .remove = ohci_hcd_ppc_of_drv_remove,
|
||||
+ .shutdown = ohci_hcd_ppc_of_drv_shutdown,
|
||||
+#ifdef CONFIG_PM
|
||||
+ /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/
|
||||
+ /*.resume = ohci_hcd_ppc_soc_drv_resume,*/
|
||||
+#endif
|
||||
+ .driver = {
|
||||
+ .name = "ppc-of-ohci",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init ohci_hcd_ppc_of_init(void)
|
||||
+{
|
||||
+ pr_debug(DRIVER_INFO " (PPC OF)\n");
|
||||
+ pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed),
|
||||
+ sizeof(struct td));
|
||||
+
|
||||
+ return of_register_platform_driver(&ohci_hcd_ppc_of_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit ohci_hcd_ppc_of_cleanup(void)
|
||||
+{
|
||||
+ of_unregister_platform_driver(&ohci_hcd_ppc_of_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(ohci_hcd_ppc_of_init);
|
||||
+module_exit(ohci_hcd_ppc_of_cleanup);
|
||||
+
|
||||
--
|
||||
1.4.3.2
|
||||
|
|
@ -0,0 +1,719 @@
|
|||
From 0ac70faf67a7e5e3f24a841ace4658336f8f98df Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:00:06 +0100
|
||||
Subject: [PATCH] Add MPC5200 serial driver
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
drivers/serial/mpc52xx_uart.c | 287 +++++++++++++++++++++++++----------------
|
||||
1 files changed, 178 insertions(+), 109 deletions(-)
|
||||
|
||||
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c
|
||||
index 4f80c5b..debcd7b 100644
|
||||
--- a/drivers/serial/mpc52xx_uart.c
|
||||
+++ b/drivers/serial/mpc52xx_uart.c
|
||||
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
- * drivers/serial/mpc52xx_uart.c
|
||||
- *
|
||||
* Driver for the PSC of the Freescale MPC52xx PSCs configured as UARTs.
|
||||
*
|
||||
* FIXME According to the usermanual the status bits in the status register
|
||||
@@ -14,18 +12,18 @@
|
||||
*
|
||||
*
|
||||
* Maintainer : Sylvain Munaut <tnt@246tNt.com>
|
||||
- *
|
||||
+ *
|
||||
* Some of the code has been inspired/copied from the 2.4 code written
|
||||
* by Dale Farnsworth <dfarnsworth@mvista.com>.
|
||||
- *
|
||||
+ *
|
||||
* Copyright (C) 2004-2005 Sylvain Munaut <tnt@246tNt.com>
|
||||
* Copyright (C) 2003 MontaVista, Software, Inc.
|
||||
- *
|
||||
+ *
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
-
|
||||
+
|
||||
/* Platform device Usage :
|
||||
*
|
||||
* Since PSCs can have multiple function, the correct driver for each one
|
||||
@@ -44,7 +42,8 @@
|
||||
* will be mapped to.
|
||||
*/
|
||||
|
||||
-#include <linux/platform_device.h>
|
||||
+#define DEBUG
|
||||
+
|
||||
#include <linux/module.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial.h>
|
||||
@@ -53,6 +52,8 @@ #include <linux/console.h>
|
||||
|
||||
#include <asm/delay.h>
|
||||
#include <asm/io.h>
|
||||
+#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
|
||||
#include <asm/mpc52xx.h>
|
||||
#include <asm/mpc52xx_psc.h>
|
||||
@@ -96,32 +97,43 @@ #else
|
||||
#define uart_console(port) (0)
|
||||
#endif
|
||||
|
||||
+static struct of_device_id mpc52xx_uart_match[] = {
|
||||
+ {
|
||||
+ .type = "serial",
|
||||
+ .compatible = "mpc52xx-psc-uart",
|
||||
+ },
|
||||
+ {
|
||||
+ .type = "serial",
|
||||
+ .compatible = "mpc5200-psc",
|
||||
+ },
|
||||
+ {},
|
||||
+};
|
||||
|
||||
/* ======================================================================== */
|
||||
/* UART operations */
|
||||
/* ======================================================================== */
|
||||
|
||||
-static unsigned int
|
||||
+static unsigned int
|
||||
mpc52xx_uart_tx_empty(struct uart_port *port)
|
||||
{
|
||||
int status = in_be16(&PSC(port)->mpc52xx_psc_status);
|
||||
return (status & MPC52xx_PSC_SR_TXEMP) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
|
||||
-static void
|
||||
+static void
|
||||
mpc52xx_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
|
||||
{
|
||||
/* Not implemented */
|
||||
}
|
||||
|
||||
-static unsigned int
|
||||
+static unsigned int
|
||||
mpc52xx_uart_get_mctrl(struct uart_port *port)
|
||||
{
|
||||
/* Not implemented */
|
||||
return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
|
||||
}
|
||||
|
||||
-static void
|
||||
+static void
|
||||
mpc52xx_uart_stop_tx(struct uart_port *port)
|
||||
{
|
||||
/* port->lock taken by caller */
|
||||
@@ -129,7 +141,7 @@ mpc52xx_uart_stop_tx(struct uart_port *p
|
||||
out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
|
||||
}
|
||||
|
||||
-static void
|
||||
+static void
|
||||
mpc52xx_uart_start_tx(struct uart_port *port)
|
||||
{
|
||||
/* port->lock taken by caller */
|
||||
@@ -137,12 +149,12 @@ mpc52xx_uart_start_tx(struct uart_port *
|
||||
out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
|
||||
}
|
||||
|
||||
-static void
|
||||
+static void
|
||||
mpc52xx_uart_send_xchar(struct uart_port *port, char ch)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
-
|
||||
+
|
||||
port->x_char = ch;
|
||||
if (ch) {
|
||||
/* Make sure tx interrupts are on */
|
||||
@@ -150,7 +162,7 @@ mpc52xx_uart_send_xchar(struct uart_port
|
||||
port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
|
||||
out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
|
||||
}
|
||||
-
|
||||
+
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
}
|
||||
|
||||
@@ -178,7 +190,7 @@ mpc52xx_uart_break_ctl(struct uart_port
|
||||
out_8(&PSC(port)->command,MPC52xx_PSC_START_BRK);
|
||||
else
|
||||
out_8(&PSC(port)->command,MPC52xx_PSC_STOP_BRK);
|
||||
-
|
||||
+
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
}
|
||||
|
||||
@@ -197,11 +209,11 @@ mpc52xx_uart_startup(struct uart_port *p
|
||||
/* Reset/activate the port, clear and enable interrupts */
|
||||
out_8(&psc->command,MPC52xx_PSC_RST_RX);
|
||||
out_8(&psc->command,MPC52xx_PSC_RST_TX);
|
||||
-
|
||||
+
|
||||
out_be32(&psc->sicr,0); /* UART mode DCD ignored */
|
||||
|
||||
out_be16(&psc->mpc52xx_psc_clock_select, 0xdd00); /* /16 prescaler on */
|
||||
-
|
||||
+
|
||||
out_8(&psc->rfcntl, 0x00);
|
||||
out_be16(&psc->rfalarm, 0x1ff);
|
||||
out_8(&psc->tfcntl, 0x07);
|
||||
@@ -209,10 +221,10 @@ mpc52xx_uart_startup(struct uart_port *p
|
||||
|
||||
port->read_status_mask |= MPC52xx_PSC_IMR_RXRDY | MPC52xx_PSC_IMR_TXRDY;
|
||||
out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
|
||||
-
|
||||
+
|
||||
out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
|
||||
out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
|
||||
-
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -220,19 +232,19 @@ static void
|
||||
mpc52xx_uart_shutdown(struct uart_port *port)
|
||||
{
|
||||
struct mpc52xx_psc __iomem *psc = PSC(port);
|
||||
-
|
||||
+
|
||||
/* Shut down the port, interrupt and all */
|
||||
out_8(&psc->command,MPC52xx_PSC_RST_RX);
|
||||
out_8(&psc->command,MPC52xx_PSC_RST_TX);
|
||||
-
|
||||
- port->read_status_mask = 0;
|
||||
+
|
||||
+ port->read_status_mask = 0;
|
||||
out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
|
||||
|
||||
/* Release interrupt */
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
|
||||
-static void
|
||||
+static void
|
||||
mpc52xx_uart_set_termios(struct uart_port *port, struct termios *new,
|
||||
struct termios *old)
|
||||
{
|
||||
@@ -241,10 +253,10 @@ mpc52xx_uart_set_termios(struct uart_por
|
||||
unsigned char mr1, mr2;
|
||||
unsigned short ctr;
|
||||
unsigned int j, baud, quot;
|
||||
-
|
||||
+
|
||||
/* Prepare what we're gonna write */
|
||||
mr1 = 0;
|
||||
-
|
||||
+
|
||||
switch (new->c_cflag & CSIZE) {
|
||||
case CS5: mr1 |= MPC52xx_PSC_MODE_5_BITS;
|
||||
break;
|
||||
@@ -261,8 +273,8 @@ mpc52xx_uart_set_termios(struct uart_por
|
||||
MPC52xx_PSC_MODE_PARODD : MPC52xx_PSC_MODE_PAREVEN;
|
||||
} else
|
||||
mr1 |= MPC52xx_PSC_MODE_PARNONE;
|
||||
-
|
||||
-
|
||||
+
|
||||
+
|
||||
mr2 = 0;
|
||||
|
||||
if (new->c_cflag & CSTOPB)
|
||||
@@ -276,7 +288,7 @@ mpc52xx_uart_set_termios(struct uart_por
|
||||
baud = uart_get_baud_rate(port, new, old, 0, port->uartclk/16);
|
||||
quot = uart_get_divisor(port, baud);
|
||||
ctr = quot & 0xffff;
|
||||
-
|
||||
+
|
||||
/* Get the lock */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
@@ -290,14 +302,14 @@ mpc52xx_uart_set_termios(struct uart_por
|
||||
* boot for the console, all stuff is not yet ready to receive at that
|
||||
* time and that just makes the kernel oops */
|
||||
/* while (j-- && mpc52xx_uart_int_rx_chars(port)); */
|
||||
- while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
|
||||
+ while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
|
||||
--j)
|
||||
udelay(1);
|
||||
|
||||
if (!j)
|
||||
printk( KERN_ERR "mpc52xx_uart.c: "
|
||||
"Unable to flush RX & TX fifos in-time in set_termios."
|
||||
- "Some chars may have been lost.\n" );
|
||||
+ "Some chars may have been lost.\n" );
|
||||
|
||||
/* Reset the TX & RX */
|
||||
out_8(&psc->command,MPC52xx_PSC_RST_RX);
|
||||
@@ -309,7 +321,7 @@ mpc52xx_uart_set_termios(struct uart_por
|
||||
out_8(&psc->mode,mr2);
|
||||
out_8(&psc->ctur,ctr >> 8);
|
||||
out_8(&psc->ctlr,ctr & 0xff);
|
||||
-
|
||||
+
|
||||
/* Reenable TX & RX */
|
||||
out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
|
||||
out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
|
||||
@@ -332,7 +344,7 @@ mpc52xx_uart_release_port(struct uart_po
|
||||
port->membase = NULL;
|
||||
}
|
||||
|
||||
- release_mem_region(port->mapbase, MPC52xx_PSC_SIZE);
|
||||
+ release_mem_region(port->mapbase, sizeof(struct mpc52xx_psc));
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -341,12 +353,13 @@ mpc52xx_uart_request_port(struct uart_po
|
||||
int err;
|
||||
|
||||
if (port->flags & UPF_IOREMAP) /* Need to remap ? */
|
||||
- port->membase = ioremap(port->mapbase, MPC52xx_PSC_SIZE);
|
||||
+ port->membase = ioremap(port->mapbase,
|
||||
+ sizeof(struct mpc52xx_psc));
|
||||
|
||||
if (!port->membase)
|
||||
return -EINVAL;
|
||||
|
||||
- err = request_mem_region(port->mapbase, MPC52xx_PSC_SIZE,
|
||||
+ err = request_mem_region(port->mapbase, sizeof(struct mpc52xx_psc),
|
||||
"mpc52xx_psc_uart") != NULL ? 0 : -EBUSY;
|
||||
|
||||
if (err && (port->flags & UPF_IOREMAP)) {
|
||||
@@ -373,7 +386,7 @@ mpc52xx_uart_verify_port(struct uart_por
|
||||
|
||||
if ( (ser->irq != port->irq) ||
|
||||
(ser->io_type != SERIAL_IO_MEM) ||
|
||||
- (ser->baud_base != port->uartclk) ||
|
||||
+ (ser->baud_base != port->uartclk) ||
|
||||
(ser->iomem_base != (void*)port->mapbase) ||
|
||||
(ser->hub6 != 0 ) )
|
||||
return -EINVAL;
|
||||
@@ -404,11 +417,11 @@ static struct uart_ops mpc52xx_uart_ops
|
||||
.verify_port = mpc52xx_uart_verify_port
|
||||
};
|
||||
|
||||
-
|
||||
+
|
||||
/* ======================================================================== */
|
||||
/* Interrupt handling */
|
||||
/* ======================================================================== */
|
||||
-
|
||||
+
|
||||
static inline int
|
||||
mpc52xx_uart_int_rx_chars(struct uart_port *port)
|
||||
{
|
||||
@@ -435,11 +448,11 @@ #endif
|
||||
|
||||
flag = TTY_NORMAL;
|
||||
port->icount.rx++;
|
||||
-
|
||||
+
|
||||
if ( status & (MPC52xx_PSC_SR_PE |
|
||||
MPC52xx_PSC_SR_FE |
|
||||
MPC52xx_PSC_SR_RB) ) {
|
||||
-
|
||||
+
|
||||
if (status & MPC52xx_PSC_SR_RB) {
|
||||
flag = TTY_BREAK;
|
||||
uart_handle_break(port);
|
||||
@@ -464,7 +477,7 @@ #endif
|
||||
}
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
-
|
||||
+
|
||||
return in_be16(&PSC(port)->mpc52xx_psc_status) & MPC52xx_PSC_SR_RXRDY;
|
||||
}
|
||||
|
||||
@@ -509,25 +522,25 @@ mpc52xx_uart_int_tx_chars(struct uart_po
|
||||
return 1;
|
||||
}
|
||||
|
||||
-static irqreturn_t
|
||||
+static irqreturn_t
|
||||
mpc52xx_uart_int(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned long pass = ISR_PASS_LIMIT;
|
||||
unsigned int keepgoing;
|
||||
unsigned short status;
|
||||
-
|
||||
+
|
||||
spin_lock(&port->lock);
|
||||
-
|
||||
+
|
||||
/* While we have stuff to do, we continue */
|
||||
do {
|
||||
/* If we don't find anything to do, we stop */
|
||||
- keepgoing = 0;
|
||||
-
|
||||
+ keepgoing = 0;
|
||||
+
|
||||
/* Read status */
|
||||
status = in_be16(&PSC(port)->mpc52xx_psc_isr);
|
||||
status &= port->read_status_mask;
|
||||
-
|
||||
+
|
||||
/* Do we need to receive chars ? */
|
||||
/* For this RX interrupts must be on and some chars waiting */
|
||||
if ( status & MPC52xx_PSC_IMR_RXRDY )
|
||||
@@ -537,15 +550,15 @@ mpc52xx_uart_int(int irq, void *dev_id)
|
||||
/* For this, TX must be ready and TX interrupt enabled */
|
||||
if ( status & MPC52xx_PSC_IMR_TXRDY )
|
||||
keepgoing |= mpc52xx_uart_int_tx_chars(port);
|
||||
-
|
||||
+
|
||||
/* Limit number of iteration */
|
||||
if ( !(--pass) )
|
||||
keepgoing = 0;
|
||||
|
||||
} while (keepgoing);
|
||||
-
|
||||
+
|
||||
spin_unlock(&port->lock);
|
||||
-
|
||||
+
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -563,13 +576,13 @@ mpc52xx_console_get_options(struct uart_
|
||||
struct mpc52xx_psc __iomem *psc = PSC(port);
|
||||
unsigned char mr1;
|
||||
|
||||
+ pr_debug("mpc52xx_console_get_options(port=%p)\n", port);
|
||||
/* Read the mode registers */
|
||||
out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
|
||||
mr1 = in_8(&psc->mode);
|
||||
-
|
||||
+
|
||||
/* CT{U,L}R are write-only ! */
|
||||
- *baud = __res.bi_baudrate ?
|
||||
- __res.bi_baudrate : CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD;
|
||||
+ *baud = CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD;
|
||||
|
||||
/* Parse them */
|
||||
switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) {
|
||||
@@ -579,26 +592,26 @@ mpc52xx_console_get_options(struct uart_
|
||||
case MPC52xx_PSC_MODE_8_BITS:
|
||||
default: *bits = 8;
|
||||
}
|
||||
-
|
||||
+
|
||||
if (mr1 & MPC52xx_PSC_MODE_PARNONE)
|
||||
*parity = 'n';
|
||||
else
|
||||
*parity = mr1 & MPC52xx_PSC_MODE_PARODD ? 'o' : 'e';
|
||||
}
|
||||
|
||||
-static void
|
||||
+static void
|
||||
mpc52xx_console_write(struct console *co, const char *s, unsigned int count)
|
||||
{
|
||||
struct uart_port *port = &mpc52xx_uart_ports[co->index];
|
||||
struct mpc52xx_psc __iomem *psc = PSC(port);
|
||||
unsigned int i, j;
|
||||
-
|
||||
+
|
||||
/* Disable interrupts */
|
||||
out_be16(&psc->mpc52xx_psc_imr, 0);
|
||||
|
||||
/* Wait the TX buffer to be empty */
|
||||
- j = 5000000; /* Maximum wait */
|
||||
- while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
|
||||
+ j = 5000000; /* Maximum wait */
|
||||
+ while (!(in_be16(&psc->mpc52xx_psc_status) & MPC52xx_PSC_SR_TXEMP) &&
|
||||
--j)
|
||||
udelay(1);
|
||||
|
||||
@@ -606,14 +619,14 @@ mpc52xx_console_write(struct console *co
|
||||
for (i = 0; i < count; i++, s++) {
|
||||
/* Line return handling */
|
||||
if (*s == '\n')
|
||||
- out_8(&psc->mpc52xx_psc_buffer_8, '\r');
|
||||
-
|
||||
+ out_8(&psc->buffer.buffer_8, '\r');
|
||||
+
|
||||
/* Send the char */
|
||||
- out_8(&psc->mpc52xx_psc_buffer_8, *s);
|
||||
+ out_8(&psc->buffer.buffer_8, *s);
|
||||
|
||||
/* Wait the TX buffer to be empty */
|
||||
- j = 20000; /* Maximum wait */
|
||||
- while (!(in_be16(&psc->mpc52xx_psc_status) &
|
||||
+ j = 20000; /* Maximum wait */
|
||||
+ while (!(in_be16(&psc->mpc52xx_psc_status) &
|
||||
MPC52xx_PSC_SR_TXEMP) && --j)
|
||||
udelay(1);
|
||||
}
|
||||
@@ -626,33 +639,77 @@ static int __init
|
||||
mpc52xx_console_setup(struct console *co, char *options)
|
||||
{
|
||||
struct uart_port *port = &mpc52xx_uart_ports[co->index];
|
||||
+ struct device_node *np = NULL;
|
||||
+ const struct of_device_id *dev_id = NULL;
|
||||
+ struct device_node *np_idx;
|
||||
+ const void *pp = NULL;
|
||||
+ struct resource res;
|
||||
+ int index = 0;
|
||||
+ int ret;
|
||||
|
||||
int baud = CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD;
|
||||
int bits = 8;
|
||||
int parity = 'n';
|
||||
int flow = 'n';
|
||||
|
||||
- if (co->index < 0 || co->index >= MPC52xx_PSC_MAXNUM)
|
||||
+ pr_debug("mpc52xx_console_setup co=%p, options=%s, index=%i\n",
|
||||
+ co, options, co->index);
|
||||
+
|
||||
+ for_each_node_by_type(np, "serial")
|
||||
+ {
|
||||
+ dev_id = of_match_node(mpc52xx_uart_match, np);
|
||||
+ if (dev_id)
|
||||
+ if (index++ == co->index)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (!np) {
|
||||
+ pr_debug("PSC%x not found in device tree\n", co->index);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* Fetch register locations */
|
||||
+ if ((ret = of_address_to_resource(np, 0, &res)) != 0) {
|
||||
+ pr_debug("Could not get resources for PSC%x\n", index);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Search for bus-frequency property in this node or a parent */
|
||||
+ np_idx = np;
|
||||
+ while (np_idx) {
|
||||
+ if ((pp = get_property(np_idx, "bus-frequency", NULL)) != NULL)
|
||||
+ break;
|
||||
+ np_idx = of_get_parent(np_idx);
|
||||
+ }
|
||||
+ if (!pp) {
|
||||
+ pr_debug("Could not find bus-frequency property!\n");
|
||||
return -EINVAL;
|
||||
-
|
||||
+ }
|
||||
+
|
||||
/* Basic port init. Needed since we use some uart_??? func before
|
||||
* real init for early access */
|
||||
spin_lock_init(&port->lock);
|
||||
- port->uartclk = __res.bi_ipbfreq / 2; /* Look at CTLR doc */
|
||||
+ port->uartclk = *(const u32*)pp / 2;
|
||||
port->ops = &mpc52xx_uart_ops;
|
||||
- port->mapbase = MPC52xx_PA(MPC52xx_PSCx_OFFSET(co->index+1));
|
||||
+ port->mapbase = res.start;
|
||||
+ port->membase = ioremap(res.start, sizeof(struct mpc52xx_psc));
|
||||
+ port->irq = irq_of_parse_and_map(np, 0);
|
||||
|
||||
- /* We ioremap ourself */
|
||||
- port->membase = ioremap(port->mapbase, MPC52xx_PSC_SIZE);
|
||||
if (port->membase == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
+ pr_debug("mpc52xx_psc at %lx mapped to %p; irq=%x freq=%i\n",
|
||||
+ port->mapbase, port->membase, port->irq, port->uartclk);
|
||||
+
|
||||
/* Setup the port parameters accoding to options */
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
else
|
||||
mpc52xx_console_get_options(port, &baud, &parity, &bits, &flow);
|
||||
|
||||
+ pr_debug("Setting console parameters: %i %i%c1 flow=%c\n",
|
||||
+ baud, bits, parity, flow);
|
||||
+
|
||||
return uart_set_options(port, co, baud, parity, bits, flow);
|
||||
}
|
||||
|
||||
@@ -669,8 +726,8 @@ static struct console mpc52xx_console =
|
||||
.data = &mpc52xx_uart_driver,
|
||||
};
|
||||
|
||||
-
|
||||
-static int __init
|
||||
+
|
||||
+static int __init
|
||||
mpc52xx_console_init(void)
|
||||
{
|
||||
register_console(&mpc52xx_console);
|
||||
@@ -705,28 +762,23 @@ static struct uart_driver mpc52xx_uart_d
|
||||
/* ======================================================================== */
|
||||
|
||||
static int __devinit
|
||||
-mpc52xx_uart_probe(struct platform_device *dev)
|
||||
+mpc52xx_uart_probe(struct of_device *op, const struct of_device_id *match)
|
||||
{
|
||||
- struct resource *res = dev->resource;
|
||||
-
|
||||
+ static int idx = 0;
|
||||
struct uart_port *port = NULL;
|
||||
- int i, idx, ret;
|
||||
+ struct resource res;
|
||||
+ int ret;
|
||||
+
|
||||
+ dev_dbg(&op->dev, "mpc52xx_uart_probe(op=%p, match=%p)\n", op, match);
|
||||
|
||||
/* Check validity & presence */
|
||||
- idx = dev->id;
|
||||
- if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM)
|
||||
+ if (idx >= MPC52xx_PSC_MAXNUM)
|
||||
return -EINVAL;
|
||||
|
||||
- if (!mpc52xx_match_psc_function(idx,"uart"))
|
||||
- return -ENODEV;
|
||||
-
|
||||
/* Init the port structure */
|
||||
port = &mpc52xx_uart_ports[idx];
|
||||
|
||||
- memset(port, 0x00, sizeof(struct uart_port));
|
||||
-
|
||||
spin_lock_init(&port->lock);
|
||||
- port->uartclk = __res.bi_ipbfreq / 2; /* Look at CTLR doc */
|
||||
port->fifosize = 512;
|
||||
port->iotype = UPIO_MEM;
|
||||
port->flags = UPF_BOOT_AUTOCONF |
|
||||
@@ -735,29 +787,36 @@ mpc52xx_uart_probe(struct platform_devic
|
||||
port->ops = &mpc52xx_uart_ops;
|
||||
|
||||
/* Search for IRQ and mapbase */
|
||||
- for (i=0 ; i<dev->num_resources ; i++, res++) {
|
||||
- if (res->flags & IORESOURCE_MEM)
|
||||
- port->mapbase = res->start;
|
||||
- else if (res->flags & IORESOURCE_IRQ)
|
||||
- port->irq = res->start;
|
||||
- }
|
||||
- if (!port->irq || !port->mapbase)
|
||||
+ if ((ret = of_address_to_resource(op->node, 0, &res)) != 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ port->mapbase = res.start;
|
||||
+ port->membase = ioremap(res.start, sizeof(struct mpc52xx_psc));
|
||||
+ port->irq = irq_of_parse_and_map(op->node, 0);
|
||||
+
|
||||
+ dev_dbg(&op->dev, "mpc52xx-psc UART at %lx. mapped to %p, irq %x\n",
|
||||
+ port->mapbase, port->membase, port->irq);
|
||||
+
|
||||
+ //if (!port->irq || !port->mapbase) {
|
||||
+ if (!port->mapbase) {
|
||||
+ printk(KERN_ERR "Could not allocate resources for PSC\n");
|
||||
return -EINVAL;
|
||||
+ }
|
||||
|
||||
/* Add the port to the uart sub-system */
|
||||
ret = uart_add_one_port(&mpc52xx_uart_driver, port);
|
||||
if (!ret)
|
||||
- platform_set_drvdata(dev, (void*)port);
|
||||
+ dev_set_drvdata(&op->dev, (void*)port);
|
||||
|
||||
+ idx++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
-mpc52xx_uart_remove(struct platform_device *dev)
|
||||
+mpc52xx_uart_remove(struct of_device *op)
|
||||
{
|
||||
- struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
|
||||
-
|
||||
- platform_set_drvdata(dev, NULL);
|
||||
+ struct uart_port *port = dev_get_drvdata(&op->dev);
|
||||
+ dev_set_drvdata(&op->dev, NULL);
|
||||
|
||||
if (port)
|
||||
uart_remove_one_port(&mpc52xx_uart_driver, port);
|
||||
@@ -767,20 +826,20 @@ mpc52xx_uart_remove(struct platform_devi
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int
|
||||
-mpc52xx_uart_suspend(struct platform_device *dev, pm_message_t state)
|
||||
+mpc52xx_uart_suspend(struct of_device *op, pm_message_t state)
|
||||
{
|
||||
- struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
|
||||
+ struct uart_port *port = (struct uart_port *) dev_get_drvdata(&op->dev);
|
||||
|
||||
- if (sport)
|
||||
+ if (port)
|
||||
uart_suspend_port(&mpc52xx_uart_driver, port);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
-mpc52xx_uart_resume(struct platform_device *dev)
|
||||
+mpc52xx_uart_resume(struct of_device *op)
|
||||
{
|
||||
- struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev);
|
||||
+ struct uart_port *port = (struct uart_port *) dev_get_drvdata(&op->dev);
|
||||
|
||||
if (port)
|
||||
uart_resume_port(&mpc52xx_uart_driver, port);
|
||||
@@ -789,7 +848,13 @@ mpc52xx_uart_resume(struct platform_devi
|
||||
}
|
||||
#endif
|
||||
|
||||
-static struct platform_driver mpc52xx_uart_platform_driver = {
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, mpc52xx_uart_match);
|
||||
+
|
||||
+static struct of_platform_driver mpc52xx_uart_of_driver = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .name = "mpc52xx-uart",
|
||||
+ .match_table = mpc52xx_uart_match,
|
||||
.probe = mpc52xx_uart_probe,
|
||||
.remove = mpc52xx_uart_remove,
|
||||
#ifdef CONFIG_PM
|
||||
@@ -804,7 +869,7 @@ #endif
|
||||
|
||||
/* ======================================================================== */
|
||||
/* Module */
|
||||
-/* ======================================================================== */
|
||||
+ /* ======================================================================== */
|
||||
|
||||
static int __init
|
||||
mpc52xx_uart_init(void)
|
||||
@@ -813,20 +878,24 @@ mpc52xx_uart_init(void)
|
||||
|
||||
printk(KERN_INFO "Serial: MPC52xx PSC driver\n");
|
||||
|
||||
- ret = uart_register_driver(&mpc52xx_uart_driver);
|
||||
- if (ret == 0) {
|
||||
- ret = platform_driver_register(&mpc52xx_uart_platform_driver);
|
||||
- if (ret)
|
||||
- uart_unregister_driver(&mpc52xx_uart_driver);
|
||||
+ if ((ret = uart_register_driver(&mpc52xx_uart_driver)) != 0) {
|
||||
+ printk(KERN_ERR "Could not register mpc52xx uart driver\n");
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
- return ret;
|
||||
+ if ((ret = of_register_platform_driver(&mpc52xx_uart_of_driver)) != 0) {
|
||||
+ printk(KERN_ERR "Could not register mpc52xx of driver\n");
|
||||
+ uart_unregister_driver(&mpc52xx_uart_driver);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
mpc52xx_uart_exit(void)
|
||||
{
|
||||
- platform_driver_unregister(&mpc52xx_uart_platform_driver);
|
||||
+ of_unregister_platform_driver(&mpc52xx_uart_of_driver);
|
||||
uart_unregister_driver(&mpc52xx_uart_driver);
|
||||
}
|
||||
|
||||
--
|
||||
1.4.3.2
|
||||
|
677
debian/patches/features/powerpc/efika/0004-Add-MPC5200-CPU-PIO-driver-using-libata.diff
vendored
Normal file
677
debian/patches/features/powerpc/efika/0004-Add-MPC5200-CPU-PIO-driver-using-libata.diff
vendored
Normal file
|
@ -0,0 +1,677 @@
|
|||
From bb6dea9b9a251e42efcec030af2d5272d5d5714a Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:01:30 +0100
|
||||
Subject: [PATCH] Add MPC5200 CPU/PIO driver using libata
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
drivers/ata/Kconfig | 9 +
|
||||
drivers/ata/Makefile | 1 +
|
||||
drivers/ata/pata_mpc52xx.c | 510 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
drivers/ata/pata_mpc52xx.h | 107 +++++++++
|
||||
4 files changed, 627 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
|
||||
index 03f6338..be01ddf 100644
|
||||
--- a/drivers/ata/Kconfig
|
||||
+++ b/drivers/ata/Kconfig
|
||||
@@ -328,6 +328,15 @@ config PATA_TRIFLEX
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
+config PATA_MPC52xx
|
||||
+ tristate "Freescale MPC52xx SoC internal IDE"
|
||||
+ depends on PPC_MPC52xx
|
||||
+ help
|
||||
+ This option enables support for integrated IDE controller
|
||||
+ of the Freescale MPC52xx SoC.
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
config PATA_MPIIX
|
||||
tristate "Intel PATA MPIIX support"
|
||||
depends on PCI
|
||||
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
|
||||
index 72243a6..e3a741c 100644
|
||||
--- a/drivers/ata/Makefile
|
||||
+++ b/drivers/ata/Makefile
|
||||
@@ -38,6 +38,7 @@ obj-$(CONFIG_PATA_NETCELL) += pata_netce
|
||||
obj-$(CONFIG_PATA_NS87410) += pata_ns87410.o
|
||||
obj-$(CONFIG_PATA_OPTI) += pata_opti.o
|
||||
obj-$(CONFIG_PATA_OPTIDMA) += pata_optidma.o
|
||||
+obj-$(CONFIG_PATA_MPC52xx) += pata_mpc52xx.o
|
||||
obj-$(CONFIG_PATA_MPIIX) += pata_mpiix.o
|
||||
obj-$(CONFIG_PATA_OLDPIIX) += pata_oldpiix.o
|
||||
obj-$(CONFIG_PATA_PCMCIA) += pata_pcmcia.o
|
||||
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c
|
||||
new file mode 100644
|
||||
index 0000000..c75d4c9
|
||||
--- /dev/null
|
||||
+++ b/drivers/ata/pata_mpc52xx.c
|
||||
@@ -0,0 +1,510 @@
|
||||
+/*
|
||||
+ * drivers/ata/pata_mpc52xx.c
|
||||
+ *
|
||||
+ * libata driver for the Freescale MPC52xx on-chip IDE interface
|
||||
+ *
|
||||
+ * Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com>
|
||||
+ * Copyright (C) 2003 Mipsys - Benjamin Herrenschmidt
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public License
|
||||
+ * version 2. This program is licensed "as is" without any warranty of any
|
||||
+ * kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/libata.h>
|
||||
+
|
||||
+#include <asm/io.h>
|
||||
+#include <asm/prom.h>
|
||||
+#include <asm/of_platform.h>
|
||||
+#include <asm/mpc52xx.h>
|
||||
+
|
||||
+#include "pata_mpc52xx.h"
|
||||
+
|
||||
+
|
||||
+#define DRV_NAME "mpc52xx_ata"
|
||||
+#define DRV_VERSION "0.1.0"
|
||||
+
|
||||
+
|
||||
+/* Private structures used by the driver */
|
||||
+struct mpc52xx_ata_timings {
|
||||
+ u32 pio1;
|
||||
+ u32 pio2;
|
||||
+};
|
||||
+
|
||||
+struct mpc52xx_ata_priv {
|
||||
+ unsigned int ipb_period;
|
||||
+ struct mpc52xx_ata __iomem * ata_regs;
|
||||
+ int ata_irq;
|
||||
+ struct mpc52xx_ata_timings timings[2];
|
||||
+ int csel;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* ATAPI-4 PIO specs (in ns) */
|
||||
+static const int ataspec_t0[5] = {600, 383, 240, 180, 120};
|
||||
+static const int ataspec_t1[5] = { 70, 50, 30, 30, 25};
|
||||
+static const int ataspec_t2_8[5] = {290, 290, 290, 80, 70};
|
||||
+static const int ataspec_t2_16[5] = {165, 125, 100, 80, 70};
|
||||
+static const int ataspec_t2i[5] = { 0, 0, 0, 70, 25};
|
||||
+static const int ataspec_t4[5] = { 30, 20, 15, 10, 10};
|
||||
+static const int ataspec_ta[5] = { 35, 35, 35, 35, 35};
|
||||
+
|
||||
+#define CALC_CLKCYC(c,v) ((((v)+(c)-1)/(c)))
|
||||
+
|
||||
+
|
||||
+/* ======================================================================== */
|
||||
+/* Aux fns */
|
||||
+/* ======================================================================== */
|
||||
+
|
||||
+
|
||||
+/* OF device tree */
|
||||
+
|
||||
+static unsigned int
|
||||
+mpc52xx_find_ipb_freq(struct device_node *on)
|
||||
+{
|
||||
+ struct device_node *onp;
|
||||
+ const unsigned int *p_ipb_freq = NULL;
|
||||
+
|
||||
+ of_node_get(on);
|
||||
+ while (on) {
|
||||
+ p_ipb_freq = get_property(on, "bus-frequency", NULL);
|
||||
+
|
||||
+ if (p_ipb_freq)
|
||||
+ break;
|
||||
+
|
||||
+ onp = of_get_parent(on);
|
||||
+ of_node_put(on);
|
||||
+ on = onp;
|
||||
+ }
|
||||
+
|
||||
+ if (on)
|
||||
+ of_node_put(on);
|
||||
+
|
||||
+ return p_ipb_freq ? *p_ipb_freq : 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* MPC52xx low level hw control */
|
||||
+
|
||||
+static int
|
||||
+mpc52xx_ata_compute_pio_timings(struct mpc52xx_ata_priv *priv, int dev, int pio)
|
||||
+{
|
||||
+ struct mpc52xx_ata_timings *timing = &priv->timings[dev];
|
||||
+ unsigned int ipb_period = priv->ipb_period;
|
||||
+ unsigned int t0, t1, t2_8, t2_16, t2i, t4, ta;
|
||||
+
|
||||
+ if ((pio<0) || (pio>4))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ t0 = CALC_CLKCYC(ipb_period, 1000 * ataspec_t0[pio]);
|
||||
+ t1 = CALC_CLKCYC(ipb_period, 1000 * ataspec_t1[pio]);
|
||||
+ t2_8 = CALC_CLKCYC(ipb_period, 1000 * ataspec_t2_8[pio]);
|
||||
+ t2_16 = CALC_CLKCYC(ipb_period, 1000 * ataspec_t2_16[pio]);
|
||||
+ t2i = CALC_CLKCYC(ipb_period, 1000 * ataspec_t2i[pio]);
|
||||
+ t4 = CALC_CLKCYC(ipb_period, 1000 * ataspec_t4[pio]);
|
||||
+ ta = CALC_CLKCYC(ipb_period, 1000 * ataspec_ta[pio]);
|
||||
+
|
||||
+ timing->pio1 = (t0 << 24) | (t2_8 << 16) | (t2_16 << 8) | (t2i);
|
||||
+ timing->pio2 = (t4 << 24) | (t1 << 16) | (ta << 8);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+mpc52xx_ata_apply_timings(struct mpc52xx_ata_priv *priv, int device)
|
||||
+{
|
||||
+ struct mpc52xx_ata __iomem *regs = priv->ata_regs;
|
||||
+ struct mpc52xx_ata_timings *timing = &priv->timings[device];
|
||||
+
|
||||
+ out_be32(®s->pio1, timing->pio1);
|
||||
+ out_be32(®s->pio2, timing->pio2);
|
||||
+ out_be32(®s->mdma1, 0);
|
||||
+ out_be32(®s->mdma2, 0);
|
||||
+ out_be32(®s->udma1, 0);
|
||||
+ out_be32(®s->udma2, 0);
|
||||
+ out_be32(®s->udma3, 0);
|
||||
+ out_be32(®s->udma4, 0);
|
||||
+ out_be32(®s->udma5, 0);
|
||||
+
|
||||
+ priv->csel = device;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+mpc52xx_ata_hw_init(struct mpc52xx_ata_priv *priv)
|
||||
+{
|
||||
+ struct mpc52xx_ata __iomem *regs = priv->ata_regs;
|
||||
+ int tslot;
|
||||
+
|
||||
+ /* Clear share_cnt (all sample code do this ...) */
|
||||
+ out_be32(®s->share_cnt, 0);
|
||||
+
|
||||
+ /* Configure and reset host */
|
||||
+ out_be32(®s->config,
|
||||
+ MPC52xx_ATA_HOSTCONF_IE |
|
||||
+ MPC52xx_ATA_HOSTCONF_IORDY |
|
||||
+ MPC52xx_ATA_HOSTCONF_SMR |
|
||||
+ MPC52xx_ATA_HOSTCONF_FR);
|
||||
+
|
||||
+ udelay(10);
|
||||
+
|
||||
+ out_be32(®s->config,
|
||||
+ MPC52xx_ATA_HOSTCONF_IE |
|
||||
+ MPC52xx_ATA_HOSTCONF_IORDY);
|
||||
+
|
||||
+ /* Set the time slot to 1us */
|
||||
+ tslot = CALC_CLKCYC(priv->ipb_period, 1000000);
|
||||
+ out_be32(®s->share_cnt, tslot << 16 );
|
||||
+
|
||||
+ /* Init timings to PIO0 */
|
||||
+ memset(priv->timings, 0x00, 2*sizeof(struct mpc52xx_ata_timings));
|
||||
+
|
||||
+ mpc52xx_ata_compute_pio_timings(priv, 0, 0);
|
||||
+ mpc52xx_ata_compute_pio_timings(priv, 1, 0);
|
||||
+
|
||||
+ mpc52xx_ata_apply_timings(priv, 0);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* ======================================================================== */
|
||||
+/* libata driver */
|
||||
+/* ======================================================================== */
|
||||
+
|
||||
+static void
|
||||
+mpc52xx_ata_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
+{
|
||||
+ struct mpc52xx_ata_priv *priv = ap->host->private_data;
|
||||
+ int pio, rv;
|
||||
+
|
||||
+ pio = adev->pio_mode - XFER_PIO_0;
|
||||
+
|
||||
+ rv = mpc52xx_ata_compute_pio_timings(priv, adev->devno, pio);
|
||||
+
|
||||
+ if (rv) {
|
||||
+ printk(KERN_ERR DRV_NAME
|
||||
+ ": Trying to select invalid PIO mode %d\n", pio);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ mpc52xx_ata_apply_timings(priv, adev->devno);
|
||||
+}
|
||||
+static void
|
||||
+mpc52xx_ata_dev_select(struct ata_port *ap, unsigned int device)
|
||||
+{
|
||||
+ struct mpc52xx_ata_priv *priv = ap->host->private_data;
|
||||
+
|
||||
+ if (device != priv->csel)
|
||||
+ mpc52xx_ata_apply_timings(priv, device);
|
||||
+
|
||||
+ ata_std_dev_select(ap,device);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+mpc52xx_ata_error_handler(struct ata_port *ap)
|
||||
+{
|
||||
+ ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, NULL,
|
||||
+ ata_std_postreset);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+static struct scsi_host_template mpc52xx_ata_sht = {
|
||||
+ .module = THIS_MODULE,
|
||||
+ .name = DRV_NAME,
|
||||
+ .ioctl = ata_scsi_ioctl,
|
||||
+ .queuecommand = ata_scsi_queuecmd,
|
||||
+ .can_queue = ATA_DEF_QUEUE,
|
||||
+ .this_id = ATA_SHT_THIS_ID,
|
||||
+ .sg_tablesize = LIBATA_MAX_PRD,
|
||||
+ .max_sectors = ATA_MAX_SECTORS,
|
||||
+ .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
|
||||
+ .emulated = ATA_SHT_EMULATED,
|
||||
+ .use_clustering = ATA_SHT_USE_CLUSTERING,
|
||||
+ .proc_name = DRV_NAME,
|
||||
+ .dma_boundary = ATA_DMA_BOUNDARY,
|
||||
+ .slave_configure = ata_scsi_slave_config,
|
||||
+ .bios_param = ata_std_bios_param,
|
||||
+};
|
||||
+
|
||||
+static struct ata_port_operations mpc52xx_ata_port_ops = {
|
||||
+ .port_disable = ata_port_disable,
|
||||
+ .set_piomode = mpc52xx_ata_set_piomode,
|
||||
+ .dev_select = mpc52xx_ata_dev_select,
|
||||
+ .tf_load = ata_tf_load,
|
||||
+ .tf_read = ata_tf_read,
|
||||
+ .check_status = ata_check_status,
|
||||
+ .exec_command = ata_exec_command,
|
||||
+ .freeze = ata_bmdma_freeze,
|
||||
+ .thaw = ata_bmdma_thaw,
|
||||
+ .error_handler = mpc52xx_ata_error_handler,
|
||||
+ .qc_prep = ata_qc_prep,
|
||||
+ .qc_issue = ata_qc_issue_prot,
|
||||
+ .data_xfer = ata_mmio_data_xfer,
|
||||
+ .irq_handler = ata_interrupt,
|
||||
+ .irq_clear = ata_bmdma_irq_clear,
|
||||
+ .port_start = ata_port_start,
|
||||
+ .port_stop = ata_port_stop,
|
||||
+ .host_stop = ata_host_stop,
|
||||
+};
|
||||
+
|
||||
+static struct ata_probe_ent mpc52xx_ata_probe_ent = {
|
||||
+ .port_ops = &mpc52xx_ata_port_ops,
|
||||
+ .sht = &mpc52xx_ata_sht,
|
||||
+ .n_ports = 1,
|
||||
+ .pio_mask = 0x1f, /* Up to PIO4 */
|
||||
+ .mwdma_mask = 0x00, /* No MWDMA */
|
||||
+ .udma_mask = 0x00, /* No UDMA */
|
||||
+ .port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | ATA_FLAG_MMIO,
|
||||
+ .irq_flags = 0,
|
||||
+};
|
||||
+
|
||||
+static int __devinit
|
||||
+mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv)
|
||||
+{
|
||||
+ struct ata_probe_ent *ae = &mpc52xx_ata_probe_ent;
|
||||
+ struct ata_ioports *aio = &ae->port[0];
|
||||
+ int rv;
|
||||
+
|
||||
+ INIT_LIST_HEAD(&ae->node);
|
||||
+ ae->dev = dev;
|
||||
+ ae->irq = priv->ata_irq;
|
||||
+
|
||||
+ aio->cmd_addr = 0; /* Don't have a classic reg block */
|
||||
+ aio->altstatus_addr = (unsigned long)&priv->ata_regs->tf_control;
|
||||
+ aio->ctl_addr = (unsigned long)&priv->ata_regs->tf_control;
|
||||
+ aio->data_addr = (unsigned long)&priv->ata_regs->tf_data;
|
||||
+ aio->error_addr = (unsigned long)&priv->ata_regs->tf_features;
|
||||
+ aio->feature_addr = (unsigned long)&priv->ata_regs->tf_features;
|
||||
+ aio->nsect_addr = (unsigned long)&priv->ata_regs->tf_sec_count;
|
||||
+ aio->lbal_addr = (unsigned long)&priv->ata_regs->tf_sec_num;
|
||||
+ aio->lbam_addr = (unsigned long)&priv->ata_regs->tf_cyl_low;
|
||||
+ aio->lbah_addr = (unsigned long)&priv->ata_regs->tf_cyl_high;
|
||||
+ aio->device_addr = (unsigned long)&priv->ata_regs->tf_dev_head;
|
||||
+ aio->status_addr = (unsigned long)&priv->ata_regs->tf_command;
|
||||
+ aio->command_addr = (unsigned long)&priv->ata_regs->tf_command;
|
||||
+
|
||||
+ ae->private_data = priv;
|
||||
+
|
||||
+ rv = ata_device_add(ae);
|
||||
+
|
||||
+ return rv ? 0 : -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static struct mpc52xx_ata_priv *
|
||||
+mpc52xx_ata_remove_one(struct device *dev)
|
||||
+{
|
||||
+ struct ata_host *host = dev_get_drvdata(dev);
|
||||
+ struct mpc52xx_ata_priv *priv = host->private_data;
|
||||
+
|
||||
+ ata_host_remove(host);
|
||||
+
|
||||
+ return priv;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* ======================================================================== */
|
||||
+/* OF Platform driver */
|
||||
+/* ======================================================================== */
|
||||
+
|
||||
+static int __devinit
|
||||
+mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
|
||||
+{
|
||||
+ unsigned int ipb_freq;
|
||||
+ struct resource res_mem;
|
||||
+ int ata_irq = NO_IRQ;
|
||||
+ struct mpc52xx_ata __iomem *ata_regs = NULL;
|
||||
+ struct mpc52xx_ata_priv *priv = NULL;
|
||||
+ int rv;
|
||||
+
|
||||
+ /* Get ipb frequency */
|
||||
+ ipb_freq = mpc52xx_find_ipb_freq(op->node);
|
||||
+ if (!ipb_freq) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Unable to find IPB Bus frequency\n" );
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ /* Get IRQ and register */
|
||||
+ rv = of_address_to_resource(op->node, 0, &res_mem);
|
||||
+ if (rv) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while parsing device node resource\n" );
|
||||
+ return rv;
|
||||
+ }
|
||||
+
|
||||
+ ata_irq = irq_of_parse_and_map(op->node, 0);
|
||||
+ if (ata_irq == NO_IRQ) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while mapping the irq\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* Request mem region */
|
||||
+ if (!request_mem_region(res_mem.start,
|
||||
+ sizeof(struct mpc52xx_ata), DRV_NAME)) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while requesting mem region\n");
|
||||
+ irq_dispose_mapping(ata_irq);
|
||||
+ return -EBUSY;
|
||||
+ }
|
||||
+
|
||||
+ /* Remap registers */
|
||||
+ ata_regs = ioremap(res_mem.start, sizeof(struct mpc52xx_ata));
|
||||
+ if (!ata_regs) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while mapping register set\n");
|
||||
+ rv = -ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ /* Prepare our private structure */
|
||||
+ priv = kmalloc(sizeof(struct mpc52xx_ata_priv), GFP_ATOMIC);
|
||||
+ if (!priv) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while allocating private structure\n");
|
||||
+ rv = -ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ priv->ipb_period = 1000000000 / (ipb_freq / 1000);
|
||||
+ priv->ata_regs = ata_regs;
|
||||
+ priv->ata_irq = ata_irq;
|
||||
+ priv->csel = -1;
|
||||
+
|
||||
+ /* Init the hw */
|
||||
+ rv = mpc52xx_ata_hw_init(priv);
|
||||
+ if (rv) {
|
||||
+ printk(KERN_ERR DRV_NAME ": Error during HW init\n");
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ /* Register ourselves to libata */
|
||||
+ rv = mpc52xx_ata_init_one(&op->dev, priv);
|
||||
+ if (rv) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while registering to ATA layer\n");
|
||||
+ return rv;
|
||||
+ }
|
||||
+
|
||||
+ /* Done */
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Error path */
|
||||
+err:
|
||||
+ kfree(priv);
|
||||
+
|
||||
+ if (ata_regs)
|
||||
+ iounmap(ata_regs);
|
||||
+
|
||||
+ release_mem_region(res_mem.start, sizeof(struct mpc52xx_ata));
|
||||
+
|
||||
+ irq_dispose_mapping(ata_irq);
|
||||
+
|
||||
+ return rv;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+mpc52xx_ata_remove(struct of_device *op)
|
||||
+{
|
||||
+ struct mpc52xx_ata_priv *priv;
|
||||
+ struct resource res_mem;
|
||||
+ int rv;
|
||||
+
|
||||
+ /* Unregister */
|
||||
+ priv = mpc52xx_ata_remove_one(&op->dev);
|
||||
+
|
||||
+ /* Free everything */
|
||||
+ iounmap(priv->ata_regs);
|
||||
+
|
||||
+ rv = of_address_to_resource(op->node, 0, &res_mem);
|
||||
+ if (rv) {
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Error while parsing device node resource\n");
|
||||
+ printk(KERN_ERR DRV_NAME ": "
|
||||
+ "Zone may not be properly released\n");
|
||||
+ } else
|
||||
+ release_mem_region(res_mem.start, sizeof(struct mpc52xx_ata));
|
||||
+
|
||||
+ irq_dispose_mapping(priv->ata_irq);
|
||||
+
|
||||
+ kfree(priv);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+#ifdef CONFIG_PM
|
||||
+
|
||||
+static int
|
||||
+mpc52xx_ata_suspend(struct of_device *op, pm_message_t state)
|
||||
+{
|
||||
+ return 0; /* FIXME : What to do here ? */
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+mpc52xx_ata_resume(struct of_device *op)
|
||||
+{
|
||||
+ return 0; /* FIXME : What to do here ? */
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
+static struct of_device_id mpc52xx_ata_of_match[] = {
|
||||
+ {
|
||||
+ .compatible = "mpc5200-ata",
|
||||
+ },
|
||||
+ {
|
||||
+ .compatible = "mpc52xx-ata",
|
||||
+ },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
+
|
||||
+static struct of_platform_driver mpc52xx_ata_of_platform_driver = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .name = DRV_NAME,
|
||||
+ .match_table = mpc52xx_ata_of_match,
|
||||
+ .probe = mpc52xx_ata_probe,
|
||||
+ .remove = mpc52xx_ata_remove,
|
||||
+#ifdef CONFIG_PM
|
||||
+ .suspend = mpc52xx_ata_suspend,
|
||||
+ .resume = mpc52xx_ata_resume,
|
||||
+#endif
|
||||
+ .driver = {
|
||||
+ .name = DRV_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* ======================================================================== */
|
||||
+/* Module */
|
||||
+/* ======================================================================== */
|
||||
+
|
||||
+static int __init
|
||||
+mpc52xx_ata_init(void)
|
||||
+{
|
||||
+ printk(KERN_INFO "ata: MPC52xx IDE/ATA libata driver\n");
|
||||
+ return of_register_platform_driver(&mpc52xx_ata_of_platform_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit
|
||||
+mpc52xx_ata_exit(void)
|
||||
+{
|
||||
+ of_unregister_platform_driver(&mpc52xx_ata_of_platform_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(mpc52xx_ata_init);
|
||||
+module_exit(mpc52xx_ata_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Sylvain Munaut <tnt@246tNt.com>");
|
||||
+MODULE_DESCRIPTION("Freescale MPC52xx IDE/ATA libata driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DEVICE_TABLE(of, mpc52xx_ata_of_match);
|
||||
+MODULE_VERSION(DRV_VERSION);
|
||||
+
|
||||
diff --git a/drivers/ata/pata_mpc52xx.h b/drivers/ata/pata_mpc52xx.h
|
||||
new file mode 100644
|
||||
index 0000000..2430ae2
|
||||
--- /dev/null
|
||||
+++ b/drivers/ata/pata_mpc52xx.h
|
||||
@@ -0,0 +1,107 @@
|
||||
+/*
|
||||
+ * drivers/ata/pata_mpc52xx.h
|
||||
+ *
|
||||
+ * Definitions for the Freescale MPC52xx on-chip IDE interface
|
||||
+ *
|
||||
+ *
|
||||
+ * Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com>
|
||||
+ * Copyright (C) 2003 Mipsys - Benjamin Herrenschmidt
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public License
|
||||
+ * version 2. This program is licensed "as is" without any warranty of any
|
||||
+ * kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __PATA_MPC52xx_H__
|
||||
+#define __PATA_MPC52xx_H__
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/ide.h>
|
||||
+#include <asm/types.h>
|
||||
+#include <asm/io.h>
|
||||
+
|
||||
+
|
||||
+
|
||||
+/* Bit definitions inside the registers */
|
||||
+
|
||||
+#define MPC52xx_ATA_HOSTCONF_SMR 0x80000000UL /* State machine reset */
|
||||
+#define MPC52xx_ATA_HOSTCONF_FR 0x40000000UL /* FIFO Reset */
|
||||
+#define MPC52xx_ATA_HOSTCONF_IE 0x02000000UL /* Enable interrupt in PIO */
|
||||
+#define MPC52xx_ATA_HOSTCONF_IORDY 0x01000000UL /* Drive supports IORDY protocol */
|
||||
+
|
||||
+#define MPC52xx_ATA_HOSTSTAT_TIP 0x80000000UL /* Transaction in progress */
|
||||
+#define MPC52xx_ATA_HOSTSTAT_UREP 0x40000000UL /* UDMA Read Extended Pause */
|
||||
+#define MPC52xx_ATA_HOSTSTAT_RERR 0x02000000UL /* Read Error */
|
||||
+#define MPC52xx_ATA_HOSTSTAT_WERR 0x01000000UL /* Write Error */
|
||||
+
|
||||
+#define MPC52xx_ATA_FIFOSTAT_EMPTY 0x01 /* FIFO Empty */
|
||||
+
|
||||
+#define MPC52xx_ATA_DMAMODE_WRITE 0x01 /* Write DMA */
|
||||
+#define MPC52xx_ATA_DMAMODE_READ 0x02 /* Read DMA */
|
||||
+#define MPC52xx_ATA_DMAMODE_UDMA 0x04 /* UDMA enabled */
|
||||
+#define MPC52xx_ATA_DMAMODE_IE 0x08 /* Enable drive interrupt to CPU in DMA mode */
|
||||
+#define MPC52xx_ATA_DMAMODE_FE 0x10 /* FIFO Flush enable in Rx mode */
|
||||
+#define MPC52xx_ATA_DMAMODE_FR 0x20 /* FIFO Reset */
|
||||
+#define MPC52xx_ATA_DMAMODE_HUT 0x40 /* Host UDMA burst terminate */
|
||||
+
|
||||
+
|
||||
+/* Structure of the hardware registers */
|
||||
+struct mpc52xx_ata {
|
||||
+
|
||||
+ /* Host interface registers */
|
||||
+ u32 config; /* ATA + 0x00 Host configuration */
|
||||
+ u32 host_status; /* ATA + 0x04 Host controller status */
|
||||
+ u32 pio1; /* ATA + 0x08 PIO Timing 1 */
|
||||
+ u32 pio2; /* ATA + 0x0c PIO Timing 2 */
|
||||
+ u32 mdma1; /* ATA + 0x10 MDMA Timing 1 */
|
||||
+ u32 mdma2; /* ATA + 0x14 MDMA Timing 2 */
|
||||
+ u32 udma1; /* ATA + 0x18 UDMA Timing 1 */
|
||||
+ u32 udma2; /* ATA + 0x1c UDMA Timing 2 */
|
||||
+ u32 udma3; /* ATA + 0x20 UDMA Timing 3 */
|
||||
+ u32 udma4; /* ATA + 0x24 UDMA Timing 4 */
|
||||
+ u32 udma5; /* ATA + 0x28 UDMA Timing 5 */
|
||||
+ u32 share_cnt; /* ATA + 0x2c ATA share counter */
|
||||
+ u32 reserved0[3];
|
||||
+
|
||||
+ /* FIFO registers */
|
||||
+ u32 fifo_data; /* ATA + 0x3c */
|
||||
+ u8 fifo_status_frame; /* ATA + 0x40 */
|
||||
+ u8 fifo_status; /* ATA + 0x41 */
|
||||
+ u16 reserved7[1];
|
||||
+ u8 fifo_control; /* ATA + 0x44 */
|
||||
+ u8 reserved8[5];
|
||||
+ u16 fifo_alarm; /* ATA + 0x4a */
|
||||
+ u16 reserved9;
|
||||
+ u16 fifo_rdp; /* ATA + 0x4e */
|
||||
+ u16 reserved10;
|
||||
+ u16 fifo_wrp; /* ATA + 0x52 */
|
||||
+ u16 reserved11;
|
||||
+ u16 fifo_lfrdp; /* ATA + 0x56 */
|
||||
+ u16 reserved12;
|
||||
+ u16 fifo_lfwrp; /* ATA + 0x5a */
|
||||
+
|
||||
+ /* Drive TaskFile registers */
|
||||
+ u8 tf_control; /* ATA + 0x5c TASKFILE Control/Alt Status */
|
||||
+ u8 reserved13[3];
|
||||
+ u16 tf_data; /* ATA + 0x60 TASKFILE Data */
|
||||
+ u16 reserved14;
|
||||
+ u8 tf_features; /* ATA + 0x64 TASKFILE Features/Error */
|
||||
+ u8 reserved15[3];
|
||||
+ u8 tf_sec_count; /* ATA + 0x68 TASKFILE Sector Count */
|
||||
+ u8 reserved16[3];
|
||||
+ u8 tf_sec_num; /* ATA + 0x6c TASKFILE Sector Number */
|
||||
+ u8 reserved17[3];
|
||||
+ u8 tf_cyl_low; /* ATA + 0x70 TASKFILE Cylinder Low */
|
||||
+ u8 reserved18[3];
|
||||
+ u8 tf_cyl_high; /* ATA + 0x74 TASKFILE Cylinder High */
|
||||
+ u8 reserved19[3];
|
||||
+ u8 tf_dev_head; /* ATA + 0x78 TASKFILE Device/Head */
|
||||
+ u8 reserved20[3];
|
||||
+ u8 tf_command; /* ATA + 0x7c TASKFILE Command/Status */
|
||||
+ u8 dma_mode; /* ATA + 0x7d ATA Host DMA Mode configuration */
|
||||
+ u8 reserved21[2];
|
||||
+};
|
||||
+
|
||||
+#endif /* __PATA_MPC52xx_H__ */
|
||||
+
|
||||
--
|
||||
1.4.3.2
|
||||
|
306
debian/patches/features/powerpc/efika/0005-Add-MPC5200-specific-header.diff
vendored
Normal file
306
debian/patches/features/powerpc/efika/0005-Add-MPC5200-specific-header.diff
vendored
Normal file
|
@ -0,0 +1,306 @@
|
|||
From e63b95820892f44ac7eec431900378763a83ae9d Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:05:34 +0100
|
||||
Subject: [PATCH] Add MPC5200 specific header
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
include/asm-powerpc/mpc52xx.h | 287 +++++++++++++++++++++++++++++++++++++++++
|
||||
1 files changed, 287 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/include/asm-powerpc/mpc52xx.h b/include/asm-powerpc/mpc52xx.h
|
||||
new file mode 100644
|
||||
index 0000000..e9aa622
|
||||
--- /dev/null
|
||||
+++ b/include/asm-powerpc/mpc52xx.h
|
||||
@@ -0,0 +1,287 @@
|
||||
+/*
|
||||
+ * Prototypes, etc. for the Freescale MPC52xx embedded cpu chips
|
||||
+ * May need to be cleaned as the port goes on ...
|
||||
+ *
|
||||
+ * Copyright (C) 2004-2005 Sylvain Munaut <tnt@246tNt.com>
|
||||
+ * Copyright (C) 2003 MontaVista, Software, Inc.
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public License
|
||||
+ * version 2. This program is licensed "as is" without any warranty of any
|
||||
+ * kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __ASM_POWERPC_MPC52xx_H__
|
||||
+#define __ASM_POWERPC_MPC52xx_H__
|
||||
+
|
||||
+#ifndef __ASSEMBLY__
|
||||
+#include <asm/types.h>
|
||||
+#include <asm/prom.h>
|
||||
+#endif /* __ASSEMBLY__ */
|
||||
+
|
||||
+
|
||||
+/* ======================================================================== */
|
||||
+/* HW IRQ mapping */
|
||||
+/* ======================================================================== */
|
||||
+
|
||||
+#define MPC52xx_IRQ_L1_CRIT (0)
|
||||
+#define MPC52xx_IRQ_L1_MAIN (1)
|
||||
+#define MPC52xx_IRQ_L1_PERP (2)
|
||||
+#define MPC52xx_IRQ_L1_SDMA (3)
|
||||
+
|
||||
+#define MPC52xx_IRQ_L1_OFFSET (6)
|
||||
+#define MPC52xx_IRQ_L1_MASK (0xc0)
|
||||
+
|
||||
+#define MPC52xx_IRQ_L2_OFFSET (0)
|
||||
+#define MPC52xx_IRQ_L2_MASK (0x3f)
|
||||
+
|
||||
+#define MPC52xx_IRQ_HIGHTESTHWIRQ (0xd0)
|
||||
+
|
||||
+
|
||||
+/* ======================================================================== */
|
||||
+/* Structures mapping of some unit register set */
|
||||
+/* ======================================================================== */
|
||||
+
|
||||
+#ifndef __ASSEMBLY__
|
||||
+
|
||||
+/* Interrupt controller Register set */
|
||||
+struct mpc52xx_intr {
|
||||
+ u32 per_mask; /* INTR + 0x00 */
|
||||
+ u32 per_pri1; /* INTR + 0x04 */
|
||||
+ u32 per_pri2; /* INTR + 0x08 */
|
||||
+ u32 per_pri3; /* INTR + 0x0c */
|
||||
+ u32 ctrl; /* INTR + 0x10 */
|
||||
+ u32 main_mask; /* INTR + 0x14 */
|
||||
+ u32 main_pri1; /* INTR + 0x18 */
|
||||
+ u32 main_pri2; /* INTR + 0x1c */
|
||||
+ u32 reserved1; /* INTR + 0x20 */
|
||||
+ u32 enc_status; /* INTR + 0x24 */
|
||||
+ u32 crit_status; /* INTR + 0x28 */
|
||||
+ u32 main_status; /* INTR + 0x2c */
|
||||
+ u32 per_status; /* INTR + 0x30 */
|
||||
+ u32 reserved2; /* INTR + 0x34 */
|
||||
+ u32 per_error; /* INTR + 0x38 */
|
||||
+};
|
||||
+
|
||||
+/* Memory Mapping Control */
|
||||
+struct mpc52xx_mmap_ctl {
|
||||
+ u32 mbar; /* MMAP_CTRL + 0x00 */
|
||||
+
|
||||
+ u32 cs0_start; /* MMAP_CTRL + 0x04 */
|
||||
+ u32 cs0_stop; /* MMAP_CTRL + 0x08 */
|
||||
+ u32 cs1_start; /* MMAP_CTRL + 0x0c */
|
||||
+ u32 cs1_stop; /* MMAP_CTRL + 0x10 */
|
||||
+ u32 cs2_start; /* MMAP_CTRL + 0x14 */
|
||||
+ u32 cs2_stop; /* MMAP_CTRL + 0x18 */
|
||||
+ u32 cs3_start; /* MMAP_CTRL + 0x1c */
|
||||
+ u32 cs3_stop; /* MMAP_CTRL + 0x20 */
|
||||
+ u32 cs4_start; /* MMAP_CTRL + 0x24 */
|
||||
+ u32 cs4_stop; /* MMAP_CTRL + 0x28 */
|
||||
+ u32 cs5_start; /* MMAP_CTRL + 0x2c */
|
||||
+ u32 cs5_stop; /* MMAP_CTRL + 0x30 */
|
||||
+
|
||||
+ u32 sdram0; /* MMAP_CTRL + 0x34 */
|
||||
+ u32 sdram1; /* MMAP_CTRL + 0X38 */
|
||||
+
|
||||
+ u32 reserved[4]; /* MMAP_CTRL + 0x3c .. 0x48 */
|
||||
+
|
||||
+ u32 boot_start; /* MMAP_CTRL + 0x4c */
|
||||
+ u32 boot_stop; /* MMAP_CTRL + 0x50 */
|
||||
+
|
||||
+ u32 ipbi_ws_ctrl; /* MMAP_CTRL + 0x54 */
|
||||
+
|
||||
+ u32 cs6_start; /* MMAP_CTRL + 0x58 */
|
||||
+ u32 cs6_stop; /* MMAP_CTRL + 0x5c */
|
||||
+ u32 cs7_start; /* MMAP_CTRL + 0x60 */
|
||||
+ u32 cs7_stop; /* MMAP_CTRL + 0x64 */
|
||||
+};
|
||||
+
|
||||
+/* SDRAM control */
|
||||
+struct mpc52xx_sdram {
|
||||
+ u32 mode; /* SDRAM + 0x00 */
|
||||
+ u32 ctrl; /* SDRAM + 0x04 */
|
||||
+ u32 config1; /* SDRAM + 0x08 */
|
||||
+ u32 config2; /* SDRAM + 0x0c */
|
||||
+};
|
||||
+
|
||||
+/* SDMA */
|
||||
+struct mpc52xx_sdma {
|
||||
+ u32 taskBar; /* SDMA + 0x00 */
|
||||
+ u32 currentPointer; /* SDMA + 0x04 */
|
||||
+ u32 endPointer; /* SDMA + 0x08 */
|
||||
+ u32 variablePointer; /* SDMA + 0x0c */
|
||||
+
|
||||
+ u8 IntVect1; /* SDMA + 0x10 */
|
||||
+ u8 IntVect2; /* SDMA + 0x11 */
|
||||
+ u16 PtdCntrl; /* SDMA + 0x12 */
|
||||
+
|
||||
+ u32 IntPend; /* SDMA + 0x14 */
|
||||
+ u32 IntMask; /* SDMA + 0x18 */
|
||||
+
|
||||
+ u16 tcr[16]; /* SDMA + 0x1c .. 0x3a */
|
||||
+
|
||||
+ u8 ipr[32]; /* SDMA + 0x3c .. 0x5b */
|
||||
+
|
||||
+ u32 cReqSelect; /* SDMA + 0x5c */
|
||||
+ u32 task_size0; /* SDMA + 0x60 */
|
||||
+ u32 task_size1; /* SDMA + 0x64 */
|
||||
+ u32 MDEDebug; /* SDMA + 0x68 */
|
||||
+ u32 ADSDebug; /* SDMA + 0x6c */
|
||||
+ u32 Value1; /* SDMA + 0x70 */
|
||||
+ u32 Value2; /* SDMA + 0x74 */
|
||||
+ u32 Control; /* SDMA + 0x78 */
|
||||
+ u32 Status; /* SDMA + 0x7c */
|
||||
+ u32 PTDDebug; /* SDMA + 0x80 */
|
||||
+};
|
||||
+
|
||||
+/* GPT */
|
||||
+struct mpc52xx_gpt {
|
||||
+ u32 mode; /* GPTx + 0x00 */
|
||||
+ u32 count; /* GPTx + 0x04 */
|
||||
+ u32 pwm; /* GPTx + 0x08 */
|
||||
+ u32 status; /* GPTx + 0X0c */
|
||||
+};
|
||||
+
|
||||
+/* GPIO */
|
||||
+struct mpc52xx_gpio {
|
||||
+ u32 port_config; /* GPIO + 0x00 */
|
||||
+ u32 simple_gpioe; /* GPIO + 0x04 */
|
||||
+ u32 simple_ode; /* GPIO + 0x08 */
|
||||
+ u32 simple_ddr; /* GPIO + 0x0c */
|
||||
+ u32 simple_dvo; /* GPIO + 0x10 */
|
||||
+ u32 simple_ival; /* GPIO + 0x14 */
|
||||
+ u8 outo_gpioe; /* GPIO + 0x18 */
|
||||
+ u8 reserved1[3]; /* GPIO + 0x19 */
|
||||
+ u8 outo_dvo; /* GPIO + 0x1c */
|
||||
+ u8 reserved2[3]; /* GPIO + 0x1d */
|
||||
+ u8 sint_gpioe; /* GPIO + 0x20 */
|
||||
+ u8 reserved3[3]; /* GPIO + 0x21 */
|
||||
+ u8 sint_ode; /* GPIO + 0x24 */
|
||||
+ u8 reserved4[3]; /* GPIO + 0x25 */
|
||||
+ u8 sint_ddr; /* GPIO + 0x28 */
|
||||
+ u8 reserved5[3]; /* GPIO + 0x29 */
|
||||
+ u8 sint_dvo; /* GPIO + 0x2c */
|
||||
+ u8 reserved6[3]; /* GPIO + 0x2d */
|
||||
+ u8 sint_inten; /* GPIO + 0x30 */
|
||||
+ u8 reserved7[3]; /* GPIO + 0x31 */
|
||||
+ u16 sint_itype; /* GPIO + 0x34 */
|
||||
+ u16 reserved8; /* GPIO + 0x36 */
|
||||
+ u8 gpio_control; /* GPIO + 0x38 */
|
||||
+ u8 reserved9[3]; /* GPIO + 0x39 */
|
||||
+ u8 sint_istat; /* GPIO + 0x3c */
|
||||
+ u8 sint_ival; /* GPIO + 0x3d */
|
||||
+ u8 bus_errs; /* GPIO + 0x3e */
|
||||
+ u8 reserved10; /* GPIO + 0x3f */
|
||||
+};
|
||||
+
|
||||
+#define MPC52xx_GPIO_PSC_CONFIG_UART_WITHOUT_CD 4
|
||||
+#define MPC52xx_GPIO_PSC_CONFIG_UART_WITH_CD 5
|
||||
+#define MPC52xx_GPIO_PCI_DIS (1<<15)
|
||||
+
|
||||
+/* GPIO with WakeUp*/
|
||||
+struct mpc52xx_gpio_wkup {
|
||||
+ u8 wkup_gpioe; /* GPIO_WKUP + 0x00 */
|
||||
+ u8 reserved1[3]; /* GPIO_WKUP + 0x03 */
|
||||
+ u8 wkup_ode; /* GPIO_WKUP + 0x04 */
|
||||
+ u8 reserved2[3]; /* GPIO_WKUP + 0x05 */
|
||||
+ u8 wkup_ddr; /* GPIO_WKUP + 0x08 */
|
||||
+ u8 reserved3[3]; /* GPIO_WKUP + 0x09 */
|
||||
+ u8 wkup_dvo; /* GPIO_WKUP + 0x0C */
|
||||
+ u8 reserved4[3]; /* GPIO_WKUP + 0x0D */
|
||||
+ u8 wkup_inten; /* GPIO_WKUP + 0x10 */
|
||||
+ u8 reserved5[3]; /* GPIO_WKUP + 0x11 */
|
||||
+ u8 wkup_iinten; /* GPIO_WKUP + 0x14 */
|
||||
+ u8 reserved6[3]; /* GPIO_WKUP + 0x15 */
|
||||
+ u16 wkup_itype; /* GPIO_WKUP + 0x18 */
|
||||
+ u8 reserved7[2]; /* GPIO_WKUP + 0x1A */
|
||||
+ u8 wkup_maste; /* GPIO_WKUP + 0x1C */
|
||||
+ u8 reserved8[3]; /* GPIO_WKUP + 0x1D */
|
||||
+ u8 wkup_ival; /* GPIO_WKUP + 0x20 */
|
||||
+ u8 reserved9[3]; /* GPIO_WKUP + 0x21 */
|
||||
+ u8 wkup_istat; /* GPIO_WKUP + 0x24 */
|
||||
+ u8 reserved10[3]; /* GPIO_WKUP + 0x25 */
|
||||
+};
|
||||
+
|
||||
+/* XLB Bus control */
|
||||
+struct mpc52xx_xlb {
|
||||
+ u8 reserved[0x40];
|
||||
+ u32 config; /* XLB + 0x40 */
|
||||
+ u32 version; /* XLB + 0x44 */
|
||||
+ u32 status; /* XLB + 0x48 */
|
||||
+ u32 int_enable; /* XLB + 0x4c */
|
||||
+ u32 addr_capture; /* XLB + 0x50 */
|
||||
+ u32 bus_sig_capture; /* XLB + 0x54 */
|
||||
+ u32 addr_timeout; /* XLB + 0x58 */
|
||||
+ u32 data_timeout; /* XLB + 0x5c */
|
||||
+ u32 bus_act_timeout; /* XLB + 0x60 */
|
||||
+ u32 master_pri_enable; /* XLB + 0x64 */
|
||||
+ u32 master_priority; /* XLB + 0x68 */
|
||||
+ u32 base_address; /* XLB + 0x6c */
|
||||
+ u32 snoop_window; /* XLB + 0x70 */
|
||||
+};
|
||||
+
|
||||
+#define MPC52xx_XLB_CFG_PLDIS (1 << 31)
|
||||
+#define MPC52xx_XLB_CFG_SNOOP (1 << 15)
|
||||
+
|
||||
+/* Clock Distribution control */
|
||||
+struct mpc52xx_cdm {
|
||||
+ u32 jtag_id; /* CDM + 0x00 reg0 read only */
|
||||
+ u32 rstcfg; /* CDM + 0x04 reg1 read only */
|
||||
+ u32 breadcrumb; /* CDM + 0x08 reg2 */
|
||||
+
|
||||
+ u8 mem_clk_sel; /* CDM + 0x0c reg3 byte0 */
|
||||
+ u8 xlb_clk_sel; /* CDM + 0x0d reg3 byte1 read only */
|
||||
+ u8 ipb_clk_sel; /* CDM + 0x0e reg3 byte2 */
|
||||
+ u8 pci_clk_sel; /* CDM + 0x0f reg3 byte3 */
|
||||
+
|
||||
+ u8 ext_48mhz_en; /* CDM + 0x10 reg4 byte0 */
|
||||
+ u8 fd_enable; /* CDM + 0x11 reg4 byte1 */
|
||||
+ u16 fd_counters; /* CDM + 0x12 reg4 byte2,3 */
|
||||
+
|
||||
+ u32 clk_enables; /* CDM + 0x14 reg5 */
|
||||
+
|
||||
+ u8 osc_disable; /* CDM + 0x18 reg6 byte0 */
|
||||
+ u8 reserved0[3]; /* CDM + 0x19 reg6 byte1,2,3 */
|
||||
+
|
||||
+ u8 ccs_sleep_enable; /* CDM + 0x1c reg7 byte0 */
|
||||
+ u8 osc_sleep_enable; /* CDM + 0x1d reg7 byte1 */
|
||||
+ u8 reserved1; /* CDM + 0x1e reg7 byte2 */
|
||||
+ u8 ccs_qreq_test; /* CDM + 0x1f reg7 byte3 */
|
||||
+
|
||||
+ u8 soft_reset; /* CDM + 0x20 u8 byte0 */
|
||||
+ u8 no_ckstp; /* CDM + 0x21 u8 byte0 */
|
||||
+ u8 reserved2[2]; /* CDM + 0x22 u8 byte1,2,3 */
|
||||
+
|
||||
+ u8 pll_lock; /* CDM + 0x24 reg9 byte0 */
|
||||
+ u8 pll_looselock; /* CDM + 0x25 reg9 byte1 */
|
||||
+ u8 pll_sm_lockwin; /* CDM + 0x26 reg9 byte2 */
|
||||
+ u8 reserved3; /* CDM + 0x27 reg9 byte3 */
|
||||
+
|
||||
+ u16 reserved4; /* CDM + 0x28 reg10 byte0,1 */
|
||||
+ u16 mclken_div_psc1; /* CDM + 0x2a reg10 byte2,3 */
|
||||
+
|
||||
+ u16 reserved5; /* CDM + 0x2c reg11 byte0,1 */
|
||||
+ u16 mclken_div_psc2; /* CDM + 0x2e reg11 byte2,3 */
|
||||
+
|
||||
+ u16 reserved6; /* CDM + 0x30 reg12 byte0,1 */
|
||||
+ u16 mclken_div_psc3; /* CDM + 0x32 reg12 byte2,3 */
|
||||
+
|
||||
+ u16 reserved7; /* CDM + 0x34 reg13 byte0,1 */
|
||||
+ u16 mclken_div_psc6; /* CDM + 0x36 reg13 byte2,3 */
|
||||
+};
|
||||
+
|
||||
+#endif /* __ASSEMBLY__ */
|
||||
+
|
||||
+
|
||||
+/* ========================================================================= */
|
||||
+/* Prototypes for MPC52xx sysdev */
|
||||
+/* ========================================================================= */
|
||||
+
|
||||
+#ifndef __ASSEMBLY__
|
||||
+
|
||||
+extern void mpc52xx_init_irq(void);
|
||||
+extern unsigned int mpc52xx_get_irq(void);
|
||||
+
|
||||
+#endif /* __ASSEMBLY__ */
|
||||
+
|
||||
+#endif /* __ASM_POWERPC_MPC52xx_H__ */
|
||||
+
|
||||
--
|
||||
1.4.3.2
|
||||
|
570
debian/patches/features/powerpc/efika/0006-Add-MPC5200-interrupt-controller-driver.diff
vendored
Normal file
570
debian/patches/features/powerpc/efika/0006-Add-MPC5200-interrupt-controller-driver.diff
vendored
Normal file
|
@ -0,0 +1,570 @@
|
|||
From b20c97e6f809bff52b864db1352a866c66a2bbd1 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:06:28 +0100
|
||||
Subject: [PATCH] Add MPC5200 interrupt controller driver
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
arch/powerpc/sysdev/Makefile | 1 +
|
||||
arch/powerpc/sysdev/mpc52xx_pic.c | 538 +++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 539 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
|
||||
index 91f052d..5b5b61e 100644
|
||||
--- a/arch/powerpc/sysdev/Makefile
|
||||
+++ b/arch/powerpc/sysdev/Makefile
|
||||
@@ -13,6 +13,7 @@ obj-$(CONFIG_FSL_SOC) += fsl_soc.o
|
||||
obj-$(CONFIG_PPC_TODC) += todc.o
|
||||
obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o
|
||||
obj-$(CONFIG_QUICC_ENGINE) += qe_lib/
|
||||
+obj-$(CONFIG_PPC_MPC52xx) += mpc52xx_pic.o
|
||||
|
||||
ifeq ($(CONFIG_PPC_MERGE),y)
|
||||
obj-$(CONFIG_PPC_I8259) += i8259.o
|
||||
diff --git a/arch/powerpc/sysdev/mpc52xx_pic.c b/arch/powerpc/sysdev/mpc52xx_pic.c
|
||||
new file mode 100644
|
||||
index 0000000..6df51f0
|
||||
--- /dev/null
|
||||
+++ b/arch/powerpc/sysdev/mpc52xx_pic.c
|
||||
@@ -0,0 +1,538 @@
|
||||
+/*
|
||||
+ *
|
||||
+ * Programmable Interrupt Controller functions for the Freescale MPC52xx.
|
||||
+ *
|
||||
+ * Copyright (C) 2006 bplan GmbH
|
||||
+ *
|
||||
+ * Based on the code from the 2.4 kernel by
|
||||
+ * Dale Farnsworth <dfarnsworth@mvista.com> and Kent Borg.
|
||||
+ *
|
||||
+ * Copyright (C) 2004 Sylvain Munaut <tnt@246tNt.com>
|
||||
+ * Copyright (C) 2003 Montavista Software, Inc
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public License
|
||||
+ * version 2. This program is licensed "as is" without any warranty of any
|
||||
+ * kind, whether express or implied.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#undef DEBUG
|
||||
+
|
||||
+#include <linux/stddef.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/signal.h>
|
||||
+#include <linux/stddef.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/hardirq.h>
|
||||
+
|
||||
+#include <asm/io.h>
|
||||
+#include <asm/processor.h>
|
||||
+#include <asm/system.h>
|
||||
+#include <asm/irq.h>
|
||||
+#include <asm/prom.h>
|
||||
+#include <asm/mpc52xx.h>
|
||||
+
|
||||
+/*
|
||||
+ *
|
||||
+*/
|
||||
+
|
||||
+static struct mpc52xx_intr __iomem *intr;
|
||||
+static struct mpc52xx_sdma __iomem *sdma;
|
||||
+static struct irq_host *mpc52xx_irqhost = NULL;
|
||||
+
|
||||
+static unsigned char mpc52xx_map_senses[4] = {
|
||||
+ IRQ_TYPE_LEVEL_HIGH,
|
||||
+ IRQ_TYPE_EDGE_RISING,
|
||||
+ IRQ_TYPE_EDGE_FALLING,
|
||||
+ IRQ_TYPE_LEVEL_LOW,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ *
|
||||
+*/
|
||||
+
|
||||
+static inline void io_be_setbit(u32 __iomem * addr, int bitno)
|
||||
+{
|
||||
+ out_be32(addr, in_be32(addr) | (1 << bitno));
|
||||
+}
|
||||
+
|
||||
+static inline void io_be_clrbit(u32 __iomem * addr, int bitno)
|
||||
+{
|
||||
+ out_be32(addr, in_be32(addr) & ~(1 << bitno));
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * IRQ[0-3] interrupt irq_chip
|
||||
+*/
|
||||
+
|
||||
+static void mpc52xx_extirq_mask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_clrbit(&intr->ctrl, 11 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static void mpc52xx_extirq_unmask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_setbit(&intr->ctrl, 11 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static void mpc52xx_extirq_ack(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_setbit(&intr->ctrl, 27 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip mpc52xx_extirq_irqchip = {
|
||||
+ .typename = " MPC52xx IRQ[0-3] ",
|
||||
+ .mask = mpc52xx_extirq_mask,
|
||||
+ .unmask = mpc52xx_extirq_unmask,
|
||||
+ .ack = mpc52xx_extirq_ack,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * Main interrupt irq_chip
|
||||
+*/
|
||||
+
|
||||
+static void mpc52xx_main_mask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_setbit(&intr->main_mask, 15 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static void mpc52xx_main_unmask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_clrbit(&intr->main_mask, 15 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip mpc52xx_main_irqchip = {
|
||||
+ .typename = "MPC52xx Main",
|
||||
+ .mask = mpc52xx_main_mask,
|
||||
+ .mask_ack = mpc52xx_main_mask,
|
||||
+ .unmask = mpc52xx_main_unmask,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * Peripherals interrupt irq_chip
|
||||
+*/
|
||||
+
|
||||
+static void mpc52xx_periph_mask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_setbit(&intr->per_mask, 31 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static void mpc52xx_periph_unmask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_clrbit(&intr->per_mask, 31 - l2irq);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip mpc52xx_periph_irqchip = {
|
||||
+ .typename = "MPC52xx Peripherals",
|
||||
+ .mask = mpc52xx_periph_mask,
|
||||
+ .mask_ack = mpc52xx_periph_mask,
|
||||
+ .unmask = mpc52xx_periph_unmask,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * SDMA interrupt irq_chip
|
||||
+*/
|
||||
+
|
||||
+static void mpc52xx_sdma_mask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_setbit(&sdma->IntMask, l2irq);
|
||||
+}
|
||||
+
|
||||
+static void mpc52xx_sdma_unmask(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ io_be_clrbit(&sdma->IntMask, l2irq);
|
||||
+}
|
||||
+
|
||||
+static void mpc52xx_sdma_ack(unsigned int virq)
|
||||
+{
|
||||
+ int irq;
|
||||
+ int l2irq;
|
||||
+
|
||||
+ irq = irq_map[virq].hwirq;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq);
|
||||
+
|
||||
+ out_be32(&sdma->IntPend, 1 << l2irq);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip mpc52xx_sdma_irqchip = {
|
||||
+ .typename = "MPC52xx SDMA",
|
||||
+ .mask = mpc52xx_sdma_mask,
|
||||
+ .unmask = mpc52xx_sdma_unmask,
|
||||
+ .ack = mpc52xx_sdma_ack,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * irq_host
|
||||
+*/
|
||||
+
|
||||
+static int mpc52xx_irqhost_match(struct irq_host *h, struct device_node *node)
|
||||
+{
|
||||
+ pr_debug("%s: node=%p\n", __func__, node);
|
||||
+ return mpc52xx_irqhost->host_data == node;
|
||||
+}
|
||||
+
|
||||
+static int mpc52xx_irqhost_xlate(struct irq_host *h, struct device_node *ct,
|
||||
+ u32 * intspec, unsigned int intsize,
|
||||
+ irq_hw_number_t * out_hwirq,
|
||||
+ unsigned int *out_flags)
|
||||
+{
|
||||
+ int intrvect_l1;
|
||||
+ int intrvect_l2;
|
||||
+ int intrvect_type;
|
||||
+ int intrvect_linux;
|
||||
+
|
||||
+ if (intsize != 3)
|
||||
+ return -1;
|
||||
+
|
||||
+ intrvect_l1 = (int)intspec[0];
|
||||
+ intrvect_l2 = (int)intspec[1];
|
||||
+ intrvect_type = (int)intspec[2];
|
||||
+
|
||||
+ intrvect_linux =
|
||||
+ (intrvect_l1 << MPC52xx_IRQ_L1_OFFSET) & MPC52xx_IRQ_L1_MASK;
|
||||
+ intrvect_linux |=
|
||||
+ (intrvect_l2 << MPC52xx_IRQ_L2_OFFSET) & MPC52xx_IRQ_L2_MASK;
|
||||
+
|
||||
+ pr_debug("return %x, l1=%d, l2=%d\n", intrvect_linux, intrvect_l1,
|
||||
+ intrvect_l2);
|
||||
+
|
||||
+ *out_hwirq = intrvect_linux;
|
||||
+ *out_flags = mpc52xx_map_senses[intrvect_type];
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * this function retrieves the correct IRQ type out
|
||||
+ * of the MPC regs
|
||||
+ * Only externals IRQs needs this
|
||||
+*/
|
||||
+static int mpc52xx_irqx_gettype(int irq)
|
||||
+{
|
||||
+ int type;
|
||||
+ u32 ctrl_reg;
|
||||
+
|
||||
+ ctrl_reg = in_be32(&intr->ctrl);
|
||||
+ type = (ctrl_reg >> (22 - irq * 2)) & 0x3;
|
||||
+
|
||||
+ return mpc52xx_map_senses[type];
|
||||
+}
|
||||
+
|
||||
+static int mpc52xx_irqhost_map(struct irq_host *h, unsigned int virq,
|
||||
+ irq_hw_number_t irq)
|
||||
+{
|
||||
+ int l1irq;
|
||||
+ int l2irq;
|
||||
+ struct irq_chip *good_irqchip;
|
||||
+ void *good_handle;
|
||||
+ int type;
|
||||
+
|
||||
+ l1irq = (irq & MPC52xx_IRQ_L1_MASK) >> MPC52xx_IRQ_L1_OFFSET;
|
||||
+ l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET;
|
||||
+
|
||||
+ /*
|
||||
+ * Most of ours IRQs will be level low
|
||||
+ * Only external IRQs on some platform may be others
|
||||
+ */
|
||||
+ type = IRQ_TYPE_LEVEL_LOW;
|
||||
+
|
||||
+ switch (l1irq) {
|
||||
+ case MPC52xx_IRQ_L1_CRIT:
|
||||
+ pr_debug("%s: Critical. l2=%x\n", __func__, l2irq);
|
||||
+
|
||||
+ BUG_ON(l2irq != 0);
|
||||
+
|
||||
+ type = mpc52xx_irqx_gettype(l2irq);
|
||||
+ good_irqchip = &mpc52xx_extirq_irqchip;
|
||||
+ break;
|
||||
+
|
||||
+ case MPC52xx_IRQ_L1_MAIN:
|
||||
+ pr_debug("%s: Main IRQ[1-3] l2=%x\n", __func__, l2irq);
|
||||
+
|
||||
+ if ((l2irq >= 1) && (l2irq <= 3)) {
|
||||
+ type = mpc52xx_irqx_gettype(l2irq);
|
||||
+ good_irqchip = &mpc52xx_extirq_irqchip;
|
||||
+ } else {
|
||||
+ good_irqchip = &mpc52xx_main_irqchip;
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ case MPC52xx_IRQ_L1_PERP:
|
||||
+ pr_debug("%s: Peripherals. l2=%x\n", __func__, l2irq);
|
||||
+ good_irqchip = &mpc52xx_periph_irqchip;
|
||||
+ break;
|
||||
+
|
||||
+ case MPC52xx_IRQ_L1_SDMA:
|
||||
+ pr_debug("%s: SDMA. l2=%x\n", __func__, l2irq);
|
||||
+ good_irqchip = &mpc52xx_sdma_irqchip;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ pr_debug("%s: Error, unknown L1 IRQ (0x%x)\n", __func__, l1irq);
|
||||
+ printk(KERN_ERR "Unknow IRQ!\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ switch (type) {
|
||||
+ case IRQ_TYPE_EDGE_FALLING:
|
||||
+ case IRQ_TYPE_EDGE_RISING:
|
||||
+ good_handle = handle_edge_irq;
|
||||
+ break;
|
||||
+ default:
|
||||
+ good_handle = handle_level_irq;
|
||||
+ }
|
||||
+
|
||||
+ set_irq_chip_and_handler(virq, good_irqchip, good_handle);
|
||||
+
|
||||
+ pr_debug("%s: virq=%x, hw=%x. type=%x\n", __func__, virq,
|
||||
+ (int)irq, type);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct irq_host_ops mpc52xx_irqhost_ops = {
|
||||
+ .match = mpc52xx_irqhost_match,
|
||||
+ .xlate = mpc52xx_irqhost_xlate,
|
||||
+ .map = mpc52xx_irqhost_map,
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * init (public)
|
||||
+*/
|
||||
+
|
||||
+void __init mpc52xx_init_irq(void)
|
||||
+{
|
||||
+ struct device_node *picnode = NULL;
|
||||
+ int picnode_regsize;
|
||||
+ u32 picnode_regoffset;
|
||||
+
|
||||
+ struct device_node *sdmanode = NULL;
|
||||
+ int sdmanode_regsize;
|
||||
+ u32 sdmanode_regoffset;
|
||||
+
|
||||
+ u64 size64;
|
||||
+ int flags;
|
||||
+
|
||||
+ u32 intr_ctrl;
|
||||
+
|
||||
+ picnode = of_find_compatible_node(NULL, "interrupt-controller",
|
||||
+ "mpc5200-pic");
|
||||
+ if (picnode == NULL) {
|
||||
+ printk(KERN_ERR "MPC52xx PIC: "
|
||||
+ "Unable to find the interrupt controller "
|
||||
+ "in the OpenFirmware device tree\n");
|
||||
+ goto end;
|
||||
+ }
|
||||
+
|
||||
+ sdmanode = of_find_compatible_node(NULL, "dma-controller",
|
||||
+ "mpc5200-bestcomm");
|
||||
+ if (sdmanode == NULL) {
|
||||
+ printk(KERN_ERR "MPC52xx PIC"
|
||||
+ "Unable to find the Bestcomm DMA controller device "
|
||||
+ "in the OpenFirmware device tree\n");
|
||||
+ goto end;
|
||||
+ }
|
||||
+
|
||||
+ /* Retrieve PIC ressources */
|
||||
+ picnode_regoffset = (u32) of_get_address(picnode, 0, &size64, &flags);
|
||||
+ if (picnode_regoffset == 0) {
|
||||
+ printk(KERN_ERR "MPC52xx PIC"
|
||||
+ "Unable to get the interrupt controller address\n");
|
||||
+ goto end;
|
||||
+ }
|
||||
+
|
||||
+ picnode_regoffset =
|
||||
+ of_translate_address(picnode, (u32 *) picnode_regoffset);
|
||||
+ picnode_regsize = (int)size64;
|
||||
+
|
||||
+ /* Retrieve SDMA ressources */
|
||||
+ sdmanode_regoffset = (u32) of_get_address(sdmanode, 0, &size64, &flags);
|
||||
+ if (sdmanode_regoffset == 0) {
|
||||
+ printk(KERN_ERR "MPC52xx PIC: "
|
||||
+ "Unable to get the Bestcomm DMA controller address\n");
|
||||
+ goto end;
|
||||
+ }
|
||||
+
|
||||
+ sdmanode_regoffset =
|
||||
+ of_translate_address(sdmanode, (u32 *) sdmanode_regoffset);
|
||||
+ sdmanode_regsize = (int)size64;
|
||||
+
|
||||
+ /* Remap the necessary zones */
|
||||
+ intr = ioremap(picnode_regoffset, picnode_regsize);
|
||||
+ if (intr == NULL) {
|
||||
+ printk(KERN_ERR "MPC52xx PIC: "
|
||||
+ "Unable to ioremap interrupt controller registers!\n");
|
||||
+ goto end;
|
||||
+ }
|
||||
+
|
||||
+ sdma = ioremap(sdmanode_regoffset, sdmanode_regsize);
|
||||
+ if (sdma == NULL) {
|
||||
+ iounmap(intr);
|
||||
+ printk(KERN_ERR "MPC52xx PIC: "
|
||||
+ "Unable to ioremap Bestcomm DMA registers!\n");
|
||||
+ goto end;
|
||||
+ }
|
||||
+
|
||||
+ printk(KERN_INFO "MPC52xx PIC: MPC52xx PIC Remapped at 0x%8.8x\n",
|
||||
+ picnode_regoffset);
|
||||
+ printk(KERN_INFO "MPC52xx PIC: MPC52xx SDMA Remapped at 0x%8.8x\n",
|
||||
+ sdmanode_regoffset);
|
||||
+
|
||||
+ /* Disable all interrupt sources. */
|
||||
+ out_be32(&sdma->IntPend, 0xffffffff); /* 1 means clear pending */
|
||||
+ out_be32(&sdma->IntMask, 0xffffffff); /* 1 means disabled */
|
||||
+ out_be32(&intr->per_mask, 0x7ffffc00); /* 1 means disabled */
|
||||
+ out_be32(&intr->main_mask, 0x00010fff); /* 1 means disabled */
|
||||
+ intr_ctrl = in_be32(&intr->ctrl);
|
||||
+ intr_ctrl &= 0x00ff0000; /* Keeps IRQ[0-3] config */
|
||||
+ intr_ctrl |= 0x0f000000 | /* clear IRQ 0-3 */
|
||||
+ 0x00001000 | /* MEE master external enable */
|
||||
+ 0x00000000 | /* 0 means disable IRQ 0-3 */
|
||||
+ 0x00000001; /* CEb route critical normally */
|
||||
+ out_be32(&intr->ctrl, intr_ctrl);
|
||||
+
|
||||
+ /* Zero a bunch of the priority settings. */
|
||||
+ out_be32(&intr->per_pri1, 0);
|
||||
+ out_be32(&intr->per_pri2, 0);
|
||||
+ out_be32(&intr->per_pri3, 0);
|
||||
+ out_be32(&intr->main_pri1, 0);
|
||||
+ out_be32(&intr->main_pri2, 0);
|
||||
+
|
||||
+ /*
|
||||
+ * As last step, add an irq host to translate the real
|
||||
+ * hw irq information provided by the ofw to linux virq
|
||||
+ */
|
||||
+
|
||||
+ mpc52xx_irqhost =
|
||||
+ irq_alloc_host(IRQ_HOST_MAP_LINEAR, MPC52xx_IRQ_HIGHTESTHWIRQ,
|
||||
+ &mpc52xx_irqhost_ops, -1);
|
||||
+
|
||||
+ if (mpc52xx_irqhost) {
|
||||
+ mpc52xx_irqhost->host_data = picnode;
|
||||
+ printk(KERN_INFO "MPC52xx PIC is up and running!\n");
|
||||
+ } else {
|
||||
+ printk(KERN_ERR
|
||||
+ "MPC52xx PIC: Unable to allocate the IRQ host\n");
|
||||
+ }
|
||||
+
|
||||
+end:
|
||||
+ of_node_put(picnode);
|
||||
+ of_node_put(sdmanode);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * get_irq (public)
|
||||
+*/
|
||||
+unsigned int mpc52xx_get_irq(void)
|
||||
+{
|
||||
+ u32 status;
|
||||
+ int irq = NO_IRQ_IGNORE;
|
||||
+
|
||||
+ status = in_be32(&intr->enc_status);
|
||||
+ if (status & 0x00000400) { /* critical */
|
||||
+ irq = (status >> 8) & 0x3;
|
||||
+ if (irq == 2) /* high priority peripheral */
|
||||
+ goto peripheral;
|
||||
+ irq |= (MPC52xx_IRQ_L1_CRIT << MPC52xx_IRQ_L1_OFFSET) &
|
||||
+ MPC52xx_IRQ_L1_MASK;
|
||||
+ } else if (status & 0x00200000) { /* main */
|
||||
+ irq = (status >> 16) & 0x1f;
|
||||
+ if (irq == 4) /* low priority peripheral */
|
||||
+ goto peripheral;
|
||||
+ irq |= (MPC52xx_IRQ_L1_MAIN << MPC52xx_IRQ_L1_OFFSET) &
|
||||
+ MPC52xx_IRQ_L1_MASK;
|
||||
+ } else if (status & 0x20000000) { /* peripheral */
|
||||
+ peripheral:
|
||||
+ irq = (status >> 24) & 0x1f;
|
||||
+ if (irq == 0) { /* bestcomm */
|
||||
+ status = in_be32(&sdma->IntPend);
|
||||
+ irq = ffs(status) - 1;
|
||||
+ irq |= (MPC52xx_IRQ_L1_SDMA << MPC52xx_IRQ_L1_OFFSET) &
|
||||
+ MPC52xx_IRQ_L1_MASK;
|
||||
+ } else
|
||||
+ irq |= (MPC52xx_IRQ_L1_PERP << MPC52xx_IRQ_L1_OFFSET) &
|
||||
+ MPC52xx_IRQ_L1_MASK;
|
||||
+ }
|
||||
+
|
||||
+ pr_debug("%s: irq=%x. virq=%d\n", __func__, irq,
|
||||
+ irq_linear_revmap(mpc52xx_irqhost, irq));
|
||||
+
|
||||
+ return irq_linear_revmap(mpc52xx_irqhost, irq);
|
||||
+}
|
||||
+
|
||||
--
|
||||
1.4.3.2
|
||||
|
1834
debian/patches/features/powerpc/efika/0007-Add-MPC5200-ethernet-driver.diff
vendored
Normal file
1834
debian/patches/features/powerpc/efika/0007-Add-MPC5200-ethernet-driver.diff
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3973
debian/patches/features/powerpc/efika/0008-Add-MPC5200-SDMA-PIO-driver.diff
vendored
Normal file
3973
debian/patches/features/powerpc/efika/0008-Add-MPC5200-SDMA-PIO-driver.diff
vendored
Normal file
File diff suppressed because it is too large
Load Diff
108
debian/patches/features/powerpc/efika/0009-Added-RTAS-support-for-32bit-PowerPC.diff
vendored
Normal file
108
debian/patches/features/powerpc/efika/0009-Added-RTAS-support-for-32bit-PowerPC.diff
vendored
Normal file
|
@ -0,0 +1,108 @@
|
|||
From 6d3cbf9a4549928be8ed15cf6a3576c217723895 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:22:22 +0100
|
||||
Subject: [PATCH] Added RTAS support for 32bit PowerPC
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
arch/powerpc/kernel/proc_ppc64.c | 9 ---------
|
||||
arch/powerpc/kernel/rtas-proc.c | 36 ++++++++++++++++++++++++++----------
|
||||
2 files changed, 26 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/kernel/proc_ppc64.c b/arch/powerpc/kernel/proc_ppc64.c
|
||||
index f598cb5..9b9c32d 100644
|
||||
--- a/arch/powerpc/kernel/proc_ppc64.c
|
||||
+++ b/arch/powerpc/kernel/proc_ppc64.c
|
||||
@@ -51,15 +51,6 @@ static int __init proc_ppc64_create(void
|
||||
if (!root)
|
||||
return 1;
|
||||
|
||||
- if (!of_find_node_by_path("/rtas"))
|
||||
- return 0;
|
||||
-
|
||||
- if (!proc_mkdir("rtas", root))
|
||||
- return 1;
|
||||
-
|
||||
- if (!proc_symlink("rtas", NULL, "ppc64/rtas"))
|
||||
- return 1;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
core_initcall(proc_ppc64_create);
|
||||
diff --git a/arch/powerpc/kernel/rtas-proc.c b/arch/powerpc/kernel/rtas-proc.c
|
||||
index 2fe82ab..4c06c32 100644
|
||||
--- a/arch/powerpc/kernel/rtas-proc.c
|
||||
+++ b/arch/powerpc/kernel/rtas-proc.c
|
||||
@@ -253,43 +253,59 @@ static void get_location_code(struct seq
|
||||
static void check_location_string(struct seq_file *m, const char *c);
|
||||
static void check_location(struct seq_file *m, const char *c);
|
||||
|
||||
+static int __init proc_rtas_create(void)
|
||||
+{
|
||||
+ struct proc_dir_entry *root;
|
||||
+
|
||||
+ root = proc_mkdir("rtas" , NULL);
|
||||
+ if (!root)
|
||||
+ return -1;
|
||||
+
|
||||
+#ifdef CONFIG_PPC64
|
||||
+ if (!proc_symlink("rtas", NULL, "ppc64/rtas"))
|
||||
+ return -1;
|
||||
+#endif
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int __init proc_rtas_init(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
- if (!machine_is(pseries))
|
||||
- return -ENODEV;
|
||||
-
|
||||
rtas_node = of_find_node_by_name(NULL, "rtas");
|
||||
if (rtas_node == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/progress", S_IRUGO|S_IWUSR, NULL);
|
||||
+ if (proc_rtas_create() != 0)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ entry = create_proc_entry("rtas/progress", S_IRUGO|S_IWUSR, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_progress_operations;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/clock", S_IRUGO|S_IWUSR, NULL);
|
||||
+ entry = create_proc_entry("rtas/clock", S_IRUGO|S_IWUSR, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_clock_operations;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/poweron", S_IWUSR|S_IRUGO, NULL);
|
||||
+ entry = create_proc_entry("rtas/poweron", S_IWUSR|S_IRUGO, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_poweron_operations;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/sensors", S_IRUGO, NULL);
|
||||
+ entry = create_proc_entry("rtas/sensors", S_IRUGO, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_sensors_operations;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/frequency", S_IWUSR|S_IRUGO,
|
||||
+ entry = create_proc_entry("rtas/frequency", S_IWUSR|S_IRUGO,
|
||||
NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_tone_freq_operations;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/volume", S_IWUSR|S_IRUGO, NULL);
|
||||
+ entry = create_proc_entry("rtas/volume", S_IWUSR|S_IRUGO, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_tone_volume_operations;
|
||||
|
||||
- entry = create_proc_entry("ppc64/rtas/rmo_buffer", S_IRUSR, NULL);
|
||||
+ entry = create_proc_entry("rtas/rmo_buffer", S_IRUSR, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ppc_rtas_rmo_buf_ops;
|
||||
|
||||
--
|
||||
1.4.3.2
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,38 @@
|
|||
From 473274f1f615316cf5828caa47704f4d2f9ad1be Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:34:18 +0100
|
||||
Subject: [PATCH] Filter out efika
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
arch/powerpc/platforms/chrp/setup.c | 9 +++++++++
|
||||
1 files changed, 9 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c
|
||||
index 49b8dab..1337da8 100644
|
||||
--- a/arch/powerpc/platforms/chrp/setup.c
|
||||
+++ b/arch/powerpc/platforms/chrp/setup.c
|
||||
@@ -580,11 +580,20 @@ static int __init chrp_probe(void)
|
||||
{
|
||||
char *dtype = of_get_flat_dt_prop(of_get_flat_dt_root(),
|
||||
"device_type", NULL);
|
||||
+
|
||||
+ char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
|
||||
+ "model", NULL);
|
||||
if (dtype == NULL)
|
||||
return 0;
|
||||
if (strcmp(dtype, "chrp"))
|
||||
return 0;
|
||||
|
||||
+ /*
|
||||
+ * Filter out efika because it has its own platform
|
||||
+ */
|
||||
+ if (model && (strcmp(model, "EFIKA5K2") == 0) )
|
||||
+ return 0;
|
||||
+
|
||||
ISA_DMA_THRESHOLD = ~0L;
|
||||
DMA_MODE_READ = 0x44;
|
||||
DMA_MODE_WRITE = 0x48;
|
||||
--
|
||||
1.4.3.2
|
||||
|
|
@ -0,0 +1,900 @@
|
|||
From 2842fd40de284f328016997ba40d7b83823510c5 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas DET <nd@bplan-gmbh.de>
|
||||
Date: Fri, 24 Nov 2006 13:49:57 +0100
|
||||
Subject: [PATCH] Backport of_platform
|
||||
|
||||
Signed-off-by: Nicolas DET <nd@bplan-gmbh.de>
|
||||
---
|
||||
arch/powerpc/kernel/Makefile | 2 +-
|
||||
arch/powerpc/kernel/of_device.c | 172 +++------------
|
||||
arch/powerpc/kernel/of_platform.c | 374 +++++++++++++++++++++++++++++++
|
||||
arch/powerpc/platforms/powermac/setup.c | 1 +
|
||||
drivers/macintosh/smu.c | 3 +-
|
||||
drivers/macintosh/therm_adt746x.c | 2 +-
|
||||
drivers/macintosh/therm_pm72.c | 5 +-
|
||||
drivers/macintosh/therm_windtunnel.c | 7 +-
|
||||
drivers/video/platinumfb.c | 5 +-
|
||||
include/asm-powerpc/of_device.h | 34 +---
|
||||
include/asm-powerpc/of_platform.h | 60 +++++
|
||||
11 files changed, 478 insertions(+), 187 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
|
||||
index 7af23c4..6d9476f 100644
|
||||
--- a/arch/powerpc/kernel/Makefile
|
||||
+++ b/arch/powerpc/kernel/Makefile
|
||||
@@ -21,7 +21,7 @@ obj-$(CONFIG_PPC64) += setup_64.o binfm
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
|
||||
obj-$(CONFIG_PPC_970_NAP) += idle_power4.o
|
||||
-obj-$(CONFIG_PPC_OF) += of_device.o prom_parse.o
|
||||
+obj-$(CONFIG_PPC_OF) += of_device.o of_platform.o prom_parse.o
|
||||
procfs-$(CONFIG_PPC64) := proc_ppc64.o
|
||||
obj-$(CONFIG_PROC_FS) += $(procfs-y)
|
||||
rtaspci-$(CONFIG_PPC64) := rtas_pci.o
|
||||
diff --git a/arch/powerpc/kernel/of_device.c b/arch/powerpc/kernel/of_device.c
|
||||
index 397c83e..5c65398 100644
|
||||
--- a/arch/powerpc/kernel/of_device.c
|
||||
+++ b/arch/powerpc/kernel/of_device.c
|
||||
@@ -9,30 +9,26 @@ #include <asm/errno.h>
|
||||
#include <asm/of_device.h>
|
||||
|
||||
/**
|
||||
- * of_match_device - Tell if an of_device structure has a matching
|
||||
- * of_match structure
|
||||
+ * of_match_node - Tell if an device_node has a matching of_match structure
|
||||
* @ids: array of of device match structures to search in
|
||||
- * @dev: the of device structure to match against
|
||||
+ * @node: the of device structure to match against
|
||||
*
|
||||
- * Used by a driver to check whether an of_device present in the
|
||||
- * system is in its list of supported devices.
|
||||
+ * Low level utility function used by device matching.
|
||||
*/
|
||||
-const struct of_device_id *of_match_device(const struct of_device_id *matches,
|
||||
- const struct of_device *dev)
|
||||
+const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
||||
+ const struct device_node *node)
|
||||
{
|
||||
- if (!dev->node)
|
||||
- return NULL;
|
||||
while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
|
||||
int match = 1;
|
||||
if (matches->name[0])
|
||||
- match &= dev->node->name
|
||||
- && !strcmp(matches->name, dev->node->name);
|
||||
+ match &= node->name
|
||||
+ && !strcmp(matches->name, node->name);
|
||||
if (matches->type[0])
|
||||
- match &= dev->node->type
|
||||
- && !strcmp(matches->type, dev->node->type);
|
||||
+ match &= node->type
|
||||
+ && !strcmp(matches->type, node->type);
|
||||
if (matches->compatible[0])
|
||||
- match &= device_is_compatible(dev->node,
|
||||
- matches->compatible);
|
||||
+ match &= device_is_compatible(node,
|
||||
+ matches->compatible);
|
||||
if (match)
|
||||
return matches;
|
||||
matches++;
|
||||
@@ -40,16 +36,21 @@ const struct of_device_id *of_match_devi
|
||||
return NULL;
|
||||
}
|
||||
|
||||
-static int of_platform_bus_match(struct device *dev, struct device_driver *drv)
|
||||
+/**
|
||||
+ * of_match_device - Tell if an of_device structure has a matching
|
||||
+ * of_match structure
|
||||
+ * @ids: array of of device match structures to search in
|
||||
+ * @dev: the of device structure to match against
|
||||
+ *
|
||||
+ * Used by a driver to check whether an of_device present in the
|
||||
+ * system is in its list of supported devices.
|
||||
+ */
|
||||
+const struct of_device_id *of_match_device(const struct of_device_id *matches,
|
||||
+ const struct of_device *dev)
|
||||
{
|
||||
- struct of_device * of_dev = to_of_device(dev);
|
||||
- struct of_platform_driver * of_drv = to_of_platform_driver(drv);
|
||||
- const struct of_device_id * matches = of_drv->match_table;
|
||||
-
|
||||
- if (!matches)
|
||||
- return 0;
|
||||
-
|
||||
- return of_match_device(matches, of_dev) != NULL;
|
||||
+ if (!dev->node)
|
||||
+ return NULL;
|
||||
+ return of_match_node(matches, dev->node);
|
||||
}
|
||||
|
||||
struct of_device *of_dev_get(struct of_device *dev)
|
||||
@@ -71,96 +72,8 @@ void of_dev_put(struct of_device *dev)
|
||||
put_device(&dev->dev);
|
||||
}
|
||||
|
||||
-
|
||||
-static int of_device_probe(struct device *dev)
|
||||
-{
|
||||
- int error = -ENODEV;
|
||||
- struct of_platform_driver *drv;
|
||||
- struct of_device *of_dev;
|
||||
- const struct of_device_id *match;
|
||||
-
|
||||
- drv = to_of_platform_driver(dev->driver);
|
||||
- of_dev = to_of_device(dev);
|
||||
-
|
||||
- if (!drv->probe)
|
||||
- return error;
|
||||
-
|
||||
- of_dev_get(of_dev);
|
||||
-
|
||||
- match = of_match_device(drv->match_table, of_dev);
|
||||
- if (match)
|
||||
- error = drv->probe(of_dev, match);
|
||||
- if (error)
|
||||
- of_dev_put(of_dev);
|
||||
-
|
||||
- return error;
|
||||
-}
|
||||
-
|
||||
-static int of_device_remove(struct device *dev)
|
||||
-{
|
||||
- struct of_device * of_dev = to_of_device(dev);
|
||||
- struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
|
||||
-
|
||||
- if (dev->driver && drv->remove)
|
||||
- drv->remove(of_dev);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int of_device_suspend(struct device *dev, pm_message_t state)
|
||||
-{
|
||||
- struct of_device * of_dev = to_of_device(dev);
|
||||
- struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
|
||||
- int error = 0;
|
||||
-
|
||||
- if (dev->driver && drv->suspend)
|
||||
- error = drv->suspend(of_dev, state);
|
||||
- return error;
|
||||
-}
|
||||
-
|
||||
-static int of_device_resume(struct device * dev)
|
||||
-{
|
||||
- struct of_device * of_dev = to_of_device(dev);
|
||||
- struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
|
||||
- int error = 0;
|
||||
-
|
||||
- if (dev->driver && drv->resume)
|
||||
- error = drv->resume(of_dev);
|
||||
- return error;
|
||||
-}
|
||||
-
|
||||
-struct bus_type of_platform_bus_type = {
|
||||
- .name = "of_platform",
|
||||
- .match = of_platform_bus_match,
|
||||
- .probe = of_device_probe,
|
||||
- .remove = of_device_remove,
|
||||
- .suspend = of_device_suspend,
|
||||
- .resume = of_device_resume,
|
||||
-};
|
||||
-
|
||||
-static int __init of_bus_driver_init(void)
|
||||
-{
|
||||
- return bus_register(&of_platform_bus_type);
|
||||
-}
|
||||
-
|
||||
-postcore_initcall(of_bus_driver_init);
|
||||
-
|
||||
-int of_register_driver(struct of_platform_driver *drv)
|
||||
-{
|
||||
- /* initialize common driver fields */
|
||||
- drv->driver.name = drv->name;
|
||||
- drv->driver.bus = &of_platform_bus_type;
|
||||
-
|
||||
- /* register with core */
|
||||
- return driver_register(&drv->driver);
|
||||
-}
|
||||
-
|
||||
-void of_unregister_driver(struct of_platform_driver *drv)
|
||||
-{
|
||||
- driver_unregister(&drv->driver);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static ssize_t dev_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
+static ssize_t dev_show_devspec(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct of_device *ofdev;
|
||||
|
||||
@@ -208,41 +121,10 @@ void of_device_unregister(struct of_devi
|
||||
device_unregister(&ofdev->dev);
|
||||
}
|
||||
|
||||
-struct of_device* of_platform_device_create(struct device_node *np,
|
||||
- const char *bus_id,
|
||||
- struct device *parent)
|
||||
-{
|
||||
- struct of_device *dev;
|
||||
-
|
||||
- dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
- if (!dev)
|
||||
- return NULL;
|
||||
- memset(dev, 0, sizeof(*dev));
|
||||
-
|
||||
- dev->node = of_node_get(np);
|
||||
- dev->dma_mask = 0xffffffffUL;
|
||||
- dev->dev.dma_mask = &dev->dma_mask;
|
||||
- dev->dev.parent = parent;
|
||||
- dev->dev.bus = &of_platform_bus_type;
|
||||
- dev->dev.release = of_release_dev;
|
||||
-
|
||||
- strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE);
|
||||
-
|
||||
- if (of_device_register(dev) != 0) {
|
||||
- kfree(dev);
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- return dev;
|
||||
-}
|
||||
|
||||
EXPORT_SYMBOL(of_match_device);
|
||||
-EXPORT_SYMBOL(of_platform_bus_type);
|
||||
-EXPORT_SYMBOL(of_register_driver);
|
||||
-EXPORT_SYMBOL(of_unregister_driver);
|
||||
EXPORT_SYMBOL(of_device_register);
|
||||
EXPORT_SYMBOL(of_device_unregister);
|
||||
EXPORT_SYMBOL(of_dev_get);
|
||||
EXPORT_SYMBOL(of_dev_put);
|
||||
-EXPORT_SYMBOL(of_platform_device_create);
|
||||
EXPORT_SYMBOL(of_release_dev);
|
||||
diff --git a/arch/powerpc/kernel/of_platform.c b/arch/powerpc/kernel/of_platform.c
|
||||
new file mode 100644
|
||||
index 0000000..41c71bc
|
||||
--- /dev/null
|
||||
+++ b/arch/powerpc/kernel/of_platform.c
|
||||
@@ -0,0 +1,374 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
|
||||
+ * <benh@kernel.crashing.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * as published by the Free Software Foundation; either version
|
||||
+ * 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#undef DEBUG
|
||||
+
|
||||
+#include <linux/string.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+#include <asm/errno.h>
|
||||
+#ifdef CONFIG_PPC_DCR
|
||||
+#include <asm/dcr.h>
|
||||
+#endif
|
||||
+#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * The list of OF IDs below is used for matching bus types in the
|
||||
+ * system whose devices are to be exposed as of_platform_devices.
|
||||
+ *
|
||||
+ * This is the default list valid for most platforms. This file provides
|
||||
+ * functions who can take an explicit list if necessary though
|
||||
+ *
|
||||
+ * The search is always performed recursively looking for children of
|
||||
+ * the provided device_node and recursively if such a children matches
|
||||
+ * a bus type in the list
|
||||
+ */
|
||||
+
|
||||
+static struct of_device_id of_default_bus_ids[] = {
|
||||
+ { .type = "soc", },
|
||||
+ { .compatible = "soc", },
|
||||
+ { .type = "spider", },
|
||||
+ { .type = "axon", },
|
||||
+ { .type = "plb5", },
|
||||
+ { .type = "plb4", },
|
||||
+ { .type = "opb", },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ *
|
||||
+ * OF platform device type definition & base infrastructure
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+static int of_platform_bus_match(struct device *dev, struct device_driver *drv)
|
||||
+{
|
||||
+ struct of_device * of_dev = to_of_device(dev);
|
||||
+ struct of_platform_driver * of_drv = to_of_platform_driver(drv);
|
||||
+ const struct of_device_id * matches = of_drv->match_table;
|
||||
+
|
||||
+ if (!matches)
|
||||
+ return 0;
|
||||
+
|
||||
+ return of_match_device(matches, of_dev) != NULL;
|
||||
+}
|
||||
+
|
||||
+static int of_platform_device_probe(struct device *dev)
|
||||
+{
|
||||
+ int error = -ENODEV;
|
||||
+ struct of_platform_driver *drv;
|
||||
+ struct of_device *of_dev;
|
||||
+ const struct of_device_id *match;
|
||||
+
|
||||
+ drv = to_of_platform_driver(dev->driver);
|
||||
+ of_dev = to_of_device(dev);
|
||||
+
|
||||
+ if (!drv->probe)
|
||||
+ return error;
|
||||
+
|
||||
+ of_dev_get(of_dev);
|
||||
+
|
||||
+ match = of_match_device(drv->match_table, of_dev);
|
||||
+ if (match)
|
||||
+ error = drv->probe(of_dev, match);
|
||||
+ if (error)
|
||||
+ of_dev_put(of_dev);
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static int of_platform_device_remove(struct device *dev)
|
||||
+{
|
||||
+ struct of_device * of_dev = to_of_device(dev);
|
||||
+ struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
|
||||
+
|
||||
+ if (dev->driver && drv->remove)
|
||||
+ drv->remove(of_dev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int of_platform_device_suspend(struct device *dev, pm_message_t state)
|
||||
+{
|
||||
+ struct of_device * of_dev = to_of_device(dev);
|
||||
+ struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
|
||||
+ int error = 0;
|
||||
+
|
||||
+ if (dev->driver && drv->suspend)
|
||||
+ error = drv->suspend(of_dev, state);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static int of_platform_device_resume(struct device * dev)
|
||||
+{
|
||||
+ struct of_device * of_dev = to_of_device(dev);
|
||||
+ struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
|
||||
+ int error = 0;
|
||||
+
|
||||
+ if (dev->driver && drv->resume)
|
||||
+ error = drv->resume(of_dev);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+struct bus_type of_platform_bus_type = {
|
||||
+ .name = "of_platform",
|
||||
+ .match = of_platform_bus_match,
|
||||
+ .probe = of_platform_device_probe,
|
||||
+ .remove = of_platform_device_remove,
|
||||
+ .suspend = of_platform_device_suspend,
|
||||
+ .resume = of_platform_device_resume,
|
||||
+};
|
||||
+EXPORT_SYMBOL(of_platform_bus_type);
|
||||
+
|
||||
+static int __init of_bus_driver_init(void)
|
||||
+{
|
||||
+ return bus_register(&of_platform_bus_type);
|
||||
+}
|
||||
+
|
||||
+postcore_initcall(of_bus_driver_init);
|
||||
+
|
||||
+int of_register_platform_driver(struct of_platform_driver *drv)
|
||||
+{
|
||||
+ /* initialize common driver fields */
|
||||
+ drv->driver.name = drv->name;
|
||||
+ drv->driver.bus = &of_platform_bus_type;
|
||||
+
|
||||
+ /* register with core */
|
||||
+ return driver_register(&drv->driver);
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_register_platform_driver);
|
||||
+
|
||||
+void of_unregister_platform_driver(struct of_platform_driver *drv)
|
||||
+{
|
||||
+ driver_unregister(&drv->driver);
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_unregister_platform_driver);
|
||||
+
|
||||
+static void of_platform_make_bus_id(struct of_device *dev)
|
||||
+{
|
||||
+ struct device_node *node = dev->node;
|
||||
+ char *name = dev->dev.bus_id;
|
||||
+ const u32 *reg;
|
||||
+ u64 addr;
|
||||
+
|
||||
+ /*
|
||||
+ * If it's a DCR based device, use 'd' for native DCRs
|
||||
+ * and 'D' for MMIO DCRs.
|
||||
+ */
|
||||
+#ifdef CONFIG_PPC_DCR
|
||||
+ reg = get_property(node, "dcr-reg", NULL);
|
||||
+ if (reg) {
|
||||
+#ifdef CONFIG_PPC_DCR_NATIVE
|
||||
+ snprintf(name, BUS_ID_SIZE, "d%x.%s",
|
||||
+ *reg, node->name);
|
||||
+#else /* CONFIG_PPC_DCR_NATIVE */
|
||||
+ addr = of_translate_dcr_address(node, *reg, NULL);
|
||||
+ if (addr != OF_BAD_ADDR) {
|
||||
+ snprintf(name, BUS_ID_SIZE,
|
||||
+ "D%llx.%s", (unsigned long long)addr,
|
||||
+ node->name);
|
||||
+ return;
|
||||
+ }
|
||||
+#endif /* !CONFIG_PPC_DCR_NATIVE */
|
||||
+ }
|
||||
+#endif /* CONFIG_PPC_DCR */
|
||||
+
|
||||
+ /*
|
||||
+ * For MMIO, get the physical address
|
||||
+ */
|
||||
+ reg = get_property(node, "reg", NULL);
|
||||
+ if (reg) {
|
||||
+ addr = of_translate_address(node, reg);
|
||||
+ if (addr != OF_BAD_ADDR) {
|
||||
+ snprintf(name, BUS_ID_SIZE,
|
||||
+ "%llx.%s", (unsigned long long)addr,
|
||||
+ node->name);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * No BusID, use the node name and pray
|
||||
+ */
|
||||
+ snprintf(name, BUS_ID_SIZE, "%s", node->name);
|
||||
+}
|
||||
+
|
||||
+struct of_device* of_platform_device_create(struct device_node *np,
|
||||
+ const char *bus_id,
|
||||
+ struct device *parent)
|
||||
+{
|
||||
+ struct of_device *dev;
|
||||
+
|
||||
+ dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
+ if (!dev)
|
||||
+ return NULL;
|
||||
+ memset(dev, 0, sizeof(*dev));
|
||||
+
|
||||
+ dev->node = of_node_get(np);
|
||||
+ dev->dma_mask = 0xffffffffUL;
|
||||
+ dev->dev.dma_mask = &dev->dma_mask;
|
||||
+ dev->dev.parent = parent;
|
||||
+ dev->dev.bus = &of_platform_bus_type;
|
||||
+ dev->dev.release = of_release_dev;
|
||||
+
|
||||
+ if (bus_id)
|
||||
+ strlcpy(dev->dev.bus_id, bus_id, BUS_ID_SIZE);
|
||||
+ else
|
||||
+ of_platform_make_bus_id(dev);
|
||||
+
|
||||
+ if (of_device_register(dev) != 0) {
|
||||
+ kfree(dev);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return dev;
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_platform_device_create);
|
||||
+
|
||||
+
|
||||
+
|
||||
+/**
|
||||
+ * of_platform_bus_create - Create an OF device for a bus node and all its
|
||||
+ * children. Optionally recursively instanciate matching busses.
|
||||
+ * @bus: device node of the bus to instanciate
|
||||
+ * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
|
||||
+ * disallow recursive creation of child busses
|
||||
+ */
|
||||
+static int of_platform_bus_create(struct device_node *bus,
|
||||
+ struct of_device_id *matches,
|
||||
+ struct device *parent)
|
||||
+{
|
||||
+ struct device_node *child;
|
||||
+ struct of_device *dev;
|
||||
+ int rc = 0;
|
||||
+
|
||||
+ for (child = NULL; (child = of_get_next_child(bus, child)); ) {
|
||||
+ pr_debug(" create child: %s\n", child->full_name);
|
||||
+ dev = of_platform_device_create(child, NULL, parent);
|
||||
+ if (dev == NULL)
|
||||
+ rc = -ENOMEM;
|
||||
+ else if (!of_match_node(matches, child))
|
||||
+ continue;
|
||||
+ if (rc == 0) {
|
||||
+ pr_debug(" and sub busses\n");
|
||||
+ rc = of_platform_bus_create(child, matches, &dev->dev);
|
||||
+ } if (rc) {
|
||||
+ of_node_put(child);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * of_platform_bus_probe - Probe the device-tree for platform busses
|
||||
+ * @root: parent of the first level to probe or NULL for the root of the tree
|
||||
+ * @matches: match table, NULL to use the default
|
||||
+ * @parent: parent to hook devices from, NULL for toplevel
|
||||
+ *
|
||||
+ * Note that children of the provided root are not instanciated as devices
|
||||
+ * unless the specified root itself matches the bus list and is not NULL.
|
||||
+ */
|
||||
+
|
||||
+int of_platform_bus_probe(struct device_node *root,
|
||||
+ struct of_device_id *matches,
|
||||
+ struct device *parent)
|
||||
+{
|
||||
+ struct device_node *child;
|
||||
+ struct of_device *dev;
|
||||
+ int rc = 0;
|
||||
+
|
||||
+ if (matches == NULL)
|
||||
+ matches = of_default_bus_ids;
|
||||
+ if (matches == OF_NO_DEEP_PROBE)
|
||||
+ return -EINVAL;
|
||||
+ if (root == NULL)
|
||||
+ root = of_find_node_by_path("/");
|
||||
+ else
|
||||
+ of_node_get(root);
|
||||
+
|
||||
+ pr_debug("of_platform_bus_probe()\n");
|
||||
+ pr_debug(" starting at: %s\n", root->full_name);
|
||||
+
|
||||
+ /* Do a self check of bus type, if there's a match, create
|
||||
+ * children
|
||||
+ */
|
||||
+ if (of_match_node(matches, root)) {
|
||||
+ pr_debug(" root match, create all sub devices\n");
|
||||
+ dev = of_platform_device_create(root, NULL, parent);
|
||||
+ if (dev == NULL) {
|
||||
+ rc = -ENOMEM;
|
||||
+ goto bail;
|
||||
+ }
|
||||
+ pr_debug(" create all sub busses\n");
|
||||
+ rc = of_platform_bus_create(root, matches, &dev->dev);
|
||||
+ goto bail;
|
||||
+ }
|
||||
+ for (child = NULL; (child = of_get_next_child(root, child)); ) {
|
||||
+ if (!of_match_node(matches, child))
|
||||
+ continue;
|
||||
+
|
||||
+ pr_debug(" match: %s\n", child->full_name);
|
||||
+ dev = of_platform_device_create(child, NULL, parent);
|
||||
+ if (dev == NULL)
|
||||
+ rc = -ENOMEM;
|
||||
+ else
|
||||
+ rc = of_platform_bus_create(child, matches, &dev->dev);
|
||||
+ if (rc) {
|
||||
+ of_node_put(child);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ bail:
|
||||
+ of_node_put(root);
|
||||
+ return rc;
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_platform_bus_probe);
|
||||
+
|
||||
+static int of_dev_node_match(struct device *dev, void *data)
|
||||
+{
|
||||
+ return to_of_device(dev)->node == data;
|
||||
+}
|
||||
+
|
||||
+struct of_device *of_find_device_by_node(struct device_node *np)
|
||||
+{
|
||||
+ struct device *dev;
|
||||
+
|
||||
+ dev = bus_find_device(&of_platform_bus_type,
|
||||
+ NULL, np, of_dev_node_match);
|
||||
+ if (dev)
|
||||
+ return to_of_device(dev);
|
||||
+ return NULL;
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_find_device_by_node);
|
||||
+
|
||||
+static int of_dev_phandle_match(struct device *dev, void *data)
|
||||
+{
|
||||
+ phandle *ph = data;
|
||||
+ return to_of_device(dev)->node->linux_phandle == *ph;
|
||||
+}
|
||||
+
|
||||
+struct of_device *of_find_device_by_phandle(phandle ph)
|
||||
+{
|
||||
+ struct device *dev;
|
||||
+
|
||||
+ dev = bus_find_device(&of_platform_bus_type,
|
||||
+ NULL, &ph, of_dev_phandle_match);
|
||||
+ if (dev)
|
||||
+ return to_of_device(dev);
|
||||
+ return NULL;
|
||||
+}
|
||||
+EXPORT_SYMBOL(of_find_device_by_phandle);
|
||||
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c
|
||||
index 824a618..e25a0bd 100644
|
||||
--- a/arch/powerpc/platforms/powermac/setup.c
|
||||
+++ b/arch/powerpc/platforms/powermac/setup.c
|
||||
@@ -70,6 +70,7 @@ #include <asm/btext.h>
|
||||
#include <asm/pmac_feature.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/smu.h>
|
||||
diff --git a/drivers/macintosh/smu.c b/drivers/macintosh/smu.c
|
||||
index ade25b3..4f724cd 100644
|
||||
--- a/drivers/macintosh/smu.c
|
||||
+++ b/drivers/macintosh/smu.c
|
||||
@@ -46,6 +46,7 @@ #include <asm/sections.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
|
||||
#define VERSION "0.7"
|
||||
#define AUTHOR "(c) 2005 Benjamin Herrenschmidt, IBM Corp."
|
||||
@@ -653,7 +654,7 @@ static int __init smu_init_sysfs(void)
|
||||
* I'm a bit too far from figuring out how that works with those
|
||||
* new chipsets, but that will come back and bite us
|
||||
*/
|
||||
- of_register_driver(&smu_of_platform_driver);
|
||||
+ of_register_platform_driver(&smu_of_platform_driver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c
|
||||
index a0f30d0..13b953a 100644
|
||||
--- a/drivers/macintosh/therm_adt746x.c
|
||||
+++ b/drivers/macintosh/therm_adt746x.c
|
||||
@@ -30,7 +30,7 @@ #include <asm/machdep.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/sections.h>
|
||||
-#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c
|
||||
index d00c0c3..2e4ad44 100644
|
||||
--- a/drivers/macintosh/therm_pm72.c
|
||||
+++ b/drivers/macintosh/therm_pm72.c
|
||||
@@ -129,6 +129,7 @@ #include <asm/system.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/of_device.h>
|
||||
#include <asm/macio.h>
|
||||
+#include <asm/of_platform.h>
|
||||
|
||||
#include "therm_pm72.h"
|
||||
|
||||
@@ -2236,14 +2237,14 @@ static int __init therm_pm72_init(void)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
- of_register_driver(&fcu_of_platform_driver);
|
||||
+ of_register_platform_driver(&fcu_of_platform_driver);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit therm_pm72_exit(void)
|
||||
{
|
||||
- of_unregister_driver(&fcu_of_platform_driver);
|
||||
+ of_unregister_platform_driver(&fcu_of_platform_driver);
|
||||
|
||||
if (of_dev)
|
||||
of_device_unregister(of_dev);
|
||||
diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c
|
||||
index 738faab..a1d3a98 100644
|
||||
--- a/drivers/macintosh/therm_windtunnel.c
|
||||
+++ b/drivers/macintosh/therm_windtunnel.c
|
||||
@@ -36,12 +36,13 @@ #include <linux/sched.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
+
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/sections.h>
|
||||
-#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
#include <asm/macio.h>
|
||||
|
||||
#define LOG_TEMP 0 /* continously log temperature */
|
||||
@@ -511,14 +512,14 @@ g4fan_init( void )
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
- of_register_driver( &therm_of_driver );
|
||||
+ of_register_platform_driver( &therm_of_driver );
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
g4fan_exit( void )
|
||||
{
|
||||
- of_unregister_driver( &therm_of_driver );
|
||||
+ of_unregister_platform_driver( &therm_of_driver );
|
||||
|
||||
if( x.of_dev )
|
||||
of_device_unregister( x.of_dev );
|
||||
diff --git a/drivers/video/platinumfb.c b/drivers/video/platinumfb.c
|
||||
index fdb33cd..cb26c6d 100644
|
||||
--- a/drivers/video/platinumfb.c
|
||||
+++ b/drivers/video/platinumfb.c
|
||||
@@ -34,6 +34,7 @@ #include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/of_device.h>
|
||||
+#include <asm/of_platform.h>
|
||||
|
||||
#include "macmodes.h"
|
||||
#include "platinumfb.h"
|
||||
@@ -682,14 +683,14 @@ #ifndef MODULE
|
||||
return -ENODEV;
|
||||
platinumfb_setup(option);
|
||||
#endif
|
||||
- of_register_driver(&platinum_driver);
|
||||
+ of_register_platform_driver(&platinum_driver);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit platinumfb_exit(void)
|
||||
{
|
||||
- of_unregister_driver(&platinum_driver);
|
||||
+ of_unregister_platform_driver(&platinum_driver);
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
diff --git a/include/asm-powerpc/of_device.h b/include/asm-powerpc/of_device.h
|
||||
index c5c0b0b..1ef7e9e 100644
|
||||
--- a/include/asm-powerpc/of_device.h
|
||||
+++ b/include/asm-powerpc/of_device.h
|
||||
@@ -6,12 +6,6 @@ #include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
-/*
|
||||
- * The of_platform_bus_type is a bus type used by drivers that do not
|
||||
- * attach to a macio or similar bus but still use OF probing
|
||||
- * mechanism
|
||||
- */
|
||||
-extern struct bus_type of_platform_bus_type;
|
||||
|
||||
/*
|
||||
* The of_device is a kind of "base class" that is a superset of
|
||||
@@ -26,40 +20,16 @@ struct of_device
|
||||
};
|
||||
#define to_of_device(d) container_of(d, struct of_device, dev)
|
||||
|
||||
+extern const struct of_device_id *of_match_node(
|
||||
+ const struct of_device_id *matches, const struct device_node *node);
|
||||
extern const struct of_device_id *of_match_device(
|
||||
const struct of_device_id *matches, const struct of_device *dev);
|
||||
|
||||
extern struct of_device *of_dev_get(struct of_device *dev);
|
||||
extern void of_dev_put(struct of_device *dev);
|
||||
|
||||
-/*
|
||||
- * An of_platform_driver driver is attached to a basic of_device on
|
||||
- * the "platform bus" (of_platform_bus_type)
|
||||
- */
|
||||
-struct of_platform_driver
|
||||
-{
|
||||
- char *name;
|
||||
- struct of_device_id *match_table;
|
||||
- struct module *owner;
|
||||
-
|
||||
- int (*probe)(struct of_device* dev, const struct of_device_id *match);
|
||||
- int (*remove)(struct of_device* dev);
|
||||
-
|
||||
- int (*suspend)(struct of_device* dev, pm_message_t state);
|
||||
- int (*resume)(struct of_device* dev);
|
||||
- int (*shutdown)(struct of_device* dev);
|
||||
-
|
||||
- struct device_driver driver;
|
||||
-};
|
||||
-#define to_of_platform_driver(drv) container_of(drv,struct of_platform_driver, driver)
|
||||
-
|
||||
-extern int of_register_driver(struct of_platform_driver *drv);
|
||||
-extern void of_unregister_driver(struct of_platform_driver *drv);
|
||||
extern int of_device_register(struct of_device *ofdev);
|
||||
extern void of_device_unregister(struct of_device *ofdev);
|
||||
-extern struct of_device *of_platform_device_create(struct device_node *np,
|
||||
- const char *bus_id,
|
||||
- struct device *parent);
|
||||
extern void of_release_dev(struct device *dev);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
diff --git a/include/asm-powerpc/of_platform.h b/include/asm-powerpc/of_platform.h
|
||||
new file mode 100644
|
||||
index 0000000..217eafb
|
||||
--- /dev/null
|
||||
+++ b/include/asm-powerpc/of_platform.h
|
||||
@@ -0,0 +1,60 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
|
||||
+ * <benh@kernel.crashing.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License
|
||||
+ * as published by the Free Software Foundation; either version
|
||||
+ * 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <asm/of_device.h>
|
||||
+
|
||||
+/*
|
||||
+ * The of_platform_bus_type is a bus type used by drivers that do not
|
||||
+ * attach to a macio or similar bus but still use OF probing
|
||||
+ * mechanism
|
||||
+ */
|
||||
+extern struct bus_type of_platform_bus_type;
|
||||
+
|
||||
+/*
|
||||
+ * An of_platform_driver driver is attached to a basic of_device on
|
||||
+ * the "platform bus" (of_platform_bus_type)
|
||||
+ */
|
||||
+struct of_platform_driver
|
||||
+{
|
||||
+ char *name;
|
||||
+ struct of_device_id *match_table;
|
||||
+ struct module *owner;
|
||||
+
|
||||
+ int (*probe)(struct of_device* dev,
|
||||
+ const struct of_device_id *match);
|
||||
+ int (*remove)(struct of_device* dev);
|
||||
+
|
||||
+ int (*suspend)(struct of_device* dev, pm_message_t state);
|
||||
+ int (*resume)(struct of_device* dev);
|
||||
+ int (*shutdown)(struct of_device* dev);
|
||||
+
|
||||
+ struct device_driver driver;
|
||||
+};
|
||||
+#define to_of_platform_driver(drv) \
|
||||
+ container_of(drv,struct of_platform_driver, driver)
|
||||
+
|
||||
+/* Platform drivers register/unregister */
|
||||
+extern int of_register_platform_driver(struct of_platform_driver *drv);
|
||||
+extern void of_unregister_platform_driver(struct of_platform_driver *drv);
|
||||
+
|
||||
+/* Platform devices and busses creation */
|
||||
+extern struct of_device *of_platform_device_create(struct device_node *np,
|
||||
+ const char *bus_id,
|
||||
+ struct device *parent);
|
||||
+/* pseudo "matches" value to not do deep probe */
|
||||
+#define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
|
||||
+
|
||||
+extern int of_platform_bus_probe(struct device_node *root,
|
||||
+ struct of_device_id *matches,
|
||||
+ struct device *parent);
|
||||
+
|
||||
+extern struct of_device *of_find_device_by_node(struct device_node *np);
|
||||
+extern struct of_device *of_find_device_by_phandle(phandle ph);
|
||||
--
|
||||
1.4.3.2
|
||||
|
|
@ -3,9 +3,26 @@
|
|||
+ debian/doc-build-parallel.patch
|
||||
+ debian/scripts-kconfig-reportoldconfig.patch
|
||||
+ debian/powerpc-mkvmlinuz-support-ppc.patch
|
||||
#+ debian/powerpc-mkvmlinuz-support-powerpc.patch
|
||||
+ debian/powerpc-mkvmlinuz-support-powerpc.patch
|
||||
+ bugfix/powerpc/build-links.patch
|
||||
+ bugfix/powerpc/mv643xx-hotplug-support.patch
|
||||
+ bugfix/powerpc/oldworld-boot-fix.patch
|
||||
+ bugfix/powerpc/prep-utah-ide-interrupt.patch
|
||||
+ bugfix/powerpc/serial.patch
|
||||
+ features/powerpc/efika/0001-Fix-compilation-issue-when-PPC_MPC52xx-and-PPC_MERGE-are-selected.diff
|
||||
+ features/powerpc/efika/0002-Add-USB-OHCI-glue-for-OpenFirmware-devices.diff
|
||||
+ features/powerpc/efika/0003-Add-MPC5200-serial-driver.diff
|
||||
+ features/powerpc/efika/0004-Add-MPC5200-CPU-PIO-driver-using-libata.diff
|
||||
+ features/powerpc/efika/0005-Add-MPC5200-specific-header.diff
|
||||
+ features/powerpc/efika/0006-Add-MPC5200-interrupt-controller-driver.diff
|
||||
+ features/powerpc/efika/0007-Add-MPC5200-ethernet-driver.diff
|
||||
+ features/powerpc/efika/0008-Add-MPC5200-SDMA-PIO-driver.diff
|
||||
+ features/powerpc/efika/0009-Added-RTAS-support-for-32bit-PowerPC.diff
|
||||
+ features/powerpc/efika/0010-Add-Efika-platform.diff
|
||||
+ features/powerpc/efika/0011-Filter-out-efika.diff
|
||||
+ features/powerpc/efika/0012-Backport-of_platform.diff
|
||||
+ features/all/fs-asfs.patch
|
||||
|
||||
#+ features/all/fs-asfs.patch
|
||||
+ bugfix/arm/nslu2-disk-leds.patch
|
||||
+ features/arm/nslu2-setup-mac.patch
|
||||
+ features/arm/nslu2-eth-mac.patch
|
||||
|
|
Loading…
Reference in New Issue