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:
Linus Torvalds 2010-05-17 13:54:29 -07:00
commit ba2e1c5f25
31 changed files with 410 additions and 290 deletions

View File

@ -2,6 +2,6 @@
# Makefile for Linux arch/m68k/amiga source directory # 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 obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o

View 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);

View File

@ -9,7 +9,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/smp_lock.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
@ -35,10 +34,9 @@
static unsigned char days_in_mo[] = static unsigned char days_in_mo[] =
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; {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, static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
unsigned long arg)
{ {
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
unsigned char msr; 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. * 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.
*/ */
static int rtc_open(struct inode *inode, struct file *file) static int rtc_open(struct inode *inode, struct file *file)
{ {
lock_kernel(); if (!atomic_dec_and_test(&rtc_status)) {
if(rtc_status) { atomic_inc(&rtc_status);
unlock_kernel();
return -EBUSY; return -EBUSY;
} }
rtc_status = 1;
unlock_kernel();
return 0; return 0;
} }
static int rtc_release(struct inode *inode, struct file *file) static int rtc_release(struct inode *inode, struct file *file)
{ {
lock_kernel(); atomic_inc(&rtc_status);
rtc_status = 0;
unlock_kernel();
return 0; return 0;
} }
@ -163,9 +152,9 @@ static int rtc_release(struct inode *inode, struct file *file)
*/ */
static const struct file_operations rtc_fops = { static const struct file_operations rtc_fops = {
.ioctl = rtc_ioctl, .unlocked_ioctl = rtc_ioctl,
.open = rtc_open, .open = rtc_open,
.release = rtc_release, .release = rtc_release,
}; };
static struct miscdevice rtc_dev = { static struct miscdevice rtc_dev = {

View File

@ -1,4 +1,2 @@
extern void hp300_sched_init(irq_handler_t vector); extern void hp300_sched_init(irq_handler_t vector);
extern unsigned long hp300_gettimeoffset (void); extern unsigned long hp300_gettimeoffset(void);

View File

@ -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_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(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_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) 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; return (p - addr) * 32 + res;
} }
static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size, static inline unsigned long generic_find_next_zero_le_bit(const unsigned long *addr,
unsigned offset) unsigned long size, unsigned long offset)
{ {
const unsigned long *addr = vaddr;
const unsigned long *p = addr + (offset >> 5); const unsigned long *p = addr + (offset >> 5);
int bit = offset & 31UL, res; 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; return (p - addr) * 32 + res;
} }
static inline int ext2_find_next_bit(const void *vaddr, unsigned size, static inline unsigned long generic_find_next_le_bit(const unsigned long *addr,
unsigned offset) unsigned long size, unsigned long offset)
{ {
const unsigned long *addr = vaddr;
const unsigned long *p = addr + (offset >> 5); const unsigned long *p = addr + (offset >> 5);
int bit = offset & 31UL, res; int bit = offset & 31UL, res;

View File

@ -1,26 +1,12 @@
#ifndef _M68K_PARAM_H #ifndef _M68K_PARAM_H
#define _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__ #ifdef __uClinux__
#define EXEC_PAGESIZE 4096 #define EXEC_PAGESIZE 4096
#else #else
#define EXEC_PAGESIZE 8192 #define EXEC_PAGESIZE 8192
#endif #endif
#ifndef NOGROUP #include <asm-generic/param.h>
#define NOGROUP (-1)
#endif
#define MAXHOSTNAMELEN 64 /* max length of hostname */
#endif /* _M68K_PARAM_H */ #endif /* _M68K_PARAM_H */

View File

@ -455,7 +455,7 @@ static inline void access_error040(struct frame *fp)
if (do_page_fault(&fp->ptregs, addr, errorcode)) { if (do_page_fault(&fp->ptregs, addr, errorcode)) {
#ifdef DEBUG #ifdef DEBUG
printk("do_page_fault() !=0 \n"); printk("do_page_fault() !=0\n");
#endif #endif
if (user_mode(&fp->ptregs)){ if (user_mode(&fp->ptregs)){
/* delay writebacks after signal delivery */ /* delay writebacks after signal delivery */

View File

@ -148,7 +148,7 @@ static void mac_cache_card_flush(int writeback)
void __init config_mac(void) void __init config_mac(void)
{ {
if (!MACH_IS_MAC) 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_sched_init = mac_sched_init;
mach_init_IRQ = mac_init_IRQ; mach_init_IRQ = mac_init_IRQ;
@ -867,7 +867,7 @@ static void __init mac_identify(void)
*/ */
iop_preinit(); iop_preinit();
printk(KERN_INFO "Detected Macintosh model: %d \n", model); printk(KERN_INFO "Detected Macintosh model: %d\n", model);
/* /*
* Report booter data: * Report booter data:
@ -878,12 +878,12 @@ static void __init mac_identify(void)
mac_bi_data.videoaddr, mac_bi_data.videorow, mac_bi_data.videoaddr, mac_bi_data.videorow,
mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF, mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
mac_bi_data.dimensions >> 16); 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.videological, mac_orig_videoaddr,
mac_bi_data.sccbase); 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); 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); mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
iop_init(); iop_init();

View File

@ -154,7 +154,6 @@ good_area:
* the fault. * the fault.
*/ */
survive:
fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
#ifdef DEBUG #ifdef DEBUG
printk("handle_mm_fault returns %d\n",fault); printk("handle_mm_fault returns %d\n",fault);
@ -180,15 +179,10 @@ good_area:
*/ */
out_of_memory: out_of_memory:
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
if (is_global_init(current)) { if (!user_mode(regs))
yield(); goto no_context;
down_read(&mm->mmap_sem); pagefault_out_of_memory();
goto survive; return 0;
}
printk("VM: killing process %s\n", current->comm);
if (user_mode(regs))
do_group_exit(SIGKILL);
no_context: no_context:
current->thread.signo = SIGBUS; current->thread.signo = SIGBUS;

View File

@ -9,7 +9,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/smp_lock.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/fcntl.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 atomic_t rtc_ready = ATOMIC_INIT(1);
static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
unsigned long arg)
{ {
volatile MK48T08ptr_t rtc = (MK48T08ptr_t)MVME_RTC_BASE; volatile MK48T08ptr_t rtc = (MK48T08ptr_t)MVME_RTC_BASE;
unsigned long flags; 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. * 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.
*/ */
static int rtc_open(struct inode *inode, struct file *file) static int rtc_open(struct inode *inode, struct file *file)
{ {
lock_kernel();
if( !atomic_dec_and_test(&rtc_ready) ) if( !atomic_dec_and_test(&rtc_ready) )
{ {
atomic_inc( &rtc_ready ); atomic_inc( &rtc_ready );
unlock_kernel();
return -EBUSY; return -EBUSY;
} }
unlock_kernel();
return 0; return 0;
} }
@ -150,9 +141,9 @@ static int rtc_release(struct inode *inode, struct file *file)
*/ */
static const struct file_operations rtc_fops = { static const struct file_operations rtc_fops = {
.ioctl = rtc_ioctl, .unlocked_ioctl = rtc_ioctl,
.open = rtc_open, .open = rtc_open,
.release = rtc_release, .release = rtc_release,
}; };
static struct miscdevice rtc_dev= static struct miscdevice rtc_dev=

View File

@ -126,7 +126,7 @@ static void q40_reset(void)
{ {
halted = 1; halted = 1;
printk("\n\n*******************************************\n" printk("\n\n*******************************************\n"
"Called q40_reset : press the RESET button!! \n" "Called q40_reset : press the RESET button!!\n"
"*******************************************\n"); "*******************************************\n");
Q40_LED_ON(); Q40_LED_ON();
while (1) while (1)

View File

@ -187,7 +187,7 @@ EXPORT_SYMBOL_GPL(platform_device_alloc);
* released. * released.
*/ */
int platform_device_add_resources(struct platform_device *pdev, 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; struct resource *r;
@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);
*/ */
struct platform_device *platform_device_register_simple(const char *name, struct platform_device *platform_device_register_simple(const char *name,
int id, int id,
struct resource *res, const struct resource *res,
unsigned int num) unsigned int num)
{ {
struct platform_device *pdev; struct platform_device *pdev;

View File

@ -66,6 +66,7 @@
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/elevator.h> #include <linux/elevator.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/uaccess.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); 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; int i, ret;
if (!MACH_IS_AMIGA)
return -ENODEV;
if (!AMIGAHW_PRESENT(AMI_FLOPPY))
return -ENODEV;
if (register_blkdev(FLOPPY_MAJOR,"fd")) if (register_blkdev(FLOPPY_MAJOR,"fd"))
return -EBUSY; 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; ret = -ENOMEM;
if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) == if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) ==
NULL) { NULL) {
printk("fd: cannot get chip mem buffer\n"); printk("fd: cannot get chip mem buffer\n");
goto out_memregion; goto out_blkdev;
} }
ret = -EBUSY; ret = -EBUSY;
@ -1792,18 +1777,13 @@ out_irq2:
free_irq(IRQ_AMIGA_DSKBLK, NULL); free_irq(IRQ_AMIGA_DSKBLK, NULL);
out_irq: out_irq:
amiga_chip_free(raw_buf); amiga_chip_free(raw_buf);
out_memregion:
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
out_blkdev: out_blkdev:
unregister_blkdev(FLOPPY_MAJOR,"fd"); unregister_blkdev(FLOPPY_MAJOR,"fd");
return ret; return ret;
} }
module_init(amiga_floppy_init);
#ifdef MODULE
#if 0 /* not safe to unload */ #if 0 /* not safe to unload */
void cleanup_module(void) static int __exit amiga_floppy_remove(struct platform_device *pdev)
{ {
int i; int i;
@ -1820,12 +1800,25 @@ void cleanup_module(void)
custom.dmacon = DMAF_DISK; /* disable DMA */ custom.dmacon = DMAF_DISK; /* disable DMA */
amiga_chip_free(raw_buf); amiga_chip_free(raw_buf);
blk_cleanup_queue(floppy_queue); blk_cleanup_queue(floppy_queue);
release_mem_region(CUSTOM_PHYSADDR+0x20, 8);
unregister_blkdev(FLOPPY_MAJOR, "fd"); unregister_blkdev(FLOPPY_MAJOR, "fd");
} }
#endif #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) static int __init amiga_floppy_setup (char *str)
{ {
int n; int n;
@ -1840,3 +1833,5 @@ static int __init amiga_floppy_setup (char *str)
__setup("floppy=", amiga_floppy_setup); __setup("floppy=", amiga_floppy_setup);
#endif #endif
MODULE_ALIAS("platform:amiga-floppy");

View File

@ -627,7 +627,6 @@ static irqreturn_t cd2401_rx_interrupt(int irq, void *dev_id)
char data; char data;
int char_count; int char_count;
int save_cnt; int save_cnt;
int len;
/* determine the channel and change to that context */ /* determine the channel and change to that context */
channel = (u_short) (base_addr[CyLICR] >> 2); channel = (u_short) (base_addr[CyLICR] >> 2);
@ -1528,7 +1527,6 @@ static int
cy_ioctl(struct tty_struct *tty, struct file *file, cy_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
unsigned long val;
struct cyclades_port *info = tty->driver_data; struct cyclades_port *info = tty->driver_data;
int ret_val = 0; int ret_val = 0;
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;

View File

@ -674,6 +674,7 @@ static struct zorro_device_id a2065_zorro_tbl[] __devinitdata = {
{ ZORRO_PROD_AMERISTAR_A2065 }, { ZORRO_PROD_AMERISTAR_A2065 },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, a2065_zorro_tbl);
static struct zorro_driver a2065_driver = { static struct zorro_driver a2065_driver = {
.name = "a2065", .name = "a2065",

View File

@ -145,6 +145,7 @@ static struct zorro_device_id ariadne_zorro_tbl[] __devinitdata = {
{ ZORRO_PROD_VILLAGE_TRONIC_ARIADNE }, { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, ariadne_zorro_tbl);
static struct zorro_driver ariadne_driver = { static struct zorro_driver ariadne_driver = {
.name = "ariadne", .name = "ariadne",

View File

@ -71,6 +71,7 @@ static struct zorro_device_id hydra_zorro_tbl[] __devinitdata = {
{ ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET }, { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, hydra_zorro_tbl);
static struct zorro_driver hydra_driver = { static struct zorro_driver hydra_driver = {
.name = "hydra", .name = "hydra",

View File

@ -102,6 +102,7 @@ static struct zorro_device_id zorro8390_zorro_tbl[] __devinitdata = {
{ ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, }, { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, zorro8390_zorro_tbl);
static struct zorro_driver zorro8390_driver = { static struct zorro_driver zorro8390_driver = {
.name = "zorro8390", .name = "zorro8390",

View File

@ -69,6 +69,7 @@ static struct zorro_device_id zorro7xx_zorro_tbl[] __devinitdata = {
}, },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, zorro7xx_zorro_tbl);
static int __devinit zorro7xx_init_one(struct zorro_dev *z, static int __devinit zorro7xx_init_one(struct zorro_dev *z,
const struct zorro_device_id *ent) const struct zorro_device_id *ent)

View File

@ -50,8 +50,9 @@
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/platform_device.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/amigahw.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 * Interface to the low level console driver
*/ */
static void amifb_deinit(void); static void amifb_deinit(struct platform_device *pdev);
/* /*
* Internal routines * Internal routines
@ -2246,7 +2247,7 @@ static inline void chipfree(void)
* Initialisation * Initialisation
*/ */
static int __init amifb_init(void) static int __init amifb_probe(struct platform_device *pdev)
{ {
int tag, i, err = 0; int tag, i, err = 0;
u_long chipptr; u_long chipptr;
@ -2261,16 +2262,6 @@ static int __init amifb_init(void)
} }
amifb_setup(option); amifb_setup(option);
#endif #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; custom.dmacon = DMAF_ALL | DMAF_MASTER;
switch (amiga_chipset) { switch (amiga_chipset) {
@ -2377,6 +2368,7 @@ default_chipset:
fb_info.fbops = &amifb_ops; fb_info.fbops = &amifb_ops;
fb_info.par = &currentpar; fb_info.par = &currentpar;
fb_info.flags = FBINFO_DEFAULT; fb_info.flags = FBINFO_DEFAULT;
fb_info.device = &pdev->dev;
if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb, if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb,
NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) { NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) {
@ -2451,18 +2443,18 @@ default_chipset:
return 0; return 0;
amifb_error: amifb_error:
amifb_deinit(); amifb_deinit(pdev);
return err; return err;
} }
static void amifb_deinit(void) static void amifb_deinit(struct platform_device *pdev)
{ {
if (fb_info.cmap.len) if (fb_info.cmap.len)
fb_dealloc_cmap(&fb_info.cmap); fb_dealloc_cmap(&fb_info.cmap);
fb_dealloc_cmap(&fb_info.cmap);
chipfree(); chipfree();
if (videomemory) if (videomemory)
iounmap((void*)videomemory); iounmap((void*)videomemory);
release_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120);
custom.dmacon = DMAF_ALL | DMAF_MASTER; 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); unregister_framebuffer(&fb_info);
amifb_deinit(); amifb_deinit(pdev);
amifb_video_off(); 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); module_init(amifb_init);
static void __exit amifb_exit(void)
{
platform_driver_unregister(&amifb_driver);
}
module_exit(amifb_exit); module_exit(amifb_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:amiga-video");

View File

@ -299,6 +299,7 @@ static const struct zorro_device_id cirrusfb_zorro_table[] = {
}, },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table);
static const struct { static const struct {
zorro_id id2; zorro_id id2;

View File

@ -219,6 +219,7 @@ static struct zorro_device_id fm2fb_devices[] __devinitdata = {
{ ZORRO_PROD_HELFRICH_RAINBOW_II }, { ZORRO_PROD_HELFRICH_RAINBOW_II },
{ 0 } { 0 }
}; };
MODULE_DEVICE_TABLE(zorro, fm2fb_devices);
static struct zorro_driver fm2fb_driver = { static struct zorro_driver fm2fb_driver = {
.name = "fm2fb", .name = "fm2fb",

View File

@ -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) 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]; struct zorro_dev *z = &zorro_autocon[slot];
seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id, 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 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; struct proc_dir_entry *entry;
char name[4]; char name[4];
@ -146,7 +146,7 @@ static int __init zorro_proc_attach_device(u_int slot)
static int __init zorro_proc_init(void) static int __init zorro_proc_init(void)
{ {
u_int slot; unsigned int slot;
if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) {
proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL); proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL);

View File

@ -137,10 +137,34 @@ static int zorro_bus_match(struct device *dev, struct device_driver *drv)
return 0; 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 = { struct bus_type zorro_bus_type = {
.name = "zorro", .name = "zorro",
.match = zorro_bus_match, .match = zorro_bus_match,
.uevent = zorro_uevent,
.probe = zorro_device_probe, .probe = zorro_device_probe,
.remove = zorro_device_remove, .remove = zorro_device_remove,
}; };

View File

@ -77,6 +77,16 @@ static struct bin_attribute zorro_config_attr = {
.read = zorro_read_config, .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) int zorro_create_sysfs_dev_files(struct zorro_dev *z)
{ {
struct device *dev = &z->dev; 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_slotaddr)) ||
(error = device_create_file(dev, &dev_attr_slotsize)) || (error = device_create_file(dev, &dev_attr_slotsize)) ||
(error = device_create_file(dev, &dev_attr_resource)) || (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))) (error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr)))
return error; return error;

View File

@ -15,6 +15,8 @@
#include <linux/zorro.h> #include <linux/zorro.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/amigahw.h> #include <asm/amigahw.h>
@ -26,24 +28,17 @@
* Zorro Expansion Devices * Zorro Expansion Devices
*/ */
u_int zorro_num_autocon = 0; unsigned int zorro_num_autocon;
struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO]; struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO];
/* /*
* Single Zorro bus * Zorro bus
*/ */
struct zorro_bus zorro_bus = {\ struct zorro_bus {
.resources = { struct list_head devices; /* list of devices on this bus */
/* Zorro II regions (on Zorro II/III) */ struct device dev;
{ .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"
}; };
@ -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 *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; 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); DECLARE_BITMAP(zorro_unused_z2ram, 128);
EXPORT_SYMBOL(zorro_unused_z2ram);
static void __init mark_region(unsigned long start, unsigned long end, static void __init mark_region(unsigned long start, unsigned long end,
int flag) 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) if (flag)
set_bit(chunk, zorro_unused_z2ram); start += Z2RAM_CHUNKMASK;
else else
clear_bit(chunk, zorro_unused_z2ram); end += Z2RAM_CHUNKMASK;
start += Z2RAM_CHUNKSIZE; start &= ~Z2RAM_CHUNKMASK;
} end &= ~Z2RAM_CHUNKMASK;
}
if (end <= Z2RAM_START || start >= Z2RAM_END)
static struct resource __init *zorro_find_parent_resource(struct zorro_dev *z) return;
{ start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START;
int i; end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START;
while (start < end) {
for (i = 0; i < zorro_bus.num_resources; i++) u32 chunk = start>>Z2RAM_CHUNKSHIFT;
if (zorro_resource_start(z) >= zorro_bus.resources[i].start && if (flag)
zorro_resource_end(z) <= zorro_bus.resources[i].end) set_bit(chunk, zorro_unused_z2ram);
return &zorro_bus.resources[i]; else
return &iomem_resource; clear_bit(chunk, zorro_unused_z2ram);
} start += Z2RAM_CHUNKSIZE;
/*
* 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;
} }
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)) static struct resource __init *zorro_find_parent_resource(
pr_err("Zorro: Address space collision on device %s %pR\n", struct platform_device *bridge, struct zorro_dev *z)
z->name, &z->resource); {
dev_set_name(&z->dev, "%02x", i); int i;
z->dev.parent = &zorro_bus.dev;
z->dev.bus = &zorro_bus_type; for (i = 0; i < bridge->num_resources; i++) {
error = device_register(&z->dev); 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) { if (error) {
pr_err("Zorro: Error registering device %s\n", z->name); pr_err("Zorro: Error registering zorro_bus\n");
continue; kfree(bus);
return error;
} }
error = zorro_create_sysfs_dev_files(z); platform_set_drvdata(pdev, bus);
if (error)
dev_err(&z->dev, "Error creating sysfs files\n");
}
/* Mark all available Zorro II memory */ /* Register all devices */
zorro_for_each_dev(z) { pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n",
if (z->rom.er_Type & ERTF_MEMLIST) zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s");
mark_region(zorro_resource_start(z), zorro_resource_end(z)+1, 1);
}
/* Unmark all used Zorro II memory */ for (i = 0; i < zorro_num_autocon; i++) {
for (i = 0; i < m68k_num_memory; i++) z = &zorro_autocon[i];
if (m68k_memory[i].addr < 16*1024*1024) z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8);
mark_region(m68k_memory[i].addr, if (z->id == ZORRO_PROD_GVP_EPC_BASE) {
m68k_memory[i].addr+m68k_memory[i].size, 0); /* 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); static int __init amiga_zorro_init(void)
EXPORT_SYMBOL(zorro_unused_z2ram); {
return platform_driver_probe(&amiga_zorro_driver, amiga_zorro_probe);
}
module_init(amiga_zorro_init);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -474,4 +474,13 @@ struct platform_device_id {
__attribute__((aligned(sizeof(kernel_ulong_t)))); __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 */ #endif /* LINUX_MOD_DEVICETABLE_H */

View File

@ -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 int platform_add_devices(struct platform_device **, int);
extern struct platform_device *platform_device_register_simple(const char *, int id, 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 *, extern struct platform_device *platform_device_register_data(struct device *,
const char *, int, const void *, size_t); const char *, int, const void *, size_t);
extern struct platform_device *platform_device_alloc(const char *name, int id); 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_data(struct platform_device *pdev, const void *data, size_t size);
extern int platform_device_add(struct platform_device *pdev); extern int platform_device_add(struct platform_device *pdev);
extern void platform_device_del(struct platform_device *pdev); extern void platform_device_del(struct platform_device *pdev);

View File

@ -38,8 +38,6 @@
typedef __u32 zorro_id; typedef __u32 zorro_id;
#define ZORRO_WILDCARD (0xffffffff) /* not official */
/* Include the ID list */ /* Include the ID list */
#include <linux/zorro_ids.h> #include <linux/zorro_ids.h>
@ -116,6 +114,7 @@ struct ConfigDev {
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/mod_devicetable.h>
#include <asm/zorro.h> #include <asm/zorro.h>
@ -142,28 +141,9 @@ struct zorro_dev {
* Zorro bus * 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; 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 * Zorro device drivers
*/ */

View File

@ -796,6 +796,16 @@ static int do_platform_entry(const char *filename,
return 1; 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 _ */ /* Ignore any prefix, eg. some architectures prepend _ */
static inline int sym_is(const char *symbol, const char *name) 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, do_table(symval, sym->st_size,
sizeof(struct platform_device_id), "platform", sizeof(struct platform_device_id), "platform",
do_platform_entry, mod); 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); free(zeros);
} }

View File

@ -21,6 +21,7 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/soundcard.h> #include <linux/soundcard.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/setup.h> #include <asm/setup.h>
@ -710,31 +711,41 @@ static MACHINE machAmiga = {
/*** Config & Setup **********************************************************/ /*** Config & Setup **********************************************************/
static int __init dmasound_paula_init(void) static int __init amiga_audio_probe(struct platform_device *pdev)
{ {
int err; dmasound.mach = machAmiga;
dmasound.mach.default_hard = def_hard ;
if (MACH_IS_AMIGA && AMIGAHW_PRESENT(AMI_AUDIO)) { dmasound.mach.default_soft = def_soft ;
if (!request_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40, return dmasound_init();
"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;
} }
static void __exit dmasound_paula_cleanup(void) static int __exit amiga_audio_remove(struct platform_device *pdev)
{ {
dmasound_deinit(); dmasound_deinit();
release_mem_region(CUSTOM_PHYSADDR+0xa0, 0x40); return 0;
} }
module_init(dmasound_paula_init); static struct platform_driver amiga_audio_driver = {
module_exit(dmasound_paula_cleanup); .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_LICENSE("GPL");
MODULE_ALIAS("platform:amiga-audio");