On Mon, Nov 22, 2021 at 12:02:52PM +0100, Michal Simek wrote: > > nit: Just spot typo in subject. It is usb2244. > > On 11/22/21 08:02, Greg KH wrote: > > On Mon, Nov 22, 2021 at 11:58:34AM +0530, Piyush Mehta wrote: > > > 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 ++++++++++++++++++++++++++++++++++++++++++++++ > > > > This isn't really a USB driver, so maybe drivers/misc/ instead? > > > > > 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. > > > > Module name? > > > > > + > > > 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; > > > +}; > > > > Why is this structure needed? > > > > > + > > > +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); > > > > Why do you need a kernel driver for this at all? Why not just toggle > > the pin from userspace? > > It is usb-sd convertor. If you have rootfs on SD you need to get the chip > out of reset to be able to access init. There is no way how to do it via > userspace. Ah, ok, that makes more sense. So it belongs in drivers/misc/ along with the other "enable some USB hardware" platform drivers that we have in there today. thanks, greg k-h