]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/acpi/dock.c
ACPI: dock: add struct dock_station * directly to platform device data
[karo-tx-linux.git] / drivers / acpi / dock.c
index 0a1221854a2548e728888ad56bdcfb63ee478541..cfcd8eeb3b2ab43694d731a929185d3a4d89b803 100644 (file)
@@ -843,8 +843,7 @@ static ssize_t show_docked(struct device *dev,
 {
        struct acpi_device *tmp;
 
-       struct dock_station *dock_station = *((struct dock_station **)
-               dev->platform_data);
+       struct dock_station *dock_station = dev->platform_data;
 
        if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
                return snprintf(buf, PAGE_SIZE, "1\n");
@@ -858,8 +857,7 @@ static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
 static ssize_t show_flags(struct device *dev,
                          struct device_attribute *attr, char *buf)
 {
-       struct dock_station *dock_station = *((struct dock_station **)
-               dev->platform_data);
+       struct dock_station *dock_station = dev->platform_data;
        return snprintf(buf, PAGE_SIZE, "%d\n", dock_station->flags);
 
 }
@@ -872,8 +870,7 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr,
                           const char *buf, size_t count)
 {
        int ret;
-       struct dock_station *dock_station = *((struct dock_station **)
-               dev->platform_data);
+       struct dock_station *dock_station = dev->platform_data;
 
        if (!count)
                return -EINVAL;
@@ -891,8 +888,7 @@ static ssize_t show_dock_uid(struct device *dev,
                             struct device_attribute *attr, char *buf)
 {
        unsigned long long lbuf;
-       struct dock_station *dock_station = *((struct dock_station **)
-               dev->platform_data);
+       struct dock_station *dock_station = dev->platform_data;
        acpi_status status = acpi_evaluate_integer(dock_station->handle,
                                        "_UID", NULL, &lbuf);
        if (ACPI_FAILURE(status))
@@ -905,8 +901,7 @@ static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
 static ssize_t show_dock_type(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct dock_station *dock_station = *((struct dock_station **)
-               dev->platform_data);
+       struct dock_station *dock_station = dev->platform_data;
        char *type;
 
        if (dock_station->flags & DOCK_IS_DOCK)
@@ -944,15 +939,20 @@ static struct attribute_group dock_attribute_group = {
  */
 static int dock_add(acpi_handle handle)
 {
-       int ret;
-       struct dock_station *dock_station;
+       int ret, id;
+       struct dock_station ds, *dock_station;
        struct platform_device *dock_device;
 
-       /* allocate & initialize the dock_station private data */
-       dock_station = kzalloc(sizeof(*dock_station), GFP_KERNEL);
-       if (!dock_station)
-               return -ENOMEM;
+       id = dock_station_count;
+       dock_device =
+               platform_device_register_data(NULL, "dock",
+                       id, &ds, sizeof(ds));
+       if (IS_ERR(dock_device))
+               return PTR_ERR(dock_device);
+
+       dock_station = dock_device->dev.platform_data;
        dock_station->handle = handle;
+       dock_station->dock_device = dock_device;
        dock_station->last_dock_time = jiffies - HZ;
        INIT_LIST_HEAD(&dock_station->dependent_devices);
        INIT_LIST_HEAD(&dock_station->hotplug_devices);
@@ -961,18 +961,6 @@ static int dock_add(acpi_handle handle)
        mutex_init(&dock_station->hp_lock);
        ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list);
 
-       /* initialize platform device stuff */
-       dock_station->dock_device =
-               platform_device_register_simple("dock",
-                       dock_station_count, NULL, 0);
-       dock_device = dock_station->dock_device;
-       if (IS_ERR(dock_device)) {
-               ret = PTR_ERR(dock_device);
-               goto out;
-       }
-       platform_device_add_data(dock_device, &dock_station,
-               sizeof(struct dock_station *));
-
        /* we want the dock device to send uevents */
        dev_set_uevent_suppress(&dock_device->dev, 0);
 
@@ -1005,9 +993,6 @@ err_rmgroup:
        sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group);
 err_unregister:
        platform_device_unregister(dock_device);
-out:
-       kfree(dock_station);
-       dock_station = NULL;
        printk(KERN_ERR "%s encountered error %d\n", __func__, ret);
        return ret;
 }
@@ -1028,13 +1013,12 @@ static int dock_remove(struct dock_station *dock_station)
                                 list)
            kfree(dd);
 
+       list_del(&dock_station->sibling);
+
        /* cleanup sysfs */
        sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group);
        platform_device_unregister(dock_device);
 
-       /* free dock station memory */
-       kfree(dock_station);
-       dock_station = NULL;
        return 0;
 }