> +}
> +
> /* Device model stuff */
> static int applesmc_probe(struct platform_device *dev)
> {
> + int ret;
> +
> + ret = applesmc_init_smcreg();
> + if (ret)
> + return ret;
> +
> applesmc_device_init();
>
> return 0;
> @@ -507,10 +645,8 @@ static int applesmc_probe(struct platform_device *dev)
> /* Synchronize device with memorized backlight state */
> static int applesmc_pm_resume(struct device *dev)
> {
> - mutex_lock(&applesmc_lock);
> if (applesmc_light)
> applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
> - mutex_unlock(&applesmc_lock);
> return 0;
> }
>
> @@ -551,20 +687,15 @@ static void applesmc_idev_poll(struct input_polled_dev *dev)
> struct input_dev *idev = dev->input;
> s16 x, y;
>
> - mutex_lock(&applesmc_lock);
> -
> if (applesmc_read_motion_sensor(SENSOR_X, &x))
> - goto out;
> + return;
> if (applesmc_read_motion_sensor(SENSOR_Y, &y))
> - goto out;
> + return;
>
> x = -x;
> input_report_abs(idev, ABS_X, x - rest_x);
> input_report_abs(idev, ABS_Y, y - rest_y);
> input_sync(idev);
> -
> -out:
> - mutex_unlock(&applesmc_lock);
> }
>
> /* Sysfs Files */
> @@ -581,8 +712,6 @@ static ssize_t applesmc_position_show(struct device *dev,
> int ret;
> s16 x, y, z;
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_motion_sensor(SENSOR_X, &x);
> if (ret)
> goto out;
> @@ -594,7 +723,6 @@ static ssize_t applesmc_position_show(struct device *dev,
> goto out;
>
> out:
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -604,18 +732,17 @@ out:
> static ssize_t applesmc_light_show(struct device *dev,
> struct device_attribute *attr, char *sysfsbuf)
> {
> + struct applesmc_entry entry;
> static int data_length;
> int ret;
> u8 left = 0, right = 0;
> - u8 buffer[10], query[6];
> -
> - mutex_lock(&applesmc_lock);
> + u8 buffer[10];
>
> if (!data_length) {
> - ret = applesmc_get_key_type(LIGHT_SENSOR_LEFT_KEY, query);
> + ret = applesmc_get_entry_by_key(LIGHT_SENSOR_LEFT_KEY, &entry);
> if (ret)
> goto out;
> - data_length = clamp_val(query[0], 0, 10);
> + data_length = clamp_val(entry.len, 0, 10);
> pr_info("light sensor data length set to %d\n", data_length);
> }
>
> @@ -632,7 +759,6 @@ static ssize_t applesmc_light_show(struct device *dev,
> right = buffer[2];
>
> out:
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -661,14 +787,10 @@ static ssize_t applesmc_show_temperature(struct device *dev,
> const char* key =
> temperature_sensors_sets[applesmc_temperature_set][attr->index];
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_key(key, buffer, 2);
> temp = buffer[0]*1000;
> temp += (buffer[1] >> 6) * 250;
>
> - mutex_unlock(&applesmc_lock);
> -
> if (ret)
> return ret;
> else
> @@ -691,12 +813,9 @@ static ssize_t applesmc_show_fan_speed(struct device *dev,
> newkey[3] = fan_speed_keys[sensor_attr->nr][3];
> newkey[4] = 0;
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_key(newkey, buffer, 2);
> speed = ((buffer[0] << 8 | buffer[1]) >> 2);
>
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -725,13 +844,10 @@ static ssize_t applesmc_store_fan_speed(struct device *dev,
> newkey[3] = fan_speed_keys[sensor_attr->nr][3];
> newkey[4] = 0;
>
> - mutex_lock(&applesmc_lock);
> -
> buffer[0] = (speed >> 6) & 0xff;
> buffer[1] = (speed << 2) & 0xff;
> ret = applesmc_write_key(newkey, buffer, 2);
>
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -746,12 +862,9 @@ static ssize_t applesmc_show_fan_manual(struct device *dev,
> u8 buffer[2];
> struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
> manual = ((buffer[0] << 8 | buffer[1]) >> attr->index) & 0x01;
>
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -770,8 +883,6 @@ static ssize_t applesmc_store_fan_manual(struct device *dev,
>
> input = simple_strtoul(sysfsbuf, NULL, 10);
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
> val = (buffer[0] << 8 | buffer[1]);
> if (ret)
> @@ -788,7 +899,6 @@ static ssize_t applesmc_store_fan_manual(struct device *dev,
> ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
>
> out:
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -810,12 +920,9 @@ static ssize_t applesmc_show_fan_position(struct device *dev,
> newkey[3] = FAN_POSITION[3];
> newkey[4] = 0;
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_key(newkey, buffer, 16);
> buffer[16] = 0;
>
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -831,18 +938,14 @@ static ssize_t applesmc_calibrate_show(struct device *dev,
> static ssize_t applesmc_calibrate_store(struct device *dev,
> struct device_attribute *attr, const char *sysfsbuf, size_t count)
> {
> - mutex_lock(&applesmc_lock);
> applesmc_calibrate();
> - mutex_unlock(&applesmc_lock);
>
> return count;
> }
>
> static void applesmc_backlight_set(struct work_struct *work)
> {
> - mutex_lock(&applesmc_lock);
> applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
> - mutex_unlock(&applesmc_lock);
> }
> static DECLARE_WORK(backlight_work, &applesmc_backlight_set);
>
> @@ -865,13 +968,10 @@ static ssize_t applesmc_key_count_show(struct device *dev,
> u8 buffer[4];
> u32 count;
>
> - mutex_lock(&applesmc_lock);
> -
> ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4);
> count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
> ((u32)buffer[2]<<8) + buffer[3];
>
> - mutex_unlock(&applesmc_lock);
> if (ret)
> return ret;
> else
> @@ -881,113 +981,56 @@ static ssize_t applesmc_key_count_show(struct device *dev,
> static ssize_t applesmc_key_at_index_read_show(struct device *dev,
> struct device_attribute *attr, char *sysfsbuf)
> {
> - char key[5];
> - char info[6];
> + struct applesmc_entry entry;
> int ret;
>
> - mutex_lock(&applesmc_lock);
> -
> - ret = applesmc_get_key_at_index(key_at_index, key);
> -
> - if (ret || !key[0]) {
> - mutex_unlock(&applesmc_lock);
> -
> - return -EINVAL;
> - }
> -
> - ret = applesmc_get_key_type(key, info);
> -
> - if (ret) {
> - mutex_unlock(&applesmc_lock);
> -
> + ret = applesmc_get_entry_by_index(key_at_index, &entry);
> + if (ret)
> return ret;
> - }
> -
> - /*
> - * info[0] maximum value (APPLESMC_MAX_DATA_LENGTH) is much lower than
> - * PAGE_SIZE, so we don't need any checks before writing to sysfsbuf.
> - */
> - ret = applesmc_read_key(key, sysfsbuf, info[0]);
> -
> - mutex_unlock(&applesmc_lock);
> -
> - if (!ret) {
> - return info[0];
> - } else {
> + ret = applesmc_read_entry(&entry, sysfsbuf, entry.len);
> + if (ret)
> return ret;
> - }
> +
> + return entry.len;
> }
>
> static ssize_t applesmc_key_at_index_data_length_show(struct device *dev,
> struct device_attribute *attr, char *sysfsbuf)
> {
> - char key[5];
> - char info[6];
> + struct applesmc_entry entry;
> int ret;
>
> - mutex_lock(&applesmc_lock);
> -
> - ret = applesmc_get_key_at_index(key_at_index, key);
> -
> - if (ret || !key[0]) {
> - mutex_unlock(&applesmc_lock);
> -
> - return -EINVAL;
> - }
> -
> - ret = applesmc_get_key_type(key, info);
> -
> - mutex_unlock(&applesmc_lock);
> -
> - if (!ret)
> - return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", info[0]);
> - else
> + ret = applesmc_get_entry_by_index(key_at_index, &entry);
> + if (ret)
> return ret;
> +
> + return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", entry.len);
> }
>
> static ssize_t applesmc_key_at_index_type_show(struct device *dev,
> struct device_attribute *attr, char *sysfsbuf)
> {
> - char key[5];
> - char info[6];
> + struct applesmc_entry entry;
> int ret;
>
> - mutex_lock(&applesmc_lock);
> -
> - ret = applesmc_get_key_at_index(key_at_index, key);
> -
> - if (ret || !key[0]) {
> - mutex_unlock(&applesmc_lock);
> -
> - return -EINVAL;
> - }
> -
> - ret = applesmc_get_key_type(key, info);
> -
> - mutex_unlock(&applesmc_lock);
> -
> - if (!ret)
> - return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", info+1);
> - else
> + ret = applesmc_get_entry_by_index(key_at_index, &entry);
> + if (ret)
> return ret;
> +
> + return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", entry.type);
> }
>
> static ssize_t applesmc_key_at_index_name_show(struct device *dev,
> struct device_attribute *attr, char *sysfsbuf)
> {
> - char key[5];
> + struct applesmc_entry entry;
> int ret;
>
> - mutex_lock(&applesmc_lock);
> -
> - ret = applesmc_get_key_at_index(key_at_index, key);
> -
> - mutex_unlock(&applesmc_lock);
> + ret = applesmc_get_entry_by_index(key_at_index, &entry);
> + if (ret)
> + return ret;
>
> - if (!ret && key[0])
> - return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key);
> - else
> - return -EINVAL;
> + return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", entry.key);
> }
>
> static ssize_t applesmc_key_at_index_show(struct device *dev,
> @@ -999,12 +1042,8 @@ static ssize_t applesmc_key_at_index_show(struct device *dev,
> static ssize_t applesmc_key_at_index_store(struct device *dev,
> struct device_attribute *attr, const char *sysfsbuf, size_t count)
> {
> - mutex_lock(&applesmc_lock);
> -
> key_at_index = simple_strtoul(sysfsbuf, NULL, 10);
>
> - mutex_unlock(&applesmc_lock);
> -
> return count;
> }
>
> @@ -1640,10 +1679,15 @@ static int __init applesmc_init(void)
> goto out_driver;
> }
>
> - ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
> + /* create register cache */
> + ret = applesmc_init_smcreg();
> if (ret)
> goto out_device;
>
> + ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
> + if (ret)
> + goto out_smcreg;
> +
> /* Create key enumeration sysfs files */
> ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group);
> if (ret)
> @@ -1745,6 +1789,8 @@ out_fans:
> sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
> out_name:
> sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
> +out_smcreg:
> + applesmc_destroy_smcreg();
> out_device:
> platform_device_unregister(pdev);
> out_driver:
> @@ -1773,6 +1819,7 @@ static void __exit applesmc_exit(void)
> &fan_attribute_groups[--fans_handled]);
> sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
> sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
> + applesmc_destroy_smcreg();
> platform_device_unregister(pdev);
> platform_driver_unregister(&applesmc_driver);
> release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
> --
> 1.7.1
>
>
> _______________________________________________
> lm-sensors mailing list
>
lm-sensors@lm-sensors.org
>
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors