All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Gothe <markus.gothe@27m.se>
To: linux-mips@linux-mips.org
Subject: Re: [PATCH] EMMA2RH I2C driver
Date: Thu, 12 Apr 2007 10:43:11 +0200	[thread overview]
Message-ID: <461DF11F.404@27m.se> (raw)

[-- Attachment #1: Type: text/plain, Size: 850 bytes --]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

As Ralf pointed out in march I've been polishing the IIC-driver for
EMMA2RH.

I've shaped up the I2C-driver to be a platform-device-driver and added
accurately memory-mapping/unmapping and irq-request/free.

There was a datastructure missing which was pretty straight forward to
figure out how to rebuild (i.e. i2c_algo_emma_data).

The patch (for the patch) is attached.

//Markus

- --
_______________________________________

Mr Markus Gothe
Software Engineer

Phone: +46 (0)13 21 81 20 (ext. 1046)
Fax: +46 (0)13 21 21 15
Mobile: +46 (0)73 718 72 80
Diskettgatan 11, SE-583 35 Linköping, Sweden
www.27m.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFGHfEc6I0XmJx2NrwRCMZ8AJ0QgruqOX2y+MxF/+RbpTbSciUsGwCfcH7M
efI4rmnlkfxNezQbOWENjRY=
=rJPp
-----END PGP SIGNATURE-----


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: i2c-emma2rh.patch --]
[-- Type: text/x-patch; name="i2c-emma2rh.patch", Size: 9115 bytes --]

--- drivers/i2c/algos/i2c-algo-emma2rh.c.orig	2007-03-15 13:32:35.000000000 +0100
+++ drivers/i2c/algos/i2c-algo-emma2rh.c	2007-04-12 10:08:58.000000000 +0200
@@ -14,7 +14,7 @@
      Copyright (C) 1995-1997 Simon G. Vogl
                    1998-2000 Hans Berglund
 
-    With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and
+    With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and
     Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey
     <mbailey@littlefeet-inc.com>
 
@@ -51,13 +51,11 @@
 #include <linux/interrupt.h>
 
 #include <linux/i2c.h>
-#include <linux/i2c-algo-emma2rh.h>
-
-#include <asm/emma2rh/emma2rh.h>
+#include "i2c-algo-emma2rh.h"
 
 #ifdef DEBUG
 #define i2c_emma2rh_debug(level,op) do { if (i2c_debug>=(level)) { op; } } while (0)
-static int i2c_debug;
+static int i2c_debug = 9;
 module_param(i2c_debug, int, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(i2c_debug,
                 "debug level - 0 off; 1 normal; 2,3 more verbose; 9 i2c-protocol");
@@ -73,13 +71,15 @@
 #define EMMA2RH_I2C_RETRIES 3
 #define EMMA2RH_I2C_TIMEOUT 100
 
-/* --- setting states on the bus with the right timing: --------------- */
+/* --- setting states on the bus with the right timing: ---------------        
+*/
 #define set_emma(adap, ctl, val) adap->setemma(adap->data, ctl, val)
 #define get_emma(adap, ctl) adap->getemma(adap->data, ctl)
 #define get_own(adap) adap->getown(adap->data)
 #define get_clock(adap) adap->getclock(adap->data)
 
-/* --- other auxiliary functions -------------------------------------- */
+/* --- other auxiliary functions --------------------------------------        
+*/
 
 static void i2c_start(struct i2c_algo_emma_data *adap)
 {
@@ -168,7 +168,8 @@
                udelay(adap->udelay);
        }
        DEB2(if (i)
-            printk(KERN_DEBUG "%s: needed %d retries for %d\n", __FUNCTION__, i, addr)) ;
+            printk(KERN_DEBUG "%s: needed %d retries for %d\n", __FUNCTION__, 
+i, addr)) ;
        return ret;
 }
 
@@ -352,7 +353,7 @@
 
 static u32 emma_func(struct i2c_adapter *adap)
 {
-       return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;
 }
 
 /* --- exported algorithm data ---------------------------------------- */
