lkml.org 
[lkml]   [2000]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] linux/drivers/media/radio check_region() removal

Hi all,

attached patch removes all check_region() calls from /linux/drivers/media/radio
drivers. Most changes are obvious, except radio-cadet.c which needs some
maintainer's attention.

I hope it will be usefull.

Best regards,
Andrey

--
Andrey Panin | Embedded systems software engineer
pazke@orbita1.ru | PGP key: http://www.orbita1.ru/~pazke/AndreyPanin.ascdiff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-aimslab.c /linux/drivers/media/radio/radio-aimslab.c
--- /mnt/disk/linux/drivers/media/radio/radio-aimslab.c Mon Nov 20 21:01:53 2000
+++ /linux/drivers/media/radio/radio-aimslab.c Fri Nov 24 13:04:09 2000
@@ -29,7 +29,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -42,7 +42,7 @@
#endif

static int io = CONFIG_RADIO_RTRACK_PORT;
-static int users = 0;
+static int users;
static struct semaphore lock;

struct rt_device
@@ -338,7 +338,7 @@
return -EINVAL;
}

- if (check_region(io, 2))
+ if (!request_region(io, 2, "rtrack"))
{
printk(KERN_ERR "rtrack: port 0x%x already in use\n", io);
return -EBUSY;
@@ -346,10 +346,11 @@

rtrack_radio.priv=&rtrack_unit;

- if(video_register_device(&rtrack_radio, VFL_TYPE_RADIO)==-1)
+ if (video_register_device(&rtrack_radio, VFL_TYPE_RADIO) == -1) {
+ release_region(io, 2);
return -EINVAL;
+ }

- request_region(io, 2, "rtrack");
printk(KERN_INFO "AIMSlab RadioTrack/RadioReveal card driver.\n");

/* Set up the I/O locking */
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-aztech.c /linux/drivers/media/radio/radio-aztech.c
--- /mnt/disk/linux/drivers/media/radio/radio-aztech.c Mon Nov 20 21:01:53 2000
+++ /linux/drivers/media/radio/radio-aztech.c Fri Nov 24 13:04:09 2000
@@ -26,7 +26,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -41,7 +41,7 @@

static int io = CONFIG_RADIO_AZTECH_PORT;
static int radio_wait_time = 1000;
-static int users = 0;
+static int users;
static struct semaphore lock;

struct az_device
@@ -289,7 +289,7 @@
return -EINVAL;
}

- if (check_region(io, 2))
+ if (!request_region(io, 2, "aztech"))
{
printk(KERN_ERR "aztech: port 0x%x already in use\n", io);
return -EBUSY;
@@ -298,10 +298,11 @@
init_MUTEX(&lock);
aztech_radio.priv=&aztech_unit;

- if(video_register_device(&aztech_radio, VFL_TYPE_RADIO)==-1)
+ if (video_register_device(&aztech_radio, VFL_TYPE_RADIO) == -1) {
+ release_region(io, 2);
return -EINVAL;
+ }

- request_region(io, 2, "aztech");
printk(KERN_INFO "Aztech radio card driver v1.00/19990224 rkroll@exploits.org\n");
/* mute card - prevents noisy bootups */
outb (0, io);
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-cadet.c /linux/drivers/media/radio/radio-cadet.c
--- /mnt/disk/linux/drivers/media/radio/radio-cadet.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-cadet.c Fri Nov 24 13:17:22 2000
@@ -20,7 +20,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -34,15 +34,15 @@
#define RDS_BUFFER 256

static int io=CONFIG_RADIO_CADET_PORT;
-static int users=0;
-static int curtuner=0;
-static int tunestat=0;
-static int sigstrength=0;
+static int users;
+static int curtuner;
+static int tunestat;
+static int sigstrength;
static wait_queue_head_t tunerq,rdsq,readq;
struct timer_list tunertimer,rdstimer,readtimer;
-static __u8 rdsin=0,rdsout=0,rdsstat=0;
+static __u8 rdsin,rdsout,rdsstat;
static unsigned char rdsbuf[RDS_BUFFER];
-static int cadet_lock=0;
+static int cadet_lock;

#ifndef MODULE
static int cadet_probe(void);
@@ -551,9 +551,28 @@
ioctl: cadet_ioctl,
};

