mirror of
https://github.com/torvalds/linux.git
synced 2024-12-23 11:21:33 +00:00
Move platform device creation earlier in the initialization
Some logs are printed out early using smi->dev, but on a platform device that is not created until later. So move the creation of that device structure earlier in the sequence so it can be used for printing. Signed-off-by: Corey Minyard <cminyard@mvista.com> Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com>
This commit is contained in:
parent
c11daf6a8f
commit
1abf71eef3
@ -3502,6 +3502,7 @@ static int try_smi_init(struct smi_info *new_smi)
|
||||
{
|
||||
int rv = 0;
|
||||
int i;
|
||||
char *init_name = NULL;
|
||||
|
||||
printk(KERN_INFO PFX "Trying %s-specified %s state"
|
||||
" machine at %s address 0x%lx, slave address 0x%x,"
|
||||
@ -3531,6 +3532,26 @@ static int try_smi_init(struct smi_info *new_smi)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* Do this early so it's available for logs. */
|
||||
if (!new_smi->dev) {
|
||||
init_name = kasprintf(GFP_KERNEL, "ipmi_si.%d", 0);
|
||||
|
||||
/*
|
||||
* If we don't already have a device from something
|
||||
* else (like PCI), then register a new one.
|
||||
*/
|
||||
new_smi->pdev = platform_device_alloc("ipmi_si",
|
||||
new_smi->intf_num);
|
||||
if (!new_smi->pdev) {
|
||||
pr_err(PFX "Unable to allocate platform device\n");
|
||||
goto out_err;
|
||||
}
|
||||
new_smi->dev = &new_smi->pdev->dev;
|
||||
new_smi->dev->driver = &ipmi_driver.driver;
|
||||
/* Nulled by device_add() */
|
||||
new_smi->dev->init_name = init_name;
|
||||
}
|
||||
|
||||
/* Allocate the state machine's data and initialize it. */
|
||||
new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL);
|
||||
if (!new_smi->si_sm) {
|
||||
@ -3604,21 +3625,7 @@ static int try_smi_init(struct smi_info *new_smi)
|
||||
atomic_set(&new_smi->req_events, 1);
|
||||
}
|
||||
|
||||
if (!new_smi->dev) {
|
||||
/*
|
||||
* If we don't already have a device from something
|
||||
* else (like PCI), then register a new one.
|
||||
*/
|
||||
new_smi->pdev = platform_device_alloc("ipmi_si",
|
||||
new_smi->intf_num);
|
||||
if (!new_smi->pdev) {
|
||||
printk(KERN_ERR PFX
|
||||
"Unable to allocate platform device\n");
|
||||
goto out_err;
|
||||
}
|
||||
new_smi->dev = &new_smi->pdev->dev;
|
||||
new_smi->dev->driver = &ipmi_driver.driver;
|
||||
|
||||
if (new_smi->pdev) {
|
||||
rv = platform_device_add(new_smi->pdev);
|
||||
if (rv) {
|
||||
printk(KERN_ERR PFX
|
||||
@ -3668,6 +3675,9 @@ static int try_smi_init(struct smi_info *new_smi)
|
||||
dev_info(new_smi->dev, "IPMI %s interface initialized\n",
|
||||
si_to_str[new_smi->si_type]);
|
||||
|
||||
WARN_ON(new_smi->dev->init_name != NULL);
|
||||
kfree(init_name);
|
||||
|
||||
return 0;
|
||||
|
||||
out_err_stop_timer:
|
||||
@ -3712,8 +3722,14 @@ out_err:
|
||||
if (new_smi->dev_registered) {
|
||||
platform_device_unregister(new_smi->pdev);
|
||||
new_smi->dev_registered = false;
|
||||
new_smi->pdev = NULL;
|
||||
} else if (new_smi->pdev) {
|
||||
platform_device_put(new_smi->pdev);
|
||||
new_smi->pdev = NULL;
|
||||
}
|
||||
|
||||
kfree(init_name);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user