paride: use new parport device model

Modify paride driver to use the new parallel port device model.

Tested-by: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Sudip Mukherjee 2015-05-20 20:57:01 +05:30 committed by Greg Kroah-Hartman
parent 8891f41a78
commit 9f4ba6b058
7 changed files with 96 additions and 7 deletions

View File

@ -30,6 +30,7 @@
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/sched.h> /* TASK_* */ #include <linux/sched.h> /* TASK_* */
#include <linux/parport.h> #include <linux/parport.h>
#include <linux/slab.h>
#include "paride.h" #include "paride.h"
@ -244,17 +245,19 @@ void paride_unregister(PIP * pr)
EXPORT_SYMBOL(paride_unregister); EXPORT_SYMBOL(paride_unregister);
static int pi_register_parport(PIA * pi, int verbose) static int pi_register_parport(PIA *pi, int verbose, int unit)
{ {
struct parport *port; struct parport *port;
struct pardev_cb par_cb;
port = parport_find_base(pi->port); port = parport_find_base(pi->port);
if (!port) if (!port)
return 0; return 0;
memset(&par_cb, 0, sizeof(par_cb));
pi->pardev = parport_register_device(port, par_cb.wakeup = pi_wake_up;
pi->device, NULL, par_cb.private = (void *)pi;
pi_wake_up, NULL, 0, (void *) pi); pi->pardev = parport_register_dev_model(port, pi->device, &par_cb,
unit);
parport_put_port(port); parport_put_port(port);
if (!pi->pardev) if (!pi->pardev)
return 0; return 0;
@ -311,7 +314,7 @@ static int pi_probe_unit(PIA * pi, int unit, char *scratch, int verbose)
e = pi->proto->max_units; e = pi->proto->max_units;
} }
if (!pi_register_parport(pi, verbose)) if (!pi_register_parport(pi, verbose, s))
return 0; return 0;
if (pi->proto->test_port) { if (pi->proto->test_port) {
@ -432,3 +435,45 @@ int pi_init(PIA * pi, int autoprobe, int port, int mode,
} }
EXPORT_SYMBOL(pi_init); EXPORT_SYMBOL(pi_init);
static int pi_probe(struct pardevice *par_dev)
{
struct device_driver *drv = par_dev->dev.driver;
int len = strlen(drv->name);
if (strncmp(par_dev->name, drv->name, len))
return -ENODEV;
return 0;
}
void *pi_register_driver(char *name)
{
struct parport_driver *parp_drv;
int ret;
parp_drv = kzalloc(sizeof(*parp_drv), GFP_KERNEL);
if (!parp_drv)
return NULL;
parp_drv->name = name;
parp_drv->probe = pi_probe;
parp_drv->devmodel = true;
ret = parport_register_driver(parp_drv);
if (ret) {
kfree(parp_drv);
return NULL;
}
return (void *)parp_drv;
}
EXPORT_SYMBOL(pi_register_driver);
void pi_unregister_driver(void *_drv)
{
struct parport_driver *drv = _drv;
parport_unregister_driver(drv);
kfree(drv);
}
EXPORT_SYMBOL(pi_unregister_driver);

View File

@ -165,6 +165,8 @@ typedef struct pi_protocol PIP;
extern int paride_register( PIP * ); extern int paride_register( PIP * );
extern void paride_unregister ( PIP * ); extern void paride_unregister ( PIP * );
void *pi_register_driver(char *);
void pi_unregister_driver(void *);
#endif /* __DRIVERS_PARIDE_H__ */ #endif /* __DRIVERS_PARIDE_H__ */
/* end of paride.h */ /* end of paride.h */

View File

@ -221,6 +221,7 @@ static int pcd_busy; /* request being processed ? */
static int pcd_sector; /* address of next requested sector */ static int pcd_sector; /* address of next requested sector */
static int pcd_count; /* number of blocks still to do */ static int pcd_count; /* number of blocks still to do */
static char *pcd_buf; /* buffer for request in progress */ static char *pcd_buf; /* buffer for request in progress */
static void *par_drv; /* reference of parport driver */
/* kernel glue structures */ /* kernel glue structures */
@ -690,6 +691,12 @@ static int pcd_detect(void)
printk("%s: %s version %s, major %d, nice %d\n", printk("%s: %s version %s, major %d, nice %d\n",
name, name, PCD_VERSION, major, nice); name, name, PCD_VERSION, major, nice);
par_drv = pi_register_driver(name);
if (!par_drv) {
pr_err("failed to register %s driver\n", name);
return -1;
}
k = 0; k = 0;
if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */ if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */
cd = pcd; cd = pcd;
@ -723,6 +730,7 @@ static int pcd_detect(void)
printk("%s: No CD-ROM drive found\n", name); printk("%s: No CD-ROM drive found\n", name);
for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++)
put_disk(cd->disk); put_disk(cd->disk);
pi_unregister_driver(par_drv);
return -1; return -1;
} }
@ -984,6 +992,7 @@ static void __exit pcd_exit(void)
} }
blk_cleanup_queue(pcd_queue); blk_cleanup_queue(pcd_queue);
unregister_blkdev(major, name); unregister_blkdev(major, name);
pi_unregister_driver(par_drv);
} }
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -247,6 +247,8 @@ static char *pd_errs[17] = { "ERR", "INDEX", "ECC", "DRQ", "SEEK", "WRERR",
"IDNF", "MC", "UNC", "???", "TMO" "IDNF", "MC", "UNC", "???", "TMO"
}; };
static void *par_drv; /* reference of parport driver */
static inline int status_reg(struct pd_unit *disk) static inline int status_reg(struct pd_unit *disk)
{ {
return pi_read_regr(disk->pi, 1, 6); return pi_read_regr(disk->pi, 1, 6);
@ -872,6 +874,12 @@ static int pd_detect(void)
pd_drive_count++; pd_drive_count++;
} }
par_drv = pi_register_driver(name);
if (!par_drv) {
pr_err("failed to register %s driver\n", name);
return -1;
}
if (pd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */ if (pd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */
disk = pd; disk = pd;
if (pi_init(disk->pi, 1, -1, -1, -1, -1, -1, pd_scratch, if (pi_init(disk->pi, 1, -1, -1, -1, -1, -1, pd_scratch,
@ -902,8 +910,10 @@ static int pd_detect(void)
found = 1; found = 1;
} }
} }
if (!found) if (!found) {
printk("%s: no valid drive found\n", name); printk("%s: no valid drive found\n", name);
pi_unregister_driver(par_drv);
}
return found; return found;
} }

