aboutsummaryrefslogtreecommitdiff
path: root/include/misc.h
blob: 12d1325ee26e4f5ca65f51d2c2012a478e61496c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
 */

#ifndef _MISC_H_
#define _MISC_H_

/**
 * misc_read() - Read the device to buffer, optional.
 * @dev: the device
 * @offset: offset to read the device
 * @buf: pointer to data buffer
 * @size: data size in bytes to read the device
 *
 * Return: number of bytes read if OK (may be 0 if EOF), -ve on error
 */
int misc_read(struct udevice *dev, int offset, void *buf, int size);

/**
 * misc_write() - Write buffer to the device, optional.
 * @dev: the device
 * @offset: offset to write the device
 * @buf: pointer to data buffer
 * @size: data size in bytes to write the device
 *
 * Return: number of bytes written if OK (may be < @size), -ve on error
 */
int misc_write(struct udevice *dev, int offset, void *buf, int size);

/**
 * misc_ioctl() - Assert command to the device, optional.
 * @dev: the device
 * @request: command to be sent to the device
 * @buf: pointer to buffer related to the request
 *
 * Return: 0 if OK, -ve on error
 */
int misc_ioctl(struct udevice *dev, unsigned long request, void *buf);

/**
 * misc_call() - Send a message to the device and wait for a response.
 * @dev: the device.
 * @msgid: the message ID/number to send.
 * @tx_msg: the request/transmit message payload.
 * @tx_size: the size of the buffer pointed at by tx_msg.
 * @rx_msg: the buffer to receive the response message payload. May be NULL if
 *          the caller only cares about the error code.
 * @rx_size: the size of the buffer pointed at by rx_msg.
 *
 * The caller provides the message type/ID and payload to be sent.
 * The callee constructs any message header required, transmits it to the
 * target, waits for a response, checks any error code in the response,
 * strips any message header from the response, and returns the error code
 * (or a parsed version of it) and the response message payload.
 *
 * Return: the response message size if OK, -ve on error
 */
int misc_call(struct udevice *dev, int msgid, void *tx_msg, int tx_size,
	      void *rx_msg, int rx_size);

/**
 * misc_set_enabled() - Enable or disable a device.
 * @dev: the device to enable or disable.
 * @val: the flag that tells the driver to either enable or disable the device.
 *
 * The semantics of "disable" and "enable" should be understood here as
 * activating or deactivating the device's primary function, hence a "disabled"
 * device should be dormant, but still answer to commands and queries.
 *
 * A probed device may start in a disabled or enabled state, depending on the
 * driver and hardware.
 *
 * Return: -ve on error, 0 if the previous state was "disabled", 1 if the
 *	   previous state was "enabled"
 */
int misc_set_enabled(struct udevice *dev, bool val);

/*
 * struct misc_ops - Driver model Misc operations
 *
 * The uclass interface is implemented by all miscellaneous devices which
 * use driver model.
 */
struct misc_ops {
	/**
	 * Read the device to buffer, optional.
	 * @dev: the device
	 * @offset: offset to read the device
	 * @buf: pointer to data buffer
	 * @size: data size in bytes to read the device
	 *
	 * Return: number of bytes read if OK (may be 0 if EOF), -ve on error
	 */
	int (*read)(struct udevice *dev, int offset, void *buf, int size);

	/**
	 * Write buffer to the device, optional.
	 * @dev: the device
	 * @offset: offset to write the device
	 * @buf: pointer to data buffer
	 * @size: data size in bytes to write the device
	 *
	 * Return: number of bytes written if OK (may be < @size), -ve on error
	 */
	int (*write)(struct udevice *dev, int offset, const void *buf,
		     int size);
	/**
	 * Assert command to the device, optional.
	 * @dev: the device
	 * @request: command to be sent to the device
	 * @buf: pointer to buffer related to the request
	 *
	 * Return: 0 if OK, -ve on error
	 */
	int (*ioctl)(struct udevice *dev, unsigned long request, void *buf);

	/**
	 * Send a message to the device and wait for a response.
	 * @dev: the device
	 * @msgid: the message ID/number to send
	 * @tx_msg: the request/transmit message payload
	 * @tx_size: the size of the buffer pointed at by tx_msg
	 * @rx_msg: the buffer to receive the response message payload. May be
	 *          NULL if the caller only cares about the error code.
	 * @rx_size: the size of the buffer pointed at by rx_msg
	 *
	 * Return: the response message size if OK, -ve on error
	 */
	int (*call)(struct udevice *dev, int msgid, void *tx_msg, int tx_size,
		    void *rx_msg, int rx_size);
	/**
	 * Enable or disable a device, optional.
	 * @dev: the device to enable.
	 * @val: the flag that tells the driver to either enable or disable the
	 *	 device.
	 *
	 * Return: -ve on error, 0 if the previous state was "disabled", 1 if
	 *	   the previous state was "enabled"
	 */
	int (*set_enabled)(struct udevice *dev, bool val);
};

#endif	/* _MISC_H_ */