public inbox for linux-i2c@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Korsgaard <jacmet-OfajU3CKLf1/SzgSGea1oA@public.gmane.org>
To: Rodolfo Giometti <giometti-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org>
Cc: Ben Dooks <ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>,
	i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org,
	Kumar Gala
	<galak-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH] i2c: virtual i2c adapter support.
Date: Sun, 22 Jun 2008 21:48:39 +0200	[thread overview]
Message-ID: <87hcblqmi0.fsf@macbook.be.48ers.dk> (raw)
In-Reply-To: <20080622125010.GP10695-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org> (Rodolfo Giometti's message of "Sun\, 22 Jun 2008 14\:50\:10 +0200")

>>>>> "Rodolfo" == Rodolfo Giometti <giometti-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org> writes:

 Rodolfo> On Sun, Jun 22, 2008 at 12:53:11PM +0200, Peter Korsgaard wrote:
 >> >>>>> "Rodolfo" == Rodolfo Giometti <giometti-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org> writes:
 >> 
 Rodolfo> Maybe if you provide a littke code I may understand exactly
 Rodolfo> what you mean. ;)
 >> 
 >> But I did?!

 Rodolfo> I mean the code that shows how you wish adding your i2c mux
 Rodolfo> by using i2c_add_virt_adapter(). :)

Pretty much like the pcf driver, E.G. something like (not compile
tested):

#define THINLITEMUX_BUSSES 6
#define THINLITEMUX_IDLE   7

struct thinlitemux_i2c {
	u16 __iomem *base;
	struct i2c_adapter *parent;
	struct i2c_adapter *adap{TINLITEMUX_BUSSES];
};

static int thinlitemux_select(struct i2c_adapter *adap,
			      struct i2c_client *client, u32 chan)
{
        struct thinlitemux_i2c *i2c = (struct thinlitemux_i2c*)client;

        out_be16(i2c->base, chan);
}

static int thinlitemux_deselect(struct i2c_adapter *adap,
				struct i2c_client *client, u32 value)
{
        struct thinlitemux_i2c *i2c = (struct thinlitemux_i2c*)client;

        out_be16(i2c->base, THINLITEMUX_IDLE);
}

static int __devinit thinlitemux_probe(struct platform_device *pdev)
{
	struct thinlitemux_i2c *i2c;
	struct i2c_adapter *adap;
	struct resource *res;
	u16 __iomem *base;
	int i, j, ret;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res)
		return -ENODEV;

	i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
	if (!i2c) {
		ret = -ENOMEM;
		goto alloc_failed;
	}

	i2c->parent = i2c_get_adapter((int)pdev->dev.platform_data);
	if (!i2c->parent) {
		dev_err(&pdev->dev, "Parent adapter (%d) not found\n",
			(int)pdev->dev.platform_data);
		ret = -ENODEV;
                goto no_parent;
	}

	i2c->base = ioremap(res->start, res->end - res->start + 1);
	if (!i2c->base) {
		dev_err(&pdev->dev, "Unable to map registers\n");
		ret = -EIO;
		goto map_failed;
	}

	/* disable parent bus so probes won't find devices on it */
        thinlitemux_deselect(i2c->parent, NULL, 0);

	for (i=0; i<THINLITEMUX_BUSSES; i++) {
                i2c->adap[i]   = i2c_add_virt_adapter(i2c->parent, i2c, 0, i,
                              &thinlitemux_select, &thinlitemux_deselect);
                if (!i2c->adap[i]) {
			dev_err(&pdev->dev, "Failed to add adapter %d\n", i);
			goto add_adapter_failed;
		}
	}

	dev_info(&pdev->dev, "%d port mux at 0x%lx on %s adapter\n",
		 THINLITEMUX_BUSSES, (unsigned long)res->start, parent->name);

	platform_set_drvdata(pdev, i2c);

	return 0;

 add_adapter_failed:
	for (j=0; j<i; j++)
		i2c_del_virt_adapter(&i2c->adap[j]);
 alloc_failed:
	iounmap(i2c->base);
 map_failed:
	i2c_put_adapter(i2c->parent);
 no_parent
	kfree(i2c);

	return ret;
}

static int __devexit thinlitemux_remove(struct platform_device* pdev)
{
	struct thinlitemux_i2c *i2c = platform_get_drvdata(pdev);
	int i;

	for (i=0; i<THINLITEMUX_BUSSES; i++)
		i2c_del_virt_adapter(&i2c->adap[i]);
	iounmap(i2c->base);
	platform_set_drvdata(pdev, NULL);
	i2c_put_adapter(i2c->parent);
	kfree(i2c);

	return 0;
}

