diff options
Diffstat (limited to 'drivers')
64 files changed, 613 insertions, 271 deletions
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index 73863d86f022..76dc02f15574 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
| @@ -126,6 +126,12 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); | |||
| 126 | */ | 126 | */ |
| 127 | u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE); | 127 | u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE); |
| 128 | 128 | ||
| 129 | /* | ||
| 130 | * Disable runtime checking and repair of values returned by control methods. | ||
| 131 | * Use only if the repair is causing a problem on a particular machine. | ||
| 132 | */ | ||
| 133 | u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_auto_repair, FALSE); | ||
| 134 | |||
| 129 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ | 135 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ |
| 130 | 136 | ||
| 131 | struct acpi_table_fadt acpi_gbl_FADT; | 137 | struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index c7f743ca395b..5552125d8340 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
| @@ -357,6 +357,7 @@ struct acpi_predefined_data { | |||
| 357 | char *pathname; | 357 | char *pathname; |
| 358 | const union acpi_predefined_info *predefined; | 358 | const union acpi_predefined_info *predefined; |
| 359 | union acpi_operand_object *parent_package; | 359 | union acpi_operand_object *parent_package; |
| 360 | struct acpi_namespace_node *node; | ||
| 360 | u32 flags; | 361 | u32 flags; |
| 361 | u8 node_flags; | 362 | u8 node_flags; |
| 362 | }; | 363 | }; |
diff --git a/drivers/acpi/acpica/acpredef.h b/drivers/acpi/acpica/acpredef.h index 94e73c97cf85..c445cca490ea 100644 --- a/drivers/acpi/acpica/acpredef.h +++ b/drivers/acpi/acpica/acpredef.h | |||
| @@ -468,6 +468,7 @@ static const union acpi_predefined_info predefined_names[] = | |||
| 468 | {{"_SWS", 0, ACPI_RTYPE_INTEGER}}, | 468 | {{"_SWS", 0, ACPI_RTYPE_INTEGER}}, |
| 469 | {{"_TC1", 0, ACPI_RTYPE_INTEGER}}, | 469 | {{"_TC1", 0, ACPI_RTYPE_INTEGER}}, |
| 470 | {{"_TC2", 0, ACPI_RTYPE_INTEGER}}, | 470 | {{"_TC2", 0, ACPI_RTYPE_INTEGER}}, |
| 471 | {{"_TDL", 0, ACPI_RTYPE_INTEGER}}, | ||
| 471 | {{"_TIP", 1, ACPI_RTYPE_INTEGER}}, | 472 | {{"_TIP", 1, ACPI_RTYPE_INTEGER}}, |
| 472 | {{"_TIV", 1, ACPI_RTYPE_INTEGER}}, | 473 | {{"_TIV", 1, ACPI_RTYPE_INTEGER}}, |
| 473 | {{"_TMP", 0, ACPI_RTYPE_INTEGER}}, | 474 | {{"_TMP", 0, ACPI_RTYPE_INTEGER}}, |
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index 9fb03fa8ffde..c845c8089f39 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c | |||
| @@ -193,14 +193,20 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | /* | 195 | /* |
| 196 | * 1) We have a return value, but if one wasn't expected, just exit, this is | 196 | * Return value validation and possible repair. |
| 197 | * not a problem. For example, if the "Implicit Return" feature is | ||
| 198 | * enabled, methods will always return a value. | ||
| 199 | * | 197 | * |
| 200 | * 2) If the return value can be of any type, then we cannot perform any | 198 | * 1) Don't perform return value validation/repair if this feature |
| 201 | * validation, exit. | 199 | * has been disabled via a global option. |
| 200 | * | ||
| 201 | * 2) We have a return value, but if one wasn't expected, just exit, | ||
| 202 | * this is not a problem. For example, if the "Implicit Return" | ||
| 203 | * feature is enabled, methods will always return a value. | ||
| 204 | * | ||
| 205 | * 3) If the return value can be of any type, then we cannot perform | ||
| 206 | * any validation, just exit. | ||
| 202 | */ | 207 | */ |
| 203 | if ((!predefined->info.expected_btypes) || | 208 | if (acpi_gbl_disable_auto_repair || |
| 209 | (!predefined->info.expected_btypes) || | ||
| 204 | (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { | 210 | (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { |
| 205 | goto cleanup; | 211 | goto cleanup; |
| 206 | } | 212 | } |
| @@ -212,6 +218,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | |||
| 212 | goto cleanup; | 218 | goto cleanup; |
| 213 | } | 219 | } |
| 214 | data->predefined = predefined; | 220 | data->predefined = predefined; |
| 221 | data->node = node; | ||
| 215 | data->node_flags = node->flags; | 222 | data->node_flags = node->flags; |
| 216 | data->pathname = pathname; | 223 | data->pathname = pathname; |
| 217 | 224 | ||
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c index 973883babee1..024c4f263f87 100644 --- a/drivers/acpi/acpica/nsrepair2.c +++ b/drivers/acpi/acpica/nsrepair2.c | |||
| @@ -503,6 +503,21 @@ acpi_ns_repair_TSS(struct acpi_predefined_data *data, | |||
| 503 | { | 503 | { |
| 504 | union acpi_operand_object *return_object = *return_object_ptr; | 504 | union acpi_operand_object *return_object = *return_object_ptr; |
| 505 | acpi_status status; | 505 | acpi_status status; |
| 506 | struct acpi_namespace_node *node; | ||
| 507 | |||
| 508 | /* | ||
| 509 | * We can only sort the _TSS return package if there is no _PSS in the | ||
| 510 | * same scope. This is because if _PSS is present, the ACPI specification | ||
| 511 | * dictates that the _TSS Power Dissipation field is to be ignored, and | ||
| 512 | * therefore some BIOSs leave garbage values in the _TSS Power field(s). | ||
| 513 | * In this case, it is best to just return the _TSS package as-is. | ||
| 514 | * (May, 2011) | ||
| 515 | */ | ||
| 516 | status = | ||
| 517 | acpi_ns_get_node(data->node, "^_PSS", ACPI_NS_NO_UPSEARCH, &node); | ||
| 518 | if (ACPI_SUCCESS(status)) { | ||
| 519 | return (AE_OK); | ||
| 520 | } | ||
| 506 | 521 | ||
| 507 | status = acpi_ns_check_sorted_list(data, return_object, 5, 1, | 522 | status = acpi_ns_check_sorted_list(data, return_object, 5, 1, |
| 508 | ACPI_SORT_DESCENDING, | 523 | ACPI_SORT_DESCENDING, |
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c index 48db0944ce4a..62365f6075dd 100644 --- a/drivers/acpi/acpica/tbinstal.c +++ b/drivers/acpi/acpica/tbinstal.c | |||
| @@ -126,12 +126,29 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index) | |||
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | /* | 128 | /* |
| 129 | * Originally, we checked the table signature for "SSDT" or "PSDT" here. | 129 | * Validate the incoming table signature. |
| 130 | * Next, we added support for OEMx tables, signature "OEM". | 130 | * |
| 131 | * Valid tables were encountered with a null signature, so we've just | 131 | * 1) Originally, we checked the table signature for "SSDT" or "PSDT". |
| 132 | * given up on validating the signature, since it seems to be a waste | 132 | * 2) We added support for OEMx tables, signature "OEM". |
| 133 | * of code. The original code was removed (05/2008). | 133 | * 3) Valid tables were encountered with a null signature, so we just |
| 134 | * gave up on validating the signature, (05/2008). | ||
| 135 | * 4) We encountered non-AML tables such as the MADT, which caused | ||
| 136 | * interpreter errors and kernel faults. So now, we once again allow | ||
| 137 | * only "SSDT", "OEMx", and now, also a null signature. (05/2011). | ||
| 134 | */ | 138 | */ |
| 139 | if ((table_desc->pointer->signature[0] != 0x00) && | ||
| 140 | (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)) | ||
| 141 | && (ACPI_STRNCMP(table_desc->pointer->signature, "OEM", 3))) { | ||
| 142 | ACPI_ERROR((AE_INFO, | ||
| 143 | "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx", | ||
| 144 | acpi_ut_valid_acpi_name(*(u32 *)table_desc-> | ||
| 145 | pointer-> | ||
| 146 | signature) ? table_desc-> | ||
| 147 | pointer->signature : "????", | ||
| 148 | *(u32 *)table_desc->pointer->signature)); | ||
| 149 | |||
| 150 | return_ACPI_STATUS(AE_BAD_SIGNATURE); | ||
| 151 | } | ||
| 135 | 152 | ||
| 136 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 153 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
| 137 | 154 | ||
diff --git a/drivers/acpi/apei/hest.c b/drivers/acpi/apei/hest.c index abda3786a5d7..181bc2f7bb74 100644 --- a/drivers/acpi/apei/hest.c +++ b/drivers/acpi/apei/hest.c | |||
| @@ -139,13 +139,23 @@ static int __init hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data) | |||
| 139 | { | 139 | { |
| 140 | struct platform_device *ghes_dev; | 140 | struct platform_device *ghes_dev; |
| 141 | struct ghes_arr *ghes_arr = data; | 141 | struct ghes_arr *ghes_arr = data; |
| 142 | int rc; | 142 | int rc, i; |
| 143 | 143 | ||
| 144 | if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR) | 144 | if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR) |
| 145 | return 0; | 145 | return 0; |
| 146 | 146 | ||
| 147 | if (!((struct acpi_hest_generic *)hest_hdr)->enabled) | 147 | if (!((struct acpi_hest_generic *)hest_hdr)->enabled) |
| 148 | return 0; | 148 | return 0; |
| 149 | for (i = 0; i < ghes_arr->count; i++) { | ||
| 150 | struct acpi_hest_header *hdr; | ||
| 151 | ghes_dev = ghes_arr->ghes_devs[i]; | ||
| 152 | hdr = *(struct acpi_hest_header **)ghes_dev->dev.platform_data; | ||
| 153 | if (hdr->source_id == hest_hdr->source_id) { | ||
| 154 | pr_warning(FW_WARN HEST_PFX "Duplicated hardware error source ID: %d.\n", | ||
| 155 | hdr->source_id); | ||
| 156 | return -EIO; | ||
| 157 | } | ||
| 158 | } | ||
| 149 | ghes_dev = platform_device_alloc("GHES", hest_hdr->source_id); | 159 | ghes_dev = platform_device_alloc("GHES", hest_hdr->source_id); |
| 150 | if (!ghes_dev) | 160 | if (!ghes_dev) |
| 151 | return -ENOMEM; | 161 | return -ENOMEM; |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index fcc13ac0aa18..52720680190f 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
| @@ -55,6 +55,9 @@ | |||
| 55 | #define ACPI_BATTERY_NOTIFY_INFO 0x81 | 55 | #define ACPI_BATTERY_NOTIFY_INFO 0x81 |
| 56 | #define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 | 56 | #define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 |
| 57 | 57 | ||
| 58 | /* Battery power unit: 0 means mW, 1 means mA */ | ||
| 59 | #define ACPI_BATTERY_POWER_UNIT_MA 1 | ||
| 60 | |||
| 58 | #define _COMPONENT ACPI_BATTERY_COMPONENT | 61 | #define _COMPONENT ACPI_BATTERY_COMPONENT |
| 59 | 62 | ||
| 60 | ACPI_MODULE_NAME("battery"); | 63 | ACPI_MODULE_NAME("battery"); |
| @@ -91,11 +94,6 @@ MODULE_DEVICE_TABLE(acpi, battery_device_ids); | |||
| 91 | enum { | 94 | enum { |
| 92 | ACPI_BATTERY_ALARM_PRESENT, | 95 | ACPI_BATTERY_ALARM_PRESENT, |
| 93 | ACPI_BATTERY_XINFO_PRESENT, | 96 | ACPI_BATTERY_XINFO_PRESENT, |
| 94 | /* For buggy DSDTs that report negative 16-bit values for either | ||
| 95 | * charging or discharging current and/or report 0 as 65536 | ||
| 96 | * due to bad math. | ||
| 97 | */ | ||
| 98 | ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, | ||
| 99 | ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, | 97 | ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, |
| 100 | }; | 98 | }; |
| 101 | 99 | ||
| @@ -301,7 +299,8 @@ static enum power_supply_property energy_battery_props[] = { | |||
| 301 | #ifdef CONFIG_ACPI_PROCFS_POWER | 299 | #ifdef CONFIG_ACPI_PROCFS_POWER |
| 302 | inline char *acpi_battery_units(struct acpi_battery *battery) | 300 | inline char *acpi_battery_units(struct acpi_battery *battery) |
| 303 | { | 301 | { |
| 304 | return (battery->power_unit)?"mA":"mW"; | 302 | return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ? |
| 303 | "mA" : "mW"; | ||
| 305 | } | 304 | } |
| 306 | #endif | 305 | #endif |
| 307 | 306 | ||
| @@ -461,9 +460,17 @@ static int acpi_battery_get_state(struct acpi_battery *battery) | |||
| 461 | battery->update_time = jiffies; | 460 | battery->update_time = jiffies; |
| 462 | kfree(buffer.pointer); | 461 | kfree(buffer.pointer); |
| 463 | 462 | ||
| 464 | if (test_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags) && | 463 | /* For buggy DSDTs that report negative 16-bit values for either |
| 465 | battery->rate_now != -1) | 464 | * charging or discharging current and/or report 0 as 65536 |
| 465 | * due to bad math. | ||
| 466 | */ | ||
| 467 | if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA && | ||
| 468 | battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && | ||
| 469 | (s16)(battery->rate_now) < 0) { | ||
| 466 | battery->rate_now = abs((s16)battery->rate_now); | 470 | battery->rate_now = abs((s16)battery->rate_now); |
| 471 | printk_once(KERN_WARNING FW_BUG "battery: (dis)charge rate" | ||
| 472 | " invalid.\n"); | ||
| 473 | } | ||
| 467 | 474 | ||
| 468 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) | 475 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) |
| 469 | && battery->capacity_now >= 0 && battery->capacity_now <= 100) | 476 | && battery->capacity_now >= 0 && battery->capacity_now <= 100) |
| @@ -544,7 +551,7 @@ static int sysfs_add_battery(struct acpi_battery *battery) | |||
| 544 | { | 551 | { |
| 545 | int result; | 552 | int result; |
| 546 | 553 | ||
| 547 | if (battery->power_unit) { | 554 | if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { |
| 548 | battery->bat.properties = charge_battery_props; | 555 | battery->bat.properties = charge_battery_props; |
| 549 | battery->bat.num_properties = | 556 | battery->bat.num_properties = |
| 550 | ARRAY_SIZE(charge_battery_props); | 557 | ARRAY_SIZE(charge_battery_props); |
| @@ -566,18 +573,16 @@ static int sysfs_add_battery(struct acpi_battery *battery) | |||
| 566 | 573 | ||
| 567 | static void sysfs_remove_battery(struct acpi_battery *battery) | 574 | static void sysfs_remove_battery(struct acpi_battery *battery) |
| 568 | { | 575 | { |
| 569 | if (!battery->bat.dev) | 576 | mutex_lock(&battery->lock); |
| 577 | if (!battery->bat.dev) { | ||
| 578 | mutex_unlock(&battery->lock); | ||
| 570 | return; | 579 | return; |
| 580 | } | ||
| 581 | |||
| 571 | device_remove_file(battery->bat.dev, &alarm_attr); | 582 | device_remove_file(battery->bat.dev, &alarm_attr); |
| 572 | power_supply_unregister(&battery->bat); | 583 | power_supply_unregister(&battery->bat); |
| 573 | battery->bat.dev = NULL; | 584 | battery->bat.dev = NULL; |
| 574 | } | 585 | mutex_unlock(&battery->lock); |
| 575 | |||
| 576 | static void acpi_battery_quirks(struct acpi_battery *battery) | ||
| 577 | { | ||
| 578 | if (dmi_name_in_vendors("Acer") && battery->power_unit) { | ||
| 579 | set_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags); | ||
| 580 | } | ||
| 581 | } | 586 | } |
| 582 | 587 | ||
| 583 | /* | 588 | /* |
| @@ -592,7 +597,7 @@ static void acpi_battery_quirks(struct acpi_battery *battery) | |||
| 592 | * | 597 | * |
| 593 | * Handle this correctly so that they won't break userspace. | 598 | * Handle this correctly so that they won't break userspace. |
| 594 | */ | 599 | */ |
| 595 | static void acpi_battery_quirks2(struct acpi_battery *battery) | 600 | static void acpi_battery_quirks(struct acpi_battery *battery) |
| 596 | { | 601 | { |
| 597 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) | 602 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) |
| 598 | return ; | 603 | return ; |
| @@ -623,13 +628,15 @@ static int acpi_battery_update(struct acpi_battery *battery) | |||
| 623 | result = acpi_battery_get_info(battery); | 628 | result = acpi_battery_get_info(battery); |
| 624 | if (result) | 629 | if (result) |
| 625 | return result; | 630 | return result; |
| 626 | acpi_battery_quirks(battery); | ||
| 627 | acpi_battery_init_alarm(battery); | 631 | acpi_battery_init_alarm(battery); |
| 628 | } | 632 | } |
| 629 | if (!battery->bat.dev) | 633 | if (!battery->bat.dev) { |
| 630 | sysfs_add_battery(battery); | 634 | result = sysfs_add_battery(battery); |
| 635 | if (result) | ||
| 636 | return result; | ||
| 637 | } | ||
| 631 | result = acpi_battery_get_state(battery); | 638 | result = acpi_battery_get_state(battery); |
| 632 | acpi_battery_quirks2(battery); | 639 | acpi_battery_quirks(battery); |
| 633 | return result; | 640 | return result; |
| 634 | } | 641 | } |
| 635 | 642 | ||
| @@ -863,7 +870,7 @@ DECLARE_FILE_FUNCTIONS(alarm); | |||
| 863 | }, \ | 870 | }, \ |
| 864 | } | 871 | } |
| 865 | 872 | ||
| 866 | static struct battery_file { | 873 | static const struct battery_file { |
| 867 | struct file_operations ops; | 874 | struct file_operations ops; |
| 868 | mode_t mode; | 875 | mode_t mode; |
| 869 | const char *name; | 876 | const char *name; |
| @@ -948,9 +955,12 @@ static int battery_notify(struct notifier_block *nb, | |||
| 948 | struct acpi_battery *battery = container_of(nb, struct acpi_battery, | 955 | struct acpi_battery *battery = container_of(nb, struct acpi_battery, |
| 949 | pm_nb); | 956 | pm_nb); |
| 950 | switch (mode) { | 957 | switch (mode) { |
| 958 | case PM_POST_HIBERNATION: | ||
| 951 | case PM_POST_SUSPEND: | 959 | case PM_POST_SUSPEND: |
| 952 | sysfs_remove_battery(battery); | 960 | if (battery->bat.dev) { |
| 953 | sysfs_add_battery(battery); | 961 | sysfs_remove_battery(battery); |
| 962 | sysfs_add_battery(battery); | ||
| 963 | } | ||
| 954 | break; | 964 | break; |
| 955 | } | 965 | } |
| 956 | 966 | ||
| @@ -975,25 +985,33 @@ static int acpi_battery_add(struct acpi_device *device) | |||
| 975 | if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, | 985 | if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, |
| 976 | "_BIX", &handle))) | 986 | "_BIX", &handle))) |
| 977 | set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); | 987 | set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); |
| 978 | acpi_battery_update(battery); | 988 | result = acpi_battery_update(battery); |
| 989 | if (result) | ||
| 990 | goto fail; | ||
| 979 | #ifdef CONFIG_ACPI_PROCFS_POWER | 991 | #ifdef CONFIG_ACPI_PROCFS_POWER |
| 980 | result = acpi_battery_add_fs(device); | 992 | result = acpi_battery_add_fs(device); |
| 981 | #endif | 993 | #endif |
| 982 | if (!result) { | 994 | if (result) { |
| 983 | printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", | ||
| 984 | ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), | ||
| 985 | device->status.battery_present ? "present" : "absent"); | ||
| 986 | } else { | ||
| 987 | #ifdef CONFIG_ACPI_PROCFS_POWER | 995 | #ifdef CONFIG_ACPI_PROCFS_POWER |
| 988 | acpi_battery_remove_fs(device); | 996 | acpi_battery_remove_fs(device); |
| 989 | #endif | 997 | #endif |
| 990 | kfree(battery); | 998 | goto fail; |
| 991 | } | 999 | } |
| 992 | 1000 | ||
| 1001 | printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", | ||
| 1002 | ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), | ||
| 1003 | device->status.battery_present ? "present" : "absent"); | ||
| 1004 | |||
| 993 | battery->pm_nb.notifier_call = battery_notify; | 1005 | battery->pm_nb.notifier_call = battery_notify; |
| 994 | register_pm_notifier(&battery->pm_nb); | 1006 | register_pm_notifier(&battery->pm_nb); |
| 995 | 1007 | ||
| 996 | return result; | 1008 | return result; |
| 1009 | |||
| 1010 | fail: | ||
| 1011 | sysfs_remove_battery(battery); | ||
| 1012 | mutex_destroy(&battery->lock); | ||
| 1013 | kfree(battery); | ||
| 1014 | return result; | ||
| 997 | } | 1015 | } |
| 998 | 1016 | ||
| 999 | static int acpi_battery_remove(struct acpi_device *device, int type) | 1017 | static int acpi_battery_remove(struct acpi_device *device, int type) |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 1864ad3cf895..19a61136d848 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -77,7 +77,7 @@ struct dock_dependent_device { | |||
| 77 | struct list_head list; | 77 | struct list_head list; |
| 78 | struct list_head hotplug_list; | 78 | struct list_head hotplug_list; |
| 79 | acpi_handle handle; | 79 | acpi_handle handle; |
| 80 | struct acpi_dock_ops *ops; | 80 | const struct acpi_dock_ops *ops; |
| 81 | void *context; | 81 | void *context; |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| @@ -589,7 +589,7 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier); | |||
| 589 | * the dock driver after _DCK is executed. | 589 | * the dock driver after _DCK is executed. |
| 590 | */ | 590 | */ |
| 591 | int | 591 | int |
| 592 | register_hotplug_dock_device(acpi_handle handle, struct acpi_dock_ops *ops, | 592 | register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops, |
| 593 | void *context) | 593 | void *context) |
| 594 | { | 594 | { |
| 595 | struct dock_dependent_device *dd; | 595 | struct dock_dependent_device *dd; |
diff --git a/drivers/acpi/ec_sys.c b/drivers/acpi/ec_sys.c index 05b44201a614..22f918bacd35 100644 --- a/drivers/acpi/ec_sys.c +++ b/drivers/acpi/ec_sys.c | |||
| @@ -92,7 +92,7 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf, | |||
| 92 | return count; | 92 | return count; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static struct file_operations acpi_ec_io_ops = { | 95 | static const struct file_operations acpi_ec_io_ops = { |
| 96 | .owner = THIS_MODULE, | 96 | .owner = THIS_MODULE, |
| 97 | .open = acpi_ec_open_io, | 97 | .open = acpi_ec_open_io, |
| 98 | .read = acpi_ec_read_io, | 98 | .read = acpi_ec_read_io, |
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index 467479f07c1f..0f0356ca1a9e 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c | |||
| @@ -110,7 +110,7 @@ fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) | |||
| 110 | return result; | 110 | return result; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | static struct thermal_cooling_device_ops fan_cooling_ops = { | 113 | static const struct thermal_cooling_device_ops fan_cooling_ops = { |
| 114 | .get_max_state = fan_get_max_state, | 114 | .get_max_state = fan_get_max_state, |
| 115 | .get_cur_state = fan_get_cur_state, | 115 | .get_cur_state = fan_get_cur_state, |
| 116 | .set_cur_state = fan_set_cur_state, | 116 | .set_cur_state = fan_set_cur_state, |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 52ca9649d769..fa32f584229f 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -155,7 +155,7 @@ static u32 acpi_osi_handler(acpi_string interface, u32 supported) | |||
| 155 | { | 155 | { |
| 156 | if (!strcmp("Linux", interface)) { | 156 | if (!strcmp("Linux", interface)) { |
| 157 | 157 | ||
| 158 | printk(KERN_NOTICE FW_BUG PREFIX | 158 | printk_once(KERN_NOTICE FW_BUG PREFIX |
| 159 | "BIOS _OSI(Linux) query %s%s\n", | 159 | "BIOS _OSI(Linux) query %s%s\n", |
| 160 | osi_linux.enable ? "honored" : "ignored", | 160 | osi_linux.enable ? "honored" : "ignored", |
| 161 | osi_linux.cmdline ? " via cmdline" : | 161 | osi_linux.cmdline ? " via cmdline" : |
| @@ -237,8 +237,23 @@ void acpi_os_vprintf(const char *fmt, va_list args) | |||
| 237 | #endif | 237 | #endif |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | #ifdef CONFIG_KEXEC | ||
| 241 | static unsigned long acpi_rsdp; | ||
| 242 | static int __init setup_acpi_rsdp(char *arg) | ||
| 243 | { | ||
| 244 | acpi_rsdp = simple_strtoul(arg, NULL, 16); | ||
| 245 | return 0; | ||
| 246 | } | ||
| 247 | early_param("acpi_rsdp", setup_acpi_rsdp); | ||
| 248 | #endif | ||
| 249 | |||
| 240 | acpi_physical_address __init acpi_os_get_root_pointer(void) | 250 | acpi_physical_address __init acpi_os_get_root_pointer(void) |
| 241 | { | 251 | { |
| 252 | #ifdef CONFIG_KEXEC | ||
| 253 | if (acpi_rsdp) | ||
| 254 | return acpi_rsdp; | ||
| 255 | #endif | ||
| 256 | |||
| 242 | if (efi_enabled) { | 257 | if (efi_enabled) { |
| 243 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) | 258 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) |
| 244 | return efi.acpi20; | 259 | return efi.acpi20; |
| @@ -1083,7 +1098,13 @@ struct osi_setup_entry { | |||
| 1083 | bool enable; | 1098 | bool enable; |
| 1084 | }; | 1099 | }; |
| 1085 | 1100 | ||
| 1086 | static struct osi_setup_entry __initdata osi_setup_entries[OSI_STRING_ENTRIES_MAX]; | 1101 | static struct osi_setup_entry __initdata |
| 1102 | osi_setup_entries[OSI_STRING_ENTRIES_MAX] = { | ||
| 1103 | {"Module Device", true}, | ||
| 1104 | {"Processor Device", true}, | ||
| 1105 | {"3.0 _SCP Extensions", true}, | ||
| 1106 | {"Processor Aggregator Device", true}, | ||
| 1107 | }; | ||
| 1087 | 1108 | ||
| 1088 | void __init acpi_osi_setup(char *str) | 1109 | void __init acpi_osi_setup(char *str) |
| 1089 | { | 1110 | { |
| @@ -1333,23 +1354,6 @@ int acpi_resources_are_enforced(void) | |||
| 1333 | EXPORT_SYMBOL(acpi_resources_are_enforced); | 1354 | EXPORT_SYMBOL(acpi_resources_are_enforced); |
| 1334 | 1355 | ||
| 1335 | /* | 1356 | /* |
| 1336 | * Create and initialize a spinlock. | ||
| 1337 | */ | ||
| 1338 | acpi_status | ||
| 1339 | acpi_os_create_lock(acpi_spinlock *out_handle) | ||
| 1340 | { | ||
| 1341 | spinlock_t *lock; | ||
| 1342 | |||
| 1343 | lock = ACPI_ALLOCATE(sizeof(spinlock_t)); | ||
| 1344 | if (!lock) | ||
| 1345 | return AE_NO_MEMORY; | ||
| 1346 | spin_lock_init(lock); | ||
| 1347 | *out_handle = lock; | ||
| 1348 | |||
| 1349 | return AE_OK; | ||
| 1350 | } | ||
| 1351 | |||
| 1352 | /* | ||
| 1353 | * Deallocate the memory for a spinlock. | 1357 | * Deallocate the memory for a spinlock. |
| 1354 | */ | 1358 | */ |
| 1355 | void acpi_os_delete_lock(acpi_spinlock handle) | 1359 | void acpi_os_delete_lock(acpi_spinlock handle) |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index f907cfbfa13c..7f9eba9a0b02 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
| @@ -303,6 +303,61 @@ void acpi_pci_irq_del_prt(struct pci_bus *bus) | |||
| 303 | /* -------------------------------------------------------------------------- | 303 | /* -------------------------------------------------------------------------- |
| 304 | PCI Interrupt Routing Support | 304 | PCI Interrupt Routing Support |
| 305 | -------------------------------------------------------------------------- */ | 305 | -------------------------------------------------------------------------- */ |
| 306 | #ifdef CONFIG_X86_IO_APIC | ||
| 307 | extern int noioapicquirk; | ||
| 308 | extern int noioapicreroute; | ||
| 309 | |||
| 310 | static int bridge_has_boot_interrupt_variant(struct pci_bus *bus) | ||
| 311 | { | ||
| 312 | struct pci_bus *bus_it; | ||
| 313 | |||
| 314 | for (bus_it = bus ; bus_it ; bus_it = bus_it->parent) { | ||
| 315 | if (!bus_it->self) | ||
| 316 | return 0; | ||
| 317 | if (bus_it->self->irq_reroute_variant) | ||
| 318 | return bus_it->self->irq_reroute_variant; | ||
| 319 | } | ||
| 320 | return 0; | ||
| 321 | } | ||
| 322 | |||
| 323 | /* | ||
| 324 | * Some chipsets (e.g. Intel 6700PXH) generate a legacy INTx when the IRQ | ||
| 325 | * entry in the chipset's IO-APIC is masked (as, e.g. the RT kernel does | ||
| 326 | * during interrupt handling). When this INTx generation cannot be disabled, | ||
| 327 | * we reroute these interrupts to their legacy equivalent to get rid of | ||
| 328 | * spurious interrupts. | ||
| 329 | */ | ||
| 330 | static int acpi_reroute_boot_interrupt(struct pci_dev *dev, | ||
| 331 | struct acpi_prt_entry *entry) | ||
| 332 | { | ||
| 333 | if (noioapicquirk || noioapicreroute) { | ||
| 334 | return 0; | ||
| 335 | } else { | ||
| 336 | switch (bridge_has_boot_interrupt_variant(dev->bus)) { | ||
| 337 | case 0: | ||
| 338 | /* no rerouting necessary */ | ||
| 339 | return 0; | ||
| 340 | case INTEL_IRQ_REROUTE_VARIANT: | ||
| 341 | /* | ||
| 342 | * Remap according to INTx routing table in 6700PXH | ||
| 343 | * specs, intel order number 302628-002, section | ||
| 344 | * 2.15.2. Other chipsets (80332, ...) have the same | ||
| 345 | * mapping and are handled here as well. | ||
| 346 | */ | ||
| 347 | dev_info(&dev->dev, "PCI IRQ %d -> rerouted to legacy " | ||
| 348 | "IRQ %d\n", entry->index, | ||
| 349 | (entry->index % 4) + 16); | ||
| 350 | entry->index = (entry->index % 4) + 16; | ||
| 351 | return 1; | ||
| 352 | default: | ||
| 353 | dev_warn(&dev->dev, "Cannot reroute IRQ %d to legacy " | ||
| 354 | "IRQ: unknown mapping\n", entry->index); | ||
| 355 | return -1; | ||
| 356 | } | ||
| 357 | } | ||
| 358 | } | ||
| 359 | #endif /* CONFIG_X86_IO_APIC */ | ||
| 360 | |||
| 306 | static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin) | 361 | static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin) |
| 307 | { | 362 | { |
| 308 | struct acpi_prt_entry *entry; | 363 | struct acpi_prt_entry *entry; |
| @@ -311,6 +366,9 @@ static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin) | |||
| 311 | 366 | ||
| 312 | entry = acpi_pci_irq_find_prt_entry(dev, pin); | 367 | entry = acpi_pci_irq_find_prt_entry(dev, pin); |
| 313 | if (entry) { | 368 | if (entry) { |
| 369 | #ifdef CONFIG_X86_IO_APIC | ||
| 370 | acpi_reroute_boot_interrupt(dev, entry); | ||
| 371 | #endif /* CONFIG_X86_IO_APIC */ | ||
| 314 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %s[%c] _PRT entry\n", | 372 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %s[%c] _PRT entry\n", |
| 315 | pci_name(dev), pin_name(pin))); | 373 | pci_name(dev), pin_name(pin))); |
| 316 | return entry; | 374 | return entry; |
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index d06078d660ad..2672c798272f 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
| @@ -485,7 +485,8 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) | |||
| 485 | root->secondary.end = 0xFF; | 485 | root->secondary.end = 0xFF; |
| 486 | printk(KERN_WARNING FW_BUG PREFIX | 486 | printk(KERN_WARNING FW_BUG PREFIX |
| 487 | "no secondary bus range in _CRS\n"); | 487 | "no secondary bus range in _CRS\n"); |
| 488 | status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN, NULL, &bus); | 488 | status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN, |
| 489 | NULL, &bus); | ||
| 489 | if (ACPI_SUCCESS(status)) | 490 | if (ACPI_SUCCESS(status)) |
| 490 | root->secondary.start = bus; | 491 | root->secondary.start = bus; |
| 491 | else if (status == AE_NOT_FOUND) | 492 | else if (status == AE_NOT_FOUND) |
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 79cb65332894..870550d6a4bf 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c | |||
| @@ -244,7 +244,7 @@ processor_set_cur_state(struct thermal_cooling_device *cdev, | |||
| 244 | return result; | 244 | return result; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | struct thermal_cooling_device_ops processor_cooling_ops = { | 247 | const struct thermal_cooling_device_ops processor_cooling_ops = { |
| 248 | .get_max_state = processor_get_max_state, | 248 | .get_max_state = processor_get_max_state, |
| 249 | .get_cur_state = processor_get_cur_state, | 249 | .get_cur_state = processor_get_cur_state, |
| 250 | .set_cur_state = processor_set_cur_state, | 250 | .set_cur_state = processor_set_cur_state, |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 6c949602cbd1..3ed80b2ca907 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -428,6 +428,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 428 | DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), | 428 | DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), |
| 429 | }, | 429 | }, |
| 430 | }, | 430 | }, |
| 431 | { | ||
| 432 | .callback = init_old_suspend_ordering, | ||
| 433 | .ident = "Asus A8N-SLI DELUXE", | ||
| 434 | .matches = { | ||
| 435 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
| 436 | DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI DELUXE"), | ||
| 437 | }, | ||
| 438 | }, | ||
| 439 | { | ||
| 440 | .callback = init_old_suspend_ordering, | ||
| 441 | .ident = "Asus A8N-SLI Premium", | ||
| 442 | .matches = { | ||
| 443 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
| 444 | DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI Premium"), | ||
| 445 | }, | ||
| 446 | }, | ||
| 431 | {}, | 447 | {}, |
| 432 | }; | 448 | }; |
| 433 | #endif /* CONFIG_SUSPEND */ | 449 | #endif /* CONFIG_SUSPEND */ |
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index 77255f250dbb..c538d0ef10ff 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c | |||
| @@ -149,12 +149,12 @@ static int param_get_debug_level(char *buffer, const struct kernel_param *kp) | |||
| 149 | return result; | 149 | return result; |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | static struct kernel_param_ops param_ops_debug_layer = { | 152 | static const struct kernel_param_ops param_ops_debug_layer = { |
| 153 | .set = param_set_uint, | 153 | .set = param_set_uint, |
| 154 | .get = param_get_debug_layer, | 154 | .get = param_get_debug_layer, |
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | static struct kernel_param_ops param_ops_debug_level = { | 157 | static const struct kernel_param_ops param_ops_debug_level = { |
| 158 | .set = param_set_uint, | 158 | .set = param_set_uint, |
| 159 | .get = param_get_debug_level, | 159 | .get = param_get_debug_level, |
| 160 | }; | 160 | }; |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 2607e17b520f..48fbc647b178 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
| @@ -812,7 +812,7 @@ acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal, | |||
| 812 | thermal_zone_unbind_cooling_device); | 812 | thermal_zone_unbind_cooling_device); |
| 813 | } | 813 | } |
| 814 | 814 | ||
| 815 | static struct thermal_zone_device_ops acpi_thermal_zone_ops = { | 815 | static const struct thermal_zone_device_ops acpi_thermal_zone_ops = { |
| 816 | .bind = acpi_thermal_bind_cooling_device, | 816 | .bind = acpi_thermal_bind_cooling_device, |
| 817 | .unbind = acpi_thermal_unbind_cooling_device, | 817 | .unbind = acpi_thermal_unbind_cooling_device, |
| 818 | .get_temp = thermal_get_temp, | 818 | .get_temp = thermal_get_temp, |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index db39e9e607d8..c6f9ef8d9ccb 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -308,7 +308,7 @@ video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long st | |||
| 308 | return acpi_video_device_lcd_set_level(video, level); | 308 | return acpi_video_device_lcd_set_level(video, level); |
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | static struct thermal_cooling_device_ops video_cooling_ops = { | 311 | static const struct thermal_cooling_device_ops video_cooling_ops = { |
| 312 | .get_max_state = video_get_max_state, | 312 | .get_max_state = video_get_max_state, |
| 313 | .get_cur_state = video_get_cur_state, | 313 | .get_cur_state = video_get_cur_state, |
| 314 | .set_cur_state = video_set_cur_state, | 314 | .set_cur_state = video_set_cur_state, |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index a791b8ce6294..993d40620f91 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -218,12 +218,12 @@ static void ata_acpi_dev_uevent(acpi_handle handle, u32 event, void *data) | |||
| 218 | ata_acpi_uevent(dev->link->ap, dev, event); | 218 | ata_acpi_uevent(dev->link->ap, dev, event); |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | static struct acpi_dock_ops ata_acpi_dev_dock_ops = { | 221 | static const struct acpi_dock_ops ata_acpi_dev_dock_ops = { |
| 222 | .handler = ata_acpi_dev_notify_dock, | 222 | .handler = ata_acpi_dev_notify_dock, |
| 223 | .uevent = ata_acpi_dev_uevent, | 223 | .uevent = ata_acpi_dev_uevent, |
| 224 | }; | 224 | }; |
| 225 | 225 | ||
| 226 | static struct acpi_dock_ops ata_acpi_ap_dock_ops = { | 226 | static const struct acpi_dock_ops ata_acpi_ap_dock_ops = { |
| 227 | .handler = ata_acpi_ap_notify_dock, | 227 | .handler = ata_acpi_ap_notify_dock, |
| 228 | .uevent = ata_acpi_ap_uevent, | 228 | .uevent = ata_acpi_ap_uevent, |
| 229 | }; | 229 | }; |
diff --git a/drivers/char/agp/intel-agp.h b/drivers/char/agp/intel-agp.h index 999803ce10dc..5da67f165afa 100644 --- a/drivers/char/agp/intel-agp.h +++ b/drivers/char/agp/intel-agp.h | |||
| @@ -90,9 +90,10 @@ | |||
| 90 | #define G4x_GMCH_SIZE_MASK (0xf << 8) | 90 | #define G4x_GMCH_SIZE_MASK (0xf << 8) |
| 91 | #define G4x_GMCH_SIZE_1M (0x1 << 8) | 91 | #define G4x_GMCH_SIZE_1M (0x1 << 8) |
| 92 | #define G4x_GMCH_SIZE_2M (0x3 << 8) | 92 | #define G4x_GMCH_SIZE_2M (0x3 << 8) |
| 93 | #define G4x_GMCH_SIZE_VT_1M (0x9 << 8) | 93 | #define G4x_GMCH_SIZE_VT_EN (0x8 << 8) |
| 94 | #define G4x_GMCH_SIZE_VT_1_5M (0xa << 8) | 94 | #define G4x_GMCH_SIZE_VT_1M (G4x_GMCH_SIZE_1M | G4x_GMCH_SIZE_VT_EN) |
| 95 | #define G4x_GMCH_SIZE_VT_2M (0xc << 8) | 95 | #define G4x_GMCH_SIZE_VT_1_5M ((0x2 << 8) | G4x_GMCH_SIZE_VT_EN) |
| 96 | #define G4x_GMCH_SIZE_VT_2M (G4x_GMCH_SIZE_2M | G4x_GMCH_SIZE_VT_EN) | ||
| 96 | 97 | ||
| 97 | #define GFX_FLSH_CNTL 0x2170 /* 915+ */ | 98 | #define GFX_FLSH_CNTL 0x2170 /* 915+ */ |
| 98 | 99 | ||
diff --git a/drivers/gpio/wm831x-gpio.c b/drivers/gpio/wm831x-gpio.c index 309644cf4d9b..2bcfb0be09ff 100644 --- a/drivers/gpio/wm831x-gpio.c +++ b/drivers/gpio/wm831x-gpio.c | |||
| @@ -180,6 +180,7 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | |||
| 180 | break; | 180 | break; |
| 181 | case WM831X_GPIO_PULL_UP: | 181 | case WM831X_GPIO_PULL_UP: |
| 182 | pull = "pullup"; | 182 | pull = "pullup"; |
| 183 | break; | ||
| 183 | default: | 184 | default: |
| 184 | pull = "INVALID PULL"; | 185 | pull = "INVALID PULL"; |
| 185 | break; | 186 | break; |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index f245c588ae95..ce7914c4c044 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -262,6 +262,7 @@ enum intel_pch { | |||
| 262 | }; | 262 | }; |
| 263 | 263 | ||
| 264 | #define QUIRK_PIPEA_FORCE (1<<0) | 264 | #define QUIRK_PIPEA_FORCE (1<<0) |
| 265 | #define QUIRK_LVDS_SSC_DISABLE (1<<1) | ||
| 265 | 266 | ||
| 266 | struct intel_fbdev; | 267 | struct intel_fbdev; |
| 267 | 268 | ||
| @@ -1194,7 +1195,9 @@ void i915_gem_free_all_phys_object(struct drm_device *dev); | |||
| 1194 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); | 1195 | void i915_gem_release(struct drm_device *dev, struct drm_file *file); |
| 1195 | 1196 | ||
| 1196 | uint32_t | 1197 | uint32_t |
| 1197 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj); | 1198 | i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, |
| 1199 | uint32_t size, | ||
| 1200 | int tiling_mode); | ||
| 1198 | 1201 | ||
| 1199 | /* i915_gem_gtt.c */ | 1202 | /* i915_gem_gtt.c */ |
| 1200 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); | 1203 | void i915_gem_restore_gtt_mappings(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5c0d1247f453..a087e1bf0c2f 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1374,25 +1374,24 @@ i915_gem_free_mmap_offset(struct drm_i915_gem_object *obj) | |||
| 1374 | } | 1374 | } |
| 1375 | 1375 | ||
| 1376 | static uint32_t | 1376 | static uint32_t |
| 1377 | i915_gem_get_gtt_size(struct drm_i915_gem_object *obj) | 1377 | i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode) |
| 1378 | { | 1378 | { |
| 1379 | struct drm_device *dev = obj->base.dev; | 1379 | uint32_t gtt_size; |
| 1380 | uint32_t size; | ||
| 1381 | 1380 | ||
| 1382 | if (INTEL_INFO(dev)->gen >= 4 || | 1381 | if (INTEL_INFO(dev)->gen >= 4 || |
| 1383 | obj->tiling_mode == I915_TILING_NONE) | 1382 | tiling_mode == I915_TILING_NONE) |
| 1384 | return obj->base.size; | 1383 | return size; |
| 1385 | 1384 | ||
| 1386 | /* Previous chips need a power-of-two fence region when tiling */ | 1385 | /* Previous chips need a power-of-two fence region when tiling */ |
| 1387 | if (INTEL_INFO(dev)->gen == 3) | 1386 | if (INTEL_INFO(dev)->gen == 3) |
| 1388 | size = 1024*1024; | 1387 | gtt_size = 1024*1024; |
| 1389 | else | 1388 | else |
| 1390 | size = 512*1024; | 1389 | gtt_size = 512*1024; |
| 1391 | 1390 | ||
| 1392 | while (size < obj->base.size) | 1391 | while (gtt_size < size) |
| 1393 | size <<= 1; | 1392 | gtt_size <<= 1; |
| 1394 | 1393 | ||
| 1395 | return size; | 1394 | return gtt_size; |
| 1396 | } | 1395 | } |
| 1397 | 1396 | ||
| 1398 | /** | 1397 | /** |
| @@ -1403,59 +1402,52 @@ i915_gem_get_gtt_size(struct drm_i915_gem_object *obj) | |||
| 1403 | * potential fence register mapping. | 1402 | * potential fence register mapping. |
| 1404 | */ | 1403 | */ |
| 1405 | static uint32_t | 1404 | static uint32_t |
| 1406 | i915_gem_get_gtt_alignment(struct drm_i915_gem_object *obj) | 1405 | i915_gem_get_gtt_alignment(struct drm_device *dev, |
| 1406 | uint32_t size, | ||
| 1407 | int tiling_mode) | ||
| 1407 | { | 1408 | { |
| 1408 | struct drm_device *dev = obj->base.dev; | ||
| 1409 | |||
| 1410 | /* | 1409 | /* |
| 1411 | * Minimum alignment is 4k (GTT page size), but might be greater | 1410 | * Minimum alignment is 4k (GTT page size), but might be greater |
| 1412 | * if a fence register is needed for the object. | 1411 | * if a fence register is needed for the object. |
| 1413 | */ | 1412 | */ |
| 1414 | if (INTEL_INFO(dev)->gen >= 4 || | 1413 | if (INTEL_INFO(dev)->gen >= 4 || |
| 1415 | obj->tiling_mode == I915_TILING_NONE) | 1414 | tiling_mode == I915_TILING_NONE) |
| 1416 | return 4096; | 1415 | return 4096; |
| 1417 | 1416 | ||
| 1418 | /* | 1417 | /* |
| 1419 | * Previous chips need to be aligned to the size of the smallest | 1418 | * Previous chips need to be aligned to the size of the smallest |
| 1420 | * fence register that can contain the object. | 1419 | * fence register that can contain the object. |
| 1421 | */ | 1420 | */ |
| 1422 | return i915_gem_get_gtt_size(obj); | 1421 | return i915_gem_get_gtt_size(dev, size, tiling_mode); |
| 1423 | } | 1422 | } |
| 1424 | 1423 | ||
| 1425 | /** | 1424 | /** |
| 1426 | * i915_gem_get_unfenced_gtt_alignment - return required GTT alignment for an | 1425 | * i915_gem_get_unfenced_gtt_alignment - return required GTT alignment for an |
| 1427 | * unfenced object | 1426 | * unfenced object |
| 1428 | * @obj: object to check | 1427 | * @dev: the device |
| 1428 | * @size: size of the object | ||
| 1429 | * @tiling_mode: tiling mode of the object | ||
| 1429 | * | 1430 | * |
| 1430 | * Return the required GTT alignment for an object, only taking into account | 1431 | * Return the required GTT alignment for an object, only taking into account |
| 1431 | * unfenced tiled surface requirements. | 1432 | * unfenced tiled surface requirements. |
| 1432 | */ | 1433 | */ |
| 1433 | uint32_t | 1434 | uint32_t |
| 1434 | i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj) | 1435 | i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev, |
| 1436 | uint32_t size, | ||
| 1437 | int tiling_mode) | ||
| 1435 | { | 1438 | { |
| 1436 | struct drm_device *dev = obj->base.dev; | ||
| 1437 | int tile_height; | ||
| 1438 | |||
| 1439 | /* | 1439 | /* |
| 1440 | * Minimum alignment is 4k (GTT page size) for sane hw. | 1440 | * Minimum alignment is 4k (GTT page size) for sane hw. |
| 1441 | */ | 1441 | */ |
| 1442 | if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev) || | 1442 | if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev) || |
| 1443 | obj->tiling_mode == I915_TILING_NONE) | 1443 | tiling_mode == I915_TILING_NONE) |
| 1444 | return 4096; | 1444 | return 4096; |
| 1445 | 1445 | ||
| 1446 | /* | 1446 | /* Previous hardware however needs to be aligned to a power-of-two |
| 1447 | * Older chips need unfenced tiled buffers to be aligned to the left | 1447 | * tile height. The simplest method for determining this is to reuse |
| 1448 | * edge of an even tile row (where tile rows are counted as if the bo is | 1448 | * the power-of-tile object size. |
| 1449 | * placed in a fenced gtt region). | ||
| 1450 | */ | 1449 | */ |
| 1451 | if (IS_GEN2(dev)) | 1450 | return i915_gem_get_gtt_size(dev, size, tiling_mode); |
| 1452 | tile_height = 16; | ||
| 1453 | else if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) | ||
| 1454 | tile_height = 32; | ||
| 1455 | else | ||
| 1456 | tile_height = 8; | ||
| 1457 | |||
| 1458 | return tile_height * obj->stride * 2; | ||
| 1459 | } | 1451 | } |
| 1460 | 1452 | ||
| 1461 | int | 1453 | int |
| @@ -2744,9 +2736,16 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj, | |||
| 2744 | return -EINVAL; | 2736 | return -EINVAL; |
| 2745 | } | 2737 | } |
| 2746 | 2738 | ||
| 2747 | fence_size = i915_gem_get_gtt_size(obj); | 2739 | fence_size = i915_gem_get_gtt_size(dev, |
| 2748 | fence_alignment = i915_gem_get_gtt_alignment(obj); | 2740 | obj->base.size, |
| 2749 | unfenced_alignment = i915_gem_get_unfenced_gtt_alignment(obj); | 2741 | obj->tiling_mode); |
| 2742 | fence_alignment = i915_gem_get_gtt_alignment(dev, | ||
| 2743 | obj->base.size, | ||
| 2744 | obj->tiling_mode); | ||
| 2745 | unfenced_alignment = | ||
| 2746 | i915_gem_get_unfenced_gtt_alignment(dev, | ||
| 2747 | obj->base.size, | ||
| 2748 | obj->tiling_mode); | ||
| 2750 | 2749 | ||
| 2751 | if (alignment == 0) | 2750 | if (alignment == 0) |
| 2752 | alignment = map_and_fenceable ? fence_alignment : | 2751 | alignment = map_and_fenceable ? fence_alignment : |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 82d70fd9e933..99c4faa59d8f 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -348,7 +348,9 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 348 | /* Rebind if we need a change of alignment */ | 348 | /* Rebind if we need a change of alignment */ |
| 349 | if (!obj->map_and_fenceable) { | 349 | if (!obj->map_and_fenceable) { |
| 350 | u32 unfenced_alignment = | 350 | u32 unfenced_alignment = |
| 351 | i915_gem_get_unfenced_gtt_alignment(obj); | 351 | i915_gem_get_unfenced_gtt_alignment(dev, |
| 352 | obj->base.size, | ||
| 353 | args->tiling_mode); | ||
| 352 | if (obj->gtt_offset & (unfenced_alignment - 1)) | 354 | if (obj->gtt_offset & (unfenced_alignment - 1)) |
| 353 | ret = i915_gem_object_unbind(obj); | 355 | ret = i915_gem_object_unbind(obj); |
| 354 | } | 356 | } |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 21b6f93fe919..0f1c799afea1 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -4305,7 +4305,8 @@ static void intel_update_watermarks(struct drm_device *dev) | |||
| 4305 | 4305 | ||
| 4306 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | 4306 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) |
| 4307 | { | 4307 | { |
| 4308 | return dev_priv->lvds_use_ssc && i915_panel_use_ssc; | 4308 | return dev_priv->lvds_use_ssc && i915_panel_use_ssc |
| 4309 | && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE); | ||
| 4309 | } | 4310 | } |
| 4310 | 4311 | ||
| 4311 | static int i9xx_crtc_mode_set(struct drm_crtc *crtc, | 4312 | static int i9xx_crtc_mode_set(struct drm_crtc *crtc, |
| @@ -7810,6 +7811,15 @@ static void quirk_pipea_force (struct drm_device *dev) | |||
| 7810 | DRM_DEBUG_DRIVER("applying pipe a force quirk\n"); | 7811 | DRM_DEBUG_DRIVER("applying pipe a force quirk\n"); |
| 7811 | } | 7812 | } |
| 7812 | 7813 | ||
| 7814 | /* | ||
| 7815 | * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason | ||
| 7816 | */ | ||
| 7817 | static void quirk_ssc_force_disable(struct drm_device *dev) | ||
| 7818 | { | ||
| 7819 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 7820 | dev_priv->quirks |= QUIRK_LVDS_SSC_DISABLE; | ||
| 7821 | } | ||
| 7822 | |||
| 7813 | struct intel_quirk { | 7823 | struct intel_quirk { |
| 7814 | int device; | 7824 | int device; |
| 7815 | int subsystem_vendor; | 7825 | int subsystem_vendor; |
| @@ -7838,6 +7848,9 @@ struct intel_quirk intel_quirks[] = { | |||
| 7838 | /* 855 & before need to leave pipe A & dpll A up */ | 7848 | /* 855 & before need to leave pipe A & dpll A up */ |
| 7839 | { 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, | 7849 | { 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, |
| 7840 | { 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, | 7850 | { 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, |
| 7851 | |||
| 7852 | /* Lenovo U160 cannot use SSC on LVDS */ | ||
| 7853 | { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, | ||
| 7841 | }; | 7854 | }; |
| 7842 | 7855 | ||
| 7843 | static void intel_init_quirks(struct drm_device *dev) | 7856 | static void intel_init_quirks(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 660f96401a05..15bd0477a3e8 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -2000,7 +2000,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2000 | gb_backend_map = 0x66442200; | 2000 | gb_backend_map = 0x66442200; |
| 2001 | break; | 2001 | break; |
| 2002 | case CHIP_JUNIPER: | 2002 | case CHIP_JUNIPER: |
| 2003 | gb_backend_map = 0x00006420; | 2003 | gb_backend_map = 0x00002200; |
| 2004 | break; | 2004 | break; |
| 2005 | default: | 2005 | default: |
| 2006 | gb_backend_map = | 2006 | gb_backend_map = |
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c index 57f3bc17b87e..2eb251858e72 100644 --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c | |||
| @@ -252,7 +252,7 @@ draw_auto(struct radeon_device *rdev) | |||
| 252 | 252 | ||
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | /* emits 36 */ | 255 | /* emits 39 */ |
| 256 | static void | 256 | static void |
| 257 | set_default_state(struct radeon_device *rdev) | 257 | set_default_state(struct radeon_device *rdev) |
| 258 | { | 258 | { |
| @@ -531,6 +531,11 @@ set_default_state(struct radeon_device *rdev) | |||
| 531 | radeon_ring_write(rdev, (SQ_DYN_GPR_CNTL_PS_FLUSH_REQ - PACKET3_SET_CONFIG_REG_START) >> 2); | 531 | radeon_ring_write(rdev, (SQ_DYN_GPR_CNTL_PS_FLUSH_REQ - PACKET3_SET_CONFIG_REG_START) >> 2); |
| 532 | radeon_ring_write(rdev, 0); | 532 | radeon_ring_write(rdev, 0); |
| 533 | 533 | ||
| 534 | /* setup LDS */ | ||
| 535 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | ||
| 536 | radeon_ring_write(rdev, (SQ_LDS_RESOURCE_MGMT - PACKET3_SET_CONFIG_REG_START) >> 2); | ||
| 537 | radeon_ring_write(rdev, 0x10001000); | ||
| 538 | |||
| 534 | /* SQ config */ | 539 | /* SQ config */ |
| 535 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 11)); | 540 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 11)); |
| 536 | radeon_ring_write(rdev, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_START) >> 2); | 541 | radeon_ring_write(rdev, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_START) >> 2); |
| @@ -773,7 +778,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes) | |||
| 773 | /* calculate number of loops correctly */ | 778 | /* calculate number of loops correctly */ |
| 774 | ring_size = num_loops * dwords_per_loop; | 779 | ring_size = num_loops * dwords_per_loop; |
| 775 | /* set default + shaders */ | 780 | /* set default + shaders */ |
| 776 | ring_size += 52; /* shaders + def state */ | 781 | ring_size += 55; /* shaders + def state */ |
| 777 | ring_size += 10; /* fence emit for VB IB */ | 782 | ring_size += 10; /* fence emit for VB IB */ |
| 778 | ring_size += 5; /* done copy */ | 783 | ring_size += 5; /* done copy */ |
| 779 | ring_size += 10; /* fence emit for done copy */ | 784 | ring_size += 10; /* fence emit for done copy */ |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 3fc5fa1aefd0..229a20f10e2b 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
| @@ -331,7 +331,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev) | |||
| 331 | 331 | ||
| 332 | seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1); | 332 | seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1); |
| 333 | viph_control = RREG32(RADEON_VIPH_CONTROL); | 333 | viph_control = RREG32(RADEON_VIPH_CONTROL); |
| 334 | bus_cntl = RREG32(RADEON_BUS_CNTL); | 334 | bus_cntl = RREG32(RV370_BUS_CNTL); |
| 335 | d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); | 335 | d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); |
| 336 | d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); | 336 | d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); |
| 337 | vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL); | 337 | vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL); |
| @@ -350,7 +350,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev) | |||
| 350 | WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); | 350 | WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); |
| 351 | 351 | ||
| 352 | /* enable the rom */ | 352 | /* enable the rom */ |
| 353 | WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); | 353 | WREG32(RV370_BUS_CNTL, (bus_cntl & ~RV370_BUS_BIOS_DIS_ROM)); |
| 354 | 354 | ||
| 355 | /* Disable VGA mode */ | 355 | /* Disable VGA mode */ |
| 356 | WREG32(AVIVO_D1VGA_CONTROL, | 356 | WREG32(AVIVO_D1VGA_CONTROL, |
| @@ -367,7 +367,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev) | |||
| 367 | /* restore regs */ | 367 | /* restore regs */ |
| 368 | WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1); | 368 | WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1); |
| 369 | WREG32(RADEON_VIPH_CONTROL, viph_control); | 369 | WREG32(RADEON_VIPH_CONTROL, viph_control); |
| 370 | WREG32(RADEON_BUS_CNTL, bus_cntl); | 370 | WREG32(RV370_BUS_CNTL, bus_cntl); |
| 371 | WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); | 371 | WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); |
| 372 | WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); | 372 | WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); |
| 373 | WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control); | 373 | WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control); |
| @@ -390,7 +390,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev) | |||
| 390 | 390 | ||
| 391 | seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1); | 391 | seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1); |
| 392 | viph_control = RREG32(RADEON_VIPH_CONTROL); | 392 | viph_control = RREG32(RADEON_VIPH_CONTROL); |
| 393 | bus_cntl = RREG32(RADEON_BUS_CNTL); | 393 | if (rdev->flags & RADEON_IS_PCIE) |
| 394 | bus_cntl = RREG32(RV370_BUS_CNTL); | ||
| 395 | else | ||
| 396 | bus_cntl = RREG32(RADEON_BUS_CNTL); | ||
| 394 | crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL); | 397 | crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL); |
| 395 | crtc2_gen_cntl = 0; | 398 | crtc2_gen_cntl = 0; |
| 396 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); | 399 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); |
| @@ -412,7 +415,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev) | |||
| 412 | WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); | 415 | WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); |
| 413 | 416 | ||
| 414 | /* enable the rom */ | 417 | /* enable the rom */ |
| 415 | WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); | 418 | if (rdev->flags & RADEON_IS_PCIE) |
| 419 | WREG32(RV370_BUS_CNTL, (bus_cntl & ~RV370_BUS_BIOS_DIS_ROM)); | ||
| 420 | else | ||
| 421 | WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); | ||
| 416 | 422 | ||
| 417 | /* Turn off mem requests and CRTC for both controllers */ | 423 | /* Turn off mem requests and CRTC for both controllers */ |
| 418 | WREG32(RADEON_CRTC_GEN_CNTL, | 424 | WREG32(RADEON_CRTC_GEN_CNTL, |
| @@ -439,7 +445,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev) | |||
| 439 | /* restore regs */ | 445 | /* restore regs */ |
| 440 | WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1); | 446 | WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1); |
| 441 | WREG32(RADEON_VIPH_CONTROL, viph_control); | 447 | WREG32(RADEON_VIPH_CONTROL, viph_control); |
| 442 | WREG32(RADEON_BUS_CNTL, bus_cntl); | 448 | if (rdev->flags & RADEON_IS_PCIE) |
| 449 | WREG32(RV370_BUS_CNTL, bus_cntl); | ||
| 450 | else | ||
| 451 | WREG32(RADEON_BUS_CNTL, bus_cntl); | ||
| 443 | WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl); | 452 | WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl); |
| 444 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { | 453 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { |
| 445 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); | 454 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index cbfca3a24fdf..9792d4ffdc86 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -52,6 +52,12 @@ void radeon_connector_hotplug(struct drm_connector *connector) | |||
| 52 | struct radeon_device *rdev = dev->dev_private; | 52 | struct radeon_device *rdev = dev->dev_private; |
| 53 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 53 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 54 | 54 | ||
| 55 | /* bail if the connector does not have hpd pin, e.g., | ||
| 56 | * VGA, TV, etc. | ||
| 57 | */ | ||
| 58 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) | ||
| 59 | return; | ||
| 60 | |||
| 55 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | 61 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); |
| 56 | 62 | ||
| 57 | /* powering up/down the eDP panel generates hpd events which | 63 | /* powering up/down the eDP panel generates hpd events which |
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index ec93a75369e6..bc44a3d35ec6 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
| @@ -300,6 +300,8 @@ | |||
| 300 | # define RADEON_BUS_READ_BURST (1 << 30) | 300 | # define RADEON_BUS_READ_BURST (1 << 30) |
| 301 | #define RADEON_BUS_CNTL1 0x0034 | 301 | #define RADEON_BUS_CNTL1 0x0034 |
| 302 | # define RADEON_BUS_WAIT_ON_LOCK_EN (1 << 4) | 302 | # define RADEON_BUS_WAIT_ON_LOCK_EN (1 << 4) |
| 303 | #define RV370_BUS_CNTL 0x004c | ||
| 304 | # define RV370_BUS_BIOS_DIS_ROM (1 << 2) | ||
| 303 | /* rv370/rv380, rv410, r423/r430/r480, r5xx */ | 305 | /* rv370/rv380, rv410, r423/r430/r480, r5xx */ |
| 304 | #define RADEON_MSI_REARM_EN 0x0160 | 306 | #define RADEON_MSI_REARM_EN 0x0160 |
| 305 | # define RV370_MSI_REARM_EN (1 << 0) | 307 | # define RV370_MSI_REARM_EN (1 << 0) |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 6e3b11e5abbe..1f5850e473cc 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -426,7 +426,7 @@ int rs600_gart_init(struct radeon_device *rdev) | |||
| 426 | return radeon_gart_table_vram_alloc(rdev); | 426 | return radeon_gart_table_vram_alloc(rdev); |
| 427 | } | 427 | } |
| 428 | 428 | ||
| 429 | int rs600_gart_enable(struct radeon_device *rdev) | 429 | static int rs600_gart_enable(struct radeon_device *rdev) |
| 430 | { | 430 | { |
| 431 | u32 tmp; | 431 | u32 tmp; |
| 432 | int r, i; | 432 | int r, i; |
| @@ -440,8 +440,8 @@ int rs600_gart_enable(struct radeon_device *rdev) | |||
| 440 | return r; | 440 | return r; |
| 441 | radeon_gart_restore(rdev); | 441 | radeon_gart_restore(rdev); |
| 442 | /* Enable bus master */ | 442 | /* Enable bus master */ |
| 443 | tmp = RREG32(R_00004C_BUS_CNTL) & C_00004C_BUS_MASTER_DIS; | 443 | tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; |
| 444 | WREG32(R_00004C_BUS_CNTL, tmp); | 444 | WREG32(RADEON_BUS_CNTL, tmp); |
| 445 | /* FIXME: setup default page */ | 445 | /* FIXME: setup default page */ |
| 446 | WREG32_MC(R_000100_MC_PT0_CNTL, | 446 | WREG32_MC(R_000100_MC_PT0_CNTL, |
| 447 | (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) | | 447 | (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) | |
diff --git a/drivers/hwmon/adm1275.c b/drivers/hwmon/adm1275.c index b9b7caf4a1d2..8bc1bd663721 100644 --- a/drivers/hwmon/adm1275.c +++ b/drivers/hwmon/adm1275.c | |||
| @@ -53,23 +53,23 @@ static int adm1275_probe(struct i2c_client *client, | |||
| 53 | info->direct[PSC_VOLTAGE_IN] = true; | 53 | info->direct[PSC_VOLTAGE_IN] = true; |
| 54 | info->direct[PSC_VOLTAGE_OUT] = true; | 54 | info->direct[PSC_VOLTAGE_OUT] = true; |
| 55 | info->direct[PSC_CURRENT_OUT] = true; | 55 | info->direct[PSC_CURRENT_OUT] = true; |
| 56 | info->m[PSC_CURRENT_OUT] = 800; | 56 | info->m[PSC_CURRENT_OUT] = 807; |
| 57 | info->b[PSC_CURRENT_OUT] = 20475; | 57 | info->b[PSC_CURRENT_OUT] = 20475; |
| 58 | info->R[PSC_CURRENT_OUT] = -1; | 58 | info->R[PSC_CURRENT_OUT] = -1; |
| 59 | info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; | 59 | info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT; |
| 60 | 60 | ||
| 61 | if (config & ADM1275_VRANGE) { | 61 | if (config & ADM1275_VRANGE) { |
| 62 | info->m[PSC_VOLTAGE_IN] = 19045; | 62 | info->m[PSC_VOLTAGE_IN] = 19199; |
| 63 | info->b[PSC_VOLTAGE_IN] = 0; | 63 | info->b[PSC_VOLTAGE_IN] = 0; |
| 64 | info->R[PSC_VOLTAGE_IN] = -2; | 64 | info->R[PSC_VOLTAGE_IN] = -2; |
| 65 | info->m[PSC_VOLTAGE_OUT] = 19045; | 65 | info->m[PSC_VOLTAGE_OUT] = 19199; |
| 66 | info->b[PSC_VOLTAGE_OUT] = 0; | 66 | info->b[PSC_VOLTAGE_OUT] = 0; |
| 67 | info->R[PSC_VOLTAGE_OUT] = -2; | 67 | info->R[PSC_VOLTAGE_OUT] = -2; |
| 68 | } else { | 68 | } else { |
| 69 | info->m[PSC_VOLTAGE_IN] = 6666; | 69 | info->m[PSC_VOLTAGE_IN] = 6720; |
| 70 | info->b[PSC_VOLTAGE_IN] = 0; | 70 | info->b[PSC_VOLTAGE_IN] = 0; |
| 71 | info->R[PSC_VOLTAGE_IN] = -1; | 71 | info->R[PSC_VOLTAGE_IN] = -1; |
| 72 | info->m[PSC_VOLTAGE_OUT] = 6666; | 72 | info->m[PSC_VOLTAGE_OUT] = 6720; |
| 73 | info->b[PSC_VOLTAGE_OUT] = 0; | 73 | info->b[PSC_VOLTAGE_OUT] = 0; |
| 74 | info->R[PSC_VOLTAGE_OUT] = -1; | 74 | info->R[PSC_VOLTAGE_OUT] = -1; |
| 75 | } | 75 | } |
diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c index dcb78a7a8047..00e98517f94c 100644 --- a/drivers/hwmon/asus_atk0110.c +++ b/drivers/hwmon/asus_atk0110.c | |||
| @@ -674,6 +674,7 @@ static int atk_debugfs_gitm_get(void *p, u64 *val) | |||
| 674 | else | 674 | else |
| 675 | err = -EIO; | 675 | err = -EIO; |
| 676 | 676 | ||
| 677 | ACPI_FREE(ret); | ||
| 677 | return err; | 678 | return err; |
| 678 | } | 679 | } |
| 679 | 680 | ||
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index bb6405b92007..5f5247750430 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
| @@ -1538,7 +1538,7 @@ static struct attribute *it87_attributes_label[] = { | |||
| 1538 | }; | 1538 | }; |
| 1539 | 1539 | ||
| 1540 | static const struct attribute_group it87_group_label = { | 1540 | static const struct attribute_group it87_group_label = { |
| 1541 | .attrs = it87_attributes_vid, | 1541 | .attrs = it87_attributes_label, |
| 1542 | }; | 1542 | }; |
| 1543 | 1543 | ||
| 1544 | /* SuperIO detection - will change isa_address if a chip is found */ | 1544 | /* SuperIO detection - will change isa_address if a chip is found */ |
diff --git a/drivers/hwmon/max1111.c b/drivers/hwmon/max1111.c index 12a54aa29776..14335bbc9bdc 100644 --- a/drivers/hwmon/max1111.c +++ b/drivers/hwmon/max1111.c | |||
| @@ -40,6 +40,8 @@ struct max1111_data { | |||
| 40 | struct spi_transfer xfer[2]; | 40 | struct spi_transfer xfer[2]; |
| 41 | uint8_t *tx_buf; | 41 | uint8_t *tx_buf; |
| 42 | uint8_t *rx_buf; | 42 | uint8_t *rx_buf; |
| 43 | struct mutex drvdata_lock; | ||
| 44 | /* protect msg, xfer and buffers from multiple access */ | ||
| 43 | }; | 45 | }; |
| 44 | 46 | ||
| 45 | static int max1111_read(struct device *dev, int channel) | 47 | static int max1111_read(struct device *dev, int channel) |
| @@ -48,6 +50,9 @@ static int max1111_read(struct device *dev, int channel) | |||
| 48 | uint8_t v1, v2; | 50 | uint8_t v1, v2; |
| 49 | int err; | 51 | int err; |
| 50 | 52 | ||
| 53 | /* writing to drvdata struct is not thread safe, wait on mutex */ | ||
| 54 | mutex_lock(&data->drvdata_lock); | ||
| 55 | |||
| 51 | data->tx_buf[0] = (channel << MAX1111_CTRL_SEL_SH) | | 56 | data->tx_buf[0] = (channel << MAX1111_CTRL_SEL_SH) | |
| 52 | MAX1111_CTRL_PD0 | MAX1111_CTRL_PD1 | | 57 | MAX1111_CTRL_PD0 | MAX1111_CTRL_PD1 | |
| 53 | MAX1111_CTRL_SGL | MAX1111_CTRL_UNI | MAX1111_CTRL_STR; | 58 | MAX1111_CTRL_SGL | MAX1111_CTRL_UNI | MAX1111_CTRL_STR; |
| @@ -55,12 +60,15 @@ static int max1111_read(struct device *dev, int channel) | |||
| 55 | err = spi_sync(data->spi, &data->msg); | 60 | err = spi_sync(data->spi, &data->msg); |
| 56 | if (err < 0) { | 61 | if (err < 0) { |
| 57 | dev_err(dev, "spi_sync failed with %d\n", err); | 62 | dev_err(dev, "spi_sync failed with %d\n", err); |
| 63 | mutex_unlock(&data->drvdata_lock); | ||
| 58 | return err; | 64 | return err; |
| 59 | } | 65 | } |
| 60 | 66 | ||
| 61 | v1 = data->rx_buf[0]; | 67 | v1 = data->rx_buf[0]; |
| 62 | v2 = data->rx_buf[1]; | 68 | v2 = data->rx_buf[1]; |
| 63 | 69 | ||
| 70 | mutex_unlock(&data->drvdata_lock); | ||
| 71 | |||
| 64 | if ((v1 & 0xc0) || (v2 & 0x3f)) | 72 | if ((v1 & 0xc0) || (v2 & 0x3f)) |
| 65 | return -EINVAL; | 73 | return -EINVAL; |
| 66 | 74 | ||
| @@ -176,6 +184,8 @@ static int __devinit max1111_probe(struct spi_device *spi) | |||
| 176 | if (err) | 184 | if (err) |
| 177 | goto err_free_data; | 185 | goto err_free_data; |
| 178 | 186 | ||
| 187 | mutex_init(&data->drvdata_lock); | ||
| 188 | |||
| 179 | data->spi = spi; | 189 | data->spi = spi; |
| 180 | spi_set_drvdata(spi, data); | 190 | spi_set_drvdata(spi, data); |
| 181 | 191 | ||
| @@ -213,6 +223,7 @@ static int __devexit max1111_remove(struct spi_device *spi) | |||
| 213 | 223 | ||
| 214 | hwmon_device_unregister(data->hwmon_dev); | 224 | hwmon_device_unregister(data->hwmon_dev); |
| 215 | sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group); | 225 | sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group); |
| 226 | mutex_destroy(&data->drvdata_lock); | ||
| 216 | kfree(data->rx_buf); | 227 | kfree(data->rx_buf); |
| 217 | kfree(data->tx_buf); | 228 | kfree(data->tx_buf); |
| 218 | kfree(data); | 229 | kfree(data); |
diff --git a/drivers/hwmon/pmbus_core.c b/drivers/hwmon/pmbus_core.c index 744672c1f26d..8e31a8e2c746 100644 --- a/drivers/hwmon/pmbus_core.c +++ b/drivers/hwmon/pmbus_core.c | |||
| @@ -362,8 +362,8 @@ static struct pmbus_data *pmbus_update_device(struct device *dev) | |||
| 362 | * Convert linear sensor values to milli- or micro-units | 362 | * Convert linear sensor values to milli- or micro-units |
| 363 | * depending on sensor type. | 363 | * depending on sensor type. |
| 364 | */ | 364 | */ |
| 365 | static int pmbus_reg2data_linear(struct pmbus_data *data, | 365 | static long pmbus_reg2data_linear(struct pmbus_data *data, |
| 366 | struct pmbus_sensor *sensor) | 366 | struct pmbus_sensor *sensor) |
| 367 | { | 367 | { |
| 368 | s16 exponent; | 368 | s16 exponent; |
| 369 | s32 mantissa; | 369 | s32 mantissa; |
| @@ -397,15 +397,15 @@ static int pmbus_reg2data_linear(struct pmbus_data *data, | |||
| 397 | else | 397 | else |
| 398 | val >>= -exponent; | 398 | val >>= -exponent; |
| 399 | 399 | ||
| 400 | return (int)val; | 400 | return val; |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | /* | 403 | /* |
| 404 | * Convert direct sensor values to milli- or micro-units | 404 | * Convert direct sensor values to milli- or micro-units |
| 405 | * depending on sensor type. | 405 | * depending on sensor type. |
| 406 | */ | 406 | */ |
| 407 | static int pmbus_reg2data_direct(struct pmbus_data *data, | 407 | static long pmbus_reg2data_direct(struct pmbus_data *data, |
| 408 | struct pmbus_sensor *sensor) | 408 | struct pmbus_sensor *sensor) |
| 409 | { | 409 | { |
| 410 | long val = (s16) sensor->data; | 410 | long val = (s16) sensor->data; |
| 411 | long m, b, R; | 411 | long m, b, R; |
| @@ -440,12 +440,12 @@ static int pmbus_reg2data_direct(struct pmbus_data *data, | |||
| 440 | R++; | 440 | R++; |
| 441 | } | 441 | } |
| 442 | 442 | ||
| 443 | return (int)((val - b) / m); | 443 | return (val - b) / m; |
| 444 | } | 444 | } |
| 445 | 445 | ||
| 446 | static int pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) | 446 | static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) |
| 447 | { | 447 | { |
| 448 | int val; | 448 | long val; |
| 449 | 449 | ||
| 450 | if (data->info->direct[sensor->class]) | 450 | if (data->info->direct[sensor->class]) |
| 451 | val = pmbus_reg2data_direct(data, sensor); | 451 | val = pmbus_reg2data_direct(data, sensor); |
| @@ -619,7 +619,7 @@ static int pmbus_get_boolean(struct pmbus_data *data, int index, int *val) | |||
| 619 | if (!s1 && !s2) | 619 | if (!s1 && !s2) |
| 620 | *val = !!regval; | 620 | *val = !!regval; |
| 621 | else { | 621 | else { |
| 622 | int v1, v2; | 622 | long v1, v2; |
| 623 | struct pmbus_sensor *sensor1, *sensor2; | 623 | struct pmbus_sensor *sensor1, *sensor2; |
| 624 | 624 | ||
| 625 | sensor1 = &data->sensors[s1]; | 625 | sensor1 = &data->sensors[s1]; |
| @@ -661,7 +661,7 @@ static ssize_t pmbus_show_sensor(struct device *dev, | |||
| 661 | if (sensor->data < 0) | 661 | if (sensor->data < 0) |
| 662 | return sensor->data; | 662 | return sensor->data; |
| 663 | 663 | ||
| 664 | return snprintf(buf, PAGE_SIZE, "%d\n", pmbus_reg2data(data, sensor)); | 664 | return snprintf(buf, PAGE_SIZE, "%ld\n", pmbus_reg2data(data, sensor)); |
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | static ssize_t pmbus_set_sensor(struct device *dev, | 667 | static ssize_t pmbus_set_sensor(struct device *dev, |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 98278041d75f..5b6b451d4694 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -1988,6 +1988,14 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) | |||
| 1988 | if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) { | 1988 | if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) { |
| 1989 | if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0) | 1989 | if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0) |
| 1990 | goto err0; | 1990 | goto err0; |
| 1991 | |||
| 1992 | /* If we took control of the bus, we need to force | ||
| 1993 | reinitialization. This is because many ts_bus_ctrl() | ||
| 1994 | functions strobe the RESET pin on the demod, and if the | ||
| 1995 | frontend thread already exists then the dvb_init() routine | ||
| 1996 | won't get called (which is what usually does initial | ||
| 1997 | register configuration). */ | ||
| 1998 | fepriv->reinitialise = 1; | ||
| 1991 | } | 1999 | } |
| 1992 | 2000 | ||
| 1993 | if ((ret = dvb_generic_open (inode, file)) < 0) | 2001 | if ((ret = dvb_generic_open (inode, file)) < 0) |
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index e4c97fd6f05a..52798a111e16 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig | |||
| @@ -168,7 +168,7 @@ config RADIO_MAXIRADIO | |||
| 168 | 168 | ||
| 169 | config RADIO_MIROPCM20 | 169 | config RADIO_MIROPCM20 |
| 170 | tristate "miroSOUND PCM20 radio" | 170 | tristate "miroSOUND PCM20 radio" |
| 171 | depends on ISA && VIDEO_V4L2 && SND | 171 | depends on ISA && ISA_DMA_API && VIDEO_V4L2 && SND |
| 172 | select SND_ISA | 172 | select SND_ISA |
| 173 | select SND_MIRO | 173 | select SND_MIRO |
| 174 | ---help--- | 174 | ---help--- |
| @@ -201,7 +201,7 @@ config RADIO_SF16FMI | |||
| 201 | 201 | ||
| 202 | config RADIO_SF16FMR2 | 202 | config RADIO_SF16FMR2 |
| 203 | tristate "SF16FMR2 Radio" | 203 | tristate "SF16FMR2 Radio" |
| 204 | depends on ISA && VIDEO_V4L2 | 204 | depends on ISA && VIDEO_V4L2 && SND |
| 205 | ---help--- | 205 | ---help--- |
| 206 | Choose Y here if you have one of these FM radio cards. | 206 | Choose Y here if you have one of these FM radio cards. |
| 207 | 207 | ||
diff --git a/drivers/media/radio/si4713-i2c.c b/drivers/media/radio/si4713-i2c.c index deca2e06ff22..c9f4a8e65dc4 100644 --- a/drivers/media/radio/si4713-i2c.c +++ b/drivers/media/radio/si4713-i2c.c | |||
| @@ -1033,7 +1033,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev, | |||
| 1033 | char ps_name[MAX_RDS_PS_NAME + 1]; | 1033 | char ps_name[MAX_RDS_PS_NAME + 1]; |
| 1034 | 1034 | ||
| 1035 | len = control->size - 1; | 1035 | len = control->size - 1; |
| 1036 | if (len > MAX_RDS_PS_NAME) { | 1036 | if (len < 0 || len > MAX_RDS_PS_NAME) { |
| 1037 | rval = -ERANGE; | 1037 | rval = -ERANGE; |
| 1038 | goto exit; | 1038 | goto exit; |
| 1039 | } | 1039 | } |
| @@ -1057,7 +1057,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev, | |||
| 1057 | char radio_text[MAX_RDS_RADIO_TEXT + 1]; | 1057 | char radio_text[MAX_RDS_RADIO_TEXT + 1]; |
| 1058 | 1058 | ||
| 1059 | len = control->size - 1; | 1059 | len = control->size - 1; |
| 1060 | if (len > MAX_RDS_RADIO_TEXT) { | 1060 | if (len < 0 || len > MAX_RDS_RADIO_TEXT) { |
| 1061 | rval = -ERANGE; | 1061 | rval = -ERANGE; |
| 1062 | goto exit; | 1062 | goto exit; |
| 1063 | } | 1063 | } |
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index 06dfe0957b5e..ec972dc25790 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c | |||
| @@ -558,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf, | |||
| 558 | inout, data1); | 558 | inout, data1); |
| 559 | break; | 559 | break; |
| 560 | case MCE_CMD_S_TIMEOUT: | 560 | case MCE_CMD_S_TIMEOUT: |
| 561 | /* value is in units of 50us, so x*50/100 or x/2 ms */ | 561 | /* value is in units of 50us, so x*50/1000 ms */ |
| 562 | dev_info(dev, "%s receive timeout of %d ms\n", | 562 | dev_info(dev, "%s receive timeout of %d ms\n", |
| 563 | inout, ((data1 << 8) | data2) / 2); | 563 | inout, |
| 564 | ((data1 << 8) | data2) * MCE_TIME_UNIT / 1000); | ||
| 564 | break; | 565 | break; |
| 565 | case MCE_CMD_G_TIMEOUT: | 566 | case MCE_CMD_G_TIMEOUT: |
| 566 | dev_info(dev, "Get receive timeout\n"); | 567 | dev_info(dev, "Get receive timeout\n"); |
| @@ -847,7 +848,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index) | |||
| 847 | switch (ir->buf_in[index]) { | 848 | switch (ir->buf_in[index]) { |
| 848 | /* 2-byte return value commands */ | 849 | /* 2-byte return value commands */ |
| 849 | case MCE_CMD_S_TIMEOUT: | 850 | case MCE_CMD_S_TIMEOUT: |
| 850 | ir->rc->timeout = US_TO_NS((hi << 8 | lo) / 2); | 851 | ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT); |
| 851 | break; | 852 | break; |
| 852 | 853 | ||
| 853 | /* 1-byte return value commands */ | 854 | /* 1-byte return value commands */ |
| @@ -1078,7 +1079,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) | |||
| 1078 | rc->priv = ir; | 1079 | rc->priv = ir; |
| 1079 | rc->driver_type = RC_DRIVER_IR_RAW; | 1080 | rc->driver_type = RC_DRIVER_IR_RAW; |
| 1080 | rc->allowed_protos = RC_TYPE_ALL; | 1081 | rc->allowed_protos = RC_TYPE_ALL; |
| 1081 | rc->timeout = US_TO_NS(1000); | 1082 | rc->timeout = MS_TO_NS(100); |
| 1082 | if (!ir->flags.no_tx) { | 1083 | if (!ir->flags.no_tx) { |
| 1083 | rc->s_tx_mask = mceusb_set_tx_mask; | 1084 | rc->s_tx_mask = mceusb_set_tx_mask; |
| 1084 | rc->s_tx_carrier = mceusb_set_tx_carrier; | 1085 | rc->s_tx_carrier = mceusb_set_tx_carrier; |
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index 565f24c20d77..ce595f9ab4c7 100644 --- a/drivers/media/rc/nuvoton-cir.c +++ b/drivers/media/rc/nuvoton-cir.c | |||
| @@ -1110,7 +1110,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) | |||
| 1110 | rdev->dev.parent = &pdev->dev; | 1110 | rdev->dev.parent = &pdev->dev; |
| 1111 | rdev->driver_name = NVT_DRIVER_NAME; | 1111 | rdev->driver_name = NVT_DRIVER_NAME; |
| 1112 | rdev->map_name = RC_MAP_RC6_MCE; | 1112 | rdev->map_name = RC_MAP_RC6_MCE; |
| 1113 | rdev->timeout = US_TO_NS(1000); | 1113 | rdev->timeout = MS_TO_NS(100); |
| 1114 | /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ | 1114 | /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ |
| 1115 | rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); | 1115 | rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); |
| 1116 | #if 0 | 1116 | #if 0 |
diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index 64d9b2136ff6..419777a832ee 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c | |||
| @@ -2060,12 +2060,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev, | |||
| 2060 | goto fail_irq; | 2060 | goto fail_irq; |
| 2061 | } | 2061 | } |
| 2062 | 2062 | ||
| 2063 | if (!pci_enable_msi(pci_dev)) | 2063 | err = request_irq(pci_dev->irq, cx23885_irq, |
| 2064 | err = request_irq(pci_dev->irq, cx23885_irq, | 2064 | IRQF_SHARED | IRQF_DISABLED, dev->name, dev); |
| 2065 | IRQF_DISABLED, dev->name, dev); | ||
| 2066 | else | ||
| 2067 | err = request_irq(pci_dev->irq, cx23885_irq, | ||
| 2068 | IRQF_SHARED | IRQF_DISABLED, dev->name, dev); | ||
| 2069 | if (err < 0) { | 2065 | if (err < 0) { |
| 2070 | printk(KERN_ERR "%s: can't get IRQ %d\n", | 2066 | printk(KERN_ERR "%s: can't get IRQ %d\n", |
| 2071 | dev->name, pci_dev->irq); | 2067 | dev->name, pci_dev->irq); |
| @@ -2114,7 +2110,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev) | |||
| 2114 | 2110 | ||
| 2115 | /* unregister stuff */ | 2111 | /* unregister stuff */ |
| 2116 | free_irq(pci_dev->irq, dev); | 2112 | free_irq(pci_dev->irq, dev); |
| 2117 | pci_disable_msi(pci_dev); | ||
| 2118 | 2113 | ||
| 2119 | cx23885_dev_unregister(dev); | 2114 | cx23885_dev_unregister(dev); |
| 2120 | v4l2_device_unregister(v4l2_dev); | 2115 | v4l2_device_unregister(v4l2_dev); |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index cfa9f7efe93d..a03945ab9f08 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
| @@ -714,10 +714,19 @@ static int tuner_remove(struct i2c_client *client) | |||
| 714 | * returns 0. | 714 | * returns 0. |
| 715 | * This function is needed for boards that have a separate tuner for | 715 | * This function is needed for boards that have a separate tuner for |
| 716 | * radio (like devices with tea5767). | 716 | * radio (like devices with tea5767). |
| 717 | * NOTE: mt20xx uses V4L2_TUNER_DIGITAL_TV and calls set_tv_freq to | ||
| 718 | * select a TV frequency. So, t_mode = T_ANALOG_TV could actually | ||
| 719 | * be used to represent a Digital TV too. | ||
| 717 | */ | 720 | */ |
| 718 | static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode) | 721 | static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode) |
| 719 | { | 722 | { |
| 720 | if ((1 << mode & t->mode_mask) == 0) | 723 | int t_mode; |
| 724 | if (mode == V4L2_TUNER_RADIO) | ||
| 725 | t_mode = T_RADIO; | ||
| 726 | else | ||
| 727 | t_mode = T_ANALOG_TV; | ||
| 728 | |||
| 729 | if ((t_mode & t->mode_mask) == 0) | ||
| 721 | return -EINVAL; | 730 | return -EINVAL; |
| 722 | 731 | ||
| 723 | return 0; | 732 | return 0; |
| @@ -984,7 +993,7 @@ static void tuner_status(struct dvb_frontend *fe) | |||
| 984 | case V4L2_TUNER_RADIO: | 993 | case V4L2_TUNER_RADIO: |
| 985 | p = "radio"; | 994 | p = "radio"; |
| 986 | break; | 995 | break; |
| 987 | case V4L2_TUNER_DIGITAL_TV: | 996 | case V4L2_TUNER_DIGITAL_TV: /* Used by mt20xx */ |
| 988 | p = "digital TV"; | 997 | p = "digital TV"; |
| 989 | break; | 998 | break; |
| 990 | case V4L2_TUNER_ANALOG_TV: | 999 | case V4L2_TUNER_ANALOG_TV: |
| @@ -1135,9 +1144,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt) | |||
| 1135 | return 0; | 1144 | return 0; |
| 1136 | if (vt->type == t->mode && analog_ops->get_afc) | 1145 | if (vt->type == t->mode && analog_ops->get_afc) |
| 1137 | vt->afc = analog_ops->get_afc(&t->fe); | 1146 | vt->afc = analog_ops->get_afc(&t->fe); |
| 1138 | if (vt->type == V4L2_TUNER_ANALOG_TV) | 1147 | if (t->mode != V4L2_TUNER_RADIO) { |
| 1139 | vt->capability |= V4L2_TUNER_CAP_NORM; | 1148 | vt->capability |= V4L2_TUNER_CAP_NORM; |
| 1140 | if (vt->type != V4L2_TUNER_RADIO) { | ||
| 1141 | vt->rangelow = tv_range[0] * 16; | 1149 | vt->rangelow = tv_range[0] * 16; |
| 1142 | vt->rangehigh = tv_range[1] * 16; | 1150 | vt->rangehigh = tv_range[1] * 16; |
| 1143 | return 0; | 1151 | return 0; |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 2a7e43bc796d..aa7d1d79b8c5 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
| @@ -247,12 +247,12 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 247 | return 0; | 247 | return 0; |
| 248 | 248 | ||
| 249 | /* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */ | 249 | /* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */ |
| 250 | card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE]; | ||
| 250 | if (card->csd.structure == 3) { | 251 | if (card->csd.structure == 3) { |
| 251 | int ext_csd_struct = ext_csd[EXT_CSD_STRUCTURE]; | 252 | if (card->ext_csd.raw_ext_csd_structure > 2) { |
| 252 | if (ext_csd_struct > 2) { | ||
| 253 | printk(KERN_ERR "%s: unrecognised EXT_CSD structure " | 253 | printk(KERN_ERR "%s: unrecognised EXT_CSD structure " |
| 254 | "version %d\n", mmc_hostname(card->host), | 254 | "version %d\n", mmc_hostname(card->host), |
| 255 | ext_csd_struct); | 255 | card->ext_csd.raw_ext_csd_structure); |
| 256 | err = -EINVAL; | 256 | err = -EINVAL; |
| 257 | goto out; | 257 | goto out; |
| 258 | } | 258 | } |
| @@ -266,6 +266,10 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 266 | goto out; | 266 | goto out; |
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; | ||
| 270 | card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; | ||
| 271 | card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; | ||
| 272 | card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3]; | ||
| 269 | if (card->ext_csd.rev >= 2) { | 273 | if (card->ext_csd.rev >= 2) { |
| 270 | card->ext_csd.sectors = | 274 | card->ext_csd.sectors = |
| 271 | ext_csd[EXT_CSD_SEC_CNT + 0] << 0 | | 275 | ext_csd[EXT_CSD_SEC_CNT + 0] << 0 | |
| @@ -277,7 +281,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 277 | if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) | 281 | if (card->ext_csd.sectors > (2u * 1024 * 1024 * 1024) / 512) |
| 278 | mmc_card_set_blockaddr(card); | 282 | mmc_card_set_blockaddr(card); |
| 279 | } | 283 | } |
| 280 | 284 | card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; | |
| 281 | switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { | 285 | switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { |
| 282 | case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | | 286 | case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | |
| 283 | EXT_CSD_CARD_TYPE_26: | 287 | EXT_CSD_CARD_TYPE_26: |
| @@ -307,6 +311,11 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 307 | mmc_hostname(card->host)); | 311 | mmc_hostname(card->host)); |
| 308 | } | 312 | } |
| 309 | 313 | ||
| 314 | card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; | ||
| 315 | card->ext_csd.raw_erase_timeout_mult = | ||
| 316 | ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]; | ||
| 317 | card->ext_csd.raw_hc_erase_grp_size = | ||
| 318 | ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; | ||
| 310 | if (card->ext_csd.rev >= 3) { | 319 | if (card->ext_csd.rev >= 3) { |
| 311 | u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT]; | 320 | u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT]; |
| 312 | card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; | 321 | card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; |
| @@ -334,6 +343,16 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 334 | card->ext_csd.boot_size = ext_csd[EXT_CSD_BOOT_MULT] << 17; | 343 | card->ext_csd.boot_size = ext_csd[EXT_CSD_BOOT_MULT] << 17; |
| 335 | } | 344 | } |
| 336 | 345 | ||
| 346 | card->ext_csd.raw_hc_erase_gap_size = | ||
| 347 | ext_csd[EXT_CSD_PARTITION_ATTRIBUTE]; | ||
| 348 | card->ext_csd.raw_sec_trim_mult = | ||
| 349 | ext_csd[EXT_CSD_SEC_TRIM_MULT]; | ||
| 350 | card->ext_csd.raw_sec_erase_mult = | ||
| 351 | ext_csd[EXT_CSD_SEC_ERASE_MULT]; | ||
| 352 | card->ext_csd.raw_sec_feature_support = | ||
| 353 | ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; | ||
| 354 | card->ext_csd.raw_trim_mult = | ||
| 355 | ext_csd[EXT_CSD_TRIM_MULT]; | ||
| 337 | if (card->ext_csd.rev >= 4) { | 356 | if (card->ext_csd.rev >= 4) { |
| 338 | /* | 357 | /* |
| 339 | * Enhanced area feature support -- check whether the eMMC | 358 | * Enhanced area feature support -- check whether the eMMC |
| @@ -341,7 +360,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 341 | * area offset and size to user by adding sysfs interface. | 360 | * area offset and size to user by adding sysfs interface. |
| 342 | */ | 361 | */ |
| 343 | if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && | 362 | if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && |
| 344 | (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { | 363 | (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { |
| 345 | u8 hc_erase_grp_sz = | 364 | u8 hc_erase_grp_sz = |
| 346 | ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; | 365 | ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; |
| 347 | u8 hc_wp_grp_sz = | 366 | u8 hc_wp_grp_sz = |
| @@ -401,17 +420,17 @@ static inline void mmc_free_ext_csd(u8 *ext_csd) | |||
| 401 | } | 420 | } |
| 402 | 421 | ||
| 403 | 422 | ||
| 404 | static int mmc_compare_ext_csds(struct mmc_card *card, u8 *ext_csd, | 423 | static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) |
| 405 | unsigned bus_width) | ||
| 406 | { | 424 | { |
| 407 | u8 *bw_ext_csd; | 425 | u8 *bw_ext_csd; |
| 408 | int err; | 426 | int err; |
| 409 | 427 | ||
| 428 | if (bus_width == MMC_BUS_WIDTH_1) | ||
| 429 | return 0; | ||
| 430 | |||
| 410 | err = mmc_get_ext_csd(card, &bw_ext_csd); | 431 | err = mmc_get_ext_csd(card, &bw_ext_csd); |
| 411 | if (err) | ||
| 412 | return err; | ||
| 413 | 432 | ||
| 414 | if ((ext_csd == NULL || bw_ext_csd == NULL)) { | 433 | if (err || bw_ext_csd == NULL) { |
| 415 | if (bus_width != MMC_BUS_WIDTH_1) | 434 | if (bus_width != MMC_BUS_WIDTH_1) |
| 416 | err = -EINVAL; | 435 | err = -EINVAL; |
| 417 | goto out; | 436 | goto out; |
| @@ -421,35 +440,40 @@ static int mmc_compare_ext_csds(struct mmc_card *card, u8 *ext_csd, | |||
| 421 | goto out; | 440 | goto out; |
| 422 | 441 | ||
| 423 | /* only compare read only fields */ | 442 | /* only compare read only fields */ |
| 424 | err = (!(ext_csd[EXT_CSD_PARTITION_SUPPORT] == | 443 | err = (!(card->ext_csd.raw_partition_support == |
| 425 | bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && | 444 | bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && |
| 426 | (ext_csd[EXT_CSD_ERASED_MEM_CONT] == | 445 | (card->ext_csd.raw_erased_mem_count == |
| 427 | bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && | 446 | bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && |
| 428 | (ext_csd[EXT_CSD_REV] == | 447 | (card->ext_csd.rev == |
| 429 | bw_ext_csd[EXT_CSD_REV]) && | 448 | bw_ext_csd[EXT_CSD_REV]) && |
| 430 | (ext_csd[EXT_CSD_STRUCTURE] == | 449 | (card->ext_csd.raw_ext_csd_structure == |
| 431 | bw_ext_csd[EXT_CSD_STRUCTURE]) && | 450 | bw_ext_csd[EXT_CSD_STRUCTURE]) && |
| 432 | (ext_csd[EXT_CSD_CARD_TYPE] == | 451 | (card->ext_csd.raw_card_type == |
| 433 | bw_ext_csd[EXT_CSD_CARD_TYPE]) && | 452 | bw_ext_csd[EXT_CSD_CARD_TYPE]) && |
| 434 | (ext_csd[EXT_CSD_S_A_TIMEOUT] == | 453 | (card->ext_csd.raw_s_a_timeout == |
| 435 | bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) && | 454 | bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) && |
| 436 | (ext_csd[EXT_CSD_HC_WP_GRP_SIZE] == | 455 | (card->ext_csd.raw_hc_erase_gap_size == |
| 437 | bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) && | 456 | bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) && |
| 438 | (ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] == | 457 | (card->ext_csd.raw_erase_timeout_mult == |
| 439 | bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) && | 458 | bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) && |
| 440 | (ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] == | 459 | (card->ext_csd.raw_hc_erase_grp_size == |
| 441 | bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) && | 460 | bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) && |
| 442 | (ext_csd[EXT_CSD_SEC_TRIM_MULT] == | 461 | (card->ext_csd.raw_sec_trim_mult == |
| 443 | bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) && | 462 | bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) && |
| 444 | (ext_csd[EXT_CSD_SEC_ERASE_MULT] == | 463 | (card->ext_csd.raw_sec_erase_mult == |
| 445 | bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) && | 464 | bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) && |
| 446 | (ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] == | 465 | (card->ext_csd.raw_sec_feature_support == |
| 447 | bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) && | 466 | bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) && |
| 448 | (ext_csd[EXT_CSD_TRIM_MULT] == | 467 | (card->ext_csd.raw_trim_mult == |
| 449 | bw_ext_csd[EXT_CSD_TRIM_MULT]) && | 468 | bw_ext_csd[EXT_CSD_TRIM_MULT]) && |
| 450 | memcmp(&ext_csd[EXT_CSD_SEC_CNT], | 469 | (card->ext_csd.raw_sectors[0] == |
| 451 | &bw_ext_csd[EXT_CSD_SEC_CNT], | 470 | bw_ext_csd[EXT_CSD_SEC_CNT + 0]) && |
| 452 | 4) != 0); | 471 | (card->ext_csd.raw_sectors[1] == |
| 472 | bw_ext_csd[EXT_CSD_SEC_CNT + 1]) && | ||
| 473 | (card->ext_csd.raw_sectors[2] == | ||
| 474 | bw_ext_csd[EXT_CSD_SEC_CNT + 2]) && | ||
| 475 | (card->ext_csd.raw_sectors[3] == | ||
| 476 | bw_ext_csd[EXT_CSD_SEC_CNT + 3])); | ||
| 453 | if (err) | 477 | if (err) |
| 454 | err = -EINVAL; | 478 | err = -EINVAL; |
| 455 | 479 | ||
| @@ -770,7 +794,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 770 | */ | 794 | */ |
| 771 | if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST)) | 795 | if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST)) |
| 772 | err = mmc_compare_ext_csds(card, | 796 | err = mmc_compare_ext_csds(card, |
| 773 | ext_csd, | ||
| 774 | bus_width); | 797 | bus_width); |
| 775 | else | 798 | else |
| 776 | err = mmc_bus_test(card, bus_width); | 799 | err = mmc_bus_test(card, bus_width); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index eafe44a528ac..63c22b0bb5ad 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1428,9 +1428,9 @@ out: | |||
| 1428 | return features; | 1428 | return features; |
| 1429 | } | 1429 | } |
| 1430 | 1430 | ||
| 1431 | #define BOND_VLAN_FEATURES (NETIF_F_ALL_TX_OFFLOADS | \ | 1431 | #define BOND_VLAN_FEATURES (NETIF_F_ALL_CSUM | NETIF_F_SG | \ |
| 1432 | NETIF_F_SOFT_FEATURES | \ | 1432 | NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \ |
| 1433 | NETIF_F_LRO) | 1433 | NETIF_F_HIGHDMA | NETIF_F_LRO) |
| 1434 | 1434 | ||
| 1435 | static void bond_compute_features(struct bonding *bond) | 1435 | static void bond_compute_features(struct bonding *bond) |
| 1436 | { | 1436 | { |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 2dfcc8047847..dfa55f94ba7f 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -2289,6 +2289,23 @@ static int gfar_set_mac_address(struct net_device *dev) | |||
| 2289 | return 0; | 2289 | return 0; |
| 2290 | } | 2290 | } |
| 2291 | 2291 | ||
| 2292 | /* Check if rx parser should be activated */ | ||
| 2293 | void gfar_check_rx_parser_mode(struct gfar_private *priv) | ||
| 2294 | { | ||
| 2295 | struct gfar __iomem *regs; | ||
| 2296 | u32 tempval; | ||
| 2297 | |||
| 2298 | regs = priv->gfargrp[0].regs; | ||
| 2299 | |||
| 2300 | tempval = gfar_read(®s->rctrl); | ||
| 2301 | /* If parse is no longer required, then disable parser */ | ||
| 2302 | if (tempval & RCTRL_REQ_PARSER) | ||
| 2303 | tempval |= RCTRL_PRSDEP_INIT; | ||
| 2304 | else | ||
| 2305 | tempval &= ~RCTRL_PRSDEP_INIT; | ||
| 2306 | gfar_write(®s->rctrl, tempval); | ||
| 2307 | } | ||
| 2308 | |||
| 2292 | 2309 | ||
| 2293 | /* Enables and disables VLAN insertion/extraction */ | 2310 | /* Enables and disables VLAN insertion/extraction */ |
| 2294 | static void gfar_vlan_rx_register(struct net_device *dev, | 2311 | static void gfar_vlan_rx_register(struct net_device *dev, |
| @@ -2325,12 +2342,9 @@ static void gfar_vlan_rx_register(struct net_device *dev, | |||
| 2325 | /* Disable VLAN tag extraction */ | 2342 | /* Disable VLAN tag extraction */ |
| 2326 | tempval = gfar_read(®s->rctrl); | 2343 | tempval = gfar_read(®s->rctrl); |
| 2327 | tempval &= ~RCTRL_VLEX; | 2344 | tempval &= ~RCTRL_VLEX; |
| 2328 | /* If parse is no longer required, then disable parser */ | ||
| 2329 | if (tempval & RCTRL_REQ_PARSER) | ||
| 2330 | tempval |= RCTRL_PRSDEP_INIT; | ||
| 2331 | else | ||
| 2332 | tempval &= ~RCTRL_PRSDEP_INIT; | ||
| 2333 | gfar_write(®s->rctrl, tempval); | 2345 | gfar_write(®s->rctrl, tempval); |
| 2346 | |||
| 2347 | gfar_check_rx_parser_mode(priv); | ||
| 2334 | } | 2348 | } |
| 2335 | 2349 | ||
| 2336 | gfar_change_mtu(dev, dev->mtu); | 2350 | gfar_change_mtu(dev, dev->mtu); |
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index ba36dc7a3435..440e69d8beff 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
| @@ -274,7 +274,7 @@ extern const char gfar_driver_version[]; | |||
| 274 | #define RCTRL_PROM 0x00000008 | 274 | #define RCTRL_PROM 0x00000008 |
| 275 | #define RCTRL_EMEN 0x00000002 | 275 | #define RCTRL_EMEN 0x00000002 |
| 276 | #define RCTRL_REQ_PARSER (RCTRL_VLEX | RCTRL_IPCSEN | \ | 276 | #define RCTRL_REQ_PARSER (RCTRL_VLEX | RCTRL_IPCSEN | \ |
| 277 | RCTRL_TUCSEN) | 277 | RCTRL_TUCSEN | RCTRL_FILREN) |
| 278 | #define RCTRL_CHECKSUMMING (RCTRL_IPCSEN | RCTRL_TUCSEN | \ | 278 | #define RCTRL_CHECKSUMMING (RCTRL_IPCSEN | RCTRL_TUCSEN | \ |
| 279 | RCTRL_PRSDEP_INIT) | 279 | RCTRL_PRSDEP_INIT) |
| 280 | #define RCTRL_EXTHASH (RCTRL_GHTX) | 280 | #define RCTRL_EXTHASH (RCTRL_GHTX) |
| @@ -1156,6 +1156,7 @@ extern void gfar_configure_coalescing(struct gfar_private *priv, | |||
| 1156 | unsigned long tx_mask, unsigned long rx_mask); | 1156 | unsigned long tx_mask, unsigned long rx_mask); |
| 1157 | void gfar_init_sysfs(struct net_device *dev); | 1157 | void gfar_init_sysfs(struct net_device *dev); |
| 1158 | int gfar_set_features(struct net_device *dev, u32 features); | 1158 | int gfar_set_features(struct net_device *dev, u32 features); |
| 1159 | extern void gfar_check_rx_parser_mode(struct gfar_private *priv); | ||
| 1159 | 1160 | ||
| 1160 | extern const struct ethtool_ops gfar_ethtool_ops; | 1161 | extern const struct ethtool_ops gfar_ethtool_ops; |
| 1161 | 1162 | ||
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index 8f8b65af9ed5..60f46bc2bf64 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
| @@ -140,7 +140,7 @@ MODULE_LICENSE("GPL"); | |||
| 140 | module_param(mtu, int, 0); | 140 | module_param(mtu, int, 0); |
| 141 | module_param(debug, int, 0); | 141 | module_param(debug, int, 0); |
| 142 | module_param(rx_copybreak, int, 0); | 142 | module_param(rx_copybreak, int, 0); |
| 143 | module_param(dspcfg_workaround, int, 1); | 143 | module_param(dspcfg_workaround, int, 0); |
| 144 | module_param_array(options, int, NULL, 0); | 144 | module_param_array(options, int, NULL, 0); |
| 145 | module_param_array(full_duplex, int, NULL, 0); | 145 | module_param_array(full_duplex, int, NULL, 0); |
| 146 | MODULE_PARM_DESC(mtu, "DP8381x MTU (all boards)"); | 146 | MODULE_PARM_DESC(mtu, "DP8381x MTU (all boards)"); |
| @@ -2028,8 +2028,8 @@ static void drain_rx(struct net_device *dev) | |||
| 2028 | np->rx_ring[i].cmd_status = 0; | 2028 | np->rx_ring[i].cmd_status = 0; |
| 2029 | np->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ | 2029 | np->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ |
| 2030 | if (np->rx_skbuff[i]) { | 2030 | if (np->rx_skbuff[i]) { |
| 2031 | pci_unmap_single(np->pci_dev, | 2031 | pci_unmap_single(np->pci_dev, np->rx_dma[i], |
| 2032 | np->rx_dma[i], buflen, | 2032 | buflen + NATSEMI_PADDING, |
| 2033 | PCI_DMA_FROMDEVICE); | 2033 | PCI_DMA_FROMDEVICE); |
| 2034 | dev_kfree_skb(np->rx_skbuff[i]); | 2034 | dev_kfree_skb(np->rx_skbuff[i]); |
| 2035 | } | 2035 | } |
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 718879b35b7d..bc9a4bb31980 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
| @@ -348,8 +348,9 @@ static int pppoe_device_event(struct notifier_block *this, | |||
| 348 | 348 | ||
| 349 | /* Only look at sockets that are using this specific device. */ | 349 | /* Only look at sockets that are using this specific device. */ |
| 350 | switch (event) { | 350 | switch (event) { |
| 351 | case NETDEV_CHANGEADDR: | ||
| 351 | case NETDEV_CHANGEMTU: | 352 | case NETDEV_CHANGEMTU: |
| 352 | /* A change in mtu is a bad thing, requiring | 353 | /* A change in mtu or address is a bad thing, requiring |
| 353 | * LCP re-negotiation. | 354 | * LCP re-negotiation. |
| 354 | */ | 355 | */ |
| 355 | 356 | ||
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 200a363c3bf5..0ffec4608441 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
| @@ -677,9 +677,11 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id) | |||
| 677 | if (status & RX_FIFO_FULL) | 677 | if (status & RX_FIFO_FULL) |
| 678 | dev->stats.rx_fifo_errors++; | 678 | dev->stats.rx_fifo_errors++; |
| 679 | 679 | ||
| 680 | /* Mask off RX interrupt */ | 680 | if (likely(napi_schedule_prep(&lp->napi))) { |
| 681 | misr &= ~RX_INTS; | 681 | /* Mask off RX interrupt */ |
| 682 | napi_schedule(&lp->napi); | 682 | misr &= ~RX_INTS; |
| 683 | __napi_schedule(&lp->napi); | ||
| 684 | } | ||
| 683 | } | 685 | } |
| 684 | 686 | ||
| 685 | /* TX interrupt request */ | 687 | /* TX interrupt request */ |
diff --git a/drivers/net/slip.c b/drivers/net/slip.c index 8ec1a9a0bb9a..2f110fb30daa 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c | |||
| @@ -182,11 +182,11 @@ static int sl_alloc_bufs(struct slip *sl, int mtu) | |||
| 182 | #ifdef SL_INCLUDE_CSLIP | 182 | #ifdef SL_INCLUDE_CSLIP |
| 183 | cbuff = xchg(&sl->cbuff, cbuff); | 183 | cbuff = xchg(&sl->cbuff, cbuff); |
| 184 | slcomp = xchg(&sl->slcomp, slcomp); | 184 | slcomp = xchg(&sl->slcomp, slcomp); |
| 185 | #endif | ||
| 185 | #ifdef CONFIG_SLIP_MODE_SLIP6 | 186 | #ifdef CONFIG_SLIP_MODE_SLIP6 |
| 186 | sl->xdata = 0; | 187 | sl->xdata = 0; |
| 187 | sl->xbits = 0; | 188 | sl->xbits = 0; |
| 188 | #endif | 189 | #endif |
| 189 | #endif | ||
| 190 | spin_unlock_bh(&sl->lock); | 190 | spin_unlock_bh(&sl->lock); |
| 191 | err = 0; | 191 | err = 0; |
| 192 | 192 | ||
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 468512731966..9a21ca3873fc 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c | |||
| @@ -879,7 +879,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db) | |||
| 879 | txptr = db->tx_remove_ptr; | 879 | txptr = db->tx_remove_ptr; |
| 880 | while(db->tx_packet_cnt) { | 880 | while(db->tx_packet_cnt) { |
| 881 | tdes0 = le32_to_cpu(txptr->tdes0); | 881 | tdes0 = le32_to_cpu(txptr->tdes0); |
| 882 | pr_debug("tdes0=%x\n", tdes0); | ||
| 883 | if (tdes0 & 0x80000000) | 882 | if (tdes0 & 0x80000000) |
| 884 | break; | 883 | break; |
| 885 | 884 | ||
| @@ -889,7 +888,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db) | |||
| 889 | 888 | ||
| 890 | /* Transmit statistic counter */ | 889 | /* Transmit statistic counter */ |
| 891 | if ( tdes0 != 0x7fffffff ) { | 890 | if ( tdes0 != 0x7fffffff ) { |
| 892 | pr_debug("tdes0=%x\n", tdes0); | ||
| 893 | dev->stats.collisions += (tdes0 >> 3) & 0xf; | 891 | dev->stats.collisions += (tdes0 >> 3) & 0xf; |
| 894 | dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff; | 892 | dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff; |
| 895 | if (tdes0 & TDES0_ERR_MASK) { | 893 | if (tdes0 & TDES0_ERR_MASK) { |
| @@ -986,7 +984,6 @@ static void dmfe_rx_packet(struct DEVICE *dev, struct dmfe_board_info * db) | |||
| 986 | /* error summary bit check */ | 984 | /* error summary bit check */ |
| 987 | if (rdes0 & 0x8000) { | 985 | if (rdes0 & 0x8000) { |
| 988 | /* This is a error packet */ | 986 | /* This is a error packet */ |
| 989 | pr_debug("rdes0: %x\n", rdes0); | ||
| 990 | dev->stats.rx_errors++; | 987 | dev->stats.rx_errors++; |
| 991 | if (rdes0 & 1) | 988 | if (rdes0 & 1) |
| 992 | dev->stats.rx_fifo_errors++; | 989 | dev->stats.rx_fifo_errors++; |
| @@ -1638,7 +1635,6 @@ static u8 dmfe_sense_speed(struct dmfe_board_info * db) | |||
| 1638 | else /* DM9102/DM9102A */ | 1635 | else /* DM9102/DM9102A */ |
| 1639 | phy_mode = phy_read(db->ioaddr, | 1636 | phy_mode = phy_read(db->ioaddr, |
| 1640 | db->phy_addr, 17, db->chip_id) & 0xf000; | 1637 | db->phy_addr, 17, db->chip_id) & 0xf000; |
| 1641 | pr_debug("Phy_mode %x\n", phy_mode); | ||
| 1642 | switch (phy_mode) { | 1638 | switch (phy_mode) { |
| 1643 | case 0x1000: db->op_mode = DMFE_10MHF; break; | 1639 | case 0x1000: db->op_mode = DMFE_10MHF; break; |
| 1644 | case 0x2000: db->op_mode = DMFE_10MFD; break; | 1640 | case 0x2000: db->op_mode = DMFE_10MFD; break; |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 387ca43f26f4..304fe78ff60e 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
| @@ -2421,10 +2421,8 @@ static void hso_free_net_device(struct hso_device *hso_dev) | |||
| 2421 | 2421 | ||
| 2422 | remove_net_device(hso_net->parent); | 2422 | remove_net_device(hso_net->parent); |
| 2423 | 2423 | ||
| 2424 | if (hso_net->net) { | 2424 | if (hso_net->net) |
| 2425 | unregister_netdev(hso_net->net); | 2425 | unregister_netdev(hso_net->net); |
| 2426 | free_netdev(hso_net->net); | ||
| 2427 | } | ||
| 2428 | 2426 | ||
| 2429 | /* start freeing */ | 2427 | /* start freeing */ |
| 2430 | for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) { | 2428 | for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) { |
| @@ -2436,6 +2434,9 @@ static void hso_free_net_device(struct hso_device *hso_dev) | |||
| 2436 | kfree(hso_net->mux_bulk_tx_buf); | 2434 | kfree(hso_net->mux_bulk_tx_buf); |
| 2437 | hso_net->mux_bulk_tx_buf = NULL; | 2435 | hso_net->mux_bulk_tx_buf = NULL; |
| 2438 | 2436 | ||
| 2437 | if (hso_net->net) | ||
| 2438 | free_netdev(hso_net->net); | ||
| 2439 | |||
| 2439 | kfree(hso_dev); | 2440 | kfree(hso_dev); |
| 2440 | } | 2441 | } |
| 2441 | 2442 | ||
diff --git a/drivers/net/wireless/ath/ath5k/pci.c b/drivers/net/wireless/ath/ath5k/pci.c index 296c316a8341..f2c0c236392f 100644 --- a/drivers/net/wireless/ath/ath5k/pci.c +++ b/drivers/net/wireless/ath/ath5k/pci.c | |||
| @@ -297,7 +297,9 @@ ath5k_pci_remove(struct pci_dev *pdev) | |||
| 297 | #ifdef CONFIG_PM_SLEEP | 297 | #ifdef CONFIG_PM_SLEEP |
| 298 | static int ath5k_pci_suspend(struct device *dev) | 298 | static int ath5k_pci_suspend(struct device *dev) |
| 299 | { | 299 | { |
| 300 | struct ath5k_softc *sc = pci_get_drvdata(to_pci_dev(dev)); | 300 | struct pci_dev *pdev = to_pci_dev(dev); |
| 301 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | ||
| 302 | struct ath5k_softc *sc = hw->priv; | ||
| 301 | 303 | ||
| 302 | ath5k_led_off(sc); | 304 | ath5k_led_off(sc); |
| 303 | return 0; | 305 | return 0; |
| @@ -306,7 +308,8 @@ static int ath5k_pci_suspend(struct device *dev) | |||
| 306 | static int ath5k_pci_resume(struct device *dev) | 308 | static int ath5k_pci_resume(struct device *dev) |
| 307 | { | 309 | { |
| 308 | struct pci_dev *pdev = to_pci_dev(dev); | 310 | struct pci_dev *pdev = to_pci_dev(dev); |
| 309 | struct ath5k_softc *sc = pci_get_drvdata(pdev); | 311 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); |
| 312 | struct ath5k_softc *sc = hw->priv; | ||
| 310 | 313 | ||
| 311 | /* | 314 | /* |
| 312 | * Suspend/Resume resets the PCI configuration space, so we have to | 315 | * Suspend/Resume resets the PCI configuration space, so we have to |
diff --git a/drivers/net/wireless/ath/ath5k/sysfs.c b/drivers/net/wireless/ath/ath5k/sysfs.c index 929c68cdf8ab..a073cdce1f15 100644 --- a/drivers/net/wireless/ath/ath5k/sysfs.c +++ b/drivers/net/wireless/ath/ath5k/sysfs.c | |||
| @@ -10,7 +10,8 @@ static ssize_t ath5k_attr_show_##name(struct device *dev, \ | |||
| 10 | struct device_attribute *attr, \ | 10 | struct device_attribute *attr, \ |
| 11 | char *buf) \ | 11 | char *buf) \ |
| 12 | { \ | 12 | { \ |
| 13 | struct ath5k_softc *sc = dev_get_drvdata(dev); \ | 13 | struct ieee80211_hw *hw = dev_get_drvdata(dev); \ |
| 14 | struct ath5k_softc *sc = hw->priv; \ | ||
| 14 | return snprintf(buf, PAGE_SIZE, "%d\n", get); \ | 15 | return snprintf(buf, PAGE_SIZE, "%d\n", get); \ |
| 15 | } \ | 16 | } \ |
| 16 | \ | 17 | \ |
| @@ -18,7 +19,8 @@ static ssize_t ath5k_attr_store_##name(struct device *dev, \ | |||
| 18 | struct device_attribute *attr, \ | 19 | struct device_attribute *attr, \ |
| 19 | const char *buf, size_t count) \ | 20 | const char *buf, size_t count) \ |
| 20 | { \ | 21 | { \ |
| 21 | struct ath5k_softc *sc = dev_get_drvdata(dev); \ | 22 | struct ieee80211_hw *hw = dev_get_drvdata(dev); \ |
| 23 | struct ath5k_softc *sc = hw->priv; \ | ||
| 22 | int val; \ | 24 | int val; \ |
| 23 | \ | 25 | \ |
| 24 | val = (int)simple_strtoul(buf, NULL, 10); \ | 26 | val = (int)simple_strtoul(buf, NULL, 10); \ |
| @@ -33,7 +35,8 @@ static ssize_t ath5k_attr_show_##name(struct device *dev, \ | |||
| 33 | struct device_attribute *attr, \ | 35 | struct device_attribute *attr, \ |
| 34 | char *buf) \ | 36 | char *buf) \ |
| 35 | { \ | 37 | { \ |
| 36 | struct ath5k_softc *sc = dev_get_drvdata(dev); \ | 38 | struct ieee80211_hw *hw = dev_get_drvdata(dev); \ |
| 39 | struct ath5k_softc *sc = hw->priv; \ | ||
| 37 | return snprintf(buf, PAGE_SIZE, "%d\n", get); \ | 40 | return snprintf(buf, PAGE_SIZE, "%d\n", get); \ |
| 38 | } \ | 41 | } \ |
| 39 | static DEVICE_ATTR(name, S_IRUGO, ath5k_attr_show_##name, NULL) | 42 | static DEVICE_ATTR(name, S_IRUGO, ath5k_attr_show_##name, NULL) |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 3779b8977d47..33443bcaa8d9 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -671,7 +671,8 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
| 671 | * TODO - this could be improved to be dependent on the rate. | 671 | * TODO - this could be improved to be dependent on the rate. |
| 672 | * The hardware can keep up at lower rates, but not higher rates | 672 | * The hardware can keep up at lower rates, but not higher rates |
| 673 | */ | 673 | */ |
| 674 | if (fi->keyix != ATH9K_TXKEYIX_INVALID) | 674 | if ((fi->keyix != ATH9K_TXKEYIX_INVALID) && |
| 675 | !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) | ||
| 675 | ndelim += ATH_AGGR_ENCRYPTDELIM; | 676 | ndelim += ATH_AGGR_ENCRYPTDELIM; |
| 676 | 677 | ||
| 677 | /* | 678 | /* |
diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index 2fb53d067512..333b69ef2ae2 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c | |||
| @@ -112,6 +112,8 @@ static struct usb_device_id carl9170_usb_ids[] = { | |||
| 112 | { USB_DEVICE(0x04bb, 0x093f) }, | 112 | { USB_DEVICE(0x04bb, 0x093f) }, |
| 113 | /* NEC WL300NU-G */ | 113 | /* NEC WL300NU-G */ |
| 114 | { USB_DEVICE(0x0409, 0x0249) }, | 114 | { USB_DEVICE(0x0409, 0x0249) }, |
| 115 | /* NEC WL300NU-AG */ | ||
| 116 | { USB_DEVICE(0x0409, 0x02b4) }, | ||
| 115 | /* AVM FRITZ!WLAN USB Stick N */ | 117 | /* AVM FRITZ!WLAN USB Stick N */ |
| 116 | { USB_DEVICE(0x057c, 0x8401) }, | 118 | { USB_DEVICE(0x057c, 0x8401) }, |
| 117 | /* AVM FRITZ!WLAN USB Stick N 2.4 */ | 119 | /* AVM FRITZ!WLAN USB Stick N 2.4 */ |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 092e342c19df..942f7a3969a7 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
| @@ -298,6 +298,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | |||
| 298 | {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ | 298 | {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ |
| 299 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ | 299 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ |
| 300 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ | 300 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ |
| 301 | {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ | ||
| 301 | {RTL_USB_DEVICE(0x0Df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | 302 | {RTL_USB_DEVICE(0x0Df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ |
| 302 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ | 303 | {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ |
| 303 | /* HP - Lite-On ,8188CUS Slim Combo */ | 304 | /* HP - Lite-On ,8188CUS Slim Combo */ |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index a70fa89f76fd..220285760b68 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -110,7 +110,7 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val, | |||
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | 112 | ||
| 113 | static struct acpi_dock_ops acpiphp_dock_ops = { | 113 | static const struct acpi_dock_ops acpiphp_dock_ops = { |
| 114 | .handler = handle_hotplug_event_func, | 114 | .handler = handle_hotplug_event_func, |
| 115 | }; | 115 | }; |
| 116 | 116 | ||
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c index 2a20dabec76d..d6620ad309ce 100644 --- a/drivers/ssb/driver_pcicore.c +++ b/drivers/ssb/driver_pcicore.c | |||
| @@ -516,8 +516,17 @@ static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc) | |||
| 516 | 516 | ||
| 517 | static void ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) | 517 | static void ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) |
| 518 | { | 518 | { |
| 519 | ssb_pcicore_fix_sprom_core_index(pc); | ||
| 520 | |||
| 519 | /* Disable PCI interrupts. */ | 521 | /* Disable PCI interrupts. */ |
| 520 | ssb_write32(pc->dev, SSB_INTVEC, 0); | 522 | ssb_write32(pc->dev, SSB_INTVEC, 0); |
| 523 | |||
| 524 | /* Additional PCIe always once-executed workarounds */ | ||
| 525 | if (pc->dev->id.coreid == SSB_DEV_PCIE) { | ||
| 526 | ssb_pcicore_serdes_workaround(pc); | ||
| 527 | /* TODO: ASPM */ | ||
| 528 | /* TODO: Clock Request Update */ | ||
| 529 | } | ||
| 521 | } | 530 | } |
| 522 | 531 | ||
| 523 | void ssb_pcicore_init(struct ssb_pcicore *pc) | 532 | void ssb_pcicore_init(struct ssb_pcicore *pc) |
| @@ -529,8 +538,6 @@ void ssb_pcicore_init(struct ssb_pcicore *pc) | |||
| 529 | if (!ssb_device_is_enabled(dev)) | 538 | if (!ssb_device_is_enabled(dev)) |
| 530 | ssb_device_enable(dev, 0); | 539 | ssb_device_enable(dev, 0); |
| 531 | 540 | ||
| 532 | ssb_pcicore_fix_sprom_core_index(pc); | ||
| 533 | |||
| 534 | #ifdef CONFIG_SSB_PCICORE_HOSTMODE | 541 | #ifdef CONFIG_SSB_PCICORE_HOSTMODE |
| 535 | pc->hostmode = pcicore_is_in_hostmode(pc); | 542 | pc->hostmode = pcicore_is_in_hostmode(pc); |
| 536 | if (pc->hostmode) | 543 | if (pc->hostmode) |
| @@ -538,13 +545,6 @@ void ssb_pcicore_init(struct ssb_pcicore *pc) | |||
| 538 | #endif /* CONFIG_SSB_PCICORE_HOSTMODE */ | 545 | #endif /* CONFIG_SSB_PCICORE_HOSTMODE */ |
| 539 | if (!pc->hostmode) | 546 | if (!pc->hostmode) |
| 540 | ssb_pcicore_init_clientmode(pc); | 547 | ssb_pcicore_init_clientmode(pc); |
| 541 | |||
| 542 | /* Additional PCIe always once-executed workarounds */ | ||
| 543 | if (dev->id.coreid == SSB_DEV_PCIE) { | ||
| 544 | ssb_pcicore_serdes_workaround(pc); | ||
| 545 | /* TODO: ASPM */ | ||
| 546 | /* TODO: Clock Request Update */ | ||
| 547 | } | ||
| 548 | } | 548 | } |
| 549 | 549 | ||
| 550 | static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address) | 550 | static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address) |
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index bf7c687519ef..f7f71b2d3101 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig | |||
| @@ -14,11 +14,7 @@ menuconfig THERMAL | |||
| 14 | If you want this support, you should say Y or M here. | 14 | If you want this support, you should say Y or M here. |
| 15 | 15 | ||
| 16 | config THERMAL_HWMON | 16 | config THERMAL_HWMON |
| 17 | bool "Hardware monitoring support" | 17 | bool |
| 18 | depends on THERMAL | 18 | depends on THERMAL |
| 19 | depends on HWMON=y || HWMON=THERMAL | 19 | depends on HWMON=y || HWMON=THERMAL |
| 20 | help | 20 | default y |
| 21 | The generic thermal sysfs driver's hardware monitoring support | ||
| 22 | requires a 2.10.7/3.0.2 or later lm-sensors userspace. | ||
| 23 | |||
| 24 | Say Y if your user-space is new enough. | ||
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 0b1c82ad6805..708f8e92771a 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c | |||
| @@ -420,6 +420,29 @@ thermal_cooling_device_trip_point_show(struct device *dev, | |||
| 420 | 420 | ||
| 421 | /* hwmon sys I/F */ | 421 | /* hwmon sys I/F */ |
| 422 | #include <linux/hwmon.h> | 422 | #include <linux/hwmon.h> |
| 423 | |||
| 424 | /* thermal zone devices with the same type share one hwmon device */ | ||
| 425 | struct thermal_hwmon_device { | ||
| 426 | char type[THERMAL_NAME_LENGTH]; | ||
| 427 | struct device *device; | ||
| 428 | int count; | ||
| 429 | struct list_head tz_list; | ||
| 430 | struct list_head node; | ||
| 431 | }; | ||
| 432 | |||
| 433 | struct thermal_hwmon_attr { | ||
| 434 | struct device_attribute attr; | ||
| 435 | char name[16]; | ||
| 436 | }; | ||
| 437 | |||
| 438 | /* one temperature input for each thermal zone */ | ||
| 439 | struct thermal_hwmon_temp { | ||
| 440 | struct list_head hwmon_node; | ||
| 441 | struct thermal_zone_device *tz; | ||
| 442 | struct thermal_hwmon_attr temp_input; /* hwmon sys attr */ | ||
| 443 | struct thermal_hwmon_attr temp_crit; /* hwmon sys attr */ | ||
| 444 | }; | ||
| 445 | |||
| 423 | static LIST_HEAD(thermal_hwmon_list); | 446 | static LIST_HEAD(thermal_hwmon_list); |
| 424 | 447 | ||
| 425 | static ssize_t | 448 | static ssize_t |
| @@ -437,9 +460,10 @@ temp_input_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 437 | int ret; | 460 | int ret; |
| 438 | struct thermal_hwmon_attr *hwmon_attr | 461 | struct thermal_hwmon_attr *hwmon_attr |
| 439 | = container_of(attr, struct thermal_hwmon_attr, attr); | 462 | = container_of(attr, struct thermal_hwmon_attr, attr); |
| 440 | struct thermal_zone_device *tz | 463 | struct thermal_hwmon_temp *temp |
| 441 | = container_of(hwmon_attr, struct thermal_zone_device, | 464 | = container_of(hwmon_attr, struct thermal_hwmon_temp, |
| 442 | temp_input); | 465 | temp_input); |
| 466 | struct thermal_zone_device *tz = temp->tz; | ||
| 443 | 467 | ||
| 444 | ret = tz->ops->get_temp(tz, &temperature); | 468 | ret = tz->ops->get_temp(tz, &temperature); |
| 445 | 469 | ||
| @@ -455,9 +479,10 @@ temp_crit_show(struct device *dev, struct device_attribute *attr, | |||
| 455 | { | 479 | { |
| 456 | struct thermal_hwmon_attr *hwmon_attr | 480 | struct thermal_hwmon_attr *hwmon_attr |
| 457 | = container_of(attr, struct thermal_hwmon_attr, attr); | 481 | = container_of(attr, struct thermal_hwmon_attr, attr); |
| 458 | struct thermal_zone_device *tz | 482 | struct thermal_hwmon_temp *temp |
| 459 | = container_of(hwmon_attr, struct thermal_zone_device, | 483 | = container_of(hwmon_attr, struct thermal_hwmon_temp, |
| 460 | temp_crit); | 484 | temp_crit); |
| 485 | struct thermal_zone_device *tz = temp->tz; | ||
| 461 | long temperature; | 486 | long temperature; |
| 462 | int ret; | 487 | int ret; |
| 463 | 488 | ||
| @@ -469,22 +494,54 @@ temp_crit_show(struct device *dev, struct device_attribute *attr, | |||
| 469 | } | 494 | } |
| 470 | 495 | ||
| 471 | 496 | ||
| 472 | static int | 497 | static struct thermal_hwmon_device * |
| 473 | thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | 498 | thermal_hwmon_lookup_by_type(const struct thermal_zone_device *tz) |
| 474 | { | 499 | { |
| 475 | struct thermal_hwmon_device *hwmon; | 500 | struct thermal_hwmon_device *hwmon; |
| 476 | int new_hwmon_device = 1; | ||
| 477 | int result; | ||
| 478 | 501 | ||
| 479 | mutex_lock(&thermal_list_lock); | 502 | mutex_lock(&thermal_list_lock); |
| 480 | list_for_each_entry(hwmon, &thermal_hwmon_list, node) | 503 | list_for_each_entry(hwmon, &thermal_hwmon_list, node) |
| 481 | if (!strcmp(hwmon->type, tz->type)) { | 504 | if (!strcmp(hwmon->type, tz->type)) { |
| 482 | new_hwmon_device = 0; | ||
| 483 | mutex_unlock(&thermal_list_lock); | 505 | mutex_unlock(&thermal_list_lock); |
| 484 | goto register_sys_interface; | 506 | return hwmon; |
| 507 | } | ||
| 508 | mutex_unlock(&thermal_list_lock); | ||
| 509 | |||
| 510 | return NULL; | ||
| 511 | } | ||
| 512 | |||
| 513 | /* Find the temperature input matching a given thermal zone */ | ||
| 514 | static struct thermal_hwmon_temp * | ||
| 515 | thermal_hwmon_lookup_temp(const struct thermal_hwmon_device *hwmon, | ||
| 516 | const struct thermal_zone_device *tz) | ||
| 517 | { | ||
| 518 | struct thermal_hwmon_temp *temp; | ||
| 519 | |||
| 520 | mutex_lock(&thermal_list_lock); | ||
| 521 | list_for_each_entry(temp, &hwmon->tz_list, hwmon_node) | ||
| 522 | if (temp->tz == tz) { | ||
| 523 | mutex_unlock(&thermal_list_lock); | ||
| 524 | return temp; | ||
| 485 | } | 525 | } |
| 486 | mutex_unlock(&thermal_list_lock); | 526 | mutex_unlock(&thermal_list_lock); |
| 487 | 527 | ||
| 528 | return NULL; | ||
| 529 | } | ||
| 530 | |||
| 531 | static int | ||
| 532 | thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | ||
| 533 | { | ||
| 534 | struct thermal_hwmon_device *hwmon; | ||
| 535 | struct thermal_hwmon_temp *temp; | ||
| 536 | int new_hwmon_device = 1; | ||
| 537 | int result; | ||
| 538 | |||
| 539 | hwmon = thermal_hwmon_lookup_by_type(tz); | ||
| 540 | if (hwmon) { | ||
| 541 | new_hwmon_device = 0; | ||
| 542 | goto register_sys_interface; | ||
| 543 | } | ||
| 544 | |||
| 488 | hwmon = kzalloc(sizeof(struct thermal_hwmon_device), GFP_KERNEL); | 545 | hwmon = kzalloc(sizeof(struct thermal_hwmon_device), GFP_KERNEL); |
| 489 | if (!hwmon) | 546 | if (!hwmon) |
| 490 | return -ENOMEM; | 547 | return -ENOMEM; |
| @@ -502,30 +559,36 @@ thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | |||
| 502 | goto free_mem; | 559 | goto free_mem; |
| 503 | 560 | ||
| 504 | register_sys_interface: | 561 | register_sys_interface: |
| 505 | tz->hwmon = hwmon; | 562 | temp = kzalloc(sizeof(struct thermal_hwmon_temp), GFP_KERNEL); |
| 563 | if (!temp) { | ||
| 564 | result = -ENOMEM; | ||
| 565 | goto unregister_name; | ||
| 566 | } | ||
| 567 | |||
| 568 | temp->tz = tz; | ||
| 506 | hwmon->count++; | 569 | hwmon->count++; |
| 507 | 570 | ||
| 508 | snprintf(tz->temp_input.name, THERMAL_NAME_LENGTH, | 571 | snprintf(temp->temp_input.name, THERMAL_NAME_LENGTH, |
| 509 | "temp%d_input", hwmon->count); | 572 | "temp%d_input", hwmon->count); |
| 510 | tz->temp_input.attr.attr.name = tz->temp_input.name; | 573 | temp->temp_input.attr.attr.name = temp->temp_input.name; |
| 511 | tz->temp_input.attr.attr.mode = 0444; | 574 | temp->temp_input.attr.attr.mode = 0444; |
| 512 | tz->temp_input.attr.show = temp_input_show; | 575 | temp->temp_input.attr.show = temp_input_show; |
| 513 | sysfs_attr_init(&tz->temp_input.attr.attr); | 576 | sysfs_attr_init(&temp->temp_input.attr.attr); |
| 514 | result = device_create_file(hwmon->device, &tz->temp_input.attr); | 577 | result = device_create_file(hwmon->device, &temp->temp_input.attr); |
| 515 | if (result) | 578 | if (result) |
| 516 | goto unregister_name; | 579 | goto free_temp_mem; |
| 517 | 580 | ||
| 518 | if (tz->ops->get_crit_temp) { | 581 | if (tz->ops->get_crit_temp) { |
| 519 | unsigned long temperature; | 582 | unsigned long temperature; |
| 520 | if (!tz->ops->get_crit_temp(tz, &temperature)) { | 583 | if (!tz->ops->get_crit_temp(tz, &temperature)) { |
| 521 | snprintf(tz->temp_crit.name, THERMAL_NAME_LENGTH, | 584 | snprintf(temp->temp_crit.name, THERMAL_NAME_LENGTH, |
| 522 | "temp%d_crit", hwmon->count); | 585 | "temp%d_crit", hwmon->count); |
| 523 | tz->temp_crit.attr.attr.name = tz->temp_crit.name; | 586 | temp->temp_crit.attr.attr.name = temp->temp_crit.name; |
| 524 | tz->temp_crit.attr.attr.mode = 0444; | 587 | temp->temp_crit.attr.attr.mode = 0444; |
| 525 | tz->temp_crit.attr.show = temp_crit_show; | 588 | temp->temp_crit.attr.show = temp_crit_show; |
| 526 | sysfs_attr_init(&tz->temp_crit.attr.attr); | 589 | sysfs_attr_init(&temp->temp_crit.attr.attr); |
| 527 | result = device_create_file(hwmon->device, | 590 | result = device_create_file(hwmon->device, |
| 528 | &tz->temp_crit.attr); | 591 | &temp->temp_crit.attr); |
| 529 | if (result) | 592 | if (result) |
| 530 | goto unregister_input; | 593 | goto unregister_input; |
| 531 | } | 594 | } |
| @@ -534,13 +597,15 @@ thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | |||
| 534 | mutex_lock(&thermal_list_lock); | 597 | mutex_lock(&thermal_list_lock); |
| 535 | if (new_hwmon_device) | 598 | if (new_hwmon_device) |
| 536 | list_add_tail(&hwmon->node, &thermal_hwmon_list); | 599 | list_add_tail(&hwmon->node, &thermal_hwmon_list); |
| 537 | list_add_tail(&tz->hwmon_node, &hwmon->tz_list); | 600 | list_add_tail(&temp->hwmon_node, &hwmon->tz_list); |
| 538 | mutex_unlock(&thermal_list_lock); | 601 | mutex_unlock(&thermal_list_lock); |
| 539 | 602 | ||
| 540 | return 0; | 603 | return 0; |
| 541 | 604 | ||
| 542 | unregister_input: | 605 | unregister_input: |
| 543 | device_remove_file(hwmon->device, &tz->temp_input.attr); | 606 | device_remove_file(hwmon->device, &temp->temp_input.attr); |
| 607 | free_temp_mem: | ||
| 608 | kfree(temp); | ||
| 544 | unregister_name: | 609 | unregister_name: |
| 545 | if (new_hwmon_device) { | 610 | if (new_hwmon_device) { |
| 546 | device_remove_file(hwmon->device, &dev_attr_name); | 611 | device_remove_file(hwmon->device, &dev_attr_name); |
| @@ -556,15 +621,30 @@ thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | |||
| 556 | static void | 621 | static void |
| 557 | thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz) | 622 | thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz) |
| 558 | { | 623 | { |
| 559 | struct thermal_hwmon_device *hwmon = tz->hwmon; | 624 | struct thermal_hwmon_device *hwmon; |
| 625 | struct thermal_hwmon_temp *temp; | ||
| 626 | |||
| 627 | hwmon = thermal_hwmon_lookup_by_type(tz); | ||
| 628 | if (unlikely(!hwmon)) { | ||
| 629 | /* Should never happen... */ | ||
| 630 | dev_dbg(&tz->device, "hwmon device lookup failed!\n"); | ||
| 631 | return; | ||
| 632 | } | ||
| 633 | |||
| 634 | temp = thermal_hwmon_lookup_temp(hwmon, tz); | ||
| 635 | if (unlikely(!temp)) { | ||
| 636 | /* Should never happen... */ | ||
| 637 | dev_dbg(&tz->device, "temperature input lookup failed!\n"); | ||
| 638 | return; | ||
| 639 | } | ||
| 560 | 640 | ||
| 561 | tz->hwmon = NULL; | 641 | device_remove_file(hwmon->device, &temp->temp_input.attr); |
| 562 | device_remove_file(hwmon->device, &tz->temp_input.attr); | ||
| 563 | if (tz->ops->get_crit_temp) | 642 | if (tz->ops->get_crit_temp) |
| 564 | device_remove_file(hwmon->device, &tz->temp_crit.attr); | 643 | device_remove_file(hwmon->device, &temp->temp_crit.attr); |
| 565 | 644 | ||
| 566 | mutex_lock(&thermal_list_lock); | 645 | mutex_lock(&thermal_list_lock); |
| 567 | list_del(&tz->hwmon_node); | 646 | list_del(&temp->hwmon_node); |
| 647 | kfree(temp); | ||
| 568 | if (!list_empty(&hwmon->tz_list)) { | 648 | if (!list_empty(&hwmon->tz_list)) { |
| 569 | mutex_unlock(&thermal_list_lock); | 649 | mutex_unlock(&thermal_list_lock); |
| 570 | return; | 650 | return; |
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 9536d386bb38..21d816e9dfa5 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig | |||
| @@ -599,8 +599,7 @@ config IT87_WDT | |||
| 599 | 599 | ||
| 600 | config HP_WATCHDOG | 600 | config HP_WATCHDOG |
| 601 | tristate "HP ProLiant iLO2+ Hardware Watchdog Timer" | 601 | tristate "HP ProLiant iLO2+ Hardware Watchdog Timer" |
| 602 | depends on X86 | 602 | depends on X86 && PCI |
| 603 | default m | ||
| 604 | help | 603 | help |
| 605 | A software monitoring watchdog and NMI sourcing driver. This driver | 604 | A software monitoring watchdog and NMI sourcing driver. This driver |
| 606 | will detect lockups and provide a stack trace. This is a driver that | 605 | will detect lockups and provide a stack trace. This is a driver that |
