diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-12-03 06:54:45 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-12-03 06:54:45 -0500 |
| commit | c36910c147fd7b129a8f1269c76b9767c99de5cd (patch) | |
| tree | 29403cd341b62581718f6b34944271980fb133e6 /drivers | |
| parent | 70d7d357578245f1993fd2d3ccd26088bcd38941 (diff) | |
| parent | 09ee17eb8ea89514c13980c4010bdbbaea8630c2 (diff) | |
Merge branch 'iommu-fixes-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu into x86/urgent
Diffstat (limited to 'drivers')
137 files changed, 1752 insertions, 1492 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 1423b0c0cd2e..a0a178dd189c 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
| @@ -174,6 +174,15 @@ static int acpi_battery_get_property(struct power_supply *psy, | |||
| 174 | break; | 174 | break; |
| 175 | case POWER_SUPPLY_PROP_CURRENT_NOW: | 175 | case POWER_SUPPLY_PROP_CURRENT_NOW: |
| 176 | val->intval = battery->current_now * 1000; | 176 | val->intval = battery->current_now * 1000; |
| 177 | /* if power units are mW, convert to mA by | ||
| 178 | dividing by current voltage (mV/1000) */ | ||
| 179 | if (!battery->power_unit) { | ||
| 180 | if (battery->voltage_now) { | ||
| 181 | val->intval /= battery->voltage_now; | ||
| 182 | val->intval *= 1000; | ||
| 183 | } else | ||
| 184 | val->intval = -1; | ||
| 185 | } | ||
| 177 | break; | 186 | break; |
| 178 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: | 187 | case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: |
| 179 | case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: | 188 | case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index ea92bac42c53..09c69806c1fc 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
| @@ -176,16 +176,6 @@ static int __init dmi_enable_osi_linux(const struct dmi_system_id *d) | |||
| 176 | acpi_dmi_osi_linux(1, d); /* enable */ | 176 | acpi_dmi_osi_linux(1, d); /* enable */ |
| 177 | return 0; | 177 | return 0; |
| 178 | } | 178 | } |
| 179 | static int __init dmi_disable_osi_linux(const struct dmi_system_id *d) | ||
| 180 | { | ||
| 181 | acpi_dmi_osi_linux(0, d); /* disable */ | ||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | static int __init dmi_unknown_osi_linux(const struct dmi_system_id *d) | ||
| 185 | { | ||
| 186 | acpi_dmi_osi_linux(-1, d); /* unknown */ | ||
| 187 | return 0; | ||
| 188 | } | ||
| 189 | static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) | 179 | static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) |
| 190 | { | 180 | { |
| 191 | printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); | 181 | printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); |
| @@ -193,295 +183,21 @@ static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) | |||
| 193 | return 0; | 183 | return 0; |
| 194 | } | 184 | } |
| 195 | 185 | ||
| 196 | /* | ||
| 197 | * Most BIOS that invoke OSI(Linux) do nothing with it. | ||
| 198 | * But some cause Linux to break. | ||
| 199 | * Only a couple use it to make Linux run better. | ||
| 200 | * | ||
| 201 | * Thus, Linux should continue to disable OSI(Linux) by default, | ||
| 202 | * should continue to discourage BIOS writers from using it, and | ||
| 203 | * should whitelist the few existing systems that require it. | ||
| 204 | * | ||
| 205 | * If it appears clear a vendor isn't using OSI(Linux) | ||
| 206 | * for anything constructive, blacklist them by name to disable | ||
| 207 | * unnecessary dmesg warnings on all of their products. | ||
| 208 | */ | ||
| 209 | |||
| 210 | static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | 186 | static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
| 211 | /* | ||
| 212 | * Disable OSI(Linux) warnings on all "Acer, inc." | ||
| 213 | * | ||
| 214 | * _OSI(Linux) disables the latest Windows BIOS code: | ||
| 215 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"), | ||
| 216 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"), | ||
| 217 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), | ||
| 218 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"), | ||
| 219 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"), | ||
| 220 | * _OSI(Linux) effect unknown: | ||
| 221 | * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"), | ||
| 222 | */ | ||
| 223 | /* | ||
| 224 | * note that dmi_check_system() uses strstr() | ||
| 225 | * to match sub-strings rather than !strcmp(), | ||
| 226 | * so "Acer" below matches "Acer, inc." above. | ||
| 227 | */ | ||
| 228 | /* | ||
| 229 | * Disable OSI(Linux) warnings on all "Acer" | ||
| 230 | * | ||
| 231 | * _OSI(Linux) effect unknown: | ||
| 232 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), | ||
| 233 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"), | ||
| 234 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"), | ||
| 235 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"), | ||
| 236 | * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"), | ||
| 237 | * | ||
| 238 | * _OSI(Linux) is a NOP: | ||
| 239 | * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"), | ||
| 240 | * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"), | ||
| 241 | */ | ||
| 242 | { | ||
| 243 | .callback = dmi_disable_osi_linux, | ||
| 244 | .ident = "Acer", | ||
| 245 | .matches = { | ||
| 246 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 247 | }, | ||
| 248 | }, | ||
| 249 | /* | ||
| 250 | * Disable OSI(Linux) warnings on all "Apple Computer, Inc." | ||
| 251 | * Disable OSI(Linux) warnings on all "Apple Inc." | ||
| 252 | * | ||
| 253 | * _OSI(Linux) confirmed to be a NOP: | ||
| 254 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
| 255 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), | ||
| 256 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"), | ||
| 257 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"), | ||
| 258 | * _OSI(Linux) effect unknown: | ||
| 259 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"), | ||
| 260 | * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"), | ||
| 261 | */ | ||
| 262 | { | ||
| 263 | .callback = dmi_disable_osi_linux, | ||
| 264 | .ident = "Apple", | ||
| 265 | .matches = { | ||
| 266 | DMI_MATCH(DMI_SYS_VENDOR, "Apple"), | ||
| 267 | }, | ||
| 268 | }, | ||
| 269 | /* | ||
| 270 | * Disable OSI(Linux) warnings on all "BenQ" | ||
| 271 | * | ||
| 272 | * _OSI(Linux) confirmed to be a NOP: | ||
| 273 | * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"), | ||
| 274 | */ | ||
| 275 | { | ||
| 276 | .callback = dmi_disable_osi_linux, | ||
| 277 | .ident = "BenQ", | ||
| 278 | .matches = { | ||
| 279 | DMI_MATCH(DMI_SYS_VENDOR, "BenQ"), | ||
| 280 | }, | ||
| 281 | }, | ||
| 282 | /* | ||
| 283 | * Disable OSI(Linux) warnings on all "Clevo Co." | ||
| 284 | * | ||
| 285 | * _OSI(Linux) confirmed to be a NOP: | ||
| 286 | * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"), | ||
| 287 | */ | ||
| 288 | { | ||
| 289 | .callback = dmi_disable_osi_linux, | ||
| 290 | .ident = "Clevo", | ||
| 291 | .matches = { | ||
| 292 | DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."), | ||
| 293 | }, | ||
| 294 | }, | ||
| 295 | /* | ||
| 296 | * Disable OSI(Linux) warnings on all "COMPAL" | ||
| 297 | * | ||
| 298 | * _OSI(Linux) confirmed to be a NOP: | ||
| 299 | * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"), | ||
| 300 | * _OSI(Linux) unknown effect: | ||
| 301 | * DMI_MATCH(DMI_BOARD_NAME, "IFL91"), | ||
| 302 | */ | ||
| 303 | { | ||
| 304 | .callback = dmi_disable_osi_linux, | ||
| 305 | .ident = "Compal", | ||
| 306 | .matches = { | ||
| 307 | DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), | ||
| 308 | }, | ||
| 309 | }, | ||
| 310 | { /* OSI(Linux) touches USB, unknown side-effect */ | ||
| 311 | .callback = dmi_disable_osi_linux, | ||
| 312 | .ident = "Dell Dimension 5150", | ||
| 313 | .matches = { | ||
| 314 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 315 | DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"), | ||
| 316 | }, | ||
| 317 | }, | ||
| 318 | { /* OSI(Linux) is a NOP */ | ||
| 319 | .callback = dmi_disable_osi_linux, | ||
| 320 | .ident = "Dell i1501", | ||
| 321 | .matches = { | ||
| 322 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 323 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"), | ||
| 324 | }, | ||
| 325 | }, | ||
| 326 | { /* OSI(Linux) effect unknown */ | ||
| 327 | .callback = dmi_unknown_osi_linux, | ||
| 328 | .ident = "Dell Latitude D830", | ||
| 329 | .matches = { | ||
| 330 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 331 | DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"), | ||
| 332 | }, | ||
| 333 | }, | ||
| 334 | { /* OSI(Linux) effect unknown */ | ||
| 335 | .callback = dmi_unknown_osi_linux, | ||
| 336 | .ident = "Dell OptiPlex GX620", | ||
| 337 | .matches = { | ||
| 338 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 339 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"), | ||
| 340 | }, | ||
| 341 | }, | ||
| 342 | { /* OSI(Linux) causes some USB initialization to not run */ | ||
| 343 | .callback = dmi_unknown_osi_linux, | ||
| 344 | .ident = "Dell OptiPlex 755", | ||
| 345 | .matches = { | ||
| 346 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 347 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 755"), | ||
| 348 | }, | ||
| 349 | }, | ||
| 350 | { /* OSI(Linux) effect unknown */ | ||
| 351 | .callback = dmi_unknown_osi_linux, | ||
| 352 | .ident = "Dell PE 1900", | ||
| 353 | .matches = { | ||
| 354 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 355 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"), | ||
| 356 | }, | ||
| 357 | }, | ||
| 358 | { /* OSI(Linux) is a NOP */ | ||
| 359 | .callback = dmi_unknown_osi_linux, | ||
| 360 | .ident = "Dell PE 1950", | ||
| 361 | .matches = { | ||
| 362 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 363 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"), | ||
| 364 | }, | ||
| 365 | }, | ||
| 366 | { /* OSI(Linux) is a NOP */ | ||
| 367 | .callback = dmi_disable_osi_linux, | ||
| 368 | .ident = "Dell PE R200", | ||
| 369 | .matches = { | ||
| 370 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 371 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge R200"), | ||
| 372 | }, | ||
| 373 | }, | ||
| 374 | { /* OSI(Linux) touches USB */ | ||
| 375 | .callback = dmi_disable_osi_linux, | ||
| 376 | .ident = "Dell PR 390", | ||
| 377 | .matches = { | ||
| 378 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 379 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"), | ||
| 380 | }, | ||
| 381 | }, | ||
| 382 | { /* OSI(Linux) touches USB */ | ||
| 383 | .callback = dmi_unknown_osi_linux, | ||
| 384 | .ident = "Dell PR 390", | ||
| 385 | .matches = { | ||
| 386 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 387 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 690"), | ||
| 388 | }, | ||
| 389 | }, | ||
| 390 | { /* OSI(Linux) unknown - ASL looks benign, but may effect dock/SMM */ | ||
| 391 | .callback = dmi_unknown_osi_linux, | ||
| 392 | .ident = "Dell PR M4300", | ||
| 393 | .matches = { | ||
| 394 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 395 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision M4300"), | ||
| 396 | }, | ||
| 397 | }, | ||
| 398 | { /* OSI(Linux) is a NOP */ | ||
| 399 | .callback = dmi_disable_osi_linux, | ||
| 400 | .ident = "Dell Vostro 1000", | ||
| 401 | .matches = { | ||
| 402 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 403 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1000"), | ||
| 404 | }, | ||
| 405 | }, | ||
| 406 | { /* OSI(Linux) effect unknown */ | ||
| 407 | .callback = dmi_unknown_osi_linux, | ||
| 408 | .ident = "Dell PE SC440", | ||
| 409 | .matches = { | ||
| 410 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 411 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"), | ||
| 412 | }, | ||
| 413 | }, | ||
| 414 | { /* OSI(Linux) effect unknown */ | ||
| 415 | .callback = dmi_unknown_osi_linux, | ||
| 416 | .ident = "Dialogue Flybook V5", | ||
| 417 | .matches = { | ||
| 418 | DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"), | ||
| 419 | DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"), | ||
| 420 | }, | ||
| 421 | }, | ||
| 422 | /* | ||
| 423 | * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS" | ||
| 424 | * | ||
| 425 | * _OSI(Linux) disables latest Windows BIOS code: | ||
| 426 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"), | ||
| 427 | * _OSI(Linux) confirmed to be a NOP: | ||
| 428 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"), | ||
| 429 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"), | ||
| 430 | * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"), | ||
| 431 | * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), | ||
| 432 | * _OSI(Linux) unknown effect: | ||
| 433 | * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"), | ||
| 434 | * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"), | ||
| 435 | */ | ||
| 436 | { | ||
| 437 | .callback = dmi_disable_osi_linux, | ||
| 438 | .ident = "Fujitsu Siemens", | ||
| 439 | .matches = { | ||
| 440 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 441 | }, | ||
| 442 | }, | ||
| 443 | { | 187 | { |
| 444 | .callback = dmi_disable_osi_vista, | 188 | .callback = dmi_disable_osi_vista, |
| 445 | .ident = "Fujitsu Siemens", | 189 | .ident = "Fujitsu Siemens", |
| 446 | .matches = { | 190 | .matches = { |
| 447 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 191 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
| 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), | 192 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"), |
| 449 | }, | 193 | }, |
| 450 | }, | 194 | }, |
| 195 | |||
| 451 | /* | 196 | /* |
| 452 | * Disable OSI(Linux) warnings on all "Hewlett-Packard" | 197 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
| 453 | * | 198 | * Linux ignores it, except for the machines enumerated below. |
| 454 | * _OSI(Linux) confirmed to be a NOP: | ||
| 455 | * .ident = "HP Pavilion tx 1000" | ||
| 456 | * DMI_MATCH(DMI_BOARD_NAME, "30BF"), | ||
| 457 | * .ident = "HP Pavilion dv2000" | ||
| 458 | * DMI_MATCH(DMI_BOARD_NAME, "30B5"), | ||
| 459 | * .ident = "HP Pavilion dv5000", | ||
| 460 | * DMI_MATCH(DMI_BOARD_NAME, "30A7"), | ||
| 461 | * .ident = "HP Pavilion dv6300 30BC", | ||
| 462 | * DMI_MATCH(DMI_BOARD_NAME, "30BC"), | ||
| 463 | * .ident = "HP Pavilion dv6000", | ||
| 464 | * DMI_MATCH(DMI_BOARD_NAME, "30B7"), | ||
| 465 | * DMI_MATCH(DMI_BOARD_NAME, "30B8"), | ||
| 466 | * .ident = "HP Pavilion dv9000", | ||
| 467 | * DMI_MATCH(DMI_BOARD_NAME, "30B9"), | ||
| 468 | * .ident = "HP Pavilion dv9500", | ||
| 469 | * DMI_MATCH(DMI_BOARD_NAME, "30CB"), | ||
| 470 | * .ident = "HP/Compaq Presario C500", | ||
| 471 | * DMI_MATCH(DMI_BOARD_NAME, "30C6"), | ||
| 472 | * .ident = "HP/Compaq Presario F500", | ||
| 473 | * DMI_MATCH(DMI_BOARD_NAME, "30D3"), | ||
| 474 | * _OSI(Linux) unknown effect: | ||
| 475 | * .ident = "HP Pavilion dv6500", | ||
| 476 | * DMI_MATCH(DMI_BOARD_NAME, "30D0"), | ||
| 477 | */ | 199 | */ |
| 478 | { | 200 | |
| 479 | .callback = dmi_disable_osi_linux, | ||
| 480 | .ident = "Hewlett-Packard", | ||
| 481 | .matches = { | ||
| 482 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 483 | }, | ||
| 484 | }, | ||
| 485 | /* | 201 | /* |
| 486 | * Lenovo has a mix of systems OSI(Linux) situations | 202 | * Lenovo has a mix of systems OSI(Linux) situations |
| 487 | * and thus we can not wildcard the vendor. | 203 | * and thus we can not wildcard the vendor. |
| @@ -519,113 +235,6 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
| 519 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"), | 235 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X61"), |
| 520 | }, | 236 | }, |
| 521 | }, | 237 | }, |
| 522 | { | ||
| 523 | .callback = dmi_disable_osi_linux, | ||
| 524 | .ident = "Lenovo 3000 V100", | ||
| 525 | .matches = { | ||
| 526 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 527 | DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"), | ||
| 528 | }, | ||
| 529 | }, | ||
| 530 | { | ||
| 531 | .callback = dmi_disable_osi_linux, | ||
| 532 | .ident = "Lenovo 3000 N100", | ||
| 533 | .matches = { | ||
| 534 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 535 | DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"), | ||
| 536 | }, | ||
| 537 | }, | ||
| 538 | /* | ||
| 539 | * Disable OSI(Linux) warnings on all "LG Electronics" | ||
| 540 | * | ||
| 541 | * _OSI(Linux) confirmed to be a NOP: | ||
| 542 | * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"), | ||
| 543 | * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), | ||
| 544 | * | ||
| 545 | * unknown: | ||
| 546 | * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"), | ||
| 547 | * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"), | ||
| 548 | */ | ||
| 549 | { | ||
| 550 | .callback = dmi_disable_osi_linux, | ||
| 551 | .ident = "LG", | ||
| 552 | .matches = { | ||
| 553 | DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), | ||
| 554 | }, | ||
| 555 | }, | ||
| 556 | /* NEC - OSI(Linux) effect unknown */ | ||
| 557 | { | ||
| 558 | .callback = dmi_unknown_osi_linux, | ||
| 559 | .ident = "NEC VERSA M360", | ||
| 560 | .matches = { | ||
| 561 | DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"), | ||
| 562 | DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"), | ||
| 563 | }, | ||
| 564 | }, | ||
| 565 | /* Panasonic */ | ||
| 566 | { | ||
| 567 | .callback = dmi_unknown_osi_linux, | ||
| 568 | .ident = "Panasonic", | ||
| 569 | .matches = { | ||
| 570 | DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), | ||
| 571 | /* Toughbook CF-52 */ | ||
| 572 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-52CCABVBG"), | ||
| 573 | }, | ||
| 574 | }, | ||
| 575 | /* | ||
| 576 | * Disable OSI(Linux) warnings on all "Samsung Electronics" | ||
| 577 | * | ||
| 578 | * OSI(Linux) disables PNP0C32 and other BIOS code for Windows: | ||
| 579 | * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"), | ||
| 580 | * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"), | ||
| 581 | */ | ||
| 582 | { | ||
| 583 | .callback = dmi_disable_osi_linux, | ||
| 584 | .ident = "Samsung", | ||
| 585 | .matches = { | ||
| 586 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
| 587 | }, | ||
| 588 | }, | ||
| 589 | /* | ||
| 590 | * Disable OSI(Linux) warnings on all "Sony Corporation" | ||
| 591 | * | ||
| 592 | * _OSI(Linux) is a NOP: | ||
| 593 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NR11S_S"), | ||
| 594 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"), | ||
| 595 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"), | ||
| 596 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"), | ||
| 597 | * _OSI(Linux) unknown effect: | ||
| 598 | * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"), | ||
| 599 | */ | ||
| 600 | { | ||
| 601 | .callback = dmi_disable_osi_linux, | ||
| 602 | .ident = "Sony", | ||
| 603 | .matches = { | ||
| 604 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
| 605 | }, | ||
| 606 | }, | ||
| 607 | /* | ||
| 608 | * Disable OSI(Linux) warnings on all "TOSHIBA" | ||
| 609 | * | ||
| 610 | * _OSI(Linux) breaks sound (bugzilla 7787): | ||
| 611 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"), | ||
| 612 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"), | ||
| 613 | * _OSI(Linux) is a NOP: | ||
| 614 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"), | ||
| 615 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"), | ||
| 616 | * _OSI(Linux) unknown effect: | ||
| 617 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"), | ||
| 618 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"), | ||
| 619 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"), | ||
| 620 | * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"), | ||
| 621 | */ | ||
| 622 | { | ||
| 623 | .callback = dmi_disable_osi_linux, | ||
| 624 | .ident = "Toshiba", | ||
| 625 | .matches = { | ||
| 626 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
| 627 | }, | ||
| 628 | }, | ||
| 629 | {} | 238 | {} |
| 630 | }; | 239 | }; |
| 631 | 240 | ||
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index cf41f9fc24a7..30f3ef236ecb 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -219,7 +219,8 @@ static void gpe_transaction(struct acpi_ec *ec, u8 status) | |||
| 219 | goto unlock; | 219 | goto unlock; |
| 220 | err: | 220 | err: |
| 221 | /* false interrupt, state didn't change */ | 221 | /* false interrupt, state didn't change */ |
| 222 | ++ec->curr->irq_count; | 222 | if (in_interrupt()) |
| 223 | ++ec->curr->irq_count; | ||
| 223 | unlock: | 224 | unlock: |
| 224 | spin_unlock_irqrestore(&ec->curr_lock, flags); | 225 | spin_unlock_irqrestore(&ec->curr_lock, flags); |
| 225 | } | 226 | } |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 4be252145cb4..c8111424dcb8 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
| 36 | #include <linux/kmod.h> | 36 | #include <linux/kmod.h> |
| 37 | #include <linux/delay.h> | 37 | #include <linux/delay.h> |
| 38 | #include <linux/dmi.h> | ||
| 39 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
| 40 | #include <linux/nmi.h> | 39 | #include <linux/nmi.h> |
| 41 | #include <linux/acpi.h> | 40 | #include <linux/acpi.h> |
| @@ -97,54 +96,44 @@ static DEFINE_SPINLOCK(acpi_res_lock); | |||
| 97 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; | 96 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; |
| 98 | 97 | ||
| 99 | /* | 98 | /* |
| 100 | * "Ode to _OSI(Linux)" | 99 | * The story of _OSI(Linux) |
| 101 | * | 100 | * |
| 102 | * osi_linux -- Control response to BIOS _OSI(Linux) query. | 101 | * From pre-history through Linux-2.6.22, |
| 102 | * Linux responded TRUE upon a BIOS OSI(Linux) query. | ||
| 103 | * | 103 | * |
| 104 | * As Linux evolves, the features that it supports change. | 104 | * Unfortunately, reference BIOS writers got wind of this |
| 105 | * So an OSI string such as "Linux" is not specific enough | 105 | * and put OSI(Linux) in their example code, quickly exposing |
| 106 | * to be useful across multiple versions of Linux. It | 106 | * this string as ill-conceived and opening the door to |
| 107 | * doesn't identify any particular feature, interface, | 107 | * an un-bounded number of BIOS incompatibilities. |
| 108 | * or even any particular version of Linux... | ||
| 109 | * | 108 | * |
| 110 | * Unfortunately, Linux-2.6.22 and earlier responded "yes" | 109 | * For example, OSI(Linux) was used on resume to re-POST a |
| 111 | * to a BIOS _OSI(Linux) query. When | 110 | * video card on one system, because Linux at that time |
| 112 | * a reference mobile BIOS started using it, its use | 111 | * could not do a speedy restore in its native driver. |
| 113 | * started to spread to many vendor platforms. | 112 | * But then upon gaining quick native restore capability, |
| 114 | * As it is not supportable, we need to halt that spread. | 113 | * Linux has no way to tell the BIOS to skip the time-consuming |
| 114 | * POST -- putting Linux at a permanent performance disadvantage. | ||
| 115 | * On another system, the BIOS writer used OSI(Linux) | ||
| 116 | * to infer native OS support for IPMI! On other systems, | ||
| 117 | * OSI(Linux) simply got in the way of Linux claiming to | ||
| 118 | * be compatible with other operating systems, exposing | ||
| 119 | * BIOS issues such as skipped device initialization. | ||
| 115 | * | 120 | * |
| 116 | * Today, most BIOS references to _OSI(Linux) are noise -- | 121 | * So "Linux" turned out to be a really poor chose of |
| 117 | * they have no functional effect and are just dead code | 122 | * OSI string, and from Linux-2.6.23 onward we respond FALSE. |
| 118 | * carried over from the reference BIOS. | ||
| 119 | * | ||
| 120 | * The next most common case is that _OSI(Linux) harms Linux, | ||
| 121 | * usually by causing the BIOS to follow paths that are | ||
| 122 | * not tested during Windows validation. | ||
| 123 | * | ||
| 124 | * Finally, there is a short list of platforms | ||
| 125 | * where OSI(Linux) benefits Linux. | ||
| 126 | * | ||
| 127 | * In Linux-2.6.23, OSI(Linux) is first disabled by default. | ||
| 128 | * DMI is used to disable the dmesg warning about OSI(Linux) | ||
| 129 | * on platforms where it is known to have no effect. | ||
| 130 | * But a dmesg warning remains for systems where | ||
| 131 | * we do not know if OSI(Linux) is good or bad for the system. | ||
| 132 | * DMI is also used to enable OSI(Linux) for the machines | ||
| 133 | * that are known to need it. | ||
| 134 | * | 123 | * |
| 135 | * BIOS writers should NOT query _OSI(Linux) on future systems. | 124 | * BIOS writers should NOT query _OSI(Linux) on future systems. |
| 136 | * It will be ignored by default, and to get Linux to | 125 | * Linux will complain on the console when it sees it, and return FALSE. |
| 137 | * not ignore it will require a kernel source update to | 126 | * To get Linux to return TRUE for your system will require |
| 138 | * add a DMI entry, or a boot-time "acpi_osi=Linux" invocation. | 127 | * a kernel source update to add a DMI entry, |
| 128 | * or boot with "acpi_osi=Linux" | ||
| 139 | */ | 129 | */ |
| 140 | #define OSI_LINUX_ENABLE 0 | ||
| 141 | 130 | ||
| 142 | static struct osi_linux { | 131 | static struct osi_linux { |
| 143 | unsigned int enable:1; | 132 | unsigned int enable:1; |
| 144 | unsigned int dmi:1; | 133 | unsigned int dmi:1; |
| 145 | unsigned int cmdline:1; | 134 | unsigned int cmdline:1; |
| 146 | unsigned int known:1; | 135 | unsigned int known:1; |
| 147 | } osi_linux = { OSI_LINUX_ENABLE, 0, 0, 0}; | 136 | } osi_linux = { 0, 0, 0, 0}; |
| 148 | 137 | ||
| 149 | static void __init acpi_request_region (struct acpi_generic_address *addr, | 138 | static void __init acpi_request_region (struct acpi_generic_address *addr, |
| 150 | unsigned int length, char *desc) | 139 | unsigned int length, char *desc) |
| @@ -1296,34 +1285,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) | |||
| 1296 | return (AE_OK); | 1285 | return (AE_OK); |
| 1297 | } | 1286 | } |
| 1298 | 1287 | ||
| 1299 | /** | ||
| 1300 | * acpi_dmi_dump - dump DMI slots needed for blacklist entry | ||
| 1301 | * | ||
| 1302 | * Returns 0 on success | ||
| 1303 | */ | ||
| 1304 | static int acpi_dmi_dump(void) | ||
| 1305 | { | ||
| 1306 | |||
| 1307 | if (!dmi_available) | ||
| 1308 | return -1; | ||
| 1309 | |||
| 1310 | printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n", | ||
| 1311 | dmi_get_system_info(DMI_SYS_VENDOR)); | ||
| 1312 | printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n", | ||
| 1313 | dmi_get_system_info(DMI_PRODUCT_NAME)); | ||
| 1314 | printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n", | ||
| 1315 | dmi_get_system_info(DMI_PRODUCT_VERSION)); | ||
| 1316 | printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n", | ||
| 1317 | dmi_get_system_info(DMI_BOARD_NAME)); | ||
| 1318 | printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n", | ||
| 1319 | dmi_get_system_info(DMI_BIOS_VENDOR)); | ||
| 1320 | printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n", | ||
| 1321 | dmi_get_system_info(DMI_BIOS_DATE)); | ||
| 1322 | |||
| 1323 | return 0; | ||
| 1324 | } | ||
| 1325 | |||
| 1326 | |||
| 1327 | /****************************************************************************** | 1288 | /****************************************************************************** |
| 1328 | * | 1289 | * |
| 1329 | * FUNCTION: acpi_os_validate_interface | 1290 | * FUNCTION: acpi_os_validate_interface |
| @@ -1350,21 +1311,6 @@ acpi_os_validate_interface (char *interface) | |||
| 1350 | osi_linux.cmdline ? " via cmdline" : | 1311 | osi_linux.cmdline ? " via cmdline" : |
| 1351 | osi_linux.dmi ? " via DMI" : ""); | 1312 | osi_linux.dmi ? " via DMI" : ""); |
| 1352 | 1313 | ||
| 1353 | if (!osi_linux.dmi) { | ||
| 1354 | if (acpi_dmi_dump()) | ||
| 1355 | printk(KERN_NOTICE PREFIX | ||
| 1356 | "[please extract dmidecode output]\n"); | ||
| 1357 | printk(KERN_NOTICE PREFIX | ||
| 1358 | "Please send DMI info above to " | ||
| 1359 | "linux-acpi@vger.kernel.org\n"); | ||
| 1360 | } | ||
| 1361 | if (!osi_linux.known && !osi_linux.cmdline) { | ||
| 1362 | printk(KERN_NOTICE PREFIX | ||
| 1363 | "If \"acpi_osi=%sLinux\" works better, " | ||
| 1364 | "please notify linux-acpi@vger.kernel.org\n", | ||
| 1365 | osi_linux.enable ? "!" : ""); | ||
| 1366 | } | ||
| 1367 | |||
| 1368 | if (osi_linux.enable) | 1314 | if (osi_linux.enable) |
| 1369 | return AE_OK; | 1315 | return AE_OK; |
| 1370 | } | 1316 | } |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index bd5253ee5c85..39b7233c3485 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -751,16 +751,6 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device) | |||
| 751 | if (!acpi_match_device_ids(device, button_device_ids)) | 751 | if (!acpi_match_device_ids(device, button_device_ids)) |
| 752 | device->wakeup.flags.run_wake = 1; | 752 | device->wakeup.flags.run_wake = 1; |
| 753 | 753 | ||
| 754 | /* | ||
| 755 | * Don't set Power button GPE as run_wake | ||
| 756 | * if Fixed Power button is used | ||
| 757 | */ | ||
| 758 | if (!strcmp(device->pnp.hardware_id, "PNP0C0C") && | ||
| 759 | !(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) { | ||
| 760 | device->wakeup.flags.run_wake = 0; | ||
| 761 | device->wakeup.flags.valid = 0; | ||
| 762 | } | ||
| 763 | |||
| 764 | end: | 754 | end: |
| 765 | if (ACPI_FAILURE(status)) | 755 | if (ACPI_FAILURE(status)) |
| 766 | device->flags.wake_capable = 0; | 756 | device->flags.wake_capable = 0; |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index 80c0868d0480..28a691cc625e 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
| @@ -90,6 +90,18 @@ void __init acpi_old_suspend_ordering(void) | |||
| 90 | old_suspend_ordering = true; | 90 | old_suspend_ordering = true; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | /* | ||
| 94 | * According to the ACPI specification the BIOS should make sure that ACPI is | ||
| 95 | * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still, | ||
| 96 | * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI | ||
| 97 | * on such systems during resume. Unfortunately that doesn't help in | ||
| 98 | * particularly pathological cases in which SCI_EN has to be set directly on | ||
| 99 | * resume, although the specification states very clearly that this flag is | ||
| 100 | * owned by the hardware. The set_sci_en_on_resume variable will be set in such | ||
| 101 | * cases. | ||
| 102 | */ | ||
| 103 | static bool set_sci_en_on_resume; | ||
| 104 | |||
| 93 | /** | 105 | /** |
| 94 | * acpi_pm_disable_gpes - Disable the GPEs. | 106 | * acpi_pm_disable_gpes - Disable the GPEs. |
| 95 | */ | 107 | */ |
| @@ -235,7 +247,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state) | |||
| 235 | } | 247 | } |
| 236 | 248 | ||
| 237 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ | 249 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ |
| 238 | acpi_enable(); | 250 | if (set_sci_en_on_resume) |
| 251 | acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1); | ||
| 252 | else | ||
| 253 | acpi_enable(); | ||
| 254 | |||
| 239 | /* Reprogram control registers and execute _BFS */ | 255 | /* Reprogram control registers and execute _BFS */ |
| 240 | acpi_leave_sleep_state_prep(acpi_state); | 256 | acpi_leave_sleep_state_prep(acpi_state); |
| 241 | 257 | ||
| @@ -323,6 +339,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) | |||
| 323 | return 0; | 339 | return 0; |
| 324 | } | 340 | } |
| 325 | 341 | ||
| 342 | static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d) | ||
| 343 | { | ||
| 344 | set_sci_en_on_resume = true; | ||
| 345 | return 0; | ||
| 346 | } | ||
| 347 | |||
| 326 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | 348 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
| 327 | { | 349 | { |
| 328 | .callback = init_old_suspend_ordering, | 350 | .callback = init_old_suspend_ordering, |
| @@ -340,6 +362,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 340 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), | 362 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), |
| 341 | }, | 363 | }, |
| 342 | }, | 364 | }, |
| 365 | { | ||
| 366 | .callback = init_set_sci_en_on_resume, | ||
| 367 | .ident = "Apple MacBook 1,1", | ||
| 368 | .matches = { | ||
| 369 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
| 370 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
| 371 | }, | ||
| 372 | }, | ||
| 373 | { | ||
| 374 | .callback = init_set_sci_en_on_resume, | ||
| 375 | .ident = "Apple MacMini 1,1", | ||
| 376 | .matches = { | ||
| 377 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
| 378 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), | ||
| 379 | }, | ||
| 380 | }, | ||
| 343 | {}, | 381 | {}, |
| 344 | }; | 382 | }; |
| 345 | #endif /* CONFIG_SUSPEND */ | 383 | #endif /* CONFIG_SUSPEND */ |
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c index 66aac06f2ac5..25f531d892de 100644 --- a/drivers/acpi/toshiba_acpi.c +++ b/drivers/acpi/toshiba_acpi.c | |||
| @@ -848,8 +848,6 @@ static int __init toshiba_acpi_init(void) | |||
| 848 | ret = input_register_polled_device(toshiba_acpi.poll_dev); | 848 | ret = input_register_polled_device(toshiba_acpi.poll_dev); |
| 849 | if (ret) { | 849 | if (ret) { |
| 850 | printk(MY_ERR "unable to register kill-switch input device\n"); | 850 | printk(MY_ERR "unable to register kill-switch input device\n"); |
| 851 | rfkill_free(toshiba_acpi.rfk_dev); | ||
| 852 | toshiba_acpi.rfk_dev = NULL; | ||
| 853 | toshiba_acpi_exit(); | 851 | toshiba_acpi_exit(); |
| 854 | return ret; | 852 | return ret; |
| 855 | } | 853 | } |
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index e827be36ee8d..f844941089bb 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c | |||
| @@ -259,34 +259,26 @@ acpi_evaluate_integer(acpi_handle handle, | |||
| 259 | struct acpi_object_list *arguments, unsigned long long *data) | 259 | struct acpi_object_list *arguments, unsigned long long *data) |
| 260 | { | 260 | { |
| 261 | acpi_status status = AE_OK; | 261 | acpi_status status = AE_OK; |
| 262 | union acpi_object *element; | 262 | union acpi_object element; |
| 263 | struct acpi_buffer buffer = { 0, NULL }; | 263 | struct acpi_buffer buffer = { 0, NULL }; |
| 264 | 264 | ||
| 265 | |||
| 266 | if (!data) | 265 | if (!data) |
| 267 | return AE_BAD_PARAMETER; | 266 | return AE_BAD_PARAMETER; |
| 268 | 267 | ||
| 269 | element = kzalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL); | ||
| 270 | if (!element) | ||
| 271 | return AE_NO_MEMORY; | ||
| 272 | |||
| 273 | buffer.length = sizeof(union acpi_object); | 268 | buffer.length = sizeof(union acpi_object); |
| 274 | buffer.pointer = element; | 269 | buffer.pointer = &element; |
| 275 | status = acpi_evaluate_object(handle, pathname, arguments, &buffer); | 270 | status = acpi_evaluate_object(handle, pathname, arguments, &buffer); |
| 276 | if (ACPI_FAILURE(status)) { | 271 | if (ACPI_FAILURE(status)) { |
| 277 | acpi_util_eval_error(handle, pathname, status); | 272 | acpi_util_eval_error(handle, pathname, status); |
| 278 | kfree(element); | ||
| 279 | return status; | 273 | return status; |
| 280 | } | 274 | } |
| 281 | 275 | ||
| 282 | if (element->type != ACPI_TYPE_INTEGER) { | 276 | if (element.type != ACPI_TYPE_INTEGER) { |
| 283 | acpi_util_eval_error(handle, pathname, AE_BAD_DATA); | 277 | acpi_util_eval_error(handle, pathname, AE_BAD_DATA); |
| 284 | kfree(element); | ||
| 285 | return AE_BAD_DATA; | 278 | return AE_BAD_DATA; |
| 286 | } | 279 | } |
| 287 | 280 | ||
| 288 | *data = element->integer.value; | 281 | *data = element.integer.value; |
| 289 | kfree(element); | ||
| 290 | 282 | ||
| 291 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); | 283 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data)); |
| 292 | 284 | ||
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 8e37be19bbf5..d6d97d8f3fa4 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -1066,6 +1066,21 @@ static int piix_broken_suspend(void) | |||
| 1066 | if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL)) | 1066 | if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL)) |
| 1067 | return 1; | 1067 | return 1; |
| 1068 | 1068 | ||
| 1069 | /* TECRA M4 sometimes forgets its identify and reports bogus | ||
| 1070 | * DMI information. As the bogus information is a bit | ||
| 1071 | * generic, match as many entries as possible. This manual | ||
| 1072 | * matching is necessary because dmi_system_id.matches is | ||
| 1073 | * limited to four entries. | ||
| 1074 | */ | ||
| 1075 | if (!strcmp(dmi_get_system_info(DMI_SYS_VENDOR), "TOSHIBA") && | ||
| 1076 | !strcmp(dmi_get_system_info(DMI_PRODUCT_NAME), "000000") && | ||
| 1077 | !strcmp(dmi_get_system_info(DMI_PRODUCT_VERSION), "000000") && | ||
| 1078 | !strcmp(dmi_get_system_info(DMI_PRODUCT_SERIAL), "000000") && | ||
| 1079 | !strcmp(dmi_get_system_info(DMI_BOARD_VENDOR), "TOSHIBA") && | ||
| 1080 | !strcmp(dmi_get_system_info(DMI_BOARD_NAME), "Portable PC") && | ||
| 1081 | !strcmp(dmi_get_system_info(DMI_BOARD_VERSION), "Version A0")) | ||
| 1082 | return 1; | ||
| 1083 | |||
| 1069 | return 0; | 1084 | return 0; |
| 1070 | } | 1085 | } |
| 1071 | 1086 | ||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 4214bfb13bbd..5e2eb740df46 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -2492,6 +2492,13 @@ int ata_dev_configure(struct ata_device *dev) | |||
| 2492 | } | 2492 | } |
| 2493 | } | 2493 | } |
| 2494 | 2494 | ||
| 2495 | if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) { | ||
| 2496 | ata_dev_printk(dev, KERN_WARNING, "WARNING: device requires " | ||
| 2497 | "firmware update to be fully functional.\n"); | ||
| 2498 | ata_dev_printk(dev, KERN_WARNING, " contact the vendor " | ||
| 2499 | "or visit http://ata.wiki.kernel.org.\n"); | ||
| 2500 | } | ||
| 2501 | |||
| 2495 | return 0; | 2502 | return 0; |
| 2496 | 2503 | ||
| 2497 | err_out_nosup: | 2504 | err_out_nosup: |
| @@ -4042,6 +4049,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4042 | { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, | 4049 | { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, |
| 4043 | { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, | 4050 | { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, |
| 4044 | 4051 | ||
| 4052 | /* Seagate NCQ + FLUSH CACHE firmware bug */ | ||
| 4053 | { "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ | | ||
| 4054 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
| 4055 | { "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ | | ||
| 4056 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
| 4057 | { "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ | | ||
| 4058 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
| 4059 | { "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ | | ||
| 4060 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
| 4061 | { "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ | | ||
| 4062 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
| 4063 | { "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ | | ||
| 4064 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
| 4065 | |||
| 4045 | /* Blacklist entries taken from Silicon Image 3124/3132 | 4066 | /* Blacklist entries taken from Silicon Image 3124/3132 |
| 4046 | Windows driver .inf file - also several Linux problem reports */ | 4067 | Windows driver .inf file - also several Linux problem reports */ |
| 4047 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, | 4068 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, |
diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c index f8b3ffc8ae9e..c2e6fb9f2ef9 100644 --- a/drivers/ata/pata_rb532_cf.c +++ b/drivers/ata/pata_rb532_cf.c | |||
| @@ -39,9 +39,11 @@ | |||
| 39 | #define RB500_CF_MAXPORTS 1 | 39 | #define RB500_CF_MAXPORTS 1 |
| 40 | #define RB500_CF_IO_DELAY 400 | 40 | #define RB500_CF_IO_DELAY 400 |
| 41 | 41 | ||
| 42 | #define RB500_CF_REG_CMD 0x0800 | 42 | #define RB500_CF_REG_BASE 0x0800 |
| 43 | #define RB500_CF_REG_ERR 0x080D | ||
| 43 | #define RB500_CF_REG_CTRL 0x080E | 44 | #define RB500_CF_REG_CTRL 0x080E |
| 44 | #define RB500_CF_REG_DATA 0x0C00 | 45 | /* 32bit buffered data register offset */ |
| 46 | #define RB500_CF_REG_DBUF32 0x0C00 | ||
| 45 | 47 | ||
| 46 | struct rb532_cf_info { | 48 | struct rb532_cf_info { |
| 47 | void __iomem *iobase; | 49 | void __iomem *iobase; |
| @@ -72,11 +74,12 @@ static void rb532_pata_exec_command(struct ata_port *ap, | |||
| 72 | rb532_pata_finish_io(ap); | 74 | rb532_pata_finish_io(ap); |
| 73 | } | 75 | } |
| 74 | 76 | ||
| 75 | static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, | 77 | static unsigned int rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, |
| 76 | unsigned int buflen, int write_data) | 78 | unsigned int buflen, int write_data) |
| 77 | { | 79 | { |
| 78 | struct ata_port *ap = adev->link->ap; | 80 | struct ata_port *ap = adev->link->ap; |
| 79 | void __iomem *ioaddr = ap->ioaddr.data_addr; | 81 | void __iomem *ioaddr = ap->ioaddr.data_addr; |
| 82 | int retlen = buflen; | ||
| 80 | 83 | ||
| 81 | if (write_data) { | 84 | if (write_data) { |
| 82 | for (; buflen > 0; buflen--, buf++) | 85 | for (; buflen > 0; buflen--, buf++) |
| @@ -87,6 +90,7 @@ static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, | |||
| 87 | } | 90 | } |
| 88 | 91 | ||
| 89 | rb532_pata_finish_io(adev->link->ap); | 92 | rb532_pata_finish_io(adev->link->ap); |
| 93 | return retlen; | ||
| 90 | } | 94 | } |
| 91 | 95 | ||
| 92 | static void rb532_pata_freeze(struct ata_port *ap) | 96 | static void rb532_pata_freeze(struct ata_port *ap) |
| @@ -146,13 +150,14 @@ static void rb532_pata_setup_ports(struct ata_host *ah) | |||
| 146 | ap->pio_mask = 0x1f; /* PIO4 */ | 150 | ap->pio_mask = 0x1f; /* PIO4 */ |
| 147 | ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; | 151 | ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; |
| 148 | 152 | ||
| 149 | ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD; | 153 | ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE; |
| 150 | ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; | 154 | ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; |
| 151 | ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; | 155 | ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; |
| 152 | 156 | ||
| 153 | ata_sff_std_ports(&ap->ioaddr); | 157 | ata_sff_std_ports(&ap->ioaddr); |
| 154 | 158 | ||
| 155 | ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; | 159 | ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DBUF32; |
| 160 | ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR; | ||
| 156 | } | 161 | } |
| 157 | 162 | ||
| 158 | static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) | 163 | static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) |
diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index ecab9e67d47a..29e1dfafb7c6 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c | |||
| @@ -194,7 +194,7 @@ struct ace_device { | |||
| 194 | int in_irq; | 194 | int in_irq; |
| 195 | 195 | ||
| 196 | /* Details of hardware device */ | 196 | /* Details of hardware device */ |
| 197 | unsigned long physaddr; | 197 | resource_size_t physaddr; |
| 198 | void __iomem *baseaddr; | 198 | void __iomem *baseaddr; |
| 199 | int irq; | 199 | int irq; |
| 200 | int bus_width; /* 0 := 8 bit; 1 := 16 bit */ | 200 | int bus_width; /* 0 := 8 bit; 1 := 16 bit */ |
| @@ -628,8 +628,8 @@ static void ace_fsm_dostate(struct ace_device *ace) | |||
| 628 | 628 | ||
| 629 | /* Okay, it's a data request, set it up for transfer */ | 629 | /* Okay, it's a data request, set it up for transfer */ |
| 630 | dev_dbg(ace->dev, | 630 | dev_dbg(ace->dev, |
| 631 | "request: sec=%lx hcnt=%lx, ccnt=%x, dir=%i\n", | 631 | "request: sec=%llx hcnt=%lx, ccnt=%x, dir=%i\n", |
| 632 | req->sector, req->hard_nr_sectors, | 632 | (unsigned long long) req->sector, req->hard_nr_sectors, |
| 633 | req->current_nr_sectors, rq_data_dir(req)); | 633 | req->current_nr_sectors, rq_data_dir(req)); |
| 634 | 634 | ||
| 635 | ace->req = req; | 635 | ace->req = req; |
| @@ -935,7 +935,8 @@ static int __devinit ace_setup(struct ace_device *ace) | |||
| 935 | int rc; | 935 | int rc; |
| 936 | 936 | ||
| 937 | dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); | 937 | dev_dbg(ace->dev, "ace_setup(ace=0x%p)\n", ace); |
| 938 | dev_dbg(ace->dev, "physaddr=0x%lx irq=%i\n", ace->physaddr, ace->irq); | 938 | dev_dbg(ace->dev, "physaddr=0x%llx irq=%i\n", |
| 939 | (unsigned long long)ace->physaddr, ace->irq); | ||
| 939 | 940 | ||
| 940 | spin_lock_init(&ace->lock); | 941 | spin_lock_init(&ace->lock); |
| 941 | init_completion(&ace->id_completion); | 942 | init_completion(&ace->id_completion); |
| @@ -1017,8 +1018,8 @@ static int __devinit ace_setup(struct ace_device *ace) | |||
| 1017 | /* Print the identification */ | 1018 | /* Print the identification */ |
| 1018 | dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", | 1019 | dev_info(ace->dev, "Xilinx SystemACE revision %i.%i.%i\n", |
| 1019 | (version >> 12) & 0xf, (version >> 8) & 0x0f, version & 0xff); | 1020 | (version >> 12) & 0xf, (version >> 8) & 0x0f, version & 0xff); |
| 1020 | dev_dbg(ace->dev, "physaddr 0x%lx, mapped to 0x%p, irq=%i\n", | 1021 | dev_dbg(ace->dev, "physaddr 0x%llx, mapped to 0x%p, irq=%i\n", |
| 1021 | ace->physaddr, ace->baseaddr, ace->irq); | 1022 | (unsigned long long) ace->physaddr, ace->baseaddr, ace->irq); |
| 1022 | 1023 | ||
| 1023 | ace->media_change = 1; | 1024 | ace->media_change = 1; |
| 1024 | ace_revalidate_disk(ace->gd); | 1025 | ace_revalidate_disk(ace->gd); |
| @@ -1035,8 +1036,8 @@ err_alloc_disk: | |||
| 1035 | err_blk_initq: | 1036 | err_blk_initq: |
| 1036 | iounmap(ace->baseaddr); | 1037 | iounmap(ace->baseaddr); |
| 1037 | err_ioremap: | 1038 | err_ioremap: |
| 1038 | dev_info(ace->dev, "xsysace: error initializing device at 0x%lx\n", | 1039 | dev_info(ace->dev, "xsysace: error initializing device at 0x%llx\n", |
| 1039 | ace->physaddr); | 1040 | (unsigned long long) ace->physaddr); |
| 1040 | return -ENOMEM; | 1041 | return -ENOMEM; |
| 1041 | } | 1042 | } |
| 1042 | 1043 | ||
| @@ -1059,7 +1060,7 @@ static void __devexit ace_teardown(struct ace_device *ace) | |||
| 1059 | } | 1060 | } |
| 1060 | 1061 | ||
| 1061 | static int __devinit | 1062 | static int __devinit |
| 1062 | ace_alloc(struct device *dev, int id, unsigned long physaddr, | 1063 | ace_alloc(struct device *dev, int id, resource_size_t physaddr, |
| 1063 | int irq, int bus_width) | 1064 | int irq, int bus_width) |
| 1064 | { | 1065 | { |
| 1065 | struct ace_device *ace; | 1066 | struct ace_device *ace; |
| @@ -1119,7 +1120,7 @@ static void __devexit ace_free(struct device *dev) | |||
| 1119 | 1120 | ||
| 1120 | static int __devinit ace_probe(struct platform_device *dev) | 1121 | static int __devinit ace_probe(struct platform_device *dev) |
| 1121 | { | 1122 | { |
| 1122 | unsigned long physaddr = 0; | 1123 | resource_size_t physaddr = 0; |
| 1123 | int bus_width = ACE_BUS_WIDTH_16; /* FIXME: should not be hard coded */ | 1124 | int bus_width = ACE_BUS_WIDTH_16; /* FIXME: should not be hard coded */ |
| 1124 | int id = dev->id; | 1125 | int id = dev->id; |
| 1125 | int irq = NO_IRQ; | 1126 | int irq = NO_IRQ; |
| @@ -1165,7 +1166,7 @@ static int __devinit | |||
| 1165 | ace_of_probe(struct of_device *op, const struct of_device_id *match) | 1166 | ace_of_probe(struct of_device *op, const struct of_device_id *match) |
| 1166 | { | 1167 | { |
| 1167 | struct resource res; | 1168 | struct resource res; |
| 1168 | unsigned long physaddr; | 1169 | resource_size_t physaddr; |
| 1169 | const u32 *id; | 1170 | const u32 *id; |
| 1170 | int irq, bus_width, rc; | 1171 | int irq, bus_width, rc; |
| 1171 | 1172 | ||
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c index 0f004b65ec03..03f95ec08f59 100644 --- a/drivers/char/agp/uninorth-agp.c +++ b/drivers/char/agp/uninorth-agp.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | static int uninorth_rev; | 27 | static int uninorth_rev; |
| 28 | static int is_u3; | 28 | static int is_u3; |
| 29 | 29 | ||
| 30 | static char __devinitdata *aperture = NULL; | 30 | static char *aperture = NULL; |
| 31 | 31 | ||
| 32 | static int uninorth_fetch_size(void) | 32 | static int uninorth_fetch_size(void) |
| 33 | { | 33 | { |
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 44e5d60f517e..4b10770fa937 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
| @@ -3739,7 +3739,7 @@ static int stli_getbrdnr(void) | |||
| 3739 | * do is go probing around in the usual places hoping we can find it. | 3739 | * do is go probing around in the usual places hoping we can find it. |
| 3740 | */ | 3740 | */ |
| 3741 | 3741 | ||
| 3742 | static int stli_findeisabrds(void) | 3742 | static int __init stli_findeisabrds(void) |
| 3743 | { | 3743 | { |
| 3744 | struct stlibrd *brdp; | 3744 | struct stlibrd *brdp; |
| 3745 | unsigned int iobase, eid, i; | 3745 | unsigned int iobase, eid, i; |
| @@ -3935,7 +3935,7 @@ static struct stlibrd *stli_allocbrd(void) | |||
| 3935 | * can find. | 3935 | * can find. |
| 3936 | */ | 3936 | */ |
| 3937 | 3937 | ||
| 3938 | static int stli_initbrds(void) | 3938 | static int __init stli_initbrds(void) |
| 3939 | { | 3939 | { |
| 3940 | struct stlibrd *brdp, *nxtbrdp; | 3940 | struct stlibrd *brdp, *nxtbrdp; |
| 3941 | struct stlconf conf; | 3941 | struct stlconf conf; |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 59f472143f08..1412a8d1e58d 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -1795,12 +1795,15 @@ retry_open: | |||
| 1795 | } | 1795 | } |
| 1796 | #endif | 1796 | #endif |
| 1797 | if (device == MKDEV(TTYAUX_MAJOR, 1)) { | 1797 | if (device == MKDEV(TTYAUX_MAJOR, 1)) { |
| 1798 | driver = tty_driver_kref_get(console_device(&index)); | 1798 | struct tty_driver *console_driver = console_device(&index); |
| 1799 | if (driver) { | 1799 | if (console_driver) { |
| 1800 | /* Don't let /dev/console block */ | 1800 | driver = tty_driver_kref_get(console_driver); |
| 1801 | filp->f_flags |= O_NONBLOCK; | 1801 | if (driver) { |
| 1802 | noctty = 1; | 1802 | /* Don't let /dev/console block */ |
| 1803 | goto got_driver; | 1803 | filp->f_flags |= O_NONBLOCK; |
| 1804 | noctty = 1; | ||
| 1805 | goto got_driver; | ||
| 1806 | } | ||
| 1804 | } | 1807 | } |
| 1805 | mutex_unlock(&tty_mutex); | 1808 | mutex_unlock(&tty_mutex); |
| 1806 | return -ENODEV; | 1809 | return -ENODEV; |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index ed132fe55d3d..d16131949097 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
| @@ -626,7 +626,7 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
| 626 | if (!request_mem_region(drvdata->mem_start, | 626 | if (!request_mem_region(drvdata->mem_start, |
| 627 | drvdata->mem_size, DRIVER_NAME)) { | 627 | drvdata->mem_size, DRIVER_NAME)) { |
| 628 | dev_err(dev, "Couldn't lock memory region at %Lx\n", | 628 | dev_err(dev, "Couldn't lock memory region at %Lx\n", |
| 629 | regs_res->start); | 629 | (unsigned long long) regs_res->start); |
| 630 | retval = -EBUSY; | 630 | retval = -EBUSY; |
| 631 | goto failed1; | 631 | goto failed1; |
| 632 | } | 632 | } |
| @@ -645,9 +645,10 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
| 645 | mutex_init(&drvdata->sem); | 645 | mutex_init(&drvdata->sem); |
| 646 | drvdata->is_open = 0; | 646 | drvdata->is_open = 0; |
| 647 | 647 | ||
| 648 | dev_info(dev, "ioremap %lx to %p with size %Lx\n", | 648 | dev_info(dev, "ioremap %llx to %p with size %llx\n", |
| 649 | (unsigned long int)drvdata->mem_start, | 649 | (unsigned long long) drvdata->mem_start, |
| 650 | drvdata->base_address, drvdata->mem_size); | 650 | drvdata->base_address, |
| 651 | (unsigned long long) drvdata->mem_size); | ||
| 651 | 652 | ||
| 652 | cdev_init(&drvdata->cdev, &hwicap_fops); | 653 | cdev_init(&drvdata->cdev, &hwicap_fops); |
| 653 | drvdata->cdev.owner = THIS_MODULE; | 654 | drvdata->cdev.owner = THIS_MODULE; |
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index b6ad3ac5916e..24607669a52b 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
| @@ -1357,7 +1357,7 @@ static int hw_supports(struct device *dev, __be32 desc_hdr_template) | |||
| 1357 | return ret; | 1357 | return ret; |
| 1358 | } | 1358 | } |
| 1359 | 1359 | ||
| 1360 | static int __devexit talitos_remove(struct of_device *ofdev) | 1360 | static int talitos_remove(struct of_device *ofdev) |
| 1361 | { | 1361 | { |
| 1362 | struct device *dev = &ofdev->dev; | 1362 | struct device *dev = &ofdev->dev; |
| 1363 | struct talitos_private *priv = dev_get_drvdata(dev); | 1363 | struct talitos_private *priv = dev_get_drvdata(dev); |
| @@ -1622,7 +1622,7 @@ static struct of_platform_driver talitos_driver = { | |||
| 1622 | .name = "talitos", | 1622 | .name = "talitos", |
| 1623 | .match_table = talitos_match, | 1623 | .match_table = talitos_match, |
| 1624 | .probe = talitos_probe, | 1624 | .probe = talitos_probe, |
| 1625 | .remove = __devexit_p(talitos_remove), | 1625 | .remove = talitos_remove, |
| 1626 | }; | 1626 | }; |
| 1627 | 1627 | ||
| 1628 | static int __init talitos_init(void) | 1628 | static int __init talitos_init(void) |
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index e43bdc43a1bf..ebb037b78758 100644 --- a/drivers/edac/i82875p_edac.c +++ b/drivers/edac/i82875p_edac.c | |||
| @@ -182,8 +182,6 @@ static struct pci_dev *mci_pdev; /* init dev: in case that AGP code has | |||
| 182 | * already registered driver | 182 | * already registered driver |
| 183 | */ | 183 | */ |
| 184 | 184 | ||
| 185 | static int i82875p_registered = 1; | ||
| 186 | |||
| 187 | static struct edac_pci_ctl_info *i82875p_pci; | 185 | static struct edac_pci_ctl_info *i82875p_pci; |
| 188 | 186 | ||
| 189 | static void i82875p_get_error_info(struct mem_ctl_info *mci, | 187 | static void i82875p_get_error_info(struct mem_ctl_info *mci, |
| @@ -295,6 +293,7 @@ static int i82875p_setup_overfl_dev(struct pci_dev *pdev, | |||
| 295 | "%s(): pci_bus_add_device() Failed\n", | 293 | "%s(): pci_bus_add_device() Failed\n", |
| 296 | __func__); | 294 | __func__); |
| 297 | } | 295 | } |
| 296 | pci_bus_assign_resources(dev->bus); | ||
| 298 | } | 297 | } |
| 299 | 298 | ||
| 300 | *ovrfl_pdev = dev; | 299 | *ovrfl_pdev = dev; |
| @@ -409,6 +408,9 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
| 409 | goto fail0; | 408 | goto fail0; |
| 410 | } | 409 | } |
| 411 | 410 | ||
| 411 | /* Keeps mci available after edac_mc_del_mc() till edac_mc_free() */ | ||
| 412 | kobject_get(&mci->edac_mci_kobj); | ||
| 413 | |||
| 412 | debugf3("%s(): init mci\n", __func__); | 414 | debugf3("%s(): init mci\n", __func__); |
| 413 | mci->dev = &pdev->dev; | 415 | mci->dev = &pdev->dev; |
| 414 | mci->mtype_cap = MEM_FLAG_DDR; | 416 | mci->mtype_cap = MEM_FLAG_DDR; |
| @@ -451,6 +453,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
| 451 | return 0; | 453 | return 0; |
| 452 | 454 | ||
| 453 | fail1: | 455 | fail1: |
| 456 | kobject_put(&mci->edac_mci_kobj); | ||
| 454 | edac_mc_free(mci); | 457 | edac_mc_free(mci); |
| 455 | 458 | ||
| 456 | fail0: | 459 | fail0: |
| @@ -578,12 +581,11 @@ static void __exit i82875p_exit(void) | |||
| 578 | { | 581 | { |
| 579 | debugf3("%s()\n", __func__); | 582 | debugf3("%s()\n", __func__); |
| 580 | 583 | ||
| 584 | i82875p_remove_one(mci_pdev); | ||
| 585 | pci_dev_put(mci_pdev); | ||
| 586 | |||
| 581 | pci_unregister_driver(&i82875p_driver); | 587 | pci_unregister_driver(&i82875p_driver); |
| 582 | 588 | ||
| 583 | if (!i82875p_registered) { | ||
| 584 | i82875p_remove_one(mci_pdev); | ||
| 585 | pci_dev_put(mci_pdev); | ||
| 586 | } | ||
| 587 | } | 589 | } |
| 588 | 590 | ||
| 589 | module_init(i82875p_init); | 591 | module_init(i82875p_init); |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 97df6dac3a82..e54403ee59e7 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
| @@ -372,6 +372,11 @@ static const struct { | |||
| 372 | }, | 372 | }, |
| 373 | /* iPod mini */ { | 373 | /* iPod mini */ { |
| 374 | .firmware_revision = 0x0a2700, | 374 | .firmware_revision = 0x0a2700, |
| 375 | .model = 0x000022, | ||
| 376 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
| 377 | }, | ||
| 378 | /* iPod mini */ { | ||
| 379 | .firmware_revision = 0x0a2700, | ||
| 375 | .model = 0x000023, | 380 | .model = 0x000023, |
| 376 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 381 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
| 377 | }, | 382 | }, |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 3ab1e9cc4692..996097acb5e7 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
| @@ -305,6 +305,8 @@ static void drm_cleanup(struct drm_device * dev) | |||
| 305 | return; | 305 | return; |
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | drm_vblank_cleanup(dev); | ||
| 309 | |||
| 308 | drm_lastclose(dev); | 310 | drm_lastclose(dev); |
| 309 | 311 | ||
| 310 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && | 312 | if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 15c8dabc3e97..1e787f894b3c 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -94,7 +94,7 @@ static void vblank_disable_fn(unsigned long arg) | |||
| 94 | } | 94 | } |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | static void drm_vblank_cleanup(struct drm_device *dev) | 97 | void drm_vblank_cleanup(struct drm_device *dev) |
| 98 | { | 98 | { |
| 99 | /* Bail if the driver didn't call drm_vblank_init() */ | 99 | /* Bail if the driver didn't call drm_vblank_init() */ |
| 100 | if (dev->num_crtcs == 0) | 100 | if (dev->num_crtcs == 0) |
| @@ -278,8 +278,6 @@ int drm_irq_uninstall(struct drm_device * dev) | |||
| 278 | 278 | ||
| 279 | free_irq(dev->pdev->irq, dev); | 279 | free_irq(dev->pdev->irq, dev); |
| 280 | 280 | ||
| 281 | drm_vblank_cleanup(dev); | ||
| 282 | |||
| 283 | return 0; | 281 | return 0; |
| 284 | } | 282 | } |
| 285 | EXPORT_SYMBOL(drm_irq_uninstall); | 283 | EXPORT_SYMBOL(drm_irq_uninstall); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 0d215e38606a..ba89b42f790a 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -856,6 +856,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 856 | 856 | ||
| 857 | spin_lock_init(&dev_priv->user_irq_lock); | 857 | spin_lock_init(&dev_priv->user_irq_lock); |
| 858 | 858 | ||
| 859 | ret = drm_vblank_init(dev, I915_NUM_PIPE); | ||
| 860 | |||
| 861 | if (ret) { | ||
| 862 | (void) i915_driver_unload(dev); | ||
| 863 | return ret; | ||
| 864 | } | ||
| 865 | |||
| 859 | return ret; | 866 | return ret; |
| 860 | } | 867 | } |
| 861 | 868 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ef1c0b8f8d07..0a4f39b9a0ec 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -47,6 +47,8 @@ enum pipe { | |||
| 47 | PIPE_B, | 47 | PIPE_B, |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | #define I915_NUM_PIPE 2 | ||
| 51 | |||
| 50 | /* Interface history: | 52 | /* Interface history: |
| 51 | * | 53 | * |
| 52 | * 1.1: Original. | 54 | * 1.1: Original. |
| @@ -132,6 +134,7 @@ typedef struct drm_i915_private { | |||
| 132 | int user_irq_refcount; | 134 | int user_irq_refcount; |
| 133 | /** Cached value of IMR to avoid reads in updating the bitfield */ | 135 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
| 134 | u32 irq_mask_reg; | 136 | u32 irq_mask_reg; |
| 137 | u32 pipestat[2]; | ||
| 135 | 138 | ||
| 136 | int tex_lru_log_granularity; | 139 | int tex_lru_log_granularity; |
| 137 | int allow_batchbuffer; | 140 | int allow_batchbuffer; |
| @@ -147,6 +150,7 @@ typedef struct drm_i915_private { | |||
| 147 | u32 saveDSPBCNTR; | 150 | u32 saveDSPBCNTR; |
| 148 | u32 saveDSPARB; | 151 | u32 saveDSPARB; |
| 149 | u32 saveRENDERSTANDBY; | 152 | u32 saveRENDERSTANDBY; |
| 153 | u32 saveHWS; | ||
| 150 | u32 savePIPEACONF; | 154 | u32 savePIPEACONF; |
| 151 | u32 savePIPEBCONF; | 155 | u32 savePIPEBCONF; |
| 152 | u32 savePIPEASRC; | 156 | u32 savePIPEASRC; |
| @@ -446,6 +450,13 @@ extern int i915_vblank_swap(struct drm_device *dev, void *data, | |||
| 446 | struct drm_file *file_priv); | 450 | struct drm_file *file_priv); |
| 447 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); | 451 | extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask); |
| 448 | 452 | ||
| 453 | void | ||
| 454 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | ||
| 455 | |||
| 456 | void | ||
| 457 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); | ||
| 458 | |||
| 459 | |||
| 449 | /* i915_mem.c */ | 460 | /* i915_mem.c */ |
| 450 | extern int i915_mem_alloc(struct drm_device *dev, void *data, | 461 | extern int i915_mem_alloc(struct drm_device *dev, void *data, |
| 451 | struct drm_file *file_priv); | 462 | struct drm_file *file_priv); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 6b4a2bd20640..d58ddef468f8 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | #include "i915_drv.h" | 31 | #include "i915_drv.h" |
| 32 | #include <linux/swap.h> | 32 | #include <linux/swap.h> |
| 33 | 33 | ||
| 34 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) | ||
| 35 | |||
| 34 | static int | 36 | static int |
| 35 | i915_gem_object_set_domain(struct drm_gem_object *obj, | 37 | i915_gem_object_set_domain(struct drm_gem_object *obj, |
| 36 | uint32_t read_domains, | 38 | uint32_t read_domains, |
| @@ -83,20 +85,14 @@ int | |||
| 83 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, | 85 | i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, |
| 84 | struct drm_file *file_priv) | 86 | struct drm_file *file_priv) |
| 85 | { | 87 | { |
| 86 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 87 | struct drm_i915_gem_get_aperture *args = data; | 88 | struct drm_i915_gem_get_aperture *args = data; |
| 88 | struct drm_i915_gem_object *obj_priv; | ||
| 89 | 89 | ||
| 90 | if (!(dev->driver->driver_features & DRIVER_GEM)) | 90 | if (!(dev->driver->driver_features & DRIVER_GEM)) |
| 91 | return -ENODEV; | 91 | return -ENODEV; |
| 92 | 92 | ||
| 93 | args->aper_size = dev->gtt_total; | 93 | args->aper_size = dev->gtt_total; |
| 94 | args->aper_available_size = args->aper_size; | 94 | args->aper_available_size = (args->aper_size - |
| 95 | 95 | atomic_read(&dev->pin_memory)); | |
| 96 | list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) { | ||
| 97 | if (obj_priv->pin_count > 0) | ||
| 98 | args->aper_available_size -= obj_priv->obj->size; | ||
| 99 | } | ||
| 100 | 96 | ||
| 101 | return 0; | 97 | return 0; |
| 102 | } | 98 | } |
| @@ -1870,17 +1866,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, | |||
| 1870 | 1866 | ||
| 1871 | for (i = 0; i < args->buffer_count; i++) { | 1867 | for (i = 0; i < args->buffer_count; i++) { |
| 1872 | struct drm_gem_object *obj = object_list[i]; | 1868 | struct drm_gem_object *obj = object_list[i]; |
| 1873 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 1874 | |||
| 1875 | if (obj_priv->gtt_space == NULL) { | ||
| 1876 | /* We evicted the buffer in the process of validating | ||
| 1877 | * our set of buffers in. We could try to recover by | ||
| 1878 | * kicking them everything out and trying again from | ||
| 1879 | * the start. | ||
| 1880 | */ | ||
| 1881 | ret = -ENOMEM; | ||
| 1882 | goto err; | ||
| 1883 | } | ||
| 1884 | 1869 | ||
| 1885 | /* make sure all previous memory operations have passed */ | 1870 | /* make sure all previous memory operations have passed */ |
| 1886 | ret = i915_gem_object_set_domain(obj, | 1871 | ret = i915_gem_object_set_domain(obj, |
| @@ -2299,29 +2284,52 @@ i915_gem_idle(struct drm_device *dev) | |||
| 2299 | 2284 | ||
| 2300 | i915_gem_retire_requests(dev); | 2285 | i915_gem_retire_requests(dev); |
| 2301 | 2286 | ||
| 2302 | /* Active and flushing should now be empty as we've | 2287 | if (!dev_priv->mm.wedged) { |
| 2303 | * waited for a sequence higher than any pending execbuffer | 2288 | /* Active and flushing should now be empty as we've |
| 2304 | */ | 2289 | * waited for a sequence higher than any pending execbuffer |
| 2305 | BUG_ON(!list_empty(&dev_priv->mm.active_list)); | 2290 | */ |
| 2306 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | 2291 | WARN_ON(!list_empty(&dev_priv->mm.active_list)); |
| 2292 | WARN_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
| 2293 | /* Request should now be empty as we've also waited | ||
| 2294 | * for the last request in the list | ||
| 2295 | */ | ||
| 2296 | WARN_ON(!list_empty(&dev_priv->mm.request_list)); | ||
| 2297 | } | ||
| 2307 | 2298 | ||
| 2308 | /* Request should now be empty as we've also waited | 2299 | /* Empty the active and flushing lists to inactive. If there's |
| 2309 | * for the last request in the list | 2300 | * anything left at this point, it means that we're wedged and |
| 2301 | * nothing good's going to happen by leaving them there. So strip | ||
| 2302 | * the GPU domains and just stuff them onto inactive. | ||
| 2310 | */ | 2303 | */ |
| 2311 | BUG_ON(!list_empty(&dev_priv->mm.request_list)); | 2304 | while (!list_empty(&dev_priv->mm.active_list)) { |
| 2305 | struct drm_i915_gem_object *obj_priv; | ||
| 2306 | |||
| 2307 | obj_priv = list_first_entry(&dev_priv->mm.active_list, | ||
| 2308 | struct drm_i915_gem_object, | ||
| 2309 | list); | ||
| 2310 | obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; | ||
| 2311 | i915_gem_object_move_to_inactive(obj_priv->obj); | ||
| 2312 | } | ||
| 2313 | |||
| 2314 | while (!list_empty(&dev_priv->mm.flushing_list)) { | ||
| 2315 | struct drm_i915_gem_object *obj_priv; | ||
| 2316 | |||
| 2317 | obj_priv = list_first_entry(&dev_priv->mm.flushing_list, | ||
| 2318 | struct drm_i915_gem_object, | ||
| 2319 | list); | ||
| 2320 | obj_priv->obj->write_domain &= ~I915_GEM_GPU_DOMAINS; | ||
| 2321 | i915_gem_object_move_to_inactive(obj_priv->obj); | ||
| 2322 | } | ||
| 2312 | 2323 | ||
| 2313 | /* Move all buffers out of the GTT. */ | 2324 | |
| 2325 | /* Move all inactive buffers out of the GTT. */ | ||
| 2314 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); | 2326 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); |
| 2327 | WARN_ON(!list_empty(&dev_priv->mm.inactive_list)); | ||
| 2315 | if (ret) { | 2328 | if (ret) { |
| 2316 | mutex_unlock(&dev->struct_mutex); | 2329 | mutex_unlock(&dev->struct_mutex); |
| 2317 | return ret; | 2330 | return ret; |
| 2318 | } | 2331 | } |
| 2319 | 2332 | ||
| 2320 | BUG_ON(!list_empty(&dev_priv->mm.active_list)); | ||
| 2321 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
| 2322 | BUG_ON(!list_empty(&dev_priv->mm.inactive_list)); | ||
| 2323 | BUG_ON(!list_empty(&dev_priv->mm.request_list)); | ||
| 2324 | |||
| 2325 | i915_gem_cleanup_ringbuffer(dev); | 2333 | i915_gem_cleanup_ringbuffer(dev); |
| 2326 | mutex_unlock(&dev->struct_mutex); | 2334 | mutex_unlock(&dev->struct_mutex); |
| 2327 | 2335 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 82752d6177a4..69b9a42da95e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -33,11 +33,23 @@ | |||
| 33 | 33 | ||
| 34 | #define MAX_NOPID ((u32)~0) | 34 | #define MAX_NOPID ((u32)~0) |
| 35 | 35 | ||
| 36 | /** These are the interrupts used by the driver */ | 36 | /** |
| 37 | #define I915_INTERRUPT_ENABLE_MASK (I915_USER_INTERRUPT | \ | 37 | * Interrupts that are always left unmasked. |
| 38 | I915_ASLE_INTERRUPT | \ | 38 | * |
| 39 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ | 39 | * Since pipe events are edge-triggered from the PIPESTAT register to IIR, |
| 40 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) | 40 | * we leave them always unmasked in IMR and then control enabling them through |
| 41 | * PIPESTAT alone. | ||
| 42 | */ | ||
| 43 | #define I915_INTERRUPT_ENABLE_FIX (I915_ASLE_INTERRUPT | \ | ||
| 44 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ | ||
| 45 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) | ||
| 46 | |||
| 47 | /** Interrupts that we mask and unmask at runtime. */ | ||
| 48 | #define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT) | ||
| 49 | |||
| 50 | /** These are all of the interrupts used by the driver */ | ||
| 51 | #define I915_INTERRUPT_ENABLE_MASK (I915_INTERRUPT_ENABLE_FIX | \ | ||
| 52 | I915_INTERRUPT_ENABLE_VAR) | ||
| 41 | 53 | ||
| 42 | void | 54 | void |
| 43 | i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) | 55 | i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask) |
| @@ -59,6 +71,41 @@ i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask) | |||
| 59 | } | 71 | } |
| 60 | } | 72 | } |
| 61 | 73 | ||
| 74 | static inline u32 | ||
| 75 | i915_pipestat(int pipe) | ||
| 76 | { | ||
| 77 | if (pipe == 0) | ||
| 78 | return PIPEASTAT; | ||
| 79 | if (pipe == 1) | ||
| 80 | return PIPEBSTAT; | ||
| 81 | BUG(); | ||
| 82 | } | ||
| 83 | |||
| 84 | void | ||
| 85 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | ||
| 86 | { | ||
| 87 | if ((dev_priv->pipestat[pipe] & mask) != mask) { | ||
| 88 | u32 reg = i915_pipestat(pipe); | ||
| 89 | |||
| 90 | dev_priv->pipestat[pipe] |= mask; | ||
| 91 | /* Enable the interrupt, clear any pending status */ | ||
| 92 | I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); | ||
| 93 | (void) I915_READ(reg); | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | void | ||
| 98 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | ||
| 99 | { | ||
| 100 | if ((dev_priv->pipestat[pipe] & mask) != 0) { | ||
| 101 | u32 reg = i915_pipestat(pipe); | ||
| 102 | |||
| 103 | dev_priv->pipestat[pipe] &= ~mask; | ||
| 104 | I915_WRITE(reg, dev_priv->pipestat[pipe]); | ||
| 105 | (void) I915_READ(reg); | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 62 | /** | 109 | /** |
| 63 | * i915_pipe_enabled - check if a pipe is enabled | 110 | * i915_pipe_enabled - check if a pipe is enabled |
| 64 | * @dev: DRM device | 111 | * @dev: DRM device |
| @@ -121,80 +168,102 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
| 121 | { | 168 | { |
| 122 | struct drm_device *dev = (struct drm_device *) arg; | 169 | struct drm_device *dev = (struct drm_device *) arg; |
| 123 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 170 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 124 | u32 iir; | 171 | u32 iir, new_iir; |
| 125 | u32 pipea_stats, pipeb_stats; | 172 | u32 pipea_stats, pipeb_stats; |
| 173 | u32 vblank_status; | ||
| 174 | u32 vblank_enable; | ||
| 126 | int vblank = 0; | 175 | int vblank = 0; |
| 176 | unsigned long irqflags; | ||
| 177 | int irq_received; | ||
| 178 | int ret = IRQ_NONE; | ||
| 127 | 179 | ||
| 128 | atomic_inc(&dev_priv->irq_received); | 180 | atomic_inc(&dev_priv->irq_received); |
| 129 | 181 | ||
| 130 | if (dev->pdev->msi_enabled) | ||
| 131 | I915_WRITE(IMR, ~0); | ||
| 132 | iir = I915_READ(IIR); | 182 | iir = I915_READ(IIR); |
| 133 | 183 | ||
| 134 | if (iir == 0) { | 184 | if (IS_I965G(dev)) { |
| 135 | if (dev->pdev->msi_enabled) { | 185 | vblank_status = I915_START_VBLANK_INTERRUPT_STATUS; |
| 136 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | 186 | vblank_enable = PIPE_START_VBLANK_INTERRUPT_ENABLE; |
| 137 | (void) I915_READ(IMR); | 187 | } else { |
| 138 | } | 188 | vblank_status = I915_VBLANK_INTERRUPT_STATUS; |
| 139 | return IRQ_NONE; | 189 | vblank_enable = I915_VBLANK_INTERRUPT_ENABLE; |
| 140 | } | 190 | } |
| 141 | 191 | ||
| 142 | /* | 192 | for (;;) { |
| 143 | * Clear the PIPE(A|B)STAT regs before the IIR otherwise | 193 | irq_received = iir != 0; |
| 144 | * we may get extra interrupts. | 194 | |
| 145 | */ | 195 | /* Can't rely on pipestat interrupt bit in iir as it might |
| 146 | if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) { | 196 | * have been cleared after the pipestat interrupt was received. |
| 197 | * It doesn't set the bit in iir again, but it still produces | ||
| 198 | * interrupts (for non-MSI). | ||
| 199 | */ | ||
| 200 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | ||
| 147 | pipea_stats = I915_READ(PIPEASTAT); | 201 | pipea_stats = I915_READ(PIPEASTAT); |
| 148 | if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)) | 202 | pipeb_stats = I915_READ(PIPEBSTAT); |
| 149 | pipea_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | 203 | /* |
| 150 | PIPE_VBLANK_INTERRUPT_ENABLE); | 204 | * Clear the PIPE(A|B)STAT regs before the IIR |
| 151 | else if (pipea_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| | 205 | */ |
| 152 | PIPE_VBLANK_INTERRUPT_STATUS)) { | 206 | if (pipea_stats & 0x8000ffff) { |
| 207 | I915_WRITE(PIPEASTAT, pipea_stats); | ||
| 208 | irq_received = 1; | ||
| 209 | } | ||
| 210 | |||
| 211 | if (pipeb_stats & 0x8000ffff) { | ||
| 212 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
| 213 | irq_received = 1; | ||
| 214 | } | ||
| 215 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | ||
| 216 | |||
| 217 | if (!irq_received) | ||
| 218 | break; | ||
| 219 | |||
| 220 | ret = IRQ_HANDLED; | ||
| 221 | |||
| 222 | I915_WRITE(IIR, iir); | ||
| 223 | new_iir = I915_READ(IIR); /* Flush posted writes */ | ||
| 224 | |||
| 225 | if (dev_priv->sarea_priv) | ||
| 226 | dev_priv->sarea_priv->last_dispatch = | ||
| 227 | READ_BREADCRUMB(dev_priv); | ||
| 228 | |||
| 229 | if (iir & I915_USER_INTERRUPT) { | ||
| 230 | dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); | ||
| 231 | DRM_WAKEUP(&dev_priv->irq_queue); | ||
| 232 | } | ||
| 233 | |||
| 234 | if (pipea_stats & vblank_status) { | ||
| 153 | vblank++; | 235 | vblank++; |
| 154 | drm_handle_vblank(dev, 0); | 236 | drm_handle_vblank(dev, 0); |
| 155 | } | 237 | } |
| 156 | 238 | ||
| 157 | I915_WRITE(PIPEASTAT, pipea_stats); | 239 | if (pipeb_stats & vblank_status) { |
| 158 | } | ||
| 159 | if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) { | ||
| 160 | pipeb_stats = I915_READ(PIPEBSTAT); | ||
| 161 | /* Ack the event */ | ||
| 162 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
| 163 | |||
| 164 | /* The vblank interrupt gets enabled even if we didn't ask for | ||
| 165 | it, so make sure it's shut down again */ | ||
| 166 | if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)) | ||
| 167 | pipeb_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | ||
| 168 | PIPE_VBLANK_INTERRUPT_ENABLE); | ||
| 169 | else if (pipeb_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| | ||
| 170 | PIPE_VBLANK_INTERRUPT_STATUS)) { | ||
| 171 | vblank++; | 240 | vblank++; |
| 172 | drm_handle_vblank(dev, 1); | 241 | drm_handle_vblank(dev, 1); |
| 173 | } | 242 | } |
| 174 | 243 | ||
| 175 | if (pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) | 244 | if ((pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) || |
| 245 | (iir & I915_ASLE_INTERRUPT)) | ||
| 176 | opregion_asle_intr(dev); | 246 | opregion_asle_intr(dev); |
| 177 | I915_WRITE(PIPEBSTAT, pipeb_stats); | ||
| 178 | } | ||
| 179 | |||
| 180 | I915_WRITE(IIR, iir); | ||
| 181 | if (dev->pdev->msi_enabled) | ||
| 182 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
| 183 | (void) I915_READ(IIR); /* Flush posted writes */ | ||
| 184 | |||
| 185 | if (dev_priv->sarea_priv) | ||
| 186 | dev_priv->sarea_priv->last_dispatch = | ||
| 187 | READ_BREADCRUMB(dev_priv); | ||
| 188 | 247 | ||
| 189 | if (iir & I915_USER_INTERRUPT) { | 248 | /* With MSI, interrupts are only generated when iir |
| 190 | dev_priv->mm.irq_gem_seqno = i915_get_gem_seqno(dev); | 249 | * transitions from zero to nonzero. If another bit got |
| 191 | DRM_WAKEUP(&dev_priv->irq_queue); | 250 | * set while we were handling the existing iir bits, then |
| 251 | * we would never get another interrupt. | ||
| 252 | * | ||
| 253 | * This is fine on non-MSI as well, as if we hit this path | ||
| 254 | * we avoid exiting the interrupt handler only to generate | ||
| 255 | * another one. | ||
| 256 | * | ||
| 257 | * Note that for MSI this could cause a stray interrupt report | ||
| 258 | * if an interrupt landed in the time between writing IIR and | ||
| 259 | * the posting read. This should be rare enough to never | ||
| 260 | * trigger the 99% of 100,000 interrupts test for disabling | ||
| 261 | * stray interrupts. | ||
| 262 | */ | ||
| 263 | iir = new_iir; | ||
| 192 | } | 264 | } |
| 193 | 265 | ||
| 194 | if (iir & I915_ASLE_INTERRUPT) | 266 | return ret; |
| 195 | opregion_asle_intr(dev); | ||
| 196 | |||
| 197 | return IRQ_HANDLED; | ||
| 198 | } | 267 | } |
| 199 | 268 | ||
| 200 | static int i915_emit_irq(struct drm_device * dev) | 269 | static int i915_emit_irq(struct drm_device * dev) |
| @@ -330,48 +399,16 @@ int i915_irq_wait(struct drm_device *dev, void *data, | |||
| 330 | int i915_enable_vblank(struct drm_device *dev, int pipe) | 399 | int i915_enable_vblank(struct drm_device *dev, int pipe) |
| 331 | { | 400 | { |
| 332 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 401 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 333 | u32 pipestat_reg = 0; | ||
| 334 | u32 pipestat; | ||
| 335 | u32 interrupt = 0; | ||
| 336 | unsigned long irqflags; | 402 | unsigned long irqflags; |
| 337 | 403 | ||
| 338 | switch (pipe) { | ||
| 339 | case 0: | ||
| 340 | pipestat_reg = PIPEASTAT; | ||
| 341 | interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; | ||
| 342 | break; | ||
| 343 | case 1: | ||
| 344 | pipestat_reg = PIPEBSTAT; | ||
| 345 | interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; | ||
| 346 | break; | ||
| 347 | default: | ||
| 348 | DRM_ERROR("tried to enable vblank on non-existent pipe %d\n", | ||
| 349 | pipe); | ||
| 350 | return 0; | ||
| 351 | } | ||
| 352 | |||
| 353 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 404 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 354 | /* Enabling vblank events in IMR comes before PIPESTAT write, or | ||
| 355 | * there's a race where the PIPESTAT vblank bit gets set to 1, so | ||
| 356 | * the OR of enabled PIPESTAT bits goes to 1, so the PIPExEVENT in | ||
| 357 | * ISR flashes to 1, but the IIR bit doesn't get set to 1 because | ||
| 358 | * IMR masks it. It doesn't ever get set after we clear the masking | ||
| 359 | * in IMR because the ISR bit is edge, not level-triggered, on the | ||
| 360 | * OR of PIPESTAT bits. | ||
| 361 | */ | ||
| 362 | i915_enable_irq(dev_priv, interrupt); | ||
| 363 | pipestat = I915_READ(pipestat_reg); | ||
| 364 | if (IS_I965G(dev)) | 405 | if (IS_I965G(dev)) |
| 365 | pipestat |= PIPE_START_VBLANK_INTERRUPT_ENABLE; | 406 | i915_enable_pipestat(dev_priv, pipe, |
| 407 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | ||
| 366 | else | 408 | else |
| 367 | pipestat |= PIPE_VBLANK_INTERRUPT_ENABLE; | 409 | i915_enable_pipestat(dev_priv, pipe, |
| 368 | /* Clear any stale interrupt status */ | 410 | PIPE_VBLANK_INTERRUPT_ENABLE); |
| 369 | pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | | ||
| 370 | PIPE_VBLANK_INTERRUPT_STATUS); | ||
| 371 | I915_WRITE(pipestat_reg, pipestat); | ||
| 372 | (void) I915_READ(pipestat_reg); /* Posting read */ | ||
| 373 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 411 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 374 | |||
| 375 | return 0; | 412 | return 0; |
| 376 | } | 413 | } |
| 377 | 414 | ||
| @@ -381,37 +418,12 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
| 381 | void i915_disable_vblank(struct drm_device *dev, int pipe) | 418 | void i915_disable_vblank(struct drm_device *dev, int pipe) |
| 382 | { | 419 | { |
| 383 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 420 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 384 | u32 pipestat_reg = 0; | ||
| 385 | u32 pipestat; | ||
| 386 | u32 interrupt = 0; | ||
| 387 | unsigned long irqflags; | 421 | unsigned long irqflags; |
| 388 | 422 | ||
| 389 | switch (pipe) { | ||
| 390 | case 0: | ||
| 391 | pipestat_reg = PIPEASTAT; | ||
| 392 | interrupt = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT; | ||
| 393 | break; | ||
| 394 | case 1: | ||
| 395 | pipestat_reg = PIPEBSTAT; | ||
| 396 | interrupt = I915_DISPLAY_PIPE_B_EVENT_INTERRUPT; | ||
| 397 | break; | ||
| 398 | default: | ||
| 399 | DRM_ERROR("tried to disable vblank on non-existent pipe %d\n", | ||
| 400 | pipe); | ||
| 401 | return; | ||
| 402 | break; | ||
| 403 | } | ||
| 404 | |||
| 405 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 423 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 406 | i915_disable_irq(dev_priv, interrupt); | 424 | i915_disable_pipestat(dev_priv, pipe, |
| 407 | pipestat = I915_READ(pipestat_reg); | 425 | PIPE_VBLANK_INTERRUPT_ENABLE | |
| 408 | pipestat &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | | 426 | PIPE_START_VBLANK_INTERRUPT_ENABLE); |
| 409 | PIPE_VBLANK_INTERRUPT_ENABLE); | ||
| 410 | /* Clear any stale interrupt status */ | ||
| 411 | pipestat |= (PIPE_START_VBLANK_INTERRUPT_STATUS | | ||
| 412 | PIPE_VBLANK_INTERRUPT_STATUS); | ||
| 413 | I915_WRITE(pipestat_reg, pipestat); | ||
| 414 | (void) I915_READ(pipestat_reg); /* Posting read */ | ||
| 415 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 427 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 416 | } | 428 | } |
| 417 | 429 | ||
| @@ -476,32 +488,35 @@ void i915_driver_irq_preinstall(struct drm_device * dev) | |||
| 476 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 488 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 477 | 489 | ||
| 478 | I915_WRITE(HWSTAM, 0xeffe); | 490 | I915_WRITE(HWSTAM, 0xeffe); |
| 491 | I915_WRITE(PIPEASTAT, 0); | ||
| 492 | I915_WRITE(PIPEBSTAT, 0); | ||
| 479 | I915_WRITE(IMR, 0xffffffff); | 493 | I915_WRITE(IMR, 0xffffffff); |
| 480 | I915_WRITE(IER, 0x0); | 494 | I915_WRITE(IER, 0x0); |
| 495 | (void) I915_READ(IER); | ||
| 481 | } | 496 | } |
| 482 | 497 | ||
| 483 | int i915_driver_irq_postinstall(struct drm_device *dev) | 498 | int i915_driver_irq_postinstall(struct drm_device *dev) |
| 484 | { | 499 | { |
| 485 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 500 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 486 | int ret, num_pipes = 2; | ||
| 487 | |||
| 488 | /* Set initial unmasked IRQs to just the selected vblank pipes. */ | ||
| 489 | dev_priv->irq_mask_reg = ~0; | ||
| 490 | |||
| 491 | ret = drm_vblank_init(dev, num_pipes); | ||
| 492 | if (ret) | ||
| 493 | return ret; | ||
| 494 | 501 | ||
| 495 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; | 502 | dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; |
| 496 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT; | ||
| 497 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; | ||
| 498 | 503 | ||
| 499 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ | 504 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |
| 500 | 505 | ||
| 501 | dev_priv->irq_mask_reg &= I915_INTERRUPT_ENABLE_MASK; | 506 | /* Unmask the interrupts that we always want on. */ |
| 507 | dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX; | ||
| 508 | |||
| 509 | dev_priv->pipestat[0] = 0; | ||
| 510 | dev_priv->pipestat[1] = 0; | ||
| 511 | |||
| 512 | /* Disable pipe interrupt enables, clear pending pipe status */ | ||
| 513 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); | ||
| 514 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); | ||
| 515 | /* Clear pending interrupt status */ | ||
| 516 | I915_WRITE(IIR, I915_READ(IIR)); | ||
| 502 | 517 | ||
| 503 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
| 504 | I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); | 518 | I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK); |
| 519 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | ||
| 505 | (void) I915_READ(IER); | 520 | (void) I915_READ(IER); |
| 506 | 521 | ||
| 507 | opregion_enable_asle(dev); | 522 | opregion_enable_asle(dev); |
| @@ -513,7 +528,6 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
| 513 | void i915_driver_irq_uninstall(struct drm_device * dev) | 528 | void i915_driver_irq_uninstall(struct drm_device * dev) |
| 514 | { | 529 | { |
| 515 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 530 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 516 | u32 temp; | ||
| 517 | 531 | ||
| 518 | if (!dev_priv) | 532 | if (!dev_priv) |
| 519 | return; | 533 | return; |
| @@ -521,13 +535,12 @@ void i915_driver_irq_uninstall(struct drm_device * dev) | |||
| 521 | dev_priv->vblank_pipe = 0; | 535 | dev_priv->vblank_pipe = 0; |
| 522 | 536 | ||
| 523 | I915_WRITE(HWSTAM, 0xffffffff); | 537 | I915_WRITE(HWSTAM, 0xffffffff); |
| 538 | I915_WRITE(PIPEASTAT, 0); | ||
| 539 | I915_WRITE(PIPEBSTAT, 0); | ||
| 524 | I915_WRITE(IMR, 0xffffffff); | 540 | I915_WRITE(IMR, 0xffffffff); |
| 525 | I915_WRITE(IER, 0x0); | 541 | I915_WRITE(IER, 0x0); |
| 526 | 542 | ||
| 527 | temp = I915_READ(PIPEASTAT); | 543 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); |
| 528 | I915_WRITE(PIPEASTAT, temp); | 544 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); |
| 529 | temp = I915_READ(PIPEBSTAT); | 545 | I915_WRITE(IIR, I915_READ(IIR)); |
| 530 | I915_WRITE(PIPEBSTAT, temp); | ||
| 531 | temp = I915_READ(IIR); | ||
| 532 | I915_WRITE(IIR, temp); | ||
| 533 | } | 546 | } |
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/i915_opregion.c index 1787a0c7e3ab..13ae731a33db 100644 --- a/drivers/gpu/drm/i915/i915_opregion.c +++ b/drivers/gpu/drm/i915/i915_opregion.c | |||
| @@ -235,17 +235,15 @@ void opregion_enable_asle(struct drm_device *dev) | |||
| 235 | struct opregion_asle *asle = dev_priv->opregion.asle; | 235 | struct opregion_asle *asle = dev_priv->opregion.asle; |
| 236 | 236 | ||
| 237 | if (asle) { | 237 | if (asle) { |
| 238 | u32 pipeb_stats = I915_READ(PIPEBSTAT); | ||
| 239 | if (IS_MOBILE(dev)) { | 238 | if (IS_MOBILE(dev)) { |
| 240 | /* Many devices trigger events with a write to the | 239 | unsigned long irqflags; |
| 241 | legacy backlight controller, so we need to ensure | 240 | |
| 242 | that it's able to generate interrupts */ | 241 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 243 | I915_WRITE(PIPEBSTAT, pipeb_stats |= | 242 | i915_enable_pipestat(dev_priv, 1, |
| 244 | I915_LEGACY_BLC_EVENT_ENABLE); | 243 | I915_LEGACY_BLC_EVENT_ENABLE); |
| 245 | i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT | | 244 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, |
| 246 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT); | 245 | irqflags); |
| 247 | } else | 246 | } |
| 248 | i915_enable_irq(dev_priv, I915_ASLE_INTERRUPT); | ||
| 249 | 247 | ||
| 250 | asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | | 248 | asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | |
| 251 | ASLE_PFMB_EN; | 249 | ASLE_PFMB_EN; |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 5ddc6e595c0c..5d84027ee8f3 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -244,6 +244,9 @@ int i915_save_state(struct drm_device *dev) | |||
| 244 | if (IS_I965G(dev) && IS_MOBILE(dev)) | 244 | if (IS_I965G(dev) && IS_MOBILE(dev)) |
| 245 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); | 245 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); |
| 246 | 246 | ||
| 247 | /* Hardware status page */ | ||
| 248 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
| 249 | |||
| 247 | /* Display arbitration control */ | 250 | /* Display arbitration control */ |
| 248 | dev_priv->saveDSPARB = I915_READ(DSPARB); | 251 | dev_priv->saveDSPARB = I915_READ(DSPARB); |
| 249 | 252 | ||
| @@ -373,6 +376,9 @@ int i915_restore_state(struct drm_device *dev) | |||
| 373 | if (IS_I965G(dev) && IS_MOBILE(dev)) | 376 | if (IS_I965G(dev) && IS_MOBILE(dev)) |
| 374 | I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); | 377 | I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); |
| 375 | 378 | ||
| 379 | /* Hardware status page */ | ||
| 380 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); | ||
| 381 | |||
| 376 | /* Display arbitration */ | 382 | /* Display arbitration */ |
| 377 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); | 383 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); |
| 378 | 384 | ||
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c index c1d12dbfa8d8..b49c5ff29585 100644 --- a/drivers/gpu/drm/mga/mga_dma.c +++ b/drivers/gpu/drm/mga/mga_dma.c | |||
| @@ -396,6 +396,7 @@ int mga_freelist_put(struct drm_device * dev, struct drm_buf * buf) | |||
| 396 | int mga_driver_load(struct drm_device * dev, unsigned long flags) | 396 | int mga_driver_load(struct drm_device * dev, unsigned long flags) |
| 397 | { | 397 | { |
| 398 | drm_mga_private_t *dev_priv; | 398 | drm_mga_private_t *dev_priv; |
| 399 | int ret; | ||
| 399 | 400 | ||
| 400 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); | 401 | dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); |
| 401 | if (!dev_priv) | 402 | if (!dev_priv) |
| @@ -415,6 +416,13 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags) | |||
| 415 | dev->types[7] = _DRM_STAT_PRIMARY; | 416 | dev->types[7] = _DRM_STAT_PRIMARY; |
| 416 | dev->types[8] = _DRM_STAT_SECONDARY; | 417 | dev->types[8] = _DRM_STAT_SECONDARY; |
| 417 | 418 | ||
| 419 | ret = drm_vblank_init(dev, 1); | ||
| 420 | |||
| 421 | if (ret) { | ||
| 422 | (void) mga_driver_unload(dev); | ||
| 423 | return ret; | ||
| 424 | } | ||
| 425 | |||
| 418 | return 0; | 426 | return 0; |
| 419 | } | 427 | } |
| 420 | 428 | ||
diff --git a/drivers/gpu/drm/mga/mga_irq.c b/drivers/gpu/drm/mga/mga_irq.c index bab42f41188b..daa6041a483a 100644 --- a/drivers/gpu/drm/mga/mga_irq.c +++ b/drivers/gpu/drm/mga/mga_irq.c | |||
| @@ -152,11 +152,6 @@ void mga_driver_irq_preinstall(struct drm_device * dev) | |||
| 152 | int mga_driver_irq_postinstall(struct drm_device *dev) | 152 | int mga_driver_irq_postinstall(struct drm_device *dev) |
| 153 | { | 153 | { |
| 154 | drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; | 154 | drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; |
| 155 | int ret; | ||
| 156 | |||
| 157 | ret = drm_vblank_init(dev, 1); | ||
| 158 | if (ret) | ||
| 159 | return ret; | ||
| 160 | 155 | ||
| 161 | DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); | 156 | DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); |
| 162 | 157 | ||
diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c index 3265d53ba91f..601f4c0e5da5 100644 --- a/drivers/gpu/drm/r128/r128_drv.c +++ b/drivers/gpu/drm/r128/r128_drv.c | |||
| @@ -45,6 +45,7 @@ static struct drm_driver driver = { | |||
| 45 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | | 45 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | |
| 46 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, | 46 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, |
| 47 | .dev_priv_size = sizeof(drm_r128_buf_priv_t), | 47 | .dev_priv_size = sizeof(drm_r128_buf_priv_t), |
| 48 | .load = r128_driver_load, | ||
| 48 | .preclose = r128_driver_preclose, | 49 | .preclose = r128_driver_preclose, |
| 49 | .lastclose = r128_driver_lastclose, | 50 | .lastclose = r128_driver_lastclose, |
| 50 | .get_vblank_counter = r128_get_vblank_counter, | 51 | .get_vblank_counter = r128_get_vblank_counter, |
| @@ -84,6 +85,11 @@ static struct drm_driver driver = { | |||
| 84 | .patchlevel = DRIVER_PATCHLEVEL, | 85 | .patchlevel = DRIVER_PATCHLEVEL, |
| 85 | }; | 86 | }; |
| 86 | 87 | ||
| 88 | int r128_driver_load(struct drm_device * dev, unsigned long flags) | ||
| 89 | { | ||
| 90 | return drm_vblank_init(dev, 1); | ||
| 91 | } | ||
| 92 | |||
| 87 | static int __init r128_init(void) | 93 | static int __init r128_init(void) |
| 88 | { | 94 | { |
| 89 | driver.num_ioctls = r128_max_ioctl; | 95 | driver.num_ioctls = r128_max_ioctl; |
diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h index 5898b274279d..797a26c42dab 100644 --- a/drivers/gpu/drm/r128/r128_drv.h +++ b/drivers/gpu/drm/r128/r128_drv.h | |||
| @@ -159,6 +159,7 @@ extern void r128_driver_irq_preinstall(struct drm_device * dev); | |||
| 159 | extern int r128_driver_irq_postinstall(struct drm_device *dev); | 159 | extern int r128_driver_irq_postinstall(struct drm_device *dev); |
| 160 | extern void r128_driver_irq_uninstall(struct drm_device * dev); | 160 | extern void r128_driver_irq_uninstall(struct drm_device * dev); |
| 161 | extern void r128_driver_lastclose(struct drm_device * dev); | 161 | extern void r128_driver_lastclose(struct drm_device * dev); |
| 162 | extern int r128_driver_load(struct drm_device * dev, unsigned long flags); | ||
| 162 | extern void r128_driver_preclose(struct drm_device * dev, | 163 | extern void r128_driver_preclose(struct drm_device * dev, |
| 163 | struct drm_file *file_priv); | 164 | struct drm_file *file_priv); |
| 164 | 165 | ||
diff --git a/drivers/gpu/drm/r128/r128_irq.c b/drivers/gpu/drm/r128/r128_irq.c index d7349012a680..69810fb8ac49 100644 --- a/drivers/gpu/drm/r128/r128_irq.c +++ b/drivers/gpu/drm/r128/r128_irq.c | |||
| @@ -102,7 +102,7 @@ void r128_driver_irq_preinstall(struct drm_device * dev) | |||
| 102 | 102 | ||
| 103 | int r128_driver_irq_postinstall(struct drm_device *dev) | 103 | int r128_driver_irq_postinstall(struct drm_device *dev) |
| 104 | { | 104 | { |
| 105 | return drm_vblank_init(dev, 1); | 105 | return 0; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | void r128_driver_irq_uninstall(struct drm_device * dev) | 108 | void r128_driver_irq_uninstall(struct drm_device * dev) |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index abdc1ae38467..dcebb4bee7aa 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -1757,6 +1757,12 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1757 | if (ret != 0) | 1757 | if (ret != 0) |
| 1758 | return ret; | 1758 | return ret; |
| 1759 | 1759 | ||
| 1760 | ret = drm_vblank_init(dev, 2); | ||
| 1761 | if (ret) { | ||
| 1762 | radeon_driver_unload(dev); | ||
| 1763 | return ret; | ||
| 1764 | } | ||
| 1765 | |||
| 1760 | DRM_DEBUG("%s card detected\n", | 1766 | DRM_DEBUG("%s card detected\n", |
| 1761 | ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); | 1767 | ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); |
| 1762 | return ret; | 1768 | return ret; |
diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c index 5079f7054a2f..97c0599fdb1e 100644 --- a/drivers/gpu/drm/radeon/radeon_irq.c +++ b/drivers/gpu/drm/radeon/radeon_irq.c | |||
| @@ -337,15 +337,10 @@ int radeon_driver_irq_postinstall(struct drm_device *dev) | |||
| 337 | { | 337 | { |
| 338 | drm_radeon_private_t *dev_priv = | 338 | drm_radeon_private_t *dev_priv = |
| 339 | (drm_radeon_private_t *) dev->dev_private; | 339 | (drm_radeon_private_t *) dev->dev_private; |
| 340 | int ret; | ||
| 341 | 340 | ||
| 342 | atomic_set(&dev_priv->swi_emitted, 0); | 341 | atomic_set(&dev_priv->swi_emitted, 0); |
| 343 | DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); | 342 | DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); |
| 344 | 343 | ||
| 345 | ret = drm_vblank_init(dev, 2); | ||
| 346 | if (ret) | ||
| 347 | return ret; | ||
| 348 | |||
| 349 | dev->max_vblank_count = 0x001fffff; | 344 | dev->max_vblank_count = 0x001fffff; |
| 350 | 345 | ||
| 351 | radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); | 346 | radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); |
diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c index 665d319b927b..c248c1d37268 100644 --- a/drivers/gpu/drm/via/via_irq.c +++ b/drivers/gpu/drm/via/via_irq.c | |||
| @@ -314,7 +314,6 @@ int via_driver_irq_postinstall(struct drm_device *dev) | |||
| 314 | if (!dev_priv) | 314 | if (!dev_priv) |
| 315 | return -EINVAL; | 315 | return -EINVAL; |
| 316 | 316 | ||
| 317 | drm_vblank_init(dev, 1); | ||
| 318 | status = VIA_READ(VIA_REG_INTERRUPT); | 317 | status = VIA_READ(VIA_REG_INTERRUPT); |
| 319 | VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL | 318 | VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL |
| 320 | | dev_priv->irq_enable_mask); | 319 | | dev_priv->irq_enable_mask); |
diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index a967556be014..2c4f0b485792 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c | |||
| @@ -107,8 +107,17 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset) | |||
| 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); | 107 | ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); |
| 108 | if (ret) { | 108 | if (ret) { |
| 109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); | 109 | drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); |
| 110 | return ret; | ||
| 110 | } | 111 | } |
| 111 | return ret; | 112 | |
| 113 | ret = drm_vblank_init(dev, 1); | ||
| 114 | if (ret) { | ||
| 115 | drm_sman_takedown(&dev_priv->sman); | ||
| 116 | drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); | ||
| 117 | return ret; | ||
| 118 | } | ||
| 119 | |||
| 120 | return 0; | ||
| 112 | } | 121 | } |
| 113 | 122 | ||
| 114 | int via_driver_unload(struct drm_device *dev) | 123 | int via_driver_unload(struct drm_device *dev) |
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 9b97795e45ad..aa28aed0e46c 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
| @@ -400,12 +400,12 @@ static const struct hid_device_id apple_devices[] = { | |||
| 400 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), | 400 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), |
| 401 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 401 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
| 402 | APPLE_RDESC_JIS }, | 402 | APPLE_RDESC_JIS }, |
| 403 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), | 403 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), |
| 404 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 404 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
| 405 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), | 405 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), |
| 406 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 406 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
| 407 | APPLE_ISO_KEYBOARD }, | 407 | APPLE_ISO_KEYBOARD }, |
| 408 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), | 408 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), |
| 409 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 409 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
| 410 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | 410 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), |
| 411 | .driver_data = APPLE_HAS_FN }, | 411 | .driver_data = APPLE_HAS_FN }, |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 147ec591a806..40df3e1b4bd1 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1241,9 +1241,9 @@ static const struct hid_device_id hid_blacklist[] = { | |||
| 1241 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, | 1241 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) }, |
| 1242 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, | 1242 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) }, |
| 1243 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, | 1243 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) }, |
| 1244 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, | 1244 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) }, |
| 1245 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, | 1245 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) }, |
| 1246 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, | 1246 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) }, |
| 1247 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, | 1247 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) }, |
| 1248 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, | 1248 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) }, |
| 1249 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, | 1249 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) }, |
| @@ -1266,6 +1266,9 @@ static const struct hid_device_id hid_blacklist[] = { | |||
| 1266 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, | 1266 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, |
| 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, | 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |
| 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, |
| 1269 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, | ||
| 1270 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) }, | ||
| 1271 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) }, | ||
| 1269 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 1272 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
| 1270 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | 1273 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, |
| 1271 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1274 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
| @@ -1420,7 +1423,6 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
| 1420 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, | 1423 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) }, |
| 1421 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, | 1424 | { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) }, |
| 1422 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, | 1425 | { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) }, |
| 1423 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, | ||
| 1424 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) }, | 1426 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) }, |
| 1425 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) }, | 1427 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) }, |
| 1426 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0003) }, | 1428 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0003) }, |
| @@ -1436,7 +1438,6 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
| 1436 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) }, | 1438 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) }, |
| 1437 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) }, | 1439 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) }, |
| 1438 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) }, | 1440 | { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) }, |
| 1439 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) }, | ||
| 1440 | { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, | 1441 | { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) }, |
| 1441 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, | 1442 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) }, |
| 1442 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, | 1443 | { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) }, |
| @@ -1576,9 +1577,6 @@ static const struct hid_device_id hid_mouse_ignore_list[] = { | |||
| 1576 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, | 1577 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) }, |
| 1577 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, | 1578 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) }, |
| 1578 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, | 1579 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) }, |
| 1579 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, | ||
| 1580 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, | ||
| 1581 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, | ||
| 1582 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, | 1580 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
| 1583 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1581 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
| 1584 | { } | 1582 | { } |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index d70075dd3d81..39289699c32f 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -163,6 +163,7 @@ | |||
| 163 | 163 | ||
| 164 | #define USB_VENDOR_ID_GAMERON 0x0810 | 164 | #define USB_VENDOR_ID_GAMERON 0x0810 |
| 165 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 | 165 | #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 |
| 166 | #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 | ||
| 166 | 167 | ||
| 167 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc | 168 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc |
| 168 | 169 | ||
diff --git a/drivers/hid/hid-pl.c b/drivers/hid/hid-pl.c index acd815586182..46941f979b9d 100644 --- a/drivers/hid/hid-pl.c +++ b/drivers/hid/hid-pl.c | |||
| @@ -178,6 +178,8 @@ err: | |||
| 178 | static const struct hid_device_id pl_devices[] = { | 178 | static const struct hid_device_id pl_devices[] = { |
| 179 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR), | 179 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR), |
| 180 | .driver_data = 1 }, /* Twin USB Joystick */ | 180 | .driver_data = 1 }, /* Twin USB Joystick */ |
| 181 | { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR), | ||
| 182 | .driver_data = 1 }, /* Twin USB Joystick */ | ||
| 181 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), }, /* GreenAsia Inc. USB Joystick */ | 183 | { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), }, /* GreenAsia Inc. USB Joystick */ |
| 182 | { } | 184 | { } |
| 183 | }; | 185 | }; |
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index d746bf8284dd..606369ea24ca 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
| @@ -796,7 +796,6 @@ static int usbhid_start(struct hid_device *hid) | |||
| 796 | if (insize > HID_MAX_BUFFER_SIZE) | 796 | if (insize > HID_MAX_BUFFER_SIZE) |
| 797 | insize = HID_MAX_BUFFER_SIZE; | 797 | insize = HID_MAX_BUFFER_SIZE; |
| 798 | 798 | ||
| 799 | mutex_lock(&usbhid->setup); | ||
| 800 | if (hid_alloc_buffers(dev, hid)) { | 799 | if (hid_alloc_buffers(dev, hid)) { |
| 801 | ret = -ENOMEM; | 800 | ret = -ENOMEM; |
| 802 | goto fail; | 801 | goto fail; |
| @@ -876,7 +875,6 @@ static int usbhid_start(struct hid_device *hid) | |||
| 876 | hid_dump_device(hid); | 875 | hid_dump_device(hid); |
| 877 | 876 | ||
| 878 | set_bit(HID_STARTED, &usbhid->iofl); | 877 | set_bit(HID_STARTED, &usbhid->iofl); |
| 879 | mutex_unlock(&usbhid->setup); | ||
| 880 | 878 | ||
| 881 | return 0; | 879 | return 0; |
| 882 | 880 | ||
| @@ -888,7 +886,6 @@ fail: | |||
| 888 | usbhid->urbout = NULL; | 886 | usbhid->urbout = NULL; |
| 889 | usbhid->urbctrl = NULL; | 887 | usbhid->urbctrl = NULL; |
| 890 | hid_free_buffers(dev, hid); | 888 | hid_free_buffers(dev, hid); |
| 891 | mutex_unlock(&usbhid->setup); | ||
| 892 | return ret; | 889 | return ret; |
| 893 | } | 890 | } |
| 894 | 891 | ||
| @@ -899,7 +896,6 @@ static void usbhid_stop(struct hid_device *hid) | |||
| 899 | if (WARN_ON(!usbhid)) | 896 | if (WARN_ON(!usbhid)) |
| 900 | return; | 897 | return; |
| 901 | 898 | ||
| 902 | mutex_lock(&usbhid->setup); | ||
| 903 | clear_bit(HID_STARTED, &usbhid->iofl); | 899 | clear_bit(HID_STARTED, &usbhid->iofl); |
| 904 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 900 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
| 905 | set_bit(HID_DISCONNECTED, &usbhid->iofl); | 901 | set_bit(HID_DISCONNECTED, &usbhid->iofl); |
| @@ -928,7 +924,6 @@ static void usbhid_stop(struct hid_device *hid) | |||
| 928 | usbhid->urbout = NULL; | 924 | usbhid->urbout = NULL; |
| 929 | 925 | ||
| 930 | hid_free_buffers(hid_to_usb_dev(hid), hid); | 926 | hid_free_buffers(hid_to_usb_dev(hid), hid); |
| 931 | mutex_unlock(&usbhid->setup); | ||
| 932 | } | 927 | } |
| 933 | 928 | ||
| 934 | static struct hid_ll_driver usb_hid_driver = { | 929 | static struct hid_ll_driver usb_hid_driver = { |
| @@ -1016,7 +1011,6 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
| 1016 | 1011 | ||
| 1017 | hid->driver_data = usbhid; | 1012 | hid->driver_data = usbhid; |
| 1018 | usbhid->hid = hid; | 1013 | usbhid->hid = hid; |
| 1019 | mutex_init(&usbhid->setup); /* needed on suspend/resume */ | ||
| 1020 | 1014 | ||
| 1021 | ret = hid_add_device(hid); | 1015 | ret = hid_add_device(hid); |
| 1022 | if (ret) { | 1016 | if (ret) { |
| @@ -1051,18 +1045,14 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) | |||
| 1051 | struct hid_device *hid = usb_get_intfdata (intf); | 1045 | struct hid_device *hid = usb_get_intfdata (intf); |
| 1052 | struct usbhid_device *usbhid = hid->driver_data; | 1046 | struct usbhid_device *usbhid = hid->driver_data; |
| 1053 | 1047 | ||
| 1054 | mutex_lock(&usbhid->setup); | 1048 | if (!test_bit(HID_STARTED, &usbhid->iofl)) |
| 1055 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
| 1056 | mutex_unlock(&usbhid->setup); | ||
| 1057 | return 0; | 1049 | return 0; |
| 1058 | } | ||
| 1059 | 1050 | ||
| 1060 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 1051 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
| 1061 | set_bit(HID_SUSPENDED, &usbhid->iofl); | 1052 | set_bit(HID_SUSPENDED, &usbhid->iofl); |
| 1062 | spin_unlock_irq(&usbhid->inlock); | 1053 | spin_unlock_irq(&usbhid->inlock); |
| 1063 | del_timer_sync(&usbhid->io_retry); | 1054 | del_timer_sync(&usbhid->io_retry); |
| 1064 | usb_kill_urb(usbhid->urbin); | 1055 | usb_kill_urb(usbhid->urbin); |
| 1065 | mutex_unlock(&usbhid->setup); | ||
| 1066 | dev_dbg(&intf->dev, "suspend\n"); | 1056 | dev_dbg(&intf->dev, "suspend\n"); |
| 1067 | return 0; | 1057 | return 0; |
| 1068 | } | 1058 | } |
| @@ -1073,16 +1063,12 @@ static int hid_resume(struct usb_interface *intf) | |||
| 1073 | struct usbhid_device *usbhid = hid->driver_data; | 1063 | struct usbhid_device *usbhid = hid->driver_data; |
| 1074 | int status; | 1064 | int status; |
| 1075 | 1065 | ||
| 1076 | mutex_lock(&usbhid->setup); | 1066 | if (!test_bit(HID_STARTED, &usbhid->iofl)) |
| 1077 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
| 1078 | mutex_unlock(&usbhid->setup); | ||
| 1079 | return 0; | 1067 | return 0; |
| 1080 | } | ||
| 1081 | 1068 | ||
| 1082 | clear_bit(HID_SUSPENDED, &usbhid->iofl); | 1069 | clear_bit(HID_SUSPENDED, &usbhid->iofl); |
| 1083 | usbhid->retry_delay = 0; | 1070 | usbhid->retry_delay = 0; |
| 1084 | status = hid_start_in(hid); | 1071 | status = hid_start_in(hid); |
| 1085 | mutex_unlock(&usbhid->setup); | ||
| 1086 | dev_dbg(&intf->dev, "resume status %d\n", status); | 1072 | dev_dbg(&intf->dev, "resume status %d\n", status); |
| 1087 | return status; | 1073 | return status; |
| 1088 | } | 1074 | } |
diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h index 55973ff54008..332abcdf9956 100644 --- a/drivers/hid/usbhid/usbhid.h +++ b/drivers/hid/usbhid/usbhid.h | |||
| @@ -74,7 +74,6 @@ struct usbhid_device { | |||
| 74 | dma_addr_t outbuf_dma; /* Output buffer dma */ | 74 | dma_addr_t outbuf_dma; /* Output buffer dma */ |
| 75 | spinlock_t outlock; /* Output fifo spinlock */ | 75 | spinlock_t outlock; /* Output fifo spinlock */ |
| 76 | 76 | ||
| 77 | struct mutex setup; | ||
| 78 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ | 77 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ |
| 79 | struct timer_list io_retry; /* Retry timer */ | 78 | struct timer_list io_retry; /* Retry timer */ |
| 80 | unsigned long stop_retry; /* Time to give up, in jiffies */ | 79 | unsigned long stop_retry; /* Time to give up, in jiffies */ |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index f7dce8b9f64b..086c2a5cef0b 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -1564,3 +1564,4 @@ module_exit(applesmc_exit); | |||
| 1564 | MODULE_AUTHOR("Nicolas Boichat"); | 1564 | MODULE_AUTHOR("Nicolas Boichat"); |
| 1565 | MODULE_DESCRIPTION("Apple SMC"); | 1565 | MODULE_DESCRIPTION("Apple SMC"); |
| 1566 | MODULE_LICENSE("GPL v2"); | 1566 | MODULE_LICENSE("GPL v2"); |
| 1567 | MODULE_DEVICE_TABLE(dmi, applesmc_whitelist); | ||
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c index 59ba2086d2f9..a257cd5cd134 100644 --- a/drivers/i2c/busses/i2c-parport.c +++ b/drivers/i2c/busses/i2c-parport.c | |||
| @@ -189,8 +189,6 @@ static void i2c_parport_attach (struct parport *port) | |||
| 189 | if (adapter_parm[type].init.val) | 189 | if (adapter_parm[type].init.val) |
| 190 | line_set(port, 1, &adapter_parm[type].init); | 190 | line_set(port, 1, &adapter_parm[type].init); |
| 191 | 191 | ||
| 192 | parport_release(adapter->pdev); | ||
| 193 | |||
| 194 | if (i2c_bit_add_bus(&adapter->adapter) < 0) { | 192 | if (i2c_bit_add_bus(&adapter->adapter) < 0) { |
| 195 | printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); | 193 | printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); |
| 196 | goto ERROR1; | 194 | goto ERROR1; |
| @@ -202,6 +200,7 @@ static void i2c_parport_attach (struct parport *port) | |||
| 202 | return; | 200 | return; |
| 203 | 201 | ||
| 204 | ERROR1: | 202 | ERROR1: |
| 203 | parport_release(adapter->pdev); | ||
| 205 | parport_unregister_device(adapter->pdev); | 204 | parport_unregister_device(adapter->pdev); |
| 206 | ERROR0: | 205 | ERROR0: |
| 207 | kfree(adapter); | 206 | kfree(adapter); |
| @@ -221,6 +220,7 @@ static void i2c_parport_detach (struct parport *port) | |||
| 221 | if (adapter_parm[type].init.val) | 220 | if (adapter_parm[type].init.val) |
| 222 | line_set(port, 0, &adapter_parm[type].init); | 221 | line_set(port, 0, &adapter_parm[type].init); |
| 223 | 222 | ||
| 223 | parport_release(adapter->pdev); | ||
| 224 | parport_unregister_device(adapter->pdev); | 224 | parport_unregister_device(adapter->pdev); |
| 225 | if (prev) | 225 | if (prev) |
| 226 | prev->next = adapter->next; | 226 | prev->next = adapter->next; |
diff --git a/drivers/i2c/chips/isp1301_omap.c b/drivers/i2c/chips/isp1301_omap.c index 28902ebd5539..e0d56ef2bcb0 100644 --- a/drivers/i2c/chips/isp1301_omap.c +++ b/drivers/i2c/chips/isp1301_omap.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
| 26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/gpio.h> | ||
| 28 | #include <linux/usb/ch9.h> | 29 | #include <linux/usb/ch9.h> |
| 29 | #include <linux/usb/gadget.h> | 30 | #include <linux/usb/gadget.h> |
| 30 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
| @@ -33,7 +34,10 @@ | |||
| 33 | #include <linux/workqueue.h> | 34 | #include <linux/workqueue.h> |
| 34 | 35 | ||
| 35 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
| 37 | #include <asm/mach-types.h> | ||
| 38 | |||
| 36 | #include <mach/usb.h> | 39 | #include <mach/usb.h> |
| 40 | #include <mach/mux.h> | ||
| 37 | 41 | ||
| 38 | 42 | ||
| 39 | #ifndef DEBUG | 43 | #ifndef DEBUG |
| @@ -88,14 +92,9 @@ struct isp1301 { | |||
| 88 | 92 | ||
| 89 | /*-------------------------------------------------------------------------*/ | 93 | /*-------------------------------------------------------------------------*/ |
| 90 | 94 | ||
| 91 | #ifdef CONFIG_MACH_OMAP_H2 | ||
| 92 | |||
| 93 | /* board-specific PM hooks */ | 95 | /* board-specific PM hooks */ |
| 94 | 96 | ||
| 95 | #include <asm/gpio.h> | 97 | #if defined(CONFIG_MACH_OMAP_H2) || defined(CONFIG_MACH_OMAP_H3) |
| 96 | #include <mach/mux.h> | ||
| 97 | #include <asm/mach-types.h> | ||
| 98 | |||
| 99 | 98 | ||
| 100 | #if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE) | 99 | #if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE) |
| 101 | 100 | ||
| @@ -135,6 +134,33 @@ static inline void notresponding(struct isp1301 *isp) | |||
| 135 | 134 | ||
| 136 | #endif | 135 | #endif |
| 137 | 136 | ||
| 137 | #if defined(CONFIG_MACH_OMAP_H4) | ||
| 138 | |||
| 139 | static void enable_vbus_draw(struct isp1301 *isp, unsigned mA) | ||
| 140 | { | ||
| 141 | /* H4 controls this by DIP switch S2.4; no soft control. | ||
| 142 | * ON means the charger is always enabled. Leave it OFF | ||
| 143 | * unless the OTG port is used only in B-peripheral mode. | ||
| 144 | */ | ||
| 145 | } | ||
| 146 | |||
| 147 | static void enable_vbus_source(struct isp1301 *isp) | ||
| 148 | { | ||
| 149 | /* this board won't supply more than 8mA vbus power. | ||
| 150 | * some boards can switch a 100ma "unit load" (or more). | ||
| 151 | */ | ||
| 152 | } | ||
| 153 | |||
| 154 | |||
| 155 | /* products will deliver OTG messages with LEDs, GUI, etc */ | ||
| 156 | static inline void notresponding(struct isp1301 *isp) | ||
| 157 | { | ||
| 158 | printk(KERN_NOTICE "OTG device not responding.\n"); | ||
| 159 | } | ||
| 160 | |||
| 161 | |||
| 162 | #endif | ||
| 163 | |||
| 138 | /*-------------------------------------------------------------------------*/ | 164 | /*-------------------------------------------------------------------------*/ |
| 139 | 165 | ||
| 140 | static struct i2c_driver isp1301_driver; | 166 | static struct i2c_driver isp1301_driver; |
| @@ -334,8 +360,7 @@ static int gadget_suspend(struct isp1301 *isp) | |||
| 334 | * NOTE: guaranteeing certain response times might mean we shouldn't | 360 | * NOTE: guaranteeing certain response times might mean we shouldn't |
| 335 | * share keventd's work queue; a realtime task might be safest. | 361 | * share keventd's work queue; a realtime task might be safest. |
| 336 | */ | 362 | */ |
| 337 | void | 363 | static void isp1301_defer_work(struct isp1301 *isp, int work) |
| 338 | isp1301_defer_work(struct isp1301 *isp, int work) | ||
| 339 | { | 364 | { |
| 340 | int status; | 365 | int status; |
| 341 | 366 | ||
| @@ -512,7 +537,6 @@ static void update_otg1(struct isp1301 *isp, u8 int_src) | |||
| 512 | otg_ctrl &= ~OTG_XCEIV_INPUTS; | 537 | otg_ctrl &= ~OTG_XCEIV_INPUTS; |
| 513 | otg_ctrl &= ~(OTG_ID|OTG_ASESSVLD|OTG_VBUSVLD); | 538 | otg_ctrl &= ~(OTG_ID|OTG_ASESSVLD|OTG_VBUSVLD); |
| 514 | 539 | ||
| 515 | |||
| 516 | if (int_src & INTR_SESS_VLD) | 540 | if (int_src & INTR_SESS_VLD) |
| 517 | otg_ctrl |= OTG_ASESSVLD; | 541 | otg_ctrl |= OTG_ASESSVLD; |
| 518 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { | 542 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { |
| @@ -886,11 +910,11 @@ static int otg_probe(struct platform_device *dev) | |||
| 886 | 910 | ||
| 887 | static int otg_remove(struct platform_device *dev) | 911 | static int otg_remove(struct platform_device *dev) |
| 888 | { | 912 | { |
| 889 | otg_dev = 0; | 913 | otg_dev = NULL; |
| 890 | return 0; | 914 | return 0; |
| 891 | } | 915 | } |
| 892 | 916 | ||
| 893 | struct platform_driver omap_otg_driver = { | 917 | static struct platform_driver omap_otg_driver = { |
| 894 | .probe = otg_probe, | 918 | .probe = otg_probe, |
| 895 | .remove = otg_remove, | 919 | .remove = otg_remove, |
| 896 | .driver = { | 920 | .driver = { |
| @@ -1212,6 +1236,8 @@ static void isp1301_release(struct device *dev) | |||
| 1212 | 1236 | ||
| 1213 | isp = dev_get_drvdata(dev); | 1237 | isp = dev_get_drvdata(dev); |
| 1214 | 1238 | ||
| 1239 | /* FIXME -- not with a "new style" driver, it doesn't!! */ | ||
| 1240 | |||
| 1215 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ | 1241 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ |
| 1216 | if (isp->i2c_release) | 1242 | if (isp->i2c_release) |
| 1217 | isp->i2c_release(dev); | 1243 | isp->i2c_release(dev); |
| @@ -1233,7 +1259,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) | |||
| 1233 | otg_unbind(isp); | 1259 | otg_unbind(isp); |
| 1234 | #endif | 1260 | #endif |
| 1235 | if (machine_is_omap_h2()) | 1261 | if (machine_is_omap_h2()) |
| 1236 | omap_free_gpio(2); | 1262 | gpio_free(2); |
| 1237 | 1263 | ||
| 1238 | isp->timer.data = 0; | 1264 | isp->timer.data = 0; |
| 1239 | set_bit(WORK_STOP, &isp->todo); | 1265 | set_bit(WORK_STOP, &isp->todo); |
| @@ -1241,7 +1267,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) | |||
| 1241 | flush_scheduled_work(); | 1267 | flush_scheduled_work(); |
| 1242 | 1268 | ||
| 1243 | put_device(&i2c->dev); | 1269 | put_device(&i2c->dev); |
| 1244 | the_transceiver = 0; | 1270 | the_transceiver = NULL; |
| 1245 | 1271 | ||
| 1246 | return 0; | 1272 | return 0; |
| 1247 | } | 1273 | } |
| @@ -1295,7 +1321,7 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
| 1295 | if (!host) { | 1321 | if (!host) { |
| 1296 | omap_writew(0, OTG_IRQ_EN); | 1322 | omap_writew(0, OTG_IRQ_EN); |
| 1297 | power_down(isp); | 1323 | power_down(isp); |
| 1298 | isp->otg.host = 0; | 1324 | isp->otg.host = NULL; |
| 1299 | return 0; | 1325 | return 0; |
| 1300 | } | 1326 | } |
| 1301 | 1327 | ||
| @@ -1344,7 +1370,9 @@ static int | |||
| 1344 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | 1370 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) |
| 1345 | { | 1371 | { |
| 1346 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); | 1372 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); |
| 1373 | #ifndef CONFIG_USB_OTG | ||
| 1347 | u32 l; | 1374 | u32 l; |
| 1375 | #endif | ||
| 1348 | 1376 | ||
| 1349 | if (!otg || isp != the_transceiver) | 1377 | if (!otg || isp != the_transceiver) |
| 1350 | return -ENODEV; | 1378 | return -ENODEV; |
| @@ -1354,7 +1382,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
| 1354 | if (!isp->otg.default_a) | 1382 | if (!isp->otg.default_a) |
| 1355 | enable_vbus_draw(isp, 0); | 1383 | enable_vbus_draw(isp, 0); |
| 1356 | usb_gadget_vbus_disconnect(isp->otg.gadget); | 1384 | usb_gadget_vbus_disconnect(isp->otg.gadget); |
| 1357 | isp->otg.gadget = 0; | 1385 | isp->otg.gadget = NULL; |
| 1358 | power_down(isp); | 1386 | power_down(isp); |
| 1359 | return 0; | 1387 | return 0; |
| 1360 | } | 1388 | } |
| @@ -1379,7 +1407,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
| 1379 | power_up(isp); | 1407 | power_up(isp); |
| 1380 | isp->otg.state = OTG_STATE_B_IDLE; | 1408 | isp->otg.state = OTG_STATE_B_IDLE; |
| 1381 | 1409 | ||
| 1382 | if (machine_is_omap_h2()) | 1410 | if (machine_is_omap_h2() || machine_is_omap_h3()) |
| 1383 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); | 1411 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); |
| 1384 | 1412 | ||
| 1385 | isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING, | 1413 | isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING, |
| @@ -1499,7 +1527,8 @@ isp1301_start_hnp(struct otg_transceiver *dev) | |||
| 1499 | 1527 | ||
| 1500 | /*-------------------------------------------------------------------------*/ | 1528 | /*-------------------------------------------------------------------------*/ |
| 1501 | 1529 | ||
| 1502 | static int __init isp1301_probe(struct i2c_client *i2c) | 1530 | static int __init |
| 1531 | isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | ||
| 1503 | { | 1532 | { |
| 1504 | int status; | 1533 | int status; |
| 1505 | struct isp1301 *isp; | 1534 | struct isp1301 *isp; |
| @@ -1647,7 +1676,7 @@ module_init(isp_init); | |||
| 1647 | static void __exit isp_exit(void) | 1676 | static void __exit isp_exit(void) |
| 1648 | { | 1677 | { |
| 1649 | if (the_transceiver) | 1678 | if (the_transceiver) |
| 1650 | otg_set_transceiver(0); | 1679 | otg_set_transceiver(NULL); |
| 1651 | i2c_del_driver(&isp1301_driver); | 1680 | i2c_del_driver(&isp1301_driver); |
| 1652 | } | 1681 | } |
| 1653 | module_exit(isp_exit); | 1682 | module_exit(isp_exit); |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 5a485c22660a..c6a63f46bc15 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -631,7 +631,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 631 | 631 | ||
| 632 | /* detach any active clients. This must be done first, because | 632 | /* detach any active clients. This must be done first, because |
| 633 | * it can fail; in which case we give up. */ | 633 | * it can fail; in which case we give up. */ |
| 634 | list_for_each_entry_safe(client, _n, &adap->clients, list) { | 634 | list_for_each_entry_safe_reverse(client, _n, &adap->clients, list) { |
| 635 | struct i2c_driver *driver; | 635 | struct i2c_driver *driver; |
| 636 | 636 | ||
| 637 | driver = client->driver; | 637 | driver = client->driver; |
diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c index 2d848010499d..81f70caeb40f 100644 --- a/drivers/ide/icside.c +++ b/drivers/ide/icside.c | |||
| @@ -419,7 +419,7 @@ static void icside_setup_ports(hw_regs_t *hw, void __iomem *base, | |||
| 419 | hw->chipset = ide_acorn; | 419 | hw->chipset = ide_acorn; |
| 420 | } | 420 | } |
| 421 | 421 | ||
| 422 | static int __init | 422 | static int __devinit |
| 423 | icside_register_v5(struct icside_state *state, struct expansion_card *ec) | 423 | icside_register_v5(struct icside_state *state, struct expansion_card *ec) |
| 424 | { | 424 | { |
| 425 | void __iomem *base; | 425 | void __iomem *base; |
| @@ -473,7 +473,7 @@ static const struct ide_port_info icside_v6_port_info __initdata = { | |||
| 473 | .swdma_mask = ATA_SWDMA2, | 473 | .swdma_mask = ATA_SWDMA2, |
| 474 | }; | 474 | }; |
| 475 | 475 | ||
| 476 | static int __init | 476 | static int __devinit |
| 477 | icside_register_v6(struct icside_state *state, struct expansion_card *ec) | 477 | icside_register_v6(struct icside_state *state, struct expansion_card *ec) |
| 478 | { | 478 | { |
| 479 | void __iomem *ioc_base, *easi_base; | 479 | void __iomem *ioc_base, *easi_base; |
diff --git a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c index 918ffc4fc8ac..272543a42a43 100644 --- a/drivers/ieee1394/highlevel.c +++ b/drivers/ieee1394/highlevel.c | |||
| @@ -46,10 +46,6 @@ static DEFINE_RWLOCK(hl_irqs_lock); | |||
| 46 | 46 | ||
| 47 | static DEFINE_RWLOCK(addr_space_lock); | 47 | static DEFINE_RWLOCK(addr_space_lock); |
| 48 | 48 | ||
| 49 | /* addr_space list will have zero and max already included as bounds */ | ||
| 50 | static struct hpsb_address_ops dummy_ops = { NULL, NULL, NULL, NULL }; | ||
| 51 | static struct hpsb_address_serve dummy_zero_addr, dummy_max_addr; | ||
| 52 | |||
| 53 | 49 | ||
| 54 | static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, | 50 | static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl, |
| 55 | struct hpsb_host *host) | 51 | struct hpsb_host *host) |
| @@ -481,20 +477,23 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, | |||
| 481 | return retval; | 477 | return retval; |
| 482 | } | 478 | } |
| 483 | 479 | ||
| 480 | static struct hpsb_address_ops dummy_ops; | ||
| 481 | |||
| 482 | /* dummy address spaces as lower and upper bounds of the host's a.s. list */ | ||
| 484 | static void init_hpsb_highlevel(struct hpsb_host *host) | 483 | static void init_hpsb_highlevel(struct hpsb_host *host) |
| 485 | { | 484 | { |
| 486 | INIT_LIST_HEAD(&dummy_zero_addr.host_list); | 485 | INIT_LIST_HEAD(&host->dummy_zero_addr.host_list); |
| 487 | INIT_LIST_HEAD(&dummy_zero_addr.hl_list); | 486 | INIT_LIST_HEAD(&host->dummy_zero_addr.hl_list); |
| 488 | INIT_LIST_HEAD(&dummy_max_addr.host_list); | 487 | INIT_LIST_HEAD(&host->dummy_max_addr.host_list); |
| 489 | INIT_LIST_HEAD(&dummy_max_addr.hl_list); | 488 | INIT_LIST_HEAD(&host->dummy_max_addr.hl_list); |
| 490 | 489 | ||
| 491 | dummy_zero_addr.op = dummy_max_addr.op = &dummy_ops; | 490 | host->dummy_zero_addr.op = host->dummy_max_addr.op = &dummy_ops; |
| 492 | 491 | ||
| 493 | dummy_zero_addr.start = dummy_zero_addr.end = 0; | 492 | host->dummy_zero_addr.start = host->dummy_zero_addr.end = 0; |
| 494 | dummy_max_addr.start = dummy_max_addr.end = ((u64) 1) << 48; | 493 | host->dummy_max_addr.start = host->dummy_max_addr.end = ((u64) 1) << 48; |
| 495 | 494 | ||
| 496 | list_add_tail(&dummy_zero_addr.host_list, &host->addr_space); | 495 | list_add_tail(&host->dummy_zero_addr.host_list, &host->addr_space); |
| 497 | list_add_tail(&dummy_max_addr.host_list, &host->addr_space); | 496 | list_add_tail(&host->dummy_max_addr.host_list, &host->addr_space); |
| 498 | } | 497 | } |
| 499 | 498 | ||
| 500 | void highlevel_add_host(struct hpsb_host *host) | 499 | void highlevel_add_host(struct hpsb_host *host) |
diff --git a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h index e4e8aeb4d778..dd229950acca 100644 --- a/drivers/ieee1394/hosts.h +++ b/drivers/ieee1394/hosts.h | |||
| @@ -13,6 +13,7 @@ struct module; | |||
| 13 | 13 | ||
| 14 | #include "ieee1394_types.h" | 14 | #include "ieee1394_types.h" |
| 15 | #include "csr.h" | 15 | #include "csr.h" |
| 16 | #include "highlevel.h" | ||
| 16 | 17 | ||
| 17 | struct hpsb_packet; | 18 | struct hpsb_packet; |
| 18 | struct hpsb_iso; | 19 | struct hpsb_iso; |
| @@ -72,6 +73,9 @@ struct hpsb_host { | |||
| 72 | struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES]; | 73 | struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES]; |
| 73 | 74 | ||
| 74 | struct csr_control csr; | 75 | struct csr_control csr; |
| 76 | |||
| 77 | struct hpsb_address_serve dummy_zero_addr; | ||
| 78 | struct hpsb_address_serve dummy_max_addr; | ||
| 75 | }; | 79 | }; |
| 76 | 80 | ||
| 77 | enum devctl_cmd { | 81 | enum devctl_cmd { |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index c52f6e6e8af2..a373c18cf7b8 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
| @@ -402,6 +402,11 @@ static const struct { | |||
| 402 | }, | 402 | }, |
| 403 | /* iPod mini */ { | 403 | /* iPod mini */ { |
| 404 | .firmware_revision = 0x0a2700, | 404 | .firmware_revision = 0x0a2700, |
| 405 | .model_id = 0x000022, | ||
| 406 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | ||
| 407 | }, | ||
| 408 | /* iPod mini */ { | ||
| 409 | .firmware_revision = 0x0a2700, | ||
| 405 | .model_id = 0x000023, | 410 | .model_id = 0x000023, |
| 406 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, | 411 | .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, |
| 407 | }, | 412 | }, |
| @@ -890,12 +895,13 @@ static void sbp2_host_reset(struct hpsb_host *host) | |||
| 890 | return; | 895 | return; |
| 891 | 896 | ||
| 892 | read_lock_irqsave(&sbp2_hi_logical_units_lock, flags); | 897 | read_lock_irqsave(&sbp2_hi_logical_units_lock, flags); |
| 898 | |||
| 893 | list_for_each_entry(lu, &hi->logical_units, lu_list) | 899 | list_for_each_entry(lu, &hi->logical_units, lu_list) |
| 894 | if (likely(atomic_read(&lu->state) != | 900 | if (atomic_cmpxchg(&lu->state, |
| 895 | SBP2LU_STATE_IN_SHUTDOWN)) { | 901 | SBP2LU_STATE_RUNNING, SBP2LU_STATE_IN_RESET) |
| 896 | atomic_set(&lu->state, SBP2LU_STATE_IN_RESET); | 902 | == SBP2LU_STATE_RUNNING) |
| 897 | scsi_block_requests(lu->shost); | 903 | scsi_block_requests(lu->shost); |
| 898 | } | 904 | |
| 899 | read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags); | 905 | read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags); |
| 900 | } | 906 | } |
| 901 | 907 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h index 4df887af66a5..7fc35cf0cddf 100644 --- a/drivers/infiniband/hw/ehca/ehca_classes.h +++ b/drivers/infiniband/hw/ehca/ehca_classes.h | |||
| @@ -163,7 +163,8 @@ struct ehca_mod_qp_parm { | |||
| 163 | /* struct for tracking if cqes have been reported to the application */ | 163 | /* struct for tracking if cqes have been reported to the application */ |
| 164 | struct ehca_qmap_entry { | 164 | struct ehca_qmap_entry { |
| 165 | u16 app_wr_id; | 165 | u16 app_wr_id; |
| 166 | u16 reported; | 166 | u8 reported; |
| 167 | u8 cqe_req; | ||
| 167 | }; | 168 | }; |
| 168 | 169 | ||
| 169 | struct ehca_queue_map { | 170 | struct ehca_queue_map { |
| @@ -171,6 +172,7 @@ struct ehca_queue_map { | |||
| 171 | unsigned int entries; | 172 | unsigned int entries; |
| 172 | unsigned int tail; | 173 | unsigned int tail; |
| 173 | unsigned int left_to_poll; | 174 | unsigned int left_to_poll; |
| 175 | unsigned int next_wqe_idx; /* Idx to first wqe to be flushed */ | ||
| 174 | }; | 176 | }; |
| 175 | 177 | ||
| 176 | struct ehca_qp { | 178 | struct ehca_qp { |
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index bb02a86aa526..bec7e0249358 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
| @@ -994,8 +994,7 @@ static int ehca_mem_notifier(struct notifier_block *nb, | |||
| 994 | if (printk_timed_ratelimit(&ehca_dmem_warn_time, | 994 | if (printk_timed_ratelimit(&ehca_dmem_warn_time, |
| 995 | 30 * 1000)) | 995 | 30 * 1000)) |
| 996 | ehca_gen_err("DMEM operations are not allowed" | 996 | ehca_gen_err("DMEM operations are not allowed" |
| 997 | "as long as an ehca adapter is" | 997 | "in conjunction with eHCA"); |
| 998 | "attached to the LPAR"); | ||
| 999 | return NOTIFY_BAD; | 998 | return NOTIFY_BAD; |
| 1000 | } | 999 | } |
| 1001 | } | 1000 | } |
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index 9e05ee2db39b..cadbf0cdd910 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
| @@ -435,9 +435,13 @@ static void reset_queue_map(struct ehca_queue_map *qmap) | |||
| 435 | { | 435 | { |
| 436 | int i; | 436 | int i; |
| 437 | 437 | ||
| 438 | qmap->tail = 0; | 438 | qmap->tail = qmap->entries - 1; |
| 439 | for (i = 0; i < qmap->entries; i++) | 439 | qmap->left_to_poll = 0; |
| 440 | qmap->next_wqe_idx = 0; | ||
| 441 | for (i = 0; i < qmap->entries; i++) { | ||
| 440 | qmap->map[i].reported = 1; | 442 | qmap->map[i].reported = 1; |
| 443 | qmap->map[i].cqe_req = 0; | ||
| 444 | } | ||
| 441 | } | 445 | } |
| 442 | 446 | ||
| 443 | /* | 447 | /* |
| @@ -1121,6 +1125,7 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue, | |||
| 1121 | void *wqe_v; | 1125 | void *wqe_v; |
| 1122 | u64 q_ofs; | 1126 | u64 q_ofs; |
| 1123 | u32 wqe_idx; | 1127 | u32 wqe_idx; |
| 1128 | unsigned int tail_idx; | ||
| 1124 | 1129 | ||
| 1125 | /* convert real to abs address */ | 1130 | /* convert real to abs address */ |
| 1126 | wqe_p = wqe_p & (~(1UL << 63)); | 1131 | wqe_p = wqe_p & (~(1UL << 63)); |
| @@ -1133,12 +1138,17 @@ static int calc_left_cqes(u64 wqe_p, struct ipz_queue *ipz_queue, | |||
| 1133 | return -EFAULT; | 1138 | return -EFAULT; |
| 1134 | } | 1139 | } |
| 1135 | 1140 | ||
| 1141 | tail_idx = (qmap->tail + 1) % qmap->entries; | ||
| 1136 | wqe_idx = q_ofs / ipz_queue->qe_size; | 1142 | wqe_idx = q_ofs / ipz_queue->qe_size; |
| 1137 | if (wqe_idx < qmap->tail) | ||
| 1138 | qmap->left_to_poll = (qmap->entries - qmap->tail) + wqe_idx; | ||
| 1139 | else | ||
| 1140 | qmap->left_to_poll = wqe_idx - qmap->tail; | ||
| 1141 | 1143 | ||
| 1144 | /* check all processed wqes, whether a cqe is requested or not */ | ||
| 1145 | while (tail_idx != wqe_idx) { | ||
| 1146 | if (qmap->map[tail_idx].cqe_req) | ||
| 1147 | qmap->left_to_poll++; | ||
| 1148 | tail_idx = (tail_idx + 1) % qmap->entries; | ||
| 1149 | } | ||
| 1150 | /* save index in queue, where we have to start flushing */ | ||
| 1151 | qmap->next_wqe_idx = wqe_idx; | ||
| 1142 | return 0; | 1152 | return 0; |
| 1143 | } | 1153 | } |
| 1144 | 1154 | ||
| @@ -1185,10 +1195,14 @@ static int check_for_left_cqes(struct ehca_qp *my_qp, struct ehca_shca *shca) | |||
| 1185 | } else { | 1195 | } else { |
| 1186 | spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); | 1196 | spin_lock_irqsave(&my_qp->send_cq->spinlock, flags); |
| 1187 | my_qp->sq_map.left_to_poll = 0; | 1197 | my_qp->sq_map.left_to_poll = 0; |
| 1198 | my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % | ||
| 1199 | my_qp->sq_map.entries; | ||
| 1188 | spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); | 1200 | spin_unlock_irqrestore(&my_qp->send_cq->spinlock, flags); |
| 1189 | 1201 | ||
| 1190 | spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); | 1202 | spin_lock_irqsave(&my_qp->recv_cq->spinlock, flags); |
| 1191 | my_qp->rq_map.left_to_poll = 0; | 1203 | my_qp->rq_map.left_to_poll = 0; |
| 1204 | my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % | ||
| 1205 | my_qp->rq_map.entries; | ||
| 1192 | spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); | 1206 | spin_unlock_irqrestore(&my_qp->recv_cq->spinlock, flags); |
| 1193 | } | 1207 | } |
| 1194 | 1208 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c index 64928079eafa..00a648f4316c 100644 --- a/drivers/infiniband/hw/ehca/ehca_reqs.c +++ b/drivers/infiniband/hw/ehca/ehca_reqs.c | |||
| @@ -179,6 +179,7 @@ static inline int ehca_write_swqe(struct ehca_qp *qp, | |||
| 179 | 179 | ||
| 180 | qmap_entry->app_wr_id = get_app_wr_id(send_wr->wr_id); | 180 | qmap_entry->app_wr_id = get_app_wr_id(send_wr->wr_id); |
| 181 | qmap_entry->reported = 0; | 181 | qmap_entry->reported = 0; |
| 182 | qmap_entry->cqe_req = 0; | ||
| 182 | 183 | ||
| 183 | switch (send_wr->opcode) { | 184 | switch (send_wr->opcode) { |
| 184 | case IB_WR_SEND: | 185 | case IB_WR_SEND: |
| @@ -203,8 +204,10 @@ static inline int ehca_write_swqe(struct ehca_qp *qp, | |||
| 203 | 204 | ||
| 204 | if ((send_wr->send_flags & IB_SEND_SIGNALED || | 205 | if ((send_wr->send_flags & IB_SEND_SIGNALED || |
| 205 | qp->init_attr.sq_sig_type == IB_SIGNAL_ALL_WR) | 206 | qp->init_attr.sq_sig_type == IB_SIGNAL_ALL_WR) |
| 206 | && !hidden) | 207 | && !hidden) { |
| 207 | wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM; | 208 | wqe_p->wr_flag |= WQE_WRFLAG_REQ_SIGNAL_COM; |
| 209 | qmap_entry->cqe_req = 1; | ||
| 210 | } | ||
| 208 | 211 | ||
| 209 | if (send_wr->opcode == IB_WR_SEND_WITH_IMM || | 212 | if (send_wr->opcode == IB_WR_SEND_WITH_IMM || |
| 210 | send_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { | 213 | send_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { |
| @@ -569,6 +572,7 @@ static int internal_post_recv(struct ehca_qp *my_qp, | |||
| 569 | qmap_entry = &my_qp->rq_map.map[rq_map_idx]; | 572 | qmap_entry = &my_qp->rq_map.map[rq_map_idx]; |
| 570 | qmap_entry->app_wr_id = get_app_wr_id(cur_recv_wr->wr_id); | 573 | qmap_entry->app_wr_id = get_app_wr_id(cur_recv_wr->wr_id); |
| 571 | qmap_entry->reported = 0; | 574 | qmap_entry->reported = 0; |
| 575 | qmap_entry->cqe_req = 1; | ||
| 572 | 576 | ||
| 573 | wqe_cnt++; | 577 | wqe_cnt++; |
| 574 | } /* eof for cur_recv_wr */ | 578 | } /* eof for cur_recv_wr */ |
| @@ -706,27 +710,34 @@ repoll: | |||
| 706 | goto repoll; | 710 | goto repoll; |
| 707 | wc->qp = &my_qp->ib_qp; | 711 | wc->qp = &my_qp->ib_qp; |
| 708 | 712 | ||
| 713 | qmap_tail_idx = get_app_wr_id(cqe->work_request_id); | ||
| 714 | if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT)) | ||
| 715 | /* We got a send completion. */ | ||
| 716 | qmap = &my_qp->sq_map; | ||
| 717 | else | ||
| 718 | /* We got a receive completion. */ | ||
| 719 | qmap = &my_qp->rq_map; | ||
| 720 | |||
| 721 | /* advance the tail pointer */ | ||
| 722 | qmap->tail = qmap_tail_idx; | ||
| 723 | |||
| 709 | if (is_error) { | 724 | if (is_error) { |
| 710 | /* | 725 | /* |
| 711 | * set left_to_poll to 0 because in error state, we will not | 726 | * set left_to_poll to 0 because in error state, we will not |
| 712 | * get any additional CQEs | 727 | * get any additional CQEs |
| 713 | */ | 728 | */ |
| 714 | ehca_add_to_err_list(my_qp, 1); | 729 | my_qp->sq_map.next_wqe_idx = (my_qp->sq_map.tail + 1) % |
| 730 | my_qp->sq_map.entries; | ||
| 715 | my_qp->sq_map.left_to_poll = 0; | 731 | my_qp->sq_map.left_to_poll = 0; |
| 732 | ehca_add_to_err_list(my_qp, 1); | ||
| 716 | 733 | ||
| 734 | my_qp->rq_map.next_wqe_idx = (my_qp->rq_map.tail + 1) % | ||
| 735 | my_qp->rq_map.entries; | ||
| 736 | my_qp->rq_map.left_to_poll = 0; | ||
| 717 | if (HAS_RQ(my_qp)) | 737 | if (HAS_RQ(my_qp)) |
| 718 | ehca_add_to_err_list(my_qp, 0); | 738 | ehca_add_to_err_list(my_qp, 0); |
| 719 | my_qp->rq_map.left_to_poll = 0; | ||
| 720 | } | 739 | } |
| 721 | 740 | ||
| 722 | qmap_tail_idx = get_app_wr_id(cqe->work_request_id); | ||
| 723 | if (!(cqe->w_completion_flags & WC_SEND_RECEIVE_BIT)) | ||
| 724 | /* We got a send completion. */ | ||
| 725 | qmap = &my_qp->sq_map; | ||
| 726 | else | ||
| 727 | /* We got a receive completion. */ | ||
| 728 | qmap = &my_qp->rq_map; | ||
| 729 | |||
| 730 | qmap_entry = &qmap->map[qmap_tail_idx]; | 741 | qmap_entry = &qmap->map[qmap_tail_idx]; |
| 731 | if (qmap_entry->reported) { | 742 | if (qmap_entry->reported) { |
| 732 | ehca_warn(cq->device, "Double cqe on qp_num=%#x", | 743 | ehca_warn(cq->device, "Double cqe on qp_num=%#x", |
| @@ -738,10 +749,6 @@ repoll: | |||
| 738 | wc->wr_id = replace_wr_id(cqe->work_request_id, qmap_entry->app_wr_id); | 749 | wc->wr_id = replace_wr_id(cqe->work_request_id, qmap_entry->app_wr_id); |
| 739 | qmap_entry->reported = 1; | 750 | qmap_entry->reported = 1; |
| 740 | 751 | ||
| 741 | /* this is a proper completion, we need to advance the tail pointer */ | ||
| 742 | if (++qmap->tail == qmap->entries) | ||
| 743 | qmap->tail = 0; | ||
| 744 | |||
| 745 | /* if left_to_poll is decremented to 0, add the QP to the error list */ | 752 | /* if left_to_poll is decremented to 0, add the QP to the error list */ |
| 746 | if (qmap->left_to_poll > 0) { | 753 | if (qmap->left_to_poll > 0) { |
| 747 | qmap->left_to_poll--; | 754 | qmap->left_to_poll--; |
| @@ -805,13 +812,14 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq, | |||
| 805 | else | 812 | else |
| 806 | qmap = &my_qp->rq_map; | 813 | qmap = &my_qp->rq_map; |
| 807 | 814 | ||
| 808 | qmap_entry = &qmap->map[qmap->tail]; | 815 | qmap_entry = &qmap->map[qmap->next_wqe_idx]; |
| 809 | 816 | ||
| 810 | while ((nr < num_entries) && (qmap_entry->reported == 0)) { | 817 | while ((nr < num_entries) && (qmap_entry->reported == 0)) { |
| 811 | /* generate flush CQE */ | 818 | /* generate flush CQE */ |
| 819 | |||
| 812 | memset(wc, 0, sizeof(*wc)); | 820 | memset(wc, 0, sizeof(*wc)); |
| 813 | 821 | ||
| 814 | offset = qmap->tail * ipz_queue->qe_size; | 822 | offset = qmap->next_wqe_idx * ipz_queue->qe_size; |
| 815 | wqe = (struct ehca_wqe *)ipz_qeit_calc(ipz_queue, offset); | 823 | wqe = (struct ehca_wqe *)ipz_qeit_calc(ipz_queue, offset); |
| 816 | if (!wqe) { | 824 | if (!wqe) { |
| 817 | ehca_err(cq->device, "Invalid wqe offset=%#lx on " | 825 | ehca_err(cq->device, "Invalid wqe offset=%#lx on " |
| @@ -850,11 +858,12 @@ static int generate_flush_cqes(struct ehca_qp *my_qp, struct ib_cq *cq, | |||
| 850 | 858 | ||
| 851 | wc->qp = &my_qp->ib_qp; | 859 | wc->qp = &my_qp->ib_qp; |
| 852 | 860 | ||
| 853 | /* mark as reported and advance tail pointer */ | 861 | /* mark as reported and advance next_wqe pointer */ |
| 854 | qmap_entry->reported = 1; | 862 | qmap_entry->reported = 1; |
| 855 | if (++qmap->tail == qmap->entries) | 863 | qmap->next_wqe_idx++; |
| 856 | qmap->tail = 0; | 864 | if (qmap->next_wqe_idx == qmap->entries) |
| 857 | qmap_entry = &qmap->map[qmap->tail]; | 865 | qmap->next_wqe_idx = 0; |
| 866 | qmap_entry = &qmap->map[qmap->next_wqe_idx]; | ||
| 858 | 867 | ||
| 859 | wc++; nr++; | 868 | wc++; nr++; |
| 860 | } | 869 | } |
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index d0866a3636e2..18308494a195 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
| @@ -343,6 +343,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
| 343 | { | 343 | { |
| 344 | struct mlx4_ib_dev *dev = to_mdev(ibcq->device); | 344 | struct mlx4_ib_dev *dev = to_mdev(ibcq->device); |
| 345 | struct mlx4_ib_cq *cq = to_mcq(ibcq); | 345 | struct mlx4_ib_cq *cq = to_mcq(ibcq); |
| 346 | struct mlx4_mtt mtt; | ||
| 346 | int outst_cqe; | 347 | int outst_cqe; |
| 347 | int err; | 348 | int err; |
| 348 | 349 | ||
| @@ -376,10 +377,13 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
| 376 | goto out; | 377 | goto out; |
| 377 | } | 378 | } |
| 378 | 379 | ||
| 380 | mtt = cq->buf.mtt; | ||
| 381 | |||
| 379 | err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt); | 382 | err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt); |
| 380 | if (err) | 383 | if (err) |
| 381 | goto err_buf; | 384 | goto err_buf; |
| 382 | 385 | ||
| 386 | mlx4_mtt_cleanup(dev->dev, &mtt); | ||
| 383 | if (ibcq->uobject) { | 387 | if (ibcq->uobject) { |
| 384 | cq->buf = cq->resize_buf->buf; | 388 | cq->buf = cq->resize_buf->buf; |
| 385 | cq->ibcq.cqe = cq->resize_buf->cqe; | 389 | cq->ibcq.cqe = cq->resize_buf->cqe; |
| @@ -406,6 +410,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) | |||
| 406 | goto out; | 410 | goto out; |
| 407 | 411 | ||
| 408 | err_buf: | 412 | err_buf: |
| 413 | mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt); | ||
| 409 | if (!ibcq->uobject) | 414 | if (!ibcq->uobject) |
| 410 | mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf, | 415 | mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf, |
| 411 | cq->resize_buf->cqe); | 416 | cq->resize_buf->cqe); |
diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c index 6790e975a98c..bc4e40f3ede7 100644 --- a/drivers/input/ff-memless.c +++ b/drivers/input/ff-memless.c | |||
| @@ -397,8 +397,9 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
| 397 | { | 397 | { |
| 398 | struct ml_device *ml = dev->ff->private; | 398 | struct ml_device *ml = dev->ff->private; |
| 399 | struct ml_effect_state *state = &ml->states[effect_id]; | 399 | struct ml_effect_state *state = &ml->states[effect_id]; |
| 400 | unsigned long flags; | ||
| 400 | 401 | ||
| 401 | spin_lock_bh(&ml->timer_lock); | 402 | spin_lock_irqsave(&ml->timer_lock, flags); |
| 402 | 403 | ||
| 403 | if (value > 0) { | 404 | if (value > 0) { |
| 404 | debug("initiated play"); | 405 | debug("initiated play"); |
| @@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) | |||
| 424 | ml_play_effects(ml); | 425 | ml_play_effects(ml); |
| 425 | } | 426 | } |
| 426 | 427 | ||
| 427 | spin_unlock_bh(&ml->timer_lock); | 428 | spin_unlock_irqrestore(&ml->timer_lock, flags); |
| 428 | 429 | ||
| 429 | return 0; | 430 | return 0; |
| 430 | } | 431 | } |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 22016ca15351..379b7ff354ec 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
| @@ -824,7 +824,7 @@ static void atkbd_disconnect(struct serio *serio) | |||
| 824 | atkbd_disable(atkbd); | 824 | atkbd_disable(atkbd); |
| 825 | 825 | ||
| 826 | /* make sure we don't have a command in flight */ | 826 | /* make sure we don't have a command in flight */ |
| 827 | flush_scheduled_work(); | 827 | cancel_delayed_work_sync(&atkbd->event_work); |
| 828 | 828 | ||
| 829 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); | 829 | sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); |
| 830 | input_unregister_device(atkbd->dev); | 830 | input_unregister_device(atkbd->dev); |
| @@ -868,6 +868,22 @@ static void atkbd_hp_keymap_fixup(struct atkbd *atkbd) | |||
| 868 | } | 868 | } |
| 869 | 869 | ||
| 870 | /* | 870 | /* |
| 871 | * Inventec system with broken key release on volume keys | ||
| 872 | */ | ||
| 873 | static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd) | ||
| 874 | { | ||
| 875 | const unsigned int forced_release_keys[] = { | ||
| 876 | 0xae, 0xb0, | ||
| 877 | }; | ||
| 878 | int i; | ||
| 879 | |||
| 880 | if (atkbd->set == 2) | ||
| 881 | for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++) | ||
| 882 | __set_bit(forced_release_keys[i], | ||
| 883 | atkbd->force_release_mask); | ||
| 884 | } | ||
| 885 | |||
| 886 | /* | ||
| 871 | * atkbd_set_keycode_table() initializes keyboard's keycode table | 887 | * atkbd_set_keycode_table() initializes keyboard's keycode table |
| 872 | * according to the selected scancode set | 888 | * according to the selected scancode set |
| 873 | */ | 889 | */ |
| @@ -1468,6 +1484,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
| 1468 | .callback = atkbd_setup_fixup, | 1484 | .callback = atkbd_setup_fixup, |
| 1469 | .driver_data = atkbd_hp_keymap_fixup, | 1485 | .driver_data = atkbd_hp_keymap_fixup, |
| 1470 | }, | 1486 | }, |
| 1487 | { | ||
| 1488 | .ident = "Inventec Symphony", | ||
| 1489 | .matches = { | ||
| 1490 | DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), | ||
| 1491 | DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), | ||
| 1492 | }, | ||
| 1493 | .callback = atkbd_setup_fixup, | ||
| 1494 | .driver_data = atkbd_inventec_keymap_fixup, | ||
| 1495 | }, | ||
| 1471 | { } | 1496 | { } |
| 1472 | }; | 1497 | }; |
| 1473 | 1498 | ||
diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c index bce160f4349b..86457feccfc4 100644 --- a/drivers/input/misc/cm109.c +++ b/drivers/input/misc/cm109.c | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | 42 | ||
| 43 | static char *phone = "kip1000"; | 43 | static char *phone = "kip1000"; |
| 44 | module_param(phone, charp, S_IRUSR); | 44 | module_param(phone, charp, S_IRUSR); |
| 45 | MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01}"); | 45 | MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01, atcom}"); |
| 46 | 46 | ||
| 47 | enum { | 47 | enum { |
| 48 | /* HID Registers */ | 48 | /* HID Registers */ |
| @@ -258,6 +258,37 @@ static unsigned short keymap_usbph01(int scancode) | |||
| 258 | } | 258 | } |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | /* | ||
| 262 | * Keymap for ATCom AU-100 | ||
| 263 | * http://www.atcom.cn/En_products_AU100.html | ||
| 264 | * http://www.packetizer.com/products/au100/ | ||
| 265 | * http://www.voip-info.org/wiki/view/AU-100 | ||
| 266 | * | ||
| 267 | * Contributed by daniel@gimpelevich.san-francisco.ca.us | ||
| 268 | */ | ||
| 269 | static unsigned short keymap_atcom(int scancode) | ||
| 270 | { | ||
| 271 | switch (scancode) { /* phone key: */ | ||
| 272 | case 0x82: return KEY_NUMERIC_0; /* 0 */ | ||
| 273 | case 0x11: return KEY_NUMERIC_1; /* 1 */ | ||
| 274 | case 0x12: return KEY_NUMERIC_2; /* 2 */ | ||
| 275 | case 0x14: return KEY_NUMERIC_3; /* 3 */ | ||
| 276 | case 0x21: return KEY_NUMERIC_4; /* 4 */ | ||
| 277 | case 0x22: return KEY_NUMERIC_5; /* 5 */ | ||
| 278 | case 0x24: return KEY_NUMERIC_6; /* 6 */ | ||
| 279 | case 0x41: return KEY_NUMERIC_7; /* 7 */ | ||
| 280 | case 0x42: return KEY_NUMERIC_8; /* 8 */ | ||
| 281 | case 0x44: return KEY_NUMERIC_9; /* 9 */ | ||
| 282 | case 0x84: return KEY_NUMERIC_POUND; /* # */ | ||
| 283 | case 0x81: return KEY_NUMERIC_STAR; /* * */ | ||
| 284 | case 0x18: return KEY_ENTER; /* pickup */ | ||
| 285 | case 0x28: return KEY_ESC; /* hangup */ | ||
| 286 | case 0x48: return KEY_LEFT; /* left arrow */ | ||
| 287 | case 0x88: return KEY_RIGHT; /* right arrow */ | ||
| 288 | default: return special_keymap(scancode); | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 261 | static unsigned short (*keymap)(int) = keymap_kip1000; | 292 | static unsigned short (*keymap)(int) = keymap_kip1000; |
| 262 | 293 | ||
| 263 | /* | 294 | /* |
| @@ -840,6 +871,10 @@ static int __init cm109_select_keymap(void) | |||
| 840 | keymap = keymap_usbph01; | 871 | keymap = keymap_usbph01; |
| 841 | printk(KERN_INFO KBUILD_MODNAME ": " | 872 | printk(KERN_INFO KBUILD_MODNAME ": " |
| 842 | "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); | 873 | "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); |
| 874 | } else if (!strcasecmp(phone, "atcom")) { | ||
| 875 | keymap = keymap_atcom; | ||
| 876 | printk(KERN_INFO KBUILD_MODNAME ": " | ||
| 877 | "Keymap for ATCom AU-100 phone loaded\n"); | ||
| 843 | } else { | 878 | } else { |
| 844 | printk(KERN_ERR KBUILD_MODNAME ": " | 879 | printk(KERN_ERR KBUILD_MODNAME ": " |
| 845 | "Unsupported phone: %s\n", phone); | 880 | "Unsupported phone: %s\n", phone); |
diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c index e82d34201e97..88f04bf2ad6c 100644 --- a/drivers/input/mouse/hgpk.c +++ b/drivers/input/mouse/hgpk.c | |||
| @@ -125,7 +125,7 @@ static void hgpk_spewing_hack(struct psmouse *psmouse, | |||
| 125 | */ | 125 | */ |
| 126 | static int hgpk_validate_byte(unsigned char *packet) | 126 | static int hgpk_validate_byte(unsigned char *packet) |
| 127 | { | 127 | { |
| 128 | return (packet[0] & 0x0C) == 0x08; | 128 | return (packet[0] & 0x0C) != 0x08; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static void hgpk_process_packet(struct psmouse *psmouse) | 131 | static void hgpk_process_packet(struct psmouse *psmouse) |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index eec375cd10e6..29e686388a2c 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -337,6 +337,20 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
| 337 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), | 337 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), |
| 338 | }, | 338 | }, |
| 339 | }, | 339 | }, |
| 340 | { | ||
| 341 | .ident = "Dell XPS M1530", | ||
| 342 | .matches = { | ||
| 343 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 344 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), | ||
| 345 | }, | ||
| 346 | }, | ||
| 347 | { | ||
| 348 | .ident = "Compal HEL80I", | ||
| 349 | .matches = { | ||
| 350 | DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), | ||
| 351 | DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), | ||
| 352 | }, | ||
| 353 | }, | ||
| 340 | { } | 354 | { } |
| 341 | }; | 355 | }; |
| 342 | 356 | ||
diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h index ca62ec639f8f..677680e9f54f 100644 --- a/drivers/input/tablet/wacom.h +++ b/drivers/input/tablet/wacom.h | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | * - Support Intuos3 4x6 | 66 | * - Support Intuos3 4x6 |
| 67 | * v1.47 (pc) - Added support for Bamboo | 67 | * v1.47 (pc) - Added support for Bamboo |
| 68 | * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX | 68 | * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX |
| 69 | * v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A) | ||
| 69 | */ | 70 | */ |
| 70 | 71 | ||
| 71 | /* | 72 | /* |
| @@ -86,7 +87,7 @@ | |||
| 86 | /* | 87 | /* |
| 87 | * Version Information | 88 | * Version Information |
| 88 | */ | 89 | */ |
| 89 | #define DRIVER_VERSION "v1.48" | 90 | #define DRIVER_VERSION "v1.49" |
| 90 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" | 91 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" |
| 91 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" | 92 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" |
| 92 | #define DRIVER_LICENSE "GPL" | 93 | #define DRIVER_LICENSE "GPL" |
| @@ -103,15 +104,15 @@ struct wacom { | |||
| 103 | struct usb_device *usbdev; | 104 | struct usb_device *usbdev; |
| 104 | struct usb_interface *intf; | 105 | struct usb_interface *intf; |
| 105 | struct urb *irq; | 106 | struct urb *irq; |
| 106 | struct wacom_wac * wacom_wac; | 107 | struct wacom_wac *wacom_wac; |
| 107 | struct mutex lock; | 108 | struct mutex lock; |
| 108 | unsigned int open:1; | 109 | unsigned int open:1; |
| 109 | char phys[32]; | 110 | char phys[32]; |
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | struct wacom_combo { | 113 | struct wacom_combo { |
| 113 | struct wacom * wacom; | 114 | struct wacom *wacom; |
| 114 | struct urb * urb; | 115 | struct urb *urb; |
| 115 | }; | 116 | }; |
| 116 | 117 | ||
| 117 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); | 118 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); |
| @@ -132,7 +133,7 @@ extern void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wa | |||
| 132 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); | 133 | extern void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac); |
| 133 | extern __u16 wacom_le16_to_cpu(unsigned char *data); | 134 | extern __u16 wacom_le16_to_cpu(unsigned char *data); |
| 134 | extern __u16 wacom_be16_to_cpu(unsigned char *data); | 135 | extern __u16 wacom_be16_to_cpu(unsigned char *data); |
| 135 | extern struct wacom_features * get_wacom_feature(const struct usb_device_id *id); | 136 | extern struct wacom_features *get_wacom_feature(const struct usb_device_id *id); |
| 136 | extern const struct usb_device_id * get_device_table(void); | 137 | extern const struct usb_device_id *get_device_table(void); |
| 137 | 138 | ||
| 138 | #endif | 139 | #endif |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 09e227aa0d49..484496daa0f3 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -14,8 +14,41 @@ | |||
| 14 | #include "wacom.h" | 14 | #include "wacom.h" |
| 15 | #include "wacom_wac.h" | 15 | #include "wacom_wac.h" |
| 16 | 16 | ||
| 17 | /* defines to get HID report descriptor */ | ||
| 18 | #define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01) | ||
| 19 | #define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02) | ||
| 20 | #define HID_USAGE_UNDEFINED 0x00 | ||
| 21 | #define HID_USAGE_PAGE 0x05 | ||
| 22 | #define HID_USAGE_PAGE_DIGITIZER 0x0d | ||
| 23 | #define HID_USAGE_PAGE_DESKTOP 0x01 | ||
| 24 | #define HID_USAGE 0x09 | ||
| 25 | #define HID_USAGE_X 0x30 | ||
| 26 | #define HID_USAGE_Y 0x31 | ||
| 27 | #define HID_USAGE_X_TILT 0x3d | ||
| 28 | #define HID_USAGE_Y_TILT 0x3e | ||
| 29 | #define HID_USAGE_FINGER 0x22 | ||
| 30 | #define HID_USAGE_STYLUS 0x20 | ||
| 31 | #define HID_COLLECTION 0xc0 | ||
| 32 | |||
| 33 | enum { | ||
| 34 | WCM_UNDEFINED = 0, | ||
| 35 | WCM_DESKTOP, | ||
| 36 | WCM_DIGITIZER, | ||
| 37 | }; | ||
| 38 | |||
| 39 | struct hid_descriptor { | ||
| 40 | struct usb_descriptor_header header; | ||
| 41 | __le16 bcdHID; | ||
| 42 | u8 bCountryCode; | ||
| 43 | u8 bNumDescriptors; | ||
| 44 | u8 bDescriptorType; | ||
| 45 | __le16 wDescriptorLength; | ||
| 46 | } __attribute__ ((packed)); | ||
| 47 | |||
| 48 | /* defines to get/set USB message */ | ||
| 17 | #define USB_REQ_GET_REPORT 0x01 | 49 | #define USB_REQ_GET_REPORT 0x01 |
| 18 | #define USB_REQ_SET_REPORT 0x09 | 50 | #define USB_REQ_SET_REPORT 0x09 |
| 51 | #define WAC_HID_FEATURE_REPORT 0x03 | ||
| 19 | 52 | ||
| 20 | static int usb_get_report(struct usb_interface *intf, unsigned char type, | 53 | static int usb_get_report(struct usb_interface *intf, unsigned char type, |
| 21 | unsigned char id, void *buf, int size) | 54 | unsigned char id, void *buf, int size) |
| @@ -80,25 +113,21 @@ static void wacom_sys_irq(struct urb *urb) | |||
| 80 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) | 113 | void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) |
| 81 | { | 114 | { |
| 82 | input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); | 115 | input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); |
| 83 | return; | ||
| 84 | } | 116 | } |
| 85 | 117 | ||
| 86 | void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) | 118 | void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) |
| 87 | { | 119 | { |
| 88 | input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); | 120 | input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); |
| 89 | return; | ||
| 90 | } | 121 | } |
| 91 | 122 | ||
| 92 | void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) | 123 | void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) |
| 93 | { | 124 | { |
| 94 | input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); | 125 | input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); |
| 95 | return; | ||
| 96 | } | 126 | } |
| 97 | 127 | ||
| 98 | void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) | 128 | void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) |
| 99 | { | 129 | { |
| 100 | input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); | 130 | input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); |
| 101 | return; | ||
| 102 | } | 131 | } |
| 103 | 132 | ||
| 104 | __u16 wacom_be16_to_cpu(unsigned char *data) | 133 | __u16 wacom_be16_to_cpu(unsigned char *data) |
| @@ -118,7 +147,6 @@ __u16 wacom_le16_to_cpu(unsigned char *data) | |||
| 118 | void wacom_input_sync(void *wcombo) | 147 | void wacom_input_sync(void *wcombo) |
| 119 | { | 148 | { |
| 120 | input_sync(get_input_dev((struct wacom_combo *)wcombo)); | 149 | input_sync(get_input_dev((struct wacom_combo *)wcombo)); |
| 121 | return; | ||
| 122 | } | 150 | } |
| 123 | 151 | ||
| 124 | static int wacom_open(struct input_dev *dev) | 152 | static int wacom_open(struct input_dev *dev) |
| @@ -160,7 +188,7 @@ static void wacom_close(struct input_dev *dev) | |||
| 160 | 188 | ||
| 161 | void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 189 | void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 162 | { | 190 | { |
| 163 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_1) | | 191 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_1) | |
| 164 | BIT_MASK(BTN_5); | 192 | BIT_MASK(BTN_5); |
| 165 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); | 193 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); |
| 166 | } | 194 | } |
| @@ -170,7 +198,7 @@ void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 170 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); | 198 | input_dev->evbit[0] |= BIT_MASK(EV_MSC); |
| 171 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 199 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
| 172 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); | 200 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); |
| 173 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) | | 201 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | |
| 174 | BIT_MASK(BTN_4); | 202 | BIT_MASK(BTN_4); |
| 175 | } | 203 | } |
| 176 | 204 | ||
| @@ -178,7 +206,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 178 | { | 206 | { |
| 179 | input_dev->evbit[0] |= BIT_MASK(EV_REL); | 207 | input_dev->evbit[0] |= BIT_MASK(EV_REL); |
| 180 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); | 208 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); |
| 181 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) | | 209 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | |
| 182 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); | 210 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); |
| 183 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 211 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
| 184 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); | 212 | BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); |
| @@ -188,7 +216,7 @@ void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 188 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 216 | void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 189 | { | 217 | { |
| 190 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); | 218 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); |
| 191 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) | | 219 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | |
| 192 | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); | 220 | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); |
| 193 | input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); | 221 | input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); |
| 194 | input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); | 222 | input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); |
| @@ -196,14 +224,14 @@ void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 196 | 224 | ||
| 197 | void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 225 | void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 198 | { | 226 | { |
| 199 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_4) | | 227 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) | |
| 200 | BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); | 228 | BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); |
| 201 | input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); | 229 | input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); |
| 202 | } | 230 | } |
| 203 | 231 | ||
| 204 | void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 232 | void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 205 | { | 233 | { |
| 206 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); | 234 | input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); |
| 207 | } | 235 | } |
| 208 | 236 | ||
| 209 | void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 237 | void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| @@ -211,7 +239,7 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 211 | input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); | 239 | input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); |
| 212 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); | 240 | input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); |
| 213 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); | 241 | input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); |
| 214 | input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) | | 242 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | |
| 215 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | | 243 | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | |
| 216 | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); | 244 | BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); |
| 217 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | | 245 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | |
| @@ -228,8 +256,7 @@ void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 228 | 256 | ||
| 229 | void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 257 | void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| 230 | { | 258 | { |
| 231 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2) | | 259 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2); |
| 232 | BIT_MASK(BTN_TOOL_RUBBER); | ||
| 233 | } | 260 | } |
| 234 | 261 | ||
| 235 | void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | 262 | void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) |
| @@ -237,15 +264,129 @@ void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) | |||
| 237 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); | 264 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); |
| 238 | } | 265 | } |
| 239 | 266 | ||
| 267 | static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc, | ||
| 268 | struct wacom_wac *wacom_wac) | ||
| 269 | { | ||
| 270 | struct usb_device *dev = interface_to_usbdev(intf); | ||
| 271 | struct wacom_features *features = wacom_wac->features; | ||
| 272 | char limit = 0, result = 0; | ||
| 273 | int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; | ||
| 274 | unsigned char *report; | ||
| 275 | |||
| 276 | report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); | ||
| 277 | if (!report) | ||
| 278 | return -ENOMEM; | ||
| 279 | |||
| 280 | /* retrive report descriptors */ | ||
| 281 | do { | ||
| 282 | result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), | ||
| 283 | USB_REQ_GET_DESCRIPTOR, | ||
| 284 | USB_RECIP_INTERFACE | USB_DIR_IN, | ||
| 285 | HID_DEVICET_REPORT << 8, | ||
| 286 | intf->altsetting[0].desc.bInterfaceNumber, /* interface */ | ||
| 287 | report, | ||
| 288 | hid_desc->wDescriptorLength, | ||
| 289 | 5000); /* 5 secs */ | ||
| 290 | } while (result < 0 && limit++ < 5); | ||
| 291 | |||
| 292 | if (result < 0) | ||
| 293 | goto out; | ||
| 294 | |||
| 295 | for (i = 0; i < hid_desc->wDescriptorLength; i++) { | ||
| 296 | |||
| 297 | switch (report[i]) { | ||
| 298 | case HID_USAGE_PAGE: | ||
| 299 | switch (report[i + 1]) { | ||
| 300 | case HID_USAGE_PAGE_DIGITIZER: | ||
| 301 | usage = WCM_DIGITIZER; | ||
| 302 | i++; | ||
| 303 | break; | ||
| 304 | |||
| 305 | case HID_USAGE_PAGE_DESKTOP: | ||
| 306 | usage = WCM_DESKTOP; | ||
| 307 | i++; | ||
| 308 | break; | ||
| 309 | } | ||
| 310 | break; | ||
| 311 | |||
| 312 | case HID_USAGE: | ||
| 313 | switch (report[i + 1]) { | ||
| 314 | case HID_USAGE_X: | ||
| 315 | if (usage == WCM_DESKTOP) { | ||
| 316 | if (finger) { | ||
| 317 | features->touch_x_max = | ||
| 318 | features->touch_y_max = | ||
| 319 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 320 | features->x_max = | ||
| 321 | wacom_le16_to_cpu(&report[i + 6]); | ||
| 322 | i += 7; | ||
| 323 | } else if (pen) { | ||
| 324 | features->x_max = | ||
| 325 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 326 | i += 4; | ||
| 327 | } | ||
| 328 | } else if (usage == WCM_DIGITIZER) { | ||
| 329 | /* max pressure isn't reported | ||
| 330 | features->pressure_max = (unsigned short) | ||
| 331 | (report[i+4] << 8 | report[i + 3]); | ||
| 332 | */ | ||
| 333 | features->pressure_max = 255; | ||
| 334 | i += 4; | ||
| 335 | } | ||
| 336 | break; | ||
| 337 | |||
| 338 | case HID_USAGE_Y: | ||
| 339 | if (usage == WCM_DESKTOP) | ||
| 340 | features->y_max = | ||
| 341 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 342 | i += 4; | ||
| 343 | break; | ||
| 344 | |||
| 345 | case HID_USAGE_FINGER: | ||
| 346 | finger = 1; | ||
| 347 | i++; | ||
| 348 | break; | ||
| 349 | |||
| 350 | case HID_USAGE_STYLUS: | ||
| 351 | pen = 1; | ||
| 352 | i++; | ||
| 353 | break; | ||
| 354 | |||
| 355 | case HID_USAGE_UNDEFINED: | ||
| 356 | if (usage == WCM_DESKTOP && finger) /* capacity */ | ||
| 357 | features->pressure_max = | ||
| 358 | wacom_le16_to_cpu(&report[i + 3]); | ||
| 359 | i += 4; | ||
| 360 | break; | ||
| 361 | } | ||
| 362 | break; | ||
| 363 | |||
| 364 | case HID_COLLECTION: | ||
| 365 | /* reset UsagePage ans Finger */ | ||
| 366 | finger = usage = 0; | ||
| 367 | break; | ||
| 368 | } | ||
| 369 | } | ||
| 370 | |||
| 371 | result = 0; | ||
| 372 | |||
| 373 | out: | ||
| 374 | kfree(report); | ||
| 375 | return result; | ||
| 376 | } | ||
| 377 | |||
| 240 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) | 378 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) |
| 241 | { | 379 | { |
| 242 | struct usb_device *dev = interface_to_usbdev(intf); | 380 | struct usb_device *dev = interface_to_usbdev(intf); |
| 381 | struct usb_host_interface *interface = intf->cur_altsetting; | ||
| 243 | struct usb_endpoint_descriptor *endpoint; | 382 | struct usb_endpoint_descriptor *endpoint; |
| 244 | struct wacom *wacom; | 383 | struct wacom *wacom; |
| 245 | struct wacom_wac *wacom_wac; | 384 | struct wacom_wac *wacom_wac; |
| 385 | struct wacom_features *features; | ||
| 246 | struct input_dev *input_dev; | 386 | struct input_dev *input_dev; |
| 247 | int error = -ENOMEM; | 387 | int error = -ENOMEM; |
| 248 | char rep_data[2], limit = 0; | 388 | char rep_data[2], limit = 0; |
| 389 | struct hid_descriptor *hid_desc; | ||
| 249 | 390 | ||
| 250 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 391 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
| 251 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); | 392 | wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); |
| @@ -268,8 +409,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 268 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); | 409 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); |
| 269 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); | 410 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); |
| 270 | 411 | ||
| 271 | wacom_wac->features = get_wacom_feature(id); | 412 | wacom_wac->features = features = get_wacom_feature(id); |
| 272 | BUG_ON(wacom_wac->features->pktlen > 10); | 413 | BUG_ON(features->pktlen > 10); |
| 273 | 414 | ||
| 274 | input_dev->name = wacom_wac->features->name; | 415 | input_dev->name = wacom_wac->features->name; |
| 275 | wacom->wacom_wac = wacom_wac; | 416 | wacom->wacom_wac = wacom_wac; |
| @@ -282,18 +423,37 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 282 | input_dev->open = wacom_open; | 423 | input_dev->open = wacom_open; |
| 283 | input_dev->close = wacom_close; | 424 | input_dev->close = wacom_close; |
| 284 | 425 | ||
| 426 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | ||
| 427 | |||
| 428 | /* TabletPC need to retrieve the physical and logical maximum from report descriptor */ | ||
| 429 | if (wacom_wac->features->type == TABLETPC) { | ||
| 430 | if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { | ||
| 431 | if (usb_get_extra_descriptor(&interface->endpoint[0], | ||
| 432 | HID_DEVICET_REPORT, &hid_desc)) { | ||
| 433 | printk("wacom: can not retrive extra class descriptor\n"); | ||
| 434 | goto fail2; | ||
| 435 | } | ||
| 436 | } | ||
| 437 | error = wacom_parse_hid(intf, hid_desc, wacom_wac); | ||
| 438 | if (error) | ||
| 439 | goto fail2; | ||
| 440 | } | ||
| 441 | |||
| 285 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); | 442 | input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); |
| 286 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | | 443 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | |
| 287 | BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); | 444 | BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); |
| 288 | input_set_abs_params(input_dev, ABS_X, 0, wacom_wac->features->x_max, 4, 0); | 445 | input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); |
| 289 | input_set_abs_params(input_dev, ABS_Y, 0, wacom_wac->features->y_max, 4, 0); | 446 | input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); |
| 290 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom_wac->features->pressure_max, 0, 0); | 447 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); |
| 448 | if (features->type == TABLETPC) { | ||
| 449 | input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP); | ||
| 450 | input_set_abs_params(input_dev, ABS_RX, 0, features->touch_x_max, 4, 0); | ||
| 451 | input_set_abs_params(input_dev, ABS_RY, 0, features->touch_y_max, 4, 0); | ||
| 452 | } | ||
| 291 | input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); | 453 | input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); |
| 292 | 454 | ||
| 293 | wacom_init_input_dev(input_dev, wacom_wac); | 455 | wacom_init_input_dev(input_dev, wacom_wac); |
| 294 | 456 | ||
| 295 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | ||
| 296 | |||
| 297 | usb_fill_int_urb(wacom->irq, dev, | 457 | usb_fill_int_urb(wacom->irq, dev, |
| 298 | usb_rcvintpipe(dev, endpoint->bEndpointAddress), | 458 | usb_rcvintpipe(dev, endpoint->bEndpointAddress), |
| 299 | wacom_wac->data, wacom_wac->features->pktlen, | 459 | wacom_wac->data, wacom_wac->features->pktlen, |
| @@ -305,13 +465,22 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 305 | if (error) | 465 | if (error) |
| 306 | goto fail3; | 466 | goto fail3; |
| 307 | 467 | ||
| 308 | /* Ask the tablet to report tablet data. Repeat until it succeeds */ | 468 | /* |
| 309 | do { | 469 | * Ask the tablet to report tablet data if it is not a Tablet PC. |
| 310 | rep_data[0] = 2; | 470 | * Repeat until it succeeds |
| 311 | rep_data[1] = 2; | 471 | */ |
| 312 | usb_set_report(intf, 3, 2, rep_data, 2); | 472 | if (wacom_wac->features->type != TABLETPC) { |
| 313 | usb_get_report(intf, 3, 2, rep_data, 2); | 473 | do { |
| 314 | } while (rep_data[1] != 2 && limit++ < 5); | 474 | rep_data[0] = 2; |
| 475 | rep_data[1] = 2; | ||
| 476 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
| 477 | 2, rep_data, 2); | ||
| 478 | if (error >= 0) | ||
| 479 | error = usb_get_report(intf, | ||
| 480 | WAC_HID_FEATURE_REPORT, 2, | ||
| 481 | rep_data, 2); | ||
| 482 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
| 483 | } | ||
| 315 | 484 | ||
| 316 | usb_set_intfdata(intf, wacom); | 485 | usb_set_intfdata(intf, wacom); |
| 317 | return 0; | 486 | return 0; |
| @@ -333,7 +502,8 @@ static void wacom_disconnect(struct usb_interface *intf) | |||
| 333 | usb_kill_urb(wacom->irq); | 502 | usb_kill_urb(wacom->irq); |
| 334 | input_unregister_device(wacom->dev); | 503 | input_unregister_device(wacom->dev); |
| 335 | usb_free_urb(wacom->irq); | 504 | usb_free_urb(wacom->irq); |
| 336 | usb_buffer_free(interface_to_usbdev(intf), 10, wacom->wacom_wac->data, wacom->data_dma); | 505 | usb_buffer_free(interface_to_usbdev(intf), 10, |
| 506 | wacom->wacom_wac->data, wacom->data_dma); | ||
| 337 | kfree(wacom->wacom_wac); | 507 | kfree(wacom->wacom_wac); |
| 338 | kfree(wacom); | 508 | kfree(wacom); |
| 339 | } | 509 | } |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index bf3d9a8b2c1b..8dc8d1e59bea 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -535,31 +535,147 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 535 | return 1; | 535 | return 1; |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | ||
| 539 | { | ||
| 540 | char *data = wacom->data; | ||
| 541 | int prox = 0, pressure; | ||
| 542 | static int stylusInProx, touchInProx = 1, touchOut; | ||
| 543 | struct urb *urb = ((struct wacom_combo *)wcombo)->urb; | ||
| 544 | |||
| 545 | dbg("wacom_tpc_irq: received report #%d", data[0]); | ||
| 546 | |||
| 547 | if (urb->actual_length == 5 || data[0] == 6) { /* Touch data */ | ||
| 548 | if (urb->actual_length == 5) { /* with touch */ | ||
| 549 | prox = data[0] & 0x03; | ||
| 550 | } else { /* with capacity */ | ||
| 551 | prox = data[1] & 0x03; | ||
| 552 | } | ||
| 553 | |||
| 554 | if (!stylusInProx) { /* stylus not in prox */ | ||
| 555 | if (prox) { | ||
| 556 | if (touchInProx) { | ||
| 557 | wacom->tool[1] = BTN_TOOL_DOUBLETAP; | ||
| 558 | wacom->id[0] = TOUCH_DEVICE_ID; | ||
| 559 | if (urb->actual_length != 5) { | ||
| 560 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | ||
| 561 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | ||
| 562 | wacom_report_abs(wcombo, ABS_PRESSURE, wacom_le16_to_cpu(&data[6])); | ||
| 563 | wacom_report_key(wcombo, BTN_TOUCH, wacom_le16_to_cpu(&data[6])); | ||
| 564 | } else { | ||
| 565 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[1])); | ||
| 566 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[3])); | ||
| 567 | wacom_report_key(wcombo, BTN_TOUCH, 1); | ||
| 568 | } | ||
| 569 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 570 | wacom_report_key(wcombo, wacom->tool[1], prox & 0x01); | ||
| 571 | touchOut = 1; | ||
| 572 | return 1; | ||
| 573 | } | ||
| 574 | } else { | ||
| 575 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 576 | wacom_report_key(wcombo, wacom->tool[1], prox & 0x01); | ||
| 577 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 578 | touchOut = 0; | ||
| 579 | touchInProx = 1; | ||
| 580 | return 1; | ||
| 581 | } | ||
| 582 | } else if (touchOut || !prox) { /* force touch out-prox */ | ||
| 583 | wacom_report_abs(wcombo, ABS_MISC, TOUCH_DEVICE_ID); | ||
| 584 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 585 | touchOut = 0; | ||
| 586 | touchInProx = 1; | ||
| 587 | return 1; | ||
| 588 | } | ||
| 589 | } else if (data[0] == 2) { /* Penabled */ | ||
| 590 | prox = data[1] & 0x20; | ||
| 591 | |||
| 592 | touchInProx = 0; | ||
| 593 | |||
| 594 | wacom->id[0] = ERASER_DEVICE_ID; | ||
| 595 | |||
| 596 | /* | ||
| 597 | * if going from out of proximity into proximity select between the eraser | ||
| 598 | * and the pen based on the state of the stylus2 button, choose eraser if | ||
| 599 | * pressed else choose pen. if not a proximity change from out to in, send | ||
| 600 | * an out of proximity for previous tool then a in for new tool. | ||
| 601 | */ | ||
| 602 | if (prox) { /* in prox */ | ||
| 603 | if (!wacom->tool[0]) { | ||
| 604 | /* Going into proximity select tool */ | ||
| 605 | wacom->tool[1] = (data[1] & 0x08) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; | ||
| 606 | if (wacom->tool[1] == BTN_TOOL_PEN) | ||
| 607 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
| 608 | } else if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[1] & 0x08)) { | ||
| 609 | /* | ||
| 610 | * was entered with stylus2 pressed | ||
| 611 | * report out proximity for previous tool | ||
| 612 | */ | ||
| 613 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 614 | wacom_report_key(wcombo, wacom->tool[1], 0); | ||
| 615 | wacom_input_sync(wcombo); | ||
| 616 | |||
| 617 | /* set new tool */ | ||
| 618 | wacom->tool[1] = BTN_TOOL_PEN; | ||
| 619 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
| 620 | return 0; | ||
| 621 | } | ||
| 622 | if (wacom->tool[1] != BTN_TOOL_RUBBER) { | ||
| 623 | /* Unknown tool selected default to pen tool */ | ||
| 624 | wacom->tool[1] = BTN_TOOL_PEN; | ||
| 625 | wacom->id[0] = STYLUS_DEVICE_ID; | ||
| 626 | } | ||
| 627 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); | ||
| 628 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); | ||
| 629 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | ||
| 630 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | ||
| 631 | pressure = ((data[7] & 0x01) << 8) | data[6]; | ||
| 632 | if (pressure < 0) | ||
| 633 | pressure = wacom->features->pressure_max + pressure + 1; | ||
| 634 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); | ||
| 635 | wacom_report_key(wcombo, BTN_TOUCH, pressure); | ||
| 636 | } else { | ||
| 637 | wacom_report_abs(wcombo, ABS_PRESSURE, 0); | ||
| 638 | wacom_report_key(wcombo, BTN_STYLUS, 0); | ||
| 639 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | ||
| 640 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 641 | } | ||
| 642 | wacom_report_key(wcombo, wacom->tool[1], prox); | ||
| 643 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | ||
| 644 | stylusInProx = prox; | ||
| 645 | wacom->tool[0] = prox; | ||
| 646 | return 1; | ||
| 647 | } | ||
| 648 | return 0; | ||
| 649 | } | ||
| 650 | |||
| 538 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) | 651 | int wacom_wac_irq(struct wacom_wac *wacom_wac, void *wcombo) |
| 539 | { | 652 | { |
| 540 | switch (wacom_wac->features->type) { | 653 | switch (wacom_wac->features->type) { |
| 541 | case PENPARTNER: | 654 | case PENPARTNER: |
| 542 | return (wacom_penpartner_irq(wacom_wac, wcombo)); | 655 | return wacom_penpartner_irq(wacom_wac, wcombo); |
| 543 | break; | 656 | |
| 544 | case PL: | 657 | case PL: |
| 545 | return (wacom_pl_irq(wacom_wac, wcombo)); | 658 | return wacom_pl_irq(wacom_wac, wcombo); |
| 546 | break; | 659 | |
| 547 | case WACOM_G4: | 660 | case WACOM_G4: |
| 548 | case GRAPHIRE: | 661 | case GRAPHIRE: |
| 549 | case WACOM_MO: | 662 | case WACOM_MO: |
| 550 | return (wacom_graphire_irq(wacom_wac, wcombo)); | 663 | return wacom_graphire_irq(wacom_wac, wcombo); |
| 551 | break; | 664 | |
| 552 | case PTU: | 665 | case PTU: |
| 553 | return (wacom_ptu_irq(wacom_wac, wcombo)); | 666 | return wacom_ptu_irq(wacom_wac, wcombo); |
| 554 | break; | 667 | |
| 555 | case INTUOS: | 668 | case INTUOS: |
| 556 | case INTUOS3S: | 669 | case INTUOS3S: |
| 557 | case INTUOS3: | 670 | case INTUOS3: |
| 558 | case INTUOS3L: | 671 | case INTUOS3L: |
| 559 | case CINTIQ: | 672 | case CINTIQ: |
| 560 | case WACOM_BEE: | 673 | case WACOM_BEE: |
| 561 | return (wacom_intuos_irq(wacom_wac, wcombo)); | 674 | return wacom_intuos_irq(wacom_wac, wcombo); |
| 562 | break; | 675 | |
| 676 | case TABLETPC: | ||
| 677 | return wacom_tpc_irq(wacom_wac, wcombo); | ||
| 678 | |||
| 563 | default: | 679 | default: |
| 564 | return 0; | 680 | return 0; |
| 565 | } | 681 | } |
| @@ -586,13 +702,15 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w | |||
| 586 | /* fall through */ | 702 | /* fall through */ |
| 587 | case INTUOS3S: | 703 | case INTUOS3S: |
| 588 | input_dev_i3s(input_dev, wacom_wac); | 704 | input_dev_i3s(input_dev, wacom_wac); |
| 705 | /* fall through */ | ||
| 589 | case INTUOS: | 706 | case INTUOS: |
| 590 | input_dev_i(input_dev, wacom_wac); | 707 | input_dev_i(input_dev, wacom_wac); |
| 591 | break; | 708 | break; |
| 592 | case PL: | 709 | case PL: |
| 593 | case PTU: | 710 | case PTU: |
| 711 | case TABLETPC: | ||
| 594 | input_dev_pl(input_dev, wacom_wac); | 712 | input_dev_pl(input_dev, wacom_wac); |
| 595 | break; | 713 | /* fall through */ |
| 596 | case PENPARTNER: | 714 | case PENPARTNER: |
| 597 | input_dev_pt(input_dev, wacom_wac); | 715 | input_dev_pt(input_dev, wacom_wac); |
| 598 | break; | 716 | break; |
| @@ -611,6 +729,7 @@ static struct wacom_features wacom_features[] = { | |||
| 611 | { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 63, WACOM_G4 }, | 729 | { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 63, WACOM_G4 }, |
| 612 | { "Wacom BambooFun 4x5", 9, 14760, 9225, 511, 63, WACOM_MO }, | 730 | { "Wacom BambooFun 4x5", 9, 14760, 9225, 511, 63, WACOM_MO }, |
| 613 | { "Wacom BambooFun 6x8", 9, 21648, 13530, 511, 63, WACOM_MO }, | 731 | { "Wacom BambooFun 6x8", 9, 21648, 13530, 511, 63, WACOM_MO }, |
| 732 | { "Wacom Bamboo1 Medium",8, 16704, 12064, 511, 63, GRAPHIRE }, | ||
| 614 | { "Wacom Volito", 8, 5104, 3712, 511, 63, GRAPHIRE }, | 733 | { "Wacom Volito", 8, 5104, 3712, 511, 63, GRAPHIRE }, |
| 615 | { "Wacom PenStation2", 8, 3250, 2320, 255, 63, GRAPHIRE }, | 734 | { "Wacom PenStation2", 8, 3250, 2320, 255, 63, GRAPHIRE }, |
| 616 | { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 63, GRAPHIRE }, | 735 | { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 63, GRAPHIRE }, |
| @@ -650,6 +769,10 @@ static struct wacom_features wacom_features[] = { | |||
| 650 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 63, CINTIQ }, | 769 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 63, CINTIQ }, |
| 651 | { "Wacom Cintiq 20WSX", 10, 86680, 54180, 1023, 63, WACOM_BEE }, | 770 | { "Wacom Cintiq 20WSX", 10, 86680, 54180, 1023, 63, WACOM_BEE }, |
| 652 | { "Wacom Cintiq 12WX", 10, 53020, 33440, 1023, 63, WACOM_BEE }, | 771 | { "Wacom Cintiq 12WX", 10, 53020, 33440, 1023, 63, WACOM_BEE }, |
| 772 | { "Wacom DTU1931", 8, 37832, 30305, 511, 0, PL }, | ||
| 773 | { "Wacom ISDv4 90", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
| 774 | { "Wacom ISDv4 93", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
| 775 | { "Wacom ISDv4 9A", 8, 26202, 16325, 255, 0, TABLETPC }, | ||
| 653 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 31, INTUOS }, | 776 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 31, INTUOS }, |
| 654 | { } | 777 | { } |
| 655 | }; | 778 | }; |
| @@ -665,6 +788,7 @@ static struct usb_device_id wacom_ids[] = { | |||
| 665 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, | 788 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) }, |
| 666 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, | 789 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x17) }, |
| 667 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, | 790 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x18) }, |
| 791 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x19) }, | ||
| 668 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, | 792 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) }, |
| 669 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, | 793 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) }, |
| 670 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, | 794 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) }, |
| @@ -704,18 +828,26 @@ static struct usb_device_id wacom_ids[] = { | |||
| 704 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, | 828 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, |
| 705 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, | 829 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) }, |
| 706 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, | 830 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC6) }, |
| 831 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC7) }, | ||
| 832 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x90) }, | ||
| 833 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x93) }, | ||
| 834 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x9A) }, | ||
| 707 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, | 835 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, |
| 708 | { } | 836 | { } |
| 709 | }; | 837 | }; |
| 710 | 838 | ||
| 711 | const struct usb_device_id * get_device_table(void) { | 839 | const struct usb_device_id *get_device_table(void) |
| 712 | const struct usb_device_id * id_table = wacom_ids; | 840 | { |
| 841 | const struct usb_device_id *id_table = wacom_ids; | ||
| 842 | |||
| 713 | return id_table; | 843 | return id_table; |
| 714 | } | 844 | } |
| 715 | 845 | ||
| 716 | struct wacom_features * get_wacom_feature(const struct usb_device_id * id) { | 846 | struct wacom_features * get_wacom_feature(const struct usb_device_id *id) |
| 847 | { | ||
| 717 | int index = id - wacom_ids; | 848 | int index = id - wacom_ids; |
| 718 | struct wacom_features *wf = &wacom_features[index]; | 849 | struct wacom_features *wf = &wacom_features[index]; |
| 850 | |||
| 719 | return wf; | 851 | return wf; |
| 720 | } | 852 | } |
| 721 | 853 | ||
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 3342bc05847d..f9c8b69673b7 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #define WACOM_WAC_H | 10 | #define WACOM_WAC_H |
| 11 | 11 | ||
| 12 | #define STYLUS_DEVICE_ID 0x02 | 12 | #define STYLUS_DEVICE_ID 0x02 |
| 13 | #define TOUCH_DEVICE_ID 0x03 | ||
| 13 | #define CURSOR_DEVICE_ID 0x06 | 14 | #define CURSOR_DEVICE_ID 0x06 |
| 14 | #define ERASER_DEVICE_ID 0x0A | 15 | #define ERASER_DEVICE_ID 0x0A |
| 15 | #define PAD_DEVICE_ID 0x0F | 16 | #define PAD_DEVICE_ID 0x0F |
| @@ -27,6 +28,7 @@ enum { | |||
| 27 | CINTIQ, | 28 | CINTIQ, |
| 28 | WACOM_BEE, | 29 | WACOM_BEE, |
| 29 | WACOM_MO, | 30 | WACOM_MO, |
| 31 | TABLETPC, | ||
| 30 | MAX_TYPE | 32 | MAX_TYPE |
| 31 | }; | 33 | }; |
| 32 | 34 | ||
| @@ -38,6 +40,8 @@ struct wacom_features { | |||
| 38 | int pressure_max; | 40 | int pressure_max; |
| 39 | int distance_max; | 41 | int distance_max; |
| 40 | int type; | 42 | int type; |
| 43 | int touch_x_max; | ||
| 44 | int touch_y_max; | ||
| 41 | }; | 45 | }; |
| 42 | 46 | ||
| 43 | struct wacom_wac { | 47 | struct wacom_wac { |
diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c index d20689cdbd5d..8f38c5e55ce6 100644 --- a/drivers/input/touchscreen/elo.c +++ b/drivers/input/touchscreen/elo.c | |||
| @@ -262,7 +262,7 @@ static int elo_setup_10(struct elo *elo) | |||
| 262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); | 262 | input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); |
| 263 | 263 | ||
| 264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " | 264 | printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " |
| 265 | "features: %x02x, controller: 0x%02x\n", | 265 | "features: 0x%02x, controller: 0x%02x\n", |
| 266 | elo_types[(packet[1] -'0') & 0x03], | 266 | elo_types[(packet[1] -'0') & 0x03], |
| 267 | packet[5], packet[4], packet[3], packet[7]); | 267 | packet[5], packet[4], packet[3], packet[7]); |
| 268 | 268 | ||
diff --git a/drivers/input/xen-kbdfront.c b/drivers/input/xen-kbdfront.c index 3ab6362f043c..928d2ed8865f 100644 --- a/drivers/input/xen-kbdfront.c +++ b/drivers/input/xen-kbdfront.c | |||
| @@ -323,7 +323,7 @@ static struct xenbus_device_id xenkbd_ids[] = { | |||
| 323 | { "" } | 323 | { "" } |
| 324 | }; | 324 | }; |
| 325 | 325 | ||
| 326 | static struct xenbus_driver xenkbd = { | 326 | static struct xenbus_driver xenkbd_driver = { |
| 327 | .name = "vkbd", | 327 | .name = "vkbd", |
| 328 | .owner = THIS_MODULE, | 328 | .owner = THIS_MODULE, |
| 329 | .ids = xenkbd_ids, | 329 | .ids = xenkbd_ids, |
| @@ -342,12 +342,12 @@ static int __init xenkbd_init(void) | |||
| 342 | if (xen_initial_domain()) | 342 | if (xen_initial_domain()) |
| 343 | return -ENODEV; | 343 | return -ENODEV; |
| 344 | 344 | ||
| 345 | return xenbus_register_frontend(&xenkbd); | 345 | return xenbus_register_frontend(&xenkbd_driver); |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | static void __exit xenkbd_cleanup(void) | 348 | static void __exit xenkbd_cleanup(void) |
| 349 | { | 349 | { |
| 350 | xenbus_unregister_driver(&xenkbd); | 350 | xenbus_unregister_driver(&xenkbd_driver); |
| 351 | } | 351 | } |
| 352 | 352 | ||
| 353 | module_init(xenkbd_init); | 353 | module_init(xenkbd_init); |
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c index 84d75a3f5d17..ded9d0baf607 100644 --- a/drivers/isdn/hisax/config.c +++ b/drivers/isdn/hisax/config.c | |||
| @@ -1213,7 +1213,7 @@ static void HiSax_shiftcards(int idx) | |||
| 1213 | memcpy(&cards[i], &cards[i + 1], sizeof(cards[i])); | 1213 | memcpy(&cards[i], &cards[i + 1], sizeof(cards[i])); |
| 1214 | } | 1214 | } |
| 1215 | 1215 | ||
| 1216 | static int HiSax_inithardware(int *busy_flag) | 1216 | static int __init HiSax_inithardware(int *busy_flag) |
| 1217 | { | 1217 | { |
| 1218 | int foundcards = 0; | 1218 | int foundcards = 0; |
| 1219 | int i = 0; | 1219 | int i = 0; |
| @@ -1542,7 +1542,9 @@ static void __exit HiSax_exit(void) | |||
| 1542 | printk(KERN_INFO "HiSax module removed\n"); | 1542 | printk(KERN_INFO "HiSax module removed\n"); |
| 1543 | } | 1543 | } |
| 1544 | 1544 | ||
| 1545 | int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card) | 1545 | #ifdef CONFIG_HOTPLUG |
| 1546 | |||
| 1547 | int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card) | ||
| 1546 | { | 1548 | { |
| 1547 | u_char ids[16]; | 1549 | u_char ids[16]; |
| 1548 | int ret = -1; | 1550 | int ret = -1; |
| @@ -1563,6 +1565,8 @@ error: | |||
| 1563 | } | 1565 | } |
| 1564 | 1566 | ||
| 1565 | EXPORT_SYMBOL(hisax_init_pcmcia); | 1567 | EXPORT_SYMBOL(hisax_init_pcmcia); |
| 1568 | #endif | ||
| 1569 | |||
| 1566 | EXPORT_SYMBOL(HiSax_closecard); | 1570 | EXPORT_SYMBOL(HiSax_closecard); |
| 1567 | 1571 | ||
| 1568 | #include "hisax_if.h" | 1572 | #include "hisax_if.h" |
| @@ -1580,6 +1584,11 @@ static void hisax_bc_close(struct BCState *bcs); | |||
| 1580 | static void hisax_bh(struct work_struct *work); | 1584 | static void hisax_bh(struct work_struct *work); |
| 1581 | static void EChannel_proc_rcv(struct hisax_d_if *d_if); | 1585 | static void EChannel_proc_rcv(struct hisax_d_if *d_if); |
| 1582 | 1586 | ||
| 1587 | static int hisax_setup_card_dynamic(struct IsdnCard *card) | ||
| 1588 | { | ||
| 1589 | return 2; | ||
| 1590 | } | ||
| 1591 | |||
| 1583 | int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | 1592 | int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], |
| 1584 | char *name, int protocol) | 1593 | char *name, int protocol) |
| 1585 | { | 1594 | { |
| @@ -1599,7 +1608,8 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[], | |||
| 1599 | cards[i].protocol = protocol; | 1608 | cards[i].protocol = protocol; |
| 1600 | sprintf(id, "%s%d", name, i); | 1609 | sprintf(id, "%s%d", name, i); |
| 1601 | nrcards++; | 1610 | nrcards++; |
| 1602 | retval = checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card); | 1611 | retval = checkcard(i, id, NULL, hisax_d_if->owner, |
| 1612 | hisax_setup_card_dynamic); | ||
| 1603 | if (retval == 0) { // yuck | 1613 | if (retval == 0) { // yuck |
| 1604 | cards[i].typ = 0; | 1614 | cards[i].typ = 0; |
| 1605 | nrcards--; | 1615 | nrcards--; |
diff --git a/drivers/macintosh/rack-meter.c b/drivers/macintosh/rack-meter.c index 2c21d4f25cc8..a98ab72adf95 100644 --- a/drivers/macintosh/rack-meter.c +++ b/drivers/macintosh/rack-meter.c | |||
| @@ -288,7 +288,7 @@ static void __devexit rackmeter_stop_cpu_sniffer(struct rackmeter *rm) | |||
| 288 | cancel_rearming_delayed_work(&rm->cpu[1].sniffer); | 288 | cancel_rearming_delayed_work(&rm->cpu[1].sniffer); |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | static int rackmeter_setup(struct rackmeter *rm) | 291 | static int __devinit rackmeter_setup(struct rackmeter *rm) |
| 292 | { | 292 | { |
| 293 | pr_debug("rackmeter: setting up i2s..\n"); | 293 | pr_debug("rackmeter: setting up i2s..\n"); |
| 294 | rackmeter_setup_i2s(rm); | 294 | rackmeter_setup_i2s(rm); |
| @@ -582,12 +582,12 @@ static struct of_device_id rackmeter_match[] = { | |||
| 582 | { } | 582 | { } |
| 583 | }; | 583 | }; |
| 584 | 584 | ||
| 585 | static struct macio_driver rackmeter_drv = { | 585 | static struct macio_driver rackmeter_driver = { |
| 586 | .name = "rackmeter", | 586 | .name = "rackmeter", |
| 587 | .owner = THIS_MODULE, | 587 | .owner = THIS_MODULE, |
| 588 | .match_table = rackmeter_match, | 588 | .match_table = rackmeter_match, |
| 589 | .probe = rackmeter_probe, | 589 | .probe = rackmeter_probe, |
| 590 | .remove = rackmeter_remove, | 590 | .remove = __devexit_p(rackmeter_remove), |
| 591 | .shutdown = rackmeter_shutdown, | 591 | .shutdown = rackmeter_shutdown, |
| 592 | }; | 592 | }; |
| 593 | 593 | ||
| @@ -596,14 +596,14 @@ static int __init rackmeter_init(void) | |||
| 596 | { | 596 | { |
| 597 | pr_debug("rackmeter_init()\n"); | 597 | pr_debug("rackmeter_init()\n"); |
| 598 | 598 | ||
| 599 | return macio_register_driver(&rackmeter_drv); | 599 | return macio_register_driver(&rackmeter_driver); |
| 600 | } | 600 | } |
| 601 | 601 | ||
| 602 | static void __exit rackmeter_exit(void) | 602 | static void __exit rackmeter_exit(void) |
| 603 | { | 603 | { |
| 604 | pr_debug("rackmeter_exit()\n"); | 604 | pr_debug("rackmeter_exit()\n"); |
| 605 | 605 | ||
| 606 | macio_unregister_driver(&rackmeter_drv); | 606 | macio_unregister_driver(&rackmeter_driver); |
| 607 | } | 607 | } |
| 608 | 608 | ||
| 609 | module_init(rackmeter_init); | 609 | module_init(rackmeter_init); |
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c index 14e627ef6465..c1d92f838ca8 100644 --- a/drivers/media/dvb/dm1105/dm1105.c +++ b/drivers/media/dvb/dm1105/dm1105.c | |||
| @@ -376,7 +376,7 @@ static void dm1105dvb_dma_unmap(struct dm1105dvb *dm1105dvb) | |||
| 376 | pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr); | 376 | pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr); |
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | static void __devinit dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb) | 379 | static void dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb) |
| 380 | { | 380 | { |
| 381 | outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK)); | 381 | outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK)); |
| 382 | outb(1, dm_io_mem(DM1105_CR)); | 382 | outb(1, dm_io_mem(DM1105_CR)); |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 8557bf12cfb4..7a421e9dba5a 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -585,6 +585,8 @@ restart: | |||
| 585 | if (fe->ops.set_voltage) | 585 | if (fe->ops.set_voltage) |
| 586 | fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF); | 586 | fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF); |
| 587 | if (fe->ops.tuner_ops.sleep) { | 587 | if (fe->ops.tuner_ops.sleep) { |
| 588 | if (fe->ops.i2c_gate_ctrl) | ||
| 589 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
| 588 | fe->ops.tuner_ops.sleep(fe); | 590 | fe->ops.tuner_ops.sleep(fe); |
| 589 | if (fe->ops.i2c_gate_ctrl) | 591 | if (fe->ops.i2c_gate_ctrl) |
| 590 | fe->ops.i2c_gate_ctrl(fe, 0); | 592 | fe->ops.i2c_gate_ctrl(fe, 0); |
| @@ -934,7 +936,8 @@ void dtv_property_dump(struct dtv_property *tvp) | |||
| 934 | int is_legacy_delivery_system(fe_delivery_system_t s) | 936 | int is_legacy_delivery_system(fe_delivery_system_t s) |
| 935 | { | 937 | { |
| 936 | if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_AC) || | 938 | if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_AC) || |
| 937 | (s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS)) | 939 | (s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS) || |
| 940 | (s == SYS_ATSC)) | ||
| 938 | return 1; | 941 | return 1; |
| 939 | 942 | ||
| 940 | return 0; | 943 | return 0; |
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 847d8fdd9ec4..e9ab0249d133 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
| @@ -681,12 +681,6 @@ static int af9015_download_firmware(struct usb_device *udev, | |||
| 681 | goto error; | 681 | goto error; |
| 682 | } | 682 | } |
| 683 | 683 | ||
| 684 | /* firmware is running, reconnect device in the usb bus */ | ||
| 685 | req.cmd = RECONNECT_USB; | ||
| 686 | ret = af9015_rw_udev(udev, &req); | ||
| 687 | if (ret) | ||
| 688 | err("reconnect failed: %d", ret); | ||
| 689 | |||
| 690 | error: | 684 | error: |
| 691 | return ret; | 685 | return ret; |
| 692 | } | 686 | } |
| @@ -1208,6 +1202,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
| 1208 | .usb_ctrl = DEVICE_SPECIFIC, | 1202 | .usb_ctrl = DEVICE_SPECIFIC, |
| 1209 | .download_firmware = af9015_download_firmware, | 1203 | .download_firmware = af9015_download_firmware, |
| 1210 | .firmware = "dvb-usb-af9015.fw", | 1204 | .firmware = "dvb-usb-af9015.fw", |
| 1205 | .no_reconnect = 1, | ||
| 1211 | 1206 | ||
| 1212 | .size_of_priv = sizeof(struct af9015_state), \ | 1207 | .size_of_priv = sizeof(struct af9015_state), \ |
| 1213 | 1208 | ||
| @@ -1306,6 +1301,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
| 1306 | .usb_ctrl = DEVICE_SPECIFIC, | 1301 | .usb_ctrl = DEVICE_SPECIFIC, |
| 1307 | .download_firmware = af9015_download_firmware, | 1302 | .download_firmware = af9015_download_firmware, |
| 1308 | .firmware = "dvb-usb-af9015.fw", | 1303 | .firmware = "dvb-usb-af9015.fw", |
| 1304 | .no_reconnect = 1, | ||
| 1309 | 1305 | ||
| 1310 | .size_of_priv = sizeof(struct af9015_state), \ | 1306 | .size_of_priv = sizeof(struct af9015_state), \ |
| 1311 | 1307 | ||
diff --git a/drivers/media/dvb/dvb-usb/dib0700.h b/drivers/media/dvb/dvb-usb/dib0700.h index 739193943c17..8b544fe79b0d 100644 --- a/drivers/media/dvb/dvb-usb/dib0700.h +++ b/drivers/media/dvb/dvb-usb/dib0700.h | |||
| @@ -22,7 +22,7 @@ extern int dvb_usb_dib0700_debug; | |||
| 22 | 22 | ||
| 23 | #define REQUEST_I2C_READ 0x2 | 23 | #define REQUEST_I2C_READ 0x2 |
| 24 | #define REQUEST_I2C_WRITE 0x3 | 24 | #define REQUEST_I2C_WRITE 0x3 |
| 25 | #define REQUEST_POLL_RC 0x4 | 25 | #define REQUEST_POLL_RC 0x4 /* deprecated in firmware v1.20 */ |
| 26 | #define REQUEST_JUMPRAM 0x8 | 26 | #define REQUEST_JUMPRAM 0x8 |
| 27 | #define REQUEST_SET_CLOCK 0xB | 27 | #define REQUEST_SET_CLOCK 0xB |
| 28 | #define REQUEST_SET_GPIO 0xC | 28 | #define REQUEST_SET_GPIO 0xC |
| @@ -40,11 +40,14 @@ struct dib0700_state { | |||
| 40 | u16 mt2060_if1[2]; | 40 | u16 mt2060_if1[2]; |
| 41 | u8 rc_toggle; | 41 | u8 rc_toggle; |
| 42 | u8 rc_counter; | 42 | u8 rc_counter; |
| 43 | u8 rc_func_version; | ||
| 43 | u8 is_dib7000pc; | 44 | u8 is_dib7000pc; |
| 44 | u8 fw_use_new_i2c_api; | 45 | u8 fw_use_new_i2c_api; |
| 45 | u8 disable_streaming_master_mode; | 46 | u8 disable_streaming_master_mode; |
| 46 | }; | 47 | }; |
| 47 | 48 | ||
| 49 | extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, | ||
| 50 | u32 *romversion, u32 *ramversion, u32 *fwtype); | ||
| 48 | extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val); | 51 | extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val); |
| 49 | extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3); | 52 | extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3); |
| 50 | extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen); | 53 | extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen); |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index dd53cee3896d..200b215f4d8b 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_core.c +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c | |||
| @@ -19,6 +19,22 @@ MODULE_PARM_DESC(dvb_usb_dib0700_ir_proto, "set ir protocol (0=NEC, 1=RC5 (defau | |||
| 19 | 19 | ||
| 20 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 20 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
| 21 | 21 | ||
| 22 | |||
| 23 | int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, | ||
| 24 | u32 *romversion, u32 *ramversion, u32 *fwtype) | ||
| 25 | { | ||
| 26 | u8 b[16]; | ||
| 27 | int ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), | ||
| 28 | REQUEST_GET_VERSION, | ||
| 29 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, | ||
| 30 | b, sizeof(b), USB_CTRL_GET_TIMEOUT); | ||
| 31 | *hwversion = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; | ||
| 32 | *romversion = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | b[7]; | ||
| 33 | *ramversion = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11]; | ||
| 34 | *fwtype = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15]; | ||
| 35 | return ret; | ||
| 36 | } | ||
| 37 | |||
| 22 | /* expecting rx buffer: request data[0] data[1] ... data[2] */ | 38 | /* expecting rx buffer: request data[0] data[1] ... data[2] */ |
| 23 | static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen) | 39 | static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen) |
| 24 | { | 40 | { |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index 0cfccc24b190..f28d3ae59e04 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
| @@ -38,6 +38,7 @@ static struct mt2060_config bristol_mt2060_config[2] = { | |||
| 38 | } | 38 | } |
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| 41 | |||
| 41 | static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = { | 42 | static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = { |
| 42 | .band_caps = BAND_VHF | BAND_UHF, | 43 | .band_caps = BAND_VHF | BAND_UHF, |
| 43 | .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0), | 44 | .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0), |
| @@ -451,8 +452,13 @@ static u8 rc_request[] = { REQUEST_POLL_RC, 0 }; | |||
| 451 | 452 | ||
| 452 | /* Number of keypresses to ignore before start repeating */ | 453 | /* Number of keypresses to ignore before start repeating */ |
| 453 | #define RC_REPEAT_DELAY 2 | 454 | #define RC_REPEAT_DELAY 2 |
| 455 | #define RC_REPEAT_DELAY_V1_20 5 | ||
| 454 | 456 | ||
| 455 | static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 457 | |
| 458 | |||
| 459 | /* Used by firmware versions < 1.20 (deprecated) */ | ||
| 460 | static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event, | ||
| 461 | int *state) | ||
| 456 | { | 462 | { |
| 457 | u8 key[4]; | 463 | u8 key[4]; |
| 458 | int i; | 464 | int i; |
| @@ -529,6 +535,137 @@ static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | |||
| 529 | return 0; | 535 | return 0; |
| 530 | } | 536 | } |
| 531 | 537 | ||
| 538 | /* This is the structure of the RC response packet starting in firmware 1.20 */ | ||
| 539 | struct dib0700_rc_response { | ||
| 540 | u8 report_id; | ||
| 541 | u8 data_state; | ||
| 542 | u8 system_msb; | ||
| 543 | u8 system_lsb; | ||
| 544 | u8 data; | ||
| 545 | u8 not_data; | ||
| 546 | }; | ||
| 547 | |||
| 548 | /* This supports the new IR response format for firmware v1.20 */ | ||
| 549 | static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event, | ||
| 550 | int *state) | ||
| 551 | { | ||
| 552 | struct dvb_usb_rc_key *keymap = d->props.rc_key_map; | ||
| 553 | struct dib0700_state *st = d->priv; | ||
| 554 | struct dib0700_rc_response poll_reply; | ||
| 555 | u8 buf[6]; | ||
| 556 | int i; | ||
| 557 | int status; | ||
| 558 | int actlen; | ||
| 559 | int found = 0; | ||
| 560 | |||
| 561 | /* Set initial results in case we exit the function early */ | ||
| 562 | *event = 0; | ||
| 563 | *state = REMOTE_NO_KEY_PRESSED; | ||
| 564 | |||
| 565 | /* Firmware v1.20 provides RC data via bulk endpoint 1 */ | ||
| 566 | status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf, | ||
| 567 | sizeof(buf), &actlen, 50); | ||
| 568 | if (status < 0) { | ||
| 569 | /* No data available (meaning no key press) */ | ||
| 570 | return 0; | ||
| 571 | } | ||
| 572 | |||
| 573 | if (actlen != sizeof(buf)) { | ||
| 574 | /* We didn't get back the 6 byte message we expected */ | ||
| 575 | err("Unexpected RC response size [%d]", actlen); | ||
| 576 | return -1; | ||
| 577 | } | ||
| 578 | |||
| 579 | poll_reply.report_id = buf[0]; | ||
| 580 | poll_reply.data_state = buf[1]; | ||
| 581 | poll_reply.system_msb = buf[2]; | ||
| 582 | poll_reply.system_lsb = buf[3]; | ||
| 583 | poll_reply.data = buf[4]; | ||
| 584 | poll_reply.not_data = buf[5]; | ||
| 585 | |||
| 586 | /* | ||
| 587 | info("rid=%02x ds=%02x sm=%02x sl=%02x d=%02x nd=%02x\n", | ||
| 588 | poll_reply.report_id, poll_reply.data_state, | ||
| 589 | poll_reply.system_msb, poll_reply.system_lsb, | ||
| 590 | poll_reply.data, poll_reply.not_data); | ||
| 591 | */ | ||
| 592 | |||
| 593 | if ((poll_reply.data + poll_reply.not_data) != 0xff) { | ||
| 594 | /* Key failed integrity check */ | ||
| 595 | err("key failed integrity check: %02x %02x %02x %02x", | ||
| 596 | poll_reply.system_msb, poll_reply.system_lsb, | ||
| 597 | poll_reply.data, poll_reply.not_data); | ||
| 598 | return -1; | ||
| 599 | } | ||
| 600 | |||
| 601 | /* Find the key in the map */ | ||
| 602 | for (i = 0; i < d->props.rc_key_map_size; i++) { | ||
| 603 | if (keymap[i].custom == poll_reply.system_lsb && | ||
| 604 | keymap[i].data == poll_reply.data) { | ||
| 605 | *event = keymap[i].event; | ||
| 606 | found = 1; | ||
| 607 | break; | ||
| 608 | } | ||
| 609 | } | ||
| 610 | |||
| 611 | if (found == 0) { | ||
| 612 | err("Unknown remote controller key: %02x %02x %02x %02x", | ||
| 613 | poll_reply.system_msb, poll_reply.system_lsb, | ||
| 614 | poll_reply.data, poll_reply.not_data); | ||
| 615 | d->last_event = 0; | ||
| 616 | return 0; | ||
| 617 | } | ||
| 618 | |||
| 619 | if (poll_reply.data_state == 1) { | ||
| 620 | /* New key hit */ | ||
| 621 | st->rc_counter = 0; | ||
| 622 | *event = keymap[i].event; | ||
| 623 | *state = REMOTE_KEY_PRESSED; | ||
| 624 | d->last_event = keymap[i].event; | ||
| 625 | } else if (poll_reply.data_state == 2) { | ||
| 626 | /* Key repeated */ | ||
| 627 | st->rc_counter++; | ||
| 628 | |||
| 629 | /* prevents unwanted double hits */ | ||
| 630 | if (st->rc_counter > RC_REPEAT_DELAY_V1_20) { | ||
| 631 | *event = d->last_event; | ||
| 632 | *state = REMOTE_KEY_PRESSED; | ||
| 633 | st->rc_counter = RC_REPEAT_DELAY_V1_20; | ||
| 634 | } | ||
| 635 | } else { | ||
| 636 | err("Unknown data state [%d]", poll_reply.data_state); | ||
| 637 | } | ||
| 638 | |||
| 639 | return 0; | ||
| 640 | } | ||
| 641 | |||
| 642 | static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | ||
| 643 | { | ||
| 644 | struct dib0700_state *st = d->priv; | ||
| 645 | |||
| 646 | /* Because some people may have improperly named firmware files, | ||
| 647 | let's figure out whether to use the new firmware call or the legacy | ||
| 648 | call based on the firmware version embedded in the file */ | ||
| 649 | if (st->rc_func_version == 0) { | ||
| 650 | u32 hwver, romver, ramver, fwtype; | ||
| 651 | int ret = dib0700_get_version(d, &hwver, &romver, &ramver, | ||
| 652 | &fwtype); | ||
| 653 | if (ret < 0) { | ||
| 654 | err("Could not determine version info"); | ||
| 655 | return -1; | ||
| 656 | } | ||
| 657 | if (ramver < 0x10200) | ||
| 658 | st->rc_func_version = 1; | ||
| 659 | else | ||
| 660 | st->rc_func_version = 2; | ||
| 661 | } | ||
| 662 | |||
| 663 | if (st->rc_func_version == 2) | ||
| 664 | return dib0700_rc_query_v1_20(d, event, state); | ||
| 665 | else | ||
| 666 | return dib0700_rc_query_legacy(d, event, state); | ||
| 667 | } | ||
| 668 | |||
| 532 | static struct dvb_usb_rc_key dib0700_rc_keys[] = { | 669 | static struct dvb_usb_rc_key dib0700_rc_keys[] = { |
| 533 | /* Key codes for the tiny Pinnacle remote*/ | 670 | /* Key codes for the tiny Pinnacle remote*/ |
| 534 | { 0x07, 0x00, KEY_MUTE }, | 671 | { 0x07, 0x00, KEY_MUTE }, |
diff --git a/drivers/media/dvb/dvb-usb/usb-urb.c b/drivers/media/dvb/dvb-usb/usb-urb.c index 397f51a7b2ad..da93b9e982c0 100644 --- a/drivers/media/dvb/dvb-usb/usb-urb.c +++ b/drivers/media/dvb/dvb-usb/usb-urb.c | |||
| @@ -135,7 +135,7 @@ stream->buf_list[stream->buf_num], (long long)stream->dma_addr[stream->buf_num]) | |||
| 135 | 135 | ||
| 136 | static int usb_bulk_urb_init(struct usb_data_stream *stream) | 136 | static int usb_bulk_urb_init(struct usb_data_stream *stream) |
| 137 | { | 137 | { |
| 138 | int i; | 138 | int i, j; |
| 139 | 139 | ||
| 140 | if ((i = usb_allocate_stream_buffers(stream,stream->props.count, | 140 | if ((i = usb_allocate_stream_buffers(stream,stream->props.count, |
| 141 | stream->props.u.bulk.buffersize)) < 0) | 141 | stream->props.u.bulk.buffersize)) < 0) |
| @@ -143,9 +143,13 @@ static int usb_bulk_urb_init(struct usb_data_stream *stream) | |||
| 143 | 143 | ||
| 144 | /* allocate the URBs */ | 144 | /* allocate the URBs */ |
| 145 | for (i = 0; i < stream->props.count; i++) { | 145 | for (i = 0; i < stream->props.count; i++) { |
| 146 | if ((stream->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC)) == NULL) | 146 | stream->urb_list[i] = usb_alloc_urb(0, GFP_ATOMIC); |
| 147 | if (!stream->urb_list[i]) { | ||
| 148 | deb_mem("not enough memory for urb_alloc_urb!.\n"); | ||
| 149 | for (j = 0; j < i; j++) | ||
| 150 | usb_free_urb(stream->urb_list[i]); | ||
| 147 | return -ENOMEM; | 151 | return -ENOMEM; |
| 148 | 152 | } | |
| 149 | usb_fill_bulk_urb( stream->urb_list[i], stream->udev, | 153 | usb_fill_bulk_urb( stream->urb_list[i], stream->udev, |
| 150 | usb_rcvbulkpipe(stream->udev,stream->props.endpoint), | 154 | usb_rcvbulkpipe(stream->udev,stream->props.endpoint), |
| 151 | stream->buf_list[i], | 155 | stream->buf_list[i], |
| @@ -170,9 +174,14 @@ static int usb_isoc_urb_init(struct usb_data_stream *stream) | |||
| 170 | for (i = 0; i < stream->props.count; i++) { | 174 | for (i = 0; i < stream->props.count; i++) { |
| 171 | struct urb *urb; | 175 | struct urb *urb; |
| 172 | int frame_offset = 0; | 176 | int frame_offset = 0; |
| 173 | if ((stream->urb_list[i] = | 177 | |
| 174 | usb_alloc_urb(stream->props.u.isoc.framesperurb,GFP_ATOMIC)) == NULL) | 178 | stream->urb_list[i] = usb_alloc_urb(stream->props.u.isoc.framesperurb, GFP_ATOMIC); |
| 179 | if (!stream->urb_list[i]) { | ||
| 180 | deb_mem("not enough memory for urb_alloc_urb!\n"); | ||
| 181 | for (j = 0; j < i; j++) | ||
| 182 | usb_free_urb(stream->urb_list[i]); | ||
| 175 | return -ENOMEM; | 183 | return -ENOMEM; |
| 184 | } | ||
| 176 | 185 | ||
| 177 | urb = stream->urb_list[i]; | 186 | urb = stream->urb_list[i]; |
| 178 | 187 | ||
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c index 6f9b77360440..e98d6caf2c23 100644 --- a/drivers/media/dvb/siano/sms-cards.c +++ b/drivers/media/dvb/siano/sms-cards.c | |||
| @@ -95,7 +95,7 @@ static struct sms_board sms_boards[] = { | |||
| 95 | [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { | 95 | [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { |
| 96 | .name = "Hauppauge WinTV MiniStick", | 96 | .name = "Hauppauge WinTV MiniStick", |
| 97 | .type = SMS_NOVA_B0, | 97 | .type = SMS_NOVA_B0, |
| 98 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw", | 98 | .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw", |
| 99 | }, | 99 | }, |
| 100 | }; | 100 | }; |
| 101 | 101 | ||
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index 66ab0c6e9783..4a3f2b8ea37d 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | |||
| @@ -808,6 +808,12 @@ static int ttusb_alloc_iso_urbs(struct ttusb *ttusb) | |||
| 808 | ISO_BUF_COUNT, | 808 | ISO_BUF_COUNT, |
| 809 | &ttusb->iso_dma_handle); | 809 | &ttusb->iso_dma_handle); |
| 810 | 810 | ||
| 811 | if (!ttusb->iso_buffer) { | ||
| 812 | dprintk("%s: pci_alloc_consistent - not enough memory\n", | ||
| 813 | __func__); | ||
| 814 | return -ENOMEM; | ||
| 815 | } | ||
| 816 | |||
| 811 | memset(ttusb->iso_buffer, 0, | 817 | memset(ttusb->iso_buffer, 0, |
| 812 | ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT); | 818 | ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT); |
| 813 | 819 | ||
| @@ -1659,7 +1665,14 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 1659 | 1665 | ||
| 1660 | ttusb_setup_interfaces(ttusb); | 1666 | ttusb_setup_interfaces(ttusb); |
| 1661 | 1667 | ||
| 1662 | ttusb_alloc_iso_urbs(ttusb); | 1668 | result = ttusb_alloc_iso_urbs(ttusb); |
| 1669 | if (result < 0) { | ||
| 1670 | dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__); | ||
| 1671 | mutex_unlock(&ttusb->semi2c); | ||
| 1672 | kfree(ttusb); | ||
| 1673 | return result; | ||
| 1674 | } | ||
| 1675 | |||
| 1663 | if (ttusb_init_controller(ttusb)) | 1676 | if (ttusb_init_controller(ttusb)) |
| 1664 | printk("ttusb_init_controller: error\n"); | 1677 | printk("ttusb_init_controller: error\n"); |
| 1665 | 1678 | ||
diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c index ab33fec8a19f..0aa96df80fc2 100644 --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c | |||
| @@ -1157,6 +1157,12 @@ static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec) | |||
| 1157 | ISO_BUF_COUNT), | 1157 | ISO_BUF_COUNT), |
| 1158 | &dec->iso_dma_handle); | 1158 | &dec->iso_dma_handle); |
| 1159 | 1159 | ||
| 1160 | if (!dec->iso_buffer) { | ||
| 1161 | dprintk("%s: pci_alloc_consistent - not enough memory\n", | ||
| 1162 | __func__); | ||
| 1163 | return -ENOMEM; | ||
| 1164 | } | ||
| 1165 | |||
| 1160 | memset(dec->iso_buffer, 0, | 1166 | memset(dec->iso_buffer, 0, |
| 1161 | ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT)); | 1167 | ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT)); |
| 1162 | 1168 | ||
| @@ -1254,6 +1260,7 @@ static int ttusb_dec_init_usb(struct ttusb_dec *dec) | |||
| 1254 | dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE, | 1260 | dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE, |
| 1255 | GFP_ATOMIC, &dec->irq_dma_handle); | 1261 | GFP_ATOMIC, &dec->irq_dma_handle); |
| 1256 | if(!dec->irq_buffer) { | 1262 | if(!dec->irq_buffer) { |
| 1263 | usb_free_urb(dec->irq_urb); | ||
| 1257 | return -ENOMEM; | 1264 | return -ENOMEM; |
| 1258 | } | 1265 | } |
| 1259 | usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, | 1266 | usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, |
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index ac3292d7646c..7a8d49ef646e 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
| @@ -62,7 +62,7 @@ static int em28xx_isoc_audio_deinit(struct em28xx *dev) | |||
| 62 | 62 | ||
| 63 | dprintk("Stopping isoc\n"); | 63 | dprintk("Stopping isoc\n"); |
| 64 | for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { | 64 | for (i = 0; i < EM28XX_AUDIO_BUFS; i++) { |
| 65 | usb_kill_urb(dev->adev->urb[i]); | 65 | usb_unlink_urb(dev->adev->urb[i]); |
| 66 | usb_free_urb(dev->adev->urb[i]); | 66 | usb_free_urb(dev->adev->urb[i]); |
| 67 | dev->adev->urb[i] = NULL; | 67 | dev->adev->urb[i] = NULL; |
| 68 | } | 68 | } |
| @@ -75,7 +75,6 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
| 75 | struct em28xx *dev = urb->context; | 75 | struct em28xx *dev = urb->context; |
| 76 | int i; | 76 | int i; |
| 77 | unsigned int oldptr; | 77 | unsigned int oldptr; |
| 78 | unsigned long flags; | ||
| 79 | int period_elapsed = 0; | 78 | int period_elapsed = 0; |
| 80 | int status; | 79 | int status; |
| 81 | unsigned char *cp; | 80 | unsigned char *cp; |
| @@ -96,9 +95,21 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
| 96 | if (!length) | 95 | if (!length) |
| 97 | continue; | 96 | continue; |
| 98 | 97 | ||
| 99 | spin_lock_irqsave(&dev->adev->slock, flags); | ||
| 100 | |||
| 101 | oldptr = dev->adev->hwptr_done_capture; | 98 | oldptr = dev->adev->hwptr_done_capture; |
| 99 | if (oldptr + length >= runtime->buffer_size) { | ||
| 100 | unsigned int cnt = | ||
| 101 | runtime->buffer_size - oldptr; | ||
| 102 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
| 103 | cnt * stride); | ||
| 104 | memcpy(runtime->dma_area, cp + cnt * stride, | ||
| 105 | length * stride - cnt * stride); | ||
| 106 | } else { | ||
| 107 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
| 108 | length * stride); | ||
| 109 | } | ||
| 110 | |||
| 111 | snd_pcm_stream_lock(substream); | ||
| 112 | |||
| 102 | dev->adev->hwptr_done_capture += length; | 113 | dev->adev->hwptr_done_capture += length; |
| 103 | if (dev->adev->hwptr_done_capture >= | 114 | if (dev->adev->hwptr_done_capture >= |
| 104 | runtime->buffer_size) | 115 | runtime->buffer_size) |
| @@ -113,19 +124,7 @@ static void em28xx_audio_isocirq(struct urb *urb) | |||
| 113 | period_elapsed = 1; | 124 | period_elapsed = 1; |
| 114 | } | 125 | } |
| 115 | 126 | ||
| 116 | spin_unlock_irqrestore(&dev->adev->slock, flags); | 127 | snd_pcm_stream_unlock(substream); |
| 117 | |||
| 118 | if (oldptr + length >= runtime->buffer_size) { | ||
| 119 | unsigned int cnt = | ||
| 120 | runtime->buffer_size - oldptr; | ||
| 121 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
| 122 | cnt * stride); | ||
| 123 | memcpy(runtime->dma_area, cp + cnt * stride, | ||
| 124 | length * stride - cnt * stride); | ||
| 125 | } else { | ||
| 126 | memcpy(runtime->dma_area + oldptr * stride, cp, | ||
| 127 | length * stride); | ||
| 128 | } | ||
| 129 | } | 128 | } |
| 130 | if (period_elapsed) | 129 | if (period_elapsed) |
| 131 | snd_pcm_period_elapsed(substream); | 130 | snd_pcm_period_elapsed(substream); |
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c index 5d837c16ee22..15e2b525310d 100644 --- a/drivers/media/video/em28xx/em28xx-core.c +++ b/drivers/media/video/em28xx/em28xx-core.c | |||
| @@ -69,19 +69,33 @@ int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg, | |||
| 69 | int ret, byte; | 69 | int ret, byte; |
| 70 | 70 | ||
| 71 | if (dev->state & DEV_DISCONNECTED) | 71 | if (dev->state & DEV_DISCONNECTED) |
| 72 | return(-ENODEV); | 72 | return -ENODEV; |
| 73 | |||
| 74 | if (len > URB_MAX_CTRL_SIZE) | ||
| 75 | return -EINVAL; | ||
| 73 | 76 | ||
| 74 | em28xx_regdbg("req=%02x, reg=%02x ", req, reg); | 77 | em28xx_regdbg("req=%02x, reg=%02x ", req, reg); |
| 75 | 78 | ||
| 79 | mutex_lock(&dev->ctrl_urb_lock); | ||
| 76 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, | 80 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, |
| 77 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 81 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 78 | 0x0000, reg, buf, len, HZ); | 82 | 0x0000, reg, dev->urb_buf, len, HZ); |
| 83 | if (ret < 0) { | ||
| 84 | if (reg_debug) | ||
| 85 | printk(" failed!\n"); | ||
| 86 | mutex_unlock(&dev->ctrl_urb_lock); | ||
| 87 | return ret; | ||
| 88 | } | ||
| 89 | |||
| 90 | if (len) | ||
| 91 | memcpy(buf, dev->urb_buf, len); | ||
| 92 | |||
| 93 | mutex_unlock(&dev->ctrl_urb_lock); | ||
| 79 | 94 | ||
| 80 | if (reg_debug) { | 95 | if (reg_debug) { |
| 81 | printk(ret < 0 ? " failed!\n" : "%02x values: ", ret); | 96 | printk("%02x values: ", ret); |
| 82 | for (byte = 0; byte < len; byte++) | 97 | for (byte = 0; byte < len; byte++) |
| 83 | printk(" %02x", (unsigned char)buf[byte]); | 98 | printk(" %02x", (unsigned char)buf[byte]); |
| 84 | |||
| 85 | printk("\n"); | 99 | printk("\n"); |
| 86 | } | 100 | } |
| 87 | 101 | ||
| @@ -102,16 +116,20 @@ int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg) | |||
| 102 | 116 | ||
| 103 | em28xx_regdbg("req=%02x, reg=%02x:", req, reg); | 117 | em28xx_regdbg("req=%02x, reg=%02x:", req, reg); |
| 104 | 118 | ||
| 119 | mutex_lock(&dev->ctrl_urb_lock); | ||
| 105 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, | 120 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req, |
| 106 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 121 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 107 | 0x0000, reg, &val, 1, HZ); | 122 | 0x0000, reg, dev->urb_buf, 1, HZ); |
| 108 | 123 | val = dev->urb_buf[0]; | |
| 109 | if (reg_debug) | 124 | mutex_unlock(&dev->ctrl_urb_lock); |
| 110 | printk(ret < 0 ? " failed!\n" : | ||
| 111 | "%02x\n", (unsigned char) val); | ||
| 112 | 125 | ||
| 113 | if (ret < 0) | 126 | if (ret < 0) { |
| 127 | printk(" failed!\n"); | ||
| 114 | return ret; | 128 | return ret; |
| 129 | } | ||
| 130 | |||
| 131 | if (reg_debug) | ||
| 132 | printk("%02x\n", (unsigned char) val); | ||
| 115 | 133 | ||
| 116 | return val; | 134 | return val; |
| 117 | } | 135 | } |
| @@ -130,19 +148,13 @@ int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, | |||
| 130 | { | 148 | { |
| 131 | int ret; | 149 | int ret; |
| 132 | 150 | ||
| 133 | /*usb_control_msg seems to expect a kmalloced buffer */ | ||
| 134 | unsigned char *bufs; | ||
| 135 | |||
| 136 | if (dev->state & DEV_DISCONNECTED) | 151 | if (dev->state & DEV_DISCONNECTED) |
| 137 | return -ENODEV; | 152 | return -ENODEV; |
| 138 | 153 | ||
| 139 | if (len < 1) | 154 | if ((len < 1) || (len > URB_MAX_CTRL_SIZE)) |
| 140 | return -EINVAL; | 155 | return -EINVAL; |
| 141 | 156 | ||
| 142 | bufs = kmalloc(len, GFP_KERNEL); | ||
| 143 | |||
| 144 | em28xx_regdbg("req=%02x reg=%02x:", req, reg); | 157 | em28xx_regdbg("req=%02x reg=%02x:", req, reg); |
| 145 | |||
| 146 | if (reg_debug) { | 158 | if (reg_debug) { |
| 147 | int i; | 159 | int i; |
| 148 | for (i = 0; i < len; ++i) | 160 | for (i = 0; i < len; ++i) |
| @@ -150,16 +162,16 @@ int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, | |||
| 150 | printk("\n"); | 162 | printk("\n"); |
| 151 | } | 163 | } |
| 152 | 164 | ||
| 153 | if (!bufs) | 165 | mutex_lock(&dev->ctrl_urb_lock); |
| 154 | return -ENOMEM; | 166 | memcpy(dev->urb_buf, buf, len); |
| 155 | memcpy(bufs, buf, len); | ||
| 156 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), req, | 167 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), req, |
| 157 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 168 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 158 | 0x0000, reg, bufs, len, HZ); | 169 | 0x0000, reg, dev->urb_buf, len, HZ); |
| 170 | mutex_unlock(&dev->ctrl_urb_lock); | ||
| 171 | |||
| 159 | if (dev->wait_after_write) | 172 | if (dev->wait_after_write) |
| 160 | msleep(dev->wait_after_write); | 173 | msleep(dev->wait_after_write); |
| 161 | 174 | ||
| 162 | kfree(bufs); | ||
| 163 | return ret; | 175 | return ret; |
| 164 | } | 176 | } |
| 165 | 177 | ||
| @@ -270,6 +282,8 @@ static int em28xx_set_audio_source(struct em28xx *dev) | |||
| 270 | break; | 282 | break; |
| 271 | case EM28XX_AMUX_LINE_IN: | 283 | case EM28XX_AMUX_LINE_IN: |
| 272 | input = EM28XX_AUDIO_SRC_LINE; | 284 | input = EM28XX_AUDIO_SRC_LINE; |
| 285 | video = disable; | ||
| 286 | line = enable; | ||
| 273 | break; | 287 | break; |
| 274 | case EM28XX_AMUX_AC97_VIDEO: | 288 | case EM28XX_AMUX_AC97_VIDEO: |
| 275 | input = EM28XX_AUDIO_SRC_LINE; | 289 | input = EM28XX_AUDIO_SRC_LINE; |
diff --git a/drivers/media/video/em28xx/em28xx-i2c.c b/drivers/media/video/em28xx/em28xx-i2c.c index 3bab56b997fc..2360c61ddca9 100644 --- a/drivers/media/video/em28xx/em28xx-i2c.c +++ b/drivers/media/video/em28xx/em28xx-i2c.c | |||
| @@ -337,9 +337,9 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned char *eedata, int len) | |||
| 337 | /* Check if board has eeprom */ | 337 | /* Check if board has eeprom */ |
| 338 | err = i2c_master_recv(&dev->i2c_client, &buf, 0); | 338 | err = i2c_master_recv(&dev->i2c_client, &buf, 0); |
| 339 | if (err < 0) { | 339 | if (err < 0) { |
| 340 | em28xx_errdev("%s: i2c_master_recv failed! err [%d]\n", | 340 | em28xx_errdev("board has no eeprom\n"); |
| 341 | __func__, err); | 341 | memset(eedata, 0, len); |
| 342 | return err; | 342 | return -ENODEV; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | buf = 0; | 345 | buf = 0; |
| @@ -609,14 +609,16 @@ int em28xx_i2c_register(struct em28xx *dev) | |||
| 609 | dev->i2c_client.adapter = &dev->i2c_adap; | 609 | dev->i2c_client.adapter = &dev->i2c_adap; |
| 610 | 610 | ||
| 611 | retval = em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata)); | 611 | retval = em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata)); |
| 612 | if (retval < 0) { | 612 | if ((retval < 0) && (retval != -ENODEV)) { |
| 613 | em28xx_errdev("%s: em28xx_i2_eeprom failed! retval [%d]\n", | 613 | em28xx_errdev("%s: em28xx_i2_eeprom failed! retval [%d]\n", |
| 614 | __func__, retval); | 614 | __func__, retval); |
| 615 | |||
| 615 | return retval; | 616 | return retval; |
| 616 | } | 617 | } |
| 617 | 618 | ||
| 618 | if (i2c_scan) | 619 | if (i2c_scan) |
| 619 | em28xx_do_i2c_scan(dev); | 620 | em28xx_do_i2c_scan(dev); |
| 621 | |||
| 620 | return 0; | 622 | return 0; |
| 621 | } | 623 | } |
| 622 | 624 | ||
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index a1ab2ef45578..610f535a257c 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
| @@ -73,6 +73,7 @@ MODULE_DESCRIPTION(DRIVER_DESC); | |||
| 73 | MODULE_LICENSE("GPL"); | 73 | MODULE_LICENSE("GPL"); |
| 74 | 74 | ||
| 75 | static LIST_HEAD(em28xx_devlist); | 75 | static LIST_HEAD(em28xx_devlist); |
| 76 | static DEFINE_MUTEX(em28xx_devlist_mutex); | ||
| 76 | 77 | ||
| 77 | static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; | 78 | static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; |
| 78 | static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; | 79 | static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; |
| @@ -1519,7 +1520,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
| 1519 | struct em28xx_fh *fh; | 1520 | struct em28xx_fh *fh; |
| 1520 | enum v4l2_buf_type fh_type = 0; | 1521 | enum v4l2_buf_type fh_type = 0; |
| 1521 | 1522 | ||
| 1522 | lock_kernel(); | 1523 | mutex_lock(&em28xx_devlist_mutex); |
| 1523 | list_for_each_entry(h, &em28xx_devlist, devlist) { | 1524 | list_for_each_entry(h, &em28xx_devlist, devlist) { |
| 1524 | if (h->vdev->minor == minor) { | 1525 | if (h->vdev->minor == minor) { |
| 1525 | dev = h; | 1526 | dev = h; |
| @@ -1535,10 +1536,11 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
| 1535 | dev = h; | 1536 | dev = h; |
| 1536 | } | 1537 | } |
| 1537 | } | 1538 | } |
| 1538 | if (NULL == dev) { | 1539 | mutex_unlock(&em28xx_devlist_mutex); |
| 1539 | unlock_kernel(); | 1540 | if (NULL == dev) |
| 1540 | return -ENODEV; | 1541 | return -ENODEV; |
| 1541 | } | 1542 | |
| 1543 | mutex_lock(&dev->lock); | ||
| 1542 | 1544 | ||
| 1543 | em28xx_videodbg("open minor=%d type=%s users=%d\n", | 1545 | em28xx_videodbg("open minor=%d type=%s users=%d\n", |
| 1544 | minor, v4l2_type_names[fh_type], dev->users); | 1546 | minor, v4l2_type_names[fh_type], dev->users); |
| @@ -1547,10 +1549,9 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
| 1547 | fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL); | 1549 | fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL); |
| 1548 | if (!fh) { | 1550 | if (!fh) { |
| 1549 | em28xx_errdev("em28xx-video.c: Out of memory?!\n"); | 1551 | em28xx_errdev("em28xx-video.c: Out of memory?!\n"); |
| 1550 | unlock_kernel(); | 1552 | mutex_unlock(&dev->lock); |
| 1551 | return -ENOMEM; | 1553 | return -ENOMEM; |
| 1552 | } | 1554 | } |
| 1553 | mutex_lock(&dev->lock); | ||
| 1554 | fh->dev = dev; | 1555 | fh->dev = dev; |
| 1555 | fh->radio = radio; | 1556 | fh->radio = radio; |
| 1556 | fh->type = fh_type; | 1557 | fh->type = fh_type; |
| @@ -1584,7 +1585,6 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
| 1584 | sizeof(struct em28xx_buffer), fh); | 1585 | sizeof(struct em28xx_buffer), fh); |
| 1585 | 1586 | ||
| 1586 | mutex_unlock(&dev->lock); | 1587 | mutex_unlock(&dev->lock); |
| 1587 | unlock_kernel(); | ||
| 1588 | 1588 | ||
| 1589 | return errCode; | 1589 | return errCode; |
| 1590 | } | 1590 | } |
| @@ -1871,6 +1871,7 @@ int em28xx_register_extension(struct em28xx_ops *ops) | |||
| 1871 | { | 1871 | { |
| 1872 | struct em28xx *dev = NULL; | 1872 | struct em28xx *dev = NULL; |
| 1873 | 1873 | ||
| 1874 | mutex_lock(&em28xx_devlist_mutex); | ||
| 1874 | mutex_lock(&em28xx_extension_devlist_lock); | 1875 | mutex_lock(&em28xx_extension_devlist_lock); |
| 1875 | list_add_tail(&ops->next, &em28xx_extension_devlist); | 1876 | list_add_tail(&ops->next, &em28xx_extension_devlist); |
| 1876 | list_for_each_entry(dev, &em28xx_devlist, devlist) { | 1877 | list_for_each_entry(dev, &em28xx_devlist, devlist) { |
| @@ -1879,6 +1880,7 @@ int em28xx_register_extension(struct em28xx_ops *ops) | |||
| 1879 | } | 1880 | } |
| 1880 | printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); | 1881 | printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); |
| 1881 | mutex_unlock(&em28xx_extension_devlist_lock); | 1882 | mutex_unlock(&em28xx_extension_devlist_lock); |
| 1883 | mutex_unlock(&em28xx_devlist_mutex); | ||
| 1882 | return 0; | 1884 | return 0; |
| 1883 | } | 1885 | } |
| 1884 | EXPORT_SYMBOL(em28xx_register_extension); | 1886 | EXPORT_SYMBOL(em28xx_register_extension); |
| @@ -1887,6 +1889,7 @@ void em28xx_unregister_extension(struct em28xx_ops *ops) | |||
| 1887 | { | 1889 | { |
| 1888 | struct em28xx *dev = NULL; | 1890 | struct em28xx *dev = NULL; |
| 1889 | 1891 | ||
| 1892 | mutex_lock(&em28xx_devlist_mutex); | ||
| 1890 | list_for_each_entry(dev, &em28xx_devlist, devlist) { | 1893 | list_for_each_entry(dev, &em28xx_devlist, devlist) { |
| 1891 | if (dev) | 1894 | if (dev) |
| 1892 | ops->fini(dev); | 1895 | ops->fini(dev); |
| @@ -1896,6 +1899,7 @@ void em28xx_unregister_extension(struct em28xx_ops *ops) | |||
| 1896 | printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); | 1899 | printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); |
| 1897 | list_del(&ops->next); | 1900 | list_del(&ops->next); |
| 1898 | mutex_unlock(&em28xx_extension_devlist_lock); | 1901 | mutex_unlock(&em28xx_extension_devlist_lock); |
| 1902 | mutex_unlock(&em28xx_devlist_mutex); | ||
| 1899 | } | 1903 | } |
| 1900 | EXPORT_SYMBOL(em28xx_unregister_extension); | 1904 | EXPORT_SYMBOL(em28xx_unregister_extension); |
| 1901 | 1905 | ||
| @@ -1921,6 +1925,60 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev, | |||
| 1921 | } | 1925 | } |
| 1922 | 1926 | ||
| 1923 | 1927 | ||
| 1928 | static int register_analog_devices(struct em28xx *dev) | ||
| 1929 | { | ||
| 1930 | int ret; | ||
| 1931 | |||
| 1932 | /* allocate and fill video video_device struct */ | ||
| 1933 | dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video"); | ||
| 1934 | if (!dev->vdev) { | ||
| 1935 | em28xx_errdev("cannot allocate video_device.\n"); | ||
| 1936 | return -ENODEV; | ||
| 1937 | } | ||
| 1938 | |||
| 1939 | /* register v4l2 video video_device */ | ||
| 1940 | ret = video_register_device(dev->vdev, VFL_TYPE_GRABBER, | ||
| 1941 | video_nr[dev->devno]); | ||
| 1942 | if (ret) { | ||
| 1943 | em28xx_errdev("unable to register video device (error=%i).\n", | ||
| 1944 | ret); | ||
| 1945 | return ret; | ||
| 1946 | } | ||
| 1947 | |||
| 1948 | /* Allocate and fill vbi video_device struct */ | ||
| 1949 | dev->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template, "vbi"); | ||
| 1950 | |||
| 1951 | /* register v4l2 vbi video_device */ | ||
| 1952 | ret = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, | ||
| 1953 | vbi_nr[dev->devno]); | ||
| 1954 | if (ret < 0) { | ||
| 1955 | em28xx_errdev("unable to register vbi device\n"); | ||
| 1956 | return ret; | ||
| 1957 | } | ||
| 1958 | |||
| 1959 | if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) { | ||
| 1960 | dev->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template, "radio"); | ||
| 1961 | if (!dev->radio_dev) { | ||
| 1962 | em28xx_errdev("cannot allocate video_device.\n"); | ||
| 1963 | return -ENODEV; | ||
| 1964 | } | ||
| 1965 | ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO, | ||
| 1966 | radio_nr[dev->devno]); | ||
| 1967 | if (ret < 0) { | ||
| 1968 | em28xx_errdev("can't register radio device\n"); | ||
| 1969 | return ret; | ||
| 1970 | } | ||
| 1971 | em28xx_info("Registered radio device as /dev/radio%d\n", | ||
| 1972 | dev->radio_dev->num); | ||
| 1973 | } | ||
| 1974 | |||
| 1975 | em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", | ||
| 1976 | dev->vdev->num, dev->vbi_dev->num); | ||
| 1977 | |||
| 1978 | return 0; | ||
| 1979 | } | ||
| 1980 | |||
| 1981 | |||
| 1924 | /* | 1982 | /* |
| 1925 | * em28xx_init_dev() | 1983 | * em28xx_init_dev() |
| 1926 | * allocates and inits the device structs, registers i2c bus and v4l device | 1984 | * allocates and inits the device structs, registers i2c bus and v4l device |
| @@ -1936,6 +1994,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 1936 | 1994 | ||
| 1937 | dev->udev = udev; | 1995 | dev->udev = udev; |
| 1938 | mutex_init(&dev->lock); | 1996 | mutex_init(&dev->lock); |
| 1997 | mutex_init(&dev->ctrl_urb_lock); | ||
| 1939 | spin_lock_init(&dev->slock); | 1998 | spin_lock_init(&dev->slock); |
| 1940 | init_waitqueue_head(&dev->open); | 1999 | init_waitqueue_head(&dev->open); |
| 1941 | init_waitqueue_head(&dev->wait_frame); | 2000 | init_waitqueue_head(&dev->wait_frame); |
| @@ -1953,8 +2012,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 1953 | errCode = em28xx_config(dev); | 2012 | errCode = em28xx_config(dev); |
| 1954 | if (errCode) { | 2013 | if (errCode) { |
| 1955 | em28xx_errdev("error configuring device\n"); | 2014 | em28xx_errdev("error configuring device\n"); |
| 1956 | em28xx_devused &= ~(1<<dev->devno); | ||
| 1957 | kfree(dev); | ||
| 1958 | return -ENOMEM; | 2015 | return -ENOMEM; |
| 1959 | } | 2016 | } |
| 1960 | 2017 | ||
| @@ -2001,50 +2058,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 2001 | return errCode; | 2058 | return errCode; |
| 2002 | } | 2059 | } |
| 2003 | 2060 | ||
| 2004 | list_add_tail(&dev->devlist, &em28xx_devlist); | ||
| 2005 | |||
| 2006 | /* allocate and fill video video_device struct */ | ||
| 2007 | dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video"); | ||
| 2008 | if (NULL == dev->vdev) { | ||
| 2009 | em28xx_errdev("cannot allocate video_device.\n"); | ||
| 2010 | goto fail_unreg; | ||
| 2011 | } | ||
| 2012 | |||
| 2013 | /* register v4l2 video video_device */ | ||
| 2014 | retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, | ||
| 2015 | video_nr[dev->devno]); | ||
| 2016 | if (retval) { | ||
| 2017 | em28xx_errdev("unable to register video device (error=%i).\n", | ||
| 2018 | retval); | ||
| 2019 | goto fail_unreg; | ||
| 2020 | } | ||
| 2021 | |||
| 2022 | /* Allocate and fill vbi video_device struct */ | ||
| 2023 | dev->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template, "vbi"); | ||
| 2024 | /* register v4l2 vbi video_device */ | ||
| 2025 | if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI, | ||
| 2026 | vbi_nr[dev->devno]) < 0) { | ||
| 2027 | em28xx_errdev("unable to register vbi device\n"); | ||
| 2028 | retval = -ENODEV; | ||
| 2029 | goto fail_unreg; | ||
| 2030 | } | ||
| 2031 | |||
| 2032 | if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) { | ||
| 2033 | dev->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template, "radio"); | ||
| 2034 | if (NULL == dev->radio_dev) { | ||
| 2035 | em28xx_errdev("cannot allocate video_device.\n"); | ||
| 2036 | goto fail_unreg; | ||
| 2037 | } | ||
| 2038 | retval = video_register_device(dev->radio_dev, VFL_TYPE_RADIO, | ||
| 2039 | radio_nr[dev->devno]); | ||
| 2040 | if (retval < 0) { | ||
| 2041 | em28xx_errdev("can't register radio device\n"); | ||
| 2042 | goto fail_unreg; | ||
| 2043 | } | ||
| 2044 | em28xx_info("Registered radio device as /dev/radio%d\n", | ||
| 2045 | dev->radio_dev->num); | ||
| 2046 | } | ||
| 2047 | |||
| 2048 | /* init video dma queues */ | 2061 | /* init video dma queues */ |
| 2049 | INIT_LIST_HEAD(&dev->vidq.active); | 2062 | INIT_LIST_HEAD(&dev->vidq.active); |
| 2050 | INIT_LIST_HEAD(&dev->vidq.queued); | 2063 | INIT_LIST_HEAD(&dev->vidq.queued); |
| @@ -2071,8 +2084,14 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 2071 | 2084 | ||
| 2072 | video_mux(dev, 0); | 2085 | video_mux(dev, 0); |
| 2073 | 2086 | ||
| 2074 | em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", | 2087 | mutex_lock(&em28xx_devlist_mutex); |
| 2075 | dev->vdev->num, dev->vbi_dev->num); | 2088 | list_add_tail(&dev->devlist, &em28xx_devlist); |
| 2089 | retval = register_analog_devices(dev); | ||
| 2090 | if (retval < 0) { | ||
| 2091 | em28xx_release_resources(dev); | ||
| 2092 | mutex_unlock(&em28xx_devlist_mutex); | ||
| 2093 | goto fail_reg_devices; | ||
| 2094 | } | ||
| 2076 | 2095 | ||
| 2077 | mutex_lock(&em28xx_extension_devlist_lock); | 2096 | mutex_lock(&em28xx_extension_devlist_lock); |
| 2078 | if (!list_empty(&em28xx_extension_devlist)) { | 2097 | if (!list_empty(&em28xx_extension_devlist)) { |
| @@ -2082,13 +2101,12 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
| 2082 | } | 2101 | } |
| 2083 | } | 2102 | } |
| 2084 | mutex_unlock(&em28xx_extension_devlist_lock); | 2103 | mutex_unlock(&em28xx_extension_devlist_lock); |
| 2104 | mutex_unlock(&em28xx_devlist_mutex); | ||
| 2085 | 2105 | ||
| 2086 | return 0; | 2106 | return 0; |
| 2087 | 2107 | ||
| 2088 | fail_unreg: | 2108 | fail_reg_devices: |
| 2089 | em28xx_release_resources(dev); | ||
| 2090 | mutex_unlock(&dev->lock); | 2109 | mutex_unlock(&dev->lock); |
| 2091 | kfree(dev); | ||
| 2092 | return retval; | 2110 | return retval; |
| 2093 | } | 2111 | } |
| 2094 | 2112 | ||
| @@ -2231,8 +2249,12 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
| 2231 | 2249 | ||
| 2232 | /* allocate device struct */ | 2250 | /* allocate device struct */ |
| 2233 | retval = em28xx_init_dev(&dev, udev, nr); | 2251 | retval = em28xx_init_dev(&dev, udev, nr); |
| 2234 | if (retval) | 2252 | if (retval) { |
| 2253 | em28xx_devused &= ~(1<<dev->devno); | ||
| 2254 | kfree(dev); | ||
| 2255 | |||
| 2235 | return retval; | 2256 | return retval; |
| 2257 | } | ||
| 2236 | 2258 | ||
| 2237 | em28xx_info("Found %s\n", em28xx_boards[dev->model].name); | 2259 | em28xx_info("Found %s\n", em28xx_boards[dev->model].name); |
| 2238 | 2260 | ||
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 82781178e0a3..5956e9b3062f 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
| @@ -102,6 +102,9 @@ | |||
| 102 | #define EM28XX_MIN_BUF 4 | 102 | #define EM28XX_MIN_BUF 4 |
| 103 | #define EM28XX_DEF_BUF 8 | 103 | #define EM28XX_DEF_BUF 8 |
| 104 | 104 | ||
| 105 | /*Limits the max URB message size */ | ||
| 106 | #define URB_MAX_CTRL_SIZE 80 | ||
| 107 | |||
| 105 | /* Params for validated field */ | 108 | /* Params for validated field */ |
| 106 | #define EM28XX_BOARD_NOT_VALIDATED 1 | 109 | #define EM28XX_BOARD_NOT_VALIDATED 1 |
| 107 | #define EM28XX_BOARD_VALIDATED 0 | 110 | #define EM28XX_BOARD_VALIDATED 0 |
| @@ -430,6 +433,7 @@ struct em28xx { | |||
| 430 | 433 | ||
| 431 | /* locks */ | 434 | /* locks */ |
| 432 | struct mutex lock; | 435 | struct mutex lock; |
| 436 | struct mutex ctrl_urb_lock; /* protects urb_buf */ | ||
| 433 | /* spinlock_t queue_lock; */ | 437 | /* spinlock_t queue_lock; */ |
| 434 | struct list_head inqueue, outqueue; | 438 | struct list_head inqueue, outqueue; |
| 435 | wait_queue_head_t open, wait_frame, wait_stream; | 439 | wait_queue_head_t open, wait_frame, wait_stream; |
| @@ -451,6 +455,8 @@ struct em28xx { | |||
| 451 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ | 455 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ |
| 452 | struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ | 456 | struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ |
| 453 | char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */ | 457 | char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc transfer */ |
| 458 | char urb_buf[URB_MAX_CTRL_SIZE]; /* urb control msg buffer */ | ||
| 459 | |||
| 454 | /* helper funcs that call usb_control_msg */ | 460 | /* helper funcs that call usb_control_msg */ |
| 455 | int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, | 461 | int (*em28xx_write_regs) (struct em28xx *dev, u16 reg, |
| 456 | char *buf, int len); | 462 | char *buf, int len); |
diff --git a/drivers/media/video/gspca/conex.c b/drivers/media/video/gspca/conex.c index a9d51ba7c57c..de28354ea5ba 100644 --- a/drivers/media/video/gspca/conex.c +++ b/drivers/media/video/gspca/conex.c | |||
| @@ -846,10 +846,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 846 | return 0; | 846 | return 0; |
| 847 | } | 847 | } |
| 848 | 848 | ||
| 849 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 849 | static void sd_stop0(struct gspca_dev *gspca_dev) | 850 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 850 | { | 851 | { |
| 851 | int retry = 50; | 852 | int retry = 50; |
| 852 | 853 | ||
| 854 | if (!gspca_dev->present) | ||
| 855 | return; | ||
| 853 | reg_w_val(gspca_dev, 0x0000, 0x00); | 856 | reg_w_val(gspca_dev, 0x0000, 0x00); |
| 854 | reg_r(gspca_dev, 0x0002, 1); | 857 | reg_r(gspca_dev, 0x0002, 1); |
| 855 | reg_w_val(gspca_dev, 0x0053, 0x00); | 858 | reg_w_val(gspca_dev, 0x0053, 0x00); |
diff --git a/drivers/media/video/gspca/finepix.c b/drivers/media/video/gspca/finepix.c index 65d3cbfe6b27..607942fd7970 100644 --- a/drivers/media/video/gspca/finepix.c +++ b/drivers/media/video/gspca/finepix.c | |||
| @@ -276,6 +276,12 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 276 | /* Stop the state machine */ | 276 | /* Stop the state machine */ |
| 277 | if (dev->state != FPIX_NOP) | 277 | if (dev->state != FPIX_NOP) |
| 278 | wait_for_completion(&dev->can_close); | 278 | wait_for_completion(&dev->can_close); |
| 279 | } | ||
| 280 | |||
| 281 | /* called on streamoff with alt 0 and disconnect */ | ||
| 282 | static void sd_stop0(struct gspca_dev *gspca_dev) | ||
| 283 | { | ||
| 284 | struct usb_fpix *dev = (struct usb_fpix *) gspca_dev; | ||
| 279 | 285 | ||
| 280 | usb_free_urb(dev->control_urb); | 286 | usb_free_urb(dev->control_urb); |
| 281 | dev->control_urb = NULL; | 287 | dev->control_urb = NULL; |
| @@ -385,6 +391,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 385 | error: | 391 | error: |
| 386 | /* Free the ressources */ | 392 | /* Free the ressources */ |
| 387 | sd_stopN(gspca_dev); | 393 | sd_stopN(gspca_dev); |
| 394 | sd_stop0(gspca_dev); | ||
| 388 | return ret; | 395 | return ret; |
| 389 | } | 396 | } |
| 390 | 397 | ||
| @@ -425,6 +432,7 @@ static const struct sd_desc sd_desc = { | |||
| 425 | .init = sd_init, | 432 | .init = sd_init, |
| 426 | .start = sd_start, | 433 | .start = sd_start, |
| 427 | .stopN = sd_stopN, | 434 | .stopN = sd_stopN, |
| 435 | .stop0 = sd_stop0, | ||
| 428 | }; | 436 | }; |
| 429 | 437 | ||
| 430 | /* -- device connect -- */ | 438 | /* -- device connect -- */ |
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index e48fbfc8ad05..748a87e82e44 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
| @@ -646,15 +646,14 @@ static void gspca_stream_off(struct gspca_dev *gspca_dev) | |||
| 646 | { | 646 | { |
| 647 | gspca_dev->streaming = 0; | 647 | gspca_dev->streaming = 0; |
| 648 | atomic_set(&gspca_dev->nevent, 0); | 648 | atomic_set(&gspca_dev->nevent, 0); |
| 649 | if (gspca_dev->present) { | 649 | if (gspca_dev->present |
| 650 | if (gspca_dev->sd_desc->stopN) | 650 | && gspca_dev->sd_desc->stopN) |
| 651 | gspca_dev->sd_desc->stopN(gspca_dev); | 651 | gspca_dev->sd_desc->stopN(gspca_dev); |
| 652 | destroy_urbs(gspca_dev); | 652 | destroy_urbs(gspca_dev); |
| 653 | gspca_set_alt0(gspca_dev); | 653 | gspca_set_alt0(gspca_dev); |
| 654 | if (gspca_dev->sd_desc->stop0) | 654 | if (gspca_dev->sd_desc->stop0) |
| 655 | gspca_dev->sd_desc->stop0(gspca_dev); | 655 | gspca_dev->sd_desc->stop0(gspca_dev); |
| 656 | PDEBUG(D_STREAM, "stream off OK"); | 656 | PDEBUG(D_STREAM, "stream off OK"); |
| 657 | } | ||
| 658 | } | 657 | } |
| 659 | 658 | ||
| 660 | static void gspca_set_default_mode(struct gspca_dev *gspca_dev) | 659 | static void gspca_set_default_mode(struct gspca_dev *gspca_dev) |
| @@ -863,7 +862,7 @@ static int dev_open(struct inode *inode, struct file *file) | |||
| 863 | int ret; | 862 | int ret; |
| 864 | 863 | ||
| 865 | PDEBUG(D_STREAM, "%s open", current->comm); | 864 | PDEBUG(D_STREAM, "%s open", current->comm); |
| 866 | gspca_dev = (struct gspca_dev *) video_devdata(file); | 865 | gspca_dev = video_drvdata(file); |
| 867 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) | 866 | if (mutex_lock_interruptible(&gspca_dev->queue_lock)) |
| 868 | return -ERESTARTSYS; | 867 | return -ERESTARTSYS; |
| 869 | if (!gspca_dev->present) { | 868 | if (!gspca_dev->present) { |
| @@ -875,6 +874,13 @@ static int dev_open(struct inode *inode, struct file *file) | |||
| 875 | ret = -EBUSY; | 874 | ret = -EBUSY; |
| 876 | goto out; | 875 | goto out; |
| 877 | } | 876 | } |
| 877 | |||
| 878 | /* protect the subdriver against rmmod */ | ||
| 879 | if (!try_module_get(gspca_dev->module)) { | ||
| 880 | ret = -ENODEV; | ||
| 881 | goto out; | ||
| 882 | } | ||
| 883 | |||
| 878 | gspca_dev->users++; | 884 | gspca_dev->users++; |
| 879 | 885 | ||
| 880 | /* one more user */ | 886 | /* one more user */ |
| @@ -884,10 +890,10 @@ static int dev_open(struct inode *inode, struct file *file) | |||
| 884 | #ifdef GSPCA_DEBUG | 890 | #ifdef GSPCA_DEBUG |
| 885 | /* activate the v4l2 debug */ | 891 | /* activate the v4l2 debug */ |
| 886 | if (gspca_debug & D_V4L2) | 892 | if (gspca_debug & D_V4L2) |
| 887 | gspca_dev->vdev.debug |= V4L2_DEBUG_IOCTL | 893 | gspca_dev->vdev->debug |= V4L2_DEBUG_IOCTL |
| 888 | | V4L2_DEBUG_IOCTL_ARG; | 894 | | V4L2_DEBUG_IOCTL_ARG; |
| 889 | else | 895 | else |
| 890 | gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL | 896 | gspca_dev->vdev->debug &= ~(V4L2_DEBUG_IOCTL |
| 891 | | V4L2_DEBUG_IOCTL_ARG); | 897 | | V4L2_DEBUG_IOCTL_ARG); |
| 892 | #endif | 898 | #endif |
| 893 | ret = 0; | 899 | ret = 0; |
| @@ -921,6 +927,7 @@ static int dev_close(struct inode *inode, struct file *file) | |||
| 921 | gspca_dev->memory = GSPCA_MEMORY_NO; | 927 | gspca_dev->memory = GSPCA_MEMORY_NO; |
| 922 | } | 928 | } |
| 923 | file->private_data = NULL; | 929 | file->private_data = NULL; |
| 930 | module_put(gspca_dev->module); | ||
| 924 | mutex_unlock(&gspca_dev->queue_lock); | 931 | mutex_unlock(&gspca_dev->queue_lock); |
| 925 | 932 | ||
| 926 | PDEBUG(D_STREAM, "close done"); | 933 | PDEBUG(D_STREAM, "close done"); |
| @@ -1748,11 +1755,6 @@ out: | |||
| 1748 | return ret; | 1755 | return ret; |
| 1749 | } | 1756 | } |
| 1750 | 1757 | ||
| 1751 | static void dev_release(struct video_device *vfd) | ||
| 1752 | { | ||
| 1753 | /* nothing */ | ||
| 1754 | } | ||
| 1755 | |||
| 1756 | static struct file_operations dev_fops = { | 1758 | static struct file_operations dev_fops = { |
| 1757 | .owner = THIS_MODULE, | 1759 | .owner = THIS_MODULE, |
| 1758 | .open = dev_open, | 1760 | .open = dev_open, |
| @@ -1800,7 +1802,7 @@ static struct video_device gspca_template = { | |||
| 1800 | .name = "gspca main driver", | 1802 | .name = "gspca main driver", |
| 1801 | .fops = &dev_fops, | 1803 | .fops = &dev_fops, |
| 1802 | .ioctl_ops = &dev_ioctl_ops, | 1804 | .ioctl_ops = &dev_ioctl_ops, |
| 1803 | .release = dev_release, /* mandatory */ | 1805 | .release = video_device_release, |
| 1804 | .minor = -1, | 1806 | .minor = -1, |
| 1805 | }; | 1807 | }; |
| 1806 | 1808 | ||
| @@ -1869,17 +1871,18 @@ int gspca_dev_probe(struct usb_interface *intf, | |||
| 1869 | init_waitqueue_head(&gspca_dev->wq); | 1871 | init_waitqueue_head(&gspca_dev->wq); |
| 1870 | 1872 | ||
| 1871 | /* init video stuff */ | 1873 | /* init video stuff */ |
| 1872 | memcpy(&gspca_dev->vdev, &gspca_template, sizeof gspca_template); | 1874 | gspca_dev->vdev = video_device_alloc(); |
| 1873 | gspca_dev->vdev.parent = &dev->dev; | 1875 | memcpy(gspca_dev->vdev, &gspca_template, sizeof gspca_template); |
| 1874 | memcpy(&gspca_dev->fops, &dev_fops, sizeof gspca_dev->fops); | 1876 | gspca_dev->vdev->parent = &dev->dev; |
| 1875 | gspca_dev->vdev.fops = &gspca_dev->fops; | 1877 | gspca_dev->module = module; |
| 1876 | gspca_dev->fops.owner = module; /* module protection */ | ||
| 1877 | gspca_dev->present = 1; | 1878 | gspca_dev->present = 1; |
| 1878 | ret = video_register_device(&gspca_dev->vdev, | 1879 | video_set_drvdata(gspca_dev->vdev, gspca_dev); |
| 1880 | ret = video_register_device(gspca_dev->vdev, | ||
| 1879 | VFL_TYPE_GRABBER, | 1881 | VFL_TYPE_GRABBER, |
| 1880 | video_nr); | 1882 | video_nr); |
| 1881 | if (ret < 0) { | 1883 | if (ret < 0) { |
| 1882 | err("video_register_device err %d", ret); | 1884 | err("video_register_device err %d", ret); |
| 1885 | video_device_release(gspca_dev->vdev); | ||
| 1883 | goto out; | 1886 | goto out; |
| 1884 | } | 1887 | } |
| 1885 | 1888 | ||
| @@ -1887,7 +1890,8 @@ int gspca_dev_probe(struct usb_interface *intf, | |||
| 1887 | PDEBUG(D_PROBE, "probe ok"); | 1890 | PDEBUG(D_PROBE, "probe ok"); |
| 1888 | return 0; | 1891 | return 0; |
| 1889 | out: | 1892 | out: |
| 1890 | kref_put(&gspca_dev->kref, gspca_delete); | 1893 | kfree(gspca_dev->usb_buf); |
| 1894 | kfree(gspca_dev); | ||
| 1891 | return ret; | 1895 | return ret; |
| 1892 | } | 1896 | } |
| 1893 | EXPORT_SYMBOL(gspca_dev_probe); | 1897 | EXPORT_SYMBOL(gspca_dev_probe); |
| @@ -1905,7 +1909,7 @@ void gspca_disconnect(struct usb_interface *intf) | |||
| 1905 | usb_set_intfdata(intf, NULL); | 1909 | usb_set_intfdata(intf, NULL); |
| 1906 | 1910 | ||
| 1907 | /* We don't want people trying to open up the device */ | 1911 | /* We don't want people trying to open up the device */ |
| 1908 | video_unregister_device(&gspca_dev->vdev); | 1912 | video_unregister_device(gspca_dev->vdev); |
| 1909 | 1913 | ||
| 1910 | gspca_dev->present = 0; | 1914 | gspca_dev->present = 0; |
| 1911 | gspca_dev->streaming = 0; | 1915 | gspca_dev->streaming = 0; |
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h index 1d9dc90b4791..d25e8d69373b 100644 --- a/drivers/media/video/gspca/gspca.h +++ b/drivers/media/video/gspca/gspca.h | |||
| @@ -97,7 +97,7 @@ struct sd_desc { | |||
| 97 | cam_pkt_op pkt_scan; | 97 | cam_pkt_op pkt_scan; |
| 98 | /* optional operations */ | 98 | /* optional operations */ |
| 99 | cam_v_op stopN; /* called on stream off - main alt */ | 99 | cam_v_op stopN; /* called on stream off - main alt */ |
| 100 | cam_v_op stop0; /* called on stream off - alt 0 */ | 100 | cam_v_op stop0; /* called on stream off & disconnect - alt 0 */ |
| 101 | cam_v_op dq_callback; /* called when a frame has been dequeued */ | 101 | cam_v_op dq_callback; /* called when a frame has been dequeued */ |
| 102 | cam_jpg_op get_jcomp; | 102 | cam_jpg_op get_jcomp; |
| 103 | cam_jpg_op set_jcomp; | 103 | cam_jpg_op set_jcomp; |
| @@ -120,8 +120,8 @@ struct gspca_frame { | |||
| 120 | }; | 120 | }; |
| 121 | 121 | ||
| 122 | struct gspca_dev { | 122 | struct gspca_dev { |
| 123 | struct video_device vdev; /* !! must be the first item */ | 123 | struct video_device *vdev; |
| 124 | struct file_operations fops; | 124 | struct module *module; /* subdriver handling the device */ |
| 125 | struct usb_device *dev; | 125 | struct usb_device *dev; |
| 126 | struct kref kref; | 126 | struct kref kref; |
| 127 | struct file *capt_file; /* file doing video capture */ | 127 | struct file *capt_file; /* file doing video capture */ |
diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c index e5ff9a6199ef..fbd45e235d97 100644 --- a/drivers/media/video/gspca/pac7311.c +++ b/drivers/media/video/gspca/pac7311.c | |||
| @@ -749,10 +749,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 749 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */ | 749 | reg_w(gspca_dev, 0x78, 0x44); /* Bit_0=start stream, Bit_6=LED */ |
| 750 | } | 750 | } |
| 751 | 751 | ||
| 752 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 752 | static void sd_stop0(struct gspca_dev *gspca_dev) | 753 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 753 | { | 754 | { |
| 754 | struct sd *sd = (struct sd *) gspca_dev; | 755 | struct sd *sd = (struct sd *) gspca_dev; |
| 755 | 756 | ||
| 757 | if (!gspca_dev->present) | ||
| 758 | return; | ||
| 756 | if (sd->sensor == SENSOR_PAC7302) { | 759 | if (sd->sensor == SENSOR_PAC7302) { |
| 757 | reg_w(gspca_dev, 0xff, 0x01); | 760 | reg_w(gspca_dev, 0xff, 0x01); |
| 758 | reg_w(gspca_dev, 0x78, 0x40); | 761 | reg_w(gspca_dev, 0x78, 0x40); |
diff --git a/drivers/media/video/gspca/spca501.c b/drivers/media/video/gspca/spca501.c index b742f260c7ca..e29954c1c38c 100644 --- a/drivers/media/video/gspca/spca501.c +++ b/drivers/media/video/gspca/spca501.c | |||
| @@ -2022,8 +2022,11 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 2022 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x01, 0x00); | 2022 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x01, 0x00); |
| 2023 | } | 2023 | } |
| 2024 | 2024 | ||
| 2025 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 2025 | static void sd_stop0(struct gspca_dev *gspca_dev) | 2026 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 2026 | { | 2027 | { |
| 2028 | if (!gspca_dev->present) | ||
| 2029 | return; | ||
| 2027 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x05, 0x00); | 2030 | reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x05, 0x00); |
| 2028 | } | 2031 | } |
| 2029 | 2032 | ||
diff --git a/drivers/media/video/gspca/spca505.c b/drivers/media/video/gspca/spca505.c index b345749213cf..895b9fe4018c 100644 --- a/drivers/media/video/gspca/spca505.c +++ b/drivers/media/video/gspca/spca505.c | |||
| @@ -742,8 +742,12 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 742 | reg_write(gspca_dev->dev, 0x02, 0x00, 0x00); | 742 | reg_write(gspca_dev->dev, 0x02, 0x00, 0x00); |
| 743 | } | 743 | } |
| 744 | 744 | ||
| 745 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 745 | static void sd_stop0(struct gspca_dev *gspca_dev) | 746 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 746 | { | 747 | { |
| 748 | if (!gspca_dev->present) | ||
| 749 | return; | ||
| 750 | |||
| 747 | /* This maybe reset or power control */ | 751 | /* This maybe reset or power control */ |
| 748 | reg_write(gspca_dev->dev, 0x03, 0x03, 0x20); | 752 | reg_write(gspca_dev->dev, 0x03, 0x03, 0x20); |
| 749 | reg_write(gspca_dev->dev, 0x03, 0x01, 0x0); | 753 | reg_write(gspca_dev->dev, 0x03, 0x01, 0x0); |
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c index 020a03c466c1..c3de4e44123d 100644 --- a/drivers/media/video/gspca/spca561.c +++ b/drivers/media/video/gspca/spca561.c | |||
| @@ -766,10 +766,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 766 | } | 766 | } |
| 767 | } | 767 | } |
| 768 | 768 | ||
| 769 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 769 | static void sd_stop0(struct gspca_dev *gspca_dev) | 770 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 770 | { | 771 | { |
| 771 | struct sd *sd = (struct sd *) gspca_dev; | 772 | struct sd *sd = (struct sd *) gspca_dev; |
| 772 | 773 | ||
| 774 | if (!gspca_dev->present) | ||
| 775 | return; | ||
| 773 | if (sd->chip_revision == Rev012A) { | 776 | if (sd->chip_revision == Rev012A) { |
| 774 | reg_w_val(gspca_dev->dev, 0x8118, 0x29); | 777 | reg_w_val(gspca_dev->dev, 0x8118, 0x29); |
| 775 | reg_w_val(gspca_dev->dev, 0x8114, 0x08); | 778 | reg_w_val(gspca_dev->dev, 0x8114, 0x08); |
diff --git a/drivers/media/video/gspca/vc032x.c b/drivers/media/video/gspca/vc032x.c index be46d9232540..17af353ddd1c 100644 --- a/drivers/media/video/gspca/vc032x.c +++ b/drivers/media/video/gspca/vc032x.c | |||
| @@ -1633,10 +1633,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 1633 | reg_w(dev, 0xa0, 0x09, 0xb003); | 1633 | reg_w(dev, 0xa0, 0x09, 0xb003); |
| 1634 | } | 1634 | } |
| 1635 | 1635 | ||
| 1636 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 1636 | static void sd_stop0(struct gspca_dev *gspca_dev) | 1637 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 1637 | { | 1638 | { |
| 1638 | struct usb_device *dev = gspca_dev->dev; | 1639 | struct usb_device *dev = gspca_dev->dev; |
| 1639 | 1640 | ||
| 1641 | if (!gspca_dev->present) | ||
| 1642 | return; | ||
| 1640 | reg_w(dev, 0x89, 0xffff, 0xffff); | 1643 | reg_w(dev, 0x89, 0xffff, 0xffff); |
| 1641 | } | 1644 | } |
| 1642 | 1645 | ||
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index 8b3101d347c3..0befacf49855 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c | |||
| @@ -7336,10 +7336,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 7336 | return 0; | 7336 | return 0; |
| 7337 | } | 7337 | } |
| 7338 | 7338 | ||
| 7339 | /* called on streamoff with alt 0 and on disconnect */ | ||
| 7339 | static void sd_stop0(struct gspca_dev *gspca_dev) | 7340 | static void sd_stop0(struct gspca_dev *gspca_dev) |
| 7340 | { | 7341 | { |
| 7341 | struct sd *sd = (struct sd *) gspca_dev; | 7342 | struct sd *sd = (struct sd *) gspca_dev; |
| 7342 | 7343 | ||
| 7344 | if (!gspca_dev->present) | ||
| 7345 | return; | ||
| 7343 | send_unknown(gspca_dev->dev, sd->sensor); | 7346 | send_unknown(gspca_dev->dev, sd->sensor); |
| 7344 | } | 7347 | } |
| 7345 | 7348 | ||
diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c index 5272926db73e..3c3f8cf73108 100644 --- a/drivers/media/video/s2255drv.c +++ b/drivers/media/video/s2255drv.c | |||
| @@ -192,7 +192,7 @@ struct s2255_dmaqueue { | |||
| 192 | #define S2255_FW_FAILED 3 | 192 | #define S2255_FW_FAILED 3 |
| 193 | #define S2255_FW_DISCONNECTING 4 | 193 | #define S2255_FW_DISCONNECTING 4 |
| 194 | 194 | ||
| 195 | #define S2255_FW_MARKER 0x22552f2f | 195 | #define S2255_FW_MARKER cpu_to_le32(0x22552f2f) |
| 196 | /* 2255 read states */ | 196 | /* 2255 read states */ |
| 197 | #define S2255_READ_IDLE 0 | 197 | #define S2255_READ_IDLE 0 |
| 198 | #define S2255_READ_FRAME 1 | 198 | #define S2255_READ_FRAME 1 |
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c index 7bcb81002dcf..571b211608d1 100644 --- a/drivers/misc/sony-laptop.c +++ b/drivers/misc/sony-laptop.c | |||
| @@ -1038,8 +1038,8 @@ static int sony_nc_add(struct acpi_device *device) | |||
| 1038 | goto outinput; | 1038 | goto outinput; |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | if (!acpi_video_backlight_support()) { | 1041 | if (acpi_video_backlight_support()) { |
| 1042 | printk(KERN_INFO DRV_PFX "Sony: Brightness ignored, must be " | 1042 | printk(KERN_INFO DRV_PFX "brightness ignored, must be " |
| 1043 | "controlled by ACPI video driver\n"); | 1043 | "controlled by ACPI video driver\n"); |
| 1044 | } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", | 1044 | } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", |
| 1045 | &handle))) { | 1045 | &handle))) { |
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 7a4a26b0edd2..899766e16fa8 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
| @@ -5318,6 +5318,7 @@ static enum fan_control_commands fan_control_commands; | |||
| 5318 | 5318 | ||
| 5319 | static u8 fan_control_initial_status; | 5319 | static u8 fan_control_initial_status; |
| 5320 | static u8 fan_control_desired_level; | 5320 | static u8 fan_control_desired_level; |
| 5321 | static u8 fan_control_resume_level; | ||
| 5321 | static int fan_watchdog_maxinterval; | 5322 | static int fan_watchdog_maxinterval; |
| 5322 | 5323 | ||
| 5323 | static struct mutex fan_mutex; | 5324 | static struct mutex fan_mutex; |
| @@ -5440,8 +5441,8 @@ static int fan_set_level(int level) | |||
| 5440 | 5441 | ||
| 5441 | case TPACPI_FAN_WR_ACPI_FANS: | 5442 | case TPACPI_FAN_WR_ACPI_FANS: |
| 5442 | case TPACPI_FAN_WR_TPEC: | 5443 | case TPACPI_FAN_WR_TPEC: |
| 5443 | if ((level != TP_EC_FAN_AUTO) && | 5444 | if (!(level & TP_EC_FAN_AUTO) && |
| 5444 | (level != TP_EC_FAN_FULLSPEED) && | 5445 | !(level & TP_EC_FAN_FULLSPEED) && |
| 5445 | ((level < 0) || (level > 7))) | 5446 | ((level < 0) || (level > 7))) |
| 5446 | return -EINVAL; | 5447 | return -EINVAL; |
| 5447 | 5448 | ||
| @@ -6005,38 +6006,67 @@ static void fan_exit(void) | |||
| 6005 | 6006 | ||
| 6006 | static void fan_suspend(pm_message_t state) | 6007 | static void fan_suspend(pm_message_t state) |
| 6007 | { | 6008 | { |
| 6009 | int rc; | ||
| 6010 | |||
| 6008 | if (!fan_control_allowed) | 6011 | if (!fan_control_allowed) |
| 6009 | return; | 6012 | return; |
| 6010 | 6013 | ||
| 6011 | /* Store fan status in cache */ | 6014 | /* Store fan status in cache */ |
| 6012 | fan_get_status_safe(NULL); | 6015 | fan_control_resume_level = 0; |
| 6016 | rc = fan_get_status_safe(&fan_control_resume_level); | ||
| 6017 | if (rc < 0) | ||
| 6018 | printk(TPACPI_NOTICE | ||
| 6019 | "failed to read fan level for later " | ||
| 6020 | "restore during resume: %d\n", rc); | ||
| 6021 | |||
| 6022 | /* if it is undefined, don't attempt to restore it. | ||
| 6023 | * KEEP THIS LAST */ | ||
| 6013 | if (tp_features.fan_ctrl_status_undef) | 6024 | if (tp_features.fan_ctrl_status_undef) |
| 6014 | fan_control_desired_level = TP_EC_FAN_AUTO; | 6025 | fan_control_resume_level = 0; |
| 6015 | } | 6026 | } |
| 6016 | 6027 | ||
| 6017 | static void fan_resume(void) | 6028 | static void fan_resume(void) |
| 6018 | { | 6029 | { |
| 6019 | u8 saved_fan_level; | ||
| 6020 | u8 current_level = 7; | 6030 | u8 current_level = 7; |
| 6021 | bool do_set = false; | 6031 | bool do_set = false; |
| 6032 | int rc; | ||
| 6022 | 6033 | ||
| 6023 | /* DSDT *always* updates status on resume */ | 6034 | /* DSDT *always* updates status on resume */ |
| 6024 | tp_features.fan_ctrl_status_undef = 0; | 6035 | tp_features.fan_ctrl_status_undef = 0; |
| 6025 | 6036 | ||
| 6026 | saved_fan_level = fan_control_desired_level; | ||
| 6027 | if (!fan_control_allowed || | 6037 | if (!fan_control_allowed || |
| 6038 | !fan_control_resume_level || | ||
| 6028 | (fan_get_status_safe(¤t_level) < 0)) | 6039 | (fan_get_status_safe(¤t_level) < 0)) |
| 6029 | return; | 6040 | return; |
| 6030 | 6041 | ||
| 6031 | switch (fan_control_access_mode) { | 6042 | switch (fan_control_access_mode) { |
| 6032 | case TPACPI_FAN_WR_ACPI_SFAN: | 6043 | case TPACPI_FAN_WR_ACPI_SFAN: |
| 6033 | do_set = (saved_fan_level > current_level); | 6044 | /* never decrease fan level */ |
| 6045 | do_set = (fan_control_resume_level > current_level); | ||
| 6034 | break; | 6046 | break; |
| 6035 | case TPACPI_FAN_WR_ACPI_FANS: | 6047 | case TPACPI_FAN_WR_ACPI_FANS: |
| 6036 | case TPACPI_FAN_WR_TPEC: | 6048 | case TPACPI_FAN_WR_TPEC: |
| 6037 | do_set = ((saved_fan_level & TP_EC_FAN_FULLSPEED) || | 6049 | /* never decrease fan level, scale is: |
| 6038 | (saved_fan_level == 7 && | 6050 | * TP_EC_FAN_FULLSPEED > 7 >= TP_EC_FAN_AUTO |
| 6039 | !(current_level & TP_EC_FAN_FULLSPEED))); | 6051 | * |
| 6052 | * We expect the firmware to set either 7 or AUTO, but we | ||
| 6053 | * handle FULLSPEED out of paranoia. | ||
| 6054 | * | ||
| 6055 | * So, we can safely only restore FULLSPEED or 7, anything | ||
| 6056 | * else could slow the fan. Restoring AUTO is useless, at | ||
| 6057 | * best that's exactly what the DSDT already set (it is the | ||
| 6058 | * slower it uses). | ||
| 6059 | * | ||
| 6060 | * Always keep in mind that the DSDT *will* have set the | ||
| 6061 | * fans to what the vendor supposes is the best level. We | ||
| 6062 | * muck with it only to speed the fan up. | ||
| 6063 | */ | ||
| 6064 | if (fan_control_resume_level != 7 && | ||
| 6065 | !(fan_control_resume_level & TP_EC_FAN_FULLSPEED)) | ||
| 6066 | return; | ||
| 6067 | else | ||
| 6068 | do_set = !(current_level & TP_EC_FAN_FULLSPEED) && | ||
| 6069 | (current_level != fan_control_resume_level); | ||
| 6040 | break; | 6070 | break; |
| 6041 | default: | 6071 | default: |
| 6042 | return; | 6072 | return; |
| @@ -6044,8 +6074,11 @@ static void fan_resume(void) | |||
| 6044 | if (do_set) { | 6074 | if (do_set) { |
| 6045 | printk(TPACPI_NOTICE | 6075 | printk(TPACPI_NOTICE |
| 6046 | "restoring fan level to 0x%02x\n", | 6076 | "restoring fan level to 0x%02x\n", |
| 6047 | saved_fan_level); | 6077 | fan_control_resume_level); |
| 6048 | fan_set_level_safe(saved_fan_level); | 6078 | rc = fan_set_level_safe(fan_control_resume_level); |
| 6079 | if (rc < 0) | ||
| 6080 | printk(TPACPI_NOTICE | ||
| 6081 | "failed to restore fan level: %d\n", rc); | ||
| 6049 | } | 6082 | } |
| 6050 | } | 6083 | } |
| 6051 | 6084 | ||
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index e04bcf1dff87..d8966bae0e0b 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -1022,7 +1022,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
| 1022 | } | 1022 | } |
| 1023 | 1023 | ||
| 1024 | /* | 1024 | /* |
| 1025 | * OK, now the LEB is locked and we can safely start moving iy. Since | 1025 | * OK, now the LEB is locked and we can safely start moving it. Since |
| 1026 | * this function utilizes thie @ubi->peb1_buf buffer which is shared | 1026 | * this function utilizes thie @ubi->peb1_buf buffer which is shared |
| 1027 | * with some other functions, so lock the buffer by taking the | 1027 | * with some other functions, so lock the buffer by taking the |
| 1028 | * @ubi->buf_mutex. | 1028 | * @ubi->buf_mutex. |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index 4f2daa5bbecf..41d47e1cf15c 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -320,7 +320,7 @@ static int compare_lebs(struct ubi_device *ubi, const struct ubi_scan_leb *seb, | |||
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | err = ubi_io_read_data(ubi, buf, pnum, 0, len); | 322 | err = ubi_io_read_data(ubi, buf, pnum, 0, len); |
| 323 | if (err && err != UBI_IO_BITFLIPS) | 323 | if (err && err != UBI_IO_BITFLIPS && err != -EBADMSG) |
| 324 | goto out_free_buf; | 324 | goto out_free_buf; |
| 325 | 325 | ||
| 326 | data_crc = be32_to_cpu(vid_hdr->data_crc); | 326 | data_crc = be32_to_cpu(vid_hdr->data_crc); |
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c index 05d70937b543..dcb6dac1dc54 100644 --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c | |||
| @@ -1396,7 +1396,8 @@ int ubi_thread(void *u) | |||
| 1396 | ubi_msg("%s: %d consecutive failures", | 1396 | ubi_msg("%s: %d consecutive failures", |
| 1397 | ubi->bgt_name, WL_MAX_FAILURES); | 1397 | ubi->bgt_name, WL_MAX_FAILURES); |
| 1398 | ubi_ro_mode(ubi); | 1398 | ubi_ro_mode(ubi); |
| 1399 | break; | 1399 | ubi->thread_enabled = 0; |
| 1400 | continue; | ||
| 1400 | } | 1401 | } |
| 1401 | } else | 1402 | } else |
| 1402 | failures = 0; | 1403 | failures = 0; |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 11f143f4adf6..231eeaf1d552 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -1825,9 +1825,10 @@ config FEC2 | |||
| 1825 | 1825 | ||
| 1826 | config FEC_MPC52xx | 1826 | config FEC_MPC52xx |
| 1827 | tristate "MPC52xx FEC driver" | 1827 | tristate "MPC52xx FEC driver" |
| 1828 | depends on PPC_MPC52xx && PPC_BESTCOMM_FEC | 1828 | depends on PPC_MPC52xx && PPC_BESTCOMM |
| 1829 | select CRC32 | 1829 | select CRC32 |
| 1830 | select PHYLIB | 1830 | select PHYLIB |
| 1831 | select PPC_BESTCOMM_FEC | ||
| 1831 | ---help--- | 1832 | ---help--- |
| 1832 | This option enables support for the MPC5200's on-chip | 1833 | This option enables support for the MPC5200's on-chip |
| 1833 | Fast Ethernet Controller | 1834 | Fast Ethernet Controller |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 36f2bb666bf7..8ed823ae639e 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -2330,7 +2330,7 @@ static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, | |||
| 2330 | * Once we know the feature-set enabled for the device, we'll cache | 2330 | * Once we know the feature-set enabled for the device, we'll cache |
| 2331 | * the register offset the descriptor ring is assigned to. | 2331 | * the register offset the descriptor ring is assigned to. |
| 2332 | **/ | 2332 | **/ |
| 2333 | static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | 2333 | static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) |
| 2334 | { | 2334 | { |
| 2335 | int feature_mask = 0, rss_i; | 2335 | int feature_mask = 0, rss_i; |
| 2336 | int i, txr_idx, rxr_idx; | 2336 | int i, txr_idx, rxr_idx; |
| @@ -2367,7 +2367,7 @@ static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | |||
| 2367 | * number of queues at compile-time. The polling_netdev array is | 2367 | * number of queues at compile-time. The polling_netdev array is |
| 2368 | * intended for Multiqueue, but should work fine with a single queue. | 2368 | * intended for Multiqueue, but should work fine with a single queue. |
| 2369 | **/ | 2369 | **/ |
| 2370 | static int __devinit ixgbe_alloc_queues(struct ixgbe_adapter *adapter) | 2370 | static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter) |
| 2371 | { | 2371 | { |
| 2372 | int i; | 2372 | int i; |
| 2373 | 2373 | ||
| @@ -2408,8 +2408,7 @@ err_tx_ring_allocation: | |||
| 2408 | * Attempt to configure the interrupts using the best available | 2408 | * Attempt to configure the interrupts using the best available |
| 2409 | * capabilities of the hardware and the kernel. | 2409 | * capabilities of the hardware and the kernel. |
| 2410 | **/ | 2410 | **/ |
| 2411 | static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapter | 2411 | static int ixgbe_set_interrupt_capability(struct ixgbe_adapter *adapter) |
| 2412 | *adapter) | ||
| 2413 | { | 2412 | { |
| 2414 | int err = 0; | 2413 | int err = 0; |
| 2415 | int vector, v_budget; | 2414 | int vector, v_budget; |
| @@ -2501,7 +2500,7 @@ static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) | |||
| 2501 | * - Hardware queue count (num_*_queues) | 2500 | * - Hardware queue count (num_*_queues) |
| 2502 | * - defined by miscellaneous hardware support/features (RSS, etc.) | 2501 | * - defined by miscellaneous hardware support/features (RSS, etc.) |
| 2503 | **/ | 2502 | **/ |
| 2504 | static int __devinit ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) | 2503 | static int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) |
| 2505 | { | 2504 | { |
| 2506 | int err; | 2505 | int err; |
| 2507 | 2506 | ||
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 468921b8f4b6..90a0281d15ea 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
| @@ -753,6 +753,7 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
| 753 | struct mlx4_priv *priv = mlx4_priv(dev); | 753 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 754 | int err; | 754 | int err; |
| 755 | int port; | 755 | int port; |
| 756 | __be32 ib_port_default_caps; | ||
| 756 | 757 | ||
| 757 | err = mlx4_init_uar_table(dev); | 758 | err = mlx4_init_uar_table(dev); |
| 758 | if (err) { | 759 | if (err) { |
| @@ -852,6 +853,13 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
| 852 | } | 853 | } |
| 853 | 854 | ||
| 854 | for (port = 1; port <= dev->caps.num_ports; port++) { | 855 | for (port = 1; port <= dev->caps.num_ports; port++) { |
| 856 | ib_port_default_caps = 0; | ||
| 857 | err = mlx4_get_port_ib_caps(dev, port, &ib_port_default_caps); | ||
| 858 | if (err) | ||
| 859 | mlx4_warn(dev, "failed to get port %d default " | ||
| 860 | "ib capabilities (%d). Continuing with " | ||
| 861 | "caps = 0\n", port, err); | ||
| 862 | dev->caps.ib_port_def_cap[port] = ib_port_default_caps; | ||
| 855 | err = mlx4_SET_PORT(dev, port); | 863 | err = mlx4_SET_PORT(dev, port); |
| 856 | if (err) { | 864 | if (err) { |
| 857 | mlx4_err(dev, "Failed to set port %d, aborting\n", | 865 | mlx4_err(dev, "Failed to set port %d, aborting\n", |
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 56a2e213fe62..34c909deaff3 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h | |||
| @@ -385,5 +385,6 @@ void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table); | |||
| 385 | void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table); | 385 | void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table); |
| 386 | 386 | ||
| 387 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port); | 387 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port); |
| 388 | int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps); | ||
| 388 | 389 | ||
| 389 | #endif /* MLX4_H */ | 390 | #endif /* MLX4_H */ |
diff --git a/drivers/net/mlx4/port.c b/drivers/net/mlx4/port.c index e2fdab42c4ce..0a057e5dc63b 100644 --- a/drivers/net/mlx4/port.c +++ b/drivers/net/mlx4/port.c | |||
| @@ -258,6 +258,42 @@ out: | |||
| 258 | } | 258 | } |
| 259 | EXPORT_SYMBOL_GPL(mlx4_unregister_vlan); | 259 | EXPORT_SYMBOL_GPL(mlx4_unregister_vlan); |
| 260 | 260 | ||
| 261 | int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps) | ||
| 262 | { | ||
| 263 | struct mlx4_cmd_mailbox *inmailbox, *outmailbox; | ||
| 264 | u8 *inbuf, *outbuf; | ||
| 265 | int err; | ||
| 266 | |||
| 267 | inmailbox = mlx4_alloc_cmd_mailbox(dev); | ||
| 268 | if (IS_ERR(inmailbox)) | ||
| 269 | return PTR_ERR(inmailbox); | ||
| 270 | |||
| 271 | outmailbox = mlx4_alloc_cmd_mailbox(dev); | ||
| 272 | if (IS_ERR(outmailbox)) { | ||
| 273 | mlx4_free_cmd_mailbox(dev, inmailbox); | ||
| 274 | return PTR_ERR(outmailbox); | ||
| 275 | } | ||
| 276 | |||
| 277 | inbuf = inmailbox->buf; | ||
| 278 | outbuf = outmailbox->buf; | ||
| 279 | memset(inbuf, 0, 256); | ||
| 280 | memset(outbuf, 0, 256); | ||
| 281 | inbuf[0] = 1; | ||
| 282 | inbuf[1] = 1; | ||
| 283 | inbuf[2] = 1; | ||
| 284 | inbuf[3] = 1; | ||
| 285 | *(__be16 *) (&inbuf[16]) = cpu_to_be16(0x0015); | ||
| 286 | *(__be32 *) (&inbuf[20]) = cpu_to_be32(port); | ||
| 287 | |||
| 288 | err = mlx4_cmd_box(dev, inmailbox->dma, outmailbox->dma, port, 3, | ||
| 289 | MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C); | ||
| 290 | if (!err) | ||
| 291 | *caps = *(__be32 *) (outbuf + 84); | ||
| 292 | mlx4_free_cmd_mailbox(dev, inmailbox); | ||
| 293 | mlx4_free_cmd_mailbox(dev, outmailbox); | ||
| 294 | return err; | ||
| 295 | } | ||
| 296 | |||
| 261 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) | 297 | int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) |
| 262 | { | 298 | { |
| 263 | struct mlx4_cmd_mailbox *mailbox; | 299 | struct mlx4_cmd_mailbox *mailbox; |
| @@ -273,7 +309,8 @@ int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port) | |||
| 273 | ((u8 *) mailbox->buf)[3] = 6; | 309 | ((u8 *) mailbox->buf)[3] = 6; |
| 274 | ((__be16 *) mailbox->buf)[4] = cpu_to_be16(1 << 15); | 310 | ((__be16 *) mailbox->buf)[4] = cpu_to_be16(1 << 15); |
| 275 | ((__be16 *) mailbox->buf)[6] = cpu_to_be16(1 << 15); | 311 | ((__be16 *) mailbox->buf)[6] = cpu_to_be16(1 << 15); |
| 276 | } | 312 | } else |
| 313 | ((__be32 *) mailbox->buf)[1] = dev->caps.ib_port_def_cap[port]; | ||
| 277 | err = mlx4_cmd(dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, | 314 | err = mlx4_cmd(dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, |
| 278 | MLX4_CMD_TIME_CLASS_B); | 315 | MLX4_CMD_TIME_CLASS_B); |
| 279 | 316 | ||
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index cf3cca4642f2..f51944b28cfa 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
| @@ -349,7 +349,7 @@ static int ibmtr_suspend(struct pcmcia_device *link) | |||
| 349 | return 0; | 349 | return 0; |
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | static int ibmtr_resume(struct pcmcia_device *link) | 352 | static int __devinit ibmtr_resume(struct pcmcia_device *link) |
| 353 | { | 353 | { |
| 354 | ibmtr_dev_t *info = link->priv; | 354 | ibmtr_dev_t *info = link->priv; |
| 355 | struct net_device *dev = info->dev; | 355 | struct net_device *dev = info->dev; |
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index b185cd12269c..9a16a79b67d0 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c | |||
| @@ -1735,7 +1735,7 @@ static const struct ethtool_ops smc911x_ethtool_ops = { | |||
| 1735 | * This routine has a simple purpose -- make the SMC chip generate an | 1735 | * This routine has a simple purpose -- make the SMC chip generate an |
| 1736 | * interrupt, so an auto-detect routine can detect it, and find the IRQ, | 1736 | * interrupt, so an auto-detect routine can detect it, and find the IRQ, |
| 1737 | */ | 1737 | */ |
| 1738 | static int __init smc911x_findirq(struct net_device *dev) | 1738 | static int __devinit smc911x_findirq(struct net_device *dev) |
| 1739 | { | 1739 | { |
| 1740 | struct smc911x_local *lp = netdev_priv(dev); | 1740 | struct smc911x_local *lp = netdev_priv(dev); |
| 1741 | int timeout = 20; | 1741 | int timeout = 20; |
| @@ -1799,7 +1799,7 @@ static int __init smc911x_findirq(struct net_device *dev) | |||
| 1799 | * o actually GRAB the irq. | 1799 | * o actually GRAB the irq. |
| 1800 | * o GRAB the region | 1800 | * o GRAB the region |
| 1801 | */ | 1801 | */ |
| 1802 | static int __init smc911x_probe(struct net_device *dev) | 1802 | static int __devinit smc911x_probe(struct net_device *dev) |
| 1803 | { | 1803 | { |
| 1804 | struct smc911x_local *lp = netdev_priv(dev); | 1804 | struct smc911x_local *lp = netdev_priv(dev); |
| 1805 | int i, retval; | 1805 | int i, retval; |
| @@ -2048,7 +2048,7 @@ err_out: | |||
| 2048 | * 0 --> there is a device | 2048 | * 0 --> there is a device |
| 2049 | * anything else, error | 2049 | * anything else, error |
| 2050 | */ | 2050 | */ |
| 2051 | static int smc911x_drv_probe(struct platform_device *pdev) | 2051 | static int __devinit smc911x_drv_probe(struct platform_device *pdev) |
| 2052 | { | 2052 | { |
| 2053 | #ifdef SMC_DYNAMIC_BUS_CONFIG | 2053 | #ifdef SMC_DYNAMIC_BUS_CONFIG |
| 2054 | struct smc911x_platdata *pd = pdev->dev.platform_data; | 2054 | struct smc911x_platdata *pd = pdev->dev.platform_data; |
| @@ -2124,7 +2124,7 @@ out: | |||
| 2124 | return ret; | 2124 | return ret; |
| 2125 | } | 2125 | } |
| 2126 | 2126 | ||
| 2127 | static int smc911x_drv_remove(struct platform_device *pdev) | 2127 | static int __devexit smc911x_drv_remove(struct platform_device *pdev) |
| 2128 | { | 2128 | { |
| 2129 | struct net_device *ndev = platform_get_drvdata(pdev); | 2129 | struct net_device *ndev = platform_get_drvdata(pdev); |
| 2130 | struct smc911x_local *lp = netdev_priv(ndev); | 2130 | struct smc911x_local *lp = netdev_priv(ndev); |
| @@ -2195,7 +2195,7 @@ static int smc911x_drv_resume(struct platform_device *dev) | |||
| 2195 | 2195 | ||
| 2196 | static struct platform_driver smc911x_driver = { | 2196 | static struct platform_driver smc911x_driver = { |
| 2197 | .probe = smc911x_drv_probe, | 2197 | .probe = smc911x_drv_probe, |
| 2198 | .remove = smc911x_drv_remove, | 2198 | .remove = __devexit_p(smc911x_drv_remove), |
| 2199 | .suspend = smc911x_drv_suspend, | 2199 | .suspend = smc911x_drv_suspend, |
| 2200 | .resume = smc911x_drv_resume, | 2200 | .resume = smc911x_drv_resume, |
| 2201 | .driver = { | 2201 | .driver = { |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index fc80f250da31..35c56abf4113 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
| @@ -1696,7 +1696,7 @@ static const struct ethtool_ops smc_ethtool_ops = { | |||
| 1696 | * I just deleted auto_irq.c, since it was never built... | 1696 | * I just deleted auto_irq.c, since it was never built... |
| 1697 | * --jgarzik | 1697 | * --jgarzik |
| 1698 | */ | 1698 | */ |
| 1699 | static int __init smc_findirq(struct smc_local *lp) | 1699 | static int __devinit smc_findirq(struct smc_local *lp) |
| 1700 | { | 1700 | { |
| 1701 | void __iomem *ioaddr = lp->base; | 1701 | void __iomem *ioaddr = lp->base; |
| 1702 | int timeout = 20; | 1702 | int timeout = 20; |
| @@ -1770,7 +1770,7 @@ static int __init smc_findirq(struct smc_local *lp) | |||
| 1770 | * o actually GRAB the irq. | 1770 | * o actually GRAB the irq. |
| 1771 | * o GRAB the region | 1771 | * o GRAB the region |
| 1772 | */ | 1772 | */ |
| 1773 | static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr, | 1773 | static int __devinit smc_probe(struct net_device *dev, void __iomem *ioaddr, |
| 1774 | unsigned long irq_flags) | 1774 | unsigned long irq_flags) |
| 1775 | { | 1775 | { |
| 1776 | struct smc_local *lp = netdev_priv(dev); | 1776 | struct smc_local *lp = netdev_priv(dev); |
| @@ -2126,7 +2126,7 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device * | |||
| 2126 | * 0 --> there is a device | 2126 | * 0 --> there is a device |
| 2127 | * anything else, error | 2127 | * anything else, error |
| 2128 | */ | 2128 | */ |
| 2129 | static int smc_drv_probe(struct platform_device *pdev) | 2129 | static int __devinit smc_drv_probe(struct platform_device *pdev) |
| 2130 | { | 2130 | { |
| 2131 | struct smc91x_platdata *pd = pdev->dev.platform_data; | 2131 | struct smc91x_platdata *pd = pdev->dev.platform_data; |
| 2132 | struct smc_local *lp; | 2132 | struct smc_local *lp; |
| @@ -2240,7 +2240,7 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
| 2240 | return ret; | 2240 | return ret; |
| 2241 | } | 2241 | } |
| 2242 | 2242 | ||
| 2243 | static int smc_drv_remove(struct platform_device *pdev) | 2243 | static int __devexit smc_drv_remove(struct platform_device *pdev) |
| 2244 | { | 2244 | { |
| 2245 | struct net_device *ndev = platform_get_drvdata(pdev); | 2245 | struct net_device *ndev = platform_get_drvdata(pdev); |
| 2246 | struct smc_local *lp = netdev_priv(ndev); | 2246 | struct smc_local *lp = netdev_priv(ndev); |
| @@ -2305,7 +2305,7 @@ static int smc_drv_resume(struct platform_device *dev) | |||
| 2305 | 2305 | ||
| 2306 | static struct platform_driver smc_driver = { | 2306 | static struct platform_driver smc_driver = { |
| 2307 | .probe = smc_drv_probe, | 2307 | .probe = smc_drv_probe, |
| 2308 | .remove = smc_drv_remove, | 2308 | .remove = __devexit_p(smc_drv_remove), |
| 2309 | .suspend = smc_drv_suspend, | 2309 | .suspend = smc_drv_suspend, |
| 2310 | .resume = smc_drv_resume, | 2310 | .resume = smc_drv_resume, |
| 2311 | .driver = { | 2311 | .driver = { |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index c6948d8f53f6..6d017adc914a 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -1785,7 +1785,7 @@ static int __devexit xennet_remove(struct xenbus_device *dev) | |||
| 1785 | return 0; | 1785 | return 0; |
| 1786 | } | 1786 | } |
| 1787 | 1787 | ||
| 1788 | static struct xenbus_driver netfront = { | 1788 | static struct xenbus_driver netfront_driver = { |
| 1789 | .name = "vif", | 1789 | .name = "vif", |
| 1790 | .owner = THIS_MODULE, | 1790 | .owner = THIS_MODULE, |
| 1791 | .ids = netfront_ids, | 1791 | .ids = netfront_ids, |
| @@ -1805,7 +1805,7 @@ static int __init netif_init(void) | |||
| 1805 | 1805 | ||
| 1806 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); | 1806 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); |
| 1807 | 1807 | ||
| 1808 | return xenbus_register_frontend(&netfront); | 1808 | return xenbus_register_frontend(&netfront_driver); |
| 1809 | } | 1809 | } |
| 1810 | module_init(netif_init); | 1810 | module_init(netif_init); |
| 1811 | 1811 | ||
| @@ -1815,7 +1815,7 @@ static void __exit netif_exit(void) | |||
| 1815 | if (xen_initial_domain()) | 1815 | if (xen_initial_domain()) |
| 1816 | return; | 1816 | return; |
| 1817 | 1817 | ||
| 1818 | xenbus_unregister_driver(&netfront); | 1818 | xenbus_unregister_driver(&netfront_driver); |
| 1819 | } | 1819 | } |
| 1820 | module_exit(netif_exit); | 1820 | module_exit(netif_exit); |
| 1821 | 1821 | ||
diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c index e2e95b36a603..101ed49a2d15 100644 --- a/drivers/parport/parport_serial.c +++ b/drivers/parport/parport_serial.c | |||
| @@ -70,6 +70,8 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc | |||
| 70 | * parallel ports and <S> is the number of serial ports. | 70 | * parallel ports and <S> is the number of serial ports. |
| 71 | */ | 71 | */ |
| 72 | card->numports = (dev->subsystem_device & 0xf0) >> 4; | 72 | card->numports = (dev->subsystem_device & 0xf0) >> 4; |
| 73 | if (card->numports > ARRAY_SIZE(card->addr)) | ||
| 74 | card->numports = ARRAY_SIZE(card->addr); | ||
| 73 | return 0; | 75 | return 0; |
| 74 | } | 76 | } |
| 75 | 77 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 28af496b441e..061d1ee0046a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -2042,7 +2042,7 @@ static int __devinit pci_init(void) | |||
| 2042 | return 0; | 2042 | return 0; |
| 2043 | } | 2043 | } |
| 2044 | 2044 | ||
| 2045 | static int __devinit pci_setup(char *str) | 2045 | static int __init pci_setup(char *str) |
| 2046 | { | 2046 | { |
| 2047 | while (str) { | 2047 | while (str) { |
| 2048 | char *k = strchr(str, ','); | 2048 | char *k = strchr(str, ','); |
diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c index a926c896475e..643a6b98462b 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c | |||
| @@ -879,7 +879,7 @@ static void rio_update_route_tables(struct rio_mport *port) | |||
| 879 | * link, then start recursive peer enumeration. Returns %0 if | 879 | * link, then start recursive peer enumeration. Returns %0 if |
| 880 | * enumeration succeeds or %-EBUSY if enumeration fails. | 880 | * enumeration succeeds or %-EBUSY if enumeration fails. |
| 881 | */ | 881 | */ |
| 882 | int rio_enum_mport(struct rio_mport *mport) | 882 | int __devinit rio_enum_mport(struct rio_mport *mport) |
| 883 | { | 883 | { |
| 884 | struct rio_net *net = NULL; | 884 | struct rio_net *net = NULL; |
| 885 | int rc = 0; | 885 | int rc = 0; |
| @@ -972,7 +972,7 @@ static void rio_enum_timeout(unsigned long data) | |||
| 972 | * peer discovery. Returns %0 if discovery succeeds or %-EBUSY | 972 | * peer discovery. Returns %0 if discovery succeeds or %-EBUSY |
| 973 | * on failure. | 973 | * on failure. |
| 974 | */ | 974 | */ |
| 975 | int rio_disc_mport(struct rio_mport *mport) | 975 | int __devinit rio_disc_mport(struct rio_mport *mport) |
| 976 | { | 976 | { |
| 977 | struct rio_net *net = NULL; | 977 | struct rio_net *net = NULL; |
| 978 | int enum_timeout_flag = 0; | 978 | int enum_timeout_flag = 0; |
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index 680661abbc4b..6395c780008b 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c | |||
| @@ -467,7 +467,7 @@ static int __devinit rio_init(void) | |||
| 467 | 467 | ||
| 468 | device_initcall(rio_init); | 468 | device_initcall(rio_init); |
| 469 | 469 | ||
| 470 | int rio_init_mports(void) | 470 | int __devinit rio_init_mports(void) |
| 471 | { | 471 | { |
| 472 | int rc = 0; | 472 | int rc = 0; |
| 473 | struct rio_mport *port; | 473 | struct rio_mport *port; |
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 218777bfc143..399fe559e4de 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
| @@ -13872,8 +13872,10 @@ static int __devinit advansys_board_found(struct Scsi_Host *shost, | |||
| 13872 | advansys_wide_free_mem(boardp); | 13872 | advansys_wide_free_mem(boardp); |
| 13873 | free_irq(boardp->irq, shost); | 13873 | free_irq(boardp->irq, shost); |
| 13874 | err_free_dma: | 13874 | err_free_dma: |
| 13875 | #ifdef CONFIG_ISA | ||
| 13875 | if (shost->dma_channel != NO_ISA_DMA) | 13876 | if (shost->dma_channel != NO_ISA_DMA) |
| 13876 | free_dma(shost->dma_channel); | 13877 | free_dma(shost->dma_channel); |
| 13878 | #endif | ||
| 13877 | err_free_proc: | 13879 | err_free_proc: |
| 13878 | kfree(boardp->prtbuf); | 13880 | kfree(boardp->prtbuf); |
| 13879 | err_unmap: | 13881 | err_unmap: |
| @@ -13894,10 +13896,12 @@ static int advansys_release(struct Scsi_Host *shost) | |||
| 13894 | ASC_DBG(1, "begin\n"); | 13896 | ASC_DBG(1, "begin\n"); |
| 13895 | scsi_remove_host(shost); | 13897 | scsi_remove_host(shost); |
| 13896 | free_irq(board->irq, shost); | 13898 | free_irq(board->irq, shost); |
| 13899 | #ifdef CONFIG_ISA | ||
| 13897 | if (shost->dma_channel != NO_ISA_DMA) { | 13900 | if (shost->dma_channel != NO_ISA_DMA) { |
| 13898 | ASC_DBG(1, "free_dma()\n"); | 13901 | ASC_DBG(1, "free_dma()\n"); |
| 13899 | free_dma(shost->dma_channel); | 13902 | free_dma(shost->dma_channel); |
| 13900 | } | 13903 | } |
| 13904 | #endif | ||
| 13901 | if (ASC_NARROW_BOARD(board)) { | 13905 | if (ASC_NARROW_BOARD(board)) { |
| 13902 | dma_unmap_single(board->dev, | 13906 | dma_unmap_single(board->dev, |
| 13903 | board->dvc_var.asc_dvc_var.overrun_dma, | 13907 | board->dvc_var.asc_dvc_var.overrun_dma, |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index c387c15a2128..fb247fdfa2bd 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
| @@ -588,7 +588,7 @@ static struct pci_driver gdth_pci_driver = { | |||
| 588 | .remove = gdth_pci_remove_one, | 588 | .remove = gdth_pci_remove_one, |
| 589 | }; | 589 | }; |
| 590 | 590 | ||
| 591 | static void gdth_pci_remove_one(struct pci_dev *pdev) | 591 | static void __devexit gdth_pci_remove_one(struct pci_dev *pdev) |
| 592 | { | 592 | { |
| 593 | gdth_ha_str *ha = pci_get_drvdata(pdev); | 593 | gdth_ha_str *ha = pci_get_drvdata(pdev); |
| 594 | 594 | ||
| @@ -600,7 +600,7 @@ static void gdth_pci_remove_one(struct pci_dev *pdev) | |||
| 600 | pci_disable_device(pdev); | 600 | pci_disable_device(pdev); |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | static int gdth_pci_init_one(struct pci_dev *pdev, | 603 | static int __devinit gdth_pci_init_one(struct pci_dev *pdev, |
| 604 | const struct pci_device_id *ent) | 604 | const struct pci_device_id *ent) |
| 605 | { | 605 | { |
| 606 | ushort vendor = pdev->vendor; | 606 | ushort vendor = pdev->vendor; |
| @@ -853,7 +853,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) | |||
| 853 | #endif /* CONFIG_ISA */ | 853 | #endif /* CONFIG_ISA */ |
| 854 | 854 | ||
| 855 | #ifdef CONFIG_PCI | 855 | #ifdef CONFIG_PCI |
| 856 | static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, | 856 | static int __devinit gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, |
| 857 | gdth_ha_str *ha) | 857 | gdth_ha_str *ha) |
| 858 | { | 858 | { |
| 859 | register gdt6_dpram_str __iomem *dp6_ptr; | 859 | register gdt6_dpram_str __iomem *dp6_ptr; |
| @@ -1237,7 +1237,7 @@ static int gdth_init_pci(struct pci_dev *pdev, gdth_pci_str *pcistr, | |||
| 1237 | 1237 | ||
| 1238 | /* controller protocol functions */ | 1238 | /* controller protocol functions */ |
| 1239 | 1239 | ||
| 1240 | static void __init gdth_enable_int(gdth_ha_str *ha) | 1240 | static void __devinit gdth_enable_int(gdth_ha_str *ha) |
| 1241 | { | 1241 | { |
| 1242 | ulong flags; | 1242 | ulong flags; |
| 1243 | gdt2_dpram_str __iomem *dp2_ptr; | 1243 | gdt2_dpram_str __iomem *dp2_ptr; |
| @@ -1553,7 +1553,7 @@ static int gdth_internal_cmd(gdth_ha_str *ha, unchar service, ushort opcode, | |||
| 1553 | 1553 | ||
| 1554 | /* search for devices */ | 1554 | /* search for devices */ |
| 1555 | 1555 | ||
| 1556 | static int __init gdth_search_drives(gdth_ha_str *ha) | 1556 | static int __devinit gdth_search_drives(gdth_ha_str *ha) |
| 1557 | { | 1557 | { |
| 1558 | ushort cdev_cnt, i; | 1558 | ushort cdev_cnt, i; |
| 1559 | int ok; | 1559 | int ok; |
| @@ -4935,7 +4935,7 @@ static int __init gdth_eisa_probe_one(ushort eisa_slot) | |||
| 4935 | #endif /* CONFIG_EISA */ | 4935 | #endif /* CONFIG_EISA */ |
| 4936 | 4936 | ||
| 4937 | #ifdef CONFIG_PCI | 4937 | #ifdef CONFIG_PCI |
| 4938 | static int gdth_pci_probe_one(gdth_pci_str *pcistr, | 4938 | static int __devinit gdth_pci_probe_one(gdth_pci_str *pcistr, |
| 4939 | gdth_ha_str **ha_out) | 4939 | gdth_ha_str **ha_out) |
| 4940 | { | 4940 | { |
| 4941 | struct Scsi_Host *shp; | 4941 | struct Scsi_Host *shp; |
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c index 6a3f8fb0c9dd..3317148a4b93 100644 --- a/drivers/serial/uartlite.c +++ b/drivers/serial/uartlite.c | |||
| @@ -286,8 +286,8 @@ static void ulite_release_port(struct uart_port *port) | |||
| 286 | 286 | ||
| 287 | static int ulite_request_port(struct uart_port *port) | 287 | static int ulite_request_port(struct uart_port *port) |
| 288 | { | 288 | { |
| 289 | pr_debug("ulite console: port=%p; port->mapbase=%x\n", | 289 | pr_debug("ulite console: port=%p; port->mapbase=%llx\n", |
| 290 | port, port->mapbase); | 290 | port, (unsigned long long) port->mapbase); |
| 291 | 291 | ||
| 292 | if (!request_mem_region(port->mapbase, ULITE_REGION, "uartlite")) { | 292 | if (!request_mem_region(port->mapbase, ULITE_REGION, "uartlite")) { |
| 293 | dev_err(port->dev, "Memory region busy\n"); | 293 | dev_err(port->dev, "Memory region busy\n"); |
diff --git a/drivers/spi/au1550_spi.c b/drivers/spi/au1550_spi.c index 87b73e0169c5..b02f25c702fd 100644 --- a/drivers/spi/au1550_spi.c +++ b/drivers/spi/au1550_spi.c | |||
| @@ -369,10 +369,23 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t) | |||
| 369 | dma_rx_addr = t->rx_dma; | 369 | dma_rx_addr = t->rx_dma; |
| 370 | 370 | ||
| 371 | /* | 371 | /* |
| 372 | * check if buffers are already dma mapped, map them otherwise | 372 | * check if buffers are already dma mapped, map them otherwise: |
| 373 | * - first map the TX buffer, so cache data gets written to memory | ||
| 374 | * - then map the RX buffer, so that cache entries (with | ||
| 375 | * soon-to-be-stale data) get removed | ||
| 373 | * use rx buffer in place of tx if tx buffer was not provided | 376 | * use rx buffer in place of tx if tx buffer was not provided |
| 374 | * use temp rx buffer (preallocated or realloc to fit) for rx dma | 377 | * use temp rx buffer (preallocated or realloc to fit) for rx dma |
| 375 | */ | 378 | */ |
| 379 | if (t->tx_buf) { | ||
| 380 | if (t->tx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ | ||
| 381 | dma_tx_addr = dma_map_single(hw->dev, | ||
| 382 | (void *)t->tx_buf, | ||
| 383 | t->len, DMA_TO_DEVICE); | ||
| 384 | if (dma_mapping_error(hw->dev, dma_tx_addr)) | ||
| 385 | dev_err(hw->dev, "tx dma map error\n"); | ||
| 386 | } | ||
| 387 | } | ||
| 388 | |||
| 376 | if (t->rx_buf) { | 389 | if (t->rx_buf) { |
| 377 | if (t->rx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ | 390 | if (t->rx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ |
| 378 | dma_rx_addr = dma_map_single(hw->dev, | 391 | dma_rx_addr = dma_map_single(hw->dev, |
| @@ -396,15 +409,8 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t) | |||
| 396 | dma_sync_single_for_device(hw->dev, dma_rx_addr, | 409 | dma_sync_single_for_device(hw->dev, dma_rx_addr, |
| 397 | t->len, DMA_FROM_DEVICE); | 410 | t->len, DMA_FROM_DEVICE); |
| 398 | } | 411 | } |
| 399 | if (t->tx_buf) { | 412 | |
| 400 | if (t->tx_dma == 0) { /* if DMA_ADDR_INVALID, map it */ | 413 | if (!t->tx_buf) { |
| 401 | dma_tx_addr = dma_map_single(hw->dev, | ||
| 402 | (void *)t->tx_buf, | ||
| 403 | t->len, DMA_TO_DEVICE); | ||
| 404 | if (dma_mapping_error(hw->dev, dma_tx_addr)) | ||
| 405 | dev_err(hw->dev, "tx dma map error\n"); | ||
| 406 | } | ||
| 407 | } else { | ||
| 408 | dma_sync_single_for_device(hw->dev, dma_rx_addr, | 414 | dma_sync_single_for_device(hw->dev, dma_rx_addr, |
| 409 | t->len, DMA_BIDIRECTIONAL); | 415 | t->len, DMA_BIDIRECTIONAL); |
| 410 | hw->tx = hw->rx; | 416 | hw->tx = hw->rx; |
diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c index 0debe11b67b4..3b97803e1d11 100644 --- a/drivers/spi/mpc52xx_psc_spi.c +++ b/drivers/spi/mpc52xx_psc_spi.c | |||
| @@ -142,6 +142,7 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, | |||
| 142 | unsigned rfalarm; | 142 | unsigned rfalarm; |
| 143 | unsigned send_at_once = MPC52xx_PSC_BUFSIZE; | 143 | unsigned send_at_once = MPC52xx_PSC_BUFSIZE; |
| 144 | unsigned recv_at_once; | 144 | unsigned recv_at_once; |
| 145 | int last_block = 0; | ||
| 145 | 146 | ||
| 146 | if (!t->tx_buf && !t->rx_buf && t->len) | 147 | if (!t->tx_buf && !t->rx_buf && t->len) |
| 147 | return -EINVAL; | 148 | return -EINVAL; |
| @@ -151,15 +152,17 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, | |||
| 151 | while (rb < t->len) { | 152 | while (rb < t->len) { |
| 152 | if (t->len - rb > MPC52xx_PSC_BUFSIZE) { | 153 | if (t->len - rb > MPC52xx_PSC_BUFSIZE) { |
| 153 | rfalarm = MPC52xx_PSC_RFALARM; | 154 | rfalarm = MPC52xx_PSC_RFALARM; |
| 155 | last_block = 0; | ||
| 154 | } else { | 156 | } else { |
| 155 | send_at_once = t->len - sb; | 157 | send_at_once = t->len - sb; |
| 156 | rfalarm = MPC52xx_PSC_BUFSIZE - (t->len - rb); | 158 | rfalarm = MPC52xx_PSC_BUFSIZE - (t->len - rb); |
| 159 | last_block = 1; | ||
| 157 | } | 160 | } |
| 158 | 161 | ||
| 159 | dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); | 162 | dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); |
| 160 | for (; send_at_once; sb++, send_at_once--) { | 163 | for (; send_at_once; sb++, send_at_once--) { |
| 161 | /* set EOF flag before the last word is sent */ | 164 | /* set EOF flag before the last word is sent */ |
| 162 | if (send_at_once == 1) | 165 | if (send_at_once == 1 && last_block) |
| 163 | out_8(&psc->ircr2, 0x01); | 166 | out_8(&psc->ircr2, 0x01); |
| 164 | 167 | ||
| 165 | if (tx_buf) | 168 | if (tx_buf) |
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 0b4db0ce78d6..269a55ec52ef 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
| @@ -1456,7 +1456,7 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
| 1456 | struct device *dev = &pdev->dev; | 1456 | struct device *dev = &pdev->dev; |
| 1457 | struct spi_imx_master *platform_info; | 1457 | struct spi_imx_master *platform_info; |
| 1458 | struct spi_master *master; | 1458 | struct spi_master *master; |
| 1459 | struct driver_data *drv_data = NULL; | 1459 | struct driver_data *drv_data; |
| 1460 | struct resource *res; | 1460 | struct resource *res; |
| 1461 | int irq, status = 0; | 1461 | int irq, status = 0; |
| 1462 | 1462 | ||
| @@ -1467,14 +1467,6 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
| 1467 | goto err_no_pdata; | 1467 | goto err_no_pdata; |
| 1468 | } | 1468 | } |
| 1469 | 1469 | ||
| 1470 | drv_data->clk = clk_get(&pdev->dev, "perclk2"); | ||
| 1471 | if (IS_ERR(drv_data->clk)) { | ||
| 1472 | dev_err(&pdev->dev, "probe - cannot get get\n"); | ||
| 1473 | status = PTR_ERR(drv_data->clk); | ||
| 1474 | goto err_no_clk; | ||
| 1475 | } | ||
| 1476 | clk_enable(drv_data->clk); | ||
| 1477 | |||
| 1478 | /* Allocate master with space for drv_data */ | 1470 | /* Allocate master with space for drv_data */ |
| 1479 | master = spi_alloc_master(dev, sizeof(struct driver_data)); | 1471 | master = spi_alloc_master(dev, sizeof(struct driver_data)); |
| 1480 | if (!master) { | 1472 | if (!master) { |
| @@ -1495,6 +1487,14 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
| 1495 | 1487 | ||
| 1496 | drv_data->dummy_dma_buf = SPI_DUMMY_u32; | 1488 | drv_data->dummy_dma_buf = SPI_DUMMY_u32; |
| 1497 | 1489 | ||
| 1490 | drv_data->clk = clk_get(&pdev->dev, "perclk2"); | ||
| 1491 | if (IS_ERR(drv_data->clk)) { | ||
| 1492 | dev_err(&pdev->dev, "probe - cannot get clock\n"); | ||
| 1493 | status = PTR_ERR(drv_data->clk); | ||
| 1494 | goto err_no_clk; | ||
| 1495 | } | ||
| 1496 | clk_enable(drv_data->clk); | ||
| 1497 | |||
| 1498 | /* Find and map resources */ | 1498 | /* Find and map resources */ |
| 1499 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1499 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1500 | if (!res) { | 1500 | if (!res) { |
| @@ -1630,12 +1630,13 @@ err_no_iomap: | |||
| 1630 | kfree(drv_data->ioarea); | 1630 | kfree(drv_data->ioarea); |
| 1631 | 1631 | ||
| 1632 | err_no_iores: | 1632 | err_no_iores: |
| 1633 | spi_master_put(master); | ||
| 1634 | |||
| 1635 | err_no_pdata: | ||
| 1636 | clk_disable(drv_data->clk); | 1633 | clk_disable(drv_data->clk); |
| 1637 | clk_put(drv_data->clk); | 1634 | clk_put(drv_data->clk); |
| 1635 | |||
| 1638 | err_no_clk: | 1636 | err_no_clk: |
| 1637 | spi_master_put(master); | ||
| 1638 | |||
| 1639 | err_no_pdata: | ||
| 1639 | err_no_mem: | 1640 | err_no_mem: |
| 1640 | return status; | 1641 | return status; |
| 1641 | } | 1642 | } |
diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c index cc1f647f579b..f2447a5476bb 100644 --- a/drivers/spi/spi_s3c24xx_gpio.c +++ b/drivers/spi/spi_s3c24xx_gpio.c | |||
| @@ -34,7 +34,7 @@ struct s3c2410_spigpio { | |||
| 34 | 34 | ||
| 35 | static inline struct s3c2410_spigpio *spidev_to_sg(struct spi_device *spi) | 35 | static inline struct s3c2410_spigpio *spidev_to_sg(struct spi_device *spi) |
| 36 | { | 36 | { |
| 37 | return spi->controller_data; | 37 | return spi_master_get_devdata(spi->master); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | static inline void setsck(struct spi_device *dev, int on) | 40 | static inline void setsck(struct spi_device *dev, int on) |
| @@ -118,6 +118,7 @@ static int s3c2410_spigpio_probe(struct platform_device *dev) | |||
| 118 | /* setup spi bitbang adaptor */ | 118 | /* setup spi bitbang adaptor */ |
| 119 | sp->bitbang.master = spi_master_get(master); | 119 | sp->bitbang.master = spi_master_get(master); |
| 120 | sp->bitbang.master->bus_num = info->bus_num; | 120 | sp->bitbang.master->bus_num = info->bus_num; |
| 121 | sp->bitbang.master->num_chipselect = info->num_chipselect; | ||
| 121 | sp->bitbang.chipselect = s3c2410_spigpio_chipselect; | 122 | sp->bitbang.chipselect = s3c2410_spigpio_chipselect; |
| 122 | 123 | ||
| 123 | sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0; | 124 | sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0; |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 89a43755a453..5d869c4d3eb2 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
| @@ -597,7 +597,9 @@ static int spidev_probe(struct spi_device *spi) | |||
| 597 | } | 597 | } |
| 598 | mutex_unlock(&device_list_lock); | 598 | mutex_unlock(&device_list_lock); |
| 599 | 599 | ||
| 600 | if (status != 0) | 600 | if (status == 0) |
| 601 | spi_set_drvdata(spi, spidev); | ||
| 602 | else | ||
| 601 | kfree(spidev); | 603 | kfree(spidev); |
| 602 | 604 | ||
| 603 | return status; | 605 | return status; |
diff --git a/drivers/usb/gadget/fsl_qe_udc.c b/drivers/usb/gadget/fsl_qe_udc.c index 1fe8b44787b3..b3408ff39fba 100644 --- a/drivers/usb/gadget/fsl_qe_udc.c +++ b/drivers/usb/gadget/fsl_qe_udc.c | |||
| @@ -2363,6 +2363,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
| 2363 | nuke(loop_ep, -ESHUTDOWN); | 2363 | nuke(loop_ep, -ESHUTDOWN); |
| 2364 | spin_unlock_irqrestore(&udc_controller->lock, flags); | 2364 | spin_unlock_irqrestore(&udc_controller->lock, flags); |
| 2365 | 2365 | ||
| 2366 | /* report disconnect; the controller is already quiesced */ | ||
| 2367 | driver->disconnect(&udc_controller->gadget); | ||
| 2368 | |||
| 2366 | /* unbind gadget and unhook driver. */ | 2369 | /* unbind gadget and unhook driver. */ |
| 2367 | driver->unbind(&udc_controller->gadget); | 2370 | driver->unbind(&udc_controller->gadget); |
| 2368 | udc_controller->gadget.dev.driver = NULL; | 2371 | udc_controller->gadget.dev.driver = NULL; |
diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c index 091bb55c9aa7..f3c6703cffda 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.c +++ b/drivers/usb/gadget/fsl_usb2_udc.c | |||
| @@ -1836,6 +1836,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
| 1836 | nuke(loop_ep, -ESHUTDOWN); | 1836 | nuke(loop_ep, -ESHUTDOWN); |
| 1837 | spin_unlock_irqrestore(&udc_controller->lock, flags); | 1837 | spin_unlock_irqrestore(&udc_controller->lock, flags); |
| 1838 | 1838 | ||
| 1839 | /* report disconnect; the controller is already quiesced */ | ||
| 1840 | driver->disconnect(&udc_controller->gadget); | ||
| 1841 | |||
| 1839 | /* unbind gadget and unhook driver. */ | 1842 | /* unbind gadget and unhook driver. */ |
| 1840 | driver->unbind(&udc_controller->gadget); | 1843 | driver->unbind(&udc_controller->gadget); |
| 1841 | udc_controller->gadget.dev.driver = NULL; | 1844 | udc_controller->gadget.dev.driver = NULL; |
diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index da6e93c201d2..2dbc0db0b46c 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c | |||
| @@ -141,7 +141,11 @@ static int is_vbus_present(void) | |||
| 141 | 141 | ||
| 142 | if (mach->gpio_vbus) { | 142 | if (mach->gpio_vbus) { |
| 143 | int value = gpio_get_value(mach->gpio_vbus); | 143 | int value = gpio_get_value(mach->gpio_vbus); |
| 144 | return mach->gpio_vbus_inverted ? !value : value; | 144 | |
| 145 | if (mach->gpio_vbus_inverted) | ||
| 146 | return !value; | ||
| 147 | else | ||
| 148 | return !!value; | ||
| 145 | } | 149 | } |
| 146 | if (mach->udc_is_connected) | 150 | if (mach->udc_is_connected) |
| 147 | return mach->udc_is_connected(); | 151 | return mach->udc_is_connected(); |
| @@ -982,7 +986,7 @@ static int pxa25x_udc_vbus_session(struct usb_gadget *_gadget, int is_active) | |||
| 982 | struct pxa25x_udc *udc; | 986 | struct pxa25x_udc *udc; |
| 983 | 987 | ||
| 984 | udc = container_of(_gadget, struct pxa25x_udc, gadget); | 988 | udc = container_of(_gadget, struct pxa25x_udc, gadget); |
| 985 | udc->vbus = (is_active != 0); | 989 | udc->vbus = is_active; |
| 986 | DMSG("vbus %s\n", is_active ? "supplied" : "inactive"); | 990 | DMSG("vbus %s\n", is_active ? "supplied" : "inactive"); |
| 987 | pullup(udc); | 991 | pullup(udc); |
| 988 | return 0; | 992 | return 0; |
| @@ -1399,12 +1403,8 @@ lubbock_vbus_irq(int irq, void *_dev) | |||
| 1399 | static irqreturn_t udc_vbus_irq(int irq, void *_dev) | 1403 | static irqreturn_t udc_vbus_irq(int irq, void *_dev) |
| 1400 | { | 1404 | { |
| 1401 | struct pxa25x_udc *dev = _dev; | 1405 | struct pxa25x_udc *dev = _dev; |
| 1402 | int vbus = gpio_get_value(dev->mach->gpio_vbus); | ||
| 1403 | 1406 | ||
| 1404 | if (dev->mach->gpio_vbus_inverted) | 1407 | pxa25x_udc_vbus_session(&dev->gadget, is_vbus_present()); |
| 1405 | vbus = !vbus; | ||
| 1406 | |||
| 1407 | pxa25x_udc_vbus_session(&dev->gadget, vbus); | ||
| 1408 | return IRQ_HANDLED; | 1408 | return IRQ_HANDLED; |
| 1409 | } | 1409 | } |
| 1410 | 1410 | ||
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 9d0ea573aef6..36864f958444 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
| @@ -169,18 +169,21 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 169 | } | 169 | } |
| 170 | break; | 170 | break; |
| 171 | case PCI_VENDOR_ID_ATI: | 171 | case PCI_VENDOR_ID_ATI: |
| 172 | /* SB700 old version has a bug in EHCI controller, | 172 | /* SB600 and old version of SB700 have a bug in EHCI controller, |
| 173 | * which causes usb devices lose response in some cases. | 173 | * which causes usb devices lose response in some cases. |
| 174 | */ | 174 | */ |
| 175 | if (pdev->device == 0x4396) { | 175 | if ((pdev->device == 0x4386) || (pdev->device == 0x4396)) { |
| 176 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, | 176 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, |
| 177 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, | 177 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, |
| 178 | NULL); | 178 | NULL); |
| 179 | if (!p_smbus) | 179 | if (!p_smbus) |
| 180 | break; | 180 | break; |
| 181 | rev = p_smbus->revision; | 181 | rev = p_smbus->revision; |
| 182 | if ((rev == 0x3a) || (rev == 0x3b)) { | 182 | if ((pdev->device == 0x4386) || (rev == 0x3a) |
| 183 | || (rev == 0x3b)) { | ||
| 183 | u8 tmp; | 184 | u8 tmp; |
| 185 | ehci_info(ehci, "applying AMD SB600/SB700 USB " | ||
| 186 | "freeze workaround\n"); | ||
| 184 | pci_read_config_byte(pdev, 0x53, &tmp); | 187 | pci_read_config_byte(pdev, 0x53, &tmp); |
| 185 | pci_write_config_byte(pdev, 0x53, tmp | (1<<3)); | 188 | pci_write_config_byte(pdev, 0x53, tmp | (1<<3)); |
| 186 | } | 189 | } |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index b11798d17ae5..c7d4b5a06bdb 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
| @@ -183,16 +183,14 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
| 183 | * the async ring; just the I/O watchdog. Note that if a | 183 | * the async ring; just the I/O watchdog. Note that if a |
| 184 | * SHRINK were pending, OFF would never be requested. | 184 | * SHRINK were pending, OFF would never be requested. |
| 185 | */ | 185 | */ |
| 186 | enum ehci_timer_action oldactions = ehci->actions; | 186 | if (timer_pending(&ehci->watchdog) |
| 187 | && ((BIT(TIMER_ASYNC_SHRINK) | BIT(TIMER_ASYNC_OFF)) | ||
| 188 | & ehci->actions)) | ||
| 189 | return; | ||
| 187 | 190 | ||
| 188 | if (!test_and_set_bit (action, &ehci->actions)) { | 191 | if (!test_and_set_bit (action, &ehci->actions)) { |
| 189 | unsigned long t; | 192 | unsigned long t; |
| 190 | 193 | ||
| 191 | if (timer_pending(&ehci->watchdog) | ||
| 192 | && ((BIT(TIMER_ASYNC_SHRINK) | BIT(TIMER_ASYNC_OFF)) | ||
| 193 | & oldactions)) | ||
| 194 | return; | ||
| 195 | |||
| 196 | switch (action) { | 194 | switch (action) { |
| 197 | case TIMER_IO_WATCHDOG: | 195 | case TIMER_IO_WATCHDOG: |
| 198 | t = EHCI_IO_JIFFIES; | 196 | t = EHCI_IO_JIFFIES; |
| @@ -208,7 +206,7 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
| 208 | t = DIV_ROUND_UP(EHCI_SHRINK_FRAMES * HZ, 1000) + 1; | 206 | t = DIV_ROUND_UP(EHCI_SHRINK_FRAMES * HZ, 1000) + 1; |
| 209 | break; | 207 | break; |
| 210 | } | 208 | } |
| 211 | mod_timer(&ehci->watchdog, round_jiffies(t + jiffies)); | 209 | mod_timer(&ehci->watchdog, t + jiffies); |
| 212 | } | 210 | } |
| 213 | } | 211 | } |
| 214 | 212 | ||
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 5b20de130e08..5b95009d2fbb 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
| @@ -135,6 +135,7 @@ static int usb_console_setup(struct console *co, char *options) | |||
| 135 | err("no more memory"); | 135 | err("no more memory"); |
| 136 | goto reset_open_count; | 136 | goto reset_open_count; |
| 137 | } | 137 | } |
| 138 | kref_init(&tty->kref); | ||
| 138 | termios = kzalloc(sizeof(*termios), GFP_KERNEL); | 139 | termios = kzalloc(sizeof(*termios), GFP_KERNEL); |
| 139 | if (!termios) { | 140 | if (!termios) { |
| 140 | retval = -ENOMEM; | 141 | retval = -ENOMEM; |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 6fa1ec441b61..809697b3c7fc 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -224,6 +224,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | |||
| 224 | #define ONDA_VENDOR_ID 0x19d2 | 224 | #define ONDA_VENDOR_ID 0x19d2 |
| 225 | #define ONDA_PRODUCT_MSA501HS 0x0001 | 225 | #define ONDA_PRODUCT_MSA501HS 0x0001 |
| 226 | #define ONDA_PRODUCT_ET502HS 0x0002 | 226 | #define ONDA_PRODUCT_ET502HS 0x0002 |
| 227 | #define ONDA_PRODUCT_MT503HS 0x0200 | ||
| 227 | 228 | ||
| 228 | #define BANDRICH_VENDOR_ID 0x1A8D | 229 | #define BANDRICH_VENDOR_ID 0x1A8D |
| 229 | #define BANDRICH_PRODUCT_C100_1 0x1002 | 230 | #define BANDRICH_PRODUCT_C100_1 0x1002 |
| @@ -413,6 +414,40 @@ static struct usb_device_id option_ids[] = { | |||
| 413 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | 414 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, |
| 414 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, | 415 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, |
| 415 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, | 416 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, |
| 417 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0003) }, | ||
| 418 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0004) }, | ||
| 419 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0005) }, | ||
| 420 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0006) }, | ||
| 421 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0007) }, | ||
| 422 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0008) }, | ||
| 423 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0009) }, | ||
| 424 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000a) }, | ||
| 425 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000b) }, | ||
| 426 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000c) }, | ||
| 427 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000d) }, | ||
| 428 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000e) }, | ||
| 429 | { USB_DEVICE(ONDA_VENDOR_ID, 0x000f) }, | ||
| 430 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0010) }, | ||
| 431 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0011) }, | ||
| 432 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0012) }, | ||
| 433 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0013) }, | ||
| 434 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0014) }, | ||
| 435 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0015) }, | ||
| 436 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0016) }, | ||
| 437 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0017) }, | ||
| 438 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0018) }, | ||
| 439 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0019) }, | ||
| 440 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0020) }, | ||
| 441 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0021) }, | ||
| 442 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0022) }, | ||
| 443 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0023) }, | ||
| 444 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0024) }, | ||
| 445 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0025) }, | ||
| 446 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0026) }, | ||
| 447 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0027) }, | ||
| 448 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0028) }, | ||
| 449 | { USB_DEVICE(ONDA_VENDOR_ID, 0x0029) }, | ||
| 450 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) }, | ||
| 416 | { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) }, | 451 | { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) }, |
| 417 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 452 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
| 418 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, | 453 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 6da9a7a962a8..e61f2bfc64ad 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -318,6 +318,18 @@ UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101, | |||
| 318 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), | 318 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), |
| 319 | #endif | 319 | #endif |
| 320 | 320 | ||
| 321 | /* Reported by Tamas Kerecsen <kerecsen@bigfoot.com> | ||
| 322 | * Obviously the PROM has not been customized by the VAR; | ||
| 323 | * the Vendor and Product string descriptors are: | ||
| 324 | * Generic Mass Storage (PROTOTYPE--Remember to change idVendor) | ||
| 325 | * Generic Manufacturer (PROTOTYPE--Remember to change idVendor) | ||
| 326 | */ | ||
| 327 | UNUSUAL_DEV( 0x045e, 0xffff, 0x0000, 0x0000, | ||
| 328 | "Mitac", | ||
| 329 | "GPS", | ||
| 330 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 331 | US_FL_MAX_SECTORS_64 ), | ||
| 332 | |||
| 321 | /* | 333 | /* |
| 322 | * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.) | 334 | * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.) |
| 323 | * Reported by Pete Zaitcev <zaitcev@redhat.com> | 335 | * Reported by Pete Zaitcev <zaitcev@redhat.com> |
| @@ -377,6 +389,13 @@ UNUSUAL_DEV( 0x04b0, 0x0401, 0x0200, 0x0200, | |||
| 377 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 389 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 378 | US_FL_FIX_CAPACITY), | 390 | US_FL_FIX_CAPACITY), |
| 379 | 391 | ||
| 392 | /* Reported by Tobias Kunze Briseno <t-linux@fictive.com> */ | ||
| 393 | UNUSUAL_DEV( 0x04b0, 0x0403, 0x0200, 0x0200, | ||
| 394 | "NIKON", | ||
| 395 | "NIKON DSC D2H", | ||
| 396 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 397 | US_FL_FIX_CAPACITY), | ||
| 398 | |||
| 380 | /* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */ | 399 | /* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */ |
| 381 | UNUSUAL_DEV( 0x04b0, 0x0409, 0x0100, 0x0100, | 400 | UNUSUAL_DEV( 0x04b0, 0x0409, 0x0100, 0x0100, |
| 382 | "NIKON", | 401 | "NIKON", |
diff --git a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c index 8718f7349d6b..a547e5d4c8bf 100644 --- a/drivers/video/aty/radeon_accel.c +++ b/drivers/video/aty/radeon_accel.c | |||
| @@ -174,12 +174,12 @@ static void radeonfb_prim_imageblit(struct radeonfb_info *rinfo, | |||
| 174 | const struct fb_image *image, | 174 | const struct fb_image *image, |
| 175 | u32 fg, u32 bg) | 175 | u32 fg, u32 bg) |
| 176 | { | 176 | { |
| 177 | unsigned int src_bytes, dwords; | 177 | unsigned int dwords; |
| 178 | u32 *bits; | 178 | u32 *bits; |
| 179 | 179 | ||
| 180 | radeonfb_set_creg(rinfo, DP_GUI_MASTER_CNTL, &rinfo->dp_gui_mc_cache, | 180 | radeonfb_set_creg(rinfo, DP_GUI_MASTER_CNTL, &rinfo->dp_gui_mc_cache, |
| 181 | rinfo->dp_gui_mc_base | | 181 | rinfo->dp_gui_mc_base | |
| 182 | GMC_BRUSH_NONE | | 182 | GMC_BRUSH_NONE | GMC_DST_CLIP_LEAVE | |
| 183 | GMC_SRC_DATATYPE_MONO_FG_BG | | 183 | GMC_SRC_DATATYPE_MONO_FG_BG | |
| 184 | ROP3_S | | 184 | ROP3_S | |
| 185 | GMC_BYTE_ORDER_MSB_TO_LSB | | 185 | GMC_BYTE_ORDER_MSB_TO_LSB | |
| @@ -189,9 +189,6 @@ static void radeonfb_prim_imageblit(struct radeonfb_info *rinfo, | |||
| 189 | radeonfb_set_creg(rinfo, DP_SRC_FRGD_CLR, &rinfo->dp_src_fg_cache, fg); | 189 | radeonfb_set_creg(rinfo, DP_SRC_FRGD_CLR, &rinfo->dp_src_fg_cache, fg); |
| 190 | radeonfb_set_creg(rinfo, DP_SRC_BKGD_CLR, &rinfo->dp_src_bg_cache, bg); | 190 | radeonfb_set_creg(rinfo, DP_SRC_BKGD_CLR, &rinfo->dp_src_bg_cache, bg); |
| 191 | 191 | ||
| 192 | radeon_fifo_wait(rinfo, 1); | ||
| 193 | OUTREG(DST_Y_X, (image->dy << 16) | image->dx); | ||
| 194 | |||
| 195 | /* Ensure the dst cache is flushed and the engine idle before | 192 | /* Ensure the dst cache is flushed and the engine idle before |
| 196 | * issuing the operation. | 193 | * issuing the operation. |
| 197 | * | 194 | * |
| @@ -205,13 +202,19 @@ static void radeonfb_prim_imageblit(struct radeonfb_info *rinfo, | |||
| 205 | 202 | ||
| 206 | /* X here pads width to a multiple of 32 and uses the clipper to | 203 | /* X here pads width to a multiple of 32 and uses the clipper to |
| 207 | * adjust the result. Is that really necessary ? Things seem to | 204 | * adjust the result. Is that really necessary ? Things seem to |
| 208 | * work ok for me without that and the doco doesn't seem to imply | 205 | * work ok for me without that and the doco doesn't seem to imply] |
| 209 | * there is such a restriction. | 206 | * there is such a restriction. |
| 210 | */ | 207 | */ |
| 211 | OUTREG(DST_WIDTH_HEIGHT, (image->width << 16) | image->height); | 208 | radeon_fifo_wait(rinfo, 4); |
| 209 | OUTREG(SC_TOP_LEFT, (image->dy << 16) | image->dx); | ||
| 210 | OUTREG(SC_BOTTOM_RIGHT, ((image->dy + image->height) << 16) | | ||
| 211 | (image->dx + image->width)); | ||
| 212 | OUTREG(DST_Y_X, (image->dy << 16) | image->dx); | ||
| 213 | |||
| 214 | OUTREG(DST_HEIGHT_WIDTH, (image->height << 16) | ((image->width + 31) & ~31)); | ||
| 212 | 215 | ||
| 213 | src_bytes = (((image->width * image->depth) + 7) / 8) * image->height; | 216 | dwords = (image->width + 31) >> 5; |
| 214 | dwords = (src_bytes + 3) / 4; | 217 | dwords *= image->height; |
| 215 | bits = (u32*)(image->data); | 218 | bits = (u32*)(image->data); |
| 216 | 219 | ||
| 217 | while(dwords >= 8) { | 220 | while(dwords >= 8) { |
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index 9a5821c65ebf..b3ffe8205d2b 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c | |||
| @@ -1875,6 +1875,7 @@ static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo) | |||
| 1875 | info->fbops = &radeonfb_ops; | 1875 | info->fbops = &radeonfb_ops; |
| 1876 | info->screen_base = rinfo->fb_base; | 1876 | info->screen_base = rinfo->fb_base; |
| 1877 | info->screen_size = rinfo->mapped_vram; | 1877 | info->screen_size = rinfo->mapped_vram; |
| 1878 | |||
| 1878 | /* Fill fix common fields */ | 1879 | /* Fill fix common fields */ |
| 1879 | strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id)); | 1880 | strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id)); |
| 1880 | info->fix.smem_start = rinfo->fb_base_phys; | 1881 | info->fix.smem_start = rinfo->fb_base_phys; |
| @@ -1889,8 +1890,25 @@ static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo) | |||
| 1889 | info->fix.mmio_len = RADEON_REGSIZE; | 1890 | info->fix.mmio_len = RADEON_REGSIZE; |
| 1890 | info->fix.accel = FB_ACCEL_ATI_RADEON; | 1891 | info->fix.accel = FB_ACCEL_ATI_RADEON; |
| 1891 | 1892 | ||
| 1893 | /* Allocate colormap */ | ||
| 1892 | fb_alloc_cmap(&info->cmap, 256, 0); | 1894 | fb_alloc_cmap(&info->cmap, 256, 0); |
| 1893 | 1895 | ||
| 1896 | /* Setup pixmap used for acceleration */ | ||
| 1897 | #define PIXMAP_SIZE (2048 * 4) | ||
| 1898 | |||
| 1899 | info->pixmap.addr = kmalloc(PIXMAP_SIZE, GFP_KERNEL); | ||
| 1900 | if (!info->pixmap.addr) { | ||
| 1901 | printk(KERN_ERR "radeonfb: Failed to allocate pixmap !\n"); | ||
| 1902 | noaccel = 1; | ||
| 1903 | goto bail; | ||
| 1904 | } | ||
| 1905 | info->pixmap.size = PIXMAP_SIZE; | ||
| 1906 | info->pixmap.flags = FB_PIXMAP_SYSTEM; | ||
| 1907 | info->pixmap.scan_align = 4; | ||
| 1908 | info->pixmap.buf_align = 4; | ||
| 1909 | info->pixmap.access_align = 32; | ||
| 1910 | |||
| 1911 | bail: | ||
| 1894 | if (noaccel) | 1912 | if (noaccel) |
| 1895 | info->flags |= FBINFO_HWACCEL_DISABLED; | 1913 | info->flags |= FBINFO_HWACCEL_DISABLED; |
| 1896 | 1914 | ||
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index b92947d62ad6..67ff370d80af 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
| @@ -2389,16 +2389,13 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch) | |||
| 2389 | 2389 | ||
| 2390 | if (!fbcon_is_inactive(vc, info)) { | 2390 | if (!fbcon_is_inactive(vc, info)) { |
| 2391 | if (ops->blank_state != blank) { | 2391 | if (ops->blank_state != blank) { |
| 2392 | int ret = 1; | ||
| 2393 | |||
| 2394 | ops->blank_state = blank; | 2392 | ops->blank_state = blank; |
| 2395 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); | 2393 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); |
| 2396 | ops->cursor_flash = (!blank); | 2394 | ops->cursor_flash = (!blank); |
| 2397 | 2395 | ||
| 2398 | if (info->fbops->fb_blank) | 2396 | if (!(info->flags & FBINFO_MISC_USEREVENT)) |
| 2399 | ret = info->fbops->fb_blank(blank, info); | 2397 | if (fb_blank(info, blank)) |
| 2400 | if (ret) | 2398 | fbcon_generic_blank(vc, info, blank); |
| 2401 | fbcon_generic_blank(vc, info, blank); | ||
| 2402 | } | 2399 | } |
| 2403 | 2400 | ||
| 2404 | if (!blank) | 2401 | if (!blank) |
diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index 99da8b6d2c36..ed13889c1162 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile | |||
| @@ -23,7 +23,6 @@ objs-y$(CONFIG_MACH_OMAP_PALMZ71) += lcd_palmz71.o | |||
| 23 | objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1610.o | 23 | objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1610.o |
| 24 | objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o | 24 | objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o |
| 25 | objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o | 25 | objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o |
| 26 | objs-y$(CONFIG_MACH_SX1) += lcd_sx1.o | ||
| 27 | 26 | ||
| 28 | omapfb-objs := $(objs-yy) | 27 | omapfb-objs := $(objs-yy) |
| 29 | 28 | ||
diff --git a/drivers/video/omap/lcd_sx1.c b/drivers/video/omap/lcd_sx1.c deleted file mode 100644 index e55de201b8ff..000000000000 --- a/drivers/video/omap/lcd_sx1.c +++ /dev/null | |||
| @@ -1,327 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * LCD panel support for the Siemens SX1 mobile phone | ||
| 3 | * | ||
| 4 | * Current version : Vovan888@gmail.com, great help from FCA00000 | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms of the GNU General Public License as published by the | ||
| 8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 9 | * option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, but | ||
| 12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 14 | * General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License along | ||
| 17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #include <linux/module.h> | ||
| 22 | #include <linux/platform_device.h> | ||
| 23 | #include <linux/delay.h> | ||
| 24 | #include <linux/io.h> | ||
| 25 | |||
| 26 | #include <mach/gpio.h> | ||
| 27 | #include <mach/omapfb.h> | ||
| 28 | #include <mach/mcbsp.h> | ||
| 29 | #include <mach/mux.h> | ||
| 30 | |||
| 31 | /* | ||
| 32 | * OMAP310 GPIO registers | ||
| 33 | */ | ||
| 34 | #define GPIO_DATA_INPUT 0xfffce000 | ||
| 35 | #define GPIO_DATA_OUTPUT 0xfffce004 | ||
| 36 | #define GPIO_DIR_CONTROL 0xfffce008 | ||
| 37 | #define GPIO_INT_CONTROL 0xfffce00c | ||
| 38 | #define GPIO_INT_MASK 0xfffce010 | ||
| 39 | #define GPIO_INT_STATUS 0xfffce014 | ||
| 40 | #define GPIO_PIN_CONTROL 0xfffce018 | ||
| 41 | |||
| 42 | |||
| 43 | #define A_LCD_SSC_RD 3 | ||
| 44 | #define A_LCD_SSC_SD 7 | ||
| 45 | #define _A_LCD_RESET 9 | ||
| 46 | #define _A_LCD_SSC_CS 12 | ||
| 47 | #define _A_LCD_SSC_A0 13 | ||
| 48 | |||
| 49 | #define DSP_REG 0xE1017024 | ||
| 50 | |||
| 51 | const unsigned char INIT_1[12] = { | ||
| 52 | 0x1C, 0x02, 0x88, 0x00, 0x1E, 0xE0, 0x00, 0xDC, 0x00, 0x02, 0x00 | ||
| 53 | }; | ||
| 54 | |||
| 55 | const unsigned char INIT_2[127] = { | ||
| 56 | 0x15, 0x00, 0x29, 0x00, 0x3E, 0x00, 0x51, 0x00, | ||
| 57 | 0x65, 0x00, 0x7A, 0x00, 0x8D, 0x00, 0xA1, 0x00, | ||
| 58 | 0xB6, 0x00, 0xC7, 0x00, 0xD8, 0x00, 0xEB, 0x00, | ||
| 59 | 0xFB, 0x00, 0x0B, 0x01, 0x1B, 0x01, 0x27, 0x01, | ||
| 60 | 0x34, 0x01, 0x41, 0x01, 0x4C, 0x01, 0x55, 0x01, | ||
| 61 | 0x5F, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, | ||
| 62 | 0x7E, 0x01, 0x86, 0x01, 0x8C, 0x01, 0x94, 0x01, | ||
| 63 | 0x9B, 0x01, 0xA1, 0x01, 0xA4, 0x01, 0xA9, 0x01, | ||
| 64 | 0xAD, 0x01, 0xB2, 0x01, 0xB7, 0x01, 0xBC, 0x01, | ||
| 65 | 0xC0, 0x01, 0xC4, 0x01, 0xC8, 0x01, 0xCB, 0x01, | ||
| 66 | 0xCF, 0x01, 0xD2, 0x01, 0xD5, 0x01, 0xD8, 0x01, | ||
| 67 | 0xDB, 0x01, 0xE0, 0x01, 0xE3, 0x01, 0xE6, 0x01, | ||
| 68 | 0xE8, 0x01, 0xEB, 0x01, 0xEE, 0x01, 0xF1, 0x01, | ||
| 69 | 0xF3, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFC, 0x01, | ||
| 70 | 0x00, 0x02, 0x03, 0x02, 0x07, 0x02, 0x09, 0x02, | ||
| 71 | 0x0E, 0x02, 0x13, 0x02, 0x1C, 0x02, 0x00 | ||
| 72 | }; | ||
| 73 | |||
| 74 | const unsigned char INIT_3[15] = { | ||
| 75 | 0x14, 0x26, 0x33, 0x3D, 0x45, 0x4D, 0x53, 0x59, | ||
| 76 | 0x5E, 0x63, 0x67, 0x6D, 0x71, 0x78, 0xFF | ||
| 77 | }; | ||
| 78 | |||
| 79 | static void epson_sendbyte(int flag, unsigned char byte) | ||
| 80 | { | ||
| 81 | int i, shifter = 0x80; | ||
| 82 | |||
| 83 | if (!flag) | ||
| 84 | gpio_set_value(_A_LCD_SSC_A0, 0); | ||
| 85 | mdelay(2); | ||
| 86 | gpio_set_value(A_LCD_SSC_RD, 1); | ||
| 87 | |||
| 88 | gpio_set_value(A_LCD_SSC_SD, flag); | ||
| 89 | |||
| 90 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2200); | ||
| 91 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2202); | ||
| 92 | for (i = 0; i < 8; i++) { | ||
| 93 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2200); | ||
| 94 | gpio_set_value(A_LCD_SSC_SD, shifter & byte); | ||
| 95 | OMAP_MCBSP_WRITE(OMAP1510_MCBSP3_BASE, PCR0, 0x2202); | ||
| 96 | shifter >>= 1; | ||
| 97 | } | ||
| 98 | gpio_set_value(_A_LCD_SSC_A0, 1); | ||
| 99 | } | ||
| 100 | |||
| 101 | static void init_system(void) | ||
| 102 | { | ||
| 103 | omap_mcbsp_request(OMAP_MCBSP3); | ||
| 104 | omap_mcbsp_stop(OMAP_MCBSP3); | ||
| 105 | } | ||
| 106 | |||
| 107 | static void setup_GPIO(void) | ||
| 108 | { | ||
| 109 | /* new wave */ | ||
| 110 | gpio_request(A_LCD_SSC_RD, "lcd_ssc_rd"); | ||
| 111 | gpio_request(A_LCD_SSC_SD, "lcd_ssc_sd"); | ||
| 112 | gpio_request(_A_LCD_RESET, "lcd_reset"); | ||
| 113 | gpio_request(_A_LCD_SSC_CS, "lcd_ssc_cs"); | ||
| 114 | gpio_request(_A_LCD_SSC_A0, "lcd_ssc_a0"); | ||
| 115 | |||
| 116 | /* set GPIOs to output, with initial data */ | ||
| 117 | gpio_direction_output(A_LCD_SSC_RD, 1); | ||
| 118 | gpio_direction_output(A_LCD_SSC_SD, 0); | ||
| 119 | gpio_direction_output(_A_LCD_RESET, 0); | ||
| 120 | gpio_direction_output(_A_LCD_SSC_CS, 1); | ||
| 121 | gpio_direction_output(_A_LCD_SSC_A0, 1); | ||
| 122 | } | ||
| 123 | |||
| 124 | static void display_init(void) | ||
| 125 | { | ||
| 126 | int i; | ||
| 127 | |||
| 128 | omap_cfg_reg(MCBSP3_CLKX); | ||
| 129 | |||
| 130 | mdelay(2); | ||
| 131 | setup_GPIO(); | ||
| 132 | mdelay(2); | ||
| 133 | |||
| 134 | /* reset LCD */ | ||
| 135 | gpio_set_value(A_LCD_SSC_SD, 1); | ||
| 136 | epson_sendbyte(0, 0x25); | ||
| 137 | |||
| 138 | gpio_set_value(_A_LCD_RESET, 0); | ||
| 139 | mdelay(10); | ||
| 140 | gpio_set_value(_A_LCD_RESET, 1); | ||
| 141 | |||
| 142 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 143 | mdelay(2); | ||
| 144 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 145 | |||
| 146 | /* init LCD, phase 1 */ | ||
| 147 | epson_sendbyte(0, 0xCA); | ||
| 148 | for (i = 0; i < 10; i++) | ||
| 149 | epson_sendbyte(1, INIT_1[i]); | ||
| 150 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 151 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 152 | |||
| 153 | /* init LCD phase 2 */ | ||
| 154 | epson_sendbyte(0, 0xCB); | ||
| 155 | for (i = 0; i < 125; i++) | ||
| 156 | epson_sendbyte(1, INIT_2[i]); | ||
| 157 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 158 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 159 | |||
| 160 | /* init LCD phase 2a */ | ||
| 161 | epson_sendbyte(0, 0xCC); | ||
| 162 | for (i = 0; i < 14; i++) | ||
| 163 | epson_sendbyte(1, INIT_3[i]); | ||
| 164 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 165 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 166 | |||
| 167 | /* init LCD phase 3 */ | ||
| 168 | epson_sendbyte(0, 0xBC); | ||
| 169 | epson_sendbyte(1, 0x08); | ||
| 170 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 171 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 172 | |||
| 173 | /* init LCD phase 4 */ | ||
| 174 | epson_sendbyte(0, 0x07); | ||
| 175 | epson_sendbyte(1, 0x05); | ||
| 176 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 177 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 178 | |||
| 179 | /* init LCD phase 5 */ | ||
| 180 | epson_sendbyte(0, 0x94); | ||
| 181 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 182 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 183 | |||
| 184 | /* init LCD phase 6 */ | ||
| 185 | epson_sendbyte(0, 0xC6); | ||
| 186 | epson_sendbyte(1, 0x80); | ||
| 187 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 188 | mdelay(100); /* used to be 1000 */ | ||
| 189 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 190 | |||
| 191 | /* init LCD phase 7 */ | ||
| 192 | epson_sendbyte(0, 0x16); | ||
| 193 | epson_sendbyte(1, 0x02); | ||
| 194 | epson_sendbyte(1, 0x00); | ||
| 195 | epson_sendbyte(1, 0xB1); | ||
| 196 | epson_sendbyte(1, 0x00); | ||
| 197 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 198 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 199 | |||
| 200 | /* init LCD phase 8 */ | ||
| 201 | epson_sendbyte(0, 0x76); | ||
| 202 | epson_sendbyte(1, 0x00); | ||
| 203 | epson_sendbyte(1, 0x00); | ||
| 204 | epson_sendbyte(1, 0xDB); | ||
| 205 | epson_sendbyte(1, 0x00); | ||
| 206 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 207 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 208 | |||
| 209 | /* init LCD phase 9 */ | ||
| 210 | epson_sendbyte(0, 0xAF); | ||
| 211 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 212 | } | ||
| 213 | |||
| 214 | static int sx1_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) | ||
| 215 | { | ||
| 216 | return 0; | ||
| 217 | } | ||
| 218 | |||
| 219 | static void sx1_panel_cleanup(struct lcd_panel *panel) | ||
| 220 | { | ||
| 221 | } | ||
| 222 | |||
| 223 | static void sx1_panel_disable(struct lcd_panel *panel) | ||
| 224 | { | ||
| 225 | printk(KERN_INFO "SX1: LCD panel disable\n"); | ||
| 226 | sx1_setmmipower(0); | ||
| 227 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 228 | |||
| 229 | epson_sendbyte(0, 0x25); | ||
| 230 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 231 | |||
| 232 | epson_sendbyte(0, 0xAE); | ||
| 233 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 234 | mdelay(100); | ||
| 235 | gpio_set_value(_A_LCD_SSC_CS, 0); | ||
| 236 | |||
| 237 | epson_sendbyte(0, 0x95); | ||
| 238 | gpio_set_value(_A_LCD_SSC_CS, 1); | ||
| 239 | } | ||
| 240 | |||
| 241 | static int sx1_panel_enable(struct lcd_panel *panel) | ||
| 242 | { | ||
| 243 | printk(KERN_INFO "lcd_sx1: LCD panel enable\n"); | ||
| 244 | init_system(); | ||
| 245 | display_init(); | ||
| 246 | |||
| 247 | sx1_setmmipower(1); | ||
| 248 | sx1_setbacklight(0x18); | ||
| 249 | sx1_setkeylight (0x06); | ||
| 250 | return 0; | ||
| 251 | } | ||
| 252 | |||
| 253 | |||
| 254 | static unsigned long sx1_panel_get_caps(struct lcd_panel *panel) | ||
| 255 | { | ||
| 256 | return 0; | ||
| 257 | } | ||
| 258 | |||
| 259 | struct lcd_panel sx1_panel = { | ||
| 260 | .name = "sx1", | ||
| 261 | .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | | ||
| 262 | OMAP_LCDC_INV_HSYNC | OMAP_LCDC_INV_PIX_CLOCK | | ||
| 263 | OMAP_LCDC_INV_OUTPUT_EN, | ||
| 264 | |||
| 265 | .x_res = 176, | ||
| 266 | .y_res = 220, | ||
| 267 | .data_lines = 16, | ||
| 268 | .bpp = 16, | ||
| 269 | .hsw = 5, | ||
| 270 | .hfp = 5, | ||
| 271 | .hbp = 5, | ||
| 272 | .vsw = 2, | ||
| 273 | .vfp = 1, | ||
| 274 | .vbp = 1, | ||
| 275 | .pixel_clock = 1500, | ||
| 276 | |||
| 277 | .init = sx1_panel_init, | ||
| 278 | .cleanup = sx1_panel_cleanup, | ||
| 279 | .enable = sx1_panel_enable, | ||
| 280 | .disable = sx1_panel_disable, | ||
| 281 | .get_caps = sx1_panel_get_caps, | ||
| 282 | }; | ||
| 283 | |||
| 284 | static int sx1_panel_probe(struct platform_device *pdev) | ||
| 285 | { | ||
| 286 | omapfb_register_panel(&sx1_panel); | ||
| 287 | return 0; | ||
| 288 | } | ||
| 289 | |||
| 290 | static int sx1_panel_remove(struct platform_device *pdev) | ||
| 291 | { | ||
| 292 | return 0; | ||
| 293 | } | ||
| 294 | |||
| 295 | static int sx1_panel_suspend(struct platform_device *pdev, pm_message_t mesg) | ||
| 296 | { | ||
| 297 | return 0; | ||
| 298 | } | ||
| 299 | |||
| 300 | static int sx1_panel_resume(struct platform_device *pdev) | ||
| 301 | { | ||
| 302 | return 0; | ||
| 303 | } | ||
| 304 | |||
| 305 | struct platform_driver sx1_panel_driver = { | ||
| 306 | .probe = sx1_panel_probe, | ||
| 307 | .remove = sx1_panel_remove, | ||
| 308 | .suspend = sx1_panel_suspend, | ||
| 309 | .resume = sx1_panel_resume, | ||
| 310 | .driver = { | ||
| 311 | .name = "lcd_sx1", | ||
| 312 | .owner = THIS_MODULE, | ||
| 313 | }, | ||
| 314 | }; | ||
| 315 | |||
| 316 | static int sx1_panel_drv_init(void) | ||
| 317 | { | ||
| 318 | return platform_driver_register(&sx1_panel_driver); | ||
| 319 | } | ||
| 320 | |||
| 321 | static void sx1_panel_drv_cleanup(void) | ||
| 322 | { | ||
| 323 | platform_driver_unregister(&sx1_panel_driver); | ||
| 324 | } | ||
| 325 | |||
| 326 | module_init(sx1_panel_drv_init); | ||
| 327 | module_exit(sx1_panel_drv_cleanup); | ||
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 97204497d9f7..cc59c52e1103 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
| @@ -804,6 +804,9 @@ static int pxafb_smart_thread(void *arg) | |||
| 804 | 804 | ||
| 805 | static int pxafb_smart_init(struct pxafb_info *fbi) | 805 | static int pxafb_smart_init(struct pxafb_info *fbi) |
| 806 | { | 806 | { |
| 807 | if (!(fbi->lccr0 | LCCR0_LCDT)) | ||
| 808 | return 0; | ||
| 809 | |||
| 807 | fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi, | 810 | fbi->smart_thread = kthread_run(pxafb_smart_thread, fbi, |
| 808 | "lcd_refresh"); | 811 | "lcd_refresh"); |
| 809 | if (IS_ERR(fbi->smart_thread)) { | 812 | if (IS_ERR(fbi->smart_thread)) { |
| @@ -1372,7 +1375,7 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
| 1372 | fbi->cmap_inverse = inf->cmap_inverse; | 1375 | fbi->cmap_inverse = inf->cmap_inverse; |
| 1373 | fbi->cmap_static = inf->cmap_static; | 1376 | fbi->cmap_static = inf->cmap_static; |
| 1374 | 1377 | ||
| 1375 | switch (lcd_conn & 0xf) { | 1378 | switch (lcd_conn & LCD_TYPE_MASK) { |
| 1376 | case LCD_TYPE_MONO_STN: | 1379 | case LCD_TYPE_MONO_STN: |
| 1377 | fbi->lccr0 = LCCR0_CMS; | 1380 | fbi->lccr0 = LCCR0_CMS; |
| 1378 | break; | 1381 | break; |
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c index a463b3dd837b..2493f05e9f61 100644 --- a/drivers/video/xen-fbfront.c +++ b/drivers/video/xen-fbfront.c | |||
| @@ -668,7 +668,7 @@ static struct xenbus_device_id xenfb_ids[] = { | |||
| 668 | { "" } | 668 | { "" } |
| 669 | }; | 669 | }; |
| 670 | 670 | ||
| 671 | static struct xenbus_driver xenfb = { | 671 | static struct xenbus_driver xenfb_driver = { |
| 672 | .name = "vfb", | 672 | .name = "vfb", |
| 673 | .owner = THIS_MODULE, | 673 | .owner = THIS_MODULE, |
| 674 | .ids = xenfb_ids, | 674 | .ids = xenfb_ids, |
| @@ -687,12 +687,12 @@ static int __init xenfb_init(void) | |||
| 687 | if (xen_initial_domain()) | 687 | if (xen_initial_domain()) |
| 688 | return -ENODEV; | 688 | return -ENODEV; |
| 689 | 689 | ||
| 690 | return xenbus_register_frontend(&xenfb); | 690 | return xenbus_register_frontend(&xenfb_driver); |
| 691 | } | 691 | } |
| 692 | 692 | ||
| 693 | static void __exit xenfb_cleanup(void) | 693 | static void __exit xenfb_cleanup(void) |
| 694 | { | 694 | { |
| 695 | xenbus_unregister_driver(&xenfb); | 695 | xenbus_unregister_driver(&xenfb_driver); |
| 696 | } | 696 | } |
| 697 | 697 | ||
| 698 | module_init(xenfb_init); | 698 | module_init(xenfb_init); |
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c index 5da3d2423cc0..40a3a2afbfe7 100644 --- a/drivers/video/xilinxfb.c +++ b/drivers/video/xilinxfb.c | |||
| @@ -298,8 +298,9 @@ static int xilinxfb_assign(struct device *dev, unsigned long physaddr, | |||
| 298 | 298 | ||
| 299 | /* Put a banner in the log (for DEBUG) */ | 299 | /* Put a banner in the log (for DEBUG) */ |
| 300 | dev_dbg(dev, "regs: phys=%lx, virt=%p\n", physaddr, drvdata->regs); | 300 | dev_dbg(dev, "regs: phys=%lx, virt=%p\n", physaddr, drvdata->regs); |
| 301 | dev_dbg(dev, "fb: phys=%p, virt=%p, size=%x\n", | 301 | dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n", |
| 302 | (void*)drvdata->fb_phys, drvdata->fb_virt, fbsize); | 302 | (unsigned long long) drvdata->fb_phys, drvdata->fb_virt, |
| 303 | fbsize); | ||
| 303 | 304 | ||
| 304 | return 0; /* success */ | 305 | return 0; /* success */ |
| 305 | 306 | ||
diff --git a/drivers/w1/masters/Kconfig b/drivers/w1/masters/Kconfig index a14d5b6e4c7c..90616822cd20 100644 --- a/drivers/w1/masters/Kconfig +++ b/drivers/w1/masters/Kconfig | |||
| @@ -36,7 +36,7 @@ config W1_MASTER_DS2482 | |||
| 36 | 36 | ||
| 37 | config W1_MASTER_DS1WM | 37 | config W1_MASTER_DS1WM |
| 38 | tristate "Maxim DS1WM 1-wire busmaster" | 38 | tristate "Maxim DS1WM 1-wire busmaster" |
| 39 | depends on W1 && ARM | 39 | depends on W1 && ARM && HAVE_CLK |
| 40 | help | 40 | help |
| 41 | Say Y here to enable the DS1WM 1-wire driver, such as that | 41 | Say Y here to enable the DS1WM 1-wire driver, such as that |
| 42 | in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like | 42 | in HP iPAQ devices like h5xxx, h2200, and ASIC3-based like |
