Changes in uspace/drv/char/pl050/pl050.c [d51838f:dd8ab1c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/pl050/pl050.c
rd51838f rdd8ab1c 35 35 #include <stdio.h> 36 36 #include <errno.h> 37 #include <str_error.h> 37 38 #include <ddf/driver.h> 38 39 #include <ddf/interrupt.h> … … 54 55 static int pl050_fun_offline(ddf_fun_t *); 55 56 static void pl050_char_conn(ipc_callid_t, ipc_call_t *, void *); 56 static int pl050_read(chardev_srv_t *, void *, size_t );57 static int pl050_write(chardev_srv_t *, const void *, size_t );57 static int pl050_read(chardev_srv_t *, void *, size_t, size_t *); 58 static int pl050_write(chardev_srv_t *, const void *, size_t, size_t *); 58 59 59 60 static driver_ops_t driver_ops = { … … 137 138 } 138 139 139 static void pl050_interrupt(ipc_call id_t iid, ipc_call_t *call, ddf_dev_t *dev)140 static void pl050_interrupt(ipc_call_t *call, ddf_dev_t *dev) 140 141 { 141 142 pl050_t *pl050 = (pl050_t *)ddf_dev_data_get(dev); … … 212 213 pl050->regs = regs; 213 214 214 const int irq_cap = register_interrupt_handler(pl050->dev,215 res.irqs.irqs[0], pl050_interrupt, &pl050_irq_code);216 if (irq_cap < 0) {217 rc = irq_cap;218 ddf_msg(LVL_ERROR, "Failed registering interrupt handler. (% d)",219 rc);215 int irq_cap; 216 rc = register_interrupt_handler(pl050->dev, 217 res.irqs.irqs[0], pl050_interrupt, &pl050_irq_code, &irq_cap); 218 if (rc != EOK) { 219 ddf_msg(LVL_ERROR, "Failed registering interrupt handler. (%s)", 220 str_error_name(rc)); 220 221 goto error; 221 222 } … … 223 224 rc = hw_res_enable_interrupt(pl050->parent_sess, res.irqs.irqs[0]); 224 225 if (rc != EOK) { 225 ddf_msg(LVL_ERROR, "Failed enabling interrupt . (%d)", rc);226 ddf_msg(LVL_ERROR, "Failed enabling interrupt: %s", str_error(rc)); 226 227 goto error; 227 228 } … … 236 237 } 237 238 238 static int pl050_read(chardev_srv_t *srv, void *buffer, size_t size) 239 static int pl050_read(chardev_srv_t *srv, void *buffer, size_t size, 240 size_t *nread) 239 241 { 240 242 pl050_t *pl050 = (pl050_t *)srv->srvs->sarg; … … 246 248 left = size; 247 249 while (left > 0) { 248 while ( pl050->buf_rp == pl050->buf_wp)250 while (left == size && pl050->buf_rp == pl050->buf_wp) 249 251 fibril_condvar_wait(&pl050->buf_cv, &pl050->buf_lock); 252 if (pl050->buf_rp == pl050->buf_wp) 253 break; 250 254 *bp++ = pl050->buffer[pl050->buf_rp]; 251 255 --left; … … 255 259 fibril_mutex_unlock(&pl050->buf_lock); 256 260 257 return size; 258 } 259 260 static int pl050_write(chardev_srv_t *srv, const void *data, size_t size) 261 *nread = size - left; 262 return EOK; 263 } 264 265 static int pl050_write(chardev_srv_t *srv, const void *data, size_t size, 266 size_t *nwritten) 261 267 { 262 268 pl050_t *pl050 = (pl050_t *)srv->srvs->sarg; … … 276 282 ddf_msg(LVL_NOTE, "%s/pl050_write() success", pl050->name); 277 283 278 return size; 284 *nwritten = size; 285 return EOK; 279 286 } 280 287 … … 343 350 rc = ddf_fun_bind(fun_a); 344 351 if (rc != EOK) { 345 ddf_msg(LVL_ERROR, "Failed binding function 'a' . (%d)", rc);352 ddf_msg(LVL_ERROR, "Failed binding function 'a': %s", str_error(rc)); 346 353 ddf_fun_destroy(fun_a); 347 354 goto error;
Note:
See TracChangeset
for help on using the changeset viewer.