Merge branch 'for_paulus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc
[pandora-kernel.git] / drivers / pnp / manager.c
index cbb2749..6fff109 100644 (file)
@@ -469,6 +469,53 @@ int pnp_auto_config_dev(struct pnp_dev *dev)
        return -EBUSY;
 }
 
+/**
+ * pnp_start_dev - low-level start of the PnP device
+ * @dev: pointer to the desired device
+ *
+ * assumes that resources have alread been allocated
+ */
+
+int pnp_start_dev(struct pnp_dev *dev)
+{
+       if (!pnp_can_write(dev)) {
+               pnp_info("Device %s does not support activation.", dev->dev.bus_id);
+               return -EINVAL;
+       }
+
+       if (dev->protocol->set(dev, &dev->res)<0) {
+               pnp_err("Failed to activate device %s.", dev->dev.bus_id);
+               return -EIO;
+       }
+
+       pnp_info("Device %s activated.", dev->dev.bus_id);
+
+       return 0;
+}
+
+/**
+ * pnp_stop_dev - low-level disable of the PnP device
+ * @dev: pointer to the desired device
+ *
+ * does not free resources
+ */
+
+int pnp_stop_dev(struct pnp_dev *dev)
+{
+       if (!pnp_can_disable(dev)) {
+               pnp_info("Device %s does not support disabling.", dev->dev.bus_id);
+               return -EINVAL;
+       }
+       if (dev->protocol->disable(dev)<0) {
+               pnp_err("Failed to disable device %s.", dev->dev.bus_id);
+               return -EIO;
+       }
+
+       pnp_info("Device %s disabled.", dev->dev.bus_id);
+
+       return 0;
+}
+
 /**
  * pnp_activate_dev - activates a PnP device for use
  * @dev: pointer to the desired device
@@ -477,6 +524,8 @@ int pnp_auto_config_dev(struct pnp_dev *dev)
  */
 int pnp_activate_dev(struct pnp_dev *dev)
 {
+       int error;
+
        if (!dev)
                return -EINVAL;
        if (dev->active) {
@@ -487,18 +536,11 @@ int pnp_activate_dev(struct pnp_dev *dev)
        if (pnp_auto_config_dev(dev))
                return -EBUSY;
 
-       if (!pnp_can_write(dev)) {
-               pnp_info("Device %s does not supported activation.", dev->dev.bus_id);
-               return -EINVAL;
-       }
-
-       if (dev->protocol->set(dev, &dev->res)<0) {
-               pnp_err("Failed to activate device %s.", dev->dev.bus_id);
-               return -EIO;
-       }
+       error = pnp_start_dev(dev);
+       if (error)
+               return error;
 
        dev->active = 1;
-       pnp_info("Device %s activated.", dev->dev.bus_id);
 
        return 1;
 }
@@ -511,23 +553,19 @@ int pnp_activate_dev(struct pnp_dev *dev)
  */
 int pnp_disable_dev(struct pnp_dev *dev)
 {
+       int error;
+
         if (!dev)
                 return -EINVAL;
        if (!dev->active) {
                return 0; /* the device is already disabled */
        }
 
-       if (!pnp_can_disable(dev)) {
-               pnp_info("Device %s does not supported disabling.", dev->dev.bus_id);
-               return -EINVAL;
-       }
-       if (dev->protocol->disable(dev)<0) {
-               pnp_err("Failed to disable device %s.", dev->dev.bus_id);
-               return -EIO;
-       }
+       error = pnp_stop_dev(dev);
+       if (error)
+               return error;
 
        dev->active = 0;
-       pnp_info("Device %s disabled.", dev->dev.bus_id);
 
        /* release the resources so that other devices can use them */
        down(&pnp_res_mutex);
@@ -555,7 +593,11 @@ void pnp_resource_change(struct resource *resource, unsigned long start, unsigne
 
 
 EXPORT_SYMBOL(pnp_manual_config_dev);
+#if 0
 EXPORT_SYMBOL(pnp_auto_config_dev);
+#endif
+EXPORT_SYMBOL(pnp_start_dev);
+EXPORT_SYMBOL(pnp_stop_dev);
 EXPORT_SYMBOL(pnp_activate_dev);
 EXPORT_SYMBOL(pnp_disable_dev);
 EXPORT_SYMBOL(pnp_resource_change);