xref: /kernel/linux/linux-5.10/drivers/ide/rapide.c (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 1996-2002 Russell King.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/module.h>
78c2ecf20Sopenharmony_ci#include <linux/blkdev.h>
88c2ecf20Sopenharmony_ci#include <linux/errno.h>
98c2ecf20Sopenharmony_ci#include <linux/ide.h>
108c2ecf20Sopenharmony_ci#include <linux/init.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <asm/ecard.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistatic const struct ide_port_info rapide_port_info = {
158c2ecf20Sopenharmony_ci	.host_flags		= IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA,
168c2ecf20Sopenharmony_ci	.chipset		= ide_generic,
178c2ecf20Sopenharmony_ci};
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistatic void rapide_setup_ports(struct ide_hw *hw, void __iomem *base,
208c2ecf20Sopenharmony_ci			       void __iomem *ctrl, unsigned int sz, int irq)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	unsigned long port = (unsigned long)base;
238c2ecf20Sopenharmony_ci	int i;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	for (i = 0; i <= 7; i++) {
268c2ecf20Sopenharmony_ci		hw->io_ports_array[i] = port;
278c2ecf20Sopenharmony_ci		port += sz;
288c2ecf20Sopenharmony_ci	}
298c2ecf20Sopenharmony_ci	hw->io_ports.ctl_addr = (unsigned long)ctrl;
308c2ecf20Sopenharmony_ci	hw->irq = irq;
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistatic int rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	void __iomem *base;
368c2ecf20Sopenharmony_ci	struct ide_host *host;
378c2ecf20Sopenharmony_ci	int ret;
388c2ecf20Sopenharmony_ci	struct ide_hw hw, *hws[] = { &hw };
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	ret = ecard_request_resources(ec);
418c2ecf20Sopenharmony_ci	if (ret)
428c2ecf20Sopenharmony_ci		goto out;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
458c2ecf20Sopenharmony_ci	if (!base) {
468c2ecf20Sopenharmony_ci		ret = -ENOMEM;
478c2ecf20Sopenharmony_ci		goto release;
488c2ecf20Sopenharmony_ci	}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	memset(&hw, 0, sizeof(hw));
518c2ecf20Sopenharmony_ci	rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq);
528c2ecf20Sopenharmony_ci	hw.dev = &ec->dev;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	ret = ide_host_add(&rapide_port_info, hws, 1, &host);
558c2ecf20Sopenharmony_ci	if (ret)
568c2ecf20Sopenharmony_ci		goto release;
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	ecard_set_drvdata(ec, host);
598c2ecf20Sopenharmony_ci	goto out;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci release:
628c2ecf20Sopenharmony_ci	ecard_release_resources(ec);
638c2ecf20Sopenharmony_ci out:
648c2ecf20Sopenharmony_ci	return ret;
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistatic void rapide_remove(struct expansion_card *ec)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	struct ide_host *host = ecard_get_drvdata(ec);
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	ecard_set_drvdata(ec, NULL);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	ide_host_remove(host);
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	ecard_release_resources(ec);
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cistatic struct ecard_id rapide_ids[] = {
798c2ecf20Sopenharmony_ci	{ MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 },
808c2ecf20Sopenharmony_ci	{ 0xffff, 0xffff }
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cistatic struct ecard_driver rapide_driver = {
848c2ecf20Sopenharmony_ci	.probe		= rapide_probe,
858c2ecf20Sopenharmony_ci	.remove		= rapide_remove,
868c2ecf20Sopenharmony_ci	.id_table	= rapide_ids,
878c2ecf20Sopenharmony_ci	.drv = {
888c2ecf20Sopenharmony_ci		.name	= "rapide",
898c2ecf20Sopenharmony_ci	},
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistatic int __init rapide_init(void)
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	return ecard_register_driver(&rapide_driver);
958c2ecf20Sopenharmony_ci}
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic void __exit rapide_exit(void)
988c2ecf20Sopenharmony_ci{
998c2ecf20Sopenharmony_ci	ecard_remove_driver(&rapide_driver);
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
1038c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Yellowstone RAPIDE driver");
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cimodule_init(rapide_init);
1068c2ecf20Sopenharmony_cimodule_exit(rapide_exit);
107