diff options
Diffstat (limited to 'drivers/usb/misc/usbsevseg.c')
| -rw-r--r-- | drivers/usb/misc/usbsevseg.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/usb/misc/usbsevseg.c b/drivers/usb/misc/usbsevseg.c index a9555cb901a..de8ef945b53 100644 --- a/drivers/usb/misc/usbsevseg.c +++ b/drivers/usb/misc/usbsevseg.c @@ -49,6 +49,7 @@ struct usb_sevsegdev {  	u16 textlength;  	u8 shadow_power; /* for PM */ +	u8 has_interface_pm;  };  /* sysfs_streq can't replace this completely @@ -68,12 +69,16 @@ static void update_display_powered(struct usb_sevsegdev *mydev)  {  	int rc; -	if (!mydev->shadow_power && mydev->powered) { +	if (mydev->powered && !mydev->has_interface_pm) {  		rc = usb_autopm_get_interface(mydev->intf);  		if (rc < 0)  			return; +		mydev->has_interface_pm = 1;  	} +	if (mydev->shadow_power != 1) +		return; +  	rc = usb_control_msg(mydev->udev,  			usb_sndctrlpipe(mydev->udev, 0),  			0x12, @@ -86,8 +91,10 @@ static void update_display_powered(struct usb_sevsegdev *mydev)  	if (rc < 0)  		dev_dbg(&mydev->udev->dev, "power retval = %d\n", rc); -	if (mydev->shadow_power && !mydev->powered) +	if (!mydev->powered && mydev->has_interface_pm) {  		usb_autopm_put_interface(mydev->intf); +		mydev->has_interface_pm = 0; +	}  }  static void update_display_mode(struct usb_sevsegdev *mydev) @@ -351,6 +358,10 @@ static int sevseg_probe(struct usb_interface *interface,  	mydev->intf = interface;  	usb_set_intfdata(interface, mydev); +	/* PM */ +	mydev->shadow_power = 1; /* currently active */ +	mydev->has_interface_pm = 0; /* have not issued autopm_get */ +  	/*set defaults */  	mydev->textmode = 0x02; /* ascii mode */  	mydev->mode_msb = 0x06; /* 6 characters */  |