ide: remove IDE_ARCH_LOCK (v2)

* Add ->{get,release}_lock methods to struct ide_port_info
  and struct ide_host.

* Convert core IDE code, m68k IDE code and falconide support to use
  ->{get,release}_lock methods instead of ide_{get,release}_lock().

* Remove IDE_ARCH_LOCK.

v2:
* Build fix from Geert updating ide_{get,release}_lock() callers in
  falconide.c.

Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Michael Schmitz <schmitz@debian.org>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent d15a613b
...@@ -36,11 +36,6 @@ ...@@ -36,11 +36,6 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
#ifdef CONFIG_ATARI
#include <linux/interrupt.h>
#include <asm/atari_stdma.h>
#endif
#ifdef CONFIG_MAC #ifdef CONFIG_MAC
#include <asm/macints.h> #include <asm/macints.h>
#endif #endif
...@@ -92,36 +87,5 @@ ...@@ -92,36 +87,5 @@
#define outsw_swapw(port, addr, n) raw_outsw_swapw((u16 *)port, addr, n) #define outsw_swapw(port, addr, n) raw_outsw_swapw((u16 *)port, addr, n)
#endif #endif
#ifdef CONFIG_BLK_DEV_FALCON_IDE
#define IDE_ARCH_LOCK
extern int falconide_intr_lock;
static __inline__ void ide_release_lock (void)
{
if (MACH_IS_ATARI) {
if (falconide_intr_lock == 0) {
printk("ide_release_lock: bug\n");
return;
}
falconide_intr_lock = 0;
stdma_release();
}
}
static __inline__ void
ide_get_lock(irq_handler_t handler, void *data)
{
if (MACH_IS_ATARI) {
if (falconide_intr_lock == 0) {
if (in_interrupt() > 0)
panic( "Falcon IDE hasn't ST-DMA lock in interrupt" );
stdma_lock(handler, data);
falconide_intr_lock = 1;
}
}
}
#endif /* CONFIG_BLK_DEV_FALCON_IDE */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _M68K_IDE_H */ #endif /* _M68K_IDE_H */
...@@ -40,8 +40,27 @@ ...@@ -40,8 +40,27 @@
* which is shared between several drivers. * which is shared between several drivers.
*/ */
int falconide_intr_lock; static int falconide_intr_lock;
EXPORT_SYMBOL(falconide_intr_lock);
static void falconide_release_lock(void)
{
if (falconide_intr_lock == 0) {
printk(KERN_ERR "%s: bug\n", __func__);
return;
}
falconide_intr_lock = 0;
stdma_release();
}
static void falconide_get_lock(irq_handler_t handler, void *data)
{
if (falconide_intr_lock == 0) {
if (in_interrupt() > 0)
panic("Falcon IDE hasn't ST-DMA lock in interrupt");
stdma_lock(handler, data);
falconide_intr_lock = 1;
}
}
static void falconide_input_data(ide_drive_t *drive, struct request *rq, static void falconide_input_data(ide_drive_t *drive, struct request *rq,
void *buf, unsigned int len) void *buf, unsigned int len)
...@@ -81,6 +100,8 @@ static const struct ide_tp_ops falconide_tp_ops = { ...@@ -81,6 +100,8 @@ static const struct ide_tp_ops falconide_tp_ops = {
}; };
static const struct ide_port_info falconide_port_info = { static const struct ide_port_info falconide_port_info = {
.get_lock = falconide_get_lock,
.release_lock = falconide_release_lock,
.tp_ops = &falconide_tp_ops, .tp_ops = &falconide_tp_ops,
.host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_SERIALIZE, .host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_SERIALIZE,
}; };
...@@ -132,9 +153,9 @@ static int __init falconide_init(void) ...@@ -132,9 +153,9 @@ static int __init falconide_init(void)
goto err; goto err;
} }
ide_get_lock(NULL, NULL); falconide_get_lock(NULL, NULL);
rc = ide_host_register(host, &falconide_port_info, hws); rc = ide_host_register(host, &falconide_port_info, hws);
ide_release_lock(); falconide_release_lock();
if (rc) if (rc)
goto err_free; goto err_free;
......
...@@ -501,8 +501,8 @@ static inline int ide_lock_host(struct ide_host *host, ide_hwif_t *hwif) ...@@ -501,8 +501,8 @@ static inline int ide_lock_host(struct ide_host *host, ide_hwif_t *hwif)
if (host->host_flags & IDE_HFLAG_SERIALIZE) { if (host->host_flags & IDE_HFLAG_SERIALIZE) {
rc = test_and_set_bit_lock(IDE_HOST_BUSY, &host->host_busy); rc = test_and_set_bit_lock(IDE_HOST_BUSY, &host->host_busy);
if (rc == 0) { if (rc == 0) {
/* for atari only */ if (host->get_lock)
ide_get_lock(ide_intr, hwif); host->get_lock(ide_intr, hwif);
} }
} }
return rc; return rc;
...@@ -511,8 +511,8 @@ static inline int ide_lock_host(struct ide_host *host, ide_hwif_t *hwif) ...@@ -511,8 +511,8 @@ static inline int ide_lock_host(struct ide_host *host, ide_hwif_t *hwif)
static inline void ide_unlock_host(struct ide_host *host) static inline void ide_unlock_host(struct ide_host *host)
{ {
if (host->host_flags & IDE_HFLAG_SERIALIZE) { if (host->host_flags & IDE_HFLAG_SERIALIZE) {
/* for atari only */ if (host->release_lock)
ide_release_lock(); host->release_lock();
clear_bit_unlock(IDE_HOST_BUSY, &host->host_busy); clear_bit_unlock(IDE_HOST_BUSY, &host->host_busy);
} }
} }
......
...@@ -1325,6 +1325,8 @@ struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws) ...@@ -1325,6 +1325,8 @@ struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws)
if (d) { if (d) {
host->init_chipset = d->init_chipset; host->init_chipset = d->init_chipset;
host->get_lock = d->get_lock;
host->release_lock = d->release_lock;
host->host_flags = d->host_flags; host->host_flags = d->host_flags;
} }
......
...@@ -202,12 +202,6 @@ static inline void ide_std_init_ports(hw_regs_t *hw, ...@@ -202,12 +202,6 @@ static inline void ide_std_init_ports(hw_regs_t *hw,
#define MAX_HWIFS 10 #define MAX_HWIFS 10
/* Currently only Atari needs it */
#ifndef IDE_ARCH_LOCK
# define ide_release_lock() do {} while (0)
# define ide_get_lock(hdlr, data) do {} while (0)
#endif /* IDE_ARCH_LOCK */
/* /*
* Now for the data we need to maintain per-drive: ide_drive_t * Now for the data we need to maintain per-drive: ide_drive_t
*/ */
...@@ -845,8 +839,14 @@ struct ide_host { ...@@ -845,8 +839,14 @@ struct ide_host {
ide_hwif_t *ports[MAX_HOST_PORTS + 1]; ide_hwif_t *ports[MAX_HOST_PORTS + 1];
unsigned int n_ports; unsigned int n_ports;
struct device *dev[2]; struct device *dev[2];
int (*init_chipset)(struct pci_dev *); int (*init_chipset)(struct pci_dev *);
void (*get_lock)(irq_handler_t, void *);
void (*release_lock)(void);
irq_handler_t irq_handler; irq_handler_t irq_handler;
unsigned long host_flags; unsigned long host_flags;
void *host_priv; void *host_priv;
ide_hwif_t *cur_port; /* for hosts requiring serialization */ ide_hwif_t *cur_port; /* for hosts requiring serialization */
...@@ -1358,7 +1358,12 @@ enum { ...@@ -1358,7 +1358,12 @@ enum {
struct ide_port_info { struct ide_port_info {
char *name; char *name;
int (*init_chipset)(struct pci_dev *); int (*init_chipset)(struct pci_dev *);
void (*get_lock)(irq_handler_t, void *);
void (*release_lock)(void);
void (*init_iops)(ide_hwif_t *); void (*init_iops)(ide_hwif_t *);
void (*init_hwif)(ide_hwif_t *); void (*init_hwif)(ide_hwif_t *);
int (*init_dma)(ide_hwif_t *, int (*init_dma)(ide_hwif_t *,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment