Add PnP support to smsc-ircc2 driver.
Briefly tested with irdadump on a Dell Inpsiron 7000.
Signed-off-by: Ville Syrjala <syrjala@...>
smsc-ircc2.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++
1 files changed, 66 insertions(+)
diff -upr a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c
--- a/drivers/net/irda/smsc-ircc2.c 2004-11-15 12:21:19.000000000 +0200
+++ b/drivers/net/irda/smsc-ircc2.c 2004-11-16 04:42:28.070000000 +0200
@@ -53,6 +53,7 @@
#include <linux/rtnetlink.h>
#include <linux/serial_reg.h>
#include <linux/dma-mapping.h>
+#include <linux/pnp.h>
=20
#include <asm/io.h>
#include <asm/dma.h>
@@ -68,6 +69,8 @@
#include "smsc-ircc2.h"
#include "smsc-sio.h"
=20
+static int pnp_registered_port;
+
/* Types */
=20
struct smsc_transceiver {
@@ -319,6 +322,58 @@ static inline void register_bank(int iob
*
***********************************************************************=
********/
=20
+
+/* PNP probing */
+
+static const struct pnp_device_id smsc_ircc_pnp_table[] =3D {
+ { .id =3D "SMCf010", .driver_data =3D 0 },
+ { }
+};
+
+MODULE_DEVICE_TABLE(pnp, smsc_ircc_pnp_table);
+
+static int __devinit
+smsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id)
+{
+ unsigned int firbase, sirbase;
+ u8 dma, irq;
+
+ if (pnp_port_valid(dev, 0) &&
+ !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED))
+ sirbase =3D pnp_port_start(dev, 0);
+ else
+ return -EINVAL;
+
+ if (pnp_port_valid(dev, 1) &&
+ !(pnp_port_flags(dev, 1) & IORESOURCE_DISABLED))
+ firbase =3D pnp_port_start(dev, 1);
+ else
+ return -EINVAL;
+
+ if (pnp_irq_valid(dev, 0) &&
+ !(pnp_irq_flags(dev, 0) & IORESOURCE_DISABLED))
+ irq =3D pnp_irq(dev, 0);
+ else
+ return -EINVAL;
+
+ if (pnp_dma_valid(dev, 0) &&
+ !(pnp_dma_flags(dev, 0) & IORESOURCE_DISABLED))
+ dma =3D pnp_dma(dev, 0);
+ else
+ return -EINVAL;
+
+ if (smsc_ircc_open(firbase, sirbase, dma, irq))
+ return -ENODEV;
+
+ return 0;
+}
+
+static struct pnp_driver smsc_ircc_pnp_driver =3D {
+ .name =3D "smsc-ircc2",
+ .id_table =3D smsc_ircc_pnp_table,
+ .probe =3D smsc_ircc_pnp_probe,
+};
+
/*
* Function smsc_ircc_init ()
*
@@ -1742,6 +1797,9 @@ static void __exit smsc_ircc_cleanup(voi
=20
IRDA_DEBUG(1, "%s\n", __FUNCTION__);
=20
+ if (pnp_registered_port)
+ pnp_unregister_driver(&smsc_ircc_pnp_driver);
+
for (i=3D0; i < 2; i++) {
if (dev_self[i])
smsc_ircc_close(dev_self[i]);
@@ -1997,8 +2055,16 @@ static int __init smsc_ircc_look_for_chi
smsc_chip_address_t *address;
char *type;
unsigned int cfg_base, found;
+ int r;
=09
found =3D 0;
+
+ r =3D pnp_register_driver(&smsc_ircc_pnp_driver);
+ if (r >=3D 0) {
+ pnp_registered_port =3D 1;
+ found +=3D r;
+ }
+
address =3D possible_addresses;
=09
while(address->cfg_base){
--=20
Ville Syrj=E4l=E4
syrjala@...
http://www.sci.fi/~syrjala/
|