static unsigned char in_sector_offset; /* offset within physical sector,
                                         * expressed in units of 512 bytes */
 
+static inline unsigned char fdc_inb(int fdc, unsigned long addr)
+{
+       return fd_inb(addr);
+}
+
+static inline void fdc_outb(unsigned char value, int fdc, unsigned long addr)
+{
+       fd_outb(value, addr);
+}
+
 static inline bool drive_no_geom(int drive)
 {
        return !current_type[drive] && !ITYPE(drive_state[drive].fd_device);
                  "checking disk change line for drive %d\n", drive);
        debug_dcl(drive_params[drive].flags, "jiffies=%lu\n", jiffies);
        debug_dcl(drive_params[drive].flags, "disk change line=%x\n",
-                 fd_inb(FD_DIR) & 0x80);
+                 fdc_inb(fdc, FD_DIR) & 0x80);
        debug_dcl(drive_params[drive].flags, "flags=%lx\n",
                  drive_state[drive].flags);
 
        if (drive_params[drive].flags & FD_BROKEN_DCL)
                return test_bit(FD_DISK_CHANGED_BIT,
                                &drive_state[drive].flags);
-       if ((fd_inb(FD_DIR) ^ drive_params[drive].flags) & 0x80) {
+       if ((fdc_inb(fdc, FD_DIR) ^ drive_params[drive].flags) & 0x80) {
                set_bit(FD_VERIFY_BIT, &drive_state[drive].flags);
                                        /* verify write protection */
 
                        disk_change(drive);
                }
                fdc_state[fdc].dor = newdor;
-               fd_outb(newdor, FD_DOR);
+               fdc_outb(newdor, fdc, FD_DOR);
 
                unit = newdor & 0x3;
                if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
 {
        if (drive_params[current_drive].select_delay)
                return;
-       fd_outb(fdc_state[fdc].dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
-       fd_outb(fdc_state[fdc].dor, FD_DOR);
+       fdc_outb(fdc_state[fdc].dor & ~(0x10 << UNIT(current_drive)), fdc, FD_DOR);
+       fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR);
        drive_state[current_drive].select_date = jiffies;
 }
 
 #endif
        if (fdc_state[fdc].rawcmd == 2)
                reset_fdc_info(1);
-       if (fd_inb(FD_STATUS) != STATUS_READY)
+       if (fdc_inb(fdc, FD_STATUS) != STATUS_READY)
                fdc_state[fdc].reset = 1;
 }
 
        if (fdc_state[fdc].reset)
                return -1;
        for (counter = 0; counter < 10000; counter++) {
-               status = fd_inb(FD_STATUS);
+               status = fdc_inb(fdc, FD_STATUS);
                if (status & STATUS_READY)
                        return status;
        }
                return -1;
 
        if (is_ready_state(status)) {
-               fd_outb(byte, FD_DATA);
+               fdc_outb(byte, fdc, FD_DATA);
                output_log[output_log_pos].data = byte;
                output_log[output_log_pos].status = status;
                output_log[output_log_pos].jiffies = jiffies;
                        return i;
                }
                if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
-                       reply_buffer[i] = fd_inb(FD_DATA);
+                       reply_buffer[i] = fdc_inb(fdc, FD_DATA);
                else
                        break;
        }
                return 0;
 
        /* Set dtr */
-       fd_outb(raw_cmd->rate & 3, FD_DCR);
+       fdc_outb(raw_cmd->rate & 3, fdc, FD_DCR);
 
        /* TODO: some FDC/drive combinations (C&T 82C711 with TEAC 1.2MB)
         * need a stabilization period of several milliseconds to be
        release_dma_lock(flags);
 
        if (fdc_state[fdc].version >= FDC_82072A)
-               fd_outb(0x80 | (fdc_state[fdc].dtr & 3), FD_STATUS);
+               fdc_outb(0x80 | (fdc_state[fdc].dtr & 3), fdc, FD_STATUS);
        else {
-               fd_outb(fdc_state[fdc].dor & ~0x04, FD_DOR);
+               fdc_outb(fdc_state[fdc].dor & ~0x04, fdc, FD_DOR);
                udelay(FD_RESET_DELAY);
-               fd_outb(fdc_state[fdc].dor, FD_DOR);
+               fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR);
        }
 }
 
        print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
                       reply_buffer, resultsize, true);
 
-       pr_info("status=%x\n", fd_inb(FD_STATUS));
+       pr_info("status=%x\n", fdc_inb(fdc, FD_STATUS));
        pr_info("fdc_busy=%lu\n", fdc_busy);
        if (do_floppy)
                pr_info("do_floppy=%ps\n", do_floppy);
        for (fdc = 0; fdc < N_FDC; fdc++) {
                if (fdc_state[fdc].address != -1) {
                        reset_fdc_info(1);
-                       fd_outb(fdc_state[fdc].dor, FD_DOR);
+                       fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR);
                }
        }
        fdc = 0;
 
        for (fdc = 0; fdc < N_FDC; fdc++)
                if (fdc_state[fdc].address != -1)
-                       fd_outb(fdc_state[fdc].dor, FD_DOR);
+                       fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR);
        /*
         * The driver will try and free resources and relies on us
         * to know if they were allocated or not.