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