Changeset 27755


Ignore:
Timestamp:
2011-07-24T16:40:31+02:00 (7 years ago)
Author:
nbd
Message:

rtl8366_smi: implement a function for detecting whether the attached switch is RTL8366S or RTL8366RB

Location:
trunk/target/linux/generic/files
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c

    r24943 r27755  
    1616#include <linux/spinlock.h> 
    1717#include <linux/skbuff.h> 
     18#include <linux/rtl8366.h> 
    1819 
    1920#ifdef CONFIG_RTL8366S_PHY_DEBUG_FS 
     
    11611162EXPORT_SYMBOL_GPL(rtl8366_smi_alloc); 
    11621163 
     1164static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name) 
     1165{ 
     1166        int err; 
     1167 
     1168        err = gpio_request(smi->gpio_sda, name); 
     1169        if (err) { 
     1170                printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n", 
     1171                        smi->gpio_sda, err); 
     1172                goto err_out; 
     1173        } 
     1174 
     1175        err = gpio_request(smi->gpio_sck, name); 
     1176        if (err) { 
     1177                printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n", 
     1178                        smi->gpio_sck, err); 
     1179                goto err_free_sda; 
     1180        } 
     1181 
     1182        spin_lock_init(&smi->lock); 
     1183        return 0; 
     1184 
     1185 err_free_sda: 
     1186        gpio_free(smi->gpio_sda); 
     1187 err_out: 
     1188        return err; 
     1189} 
     1190 
     1191static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi) 
     1192{ 
     1193        gpio_free(smi->gpio_sck); 
     1194        gpio_free(smi->gpio_sda); 
     1195} 
     1196 
     1197enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata) 
     1198{ 
     1199        static struct rtl8366_smi smi; 
     1200        enum rtl8366_type type = RTL8366_TYPE_UNKNOWN; 
     1201        u32 reg = 0; 
     1202 
     1203        memset(&smi, 0, sizeof(smi)); 
     1204        smi.gpio_sda = pdata->gpio_sda; 
     1205        smi.gpio_sck = pdata->gpio_sck; 
     1206 
     1207        if (__rtl8366_smi_init(&smi, "rtl8366")) 
     1208                goto out; 
     1209 
     1210        if (rtl8366_smi_read_reg(&smi, 0x5c, &reg)) 
     1211                goto cleanup; 
     1212 
     1213        switch(reg) { 
     1214        case 0x6027: 
     1215                printk("Found an RTL8366S switch\n"); 
     1216                type = RTL8366_TYPE_S; 
     1217                break; 
     1218        case 0x5937: 
     1219                printk("Found an RTL8366RB switch\n"); 
     1220                type = RTL8366_TYPE_RB; 
     1221                break; 
     1222        default: 
     1223                printk("Found an Unknown RTL8366 switch (id=0x%04x)\n", reg); 
     1224                break; 
     1225        } 
     1226 
     1227cleanup: 
     1228        __rtl8366_smi_cleanup(&smi); 
     1229out: 
     1230        return type; 
     1231} 
     1232 
    11631233int rtl8366_smi_init(struct rtl8366_smi *smi) 
    11641234{ 
     
    11681238                return -EINVAL; 
    11691239 
    1170         err = gpio_request(smi->gpio_sda, dev_name(smi->parent)); 
    1171         if (err) { 
    1172                 dev_err(smi->parent, "gpio_request failed for %u, err=%d\n", 
    1173                         smi->gpio_sda, err); 
     1240        err = __rtl8366_smi_init(smi, dev_name(smi->parent)); 
     1241        if (err) 
    11741242                goto err_out; 
    1175         } 
    1176  
    1177         err = gpio_request(smi->gpio_sck, dev_name(smi->parent)); 
    1178         if (err) { 
    1179                 dev_err(smi->parent, "gpio_request failed for %u, err=%d\n", 
    1180                         smi->gpio_sck, err); 
    1181                 goto err_free_sda; 
    1182         } 
    11831243 
    11841244        spin_lock_init(&smi->lock); 
     
    12191279 
    12201280 err_free_sck: 
    1221         gpio_free(smi->gpio_sck); 
    1222  err_free_sda: 
    1223         gpio_free(smi->gpio_sda); 
     1281        __rtl8366_smi_cleanup(smi); 
    12241282 err_out: 
    12251283        return err; 
  • trunk/target/linux/generic/files/include/linux/rtl8366.h

    r27754 r27755  
    1616#define RTL8366RB_DRIVER_NAME   "rtl8366rb" 
    1717 
     18enum rtl8366_type { 
     19        RTL8366_TYPE_UNKNOWN, 
     20        RTL8366_TYPE_S, 
     21        RTL8366_TYPE_RB, 
     22}; 
     23 
    1824struct rtl8366_initval { 
    1925        unsigned        reg; 
     
    2834}; 
    2935 
     36enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata); 
     37 
    3038#endif /*  _RTL8366_H */ 
Note: See TracChangeset for help on using the changeset viewer.