[PATCH 6/9] block: xd: avoid some forward declarations

2013-02-12 Thread Linus Walleij
This moves the code around so that we can avoid a dozen
forward-declarations, then move the few remaining ones above the
table that use them. No semantic changes.

Signed-off-by: Linus Walleij 
---
 drivers/block/xd.c | 801 +++--
 drivers/block/xd.h |  33 ---
 2 files changed, 415 insertions(+), 419 deletions(-)

diff --git a/drivers/block/xd.c b/drivers/block/xd.c
index 9e00753..ffa6e76 100644
--- a/drivers/block/xd.c
+++ b/drivers/block/xd.c
@@ -121,6 +121,20 @@ static struct xd_info xd_info[XD_MAXDRIVES];
 #define xd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
 static char *xd_dma_buffer;
 
+/* card specific setup and geometry gathering code */
+static void xd_dtc_init_controller (unsigned int address);
+static void xd_dtc5150cx_init_drive (u_char drive);
+static void xd_dtc_init_drive (u_char drive);
+static void xd_wd_init_controller (unsigned int address);
+static void xd_wd_init_drive (u_char drive);
+static void xd_seagate_init_controller (unsigned int address);
+static void xd_seagate_init_drive (u_char drive);
+static void xd_omti_init_controller (unsigned int address);
+static void xd_omti_init_drive (u_char drive);
+static void xd_xebec_init_controller (unsigned int address);
+static void xd_xebec_init_drive (u_char drive);
+static void xd_override_init_drive (u_char drive);
+
 static struct xd_signature xd_sigs[] __initdata = {
{ 0x,"Override geometry handler",NULL,xd_override_init_drive,"n 
unknown" }, /* Pat Mackinlay, p...@it.com.au */
{ 0x0008,"[BXD06 (C) DTC 
17-MAY-1985]",xd_dtc_init_controller,xd_dtc5150cx_init_drive," DTC 5150CX" }, 
/* Andrzej Krzysztofowicz, an...@mif.pg.gda.pl */
@@ -150,13 +164,6 @@ static DEFINE_SPINLOCK(xd_lock);
 
 static struct gendisk *xd_gendisk[2];
 
-static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
-
-static const struct block_device_operations xd_fops = {
-   .owner  = THIS_MODULE,
-   .ioctl  = xd_ioctl,
-   .getgeo = xd_getgeo,
-};
 static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int);
 static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors;
 static u_char xd_override __initdata = 0, xd_type __initdata = 0;
@@ -171,251 +178,206 @@ static bool nodma = XD_DONT_USE_DMA;
 
 static struct request_queue *xd_queue;
 
-/* xd_init: register the block device number and set up pointer tables */
-static int __init xd_init(void)
+/**
+ * xd_setup_dma() - set up the DMA controller for a data transfer
+ */
+static u_char xd_setup_dma(u_char mode, u_char *buffer, u_int count)
 {
-   u_char i,controller;
-   unsigned int address;
-   int err;
+   unsigned long f;
 
-#ifdef MODULE
-   {
-   u_char count = 0;
-   for (i = 4; i > 0; i--)
-   if (((xd[i] = xd[i-1]) >= 0) && !count)
-   count = i;
-   if ((xd[0] = count))
-   do_xd_setup(xd);
+   if (nodma)
+   return (PIO_MODE);
+   if (((unsigned long) buffer & 0x) != (((unsigned long) buffer + 
count) & 0x)) {
+#ifdef DEBUG_OTHER
+   printk("xd_setup_dma: using PIO, transfer overlaps 64k 
boundary\n");
+#endif /* DEBUG_OTHER */
+   return (PIO_MODE);
}
-#endif
 
-   init_timer (_watchdog_int); xd_watchdog_int.function = xd_watchdog;
-
-   err = -EBUSY;
-   if (register_blkdev(XT_DISK_MAJOR, "xd"))
-   goto out1;
+   f=claim_dma_lock();
+   disable_dma(xd_dma);
+   clear_dma_ff(xd_dma);
+   set_dma_mode(xd_dma,mode);
+   set_dma_addr(xd_dma, (unsigned long) buffer);
+   set_dma_count(xd_dma,count);
 
-   err = -ENOMEM;
-   xd_queue = blk_init_queue(do_xd_request, _lock);
-   if (!xd_queue)
-   goto out1a;
+   release_dma_lock(f);
 
-   if (xd_detect(,)) {
+   return (DMA_MODE); /* use DMA and INT */
+}
 
-   printk("Detected a%s controller (type %d) at address %06x\n",
-   xd_sigs[controller].name,controller,address);
-   if (!request_region(xd_iobase,4,"xd")) {
-   printk("xd: Ports at 0x%x are not available\n",
-   xd_iobase);
-   goto out2;
-   }
-   if (controller)
-   xd_sigs[controller].init_controller(address);
-   xd_drives = xd_initdrives(xd_sigs[controller].init_drive);
+/**
+ * xd_build() - put stuff into an array in a format suitable for
+ * the controller
+ */
+static u_char *xd_build(u_char *cmdblk, u_char command, u_char drive,
+   u_char head, u_short cylinder, u_char sector,
+   u_char count, u_char control)
+{
+   cmdblk[0] = command;
+   cmdblk[1] = ((drive & 0x07) << 5) | (head & 0x1F);
+   cmdblk[2] = ((cylinder & 0x300) >> 2) | (sector & 0x3F);
+   cmdblk[3] = cylinder & 0xFF;
+   cmdblk[4] 

[PATCH 6/9] block: xd: avoid some forward declarations

2013-02-12 Thread Linus Walleij
This moves the code around so that we can avoid a dozen
forward-declarations, then move the few remaining ones above the
table that use them. No semantic changes.

Signed-off-by: Linus Walleij linus.wall...@linaro.org
---
 drivers/block/xd.c | 801 +++--
 drivers/block/xd.h |  33 ---
 2 files changed, 415 insertions(+), 419 deletions(-)

diff --git a/drivers/block/xd.c b/drivers/block/xd.c
index 9e00753..ffa6e76 100644
--- a/drivers/block/xd.c
+++ b/drivers/block/xd.c
@@ -121,6 +121,20 @@ static struct xd_info xd_info[XD_MAXDRIVES];
 #define xd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
 static char *xd_dma_buffer;
 
+/* card specific setup and geometry gathering code */
+static void xd_dtc_init_controller (unsigned int address);
+static void xd_dtc5150cx_init_drive (u_char drive);
+static void xd_dtc_init_drive (u_char drive);
+static void xd_wd_init_controller (unsigned int address);
+static void xd_wd_init_drive (u_char drive);
+static void xd_seagate_init_controller (unsigned int address);
+static void xd_seagate_init_drive (u_char drive);
+static void xd_omti_init_controller (unsigned int address);
+static void xd_omti_init_drive (u_char drive);
+static void xd_xebec_init_controller (unsigned int address);
+static void xd_xebec_init_drive (u_char drive);
+static void xd_override_init_drive (u_char drive);
+
 static struct xd_signature xd_sigs[] __initdata = {
{ 0x,Override geometry handler,NULL,xd_override_init_drive,n 
unknown }, /* Pat Mackinlay, p...@it.com.au */
{ 0x0008,[BXD06 (C) DTC 
17-MAY-1985],xd_dtc_init_controller,xd_dtc5150cx_init_drive, DTC 5150CX }, 
/* Andrzej Krzysztofowicz, an...@mif.pg.gda.pl */
@@ -150,13 +164,6 @@ static DEFINE_SPINLOCK(xd_lock);
 
 static struct gendisk *xd_gendisk[2];
 
-static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
-
-static const struct block_device_operations xd_fops = {
-   .owner  = THIS_MODULE,
-   .ioctl  = xd_ioctl,
-   .getgeo = xd_getgeo,
-};
 static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int);
 static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors;
 static u_char xd_override __initdata = 0, xd_type __initdata = 0;
@@ -171,251 +178,206 @@ static bool nodma = XD_DONT_USE_DMA;
 
 static struct request_queue *xd_queue;
 
-/* xd_init: register the block device number and set up pointer tables */
-static int __init xd_init(void)
+/**
+ * xd_setup_dma() - set up the DMA controller for a data transfer
+ */
+static u_char xd_setup_dma(u_char mode, u_char *buffer, u_int count)
 {
-   u_char i,controller;
-   unsigned int address;
-   int err;
+   unsigned long f;
 
-#ifdef MODULE
-   {
-   u_char count = 0;
-   for (i = 4; i  0; i--)
-   if (((xd[i] = xd[i-1]) = 0)  !count)
-   count = i;
-   if ((xd[0] = count))
-   do_xd_setup(xd);
+   if (nodma)
+   return (PIO_MODE);
+   if (((unsigned long) buffer  0x) != (((unsigned long) buffer + 
count)  0x)) {
+#ifdef DEBUG_OTHER
+   printk(xd_setup_dma: using PIO, transfer overlaps 64k 
boundary\n);
+#endif /* DEBUG_OTHER */
+   return (PIO_MODE);
}
-#endif
 
-   init_timer (xd_watchdog_int); xd_watchdog_int.function = xd_watchdog;
-
-   err = -EBUSY;
-   if (register_blkdev(XT_DISK_MAJOR, xd))
-   goto out1;
+   f=claim_dma_lock();
+   disable_dma(xd_dma);
+   clear_dma_ff(xd_dma);
+   set_dma_mode(xd_dma,mode);
+   set_dma_addr(xd_dma, (unsigned long) buffer);
+   set_dma_count(xd_dma,count);
 
-   err = -ENOMEM;
-   xd_queue = blk_init_queue(do_xd_request, xd_lock);
-   if (!xd_queue)
-   goto out1a;
+   release_dma_lock(f);
 
-   if (xd_detect(controller,address)) {
+   return (DMA_MODE); /* use DMA and INT */
+}
 
-   printk(Detected a%s controller (type %d) at address %06x\n,
-   xd_sigs[controller].name,controller,address);
-   if (!request_region(xd_iobase,4,xd)) {
-   printk(xd: Ports at 0x%x are not available\n,
-   xd_iobase);
-   goto out2;
-   }
-   if (controller)
-   xd_sigs[controller].init_controller(address);
-   xd_drives = xd_initdrives(xd_sigs[controller].init_drive);
+/**
+ * xd_build() - put stuff into an array in a format suitable for
+ * the controller
+ */
+static u_char *xd_build(u_char *cmdblk, u_char command, u_char drive,
+   u_char head, u_short cylinder, u_char sector,
+   u_char count, u_char control)
+{
+   cmdblk[0] = command;
+   cmdblk[1] = ((drive  0x07)  5) | (head  0x1F);
+   cmdblk[2] = ((cylinder  0x300)  2) | (sector  0x3F);
+   cmdblk[3] = cylinder  0xFF;
+