Changeset 35579


Ignore:
Timestamp:
2013-02-13T17:02:41+01:00 (5 years ago)
Author:
hauke
Message:

switch: reset switch before using it.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/switch/src/switch-robo.c

    r35578 r35579  
    3030#include <linux/mii.h> 
    3131#include <linux/delay.h> 
     32#include <linux/gpio.h> 
    3233#include <asm/uaccess.h> 
    3334 
     
    7475        bool is_5350; 
    7576        u8 gmii;                        /* gigabit mii */ 
     77        int gpio_robo_reset; 
     78        int gpio_lanports_enable; 
    7679        struct ifreq ifr; 
    7780        struct net_device *dev; 
     
    275278} 
    276279 
     280#ifdef CONFIG_BCM47XX 
     281static int get_gpio_pin(const char *name) 
     282{ 
     283        int i, err; 
     284        char nvram_var[10]; 
     285        char buf[30]; 
     286 
     287        for (i = 0; i < 16; i++) { 
     288                err = snprintf(nvram_var, sizeof(nvram_var), "gpio%i", i); 
     289                if (err <= 0) 
     290                        continue; 
     291                err = bcm47xx_nvram_getenv(nvram_var, buf, sizeof(buf)); 
     292                if (err <= 0) 
     293                        continue; 
     294                if (!strcmp(name, buf)) 
     295                        return i; 
     296        } 
     297        return -1; 
     298} 
     299#endif 
     300 
    277301static int robo_probe(char *devname) 
    278302{ 
     
    318342        } 
    319343 
     344#ifdef CONFIG_BCM47XX 
     345        robo.gpio_lanports_enable = get_gpio_pin("lanports_enable"); 
     346        if (robo.gpio_lanports_enable >= 0) { 
     347                err = gpio_request(robo.gpio_lanports_enable, "lanports_enable"); 
     348                if (err) { 
     349                        printk(KERN_ERR PFX "error (%i) requesting lanports_enable gpio (%i)\n", 
     350                               err, robo.gpio_lanports_enable); 
     351                        goto err_put; 
     352                } 
     353                gpio_direction_output(robo.gpio_lanports_enable, 1); 
     354                mdelay(5); 
     355        } 
     356 
     357        robo.gpio_robo_reset = get_gpio_pin("robo_reset"); 
     358        if (robo.gpio_robo_reset >= 0) { 
     359                err = gpio_request(robo.gpio_robo_reset, "robo_reset"); 
     360                if (err) { 
     361                        printk(KERN_ERR PFX "error (%i) requesting robo_reset gpio (%i)\n", 
     362                               err, robo.gpio_robo_reset); 
     363                        goto err_gpio_robo; 
     364                } 
     365                gpio_set_value(robo.gpio_robo_reset, 0); 
     366                gpio_direction_output(robo.gpio_robo_reset, 1); 
     367                gpio_set_value(robo.gpio_robo_reset, 0); 
     368                mdelay(50); 
     369 
     370                gpio_set_value(robo.gpio_robo_reset, 1); 
     371                mdelay(20); 
     372        } else { 
     373                // TODO: reset the internal robo switch 
     374        } 
     375#endif 
     376 
    320377        phyid = mdio_read(ROBO_PHY_ADDR, 0x2) | 
    321378                (mdio_read(ROBO_PHY_ADDR, 0x3) << 16); 
     
    324381                printk(KERN_ERR PFX "No Robo switch in managed mode found, phy_id = 0x%08x\n", phyid); 
    325382                err = -ENODEV; 
    326                 goto err_put; 
     383                goto err_gpio_lanports; 
    327384        } 
    328385 
     
    341398        err = robo_switch_enable(); 
    342399        if (err) 
    343                 goto err_put; 
     400                goto err_gpio_lanports; 
    344401 
    345402        printk(KERN_INFO PFX "found a 5%s%x!%s at %s\n", robo.devid & 0xff00 ? "" : "3", robo.devid, 
     
    347404 
    348405        return 0; 
     406 
     407err_gpio_lanports: 
     408        if (robo.gpio_lanports_enable >= 0) 
     409                gpio_free(robo.gpio_lanports_enable); 
     410err_gpio_robo: 
     411        if (robo.gpio_robo_reset >= 0) 
     412                gpio_free(robo.gpio_robo_reset); 
    349413err_put: 
    350414        dev_put(robo.dev); 
     
    681745        if (robo.dev) 
    682746                dev_put(robo.dev); 
     747        if (robo.gpio_robo_reset >= 0) 
     748                gpio_free(robo.gpio_robo_reset); 
     749        if (robo.gpio_lanports_enable >= 0) 
     750                gpio_free(robo.gpio_lanports_enable); 
    683751        kfree(robo.device); 
    684752} 
Note: See TracChangeset for help on using the changeset viewer.