aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dock.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/dock.c')
-rw-r--r--drivers/acpi/dock.c40
1 files changed, 13 insertions, 27 deletions
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
index 3bd89823402a..cfcd8eeb3b2a 100644
--- a/drivers/acpi/dock.c
+++ b/drivers/acpi/dock.c
@@ -843,8 +843,7 @@ static ssize_t show_docked(struct device *dev,
843{ 843{
844 struct acpi_device *tmp; 844 struct acpi_device *tmp;
845 845
846 struct dock_station *dock_station = *((struct dock_station **) 846 struct dock_station *dock_station = dev->platform_data;
847 dev->platform_data);
848 847
849 if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp))) 848 if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
850 return snprintf(buf, PAGE_SIZE, "1\n"); 849 return snprintf(buf, PAGE_SIZE, "1\n");
@@ -858,8 +857,7 @@ static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
858static ssize_t show_flags(struct device *dev, 857static ssize_t show_flags(struct device *dev,
859 struct device_attribute *attr, char *buf) 858 struct device_attribute *attr, char *buf)
860{ 859{
861 struct dock_station *dock_station = *((struct dock_station **) 860 struct dock_station *dock_station = dev->platform_data;
862 dev->platform_data);
863 return snprintf(buf, PAGE_SIZE, "%d\n", dock_station->flags); 861 return snprintf(buf, PAGE_SIZE, "%d\n", dock_station->flags);
864 862
865} 863}
@@ -872,8 +870,7 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr,
872 const char *buf, size_t count) 870 const char *buf, size_t count)
873{ 871{
874 int ret; 872 int ret;
875 struct dock_station *dock_station = *((struct dock_station **) 873 struct dock_station *dock_station = dev->platform_data;
876 dev->platform_data);
877 874
878 if (!count) 875 if (!count)
879 return -EINVAL; 876 return -EINVAL;
@@ -891,8 +888,7 @@ static ssize_t show_dock_uid(struct device *dev,
891 struct device_attribute *attr, char *buf) 888 struct device_attribute *attr, char *buf)
892{ 889{
893 unsigned long long lbuf; 890 unsigned long long lbuf;
894 struct dock_station *dock_station = *((struct dock_station **) 891 struct dock_station *dock_station = dev->platform_data;
895 dev->platform_data);
896 acpi_status status = acpi_evaluate_integer(dock_station->handle, 892 acpi_status status = acpi_evaluate_integer(dock_station->handle,
897 "_UID", NULL, &lbuf); 893 "_UID", NULL, &lbuf);
898 if (ACPI_FAILURE(status)) 894 if (ACPI_FAILURE(status))
@@ -905,8 +901,7 @@ static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
905static ssize_t show_dock_type(struct device *dev, 901static ssize_t show_dock_type(struct device *dev,
906 struct device_attribute *attr, char *buf) 902 struct device_attribute *attr, char *buf)
907{ 903{
908 struct dock_station *dock_station = *((struct dock_station **) 904 struct dock_station *dock_station = dev->platform_data;
909 dev->platform_data);
910 char *type; 905 char *type;
911 906
912 if (dock_station->flags & DOCK_IS_DOCK) 907 if (dock_station->flags & DOCK_IS_DOCK)
@@ -944,20 +939,18 @@ static struct attribute_group dock_attribute_group = {
944 */ 939 */
945static int dock_add(acpi_handle handle) 940static int dock_add(acpi_handle handle)
946{ 941{
947 int ret; 942 int ret, id;
948 struct dock_station *dock_station; 943 struct dock_station ds, *dock_station;
949 struct platform_device *dock_device; 944 struct platform_device *dock_device;
950 945
946 id = dock_station_count;
951 dock_device = 947 dock_device =
952 platform_device_register_simple("dock", 948 platform_device_register_data(NULL, "dock",
953 dock_station_count, NULL, 0); 949 id, &ds, sizeof(ds));
954 if (IS_ERR(dock_device)) 950 if (IS_ERR(dock_device))
955 return PTR_ERR(dock_device); 951 return PTR_ERR(dock_device);
956 952
957 /* allocate & initialize the dock_station private data */ 953 dock_station = dock_device->dev.platform_data;
958 dock_station = kzalloc(sizeof(*dock_station), GFP_KERNEL);
959 if (!dock_station)
960 return -ENOMEM;
961 dock_station->handle = handle; 954 dock_station->handle = handle;
962 dock_station->dock_device = dock_device; 955 dock_station->dock_device = dock_device;
963 dock_station->last_dock_time = jiffies - HZ; 956 dock_station->last_dock_time = jiffies - HZ;
@@ -968,9 +961,6 @@ static int dock_add(acpi_handle handle)
968 mutex_init(&dock_station->hp_lock); 961 mutex_init(&dock_station->hp_lock);
969 ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list); 962 ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list);
970 963
971 platform_device_add_data(dock_device, &dock_station,
972 sizeof(struct dock_station *));
973
974 /* we want the dock device to send uevents */ 964 /* we want the dock device to send uevents */
975 dev_set_uevent_suppress(&dock_device->dev, 0); 965 dev_set_uevent_suppress(&dock_device->dev, 0);
976 966
@@ -1003,9 +993,6 @@ err_rmgroup:
1003 sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group); 993 sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group);
1004err_unregister: 994err_unregister:
1005 platform_device_unregister(dock_device); 995 platform_device_unregister(dock_device);
1006out:
1007 kfree(dock_station);
1008 dock_station = NULL;
1009 printk(KERN_ERR "%s encountered error %d\n", __func__, ret); 996 printk(KERN_ERR "%s encountered error %d\n", __func__, ret);
1010 return ret; 997 return ret;
1011} 998}
@@ -1026,13 +1013,12 @@ static int dock_remove(struct dock_station *dock_station)
1026 list) 1013 list)
1027 kfree(dd); 1014 kfree(dd);
1028 1015
1016 list_del(&dock_station->sibling);
1017
1029 /* cleanup sysfs */ 1018 /* cleanup sysfs */
1030 sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group); 1019 sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group);
1031 platform_device_unregister(dock_device); 1020 platform_device_unregister(dock_device);
1032 1021
1033 /* free dock station memory */
1034 kfree(dock_station);
1035 dock_station = NULL;
1036 return 0; 1022 return 0;
1037} 1023}
1038 1024