diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2017-04-05 12:05:25 -0400 |
---|---|---|
committer | Darren Hart (VMware) <dvhart@infradead.org> | 2017-04-13 13:16:04 -0400 |
commit | 822e423e62d0f07574e3aaaa7e2c15ffab7815cc (patch) | |
tree | 5062d135bc8009235ba3c13497018431ac22017a /drivers/platform/x86/intel_scu_ipc.c | |
parent | ac207ded45f52b2a122eb947f3e1ab908c4a7ce8 (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.c | 14 |
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); |