Skip to content

Commit

Permalink
powerpc/fsl_msi: reorganize structs to improve clarity and flexibility
Browse files Browse the repository at this point in the history
Store cascade_data in an array inside the driver
data for later use.
Get rid of the msi_virq array since now we can
encapsulate the virqs in the cascade_data
directly and access them through the array
mentioned earlier.

Signed-off-by: Laurentiu Tudor <Laurentiu.Tudor@freescale.com>
Cc: Scott Wood <scottwood@freescale.com>
Cc: Mihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
  • Loading branch information
Tudor Laurentiu authored and Scott Wood committed Sep 4, 2014
1 parent 26a047a commit 8349523
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
17 changes: 11 additions & 6 deletions arch/powerpc/sysdev/fsl_msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ struct fsl_msi_feature {
struct fsl_msi_cascade_data {
struct fsl_msi *msi_data;
int index;
int virq;
};

static inline u32 fsl_msi_read(u32 __iomem *base, unsigned int reg)
Expand Down Expand Up @@ -327,15 +328,18 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)
{
struct fsl_msi *msi = platform_get_drvdata(ofdev);
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_MAX; i++) {
virq = msi->msi_virqs[i];
if (virq != NO_IRQ) {
cascade_data = irq_get_handler_data(virq);
kfree(cascade_data);
if (msi->cascade_array[i]) {
virq = msi->cascade_array[i]->virq;

BUG_ON(virq == NO_IRQ);
BUG_ON(msi->cascade_array[i] !=
irq_get_handler_data(virq));

kfree(msi->cascade_array[i]);
irq_dispose_mapping(virq);
}
}
Expand Down Expand Up @@ -369,9 +373,10 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
return -ENOMEM;
}
irq_set_lockdep_class(virt_msir, &fsl_msi_irq_class);
msi->msi_virqs[irq_index] = virt_msir;
cascade_data->index = offset;
cascade_data->msi_data = msi;
cascade_data->virq = virt_msir;
msi->cascade_array[irq_index] = cascade_data;
irq_set_handler_data(virt_msir, cascade_data);
irq_set_chained_handler(virt_msir, fsl_msi_cascade);

Expand Down
4 changes: 3 additions & 1 deletion arch/powerpc/sysdev/fsl_msi.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#define FSL_PIC_IP_IPIC 0x00000002
#define FSL_PIC_IP_VMPIC 0x00000003

struct fsl_msi_cascade_data;

struct fsl_msi {
struct irq_domain *irqhost;

Expand All @@ -37,7 +39,7 @@ struct fsl_msi {
u32 srs_shift; /* Shift of the shared interrupt register select */
void __iomem *msi_regs;
u32 feature;
int msi_virqs[NR_MSI_REG_MAX];
struct fsl_msi_cascade_data *cascade_array[NR_MSI_REG_MAX];

struct msi_bitmap bitmap;

Expand Down

0 comments on commit 8349523

Please sign in to comment.