Skip to content

Commit

Permalink
ide: add struct ide_host (take 3)
Browse files Browse the repository at this point in the history
* 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: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Jul 23, 2008
1 parent 374e042 commit 48c3c10
Show file tree
Hide file tree
Showing 27 changed files with 264 additions and 349 deletions.
40 changes: 11 additions & 29 deletions drivers/ide/arm/icside.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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;
}
Expand All @@ -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);
Expand Down Expand Up @@ -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);

Expand All @@ -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;

Expand Down
12 changes: 4 additions & 8 deletions drivers/ide/arm/ide_arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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;
}
Expand Down
13 changes: 4 additions & 9 deletions drivers/ide/arm/palm_bk3710.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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:
Expand Down
17 changes: 7 additions & 10 deletions drivers/ide/arm/rapide.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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:
Expand All @@ -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);
}
Expand Down
14 changes: 4 additions & 10 deletions drivers/ide/h8300/ide-h8300.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand All @@ -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;

Expand Down
28 changes: 9 additions & 19 deletions drivers/ide/ide-generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,27 +28,24 @@ MODULE_PARM_DESC(probe_mask, "probe mask for legacy ISA IDE ports");

static ssize_t store_add(struct class *cls, const char *buf, size_t n)
{
ide_hwif_t *hwif;
struct ide_host *host;
unsigned int base, ctl;
int irq;
hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
u8 idx[] = { 0xff, 0xff, 0xff, 0xff };

if (sscanf(buf, "%x:%x:%d", &base, &ctl, &irq) != 3)
return -EINVAL;

hwif = ide_find_port();
if (hwif == NULL)
return -ENOENT;

memset(&hw, 0, sizeof(hw));
ide_std_init_ports(&hw, base, ctl);
hw.irq = irq;
hw.chipset = ide_generic;

idx[0] = hwif->index;
host = ide_host_alloc(NULL, hws);
if (host == NULL)
return -ENOENT;

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

return n;
};
Expand Down Expand Up @@ -89,18 +86,16 @@ static int __init ide_generic_sysfs_init(void)
static int __init ide_generic_init(void)
{
hw_regs_t hw[MAX_HWIFS], *hws[MAX_HWIFS];
u8 idx[MAX_HWIFS];
struct ide_host *host;
int i;

printk(KERN_INFO DRV_NAME ": please use \"probe_mask=0x3f\" module "
"parameter for probing all legacy ISA IDE ports\n");

for (i = 0; i < MAX_HWIFS; i++) {
ide_hwif_t *hwif;
unsigned long io_addr = ide_default_io_base(i);

hws[i] = NULL;
idx[i] = 0xff;

if ((probe_mask & (1 << i)) && io_addr) {
if (!request_region(io_addr, 8, DRV_NAME)) {
Expand All @@ -118,23 +113,18 @@ static int __init ide_generic_init(void)
continue;
}

hwif = ide_find_port();
if (hwif == NULL)
continue;

hwif->chipset = ide_generic;

memset(&hw[i], 0, sizeof(hw[i]));
ide_std_init_ports(&hw[i], io_addr, io_addr + 0x206);
hw[i].irq = ide_default_irq(io_addr);
hw[i].chipset = ide_generic;

hws[i] = &hw[i];
idx[i] = i;
}
}

ide_device_add_all(idx, NULL, hws);
host = ide_host_alloc_all(NULL, hws);
if (host)
ide_host_register(host, NULL, hws);

if (ide_generic_sysfs_init())
printk(KERN_ERR DRV_NAME ": failed to create ide_generic "
Expand Down
17 changes: 7 additions & 10 deletions drivers/ide/ide-pnp.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static struct pnp_device_id idepnp_devices[] = {

static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
{
ide_hwif_t *hwif;
struct ide_host *host;
unsigned long base, ctl;
hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };

Expand Down Expand Up @@ -59,14 +59,11 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
hw.irq = pnp_irq(dev, 0);
hw.chipset = ide_generic;

hwif = ide_find_port();
if (hwif) {
u8 index = hwif->index;
u8 idx[4] = { index, 0xff, 0xff, 0xff };
host = ide_host_alloc(NULL, hws);
if (host) {
pnp_set_drvdata(dev, host);

pnp_set_drvdata(dev, hwif);

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

return 0;
}
Expand All @@ -79,9 +76,9 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)

static void idepnp_remove(struct pnp_dev *dev)
{
ide_hwif_t *hwif = pnp_get_drvdata(dev);
struct ide_host *host = pnp_get_drvdata(dev);

ide_unregister(hwif);
ide_host_remove(host);

release_region(pnp_port_start(dev, 1), 1);
release_region(pnp_port_start(dev, 0), 8);
Expand Down
Loading

0 comments on commit 48c3c10

Please sign in to comment.