i2c-pca-isa.c revision 22f8b2695eda496026623020811cae34590ee3d7
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  i2c-pca-isa.c driver for PCA9564 on ISA boards
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Copyright (C) 2004 Arcom Control Systems
4c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang *    Copyright (C) 2008 Pengutronix
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is free software; you can redistribute it and/or modify
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  it under the terms of the GNU General Public License as published by
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  the Free Software Foundation; either version 2 of the License, or
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  (at your option) any later version.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is distributed in the hope that it will be useful,
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  but WITHOUT ANY WARRANTY; without even the implied warranty of
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  GNU General Public License for more details.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  You should have received a copy of the GNU General Public License
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  along with this program; if not, write to the Free Software
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/moduleparam.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
262378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang#include <linux/jiffies.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/wait.h>
305cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare#include <linux/isa.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/i2c.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/i2c-algo-pca.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
37c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang#define DRIVER "i2c-pca-isa"
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IO_SIZE 4
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Hermanstatic unsigned long base;
41ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Hermanstatic int irq = -1;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Data sheet recommends 59kHz for 100kHz operation due to variation
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in the actual clock rate */
45eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costastatic int clock  = 59000;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
472378bc09b91b0702fac7823828a614fd8016a29fWolfram Sangstatic struct i2c_adapter pca_isa_ops;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic wait_queue_head_t pca_wait;
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sangstatic void pca_isa_writebyte(void *pd, int reg, int val)
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG_IO
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	static char *names[] = { "T/O", "DAT", "ADR", "CON" };
54154d22b04ae1741c5fcfd5d747b813a9a279abffFrank Seidel	printk(KERN_DEBUG "*** write %s at %#lx <= %#04x\n", names[reg],
55154d22b04ae1741c5fcfd5d747b813a9a279abffFrank Seidel	       base+reg, val);
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(val, base+reg);
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sangstatic int pca_isa_readbyte(void *pd, int reg)
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int res = inb(base+reg);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG_IO
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
653d4382913f9a86f0d9ff47740feb427415fe7234Wolfram Sang		static char *names[] = { "STA", "DAT", "ADR", "CON" };
66154d22b04ae1741c5fcfd5d747b813a9a279abffFrank Seidel		printk(KERN_DEBUG "*** read  %s => %#04x\n", names[reg], res);
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return res;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
72c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sangstatic int pca_isa_waitforcompletion(void *pd)
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
742378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang	long ret = ~0;
752378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang	unsigned long timeout;
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (irq > -1) {
7822f8b2695eda496026623020811cae34590ee3d7Wolfram Sang		ret = wait_event_timeout(pca_wait,
792378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang				pca_isa_readbyte(pd, I2C_PCA_CON)
802378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang				& I2C_PCA_CON_SI, pca_isa_ops.timeout);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
822378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang		/* Do polling */
832378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang		timeout = jiffies + pca_isa_ops.timeout;
842378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang		while (((pca_isa_readbyte(pd, I2C_PCA_CON)
852378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang				& I2C_PCA_CON_SI) == 0)
862378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang				&& (ret = time_before(jiffies, timeout)))
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			udelay(100);
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
892378bc09b91b0702fac7823828a614fd8016a29fWolfram Sang	return ret > 0;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
92c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sangstatic void pca_isa_resetchip(void *pd)
93c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang{
94c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang	/* apparently only an external reset will do it. not a lot can be done */
95c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang	printk(KERN_WARNING DRIVER ": Haven't figured out how to do a reset yet\n");
96c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang}
97c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang
987d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellsstatic irqreturn_t pca_handler(int this_irq, void *dev_id) {
9922f8b2695eda496026623020811cae34590ee3d7Wolfram Sang	wake_up(&pca_wait);
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return IRQ_HANDLED;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct i2c_algo_pca_data pca_isa_data = {
104c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang	/* .data intentionally left NULL, not needed with ISA */
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.write_byte		= pca_isa_writebyte,
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.read_byte		= pca_isa_readbyte,
107c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang	.wait_for_completion	= pca_isa_waitforcompletion,
108c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang	.reset_chip		= pca_isa_resetchip,
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct i2c_adapter pca_isa_ops = {
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.owner          = THIS_MODULE,
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.algo_data	= &pca_isa_data,
114eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa	.name		= "PCA9564/PCA9665 ISA Adapter",
1158e99ada8deaa9033600cd2c7d0a9366b0e99ab68Wolfram Sang	.timeout	= HZ,
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
118ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Hermanstatic int __devinit pca_isa_match(struct device *dev, unsigned int id)
119ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman{
120ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman	int match = base != 0;
121ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman
122ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman	if (match) {
123ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman		if (irq <= -1)
124ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman			dev_warn(dev, "Using polling mode (specify irq)\n");
125ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman	} else
126ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman		dev_err(dev, "Please specify I/O base\n");
127ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman
128ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman	return match;
129ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman}
130ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman
1315cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvarestatic int __devinit pca_isa_probe(struct device *dev, unsigned int id)
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_waitqueue_head(&pca_wait);
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1355cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	dev_info(dev, "i/o base %#08lx. irq %d\n", base, irq);
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13768e1ee62f0f8e556642a59ebaf0c2cc2ac6ccfa6Kumar Gala#ifdef CONFIG_PPC
138104cb574feb3033299568483a3f68031f47e0d43Christian Krafft	if (check_legacy_ioport(base)) {
139104cb574feb3033299568483a3f68031f47e0d43Christian Krafft		dev_err(dev, "I/O address %#08lx is not available\n", base);
140104cb574feb3033299568483a3f68031f47e0d43Christian Krafft		goto out;
141104cb574feb3033299568483a3f68031f47e0d43Christian Krafft	}
142104cb574feb3033299568483a3f68031f47e0d43Christian Krafft#endif
143104cb574feb3033299568483a3f68031f47e0d43Christian Krafft
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!request_region(base, IO_SIZE, "i2c-pca-isa")) {
1455cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare		dev_err(dev, "I/O address %#08lx is in use\n", base);
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (irq > -1) {
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (request_irq(irq, pca_handler, 0, "i2c-pca-isa", &pca_isa_ops) < 0) {
1515cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare			dev_err(dev, "Request irq%d failed\n", irq);
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto out_region;
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
156c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang	pca_isa_data.i2c_clock = clock;
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (i2c_pca_add_bus(&pca_isa_ops) < 0) {
1585cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare		dev_err(dev, "Failed to add i2c bus\n");
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out_irq;
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out_irq:
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (irq > -1)
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		free_irq(irq, &pca_isa_ops);
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out_region:
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	release_region(base, IO_SIZE);
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out:
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -ENODEV;
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1735cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvarestatic int __devexit pca_isa_remove(struct device *dev, unsigned int id)
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1753269711b76ba27b78862c48398b0d313ccaa99c2Jean Delvare	i2c_del_adapter(&pca_isa_ops);
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
177ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman	if (irq > -1) {
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		disable_irq(irq);
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		free_irq(irq, &pca_isa_ops);
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	release_region(base, IO_SIZE);
1825cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare
1835cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	return 0;
1845cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare}
1855cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare
1865cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvarestatic struct isa_driver pca_isa_driver = {
187ce5640330b10c6cecfbda50569b9f53c081d10c6Rene Herman	.match		= pca_isa_match,
1885cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	.probe		= pca_isa_probe,
1895cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	.remove		= __devexit_p(pca_isa_remove),
1905cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	.driver = {
1915cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare		.owner	= THIS_MODULE,
192c01b0831057381c7f6e0bfb3634bac8c5f7fb256Wolfram Sang		.name	= DRIVER,
1935cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	}
1945cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare};
1955cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare
1965cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvarestatic int __init pca_isa_init(void)
1975cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare{
1985cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	return isa_register_driver(&pca_isa_driver, 1);
1995cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare}
2005cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare
2015cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvarestatic void __exit pca_isa_exit(void)
2025cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare{
2035cedb05db3c3084c9641403dd24c310a6b3ea19fJean Delvare	isa_unregister_driver(&pca_isa_driver);
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
207eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da CostaMODULE_DESCRIPTION("ISA base PCA9564/PCA9665 driver");
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(base, ulong, 0);
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(base, "I/O base address");
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(irq, int, 0);
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(irq, "IRQ");
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(clock, int, 0);
216eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da CostaMODULE_PARM_DESC(clock, "Clock rate in hertz.\n\t\t"
217eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa		"For PCA9564: 330000,288000,217000,146000,"
218eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa		"88000,59000,44000,36000\n"
219eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa		"\t\tFor PCA9665:\tStandard: 60300 - 100099\n"
220eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa		"\t\t\t\tFast: 100100 - 400099\n"
221eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa		"\t\t\t\tFast+: 400100 - 10000099\n"
222eff9ec95efaaf6b12d230f0ea7d3c295d3bc9d57Marco Aurelio da Costa		"\t\t\t\tTurbo: Up to 1265800");
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(pca_isa_init);
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(pca_isa_exit);
226