--- drivers/i2c/algos/i2c-algo-emma2rh.h.orig	2007-03-15 13:32:50.000000000 +0100
+++ drivers/i2c/algos/i2c-algo-emma2rh.h	2007-04-12 10:08:18.000000000 +0200
@@ -17,7 +17,8 @@
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/
-/* -------------------------------------------------------------------- */
+/* --------------------------------------------------------------------        
+*/
 
 #ifndef I2C_EMMA2RH_H
 #define I2C_EMMA2RH_H
@@ -102,4 +103,19 @@
 #define I2C_EMMA_SHR            0x40
 #define I2C_EMMA_INT            0x50
 #define I2C_EMMA_INTM           0x60
+
+struct i2c_algo_emma_data {
+        void *data;             /* private data for lolevel routines    */
+        void (*setemma) (void *data, int ctl, int val);
+        int  (*getemma) (void *data, int ctl);
+        int  (*getown) (void *data);
+        int  (*getclock) (void *data);
+        void (*waitforpin) (void *data);
+
+        /* local settings */
+        int udelay;
+        int timeout;
+
+};
+
 #endif                         /* I2C_EMMA2RH_H */
--- drivers/i2c/busses/i2c-emma2rh.c.orig	2007-03-15 13:33:45.000000000 +0100
+++ drivers/i2c/busses/i2c-emma2rh.c	2007-04-12 10:06:48.000000000 +0200
@@ -14,7 +14,7 @@
      Copyright (C) 1995-97 Simon G. Vogl
                    1998-99 Hans Berglund
 
-    With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
+    With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
     Frodo Looijaard <frodol@dds.nl>
 
     Partialy rewriten by Oleg I. Vdovikin for mmapped support of
@@ -47,17 +47,17 @@
 #include <linux/device.h>
 #include <linux/i2c.h>
 #include <linux/i2c-id.h>
-#include <linux/i2c-algo-emma2rh.h>
 #include <linux/platform_device.h>
 #include <asm/irq.h>
 #include <asm/io.h>
 #include <asm/atomic.h>
-#include <asm/emma2rh/emma2rh.h>
 
-#define I2C_EMMA2RH "emma2rh-iic"
+#include "../algos/i2c-algo-emma2rh.h"
+
 static int i2c_debug = 0;
 
-/* ----- global defines ----------------------------------------------- */
+/* ----- global defines -----------------------------------------------        
+*/
 #define DEB(x) if (i2c_debug>=1) x
 #define DEB2(x) if (i2c_debug>=2) x
 #define DEB3(x) if (i2c_debug>=3) x
@@ -75,7 +75,8 @@
        wait_queue_head_t wait;
 };
 
-/* ----- local functions ----------------------------------------------*/
+/* ----- local functions ----------------------------------------------        
+*/
 static void i2c_emma_setbyte(void *data, int ctl, int val)
 {
        int address = ((struct i2c_drvdata *)data)->base + ctl;
@@ -148,9 +149,8 @@
                udelay(100);
 }
 
-static int __devinit i2c_emma_probe(struct device *dev)
+static int __devinit i2c_emma_probe(struct platform_device *pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
        struct i2c_drvdata *dd;
        int err = 0;
        struct resource *r;
@@ -167,81 +167,108 @@
        dd->alg.getclock = i2c_emma_getclock;
        dd->alg.waitforpin = i2c_emma_waitforpin;
        dd->alg.udelay = 80;
-       dd->alg.mdelay = 80;
        dd->alg.timeout = 200;
 
-       strcpy(dd->adap.name, dev->bus_id);
+       strcpy(dd->adap.name, pdev->name);
        dd->adap.id = 0x00;
        dd->adap.algo = NULL;
        dd->adap.algo_data = &dd->alg;
        dd->adap.client_register = i2c_emma_reg;
        dd->adap.client_unregister = i2c_emma_unreg;
 
-       spin_lock_init(&dd->lock);
-
-       atomic_set(&dd->pending,0);
-       init_waitqueue_head(&dd->wait);
-
-       dev_set_drvdata(dev, dd);
-
-       r = platform_get_resource(pdev, 0, 0);
-       /* get resource of type '0' with #0 */
 
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);/* get resource of type '0' with #0 */
+       
        if (!r) {
                printk("Cannot get resource\n");
                err = -ENODEV;
                goto out_free;
-       }
-       dd->base = r->start;
-
+	}
+	
+	if (!request_mem_region(r->start, r->end - r->start + 1, pdev->name)) {
+		printk("Memory region busy\n");
+		err = -EBUSY;
+		goto out_mem_region;
+	}
+	
+	dd->base = ioremap_nocache(r->start, r->end - r->start);
+	if (!dd->base) {
+		printk("Unable to map registers\n");
+		err = -EIO;
+		goto out_ioremap;
+	}
+	
        dd->irq = platform_get_irq(pdev,0);
        dd->clock = FAST397;
        dd->own = 0x40 + pdev->id * 4;
 
