[PATCH V2 2/2] usb: misc: usb244: add support for USB2 ultra fast sd controller

From: Piyush Mehta
Date: Mon Nov 22 2021 - 01:29:06 EST


Microchip's USB224x family of Hi-Speed USB 2.0 flash media card controllers
provides an ultra-fast interface between a USB host controller and flash
media cards.

This patch adds a GPIO based usb-sd reset for USB2244 USB2 ultra fast
SD controller. This usb2244 driver trigger sd reset signal after soft
reset or core Reset. The SD needs to be resetted after completion of
phy initialization. After the toggling of gpio, controller gets out
form reset. USB2244 is a simple platform device driver.

As part of the reset, sets the direction of the pin to output before
toggling the pin. Delay of microseconds is added in between high and
low to meet the setup and hold time requirement of the reset.

Signed-off-by: Piyush Mehta <piyush.mehta@xxxxxxxxxx>
---
Changes for V2:
- Update reset polarity, make reset ACTIVE LOW in the usb2244 driver.
- Fix WARNING: msleep < 20ms can sleep for up to 20ms by changing msleep to
usleep_range()
---
drivers/usb/misc/Kconfig | 10 +++++++
drivers/usb/misc/Makefile | 1 +
drivers/usb/misc/usb2244.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 80 insertions(+)
create mode 100644 drivers/usb/misc/usb2244.c

diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig
index 8f11443..e1c66a2 100644
--- a/drivers/usb/misc/Kconfig
+++ b/drivers/usb/misc/Kconfig
@@ -215,6 +215,16 @@ config USB_ISIGHTFW
driver beforehand. Tools for doing so are available at
http://bersace03.free.fr

+config USB_USB2244
+ tristate "Microchip USB2244 Ultra Fast USB 2.0 SD driver"
+ depends on GPIOLIB
+ help
+ Say Y or M here if you want to reset Microchip USB2244 Ultra Fast
+ USB 2.0 SD controller.
+ This option enables support for Microchip USB2244 Ultra Fast USB 2.0
+ SD controller. This driver reset the gpio pin makes controller out of
+ reset.
+
config USB_YUREX
tristate "USB YUREX driver support"
help
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile
index 5f4e598..5b4af7d 100644
--- a/drivers/usb/misc/Makefile
+++ b/drivers/usb/misc/Makefile
@@ -21,6 +21,7 @@ obj-$(CONFIG_USB_LEGOTOWER) += legousbtower.o
obj-$(CONFIG_USB_TEST) += usbtest.o
obj-$(CONFIG_USB_EHSET_TEST_FIXTURE) += ehset.o
obj-$(CONFIG_USB_TRANCEVIBRATOR) += trancevibrator.o
+obj-$(CONFIG_USB_USB2244) += usb2244.o
obj-$(CONFIG_USB_USS720) += uss720.o
obj-$(CONFIG_USB_SEVSEG) += usbsevseg.o
obj-$(CONFIG_USB_YUREX) += yurex.o
diff --git a/drivers/usb/misc/usb2244.c b/drivers/usb/misc/usb2244.c
new file mode 100644
index 0000000..5a868c2
--- /dev/null
+++ b/drivers/usb/misc/usb2244.c
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Driver for the Microchip USB2244 Ultra Fast USB 2.0 Multi-Format,
+ * SD/MMC, and MS Flash Media Controllers
+ *
+ * Copyright (c) 2021 Xilinx, Inc.
+ */
+
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/gpio/consumer.h>
+#include <linux/platform_device.h>
+
+struct usb2244 {
+ struct gpio_desc *reset_gpio;
+};
+
+static int usb2244_init_hw(struct device *dev, struct usb2244 *data)
+{
+ data = devm_kzalloc(dev, sizeof(struct usb2244), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+ if (IS_ERR(data->reset_gpio)) {
+ dev_err_probe(dev, PTR_ERR(data->reset_gpio),
+ "Failed to request reset GPIO %ld, errcode",
+ PTR_ERR(data->reset_gpio));
+ return PTR_ERR(data->reset_gpio);
+ }
+
+ /* Toggle RESET_N to reset the hub. */
+ gpiod_set_value_cansleep(data->reset_gpio, 1);
+ usleep_range(5, 10);
+ gpiod_set_value_cansleep(data->reset_gpio, 0);
+ usleep_range(5000, 6000);
+
+ return 0;
+}
+
+static int usb2244_probe(struct platform_device *pdev)
+{
+ struct usb2244 *data = NULL;
+
+ /* Trigger gpio reset to the hub. */
+ return usb2244_init_hw(&pdev->dev, data);
+}
+
+static const struct of_device_id usb2244_of_match[] = {
+ { .compatible = "microchip,usb2244", },
+ { }
+};
+
+static struct platform_driver usb2244_driver = {
+ .driver = {
+ .name = "microchip,usb2244",
+ .of_match_table = usb2244_of_match,
+ },
+ .probe = usb2244_probe,
+};
+
+module_platform_driver(usb2244_driver);
+
+MODULE_AUTHOR("Piyush Mehta <piyush.mehta@xxxxxxxxxx>");
+MODULE_DESCRIPTION("USB2244 Ultra Fast SD-Controller");
+MODULE_LICENSE("GPL v2");
--
2.7.4