aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/intel_scu_ipc.c
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2017-04-05 12:05:25 -0400
committerDarren Hart (VMware) <dvhart@infradead.org>2017-04-13 13:16:04 -0400
commit822e423e62d0f07574e3aaaa7e2c15ffab7815cc (patch)
tree5062d135bc8009235ba3c13497018431ac22017a /drivers/platform/x86/intel_scu_ipc.c
parentac207ded45f52b2a122eb947f3e1ab908c4a7ce8 (diff)
platform/x86: intel_scu_ipc: Rearrange init sequence
Device pointer is used as a flag that everything is prepared. Nevertheless the assignment happened quite before and there is a window when a caller can get weird results or even crashes since not all fields are initialized yet. Rearrange initialization sequence in ->probe() to prepare everything before use. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Diffstat (limited to 'drivers/platform/x86/intel_scu_ipc.c')
-rw-r--r--drivers/platform/x86/intel_scu_ipc.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c
index d789fe1baf17..8a34c1e7536f 100644
--- a/drivers/platform/x86/intel_scu_ipc.c
+++ b/drivers/platform/x86/intel_scu_ipc.c
@@ -582,7 +582,6 @@ static int ipc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
582 if (!pdata) 582 if (!pdata)
583 return -ENODEV; 583 return -ENODEV;
584 584
585 scu->dev = &pdev->dev;
586 scu->irq_mode = pdata->irq_mode; 585 scu->irq_mode = pdata->irq_mode;
587 586
588 err = pcim_enable_device(pdev); 587 err = pcim_enable_device(pdev);
@@ -595,17 +594,20 @@ static int ipc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
595 594
596 init_completion(&scu->cmd_complete); 595 init_completion(&scu->cmd_complete);
597 596
598 err = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, "intel_scu_ipc",
599 scu);
600 if (err)
601 return err;
602
603 scu->ipc_base = pcim_iomap_table(pdev)[0]; 597 scu->ipc_base = pcim_iomap_table(pdev)[0];
604 598
605 scu->i2c_base = ioremap_nocache(pdata->i2c_base, pdata->i2c_len); 599 scu->i2c_base = ioremap_nocache(pdata->i2c_base, pdata->i2c_len);
606 if (!scu->i2c_base) 600 if (!scu->i2c_base)
607 return -ENOMEM; 601 return -ENOMEM;
608 602
603 err = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, "intel_scu_ipc",
604 scu);
605 if (err)
606 return err;
607
608 /* Assign device at last */
609 scu->dev = &pdev->dev;
610
609 intel_scu_devices_create(); 611 intel_scu_devices_create();
610 612
611 pci_set_drvdata(pdev, scu); 613 pci_set_drvdata(pdev, scu);