Skip to content

Commit

Permalink
rtc: rtc-hid-sensor-time: allow 16 and 32 bit values for all attributes.
Browse files Browse the repository at this point in the history
There is no real reason to not support 16 or 32 bit values too.

Signed-off-by: Alexander Holler <holler@ahsoftware.de>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Jonathan Cameron <jic23@cam.ac.uk>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Jingoo Han <jg1.han@samsung.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
aholler authored and torvalds committed Jul 3, 2013
1 parent 7e3c741 commit c67d96e
Showing 1 changed file with 32 additions and 27 deletions.
59 changes: 32 additions & 27 deletions drivers/rtc/rtc-hid-sensor-time.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,20 @@ static int hid_time_proc_event(struct hid_sensor_hub_device *hsdev,
return 0;
}

static u32 hid_time_value(size_t raw_len, char *raw_data)
{
switch (raw_len) {
case 1:
return *(u8 *)raw_data;
case 2:
return *(u16 *)raw_data;
case 4:
return *(u32 *)raw_data;
default:
return (u32)(~0U); /* 0xff... or -1 to denote an error */
}
}

static int hid_time_capture_sample(struct hid_sensor_hub_device *hsdev,
unsigned usage_id, size_t raw_len,
char *raw_data, void *priv)
Expand All @@ -85,29 +99,35 @@ static int hid_time_capture_sample(struct hid_sensor_hub_device *hsdev,

switch (usage_id) {
case HID_USAGE_SENSOR_TIME_YEAR:
/*
* The draft for HID-sensors (HUTRR39) currently doesn't define
* the range for the year attribute. Therefor we support
* 8 bit (0-99) and 16 or 32 bits (full) as size for the year.
*/
if (raw_len == 1) {
time_buf->tm_year = *(u8 *)raw_data;
if (time_buf->tm_year < 70)
/* assume we are in 1970...2069 */
time_buf->tm_year += 100;
} else
time_buf->tm_year = *(u16 *)raw_data-1900;
time_buf->tm_year =
(int)hid_time_value(raw_len, raw_data)-1900;
break;
case HID_USAGE_SENSOR_TIME_MONTH:
/* sensor sending the month as 1-12, we need 0-11 */
time_buf->tm_mon = *(u8 *)raw_data-1;
/* sensors are sending the month as 1-12, we need 0-11 */
time_buf->tm_mon = (int)hid_time_value(raw_len, raw_data)-1;
break;
case HID_USAGE_SENSOR_TIME_DAY:
time_buf->tm_mday = *(u8 *)raw_data;
time_buf->tm_mday = (int)hid_time_value(raw_len, raw_data);
break;
case HID_USAGE_SENSOR_TIME_HOUR:
time_buf->tm_hour = *(u8 *)raw_data;
time_buf->tm_hour = (int)hid_time_value(raw_len, raw_data);
break;
case HID_USAGE_SENSOR_TIME_MINUTE:
time_buf->tm_min = *(u8 *)raw_data;
time_buf->tm_min = (int)hid_time_value(raw_len, raw_data);
break;
case HID_USAGE_SENSOR_TIME_SECOND:
time_buf->tm_sec = *(u8 *)raw_data;
time_buf->tm_sec = (int)hid_time_value(raw_len, raw_data);
break;
default:
return -EINVAL;
Expand Down Expand Up @@ -153,28 +173,13 @@ static int hid_time_parse_report(struct platform_device *pdev,
"not all needed attributes inside the same report!\n");
return -EINVAL;
}
if (time_state->info[i].size != 1) {
/*
* The draft for HID-sensors (HUTRR39) currently
* doesn't define the range for the year attribute.
* Therefor we support both 8 bit (0-99) and 16 bit
* (full) as size for the year.
*/
if (time_state->info[i].attrib_id !=
HID_USAGE_SENSOR_TIME_YEAR) {
dev_err(&pdev->dev,
"attribute '%s' not 8 bits wide!\n",
hid_time_attrib_name(
time_state->info[i].attrib_id));
return -EINVAL;
}
if (time_state->info[i].size != 2) {
dev_err(&pdev->dev,
"attribute '%s' not 8 or 16 bits wide!\n",
if (time_state->info[i].size == 3 ||
time_state->info[i].size > 4) {
dev_err(&pdev->dev,
"attribute '%s' not 8, 16 or 32 bits wide!\n",
hid_time_attrib_name(
time_state->info[i].attrib_id));
return -EINVAL;
}
return -EINVAL;
}
if (time_state->info[i].units !=
HID_USAGE_SENSOR_UNITS_NOT_SPECIFIED &&
Expand Down

0 comments on commit c67d96e

Please sign in to comment.