+#ifdef MODULE
+static int __init cadet_probe(int ioaddr)
+{
+ if (!request_region(ioaddr, 2, "cadet"))
+ return -EBUSY;
+
+ cadet_setfreq(1410);
+ if (cadet_getfreq() == 1410) {
+ io = ioaddr;
+ return 0;
+ }
+
+ release_region(ioaddr, 2);
+ return -ENODEV;
+}
+#endif /* MODULE */
+
#ifdef CONFIG_ISAPNP
-static int isapnp_cadet_probe(void)
+static int __init isapnp_cadet_probe(void)
{
+ int retval;
+
dev = isapnp_find_dev (NULL, ISAPNP_VENDOR('M','S','M'),
ISAPNP_FUNCTION(0x0c24), NULL);

@@ -564,60 +583,61 @@
if (!(dev->resource[0].flags & IORESOURCE_IO))
return -ENODEV;
if (dev->activate(dev)<0) {
- printk ("radio-cadet: isapnp configure failed (out of resources?)\n");
+ printk (KERN_ERR "radio-cadet: isapnp configure failed (out of resources?)\n");
return -ENOMEM;
}

- io = dev->resource[0].start;
+ printk (KERN_INFO "radio-cadet: ISAPnP reports card at %#x\n", io);
+
+ if ((retval = cadet_probe(dev->resource[0].start))) {
+ dev->deactivate(dev);
+ return retval;
+ }

- printk ("radio-cadet: ISAPnP reports card at %#x\n", io);
+ io = dev->resource[0].start;

- return io;
+ return 0;
}
#endif /* CONFIG_ISAPNP */

