Message ID | 1397544101-18135-6-git-send-email-wens@csie.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On 04/15/2014 12:41 AM, Chen-Yu Tsai wrote: Patch description? > diff --git a/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt b/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt > +Required properties: > +- gpios : At most two GPIO phandles > +- gpio-names : Shall be "reset" or "shutdown", matching gpios. > + If both are provided, the "reset" GPIO is toggled first. As Maxime mentioned, this is an unusual way of defining GPIOs. If this new way is acceptable, then I'd suggest more precise wording, e.g.: - gpios: Must contain an entry for each entry in gpio-names. See ../gpio/gpio.txt for details. - gpio-names: May contain any or all of the following entries: - reset - shutdown > +- rfkill-type : Type of RFKILL device: 1 for WiFi, 2 for BlueTooth, etc. > + See include/uapi/linux/rfkill.h for all valid values It would be nice if include/dt-bindings/rfkill-gpio.h existed and contained e.g.: #define RFKILL_TYPE_BLUETOOTH 2 So that: > +Example: > + > + rfkill_bt { ... > + rfkill-type = <2>; Could be written as: rfkill-type = <RFKILL_TYPE_BLUETOOTH>; -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 04/15/2014 12:41 AM, Chen-Yu Tsai wrote: > diff --git a/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt b/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt > +Optional properties: > +- clocks : phandle to clock to enable/disable Oh, and can't we use clock-names here too, with wording like: - clocks: Must contain an entry for each entry in clock-names. See ../clocks/clock-bindings.txt for details. - clock-names: May contain any of the following entries: - module -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt b/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt new file mode 100644 index 0000000..a23da65 --- /dev/null +++ b/Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt @@ -0,0 +1,24 @@ +GPIO controlled RFKILL devices + +Required properties: +- compatible : Must be "rfkill-gpio". +- rfkill-name : Name of RFKILL device +- rfkill-type : Type of RFKILL device: 1 for WiFi, 2 for BlueTooth, etc. + See include/uapi/linux/rfkill.h for all valid values +- gpios : At most two GPIO phandles +- gpio-names : Shall be "reset" or "shutdown", matching gpios. + If both are provided, the "reset" GPIO is toggled first. + +Optional properties: +- clocks : phandle to clock to enable/disable + +Example: + + rfkill_bt { + compatible = "rfkill-gpio"; + rfkill-name = "bluetooth"; + rfkill-type = <2>; + gpios = <&pio 7 18 0>; + gpio-names = "reset"; + clocks = <&clk_out_a>; + }; diff --git a/net/rfkill/rfkill-gpio.c b/net/rfkill/rfkill-gpio.c index f46ddf7..a174359 100644 --- a/net/rfkill/rfkill-gpio.c +++ b/net/rfkill/rfkill-gpio.c @@ -26,6 +26,7 @@ #include <linux/slab.h> #include <linux/acpi.h> #include <linux/gpio/consumer.h> +#include <linux/of_gpio.h> #include <linux/rfkill-gpio.h> @@ -81,6 +82,18 @@ static int rfkill_gpio_acpi_probe(struct device *dev, return 0; } +static int rfkill_gpio_dt_probe(struct device *dev, + struct rfkill_gpio_data *rfkill) +{ + struct device_node * np = dev->of_node; + + rfkill->name = np->name; + of_property_read_string(np, "rfkill-name", &rfkill->name); + of_property_read_u32(np, "rfkill-type", &rfkill->type); + + return 0; +} + static int rfkill_gpio_probe(struct platform_device *pdev) { struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data; @@ -96,6 +109,10 @@ static int rfkill_gpio_probe(struct platform_device *pdev) ret = rfkill_gpio_acpi_probe(&pdev->dev, rfkill); if (ret) return ret; + } else if (&pdev->dev.of_node) { + ret = rfkill_gpio_dt_probe(&pdev->dev, rfkill); + if (ret) + return ret; } else if (pdata) { rfkill->name = pdata->name; rfkill->type = pdata->type; @@ -167,6 +184,11 @@ static const struct acpi_device_id rfkill_acpi_match[] = { }; #endif +static const struct of_device_id rfkill_of_match[] = { + { .compatible = "rfkill-gpio", }, + {}, +}; + static struct platform_driver rfkill_gpio_driver = { .probe = rfkill_gpio_probe, .remove = rfkill_gpio_remove, @@ -174,6 +196,7 @@ static struct platform_driver rfkill_gpio_driver = { .name = "rfkill_gpio", .owner = THIS_MODULE, .acpi_match_table = ACPI_PTR(rfkill_acpi_match), + .of_match_table = of_match_ptr(rfkill_of_match), }, };
Signed-off-by: Chen-Yu Tsai <wens@csie.org> --- .../devicetree/bindings/rfkill/rfkill-gpio.txt | 24 ++++++++++++++++++++++ net/rfkill/rfkill-gpio.c | 23 +++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 Documentation/devicetree/bindings/rfkill/rfkill-gpio.txt