From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932066AbcGMOsz (ORCPT ); Wed, 13 Jul 2016 10:48:55 -0400 Received: from [210.118.77.12] ([210.118.77.12]:37607 "EHLO mailout2.w1.samsung.com" rhost-flags-FAIL-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1751743AbcGMOsq (ORCPT ); Wed, 13 Jul 2016 10:48:46 -0400 MIME-version: 1.0 Content-type: text/plain; charset=UTF-8; format=flowed X-AuditID: cbfec7f4-f796c6d000001486-53-578654a8950f Content-transfer-encoding: 8BIT Message-id: <578654A7.2020909@samsung.com> Date: Wed, 13 Jul 2016 16:48:07 +0200 From: Jacek Anaszewski User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130804 Thunderbird/17.0.8 To: =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= Cc: Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, Richard Purdie , open list , Rob Herring , Mark Rutland , balbi@kernel.org Subject: Re: [PATCH V2 PROOF OF CONCEPT 2/1] trigger: ledtrig-usbport: read initial state from DT References: <1468326921-26485-1-git-send-email-zajec5@gmail.com> <1468413734-9569-1-git-send-email-zajec5@gmail.com> <1468413734-9569-3-git-send-email-zajec5@gmail.com> In-reply-to: <1468413734-9569-3-git-send-email-zajec5@gmail.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNLMWRmVeSWpSXmKPExsVy+t/xq7orQ9rCDTo8LY61PWG3mH/kHKtF 8+L1bBaXd81hs9j6Zh2jxaJlrcwWS69fZLJo3XuE3WL3rqesFmtOpjpweayZt4bRY+esu+we m1Z1snnsn7uG3WPP/B+sHp83yQWwRXHZpKTmZJalFunbJXBlfFt0kb1gvUzFzgnHWRsYt4l1 MXJwSAiYSNxZ7tbFyAlkiklcuLeerYuRi0NIYCmjRO/rHcwgCV4BQYkfk++xgNQzC8hLHLmU DRJmFjCTeNSyjhmi/hmjxPH7P1kh6rUk1q5oYgexWQRUJS48ussCYrMJGEr8fPGaCcQWFYiQ +HN6H1i9iIC5xJO+R0wgg5gFtjJJ3D+5BCwhLJAs8er4AbAjhATWMEos6ecAOYJTwEFiw26e CYwCs5CcNwvhvFlIzlvAyLyKUTS1NLmgOCk911CvODG3uDQvXS85P3cTIyQKvuxgXHzM6hCj AAejEg8vo0hruBBrYllxZe4hRgkOZiURXoPgtnAh3pTEyqrUovz4otKc1OJDjNIcLErivHN3 vQ8REkhPLEnNTk0tSC2CyTJxcEo1MFq/Nv0ZUK1x4txT+UTzb2GrQ44/uuOsL60fHqHEaznx h9GVTX7xl3UvnPr+JG/Zr6Nu4cGTU5g97vv0KRncP9Cu3OVaOslbQ/FAkBkfy7qPe0Mq+QTa PA4ln4n2TD772FFPdYr3M3Uvr7/7RU5sXGfw5tAml6kiefwfzj6b51xhHRw5o5yfUYmlOCPR UIu5qDgRAMsYoHd+AgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Rafał, On 07/13/2016 02:42 PM, Rafał Miłecki wrote: > This allows specifying USB ports that should be observed by a trigger > right after activating it. Example: > > usb { > gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; > linux,default-trigger = "usbport"; > usb-controllers = <&ohci>, <&ehci>, <&xhci USB_HCD_SHARED>; > usb-ports = "1", "1", "1"; Port is a numerical value, right? Wouldn't it be better to define it as an array of integers? e.g.: usb-ports = <1>. <1>, <1>; > }; Please provide a patch with DT bindings documentation for this trigger. I infer that usb-controllers and usb-ports are new properties. Adding also Felipe, Mark and Rob. > > Signed-off-by: Rafał Miłecki > --- > drivers/leds/trigger/ledtrig-usbport.c | 72 ++++++++++++++++++++++++++++++++++ > 1 file changed, 72 insertions(+) > > diff --git a/drivers/leds/trigger/ledtrig-usbport.c b/drivers/leds/trigger/ledtrig-usbport.c > index eb20a8f..5724f63 100644 > --- a/drivers/leds/trigger/ledtrig-usbport.c > +++ b/drivers/leds/trigger/ledtrig-usbport.c > @@ -12,8 +12,10 @@ > #include > #include > #include > +#include > #include > #include > +#include > #include "../leds.h" > > struct usbport_trig_port { > @@ -94,6 +96,75 @@ static bool usbport_trig_match(struct usbport_trig_data *usbport_data, > return false; > } > > +static int usbport_trig_new_port(struct usbport_trig_data *usbport_data, > + int busnum, const char *suffix) > +{ > + struct usbport_trig_port *port; > + size_t len; > + int tmp; > + > + tmp = busnum; > + len = 1; > + while (tmp >= 10) { > + tmp /= 10; > + len++; > + } > + len++; /* '-' */ > + len += strlen(suffix); > + len++; /* '\0' */ > + > + port = kzalloc(sizeof(*port), GFP_KERNEL); > + if (!port) > + return -ENOMEM; > + > + port->name = kzalloc(len, GFP_KERNEL); > + if (!port->name) { > + kfree(port); > + return -ENOMEM; > + } > + snprintf(port->name, len, "%d-%s", busnum, suffix); > + > + list_add_tail(&port->list, &usbport_data->ports); > + > + return 0; > +} > + > +static int usbport_trig_fill(struct usbport_trig_data *usbport_data) > +{ > + struct device_node *np = usbport_data->led_cdev->dev->of_node; > + struct of_phandle_args args; > + int count, i; > + int err = 0; > + > + if (!np) > + return -ENOENT; > + > + count = of_property_count_strings(np, "usb-ports"); > + if (count < 0) > + return count; > + > + for (i = 0; i < count; i++) { > + const char *port; > + struct usb_hcd *hcd; > + > + err = of_property_read_string_index(np, "usb-ports", i, &port); > + if (err) > + continue; > + > + err = of_parse_phandle_with_args(np, "usb-controllers", "#usb-cells", i, &args); > + if (err) > + continue; > + > + hcd = of_hcd_get_from_provider(&args); > + if (!IS_ERR(hcd)) > + usbport_trig_new_port(usbport_data, hcd->self.busnum, port); > + > + of_node_put(args.np); > + } > + > + return err; > +} > + > static int usbport_trig_notify(struct notifier_block *nb, unsigned long action, > void *data) > { > @@ -129,6 +200,7 @@ static void usbport_trig_activate(struct led_classdev *led_cdev) > return; > usbport_data->led_cdev = led_cdev; > INIT_LIST_HEAD(&usbport_data->ports); > + usbport_trig_fill(usbport_data); > usbport_data->nb.notifier_call = usbport_trig_notify, > led_cdev->trigger_data = usbport_data; > > -- Best regards, Jacek Anaszewski