diff options
author | Jonas Aaberg <jonas.aberg@stericsson.com> | 2012-04-17 03:30:33 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-05-01 07:33:18 -0400 |
commit | 112a80d29b529d4057777ac2cb4ec15ff5b6d210 (patch) | |
tree | a649f58551524d4f07c083623ea084b6ecaf5ca1 /include | |
parent | 7e82d6ff5d2c5e35d1fcb8c673287f7d780a13bb (diff) |
mfd: Deny ab8500 suspend if i2c transfer is ongoing
If we are in the middle of an I2C transfer we need to deny suspend
of the AB8500 core. Implement an atomic reference counter for the
I2C operations to make sure we don't do this.
Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Reviewed-by: Mattias Wallin <mattias.wallin@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/mfd/abx500/ab8500.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/include/linux/mfd/abx500/ab8500.h b/include/linux/mfd/abx500/ab8500.h index d798f5b6a55f..91dd3ef63e99 100644 --- a/include/linux/mfd/abx500/ab8500.h +++ b/include/linux/mfd/abx500/ab8500.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #ifndef MFD_AB8500_H | 7 | #ifndef MFD_AB8500_H |
8 | #define MFD_AB8500_H | 8 | #define MFD_AB8500_H |
9 | 9 | ||
10 | #include <linux/atomic.h> | ||
10 | #include <linux/mutex.h> | 11 | #include <linux/mutex.h> |
11 | 12 | ||
12 | struct device; | 13 | struct device; |
@@ -224,6 +225,7 @@ enum ab8500_version { | |||
224 | * @dev: parent device | 225 | * @dev: parent device |
225 | * @lock: read/write operations lock | 226 | * @lock: read/write operations lock |
226 | * @irq_lock: genirq bus lock | 227 | * @irq_lock: genirq bus lock |
228 | * @transfer_ongoing: 0 if no transfer ongoing | ||
227 | * @irq: irq line | 229 | * @irq: irq line |
228 | * @version: chip version id (e.g. ab8500 or ab9540) | 230 | * @version: chip version id (e.g. ab8500 or ab9540) |
229 | * @chip_id: chip revision id | 231 | * @chip_id: chip revision id |
@@ -242,7 +244,7 @@ struct ab8500 { | |||
242 | struct device *dev; | 244 | struct device *dev; |
243 | struct mutex lock; | 245 | struct mutex lock; |
244 | struct mutex irq_lock; | 246 | struct mutex irq_lock; |
245 | 247 | atomic_t transfer_ongoing; | |
246 | int irq_base; | 248 | int irq_base; |
247 | int irq; | 249 | int irq; |
248 | enum ab8500_version version; | 250 | enum ab8500_version version; |
@@ -288,6 +290,8 @@ extern int __devinit ab8500_init(struct ab8500 *ab8500, | |||
288 | enum ab8500_version version); | 290 | enum ab8500_version version); |
289 | extern int __devexit ab8500_exit(struct ab8500 *ab8500); | 291 | extern int __devexit ab8500_exit(struct ab8500 *ab8500); |
290 | 292 | ||
293 | extern int ab8500_suspend(struct ab8500 *ab8500); | ||
294 | |||
291 | static inline int is_ab8500(struct ab8500 *ab) | 295 | static inline int is_ab8500(struct ab8500 *ab) |
292 | { | 296 | { |
293 | return ab->version == AB8500_VERSION_AB8500; | 297 | return ab->version == AB8500_VERSION_AB8500; |