Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1e9c9dd authored by Rob Herring's avatar Rob Herring Committed by Grant Likely
Browse files

ipmi: convert OF driver to platform driver



of_bus is deprecated in favor of the plain platform bus. This patch
merges the ipmi OF driver with the existing platform driver.

CONFIG_PPC_OF occurrances are removed or replaced with CONFIG_OF.

Compile tested with and without CONFIG_OF. Tested OF probe and
default probe cases.

Signed-off-by: default avatarRob Herring <rob.herring@calxeda.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent a314c5c0
Loading
Loading
Loading
Loading
+23 −47
Original line number Diff line number Diff line
@@ -66,13 +66,10 @@
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/pnp.h>

#ifdef CONFIG_PPC_OF
#include <linux/of_device.h>
#include <linux/of_platform.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#endif

#define PFX "ipmi_si: "

@@ -116,13 +113,7 @@ static char *ipmi_addr_src_to_str[] = { NULL, "hotmod", "hardcoded", "SPMI",

#define DEVICE_NAME "ipmi_si"

static struct platform_driver ipmi_driver = {
	.driver = {
		.name = DEVICE_NAME,
		.bus = &platform_bus_type
	}
};

static struct platform_driver ipmi_driver;

/*
 * Indexes into stats[] in smi_info below.
@@ -308,9 +299,6 @@ static int pci_registered;
#ifdef CONFIG_ACPI
static int pnp_registered;
#endif
#ifdef CONFIG_PPC_OF
static int of_registered;
#endif

static unsigned int kipmid_max_busy_us[SI_MAX_PARMS];
static int num_max_busy_us;
@@ -1860,8 +1848,9 @@ static int hotmod_handler(const char *val, struct kernel_param *kp)
	return rv;
}

static void __devinit hardcode_find_bmc(void)
static int __devinit hardcode_find_bmc(void)
{
	int ret = -ENODEV;
	int             i;
	struct smi_info *info;

@@ -1871,7 +1860,7 @@ static void __devinit hardcode_find_bmc(void)

		info = smi_info_alloc();
		if (!info)
			return;
			return -ENOMEM;

		info->addr_source = SI_HARDCODED;
		printk(KERN_INFO PFX "probing via hardcoded address\n");
@@ -1924,10 +1913,12 @@ static void __devinit hardcode_find_bmc(void)
		if (!add_smi(info)) {
			if (try_smi_init(info))
				cleanup_one_si(info);
			ret = 0;
		} else {
			kfree(info);
		}
	}
	return ret;
}

#ifdef CONFIG_ACPI
@@ -2555,11 +2546,9 @@ static struct pci_driver ipmi_pci_driver = {
};
#endif /* CONFIG_PCI */


#ifdef CONFIG_PPC_OF
static int __devinit ipmi_of_probe(struct platform_device *dev,
			 const struct of_device_id *match)
static int __devinit ipmi_probe(struct platform_device *dev)
{
#ifdef CONFIG_OF
	struct smi_info *info;
	struct resource resource;
	const __be32 *regsize, *regspacing, *regshift;
@@ -2569,6 +2558,9 @@ static int __devinit ipmi_of_probe(struct platform_device *dev,

	dev_info(&dev->dev, "probing via device tree\n");

	if (!dev->dev.of_match)
		return -EINVAL;

	ret = of_address_to_resource(np, 0, &resource);
	if (ret) {
		dev_warn(&dev->dev, PFX "invalid address from OF\n");
@@ -2601,7 +2593,7 @@ static int __devinit ipmi_of_probe(struct platform_device *dev,
		return -ENOMEM;
	}

	info->si_type		= (enum si_type) match->data;
	info->si_type		= (enum si_type) dev->dev.of_match->data;
	info->addr_source	= SI_DEVICETREE;
	info->irq_setup		= std_irq_setup;

@@ -2632,13 +2624,15 @@ static int __devinit ipmi_of_probe(struct platform_device *dev,
		kfree(info);
		return -EBUSY;
	}

#endif
	return 0;
}

static int __devexit ipmi_of_remove(struct platform_device *dev)
static int __devexit ipmi_remove(struct platform_device *dev)
{
#ifdef CONFIG_OF
	cleanup_one_si(dev_get_drvdata(&dev->dev));
#endif
	return 0;
}

@@ -2653,16 +2647,15 @@ static struct of_device_id ipmi_match[] =
	{},
};

static struct of_platform_driver ipmi_of_platform_driver = {
static struct platform_driver ipmi_driver = {
	.driver = {
		.name = "ipmi",
		.name = DEVICE_NAME,
		.owner = THIS_MODULE,
		.of_match_table = ipmi_match,
	},
	.probe		= ipmi_of_probe,
	.remove		= __devexit_p(ipmi_of_remove),
	.probe		= ipmi_probe,
	.remove		= __devexit_p(ipmi_remove),
};
#endif /* CONFIG_PPC_OF */

static int wait_for_msg_done(struct smi_info *smi_info)
{
@@ -3340,8 +3333,7 @@ static int __devinit init_ipmi_si(void)
		return 0;
	initialized = 1;

	/* Register the device drivers. */
	rv = driver_register(&ipmi_driver.driver);
	rv = platform_driver_register(&ipmi_driver);
	if (rv) {
		printk(KERN_ERR PFX "Unable to register driver: %d\n", rv);
		return rv;
@@ -3365,15 +3357,9 @@ static int __devinit init_ipmi_si(void)

	printk(KERN_INFO "IPMI System Interface driver.\n");

	hardcode_find_bmc();

	/* If the user gave us a device, they presumably want us to use it */
	mutex_lock(&smi_infos_lock);
	if (!list_empty(&smi_infos)) {
		mutex_unlock(&smi_infos_lock);
	if (!hardcode_find_bmc())
		return 0;
	}
	mutex_unlock(&smi_infos_lock);

#ifdef CONFIG_PCI
	rv = pci_register_driver(&ipmi_pci_driver);
@@ -3396,11 +3382,6 @@ static int __devinit init_ipmi_si(void)
	spmi_find_bmc();
#endif

#ifdef CONFIG_PPC_OF
	of_register_platform_driver(&ipmi_of_platform_driver);
	of_registered = 1;
#endif

	/* We prefer devices with interrupts, but in the case of a machine
	   with multiple BMCs we assume that there will be several instances
	   of a given type so if we succeed in registering a type then also
@@ -3548,17 +3529,12 @@ static void __exit cleanup_ipmi_si(void)
		pnp_unregister_driver(&ipmi_pnp_driver);
#endif

#ifdef CONFIG_PPC_OF
	if (of_registered)
		of_unregister_platform_driver(&ipmi_of_platform_driver);
#endif
	platform_driver_unregister(&ipmi_driver);

	mutex_lock(&smi_infos_lock);
	list_for_each_entry_safe(e, tmp_e, &smi_infos, link)
		cleanup_one_si(e);
	mutex_unlock(&smi_infos_lock);

	driver_unregister(&ipmi_driver.driver);
}
module_exit(cleanup_ipmi_si);