return (struct usb_phy *)x;
}
+static int tegra_ehci_port_speed(struct ehci_hcd *ehci)
+{
+ u32 hostpc = ehci_readl(ehci, &ehci->regs->hostpc);
+ enum usb_device_speed port_speed;
+
+ switch ((hostpc >> (ehci->has_hostpc ? 25 : 26)) & 3) {
+ case 0:
+ port_speed = USB_SPEED_LOW;
+ break;
+ case 1:
+ port_speed = USB_SPEED_FULL;
+ break;
+ case 2:
+ port_speed = USB_SPEED_HIGH;
+ break;
+ default:
+ port_speed = USB_SPEED_UNKNOWN;
+ }
+ return port_speed;
+}
+
static void tegra_ehci_notify_event(struct tegra_ehci_hcd *tegra, int event)
{
tegra->transceiver->last_event = event;
struct tegra_ehci_hcd, boost_cpu_freq_work.work);
if (tegra->cpu_boost_in_work) {
tegra->boost_requested = true;
- if (tegra->boost_enable)
- pm_qos_update_request(
- &tegra->boost_cpu_freq_req,
+ if (tegra->boost_enable && (tegra_ehci_port_speed(tegra->ehci)
+ == USB_SPEED_HIGH))
+ pm_qos_update_request(&tegra->boost_cpu_freq_req,
(s32)CONFIG_TEGRA_EHCI_BOOST_CPU_FREQ * 1000);
}
}
#ifdef CONFIG_TEGRA_EHCI_BOOST_CPU_FREQ
tegra->boost_requested = true;
if (pm_qos_request_active(&tegra->boost_cpu_freq_req)
- && tegra->boost_enable)
- pm_qos_update_request(&tegra->boost_cpu_freq_req,
- (s32)CONFIG_TEGRA_EHCI_BOOST_CPU_FREQ * 1000);
- tegra->cpu_boost_in_work = false;
+ && tegra->boost_enable) {
+ schedule_delayed_work(&tegra->boost_cpu_freq_work, 4000);
+ tegra->cpu_boost_in_work = true;
+ }
#endif