コード例 #1
0
static int __init sensor_init(void)
{
    #include <mach/willow_version.h>
    if(g_willow_hw_version!=WILLOW_HW_DVT){
        YLOGE("sensor_init : Not use this! yamaha sensor only used DVT device!\n");
        return -1;
    }

    sensor_pdev = platform_device_register_simple(SENSOR_NAME, 0, NULL, 0);
    if (IS_ERR(sensor_pdev)) {
        return -1;
    }
    return platform_driver_register(&sensor_driver);
}
コード例 #2
0
static int yas_itg3500_write_reg(unsigned char adr, unsigned char *buf, int len)
{
	struct yas_gyro_driver_callback *cbk = &pcb->callback;
	struct yas_itg3500_data *p = &itg3500_data;
	int err = YAS_NO_ERROR;
	int32_t err_cnt = 0;
	int32_t reset = 0;

	if (p->device_open) {
		do {
			err = cbk->device_write(adr, buf, len);
			if (err != 0 && (++err_cnt >= KC_SENSOR_DEVICE_ERR_MAX)) {
				reset = atomic_read(&at_device_reset);
				YLOGE(("%s(): [ERR device_write] reset=%d\n",__func__,reset));
				if(reset == 0)
					atomic_set( &at_device_reset, 1 );
				if(reset == 2)
					atomic_set( &at_device_reset, 3 );
			}
		} while(err != 0 && (err_cnt < KC_SENSOR_DEVICE_ERR_MAX));
	}

	return err;
}
コード例 #3
0
ファイル: yas532_orient.c プロジェクト: vikrant82/t320_kernel
static int sensor_probe(struct platform_device *pdev)
{
	struct orient_platform_data *orient_data = NULL;
	struct input_dev *input_data = NULL;

	int input_registered = 0, sysfs_created = 0;
	int rt;

	pr_info("[SENSOR] %s: IN\n", __func__);

	orient_data = kzalloc(sizeof(struct orient_platform_data), GFP_KERNEL);
	if (!orient_data) {
		rt = -ENOMEM;
		goto err;
	}
	orient_data->enabled = 0;
	orient_data->delay = SENSOR_DEFAULT_DELAY;

	input_data = input_allocate_device();
	if (!input_data) {
		rt = -ENOMEM;
		YLOGE(("sensor_probe: Failed to allocate input_data device\n"));
		goto err;
	}

	set_bit(EV_ABS, input_data->evbit);
	input_set_abs_params(input_data, ABS_X, INT_MIN, INT_MAX, 0, 0);
#if SENSOR_TYPE <= 4 || (9 <= SENSOR_TYPE && SENSOR_TYPE <= 11)
	input_set_abs_params(input_data, ABS_Y, INT_MIN, INT_MAX, 0, 0);
	input_set_abs_params(input_data, ABS_Z, INT_MIN, INT_MAX, 0, 0);
#endif
	input_set_abs_params(input_data, ABS_RUDDER, INT_MIN, INT_MAX, 0, 0);
	input_set_abs_params(input_data, ABS_STATUS, 0, 3, 0, 0);
	input_set_abs_params(input_data, ABS_WAKE, INT_MIN, INT_MAX, 0, 0);
	input_set_abs_params(input_data, ABS_CONTROL_REPORT, INT_MIN, INT_MAX,
			0, 0);
	input_data->name = SENSOR_NAME;

	rt = input_register_device(input_data);
	if (rt) {
		YLOGE(("ori Unable to reg input_data %s\n", input_data->name));
		goto err;
	}
	orient_data->orient_input_dev = input_data;
	input_set_drvdata(input_data, orient_data);
	platform_set_drvdata(pdev, orient_data);
	input_registered = 1;

	rt = sysfs_create_group(&input_data->dev.kobj, &sensor_attribute_group);
	if (rt) {
		YLOGE(("sensor_probe: sysfs_create_group failed[%s]\n",
		       input_data->name));
		goto err;
	}
	sysfs_created = 1;
	mutex_init(&(orient_data->mutex));

	pr_info("[SENSOR] %s: Success! \n", __func__);

	return 0;

err:
	if (orient_data != NULL) {
		if (input_data != NULL) {
			if (sysfs_created)
				sysfs_remove_group(&input_data->dev.kobj,
						   &sensor_attribute_group);
			if (input_registered)
				input_unregister_device(input_data);
			else
				input_free_device(input_data);
			input_data = NULL;
		}
		kfree(orient_data);
	}

	return rt;
}
コード例 #4
0
static void
geomagnetic_input_work_func(struct work_struct *work)
{
    struct geomagnetic_data *data = container_of((struct delayed_work *)work,
            struct geomagnetic_data, work);
    uint32_t time_delay_ms = 100;
    struct yas_mag_offset offset;
    struct yas_mag_data magdata;
    int rt, i, accuracy;

     YLOGE(("[HSS] geomagnetic_input_work_func\n"));


    if (hwdep_driver.measure == NULL || hwdep_driver.get_offset == NULL) {
        return;
    }

    rt = hwdep_driver.measure(&magdata, &time_delay_ms);
    if (rt < 0) {
        YLOGE(("measure failed[%d]\n", rt));
    }
    YLOGE(("xy1y2 [%d][%d][%d] raw[%d][%d][%d]\n",
            magdata.xy1y2.v[0], magdata.xy1y2.v[1], magdata.xy1y2.v[2],
            magdata.xyz.v[0], magdata.xyz.v[1], magdata.xyz.v[2]));

    if (rt >= 0) {
        accuracy = atomic_read(&data->last_status);

        if ((rt & YAS_REPORT_OVERFLOW_OCCURED)
                || (rt & YAS_REPORT_HARD_OFFSET_CHANGED)
                || (rt & YAS_REPORT_CALIB_OFFSET_CHANGED)) {
            static uint16_t count = 1;
            int code = 0;
            int value = 0;

            hwdep_driver.get_offset(&offset);

            geomagnetic_multi_lock();
            data->driver_offset = offset;
            if (rt & YAS_REPORT_OVERFLOW_OCCURED) {
                atomic_set(&data->last_status, 0);
                accuracy = 0;
            }
            geomagnetic_multi_unlock();

            /* report event */
            code |= (rt & YAS_REPORT_OVERFLOW_OCCURED);
            code |= (rt & YAS_REPORT_HARD_OFFSET_CHANGED);
            code |= (rt & YAS_REPORT_CALIB_OFFSET_CHANGED);
            value = (count++ << 16) | (code);
            input_report_abs(data->input_raw, ABS_RAW_REPORT, value);
        }

        if (rt & YAS_REPORT_DATA) {
            for (i = 0; i < 3; i++) {
                atomic_set(&data->last_data[i], magdata.xyz.v[i]);
            }

            /* report magnetic data in [nT] */
            input_report_abs(data->input_data, ABS_X, magdata.xyz.v[0]);
            input_report_abs(data->input_data, ABS_Y, magdata.xyz.v[1]);
            input_report_abs(data->input_data, ABS_Z, magdata.xyz.v[2]);
            input_report_abs(data->input_data, ABS_STATUS, accuracy);
            input_sync(data->input_data);
        }

        if (rt & YAS_REPORT_CALIB) {
            /* report raw magnetic data */
            input_report_abs(data->input_raw, ABS_X, magdata.raw.v[0]);
            input_report_abs(data->input_raw, ABS_Y, magdata.raw.v[1]);
            input_report_abs(data->input_raw, ABS_Z, magdata.raw.v[2]);
            input_sync(data->input_raw);
        }
    }
    else {
        time_delay_ms = 100;
    }

    if (time_delay_ms > 0) {
        schedule_delayed_work(&data->work, msecs_to_jiffies(time_delay_ms) + 1);
    }
    else {
        schedule_delayed_work(&data->work, 0);
    }
}
コード例 #5
0
static int
geomagnetic_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    struct geomagnetic_data *data = NULL;
    struct input_dev *input_data = NULL, *input_raw = NULL;
    int rt, sysfs_created = 0, sysfs_raw_created = 0;
    int data_registered = 0, raw_registered = 0, i;
    struct yas_mag_filter filter;

     YLOGE(("[HSS] geomagnetic_probe\n"));


    i2c_set_clientdata(client, NULL);
    data = kzalloc(sizeof(struct geomagnetic_data), GFP_KERNEL);
    if (data == NULL) {
        rt = -ENOMEM;
        goto err;
    }
    data->threshold = YAS_DEFAULT_MAGCALIB_THRESHOLD;
    for (i = 0; i < 3; i++) {
        data->distortion[i] = YAS_DEFAULT_MAGCALIB_DISTORTION;
    }
    data->shape = 0;
    atomic_set(&data->enable, 0);
    for (i = 0; i < 3; i++) {
        atomic_set(&data->last_data[i], 0);
    }
    atomic_set(&data->last_status, 0);
    INIT_DELAYED_WORK(&data->work, geomagnetic_input_work_func);
    init_MUTEX(&data->driver_lock);
    init_MUTEX(&data->multi_lock);

    input_data = input_allocate_device();
    if (input_data == NULL) {
        rt = -ENOMEM;
        YLOGE(("geomagnetic_probe: Failed to allocate input_data device\n"));
        goto err;
    }

    input_data->name = GEOMAGNETIC_INPUT_NAME;
    input_data->id.bustype = BUS_I2C;
    set_bit(EV_ABS, input_data->evbit);
    input_set_capability(input_data, EV_ABS, ABS_X);
    input_set_capability(input_data, EV_ABS, ABS_Y);
    input_set_capability(input_data, EV_ABS, ABS_Z);
    input_set_capability(input_data, EV_ABS, ABS_STATUS);
    input_set_capability(input_data, EV_ABS, ABS_WAKE);
    input_data->dev.parent = &client->dev;

    rt = input_register_device(input_data);
    if (rt) {
        YLOGE(("geomagnetic_probe: Unable to register input_data device: %s\n",
               input_data->name));
        goto err;
    }
    data_registered = 1;

    rt = sysfs_create_group(&input_data->dev.kobj,
            &geomagnetic_attribute_group);
    if (rt) {
        YLOGE(("geomagnetic_probe: sysfs_create_group failed[%s]\n",
               input_data->name));
        goto err;
    }
    sysfs_created = 1;

    input_raw = input_allocate_device();
    if (input_raw == NULL) {
        rt = -ENOMEM;
        YLOGE(("geomagnetic_probe: Failed to allocate input_raw device\n"));
        goto err;
    }

    input_raw->name = GEOMAGNETIC_INPUT_RAW_NAME;
    input_raw->id.bustype = BUS_I2C;
    set_bit(EV_ABS, input_raw->evbit);
    input_set_capability(input_raw, EV_ABS, ABS_X);
    input_set_capability(input_raw, EV_ABS, ABS_Y);
    input_set_capability(input_raw, EV_ABS, ABS_Z);
    input_set_capability(input_raw, EV_ABS, ABS_RAW_DISTORTION);
    input_set_capability(input_raw, EV_ABS, ABS_RAW_THRESHOLD);
    input_set_capability(input_raw, EV_ABS, ABS_RAW_SHAPE);
    input_set_capability(input_raw, EV_ABS, ABS_RAW_REPORT);
    input_raw->dev.parent = &client->dev;

    rt = input_register_device(input_raw);
    if (rt) {
        YLOGE(("geomagnetic_probe: Unable to register input_raw device: %s\n",
               input_raw->name));
        goto err;
    }
    raw_registered = 1;

    rt = sysfs_create_group(&input_raw->dev.kobj,
            &geomagnetic_raw_attribute_group);
    if (rt) {
        YLOGE(("geomagnetic_probe: sysfs_create_group failed[%s]\n",
               input_data->name));
        goto err;
    }
    sysfs_raw_created = 1;

    this_client = client;
    data->input_raw = input_raw;
    data->input_data = input_data;
    input_set_drvdata(input_data, data);
    input_set_drvdata(input_raw, data);
    i2c_set_clientdata(client, data);


