diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/hsi/hsi.h | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/include/linux/hsi/hsi.h b/include/linux/hsi/hsi.h index 7f3b7262a2b6..56fae865e272 100644 --- a/include/linux/hsi/hsi.h +++ b/include/linux/hsi/hsi.h | |||
| @@ -26,9 +26,9 @@ | |||
| 26 | #include <linux/device.h> | 26 | #include <linux/device.h> |
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/scatterlist.h> | 28 | #include <linux/scatterlist.h> |
| 29 | #include <linux/spinlock.h> | ||
| 30 | #include <linux/list.h> | 29 | #include <linux/list.h> |
| 31 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 31 | #include <linux/notifier.h> | ||
| 32 | 32 | ||
| 33 | /* HSI message ttype */ | 33 | /* HSI message ttype */ |
| 34 | #define HSI_MSG_READ 0 | 34 | #define HSI_MSG_READ 0 |
| @@ -121,18 +121,18 @@ static inline int hsi_register_board_info(struct hsi_board_info const *info, | |||
| 121 | * @device: Driver model representation of the device | 121 | * @device: Driver model representation of the device |
| 122 | * @tx_cfg: HSI TX configuration | 122 | * @tx_cfg: HSI TX configuration |
| 123 | * @rx_cfg: HSI RX configuration | 123 | * @rx_cfg: HSI RX configuration |
| 124 | * @hsi_start_rx: Called after incoming wake line goes high | 124 | * @e_handler: Callback for handling port events (RX Wake High/Low) |
| 125 | * @hsi_stop_rx: Called after incoming wake line goes low | 125 | * @pclaimed: Keeps tracks if the clients claimed its associated HSI port |
| 126 | * @nb: Notifier block for port events | ||
| 126 | */ | 127 | */ |
| 127 | struct hsi_client { | 128 | struct hsi_client { |
| 128 | struct device device; | 129 | struct device device; |
| 129 | struct hsi_config tx_cfg; | 130 | struct hsi_config tx_cfg; |
| 130 | struct hsi_config rx_cfg; | 131 | struct hsi_config rx_cfg; |
| 131 | void (*hsi_start_rx)(struct hsi_client *cl); | ||
| 132 | void (*hsi_stop_rx)(struct hsi_client *cl); | ||
| 133 | /* private: */ | 132 | /* private: */ |
| 133 | void (*ehandler)(struct hsi_client *, unsigned long); | ||
| 134 | unsigned int pclaimed:1; | 134 | unsigned int pclaimed:1; |
| 135 | struct list_head link; | 135 | struct notifier_block nb; |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | #define to_hsi_client(dev) container_of(dev, struct hsi_client, device) | 138 | #define to_hsi_client(dev) container_of(dev, struct hsi_client, device) |
| @@ -147,6 +147,10 @@ static inline void *hsi_client_drvdata(struct hsi_client *cl) | |||
| 147 | return dev_get_drvdata(&cl->device); | 147 | return dev_get_drvdata(&cl->device); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | int hsi_register_port_event(struct hsi_client *cl, | ||
| 151 | void (*handler)(struct hsi_client *, unsigned long)); | ||
| 152 | int hsi_unregister_port_event(struct hsi_client *cl); | ||
| 153 | |||
| 150 | /** | 154 | /** |
| 151 | * struct hsi_client_driver - Driver associated to an HSI client | 155 | * struct hsi_client_driver - Driver associated to an HSI client |
| 152 | * @driver: Driver model representation of the driver | 156 | * @driver: Driver model representation of the driver |
| @@ -214,8 +218,7 @@ void hsi_free_msg(struct hsi_msg *msg); | |||
| 214 | * @start_tx: Callback to inform that a client wants to TX data | 218 | * @start_tx: Callback to inform that a client wants to TX data |
| 215 | * @stop_tx: Callback to inform that a client no longer wishes to TX data | 219 | * @stop_tx: Callback to inform that a client no longer wishes to TX data |
| 216 | * @release: Callback to inform that a client no longer uses the port | 220 | * @release: Callback to inform that a client no longer uses the port |
| 217 | * @clients: List of hsi_clients using the port. | 221 | * @n_head: Notifier chain for signaling port events to the clients. |
| 218 | * @clock: Lock to serialize access to the clients list. | ||
| 219 | */ | 222 | */ |
| 220 | struct hsi_port { | 223 | struct hsi_port { |
| 221 | struct device device; | 224 | struct device device; |
| @@ -231,14 +234,14 @@ struct hsi_port { | |||
| 231 | int (*start_tx)(struct hsi_client *cl); | 234 | int (*start_tx)(struct hsi_client *cl); |
| 232 | int (*stop_tx)(struct hsi_client *cl); | 235 | int (*stop_tx)(struct hsi_client *cl); |
| 233 | int (*release)(struct hsi_client *cl); | 236 | int (*release)(struct hsi_client *cl); |
| 234 | struct list_head clients; | 237 | /* private */ |
| 235 | spinlock_t clock; | 238 | struct atomic_notifier_head n_head; |
| 236 | }; | 239 | }; |
| 237 | 240 | ||
| 238 | #define to_hsi_port(dev) container_of(dev, struct hsi_port, device) | 241 | #define to_hsi_port(dev) container_of(dev, struct hsi_port, device) |
| 239 | #define hsi_get_port(cl) to_hsi_port((cl)->device.parent) | 242 | #define hsi_get_port(cl) to_hsi_port((cl)->device.parent) |
| 240 | 243 | ||
| 241 | void hsi_event(struct hsi_port *port, unsigned int event); | 244 | int hsi_event(struct hsi_port *port, unsigned long event); |
| 242 | int hsi_claim_port(struct hsi_client *cl, unsigned int share); | 245 | int hsi_claim_port(struct hsi_client *cl, unsigned int share); |
| 243 | void hsi_release_port(struct hsi_client *cl); | 246 | void hsi_release_port(struct hsi_client *cl); |
| 244 | 247 | ||
