From: Jeff Garzik <jgarzik@mandrakesoft.com>
To: Albert Cranford <ac9410@attbi.com>
Cc: Linus Torvalds <torvalds@transmeta.com>,
Kernel mailing list <linux-kernel@vger.kernel.org>
Subject: Re: [patch 3/9]Four new i2c drivers and __init/__exit cleanup to i2c
Date: Sun, 15 Sep 2002 19:06:40 -0400 [thread overview]
Message-ID: <3D851280.4030504@mandrakesoft.com> (raw)
In-Reply-To: Pine.LNX.4.44.0209151836230.7637-200000@home1
Albert Cranford wrote:
> +#ifdef MODULE_LICENSE
> +MODULE_LICENSE("GPL");
> +#endif
kill the ifdef
> +#if 0
> +static void iic_ibmocp_sleep(unsigned long timeout)
> +{
> + schedule_timeout( timeout * HZ);
> +}
> +#endif
dead code
> +
> +
> +//
> +// Description: Put this process to sleep. We will wake up when the
> +// IIC controller interrupts.
> +//
> +static void iic_ibmocp_waitforpin(void *data) {
> +
> + int timeout = 2;
> + struct iic_ibm *priv_data = data;
> +
> + //
> + // If interrupts are enabled (which they are), then put the process to
> + // sleep. This process will be awakened by two events -- either the
> + // the IIC peripheral interrupts or the timeout expires.
> + //
> + if (priv_data->iic_irq > 0) {
> + local_irq_disable();
> + if (iic_pending == 0) {
> + interruptible_sleep_on_timeout(&(iic_wait[priv_data->index]), timeout*HZ );
> + } else
> + iic_pending = 0;
> + local_irq_enable();
ug ug ug.
> + } else {
> + //
> + // If interrupts are not enabled then delay for a reasonable amount
> + // of time and return. We expect that by time we return to the calling
> + // function that the IIC has finished our requested transaction and
> + // the status bit reflects this.
> + //
> + // udelay is probably not the best choice for this since it is
> + // the equivalent of a busy wait
> + //
> + udelay(100);
what context is this?
> +
> +//
> +// Description: This function is very hardware dependent. First, we lock
> +// the region of memory where out registers exist. Next, we request our
> +// interrupt line and register its associated handler. Our IIC peripheral
> +// uses interrupt number 2, as specified by the 405 reference manual.
> +//
> +static int iic_hw_resrc_init(int instance)
> +{
> +
> + DEB(printk("iic_hw_resrc_init: Physical Base address: 0x%x\n", (u32) IIC_ADDR[instance] ));
> + iic_ibmocp_adaps[instance]->iic_base = (u32)ioremap((unsigned long)IIC_ADDR[instance],PAGE_SIZE);
check for failure
> +
> + DEB(printk("iic_hw_resrc_init: ioremapped base address: 0x%x\n", iic_ibmocp_adaps[instance]->iic_base));
> +
> + if (iic_ibmocp_adaps[instance]->iic_irq > 0) {
> +
> + if (request_irq(iic_ibmocp_adaps[instance]->iic_irq, iic_ibmocp_handler,
> + 0, "IBM OCP IIC", iic_ibmocp_adaps[instance]) < 0) {
> + printk(KERN_ERR "iic_hw_resrc_init: Request irq%d failed\n",
> + iic_ibmocp_adaps[instance]->iic_irq);
> + iic_ibmocp_adaps[instance]->iic_irq = 0;
> + } else {
> + DEB3(printk("iic_hw_resrc_init: Enabled interrupt\n"));
> + }
> + }
> + return 0;
you blindly return zero even if request_irq fails... is this correct?
> +}
> +
> +
> +//
> +// Description: Release irq and memory
> +//
> +static void iic_ibmocp_release(void)
> +{
> + int i;
> +
> + for(i=0; i<IIC_NUMS; i++) {
> + struct iic_ibm *priv_data = (struct iic_ibm *)iic_ibmocp_data[i]->data;
> + if (priv_data->iic_irq > 0) {
> + disable_irq(priv_data->iic_irq);
> + free_irq(priv_data->iic_irq, 0);
> + }
> + kfree(iic_ibmocp_data[i]);
> + kfree(iic_ibmocp_ops[i]);
> + }
> +}
where is the matching iounmap() call for the above? leak.
> +static void iic_ibmocp_inc_use(struct i2c_adapter *adap)
> +{
> +#ifdef MODULE
> + MOD_INC_USE_COUNT;
> +#endif
> +}
> +
> +
> +//
> +// Description: If this is a module, then decrement the count
> +//
> +static void iic_ibmocp_dec_use(struct i2c_adapter *adap)
> +{
> +#ifdef MODULE
> + MOD_DEC_USE_COUNT;
> +#endif
> +}
kill the ifdefs. use ->owner instead if possible.
> +
> +//
> +// Description: Called when the module is loaded. This function starts the
> +// cascade of calls up through the heirarchy of i2c modules (i.e. up to the
> +// algorithm layer and into to the core layer)
> +//
> +int __init iic_ibmocp_init(void)
> +{
> + int i;
> +
> + printk(KERN_INFO "iic_ibmocp_init: IBM on-chip iic adapter module\n");
> +
> + for(i=0; i<IIC_NUMS; i++) {
> + iic_ibmocp_data[i] = kmalloc(sizeof(struct i2c_algo_iic_data),GFP_KERNEL);
> + if(iic_ibmocp_data[i] == NULL) {
> + return -ENOMEM;
> + }
> + memset(iic_ibmocp_data[i], 0, sizeof(struct i2c_algo_iic_data));
> +
> + switch (i) {
> + case 0:
> + iic_ibmocp_adaps[i]->iic_irq = IIC_IRQ(0);
> + break;
> + case 1:
> + iic_ibmocp_adaps[i]->iic_irq = IIC_IRQ(1);
> + break;
> + }
> + iic_ibmocp_adaps[i]->iic_clock = IIC_CLOCK;
> + iic_ibmocp_adaps[i]->iic_own = IIC_OWN;
> + iic_ibmocp_adaps[i]->index = i;
> +
> + DEB(printk("irq %x\n", iic_ibmocp_adaps[i]->iic_irq));
> + DEB(printk("clock %x\n", iic_ibmocp_adaps[i]->iic_clock));
> + DEB(printk("own %x\n", iic_ibmocp_adaps[i]->iic_own));
> + DEB(printk("index %x\n", iic_ibmocp_adaps[i]->index));
> +
> +
> + iic_ibmocp_data[i]->data = (struct iic_regs *)iic_ibmocp_adaps[i];
> + iic_ibmocp_data[i]->setiic = iic_ibmocp_setbyte;
> + iic_ibmocp_data[i]->getiic = iic_ibmocp_getbyte;
> + iic_ibmocp_data[i]->getown = iic_ibmocp_getown;
> + iic_ibmocp_data[i]->getclock = iic_ibmocp_getclock;
> + iic_ibmocp_data[i]->waitforpin = iic_ibmocp_waitforpin;
> + iic_ibmocp_data[i]->udelay = 80;
> + iic_ibmocp_data[i]->mdelay = 80;
> + iic_ibmocp_data[i]->timeout = 100;
> +
> + iic_ibmocp_ops[i] = kmalloc(sizeof(struct i2c_adapter), GFP_KERNEL);
> + if(iic_ibmocp_ops[i] == NULL) {
> + return -ENOMEM;
memory leak -- free above kmalloc on error
> +// If modules is NOT defined when this file is compiled, then the MODULE_*
> +// macros will resolve to nothing
> +//
> +MODULE_AUTHOR("MontaVista Software <www.mvista.com>");
> +MODULE_DESCRIPTION("I2C-Bus adapter routines for PPC 405 IIC bus adapter");
> +MODULE_PARM(base, "i");
> +MODULE_PARM(irq, "i");
> +MODULE_PARM(clock, "i");
> +MODULE_PARM(own, "i");
> +MODULE_PARM(i2c_debug,"i");
> +
> +
> +module_init(iic_ibmocp_init);
> +module_exit(iic_ibmocp_exit);
nice! why don't the other drivers look like this? ;-)
prev parent reply other threads:[~2002-09-15 23:02 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-09-15 22:37 [patch 3/9]Four new i2c drivers and __init/__exit cleanup to i2c Albert Cranford
2002-09-15 23:06 ` Jeff Garzik [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3D851280.4030504@mandrakesoft.com \
--to=jgarzik@mandrakesoft.com \
--cc=ac9410@attbi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.