Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f4ba6b0 authored by Sudip Mukherjee's avatar Sudip Mukherjee Committed by Greg Kroah-Hartman
Browse files

paride: use new parport device model



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

Tested-by: default avatarAlan Cox <gnomes@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarSudip Mukherjee <sudip@vectorindia.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8891f41a
Loading
Loading
Loading
Loading
+51 −6
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <linux/wait.h>
#include <linux/sched.h>	/* TASK_* */
#include <linux/parport.h>
#include <linux/slab.h>

#include "paride.h"

@@ -244,17 +245,19 @@ void paride_unregister(PIP * pr)

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 pardev_cb par_cb;

	port = parport_find_base(pi->port);
	if (!port)
		return 0;

	pi->pardev = parport_register_device(port,
					     pi->device, NULL,
					     pi_wake_up, NULL, 0, (void *) pi);
	memset(&par_cb, 0, sizeof(par_cb));
	par_cb.wakeup = pi_wake_up;
	par_cb.private = (void *)pi;
	pi->pardev = parport_register_dev_model(port, pi->device, &par_cb,
						unit);
	parport_put_port(port);
	if (!pi->pardev)
		return 0;
@@ -311,7 +314,7 @@ static int pi_probe_unit(PIA * pi, int unit, char *scratch, int verbose)
		e = pi->proto->max_units;
	}

	if (!pi_register_parport(pi, verbose))
	if (!pi_register_parport(pi, verbose, s))
		return 0;

	if (pi->proto->test_port) {
@@ -432,3 +435,45 @@ int pi_init(PIA * pi, int autoprobe, int port, int mode,
}

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);
+2 −0
Original line number Diff line number Diff line
@@ -165,6 +165,8 @@ typedef struct pi_protocol PIP;

extern int paride_register( PIP * );
extern void paride_unregister ( PIP * );
void *pi_register_driver(char *);
void pi_unregister_driver(void *);

#endif /* __DRIVERS_PARIDE_H__ */
/* end of paride.h */
+9 −0
Original line number Diff line number Diff line
@@ -221,6 +221,7 @@ static int pcd_busy; /* request being processed ? */
static int pcd_sector;		/* address of next requested sector */
static int pcd_count;		/* number of blocks still to do */
static char *pcd_buf;		/* buffer for request in progress */
static void *par_drv;		/* reference of parport driver */

/* kernel glue structures */

@@ -690,6 +691,12 @@ static int pcd_detect(void)
	printk("%s: %s version %s, major %d, nice %d\n",
	       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;
	if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */
		cd = pcd;
@@ -723,6 +730,7 @@ static int pcd_detect(void)
	printk("%s: No CD-ROM drive found\n", name);
	for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++)
		put_disk(cd->disk);
	pi_unregister_driver(par_drv);
	return -1;
}

@@ -984,6 +992,7 @@ static void __exit pcd_exit(void)
	}
	blk_cleanup_queue(pcd_queue);
	unregister_blkdev(major, name);
	pi_unregister_driver(par_drv);
}

MODULE_LICENSE("GPL");
+11 −1
Original line number Diff line number Diff line
@@ -247,6 +247,8 @@ static char *pd_errs[17] = { "ERR", "INDEX", "ECC", "DRQ", "SEEK", "WRERR",
	"IDNF", "MC", "UNC", "???", "TMO"
};

static void *par_drv;		/* reference of parport driver */

static inline int status_reg(struct pd_unit *disk)
{
	return pi_read_regr(disk->pi, 1, 6);
@@ -872,6 +874,12 @@ static int pd_detect(void)
			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 */
		disk = pd;
		if (pi_init(disk->pi, 1, -1, -1, -1, -1, -1, pd_scratch,
@@ -902,8 +910,10 @@ static int pd_detect(void)
			found = 1;
		}
	}
	if (!found)
	if (!found) {
		printk("%s: no valid drive found\n", name);
		pi_unregister_driver(par_drv);
	}
	return found;
}

+7 −0
Original line number Diff line number Diff line
@@ -264,6 +264,7 @@ static int pf_cmd; /* current command READ/WRITE */
static struct pf_unit *pf_current;/* unit of current request */
static int pf_mask;		/* stopper for pseudo-int */
static char *pf_buf;		/* buffer for request in progress */
static void *par_drv;		/* reference of parport driver */

/* kernel glue structures */

@@ -703,6 +704,11 @@ static int pf_detect(void)
	printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
	       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;
	if (pf_drive_count == 0) {
		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);
	for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
		put_disk(pf->disk);
	pi_unregister_driver(par_drv);
	return -1;
}

Loading