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);