hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/parport/daisy.c
....@@ -30,12 +30,6 @@
3030
3131 #undef DEBUG
3232
33
-#ifdef DEBUG
34
-#define DPRINTK(stuff...) printk(stuff)
35
-#else
36
-#define DPRINTK(stuff...)
37
-#endif
38
-
3933 static struct daisydev {
4034 struct daisydev *next;
4135 struct parport *port;
....@@ -45,6 +39,7 @@
4539 static DEFINE_SPINLOCK(topology_lock);
4640
4741 static int numdevs;
42
+static bool daisy_init_done;
4843
4944 /* Forward-declaration of lower-level functions. */
5045 static int mux_present(struct parport *port);
....@@ -87,6 +82,24 @@
8782 return extra;
8883 }
8984
85
+static int daisy_drv_probe(struct pardevice *par_dev)
86
+{
87
+ struct device_driver *drv = par_dev->dev.driver;
88
+
89
+ if (strcmp(drv->name, "daisy_drv"))
90
+ return -ENODEV;
91
+ if (strcmp(par_dev->name, daisy_dev_name))
92
+ return -ENODEV;
93
+
94
+ return 0;
95
+}
96
+
97
+static struct parport_driver daisy_driver = {
98
+ .name = "daisy_drv",
99
+ .probe = daisy_drv_probe,
100
+ .devmodel = true,
101
+};
102
+
90103 /* Discover the IEEE1284.3 topology on a port -- muxes and daisy chains.
91104 * Return value is number of devices actually detected. */
92105 int parport_daisy_init(struct parport *port)
....@@ -97,6 +110,23 @@
97110 int num_ports;
98111 int i;
99112 int last_try = 0;
113
+
114
+ if (!daisy_init_done) {
115
+ /*
116
+ * flag should be marked true first as
117
+ * parport_register_driver() might try to load the low
118
+ * level driver which will lead to announcing new ports
119
+ * and which will again come back here at
120
+ * parport_daisy_init()
121
+ */
122
+ daisy_init_done = true;
123
+ i = parport_register_driver(&daisy_driver);
124
+ if (i) {
125
+ pr_err("daisy registration failed\n");
126
+ daisy_init_done = false;
127
+ return i;
128
+ }
129
+ }
100130
101131 again:
102132 /* Because this is called before any other devices exist,
....@@ -109,8 +139,7 @@
109139 ((num_ports = num_mux_ports(port)) == 2 || num_ports == 4)) {
110140 /* Leave original as port zero. */
111141 port->muxport = 0;
112
- printk(KERN_INFO
113
- "%s: 1st (default) port of %d-way multiplexor\n",
142
+ pr_info("%s: 1st (default) port of %d-way multiplexor\n",
114143 port->name, num_ports);
115144 for (i = 1; i < num_ports; i++) {
116145 /* Clone the port. */
....@@ -123,8 +152,7 @@
123152 continue;
124153 }
125154
126
- printk(KERN_INFO
127
- "%s: %d%s port of %d-way multiplexor on %s\n",
155
+ pr_info("%s: %d%s port of %d-way multiplexor on %s\n",
128156 extra->name, i + 1, th[i + 1], num_ports,
129157 port->name);
130158
....@@ -213,10 +241,12 @@
213241 struct pardevice *parport_open(int devnum, const char *name)
214242 {
215243 struct daisydev *p = topology;
244
+ struct pardev_cb par_cb;
216245 struct parport *port;
217246 struct pardevice *dev;
218247 int daisy;
219248
249
+ memset(&par_cb, 0, sizeof(par_cb));
220250 spin_lock(&topology_lock);
221251 while (p && p->devnum != devnum)
222252 p = p->next;
....@@ -230,7 +260,7 @@
230260 port = parport_get_port(p->port);
231261 spin_unlock(&topology_lock);
232262
233
- dev = parport_register_device(port, name, NULL, NULL, NULL, 0, NULL);
263
+ dev = parport_register_dev_model(port, name, &par_cb, devnum);
234264 parport_put_port(port);
235265 if (!dev)
236266 return NULL;
....@@ -285,8 +315,7 @@
285315 | PARPORT_STATUS_PAPEROUT
286316 | PARPORT_STATUS_SELECT
287317 | PARPORT_STATUS_ERROR)) {
288
- DPRINTK(KERN_DEBUG "%s: cpp_daisy: aa5500ff(%02x)\n",
289
- port->name, s);
318
+ pr_debug("%s: cpp_daisy: aa5500ff(%02x)\n", port->name, s);
290319 return -ENXIO;
291320 }
292321
....@@ -296,8 +325,7 @@
296325 | PARPORT_STATUS_SELECT
297326 | PARPORT_STATUS_ERROR);
298327 if (s != (PARPORT_STATUS_SELECT | PARPORT_STATUS_ERROR)) {
299
- DPRINTK(KERN_DEBUG "%s: cpp_daisy: aa5500ff87(%02x)\n",
300
- port->name, s);
328
+ pr_debug("%s: cpp_daisy: aa5500ff87(%02x)\n", port->name, s);
301329 return -ENXIO;
302330 }
303331
....@@ -332,7 +360,7 @@
332360
333361 s = parport_read_status(port);
334362 if (!(s & PARPORT_STATUS_ACK)) {
335
- DPRINTK(KERN_DEBUG "%s: cpp_mux: aa55f00f52ad%02x(%02x)\n",
363
+ pr_debug("%s: cpp_mux: aa55f00f52ad%02x(%02x)\n",
336364 port->name, cmd, s);
337365 return -EIO;
338366 }
....@@ -418,8 +446,7 @@
418446 | PARPORT_STATUS_PAPEROUT
419447 | PARPORT_STATUS_SELECT
420448 | PARPORT_STATUS_ERROR)) {
421
- DPRINTK(KERN_DEBUG "%s: assign_addrs: aa5500ff(%02x)\n",
422
- port->name, s);
449
+ pr_debug("%s: assign_addrs: aa5500ff(%02x)\n", port->name, s);
423450 return 0;
424451 }
425452
....@@ -429,8 +456,7 @@
429456 | PARPORT_STATUS_SELECT
430457 | PARPORT_STATUS_ERROR);
431458 if (s != (PARPORT_STATUS_SELECT | PARPORT_STATUS_ERROR)) {
432
- DPRINTK(KERN_DEBUG "%s: assign_addrs: aa5500ff87(%02x)\n",
433
- port->name, s);
459
+ pr_debug("%s: assign_addrs: aa5500ff87(%02x)\n", port->name, s);
434460 return 0;
435461 }
436462
....@@ -467,8 +493,7 @@
467493
468494 parport_write_data(port, 0xff); udelay(2);
469495 detected = numdevs - thisdev;
470
- DPRINTK(KERN_DEBUG "%s: Found %d daisy-chained devices\n", port->name,
471
- detected);
496
+ pr_debug("%s: Found %d daisy-chained devices\n", port->name, detected);
472497
473498 /* Ask the new devices to introduce themselves. */
474499 deviceid = kmalloc(1024, GFP_KERNEL);