gm12u320 48 drivers/gpu/drm/tiny/gm12u320.c DRM_DEV_ERROR(&gm12u320->udev->dev, fmt, ##__VA_ARGS__) gm12u320 158 drivers/gpu/drm/tiny/gm12u320.c static int gm12u320_usb_alloc(struct gm12u320_device *gm12u320) gm12u320 163 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf = kmalloc(CMD_SIZE, GFP_KERNEL); gm12u320 164 drivers/gpu/drm/tiny/gm12u320.c if (!gm12u320->cmd_buf) gm12u320 176 drivers/gpu/drm/tiny/gm12u320.c gm12u320->data_buf[i] = kzalloc(block_size, GFP_KERNEL); gm12u320 177 drivers/gpu/drm/tiny/gm12u320.c if (!gm12u320->data_buf[i]) gm12u320 180 drivers/gpu/drm/tiny/gm12u320.c memcpy(gm12u320->data_buf[i], hdr, DATA_BLOCK_HEADER_SIZE); gm12u320 181 drivers/gpu/drm/tiny/gm12u320.c memcpy(gm12u320->data_buf[i] + gm12u320 186 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.workq = create_singlethread_workqueue(DRIVER_NAME); gm12u320 187 drivers/gpu/drm/tiny/gm12u320.c if (!gm12u320->fb_update.workq) gm12u320 193 drivers/gpu/drm/tiny/gm12u320.c static void gm12u320_usb_free(struct gm12u320_device *gm12u320) gm12u320 197 drivers/gpu/drm/tiny/gm12u320.c if (gm12u320->fb_update.workq) gm12u320 198 drivers/gpu/drm/tiny/gm12u320.c destroy_workqueue(gm12u320->fb_update.workq); gm12u320 201 drivers/gpu/drm/tiny/gm12u320.c kfree(gm12u320->data_buf[i]); gm12u320 203 drivers/gpu/drm/tiny/gm12u320.c kfree(gm12u320->cmd_buf); gm12u320 206 drivers/gpu/drm/tiny/gm12u320.c static int gm12u320_misc_request(struct gm12u320_device *gm12u320, gm12u320 212 drivers/gpu/drm/tiny/gm12u320.c memcpy(gm12u320->cmd_buf, &cmd_misc, CMD_SIZE); gm12u320 213 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[20] = req_a; gm12u320 214 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[21] = req_b; gm12u320 215 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[22] = arg_a; gm12u320 216 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[23] = arg_b; gm12u320 217 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[24] = arg_c; gm12u320 218 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[25] = arg_d; gm12u320 221 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 222 drivers/gpu/drm/tiny/gm12u320.c usb_sndbulkpipe(gm12u320->udev, MISC_SND_EPT), gm12u320 223 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, CMD_SIZE, &len, CMD_TIMEOUT); gm12u320 230 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 231 drivers/gpu/drm/tiny/gm12u320.c usb_rcvbulkpipe(gm12u320->udev, MISC_RCV_EPT), gm12u320 232 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, MISC_VALUE_SIZE, &len, gm12u320 241 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 242 drivers/gpu/drm/tiny/gm12u320.c usb_rcvbulkpipe(gm12u320->udev, MISC_RCV_EPT), gm12u320 243 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, READ_STATUS_SIZE, &len, gm12u320 263 drivers/gpu/drm/tiny/gm12u320.c static void gm12u320_copy_fb_to_blocks(struct gm12u320_device *gm12u320) gm12u320 270 drivers/gpu/drm/tiny/gm12u320.c mutex_lock(&gm12u320->fb_update.lock); gm12u320 272 drivers/gpu/drm/tiny/gm12u320.c if (!gm12u320->fb_update.fb) gm12u320 275 drivers/gpu/drm/tiny/gm12u320.c fb = gm12u320->fb_update.fb; gm12u320 276 drivers/gpu/drm/tiny/gm12u320.c x1 = gm12u320->fb_update.rect.x1; gm12u320 277 drivers/gpu/drm/tiny/gm12u320.c x2 = gm12u320->fb_update.rect.x2; gm12u320 278 drivers/gpu/drm/tiny/gm12u320.c y1 = gm12u320->fb_update.rect.y1; gm12u320 279 drivers/gpu/drm/tiny/gm12u320.c y2 = gm12u320->fb_update.rect.y2; gm12u320 317 drivers/gpu/drm/tiny/gm12u320.c gm12u320->data_buf[block] + dst_offset, gm12u320 324 drivers/gpu/drm/tiny/gm12u320.c gm12u320->data_buf[block] + dst_offset, gm12u320 340 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.fb = NULL; gm12u320 342 drivers/gpu/drm/tiny/gm12u320.c mutex_unlock(&gm12u320->fb_update.lock); gm12u320 347 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = gm12u320 354 drivers/gpu/drm/tiny/gm12u320.c while (gm12u320->fb_update.run) { gm12u320 355 drivers/gpu/drm/tiny/gm12u320.c gm12u320_copy_fb_to_blocks(gm12u320); gm12u320 364 drivers/gpu/drm/tiny/gm12u320.c memcpy(gm12u320->cmd_buf, cmd_data, CMD_SIZE); gm12u320 365 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[8] = block_size & 0xff; gm12u320 366 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[9] = block_size >> 8; gm12u320 367 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[20] = 0xfc - block * 4; gm12u320 368 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf[21] = block | (frame << 7); gm12u320 370 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 371 drivers/gpu/drm/tiny/gm12u320.c usb_sndbulkpipe(gm12u320->udev, DATA_SND_EPT), gm12u320 372 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, CMD_SIZE, &len, gm12u320 378 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 379 drivers/gpu/drm/tiny/gm12u320.c usb_sndbulkpipe(gm12u320->udev, DATA_SND_EPT), gm12u320 380 drivers/gpu/drm/tiny/gm12u320.c gm12u320->data_buf[block], block_size, gm12u320 386 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 387 drivers/gpu/drm/tiny/gm12u320.c usb_rcvbulkpipe(gm12u320->udev, DATA_RCV_EPT), gm12u320 388 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, READ_STATUS_SIZE, &len, gm12u320 395 drivers/gpu/drm/tiny/gm12u320.c memcpy(gm12u320->cmd_buf, cmd_draw, CMD_SIZE); gm12u320 396 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 397 drivers/gpu/drm/tiny/gm12u320.c usb_sndbulkpipe(gm12u320->udev, DATA_SND_EPT), gm12u320 398 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, CMD_SIZE, &len, CMD_TIMEOUT); gm12u320 403 drivers/gpu/drm/tiny/gm12u320.c ret = usb_bulk_msg(gm12u320->udev, gm12u320 404 drivers/gpu/drm/tiny/gm12u320.c usb_rcvbulkpipe(gm12u320->udev, DATA_RCV_EPT), gm12u320 405 drivers/gpu/drm/tiny/gm12u320.c gm12u320->cmd_buf, READ_STATUS_SIZE, &len, gm12u320 417 drivers/gpu/drm/tiny/gm12u320.c wait_event_timeout(gm12u320->fb_update.waitq, gm12u320 418 drivers/gpu/drm/tiny/gm12u320.c !gm12u320->fb_update.run || gm12u320 419 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.fb != NULL, gm12u320 432 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = fb->dev->dev_private; gm12u320 436 drivers/gpu/drm/tiny/gm12u320.c mutex_lock(&gm12u320->fb_update.lock); gm12u320 438 drivers/gpu/drm/tiny/gm12u320.c if (gm12u320->fb_update.fb != fb) { gm12u320 439 drivers/gpu/drm/tiny/gm12u320.c old_fb = gm12u320->fb_update.fb; gm12u320 441 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.fb = fb; gm12u320 442 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.rect = *dirty; gm12u320 445 drivers/gpu/drm/tiny/gm12u320.c struct drm_rect *rect = &gm12u320->fb_update.rect; gm12u320 453 drivers/gpu/drm/tiny/gm12u320.c mutex_unlock(&gm12u320->fb_update.lock); gm12u320 456 drivers/gpu/drm/tiny/gm12u320.c wake_up(&gm12u320->fb_update.waitq); gm12u320 462 drivers/gpu/drm/tiny/gm12u320.c static void gm12u320_start_fb_update(struct gm12u320_device *gm12u320) gm12u320 464 drivers/gpu/drm/tiny/gm12u320.c mutex_lock(&gm12u320->fb_update.lock); gm12u320 465 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.run = true; gm12u320 466 drivers/gpu/drm/tiny/gm12u320.c mutex_unlock(&gm12u320->fb_update.lock); gm12u320 468 drivers/gpu/drm/tiny/gm12u320.c queue_work(gm12u320->fb_update.workq, &gm12u320->fb_update.work); gm12u320 471 drivers/gpu/drm/tiny/gm12u320.c static void gm12u320_stop_fb_update(struct gm12u320_device *gm12u320) gm12u320 473 drivers/gpu/drm/tiny/gm12u320.c mutex_lock(&gm12u320->fb_update.lock); gm12u320 474 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.run = false; gm12u320 475 drivers/gpu/drm/tiny/gm12u320.c mutex_unlock(&gm12u320->fb_update.lock); gm12u320 477 drivers/gpu/drm/tiny/gm12u320.c wake_up(&gm12u320->fb_update.waitq); gm12u320 478 drivers/gpu/drm/tiny/gm12u320.c cancel_work_sync(&gm12u320->fb_update.work); gm12u320 480 drivers/gpu/drm/tiny/gm12u320.c mutex_lock(&gm12u320->fb_update.lock); gm12u320 481 drivers/gpu/drm/tiny/gm12u320.c if (gm12u320->fb_update.fb) { gm12u320 482 drivers/gpu/drm/tiny/gm12u320.c drm_framebuffer_put(gm12u320->fb_update.fb); gm12u320 483 drivers/gpu/drm/tiny/gm12u320.c gm12u320->fb_update.fb = NULL; gm12u320 485 drivers/gpu/drm/tiny/gm12u320.c mutex_unlock(&gm12u320->fb_update.lock); gm12u320 488 drivers/gpu/drm/tiny/gm12u320.c static int gm12u320_set_ecomode(struct gm12u320_device *gm12u320) gm12u320 490 drivers/gpu/drm/tiny/gm12u320.c return gm12u320_misc_request(gm12u320, MISC_REQ_GET_SET_ECO_A, gm12u320 579 drivers/gpu/drm/tiny/gm12u320.c static int gm12u320_conn_init(struct gm12u320_device *gm12u320) gm12u320 581 drivers/gpu/drm/tiny/gm12u320.c drm_connector_helper_add(&gm12u320->conn, &gm12u320_conn_helper_funcs); gm12u320 582 drivers/gpu/drm/tiny/gm12u320.c return drm_connector_init(&gm12u320->dev, &gm12u320->conn, gm12u320 593 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = pipe->crtc.dev->dev_private; gm12u320 597 drivers/gpu/drm/tiny/gm12u320.c gm12u320_start_fb_update(gm12u320); gm12u320 598 drivers/gpu/drm/tiny/gm12u320.c gm12u320->pipe_enabled = true; gm12u320 603 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = pipe->crtc.dev->dev_private; gm12u320 605 drivers/gpu/drm/tiny/gm12u320.c gm12u320_stop_fb_update(gm12u320); gm12u320 606 drivers/gpu/drm/tiny/gm12u320.c gm12u320->pipe_enabled = false; gm12u320 644 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = dev->dev_private; gm12u320 646 drivers/gpu/drm/tiny/gm12u320.c gm12u320_usb_free(gm12u320); gm12u320 649 drivers/gpu/drm/tiny/gm12u320.c kfree(gm12u320); gm12u320 677 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320; gm12u320 688 drivers/gpu/drm/tiny/gm12u320.c gm12u320 = kzalloc(sizeof(*gm12u320), GFP_KERNEL); gm12u320 689 drivers/gpu/drm/tiny/gm12u320.c if (gm12u320 == NULL) gm12u320 692 drivers/gpu/drm/tiny/gm12u320.c gm12u320->udev = interface_to_usbdev(interface); gm12u320 693 drivers/gpu/drm/tiny/gm12u320.c INIT_WORK(&gm12u320->fb_update.work, gm12u320_fb_update_work); gm12u320 694 drivers/gpu/drm/tiny/gm12u320.c mutex_init(&gm12u320->fb_update.lock); gm12u320 695 drivers/gpu/drm/tiny/gm12u320.c init_waitqueue_head(&gm12u320->fb_update.waitq); gm12u320 697 drivers/gpu/drm/tiny/gm12u320.c dev = &gm12u320->dev; gm12u320 700 drivers/gpu/drm/tiny/gm12u320.c kfree(gm12u320); gm12u320 703 drivers/gpu/drm/tiny/gm12u320.c dev->dev_private = gm12u320; gm12u320 712 drivers/gpu/drm/tiny/gm12u320.c ret = gm12u320_usb_alloc(gm12u320); gm12u320 716 drivers/gpu/drm/tiny/gm12u320.c ret = gm12u320_set_ecomode(gm12u320); gm12u320 720 drivers/gpu/drm/tiny/gm12u320.c ret = gm12u320_conn_init(gm12u320); gm12u320 724 drivers/gpu/drm/tiny/gm12u320.c ret = drm_simple_display_pipe_init(&gm12u320->dev, gm12u320 725 drivers/gpu/drm/tiny/gm12u320.c &gm12u320->pipe, gm12u320 730 drivers/gpu/drm/tiny/gm12u320.c &gm12u320->conn); gm12u320 753 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = dev->dev_private; gm12u320 755 drivers/gpu/drm/tiny/gm12u320.c gm12u320_stop_fb_update(gm12u320); gm12u320 764 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = dev->dev_private; gm12u320 766 drivers/gpu/drm/tiny/gm12u320.c if (gm12u320->pipe_enabled) gm12u320 767 drivers/gpu/drm/tiny/gm12u320.c gm12u320_stop_fb_update(gm12u320); gm12u320 775 drivers/gpu/drm/tiny/gm12u320.c struct gm12u320_device *gm12u320 = dev->dev_private; gm12u320 777 drivers/gpu/drm/tiny/gm12u320.c gm12u320_set_ecomode(gm12u320); gm12u320 778 drivers/gpu/drm/tiny/gm12u320.c if (gm12u320->pipe_enabled) gm12u320 779 drivers/gpu/drm/tiny/gm12u320.c gm12u320_start_fb_update(gm12u320);