summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2011-09-19 09:29:30 +0200
committerStefan Richter <stefanr@s5r6.in-berlin.de>2011-10-09 17:00:17 +0200
commitb810e4ae111cb8b4c0ccbbe7ff4ea0a23c671e4f (patch)
treeedc61366619baf3d63ac1fcc8f82047d5f8839d4
parent28897fb73c848eb441e54e859d0b64ad6b44d2e6 (diff)
downloadop-kernel-dev-b810e4ae111cb8b4c0ccbbe7ff4ea0a23c671e4f.zip
op-kernel-dev-b810e4ae111cb8b4c0ccbbe7ff4ea0a23c671e4f.tar.gz
firewire: ohci: optimize TSB41BA3D detection
Takes less source code and machine code, and less runtime with PHYs other than TSB41BA3D (e.g. TSB81BA3 with device ID 0x831304 which takes one instead of six read_paged_phy_reg now). Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r--drivers/firewire/ohci.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 862fdf3..399d592 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -2159,38 +2159,26 @@ static int configure_1394a_enhancements(struct fw_ohci *ohci)
return 0;
}
-#define TSB41BA3D_VID 0x00080028
-#define TSB41BA3D_PID 0x00833005
-
static int probe_tsb41ba3d(struct fw_ohci *ohci)
{
- int reg, i, vendor_id, product_id;
+ /* TI vendor ID = 0x080028, TSB41BA3D product ID = 0x833005 (sic) */
+ static const u8 id[] = { 0x08, 0x00, 0x28, 0x83, 0x30, 0x05, };
+ int reg, i;
reg = read_phy_reg(ohci, 2);
if (reg < 0)
return reg;
+ if ((reg & PHY_EXTENDED_REGISTERS) != PHY_EXTENDED_REGISTERS)
+ return 0;
- if ((reg & PHY_EXTENDED_REGISTERS) == PHY_EXTENDED_REGISTERS) {
- vendor_id = 0;
- for (i = 10; i < 13; i++) {
- reg = read_paged_phy_reg(ohci, 1, i);
- if (reg < 0)
- return reg;
- vendor_id = (vendor_id << 8) | reg;
- }
- product_id = 0;
- for (i = 13; i < 16; i++) {
- reg = read_paged_phy_reg(ohci, 1, i);
- if (reg < 0)
- return reg;
- product_id = (product_id << 8) | reg;
- }
-
- if ((vendor_id == TSB41BA3D_VID) &&
- (product_id == TSB41BA3D_PID))
- return 1;
+ for (i = ARRAY_SIZE(id) - 1; i >= 0; i--) {
+ reg = read_paged_phy_reg(ohci, 1, i + 10);
+ if (reg < 0)
+ return reg;
+ if (reg != id[i])
+ return 0;
}
- return 0;
+ return 1;
}
static int ohci_enable(struct fw_card *card,
OpenPOWER on IntegriCloud