mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 01:22:07 +00:00
drm: merge drm_usb into udl
This merges all the remains of drm_usb into its only user, udl. We can then drop all the drm_usb stuff, including dev->usbdev. Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Reviewed-by: Thierry Reding <treding@nvidia.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
c5786fe5f1
commit
d4f68a7506
@ -291,10 +291,9 @@ char *date;</synopsis>
|
||||
<title>Device Registration</title>
|
||||
<para>
|
||||
A number of functions are provided to help with device registration.
|
||||
The functions deal with PCI, USB and platform devices, respectively.
|
||||
The functions deal with PCI and platform devices, respectively.
|
||||
</para>
|
||||
!Edrivers/gpu/drm/drm_pci.c
|
||||
!Edrivers/gpu/drm/drm_usb.c
|
||||
!Edrivers/gpu/drm/drm_platform.c
|
||||
<para>
|
||||
New drivers that no longer rely on the services provided by the
|
||||
|
@ -25,12 +25,6 @@ config DRM_MIPI_DSI
|
||||
bool
|
||||
depends on DRM
|
||||
|
||||
config DRM_USB
|
||||
tristate
|
||||
depends on DRM
|
||||
depends on USB_SUPPORT && USB_ARCH_HAS_HCD
|
||||
select USB
|
||||
|
||||
config DRM_KMS_HELPER
|
||||
tristate
|
||||
depends on DRM
|
||||
|
@ -22,8 +22,6 @@ drm-$(CONFIG_PCI) += ati_pcigart.o
|
||||
drm-$(CONFIG_DRM_PANEL) += drm_panel.o
|
||||
drm-$(CONFIG_OF) += drm_of.o
|
||||
|
||||
drm-usb-y := drm_usb.o
|
||||
|
||||
drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \
|
||||
drm_plane_helper.o drm_dp_mst_topology.o
|
||||
drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
|
||||
@ -36,7 +34,6 @@ CFLAGS_drm_trace_points.o := -I$(src)
|
||||
|
||||
obj-$(CONFIG_DRM) += drm.o
|
||||
obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
|
||||
obj-$(CONFIG_DRM_USB) += drm_usb.o
|
||||
obj-$(CONFIG_DRM_TTM) += ttm/
|
||||
obj-$(CONFIG_DRM_TDFX) += tdfx/
|
||||
obj-$(CONFIG_DRM_R128) += r128/
|
||||
|
@ -1,76 +0,0 @@
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_usb.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
int drm_get_usb_dev(struct usb_interface *interface,
|
||||
const struct usb_device_id *id,
|
||||
struct drm_driver *driver)
|
||||
{
|
||||
struct drm_device *dev;
|
||||
int ret;
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
dev = drm_dev_alloc(driver, &interface->dev);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->usbdev = interface_to_usbdev(interface);
|
||||
usb_set_intfdata(interface, dev);
|
||||
|
||||
ret = drm_dev_register(dev, 0);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
|
||||
DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
|
||||
driver->name, driver->major, driver->minor, driver->patchlevel,
|
||||
driver->date, dev->primary->index);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free:
|
||||
drm_dev_unref(dev);
|
||||
return ret;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(drm_get_usb_dev);
|
||||
|
||||
/**
|
||||
* drm_usb_init - Register matching USB devices with the DRM subsystem
|
||||
* @driver: DRM device driver
|
||||
* @udriver: USB device driver
|
||||
*
|
||||
* Registers one or more devices matched by a USB driver with the DRM
|
||||
* subsystem.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver)
|
||||
{
|
||||
int res;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
res = usb_register(udriver);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_usb_init);
|
||||
|
||||
/**
|
||||
* drm_usb_exit - Unregister matching USB devices from the DRM subsystem
|
||||
* @driver: DRM device driver
|
||||
* @udriver: USB device driver
|
||||
*
|
||||
* Unregisters one or more devices matched by a USB driver from the DRM
|
||||
* subsystem.
|
||||
*/
|
||||
void drm_usb_exit(struct drm_driver *driver,
|
||||
struct usb_driver *udriver)
|
||||
{
|
||||
usb_deregister(udriver);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_usb_exit);
|
||||
|
||||
MODULE_AUTHOR("David Airlie");
|
||||
MODULE_DESCRIPTION("USB DRM support");
|
||||
MODULE_LICENSE("GPL and additional rights");
|
@ -1,8 +1,9 @@
|
||||
config DRM_UDL
|
||||
tristate "DisplayLink"
|
||||
depends on DRM
|
||||
depends on USB_SUPPORT
|
||||
depends on USB_ARCH_HAS_HCD
|
||||
select DRM_USB
|
||||
select USB
|
||||
select FB_SYS_FILLRECT
|
||||
select FB_SYS_COPYAREA
|
||||
select FB_SYS_IMAGEBLIT
|
||||
|
@ -34,8 +34,8 @@ static u8 *udl_get_edid(struct udl_device *udl)
|
||||
goto error;
|
||||
|
||||
for (i = 0; i < EDID_LENGTH; i++) {
|
||||
ret = usb_control_msg(udl->ddev->usbdev,
|
||||
usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02),
|
||||
ret = usb_control_msg(udl->udev,
|
||||
usb_rcvctrlpipe(udl->udev, 0), (0x02),
|
||||
(0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
|
||||
HZ);
|
||||
if (ret < 1) {
|
||||
|
@ -7,55 +7,15 @@
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <drm/drm_usb.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include "udl_drv.h"
|
||||
|
||||
static struct drm_driver driver;
|
||||
|
||||
/*
|
||||
* There are many DisplayLink-based graphics products, all with unique PIDs.
|
||||
* So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
|
||||
* We also require a match on SubClass (0x00) and Protocol (0x00),
|
||||
* which is compatible with all known USB 2.0 era graphics chips and firmware,
|
||||
* but allows DisplayLink to increment those for any future incompatible chips
|
||||
*/
|
||||
static struct usb_device_id id_table[] = {
|
||||
{.idVendor = 0x17e9, .bInterfaceClass = 0xff,
|
||||
.bInterfaceSubClass = 0x00,
|
||||
.bInterfaceProtocol = 0x00,
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR |
|
||||
USB_DEVICE_ID_MATCH_INT_CLASS |
|
||||
USB_DEVICE_ID_MATCH_INT_SUBCLASS |
|
||||
USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int udl_driver_set_busid(struct drm_device *d, struct drm_master *m)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int udl_usb_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
return drm_get_usb_dev(interface, id, &driver);
|
||||
}
|
||||
|
||||
static void udl_usb_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
struct drm_device *dev = usb_get_intfdata(interface);
|
||||
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
drm_connector_unplug_all(dev);
|
||||
udl_fbdev_unplug(dev);
|
||||
udl_drop_usb(dev);
|
||||
drm_unplug_dev(dev);
|
||||
}
|
||||
|
||||
static const struct vm_operations_struct udl_gem_vm_ops = {
|
||||
.fault = udl_gem_fault,
|
||||
.open = drm_gem_vm_open,
|
||||
@ -102,6 +62,61 @@ static struct drm_driver driver = {
|
||||
.patchlevel = DRIVER_PATCHLEVEL,
|
||||
};
|
||||
|
||||
static int udl_usb_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(interface);
|
||||
struct drm_device *dev;
|
||||
int r;
|
||||
|
||||
dev = drm_dev_alloc(&driver, &interface->dev);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
r = drm_dev_register(dev, (unsigned long)udev);
|
||||
if (r)
|
||||
goto err_free;
|
||||
|
||||
usb_set_intfdata(interface, dev);
|
||||
DRM_INFO("Initialized udl on minor %d\n", dev->primary->index);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free:
|
||||
drm_dev_unref(dev);
|
||||
return r;
|
||||
}
|
||||
|
||||
static void udl_usb_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
struct drm_device *dev = usb_get_intfdata(interface);
|
||||
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
drm_connector_unplug_all(dev);
|
||||
udl_fbdev_unplug(dev);
|
||||
udl_drop_usb(dev);
|
||||
drm_unplug_dev(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* There are many DisplayLink-based graphics products, all with unique PIDs.
|
||||
* So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
|
||||
* We also require a match on SubClass (0x00) and Protocol (0x00),
|
||||
* which is compatible with all known USB 2.0 era graphics chips and firmware,
|
||||
* but allows DisplayLink to increment those for any future incompatible chips
|
||||
*/
|
||||
static struct usb_device_id id_table[] = {
|
||||
{.idVendor = 0x17e9, .bInterfaceClass = 0xff,
|
||||
.bInterfaceSubClass = 0x00,
|
||||
.bInterfaceProtocol = 0x00,
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR |
|
||||
USB_DEVICE_ID_MATCH_INT_CLASS |
|
||||
USB_DEVICE_ID_MATCH_INT_SUBCLASS |
|
||||
USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
static struct usb_driver udl_driver = {
|
||||
.name = "udl",
|
||||
.probe = udl_usb_probe,
|
||||
@ -111,13 +126,14 @@ static struct usb_driver udl_driver = {
|
||||
|
||||
static int __init udl_init(void)
|
||||
{
|
||||
return drm_usb_init(&driver, &udl_driver);
|
||||
return usb_register(&udl_driver);
|
||||
}
|
||||
|
||||
static void __exit udl_exit(void)
|
||||
{
|
||||
drm_usb_exit(&driver, &udl_driver);
|
||||
usb_deregister(&udl_driver);
|
||||
}
|
||||
|
||||
module_init(udl_init);
|
||||
module_exit(udl_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -47,6 +47,7 @@ struct udl_fbdev;
|
||||
struct udl_device {
|
||||
struct device *dev;
|
||||
struct drm_device *ddev;
|
||||
struct usb_device *udev;
|
||||
|
||||
int sku_pixel_limit;
|
||||
|
||||
|
@ -202,7 +202,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
|
||||
}
|
||||
unode->urb = urb;
|
||||
|
||||
buf = usb_alloc_coherent(udl->ddev->usbdev, MAX_TRANSFER, GFP_KERNEL,
|
||||
buf = usb_alloc_coherent(udl->udev, MAX_TRANSFER, GFP_KERNEL,
|
||||
&urb->transfer_dma);
|
||||
if (!buf) {
|
||||
kfree(unode);
|
||||
@ -211,7 +211,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
|
||||
}
|
||||
|
||||
/* urb->transfer_buffer_length set to actual before submit */
|
||||
usb_fill_bulk_urb(urb, udl->ddev->usbdev, usb_sndbulkpipe(udl->ddev->usbdev, 1),
|
||||
usb_fill_bulk_urb(urb, udl->udev, usb_sndbulkpipe(udl->udev, 1),
|
||||
buf, size, udl_urb_completion, unode);
|
||||
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
@ -282,6 +282,7 @@ int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len)
|
||||
|
||||
int udl_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
{
|
||||
struct usb_device *udev = (void*)flags;
|
||||
struct udl_device *udl;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
@ -290,10 +291,11 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
if (!udl)
|
||||
return -ENOMEM;
|
||||
|
||||
udl->udev = udev;
|
||||
udl->ddev = dev;
|
||||
dev->dev_private = udl;
|
||||
|
||||
if (!udl_parse_vendor_descriptor(dev, dev->usbdev)) {
|
||||
if (!udl_parse_vendor_descriptor(dev, udl->udev)) {
|
||||
ret = -ENODEV;
|
||||
DRM_ERROR("firmware not recognized. Assume incompatible device\n");
|
||||
goto err;
|
||||
|
@ -1020,7 +1020,6 @@ struct drm_device {
|
||||
#endif
|
||||
|
||||
struct platform_device *platformdev; /**< Platform device struture */
|
||||
struct usb_device *usbdev;
|
||||
|
||||
struct drm_sg_mem *sg; /**< Scatter gather memory */
|
||||
unsigned int num_crtcs; /**< Number of CRTCs on this device */
|
||||
|
@ -1,15 +0,0 @@
|
||||
#ifndef DRM_USB_H
|
||||
#define DRM_USB_H
|
||||
|
||||
#include <drmP.h>
|
||||
|
||||
#include <linux/usb.h>
|
||||
|
||||
extern int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver);
|
||||
extern void drm_usb_exit(struct drm_driver *driver, struct usb_driver *udriver);
|
||||
|
||||
int drm_get_usb_dev(struct usb_interface *interface,
|
||||
const struct usb_device_id *id,
|
||||
struct drm_driver *driver);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user