Skip to content

Commit

Permalink
m68k/atari: Convert Falcon IDE drivers to platform drivers
Browse files Browse the repository at this point in the history
Autoloading of Falcon IDE driver modules requires converting these
drivers to platform drivers.

Add platform device for Falcon IDE interface in Atari platform setup
code. Use this in the pata_falcon driver in place of the simple
platform device set up on the fly.

Convert falconide driver to use the same platform device that is used
by pata_falcon also. (With the introduction of a platform device for
the Atari Falcon IDE interface, the old Falcon IDE driver no longer
loads (resource already claimed by the platform device)).

Tested (as built-in driver) on my Atari Falcon.

Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Link: https://lore.kernel.org/r/1573008449-8226-1-git-send-email-schmitzmic@gmail.com
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
  • Loading branch information
Michael Schmitz authored and Geert Uytterhoeven committed Nov 18, 2019
1 parent 032f128 commit 5ed0794
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 34 deletions.
27 changes: 27 additions & 0 deletions arch/m68k/atari/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -869,8 +869,28 @@ static const struct resource atari_scsi_tt_rsrc[] __initconst = {
};
#endif

/*
* Falcon IDE interface
*/

#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,
},
};

int __init atari_platform_init(void)
{
struct platform_device *pdev;
int rv = 0;

if (!MACH_IS_ATARI)
Expand Down Expand Up @@ -912,6 +932,13 @@ int __init atari_platform_init(void)
atari_scsi_tt_rsrc, ARRAY_SIZE(atari_scsi_tt_rsrc));
#endif

if (ATARIHW_PRESENT(IDE)) {
pdev = platform_device_register_simple("atari-falcon-ide", -1,
atari_falconide_rsrc, ARRAY_SIZE(atari_falconide_rsrc));
if (IS_ERR(pdev))
rv = PTR_ERR(pdev);
}

return rv;
}

Expand Down
42 changes: 28 additions & 14 deletions drivers/ata/pata_falcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
#define DRV_NAME "pata_falcon"
#define DRV_VERSION "0.1.0"

#define ATA_HD_BASE 0xfff00000
#define ATA_HD_CONTROL 0x39

static struct scsi_host_template pata_falcon_sht = {
Expand Down Expand Up @@ -120,24 +119,22 @@ static struct ata_port_operations pata_falcon_ops = {
.set_mode = pata_falcon_set_mode,
};

static int pata_falcon_init_one(void)
static int __init pata_falcon_init_one(struct platform_device *pdev)
{
struct resource *res;
struct ata_host *host;
struct ata_port *ap;
struct platform_device *pdev;
void __iomem *base;

if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE))
return -ENODEV;

pr_info(DRV_NAME ": Atari Falcon PATA controller\n");
dev_info(&pdev->dev, "Atari Falcon PATA controller\n");

pdev = platform_device_register_simple(DRV_NAME, 0, NULL, 0);
if (IS_ERR(pdev))
return PTR_ERR(pdev);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;

if (!devm_request_mem_region(&pdev->dev, ATA_HD_BASE, 0x40, DRV_NAME)) {
pr_err(DRV_NAME ": resources busy\n");
if (!devm_request_mem_region(&pdev->dev, res->start,
resource_size(res), DRV_NAME)) {
dev_err(&pdev->dev, "resources busy\n");
return -EBUSY;
}

Expand All @@ -152,7 +149,7 @@ static int pata_falcon_init_one(void)
ap->flags |= ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY;
ap->flags |= ATA_FLAG_PIO_POLLING;

base = (void __iomem *)ATA_HD_BASE;
base = (void __iomem *)res->start;
ap->ioaddr.data_addr = base;
ap->ioaddr.error_addr = base + 1 + 1 * 4;
ap->ioaddr.feature_addr = base + 1 + 1 * 4;
Expand All @@ -174,9 +171,26 @@ static int pata_falcon_init_one(void)
return ata_host_activate(host, 0, NULL, 0, &pata_falcon_sht);
}

