| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of the flashrom project. | 2 * This file is part of the flashrom project. |
| 3 * | 3 * |
| 4 * Copyright (C) 2010 Google, Inc. | 4 * Copyright (C) 2010 Google, Inc. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * | 9 * |
| 10 * Redistributions of source code must retain the above copyright | 10 * Redistributions of source code must retain the above copyright |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 * 0x21 is used for EC F/W changed. Goto EC F/W, wait system reboot. | 533 * 0x21 is used for EC F/W changed. Goto EC F/W, wait system reboot. |
| 534 * 0x22 is used for EC F/W changed, Goto EC Watchdog reset. */ | 534 * 0x22 is used for EC F/W changed, Goto EC Watchdog reset. */ |
| 535 int ExitFlashUpdateFirmwareNoChange(void) { | 535 int ExitFlashUpdateFirmwareNoChange(void) { |
| 536 return ExitFlashUpdate(0x20); | 536 return ExitFlashUpdate(0x20); |
| 537 } | 537 } |
| 538 | 538 |
| 539 int ExitFlashUpdateFirmwareChanged(void) { | 539 int ExitFlashUpdateFirmwareChanged(void) { |
| 540 return ExitFlashUpdate(0x21); | 540 return ExitFlashUpdate(0x21); |
| 541 } | 541 } |
| 542 | 542 |
| 543 static void wpce775x_shutdown(void *data) |
| 544 { |
| 545 if (spi_controller != SPI_CONTROLLER_WPCE775X) |
| 546 return; |
| 547 |
| 548 msg_pdbg("%s(): firmware %s\n", __func__, |
| 549 firmware_changed ? "changed" : "not changed"); |
| 550 |
| 551 msg_pdbg("%s: in_flash_update_mode: %d\n", __func__, in_flash_update_mod
e); |
| 552 if (in_flash_update_mode) { |
| 553 if (firmware_changed) |
| 554 ExitFlashUpdateFirmwareChanged(); |
| 555 else |
| 556 ExitFlashUpdateFirmwareNoChange(); |
| 557 |
| 558 in_flash_update_mode = 0; |
| 559 } |
| 560 |
| 561 if (initflash_cfg) |
| 562 free(initflash_cfg); |
| 563 else |
| 564 msg_perr("%s(): No initflash_cfg to free?!?\n", __func__); |
| 565 } |
| 566 |
| 543 int wpce775x_spi_common_init(void) | 567 int wpce775x_spi_common_init(void) |
| 544 { | 568 { |
| 545 uint16_t sio_port; | 569 uint16_t sio_port; |
| 546 uint8_t srid; | 570 uint8_t srid; |
| 547 uint8_t fwh_id; | 571 uint8_t fwh_id; |
| 548 | 572 |
| 549 msg_pdbg("%s(): entered\n", __func__); | 573 msg_pdbg("%s(): entered\n", __func__); |
| 550 | 574 |
| 551 /* detect if wpce775x exists */ | 575 /* detect if wpce775x exists */ |
| 552 if (nuvoton_get_sio_index(&sio_port) < 0) { | 576 if (nuvoton_get_sio_index(&sio_port) < 0) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 | 609 |
| 586 if (get_fwh_id(&fwh_id) < 0) { | 610 if (get_fwh_id(&fwh_id) < 0) { |
| 587 msg_pdbg("Cannot get fwh_id value.\n"); | 611 msg_pdbg("Cannot get fwh_id value.\n"); |
| 588 return 0; | 612 return 0; |
| 589 } | 613 } |
| 590 msg_pdbg("get fwh_id: 0x%02x\n", fwh_id); | 614 msg_pdbg("get fwh_id: 0x%02x\n", fwh_id); |
| 591 | 615 |
| 592 /* TODO: set fwh_idsel of chipset. | 616 /* TODO: set fwh_idsel of chipset. |
| 593 Currently, we employ "-p internal:fwh_idsel=0x0000223e". */ | 617 Currently, we employ "-p internal:fwh_idsel=0x0000223e". */ |
| 594 | 618 |
| 619 if (register_shutdown(wpce775x_shutdown, NULL)) |
| 620 return 1; |
| 621 |
| 595 /* Enter flash update mode unconditionally. This is required even | 622 /* Enter flash update mode unconditionally. This is required even |
| 596 for reading. */ | 623 for reading. */ |
| 597 if (EnterFlashUpdate()) return 1; | 624 if (EnterFlashUpdate()) return 1; |
| 598 | 625 |
| 599 spi_controller = SPI_CONTROLLER_WPCE775X; | 626 spi_controller = SPI_CONTROLLER_WPCE775X; |
| 600 msg_pdbg("%s(): successfully initialized wpce775x\n", __func__); | 627 msg_pdbg("%s(): successfully initialized wpce775x\n", __func__); |
| 601 return 0; | 628 return 0; |
| 602 | |
| 603 } | |
| 604 | |
| 605 int wpce775x_shutdown(void) | |
| 606 { | |
| 607 if (spi_controller != SPI_CONTROLLER_WPCE775X) | |
| 608 return 0; | |
| 609 | |
| 610 msg_pdbg("%s(): firmware %s\n", __func__, | |
| 611 firmware_changed ? "changed" : "not changed"); | |
| 612 | |
| 613 msg_pdbg("%s: in_flash_update_mode: %d\n", __func__, in_flash_update_mod
e); | |
| 614 if (in_flash_update_mode) { | |
| 615 if (firmware_changed) | |
| 616 ExitFlashUpdateFirmwareChanged(); | |
| 617 else | |
| 618 ExitFlashUpdateFirmwareNoChange(); | |
| 619 | |
| 620 in_flash_update_mode = 0; | |
| 621 } | |
| 622 | |
| 623 if (initflash_cfg) | |
| 624 free(initflash_cfg); | |
| 625 else | |
| 626 msg_perr("%s(): No initflash_cfg to free?!?\n", __func__); | |
| 627 | |
| 628 return 0; | |
| 629 } | 629 } |
| 630 | 630 |
| 631 /* Called by internal_init() */ | 631 /* Called by internal_init() */ |
| 632 int wpce775x_probe_spi_flash(const char *name) | 632 int wpce775x_probe_spi_flash(const char *name) |
| 633 { | 633 { |
| 634 int ret; | 634 int ret; |
| 635 | 635 |
| 636 if (!(buses_supported & CHIP_BUSTYPE_FWH)) { | 636 if (!(buses_supported & CHIP_BUSTYPE_FWH)) { |
| 637 msg_pdbg("%s():%d buses not support FWH\n", __func__, __LINE__); | 637 msg_pdbg("%s():%d buses not support FWH\n", __func__, __LINE__); |
| 638 return 1; | 638 return 1; |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 /* unsupported opcodes */ | 976 /* unsupported opcodes */ |
| 977 msg_pdbg("unsupported SPI opcode: %02x\n", opcode); | 977 msg_pdbg("unsupported SPI opcode: %02x\n", opcode); |
| 978 rc = 1; | 978 rc = 1; |
| 979 break; | 979 break; |
| 980 } | 980 } |
| 981 | 981 |
| 982 msg_pdbg("%s: opcode: 0x%02x\n", __func__, opcode); | 982 msg_pdbg("%s: opcode: 0x%02x\n", __func__, opcode); |
| 983 return rc; | 983 return rc; |
| 984 } | 984 } |
| 985 #endif | 985 #endif |
| OLD | NEW |