gm12u320.c (cdd38c5f1ce4398ec58fec95904b75824daab7b5) | gm12u320.c (659ab7a49cbebe0deffcbe1f9560e82006b21817) |
---|---|
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright 2019 Hans de Goede <hdegoede@redhat.com> 4 */ 5 6#include <linux/dma-buf.h> 7#include <linux/module.h> 8#include <linux/usb.h> --- 69 unchanged lines hidden (view full) --- 78#define MISC_REQ_UNKNOWN1_A 0xff 79#define MISC_REQ_UNKNOWN1_B 0x38 80/* Windows driver does this on init, with arg a, b = 0, c = 0xa0, d = 4 */ 81#define MISC_REQ_UNKNOWN2_A 0xa5 82#define MISC_REQ_UNKNOWN2_B 0x00 83 84struct gm12u320_device { 85 struct drm_device dev; | 1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright 2019 Hans de Goede <hdegoede@redhat.com> 4 */ 5 6#include <linux/dma-buf.h> 7#include <linux/module.h> 8#include <linux/usb.h> --- 69 unchanged lines hidden (view full) --- 78#define MISC_REQ_UNKNOWN1_A 0xff 79#define MISC_REQ_UNKNOWN1_B 0x38 80/* Windows driver does this on init, with arg a, b = 0, c = 0xa0, d = 4 */ 81#define MISC_REQ_UNKNOWN2_A 0xa5 82#define MISC_REQ_UNKNOWN2_B 0x00 83 84struct gm12u320_device { 85 struct drm_device dev; |
86 struct device *dmadev; |
|
86 struct drm_simple_display_pipe pipe; 87 struct drm_connector conn; 88 unsigned char *cmd_buf; 89 unsigned char *data_buf[GM12U320_BLOCK_COUNT]; 90 struct { 91 struct delayed_work work; 92 struct mutex lock; 93 struct drm_framebuffer *fb; --- 502 unchanged lines hidden (view full) --- 596 DRM_FORMAT_XRGB8888, 597}; 598 599static const uint64_t gm12u320_pipe_modifiers[] = { 600 DRM_FORMAT_MOD_LINEAR, 601 DRM_FORMAT_MOD_INVALID 602}; 603 | 87 struct drm_simple_display_pipe pipe; 88 struct drm_connector conn; 89 unsigned char *cmd_buf; 90 unsigned char *data_buf[GM12U320_BLOCK_COUNT]; 91 struct { 92 struct delayed_work work; 93 struct mutex lock; 94 struct drm_framebuffer *fb; --- 502 unchanged lines hidden (view full) --- 597 DRM_FORMAT_XRGB8888, 598}; 599 600static const uint64_t gm12u320_pipe_modifiers[] = { 601 DRM_FORMAT_MOD_LINEAR, 602 DRM_FORMAT_MOD_INVALID 603}; 604 |
605/* 606 * FIXME: Dma-buf sharing requires DMA support by the importing device. 607 * This function is a workaround to make USB devices work as well. 608 * See todo.rst for how to fix the issue in the dma-buf framework. 609 */ 610static struct drm_gem_object *gm12u320_gem_prime_import(struct drm_device *dev, 611 struct dma_buf *dma_buf) 612{ 613 struct gm12u320_device *gm12u320 = to_gm12u320(dev); 614 615 if (!gm12u320->dmadev) 616 return ERR_PTR(-ENODEV); 617 618 return drm_gem_prime_import_dev(dev, dma_buf, gm12u320->dmadev); 619} 620 |
|
604DEFINE_DRM_GEM_FOPS(gm12u320_fops); 605 606static const struct drm_driver gm12u320_drm_driver = { 607 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, 608 609 .name = DRIVER_NAME, 610 .desc = DRIVER_DESC, 611 .date = DRIVER_DATE, 612 .major = DRIVER_MAJOR, 613 .minor = DRIVER_MINOR, 614 615 .fops = &gm12u320_fops, 616 DRM_GEM_SHMEM_DRIVER_OPS, | 621DEFINE_DRM_GEM_FOPS(gm12u320_fops); 622 623static const struct drm_driver gm12u320_drm_driver = { 624 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, 625 626 .name = DRIVER_NAME, 627 .desc = DRIVER_DESC, 628 .date = DRIVER_DATE, 629 .major = DRIVER_MAJOR, 630 .minor = DRIVER_MINOR, 631 632 .fops = &gm12u320_fops, 633 DRM_GEM_SHMEM_DRIVER_OPS, |
634 .gem_prime_import = gm12u320_gem_prime_import, |
|
617}; 618 619static const struct drm_mode_config_funcs gm12u320_mode_config_funcs = { 620 .fb_create = drm_gem_fb_create_with_dirty, 621 .atomic_check = drm_atomic_helper_check, 622 .atomic_commit = drm_atomic_helper_commit, 623}; 624 --- 10 unchanged lines hidden (view full) --- 635 */ 636 if (interface->cur_altsetting->desc.bInterfaceNumber != 0) 637 return -ENODEV; 638 639 gm12u320 = devm_drm_dev_alloc(&interface->dev, &gm12u320_drm_driver, 640 struct gm12u320_device, dev); 641 if (IS_ERR(gm12u320)) 642 return PTR_ERR(gm12u320); | 635}; 636 637static const struct drm_mode_config_funcs gm12u320_mode_config_funcs = { 638 .fb_create = drm_gem_fb_create_with_dirty, 639 .atomic_check = drm_atomic_helper_check, 640 .atomic_commit = drm_atomic_helper_commit, 641}; 642 --- 10 unchanged lines hidden (view full) --- 653 */ 654 if (interface->cur_altsetting->desc.bInterfaceNumber != 0) 655 return -ENODEV; 656 657 gm12u320 = devm_drm_dev_alloc(&interface->dev, &gm12u320_drm_driver, 658 struct gm12u320_device, dev); 659 if (IS_ERR(gm12u320)) 660 return PTR_ERR(gm12u320); |
661 dev = &gm12u320->dev; |
|
643 | 662 |
663 gm12u320->dmadev = usb_intf_get_dma_device(to_usb_interface(dev->dev)); 664 if (!gm12u320->dmadev) 665 drm_warn(dev, "buffer sharing not supported"); /* not an error */ 666 |
|
644 INIT_DELAYED_WORK(&gm12u320->fb_update.work, gm12u320_fb_update_work); 645 mutex_init(&gm12u320->fb_update.lock); 646 | 667 INIT_DELAYED_WORK(&gm12u320->fb_update.work, gm12u320_fb_update_work); 668 mutex_init(&gm12u320->fb_update.lock); 669 |
647 dev = &gm12u320->dev; 648 | |
649 ret = drmm_mode_config_init(dev); 650 if (ret) | 670 ret = drmm_mode_config_init(dev); 671 if (ret) |
651 return ret; | 672 goto err_put_device; |
652 653 dev->mode_config.min_width = GM12U320_USER_WIDTH; 654 dev->mode_config.max_width = GM12U320_USER_WIDTH; 655 dev->mode_config.min_height = GM12U320_HEIGHT; 656 dev->mode_config.max_height = GM12U320_HEIGHT; 657 dev->mode_config.funcs = &gm12u320_mode_config_funcs; 658 659 ret = gm12u320_usb_alloc(gm12u320); 660 if (ret) | 673 674 dev->mode_config.min_width = GM12U320_USER_WIDTH; 675 dev->mode_config.max_width = GM12U320_USER_WIDTH; 676 dev->mode_config.min_height = GM12U320_HEIGHT; 677 dev->mode_config.max_height = GM12U320_HEIGHT; 678 dev->mode_config.funcs = &gm12u320_mode_config_funcs; 679 680 ret = gm12u320_usb_alloc(gm12u320); 681 if (ret) |
661 return ret; | 682 goto err_put_device; |
662 663 ret = gm12u320_set_ecomode(gm12u320); 664 if (ret) | 683 684 ret = gm12u320_set_ecomode(gm12u320); 685 if (ret) |
665 return ret; | 686 goto err_put_device; |
666 667 ret = gm12u320_conn_init(gm12u320); 668 if (ret) | 687 688 ret = gm12u320_conn_init(gm12u320); 689 if (ret) |
669 return ret; | 690 goto err_put_device; |
670 671 ret = drm_simple_display_pipe_init(&gm12u320->dev, 672 &gm12u320->pipe, 673 &gm12u320_pipe_funcs, 674 gm12u320_pipe_formats, 675 ARRAY_SIZE(gm12u320_pipe_formats), 676 gm12u320_pipe_modifiers, 677 &gm12u320->conn); 678 if (ret) | 691 692 ret = drm_simple_display_pipe_init(&gm12u320->dev, 693 &gm12u320->pipe, 694 &gm12u320_pipe_funcs, 695 gm12u320_pipe_formats, 696 ARRAY_SIZE(gm12u320_pipe_formats), 697 gm12u320_pipe_modifiers, 698 &gm12u320->conn); 699 if (ret) |
679 return ret; | 700 goto err_put_device; |
680 681 drm_mode_config_reset(dev); 682 683 usb_set_intfdata(interface, dev); 684 ret = drm_dev_register(dev, 0); 685 if (ret) | 701 702 drm_mode_config_reset(dev); 703 704 usb_set_intfdata(interface, dev); 705 ret = drm_dev_register(dev, 0); 706 if (ret) |
686 return ret; | 707 goto err_put_device; |
687 688 drm_fbdev_generic_setup(dev, 0); 689 690 return 0; | 708 709 drm_fbdev_generic_setup(dev, 0); 710 711 return 0; |
712 713err_put_device: 714 put_device(gm12u320->dmadev); 715 return ret; |
|
691} 692 693static void gm12u320_usb_disconnect(struct usb_interface *interface) 694{ 695 struct drm_device *dev = usb_get_intfdata(interface); | 716} 717 718static void gm12u320_usb_disconnect(struct usb_interface *interface) 719{ 720 struct drm_device *dev = usb_get_intfdata(interface); |
721 struct gm12u320_device *gm12u320 = to_gm12u320(dev); |
|
696 | 722 |
723 put_device(gm12u320->dmadev); 724 gm12u320->dmadev = NULL; |
|
697 drm_dev_unplug(dev); 698 drm_atomic_helper_shutdown(dev); 699} 700 701static __maybe_unused int gm12u320_suspend(struct usb_interface *interface, 702 pm_message_t message) 703{ 704 struct drm_device *dev = usb_get_intfdata(interface); --- 35 unchanged lines hidden --- | 725 drm_dev_unplug(dev); 726 drm_atomic_helper_shutdown(dev); 727} 728 729static __maybe_unused int gm12u320_suspend(struct usb_interface *interface, 730 pm_message_t message) 731{ 732 struct drm_device *dev = usb_get_intfdata(interface); --- 35 unchanged lines hidden --- |