aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2018-07-18 14:37:47 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2018-07-25 15:04:19 -0400
commit76336b41bdd141e05e39f3e80cdbd5918cdb9028 (patch)
tree74661b400e1f0933e4dcc4d77861ec3f78a07b97 /drivers/input
parentc8783d3930338323bd65f8043a8fd5ea22026824 (diff)
Input: pxrc - flatten probe code
Instead of splitting probe code into separate USB and input setup, flatten it. This allows for easier inspection of order of set up steps, since the probe code is reasonably small. Move input-related initialization (phys) from USB block to input block. Reviewed-by: Marcus Folkesson <marcus.folkesson@gmail.com> Tested-by: Marcus Folkesson <marcus.folkesson@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/joystick/pxrc.c84
1 files changed, 35 insertions, 49 deletions
diff --git a/drivers/input/joystick/pxrc.c b/drivers/input/joystick/pxrc.c
index 887a0df9d9a7..ea2bf5951d67 100644
--- a/drivers/input/joystick/pxrc.c
+++ b/drivers/input/joystick/pxrc.c
@@ -3,7 +3,6 @@
3 * Driver for Phoenix RC Flight Controller Adapter 3 * Driver for Phoenix RC Flight Controller Adapter
4 * 4 *
5 * Copyright (C) 2018 Marcus Folkesson <marcus.folkesson@gmail.com> 5 * Copyright (C) 2018 Marcus Folkesson <marcus.folkesson@gmail.com>
6 *
7 */ 6 */
8 7
9#include <linux/kernel.h> 8#include <linux/kernel.h>
@@ -16,8 +15,8 @@
16#include <linux/mutex.h> 15#include <linux/mutex.h>
17#include <linux/input.h> 16#include <linux/input.h>
18 17
19#define PXRC_VENDOR_ID (0x1781) 18#define PXRC_VENDOR_ID 0x1781
20#define PXRC_PRODUCT_ID (0x0898) 19#define PXRC_PRODUCT_ID 0x0898
21 20
22struct pxrc { 21struct pxrc {
23 struct input_dev *input; 22 struct input_dev *input;
@@ -118,59 +117,66 @@ static void pxrc_free_urb(void *_pxrc)
118 usb_free_urb(pxrc->urb); 117 usb_free_urb(pxrc->urb);
119} 118}
120 119
121static int pxrc_usb_init(struct pxrc *pxrc) 120static int pxrc_probe(struct usb_interface *intf,
121 const struct usb_device_id *id)
122{ 122{
123 struct usb_device *udev = interface_to_usbdev(pxrc->intf); 123 struct usb_device *udev = interface_to_usbdev(intf);
124 struct pxrc *pxrc;
124 struct usb_endpoint_descriptor *epirq; 125 struct usb_endpoint_descriptor *epirq;
125 size_t xfer_size; 126 size_t xfer_size;
126 void *xfer_buf; 127 void *xfer_buf;
127 unsigned int pipe;
128 int error; 128 int error;
129 129
130 /* Set up the endpoint information */ 130 /*
131 /* This device only has an interrupt endpoint */ 131 * Locate the endpoint information. This device only has an
132 error = usb_find_common_endpoints(pxrc->intf->cur_altsetting, 132 * interrupt endpoint.
133 */
134 error = usb_find_common_endpoints(intf->cur_altsetting,
133 NULL, NULL, &epirq, NULL); 135 NULL, NULL, &epirq, NULL);
134 if (error) { 136 if (error) {
135 dev_err(&pxrc->intf->dev, "Could not find endpoint\n"); 137 dev_err(&intf->dev, "Could not find endpoint\n");
136 return error; 138 return error;
137 } 139 }
138 140
139 xfer_size = usb_endpoint_maxp(epirq); 141 pxrc = devm_kzalloc(&intf->dev, sizeof(*pxrc), GFP_KERNEL);
140 xfer_buf = devm_kmalloc(&pxrc->intf->dev, xfer_size, GFP_KERNEL); 142 if (!pxrc)
141 if (!xfer_buf)
142 return -ENOMEM; 143 return -ENOMEM;
143 144
145 mutex_init(&pxrc->pm_mutex);
146 pxrc->intf = intf;
147
144 usb_set_intfdata(pxrc->intf, pxrc); 148 usb_set_intfdata(pxrc->intf, pxrc);
145 usb_make_path(udev, pxrc->phys, sizeof(pxrc->phys)); 149
146 strlcat(pxrc->phys, "/input0", sizeof(pxrc->phys)); 150 xfer_size = usb_endpoint_maxp(epirq);
151 xfer_buf = devm_kmalloc(&intf->dev, xfer_size, GFP_KERNEL);
152 if (!xfer_buf)
153 return -ENOMEM;
147 154
148 pxrc->urb = usb_alloc_urb(0, GFP_KERNEL); 155 pxrc->urb = usb_alloc_urb(0, GFP_KERNEL);
149 if (!pxrc->urb) 156 if (!pxrc->urb)
150 return -ENOMEM; 157 return -ENOMEM;
151 158
152 error = devm_add_action_or_reset(&pxrc->intf->dev, pxrc_free_urb, pxrc); 159 error = devm_add_action_or_reset(&intf->dev, pxrc_free_urb, pxrc);
153 if (error) 160 if (error)
154 return error; 161 return error;
155 162
156 pipe = usb_rcvintpipe(udev, epirq->bEndpointAddress), 163 usb_fill_int_urb(pxrc->urb, udev,
157 usb_fill_int_urb(pxrc->urb, udev, pipe, xfer_buf, xfer_size, 164 usb_rcvintpipe(udev, epirq->bEndpointAddress),
158 pxrc_usb_irq, pxrc, 1); 165 xfer_buf, xfer_size, pxrc_usb_irq, pxrc, 1);
159 166
160 return 0; 167 pxrc->input = devm_input_allocate_device(&intf->dev);
161} 168 if (!pxrc->input) {
162 169 dev_err(&intf->dev, "couldn't allocate input device\n");
163static int pxrc_input_init(struct pxrc *pxrc)
164{
165 pxrc->input = devm_input_allocate_device(&pxrc->intf->dev);
166 if (pxrc->input == NULL) {
167 dev_err(&pxrc->intf->dev, "couldn't allocate input device\n");
168 return -ENOMEM; 170 return -ENOMEM;
169 } 171 }
170 172
171 pxrc->input->name = "PXRC Flight Controller Adapter"; 173 pxrc->input->name = "PXRC Flight Controller Adapter";
174
175 usb_make_path(udev, pxrc->phys, sizeof(pxrc->phys));
176 strlcat(pxrc->phys, "/input0", sizeof(pxrc->phys));
172 pxrc->input->phys = pxrc->phys; 177 pxrc->input->phys = pxrc->phys;
173 usb_to_input_id(interface_to_usbdev(pxrc->intf), &pxrc->input->id); 178
179 usb_to_input_id(udev, &pxrc->input->id);
174 180
175 pxrc->input->open = pxrc_open; 181 pxrc->input->open = pxrc_open;
176 pxrc->input->close = pxrc_close; 182 pxrc->input->close = pxrc_close;
@@ -186,27 +192,7 @@ static int pxrc_input_init(struct pxrc *pxrc)
186 192
187 input_set_drvdata(pxrc->input, pxrc); 193 input_set_drvdata(pxrc->input, pxrc);
188 194
189 return input_register_device(pxrc->input); 195 error = input_register_device(pxrc->input);
190}
191
192static int pxrc_probe(struct usb_interface *intf,
193 const struct usb_device_id *id)
194{
195 struct pxrc *pxrc;
196 int error;
197
198 pxrc = devm_kzalloc(&intf->dev, sizeof(*pxrc), GFP_KERNEL);
199 if (!pxrc)
200 return -ENOMEM;
201
202 mutex_init(&pxrc->pm_mutex);
203 pxrc->intf = intf;
204
205 error = pxrc_usb_init(pxrc);
206 if (error)
207 return error;
208
209 error = pxrc_input_init(pxrc);
210 if (error) 196 if (error)
211 return error; 197 return error;
212 198