-#ifdef MODULE
-static int cadet_probe(void)
+static int __init cadet_init(void)
{
- static int iovals[8]={0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e};
int i;

- for(i=0;i<8;i++) {
- io=iovals[i];
- if(check_region(io,2)>=0) {
- cadet_setfreq(1410);
- if(cadet_getfreq()==1410) {
- return io;
- }
- }
- }
- return -1;
-}
-#endif /* MODULE */
-
-static int __init cadet_init(void)
-{
#ifdef CONFIG_ISAPNP
- io = isapnp_cadet_probe();
-
- if (io < 0)
- return (io);
+ if (isapnp_cadet_probe() == 0)
+ goto found;
#else
+
#ifndef MODULE /* only probe on non-ISAPnP monolithic compiles */
- io = cadet_probe ();
+ {
+ int *port;
+ static int __initdata cadet_portlist[] = {
+ 0x330, 0x332, 0x334, 0x336, 0x338,
+ 0x33a, 0x33c, 0x33e, 0
+ };
+
+ for (port = cadet_portlist; *port; port++)
+ if (cadet_probe(*port) == 0)
+ goto found;
+ }
#endif /* MODULE */
+
#endif /* CONFIG_ISAPNP */

- if(io < 0) {
-#ifdef MODULE
+ if(io == 0) {
+#ifdef MODULE
printk(KERN_ERR "You must set an I/O address with io=0x???\n");
#endif
return -EINVAL;
}
- if (!request_region(io,2,"cadet"))
- return -EBUSY;
- if(video_register_device(&cadet_radio,VFL_TYPE_RADIO)==-1) {
- release_region(io,2);
+
+ if ((i = cadet_probe(io)))
+ return i;
+
+found:
+ if (video_register_device(&cadet_radio, VFL_TYPE_RADIO) == -1) {
+ release_region(io, 2);
return -EINVAL;
}
printk(KERN_INFO "ADS Cadet Radio Card at 0x%x\n",io);
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-gemtek.c /linux/drivers/media/radio/radio-gemtek.c
--- /mnt/disk/linux/drivers/media/radio/radio-gemtek.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-gemtek.c Fri Nov 24 13:04:09 2000
@@ -17,7 +17,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -30,7 +30,7 @@
#endif

static int io = CONFIG_RADIO_GEMTEK_PORT;
-static int users = 0;
+static int users;
static spinlock_t lock;

struct gemtek_device
@@ -265,7 +265,7 @@
return -EINVAL;
}

- if (check_region(io, 4))
+ if (!request_region(io, 4, "gemtek"))
{
printk(KERN_ERR "gemtek: port 0x%x already in use\n", io);
return -EBUSY;
@@ -273,10 +273,11 @@

gemtek_radio.priv=&gemtek_unit;

- if(video_register_device(&gemtek_radio, VFL_TYPE_RADIO)==-1)
+ if (video_register_device(&gemtek_radio, VFL_TYPE_RADIO) == -1) {
+ release_region(io, 4);
return -EINVAL;
-
- request_region(io, 4, "gemtek");
+ }
+
printk(KERN_INFO "GemTek Radio Card driver.\n");

spin_lock_init(&lock);
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-maestro.c /linux/drivers/media/radio/radio-maestro.c
--- /mnt/disk/linux/drivers/media/radio/radio-maestro.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-maestro.c Fri Nov 24 13:04:09 2000
@@ -84,9 +84,9 @@
stereo, /* VIDEO_TUNER_STEREO_ON */
tuned; /* signal strength (0 or 0xffff) */
struct semaphore lock;
-} radio_unit = {0, 0, 0, 0, };
+} radio_unit;

-static int users = 0;
+static int users;

static void sleep_125ms(void)
{
@@ -361,7 +361,7 @@

if(radio_power_on(&radio_unit)) {
if(video_register_device(&maestro_radio, VFL_TYPE_RADIO)==-1) {
- printk("radio-maestro: can't register device!");
+ printk(KERN_ERR "radio-maestro: can't register device!");
return 0;
}
printk(KERN_INFO "radio-maestro: version "
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-miropcm20.c /linux/drivers/media/radio/radio-miropcm20.c
--- /mnt/disk/linux/drivers/media/radio/radio-miropcm20.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-miropcm20.c Fri Nov 24 13:04:09 2000
@@ -12,7 +12,7 @@
#include <linux/videodev.h> /* kernel radio structs */
#include "../../sound/miroaci.h" /* ACI Control by acimixer */

-static int users = 0;
+static int users;

struct pcm20_device
{
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-rtrack2.c /linux/drivers/media/radio/radio-rtrack2.c
--- /mnt/disk/linux/drivers/media/radio/radio-rtrack2.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-rtrack2.c Fri Nov 24 13:04:09 2000
@@ -10,7 +10,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -23,7 +23,7 @@
#endif

static int io = CONFIG_RADIO_RTRACK2_PORT;
-static int users = 0;
+static int users;
static spinlock_t lock;

struct rt_device
@@ -230,7 +230,7 @@
printk(KERN_ERR "You must set an I/O address with io=0x20c or io=0x30c\n");
return -EINVAL;
}
- if (check_region(io, 4))
+ if (!request_region(io, 4, "rtrack2"))
{
printk(KERN_ERR "rtrack2: port 0x%x already in use\n", io);
return -EBUSY;
@@ -242,7 +242,6 @@
if(video_register_device(&rtrack2_radio, VFL_TYPE_RADIO)==-1)
return -EINVAL;

- request_region(io, 4, "rtrack2");
printk(KERN_INFO "AIMSlab Radiotrack II card driver.\n");

/* mute card - prevents noisy bootups */
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-sf16fmi.c /linux/drivers/media/radio/radio-sf16fmi.c
--- /mnt/disk/linux/drivers/media/radio/radio-sf16fmi.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-sf16fmi.c Fri Nov 24 13:04:09 2000
@@ -16,7 +16,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -37,7 +37,7 @@
#endif

static int io = CONFIG_RADIO_SF16FMI_PORT;
-static int users = 0;
+static int users;
static struct semaphore lock;

/* freq is in 1/16 kHz to internal number, hw precision is 50 kHz */
@@ -291,7 +291,7 @@
printk(KERN_ERR "You must set an I/O address with io=0x???\n");
return -EINVAL;
}
- if (check_region(io, 2))
+ if (!request_region(io, 2, "fmi"))
{
printk(KERN_ERR "fmi: port 0x%x already in use\n", io);
return -EBUSY;
@@ -304,11 +304,12 @@
fmi_radio.priv = &fmi_unit;

init_MUTEX(&lock);
-
- if(video_register_device(&fmi_radio, VFL_TYPE_RADIO)==-1)
+
+ if(video_register_device(&fmi_radio, VFL_TYPE_RADIO)==-1) {
+ release_region(io, 2);
return -EINVAL;
-
- request_region(io, 2, "fmi");
+ }
+
printk(KERN_INFO "SF16FMx radio card driver at 0x%x.\n", io);
printk(KERN_INFO "(c) 1998 Petr Vandrovec, vandrove@vc.cvut.cz.\n");
/* mute card - prevents noisy bootups */
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-terratec.c /linux/drivers/media/radio/radio-terratec.c
--- /mnt/disk/linux/drivers/media/radio/radio-terratec.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-terratec.c Fri Nov 24 13:04:09 2000
@@ -25,7 +25,7 @@

#include <linux/module.h> /* Modules */
#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
+#include <linux/ioport.h> /* request_region */
#include <linux/delay.h> /* udelay */
#include <asm/io.h> /* outb, outb_p */
#include <asm/uaccess.h> /* copy to/from user */
@@ -50,7 +50,7 @@
/*******************************************************************/

static int io = CONFIG_RADIO_TERRATEC_PORT;
-static int users = 0;
+static int users;
static spinlock_t lock;

struct tt_device
@@ -309,7 +309,7 @@
printk(KERN_ERR "You must set an I/O address with io=0x???\n");
return -EINVAL;
}
- if (check_region(io, 2))
+ if (!request_region(io, 2, "terratec"))
{
printk(KERN_ERR "TerraTec: port 0x%x already in use\n", io);
return -EBUSY;
@@ -319,10 +319,11 @@

spin_lock_init(&lock);

- if(video_register_device(&terratec_radio, VFL_TYPE_RADIO)==-1)
+ if(video_register_device(&terratec_radio, VFL_TYPE_RADIO)==-1) {
+ release_region(io, 2);
return -EINVAL;
+ }

- request_region(io, 2, "terratec");
printk(KERN_INFO "TERRATEC ActivRadio Standalone card driver.\n");

/* mute card - prevents noisy bootups */
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-trust.c /linux/drivers/media/radio/radio-trust.c
--- /mnt/disk/linux/drivers/media/radio/radio-trust.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-trust.c Fri Nov 24 13:04:09 2000
@@ -32,7 +32,7 @@

static int io = CONFIG_RADIO_TRUST_PORT;
static int ioval = 0xf;
-static int users = 0;
+static int users;
static __u16 curvol;
static __u16 curbass;
static __u16 curtreble;
@@ -300,15 +300,15 @@
printk(KERN_ERR "You must set an I/O address with io=0x???\n");
return -EINVAL;
}
- if(check_region(io, 2)) {
+ if (!request_region(io, 2, "Trust FM Radio")) {
printk(KERN_ERR "trust: port 0x%x already in use\n", io);
return -EBUSY;
}
- if(video_register_device(&trust_radio, VFL_TYPE_RADIO)==-1)
+ if(video_register_device(&trust_radio, VFL_TYPE_RADIO)==-1) {
+ release_region(io, 2);
return -EINVAL;
+ }

- request_region(io, 2, "Trust FM Radio");
-
printk(KERN_INFO "Trust FM Radio card driver v1.0.\n");

write_i2c(2, TDA7318_ADDR, 0x80); /* speaker att. LF = 0 dB */
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-typhoon.c /linux/drivers/media/radio/radio-typhoon.c
--- /mnt/disk/linux/drivers/media/radio/radio-typhoon.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-typhoon.c Fri Nov 24 13:04:09 2000
@@ -29,14 +29,14 @@
* completely silent.
*/

-#include <linux/module.h> /* Modules */
-#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
-#include <linux/proc_fs.h> /* radio card status report */
-#include <asm/io.h> /* outb, outb_p */
-#include <asm/uaccess.h> /* copy to/from user */
-#include <linux/videodev.h> /* kernel radio structs */
-#include <linux/config.h> /* CONFIG_RADIO_TYPHOON_* */
+#include <linux/module.h> /* Modules */
+#include <linux/init.h> /* Initdata */
+#include <linux/ioport.h> /* request_region */
+#include <linux/proc_fs.h> /* radio card status report */
+#include <asm/io.h> /* outb, outb_p */
+#include <asm/uaccess.h> /* copy to/from user */
+#include <linux/videodev.h> /* kernel radio structs */
+#include <linux/config.h> /* CONFIG_RADIO_TYPHOON_* */

#define BANNER "Typhoon Radio Card driver v0.1\n"

@@ -328,7 +328,7 @@
static int io = -1;

#ifdef MODULE
-static unsigned long mutefreq = 0;
+static unsigned long mutefreq;
#endif

static int __init typhoon_init(void)
@@ -350,17 +350,18 @@

printk(KERN_INFO BANNER);
io = typhoon_unit.iobase;
- if (check_region(io, 8)) {
+ if (!request_region(io, 8, "typhoon")) {
printk(KERN_ERR "radio-typhoon: port 0x%x already in use\n",
typhoon_unit.iobase);
return -EBUSY;
}

typhoon_radio.priv = &typhoon_unit;
- if (video_register_device(&typhoon_radio, VFL_TYPE_RADIO) == -1)
+ if (video_register_device(&typhoon_radio, VFL_TYPE_RADIO) == -1) {
+ release_region(io, 8);
return -EINVAL;
+ }

- request_region(typhoon_unit.iobase, 8, "typhoon");
printk(KERN_INFO "radio-typhoon: port 0x%x.\n", typhoon_unit.iobase);
printk(KERN_INFO "radio-typhoon: mute frequency is %lu kHz.\n",
typhoon_unit.mutefreq);
diff -ur -x *.flags -x media.o /mnt/disk/linux/drivers/media/radio/radio-zoltrix.c /linux/drivers/media/radio/radio-zoltrix.c
--- /mnt/disk/linux/drivers/media/radio/radio-zoltrix.c Mon Nov 20 21:01:54 2000
+++ /linux/drivers/media/radio/radio-zoltrix.c Fri Nov 24 13:04:09 2000
@@ -25,21 +25,21 @@
* - Reworked ioctl functions
*/

-#include <linux/module.h> /* Modules */
-#include <linux/init.h> /* Initdata */
-#include <linux/ioport.h> /* check_region, request_region */
-#include <linux/delay.h> /* udelay */
-#include <asm/io.h> /* outb, outb_p */
-#include <asm/uaccess.h> /* copy to/from user */
-#include <linux/videodev.h> /* kernel radio structs */
-#include <linux/config.h> /* CONFIG_RADIO_ZOLTRIX_PORT */
+#include <linux/module.h> /* Modules */
+#include <linux/init.h> /* Initdata */
+#include <linux/ioport.h> /* request_region */
+#include <linux/delay.h> /* udelay */
+#include <asm/io.h> /* outb, outb_p */
+#include <asm/uaccess.h> /* copy to/from user */
+#include <linux/videodev.h> /* kernel radio structs */
+#include <linux/config.h> /* CONFIG_RADIO_ZOLTRIX_PORT */

#ifndef CONFIG_RADIO_ZOLTRIX_PORT
#define CONFIG_RADIO_ZOLTRIX_PORT -1
#endif

static int io = CONFIG_RADIO_ZOLTRIX_PORT;
-static int users = 0;
+static int users;

struct zol_device {
int port;
@@ -355,20 +355,22 @@
printk(KERN_ERR "You must set an I/O address with io=0x???\n");
return -EINVAL;
}
- if (check_region(io, 2)) {
+ if (!request_region(io, 2, "zoltrix")) {
printk(KERN_ERR "zoltrix: port 0x%x already in use\n", io);
return -EBUSY;
}
if ((io != 0x20c) && (io != 0x30c)) {
printk(KERN_ERR "zoltrix: invalid port, try 0x20c or 0x30c\n");
+ release_region(io, 2);
return -ENXIO;
}
zoltrix_radio.priv = &zoltrix_unit;

- if (video_register_device(&zoltrix_radio, VFL_TYPE_RADIO) == -1)
+ if (video_register_device(&zoltrix_radio, VFL_TYPE_RADIO) == -1) {
+ release_region(io, 2);
return -EINVAL;
+ }

- request_region(io, 2, "zoltrix");
printk(KERN_INFO "Zoltrix Radio Plus card driver.\n");

init_MUTEX(&zoltrix_unit.lock);[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2005-03-22 12:47    [W:0.073 / U:23.272 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site