-       err = request_irq(dd->irq, i2c_emma_handler, 0, dev->bus_id, dd);
+       err = request_irq(dd->irq, i2c_emma_handler, 0, pdev->name, dd);
        if (err < 0)
                goto out_free;
+       
+       spin_lock_init(&dd->lock);
 
+       atomic_set(&dd->pending,0);
+       init_waitqueue_head(&dd->wait);
+
+       platform_set_drvdata(pdev, dd);
+       
        if ((err = i2c_emma_add_bus(&dd->adap)) < 0)
                goto out_irq;
 
        return 0;
+
 out_irq:
-       free_irq(dd->irq, dev->bus_id);
+	free_irq(dd->irq, dd);
+out_ioremap:
+	iounmap(dd->base);
+out_mem_region:
+	release_mem_region(r->start, r->end - r->start + 1);
 out_free:
-       kfree(dd);
+	kfree(dd);
 out:
-       return err;
+	return err;
 }
 
-static int __devexit i2c_emma_remove (struct device *dev)
+static int __devexit i2c_emma_remove (struct platform_device *pdev)
 {
-       struct i2c_drvdata* dd = dev_get_drvdata(dev);
-
-       if (dd) {
-               disable_irq(dd->irq);
-               free_irq(dd->irq, dev->bus_id);
-               i2c_emma_del_bus(&dd->adap);
-               kfree(dd);
-       }
-       return 0;
-}
-
-static struct device_driver i2c_emma_driver = {
-       .bus = &platform_bus_type,
-       .name = I2C_EMMA2RH,
-       .probe = i2c_emma_probe,
-       .remove = i2c_emma_remove,
+	struct i2c_drvdata* dd = platform_get_drvdata(pdev);
+	struct resource *r;
+	
+	i2c_emma_del_bus(&dd->adap);
+	platform_set_drvdata(pdev, NULL);
+	r = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+	if(r)
+		free_irq(r->start, dd);
+
+	iounmap(dd->base);
+	
+	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if(r)
+		release_mem_region(r->start, r->end - r->start + 1);
+	kfree(dd);
+
+	return 0;
+}
+
+static struct platform_driver i2c_emma_driver = {
+	.probe = i2c_emma_probe,
+	.remove = __devexit_p(i2c_emma_remove),
+	.driver = {
+		.owner = THIS_MODULE,
+		.bus = &platform_bus_type,
+		.name = "emma2rh-iic",
+	}
 };
 
 static int __init i2c_emma_init(void)
 {
-       return driver_register(&i2c_emma_driver);
+       return platform_driver_register(&i2c_emma_driver);
 }
 
 static void __exit i2c_emma_exit(void)
 {
-       driver_unregister(&i2c_emma_driver);
+       platform_driver_unregister(&i2c_emma_driver);
 }
 
 MODULE_AUTHOR("NEC Electronics Corporation <www.necel.com>");

             reply	other threads:[~2007-04-12  8:44 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-12  8:43 Markus Gothe [this message]
2007-04-12 14:49 ` [PATCH] EMMA2RH I2C driver Sergei Shtylyov
     [not found] <20070308145948.GA4235@linux-mips.org>
2007-03-13 17:59 ` dmitry pervushin
2007-03-14 17:52   ` Ralf Baechle

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=461DF11F.404@27m.se \
    --to=markus.gothe@27m.se \
    --cc=linux-mips@linux-mips.org \
    /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.