All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 16/24] mxc_i2c: prep work for multiple busses support
Date: Fri, 22 Jun 2012 19:08:30 +0200	[thread overview]
Message-ID: <201206221908.31151.marex@denx.de> (raw)
In-Reply-To: <1340338339-11626-16-git-send-email-troy.kisky@boundarydevices.com>

Dear Troy Kisky,

> Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
> ---
>  drivers/i2c/mxc_i2c.c |  121
> ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 100
> insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
> index cb061f7..ec05798 100644
> --- a/drivers/i2c/mxc_i2c.c
> +++ b/drivers/i2c/mxc_i2c.c
> @@ -58,9 +58,7 @@ struct mxc_i2c_regs {
>  #define I2SR_IIF	(1 << 1)
>  #define I2SR_RX_NO_AK	(1 << 0)
> 
> -#ifdef CONFIG_SYS_I2C_BASE
> -#define I2C_BASE	CONFIG_SYS_I2C_BASE
> -#else
> +#if defined(CONFIG_HARD_I2C) && !defined(CONFIG_SYS_I2C_BASE)
>  #error "define CONFIG_SYS_I2C_BASE to use the mxc_i2c driver"
>  #endif
> 
> @@ -114,11 +112,11 @@ static uint8_t i2c_imx_get_clk(unsigned int rate)
>  }
> 
>  /*
> - * Init I2C Bus
> + * Set I2C Bus speed
>   */
> -void i2c_init(int speed, int unused)
> +int bus_i2c_set_bus_speed(void *base, int speed)
>  {
> -	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;
> +	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)base;
>  	u8 clk_idx = i2c_imx_get_clk(speed);
>  	u8 idx = i2c_clk_div[clk_idx][1];
> 
> @@ -128,23 +126,15 @@ void i2c_init(int speed, int unused)
>  	/* Reset module */
>  	writeb(0, &i2c_regs->i2cr);
>  	writeb(0, &i2c_regs->i2sr);
> -}
> -
> -/*
> - * Set I2C Speed
> - */
> -int i2c_set_bus_speed(unsigned int speed)
> -{
> -	i2c_init(speed, 0);
>  	return 0;
>  }
> 
>  /*
>   * Get I2C Speed
>   */
> -unsigned int i2c_get_bus_speed(void)
> +unsigned int bus_i2c_get_bus_speed(void *base)
>  {
> -	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;
> +	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)base;
>  	u8 clk_idx = readb(&i2c_regs->ifdr);
>  	u8 clk_div;
> 
> @@ -282,12 +272,13 @@ static int i2c_init_transfer(struct mxc_i2c_regs
> *i2c_regs, /*
>   * Read data from I2C device
>   */
> -int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
> +int bus_i2c_read(void *base, uchar chip, uint addr, int alen, uchar *buf,
> +		int len)
>  {
> -	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;
>  	int ret;
>  	unsigned int temp;
>  	int i;
> +	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)base;
> 
>  	ret = i2c_init_transfer(i2c_regs, chip, addr, alen);
>  	if (ret)
> @@ -338,11 +329,12 @@ int i2c_read(uchar chip, uint addr, int alen, uchar
> *buf, int len) /*
>   * Write data to I2C device
>   */
> -int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
> +int bus_i2c_write(void *base, uchar chip, uint addr, int alen, uchar *buf,
> +		int len)
>  {
> -	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)I2C_BASE;
>  	int ret;
>  	int i;
> +	struct mxc_i2c_regs *i2c_regs = (struct mxc_i2c_regs *)base;
> 
>  	ret = i2c_init_transfer(i2c_regs, chip, addr, alen);
>  	if (ret)
> @@ -359,10 +351,97 @@ int i2c_write(uchar chip, uint addr, int alen, uchar
> *buf, int len) return ret;
>  }
> 
> +typedef void (*toggle_i2c_fn)(void *p);

I really don't like this kind of stuff ... who's supposed to look for this 
typedefs. It makes the code not obviously clear.

> +#ifdef CONFIG_I2C_MULTI_BUS
> +static unsigned g_bus;
> +#else
> +#define g_bus 0
> +#endif
> +
> +struct i2c_parms {
> +	void *base;
> +	void *toggle_data;
> +	toggle_i2c_fn toggle_fn;
> +};
> +
> +struct i2c_parms g_parms[3];
> +
> +void *get_base(void)

static? Or this is part of i2c api?

