USB: fixed bug in usbsevseg using USB autosuspend incorrectly
This patch fixes a bug with the usbsevseg driver which assumed that USB autosuspend will always be used. Signed-off-by: Harrison Metzger <harrisonmetz@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
cdc04834ce
commit
4c1f5c88aa
|
@ -49,6 +49,7 @@ struct usb_sevsegdev {
|
||||||
u16 textlength;
|
u16 textlength;
|
||||||
|
|
||||||
u8 shadow_power; /* for PM */
|
u8 shadow_power; /* for PM */
|
||||||
|
u8 has_interface_pm;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* sysfs_streq can't replace this completely
|
/* sysfs_streq can't replace this completely
|
||||||
|
@ -68,12 +69,16 @@ static void update_display_powered(struct usb_sevsegdev *mydev)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!mydev->shadow_power && mydev->powered) {
|
if (mydev->powered && !mydev->has_interface_pm) {
|
||||||
rc = usb_autopm_get_interface(mydev->intf);
|
rc = usb_autopm_get_interface(mydev->intf);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return;
|
return;
|
||||||
|
mydev->has_interface_pm = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mydev->shadow_power != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
rc = usb_control_msg(mydev->udev,
|
rc = usb_control_msg(mydev->udev,
|
||||||
usb_sndctrlpipe(mydev->udev, 0),
|
usb_sndctrlpipe(mydev->udev, 0),
|
||||||
0x12,
|
0x12,
|
||||||
|
@ -86,8 +91,10 @@ static void update_display_powered(struct usb_sevsegdev *mydev)
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
dev_dbg(&mydev->udev->dev, "power retval = %d\n", rc);
|
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);
|
usb_autopm_put_interface(mydev->intf);
|
||||||
|
mydev->has_interface_pm = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_display_mode(struct usb_sevsegdev *mydev)
|
static void update_display_mode(struct usb_sevsegdev *mydev)
|
||||||
|
@ -351,6 +358,10 @@ static int sevseg_probe(struct usb_interface *interface,
|
||||||
mydev->intf = interface;
|
mydev->intf = interface;
|
||||||
usb_set_intfdata(interface, mydev);
|
usb_set_intfdata(interface, mydev);
|
||||||
|
|
||||||
|
/* PM */
|
||||||
|
mydev->shadow_power = 1; /* currently active */
|
||||||
|
mydev->has_interface_pm = 0; /* have not issued autopm_get */
|
||||||
|
|
||||||
/*set defaults */
|
/*set defaults */
|
||||||
mydev->textmode = 0x02; /* ascii mode */
|
mydev->textmode = 0x02; /* ascii mode */
|
||||||
mydev->mode_msb = 0x06; /* 6 characters */
|
mydev->mode_msb = 0x06; /* 6 characters */
|
||||||
|
|
Loading…
Reference in a new issue