blob: 4d4703fdb50df60f35858e95a7944b89db22e5ef [file] [log] [blame]
Duy Truong790f06d2013-02-13 16:38:12 -08001/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#ifndef __SUBSYS_RESTART_H
15#define __SUBSYS_RESTART_H
16
17#include <linux/spinlock.h>
18
19#define SUBSYS_NAME_MAX_LENGTH 40
20
Stephen Boyd0ebf7212012-04-30 20:42:35 -070021struct subsys_device;
22
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070023enum {
Stephen Boydfcb52a32012-12-03 12:35:14 -080024 RESET_SOC = 0,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070025 RESET_SUBSYS_COUPLED,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070026 RESET_LEVEL_MAX
27};
28
Stephen Boyd4ec9a942012-06-21 19:10:48 -070029struct device;
30struct module;
31
32/**
33 * struct subsys_desc - subsystem descriptor
34 * @name: name of subsystem
35 * @depends_on: subsystem this subsystem depends on to operate
36 * @dev: parent device
37 * @owner: module the descriptor belongs to
Stephen Boyd2e5c80d2012-06-25 19:33:43 -070038 * @start: Start a subsystem
39 * @stop: Stop a subsystem
40 * @shutdown: Stop a subsystem
41 * @powerup: Start a subsystem
42 * @crash_shutdown: Shutdown a subsystem when the system crashes (can't sleep)
43 * @ramdump: Collect a ramdump of the subsystem
Stephen Boyd4ec9a942012-06-21 19:10:48 -070044 */
Stephen Boyd0ebf7212012-04-30 20:42:35 -070045struct subsys_desc {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070046 const char *name;
Stephen Boyd4ec9a942012-06-21 19:10:48 -070047 const char *depends_on;
48 struct device *dev;
49 struct module *owner;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070050
Stephen Boyd2e5c80d2012-06-25 19:33:43 -070051 int (*start)(const struct subsys_desc *desc);
52 void (*stop)(const struct subsys_desc *desc);
53
Stephen Boyd0ebf7212012-04-30 20:42:35 -070054 int (*shutdown)(const struct subsys_desc *desc);
55 int (*powerup)(const struct subsys_desc *desc);
56 void (*crash_shutdown)(const struct subsys_desc *desc);
57 int (*ramdump)(int, const struct subsys_desc *desc);
Seemanta Duttad32f92a2013-01-25 14:22:15 -080058 unsigned int err_ready_irq;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070059};
60
61#if defined(CONFIG_MSM_SUBSYSTEM_RESTART)
62
Stephen Boydfcb52a32012-12-03 12:35:14 -080063extern int subsys_get_restart_level(struct subsys_device *dev);
Stephen Boyd0ebf7212012-04-30 20:42:35 -070064extern int subsystem_restart_dev(struct subsys_device *dev);
65extern int subsystem_restart(const char *name);
Stephen Boyd4057ec02012-12-12 17:38:38 -080066extern int subsystem_crashed(const char *name);
Stephen Boyd0ebf7212012-04-30 20:42:35 -070067
Stephen Boyd2e5c80d2012-06-25 19:33:43 -070068extern void *subsystem_get(const char *name);
69extern void subsystem_put(void *subsystem);
70
Stephen Boyd0ebf7212012-04-30 20:42:35 -070071extern struct subsys_device *subsys_register(struct subsys_desc *desc);
72extern void subsys_unregister(struct subsys_device *dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070073
Stephen Boyd43b380a2012-09-21 17:34:24 -070074extern void subsys_default_online(struct subsys_device *dev);
75
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070076#else
77
Stephen Boydfcb52a32012-12-03 12:35:14 -080078static inline int subsys_get_restart_level(struct subsys_device *dev)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070079{
80 return 0;
81}
82
Stephen Boyd0ebf7212012-04-30 20:42:35 -070083static inline int subsystem_restart_dev(struct subsys_device *dev)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070084{
85 return 0;
86}
87
Stephen Boyd0ebf7212012-04-30 20:42:35 -070088static inline int subsystem_restart(const char *name)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070089{
90 return 0;
91}
92
Stephen Boyd4057ec02012-12-12 17:38:38 -080093static inline int subsystem_crashed(const char *name)
94{
95 return 0;
96}
97
Stephen Boyd2e5c80d2012-06-25 19:33:43 -070098static inline void *subsystem_get(const char *name)
99{
100 return NULL;
101}
102
103static inline void subsystem_put(void *subsystem) { }
104
Stephen Boyd0ebf7212012-04-30 20:42:35 -0700105static inline
106struct subsys_device *subsys_register(struct subsys_desc *desc)
107{
108 return NULL;
109}
110
111static inline void subsys_unregister(struct subsys_device *dev) { }
112
Stephen Boyd43b380a2012-09-21 17:34:24 -0700113static inline void subsys_default_online(struct subsys_device *dev) { }
114
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700115#endif /* CONFIG_MSM_SUBSYSTEM_RESTART */
116
117#endif