// [Hss]
	gpio_set_value_cansleep(180, 0);	
	printk(KERN_ERR "Compass I: RST LOW\n");
	
	udelay(120);	

	gpio_set_value_cansleep(180, 1);	
	printk(KERN_ERR "Compass I: RST HIGH\n");

    

    if ((rt = yas_mag_driver_init(&hwdep_driver)) < 0) {
        YLOGE(("yas_mag_driver_init failed[%d]\n", rt));
        goto err;
    }
    if (hwdep_driver.init != NULL) {
        if ((rt = hwdep_driver.init()) < 0) {
            YLOGE(("hwdep_driver.init() failed[%d]\n", rt));
            goto err;
        }
    }
    if (hwdep_driver.set_position != NULL) {
        if (hwdep_driver.set_position(YAS_CDRV_YAS529_POSITION) < 0) {
            YLOGE(("hwdep_driver.set_position() failed[%d]\n", rt));
            goto err;
        }
    }
    if (hwdep_driver.get_offset != NULL) {
        if (hwdep_driver.get_offset(&data->driver_offset) < 0) {
            YLOGE(("hwdep_driver get_driver_state failed\n"));
            goto err;
        }
    }
    if (hwdep_driver.get_delay != NULL) {
        data->delay = hwdep_driver.get_delay();
    }
    if (hwdep_driver.set_filter_enable != NULL) {
        /* default to enable */
        if (hwdep_driver.set_filter_enable(1) == 0) {
            data->filter_enable = 1;
        }
    }
    if (hwdep_driver.get_filter != NULL) {
        if (hwdep_driver.get_filter(&filter) < 0) {
            YLOGE(("hwdep_driver get_filter failed\n"));
            goto err;
        }
        data->filter_len = filter.len;
        for (i = 0; i < 3; i++) {
            data->filter_noise[i] = filter.noise[i];
        }
        data->filter_threshold = filter.threshold;
    }

    return 0;

