Thread (17 messages) 17 messages, 3 authors, 2018-11-20

RE: [PATCH v2 2/4] usb: chipidea: imx: add HSIC support

From: Peter Chen <hidden>
Date: 2018-11-05 18:59:51
Also in: linux-usb

 
quoted
+		}
+
+		if (data->hsic_pad_regulator) {
+			ret = regulator_enable(data->hsic_pad_regulator);
+			if (ret) {
+				dev_err(dev,
+					"Fail to enable HSIC pad regulator\n");
s/Fail/Failed
Ok.

 
   
quoted
  struct imx_usbmisc {
@@ -353,6 +369,18 @@ static int usbmisc_imx6q_init(struct imx_usbmisc_data
*data)
quoted
  	writel(reg | MX6_BM_NON_BURST_SETTING,
  			usbmisc->base + data->index * 4);

+	/* For HSIC controller */
+	if (data->hsic) {
+		reg = readl(usbmisc->base + data->index * 4);
+		writel(reg | MX6_BM_UTMI_ON_CLOCK,
+			usbmisc->base + data->index * 4);
+		reg = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET
+			+ (data->index - 2) * 4);
+		reg |= MX6_BM_HSIC_EN | MX6_BM_HSIC_CLK_ON;
+		writel(reg, usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET
+			+ (data->index - 2) * 4);
+	}
+
  	spin_unlock_irqrestore(&usbmisc->lock, flags);

  	usbmisc_imx6q_set_wakeup(data, false); @@ -360,6 +388,69 @@ static
int usbmisc_imx6q_init(struct imx_usbmisc_data *data)
  	return 0;
  }

+static int usbmisc_imx6_hsic_set_connect(struct imx_usbmisc_data
+*data) {
+	unsigned long flags;
+	u32 val, offset;
+	struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev);
+	int ret = 0;
+
+	spin_lock_irqsave(&usbmisc->lock, flags);
+	if (data->index == 2 || data->index == 3) {
+		offset = (data->index - 2) * 4;
+	} else if (data->index == 0) {
+		/*
+		 * For SoCs like i.MX7D and later, each USB controller has
+		 * its own non-core register region. For SoCs before i.MX7D,
+		 * the first USB controller is non-HSIC controller.
+		 */
+		offset = 0;
+	} else {
+		dev_err(data->dev, "index is error for usbmisc\n");
+		offset = 0;
+		ret = -EINVAL;
+	}
Maybe you could move the code above to a function
usbmisc_imx6_hsic_get_reg_offset(struct imx_usbmisc_data *data), that returns
the offset value...
Ok, and I will change the comment for SoCs before imx7D, since for these SoCs, the first two
USB controllers are non-HSIC.
quoted
+
+	val = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET + offset);
+	if (!(val & MX6_BM_HSIC_DEV_CONN))
+		writel(val | MX6_BM_HSIC_DEV_CONN,
+			usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET + offset);
+	spin_unlock_irqrestore(&usbmisc->lock, flags);
+
+	return ret;
+}
+
+static int usbmisc_imx6_hsic_set_clk(struct imx_usbmisc_data *data,
+bool on) {
+	unsigned long flags;
+	u32 val, offset;
+	struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev);
+	int ret = 0;
+
+	spin_lock_irqsave(&usbmisc->lock, flags);
+	if (data->index == 2 || data->index == 3) {
+		offset = (data->index - 2) * 4;
+	} else if (data->index == 0) {
+		offset = 0;
+	} else {
+		dev_err(data->dev, "index is error for usbmisc\n");
+		offset = 0;
+		ret = -EINVAL;
+	}
...and use the proposed function usbmisc_imx6_hsic_get_reg_offset()
here, too.
Ok.

Thanks for all your comments.

Peter
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help