View File

@ -264,6 +264,7 @@ static int pf_cmd; /* current command READ/WRITE */
static struct pf_unit *pf_current;/* unit of current request */ static struct pf_unit *pf_current;/* unit of current request */
static int pf_mask; /* stopper for pseudo-int */ static int pf_mask; /* stopper for pseudo-int */
static char *pf_buf; /* buffer for request in progress */ static char *pf_buf; /* buffer for request in progress */
static void *par_drv; /* reference of parport driver */
/* kernel glue structures */ /* kernel glue structures */
@ -703,6 +704,11 @@ static int pf_detect(void)
printk("%s: %s version %s, major %d, cluster %d, nice %d\n", printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
name, name, PF_VERSION, major, cluster, nice); name, name, PF_VERSION, major, cluster, nice);
par_drv = pi_register_driver(name);
if (!par_drv) {
pr_err("failed to register %s driver\n", name);
return -1;
}
k = 0; k = 0;
if (pf_drive_count == 0) { if (pf_drive_count == 0) {
if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF, if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF,
@ -735,6 +741,7 @@ static int pf_detect(void)
printk("%s: No ATAPI disk detected\n", name); printk("%s: No ATAPI disk detected\n", name);
for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
put_disk(pf->disk); put_disk(pf->disk);
pi_unregister_driver(par_drv);
return -1; return -1;
} }

View File

@ -227,6 +227,7 @@ static int pg_identify(struct pg *dev, int log);
static char pg_scratch[512]; /* scratch block buffer */ static char pg_scratch[512]; /* scratch block buffer */
static struct class *pg_class; static struct class *pg_class;
static void *par_drv; /* reference of parport driver */
/* kernel glue structures */ /* kernel glue structures */
@ -481,6 +482,12 @@ static int pg_detect(void)
printk("%s: %s version %s, major %d\n", name, name, PG_VERSION, major); printk("%s: %s version %s, major %d\n", name, name, PG_VERSION, major);
par_drv = pi_register_driver(name);
if (!par_drv) {
pr_err("failed to register %s driver\n", name);
return -1;
}
k = 0; k = 0;
if (pg_drive_count == 0) { if (pg_drive_count == 0) {
if (pi_init(dev->pi, 1, -1, -1, -1, -1, -1, pg_scratch, if (pi_init(dev->pi, 1, -1, -1, -1, -1, -1, pg_scratch,
@ -511,6 +518,7 @@ static int pg_detect(void)
if (k) if (k)
return 0; return 0;
pi_unregister_driver(par_drv);
printk("%s: No ATAPI device detected\n", name); printk("%s: No ATAPI device detected\n", name);
return -1; return -1;
} }

View File

@ -232,6 +232,7 @@ static int pt_identify(struct pt_unit *tape);
static struct pt_unit pt[PT_UNITS]; static struct pt_unit pt[PT_UNITS];
static char pt_scratch[512]; /* scratch block buffer */ static char pt_scratch[512]; /* scratch block buffer */
static void *par_drv; /* reference of parport driver */
/* kernel glue structures */ /* kernel glue structures */
@ -605,6 +606,12 @@ static int pt_detect(void)
printk("%s: %s version %s, major %d\n", name, name, PT_VERSION, major); printk("%s: %s version %s, major %d\n", name, name, PT_VERSION, major);
par_drv = pi_register_driver(name);
if (!par_drv) {
pr_err("failed to register %s driver\n", name);
return -1;
}
specified = 0; specified = 0;
for (unit = 0; unit < PT_UNITS; unit++) { for (unit = 0; unit < PT_UNITS; unit++) {
struct pt_unit *tape = &pt[unit]; struct pt_unit *tape = &pt[unit];
@ -644,6 +651,7 @@ static int pt_detect(void)
if (found) if (found)
return 0; return 0;
pi_unregister_driver(par_drv);
printk("%s: No ATAPI tape drive detected\n", name); printk("%s: No ATAPI tape drive detected\n", name);
return -1; return -1;
} }