err:
    if (data != NULL) {
        if (input_raw != NULL) {
            if (sysfs_raw_created) {
                sysfs_remove_group(&input_raw->dev.kobj,
                        &geomagnetic_raw_attribute_group);
            }
            if (raw_registered) {
                input_unregister_device(input_raw);
            }
            else {
                input_free_device(input_raw);
            }
        }
        if (input_data != NULL) {
            if (sysfs_created) {
                sysfs_remove_group(&input_data->dev.kobj,
                        &geomagnetic_attribute_group);
            }
            if (data_registered) {
                input_unregister_device(input_data);
            }
            else {
                input_free_device(input_data);
            }
        }
        kfree(data);
    }

    return rt;
}
コード例 #6
0
static int
sensor_probe(struct platform_device *pdev)
{
    struct sensor_data *data = NULL;
    struct input_dev *input_data = NULL;
    int input_registered = 0, sysfs_created = 0;
    int rt;

	printk(KERN_INFO "%s: %s \n", SENSOR_NAME, __func__);

    data = kzalloc(sizeof(struct sensor_data), GFP_KERNEL);
    if (!data) {
        rt = -ENOMEM;
        goto err;
    }
    data->enabled = 0;
    data->delay = SENSOR_DEFAULT_DELAY;

    input_data = input_allocate_device();
    if (!input_data) {
        rt = -ENOMEM;
        YLOGE(("sensor_probe: Failed to allocate input_data device\n"));
        goto err;
    }

    set_bit(EV_ABS, input_data->evbit);
    input_set_capability(input_data, EV_ABS, ABS_X);
#if SENSOR_TYPE <= 4
    input_set_capability(input_data, EV_ABS, ABS_Y);
    input_set_capability(input_data, EV_ABS, ABS_Z);
#endif
    input_set_capability(input_data, EV_ABS, ABS_STATUS); /* status */
    input_set_capability(input_data, EV_ABS, ABS_WAKE); /* wake */
    input_set_capability(input_data, EV_ABS, ABS_CONTROL_REPORT); /* enabled/delay */
    input_set_abs_params(input_data, ABS_WAKE, 0, 0xffff, 0, 0);
    input_data->name = SENSOR_NAME;

    rt = input_register_device(input_data);
    if (rt) {
        YLOGE(("sensor_probe: Unable to register input_data device: %s\n",
               input_data->name));
        goto err;
    }
    input_set_drvdata(input_data, data);
    input_registered = 1;

    rt = sysfs_create_group(&input_data->dev.kobj,
            &sensor_attribute_group);
    if (rt) {
        YLOGE(("sensor_probe: sysfs_create_group failed[%s]\n",
               input_data->name));
        goto err;
    }
    sysfs_created = 1;

    rt = sysfs_create_link(input_data->dev.kobj.parent, 
                            &input_data->dev.kobj, 
                            input_data->name);
    if (rt) {        
        YLOGE(("sensor_probe: sysfs_create_link failed[%s]\n",
               input_data->name));
        goto err;
    }

    mutex_init(&data->mutex);
    this_data = input_data;

    return 0;

err:
    if (data != NULL) {
        if (input_data != NULL) {
            if (sysfs_created) {
                sysfs_remove_group(&input_data->dev.kobj,
                        &sensor_attribute_group);
            }
            if (input_registered) {
                input_unregister_device(input_data);
            }
            else {
                input_free_device(input_data);
            }
            input_data = NULL;
        }
        kfree(data);
    }

    printk(KERN_ERR "%s: %s err = %d\n", SENSOR_NAME, __func__, rt);
    return rt;
}
コード例 #7
0
static int
geomagnetic_work(struct yas_mag_data *magdata)
{
    struct geomagnetic_data *data = i2c_get_clientdata(this_client);
    uint32_t time_delay_ms = 100;
    struct yas_mag_offset offset;
    int rt, i, accuracy;

    if (hwdep_driver.measure == NULL || hwdep_driver.get_offset == NULL) {
        return time_delay_ms;
    }

    rt = hwdep_driver.measure(magdata, &time_delay_ms);
    if (rt < 0) {
        YLOGE(("measure failed[%d]\n", rt));
    }
    YLOGD(("xy1y2 [%d][%d][%d] raw[%d][%d][%d]\n",
            magdata->xy1y2.v[0], magdata->xy1y2.v[1], magdata->xy1y2.v[2],
            magdata->xyz.v[0], magdata->xyz.v[1], magdata->xyz.v[2]));

    if (rt >= 0) {
        accuracy = atomic_read(&data->last_status);

        if ((rt & YAS_REPORT_OVERFLOW_OCCURED)
                || (rt & YAS_REPORT_HARD_OFFSET_CHANGED)
                || (rt & YAS_REPORT_CALIB_OFFSET_CHANGED)) {
            static uint16_t count = 1;
            int code = 0;
            int value = 0;

            hwdep_driver.get_offset(&offset);

            geomagnetic_multi_lock();
            data->driver_offset = offset;
            if (rt & YAS_REPORT_OVERFLOW_OCCURED) {
                atomic_set(&data->last_status, 0);
                accuracy = 0;
            }
            geomagnetic_multi_unlock();

            /* report event */
            code |= (rt & YAS_REPORT_OVERFLOW_OCCURED);
            code |= (rt & YAS_REPORT_HARD_OFFSET_CHANGED);
            code |= (rt & YAS_REPORT_CALIB_OFFSET_CHANGED);
            value = (count++ << 16) | (code);
            input_report_abs(data->input_raw, ABS_RAW_REPORT, value);
        }

        if (rt & YAS_REPORT_DATA) {
            for (i = 0; i < 3; i++) {
                atomic_set(&data->last_data[i], magdata->xyz.v[i]);
            }

            /* report magnetic data in [nT] */
            input_report_abs(data->input_data, ABS_X, magdata->xyz.v[0]);
            input_report_abs(data->input_data, ABS_Y, magdata->xyz.v[1]);
            input_report_abs(data->input_data, ABS_Z, magdata->xyz.v[2]);
            input_report_abs(data->input_data, ABS_STATUS, accuracy);
            input_sync(data->input_data);
        }

        /* report raw magnetic data */
        input_report_abs(data->input_raw, ABS_X, magdata->raw.v[0]);
        input_report_abs(data->input_raw, ABS_Y, magdata->raw.v[1]);
        input_report_abs(data->input_raw, ABS_Z, magdata->raw.v[2]);
        input_sync(data->input_raw);
    }
    else {
        time_delay_ms = 100;
    }

    return time_delay_ms;

}
コード例 #8
0
static int
sensor_probe(struct platform_device *pdev)
{
    struct sensor_data *data = NULL;
    struct input_dev *input_data = NULL;
    int input_registered = 0, sysfs_created = 0;
    int rt;

    data = kzalloc(sizeof(struct sensor_data), GFP_KERNEL);
    if (!data) {
        rt = -ENOMEM;
        goto err;
    }
    data->enabled = 0;
    data->delay = SENSOR_DEFAULT_DELAY;

    input_data = input_allocate_device();
    if (!input_data) {
        rt = -ENOMEM;
        YLOGE(("sensor_probe: Failed to allocate input_data device\n"));
        goto err;
    }

    set_bit(EV_ABS, input_data->evbit);
    input_set_abs_params(input_data, ABS_X, 0x80000000, 0x7fffffff, 0, 0);
#if SENSOR_TYPE <= 4
    input_set_abs_params(input_data, ABS_Y, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_Z, 0x80000000, 0x7fffffff, 0, 0);
#endif
//    input_set_abs_params(input_data, ABS_RUDDER, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_STATUS, 0, 3, 0, 0);
    input_set_abs_params(input_data, ABS_WAKE, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_CONTROL_REPORT, 0x80000000, 0x7fffffff, 0, 0);
    input_data->name = SENSOR_NAME;

    rt = input_register_device(input_data);
    if (rt) {
        YLOGE(("sensor_probe: Unable to register input_data device: %s\n",
               input_data->name));
        goto err;
    }
    input_set_drvdata(input_data, data);
    input_registered = 1;

    rt = sysfs_create_group(&input_data->dev.kobj,
            &sensor_attribute_group);
    if (rt) {
        YLOGE(("sensor_probe: sysfs_create_group failed[%s]\n",
               input_data->name));
        goto err;
    }
    sysfs_created = 1;
    mutex_init(&data->mutex);
    this_data = input_data;

    return 0;

err:
    if (data != NULL) {
        if (input_data != NULL) {
            if (sysfs_created) {
                sysfs_remove_group(&input_data->dev.kobj,
                        &sensor_attribute_group);
            }
            if (input_registered) {
                input_unregister_device(input_data);
            }
            else {
                input_free_device(input_data);
            }
            input_data = NULL;
        }
        kfree(data);
    }

    return rt;
}
コード例 #9
0
static int
geomagnetic_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    struct geomagnetic_data *data = NULL;
    struct input_dev *input_data = NULL, *input_raw = NULL;
    int rt, sysfs_created = 0, sysfs_raw_created = 0;
    int data_registered = 0, raw_registered = 0, i;
    struct yas_mag_filter filter;

    i2c_set_clientdata(client, NULL);
    data = kzalloc(sizeof(struct geomagnetic_data), GFP_KERNEL);
    if (data == NULL) {
        rt = -ENOMEM;
        goto err;
    }
    data->threshold = YAS_DEFAULT_MAGCALIB_THRESHOLD;
    for (i = 0; i < 3; i++) {
        data->distortion[i] = YAS_DEFAULT_MAGCALIB_DISTORTION;
    }
    data->shape = 0;
    atomic_set(&data->enable, 0);
    for (i = 0; i < 3; i++) {
        atomic_set(&data->last_data[i], 0);
    }
    atomic_set(&data->last_status, 0);
    INIT_DELAYED_WORK(&data->work, geomagnetic_input_work_func);
