Hi, On Sun, Jun 15, 2014 at 03:11:29PM +0800, Houcheng Lin wrote: > The Problem > ----------- > The reset signal on a hardware board is send either: > - during machine initialization > - during bus master's initialization > > In some hardware design, devices on bus need a non-standard and extra reset > signal after bus is initialied. Most reason is to wake up device from hanging > state. > > The board spefic reset code can not be put into machine init code, as it is > too early. This code can not also be put onto chip's driver, as it is board > specific and not suitable for a common chip driver. > > Defer Reset Object > ------------------ > The defer reset object is to resolve this issue, developer can put a defer- > reset device on the board's dts file and enable DEFER RESET OBJECT CONFIG. > During driver init-calls, a defer-reset object is created and issue reset signal > after the enclosing device is initialized. > > This eliminate the need to rewrite a driver module with only one purpose: sending > a board specific reset. This also allow mainstream kernel to support many boards > that modify the common drivers to send board specific reset. Configuring defer-reset > device in dts leave the board specific reset rules on board level and simple to > maintain. > > Example dts File > ---------------- > usb-ehci-chip@1211000{ > usb-phy = <&usb2_phy>; > defer_reset_vbus { > compatible = "defer-reset"; > reset-gpios = <&gpx3 5 1>; > reset-init = <0>; > reset-end = <1>; > delay = <5>; > }; > }; > > Block Diagram of dts File > ------------------------- > +-------------------------------------+ > | usb-ehci-chip@1211000 | > | +-------------------------+ | > | | defer-reset(gpx3) | | > | +-------------------------+ | > +-------------------------------------+ > > Signed-off-by: Houcheng Lin <houcheng@xxxxxxxxx> > --- > .../devicetree/bindings/gpio/gpio-defer-reset.txt | 22 +++ > drivers/power/reset/Kconfig | 8 + > drivers/power/reset/Makefile | 1 + > drivers/power/reset/gpio-defer-reset.c | 192 +++++++++++++++++++++ I think this belongs to drivers/reset and not to drivers/power/reset. The drivers in drivers/power/reset are about board reboot / shutdown. This driver seems to be used for periphals. > 4 files changed, 223 insertions(+) > create mode 100644 Documentation/devicetree/bindings/gpio/gpio-defer-reset.txt > create mode 100644 drivers/power/reset/gpio-defer-reset.c > > diff --git a/Documentation/devicetree/bindings/gpio/gpio-defer-reset.txt b/Documentation/devicetree/bindings/gpio/gpio-defer-reset.txt > new file mode 100644 > index 0000000..5d55830 > --- /dev/null > +++ b/Documentation/devicetree/bindings/gpio/gpio-defer-reset.txt > @@ -0,0 +1,22 @@ > +GPIO defer reset binding > + > +Put a defer-reset device in a device node and enable DEFER RESET OBJECT CONFIG. > +During driver init-calls, a defer-reset object will be created and issue reset > +signal after the enclosing device node's initialization complete. > + > +Required properties: > +- compatible: > + - "defer-reset" for creating defer reset object > +- reset-gpio: specify gpio pin, can be an array. > +- reset-init: specify reset signal initial value, can be 0 or 1. You can simply use GPIO's HIGH_ACTIVE / LOW_ACTIVE flag for the "initial value". > +- reset-end: specify reset signal end value, can be 0 or 1. You can use a property without a value for booleans. If the property is there, the value is 1 and if its missing the value is 0. For example in your case you could use hold-reset-line; to inform the system, that the reset signal should not be changed back after the specified time. > +- delay: specify reset duration in ms. Alternatively you could do this via the duration. An infinite long reset signal basically means, that the line is never changed back. > + > +Example: > + defer_reset_vbus { > + compatible = "defer-reset"; > + reset-gpios = <&gpx3 5 1>; > + reset-init = <0>; > + reset-end = <1>; > + delay = <5>; > + }; To give a few examples for the above comments: /* keep "gpx3 5" low for 5ms, change back to high afterwards */ defer_reset_vbus { compatible = "defer-reset"; reset-gpios = <&gpx3 5 GPIO_ACTIVE_LOW>; duration = <5>; }; /* keep "gpx3 5" high for 5ms, change back to low afterwards */ defer_reset_vbus { compatible = "defer-reset"; reset-gpios = <&gpx3 5 GPIO_ACTIVE_HIGH>; duration = <5>; }; /* keep "gpx3 5" low */ defer_reset_vbus { compatible = "defer-reset"; reset-gpios = <&gpx3 5 GPIO_ACTIVE_LOW>; duration = <0>; }; > [...] -- Sebastian
Attachment:
signature.asc
Description: Digital signature