From: "Dr. David Alan Gilbert" <[email protected]>
There are some remenants of the pre-devmodel code
still in the parport drivers; try and clean some of them out.
This series should have no visible change, all the drivers
already use the devmodel, it's just removing the flags
that say that, and cleaning out no longer used function pointers.
(To me the most useful bit is removing the no longer used
'attach' pointer, so if you've got code that's trying to use
it you'll get educated).
Trivially tested in qemu, I can still write to the lp;
Also checked with grep -r 'struct parport_driver' . -A 9
to see if I've missed any.
(I found this while dragging the out-of-tree ppscsi code
into working on head, so that I could use my prehistoric
HP PP scanner)
Dave
Dr. David Alan Gilbert (3):
parport: Remove 'drivers' list
parport: Remove attach function pointer
parport: Remove parport_driver.devmodel
drivers/ata/pata_parport/pata_parport.c | 1 -
drivers/auxdisplay/ks0108.c | 1 -
drivers/auxdisplay/panel.c | 1 -
drivers/char/lp.c | 1 -
drivers/char/ppdev.c | 1 -
drivers/i2c/busses/i2c-parport.c | 1 -
drivers/input/joystick/db9.c | 1 -
drivers/input/joystick/gamecon.c | 1 -
drivers/input/joystick/turbografx.c | 1 -
drivers/input/joystick/walkera0701.c | 1 -
drivers/input/serio/parkbd.c | 1 -
drivers/net/hamradio/baycom_epp.c | 1 -
drivers/net/hamradio/baycom_par.c | 1 -
drivers/net/plip/plip.c | 1 -
drivers/parport/daisy.c | 1 -
drivers/parport/share.c | 9 ---------
drivers/pps/clients/pps_parport.c | 1 -
drivers/pps/generators/pps_gen_parport.c | 1 -
drivers/scsi/imm.c | 1 -
drivers/scsi/ppa.c | 1 -
drivers/spi/spi-butterfly.c | 1 -
drivers/spi/spi-lm70llp.c | 1 -
include/linux/parport.h | 6 ------
sound/drivers/mts64.c | 1 -
sound/drivers/portman2x4.c | 1 -
25 files changed, 38 deletions(-)
--
2.44.0
From: "Dr. David Alan Gilbert" <[email protected]>
The attach function pointers haven't actually been called since:
'commit 3275158fa52a ("parport: remove use of devmodel")'
topped adding entries to the drivers list.
If you're converting a driver, look at the 'match_port' function
pointer instead.
(There are lots of comment references to 'attach' all over, but they
probably need some deeper understanding to check the semantics
to see if they can be replaced by match_port).
Signed-off-by: Dr. David Alan Gilbert <[email protected]>
---
include/linux/parport.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/include/linux/parport.h b/include/linux/parport.h
index 2a4424b601565..190de3569e25c 100644
--- a/include/linux/parport.h
+++ b/include/linux/parport.h
@@ -252,7 +252,6 @@ struct parport {
struct parport_driver {
const char *name;
- void (*attach) (struct parport *);
void (*detach) (struct parport *);
void (*match_port)(struct parport *);
int (*probe)(struct pardevice *);
--
2.44.0
From: "Dr. David Alan Gilbert" <[email protected]>
The list has been empty since:
'commit 3275158fa52a ("parport: remove use of devmodel")'
This also means we can remove the 'list_head' from
struct parport_driver.
Signed-off-by: Dr. David Alan Gilbert <[email protected]>
---
drivers/parport/share.c | 9 ---------
include/linux/parport.h | 1 -
2 files changed, 10 deletions(-)
diff --git a/drivers/parport/share.c b/drivers/parport/share.c
index 49c74ded8a53c..7849c25a8967a 100644
--- a/drivers/parport/share.c
+++ b/drivers/parport/share.c
@@ -49,8 +49,6 @@ static DEFINE_SPINLOCK(parportlist_lock);
static LIST_HEAD(all_ports);
static DEFINE_SPINLOCK(full_list_lock);
-static LIST_HEAD(drivers);
-
static DEFINE_MUTEX(registration_lock);
/* What you can do to a port that's gone away.. */
@@ -165,10 +163,6 @@ static int driver_check(struct device_driver *dev_drv, void *_port)
static void attach_driver_chain(struct parport *port)
{
/* caller has exclusive registration_lock */
- struct parport_driver *drv;
-
- list_for_each_entry(drv, &drivers, list)
- drv->attach(port);
/*
* call the driver_check function of the drivers registered in
@@ -191,10 +185,7 @@ static int driver_detach(struct device_driver *_drv, void *_port)
/* Call detach(port) for each registered driver. */
static void detach_driver_chain(struct parport *port)
{
- struct parport_driver *drv;
/* caller has exclusive registration_lock */
- list_for_each_entry(drv, &drivers, list)
- drv->detach(port);
/*
* call the detach function of the drivers registered in
diff --git a/include/linux/parport.h b/include/linux/parport.h
index fff39bc306290..2a4424b601565 100644
--- a/include/linux/parport.h
+++ b/include/linux/parport.h
@@ -258,7 +258,6 @@ struct parport_driver {
int (*probe)(struct pardevice *);
struct device_driver driver;
bool devmodel;
- struct list_head list;
};
#define to_parport_driver(n) container_of(n, struct parport_driver, driver)
--
2.44.0
From: "Dr. David Alan Gilbert" <[email protected]>
'devmodel' hasn't actually been used since:
'commit 3275158fa52a ("parport: remove use of devmodel")'
and everyone now has it set to true and has been fixed up; remove
the flag.
(There are still comments all over about it)
Signed-off-by: Dr. David Alan Gilbert <[email protected]>
---
drivers/ata/pata_parport/pata_parport.c | 1 -
drivers/auxdisplay/ks0108.c | 1 -
drivers/auxdisplay/panel.c | 1 -
drivers/char/lp.c | 1 -
drivers/char/ppdev.c | 1 -
drivers/i2c/busses/i2c-parport.c | 1 -
drivers/input/joystick/db9.c | 1 -
drivers/input/joystick/gamecon.c | 1 -
drivers/input/joystick/turbografx.c | 1 -
drivers/input/joystick/walkera0701.c | 1 -
drivers/input/serio/parkbd.c | 1 -
drivers/net/hamradio/baycom_epp.c | 1 -
drivers/net/hamradio/baycom_par.c | 1 -
drivers/net/plip/plip.c | 1 -
drivers/parport/daisy.c | 1 -
drivers/pps/clients/pps_parport.c | 1 -
drivers/pps/generators/pps_gen_parport.c | 1 -
drivers/scsi/imm.c | 1 -
drivers/scsi/ppa.c | 1 -
drivers/spi/spi-butterfly.c | 1 -
drivers/spi/spi-lm70llp.c | 1 -
include/linux/parport.h | 4 ----
sound/drivers/mts64.c | 1 -
sound/drivers/portman2x4.c | 1 -
24 files changed, 27 deletions(-)
diff --git a/drivers/ata/pata_parport/pata_parport.c b/drivers/ata/pata_parport/pata_parport.c
index 9a2cb9ca9d1da..93ebf566b54ec 100644
--- a/drivers/ata/pata_parport/pata_parport.c
+++ b/drivers/ata/pata_parport/pata_parport.c
@@ -768,7 +768,6 @@ static struct parport_driver pata_parport_driver = {
.name = DRV_NAME,
.match_port = pata_parport_attach,
.detach = pata_parport_detach,
- .devmodel = true,
};
static __init int pata_parport_init(void)
diff --git a/drivers/auxdisplay/ks0108.c b/drivers/auxdisplay/ks0108.c
index 234f9dbe6e300..51587f0fdaaec 100644
--- a/drivers/auxdisplay/ks0108.c
+++ b/drivers/auxdisplay/ks0108.c
@@ -162,7 +162,6 @@ static struct parport_driver ks0108_parport_driver = {
.name = "ks0108",
.match_port = ks0108_parport_attach,
.detach = ks0108_parport_detach,
- .devmodel = true,
};
module_parport_driver(ks0108_parport_driver);
diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c
index 049ff443e790d..a731f28455b45 100644
--- a/drivers/auxdisplay/panel.c
+++ b/drivers/auxdisplay/panel.c
@@ -1706,7 +1706,6 @@ static struct parport_driver panel_driver = {
.name = "panel",
.match_port = panel_attach,
.detach = panel_detach,
- .devmodel = true,
};
module_parport_driver(panel_driver);
diff --git a/drivers/char/lp.c b/drivers/char/lp.c
index 2f171d14b9b50..2aca7676e19ba 100644
--- a/drivers/char/lp.c
+++ b/drivers/char/lp.c
@@ -1016,7 +1016,6 @@ static struct parport_driver lp_driver = {
.name = "lp",
.match_port = lp_attach,
.detach = lp_detach,
- .devmodel = true,
};
static int __init lp_init(void)
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index ee951b265213f..07f4858b8a0a2 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -832,7 +832,6 @@ static struct parport_driver pp_driver = {
.probe = pp_probe,
.match_port = pp_attach,
.detach = pp_detach,
- .devmodel = true,
};
static int __init ppdev_init(void)
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c
index 0af86a5425683..3249bbd5eb43c 100644
--- a/drivers/i2c/busses/i2c-parport.c
+++ b/drivers/i2c/busses/i2c-parport.c
@@ -400,7 +400,6 @@ static struct parport_driver i2c_parport_driver = {
.name = "i2c-parport",
.match_port = i2c_parport_attach,
.detach = i2c_parport_detach,
- .devmodel = true,
};
module_parport_driver(i2c_parport_driver);
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c
index 4fba28b1a1e75..3ef66e4585449 100644
--- a/drivers/input/joystick/db9.c
+++ b/drivers/input/joystick/db9.c
@@ -673,7 +673,6 @@ static struct parport_driver db9_parport_driver = {
.name = "db9",
.match_port = db9_attach,
.detach = db9_detach,
- .devmodel = true,
};
static int __init db9_init(void)
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c
index 41d5dac054481..7ed4892749fa3 100644
--- a/drivers/input/joystick/gamecon.c
+++ b/drivers/input/joystick/gamecon.c
@@ -1016,7 +1016,6 @@ static struct parport_driver gc_parport_driver = {
.name = "gamecon",
.match_port = gc_attach,
.detach = gc_detach,
- .devmodel = true,
};
static int __init gc_init(void)
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c
index dfb9c684651f3..baa14acaa3a8f 100644
--- a/drivers/input/joystick/turbografx.c
+++ b/drivers/input/joystick/turbografx.c
@@ -274,7 +274,6 @@ static struct parport_driver tgfx_parport_driver = {
.name = "turbografx",
.match_port = tgfx_attach,
.detach = tgfx_detach,
- .devmodel = true,
};
static int __init tgfx_init(void)
diff --git a/drivers/input/joystick/walkera0701.c b/drivers/input/joystick/walkera0701.c
index 27d95d6cf56e3..59eea813f258f 100644
--- a/drivers/input/joystick/walkera0701.c
+++ b/drivers/input/joystick/walkera0701.c
@@ -293,7 +293,6 @@ static struct parport_driver walkera0701_parport_driver = {
.name = "walkera0701",
.match_port = walkera0701_attach,
.detach = walkera0701_detach,
- .devmodel = true,
};
module_parport_driver(walkera0701_parport_driver);
diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c
index 0d54895428f5d..ac1f9ea3f969b 100644
--- a/drivers/input/serio/parkbd.c
+++ b/drivers/input/serio/parkbd.c
@@ -218,6 +218,5 @@ static struct parport_driver parkbd_parport_driver = {
.name = "parkbd",
.match_port = parkbd_attach,
.detach = parkbd_detach,
- .devmodel = true,
};
module_parport_driver(parkbd_parport_driver);
diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c
index ccfc83857c260..9e366f275406d 100644
--- a/drivers/net/hamradio/baycom_epp.c
+++ b/drivers/net/hamradio/baycom_epp.c
@@ -1193,7 +1193,6 @@ static int baycom_epp_par_probe(struct pardevice *par_dev)
static struct parport_driver baycom_epp_par_driver = {
.name = "bce",
.probe = baycom_epp_par_probe,
- .devmodel = true,
};
static void __init baycom_epp_dev_setup(struct net_device *dev)
diff --git a/drivers/net/hamradio/baycom_par.c b/drivers/net/hamradio/baycom_par.c
index fd7da5bb1fa5a..00ebc25d0b22a 100644
--- a/drivers/net/hamradio/baycom_par.c
+++ b/drivers/net/hamradio/baycom_par.c
@@ -503,7 +503,6 @@ static int baycom_par_probe(struct pardevice *par_dev)
static struct parport_driver baycom_par_driver = {
.name = "bcp",
.probe = baycom_par_probe,
- .devmodel = true,
};
static int __init init_baycompar(void)
diff --git a/drivers/net/plip/plip.c b/drivers/net/plip/plip.c
index cc7d1113ece0e..e39bfaefe8c50 100644
--- a/drivers/net/plip/plip.c
+++ b/drivers/net/plip/plip.c
@@ -1358,7 +1358,6 @@ static struct parport_driver plip_driver = {
.probe = plip_probe,
.match_port = plip_attach,
.detach = plip_detach,
- .devmodel = true,
};
static void __exit plip_cleanup_module (void)
diff --git a/drivers/parport/daisy.c b/drivers/parport/daisy.c
index 6d78ec3a762fc..2231dbfd870d0 100644
--- a/drivers/parport/daisy.c
+++ b/drivers/parport/daisy.c
@@ -97,7 +97,6 @@ static int daisy_drv_probe(struct pardevice *par_dev)
static struct parport_driver daisy_driver = {
.name = "daisy_drv",
.probe = daisy_drv_probe,
- .devmodel = true,
};
/* Discover the IEEE1284.3 topology on a port -- muxes and daisy chains.
diff --git a/drivers/pps/clients/pps_parport.c b/drivers/pps/clients/pps_parport.c
index 42f93d4c6ee32..4af3260f9e86c 100644
--- a/drivers/pps/clients/pps_parport.c
+++ b/drivers/pps/clients/pps_parport.c
@@ -216,7 +216,6 @@ static struct parport_driver pps_parport_driver = {
.name = KBUILD_MODNAME,
.match_port = parport_attach,
.detach = parport_detach,
- .devmodel = true,
};
module_parport_driver(pps_parport_driver);
diff --git a/drivers/pps/generators/pps_gen_parport.c b/drivers/pps/generators/pps_gen_parport.c
index b3e084b75c237..d46eed1594951 100644
--- a/drivers/pps/generators/pps_gen_parport.c
+++ b/drivers/pps/generators/pps_gen_parport.c
@@ -232,7 +232,6 @@ static struct parport_driver pps_gen_parport_driver = {
.name = KBUILD_MODNAME,
.match_port = parport_attach,
.detach = parport_detach,
- .devmodel = true,
};
module_parport_driver(pps_gen_parport_driver);
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c
index 180a5ddedb2cd..0ad3d3e9eb308 100644
--- a/drivers/scsi/imm.c
+++ b/drivers/scsi/imm.c
@@ -1285,7 +1285,6 @@ static struct parport_driver imm_driver = {
.name = "imm",
.match_port = imm_attach,
.detach = imm_detach,
- .devmodel = true,
};
module_parport_driver(imm_driver);
diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c
index d592ee9170c11..9bf42e16cff77 100644
--- a/drivers/scsi/ppa.c
+++ b/drivers/scsi/ppa.c
@@ -1157,7 +1157,6 @@ static struct parport_driver ppa_driver = {
.name = "ppa",
.match_port = ppa_attach,
.detach = ppa_detach,
- .devmodel = true,
};
module_parport_driver(ppa_driver);
diff --git a/drivers/spi/spi-butterfly.c b/drivers/spi/spi-butterfly.c
index 1d267e6c22a4f..84eb454ed443c 100644
--- a/drivers/spi/spi-butterfly.c
+++ b/drivers/spi/spi-butterfly.c
@@ -315,7 +315,6 @@ static struct parport_driver butterfly_driver = {
.name = "spi_butterfly",
.match_port = butterfly_attach,
.detach = butterfly_detach,
- .devmodel = true,
};
module_parport_driver(butterfly_driver);
diff --git a/drivers/spi/spi-lm70llp.c b/drivers/spi/spi-lm70llp.c
index 3c0c24ed1f3db..e61e89b4119f4 100644
--- a/drivers/spi/spi-lm70llp.c
+++ b/drivers/spi/spi-lm70llp.c
@@ -318,7 +318,6 @@ static struct parport_driver spi_lm70llp_drv = {
.name = DRVNAME,
.match_port = spi_lm70llp_attach,
.detach = spi_lm70llp_detach,
- .devmodel = true,
};
module_parport_driver(spi_lm70llp_drv);
diff --git a/include/linux/parport.h b/include/linux/parport.h
index 190de3569e25c..464c2ad280396 100644
--- a/include/linux/parport.h
+++ b/include/linux/parport.h
@@ -256,7 +256,6 @@ struct parport_driver {
void (*match_port)(struct parport *);
int (*probe)(struct pardevice *);
struct device_driver driver;
- bool devmodel;
};
#define to_parport_driver(n) container_of(n, struct parport_driver, driver)
@@ -299,9 +298,6 @@ int __must_check __parport_register_driver(struct parport_driver *,
* to receive notifications about ports being found in the
* system, as well as ports no longer available.
*
- * If devmodel is true then the new device model is used
- * for registration.
- *
* The @driver structure is allocated by the caller and must not be
* deallocated until after calling parport_unregister_driver().
*
diff --git a/sound/drivers/mts64.c b/sound/drivers/mts64.c
index 5cfd0e99a13f5..b1b333d1cf396 100644
--- a/sound/drivers/mts64.c
+++ b/sound/drivers/mts64.c
@@ -882,7 +882,6 @@ static struct parport_driver mts64_parport_driver = {
.probe = snd_mts64_dev_probe,
.match_port = snd_mts64_attach,
.detach = snd_mts64_detach,
- .devmodel = true,
};
/*********************************************************************
diff --git a/sound/drivers/portman2x4.c b/sound/drivers/portman2x4.c
index 619e3f5944772..6fd9e88700215 100644
--- a/sound/drivers/portman2x4.c
+++ b/sound/drivers/portman2x4.c
@@ -668,7 +668,6 @@ static struct parport_driver portman_parport_driver = {
.probe = snd_portman_dev_probe,
.match_port = snd_portman_attach,
.detach = snd_portman_detach,
- .devmodel = true,
};
/*********************************************************************
--
2.44.0
* [email protected] ([email protected]) wrote:
> From: "Dr. David Alan Gilbert" <[email protected]>
>
> There are some remenants of the pre-devmodel code
> still in the parport drivers; try and clean some of them out.
Ping!
Dave
> This series should have no visible change, all the drivers
> already use the devmodel, it's just removing the flags
> that say that, and cleaning out no longer used function pointers.
> (To me the most useful bit is removing the no longer used
> 'attach' pointer, so if you've got code that's trying to use
> it you'll get educated).
>
> Trivially tested in qemu, I can still write to the lp;
>
> Also checked with grep -r 'struct parport_driver' . -A 9
> to see if I've missed any.
>
> (I found this while dragging the out-of-tree ppscsi code
> into working on head, so that I could use my prehistoric
> HP PP scanner)
>
> Dave
>
> Dr. David Alan Gilbert (3):
> parport: Remove 'drivers' list
> parport: Remove attach function pointer
> parport: Remove parport_driver.devmodel
>
> drivers/ata/pata_parport/pata_parport.c | 1 -
> drivers/auxdisplay/ks0108.c | 1 -
> drivers/auxdisplay/panel.c | 1 -
> drivers/char/lp.c | 1 -
> drivers/char/ppdev.c | 1 -
> drivers/i2c/busses/i2c-parport.c | 1 -
> drivers/input/joystick/db9.c | 1 -
> drivers/input/joystick/gamecon.c | 1 -
> drivers/input/joystick/turbografx.c | 1 -
> drivers/input/joystick/walkera0701.c | 1 -
> drivers/input/serio/parkbd.c | 1 -
> drivers/net/hamradio/baycom_epp.c | 1 -
> drivers/net/hamradio/baycom_par.c | 1 -
> drivers/net/plip/plip.c | 1 -
> drivers/parport/daisy.c | 1 -
> drivers/parport/share.c | 9 ---------
> drivers/pps/clients/pps_parport.c | 1 -
> drivers/pps/generators/pps_gen_parport.c | 1 -
> drivers/scsi/imm.c | 1 -
> drivers/scsi/ppa.c | 1 -
> drivers/spi/spi-butterfly.c | 1 -
> drivers/spi/spi-lm70llp.c | 1 -
> include/linux/parport.h | 6 ------
> sound/drivers/mts64.c | 1 -
> sound/drivers/portman2x4.c | 1 -
> 25 files changed, 38 deletions(-)
>
> --
> 2.44.0
>
--
-----Open up your eyes, open up your mind, open up your code -------
/ Dr. David Alan Gilbert | Running GNU/Linux | Happy \
\ dave @ treblig.org | | In Hex /
\ _________________________|_____ http://www.treblig.org |_______/
* Dr. David Alan Gilbert ([email protected]) wrote:
> * [email protected] ([email protected]) wrote:
> > From: "Dr. David Alan Gilbert" <[email protected]>
> >
> > There are some remenants of the pre-devmodel code
> > still in the parport drivers; try and clean some of them out.
>
> Ping!
Ping^2.
Dave
> Dave
>
> > This series should have no visible change, all the drivers
> > already use the devmodel, it's just removing the flags
> > that say that, and cleaning out no longer used function pointers.
> > (To me the most useful bit is removing the no longer used
> > 'attach' pointer, so if you've got code that's trying to use
> > it you'll get educated).
> >
> > Trivially tested in qemu, I can still write to the lp;
> >
> > Also checked with grep -r 'struct parport_driver' . -A 9
> > to see if I've missed any.
> >
> > (I found this while dragging the out-of-tree ppscsi code
> > into working on head, so that I could use my prehistoric
> > HP PP scanner)
> >
> > Dave
> >
> > Dr. David Alan Gilbert (3):
> > parport: Remove 'drivers' list
> > parport: Remove attach function pointer
> > parport: Remove parport_driver.devmodel
> >
> > drivers/ata/pata_parport/pata_parport.c | 1 -
> > drivers/auxdisplay/ks0108.c | 1 -
> > drivers/auxdisplay/panel.c | 1 -
> > drivers/char/lp.c | 1 -
> > drivers/char/ppdev.c | 1 -
> > drivers/i2c/busses/i2c-parport.c | 1 -
> > drivers/input/joystick/db9.c | 1 -
> > drivers/input/joystick/gamecon.c | 1 -
> > drivers/input/joystick/turbografx.c | 1 -
> > drivers/input/joystick/walkera0701.c | 1 -
> > drivers/input/serio/parkbd.c | 1 -
> > drivers/net/hamradio/baycom_epp.c | 1 -
> > drivers/net/hamradio/baycom_par.c | 1 -
> > drivers/net/plip/plip.c | 1 -
> > drivers/parport/daisy.c | 1 -
> > drivers/parport/share.c | 9 ---------
> > drivers/pps/clients/pps_parport.c | 1 -
> > drivers/pps/generators/pps_gen_parport.c | 1 -
> > drivers/scsi/imm.c | 1 -
> > drivers/scsi/ppa.c | 1 -
> > drivers/spi/spi-butterfly.c | 1 -
> > drivers/spi/spi-lm70llp.c | 1 -
> > include/linux/parport.h | 6 ------
> > sound/drivers/mts64.c | 1 -
> > sound/drivers/portman2x4.c | 1 -
> > 25 files changed, 38 deletions(-)
> >
> > --
> > 2.44.0
> >
> --
> -----Open up your eyes, open up your mind, open up your code -------
> / Dr. David Alan Gilbert | Running GNU/Linux | Happy \
> \ dave @ treblig.org | | In Hex /
> \ _________________________|_____ http://www.treblig.org |_______/
>
--
-----Open up your eyes, open up your mind, open up your code -------
/ Dr. David Alan Gilbert | Running GNU/Linux | Happy \
\ dave @ treblig.org | | In Hex /
\ _________________________|_____ http://www.treblig.org |_______/