@ -20,6 +20,7 @@
# include <linux/delay.h>
# include <linux/export.h>
# include <linux/gpio.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/switch.h>
@ -451,10 +452,30 @@ static int b53_apply(struct b53_device *dev)
return 0 ;
}
void b53_switch_reset_gpio ( struct b53_device * dev )
{
int gpio = dev - > reset_gpio ;
if ( gpio < 0 )
return ;
gpio_set_value ( gpio , 0 ) ;
gpio_direction_output ( gpio , 1 ) ;
gpio_set_value ( gpio , 0 ) ;
mdelay ( 50 ) ;
gpio_set_value ( gpio , 1 ) ;
mdelay ( 20 ) ;
dev - > current_page = 0xff ;
}
static int b53_switch_reset ( struct b53_device * dev )
{
u8 mgmt ;
b53_switch_reset_gpio ( dev ) ;
b53_read8 ( dev , B53_CTRL_PAGE , B53_SWITCH_MODE , & mgmt ) ;
if ( ! ( mgmt & SM_SW_FWD_EN ) ) {
@ -1114,6 +1135,7 @@ int b53_switch_init(struct b53_device *dev)
{
struct switch_dev * sw_dev = & dev - > sw_dev ;
unsigned i ;
int ret ;
for ( i = 0 ; i < ARRAY_SIZE ( b53_switch_chips ) ; i + + ) {
const struct b53_chip_data * chip = & b53_switch_chips [ i ] ;
@ -1192,6 +1214,13 @@ int b53_switch_init(struct b53_device *dev)
if ( ! dev - > buf )
return - ENOMEM ;
dev - > reset_gpio = b53_switch_get_reset_gpio ( dev ) ;
if ( dev - > reset_gpio > = 0 ) {
ret = devm_gpio_request ( dev - > dev , dev - > reset_gpio , " robo_reset " ) ;
if ( ret )
return ret ;
}
return b53_switch_reset ( dev ) ;
}