summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSudip Mukherjee <sudipm.mukherjee@gmail.com>2018-01-28 18:22:08 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-03-14 12:53:06 -0400
commitfb56d97df70e7c29c4072c02d1d756641891cee9 (patch)
tree767bd2041c40cc35be3e76f438e981290fb28ff6
parent823f7923833c6cc2b16e601546d607dcfb368004 (diff)
pps: client: use new parport device model
Modify pps client driver to use the new parallel port device model. In that process, added an index to mention the device number when we have more than one parallel port. Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com> Acked-by: Rodolfo Giometti <giometti@enneenne.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/pps/clients/pps_parport.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/pps/clients/pps_parport.c b/drivers/pps/clients/pps_parport.c
index 83797d89c30f..4db824f88d00 100644
--- a/drivers/pps/clients/pps_parport.c
+++ b/drivers/pps/clients/pps_parport.c
@@ -49,6 +49,7 @@ MODULE_PARM_DESC(clear_wait,
49 " zero turns clear edge capture off entirely"); 49 " zero turns clear edge capture off entirely");
50module_param(clear_wait, uint, 0); 50module_param(clear_wait, uint, 0);
51 51
52static DEFINE_IDA(pps_client_index);
52 53
53/* internal per port structure */ 54/* internal per port structure */
54struct pps_client_pp { 55struct pps_client_pp {
@@ -56,6 +57,7 @@ struct pps_client_pp {
56 struct pps_device *pps; /* PPS device */ 57 struct pps_device *pps; /* PPS device */
57 unsigned int cw; /* port clear timeout */ 58 unsigned int cw; /* port clear timeout */
58 unsigned int cw_err; /* number of timeouts */ 59 unsigned int cw_err; /* number of timeouts */
60 int index; /* device number */
59}; 61};
60 62
61static inline int signal_is_set(struct parport *port) 63static inline int signal_is_set(struct parport *port)
@@ -136,6 +138,8 @@ out_both:
136 138
137static void parport_attach(struct parport *port) 139static void parport_attach(struct parport *port)
138{ 140{
141 struct pardev_cb pps_client_cb;
142 int index;
139 struct pps_client_pp *device; 143 struct pps_client_pp *device;
140 struct pps_source_info info = { 144 struct pps_source_info info = {
141 .name = KBUILD_MODNAME, 145 .name = KBUILD_MODNAME,
@@ -154,8 +158,15 @@ static void parport_attach(struct parport *port)
154 return; 158 return;
155 } 159 }
156 160
157 device->pardev = parport_register_device(port, KBUILD_MODNAME, 161 index = ida_simple_get(&pps_client_index, 0, 0, GFP_KERNEL);
158 NULL, NULL, parport_irq, PARPORT_FLAG_EXCL, device); 162 memset(&pps_client_cb, 0, sizeof(pps_client_cb));
163 pps_client_cb.private = device;
164 pps_client_cb.irq_func = parport_irq;
165 pps_client_cb.flags = PARPORT_FLAG_EXCL;
166 device->pardev = parport_register_dev_model(port,
167 KBUILD_MODNAME,
168 &pps_client_cb,
169 index);
159 if (!device->pardev) { 170 if (!device->pardev) {
160 pr_err("couldn't register with %s\n", port->name); 171 pr_err("couldn't register with %s\n", port->name);
161 goto err_free; 172 goto err_free;
@@ -176,6 +187,7 @@ static void parport_attach(struct parport *port)
176 device->cw = clear_wait; 187 device->cw = clear_wait;
177 188
178 port->ops->enable_irq(port); 189 port->ops->enable_irq(port);
190 device->index = index;
179 191
180 pr_info("attached to %s\n", port->name); 192 pr_info("attached to %s\n", port->name);
181 193
@@ -186,6 +198,7 @@ err_release_dev:
186err_unregister_dev: 198err_unregister_dev:
187 parport_unregister_device(device->pardev); 199 parport_unregister_device(device->pardev);
188err_free: 200err_free:
201 ida_simple_remove(&pps_client_index, index);
189 kfree(device); 202 kfree(device);
190} 203}
191 204
@@ -205,13 +218,15 @@ static void parport_detach(struct parport *port)
205 pps_unregister_source(device->pps); 218 pps_unregister_source(device->pps);
206 parport_release(pardev); 219 parport_release(pardev);
207 parport_unregister_device(pardev); 220 parport_unregister_device(pardev);
221 ida_simple_remove(&pps_client_index, device->index);
208 kfree(device); 222 kfree(device);
209} 223}
210 224
211static struct parport_driver pps_parport_driver = { 225static struct parport_driver pps_parport_driver = {
212 .name = KBUILD_MODNAME, 226 .name = KBUILD_MODNAME,
213 .attach = parport_attach, 227 .match_port = parport_attach,
214 .detach = parport_detach, 228 .detach = parport_detach,
229 .devmodel = true,
215}; 230};
216 231
217/* module staff */ 232/* module staff */