1ddf56bc7SNishanth Menon /*
2ddf56bc7SNishanth Menon * (C) Copyright 2015
3ddf56bc7SNishanth Menon * Texas Instruments Incorporated - http://www.ti.com/
4ddf56bc7SNishanth Menon * SPDX-License-Identifier: GPL-2.0+
5ddf56bc7SNishanth Menon */
6ddf56bc7SNishanth Menon #define pr_fmt(fmt) "%s: " fmt, __func__
7ddf56bc7SNishanth Menon #include <common.h>
8ddf56bc7SNishanth Menon #include <errno.h>
9ddf56bc7SNishanth Menon #include <fdtdec.h>
10ddf56bc7SNishanth Menon #include <malloc.h>
11ddf56bc7SNishanth Menon #include <remoteproc.h>
12ddf56bc7SNishanth Menon #include <asm/io.h>
13ddf56bc7SNishanth Menon #include <dm/device-internal.h>
14ddf56bc7SNishanth Menon #include <dm.h>
15ddf56bc7SNishanth Menon #include <dm/uclass.h>
16ddf56bc7SNishanth Menon #include <dm/uclass-internal.h>
17ddf56bc7SNishanth Menon
18ddf56bc7SNishanth Menon DECLARE_GLOBAL_DATA_PTR;
19ddf56bc7SNishanth Menon
20ddf56bc7SNishanth Menon /**
21ddf56bc7SNishanth Menon * for_each_remoteproc_device() - iterate through the list of rproc devices
22ddf56bc7SNishanth Menon * @fn: check function to call per match, if this function returns fail,
23ddf56bc7SNishanth Menon * iteration is aborted with the resultant error value
24ddf56bc7SNishanth Menon * @skip_dev: Device to skip calling the callback about.
25ddf56bc7SNishanth Menon * @data: Data to pass to the callback function
26ddf56bc7SNishanth Menon *
27ddf56bc7SNishanth Menon * Return: 0 if none of the callback returned a non 0 result, else returns the
28ddf56bc7SNishanth Menon * result from the callback function
29ddf56bc7SNishanth Menon */
for_each_remoteproc_device(int (* fn)(struct udevice * dev,struct dm_rproc_uclass_pdata * uc_pdata,const void * data),struct udevice * skip_dev,const void * data)30ddf56bc7SNishanth Menon static int for_each_remoteproc_device(int (*fn) (struct udevice *dev,
31ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata,
32ddf56bc7SNishanth Menon const void *data),
33ddf56bc7SNishanth Menon struct udevice *skip_dev,
34ddf56bc7SNishanth Menon const void *data)
35ddf56bc7SNishanth Menon {
36ddf56bc7SNishanth Menon struct udevice *dev;
37ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata;
38ddf56bc7SNishanth Menon int ret;
39ddf56bc7SNishanth Menon
40ddf56bc7SNishanth Menon for (ret = uclass_find_first_device(UCLASS_REMOTEPROC, &dev); dev;
41ddf56bc7SNishanth Menon ret = uclass_find_next_device(&dev)) {
42ddf56bc7SNishanth Menon if (ret || dev == skip_dev)
43ddf56bc7SNishanth Menon continue;
44ddf56bc7SNishanth Menon uc_pdata = dev_get_uclass_platdata(dev);
45ddf56bc7SNishanth Menon ret = fn(dev, uc_pdata, data);
46ddf56bc7SNishanth Menon if (ret)
47ddf56bc7SNishanth Menon return ret;
48ddf56bc7SNishanth Menon }
49ddf56bc7SNishanth Menon
50ddf56bc7SNishanth Menon return 0;
51ddf56bc7SNishanth Menon }
52ddf56bc7SNishanth Menon
53ddf56bc7SNishanth Menon /**
54ddf56bc7SNishanth Menon * _rproc_name_is_unique() - iteration helper to check if rproc name is unique
55ddf56bc7SNishanth Menon * @dev: device that we are checking name for
56ddf56bc7SNishanth Menon * @uc_pdata: uclass platform data
57ddf56bc7SNishanth Menon * @data: compare data (this is the name we want to ensure is unique)
58ddf56bc7SNishanth Menon *
59ddf56bc7SNishanth Menon * Return: 0 is there is no match(is unique); if there is a match(we dont
60ddf56bc7SNishanth Menon * have a unique name), return -EINVAL.
61ddf56bc7SNishanth Menon */
_rproc_name_is_unique(struct udevice * dev,struct dm_rproc_uclass_pdata * uc_pdata,const void * data)62ddf56bc7SNishanth Menon static int _rproc_name_is_unique(struct udevice *dev,
63ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata,
64ddf56bc7SNishanth Menon const void *data)
65ddf56bc7SNishanth Menon {
66ddf56bc7SNishanth Menon const char *check_name = data;
67ddf56bc7SNishanth Menon
68ddf56bc7SNishanth Menon /* devices not yet populated with data - so skip them */
699cb05a8fSNishanth Menon if (!uc_pdata->name || !check_name)
70ddf56bc7SNishanth Menon return 0;
71ddf56bc7SNishanth Menon
72ddf56bc7SNishanth Menon /* Return 0 to search further if we dont match */
73ddf56bc7SNishanth Menon if (strlen(uc_pdata->name) != strlen(check_name))
74ddf56bc7SNishanth Menon return 0;
75ddf56bc7SNishanth Menon
76ddf56bc7SNishanth Menon if (!strcmp(uc_pdata->name, check_name))
77ddf56bc7SNishanth Menon return -EINVAL;
78ddf56bc7SNishanth Menon
79ddf56bc7SNishanth Menon return 0;
80ddf56bc7SNishanth Menon }
81ddf56bc7SNishanth Menon
82ddf56bc7SNishanth Menon /**
83ddf56bc7SNishanth Menon * rproc_name_is_unique() - Check if the rproc name is unique
84ddf56bc7SNishanth Menon * @check_dev: Device we are attempting to ensure is unique
85ddf56bc7SNishanth Menon * @check_name: Name we are trying to ensure is unique.
86ddf56bc7SNishanth Menon *
87ddf56bc7SNishanth Menon * Return: true if we have a unique name, false if name is not unique.
88ddf56bc7SNishanth Menon */
rproc_name_is_unique(struct udevice * check_dev,const char * check_name)89ddf56bc7SNishanth Menon static bool rproc_name_is_unique(struct udevice *check_dev,
90ddf56bc7SNishanth Menon const char *check_name)
91ddf56bc7SNishanth Menon {
92ddf56bc7SNishanth Menon int ret;
93ddf56bc7SNishanth Menon
94ddf56bc7SNishanth Menon ret = for_each_remoteproc_device(_rproc_name_is_unique,
95ddf56bc7SNishanth Menon check_dev, check_name);
96ddf56bc7SNishanth Menon return ret ? false : true;
97ddf56bc7SNishanth Menon }
98ddf56bc7SNishanth Menon
99ddf56bc7SNishanth Menon /**
100ddf56bc7SNishanth Menon * rproc_pre_probe() - Pre probe accessor for the uclass
101ddf56bc7SNishanth Menon * @dev: device for which we are preprobing
102ddf56bc7SNishanth Menon *
103ddf56bc7SNishanth Menon * Parses and fills up the uclass pdata for use as needed by core and
104ddf56bc7SNishanth Menon * remote proc drivers.
105ddf56bc7SNishanth Menon *
106ddf56bc7SNishanth Menon * Return: 0 if all wernt ok, else appropriate error value.
107ddf56bc7SNishanth Menon */
rproc_pre_probe(struct udevice * dev)108ddf56bc7SNishanth Menon static int rproc_pre_probe(struct udevice *dev)
109ddf56bc7SNishanth Menon {
110ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata;
111ddf56bc7SNishanth Menon const struct dm_rproc_ops *ops;
112ddf56bc7SNishanth Menon
113ddf56bc7SNishanth Menon uc_pdata = dev_get_uclass_platdata(dev);
114ddf56bc7SNishanth Menon
115ddf56bc7SNishanth Menon /* See if we need to populate via fdt */
116ddf56bc7SNishanth Menon
117ddf56bc7SNishanth Menon if (!dev->platdata) {
118ddf56bc7SNishanth Menon #if CONFIG_IS_ENABLED(OF_CONTROL)
119*e160f7d4SSimon Glass int node = dev_of_offset(dev);
120ddf56bc7SNishanth Menon const void *blob = gd->fdt_blob;
121ddf56bc7SNishanth Menon bool tmp;
122ddf56bc7SNishanth Menon if (!blob) {
123ddf56bc7SNishanth Menon debug("'%s' no dt?\n", dev->name);
124ddf56bc7SNishanth Menon return -EINVAL;
125ddf56bc7SNishanth Menon }
126ddf56bc7SNishanth Menon debug("'%s': using fdt\n", dev->name);
127ddf56bc7SNishanth Menon uc_pdata->name = fdt_getprop(blob, node,
128ddf56bc7SNishanth Menon "remoteproc-name", NULL);
129ddf56bc7SNishanth Menon
130ddf56bc7SNishanth Menon /* Default is internal memory mapped */
131ddf56bc7SNishanth Menon uc_pdata->mem_type = RPROC_INTERNAL_MEMORY_MAPPED;
132ddf56bc7SNishanth Menon tmp = fdtdec_get_bool(blob, node,
133ddf56bc7SNishanth Menon "remoteproc-internal-memory-mapped");
134ddf56bc7SNishanth Menon if (tmp)
135ddf56bc7SNishanth Menon uc_pdata->mem_type = RPROC_INTERNAL_MEMORY_MAPPED;
136ddf56bc7SNishanth Menon #else
137ddf56bc7SNishanth Menon /* Nothing much we can do about this, can we? */
138ddf56bc7SNishanth Menon return -EINVAL;
139ddf56bc7SNishanth Menon #endif
140ddf56bc7SNishanth Menon
141ddf56bc7SNishanth Menon } else {
142ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *pdata = dev->platdata;
143ddf56bc7SNishanth Menon
144ddf56bc7SNishanth Menon debug("'%s': using legacy data\n", dev->name);
145ddf56bc7SNishanth Menon if (pdata->name)
146ddf56bc7SNishanth Menon uc_pdata->name = pdata->name;
147ddf56bc7SNishanth Menon uc_pdata->mem_type = pdata->mem_type;
148ddf56bc7SNishanth Menon uc_pdata->driver_plat_data = pdata->driver_plat_data;
149ddf56bc7SNishanth Menon }
150ddf56bc7SNishanth Menon
151ddf56bc7SNishanth Menon /* Else try using device Name */
152ddf56bc7SNishanth Menon if (!uc_pdata->name)
153ddf56bc7SNishanth Menon uc_pdata->name = dev->name;
154ddf56bc7SNishanth Menon if (!uc_pdata->name) {
155ddf56bc7SNishanth Menon debug("Unnamed device!");
156ddf56bc7SNishanth Menon return -EINVAL;
157ddf56bc7SNishanth Menon }
158ddf56bc7SNishanth Menon
159ddf56bc7SNishanth Menon if (!rproc_name_is_unique(dev, uc_pdata->name)) {
160ddf56bc7SNishanth Menon debug("%s duplicate name '%s'\n", dev->name, uc_pdata->name);
161ddf56bc7SNishanth Menon return -EINVAL;
162ddf56bc7SNishanth Menon }
163ddf56bc7SNishanth Menon
164ddf56bc7SNishanth Menon ops = rproc_get_ops(dev);
165ddf56bc7SNishanth Menon if (!ops) {
166ddf56bc7SNishanth Menon debug("%s driver has no ops?\n", dev->name);
167ddf56bc7SNishanth Menon return -EINVAL;
168ddf56bc7SNishanth Menon }
169ddf56bc7SNishanth Menon
170ddf56bc7SNishanth Menon if (!ops->load || !ops->start) {
171ddf56bc7SNishanth Menon debug("%s driver has missing mandatory ops?\n", dev->name);
172ddf56bc7SNishanth Menon return -EINVAL;
173ddf56bc7SNishanth Menon }
174ddf56bc7SNishanth Menon
175ddf56bc7SNishanth Menon return 0;
176ddf56bc7SNishanth Menon }
177ddf56bc7SNishanth Menon
178ddf56bc7SNishanth Menon /**
179ddf56bc7SNishanth Menon * rproc_post_probe() - post probe accessor for the uclass
180ddf56bc7SNishanth Menon * @dev: deivce we finished probing
181ddf56bc7SNishanth Menon *
182ddf56bc7SNishanth Menon * initiate init function after the probe is completed. This allows
183ddf56bc7SNishanth Menon * the remote processor drivers to split up the initializations between
184ddf56bc7SNishanth Menon * probe and init as needed.
185ddf56bc7SNishanth Menon *
186ddf56bc7SNishanth Menon * Return: if the remote proc driver has a init routine, invokes it and
187ddf56bc7SNishanth Menon * hands over the return value. overall, 0 if all went well, else appropriate
188ddf56bc7SNishanth Menon * error value.
189ddf56bc7SNishanth Menon */
rproc_post_probe(struct udevice * dev)190ddf56bc7SNishanth Menon static int rproc_post_probe(struct udevice *dev)
191ddf56bc7SNishanth Menon {
192ddf56bc7SNishanth Menon const struct dm_rproc_ops *ops;
193ddf56bc7SNishanth Menon
194ddf56bc7SNishanth Menon ops = rproc_get_ops(dev);
195ddf56bc7SNishanth Menon if (!ops) {
196ddf56bc7SNishanth Menon debug("%s driver has no ops?\n", dev->name);
197ddf56bc7SNishanth Menon return -EINVAL;
198ddf56bc7SNishanth Menon }
199ddf56bc7SNishanth Menon
200ddf56bc7SNishanth Menon if (ops->init)
201ddf56bc7SNishanth Menon return ops->init(dev);
202ddf56bc7SNishanth Menon
203ddf56bc7SNishanth Menon return 0;
204ddf56bc7SNishanth Menon }
205ddf56bc7SNishanth Menon
206ddf56bc7SNishanth Menon UCLASS_DRIVER(rproc) = {
207ddf56bc7SNishanth Menon .id = UCLASS_REMOTEPROC,
208ddf56bc7SNishanth Menon .name = "remoteproc",
209ddf56bc7SNishanth Menon .flags = DM_UC_FLAG_SEQ_ALIAS,
210ddf56bc7SNishanth Menon .pre_probe = rproc_pre_probe,
211ddf56bc7SNishanth Menon .post_probe = rproc_post_probe,
212ddf56bc7SNishanth Menon .per_device_platdata_auto_alloc_size =
213ddf56bc7SNishanth Menon sizeof(struct dm_rproc_uclass_pdata),
214ddf56bc7SNishanth Menon };
215ddf56bc7SNishanth Menon
216ddf56bc7SNishanth Menon /* Remoteproc subsystem access functions */
217ddf56bc7SNishanth Menon /**
218ddf56bc7SNishanth Menon * _rproc_probe_dev() - iteration helper to probe a rproc device
219ddf56bc7SNishanth Menon * @dev: device to probe
220ddf56bc7SNishanth Menon * @uc_pdata: uclass data allocated for the device
221ddf56bc7SNishanth Menon * @data: unused
222ddf56bc7SNishanth Menon *
223ddf56bc7SNishanth Menon * Return: 0 if all ok, else appropriate error value.
224ddf56bc7SNishanth Menon */
_rproc_probe_dev(struct udevice * dev,struct dm_rproc_uclass_pdata * uc_pdata,const void * data)225ddf56bc7SNishanth Menon static int _rproc_probe_dev(struct udevice *dev,
226ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata,
227ddf56bc7SNishanth Menon const void *data)
228ddf56bc7SNishanth Menon {
229ddf56bc7SNishanth Menon int ret;
230ddf56bc7SNishanth Menon
231ddf56bc7SNishanth Menon ret = device_probe(dev);
232ddf56bc7SNishanth Menon
233ddf56bc7SNishanth Menon if (ret)
234ddf56bc7SNishanth Menon debug("%s: Failed to initialize - %d\n", dev->name, ret);
235ddf56bc7SNishanth Menon return ret;
236ddf56bc7SNishanth Menon }
237ddf56bc7SNishanth Menon
238ddf56bc7SNishanth Menon /**
239ddf56bc7SNishanth Menon * _rproc_dev_is_probed() - check if the device has been probed
240ddf56bc7SNishanth Menon * @dev: device to check
241ddf56bc7SNishanth Menon * @uc_pdata: unused
242ddf56bc7SNishanth Menon * @data: unused
243ddf56bc7SNishanth Menon *
244ddf56bc7SNishanth Menon * Return: -EAGAIN if not probed else return 0
245ddf56bc7SNishanth Menon */
_rproc_dev_is_probed(struct udevice * dev,struct dm_rproc_uclass_pdata * uc_pdata,const void * data)246ddf56bc7SNishanth Menon static int _rproc_dev_is_probed(struct udevice *dev,
247ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata,
248ddf56bc7SNishanth Menon const void *data)
249ddf56bc7SNishanth Menon {
250ddf56bc7SNishanth Menon if (dev->flags & DM_FLAG_ACTIVATED)
251ddf56bc7SNishanth Menon return 0;
252ddf56bc7SNishanth Menon
253ddf56bc7SNishanth Menon return -EAGAIN;
254ddf56bc7SNishanth Menon }
255ddf56bc7SNishanth Menon
rproc_is_initialized(void)256ddf56bc7SNishanth Menon bool rproc_is_initialized(void)
257ddf56bc7SNishanth Menon {
258ddf56bc7SNishanth Menon int ret = for_each_remoteproc_device(_rproc_dev_is_probed, NULL, NULL);
259ddf56bc7SNishanth Menon return ret ? false : true;
260ddf56bc7SNishanth Menon }
261ddf56bc7SNishanth Menon
rproc_init(void)262ddf56bc7SNishanth Menon int rproc_init(void)
263ddf56bc7SNishanth Menon {
264ddf56bc7SNishanth Menon int ret;
265ddf56bc7SNishanth Menon
266ddf56bc7SNishanth Menon if (rproc_is_initialized()) {
267ddf56bc7SNishanth Menon debug("Already initialized\n");
268ddf56bc7SNishanth Menon return -EINVAL;
269ddf56bc7SNishanth Menon }
270ddf56bc7SNishanth Menon
271ddf56bc7SNishanth Menon ret = for_each_remoteproc_device(_rproc_probe_dev, NULL, NULL);
272ddf56bc7SNishanth Menon return ret;
273ddf56bc7SNishanth Menon }
274ddf56bc7SNishanth Menon
rproc_load(int id,ulong addr,ulong size)275ddf56bc7SNishanth Menon int rproc_load(int id, ulong addr, ulong size)
276ddf56bc7SNishanth Menon {
277ddf56bc7SNishanth Menon struct udevice *dev = NULL;
278ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata;
279ddf56bc7SNishanth Menon const struct dm_rproc_ops *ops;
280ddf56bc7SNishanth Menon int ret;
281ddf56bc7SNishanth Menon
282ddf56bc7SNishanth Menon ret = uclass_get_device_by_seq(UCLASS_REMOTEPROC, id, &dev);
283ddf56bc7SNishanth Menon if (ret) {
284ddf56bc7SNishanth Menon debug("Unknown remote processor id '%d' requested(%d)\n",
285ddf56bc7SNishanth Menon id, ret);
286ddf56bc7SNishanth Menon return ret;
287ddf56bc7SNishanth Menon }
288ddf56bc7SNishanth Menon
289ddf56bc7SNishanth Menon uc_pdata = dev_get_uclass_platdata(dev);
290ddf56bc7SNishanth Menon
291ddf56bc7SNishanth Menon ops = rproc_get_ops(dev);
292ddf56bc7SNishanth Menon if (!ops) {
293ddf56bc7SNishanth Menon debug("%s driver has no ops?\n", dev->name);
294ddf56bc7SNishanth Menon return -EINVAL;
295ddf56bc7SNishanth Menon }
296ddf56bc7SNishanth Menon
297ddf56bc7SNishanth Menon debug("Loading to '%s' from address 0x%08lX size of %lu bytes\n",
298ddf56bc7SNishanth Menon uc_pdata->name, addr, size);
299ddf56bc7SNishanth Menon if (ops->load)
300ddf56bc7SNishanth Menon return ops->load(dev, addr, size);
301ddf56bc7SNishanth Menon
302ddf56bc7SNishanth Menon debug("%s: data corruption?? mandatory function is missing!\n",
303ddf56bc7SNishanth Menon dev->name);
304ddf56bc7SNishanth Menon
305ddf56bc7SNishanth Menon return -EINVAL;
306ddf56bc7SNishanth Menon };
307ddf56bc7SNishanth Menon
308ddf56bc7SNishanth Menon /*
309ddf56bc7SNishanth Menon * Completely internal helper enums..
310ddf56bc7SNishanth Menon * Keeping this isolated helps this code evolve independent of other
311ddf56bc7SNishanth Menon * parts..
312ddf56bc7SNishanth Menon */
313ddf56bc7SNishanth Menon enum rproc_ops {
314ddf56bc7SNishanth Menon RPROC_START,
315ddf56bc7SNishanth Menon RPROC_STOP,
316ddf56bc7SNishanth Menon RPROC_RESET,
317ddf56bc7SNishanth Menon RPROC_PING,
318ddf56bc7SNishanth Menon RPROC_RUNNING,
319ddf56bc7SNishanth Menon };
320ddf56bc7SNishanth Menon
321ddf56bc7SNishanth Menon /**
322ddf56bc7SNishanth Menon * _rproc_ops_wrapper() - wrapper for invoking remote proc driver callback
323ddf56bc7SNishanth Menon * @id: id of the remote processor
324ddf56bc7SNishanth Menon * @op: one of rproc_ops that indicate what operation to invoke
325ddf56bc7SNishanth Menon *
326ddf56bc7SNishanth Menon * Most of the checks and verification for remoteproc operations are more
327ddf56bc7SNishanth Menon * or less same for almost all operations. This allows us to put a wrapper
328ddf56bc7SNishanth Menon * and use the common checks to allow the driver to function appropriately.
329ddf56bc7SNishanth Menon *
330ddf56bc7SNishanth Menon * Return: 0 if all ok, else appropriate error value.
331ddf56bc7SNishanth Menon */
_rproc_ops_wrapper(int id,enum rproc_ops op)332ddf56bc7SNishanth Menon static int _rproc_ops_wrapper(int id, enum rproc_ops op)
333ddf56bc7SNishanth Menon {
334ddf56bc7SNishanth Menon struct udevice *dev = NULL;
335ddf56bc7SNishanth Menon struct dm_rproc_uclass_pdata *uc_pdata;
336ddf56bc7SNishanth Menon const struct dm_rproc_ops *ops;
337ddf56bc7SNishanth Menon int (*fn)(struct udevice *dev);
338ddf56bc7SNishanth Menon bool mandatory = false;
339ddf56bc7SNishanth Menon char *op_str;
340ddf56bc7SNishanth Menon int ret;
341ddf56bc7SNishanth Menon
342ddf56bc7SNishanth Menon ret = uclass_get_device_by_seq(UCLASS_REMOTEPROC, id, &dev);
343ddf56bc7SNishanth Menon if (ret) {
344ddf56bc7SNishanth Menon debug("Unknown remote processor id '%d' requested(%d)\n",
345ddf56bc7SNishanth Menon id, ret);
346ddf56bc7SNishanth Menon return ret;
347ddf56bc7SNishanth Menon }
348ddf56bc7SNishanth Menon
349ddf56bc7SNishanth Menon uc_pdata = dev_get_uclass_platdata(dev);
350ddf56bc7SNishanth Menon
351ddf56bc7SNishanth Menon ops = rproc_get_ops(dev);
352ddf56bc7SNishanth Menon if (!ops) {
353ddf56bc7SNishanth Menon debug("%s driver has no ops?\n", dev->name);
354ddf56bc7SNishanth Menon return -EINVAL;
355ddf56bc7SNishanth Menon }
356ddf56bc7SNishanth Menon switch (op) {
357ddf56bc7SNishanth Menon case RPROC_START:
358ddf56bc7SNishanth Menon fn = ops->start;
359ddf56bc7SNishanth Menon mandatory = true;
360ddf56bc7SNishanth Menon op_str = "Starting";
361ddf56bc7SNishanth Menon break;
362ddf56bc7SNishanth Menon case RPROC_STOP:
363ddf56bc7SNishanth Menon fn = ops->stop;
364ddf56bc7SNishanth Menon op_str = "Stopping";
365ddf56bc7SNishanth Menon break;
366ddf56bc7SNishanth Menon case RPROC_RESET:
367ddf56bc7SNishanth Menon fn = ops->reset;
368ddf56bc7SNishanth Menon op_str = "Resetting";
369ddf56bc7SNishanth Menon break;
370ddf56bc7SNishanth Menon case RPROC_RUNNING:
371ddf56bc7SNishanth Menon fn = ops->is_running;
372ddf56bc7SNishanth Menon op_str = "Checking if running:";
373ddf56bc7SNishanth Menon break;
374ddf56bc7SNishanth Menon case RPROC_PING:
375ddf56bc7SNishanth Menon fn = ops->ping;
376ddf56bc7SNishanth Menon op_str = "Pinging";
377ddf56bc7SNishanth Menon break;
378ddf56bc7SNishanth Menon default:
379ddf56bc7SNishanth Menon debug("what is '%d' operation??\n", op);
380ddf56bc7SNishanth Menon return -EINVAL;
381ddf56bc7SNishanth Menon }
382ddf56bc7SNishanth Menon
383ddf56bc7SNishanth Menon debug("%s %s...\n", op_str, uc_pdata->name);
384ddf56bc7SNishanth Menon if (fn)
385ddf56bc7SNishanth Menon return fn(dev);
386ddf56bc7SNishanth Menon
387ddf56bc7SNishanth Menon if (mandatory)
388ddf56bc7SNishanth Menon debug("%s: data corruption?? mandatory function is missing!\n",
389ddf56bc7SNishanth Menon dev->name);
390ddf56bc7SNishanth Menon
391ddf56bc7SNishanth Menon return -ENOSYS;
392ddf56bc7SNishanth Menon }
393ddf56bc7SNishanth Menon
rproc_start(int id)394ddf56bc7SNishanth Menon int rproc_start(int id)
395ddf56bc7SNishanth Menon {
396ddf56bc7SNishanth Menon return _rproc_ops_wrapper(id, RPROC_START);
397ddf56bc7SNishanth Menon };
398ddf56bc7SNishanth Menon
rproc_stop(int id)399ddf56bc7SNishanth Menon int rproc_stop(int id)
400ddf56bc7SNishanth Menon {
401ddf56bc7SNishanth Menon return _rproc_ops_wrapper(id, RPROC_STOP);
402ddf56bc7SNishanth Menon };
403ddf56bc7SNishanth Menon
rproc_reset(int id)404ddf56bc7SNishanth Menon int rproc_reset(int id)
405ddf56bc7SNishanth Menon {
406ddf56bc7SNishanth Menon return _rproc_ops_wrapper(id, RPROC_RESET);
407ddf56bc7SNishanth Menon };
408ddf56bc7SNishanth Menon
rproc_ping(int id)409ddf56bc7SNishanth Menon int rproc_ping(int id)
410ddf56bc7SNishanth Menon {
411ddf56bc7SNishanth Menon return _rproc_ops_wrapper(id, RPROC_PING);
412ddf56bc7SNishanth Menon };
413ddf56bc7SNishanth Menon
rproc_is_running(int id)414ddf56bc7SNishanth Menon int rproc_is_running(int id)
415ddf56bc7SNishanth Menon {
416ddf56bc7SNishanth Menon return _rproc_ops_wrapper(id, RPROC_RUNNING);
417ddf56bc7SNishanth Menon };
418