mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-25 10:45:11 +02:00
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. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@29844 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
6e809dd8f1
commit
e2bae31171
@ -157,6 +157,12 @@ static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
|
|||||||
return rtl8366_smi_wait_for_ack(smi);
|
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)
|
static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
|
||||||
{
|
{
|
||||||
u32 t;
|
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);
|
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;
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
@ -258,7 +265,10 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* write DATA[15:8] */
|
/* write DATA[15:8] */
|
||||||
|
if (ack)
|
||||||
ret = rtl8366_smi_write_byte(smi, data >> 8);
|
ret = rtl8366_smi_write_byte(smi, data >> 8);
|
||||||
|
else
|
||||||
|
ret = rtl8366_smi_write_byte_noack(smi, data >> 8);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -270,8 +280,19 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
|
|||||||
|
|
||||||
return ret;
|
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);
|
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)
|
int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
|
||||||
{
|
{
|
||||||
u32 t;
|
u32 t;
|
||||||
|
@ -103,6 +103,7 @@ struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent);
|
|||||||
int rtl8366_smi_init(struct rtl8366_smi *smi);
|
int rtl8366_smi_init(struct rtl8366_smi *smi);
|
||||||
void rtl8366_smi_cleanup(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(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_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data);
|
||||||
int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, 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;
|
int timeout = 10;
|
||||||
u32 data;
|
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);
|
RTL8366RB_CHIP_CTRL_RESET_HW);
|
||||||
do {
|
do {
|
||||||
msleep(1);
|
msleep(1);
|
||||||
|
@ -229,7 +229,7 @@ static int rtl8366s_reset_chip(struct rtl8366_smi *smi)
|
|||||||
int timeout = 10;
|
int timeout = 10;
|
||||||
u32 data;
|
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);
|
RTL8366S_CHIP_CTRL_RESET_HW);
|
||||||
do {
|
do {
|
||||||
msleep(1);
|
msleep(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user