-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 354387 b: refs/heads/master c: 7be56a8 h: refs/heads/master i: 354385: c6f5971 354383: 910636b v: v3
- Loading branch information
Denis Ciocca
authored and
Jonathan Cameron
committed
Jan 31, 2013
1 parent
05bec8f
commit 54dedff
Showing
8 changed files
with
729 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: d62511689de5d34d3a07c43db1f46a234bb77b5f | ||
refs/heads/master: 7be56a8f57b57cca1651fb97886e20246c168e25 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* | ||
* STMicroelectronics gyroscopes driver | ||
* | ||
* Copyright 2012-2013 STMicroelectronics Inc. | ||
* | ||
* Denis Ciocca <denis.ciocca@st.com> | ||
* v. 1.0.0 | ||
* Licensed under the GPL-2. | ||
*/ | ||
|
||
#ifndef ST_GYRO_H | ||
#define ST_GYRO_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/iio/common/st_sensors.h> | ||
|
||
#define L3G4200D_GYRO_DEV_NAME "l3g4200d" | ||
#define LSM330D_GYRO_DEV_NAME "lsm330d_gyro" | ||
#define LSM330DL_GYRO_DEV_NAME "lsm330dl_gyro" | ||
#define LSM330DLC_GYRO_DEV_NAME "lsm330dlc_gyro" | ||
#define L3GD20_GYRO_DEV_NAME "l3gd20" | ||
#define L3GD20H_GYRO_DEV_NAME "l3gd20h" | ||
#define L3G4IS_GYRO_DEV_NAME "l3g4is_ui" | ||
#define LSM330_GYRO_DEV_NAME "lsm330_gyro" | ||
|
||
int st_gyro_common_probe(struct iio_dev *indio_dev); | ||
void st_gyro_common_remove(struct iio_dev *indio_dev); | ||
|
||
#ifdef CONFIG_IIO_BUFFER | ||
int st_gyro_allocate_ring(struct iio_dev *indio_dev); | ||
void st_gyro_deallocate_ring(struct iio_dev *indio_dev); | ||
int st_gyro_trig_set_state(struct iio_trigger *trig, bool state); | ||
#define ST_GYRO_TRIGGER_SET_STATE (&st_gyro_trig_set_state) | ||
#else /* CONFIG_IIO_BUFFER */ | ||
static inline int st_gyro_allocate_ring(struct iio_dev *indio_dev) | ||
{ | ||
return 0; | ||
} | ||
static inline void st_gyro_deallocate_ring(struct iio_dev *indio_dev) | ||
{ | ||
} | ||
#define ST_GYRO_TRIGGER_SET_STATE NULL | ||
#endif /* CONFIG_IIO_BUFFER */ | ||
|
||
#endif /* ST_GYRO_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
/* | ||
* STMicroelectronics gyroscopes driver | ||
* | ||
* Copyright 2012-2013 STMicroelectronics Inc. | ||
* | ||
* Denis Ciocca <denis.ciocca@st.com> | ||
* | ||
* Licensed under the GPL-2. | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/kernel.h> | ||
#include <linux/slab.h> | ||
#include <linux/stat.h> | ||
#include <linux/interrupt.h> | ||
#include <linux/i2c.h> | ||
#include <linux/delay.h> | ||
#include <linux/iio/iio.h> | ||
#include <linux/iio/buffer.h> | ||
#include <linux/iio/trigger_consumer.h> | ||
#include <linux/iio/triggered_buffer.h> | ||
|
||
#include <linux/iio/common/st_sensors.h> | ||
#include "st_gyro.h" | ||
|
||
int st_gyro_trig_set_state(struct iio_trigger *trig, bool state) | ||
{ | ||
struct iio_dev *indio_dev = trig->private_data; | ||
|
||
return st_sensors_set_dataready_irq(indio_dev, state); | ||
} | ||
|
||
static int st_gyro_buffer_preenable(struct iio_dev *indio_dev) | ||
{ | ||
int err; | ||
|
||
err = st_sensors_set_enable(indio_dev, true); | ||
if (err < 0) | ||
goto st_gyro_set_enable_error; | ||
|
||
err = iio_sw_buffer_preenable(indio_dev); | ||
|
||
st_gyro_set_enable_error: | ||
return err; | ||
} | ||
|
||
static int st_gyro_buffer_postenable(struct iio_dev *indio_dev) | ||
{ | ||
int err; | ||
struct st_sensor_data *gdata = iio_priv(indio_dev); | ||
|
||
gdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); | ||
if (gdata->buffer_data == NULL) { | ||
err = -ENOMEM; | ||
goto allocate_memory_error; | ||
} | ||
|
||
err = st_sensors_set_axis_enable(indio_dev, | ||
(u8)indio_dev->active_scan_mask[0]); | ||
if (err < 0) | ||
goto st_gyro_buffer_postenable_error; | ||
|
||
err = iio_triggered_buffer_postenable(indio_dev); | ||
if (err < 0) | ||
goto st_gyro_buffer_postenable_error; | ||
|
||
return err; | ||
|
||
st_gyro_buffer_postenable_error: | ||
kfree(gdata->buffer_data); | ||
allocate_memory_error: | ||
return err; | ||
} | ||
|
||
static int st_gyro_buffer_predisable(struct iio_dev *indio_dev) | ||
{ | ||
int err; | ||
struct st_sensor_data *gdata = iio_priv(indio_dev); | ||
|
||
err = iio_triggered_buffer_predisable(indio_dev); | ||
if (err < 0) | ||
goto st_gyro_buffer_predisable_error; | ||
|
||
err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS); | ||
if (err < 0) | ||
goto st_gyro_buffer_predisable_error; | ||
|
||
err = st_sensors_set_enable(indio_dev, false); | ||
|
||
st_gyro_buffer_predisable_error: | ||
kfree(gdata->buffer_data); | ||
return err; | ||
} | ||
|
||
static const struct iio_buffer_setup_ops st_gyro_buffer_setup_ops = { | ||
.preenable = &st_gyro_buffer_preenable, | ||
.postenable = &st_gyro_buffer_postenable, | ||
.predisable = &st_gyro_buffer_predisable, | ||
}; | ||
|
||
int st_gyro_allocate_ring(struct iio_dev *indio_dev) | ||
{ | ||
return iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time, | ||
&st_sensors_trigger_handler, &st_gyro_buffer_setup_ops); | ||
} | ||
|
||
void st_gyro_deallocate_ring(struct iio_dev *indio_dev) | ||
{ | ||
iio_triggered_buffer_cleanup(indio_dev); | ||
} | ||
|
||
MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>"); | ||
MODULE_DESCRIPTION("STMicroelectronics gyroscopes buffer"); | ||
MODULE_LICENSE("GPL v2"); |
Oops, something went wrong.