static struct platform_driver thinlitemux_driver = {
	.probe  = thinlitemux_probe,
	.remove = __devexit_p(thinlitemux_remove),
	.driver = {
		.owner = THIS_MODULE,
		.name = "thinlitei2cmux",
	},
};

static int __init thinlitemux_init(void)
{
	return platform_driver_register(&thinlitemux_driver);
}

static void __exit thinlitemux_exit(void)
{
	platform_driver_unregister(&thinlitemux_driver);
}

module_init(thinlitemux_init);
module_exit(thinlitemux_exit);

MODULE_DESCRIPTION("Barco ThinLite I2C multiplexer driver");
MODULE_AUTHOR("Peter Korsgaard <peter.korsgaard-ob4gmnvZ1/cAvxtiuMwx3w@public.gmane.org>");
MODULE_LICENSE("GPL");

 Rodolfo> However, we also should make attention at
 Rodolfo> i2c_del_virt_adapter() which must call (new)
 Rodolfo> i2c_del_adapter_nolock() since the core_lock is hold by
 Rodolfo> i2c_del_driver() when the mux is an i2c device.

 Rodolfo> If you define a virtual adapter as a non-i2c device I
 Rodolfo> suppose we should use the lock...

I guess we could do:

	if (mutex_is_locked(&core_lock))
		ret = i2c_del_adapter_nolock(adap);
	else
		ret = i2c_del_adapter(adap);

Except that core_lock is static in i2c-core.c.

-- 
Bye, Peter Korsgaard

_______________________________________________
i2c mailing list
i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
http://lists.lm-sensors.org/mailman/listinfo/i2c

  parent reply	other threads:[~2008-06-22 19:48 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-19 17:14 [PATCH v2] i2c: virtual i2c adapter support Rodolfo Giometti
     [not found] ` <1213895701-9872-1-git-send-email-giometti-k2GhghHVRtY@public.gmane.org>
2008-06-19 17:14   ` [PATCH] " Rodolfo Giometti
     [not found]     ` <1213895701-9872-2-git-send-email-giometti-k2GhghHVRtY@public.gmane.org>
2008-06-19 17:15       ` [PATCH] i2c: multiplexer i2c devices Rodolfo Giometti
     [not found]         ` <1213895701-9872-3-git-send-email-giometti-k2GhghHVRtY@public.gmane.org>
2008-06-19 17:15           ` [PATCH] i2c: driver for PCA954x I2C multiplexer series Rodolfo Giometti
2008-06-22  8:37       ` [PATCH] i2c: virtual i2c adapter support Peter Korsgaard
     [not found]         ` <87fxr5sw5f.fsf-uXGAPMMVk8amE9MCos8gUmSdvHPH+/yF@public.gmane.org>
2008-06-22  8:52           ` Rodolfo Giometti
     [not found]             ` <20080622085206.GM10695-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org>
2008-06-22  9:15               ` Peter Korsgaard
     [not found]                 ` <87bq1tsue5.fsf-uXGAPMMVk8amE9MCos8gUmSdvHPH+/yF@public.gmane.org>
2008-06-22  9:39                   ` Rodolfo Giometti
     [not found]                     ` <20080622093939.GO10695-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org>
2008-06-22 10:53                       ` Peter Korsgaard
     [not found]                         ` <8763s1spuw.fsf-uXGAPMMVk8amE9MCos8gUmSdvHPH+/yF@public.gmane.org>
2008-06-22 12:50                           ` Rodolfo Giometti
     [not found]                             ` <20080622125010.GP10695-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org>
2008-06-22 19:48                               ` Peter Korsgaard [this message]
     [not found]                                 ` <87hcblqmi0.fsf-uXGAPMMVk8amE9MCos8gUmSdvHPH+/yF@public.gmane.org>
2008-06-23  7:26                                   ` Jean Delvare
     [not found]                                     ` <20080623092658.75bddce4-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-06-23  7:51                                       ` Peter Korsgaard
     [not found]                                         ` <8763s0pp0r.fsf-uXGAPMMVk8amE9MCos8gUmSdvHPH+/yF@public.gmane.org>
2008-08-21  8:45                                           ` Rodolfo Giometti
2008-06-23  7:21                               ` Jean Delvare
2008-06-23  7:14               ` Jean Delvare

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=87hcblqmi0.fsf@macbook.be.48ers.dk \
    --to=jacmet-ofaju3cklf1/szgsgea1oa@public.gmane.org \
    --cc=ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org \
    --cc=galak-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org \
    --cc=giometti-AVVDYK/kqiJWk0Htik3J/w@public.gmane.org \
    --cc=i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox