diff options
-rw-r--r-- | drivers/video/fbdev/udlfb.c | 231 |
1 files changed, 117 insertions, 114 deletions
diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c index f0118c10b4ab..452a4207ac1b 100644 --- a/drivers/video/fbdev/udlfb.c +++ b/drivers/video/fbdev/udlfb.c | |||
@@ -16,8 +16,6 @@ | |||
16 | * from Florian Echtler, Henrik Bjerregaard Pedersen, and others. | 16 | * from Florian Echtler, Henrik Bjerregaard Pedersen, and others. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
20 | |||
21 | #include <linux/module.h> | 19 | #include <linux/module.h> |
22 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
23 | #include <linux/init.h> | 21 | #include <linux/init.h> |
@@ -333,8 +331,8 @@ static int dlfb_ops_mmap(struct fb_info *info, struct vm_area_struct *vma) | |||
333 | 331 | ||
334 | pos = (unsigned long)info->fix.smem_start + offset; | 332 | pos = (unsigned long)info->fix.smem_start + offset; |
335 | 333 | ||
336 | pr_notice("mmap() framebuffer addr:%lu size:%lu\n", | 334 | dev_dbg(info->dev, "mmap() framebuffer addr:%lu size:%lu\n", |
337 | pos, size); | 335 | pos, size); |
338 | 336 | ||
339 | while (size > 0) { | 337 | while (size > 0) { |
340 | page = vmalloc_to_pfn((void *)pos); | 338 | page = vmalloc_to_pfn((void *)pos); |
@@ -757,8 +755,7 @@ error: | |||
757 | 755 | ||
758 | static int dlfb_get_edid(struct dlfb_data *dlfb, char *edid, int len) | 756 | static int dlfb_get_edid(struct dlfb_data *dlfb, char *edid, int len) |
759 | { | 757 | { |
760 | int i; | 758 | int i, ret; |
761 | int ret; | ||
762 | char *rbuf; | 759 | char *rbuf; |
763 | 760 | ||
764 | rbuf = kmalloc(2, GFP_KERNEL); | 761 | rbuf = kmalloc(2, GFP_KERNEL); |
@@ -771,7 +768,8 @@ static int dlfb_get_edid(struct dlfb_data *dlfb, char *edid, int len) | |||
771 | (0x80 | (0x02 << 5)), i << 8, 0xA1, | 768 | (0x80 | (0x02 << 5)), i << 8, 0xA1, |
772 | rbuf, 2, USB_CTRL_GET_TIMEOUT); | 769 | rbuf, 2, USB_CTRL_GET_TIMEOUT); |
773 | if (ret < 2) { | 770 | if (ret < 2) { |
774 | pr_err("Read EDID byte %d failed: %d\n", i, ret); | 771 | dev_err(&dlfb->udev->dev, |
772 | "Read EDID byte %d failed: %d\n", i, ret); | ||
775 | i--; | 773 | i--; |
776 | break; | 774 | break; |
777 | } | 775 | } |
@@ -905,8 +903,8 @@ static int dlfb_ops_open(struct fb_info *info, int user) | |||
905 | fb_deferred_io_init(info); | 903 | fb_deferred_io_init(info); |
906 | } | 904 | } |
907 | 905 | ||
908 | pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n", | 906 | dev_dbg(info->dev, "open, user=%d fb_info=%p count=%d\n", |
909 | info->node, user, info, dlfb->fb_count); | 907 | user, info, dlfb->fb_count); |
910 | 908 | ||
911 | return 0; | 909 | return 0; |
912 | } | 910 | } |
@@ -984,8 +982,7 @@ static int dlfb_ops_release(struct fb_info *info, int user) | |||
984 | info->fbops->fb_mmap = dlfb_ops_mmap; | 982 | info->fbops->fb_mmap = dlfb_ops_mmap; |
985 | } | 983 | } |
986 | 984 | ||
987 | pr_warn("released /dev/fb%d user=%d count=%d\n", | 985 | dev_dbg(info->dev, "release, user=%d count=%d\n", user, dlfb->fb_count); |
988 | info->node, user, dlfb->fb_count); | ||
989 | 986 | ||
990 | kref_put(&dlfb->kref, dlfb_free); | 987 | kref_put(&dlfb->kref, dlfb_free); |
991 | 988 | ||
@@ -996,19 +993,10 @@ static int dlfb_ops_release(struct fb_info *info, int user) | |||
996 | * Check whether a video mode is supported by the DisplayLink chip | 993 | * Check whether a video mode is supported by the DisplayLink chip |
997 | * We start from monitor's modes, so don't need to filter that here | 994 | * We start from monitor's modes, so don't need to filter that here |
998 | */ | 995 | */ |
999 | static int dlfb_is_valid_mode(struct fb_videomode *mode, | 996 | static int dlfb_is_valid_mode(struct fb_videomode *mode, struct dlfb_data *dlfb) |
1000 | struct fb_info *info) | ||
1001 | { | 997 | { |
1002 | struct dlfb_data *dlfb = info->par; | 998 | if (mode->xres * mode->yres > dlfb->sku_pixel_limit) |
1003 | |||
1004 | if (mode->xres * mode->yres > dlfb->sku_pixel_limit) { | ||
1005 | pr_warn("%dx%d beyond chip capabilities\n", | ||
1006 | mode->xres, mode->yres); | ||
1007 | return 0; | 999 | return 0; |
1008 | } | ||
1009 | |||
1010 | pr_info("%dx%d @ %d Hz valid mode\n", mode->xres, mode->yres, | ||
1011 | mode->refresh); | ||
1012 | 1000 | ||
1013 | return 1; | 1001 | return 1; |
1014 | } | 1002 | } |
@@ -1029,6 +1017,7 @@ static int dlfb_ops_check_var(struct fb_var_screeninfo *var, | |||
1029 | struct fb_info *info) | 1017 | struct fb_info *info) |
1030 | { | 1018 | { |
1031 | struct fb_videomode mode; | 1019 | struct fb_videomode mode; |
1020 | struct dlfb_data *dlfb = info->par; | ||
1032 | 1021 | ||
1033 | /* TODO: support dynamically changing framebuffer size */ | 1022 | /* TODO: support dynamically changing framebuffer size */ |
1034 | if ((var->xres * var->yres * 2) > info->fix.smem_len) | 1023 | if ((var->xres * var->yres * 2) > info->fix.smem_len) |
@@ -1039,7 +1028,7 @@ static int dlfb_ops_check_var(struct fb_var_screeninfo *var, | |||
1039 | 1028 | ||
1040 | fb_var_to_videomode(&mode, var); | 1029 | fb_var_to_videomode(&mode, var); |
1041 | 1030 | ||
1042 | if (!dlfb_is_valid_mode(&mode, info)) | 1031 | if (!dlfb_is_valid_mode(&mode, dlfb)) |
1043 | return -EINVAL; | 1032 | return -EINVAL; |
1044 | 1033 | ||
1045 | return 0; | 1034 | return 0; |
@@ -1093,8 +1082,8 @@ static int dlfb_ops_blank(int blank_mode, struct fb_info *info) | |||
1093 | char *bufptr; | 1082 | char *bufptr; |
1094 | struct urb *urb; | 1083 | struct urb *urb; |
1095 | 1084 | ||
1096 | pr_debug("/dev/fb%d FB_BLANK mode %d --> %d\n", | 1085 | dev_dbg(info->dev, "blank, mode %d --> %d\n", |
1097 | info->node, dlfb->blank_mode, blank_mode); | 1086 | dlfb->blank_mode, blank_mode); |
1098 | 1087 | ||
1099 | if ((dlfb->blank_mode == FB_BLANK_POWERDOWN) && | 1088 | if ((dlfb->blank_mode == FB_BLANK_POWERDOWN) && |
1100 | (blank_mode != FB_BLANK_POWERDOWN)) { | 1089 | (blank_mode != FB_BLANK_POWERDOWN)) { |
@@ -1162,7 +1151,7 @@ static int dlfb_realloc_framebuffer(struct dlfb_data *dlfb, struct fb_info *info | |||
1162 | */ | 1151 | */ |
1163 | new_fb = vmalloc(new_len); | 1152 | new_fb = vmalloc(new_len); |
1164 | if (!new_fb) { | 1153 | if (!new_fb) { |
1165 | pr_err("Virtual framebuffer alloc failed\n"); | 1154 | dev_err(info->dev, "Virtual framebuffer alloc failed\n"); |
1166 | goto error; | 1155 | goto error; |
1167 | } | 1156 | } |
1168 | 1157 | ||
@@ -1185,7 +1174,8 @@ static int dlfb_realloc_framebuffer(struct dlfb_data *dlfb, struct fb_info *info | |||
1185 | if (shadow) | 1174 | if (shadow) |
1186 | new_back = vzalloc(new_len); | 1175 | new_back = vzalloc(new_len); |
1187 | if (!new_back) | 1176 | if (!new_back) |
1188 | pr_info("No shadow/backing buffer allocated\n"); | 1177 | dev_info(info->dev, |
1178 | "No shadow/backing buffer allocated\n"); | ||
1189 | else { | 1179 | else { |
1190 | vfree(dlfb->backing_buffer); | 1180 | vfree(dlfb->backing_buffer); |
1191 | dlfb->backing_buffer = new_back; | 1181 | dlfb->backing_buffer = new_back; |
@@ -1216,14 +1206,18 @@ static int dlfb_setup_modes(struct dlfb_data *dlfb, | |||
1216 | struct fb_info *info, | 1206 | struct fb_info *info, |
1217 | char *default_edid, size_t default_edid_size) | 1207 | char *default_edid, size_t default_edid_size) |
1218 | { | 1208 | { |
1219 | int i; | ||
1220 | const struct fb_videomode *default_vmode = NULL; | ||
1221 | int result = 0; | ||
1222 | char *edid; | 1209 | char *edid; |
1223 | int tries = 3; | 1210 | int i, result = 0, tries = 3; |
1211 | struct device *dev = info->device; | ||
1212 | struct fb_videomode *mode; | ||
1213 | const struct fb_videomode *default_vmode = NULL; | ||
1224 | 1214 | ||
1225 | if (info->dev) /* only use mutex if info has been registered */ | 1215 | if (info->dev) { |
1216 | /* only use mutex if info has been registered */ | ||
1226 | mutex_lock(&info->lock); | 1217 | mutex_lock(&info->lock); |
1218 | /* parent device is used otherwise */ | ||
1219 | dev = info->dev; | ||
1220 | } | ||
1227 | 1221 | ||
1228 | edid = kmalloc(EDID_LENGTH, GFP_KERNEL); | 1222 | edid = kmalloc(EDID_LENGTH, GFP_KERNEL); |
1229 | if (!edid) { | 1223 | if (!edid) { |
@@ -1255,13 +1249,12 @@ static int dlfb_setup_modes(struct dlfb_data *dlfb, | |||
1255 | 1249 | ||
1256 | /* If that fails, use a previously returned EDID if available */ | 1250 | /* If that fails, use a previously returned EDID if available */ |
1257 | if (info->monspecs.modedb_len == 0) { | 1251 | if (info->monspecs.modedb_len == 0) { |
1258 | 1252 | dev_err(dev, "Unable to get valid EDID from device/display\n"); | |
1259 | pr_err("Unable to get valid EDID from device/display\n"); | ||
1260 | 1253 | ||
1261 | if (dlfb->edid) { | 1254 | if (dlfb->edid) { |
1262 | fb_edid_to_monspecs(dlfb->edid, &info->monspecs); | 1255 | fb_edid_to_monspecs(dlfb->edid, &info->monspecs); |
1263 | if (info->monspecs.modedb_len > 0) | 1256 | if (info->monspecs.modedb_len > 0) |
1264 | pr_err("Using previously queried EDID\n"); | 1257 | dev_err(dev, "Using previously queried EDID\n"); |
1265 | } | 1258 | } |
1266 | } | 1259 | } |
1267 | 1260 | ||
@@ -1273,7 +1266,7 @@ static int dlfb_setup_modes(struct dlfb_data *dlfb, | |||
1273 | memcpy(edid, default_edid, default_edid_size); | 1266 | memcpy(edid, default_edid, default_edid_size); |
1274 | dlfb->edid = edid; | 1267 | dlfb->edid = edid; |
1275 | dlfb->edid_size = default_edid_size; | 1268 | dlfb->edid_size = default_edid_size; |
1276 | pr_err("Using default/backup EDID\n"); | 1269 | dev_err(dev, "Using default/backup EDID\n"); |
1277 | } | 1270 | } |
1278 | } | 1271 | } |
1279 | } | 1272 | } |
@@ -1282,10 +1275,12 @@ static int dlfb_setup_modes(struct dlfb_data *dlfb, | |||
1282 | if (info->monspecs.modedb_len > 0) { | 1275 | if (info->monspecs.modedb_len > 0) { |
1283 | 1276 | ||
1284 | for (i = 0; i < info->monspecs.modedb_len; i++) { | 1277 | for (i = 0; i < info->monspecs.modedb_len; i++) { |
1285 | if (dlfb_is_valid_mode(&info->monspecs.modedb[i], info)) | 1278 | mode = &info->monspecs.modedb[i]; |
1286 | fb_add_videomode(&info->monspecs.modedb[i], | 1279 | if (dlfb_is_valid_mode(mode, dlfb)) { |
1287 | &info->modelist); | 1280 | fb_add_videomode(mode, &info->modelist); |
1288 | else { | 1281 | } else { |
1282 | dev_dbg(dev, "Specified mode %dx%d too big\n", | ||
1283 | mode->xres, mode->yres); | ||
1289 | if (i == 0) | 1284 | if (i == 0) |
1290 | /* if we've removed top/best mode */ | 1285 | /* if we've removed top/best mode */ |
1291 | info->monspecs.misc | 1286 | info->monspecs.misc |
@@ -1309,10 +1304,12 @@ static int dlfb_setup_modes(struct dlfb_data *dlfb, | |||
1309 | * But at least the user has a chance to choose | 1304 | * But at least the user has a chance to choose |
1310 | */ | 1305 | */ |
1311 | for (i = 0; i < VESA_MODEDB_SIZE; i++) { | 1306 | for (i = 0; i < VESA_MODEDB_SIZE; i++) { |
1312 | if (dlfb_is_valid_mode((struct fb_videomode *) | 1307 | mode = (struct fb_videomode *)&vesa_modes[i]; |
1313 | &vesa_modes[i], info)) | 1308 | if (dlfb_is_valid_mode(mode, dlfb)) |
1314 | fb_add_videomode(&vesa_modes[i], | 1309 | fb_add_videomode(mode, &info->modelist); |
1315 | &info->modelist); | 1310 | else |
1311 | dev_dbg(dev, "VESA mode %dx%d too big\n", | ||
1312 | mode->xres, mode->yres); | ||
1316 | } | 1313 | } |
1317 | 1314 | ||
1318 | /* | 1315 | /* |
@@ -1492,7 +1489,7 @@ static int dlfb_select_std_channel(struct dlfb_data *dlfb) | |||
1492 | } | 1489 | } |
1493 | 1490 | ||
1494 | static int dlfb_parse_vendor_descriptor(struct dlfb_data *dlfb, | 1491 | static int dlfb_parse_vendor_descriptor(struct dlfb_data *dlfb, |
1495 | struct usb_interface *interface) | 1492 | struct usb_interface *intf) |
1496 | { | 1493 | { |
1497 | char *desc; | 1494 | char *desc; |
1498 | char *buf; | 1495 | char *buf; |
@@ -1504,20 +1501,21 @@ static int dlfb_parse_vendor_descriptor(struct dlfb_data *dlfb, | |||
1504 | return false; | 1501 | return false; |
1505 | desc = buf; | 1502 | desc = buf; |
1506 | 1503 | ||
1507 | total_len = usb_get_descriptor(interface_to_usbdev(interface), | 1504 | total_len = usb_get_descriptor(interface_to_usbdev(intf), |
1508 | 0x5f, /* vendor specific */ | 1505 | 0x5f, /* vendor specific */ |
1509 | 0, desc, MAX_VENDOR_DESCRIPTOR_SIZE); | 1506 | 0, desc, MAX_VENDOR_DESCRIPTOR_SIZE); |
1510 | 1507 | ||
1511 | /* if not found, look in configuration descriptor */ | 1508 | /* if not found, look in configuration descriptor */ |
1512 | if (total_len < 0) { | 1509 | if (total_len < 0) { |
1513 | if (0 == usb_get_extra_descriptor(interface->cur_altsetting, | 1510 | if (0 == usb_get_extra_descriptor(intf->cur_altsetting, |
1514 | 0x5f, &desc)) | 1511 | 0x5f, &desc)) |
1515 | total_len = (int) desc[0]; | 1512 | total_len = (int) desc[0]; |
1516 | } | 1513 | } |
1517 | 1514 | ||
1518 | if (total_len > 5) { | 1515 | if (total_len > 5) { |
1519 | pr_info("vendor descriptor length:%x data:%11ph\n", total_len, | 1516 | dev_info(&intf->dev, |
1520 | desc); | 1517 | "vendor descriptor length: %d data: %11ph\n", |
1518 | total_len, desc); | ||
1521 | 1519 | ||
1522 | if ((desc[0] != total_len) || /* descriptor length */ | 1520 | if ((desc[0] != total_len) || /* descriptor length */ |
1523 | (desc[1] != 0x5f) || /* vendor descriptor type */ | 1521 | (desc[1] != 0x5f) || /* vendor descriptor type */ |
@@ -1542,8 +1540,9 @@ static int dlfb_parse_vendor_descriptor(struct dlfb_data *dlfb, | |||
1542 | case 0x0200: { /* max_area */ | 1540 | case 0x0200: { /* max_area */ |
1543 | u32 max_area; | 1541 | u32 max_area; |
1544 | max_area = le32_to_cpu(*((u32 *)desc)); | 1542 | max_area = le32_to_cpu(*((u32 *)desc)); |
1545 | pr_warn("DL chip limited to %d pixel modes\n", | 1543 | dev_warn(&intf->dev, |
1546 | max_area); | 1544 | "DL chip limited to %d pixel modes\n", |
1545 | max_area); | ||
1547 | dlfb->sku_pixel_limit = max_area; | 1546 | dlfb->sku_pixel_limit = max_area; |
1548 | break; | 1547 | break; |
1549 | } | 1548 | } |
@@ -1553,14 +1552,15 @@ static int dlfb_parse_vendor_descriptor(struct dlfb_data *dlfb, | |||
1553 | desc += length; | 1552 | desc += length; |
1554 | } | 1553 | } |
1555 | } else { | 1554 | } else { |
1556 | pr_info("vendor descriptor not available (%d)\n", total_len); | 1555 | dev_info(&intf->dev, "vendor descriptor not available (%d)\n", |
1556 | total_len); | ||
1557 | } | 1557 | } |
1558 | 1558 | ||
1559 | goto success; | 1559 | goto success; |
1560 | 1560 | ||
1561 | unrecognized: | 1561 | unrecognized: |
1562 | /* allow udlfb to load for now even if firmware unrecognized */ | 1562 | /* allow udlfb to load for now even if firmware unrecognized */ |
1563 | pr_err("Unrecognized vendor firmware descriptor\n"); | 1563 | dev_err(&intf->dev, "Unrecognized vendor firmware descriptor\n"); |
1564 | 1564 | ||
1565 | success: | 1565 | success: |
1566 | kfree(buf); | 1566 | kfree(buf); |
@@ -1569,56 +1569,48 @@ success: | |||
1569 | 1569 | ||
1570 | static void dlfb_init_framebuffer_work(struct work_struct *work); | 1570 | static void dlfb_init_framebuffer_work(struct work_struct *work); |
1571 | 1571 | ||
1572 | static int dlfb_usb_probe(struct usb_interface *interface, | 1572 | static int dlfb_usb_probe(struct usb_interface *intf, |
1573 | const struct usb_device_id *id) | 1573 | const struct usb_device_id *id) |
1574 | { | 1574 | { |
1575 | struct usb_device *usbdev; | ||
1576 | struct dlfb_data *dlfb; | 1575 | struct dlfb_data *dlfb; |
1577 | int retval = -ENOMEM; | 1576 | int retval = -ENOMEM; |
1577 | struct usb_device *usbdev = interface_to_usbdev(intf); | ||
1578 | 1578 | ||
1579 | /* usb initialization */ | 1579 | /* usb initialization */ |
1580 | |||
1581 | usbdev = interface_to_usbdev(interface); | ||
1582 | |||
1583 | dlfb = kzalloc(sizeof(*dlfb), GFP_KERNEL); | 1580 | dlfb = kzalloc(sizeof(*dlfb), GFP_KERNEL); |
1584 | if (dlfb == NULL) { | 1581 | if (!dlfb) { |
1585 | dev_err(&interface->dev, "dlfb_usb_probe: failed alloc of dev struct\n"); | 1582 | dev_err(&intf->dev, "%s: failed to allocate dlfb\n", __func__); |
1586 | goto error; | 1583 | goto error; |
1587 | } | 1584 | } |
1588 | 1585 | ||
1589 | kref_init(&dlfb->kref); /* matching kref_put in usb .disconnect fn */ | 1586 | kref_init(&dlfb->kref); /* matching kref_put in usb .disconnect fn */ |
1590 | 1587 | ||
1591 | dlfb->udev = usbdev; | 1588 | dlfb->udev = usbdev; |
1592 | usb_set_intfdata(interface, dlfb); | 1589 | usb_set_intfdata(intf, dlfb); |
1593 | 1590 | ||
1594 | pr_info("%s %s - serial #%s\n", | 1591 | dev_dbg(&intf->dev, "console enable=%d\n", console); |
1595 | usbdev->manufacturer, usbdev->product, usbdev->serial); | 1592 | dev_dbg(&intf->dev, "fb_defio enable=%d\n", fb_defio); |
1596 | pr_info("vid_%04x&pid_%04x&rev_%04x driver's dlfb_data struct at %p\n", | 1593 | dev_dbg(&intf->dev, "shadow enable=%d\n", shadow); |
1597 | le16_to_cpu(usbdev->descriptor.idVendor), | ||
1598 | le16_to_cpu(usbdev->descriptor.idProduct), | ||
1599 | le16_to_cpu(usbdev->descriptor.bcdDevice), dlfb); | ||
1600 | pr_info("console enable=%d\n", console); | ||
1601 | pr_info("fb_defio enable=%d\n", fb_defio); | ||
1602 | pr_info("shadow enable=%d\n", shadow); | ||
1603 | 1594 | ||
1604 | dlfb->sku_pixel_limit = 2048 * 1152; /* default to maximum */ | 1595 | dlfb->sku_pixel_limit = 2048 * 1152; /* default to maximum */ |
1605 | 1596 | ||
1606 | if (!dlfb_parse_vendor_descriptor(dlfb, interface)) { | 1597 | if (!dlfb_parse_vendor_descriptor(dlfb, intf)) { |
1607 | pr_err("firmware not recognized. Assume incompatible device\n"); | 1598 | dev_err(&intf->dev, |
1599 | "firmware not recognized, incompatible device?\n"); | ||
1608 | goto error; | 1600 | goto error; |
1609 | } | 1601 | } |
1610 | 1602 | ||
1611 | if (pixel_limit) { | 1603 | if (pixel_limit) { |
1612 | pr_warn("DL chip limit of %d overridden" | 1604 | dev_warn(&intf->dev, |
1613 | " by module param to %d\n", | 1605 | "DL chip limit of %d overridden to %d\n", |
1614 | dlfb->sku_pixel_limit, pixel_limit); | 1606 | dlfb->sku_pixel_limit, pixel_limit); |
1615 | dlfb->sku_pixel_limit = pixel_limit; | 1607 | dlfb->sku_pixel_limit = pixel_limit; |
1616 | } | 1608 | } |
1617 | 1609 | ||
1618 | 1610 | ||
1619 | if (!dlfb_alloc_urb_list(dlfb, WRITES_IN_FLIGHT, MAX_TRANSFER)) { | 1611 | if (!dlfb_alloc_urb_list(dlfb, WRITES_IN_FLIGHT, MAX_TRANSFER)) { |
1620 | retval = -ENOMEM; | 1612 | retval = -ENOMEM; |
1621 | pr_err("dlfb_alloc_urb_list failed\n"); | 1613 | dev_err(&intf->dev, "unable to allocate urb list\n"); |
1622 | goto error; | 1614 | goto error; |
1623 | } | 1615 | } |
1624 | 1616 | ||
@@ -1646,16 +1638,16 @@ error: | |||
1646 | 1638 | ||
1647 | static void dlfb_init_framebuffer_work(struct work_struct *work) | 1639 | static void dlfb_init_framebuffer_work(struct work_struct *work) |
1648 | { | 1640 | { |
1641 | int i, retval; | ||
1642 | struct fb_info *info; | ||
1643 | const struct device_attribute *attr; | ||
1649 | struct dlfb_data *dlfb = container_of(work, struct dlfb_data, | 1644 | struct dlfb_data *dlfb = container_of(work, struct dlfb_data, |
1650 | init_framebuffer_work.work); | 1645 | init_framebuffer_work.work); |
1651 | struct fb_info *info; | ||
1652 | int retval; | ||
1653 | int i; | ||
1654 | 1646 | ||
1655 | /* allocates framebuffer driver structure, not framebuffer memory */ | 1647 | /* allocates framebuffer driver structure, not framebuffer memory */ |
1656 | info = framebuffer_alloc(0, &dlfb->udev->dev); | 1648 | info = framebuffer_alloc(0, &dlfb->udev->dev); |
1657 | if (!info) { | 1649 | if (!info) { |
1658 | pr_err("framebuffer_alloc failed\n"); | 1650 | dev_err(&dlfb->udev->dev, "framebuffer_alloc failed\n"); |
1659 | goto error; | 1651 | goto error; |
1660 | } | 1652 | } |
1661 | 1653 | ||
@@ -1666,7 +1658,7 @@ static void dlfb_init_framebuffer_work(struct work_struct *work) | |||
1666 | 1658 | ||
1667 | retval = fb_alloc_cmap(&info->cmap, 256, 0); | 1659 | retval = fb_alloc_cmap(&info->cmap, 256, 0); |
1668 | if (retval < 0) { | 1660 | if (retval < 0) { |
1669 | pr_err("fb_alloc_cmap failed %x\n", retval); | 1661 | dev_err(info->device, "cmap allocation failed: %d\n", retval); |
1670 | goto error; | 1662 | goto error; |
1671 | } | 1663 | } |
1672 | 1664 | ||
@@ -1677,7 +1669,8 @@ static void dlfb_init_framebuffer_work(struct work_struct *work) | |||
1677 | 1669 | ||
1678 | retval = dlfb_setup_modes(dlfb, info, NULL, 0); | 1670 | retval = dlfb_setup_modes(dlfb, info, NULL, 0); |
1679 | if (retval != 0) { | 1671 | if (retval != 0) { |
1680 | pr_err("unable to find common mode for display and adapter\n"); | 1672 | dev_err(info->device, |
1673 | "unable to find common mode for display and adapter\n"); | ||
1681 | goto error; | 1674 | goto error; |
1682 | } | 1675 | } |
1683 | 1676 | ||
@@ -1691,43 +1684,46 @@ static void dlfb_init_framebuffer_work(struct work_struct *work) | |||
1691 | 1684 | ||
1692 | retval = register_framebuffer(info); | 1685 | retval = register_framebuffer(info); |
1693 | if (retval < 0) { | 1686 | if (retval < 0) { |
1694 | pr_err("register_framebuffer failed %d\n", retval); | 1687 | dev_err(info->device, "unable to register framebuffer: %d\n", |
1688 | retval); | ||
1695 | goto error; | 1689 | goto error; |
1696 | } | 1690 | } |
1697 | 1691 | ||
1698 | for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) { | 1692 | for (i = 0; i < ARRAY_SIZE(fb_device_attrs); i++) { |
1699 | retval = device_create_file(info->dev, &fb_device_attrs[i]); | 1693 | attr = &fb_device_attrs[i]; |
1700 | if (retval) { | 1694 | retval = device_create_file(info->dev, attr); |
1701 | pr_warn("device_create_file failed %d\n", retval); | 1695 | if (retval) |
1702 | } | 1696 | dev_warn(info->device, |
1697 | "failed to create '%s' attribute: %d\n", | ||
1698 | attr->attr.name, retval); | ||
1703 | } | 1699 | } |
1704 | 1700 | ||
1705 | retval = device_create_bin_file(info->dev, &edid_attr); | 1701 | retval = device_create_bin_file(info->dev, &edid_attr); |
1706 | if (retval) { | 1702 | if (retval) |
1707 | pr_warn("device_create_bin_file failed %d\n", retval); | 1703 | dev_warn(info->device, "failed to create '%s' attribute: %d\n", |
1708 | } | 1704 | edid_attr.attr.name, retval); |
1709 | 1705 | ||
1710 | pr_info("DisplayLink USB device /dev/fb%d attached. %dx%d resolution." | 1706 | dev_info(info->device, |
1711 | " Using %dK framebuffer memory\n", info->node, | 1707 | "%s is DisplayLink USB device (%dx%d, %dK framebuffer memory)\n", |
1712 | info->var.xres, info->var.yres, | 1708 | dev_name(info->dev), info->var.xres, info->var.yres, |
1713 | ((dlfb->backing_buffer) ? | 1709 | ((dlfb->backing_buffer) ? |
1714 | info->fix.smem_len * 2 : info->fix.smem_len) >> 10); | 1710 | info->fix.smem_len * 2 : info->fix.smem_len) >> 10); |
1715 | return; | 1711 | return; |
1716 | 1712 | ||
1717 | error: | 1713 | error: |
1718 | dlfb_free_framebuffer(dlfb); | 1714 | dlfb_free_framebuffer(dlfb); |
1719 | } | 1715 | } |
1720 | 1716 | ||
1721 | static void dlfb_usb_disconnect(struct usb_interface *interface) | 1717 | static void dlfb_usb_disconnect(struct usb_interface *intf) |
1722 | { | 1718 | { |
1723 | struct dlfb_data *dlfb; | 1719 | struct dlfb_data *dlfb; |
1724 | struct fb_info *info; | 1720 | struct fb_info *info; |
1725 | int i; | 1721 | int i; |
1726 | 1722 | ||
1727 | dlfb = usb_get_intfdata(interface); | 1723 | dlfb = usb_get_intfdata(intf); |
1728 | info = dlfb->info; | 1724 | info = dlfb->info; |
1729 | 1725 | ||
1730 | pr_info("USB disconnect starting\n"); | 1726 | dev_dbg(&intf->dev, "USB disconnect starting\n"); |
1731 | 1727 | ||
1732 | /* we virtualize until all fb clients release. Then we free */ | 1728 | /* we virtualize until all fb clients release. Then we free */ |
1733 | dlfb->virtualized = true; | 1729 | dlfb->virtualized = true; |
@@ -1746,7 +1742,7 @@ static void dlfb_usb_disconnect(struct usb_interface *interface) | |||
1746 | unlink_framebuffer(info); | 1742 | unlink_framebuffer(info); |
1747 | } | 1743 | } |
1748 | 1744 | ||
1749 | usb_set_intfdata(interface, NULL); | 1745 | usb_set_intfdata(intf, NULL); |
1750 | dlfb->udev = NULL; | 1746 | dlfb->udev = NULL; |
1751 | 1747 | ||
1752 | /* if clients still have us open, will be freed on last close */ | 1748 | /* if clients still have us open, will be freed on last close */ |
@@ -1774,15 +1770,21 @@ static void dlfb_urb_completion(struct urb *urb) | |||
1774 | struct dlfb_data *dlfb = unode->dlfb; | 1770 | struct dlfb_data *dlfb = unode->dlfb; |
1775 | unsigned long flags; | 1771 | unsigned long flags; |
1776 | 1772 | ||
1777 | /* sync/async unlink faults aren't errors */ | 1773 | switch (urb->status) { |
1778 | if (urb->status) { | 1774 | case 0: |
1779 | if (!(urb->status == -ENOENT || | 1775 | /* success */ |
1780 | urb->status == -ECONNRESET || | 1776 | break; |
1781 | urb->status == -ESHUTDOWN)) { | 1777 | case -ECONNRESET: |
1782 | pr_err("%s - nonzero write bulk status received: %d\n", | 1778 | case -ENOENT: |
1783 | __func__, urb->status); | 1779 | case -ESHUTDOWN: |
1784 | atomic_set(&dlfb->lost_pixels, 1); | 1780 | /* sync/async unlink faults aren't errors */ |
1785 | } | 1781 | break; |
1782 | default: | ||
1783 | dev_err(&dlfb->udev->dev, | ||
1784 | "%s - nonzero write bulk status received: %d\n", | ||
1785 | __func__, urb->status); | ||
1786 | atomic_set(&dlfb->lost_pixels, 1); | ||
1787 | break; | ||
1786 | } | 1788 | } |
1787 | 1789 | ||
1788 | urb->transfer_buffer_length = dlfb->urbs.size; /* reset to actual */ | 1790 | urb->transfer_buffer_length = dlfb->urbs.size; /* reset to actual */ |
@@ -1903,8 +1905,9 @@ static struct urb *dlfb_get_urb(struct dlfb_data *dlfb) | |||
1903 | ret = down_timeout(&dlfb->urbs.limit_sem, GET_URB_TIMEOUT); | 1905 | ret = down_timeout(&dlfb->urbs.limit_sem, GET_URB_TIMEOUT); |
1904 | if (ret) { | 1906 | if (ret) { |
1905 | atomic_set(&dlfb->lost_pixels, 1); | 1907 | atomic_set(&dlfb->lost_pixels, 1); |
1906 | pr_warn("wait for urb interrupted: %x available: %d\n", | 1908 | dev_warn(&dlfb->udev->dev, |
1907 | ret, dlfb->urbs.available); | 1909 | "wait for urb interrupted: %d available: %d\n", |
1910 | ret, dlfb->urbs.available); | ||
1908 | return NULL; | 1911 | return NULL; |
1909 | } | 1912 | } |
1910 | 1913 | ||
@@ -1932,7 +1935,7 @@ static int dlfb_submit_urb(struct dlfb_data *dlfb, struct urb *urb, size_t len) | |||
1932 | if (ret) { | 1935 | if (ret) { |
1933 | dlfb_urb_completion(urb); /* because no one else will */ | 1936 | dlfb_urb_completion(urb); /* because no one else will */ |
1934 | atomic_set(&dlfb->lost_pixels, 1); | 1937 | atomic_set(&dlfb->lost_pixels, 1); |
1935 | pr_err("usb_submit_urb error %x\n", ret); | 1938 | dev_err(&dlfb->udev->dev, "submit urb error: %d\n", ret); |
1936 | } | 1939 | } |
1937 | return ret; | 1940 | return ret; |
1938 | } | 1941 | } |