> +{
> +#ifndef CONFIG_SYS_I2C_BASE
> +	return g_parms[g_bus].base;
> +#elif defined(CONFIG_I2C_MULTI_BUS)
> +	void *ret = g_parms[g_bus].base;
> +	if (!ret)
> +		ret = (void *)CONFIG_SYS_I2C_BASE;
> +	return ret;
> +#else
> +	return (void *)CONFIG_SYS_I2C_BASE;
> +#endif
> +}
> +
> +int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
> +{
> +	return bus_i2c_read(get_base(), chip, addr, alen, buf, len);
> +}
> +
> +int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
> +{
> +	return bus_i2c_write(get_base(), chip, addr, alen, buf, len);
> +}
>  /*
>   * Try if a chip add given address responds (probe the chip)
>   */
>  int i2c_probe(uchar chip)
>  {
> -	return i2c_write(chip, 0, 0, NULL, 0);
> +	return bus_i2c_write(get_base(), chip, 0, 0, NULL, 0);
> +}
> +
> +void bus_i2c_init(void *base, int speed, int unused,
> +		toggle_i2c_fn toggle_fn, void *toggle_data)
> +{
> +	int i = 0;
> +	struct i2c_parms *p = g_parms;
> +	if (!base)
> +		return;
> +	for (;;) {
> +		if (!p->base || (p->base == base)) {
> +			p->base = base;
> +			if (toggle_data) {
> +				p->toggle_data = toggle_data;
> +				p->toggle_fn = toggle_fn;
> +			}
> +			break;
> +		}
> +		p++;
> +		i++;
> +		if (i >= ARRAY_SIZE(g_parms))
> +			return;
> +	}
> +	bus_i2c_set_bus_speed(base, speed);
> +}
> +
> +/*
> + * Init I2C Bus
> + */
> +void i2c_init(int speed, int unused)
> +{
> +	bus_i2c_init(get_base(), speed, unused, NULL, NULL);
> +}
> +
> +/*
> + * Set I2C Speed
> + */
> +int i2c_set_bus_speed(unsigned int speed)
> +{
> +	return bus_i2c_set_bus_speed(get_base(), speed);
> +}
> +
> +/*
> + * Get I2C Speed
> + */
> +unsigned int i2c_get_bus_speed(void)
> +{
> +	return bus_i2c_get_bus_speed(get_base());
>  }

  reply	other threads:[~2012-06-22 17:08 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-22  4:11 [U-Boot] [PATCH 01/24] mxc_i2c: fix i2c_imx_stop Troy Kisky
2012-06-22  4:11 ` [U-Boot] [PATCH 02/24] mxc_i2c: remove ifdef of CONFIG_HARD_I2C Troy Kisky
2012-06-22 16:55   ` Marek Vasut
2012-06-22  4:11 ` [U-Boot] [PATCH 03/24] mxc_i2c: create tx_byte function Troy Kisky
2012-06-22 16:58   ` Marek Vasut
2012-06-22 23:05     ` Troy Kisky
2012-06-23  1:51       ` Marek Vasut
2012-06-22  4:11 ` [U-Boot] [PATCH 04/24] mxc_i2c: clear i2sr before waiting for bit Troy Kisky
2012-06-22 16:59   ` Marek Vasut
2012-06-24  0:18     ` Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 05/24] mxc_i2c: create i2c_init_transfer Troy Kisky
2012-06-22 16:59   ` Marek Vasut
2012-06-24  8:06   ` Stefano Babic
2012-06-22  4:12 ` [U-Boot] [PATCH 06/24] mxc_i2c.c: code i2c_probe as a 0 length i2c_write Troy Kisky
2012-06-22 17:00   ` Marek Vasut
2012-06-24  8:03   ` Stefano Babic
2012-06-22  4:12 ` [U-Boot] [PATCH 07/24] mxc_i2c: combine i2c_imx_bus_busy and i2c_imx_trx_complete into wait_for_sr_state Troy Kisky
2012-06-22 17:01   ` Marek Vasut
2012-06-22 17:34     ` Troy Kisky
2012-06-22 18:01       ` Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 08/24] mxc_i2c: remove redundant read Troy Kisky
2012-06-22 17:02   ` Marek Vasut
2012-06-22  4:12 ` [U-Boot] [PATCH 09/24] mxc_i2c: place imx_start code inline Troy Kisky
2012-06-22 17:02   ` Marek Vasut
2012-06-22  4:12 ` [U-Boot] [PATCH 10/24] mxc_i2c: place i2c_reset " Troy Kisky
2012-06-22 17:03   ` Marek Vasut
2012-06-22  4:12 ` [U-Boot] [PATCH 11/24] mxc_i2c: don't disable controller after every transaction Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 12/24] mxc_i2c: change slave addr if conflicts with destination Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 13/24] mxc_i2c: check for arbitration lost Troy Kisky
2012-06-22 17:04   ` Marek Vasut
2012-06-22  4:12 ` [U-Boot] [PATCH 14/24] mxc_i2c: add retries Troy Kisky
2012-06-22 17:06   ` Marek Vasut
2012-06-22 17:40     ` Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 15/24] mxc_i2c: add i2c_regs argument to i2c_imx_stop Troy Kisky
2012-06-22 17:06   ` Marek Vasut
2012-06-22  4:12 ` [U-Boot] [PATCH 16/24] mxc_i2c: prep work for multiple busses support Troy Kisky
2012-06-22 17:08   ` Marek Vasut [this message]
2012-06-24  8:47   ` Heiko Schocher
2012-06-24 20:08     ` Marek Vasut
2012-06-24 22:09       ` Wolfgang Denk
2012-06-22  4:12 ` [U-Boot] [PATCH 17/24] mxc_i2c: add bus recovery support Troy Kisky
2012-06-24  8:51   ` Heiko Schocher
2012-06-26  3:42     ` Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 18/24] mxc_i2c.c: finish adding CONFIG_I2C_MULTI_BUS support Troy Kisky
2012-06-22 17:09   ` Marek Vasut
2012-06-22 19:41     ` Troy Kisky
2012-06-25  3:34       ` Tabi Timur-B04825
2012-06-22  4:12 ` [U-Boot] [PATCH 19/24] iomux-v3: remove include of mx6x_pins.h Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 20/24] i.mx: iomux-v3.h: move to imx-common include directory Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 21/24] i.mx: iomux-v3.c: move to imx-common directory Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 22/24] i.mx53: add definition for I2C3_BASE_ADDR Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 23/24] imx-common: add i2c.c for bus recovery support Troy Kisky
2012-06-22  4:12 ` [U-Boot] [PATCH 24/24] mx6qsabrelite: add i2c multi-bus support Troy Kisky
2012-06-22 16:55 ` [U-Boot] [PATCH 01/24] mxc_i2c: fix i2c_imx_stop Marek Vasut
2012-06-24  7:49 ` Stefano Babic

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=201206221908.31151.marex@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /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.