From: Michael Schmitz <schmitzmic@gmail.com>
To: Finn Thain <fthain@linux-m68k.org>,
Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Richard Zidlicky <rz@linux-m68k.org>,
Jens Axboe <axboe@kernel.dk>,
"David S. Miller" <davem@davemloft.net>,
linux-m68k@lists.linux-m68k.org, linux-kernel@vger.kernel.org,
linux-ide@vger.kernel.org
Subject: Re: [PATCH] m68k/q40: Replace q40ide with pata_falcon and falconide
Date: Mon, 7 Jun 2021 09:10:24 +1200 [thread overview]
Message-ID: <e250cffb-9edd-1b84-3826-58079758b35a@gmail.com> (raw)
In-Reply-To: <352239036981177050c296ca3deb84a102d9faa2.1622970906.git.fthain@linux-m68k.org>
Hi Finn,
are there any substantial changes from what I'd tested before? Your
patch conflicts with (I think) the Mac IDE patches now in Geert's tree,
and I'd rather avoid hand-patching the lot if at all possible:
m68k_q40_Replace_q40ide_with_pata_falcon_and_falconide
Applying: m68k/q40: Replace q40ide with pata_falcon and falconide
error: patch failed: arch/m68k/configs/multi_defconfig:351
error: arch/m68k/configs/multi_defconfig: patch does not apply
error: patch failed: drivers/ide/Kconfig:731
error: drivers/ide/Kconfig: patch does not apply
error: patch failed: drivers/ide/Makefile:29
error: drivers/ide/Makefile: patch does not apply
What's your baseline for this patch?
(In the alternative: just add my Tested-by if nothing changed aside from
the IO region reservation)
Cheers,
Michael
Am 06.06.2021 um 21:15 schrieb Finn Thain:
> Replace the q40ide driver with falconide and pata_falcon platform
> drivers. This allows q40 machines to migrate from the deprecated IDE
> subsystem to libata.
>
> Enhance the byte-swapping falconide and pata_falcon platform drivers to
> accept an irq resource, for use on q40. Atari ST-DMA IRQ arrangements seem
> to co-exist with q40 IRQ arrangements without too much mess.
>
> The new IO resources were added solely for the purpose of making
> request_region() reservations identical to those made by q40ide: these
> regions aren't used for actual IO.
>
> Cc: Michael Schmitz <schmitzmic@gmail.com>
> Cc: Richard Zidlicky <rz@linux-m68k.org>
> Cc: Jens Axboe <axboe@kernel.dk>
> Cc: "David S. Miller" <davem@davemloft.net>
> Signed-off-by: Finn Thain <fthain@linux-m68k.org>
> ---
> Note that q40ide, falconide and pata_falcon all use the same accessors
> (raw_insw_swapw, raw_insw, raw_outsw_swapw, raw_outsw) and hence all
> three drivers are affected by the bug relating to CONFIG_ISA and
> CONFIG_ATARI_ROM_ISA which Michael has been working on recently.
> This patch doesn't make that issue any better or worse.
> ---
> arch/m68k/atari/config.c | 12 +--
> arch/m68k/configs/multi_defconfig | 1 -
> arch/m68k/configs/q40_defconfig | 2 +-
> arch/m68k/q40/config.c | 37 +++++--
> drivers/ata/Kconfig | 6 +-
> drivers/ata/pata_falcon.c | 62 ++++++++---
> drivers/ide/Kconfig | 18 +---
> drivers/ide/Makefile | 1 -
> drivers/ide/falconide.c | 75 ++++++++-----
> drivers/ide/q40ide.c | 168 ------------------------------
> 10 files changed, 137 insertions(+), 245 deletions(-)
> delete mode 100644 drivers/ide/q40ide.c
>
> diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c
> index 44f9b5216ac9..261a0f57cc9a 100644
> --- a/arch/m68k/atari/config.c
> +++ b/arch/m68k/atari/config.c
> @@ -875,16 +875,8 @@ static const struct resource atari_scsi_tt_rsrc[] __initconst = {
> #define FALCON_IDE_BASE 0xfff00000
>
> static const struct resource atari_falconide_rsrc[] __initconst = {
> - {
> - .flags = IORESOURCE_MEM,
> - .start = FALCON_IDE_BASE,
> - .end = FALCON_IDE_BASE + 0x39,
> - },
> - {
> - .flags = IORESOURCE_IRQ,
> - .start = IRQ_MFP_FSCSI,
> - .end = IRQ_MFP_FSCSI,
> - },
> + DEFINE_RES_MEM(FALCON_IDE_BASE, 0x38),
> + DEFINE_RES_MEM(FALCON_IDE_BASE + 0x38, 2),
> };
>
> int __init atari_platform_init(void)
> diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig
> index 9ee6d2b4d1f4..f4cafed671cb 100644
> --- a/arch/m68k/configs/multi_defconfig
> +++ b/arch/m68k/configs/multi_defconfig
> @@ -351,7 +351,6 @@ CONFIG_BLK_DEV_PLATFORM=y
> CONFIG_BLK_DEV_GAYLE=y
> CONFIG_BLK_DEV_BUDDHA=y
> CONFIG_BLK_DEV_FALCON_IDE=y
> -CONFIG_BLK_DEV_Q40IDE=y
> CONFIG_RAID_ATTRS=m
> CONFIG_SCSI=y
> CONFIG_BLK_DEV_SD=y
> diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig
> index 3ae421cb24a4..2c25b4096397 100644
> --- a/arch/m68k/configs/q40_defconfig
> +++ b/arch/m68k/configs/q40_defconfig
> @@ -317,7 +317,7 @@ CONFIG_DUMMY_IRQ=m
> CONFIG_IDE=y
> CONFIG_IDE_GD_ATAPI=y
> CONFIG_BLK_DEV_IDECD=y
> -CONFIG_BLK_DEV_Q40IDE=y
> +CONFIG_BLK_DEV_FALCON_IDE=y
> CONFIG_RAID_ATTRS=m
> CONFIG_SCSI=y
> CONFIG_BLK_DEV_SD=y
> diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c
> index d6a423875231..5caf1e5be1c2 100644
> --- a/arch/m68k/q40/config.c
> +++ b/arch/m68k/q40/config.c
> @@ -286,14 +286,39 @@ static int q40_set_rtc_pll(struct rtc_pll_info *pll)
> return -EINVAL;
> }
>
> -static __init int q40_add_kbd_device(void)
> -{
> - struct platform_device *pdev;
> +#define PCIDE_BASE1 0x1f0
> +#define PCIDE_BASE2 0x170
> +#define PCIDE_CTL 0x206
> +
> +static const struct resource q40_pata_rsrc_0[] __initconst = {
> + DEFINE_RES_MEM(q40_isa_io_base + PCIDE_BASE1 * 4, 0x38),
> + DEFINE_RES_MEM(q40_isa_io_base + (PCIDE_BASE1 + PCIDE_CTL) * 4, 2),
> + DEFINE_RES_IO(PCIDE_BASE1, 8),
> + DEFINE_RES_IO(PCIDE_BASE1 + PCIDE_CTL, 1),
> + DEFINE_RES_IRQ(14),
> +};
>
> +static const struct resource q40_pata_rsrc_1[] __initconst = {
> + DEFINE_RES_MEM(q40_isa_io_base + PCIDE_BASE2 * 4, 0x38),
> + DEFINE_RES_MEM(q40_isa_io_base + (PCIDE_BASE2 + PCIDE_CTL) * 4, 2),
> + DEFINE_RES_IO(PCIDE_BASE2, 8),
> + DEFINE_RES_IO(PCIDE_BASE2 + PCIDE_CTL, 1),
> + DEFINE_RES_IRQ(15),
> +};
> +
> +static __init int q40_platform_init(void)
> +{
> if (!MACH_IS_Q40)
> return -ENODEV;
>
> - pdev = platform_device_register_simple("q40kbd", -1, NULL, 0);
> - return PTR_ERR_OR_ZERO(pdev);
> + platform_device_register_simple("q40kbd", -1, NULL, 0);
> +
> + platform_device_register_simple("atari-falcon-ide", 0, q40_pata_rsrc_0,
> + ARRAY_SIZE(q40_pata_rsrc_0));
> +
> + platform_device_register_simple("atari-falcon-ide", 1, q40_pata_rsrc_1,
> + ARRAY_SIZE(q40_pata_rsrc_1));
> +
> + return 0;
> }
> -arch_initcall(q40_add_kbd_device);
> +arch_initcall(q40_platform_init);
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index 030cb32da980..b7a5abee2147 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
> @@ -1015,11 +1015,11 @@ config PATA_CMD640_PCI
> If unsure, say N.
>
> config PATA_FALCON
> - tristate "Atari Falcon PATA support"
> - depends on M68K && ATARI
> + tristate "Atari Falcon and Q40/Q60 PATA support"
> + depends on M68K && (ATARI || Q40)
> help
> This option enables support for the on-board IDE
> - interface on the Atari Falcon.
> + interface on the Atari Falcon and Q40/Q60.
>
> If unsure, say N.
>
> diff --git a/drivers/ata/pata_falcon.c b/drivers/ata/pata_falcon.c
> index 27b0952fde6b..9d0dd8f4c21c 100644
> --- a/drivers/ata/pata_falcon.c
> +++ b/drivers/ata/pata_falcon.c
> @@ -33,8 +33,6 @@
> #define DRV_NAME "pata_falcon"
> #define DRV_VERSION "0.1.0"
>
> -#define ATA_HD_CONTROL 0x39
> -
> static struct scsi_host_template pata_falcon_sht = {
> ATA_PIO_SHT(DRV_NAME),
> };
> @@ -121,23 +119,42 @@ static struct ata_port_operations pata_falcon_ops = {
>
> static int __init pata_falcon_init_one(struct platform_device *pdev)
> {
> - struct resource *res;
> + struct resource *base_mem_res, *ctl_mem_res;
> + struct resource *base_res, *ctl_res, *irq_res;
> struct ata_host *host;
> struct ata_port *ap;
> void __iomem *base;
> + int irq = 0;
>
> - dev_info(&pdev->dev, "Atari Falcon PATA controller\n");
> + dev_info(&pdev->dev, "Atari Falcon and Q40/Q60 PATA controller\n");
>
> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!res)
> - return -ENODEV;
> + base_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
> + if (base_res && !devm_request_region(&pdev->dev, base_res->start,
> + resource_size(base_res), DRV_NAME)) {
> + dev_err(&pdev->dev, "resources busy\n");
> + return -EBUSY;
> + }
>
> - if (!devm_request_mem_region(&pdev->dev, res->start,
> - resource_size(res), DRV_NAME)) {
> + ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
> + if (ctl_res && !devm_request_region(&pdev->dev, ctl_res->start,
> + resource_size(ctl_res), DRV_NAME)) {
> dev_err(&pdev->dev, "resources busy\n");
> return -EBUSY;
> }
>
> + base_mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!base_mem_res)
> + return -ENODEV;
> + if (!devm_request_mem_region(&pdev->dev, base_mem_res->start,
> + resource_size(base_mem_res), DRV_NAME)) {
> + dev_err(&pdev->dev, "resources busy\n");
> + return -EBUSY;
> + }
> +
> + ctl_mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> + if (!ctl_mem_res)
> + return -ENODEV;
> +
> /* allocate host */
> host = ata_host_alloc(&pdev->dev, 1);
> if (!host)
> @@ -147,10 +164,10 @@ static int __init pata_falcon_init_one(struct platform_device *pdev)
> ap->ops = &pata_falcon_ops;
> ap->pio_mask = ATA_PIO4;
> ap->flags |= ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY;
> - ap->flags |= ATA_FLAG_PIO_POLLING;
>
> - base = (void __iomem *)res->start;
> - ap->ioaddr.data_addr = base;
> + base = (void __iomem *)base_mem_res->start;
> + /* N.B. this assumes data_addr will be used for word-sized I/O only */
> + ap->ioaddr.data_addr = base + 0 + 0 * 4;
> ap->ioaddr.error_addr = base + 1 + 1 * 4;
> ap->ioaddr.feature_addr = base + 1 + 1 * 4;
> ap->ioaddr.nsect_addr = base + 1 + 2 * 4;
> @@ -161,14 +178,25 @@ static int __init pata_falcon_init_one(struct platform_device *pdev)
> ap->ioaddr.status_addr = base + 1 + 7 * 4;
> ap->ioaddr.command_addr = base + 1 + 7 * 4;
>
> - ap->ioaddr.altstatus_addr = base + ATA_HD_CONTROL;
> - ap->ioaddr.ctl_addr = base + ATA_HD_CONTROL;
> + base = (void __iomem *)ctl_mem_res->start;
> + ap->ioaddr.altstatus_addr = base + 1;
> + ap->ioaddr.ctl_addr = base + 1;
>
> - ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", (unsigned long)base,
> - (unsigned long)base + ATA_HD_CONTROL);
> + ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx",
> + (unsigned long)base_mem_res->start,
> + (unsigned long)ctl_mem_res->start);
> +
> + irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
> + if (irq_res && irq_res->start > 0) {
> + irq = irq_res->start;
> + } else {
> + ap->flags |= ATA_FLAG_PIO_POLLING;
> + ata_port_desc(ap, "no IRQ, using PIO polling");
> + }
>
> /* activate */
> - return ata_host_activate(host, 0, NULL, 0, &pata_falcon_sht);
> + return ata_host_activate(host, irq, irq ? ata_sff_interrupt : NULL,
> + IRQF_SHARED, &pata_falcon_sht);
> }
>
> static int __exit pata_falcon_remove_one(struct platform_device *pdev)
> diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
> index 8ce4a5878d0c..8af1ac69e5f8 100644
> --- a/drivers/ide/Kconfig
> +++ b/drivers/ide/Kconfig
> @@ -731,21 +731,13 @@ config BLK_DEV_BUDDHA
> to one of its IDE interfaces.
>
> config BLK_DEV_FALCON_IDE
> - tristate "Falcon IDE interface support"
> - depends on ATARI
> + tristate "Falcon and Q40/Q60 IDE interface support"
> + depends on ATARI || Q40
> help
> This is the IDE driver for the on-board IDE interface on the Atari
> - Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
> - disks, CD-ROM drives, etc.) that are connected to the on-board IDE
> - interface.
> -
> -config BLK_DEV_Q40IDE
> - tristate "Q40/Q60 IDE interface support"
> - depends on Q40
> - help
> - Enable the on-board IDE controller in the Q40/Q60. This should
> - normally be on; disable it only if you are running a custom hard
> - drive subsystem through an expansion card.
> + Falcon and Q40/Q60. Say Y if you have such a machine and want to use
> + IDE devices (hard disks, CD-ROM drives, etc.) that are connected to
> + the on-board IDE interface.
>
> config BLK_DEV_PALMCHIP_BK3710
> tristate "Palmchip bk3710 IDE controller support"
> diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile
> index 45a1c0463bed..991eb72a786b 100644
> --- a/drivers/ide/Makefile
> +++ b/drivers/ide/Makefile
> @@ -29,7 +29,6 @@ obj-$(CONFIG_BLK_DEV_4DRIVES) += ide-4drives.o
>
> obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o
> obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o
> -obj-$(CONFIG_BLK_DEV_Q40IDE) += q40ide.o
> obj-$(CONFIG_BLK_DEV_BUDDHA) += buddha.o
>
> obj-$(CONFIG_BLK_DEV_AEC62XX) += aec62xx.o
> diff --git a/drivers/ide/falconide.c b/drivers/ide/falconide.c
> index bb86d84558d9..fce68412b3c9 100644
> --- a/drivers/ide/falconide.c
> +++ b/drivers/ide/falconide.c
> @@ -25,12 +25,6 @@
>
> #define DRV_NAME "falconide"
>
> - /*
> - * Offsets from base address
> - */
> -
> -#define ATA_HD_CONTROL 0x39
> -
> /*
> * falconide_intr_lock is used to obtain access to the IDE interrupt,
> * which is shared between several drivers.
> @@ -107,7 +101,8 @@ static const struct ide_port_info falconide_port_info = {
> .chipset = ide_generic,
> };
>
> -static void __init falconide_setup_ports(struct ide_hw *hw, unsigned long base)
> +static void __init falconide_setup_ports(struct ide_hw *hw, unsigned long base,
> + unsigned long ctl, int irq)
> {
> int i;
>
> @@ -118,9 +113,9 @@ static void __init falconide_setup_ports(struct ide_hw *hw, unsigned long base)
> for (i = 1; i < 8; i++)
> hw->io_ports_array[i] = base + 1 + i * 4;
>
> - hw->io_ports.ctl_addr = base + ATA_HD_CONTROL;
> + hw->io_ports.ctl_addr = ctl + 1;
>
> - hw->irq = IRQ_MFP_IDE;
> + hw->irq = irq;
> }
>
> /*
> @@ -129,37 +124,69 @@ static void __init falconide_setup_ports(struct ide_hw *hw, unsigned long base)
>
> static int __init falconide_init(struct platform_device *pdev)
> {
> - struct resource *res;
> + struct resource *base_mem_res, *ctl_mem_res;
> + struct resource *base_res, *ctl_res, *irq_res;
> struct ide_host *host;
> struct ide_hw hw, *hws[] = { &hw };
> - unsigned long base;
> int rc;
> + int irq;
> +
> + dev_info(&pdev->dev, "Atari Falcon and Q40/Q60 IDE controller\n");
> +
> + base_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
> + if (base_res && !devm_request_region(&pdev->dev, base_res->start,
> + resource_size(base_res), DRV_NAME)) {
> + dev_err(&pdev->dev, "resources busy\n");
> + return -EBUSY;
> + }
>
> - dev_info(&pdev->dev, "Atari Falcon IDE controller\n");
> + ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
> + if (ctl_res && !devm_request_region(&pdev->dev, ctl_res->start,
> + resource_size(ctl_res), DRV_NAME)) {
> + dev_err(&pdev->dev, "resources busy\n");
> + return -EBUSY;
> + }
>
> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> - if (!res)
> + base_mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!base_mem_res)
> return -ENODEV;
>
> - if (!devm_request_mem_region(&pdev->dev, res->start,
> - resource_size(res), DRV_NAME)) {
> + if (!devm_request_mem_region(&pdev->dev, base_mem_res->start,
> + resource_size(base_mem_res), DRV_NAME)) {
> dev_err(&pdev->dev, "resources busy\n");
> return -EBUSY;
> }
>
> - base = (unsigned long)res->start;
> + ctl_mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> + if (!ctl_mem_res)
> + return -ENODEV;
> +
> + if (MACH_IS_ATARI) {
> + irq = IRQ_MFP_IDE;
> + } else {
> + irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
> + if (irq_res && irq_res->start > 0)
> + irq = irq_res->start;
> + else
> + return -ENODEV;
> + }
>
> - falconide_setup_ports(&hw, base);
> + falconide_setup_ports(&hw, base_mem_res->start, ctl_mem_res->start, irq);
>
> host = ide_host_alloc(&falconide_port_info, hws, 1);
> - if (host == NULL) {
> - rc = -ENOMEM;
> - goto err;
> + if (!host)
> + return -ENOMEM;
> +
> + if (!MACH_IS_ATARI) {
> + host->get_lock = NULL;
> + host->release_lock = NULL;
> }
>
> - falconide_get_lock(NULL, NULL);
> + if (host->get_lock)
> + host->get_lock(NULL, NULL);
> rc = ide_host_register(host, &falconide_port_info, hws);
> - falconide_release_lock();
> + if (host->release_lock)
> + host->release_lock();
>
> if (rc)
> goto err_free;
> @@ -168,8 +195,6 @@ static int __init falconide_init(struct platform_device *pdev)
> return 0;
> err_free:
> ide_host_free(host);
> -err:
> - release_mem_region(res->start, resource_size(res));
> return rc;
> }
>
> diff --git a/drivers/ide/q40ide.c b/drivers/ide/q40ide.c
> deleted file mode 100644
> index ecd0a69245f6..000000000000
> --- a/drivers/ide/q40ide.c
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/*
> - * Q40 I/O port IDE Driver
> - *
> - * (c) Richard Zidlicky
> - *
> - * 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/types.h>
> -#include <linux/mm.h>
> -#include <linux/interrupt.h>
> -#include <linux/blkdev.h>
> -#include <linux/ide.h>
> -#include <linux/module.h>
> -
> -#include <asm/ide.h>
> -
> - /*
> - * Bases of the IDE interfaces
> - */
> -
> -#define Q40IDE_NUM_HWIFS 2
> -
> -#define PCIDE_BASE1 0x1f0
> -#define PCIDE_BASE2 0x170
> -#define PCIDE_BASE3 0x1e8
> -#define PCIDE_BASE4 0x168
> -#define PCIDE_BASE5 0x1e0
> -#define PCIDE_BASE6 0x160
> -
> -static const unsigned long pcide_bases[Q40IDE_NUM_HWIFS] = {
> - PCIDE_BASE1, PCIDE_BASE2, /* PCIDE_BASE3, PCIDE_BASE4 , PCIDE_BASE5,
> - PCIDE_BASE6 */
> -};
> -
> -static int q40ide_default_irq(unsigned long base)
> -{
> - switch (base) {
> - case 0x1f0: return 14;
> - case 0x170: return 15;
> - case 0x1e8: return 11;
> - default:
> - return 0;
> - }
> -}
> -
> -
> -/*
> - * Addresses are pretranslated for Q40 ISA access.
> - */
> -static void q40_ide_setup_ports(struct ide_hw *hw, unsigned long base, int irq)
> -{
> - memset(hw, 0, sizeof(*hw));
> - /* BIG FAT WARNING:
> - assumption: only DATA port is ever used in 16 bit mode */
> - hw->io_ports.data_addr = Q40_ISA_IO_W(base);
> - hw->io_ports.error_addr = Q40_ISA_IO_B(base + 1);
> - hw->io_ports.nsect_addr = Q40_ISA_IO_B(base + 2);
> - hw->io_ports.lbal_addr = Q40_ISA_IO_B(base + 3);
> - hw->io_ports.lbam_addr = Q40_ISA_IO_B(base + 4);
> - hw->io_ports.lbah_addr = Q40_ISA_IO_B(base + 5);
> - hw->io_ports.device_addr = Q40_ISA_IO_B(base + 6);
> - hw->io_ports.status_addr = Q40_ISA_IO_B(base + 7);
> - hw->io_ports.ctl_addr = Q40_ISA_IO_B(base + 0x206);
> -
> - hw->irq = irq;
> -}
> -
> -static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd,
> - void *buf, unsigned int len)
> -{
> - unsigned long data_addr = drive->hwif->io_ports.data_addr;
> -
> - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) {
> - __ide_mm_insw(data_addr, buf, (len + 1) / 2);
> - return;
> - }
> -
> - raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
> -}
> -
> -static void q40ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd,
> - void *buf, unsigned int len)
> -{
> - unsigned long data_addr = drive->hwif->io_ports.data_addr;
> -
> - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) {
> - __ide_mm_outsw(data_addr, buf, (len + 1) / 2);
> - return;
> - }
> -
> - raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
> -}
> -
> -/* Q40 has a byte-swapped IDE interface */
> -static const struct ide_tp_ops q40ide_tp_ops = {
> - .exec_command = ide_exec_command,
> - .read_status = ide_read_status,
> - .read_altstatus = ide_read_altstatus,
> - .write_devctl = ide_write_devctl,
> -
> - .dev_select = ide_dev_select,
> - .tf_load = ide_tf_load,
> - .tf_read = ide_tf_read,
> -
> - .input_data = q40ide_input_data,
> - .output_data = q40ide_output_data,
> -};
> -
> -static const struct ide_port_info q40ide_port_info = {
> - .tp_ops = &q40ide_tp_ops,
> - .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA,
> - .irq_flags = IRQF_SHARED,
> - .chipset = ide_generic,
> -};
> -
> -/*
> - * the static array is needed to have the name reported in /proc/ioports,
> - * hwif->name unfortunately isn't available yet
> - */
> -static const char *q40_ide_names[Q40IDE_NUM_HWIFS]={
> - "ide0", "ide1"
> -};
> -
> -/*
> - * Probe for Q40 IDE interfaces
> - */
> -
> -static int __init q40ide_init(void)
> -{
> - int i;
> - struct ide_hw hw[Q40IDE_NUM_HWIFS], *hws[] = { NULL, NULL };
> -
> - if (!MACH_IS_Q40)
> - return -ENODEV;
> -
> - printk(KERN_INFO "ide: Q40 IDE controller\n");
> -
> - for (i = 0; i < Q40IDE_NUM_HWIFS; i++) {
> - const char *name = q40_ide_names[i];
> -
> - if (!request_region(pcide_bases[i], 8, name)) {
> - printk("could not reserve ports %lx-%lx for %s\n",
> - pcide_bases[i],pcide_bases[i]+8,name);
> - continue;
> - }
> - if (!request_region(pcide_bases[i]+0x206, 1, name)) {
> - printk("could not reserve port %lx for %s\n",
> - pcide_bases[i]+0x206,name);
> - release_region(pcide_bases[i], 8);
> - continue;
> - }
> - q40_ide_setup_ports(&hw[i], pcide_bases[i],
> - q40ide_default_irq(pcide_bases[i]));
> -
> - hws[i] = &hw[i];
> - }
> -
> - return ide_host_add(&q40ide_port_info, hws, Q40IDE_NUM_HWIFS, NULL);
> -}
> -
> -module_init(q40ide_init);
> -
> -MODULE_LICENSE("GPL");
>
next prev parent reply other threads:[~2021-06-06 21:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-06 9:15 [PATCH] m68k/q40: Replace q40ide with pata_falcon and falconide Finn Thain
2021-06-06 21:10 ` Michael Schmitz [this message]
2021-06-07 2:07 ` Finn Thain
2021-06-07 3:41 ` Michael Schmitz
2021-06-08 3:01 ` Michael Schmitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e250cffb-9edd-1b84-3826-58079758b35a@gmail.com \
--to=schmitzmic@gmail.com \
--cc=axboe@kernel.dk \
--cc=davem@davemloft.net \
--cc=fthain@linux-m68k.org \
--cc=geert@linux-m68k.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@lists.linux-m68k.org \
--cc=rz@linux-m68k.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).