Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48c3c107 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: add struct ide_host (take 3)



* Add struct ide_host which keeps pointers to host's ports.

* Add ide_host_alloc[_all]() and ide_host_remove() helpers.

* Pass 'struct ide_host *host' instead of 'u8 *idx' to
  ide_device_add[_all]() and rename it to ide_host_register[_all]().

* Convert host drivers and core code to use struct ide_host.

* Remove no longer needed ide_find_port().

* Make ide_find_port_slot() static.

* Unexport ide_unregister().

v2:
* Add missing 'struct ide_host *host' to macide.c.

v3:
* Fix build problem in pmac.c (s/ide_alloc_host/ide_host_alloc/)
  (Noticed by Stephen Rothwell).

Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 374e042c
Loading
Loading
Loading
Loading
+11 −29
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ struct icside_state {
	void __iomem *ioc_base;
	unsigned int sel;
	unsigned int type;
	ide_hwif_t *hwif[2];
	struct ide_host *host;
};

#define ICS_TYPE_A3IN	0
@@ -442,10 +442,9 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base,
static int __init
icside_register_v5(struct icside_state *state, struct expansion_card *ec)
{
	ide_hwif_t *hwif;
	void __iomem *base;
	struct ide_host *host;
	hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };

	base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
	if (!base)
@@ -465,17 +464,15 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)

	icside_setup_ports(&hw, base, &icside_cardinfo_v5, ec);

	hwif = ide_find_port();
	if (!hwif)
	host = ide_host_alloc(NULL, hws);
	if (host == NULL)
		return -ENODEV;

	state->hwif[0] = hwif;
	state->host = host;

	ecard_set_drvdata(ec, state);

	idx[0] = hwif->index;

	ide_device_add(idx, NULL, hws);
	ide_host_register(host, NULL, hws);

	return 0;
}
@@ -492,12 +489,11 @@ static const struct ide_port_info icside_v6_port_info __initdata = {
static int __init
icside_register_v6(struct icside_state *state, struct expansion_card *ec)
{
	ide_hwif_t *hwif, *mate;
	void __iomem *ioc_base, *easi_base;
	struct ide_host *host;
	unsigned int sel = 0;
	int ret;
	hw_regs_t hw[2], *hws[] = { &hw[0], NULL, NULL, NULL };
	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
	struct ide_port_info d = icside_v6_port_info;

	ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
@@ -537,25 +533,11 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
	icside_setup_ports(&hw[0], easi_base, &icside_cardinfo_v6_1, ec);
	icside_setup_ports(&hw[1], easi_base, &icside_cardinfo_v6_2, ec);

	/*
	 * Find and register the interfaces.
	 */
	hwif = ide_find_port();
	if (hwif == NULL)
	host = ide_host_alloc(&d, hws);
	if (host == NULL)
		return -ENODEV;

	hwif->chipset = ide_acorn;

	idx[0] = hwif->index;

	mate = ide_find_port();
	if (mate) {
		hws[1] = &hw[1];
		idx[1] = mate->index;
	}

	state->hwif[0]    = hwif;
	state->hwif[1]    = mate;
	state->host = host;

	ecard_set_drvdata(ec, state);

@@ -565,7 +547,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
		d.dma_ops = NULL;
	}

	ide_device_add(idx, &d, hws);
	ide_host_register(host, &d, hws);

	return 0;

+4 −8
Original line number Diff line number Diff line
@@ -28,10 +28,9 @@

static int __init ide_arm_init(void)
{
	ide_hwif_t *hwif;
	struct ide_host *host;
	unsigned long base = IDE_ARM_IO, ctl = IDE_ARM_IO + 0x206;
	hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };

	if (!request_region(base, 8, DRV_NAME)) {
		printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
@@ -51,12 +50,9 @@ static int __init ide_arm_init(void)
	hw.irq = IDE_ARM_IRQ;
	hw.chipset = ide_generic;

	hwif = ide_find_port();
	if (hwif) {
		idx[0] = hwif->index;

		ide_device_add(idx, NULL, hws);
	}
	host = ide_host_alloc(NULL, hws);
	if (host)
		ide_host_register(host, NULL, hws);

	return 0;
}
+4 −9
Original line number Diff line number Diff line
@@ -347,11 +347,10 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
{
	struct clk *clk;
	struct resource *mem, *irq;
	ide_hwif_t *hwif;
	struct ide_host *host;
	unsigned long base, rate;
	int i;
	hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };

	clk = clk_get(NULL, "IDECLK");
	if (IS_ERR(clk))
@@ -393,15 +392,11 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
	hw.irq = irq->start;
	hw.chipset = ide_palm3710;

	hwif = ide_find_port();
	if (hwif == NULL)
	host = ide_host_alloc(&palm_bk3710_port_info, hws);
	if (host == NULL)
		goto out;

	i = hwif->index;

	idx[0] = i;

	ide_device_add(idx, &palm_bk3710_port_info, hws);
	ide_host_register(host, &palm_bk3710_port_info, hws);

	return 0;
out:
+7 −10
Original line number Diff line number Diff line
@@ -32,11 +32,10 @@ static void rapide_setup_ports(hw_regs_t *hw, void __iomem *base,
static int __devinit
rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
{
	ide_hwif_t *hwif;
	void __iomem *base;
	struct ide_host *host;
	int ret;
	hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };

	ret = ecard_request_resources(ec);
	if (ret)
@@ -53,17 +52,15 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)
	hw.chipset = ide_generic;
	hw.dev = &ec->dev;

	hwif = ide_find_port();
	if (hwif == NULL) {
	host = ide_host_alloc(&rapide_port_info, hws);
	if (host == NULL) {
		ret = -ENOENT;
		goto release;
	}

	idx[0] = hwif->index;
	ide_host_register(host, &rapide_port_info, hws);

	ide_device_add(idx, &rapide_port_info, hws);

	ecard_set_drvdata(ec, hwif);
	ecard_set_drvdata(ec, host);
	goto out;

 release:
@@ -74,11 +71,11 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id)

static void __devexit rapide_remove(struct expansion_card *ec)
{
	ide_hwif_t *hwif = ecard_get_drvdata(ec);
	struct ide_host *host = ecard_get_drvdata(ec);

	ecard_set_drvdata(ec, NULL);

	ide_unregister(hwif);
	ide_host_remove(host);

	ecard_release_resources(ec);
}
+4 −10
Original line number Diff line number Diff line
@@ -191,10 +191,8 @@ static const struct ide_port_info h8300_port_info = {

static int __init h8300_ide_init(void)
{
	ide_hwif_t *hwif;
	int index;
	struct ide_host *host;
	hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };

	printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n");

@@ -207,15 +205,11 @@ static int __init h8300_ide_init(void)

	hw_setup(&hw);

	hwif = ide_find_port_slot(&h8300_port_info);
	if (hwif == NULL)
	host = ide_host_alloc(&h8300_port_info, hws);
	if (host == NULL)
		return -ENOENT;

	index = hwif->index;

	idx[0] = index;

	ide_device_add(idx, &h8300_port_info, hws);
	ide_host_register(host, &h8300_port_info, hws);

	return 0;

Loading