|
From: <nbo...@us...> - 2007-04-09 16:57:56
|
Revision: 103
http://svn.sourceforge.net/mactel-linux/?rev=103&view=rev
Author: nboichat
Date: 2007-04-09 09:57:54 -0700 (Mon, 09 Apr 2007)
Log Message:
-----------
Update AppleSMC:
- Various input dev fixes.
- Allow setting accelerometer interrupt parameters.
Modified Paths:
--------------
trunk/kernel/mactel-patches-2.6.21/0009-applesmc_joydev.patch
trunk/kernel/mactel-patches-2.6.21/0011-applesmc2.patch
Modified: trunk/kernel/mactel-patches-2.6.21/0009-applesmc_joydev.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0009-applesmc_joydev.patch 2007-04-09 10:54:35 UTC (rev 102)
+++ trunk/kernel/mactel-patches-2.6.21/0009-applesmc_joydev.patch 2007-04-09 16:57:54 UTC (rev 103)
@@ -1,26 +1,42 @@
-Fix y axis on applesmc input device.
+- Invert y axis on input device. - Only activate the input device polling timer when the device is open. - Others fixes as asked by Dmitry Torokhov.
From: Nicolas Boichat <ni...@bo...>
---
- drivers/hwmon/applesmc.c | 2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
+ drivers/hwmon/applesmc.c | 29 +++++++++++++++++++++++++----
+ 1 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
-index 4060667..581ed3e 100644
+index 4060667..f7b59fc 100644
--- a/drivers/hwmon/applesmc.c
+++ b/drivers/hwmon/applesmc.c
-@@ -349,6 +349,7 @@ static void applesmc_calibrate(void)
+@@ -349,9 +349,22 @@ static void applesmc_calibrate(void)
{
applesmc_read_motion_sensor(SENSOR_X, &rest_x);
applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
+ rest_x = -rest_x;
}
- static void applesmc_mousedev_poll(unsigned long unused)
-@@ -366,6 +367,7 @@ static void applesmc_mousedev_poll(unsigned long unused)
+-static void applesmc_mousedev_poll(unsigned long unused)
++static int applesmc_idev_open(struct input_dev *dev)
++{
++ add_timer(&applesmc_timer);
++
++ return 0;
++}
++
++static void applesmc_idev_close(struct input_dev *dev)
++{
++ del_timer_sync(&applesmc_timer);
++}
++
++static void applesmc_idev_poll(unsigned long unused)
+ {
+ s16 x, y;
+
+@@ -366,6 +379,7 @@ static void applesmc_mousedev_poll(unsigned long unused)
if (applesmc_read_motion_sensor(SENSOR_Y, &y))
goto out;
@@ -28,3 +44,37 @@
input_report_abs(applesmc_idev, ABS_X, x - rest_x);
input_report_abs(applesmc_idev, ABS_Y, y - rest_y);
input_sync(applesmc_idev);
+@@ -739,23 +753,30 @@ static int applesmc_create_accelerometer(void)
+
+ /* initialize the input class */
+ applesmc_idev->name = "applesmc";
++ applesmc_idev->id.bustype = BUS_HOST;
+ applesmc_idev->cdev.dev = &pdev->dev;
+ applesmc_idev->evbit[0] = BIT(EV_ABS);
++ applesmc_idev->open = applesmc_idev_open;
++ applesmc_idev->close = applesmc_idev_close;
+ input_set_abs_params(applesmc_idev, ABS_X,
+ -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
+ input_set_abs_params(applesmc_idev, ABS_Y,
+ -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
+
+- input_register_device(applesmc_idev);
++ ret = input_register_device(applesmc_idev);
++ if (ret)
++ goto out_idev;
+
+ /* start up our timer for the input device */
+ init_timer(&applesmc_timer);
+- applesmc_timer.function = applesmc_mousedev_poll;
++ applesmc_timer.function = applesmc_idev_poll;
+ applesmc_timer.expires = jiffies + APPLESMC_POLL_PERIOD;
+- add_timer(&applesmc_timer);
+
+ return 0;
+
++out_idev:
++ input_free_device(applesmc_idev);
++
+ out:
+ printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
+ return ret;
Modified: trunk/kernel/mactel-patches-2.6.21/0011-applesmc2.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0011-applesmc2.patch 2007-04-09 10:54:35 UTC (rev 102)
+++ trunk/kernel/mactel-patches-2.6.21/0011-applesmc2.patch 2007-04-09 16:57:54 UTC (rev 103)
@@ -5,11 +5,11 @@
---
- drivers/hwmon/applesmc.c | 471 ++++++++++++++++++++++++++++++++++++++++------
- 1 files changed, 410 insertions(+), 61 deletions(-)
+ drivers/hwmon/applesmc.c | 606 +++++++++++++++++++++++++++++++++++++++++-----
+ 1 files changed, 540 insertions(+), 66 deletions(-)
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
-index 581ed3e..c68391d 100644
+index f7b59fc..7c368a3 100644
--- a/drivers/hwmon/applesmc.c
+++ b/drivers/hwmon/applesmc.c
@@ -37,40 +37,71 @@
@@ -56,22 +56,18 @@
+#define BACKLIGHT_KEY "LKSB" /* w-o length 2 */
+
+#define CLAMSHELL_KEY "MSLD" /* r-o ui8 (unused) */
-+
+
+-#define CLAMSHELL_KEY "MSLD" /* r-o length 1 (unused) */
+#define MOTION_SENSOR_X_KEY "MO_X" /* r-o sp78 (2 bytes) */
+#define MOTION_SENSOR_Y_KEY "MO_Y" /* r-o sp78 (2 bytes) */
+#define MOTION_SENSOR_Z_KEY "MO_Z" /* r-o sp78 (2 bytes) */
+#define MOTION_SENSOR_KEY "MOCN" /* r/w ui16 */
-
--#define CLAMSHELL_KEY "MSLD" /* r-o length 1 (unused) */
++
+/* Interrupt controls. */
+/* Don't know what these parameters control. */
+#define MOTION_SENSOR_PARAM_1L "MOLD" /* r/w ui8 */
+#define MOTION_SENSOR_PARAM_1H "MOHD" /* r/w ui8 */
-
--#define MOTION_SENSOR_X_KEY "MO_X" /* r-o length 2 */
--#define MOTION_SENSOR_Y_KEY "MO_Y" /* r-o length 2 */
--#define MOTION_SENSOR_Z_KEY "MO_Z" /* r-o length 2 */
--#define MOTION_SENSOR_KEY "MOCN" /* r/w length 2 */
++
+/*
+ * If the norm of the position (sqrt(MO_X^2+MO_Y^2+MO_Z^2)) is smaller than
+ * MOLT (free fall), or bigger than MOHT (high acceleration), SMC will trigger
@@ -79,7 +75,11 @@
+ */
+#define MOTION_MIN_NORM "MOLT" /* r/w sp78 (2 bytes) */
+#define MOTION_MAX_NORM "MOHT" /* r/w sp78 (2 bytes) */
-+
+
+-#define MOTION_SENSOR_X_KEY "MO_X" /* r-o length 2 */
+-#define MOTION_SENSOR_Y_KEY "MO_Y" /* r-o length 2 */
+-#define MOTION_SENSOR_Z_KEY "MO_Z" /* r-o length 2 */
+-#define MOTION_SENSOR_KEY "MOCN" /* r/w length 2 */
+#define MSDW_KEY "MSDW" /* r/w flag (1 byte) */
-#define FANS_COUNT "FNum" /* r-o length 1 */
@@ -126,7 +126,7 @@
+ if (len > APPLESMC_MAX_DATA_LENGTH) {
+ printk(KERN_ERR "applesmc_read_key: cannot read more than "
-+ APPLESMC_MAX_DATA_LENGTH " bytes");
++ "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
+ return -EINVAL;
+ }
+
@@ -173,7 +173,7 @@
+ if (len > APPLESMC_MAX_DATA_LENGTH) {
+ printk(KERN_ERR "applesmc_write_key: cannot write more than "
-+ APPLESMC_MAX_DATA_LENGTH " bytes");
++ "%d bytes\n", APPLESMC_MAX_DATA_LENGTH);
+ return -EINVAL;
+ }
+
@@ -290,8 +290,8 @@
+
+ if (len > APPLESMC_MAX_DATA_LENGTH) {
+ printk(KERN_ERR "applesmc_init_check_key_value: cannot "
-+ "read/write more than "
-+ APPLESMC_MAX_DATA_LENGTH " bytes");
++ "read/write more than %d bytes",
++ APPLESMC_MAX_DATA_LENGTH);
+ return -EINVAL;
+ }
+
@@ -436,16 +436,16 @@
+ printk(KERN_WARNING "applesmc: failed to init "
+ "the accelerometer\n");
+ goto out;
- }
-
-- printk(KERN_WARNING "applesmc: failed to init the device\n");
++ }
++
+ ret1 = request_irq(APPLESMC_IRQ, applesmc_irq_handler, IRQF_DISABLED,
+ "applesmc_irq_handler", NULL);
+
+ if (ret1) {
+ printk(KERN_WARNING "applesmc: cannot setup irq handler\n");
-+ }
-+
+ }
+
+- printk(KERN_WARNING "applesmc: failed to init the device\n");
+ printk(KERN_DEBUG "applesmc: accelerometer "
+ "successfully initialized.\n");
+ ret = 0;
@@ -469,7 +469,7 @@
.driver = {
.name = "applesmc",
.owner = THIS_MODULE,
-@@ -575,6 +799,33 @@ out:
+@@ -587,6 +811,33 @@ out:
return count;
}
@@ -503,7 +503,7 @@
static ssize_t applesmc_calibrate_show(struct device *dev,
struct device_attribute *attr, char *sysfsbuf)
{
-@@ -591,6 +842,77 @@ static ssize_t applesmc_calibrate_store(struct device *dev,
+@@ -603,6 +854,26 @@ static ssize_t applesmc_calibrate_store(struct device *dev,
return count;
}
@@ -527,6 +527,13 @@
+ return sprintf(sysfsbuf, "%d\n", count);
+}
+
+ static void applesmc_backlight_set(struct led_classdev *led_cdev,
+ enum led_brightness value)
+ {
+@@ -615,6 +886,168 @@ static void applesmc_backlight_set(struct led_classdev *led_cdev,
+ mutex_unlock(&applesmc_lock);
+ }
+
+static ssize_t applesmc_key_at_index_show(struct device *dev,
+ struct device_attribute *attr, char *sysfsbuf)
+{
@@ -578,20 +585,151 @@
+ return count;
+}
+
- static void applesmc_backlight_set(struct led_classdev *led_cdev,
- enum led_brightness value)
- {
-@@ -615,6 +937,9 @@ static DEVICE_ATTR(calibrate, 0644,
++static ssize_t applesmc_param_show(char* key, int length, char *sysfsbuf)
++{
++ int ret;
++ unsigned int value = 0;
++ u8 buffer[2];
++
++ mutex_lock(&applesmc_lock);
++
++ ret = applesmc_read_key(key, buffer, length);
++ if (length == 2) {
++ value = ((unsigned int)buffer[0] << 8) | buffer[1];
++ }
++ else if (length == 1) {
++ value = buffer[0];
++ }
++ else {
++ printk("Invalid length for applesmc_param_show");
++ ret = -EINVAL;
++ }
++
++ mutex_unlock(&applesmc_lock);
++ if (ret)
++ return ret;
++ else
++ return sprintf(sysfsbuf, "%u\n", value);
++}
++
++static ssize_t applesmc_param_store(char* key, int length,
++ const char *sysfsbuf, size_t count)
++{
++ int ret;
++ u32 value;
++ u8 buffer[2];
++
++ value = simple_strtoul(sysfsbuf, NULL, 10);
++
++ if (length == 2) {
++ if (value > 0xffff)
++ return -EINVAL;
++
++ buffer[0] = (value >> 8) & 0xff;
++ buffer[1] = value & 0xff;
++ } else if (length == 1) {
++ if (value > 0xff)
++ return -EINVAL;
++
++ buffer[0] = value & 0xff;
++ } else {
++ printk("Invalid length for applesmc_param_store");
++ return -EINVAL;
++ }
++
++ mutex_lock(&applesmc_lock);
++
++ ret = applesmc_write_key(key, buffer, 2);
++
++ mutex_unlock(&applesmc_lock);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_param_1_min_show(struct device *dev,
++ struct device_attribute *attr, char *sysfsbuf)
++{
++ return applesmc_param_show(MOTION_SENSOR_PARAM_1L, 1, sysfsbuf);
++}
++
++static ssize_t applesmc_param_1_max_show(struct device *dev,
++ struct device_attribute *attr, char *sysfsbuf)
++{
++ return applesmc_param_show(MOTION_SENSOR_PARAM_1H, 1, sysfsbuf);
++}
++
++static ssize_t applesmc_norm_min_show(struct device *dev,
++ struct device_attribute *attr, char *sysfsbuf)
++{
++ return applesmc_param_show(MOTION_MIN_NORM, 2, sysfsbuf);
++}
++
++static ssize_t applesmc_norm_max_show(struct device *dev,
++ struct device_attribute *attr, char *sysfsbuf)
++{
++ return applesmc_param_show(MOTION_MAX_NORM, 2, sysfsbuf);
++}
++
++static ssize_t applesmc_param_1_min_store(struct device *dev,
++ struct device_attribute *attr, const char *sysfsbuf, size_t count)
++{
++ return applesmc_param_store(MOTION_SENSOR_PARAM_1L, 1, sysfsbuf, count);
++}
++
++static ssize_t applesmc_param_1_max_store(struct device *dev,
++ struct device_attribute *attr, const char *sysfsbuf, size_t count)
++{
++ return applesmc_param_store(MOTION_SENSOR_PARAM_1H, 1, sysfsbuf, count);
++}
++
++static ssize_t applesmc_norm_min_store(struct device *dev,
++ struct device_attribute *attr, const char *sysfsbuf, size_t count)
++{
++ return applesmc_param_store(MOTION_MIN_NORM, 2, sysfsbuf, count);
++}
++
++static ssize_t applesmc_norm_max_store(struct device *dev,
++ struct device_attribute *attr, const char *sysfsbuf, size_t count)
++{
++ return applesmc_param_store(MOTION_MAX_NORM, 2, sysfsbuf, count);
++}
++
+ static struct led_classdev applesmc_backlight = {
+ .name = "smc:kbd_backlight",
+ .default_trigger = "nand-disk",
+@@ -624,9 +1057,29 @@ static struct led_classdev applesmc_backlight = {
+ static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
+ static DEVICE_ATTR(calibrate, 0644,
+ applesmc_calibrate_show, applesmc_calibrate_store);
++static DEVICE_ATTR(param_1_min, 0644, applesmc_param_1_min_show, applesmc_param_1_min_store);
++static DEVICE_ATTR(param_1_max, 0644, applesmc_param_1_max_show, applesmc_param_1_max_store);
++static DEVICE_ATTR(norm_min, 0644, applesmc_norm_min_show, applesmc_norm_min_store);
++static DEVICE_ATTR(norm_max, 0644, applesmc_norm_max_show, applesmc_norm_max_store);
static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
+static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);
+static DEVICE_ATTR(key_at_index, 0600, applesmc_key_at_index_show, applesmc_key_at_index_store);
+
++static struct attribute *accelerometer_attributes[] = {
++ &dev_attr_position.attr,
++ &dev_attr_calibrate.attr,
++ &dev_attr_param_1_min.attr,
++ &dev_attr_param_1_max.attr,
++ &dev_attr_norm_min.attr,
++ &dev_attr_norm_max.attr,
++ NULL
++};
++
++static const struct attribute_group accelerometer_attributes_group =
++ { .attrs = accelerometer_attributes };
++
/*
* Macro defining SENSOR_DEVICE_ATTR for a fan sysfs entries.
* - show actual speed
-@@ -643,6 +968,9 @@ static SENSOR_DEVICE_ATTR_2(fan##offset##_target_speed, S_IRUGO | S_IWUSR, \
+@@ -655,6 +1108,9 @@ static SENSOR_DEVICE_ATTR_2(fan##offset##_target_speed, S_IRUGO | S_IWUSR, \
static SENSOR_DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
applesmc_show_fan_manual, applesmc_store_fan_manual, offset); \
\
@@ -601,7 +739,7 @@
static struct attribute *fan##offset##_attributes[] = { \
&sensor_dev_attr_fan##offset##_actual_speed.dev_attr.attr, \
&sensor_dev_attr_fan##offset##_minimum_speed.dev_attr.attr, \
-@@ -650,6 +978,7 @@ static struct attribute *fan##offset##_attributes[] = { \
+@@ -662,6 +1118,7 @@ static struct attribute *fan##offset##_attributes[] = { \
&sensor_dev_attr_fan##offset##_safe_speed.dev_attr.attr, \
&sensor_dev_attr_fan##offset##_target_speed.dev_attr.attr, \
&sensor_dev_attr_fan##offset##_manual.dev_attr.attr, \
@@ -609,7 +747,7 @@
NULL \
};
-@@ -682,6 +1011,16 @@ static SENSOR_DEVICE_ATTR(temperature_5, S_IRUGO,
+@@ -694,6 +1151,16 @@ static SENSOR_DEVICE_ATTR(temperature_5, S_IRUGO,
applesmc_show_temperature, NULL, 5);
static SENSOR_DEVICE_ATTR(temperature_6, S_IRUGO,
applesmc_show_temperature, NULL, 6);
@@ -626,7 +764,7 @@
static struct attribute *temperature_attributes[] = {
&sensor_dev_attr_temperature_0.dev_attr.attr,
-@@ -691,6 +1030,11 @@ static struct attribute *temperature_attributes[] = {
+@@ -703,6 +1170,11 @@ static struct attribute *temperature_attributes[] = {
&sensor_dev_attr_temperature_4.dev_attr.attr,
&sensor_dev_attr_temperature_5.dev_attr.attr,
&sensor_dev_attr_temperature_6.dev_attr.attr,
@@ -638,7 +776,21 @@
};
/* Module stuff */
-@@ -881,6 +1225,11 @@ static int __init applesmc_init(void)
+@@ -734,11 +1206,8 @@ static int applesmc_create_accelerometer(void)
+ {
+ int ret;
+
+- ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_position.attr);
+- if (ret)
+- goto out;
+-
+- ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_calibrate.attr);
++ ret = sysfs_create_group(&pdev->dev.kobj,
++ &accelerometer_attributes_group);
+ if (ret)
+ goto out;
+
+@@ -900,6 +1369,11 @@ static int __init applesmc_init(void)
goto out_accelerometer;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|