Commit 4a96b4fc authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Stefan Richter
Browse files

firewire: ohci: add a function for reading PHY registers



Move the register reading code from ohci_update_phy_reg() into
a function which can be used separately.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent ca658b1e
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -460,22 +460,36 @@ static inline void flush_writes(const struct fw_ohci *ohci)
	reg_read(ohci, OHCI1394_Version);
}

static int ohci_update_phy_reg(struct fw_card *card, int addr,
			       int clear_bits, int set_bits)
static int read_phy_reg(struct fw_card *card, int addr, u32 *value)
{
	struct fw_ohci *ohci = fw_ohci(card);
	u32 val, old;
	u32 val;

	reg_write(ohci, OHCI1394_PhyControl, OHCI1394_PhyControl_Read(addr));
	flush_writes(ohci);
	msleep(2);
	val = reg_read(ohci, OHCI1394_PhyControl);
	if ((val & OHCI1394_PhyControl_ReadDone) == 0) {
		fw_error("failed to set phy reg bits.\n");
		fw_error("failed to read phy reg bits\n");
		return -EBUSY;
	}

	old = OHCI1394_PhyControl_ReadData(val);
	*value = OHCI1394_PhyControl_ReadData(val);

	return 0;
}

static int ohci_update_phy_reg(struct fw_card *card, int addr,
			       int clear_bits, int set_bits)
{
	struct fw_ohci *ohci = fw_ohci(card);
	u32 old;
	int err;

	err = read_phy_reg(card, addr, &old);
	if (err < 0)
		return err;

	old = (old & ~clear_bits) | set_bits;
	reg_write(ohci, OHCI1394_PhyControl,
		  OHCI1394_PhyControl_Write(addr, old));