X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/d43b4effd9097b9139ad66f5e3f25320d67de283..ab881f8a9d0933f1064532287a4797f6070d6f39:/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c index f0a92bcd7..e48ca99ce 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -24,11 +24,10 @@ #include "rtl8366_smi.h" #define RTL8366_SMI_ACK_RETRY_COUNT 5 -#define RTL8366_SMI_CLK_DELAY 10 /* nsec */ static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi) { - ndelay(RTL8366_SMI_CLK_DELAY); + ndelay(smi->clk_delay); } static void rtl8366_smi_start(struct rtl8366_smi *smi) @@ -158,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; @@ -198,7 +203,7 @@ int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data) rtl8366_smi_start(smi); /* send READ command */ - ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x01); + ret = rtl8366_smi_write_byte(smi, smi->cmd_read); if (ret) goto out; @@ -229,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; @@ -239,7 +245,7 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data) rtl8366_smi_start(smi); /* send WRITE command */ - ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x00); + ret = rtl8366_smi_write_byte(smi, smi->cmd_write); if (ret) goto out; @@ -259,7 +265,10 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data) goto out; /* write DATA[15:8] */ - ret = rtl8366_smi_write_byte(smi, data >> 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; @@ -271,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; @@ -1205,6 +1225,9 @@ enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata) memset(&smi, 0, sizeof(smi)); smi.gpio_sda = pdata->gpio_sda; smi.gpio_sck = pdata->gpio_sck; + smi.clk_delay = 10; + smi.cmd_read = 0xa9; + smi.cmd_write = 0xa8; if (__rtl8366_smi_init(&smi, "rtl8366")) goto out;