From c75ca5c6d481105b62013dc955a6ddbef6653844 Mon Sep 17 00:00:00 2001 From: lyx Date: Wed, 20 Apr 2011 22:16:13 -0700 Subject: [PATCH] modify gsensor and compass drivers --- arch/arm/mach-rk29/include/mach/custom_log.h | 85 ++++++++ drivers/input/gsensor/mma8452.c | 213 ++++++++++++++++--- drivers/input/magnetometer/ak8975.c | 33 ++- include/linux/mma8452.h | 27 +-- 4 files changed, 302 insertions(+), 56 deletions(-) create mode 100755 arch/arm/mach-rk29/include/mach/custom_log.h mode change 100644 => 100755 include/linux/mma8452.h diff --git a/arch/arm/mach-rk29/include/mach/custom_log.h b/arch/arm/mach-rk29/include/mach/custom_log.h new file mode 100755 index 000000000000..b4c85cda9dfd --- /dev/null +++ b/arch/arm/mach-rk29/include/mach/custom_log.h @@ -0,0 +1,85 @@ +/* -------------------------------------------------------------------------------------------------------- + * Copyright(C), 2010-2011, Fuzhou Rockchip Co., Ltd. All Rights Reserved. + * + * File: custom_log.h + * + * Desc: ChenZhen Æ«ºÃµÄ log Êä³öµÄ¶¨ÖÆʵÏÖ. + * + * ----------------------------------------------------------------------------------- + * < Ï°Óï ºÍ ËõÂÔÓï > : + * + * ----------------------------------------------------------------------------------- + * + * Usage: µ÷Óñ¾ log »ú¹¹µÄ .c Îļþ, ÈôҪʹÄÜÕâÀïµÄ log »úÖÆ, + * Ôò±ØÐëÔÚ inclue ±¾Îļþ֮ǰ, "#define ENABLE_DEBUG_LOG" ÏÈ. + * Note: + * + * Author: ChenZhen + * + * -------------------------------------------------------------------------------------------------------- + * Version: + * v1.0 + * -------------------------------------------------------------------------------------------------------- + * Log: + ----Fri Nov 19 15:20:28 2010 v1.0 + * + * -------------------------------------------------------------------------------------------------------- + */ + + +#ifndef __CUSTOM_LOG_H__ +#define __CUSTOM_LOG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* --------------------------------------------------------------------------------------------------------- + * Include Files + * --------------------------------------------------------------------------------------------------------- + */ +#include + + +/* --------------------------------------------------------------------------------------------------------- + * Macros Definition + * --------------------------------------------------------------------------------------------------------- + */ + +#ifdef ENABLE_DEBUG_LOG +#define D(fmt, args...) \ + { printk("[File]:%s; [Line]:%d; [Func]:%s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); } +#else +#define D(...) ((void)0) +#endif + +#define W(fmt, args...) \ + { printk("WARNING :: [File]:%s; [Line]:%d; [Func]:%s() :: " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); } + +#define E(fmt, args...) \ + { printk("ERROR :: [File]:%s; [Line]:%d; [Func]:%s() :: " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); } + + + +/* --------------------------------------------------------------------------------------------------------- + * Types and Structures Definition + * --------------------------------------------------------------------------------------------------------- */ + + +/* --------------------------------------------------------------------------------------------------------- + * Global Functions' Prototype + * --------------------------------------------------------------------------------------------------------- + */ + + +/* --------------------------------------------------------------------------------------------------------- + * Inline Functions Implementation + * --------------------------------------------------------------------------------------------------------- + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CUSTOM_LOG_H__ */ + diff --git a/drivers/input/gsensor/mma8452.c b/drivers/input/gsensor/mma8452.c index 2bfd288457d3..3db96749aab2 100755 --- a/drivers/input/gsensor/mma8452.c +++ b/drivers/input/gsensor/mma8452.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -32,11 +33,22 @@ #include #endif -#if 0 -#define mmaprintk(x...) printk(x) +// #define ENABLE_DEBUG_LOG +#include + +#if 1 +#define mmaprintk(x...) D(x) #else #define mmaprintk(x...) #endif + +// #define ENABLE_VERBOSE_LOG +#ifdef ENABLE_VERBOSE_LOG +#define V(x...) D(x) +#else +#define V(x...) +#endif + static int mma8452_probe(struct i2c_client *client, const struct i2c_device_id *id); #define MMA8452_SPEED 200 * 1000 @@ -53,13 +65,48 @@ static DECLARE_WAIT_QUEUE_HEAD(data_ready_wq); static struct early_suspend mma8452_early_suspend; #endif static int revision = -1; +static const char* vendor = "Freescale Semiconductor"; + + +typedef char status_t; +/*status*/ +#define MMA8452_OPEN 1 +#define MMA8452_CLOSE 0 + + +// .! : É豸ʵÀýÊý¾ÝÀàÐÍ. +struct mma8452_data { + status_t status; + char curr_tate; + struct input_dev *input_dev; + struct i2c_client *client; + struct work_struct work; + struct delayed_work delaywork; /*report second event*/ + + /** »º´æ sensor Êý¾Ý. */ + struct mma8452_axis sense_data; + /** ¶Ô "sense_data" µÄ»¥³â±£»¤. */ + struct mutex sense_data_mutex; + + /** ±êʶ "sense_data" ÖеÄÊý¾ÝÊÇ·ñÓÐЧ. */ + atomic_t data_ready; + /** ÓÃÀ´µÈ´ý Êý¾Ý ready µÄµÈ´ý¶ÓÁÐÍ·. */ + wait_queue_head_t data_ready_wq; + + /** ±êʶ É豸±»ÒªÇó START ²É¼¯Êý¾ÝµÄ´ÎÊý, ¶ÔÓ¦ MMA_IOCTL_START ¿ÉÄܱ»µ÷Óöà´ÎµÄÇé¿ö. */ + int start_count; + /** ¶Ô 'start_count' ºÍÏà¹Ø²Ù×÷µÄ»¥³â±£»¤. */ + struct mutex operation_mutex; +}; + /* AKM HW info */ static ssize_t gsensor_vendor_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t ret = 0; - sprintf(buf, "%#x\n", revision); + // sprintf(buf, "%#x\n", revision); + sprintf(buf, "%s.\n", vendor); ret = strlen(buf) + 1; return ret; @@ -82,7 +129,7 @@ static int gsensor_sysfs_init(void) goto err; } - ret = sysfs_create_file(android_gsensor_kobj, &dev_attr_vendor.attr); + ret = sysfs_create_file(android_gsensor_kobj, &dev_attr_vendor.attr); // "vendor" if (ret) { mmaprintk(KERN_ERR "MMA8452 gsensor_sysfs_init:"\ @@ -206,7 +253,7 @@ static int mma8452_start_dev(struct i2c_client *client, char rate) { int ret = 0; int tmp; - struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); + struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); // mma8452_data ¶¨ÒåÔÚ mma8452.h ÖÐ. mmaprintk("-------------------------mma8452 start ------------------------\n"); /* standby */ @@ -309,11 +356,13 @@ static void mma8452_report_value(struct i2c_client *client, struct mma8452_axis input_report_abs(mma8452->input_dev, ABS_Y, axis->y); input_report_abs(mma8452->input_dev, ABS_Z, axis->z); input_sync(mma8452->input_dev); - mmaprintk("Gsensor x==%d y==%d z==%d\n",axis->x,axis->y,axis->z); + V("Gsensor x==%d y==%d z==%d\n",axis->x,axis->y,axis->z); } +/** ÔÚ µ×°ë²¿Ö´ÐÐ, ¾ßÌå»ñÈ¡ g sensor Êý¾Ý. */ static int mma8452_get_data(struct i2c_client *client) { + struct mma8452_data* mma8452 = i2c_get_clientdata(client); char buffer[6]; int ret; struct mma8452_axis axis; @@ -328,7 +377,7 @@ static int mma8452_get_data(struct i2c_client *client) return ret; } while (0); - mmaprintk("0x%02x 0x%02x 0x%02x \n",buffer[0],buffer[1],buffer[2]); + V("0x%02x 0x%02x 0x%02x \n",buffer[0],buffer[1],buffer[2]); axis.x = mma8452_convert_to_int(buffer[0]); axis.y = mma8452_convert_to_int(buffer[1]); @@ -340,14 +389,24 @@ static int mma8452_get_data(struct i2c_client *client) swap(axis.x,axis.y); } - // mmaprintk( "%s: ------------------mma8452_GetData axis = %d %d %d--------------\n", - // __func__, axis.x, axis.y, axis.z); + V( "%s: ------------------mma8452_GetData axis = %d %d %d--------------\n", + __func__, axis.x, axis.y, axis.z); //memcpy(sense_data, &axis, sizeof(axis)); mma8452_report_value(client, &axis); //atomic_set(&data_ready, 0); //wake_up(&data_ready_wq); + /* »¥³âµØ»º´æÊý¾Ý. */ + mutex_lock(&(mma8452->sense_data_mutex) ); + mma8452->sense_data = axis; + mutex_unlock(&(mma8452->sense_data_mutex) ); + + /* ÖÃλ data_ready */ + atomic_set(&(mma8452->data_ready), 1); + /* »½ÐÑ data_ready µÈ´ý¶ÓÁÐÍ·. */ + wake_up(&(mma8452->data_ready_wq) ); + return 0; } @@ -366,6 +425,37 @@ static int mma8452_trans_buff(char *rbuf, int size) } */ +/** + * »ñÈ¡µ±Ç°ÒѾ­ cache Á赀 sensor Êý¾Ý. + * @param sense_data + * Ö¸Ïò·µ»ØÓà buffer. + * @param client + * µ±Ç° i2c client É豸ʵÀýÊý¾ÝµÄÖ¸Õë. + * @return + * Èô³É¹¦, ·µ»Ø 0; ·ñÔò, ·µ»ØÆäËü. + */ +static int mma8452_get_cached_data(struct i2c_client* client, struct mma8452_axis* sense_data) +{ + struct mma8452_data* this = (struct mma8452_data *)i2c_get_clientdata(client); + + /* Óг¬Ê±µØ, µÈ´ýÊý¾Ý ready. */ + wait_event_interruptible_timeout(this->data_ready_wq, + atomic_read(&(this->data_ready) ), + msecs_to_jiffies(1000) ); + /* Èô³¬Ê±, ÇÒÊý¾ÝûÓÐ ready. */ + if ( 0 == atomic_read(&(this->data_ready) ) ) { + E("waiting 'data_ready_wq' timed out."); + /* ·µ»Ø error. */ + return -1; + } + /* Êý¾ÝÒѾ­ ready, »¥³âµØ·µ»ØÊý¾Ý. */ + mutex_lock(&(this->sense_data_mutex) ); + *sense_data = this->sense_data; + mutex_unlock(&(this->sense_data_mutex) ); + /* ·µ»Ø. */ + return 0; +} + static int mma8452_open(struct inode *inode, struct file *file) { return 0;//nonseekable_open(inode, file); @@ -381,13 +471,15 @@ static int mma8452_ioctl(struct inode *inode, struct file *file, unsigned int cm { void __user *argp = (void __user *)arg; - char msg[RBUFF_SIZE + 1]; + // char msg[RBUFF_SIZE + 1]; + struct mma8452_axis sense_data = {0}; int ret = -1; char rate; struct i2c_client *client = container_of(mma8452_device.parent, struct i2c_client, dev); + struct mma8452_data* this = (struct mma8452_data *)i2c_get_clientdata(client); /* É豸Êý¾ÝʵÀýµÄÖ¸Õë. */ switch (cmd) { - case ECS_IOCTL_APP_SET_RATE: + case MMA_IOCTL_APP_SET_RATE: if (copy_from_user(&rate, argp, sizeof(rate))) return -EFAULT; break; @@ -396,36 +488,73 @@ static int mma8452_ioctl(struct inode *inode, struct file *file, unsigned int cm } switch (cmd) { - case ECS_IOCTL_START: - ret = mma8452_start(client, MMA8452_RATE_12P5); - if (ret < 0) - return ret; - break; - case ECS_IOCTL_CLOSE: - ret = mma8452_close(client); - if (ret < 0) - return ret; - break; - case ECS_IOCTL_APP_SET_RATE: + case MMA_IOCTL_START: + /* ÉÏËø. */ + mutex_lock(&(this->operation_mutex) ); + D("to perform 'MMA_IOCTL_START', former 'start_count' is %d.", this->start_count); + /* ¼ÇÊý ×Ô¼Ó. */ + (this->start_count)++; + /* ÈôÊdzõ´Î start, Ôò... */ + if ( 1 == this->start_count ) { + /* ¸´Î» data_ready. */ + atomic_set(&(this->data_ready), 0); + /* Ö´ÐоßÌåµÄ¶ÔÓ²¼þµÄÆô¶¯²Ù×÷. */ + if ( (ret = mma8452_start(client, MMA8452_RATE_12P5) ) < 0 ) { + mutex_unlock(&(this->operation_mutex) ); + return ret; + } + } + /* ½âËø. */ + mutex_unlock(&(this->operation_mutex) ); + D("finish 'MMA_IOCTL_START', ret = %d.", ret); + /* ·µ»Ø. */ + return 0; + + case MMA_IOCTL_CLOSE: + /* ÉÏËø. */ + mutex_lock(&(this->operation_mutex) ); + D("to perform 'MMA_IOCTL_CLOSE', former 'start_count' is %d, PID : %d", this->start_count, get_current()->pid); + /* Èô¼ÇÊý×Ô¼õµ½ 0, Ôò... */ + if ( 0 == (--(this->start_count) ) ) { + /* ¸´Î» data_ready. */ + atomic_set(&(this->data_ready), 0); + /* Ö´ÐоßÌåµÄ¶ÔÓ²¼þµÄ stop ²Ù×÷. */ + if ( (ret = mma8452_close(client) ) < 0 ) { + mutex_unlock(&(this->operation_mutex) ); + return ret; + } + } + /* ½âËø. */ + mutex_unlock(&(this->operation_mutex) ); + /* ·µ»Ø. */ + return 0; + + case MMA_IOCTL_APP_SET_RATE: ret = mma8452_reset_rate(client, rate); if (ret < 0) return ret; break; - /* - case ECS_IOCTL_GETDATA: - ret = mma8452_trans_buff(msg, RBUFF_SIZE); - if (ret < 0) + case MMA_IOCTL_GETDATA: + // ret = mma8452_trans_buff(msg, RBUFF_SIZE); + if ( (ret = mma8452_get_cached_data(client, &sense_data) ) < 0 ) { + E("failed to get cached sense data, ret = %d.", ret); return ret; + } break; - */ default: return -ENOTTY; } switch (cmd) { - case ECS_IOCTL_GETDATA: + case MMA_IOCTL_GETDATA: + /* if (copy_to_user(argp, &msg, sizeof(msg))) return -EFAULT; + */ + if ( copy_to_user(argp, &sense_data, sizeof(sense_data) ) ) { + D("failed to copy sense data to user space."); + return -EFAULT; + } break; default: break; @@ -452,8 +581,8 @@ static void mma8452_delaywork_func(struct work_struct *work) struct i2c_client *client = mma8452->client; if (mma8452_get_data(client) < 0) - mmaprintk(KERN_ERR "MMA8452 mma_work_func: Get data failed\n"); - mmaprintk("%s :int src:0x%02x\n",__FUNCTION__,mma845x_read_reg(mma8452->client,MMA8452_REG_INTSRC)); + E(KERN_ERR "MMA8452 mma_work_func: Get data failed\n"); + V("%s :int src:0x%02x\n",__FUNCTION__,mma845x_read_reg(mma8452->client,MMA8452_REG_INTSRC)); enable_irq(client->irq); } @@ -462,8 +591,9 @@ static irqreturn_t mma8452_interrupt(int irq, void *dev_id) struct mma8452_data *mma8452 = (struct mma8452_data *)dev_id; disable_irq_nosync(irq); + /* .! : ÑÓ³ÙµØÔÚ µ×°ë²¿ ·¢ÆðºóÐø²Ù×÷(¶ÁÈ¡¾ßÌåÊý¾Ý). */ schedule_delayed_work(&mma8452->delaywork, msecs_to_jiffies(30)); - mmaprintk("%s :enter\n",__FUNCTION__); + V("%s :enter\n",__FUNCTION__); return IRQ_HANDLED; } @@ -474,6 +604,7 @@ static struct file_operations mma8452_fops = { .ioctl = mma8452_ioctl, }; +/** ¿ØÖÆÉ豸. */ static struct miscdevice mma8452_device = { .minor = MISC_DYNAMIC_MINOR, .name = "mma8452_daemon",//"mma8452_daemon", @@ -548,12 +679,16 @@ static const struct i2c_device_id mma8452_id[] = { { } }; +/** ±íÕ÷Çý¶¯µÄÊý¾ÝÀàÐͶ¨Òå. */ static struct i2c_driver mma8452_driver = { .driver = { .name = "gs_mma8452", }, .id_table = mma8452_id, - .probe = mma8452_probe, + .probe = mma8452_probe, // .!! : ¶Ô probe() µÄµ÷ÓÃ, ÈÔÊÇÓÉ ×¢²áÉ豸µÄ²Ù×÷´¥·¢µÄ, + // ¾ßÌå²Î¼û board-rk29sdk.c ÖÐµÄ board_i2c0_devices. + // ÔÚ board_i2c0_devices ÖÐÉùÃ÷ÁËÒ»¸ö¿ÉÒÔʹÓÃÃû³ÆÊÇ "gs_mma8452" Çý¶¯³ÌÐòµÄ I2C É豸. + // ͬʱҲÌåÏÖÁË I2C µØÖ· ºÍ Öն˺ŵÈÐÅÏ¢. .remove = __devexit_p(mma8452_remove), #ifndef CONFIG_HAS_EARLYSUSPEND .suspend = &mma8452_suspend, @@ -687,8 +822,18 @@ static int mma8452_probe(struct i2c_client *client, const struct i2c_device_id register_early_suspend(&mma8452_early_suspend); #endif - mma8452->status = -1; printk(KERN_INFO "mma8452 probe ok\n"); + memset(&(mma8452->sense_data), 0, sizeof(struct mma8452_axis) ); + mutex_init(&(mma8452->sense_data_mutex) ); + + atomic_set(&(mma8452->data_ready), 0); + init_waitqueue_head(&(mma8452->data_ready_wq) ); + + mma8452->start_count = 0; + mutex_init(&(mma8452->operation_mutex) ); + + // mma8452->status = -1; + mma8452->status = MMA8452_CLOSE; #if 0 // mma8452_start_test(this_client); mma8452_start(client, MMA8452_RATE_12P5); @@ -711,7 +856,7 @@ exit_invalid_devid: exit_alloc_data_failed: ; mmaprintk("%s error\n",__FUNCTION__); - return err; + return -1; } diff --git a/drivers/input/magnetometer/ak8975.c b/drivers/input/magnetometer/ak8975.c index 78210a1d9e11..92970094de22 100755 --- a/drivers/input/magnetometer/ak8975.c +++ b/drivers/input/magnetometer/ak8975.c @@ -34,7 +34,7 @@ #include "ak8975.h" #define AKM8975_DEBUG 1 -#define AKM8975_DEBUG_MSG 1 +#define AKM8975_DEBUG_MSG 0 #define AKM8975_DEBUG_FUNC 0 #define AKM8975_DEBUG_DATA 0 #define MAX_FAILURE_COUNT 3 @@ -179,6 +179,8 @@ static int AKECS_SetMode_SngMeasure(void) { char buffer[2]; + AKMDBG("enter %s\n", __func__); + atomic_set(&data_ready, 0); /* Set measure mode */ @@ -192,6 +194,7 @@ static int AKECS_SetMode_SngMeasure(void) static int AKECS_SetMode_SelfTest(void) { char buffer[2]; + AKMDBG("enter %s\n", __func__); /* Set measure mode */ buffer[0] = AK8975_REG_CNTL; @@ -203,6 +206,7 @@ static int AKECS_SetMode_SelfTest(void) static int AKECS_SetMode_FUSEAccess(void) { char buffer[2]; + AKMDBG("enter %s\n", __func__); /* Set measure mode */ buffer[0] = AK8975_REG_CNTL; @@ -214,6 +218,7 @@ static int AKECS_SetMode_FUSEAccess(void) static int AKECS_SetMode_PowerDown(void) { char buffer[2]; + AKMDBG("enter %s\n", __func__); /* Set powerdown mode */ buffer[0] = AK8975_REG_CNTL; @@ -225,6 +230,7 @@ static int AKECS_SetMode_PowerDown(void) static int AKECS_SetMode(char mode) { int ret; + AKMDBG("enter %s\n", __func__); switch (mode) { case AK8975_MODE_SNG_MEASURE: @@ -253,6 +259,7 @@ static int AKECS_CheckDevice(void) { char buffer[2]; int ret; + AKMDBG("enter %s\n", __func__); /* Set measure mode */ buffer[0] = AK8975_REG_WIA; @@ -279,6 +286,7 @@ static int AKECS_GetData(char *rbuf, int size) return -EINVAL; } #endif + AKMDBG("enter %s\n", __func__); wait_event_interruptible_timeout(data_ready_wq, atomic_read(&data_ready), 1000); if (!atomic_read(&data_ready)) { @@ -321,6 +329,7 @@ static void AKECS_SetYPR(short *rbuf) printk(KERN_INFO " Geomagnetism[LSB]: %6d,%6d,%6d\n", rbuf[9], rbuf[10], rbuf[11]); #endif + AKMDBG("enter %s\n", __func__); /* Report magnetic sensor information */ if (atomic_read(&m_flag)) { input_report_abs(data->input_dev, ABS_RX, rbuf[0]); @@ -349,18 +358,21 @@ static void AKECS_SetYPR(short *rbuf) static int AKECS_GetOpenStatus(void) { + AKMDBG("enter %s\n", __func__); wait_event_interruptible(open_wq, (atomic_read(&open_flag) != 0)); return atomic_read(&open_flag); } static int AKECS_GetCloseStatus(void) { + AKMDBG("enter %s\n", __func__); wait_event_interruptible(open_wq, (atomic_read(&open_flag) <= 0)); return atomic_read(&open_flag); } static void AKECS_CloseDone(void) { + AKMDBG("enter %s\n", __func__); atomic_set(&m_flag, 1); atomic_set(&a_flag, 1); atomic_set(&mv_flag, 1); @@ -398,6 +410,7 @@ akm_aot_ioctl(struct inode *inode, struct file *file, { void __user *argp = (void __user *)arg; short flag; + AKMDBG("enter %s\n", __func__); switch (cmd) { case ECS_IOCTL_APP_SET_MFLAG: @@ -487,6 +500,7 @@ akmd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; + AKMDBG("enter %s\n", __func__); /* NOTE: In this function the size of "char" should be 1-byte. */ char sData[SENSOR_DATA_SIZE];/* for GETDATA */ @@ -629,6 +643,7 @@ static void akm8975_work_func(struct work_struct *work) { char buffer[SENSOR_DATA_SIZE]; int ret; + AKMDBG("enter %s\n", __func__); memset(buffer, 0, SENSOR_DATA_SIZE); buffer[0] = AK8975_REG_ST1; @@ -658,8 +673,9 @@ static irqreturn_t akm8975_interrupt(int irq, void *dev_id) { struct akm8975_data *data = dev_id; AKMFUNC("akm8975_interrupt"); - disable_irq(this_client->irq); + disable_irq_nosync(this_client->irq); schedule_work(&data->work); + AKMDBG("exit %s\n", __func__); return IRQ_HANDLED; } @@ -751,13 +767,22 @@ int akm8975_probe(struct i2c_client *client, const struct i2c_device_id *id) dev_dbg(&akm->client->dev, "no IRQ?\n"); return -ENODEV; }else{ + AKMDBG("gpio %d to irq %d\n", akm->eoc_irq, gpio_to_irq(akm->eoc_irq)); akm->eoc_irq = gpio_to_irq(akm->eoc_irq); } err = gpio_request(client->irq, "ak_8975"); if (err < 0) { dev_err(&client->dev, "failed to request GPIO, error %d\n", err); goto exit3; - } + } + + err = gpio_direction_input(client->irq); + if (err) { + dev_err(&client->dev, "failed to set GPIO direction, error %d\n", err); + goto exit3; + } + gpio_pull_updown(client->irq, GPIOPullDown); + /* IRQ */ err = request_irq(akm->eoc_irq, akm8975_interrupt, IRQ_TYPE_EDGE_RISING, "akm8975_DRDY", akm); @@ -766,6 +791,8 @@ int akm8975_probe(struct i2c_client *client, const struct i2c_device_id *id) goto exit4; } + client->irq = akm->eoc_irq; + /* Declare input device */ akm->input_dev = input_allocate_device(); if (!akm->input_dev) { diff --git a/include/linux/mma8452.h b/include/linux/mma8452.h old mode 100644 new mode 100755 index e2061f0988dc..02b7b27f91d0 --- a/include/linux/mma8452.h +++ b/include/linux/mma8452.h @@ -54,17 +54,18 @@ #define MMA8452_REG_OFF_Y 0x30 //RW #define MMA8452_REG_OFF_Z 0x31 //RW -#define MMAIO 0xA1 +//#define MMAIO 0xA1 +#define MMAIO 'm' /* IOCTLs for MMA8452 library */ -#define ECS_IOCTL_INIT _IO(MMAIO, 0x01) -#define ECS_IOCTL_RESET _IO(MMAIO, 0x04) -#define ECS_IOCTL_CLOSE _IO(MMAIO, 0x02) -#define ECS_IOCTL_START _IO(MMAIO, 0x03) -#define ECS_IOCTL_GETDATA _IOR(MMAIO, 0x08, char[RBUFF_SIZE+1]) +#define MMA_IOCTL_INIT _IO(MMAIO, 0x01) +#define MMA_IOCTL_RESET _IO(MMAIO, 0x04) +#define MMA_IOCTL_CLOSE _IO(MMAIO, 0x02) +#define MMA_IOCTL_START _IO(MMAIO, 0x03) +#define MMA_IOCTL_GETDATA _IOR(MMAIO, 0x08, char[RBUFF_SIZE+1]) /* IOCTLs for APPs */ -#define ECS_IOCTL_APP_SET_RATE _IOW(MMAIO, 0x10, char) +#define MMA_IOCTL_APP_SET_RATE _IOW(MMAIO, 0x10, char) /*rate*/ @@ -89,8 +90,6 @@ #define FREAD_MASK 2 - - /*status*/ #define MMA8452_SUSPEND 2 #define MMA8452_OPEN 1 @@ -115,15 +114,6 @@ struct mma8452_platform_data { */ -struct mma8452_data { - char status; - char curr_tate; - struct input_dev *input_dev; - struct i2c_client *client; - struct work_struct work; - struct delayed_work delaywork; /*report second event*/ -}; - struct mma8452_axis { int x; int y; @@ -132,6 +122,5 @@ struct mma8452_axis { #define GSENSOR_DEV_PATH "/dev/mma8452_daemon" - #endif -- 2.34.1