generic: rtl8366: add rtl8366_smi_write_reg_noack helper
After issuing a soft reset on the RT8366{S,RB}
switch, waiting for the last acknowlegement fails
in rtl8366_smi_write_reg. Add a _noack version of
the function and use that for issuing a soft reset.
SVN-Revision: 29844
			
			
This commit is contained in:
		@@ -157,6 +157,12 @@ static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
 | 
			
		||||
	return rtl8366_smi_wait_for_ack(smi);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int rtl8366_smi_write_byte_noack(struct rtl8366_smi *smi, u8 data)
 | 
			
		||||
{
 | 
			
		||||
	rtl8366_smi_write_bits(smi, data, 8);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
 | 
			
		||||
{
 | 
			
		||||
	u32 t;
 | 
			
		||||
@@ -228,7 +234,8 @@ int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(rtl8366_smi_read_reg);
 | 
			
		||||
 | 
			
		||||
int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
 | 
			
		||||
static int __rtl8366_smi_write_reg(struct rtl8366_smi *smi,
 | 
			
		||||
				   u32 addr, u32 data, bool ack)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	int ret;
 | 
			
		||||
@@ -258,7 +265,10 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	/* write DATA[15:8] */
 | 
			
		||||
	if (ack)
 | 
			
		||||
		ret = rtl8366_smi_write_byte(smi, data >> 8);
 | 
			
		||||
	else
 | 
			
		||||
		ret = rtl8366_smi_write_byte_noack(smi, data >> 8);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
@@ -270,8 +280,19 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
 | 
			
		||||
{
 | 
			
		||||
	return __rtl8366_smi_write_reg(smi, addr, data, true);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg);
 | 
			
		||||
 | 
			
		||||
int rtl8366_smi_write_reg_noack(struct rtl8366_smi *smi, u32 addr, u32 data)
 | 
			
		||||
{
 | 
			
		||||
	return __rtl8366_smi_write_reg(smi, addr, data, false);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg_noack);
 | 
			
		||||
 | 
			
		||||
int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
 | 
			
		||||
{
 | 
			
		||||
	u32 t;
 | 
			
		||||
 
 | 
			
		||||
@@ -103,6 +103,7 @@ struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent);
 | 
			
		||||
int rtl8366_smi_init(struct rtl8366_smi *smi);
 | 
			
		||||
void rtl8366_smi_cleanup(struct rtl8366_smi *smi);
 | 
			
		||||
int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data);
 | 
			
		||||
int rtl8366_smi_write_reg_noack(struct rtl8366_smi *smi, u32 addr, u32 data);
 | 
			
		||||
int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data);
 | 
			
		||||
int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -246,7 +246,7 @@ static int rtl8366rb_reset_chip(struct rtl8366_smi *smi)
 | 
			
		||||
	int timeout = 10;
 | 
			
		||||
	u32 data;
 | 
			
		||||
 | 
			
		||||
	rtl8366_smi_write_reg(smi, RTL8366RB_RESET_CTRL_REG,
 | 
			
		||||
	rtl8366_smi_write_reg_noack(smi, RTL8366RB_RESET_CTRL_REG,
 | 
			
		||||
			 	    RTL8366RB_CHIP_CTRL_RESET_HW);
 | 
			
		||||
	do {
 | 
			
		||||
		msleep(1);
 | 
			
		||||
 
 | 
			
		||||
@@ -229,7 +229,7 @@ static int rtl8366s_reset_chip(struct rtl8366_smi *smi)
 | 
			
		||||
	int timeout = 10;
 | 
			
		||||
	u32 data;
 | 
			
		||||
 | 
			
		||||
	rtl8366_smi_write_reg(smi, RTL8366S_RESET_CTRL_REG,
 | 
			
		||||
	rtl8366_smi_write_reg_noack(smi, RTL8366S_RESET_CTRL_REG,
 | 
			
		||||
				    RTL8366S_CHIP_CTRL_RESET_HW);
 | 
			
		||||
	do {
 | 
			
		||||
		msleep(1);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user