Lines Matching refs:mdev

138 	struct maple_device *mdev;  in maple_release_device()  local
141 mdev = to_maple_dev(dev); in maple_release_device()
142 mq = mdev->mq; in maple_release_device()
145 kfree(mdev); in maple_release_device()
156 int maple_add_packet(struct maple_device *mdev, u32 function, u32 command, in maple_add_packet() argument
171 mdev->mq->command = command; in maple_add_packet()
172 mdev->mq->length = length; in maple_add_packet()
175 mdev->mq->sendbuf = sendbuf; in maple_add_packet()
178 list_add_tail(&mdev->mq->list, &maple_waitq); in maple_add_packet()
185 static struct mapleq *maple_allocq(struct maple_device *mdev) in maple_allocq() argument
194 mq->dev = mdev; in maple_allocq()
205 dev_err(&mdev->dev, "could not allocate memory for device (%d, %d)\n", in maple_allocq()
206 mdev->port, mdev->unit); in maple_allocq()
212 struct maple_device *mdev; in maple_alloc_dev() local
217 mdev = kzalloc(sizeof(*mdev), GFP_KERNEL); in maple_alloc_dev()
218 if (!mdev) in maple_alloc_dev()
221 mdev->port = port; in maple_alloc_dev()
222 mdev->unit = unit; in maple_alloc_dev()
224 mdev->mq = maple_allocq(mdev); in maple_alloc_dev()
226 if (!mdev->mq) { in maple_alloc_dev()
227 kfree(mdev); in maple_alloc_dev()
230 mdev->dev.bus = &maple_bus_type; in maple_alloc_dev()
231 mdev->dev.parent = &maple_bus; in maple_alloc_dev()
232 init_waitqueue_head(&mdev->maple_wait); in maple_alloc_dev()
233 return mdev; in maple_alloc_dev()
236 static void maple_free_dev(struct maple_device *mdev) in maple_free_dev() argument
238 kmem_cache_free(maple_queue_cache, mdev->mq->recvbuf); in maple_free_dev()
239 kfree(mdev->mq); in maple_free_dev()
240 kfree(mdev); in maple_free_dev()
315 struct maple_device *mdev; in maple_check_matching_driver() local
317 mdev = devptr; in maple_check_matching_driver()
319 if (mdev->devinfo.function & cpu_to_be32(maple_drv->function)) in maple_check_matching_driver()
324 static void maple_detach_driver(struct maple_device *mdev) in maple_detach_driver() argument
326 device_unregister(&mdev->dev); in maple_detach_driver()
330 static void maple_attach_driver(struct maple_device *mdev) in maple_attach_driver() argument
336 recvbuf = mdev->mq->recvbuf->buf; in maple_attach_driver()
339 memcpy(&mdev->devinfo.function, recvbuf + 4, 4); in maple_attach_driver()
340 memcpy(&mdev->devinfo.function_data[0], recvbuf + 8, 12); in maple_attach_driver()
341 memcpy(&mdev->devinfo.area_code, recvbuf + 20, 1); in maple_attach_driver()
342 memcpy(&mdev->devinfo.connector_direction, recvbuf + 21, 1); in maple_attach_driver()
343 memcpy(&mdev->devinfo.product_name[0], recvbuf + 22, 30); in maple_attach_driver()
344 memcpy(&mdev->devinfo.standby_power, recvbuf + 112, 2); in maple_attach_driver()
345 memcpy(&mdev->devinfo.max_power, recvbuf + 114, 2); in maple_attach_driver()
346 memcpy(mdev->product_name, mdev->devinfo.product_name, 30); in maple_attach_driver()
347 mdev->product_name[30] = '\0'; in maple_attach_driver()
348 memcpy(mdev->product_licence, mdev->devinfo.product_licence, 60); in maple_attach_driver()
349 mdev->product_licence[60] = '\0'; in maple_attach_driver()
351 for (p = mdev->product_name + 29; mdev->product_name <= p; p--) in maple_attach_driver()
356 for (p = mdev->product_licence + 59; mdev->product_licence <= p; p--) in maple_attach_driver()
362 function = be32_to_cpu(mdev->devinfo.function); in maple_attach_driver()
364 dev_info(&mdev->dev, "detected %s: function 0x%lX: at (%d, %d)\n", in maple_attach_driver()
365 mdev->product_name, function, mdev->port, mdev->unit); in maple_attach_driver()
370 mdev->driver = &maple_unsupported_device; in maple_attach_driver()
371 dev_set_name(&mdev->dev, "%d:0.port", mdev->port); in maple_attach_driver()
374 bus_for_each_drv(&maple_bus_type, NULL, mdev, in maple_attach_driver()
379 dev_info(&mdev->dev, "no driver found\n"); in maple_attach_driver()
380 mdev->driver = &maple_unsupported_device; in maple_attach_driver()
382 dev_set_name(&mdev->dev, "%d:0%d.%lX", mdev->port, in maple_attach_driver()
383 mdev->unit, function); in maple_attach_driver()
386 mdev->function = function; in maple_attach_driver()
387 mdev->dev.release = &maple_release_device; in maple_attach_driver()
389 atomic_set(&mdev->busy, 0); in maple_attach_driver()
390 error = device_register(&mdev->dev); in maple_attach_driver()
392 dev_warn(&mdev->dev, "could not register device at" in maple_attach_driver()
393 " (%d, %d), with error 0x%X\n", mdev->unit, in maple_attach_driver()
394 mdev->port, error); in maple_attach_driver()
395 maple_free_dev(mdev); in maple_attach_driver()
396 mdev = NULL; in maple_attach_driver()
409 struct maple_device *mdev; in check_maple_device() local
412 mdev = to_maple_dev(device); in check_maple_device()
413 if (mdev->port == ds->port && mdev->unit == ds->unit) in check_maple_device()
421 struct maple_device *mdev = to_maple_dev(device); in setup_maple_commands() local
422 if (mdev->interval > 0 && atomic_read(&mdev->busy) == 0 && in setup_maple_commands()
423 time_after(jiffies, mdev->when)) { in setup_maple_commands()
425 add = maple_add_packet(mdev, in setup_maple_commands()
426 be32_to_cpu(mdev->devinfo.function), in setup_maple_commands()
429 mdev->when = jiffies + mdev->interval; in setup_maple_commands()
435 if (atomic_read(&mdev->busy) == 0) { in setup_maple_commands()
436 atomic_set(&mdev->busy, 1); in setup_maple_commands()
437 maple_add_packet(mdev, 0, in setup_maple_commands()
448 struct maple_device *mdev; in maple_vblank_handler() local
472 mdev = baseunits[x]; in maple_vblank_handler()
473 if (!mdev) in maple_vblank_handler()
475 atomic_set(&mdev->busy, 1); in maple_vblank_handler()
476 locking = maple_add_packet(mdev, 0, in maple_vblank_handler()
491 static void maple_map_subunits(struct maple_device *mdev, int submask) in maple_map_subunits() argument
497 ds.port = mdev->port; in maple_map_subunits()
509 mdev_add = maple_alloc_dev(mdev->port, k + 1); in maple_map_subunits()
523 static void maple_clean_submap(struct maple_device *mdev) in maple_clean_submap() argument
527 killbit = (mdev->unit > 0 ? (1 << (mdev->unit - 1)) & 0x1f : 0x20); in maple_clean_submap()
530 subdevice_map[mdev->port] = subdevice_map[mdev->port] & killbit; in maple_clean_submap()
534 static void maple_response_none(struct maple_device *mdev) in maple_response_none() argument
536 maple_clean_submap(mdev); in maple_response_none()
538 if (likely(mdev->unit != 0)) { in maple_response_none()
548 if (mdev->can_unload) { in maple_response_none()
549 if (!mdev->can_unload(mdev)) { in maple_response_none()
550 atomic_set(&mdev->busy, 2); in maple_response_none()
551 wake_up(&mdev->maple_wait); in maple_response_none()
556 dev_info(&mdev->dev, "detaching device at (%d, %d)\n", in maple_response_none()
557 mdev->port, mdev->unit); in maple_response_none()
558 maple_detach_driver(mdev); in maple_response_none()
562 if (checked[mdev->port] == false) { in maple_response_none()
563 checked[mdev->port] = true; in maple_response_none()
564 empty[mdev->port] = true; in maple_response_none()
565 dev_info(&mdev->dev, "no devices" in maple_response_none()
566 " to port %d\n", mdev->port); in maple_response_none()
572 atomic_set(&mdev->busy, 0); in maple_response_none()
576 static void maple_response_devinfo(struct maple_device *mdev, in maple_response_devinfo() argument
581 if ((mdev->unit == 0) && (checked[mdev->port] == false)) { in maple_response_devinfo()
582 checked[mdev->port] = true; in maple_response_devinfo()
583 maple_attach_driver(mdev); in maple_response_devinfo()
585 if (mdev->unit != 0) in maple_response_devinfo()
586 maple_attach_driver(mdev); in maple_response_devinfo()
587 if (mdev->unit == 0) { in maple_response_devinfo()
588 empty[mdev->port] = false; in maple_response_devinfo()
589 maple_attach_driver(mdev); in maple_response_devinfo()
593 if (mdev->unit == 0) { in maple_response_devinfo()
595 if (submask ^ subdevice_map[mdev->port]) { in maple_response_devinfo()
596 maple_map_subunits(mdev, submask); in maple_response_devinfo()
597 subdevice_map[mdev->port] = submask; in maple_response_devinfo()
602 static void maple_response_fileerr(struct maple_device *mdev, void *recvbuf) in maple_response_fileerr() argument
604 if (mdev->fileerr_handler) { in maple_response_fileerr()
605 mdev->fileerr_handler(mdev, recvbuf); in maple_response_fileerr()
608 dev_warn(&mdev->dev, "device at (%d, %d) reports" in maple_response_fileerr()
609 "file error 0x%X\n", mdev->port, mdev->unit, in maple_response_fileerr()
616 struct maple_device *mdev; in maple_port_rescan() local
622 mdev = baseunits[i]; in maple_port_rescan()
623 maple_add_packet(mdev, 0, MAPLE_COMMAND_DEVINFO, in maple_port_rescan()
633 struct maple_device *mdev; in maple_dma_handler() local
642 mdev = mq->dev; in maple_dma_handler()
651 maple_response_none(mdev); in maple_dma_handler()
655 maple_response_devinfo(mdev, recvbuf); in maple_dma_handler()
656 atomic_set(&mdev->busy, 0); in maple_dma_handler()
660 if (mdev->callback) in maple_dma_handler()
661 mdev->callback(mq); in maple_dma_handler()
662 atomic_set(&mdev->busy, 0); in maple_dma_handler()
663 wake_up(&mdev->maple_wait); in maple_dma_handler()
667 maple_response_fileerr(mdev, recvbuf); in maple_dma_handler()
668 atomic_set(&mdev->busy, 0); in maple_dma_handler()
669 wake_up(&mdev->maple_wait); in maple_dma_handler()
675 dev_warn(&mdev->dev, "non-fatal error" in maple_dma_handler()
677 mdev->port, mdev->unit); in maple_dma_handler()
678 atomic_set(&mdev->busy, 0); in maple_dma_handler()
682 dev_notice(&mdev->dev, "extended" in maple_dma_handler()
684 " but call is not supported\n", mdev->port, in maple_dma_handler()
685 mdev->unit); in maple_dma_handler()
686 atomic_set(&mdev->busy, 0); in maple_dma_handler()
690 atomic_set(&mdev->busy, 0); in maple_dma_handler()
691 wake_up(&mdev->maple_wait); in maple_dma_handler()
790 struct maple_device *mdev[MAPLE_PORTS]; in maple_bus_init() local
842 mdev[i] = maple_alloc_dev(i, 0); in maple_bus_init()
843 if (!mdev[i]) { in maple_bus_init()
845 maple_free_dev(mdev[i]); in maple_bus_init()
849 baseunits[i] = mdev[i]; in maple_bus_init()
850 atomic_set(&mdev[i]->busy, 1); in maple_bus_init()
851 maple_add_packet(mdev[i], 0, MAPLE_COMMAND_DEVINFO, 0, NULL); in maple_bus_init()