Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k: m68k: amiga - Floppy platform device conversion m68k: amiga - Sound platform device conversion m68k: amiga - Frame buffer platform device conversion m68k: amiga - Zorro host bridge platform device conversion m68k: amiga - Zorro bus modalias support platform: Make platform resource input parameters const m68k: invoke oom-killer from page fault serial167: Kill unused variables m68k: Implement generic_find_next_{zero_,}le_bit() m68k: hp300 - Checkpatch cleanup m68k: Remove trailing spaces in messages m68k: Simplify param.h by using <asm-generic/param.h> m68k: Remove BKL from rtc implementations
This commit is contained in:
commit
ba2e1c5f25
@ -2,6 +2,6 @@
|
||||
# Makefile for Linux arch/m68k/amiga source directory
|
||||
#
|
||||
|
||||
obj-y := config.o amiints.o cia.o chipram.o amisound.o
|
||||
obj-y := config.o amiints.o cia.o chipram.o amisound.o platform.o
|
||||
|
||||
obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o
|
||||
|
83
arch/m68k/amiga/platform.c
Normal file
83
arch/m68k/amiga/platform.c
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2007-2009 Geert Uytterhoeven
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/zorro.h>
|
||||
|
||||
#include <asm/amigahw.h>
|
||||
|
||||
|
||||
#ifdef CONFIG_ZORRO
|
||||
|
||||
static const struct resource zorro_resources[] __initconst = {
|
||||
/* Zorro II regions (on Zorro II/III) */
|
||||
{
|
||||
.name = "Zorro II exp",
|
||||
.start = 0x00e80000,
|
||||
.end = 0x00efffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "Zorro II mem",
|
||||
.start = 0x00200000,
|
||||
.end = 0x009fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
/* Zorro III regions (on Zorro III only) */
|
||||
{
|
||||
.name = "Zorro III exp",
|
||||
.start = 0xff000000,
|
||||
.end = 0xffffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "Zorro III cfg",
|
||||
.start = 0x40000000,
|
||||
.end = 0x7fffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static int __init amiga_init_bus(void)
|
||||
{
|
||||
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
|
||||
return -ENODEV;
|
||||
|
||||
platform_device_register_simple("amiga-zorro", -1, zorro_resources,
|
||||
AMIGAHW_PRESENT(ZORRO3) ? 4 : 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(amiga_init_bus);
|
||||
|
||||
#endif /* CONFIG_ZORRO */
|
||||
|
||||
|
||||
static int __init amiga_init_devices(void)
|
||||
{
|
||||
if (!MACH_IS_AMIGA)
|
||||
return -ENODEV;
|
||||
|
||||
/* video hardware */
|
||||
if (AMIGAHW_PRESENT(AMI_VIDEO))
|
||||
platform_device_register_simple("amiga-video", -1, NULL, 0);
|
||||
|
||||
|
||||
/* sound hardware */
|
||||
if (AMIGAHW_PRESENT(AMI_AUDIO))
|
||||
platform_device_register_simple("amiga-audio", -1, NULL, 0);
|
||||
|
||||
|
||||
/* storage interfaces */
|
||||
if (AMIGAHW_PRESENT(AMI_FLOPPY))
|
||||
platform_device_register_simple("amiga-floppy", -1, NULL, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(amiga_init_devices);
|
@ -9,7 +9,6 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/fcntl.h>
|
||||
@ -35,10 +34,9 @@
|
||||
static unsigned char days_in_mo[] =
|
||||
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
|
||||
static char rtc_status;
|
||||
static atomic_t rtc_status = ATOMIC_INIT(1);
|
||||
|
||||
static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
|
||||
unsigned char msr;
|
||||
@ -132,29 +130,20 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
}
|
||||
|
||||
/*
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
* Also clear the previous interrupt data on an open, and clean
|
||||
* up things on a close.
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
*/
|
||||
|
||||
static int rtc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
if(rtc_status) {
|
||||
unlock_kernel();
|
||||
if (!atomic_dec_and_test(&rtc_status)) {
|
||||
atomic_inc(&rtc_status);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
rtc_status = 1;
|
||||
unlock_kernel();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtc_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
rtc_status = 0;
|
||||
unlock_kernel();
|
||||
atomic_inc(&rtc_status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -163,9 +152,9 @@ static int rtc_release(struct inode *inode, struct file *file)
|
||||
*/
|
||||
|
||||
static const struct file_operations rtc_fops = {
|
||||
.ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
.unlocked_ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
};
|
||||
|
||||
static struct miscdevice rtc_dev = {
|
||||
|
@ -1,4 +1,2 @@
|
||||
extern void hp300_sched_init(irq_handler_t vector);
|
||||
extern unsigned long hp300_gettimeoffset (void);
|
||||
|
||||
|
||||
extern unsigned long hp300_gettimeoffset(void);
|
||||
|
@ -365,6 +365,10 @@ static inline int minix_test_bit(int nr, const void *vaddr)
|
||||
#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
|
||||
#define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
|
||||
#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
|
||||
#define ext2_find_next_zero_bit(addr, size, offset) \
|
||||
generic_find_next_zero_le_bit((unsigned long *)addr, size, offset)
|
||||
#define ext2_find_next_bit(addr, size, offset) \
|
||||
generic_find_next_le_bit((unsigned long *)addr, size, offset)
|
||||
|
||||
static inline int ext2_test_bit(int nr, const void *vaddr)
|
||||
{
|
||||
@ -394,10 +398,9 @@ static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size)
|
||||
return (p - addr) * 32 + res;
|
||||
}
|
||||
|
||||
static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size,
|
||||
unsigned offset)
|
||||
static inline unsigned long generic_find_next_zero_le_bit(const unsigned long *addr,
|
||||
unsigned long size, unsigned long offset)
|
||||
{
|
||||
const unsigned long *addr = vaddr;
|
||||
const unsigned long *p = addr + (offset >> 5);
|
||||
int bit = offset & 31UL, res;
|
||||
|
||||
@ -437,10 +440,9 @@ static inline int ext2_find_first_bit(const void *vaddr, unsigned size)
|
||||
return (p - addr) * 32 + res;
|
||||
}
|
||||
|
||||
static inline int ext2_find_next_bit(const void *vaddr, unsigned size,
|
||||
unsigned offset)
|
||||
static inline unsigned long generic_find_next_le_bit(const unsigned long *addr,
|
||||
unsigned long size, unsigned long offset)
|
||||
{
|
||||
const unsigned long *addr = vaddr;
|
||||
const unsigned long *p = addr + (offset >> 5);
|
||||
int bit = offset & 31UL, res;
|
||||
|
||||
|
@ -1,26 +1,12 @@
|
||||
#ifndef _M68K_PARAM_H
|
||||
#define _M68K_PARAM_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
# define HZ CONFIG_HZ /* Internal kernel timer frequency */
|
||||
# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
||||
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
|
||||
#endif
|
||||
|
||||
#ifndef HZ
|
||||
#define HZ 100
|
||||
#endif
|
||||
|
||||
#ifdef __uClinux__
|
||||
#define EXEC_PAGESIZE 4096
|
||||
#else
|
||||
#define EXEC_PAGESIZE 8192
|
||||
#endif
|
||||
|
||||
#ifndef NOGROUP
|
||||
#define NOGROUP (-1)
|
||||
#endif
|
||||
|
||||
#define MAXHOSTNAMELEN 64 /* max length of hostname */
|
||||
#include <asm-generic/param.h>
|
||||
|
||||
#endif /* _M68K_PARAM_H */
|
||||
|
@ -455,7 +455,7 @@ static inline void access_error040(struct frame *fp)
|
||||
|
||||
if (do_page_fault(&fp->ptregs, addr, errorcode)) {
|
||||
#ifdef DEBUG
|
||||
printk("do_page_fault() !=0 \n");
|
||||
printk("do_page_fault() !=0\n");
|
||||
#endif
|
||||
if (user_mode(&fp->ptregs)){
|
||||
/* delay writebacks after signal delivery */
|
||||
|
@ -148,7 +148,7 @@ static void mac_cache_card_flush(int writeback)
|
||||
void __init config_mac(void)
|
||||
{
|
||||
if (!MACH_IS_MAC)
|
||||
printk(KERN_ERR "ERROR: no Mac, but config_mac() called!! \n");
|
||||
printk(KERN_ERR "ERROR: no Mac, but config_mac() called!!\n");
|
||||
|
||||
mach_sched_init = mac_sched_init;
|
||||
mach_init_IRQ = mac_init_IRQ;
|
||||
@ -867,7 +867,7 @@ static void __init mac_identify(void)
|
||||
*/
|
||||
iop_preinit();
|
||||
|
||||
printk(KERN_INFO "Detected Macintosh model: %d \n", model);
|
||||
printk(KERN_INFO "Detected Macintosh model: %d\n", model);
|
||||
|
||||
/*
|
||||
* Report booter data:
|
||||
@ -878,12 +878,12 @@ static void __init mac_identify(void)
|
||||
mac_bi_data.videoaddr, mac_bi_data.videorow,
|
||||
mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
|
||||
mac_bi_data.dimensions >> 16);
|
||||
printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx \n",
|
||||
printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n",
|
||||
mac_bi_data.videological, mac_orig_videoaddr,
|
||||
mac_bi_data.sccbase);
|
||||
printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx \n",
|
||||
printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n",
|
||||
mac_bi_data.boottime, mac_bi_data.gmtbias);
|
||||
printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n",
|
||||
printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n",
|
||||
mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
|
||||
|
||||
iop_init();
|
||||
|
@ -154,7 +154,6 @@ good_area:
|
||||
* the fault.
|
||||
*/
|
||||
|
||||
survive:
|
||||
fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
|
||||
#ifdef DEBUG
|
||||
printk("handle_mm_fault returns %d\n",fault);
|
||||
@ -180,15 +179,10 @@ good_area:
|
||||
*/
|
||||
out_of_memory:
|
||||
up_read(&mm->mmap_sem);
|
||||
if (is_global_init(current)) {
|
||||
yield();
|
||||
down_read(&mm->mmap_sem);
|
||||
goto survive;
|
||||
}
|
||||
|
||||
printk("VM: killing process %s\n", current->comm);
|
||||
if (user_mode(regs))
|
||||
do_group_exit(SIGKILL);
|
||||
if (!user_mode(regs))
|
||||
goto no_context;
|
||||
pagefault_out_of_memory();
|
||||
return 0;
|
||||
|
||||
no_context:
|
||||
current->thread.signo = SIGBUS;
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/fcntl.h>
|
||||
@ -36,8 +35,7 @@ static const unsigned char days_in_mo[] =
|
||||
|
||||
static atomic_t rtc_ready = ATOMIC_INIT(1);
|
||||
|
||||
static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
volatile MK48T08ptr_t rtc = (MK48T08ptr_t)MVME_RTC_BASE;
|
||||
unsigned long flags;
|
||||
@ -120,22 +118,15 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
}
|
||||
|
||||
/*
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
* Also clear the previous interrupt data on an open, and clean
|
||||
* up things on a close.
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
*/
|
||||
|
||||
static int rtc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
if( !atomic_dec_and_test(&rtc_ready) )
|
||||
{
|
||||
atomic_inc( &rtc_ready );
|
||||
unlock_kernel();
|
||||
return -EBUSY;
|
||||
}
|
||||
unlock_kernel();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -150,9 +141,9 @@ static int rtc_release(struct inode *inode, struct file *file)
|
||||
*/
|
||||
|
||||
static const struct file_operations rtc_fops = {
|
||||
.ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
.unlocked_ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
};
|
||||
|
||||
static struct miscdevice rtc_dev=
|
||||
|
@ -126,7 +126,7 @@ static void q40_reset(void)
|
||||
{
|
||||
halted = 1;
|
||||
printk("\n\n*******************************************\n"
|
||||
"Called q40_reset : press the RESET button!! \n"
|
||||
"Called q40_reset : press the RESET button!!\n"
|
||||
"*******************************************\n");
|
||||
Q40_LED_ON();
|
||||
while (1)
|
||||
|
@ -187,7 +187,7 @@ EXPORT_SYMBOL_GPL(platform_device_alloc);
|
||||
* released.
|
||||
*/
|
||||
int platform_device_add_resources(struct platform_device *pdev,
|
||||
struct resource *res, unsigned int num)
|
||||
const struct resource *res, unsigned int num)
|
||||
{
|
||||
struct resource *r;
|
||||
|
||||
@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);
|
||||
*/
|
||||
struct platform_device *platform_device_register_simple(const char *name,
|
||||
int id,
|
||||
struct resource *res,
|
||||
const struct resource *res,
|
||||
unsigned int num)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
@ -66,6 +66,7 @@
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/elevator.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -1696,34 +1697,18 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data)
|
||||
return get_disk(unit[drive].gendisk);
|
||||
}
|
||||
|
||||
static int __init amiga_floppy_init(void)
|
||||
static int __init amiga_floppy_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
if (!MACH_IS_AMIGA)
|
||||
return -ENODEV;
|
||||
|
||||
if (!AMIGAHW_PRESENT(AMI_FLOPPY))
|
||||
return -ENODEV;
|
||||
|
||||
if (register_blkdev(FLOPPY_MAJOR,"fd"))
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
* We request DSKPTR, DSKLEN and DSKDATA only, because the other
|
||||
* floppy registers are too spreaded over the custom register space
|
||||
*/
|
||||
ret = -EBUSY;
|
||||
if (!request_mem_region(CUSTOM_PHYSADDR+0x20, 8, "amiflop [Paula]")) {
|
||||
printk("fd: cannot get floppy registers\n");
|
||||
goto out_blkdev;
|
||||
}
|
||||
|
||||
ret = -ENOMEM;
|
||||
if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) ==
|
||||
NULL) {
|
||||
printk("fd: cannot get chip mem buffer\n");
|
||||
goto out_memregion;
|
||||
goto out_blkdev;
|
||||
}
|
||||
|
||||
ret = -EBUSY;
|
||||
@ -1792,18 +1777,13 @@ out_irq2:
|
||||
free_irq(IRQ_AMIGA_DSKBLK, NULL);
|
||||
out_irq:
|
||||
amiga_chip_free(raw_buf);
|
||||
out_memregion:
|
||||
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
|
||||
out_blkdev:
|
||||
unregister_blkdev(FLOPPY_MAJOR,"fd");
|
||||
return ret;
|
||||
}
|
||||
|
||||
module_init(amiga_floppy_init);
|
||||
#ifdef MODULE
|
||||
|
||||
#if 0 /* not safe to unload */
|
||||
void cleanup_module(void)
|
||||
static int __exit amiga_floppy_remove(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -1820,12 +1800,25 @@ void cleanup_module(void)
|
||||
custom.dmacon = DMAF_DISK; /* disable DMA */
|
||||
amiga_chip_free(raw_buf);
|
||||
blk_cleanup_queue(floppy_queue);
|
||||
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
|
||||
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
||||
}
|
||||
#endif
|
||||
|
||||
#else
|
||||
static struct platform_driver amiga_floppy_driver = {
|
||||
.driver = {
|
||||
.name = "amiga-floppy",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init amiga_floppy_init(void)
|
||||
{
|
||||
return platform_driver_probe(&amiga_floppy_driver, amiga_floppy_probe);
|
||||
}
|
||||
|
||||
module_init(amiga_floppy_init);
|
||||
|
||||
#ifndef MODULE
|
||||
static int __init amiga_floppy_setup (char *str)
|
||||
{
|
||||
int n;
|
||||
@ -1840,3 +1833,5 @@ static int __init amiga_floppy_setup (char *str)
|
||||
|
||||
__setup("floppy=", amiga_floppy_setup);
|
||||
#endif
|
||||
|
||||
MODULE_ALIAS("platform:amiga-floppy");
|
||||
|
@ -627,7 +627,6 @@ static irqreturn_t cd2401_rx_interrupt(int irq, void *dev_id)
|
||||
char data;
|
||||
int char_count;
|
||||
int save_cnt;
|
||||
int len;
|
||||
|
||||
/* determine the channel and change to that context */
|
||||
channel = (u_short) (base_addr[CyLICR] >> 2);
|
||||
@ -1528,7 +1527,6 @@ static int
|
||||
cy_ioctl(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
unsigned long val;
|
||||
struct cyclades_port *info = tty->driver_data;
|
||||
int ret_val = 0;
|
||||
void __user *argp = (void __user *)arg;
|
||||
|
@ -674,6 +674,7 @@ static struct zorro_device_id a2065_zorro_tbl[] __devinitdata = {
|
||||
{ ZORRO_PROD_AMERISTAR_A2065 },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, a2065_zorro_tbl);
|
||||
|
||||
static struct zorro_driver a2065_driver = {
|
||||
.name = "a2065",
|
||||
|
@ -145,6 +145,7 @@ static struct zorro_device_id ariadne_zorro_tbl[] __devinitdata = {
|
||||
{ ZORRO_PROD_VILLAGE_TRONIC_ARIADNE },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, ariadne_zorro_tbl);
|
||||
|
||||
static struct zorro_driver ariadne_driver = {
|
||||
.name = "ariadne",
|
||||
|
@ -71,6 +71,7 @@ static struct zorro_device_id hydra_zorro_tbl[] __devinitdata = {
|
||||
{ ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, hydra_zorro_tbl);
|
||||
|
||||
static struct zorro_driver hydra_driver = {
|
||||
.name = "hydra",
|
||||
|
@ -102,6 +102,7 @@ static struct zorro_device_id zorro8390_zorro_tbl[] __devinitdata = {
|
||||
{ ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, zorro8390_zorro_tbl);
|
||||
|
||||
static struct zorro_driver zorro8390_driver = {
|
||||
.name = "zorro8390",
|
||||
|
@ -69,6 +69,7 @@ static struct zorro_device_id zorro7xx_zorro_tbl[] __devinitdata = {
|
||||
},
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, zorro7xx_zorro_tbl);
|
||||
|
||||
static int __devinit zorro7xx_init_one(struct zorro_dev *z,
|
||||
const struct zorro_device_id *ent)
|
||||
|
@ -50,8 +50,9 @@
|
||||
#include <linux/fb.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/amigahw.h>
|
||||
@ -1135,7 +1136,7 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg
|
||||
* Interface to the low level console driver
|
||||
*/
|
||||
|
||||
static void amifb_deinit(void);
|
||||
static void amifb_deinit(struct platform_device *pdev);
|
||||
|
||||
/*
|
||||
* Internal routines
|
||||
@ -2246,7 +2247,7 @@ static inline void chipfree(void)
|
||||
* Initialisation
|
||||
*/
|
||||
|
||||
static int __init amifb_init(void)
|
||||
static int __init amifb_probe(struct platform_device *pdev)
|
||||
{
|
||||
int tag, i, err = 0;
|
||||
u_long chipptr;
|
||||
@ -2261,16 +2262,6 @@ static int __init amifb_init(void)
|
||||
}
|
||||
amifb_setup(option);
|
||||
#endif
|
||||
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_VIDEO))
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* We request all registers starting from bplpt[0]
|
||||
*/
|
||||
if (!request_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120,
|
||||
"amifb [Denise/Lisa]"))
|
||||
return -EBUSY;
|
||||
|
||||
custom.dmacon = DMAF_ALL | DMAF_MASTER;
|
||||
|
||||
switch (amiga_chipset) {
|
||||
@ -2377,6 +2368,7 @@ default_chipset:
|
||||
fb_info.fbops = &amifb_ops;
|
||||
fb_info.par = ¤tpar;
|
||||
fb_info.flags = FBINFO_DEFAULT;
|
||||
fb_info.device = &pdev->dev;
|
||||
|
||||
if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb,
|
||||
NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) {
|
||||
@ -2451,18 +2443,18 @@ default_chipset:
|
||||
return 0;
|
||||
|
||||
amifb_error:
|
||||
amifb_deinit();
|
||||
amifb_deinit(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void amifb_deinit(void)
|
||||
static void amifb_deinit(struct platform_device *pdev)
|
||||
{
|
||||
if (fb_info.cmap.len)
|
||||
fb_dealloc_cmap(&fb_info.cmap);
|
||||
fb_dealloc_cmap(&fb_info.cmap);
|
||||
chipfree();
|
||||
if (videomemory)
|
||||
iounmap((void*)videomemory);
|
||||
release_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120);
|
||||
custom.dmacon = DMAF_ALL | DMAF_MASTER;
|
||||
}
|
||||
|
||||
@ -3794,14 +3786,35 @@ static void ami_rebuild_copper(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void __exit amifb_exit(void)
|
||||
static int __exit amifb_remove(struct platform_device *pdev)
|
||||
{
|
||||
unregister_framebuffer(&fb_info);
|
||||
amifb_deinit();
|
||||
amifb_deinit(pdev);
|
||||
amifb_video_off();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver amifb_driver = {
|
||||
.remove = __exit_p(amifb_remove),
|
||||
.driver = {
|
||||
.name = "amiga-video",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init amifb_init(void)
|
||||
{
|
||||
return platform_driver_probe(&amifb_driver, amifb_probe);
|
||||
}
|
||||
|
||||
module_init(amifb_init);
|
||||
|
||||
static void __exit amifb_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&amifb_driver);
|
||||
}
|
||||
|
||||
module_exit(amifb_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:amiga-video");
|
||||
|
@ -299,6 +299,7 @@ static const struct zorro_device_id cirrusfb_zorro_table[] = {
|
||||
},
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table);
|
||||
|
||||
static const struct {
|
||||
zorro_id id2;
|
||||
|
@ -219,6 +219,7 @@ static struct zorro_device_id fm2fb_devices[] __devinitdata = {
|
||||
{ ZORRO_PROD_HELFRICH_RAINBOW_II },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(zorro, fm2fb_devices);
|
||||
|
||||
static struct zorro_driver fm2fb_driver = {
|
||||
.name = "fm2fb",
|
||||
|
@ -97,7 +97,7 @@ static void zorro_seq_stop(struct seq_file *m, void *v)
|
||||
|
||||
static int zorro_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
u_int slot = *(loff_t *)v;
|
||||
unsigned int slot = *(loff_t *)v;
|
||||
struct zorro_dev *z = &zorro_autocon[slot];
|
||||
|
||||
seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id,
|
||||
@ -129,7 +129,7 @@ static const struct file_operations zorro_devices_proc_fops = {
|
||||
|
||||
static struct proc_dir_entry *proc_bus_zorro_dir;
|
||||
|
||||
static int __init zorro_proc_attach_device(u_int slot)
|
||||
static int __init zorro_proc_attach_device(unsigned int slot)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
char name[4];
|
||||
@ -146,7 +146,7 @@ static int __init zorro_proc_attach_device(u_int slot)
|
||||
|
||||
static int __init zorro_proc_init(void)
|
||||
{
|
||||
u_int slot;
|
||||
unsigned int slot;
|
||||
|
||||
if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) {
|
||||
proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL);
|
||||
|
@ -137,10 +137,34 @@ static int zorro_bus_match(struct device *dev, struct device_driver *drv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
struct zorro_dev *z;
|
||||
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
z = to_zorro_dev(dev);
|
||||
if (!z)
|
||||
return -ENODEV;
|
||||
|
||||
if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) ||
|
||||
add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) ||
|
||||
add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) ||
|
||||
add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id))
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
#else /* !CONFIG_HOTPLUG */
|
||||
return -ENODEV;
|
||||
#endif /* !CONFIG_HOTPLUG */
|
||||
}
|
||||
|
||||
struct bus_type zorro_bus_type = {
|
||||
.name = "zorro",
|
||||
.match = zorro_bus_match,
|
||||
.uevent = zorro_uevent,
|
||||
.probe = zorro_device_probe,
|
||||
.remove = zorro_device_remove,
|
||||
};
|
||||
|
@ -77,6 +77,16 @@ static struct bin_attribute zorro_config_attr = {
|
||||
.read = zorro_read_config,
|
||||
};
|
||||
|
||||
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct zorro_dev *z = to_zorro_dev(dev);
|
||||
|
||||
return sprintf(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(modalias, S_IRUGO, modalias_show, NULL);
|
||||
|
||||
int zorro_create_sysfs_dev_files(struct zorro_dev *z)
|
||||
{
|
||||
struct device *dev = &z->dev;
|
||||
@ -89,6 +99,7 @@ int zorro_create_sysfs_dev_files(struct zorro_dev *z)
|
||||
(error = device_create_file(dev, &dev_attr_slotaddr)) ||
|
||||
(error = device_create_file(dev, &dev_attr_slotsize)) ||
|
||||
(error = device_create_file(dev, &dev_attr_resource)) ||
|
||||
(error = device_create_file(dev, &dev_attr_modalias)) ||
|
||||
(error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr)))
|
||||
return error;
|
||||
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <linux/zorro.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/amigahw.h>
|
||||
@ -26,24 +28,17 @@
|
||||
* Zorro Expansion Devices
|
||||
*/
|
||||
|
||||
u_int zorro_num_autocon = 0;
|
||||
unsigned int zorro_num_autocon;
|
||||
struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO];
|
||||
|
||||
|
||||
/*
|
||||
* Single Zorro bus
|
||||
* Zorro bus
|
||||
*/
|
||||
|
||||
struct zorro_bus zorro_bus = {\
|
||||
.resources = {
|
||||
/* Zorro II regions (on Zorro II/III) */
|
||||
{ .name = "Zorro II exp", .start = 0x00e80000, .end = 0x00efffff },
|
||||
{ .name = "Zorro II mem", .start = 0x00200000, .end = 0x009fffff },
|
||||
/* Zorro III regions (on Zorro III only) */
|
||||
{ .name = "Zorro III exp", .start = 0xff000000, .end = 0xffffffff },
|
||||
{ .name = "Zorro III cfg", .start = 0x40000000, .end = 0x7fffffff }
|
||||
},
|
||||
.name = "Zorro bus"
|
||||
struct zorro_bus {
|
||||
struct list_head devices; /* list of devices on this bus */
|
||||
struct device dev;
|
||||
};
|
||||
|
||||
|
||||
@ -53,18 +48,19 @@ struct zorro_bus zorro_bus = {\
|
||||
|
||||
struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from)
|
||||
{
|
||||
struct zorro_dev *z;
|
||||
struct zorro_dev *z;
|
||||
|
||||
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
|
||||
if (!zorro_num_autocon)
|
||||
return NULL;
|
||||
|
||||
for (z = from ? from+1 : &zorro_autocon[0];
|
||||
z < zorro_autocon+zorro_num_autocon;
|
||||
z++)
|
||||
if (id == ZORRO_WILDCARD || id == z->id)
|
||||
return z;
|
||||
return NULL;
|
||||
|
||||
for (z = from ? from+1 : &zorro_autocon[0];
|
||||
z < zorro_autocon+zorro_num_autocon;
|
||||
z++)
|
||||
if (id == ZORRO_WILDCARD || id == z->id)
|
||||
return z;
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(zorro_find_device);
|
||||
|
||||
|
||||
/*
|
||||
@ -83,121 +79,138 @@ struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from)
|
||||
*/
|
||||
|
||||
DECLARE_BITMAP(zorro_unused_z2ram, 128);
|
||||
EXPORT_SYMBOL(zorro_unused_z2ram);
|
||||
|
||||
|
||||
static void __init mark_region(unsigned long start, unsigned long end,
|
||||
int flag)
|
||||
{
|
||||
if (flag)
|
||||
start += Z2RAM_CHUNKMASK;
|
||||
else
|
||||
end += Z2RAM_CHUNKMASK;
|
||||
start &= ~Z2RAM_CHUNKMASK;
|
||||
end &= ~Z2RAM_CHUNKMASK;
|
||||
|
||||
if (end <= Z2RAM_START || start >= Z2RAM_END)
|
||||
return;
|
||||
start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START;
|
||||
end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START;
|
||||
while (start < end) {
|
||||
u32 chunk = start>>Z2RAM_CHUNKSHIFT;
|
||||
if (flag)
|
||||
set_bit(chunk, zorro_unused_z2ram);
|
||||
start += Z2RAM_CHUNKMASK;
|
||||
else
|
||||
clear_bit(chunk, zorro_unused_z2ram);
|
||||
start += Z2RAM_CHUNKSIZE;
|
||||
}
|
||||
}
|
||||
end += Z2RAM_CHUNKMASK;
|
||||
start &= ~Z2RAM_CHUNKMASK;
|
||||
end &= ~Z2RAM_CHUNKMASK;
|
||||
|
||||
|
||||
static struct resource __init *zorro_find_parent_resource(struct zorro_dev *z)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < zorro_bus.num_resources; i++)
|
||||
if (zorro_resource_start(z) >= zorro_bus.resources[i].start &&
|
||||
zorro_resource_end(z) <= zorro_bus.resources[i].end)
|
||||
return &zorro_bus.resources[i];
|
||||
return &iomem_resource;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Initialization
|
||||
*/
|
||||
|
||||
static int __init zorro_init(void)
|
||||
{
|
||||
struct zorro_dev *z;
|
||||
unsigned int i;
|
||||
int error;
|
||||
|
||||
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
|
||||
return 0;
|
||||
|
||||
pr_info("Zorro: Probing AutoConfig expansion devices: %d device%s\n",
|
||||
zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s");
|
||||
|
||||
/* Initialize the Zorro bus */
|
||||
INIT_LIST_HEAD(&zorro_bus.devices);
|
||||
dev_set_name(&zorro_bus.dev, "zorro");
|
||||
error = device_register(&zorro_bus.dev);
|
||||
if (error) {
|
||||
pr_err("Zorro: Error registering zorro_bus\n");
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Request the resources */
|
||||
zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2;
|
||||
for (i = 0; i < zorro_bus.num_resources; i++)
|
||||
request_resource(&iomem_resource, &zorro_bus.resources[i]);
|
||||
|
||||
/* Register all devices */
|
||||
for (i = 0; i < zorro_num_autocon; i++) {
|
||||
z = &zorro_autocon[i];
|
||||
z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8);
|
||||
if (z->id == ZORRO_PROD_GVP_EPC_BASE) {
|
||||
/* GVP quirk */
|
||||
unsigned long magic = zorro_resource_start(z)+0x8000;
|
||||
z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK;
|
||||
if (end <= Z2RAM_START || start >= Z2RAM_END)
|
||||
return;
|
||||
start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START;
|
||||
end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START;
|
||||
while (start < end) {
|
||||
u32 chunk = start>>Z2RAM_CHUNKSHIFT;
|
||||
if (flag)
|
||||
set_bit(chunk, zorro_unused_z2ram);
|
||||
else
|
||||
clear_bit(chunk, zorro_unused_z2ram);
|
||||
start += Z2RAM_CHUNKSIZE;
|
||||
}
|
||||
sprintf(z->name, "Zorro device %08x", z->id);
|
||||
zorro_name_device(z);
|
||||
z->resource.name = z->name;
|
||||
if (request_resource(zorro_find_parent_resource(z), &z->resource))
|
||||
pr_err("Zorro: Address space collision on device %s %pR\n",
|
||||
z->name, &z->resource);
|
||||
dev_set_name(&z->dev, "%02x", i);
|
||||
z->dev.parent = &zorro_bus.dev;
|
||||
z->dev.bus = &zorro_bus_type;
|
||||
error = device_register(&z->dev);
|
||||
}
|
||||
|
||||
|
||||
static struct resource __init *zorro_find_parent_resource(
|
||||
struct platform_device *bridge, struct zorro_dev *z)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < bridge->num_resources; i++) {
|
||||
struct resource *r = &bridge->resource[i];
|
||||
if (zorro_resource_start(z) >= r->start &&
|
||||
zorro_resource_end(z) <= r->end)
|
||||
return r;
|
||||
}
|
||||
return &iomem_resource;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int __init amiga_zorro_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct zorro_bus *bus;
|
||||
struct zorro_dev *z;
|
||||
struct resource *r;
|
||||
unsigned int i;
|
||||
int error;
|
||||
|
||||
/* Initialize the Zorro bus */
|
||||
bus = kzalloc(sizeof(*bus), GFP_KERNEL);
|
||||
if (!bus)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&bus->devices);
|
||||
bus->dev.parent = &pdev->dev;
|
||||
dev_set_name(&bus->dev, "zorro");
|
||||
error = device_register(&bus->dev);
|
||||
if (error) {
|
||||
pr_err("Zorro: Error registering device %s\n", z->name);
|
||||
continue;
|
||||
pr_err("Zorro: Error registering zorro_bus\n");
|
||||
kfree(bus);
|
||||
return error;
|
||||
}
|
||||
error = zorro_create_sysfs_dev_files(z);
|
||||
if (error)
|
||||
dev_err(&z->dev, "Error creating sysfs files\n");
|
||||
}
|
||||
platform_set_drvdata(pdev, bus);
|
||||
|
||||
/* Mark all available Zorro II memory */
|
||||
zorro_for_each_dev(z) {
|
||||
if (z->rom.er_Type & ERTF_MEMLIST)
|
||||
mark_region(zorro_resource_start(z), zorro_resource_end(z)+1, 1);
|
||||
}
|
||||
/* Register all devices */
|
||||
pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n",
|
||||
zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s");
|
||||
|
||||
/* Unmark all used Zorro II memory */
|
||||
for (i = 0; i < m68k_num_memory; i++)
|
||||
if (m68k_memory[i].addr < 16*1024*1024)
|
||||
mark_region(m68k_memory[i].addr,
|
||||
m68k_memory[i].addr+m68k_memory[i].size, 0);
|
||||
for (i = 0; i < zorro_num_autocon; i++) {
|
||||
z = &zorro_autocon[i];
|
||||
z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8);
|
||||
if (z->id == ZORRO_PROD_GVP_EPC_BASE) {
|
||||
/* GVP quirk */
|
||||
unsigned long magic = zorro_resource_start(z)+0x8000;
|
||||
z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK;
|
||||
}
|
||||
sprintf(z->name, "Zorro device %08x", z->id);
|
||||
zorro_name_device(z);
|
||||
z->resource.name = z->name;
|
||||
r = zorro_find_parent_resource(pdev, z);
|
||||
error = request_resource(r, &z->resource);
|
||||
if (error)
|
||||
dev_err(&bus->dev,
|
||||
"Address space collision on device %s %pR\n",
|
||||
z->name, &z->resource);
|
||||
dev_set_name(&z->dev, "%02x", i);
|
||||
z->dev.parent = &bus->dev;
|
||||
z->dev.bus = &zorro_bus_type;
|
||||
error = device_register(&z->dev);
|
||||
if (error) {
|
||||
dev_err(&bus->dev, "Error registering device %s\n",
|
||||
z->name);
|
||||
continue;
|
||||
}
|
||||
error = zorro_create_sysfs_dev_files(z);
|
||||
if (error)
|
||||
dev_err(&z->dev, "Error creating sysfs files\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
/* Mark all available Zorro II memory */
|
||||
zorro_for_each_dev(z) {
|
||||
if (z->rom.er_Type & ERTF_MEMLIST)
|
||||
mark_region(zorro_resource_start(z),
|
||||
zorro_resource_end(z)+1, 1);
|
||||
}
|
||||
|
||||
/* Unmark all used Zorro II memory */
|
||||
for (i = 0; i < m68k_num_memory; i++)
|
||||
if (m68k_memory[i].addr < 16*1024*1024)
|
||||
mark_region(m68k_memory[i].addr,
|
||||
m68k_memory[i].addr+m68k_memory[i].size,
|
||||
0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(zorro_init);
|
||||
static struct platform_driver amiga_zorro_driver = {
|
||||
.driver = {
|
||||
.name = "amiga-zorro",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL(zorro_find_device);
|
||||
EXPORT_SYMBOL(zorro_unused_z2ram);
|
||||
static int __init amiga_zorro_init(void)
|
||||
{
|
||||
return platform_driver_probe(&amiga_zorro_driver, amiga_zorro_probe);
|
||||
}
|
||||
|
||||
module_init(amiga_zorro_init);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -474,4 +474,13 @@ struct platform_device_id {
|
||||
__attribute__((aligned(sizeof(kernel_ulong_t))));
|
||||
};
|
||||
|
||||
struct zorro_device_id {
|
||||
__u32 id; /* Device ID or ZORRO_WILDCARD */
|
||||
kernel_ulong_t driver_data; /* Data private to the driver */
|
||||
};
|
||||
|
||||
#define ZORRO_WILDCARD (0xffffffff) /* not official */
|
||||
|
||||
#define ZORRO_DEVICE_MODALIAS_FMT "zorro:i%08X"
|
||||
|
||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||
|
@ -44,12 +44,14 @@ extern int platform_get_irq_byname(struct platform_device *, const char *);
|
||||
extern int platform_add_devices(struct platform_device **, int);
|
||||
|
||||
extern struct platform_device *platform_device_register_simple(const char *, int id,
|
||||
struct resource *, unsigned int);
|
||||
const struct resource *, unsigned int);
|
||||
extern struct platform_device *platform_device_register_data(struct device *,
|
||||
const char *, int, const void *, size_t);
|
||||
|
||||
extern struct platform_device *platform_device_alloc(const char *name, int id);
|
||||
extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num);
|
||||
extern int platform_device_add_resources(struct platform_device *pdev,
|
||||
const struct resource *res,
|
||||
unsigned int num);
|
||||
extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size);
|
||||
extern int platform_device_add(struct platform_device *pdev);
|
||||
extern void platform_device_del(struct platform_device *pdev);
|
||||
|
@ -38,8 +38,6 @@
|
||||
typedef __u32 zorro_id;
|
||||
|
||||
|
||||
#define ZORRO_WILDCARD (0xffffffff) /* not official */
|
||||
|
||||
/* Include the ID list */
|
||||
#include <linux/zorro_ids.h>
|
||||
|
||||
@ -116,6 +114,7 @@ struct ConfigDev {
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
#include <asm/zorro.h>
|
||||
|
||||
@ -142,28 +141,9 @@ struct zorro_dev {
|
||||
* Zorro bus
|
||||
*/
|
||||
|
||||
struct zorro_bus {
|
||||
struct list_head devices; /* list of devices on this bus */
|
||||
unsigned int num_resources; /* number of resources */
|
||||
struct resource resources[4]; /* address space routed to this bus */
|
||||
struct device dev;
|
||||
char name[10];
|
||||
};
|
||||
|
||||
extern struct zorro_bus zorro_bus; /* single Zorro bus */
|
||||
extern struct bus_type zorro_bus_type;
|
||||
|
||||
|
||||
/*
|
||||
* Zorro device IDs
|
||||
*/
|
||||
|
||||
struct zorro_device_id {
|
||||
zorro_id id; /* Device ID or ZORRO_WILDCARD */
|
||||
unsigned long driver_data; /* Data private to the driver */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Zorro device drivers
|
||||
*/
|
||||
|
@ -796,6 +796,16 @@ static int do_platform_entry(const char *filename,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Looks like: zorro:iN. */
|
||||
static int do_zorro_entry(const char *filename, struct zorro_device_id *id,
|
||||
char *alias)
|
||||
{
|
||||
id->id = TO_NATIVE(id->id);
|
||||
strcpy(alias, "zorro:");
|
||||
ADD(alias, "i", id->id != ZORRO_WILDCARD, id->id);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Ignore any prefix, eg. some architectures prepend _ */
|
||||
static inline int sym_is(const char *symbol, const char *name)
|
||||
{
|
||||
@ -943,6 +953,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
|
||||
do_table(symval, sym->st_size,
|
||||
sizeof(struct platform_device_id), "platform",
|
||||
do_platform_entry, mod);
|
||||
else if (sym_is(symname, "__mod_zorro_device_table"))
|
||||
do_table(symval, sym->st_size,
|
||||
sizeof(struct zorro_device_id), "zorro",
|
||||
do_zorro_entry, mod);
|
||||
free(zeros);
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/setup.h>
|
||||
@ -710,31 +711,41 @@ static MACHINE machAmiga = {
|
||||
/*** Config & Setup **********************************************************/
|
||||
|
||||
|
||||
static int __init dmasound_paula_init(void)
|
||||
static int __init amiga_audio_probe(struct platform_device *pdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_AUDIO)) {
|
||||
if (!request_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40,
|
||||
"dmasound [Paula]"))
|
||||
return -EBUSY;
|
||||
dmasound.mach = machAmiga;
|
||||
dmasound.mach.default_hard = def_hard ;
|
||||
dmasound.mach.default_soft = def_soft ;
|
||||
err = dmasound_init();
|
||||
if (err)
|
||||
release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40);
|
||||
return err;
|
||||
} else
|
||||
return -ENODEV;
|
||||
dmasound.mach = machAmiga;
|
||||
dmasound.mach.default_hard = def_hard ;
|
||||
dmasound.mach.default_soft = def_soft ;
|
||||
return dmasound_init();
|
||||
}
|
||||
|
||||
static void __exit dmasound_paula_cleanup(void)
|
||||
static int __exit amiga_audio_remove(struct platform_device *pdev)
|
||||
{
|
||||
dmasound_deinit();
|
||||
release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40);
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(dmasound_paula_init);
|
||||
module_exit(dmasound_paula_cleanup);
|
||||
static struct platform_driver amiga_audio_driver = {
|
||||
.remove = __exit_p(amiga_audio_remove),
|
||||
.driver = {
|
||||
.name = "amiga-audio",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init amiga_audio_init(void)
|
||||
{
|
||||
return platform_driver_probe(&amiga_audio_driver, amiga_audio_probe);
|
||||
}
|
||||
|
||||
module_init(amiga_audio_init);
|
||||
|
||||
static void __exit amiga_audio_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&amiga_audio_driver);
|
||||
}
|
||||
|
||||
module_exit(amiga_audio_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:amiga-audio");
|
||||
|
Loading…
Reference in New Issue
Block a user