#include <linux/usb/msm_hsusb.h>
#include <linux/usb/msm_hsusb_hw.h>
#include <linux/regulator/consumer.h>
+#include <linux/msm-bus.h>
#define MSM_USB_BASE (motg->regs)
#define DRIVER_NAME "msm_otg"
return NOTIFY_DONE;
}
+static void msm_otg_bus_vote(struct msm_otg *motg, enum usb_bus_vote vote)
+{
+ int ret;
+
+ if (motg->bus_perf_client) {
+ ret = msm_bus_scale_client_update_request(
+ motg->bus_perf_client, vote);
+ if (ret)
+ dev_err(motg->phy.dev, "%s: Failed to vote (%d)\n"
+ "for bus bw %d\n", __func__, vote, ret);
+ }
+}
+
static int msm_otg_probe(struct platform_device *pdev)
{
struct regulator_bulk_data regs[2];
goto disable_ldo;
}
+ motg->pdata->bus_scale_table = msm_bus_cl_get_pdata(pdev);
+ if (!motg->pdata->bus_scale_table)
+ dev_dbg(&pdev->dev, "bus scaling is disabled\n");
+ else {
+ motg->bus_perf_client =
+ msm_bus_scale_register_client(motg->pdata->bus_scale_table);
+ if (!motg->bus_perf_client)
+ dev_err(motg->phy.dev, "%s: Failed to register BUS\n"
+ "scaling client!!\n", __func__);
+ }
+ /* Hack to max out usb performace */
+ msm_otg_bus_vote(motg, USB_MAX_PERF_VOTE);
+
platform_set_drvdata(pdev, motg);
device_init_wakeup(&pdev->dev, 1);
usb_remove_phy(phy);
disable_irq(motg->irq);
+ msm_bus_scale_unregister_client(motg->bus_perf_client);
/*
* Put PHY in low power mode.
USB_CDP_CHARGER,
};
+/**
+ * Requested USB votes for BUS bandwidth
+ *
+ * USB_NO_PERF_VOTE BUS Vote for inactive USB session or disconnect
+ * USB_MAX_PERF_VOTE Maximum BUS bandwidth vote
+ * USB_MIN_PERF_VOTE Minimum BUS bandwidth vote (for some hw same as NO_PERF)
+ *
+ */
+enum usb_bus_vote {
+ USB_NO_PERF_VOTE = 0,
+ USB_MAX_PERF_VOTE,
+ USB_MIN_PERF_VOTE,
+};
+
/**
* struct msm_otg_platform_data - platform device data
* for msm_otg driver.
int phy_init_sz;
void (*vbus_power)(bool on);
unsigned power_budget;
+ struct msm_bus_scale_pdata *bus_scale_table;
enum usb_dr_mode mode;
enum otg_control_type otg_control;
enum msm_usb_phy_type phy_type;
struct gpio_desc *switch_gpio;
struct notifier_block reboot;
+ uint32_t bus_perf_client;
};
#endif