Re: [PATCH 2/2] phy: Add new Intel Cherrytrail USB OTG phy driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 23-12-16 02:04, Lu Baolu wrote:
Hi,

On 12/22/2016 07:47 PM, Hans de Goede wrote:
+static int intel_cht_usb_phy_probe(struct platform_device *pdev)
+{
+	struct intel_cht_usb_phy *phy;
+	struct device *dev = &pdev->dev;
+	struct resource *res;
+	resource_size_t size;
+	int i, ret;
+
+	phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
+	if (!phy)
+		return -ENOMEM;
+
+	phy->dev = dev;
+	phy->mode = PHY_MODE_USB_OTG;
+	INIT_WORK(&phy->work, intel_cht_usb_phy_work);
+	platform_set_drvdata(pdev, phy);
+
+	phy->id_extcon = extcon_get_extcon_dev(USB_HOST_EXTCON_DEV_NAME);
+	if (phy->id_extcon == NULL) {
+		dev_dbg(dev, "id_extcon is not ready, probe deferred\n");
+		return -EPROBE_DEFER;
+	}
+
+	phy->vbus_extcon = extcon_get_extcon_dev(AXP288_EXTCON_DEV_NAME);
+	if (phy->vbus_extcon == NULL) {
+		dev_dbg(dev, "vbus_extcon is not ready, probe deferred\n");
+		return -EPROBE_DEFER;
+	}
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	size = (res->end + 1) - res->start;

"res" is used without check.

+	phy->base = devm_ioremap_nocache(dev, res->start, size);

This resource is part of xHCI MMIO. xHCI driver has already declared
to use the whole memory space. I am afraid you are not able to do this
due to resource conflict.

If I were using devm_iomap_resource you would be right, as that
actually claims the memory space, but since we know it has
already been claimed, and since we need a nocache mappen,
I directly use ioremap_nocache which does not check for
resource conflicts and everything works fine.

Regards,

Hans




Best regards,
Lu Baolu

+	if (IS_ERR(phy->base)) {
+		ret = PTR_ERR(phy->base);
+		dev_err(dev, "can't iomap registers: %d\n", ret);
+		return ret;
+	}
+
+	phy->phy = devm_phy_create(dev, NULL, &intel_cht_usb_phy_ops);
+	if (IS_ERR(phy->phy)) {
+		ret = PTR_ERR(phy->phy);
+		dev_err(dev, "can't create PHY: %d\n", ret);
+		return ret;
+	}
+	phy_set_drvdata(phy->phy, phy);
+
+	/* Register for id notification */
+	phy->id_nb.notifier_call = intel_cht_usb_phy_id_cable_evt;
+	ret = devm_extcon_register_notifier(dev, phy->id_extcon,
+					    EXTCON_USB_HOST, &phy->id_nb);
+	if (ret) {
+		dev_err(dev, "can't register id extcon notifier: %d\n", ret);
+		return ret;
+	}
+
+	/* Register for vbus notification */
+	phy->vbus_nb[0].notifier_call = intel_cht_usb_phy_vbus_cable0_evt;
+	phy->vbus_nb[1].notifier_call = intel_cht_usb_phy_vbus_cable1_evt;
+	phy->vbus_nb[2].notifier_call = intel_cht_usb_phy_vbus_cable2_evt;
+	for (i = 0; i < ARRAY_SIZE(vbus_cable_ids); i++) {
+		ret = devm_extcon_register_notifier(dev, phy->vbus_extcon,
+					vbus_cable_ids[i], &phy->vbus_nb[i]);
+		if (ret) {
+			dev_err(dev, "can't register extcon notifier for %u: %d\n",
+				vbus_cable_ids[i], ret);
+			return ret;
+		}
+	}
+
+	/* Get and process initial cable states */
+	schedule_work(&phy->work);
+
+	device_create_file(dev, &dev_attr_mode);
+
+	return phy_create_lookup(phy->phy, "dwc3.0", "usb3-phy");
+}

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux