m68k/atari: Convert Falcon IDE drivers to platform drivers

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>
This commit is contained in:
Michael Schmitz 2019-11-06 15:47:29 +13:00 committed by Geert Uytterhoeven
parent 032f128dbd
commit 5ed0794cde
3 changed files with 95 additions and 34 deletions

View File

@ -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)
@ -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;
}

View File

@ -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 = {
@ -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))
dev_info(&pdev->dev, "Atari Falcon PATA controller\n");
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
pr_info(DRV_NAME ": Atari Falcon PATA controller\n");
pdev = platform_device_register_simple(DRV_NAME, 0, NULL, 0);
if (IS_ERR(pdev))
return PTR_ERR(pdev);
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;
}
@ -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;
@ -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);

View File

@ -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>
@ -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
@ -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;
}
@ -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))
dev_info(&pdev->dev, "Atari Falcon IDE controller\n");
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
printk(KERN_INFO "ide: Falcon IDE controller\n");
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) {
@ -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");