|
@@ -37,8 +37,6 @@
|
|
|
|
|
|
#include "nuvoton-cir.h"
|
|
|
|
|
|
-static char *chip_id = "w836x7hg";
|
|
|
-
|
|
|
/* write val to config reg */
|
|
|
static inline void nvt_cr_write(struct nvt_dev *nvt, u8 val, u8 reg)
|
|
|
{
|
|
@@ -233,6 +231,8 @@ static int nvt_hw_detect(struct nvt_dev *nvt)
|
|
|
unsigned long flags;
|
|
|
u8 chip_major, chip_minor;
|
|
|
int ret = 0;
|
|
|
+ char chip_id[12];
|
|
|
+ bool chip_unknown = false;
|
|
|
|
|
|
nvt_efm_enable(nvt);
|
|
|
|
|
@@ -246,15 +246,39 @@ static int nvt_hw_detect(struct nvt_dev *nvt)
|
|
|
}
|
|
|
|
|
|
chip_minor = nvt_cr_read(nvt, CR_CHIP_ID_LO);
|
|
|
- nvt_dbg("%s: chip id: 0x%02x 0x%02x", chip_id, chip_major, chip_minor);
|
|
|
|
|
|
- if (chip_major != CHIP_ID_HIGH ||
|
|
|
- (chip_minor != CHIP_ID_LOW && chip_minor != CHIP_ID_LOW2)) {
|
|
|
- nvt_pr(KERN_ERR, "%s: unsupported chip, id: 0x%02x 0x%02x",
|
|
|
- chip_id, chip_major, chip_minor);
|
|
|
- ret = -ENODEV;
|
|
|
+ /* these are the known working chip revisions... */
|
|
|
+ switch (chip_major) {
|
|
|
+ case CHIP_ID_HIGH_667:
|
|
|
+ strcpy(chip_id, "w83667hg\0");
|
|
|
+ if (chip_minor != CHIP_ID_LOW_667)
|
|
|
+ chip_unknown = true;
|
|
|
+ break;
|
|
|
+ case CHIP_ID_HIGH_677B:
|
|
|
+ strcpy(chip_id, "w83677hg\0");
|
|
|
+ if (chip_minor != CHIP_ID_LOW_677B2 &&
|
|
|
+ chip_minor != CHIP_ID_LOW_677B3)
|
|
|
+ chip_unknown = true;
|
|
|
+ break;
|
|
|
+ case CHIP_ID_HIGH_677C:
|
|
|
+ strcpy(chip_id, "w83677hg-c\0");
|
|
|
+ if (chip_minor != CHIP_ID_LOW_677C)
|
|
|
+ chip_unknown = true;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcpy(chip_id, "w836x7hg\0");
|
|
|
+ chip_unknown = true;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
+ /* warn, but still let the driver load, if we don't know this chip */
|
|
|
+ if (chip_unknown)
|
|
|
+ nvt_pr(KERN_WARNING, "%s: unknown chip, id: 0x%02x 0x%02x, "
|
|
|
+ "it may not work...", chip_id, chip_major, chip_minor);
|
|
|
+ else
|
|
|
+ nvt_dbg("%s: chip id: 0x%02x 0x%02x",
|
|
|
+ chip_id, chip_major, chip_minor);
|
|
|
+
|
|
|
nvt_efm_disable(nvt);
|
|
|
|
|
|
spin_lock_irqsave(&nvt->nvt_lock, flags);
|