module_init(pata_falcon_init_one);
static int __exit pata_falcon_remove_one(struct platform_device *pdev)
{
struct ata_host *host = platform_get_drvdata(pdev);

ata_host_detach(host);

return 0;
}

static struct platform_driver pata_falcon_driver = {
.remove = __exit_p(pata_falcon_remove_one),
.driver = {
.name = "atari-falcon-ide",
},
};

module_platform_driver_probe(pata_falcon_driver, pata_falcon_init_one);

MODULE_AUTHOR("Bartlomiej Zolnierkiewicz");
MODULE_DESCRIPTION("low-level driver for Atari Falcon PATA");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:atari-falcon-ide");
MODULE_VERSION(DRV_VERSION);
60 changes: 40 additions & 20 deletions drivers/ide/falconide.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/blkdev.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/platform_device.h>

#include <asm/setup.h>
#include <asm/atarihw.h>
Expand All @@ -25,13 +26,7 @@
#define DRV_NAME "falconide"

/*
* Base of the IDE interface
*/

#define ATA_HD_BASE 0xfff00000

/*
* Offsets from the above base
* Offsets from base address
*/

#define ATA_HD_CONTROL 0x39
Expand Down Expand Up @@ -114,18 +109,18 @@ static const struct ide_port_info falconide_port_info = {
.chipset = ide_generic,
};

static void __init falconide_setup_ports(struct ide_hw *hw)
static void __init falconide_setup_ports(struct ide_hw *hw, unsigned long base)
{
int i;

memset(hw, 0, sizeof(*hw));

hw->io_ports.data_addr = ATA_HD_BASE;
hw->io_ports.data_addr = base;

for (i = 1; i < 8; i++)
hw->io_ports_array[i] = ATA_HD_BASE + 1 + i * 4;
hw->io_ports_array[i] = base + 1 + i * 4;

hw->io_ports.ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL;
hw->io_ports.ctl_addr = base + ATA_HD_CONTROL;

hw->irq = IRQ_MFP_IDE;
}
Expand All @@ -134,23 +129,29 @@ static void __init falconide_setup_ports(struct ide_hw *hw)
* Probe for a Falcon IDE interface
*/

static int __init falconide_init(void)
static int __init falconide_init(struct platform_device *pdev)
{
struct resource *res;
struct ide_host *host;
struct ide_hw hw, *hws[] = { &hw };
unsigned long base;
int rc;

if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE))
return -ENODEV;
dev_info(&pdev->dev, "Atari Falcon IDE controller\n");

printk(KERN_INFO "ide: Falcon IDE controller\n");
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;

if (!request_mem_region(ATA_HD_BASE, 0x40, DRV_NAME)) {
printk(KERN_ERR "%s: resources busy\n", DRV_NAME);
if (!devm_request_mem_region(&pdev->dev, res->start,
resource_size(res), DRV_NAME)) {
dev_err(&pdev->dev, "resources busy\n");
return -EBUSY;
}

falconide_setup_ports(&hw);
base = (unsigned long)res->start;

falconide_setup_ports(&hw, base);

host = ide_host_alloc(&falconide_port_info, hws, 1);
if (host == NULL) {
Expand All @@ -169,10 +170,29 @@ static int __init falconide_init(void)
err_free:
ide_host_free(host);
err:
release_mem_region(ATA_HD_BASE, 0x40);
release_mem_region(res->start, resource_size(res));
return rc;
}

module_init(falconide_init);
static int falconide_remove(struct platform_device *pdev)
{
struct ide_host *host = dev_get_drvdata(&pdev->dev);

ide_host_remove(host);

return 0;
}

static struct platform_driver ide_falcon_driver = {
.remove = falconide_remove,
.driver = {
.name = "atari-falcon-ide",
},
};

module_platform_driver_probe(ide_falcon_driver, falconide_init);

MODULE_AUTHOR("Geert Uytterhoeven");
MODULE_DESCRIPTION("low-level driver for Atari Falcon IDE");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:atari-falcon-ide");

0 comments on commit 5ed0794

Please sign in to comment.