Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 199635
b: refs/heads/master
c: 4805999
h: refs/heads/master
i:
  199633: 33da624
  199631: da50a0b
v: v3
  • Loading branch information
Li Yang authored and Kumar Gala committed May 25, 2010
1 parent bb43d73 commit f282dfd
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 061ca4adfb2e3c986a182fd30f7e939a1ff8d29d
refs/heads/master: 480599933a69a8a8dc1390c2164e49e20a1593b9
36 changes: 30 additions & 6 deletions trunk/arch/powerpc/sysdev/fsl_msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,30 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)
raw_spin_unlock(&desc->lock);
}

static int fsl_of_msi_remove(struct of_device *ofdev)
{
struct fsl_msi *msi = ofdev->dev.platform_data;
int virq, i;
struct fsl_msi_cascade_data *cascade_data;

if (msi->list.prev != NULL)
list_del(&msi->list);
for (i = 0; i < NR_MSI_REG; i++) {
virq = msi->msi_virqs[i];
if (virq != NO_IRQ) {
cascade_data = get_irq_data(virq);
kfree(cascade_data);
irq_dispose_mapping(virq);
}
}
if (msi->bitmap.bitmap)
msi_bitmap_free(&msi->bitmap);
iounmap(msi->msi_regs);
kfree(msi);

return 0;
}

static int __devinit fsl_of_msi_probe(struct of_device *dev,
const struct of_device_id *match)
{
Expand All @@ -269,9 +293,9 @@ static int __devinit fsl_of_msi_probe(struct of_device *dev,
msi = kzalloc(sizeof(struct fsl_msi), GFP_KERNEL);
if (!msi) {
dev_err(&dev->dev, "No memory for MSI structure\n");
err = -ENOMEM;
goto error_out;
return -ENOMEM;
}
dev->dev.platform_data = msi;

msi->irqhost = irq_alloc_host(dev->node, IRQ_HOST_MAP_LINEAR,
NR_MSI_IRQS, &fsl_msi_host_ops, 0);
Expand Down Expand Up @@ -328,9 +352,7 @@ static int __devinit fsl_of_msi_probe(struct of_device *dev,
offset = *p / IRQS_PER_MSI_REG;

count /= sizeof(u32);
for (i = 0; i < count / 2; i++) {
if (i > NR_MSI_REG)
break;
for (i = 0; i < min(count / 2, NR_MSI_REG); i++) {
virt_msir = irq_of_parse_and_map(dev->node, i);
if (virt_msir != NO_IRQ) {
cascade_data = kzalloc(
Expand All @@ -342,6 +364,7 @@ static int __devinit fsl_of_msi_probe(struct of_device *dev,
err = -ENOMEM;
goto error_out;
}
msi->msi_virqs[i] = virt_msir;
cascade_data->index = i + offset;
cascade_data->msi_data = msi;
set_irq_data(virt_msir, (void *)cascade_data);
Expand All @@ -363,7 +386,7 @@ static int __devinit fsl_of_msi_probe(struct of_device *dev,
}
return 0;
error_out:
kfree(msi);
fsl_of_msi_remove(dev);
return err;
}

Expand Down Expand Up @@ -393,6 +416,7 @@ static struct of_platform_driver fsl_of_msi_driver = {
.name = "fsl-msi",
.match_table = fsl_of_msi_ids,
.probe = fsl_of_msi_probe,
.remove = fsl_of_msi_remove,
};

static __init int fsl_of_msi_init(void)
Expand Down
1 change: 1 addition & 0 deletions trunk/arch/powerpc/sysdev/fsl_msi.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ struct fsl_msi {
u32 msi_addr_hi;
void __iomem *msi_regs;
u32 feature;
int msi_virqs[NR_MSI_REG];

struct msi_bitmap bitmap;

Expand Down

0 comments on commit f282dfd

Please sign in to comment.