#ifndef PANTECH_AVOID_DEADLOCK //p12911 : ef33s sensor patch
    init_MUTEX(&data->driver_lock);
    init_MUTEX(&data->multi_lock);
#endif

    input_data = input_allocate_device();
    if (input_data == NULL) {
        rt = -ENOMEM;
        YLOGE(("geomagnetic_probe: Failed to allocate input_data device\n"));
        goto err;
    }

    input_data->name = GEOMAGNETIC_INPUT_NAME;
    input_data->id.bustype = BUS_I2C;
    set_bit(EV_ABS, input_data->evbit);
	//p12911 : ef33s sensor patch
    input_set_abs_params(input_data, ABS_X, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_Y, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_Z, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_RUDDER, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_data, ABS_STATUS, 0, 3, 0, 0);
    input_set_abs_params(input_data, ABS_WAKE, 0x80000000, 0x7fffffff, 0, 0);
	//p12911 : ef33s sensor patch
    input_data->dev.parent = &client->dev;

    rt = input_register_device(input_data);
    if (rt) {
        YLOGE(("geomagnetic_probe: Unable to register input_data device: %s\n",
               input_data->name));
        goto err;
    }
    data_registered = 1;

    rt = sysfs_create_group(&input_data->dev.kobj,
            &geomagnetic_attribute_group);
    if (rt) {
        YLOGE(("geomagnetic_probe: sysfs_create_group failed[%s]\n",
               input_data->name));
        goto err;
    }
    sysfs_created = 1;

    input_raw = input_allocate_device();
    if (input_raw == NULL) {
        rt = -ENOMEM;
        YLOGE(("geomagnetic_probe: Failed to allocate input_raw device\n"));
        goto err;
    }

    input_raw->name = GEOMAGNETIC_INPUT_RAW_NAME;
    input_raw->id.bustype = BUS_I2C;
    set_bit(EV_ABS, input_raw->evbit);
	//p12911 : ef33s sensor patch
    input_set_abs_params(input_raw, ABS_X, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_raw, ABS_Y, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_raw, ABS_Z, 0x80000000, 0x7fffffff, 0, 0);
    input_set_abs_params(input_raw, ABS_RAW_DISTORTION, 0, 0x7fffffff, 0, 0);
    input_set_abs_params(input_raw, ABS_RAW_THRESHOLD, 0, 2, 0, 0);
    input_set_abs_params(input_raw, ABS_RAW_SHAPE, 0, 1, 0, 0);
    input_set_abs_params(input_raw, ABS_RAW_REPORT, 0x80000000, 0x7fffffff, 0, 0);
	//p12911 : ef33s sensor patch
    input_raw->dev.parent = &client->dev;

    rt = input_register_device(input_raw);
    if (rt) {
        YLOGE(("geomagnetic_probe: Unable to register input_raw device: %s\n",
               input_raw->name));
        goto err;
    }
    raw_registered = 1;

    rt = sysfs_create_group(&input_raw->dev.kobj,
            &geomagnetic_raw_attribute_group);
    if (rt) {
        YLOGE(("geomagnetic_probe: sysfs_create_group failed[%s]\n",
               input_data->name));
        goto err;
    }
    sysfs_raw_created = 1;

    this_client = client;
    data->input_raw = input_raw;
    data->input_data = input_data;
    input_set_drvdata(input_data, data);
    input_set_drvdata(input_raw, data);
    i2c_set_clientdata(client, data);

    if ((rt = yas_mag_driver_init(&hwdep_driver)) < 0) {
        YLOGE(("yas_mag_driver_init failed[%d]\n", rt));
        goto err;
    }
    if (hwdep_driver.init != NULL) {
        if ((rt = hwdep_driver.init()) < 0) {
            YLOGE(("hwdep_driver.init() failed[%d]\n", rt));
            goto err;
        }
    }
    if (hwdep_driver.set_position != NULL) {
        if (hwdep_driver.set_position(CONFIG_INPUT_YAS_MAGNETOMETER_POSITION) < 0) {
            YLOGE(("hwdep_driver.set_position() failed[%d]\n", rt));
            goto err;
        }
    }
    if (hwdep_driver.get_offset != NULL) {
        if (hwdep_driver.get_offset(&data->driver_offset) < 0) {
            YLOGE(("hwdep_driver get_driver_state failed\n"));
            goto err;
        }
    }
    if (hwdep_driver.get_delay != NULL) {
        data->delay = hwdep_driver.get_delay();
    }
    if (hwdep_driver.set_filter_enable != NULL) {
        /* default to enable */
        if (hwdep_driver.set_filter_enable(1) == 0) {
            data->filter_enable = 1;
        }
    }
    if (hwdep_driver.get_filter != NULL) {
        if (hwdep_driver.get_filter(&filter) < 0) {
            YLOGE(("hwdep_driver get_filter failed\n"));
            goto err;
        }
        data->filter_len = filter.len;
        for (i = 0; i < 3; i++) {
            data->filter_noise[i] = filter.noise[i];
        }
        data->filter_threshold = filter.threshold;
    }
	
#ifdef YAS_MAG_TRANSFORM_MATRIX 	//p12911 : ef33s sensor patch
    if (hwdep_driver.get_transform_matrix != NULL) {
        hwdep_driver.get_transform_matrix(data->transform_matrix);
    }
#endif

    return 0;

err:
    if (data != NULL) {
        if (input_raw != NULL) {
            if (sysfs_raw_created) {
                sysfs_remove_group(&input_raw->dev.kobj,
                        &geomagnetic_raw_attribute_group);
            }
            if (raw_registered) {
                input_unregister_device(input_raw);
            }
            else {
                input_free_device(input_raw);
            }
        }
        if (input_data != NULL) {
            if (sysfs_created) {
                sysfs_remove_group(&input_data->dev.kobj,
                        &geomagnetic_attribute_group);
            }
            if (data_registered) {
                input_unregister_device(input_data);
            }
            else {
                input_free_device(input_data);
            }
        }
        kfree(data);
    }

    return rt;
}