/* ---------------------------------------------------------------------------------------- * Accelerometer core driver access function * ---------------------------------------------------------------------------------------- */ static int yas_acc_core_driver_init(struct yas_acc_private_data *data) { struct yas_acc_driver_callback *cbk; struct yas_acc_driver *driver; int err; data->driver = driver = kzalloc(sizeof(struct yas_acc_driver), GFP_KERNEL); if (!driver) { err = -ENOMEM; return err; } cbk = &driver->callback; cbk->lock = yas_acc_lock; cbk->unlock = yas_acc_unlock; cbk->i2c_open = yas_acc_i2c_open; cbk->i2c_close = yas_acc_i2c_close; cbk->i2c_write = yas_acc_i2c_write; cbk->i2c_read = yas_acc_i2c_read; cbk->msleep = yas_acc_msleep; err = yas_acc_driver_init(driver); if (err != YAS_NO_ERROR) { kfree(driver); return err; } err = driver->init(); if (err != YAS_NO_ERROR) { kfree(driver); return err; } #if YAS_ACC_DRIVER == YAS_ACC_DRIVER_BMA222 err = driver->set_position(YAS_BMA222_DEFAULT_POSITION); // hm83.cho Acc sensor install direction #elif YAS_ACC_DRIVER == YAS_ACC_DRIVER_BMA250 err = driver->set_position(YAS_BMA250_DEFAULT_POSITION); #else YAS_ACC_DRIVER DEFINE ERROR #endif if (err != YAS_NO_ERROR) { kfree(driver); return err; } return 0; }
/* ---------------------------------------------------------------------------------------- * Accelerometer core driver access function * ---------------------------------------------------------------------------------------- */ static int yas_acc_core_driver_init(struct yas_acc_private_data *data) { struct yas_acc_driver_callback *cbk; struct yas_acc_driver *driver; int err; data->driver = driver = kzalloc(sizeof(struct yas_acc_driver), GFP_KERNEL); if (!driver) { err = -ENOMEM; return err; } cbk = &driver->callback; cbk->lock = yas_acc_lock; cbk->unlock = yas_acc_unlock; cbk->i2c_open = yas_acc_i2c_open; cbk->i2c_close = yas_acc_i2c_close; cbk->i2c_write = yas_acc_i2c_write; cbk->i2c_read = yas_acc_i2c_read; cbk->msleep = yas_acc_msleep; err = yas_acc_driver_init(driver); if (err != YAS_NO_ERROR) { kfree(driver); return err; } err = driver->init(); if (err != YAS_NO_ERROR) { kfree(driver); return err; } err = driver->set_position(CONFIG_INPUT_YAS_ACCELEROMETER_POSITION); if (err != YAS_NO_ERROR) { kfree(driver); return err; } return 0; }
static int yas_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct yas_state *st; struct iio_dev *indio_dev; int ret, i; this_client = i2c; indio_dev = iio_allocate_device(sizeof(*st)); if (!indio_dev) { ret = -ENOMEM; goto error_ret; } i2c_set_clientdata(i2c, indio_dev); indio_dev->name = id->name; indio_dev->dev.parent = &i2c->dev; indio_dev->info = &yas_info; indio_dev->channels = yas_channels; indio_dev->num_channels = ARRAY_SIZE(yas_channels); indio_dev->modes = INDIO_DIRECT_MODE; st = iio_priv(indio_dev); st->client = i2c; st->sampling_frequency = 20; st->acc.callback.device_open = yas_device_open; st->acc.callback.device_close = yas_device_close; st->acc.callback.device_read = yas_device_read; st->acc.callback.device_write = yas_device_write; st->acc.callback.usleep = yas_usleep; st->acc.callback.current_time = yas_current_time; INIT_DELAYED_WORK(&st->work, yas_work_func); mutex_init(&st->lock); #ifdef CONFIG_HAS_EARLYSUSPEND st->sus.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; st->sus.suspend = yas_early_suspend; st->sus.resume = yas_late_resume; register_early_suspend(&st->sus); #endif for (i = 0; i < 3; i++) { st->compass_data[i] = 0; st->calib_bias[i] = 0; } ret = yas_probe_buffer(indio_dev); if (ret) goto error_free_dev; ret = yas_probe_trigger(indio_dev); if (ret) goto error_remove_buffer; ret = iio_device_register(indio_dev); if (ret) goto error_remove_trigger; ret = yas_acc_driver_init(&st->acc); if (ret < 0) { ret = -EFAULT; goto error_unregister_iio; } ret = st->acc.init(); if (ret < 0) { ret = -EFAULT; goto error_unregister_iio; } ret = st->acc.set_enable(1); if (ret < 0) { ret = -EFAULT; goto error_driver_term; } return 0; error_driver_term: st->acc.term(); error_unregister_iio: iio_device_unregister(indio_dev); error_remove_trigger: yas_remove_trigger(indio_dev); error_remove_buffer: yas_remove_buffer(indio_dev); error_free_dev: #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&st->sus); #endif iio_free_device(indio_dev); error_ret: i2c_set_clientdata(i2c, NULL); this_client = NULL; return ret; }
static int yas_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct yas_state *st; struct iio_dev *indio_dev; int ret, i; s8 *bias; struct yas_acc_platform_data *pdata; I("%s\n", __func__); this_client = i2c; indio_dev = iio_device_alloc(sizeof(*st)); if (!indio_dev) { ret = -ENOMEM; goto error_ret; } i2c_set_clientdata(i2c, indio_dev); indio_dev->name = id->name; indio_dev->dev.parent = &i2c->dev; indio_dev->info = &yas_info; indio_dev->channels = yas_channels; indio_dev->num_channels = ARRAY_SIZE(yas_channels); indio_dev->modes = INDIO_DIRECT_MODE; st = iio_priv(indio_dev); st->client = i2c; st->sampling_frequency = 20; st->acc.callback.device_open = yas_device_open; st->acc.callback.device_close = yas_device_close; st->acc.callback.device_read = yas_device_read; st->acc.callback.device_write = yas_device_write; st->acc.callback.usleep = yas_usleep; st->acc.callback.current_time = yas_current_time; st->indio_dev = indio_dev; INIT_DELAYED_WORK(&st->work, yas_work_func); INIT_WORK(&st->resume_work, yas_resume_work_func); mutex_init(&st->lock); #ifdef CONFIG_HAS_EARLYSUSPEND st->sus.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; st->sus.suspend = yas_early_suspend; st->sus.resume = yas_late_resume; register_early_suspend(&st->sus); #endif ret = yas_probe_buffer(indio_dev); if (ret) goto error_free_dev; ret = yas_probe_trigger(indio_dev); if (ret) goto error_remove_buffer; ret = iio_device_register(indio_dev); if (ret) goto error_remove_trigger; ret = yas_acc_driver_init(&st->acc); if (ret < 0) { ret = -EFAULT; goto error_unregister_iio; } ret = st->acc.init(); if (ret < 0) { ret = -EFAULT; goto error_unregister_iio; } ret = st->acc.set_enable(1); if (ret < 0) { ret = -EFAULT; goto error_driver_term; } pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); if (pdata == NULL) E("%s: memory allocation for pdata failed.", __func__); else yas_parse_dt(&i2c->dev, pdata); for (i = 0; i < 3; i++) { st->accel_data[i] = 0; bias = (s8 *)&pdata->gs_kvalue; st->calib_bias[i] = -(bias[2-i] * YAS_GRAVITY_EARTH / 256); I("%s: calib_bias[%d] = %d\n", __func__, i, st->calib_bias[i]); } mutex_lock(&st->lock); if ((pdata->placement < 8) && (pdata->placement >= 0)) { ret = st->acc.set_position(pdata->placement); I("%s: set position = %d\n", __func__, pdata->placement); } else { ret = st->acc.set_position(5); D("%s: set default position = 5\n", __func__); } mutex_unlock(&st->lock); #ifdef CONFIG_CIR_ALWAYS_READY module.IRQ = pdata->intr; I("%s: IRQ = %d\n", __func__, module.IRQ); ret = request_irq(module.IRQ, kxtj2_irq_handler, IRQF_TRIGGER_RISING, "kxtj2", &module); enable_irq_wake(module.IRQ); if (ret) E("%s: Could not request irq = %d\n", __func__, module.IRQ); module.kxtj2_wq = create_singlethread_workqueue("kxtj2_wq"); if (!module.kxtj2_wq) { E("%s: Can't create workqueue\n", __func__); ret = -ENOMEM; goto error_create_singlethread_workqueue; } #endif init_irq_work(&st->iio_irq_work, iio_trigger_work); g_st = st; ret = create_sysfs_interfaces(st); if (ret) { E("%s: create_sysfs_interfaces fail, ret = %d\n", __func__, ret); goto err_create_fixed_sysfs; } I("%s: Successfully probe\n", __func__); return 0; err_create_fixed_sysfs: #ifdef CONFIG_CIR_ALWAYS_READY if (module.kxtj2_wq) destroy_workqueue(module.kxtj2_wq); error_create_singlethread_workqueue: #endif kfree(pdata); error_driver_term: st->acc.term(); error_unregister_iio: iio_device_unregister(indio_dev); error_remove_trigger: yas_remove_trigger(indio_dev); error_remove_buffer: yas_remove_buffer(indio_dev); error_free_dev: #ifdef CONFIG_HAS_EARLYSUSPEND unregister_early_suspend(&st->sus); #endif iio_device_free(indio_dev); error_ret: i2c_set_clientdata(i2c, NULL); this_client = NULL; return ret; }
/* ---------------------------------------------------------------------------------------- * Accelerometer core driver access function * ---------------------------------------------------------------------------------------- */ static int yas_acc_core_driver_init(struct yas_acc_private_data *data) { struct yas_acc_driver_callback *cbk; struct yas_acc_driver *driver; int err; data->driver = driver = kzalloc(sizeof(struct yas_acc_driver), GFP_KERNEL); if (!driver) { err = -ENOMEM; return err; } cbk = &driver->callback; cbk->lock = yas_acc_lock; cbk->unlock = yas_acc_unlock; cbk->i2c_open = yas_acc_i2c_open; cbk->i2c_close = yas_acc_i2c_close; cbk->i2c_write = yas_acc_i2c_write; cbk->i2c_read = yas_acc_i2c_read; cbk->msleep = yas_acc_msleep; err = yas_acc_driver_init(driver); if (err != YAS_NO_ERROR) { kfree(driver); return err; } err = driver->init(); if (err != YAS_NO_ERROR) { kfree(driver); return err; } err = driver->set_position(CONFIG_INPUT_BMA222_POSITION); if (err != YAS_NO_ERROR) { kfree(driver); return err; } //-------------for test---------------- #if 0 struct yas_acc_data accel; int i; accel.xyz.v[0] = accel.xyz.v[1] = accel.xyz.v[2] = 0; printk(KERN_ERR "bma222_init_proc test 1\n"); err = driver->set_enable(1); if (err != YAS_NO_ERROR) { printk(KERN_ERR "bma222_init_proc set_enable err \n"); kfree(driver); return err; } printk(KERN_ERR "bma222_init_proc test 2\n"); for(i=0;i<10;i++) { err = driver->measure(&accel); if (err != YAS_NO_ERROR) { printk(KERN_ERR "bma222_init_proc measure err =%d\n",err); kfree(driver); return err; } printk(KERN_ERR "bma222_init_proc data(%10d %10d %10d) raw(%5d %5d %5d)\n", accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]); } #endif printk(KERN_ERR "bma222_init_proc test 3 \n"); //-------------for test---------------- return 0; }