Commit d4f68a75 authored by David Herrmann's avatar David Herrmann Committed by Dave Airlie

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: default avatarDavid Herrmann <dh.herrmann@gmail.com>
Reviewed-by: default avatarThierry Reding <treding@nvidia.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent c5786fe5
...@@ -291,10 +291,9 @@ char *date;</synopsis> ...@@ -291,10 +291,9 @@ char *date;</synopsis>
<title>Device Registration</title> <title>Device Registration</title>
<para> <para>
A number of functions are provided to help with device registration. 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> </para>
!Edrivers/gpu/drm/drm_pci.c !Edrivers/gpu/drm/drm_pci.c
!Edrivers/gpu/drm/drm_usb.c
!Edrivers/gpu/drm/drm_platform.c !Edrivers/gpu/drm/drm_platform.c
<para> <para>
New drivers that no longer rely on the services provided by the New drivers that no longer rely on the services provided by the
......
...@@ -25,12 +25,6 @@ config DRM_MIPI_DSI ...@@ -25,12 +25,6 @@ config DRM_MIPI_DSI
bool bool
depends on DRM depends on DRM
config DRM_USB
tristate
depends on DRM
depends on USB_SUPPORT && USB_ARCH_HAS_HCD
select USB
config DRM_KMS_HELPER config DRM_KMS_HELPER
tristate tristate
depends on DRM depends on DRM
......
...@@ -22,8 +22,6 @@ drm-$(CONFIG_PCI) += ati_pcigart.o ...@@ -22,8 +22,6 @@ drm-$(CONFIG_PCI) += ati_pcigart.o
drm-$(CONFIG_DRM_PANEL) += drm_panel.o drm-$(CONFIG_DRM_PANEL) += drm_panel.o
drm-$(CONFIG_OF) += drm_of.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_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_plane_helper.o drm_dp_mst_topology.o
drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
...@@ -36,7 +34,6 @@ CFLAGS_drm_trace_points.o := -I$(src) ...@@ -36,7 +34,6 @@ CFLAGS_drm_trace_points.o := -I$(src)
obj-$(CONFIG_DRM) += drm.o obj-$(CONFIG_DRM) += drm.o
obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.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_TTM) += ttm/
obj-$(CONFIG_DRM_TDFX) += tdfx/ obj-$(CONFIG_DRM_TDFX) += tdfx/
obj-$(CONFIG_DRM_R128) += r128/ obj-$(CONFIG_DRM_R128) += r128/
......
#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");
config DRM_UDL config DRM_UDL
tristate "DisplayLink" tristate "DisplayLink"
depends on DRM depends on DRM
depends on USB_SUPPORT
depends on USB_ARCH_HAS_HCD depends on USB_ARCH_HAS_HCD
select DRM_USB select USB
select FB_SYS_FILLRECT select FB_SYS_FILLRECT
select FB_SYS_COPYAREA select FB_SYS_COPYAREA
select FB_SYS_IMAGEBLIT select FB_SYS_IMAGEBLIT
......
...@@ -34,8 +34,8 @@ static u8 *udl_get_edid(struct udl_device *udl) ...@@ -34,8 +34,8 @@ static u8 *udl_get_edid(struct udl_device *udl)
goto error; goto error;
for (i = 0; i < EDID_LENGTH; i++) { for (i = 0; i < EDID_LENGTH; i++) {
ret = usb_control_msg(udl->ddev->usbdev, ret = usb_control_msg(udl->udev,
usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02), usb_rcvctrlpipe(udl->udev, 0), (0x02),
(0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2, (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
HZ); HZ);
if (ret < 1) { if (ret < 1) {
......
...@@ -7,55 +7,15 @@ ...@@ -7,55 +7,15 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <drm/drm_usb.h> #include <drm/drmP.h>
#include <drm/drm_crtc_helper.h> #include <drm/drm_crtc_helper.h>
#include "udl_drv.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) static int udl_driver_set_busid(struct drm_device *d, struct drm_master *m)
{ {
return 0; 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 = { static const struct vm_operations_struct udl_gem_vm_ops = {
.fault = udl_gem_fault, .fault = udl_gem_fault,
.open = drm_gem_vm_open, .open = drm_gem_vm_open,
...@@ -102,6 +62,61 @@ static struct drm_driver driver = { ...@@ -102,6 +62,61 @@ static struct drm_driver driver = {
.patchlevel = DRIVER_PATCHLEVEL, .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 = { static struct usb_driver udl_driver = {
.name = "udl", .name = "udl",
.probe = udl_usb_probe, .probe = udl_usb_probe,
...@@ -111,13 +126,14 @@ static struct usb_driver udl_driver = { ...@@ -111,13 +126,14 @@ static struct usb_driver udl_driver = {
static int __init udl_init(void) static int __init udl_init(void)
{ {
return drm_usb_init(&driver, &udl_driver); return usb_register(&udl_driver);
} }
static void __exit udl_exit(void) static void __exit udl_exit(void)
{ {
drm_usb_exit(&driver, &udl_driver); usb_deregister(&udl_driver);
} }
module_init(udl_init); module_init(udl_init);
module_exit(udl_exit); module_exit(udl_exit);
MODULE_LICENSE("GPL");
...@@ -47,6 +47,7 @@ struct udl_fbdev; ...@@ -47,6 +47,7 @@ struct udl_fbdev;
struct udl_device { struct udl_device {
struct device *dev; struct device *dev;
struct drm_device *ddev; struct drm_device *ddev;
struct usb_device *udev;
int sku_pixel_limit; int sku_pixel_limit;
......
...@@ -202,7 +202,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size) ...@@ -202,7 +202,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
} }
unode->urb = urb; 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); &urb->transfer_dma);
if (!buf) { if (!buf) {
kfree(unode); kfree(unode);
...@@ -211,7 +211,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size) ...@@ -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 */ /* 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); buf, size, udl_urb_completion, unode);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 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) ...@@ -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) int udl_driver_load(struct drm_device *dev, unsigned long flags)
{ {
struct usb_device *udev = (void*)flags;
struct udl_device *udl; struct udl_device *udl;
int ret = -ENOMEM; int ret = -ENOMEM;
...@@ -290,10 +291,11 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -290,10 +291,11 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags)
if (!udl) if (!udl)
return -ENOMEM; return -ENOMEM;
udl->udev = udev;
udl->ddev = dev; udl->ddev = dev;
dev->dev_private = udl; dev->dev_private = udl;
if (!udl_parse_vendor_descriptor(dev, dev->usbdev)) { if (!udl_parse_vendor_descriptor(dev, udl->udev)) {
ret = -ENODEV; ret = -ENODEV;
DRM_ERROR("firmware not recognized. Assume incompatible device\n"); DRM_ERROR("firmware not recognized. Assume incompatible device\n");
goto err; goto err;
......
...@@ -1020,7 +1020,6 @@ struct drm_device { ...@@ -1020,7 +1020,6 @@ struct drm_device {
#endif #endif
struct platform_device *platformdev; /**< Platform device struture */ struct platform_device *platformdev; /**< Platform device struture */
struct usb_device *usbdev;
struct drm_sg_mem *sg; /**< Scatter gather memory */ struct drm_sg_mem *sg; /**< Scatter gather memory */
unsigned int num_crtcs; /**< Number of CRTCs on this device */ unsigned int num_crtcs; /**< Number of CRTCs on this device */
......
#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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment