+#ifdef CONFIG_ARM64
#include "usbdev_rk.h"
#include "dwc_otg_regs.h"
/* Turn off differential receiver in suspend mode */
uoc_write(UOC_HIWORD_UPDATE(0, 1, 2), 0x798);
- /* Set disconnect detection trigger point to 600mv */
- uoc_write(UOC_HIWORD_UPDATE(0, 0xf, 11), 0x79c);
+ /* Set disconnect detection trigger point to 625mv */
+ uoc_write(UOC_HIWORD_UPDATE(0x9, 0xf, 11), 0x79c);
/* other haredware init,include:
* DRV_VBUS GPIO init */
reset_control_deassert(rst_otg_c);
reset_control_deassert(rst_otg_h);
break;
-
+ case RST_CHN_HALT:
+ /* PHY reset */
+ uoc_write(UOC_HIWORD_UPDATE(0x1, 0x3, 0), 0x700);
+ reset_control_assert(rst_otg_p);
+ udelay(15);
+ uoc_write(UOC_HIWORD_UPDATE(0x2, 0x3, 0), 0x700);
+ udelay(1500);
+ reset_control_deassert(rst_otg_p);
+ udelay(2);
+ break;
default:
break;
}
struct dwc_otg_platform_data *usbpdata = pdata;
struct clk *ahbclk, *phyclk;
- ahbclk = devm_clk_get(usbpdata->dev, "hclk_otg");
+ ahbclk = devm_clk_get(usbpdata->dev, "otg");
if (IS_ERR(ahbclk)) {
- dev_err(usbpdata->dev, "Failed to get hclk_usb0\n");
+ dev_err(usbpdata->dev, "Failed to get otg clk\n");
return;
}
- phyclk = devm_clk_get(usbpdata->dev, "clk_usbphy0");
+ phyclk = devm_clk_get(usbpdata->dev, "sclk_otgphy0");
if (IS_ERR(phyclk)) {
- dev_err(usbpdata->dev, "Failed to get clk_usbphy0\n");
+ dev_err(usbpdata->dev, "Failed to get sclk_otgphy0\n");
return;
}
static int usb20otg_get_status(int id)
{
int ret = -1;
- u32 soc_status15 = uoc_read(0x4bc);
+ u32 soc_status15 = uoc_read(control_usb->grf_otg_st_offset);
switch (id) {
case USB_STATUS_BVABLID:
/* disable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 0);
+
+ rk_battery_charger_detect_cb(USB_OTG_POWER_OFF);
} else if (1 == enable) {
/* enable otg_drv power */
if (gpio_is_valid(control_usb->otg_gpios->gpio))
gpio_set_value(control_usb->otg_gpios->gpio, 1);
+
+ if (!usb20otg_get_status(USB_STATUS_BVABLID))
+ rk_battery_charger_detect_cb(USB_OTG_POWER_ON);
}
}
{
/* Turn off differential receiver in suspend mode */
uoc_write(UOC_HIWORD_UPDATE(0, 1, 2), 0x7b8);
- /* Set disconnect detection trigger point to 600mv */
- uoc_write(UOC_HIWORD_UPDATE(1, 0xf, 11), 0x7bc);
+ /* Set disconnect detection trigger point to 625mv */
+ uoc_write(UOC_HIWORD_UPDATE(0x9, 0xf, 11), 0x7bc);
/* other haredware init,include:
* DRV_VBUS GPIO init */
struct clk *hclk_usb_peri;
struct regmap *grf;
int gpio, ret = 0;
+ u32 offset;
control_usb = devm_kzalloc(dev, sizeof(*control_usb), GFP_KERNEL);
if (!control_usb) {
}
control_usb->grf = grf;
+ /* get the reg offset of GRF_SOC_STATUS for USB2.0 OTG */
+ if (of_property_read_u32(np, "grf-offset", &offset)) {
+ dev_err(&pdev->dev, "missing reg property in node %s\n",
+ np->name);
+ return -EINVAL;
+ }
+ control_usb->grf_otg_st_offset = offset;
+
/* Init Vbus-drv GPIOs */
control_usb->host_gpios =
devm_kzalloc(&pdev->dev, sizeof(struct gpio), GFP_KERNEL);
/* Init hclk_usb_peri */
hclk_usb_peri = devm_clk_get(&pdev->dev, "hclk_usb_peri");
if (IS_ERR(hclk_usb_peri)) {
- dev_err(&pdev->dev, "Failed to get hclk_usb_peri\n");
- return PTR_ERR(hclk_usb_peri);
+ dev_info(&pdev->dev, "no hclk_usb_peri clk specified\n");
+ hclk_usb_peri = NULL;
}
control_usb->hclk_usb_peri = hclk_usb_peri;
clk_prepare_enable(hclk_usb_peri);
MODULE_AUTHOR("RockChip Inc.");
MODULE_DESCRIPTION("RockChip Control Module USB Driver");
MODULE_LICENSE("GPL v2");
+#endif