All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v1 01/18] i2c: ihs_i2c: Dual channel support
Date: Wed, 28 Oct 2015 12:23:15 +0100	[thread overview]
Message-ID: <5630B023.3030001@denx.de> (raw)
In-Reply-To: <1446029199-11704-2-git-send-email-dirk.eibach@gdsys.cc>

Hello Dirk,

Am 28.10.2015 um 11:46 schrieb dirk.eibach at gdsys.cc:
> From: Dirk Eibach <dirk.eibach@gdsys.cc>
>
> Support two i2c masters per FPGA.
>
> Signed-off-by: Dirk Eibach <dirk.eibach@gdsys.cc>
> ---
>
>   README                |  9 ++++++
>   drivers/i2c/ihs_i2c.c | 76 ++++++++++++++++++++++++++++++++++++++++++---------
>   include/gdsys_fpga.h  | 12 ++++----
>   3 files changed, 79 insertions(+), 18 deletions(-)

I twould be nice to see a patch, which converts this driver to DM ;-)
As the hole patchserie goes not through the i2c tree:

Acked-by: Heiko Schocher <hs@denx.de>

bye,
Heiko
>
> diff --git a/README b/README
> index 0dc657d..25bd711 100644
> --- a/README
> +++ b/README
> @@ -2446,6 +2446,15 @@ CBFS (Coreboot Filesystem) support
>   		  - CONFIG_SYS_I2C_IHS_CH3 activate hardware channel 3
>   		  - CONFIG_SYS_I2C_IHS_SPEED_3 speed channel 3
>   		  - CONFIG_SYS_I2C_IHS_SLAVE_3 slave addr channel 3
> +		  - activate dual channel with CONFIG_SYS_I2C_IHS_DUAL
> +		  - CONFIG_SYS_I2C_IHS_SPEED_0_1 speed channel 0_1
> +		  - CONFIG_SYS_I2C_IHS_SLAVE_0_1 slave addr channel 0_1
> +		  - CONFIG_SYS_I2C_IHS_SPEED_1_1 speed channel 1_1
> +		  - CONFIG_SYS_I2C_IHS_SLAVE_1_1 slave addr channel 1_1
> +		  - CONFIG_SYS_I2C_IHS_SPEED_2_1 speed channel 2_1
> +		  - CONFIG_SYS_I2C_IHS_SLAVE_2_1 slave addr channel 2_1
> +		  - CONFIG_SYS_I2C_IHS_SPEED_3_1 speed channel 3_1
> +		  - CONFIG_SYS_I2C_IHS_SLAVE_3_1 slave addr channel 3_1
>
>   		additional defines:
>
> diff --git a/drivers/i2c/ihs_i2c.c b/drivers/i2c/ihs_i2c.c
> index 19fbe59..737beaf 100644
> --- a/drivers/i2c/ihs_i2c.c
> +++ b/drivers/i2c/ihs_i2c.c
> @@ -11,6 +11,28 @@
>
>   DECLARE_GLOBAL_DATA_PTR;
>
> +#ifdef CONFIG_SYS_I2C_IHS_DUAL
> +#define I2C_SET_REG(fld, val) \
> +	{ if (I2C_ADAP_HWNR & 0x10) \
> +		FPGA_SET_REG(I2C_ADAP_HWNR & 0xf, i2c1.fld, val); \
> +	else \
> +		FPGA_SET_REG(I2C_ADAP_HWNR, i2c0.fld, val); }
> +#else
> +#define I2C_SET_REG(fld, val) \
> +		FPGA_SET_REG(I2C_ADAP_HWNR, i2c0.fld, val);
> +#endif
> +
> +#ifdef CONFIG_SYS_I2C_IHS_DUAL
> +#define I2C_GET_REG(fld, val) \
> +	{ if (I2C_ADAP_HWNR & 0x10) \
> +		FPGA_GET_REG(I2C_ADAP_HWNR & 0xf, i2c1.fld, val); \
> +	else \
> +		FPGA_GET_REG(I2C_ADAP_HWNR, i2c0.fld, val); }
> +#else
> +#define I2C_GET_REG(fld, val) \
> +		FPGA_GET_REG(I2C_ADAP_HWNR, i2c0.fld, val);
> +#endif
> +
>   enum {
>   	I2CINT_ERROR_EV = 1 << 13,
>   	I2CINT_TRANSMIT_EV = 1 << 14,
> @@ -29,14 +51,14 @@ static int wait_for_int(bool read)
>   	u16 val;
>   	unsigned int ctr = 0;
>
> -	FPGA_GET_REG(I2C_ADAP_HWNR, i2c.interrupt_status, &val);
> +	I2C_GET_REG(interrupt_status, &val);
>   	while (!(val & (I2CINT_ERROR_EV
>   	       | (read ? I2CINT_RECEIVE_EV : I2CINT_TRANSMIT_EV)))) {
>   		udelay(10);
>   		if (ctr++ > 5000) {
>   			return 1;
>   		}
> -		FPGA_GET_REG(I2C_ADAP_HWNR, i2c.interrupt_status, &val);
> +		I2C_GET_REG(interrupt_status, &val);
>   	}
>
>   	return (val & I2CINT_ERROR_EV) ? 1 : 0;
> @@ -47,30 +69,30 @@ static int ihs_i2c_transfer(uchar chip, uchar *buffer, int len, bool read,
>   {
>   	u16 val;
>
> -	FPGA_SET_REG(I2C_ADAP_HWNR, i2c.interrupt_status, I2CINT_ERROR_EV
> +	I2C_SET_REG(interrupt_status, I2CINT_ERROR_EV
>   		     | I2CINT_RECEIVE_EV | I2CINT_TRANSMIT_EV);
> -	FPGA_GET_REG(I2C_ADAP_HWNR, i2c.interrupt_status, &val);
> +	I2C_GET_REG(interrupt_status, &val);
>
>   	if (!read && len) {
>   		val = buffer[0];
>
>   		if (len > 1)
>   			val |= buffer[1] << 8;
> -		FPGA_SET_REG(I2C_ADAP_HWNR, i2c.write_mailbox_ext, val);
> +		I2C_SET_REG(write_mailbox_ext, val);
>   	}
>
> -	FPGA_SET_REG(I2C_ADAP_HWNR, i2c.write_mailbox,
> -		     I2CMB_NATIVE
> -		     | (read ? 0 : I2CMB_WRITE)
> -		     | (chip << 1)
> -		     | ((len > 1) ? I2CMB_2BYTE : 0)
> -		     | (is_last ? 0 : I2CMB_HOLD_BUS));
> +	I2C_SET_REG(write_mailbox,
> +		    I2CMB_NATIVE
> +		    | (read ? 0 : I2CMB_WRITE)
> +		    | (chip << 1)
> +		    | ((len > 1) ? I2CMB_2BYTE : 0)
> +		    | (is_last ? 0 : I2CMB_HOLD_BUS));
>
>   	if (wait_for_int(read))
>   		return 1;
>
>   	if (read) {
> -		FPGA_GET_REG(I2C_ADAP_HWNR, i2c.read_mailbox_ext, &val);
> +		I2C_GET_REG(read_mailbox_ext, &val);
>   		buffer[0] = val & 0xff;
>   		if (len > 1)
>   			buffer[1] = val >> 8;
> @@ -163,7 +185,7 @@ static int ihs_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
>   }
>
>   static unsigned int ihs_i2c_set_bus_speed(struct i2c_adapter *adap,
> -					     unsigned int speed)
> +					  unsigned int speed)
>   {
>   	if (speed != adap->speed)
>   		return 1;
> @@ -179,6 +201,13 @@ U_BOOT_I2C_ADAP_COMPLETE(ihs0, ihs_i2c_init, ihs_i2c_probe,
>   			 ihs_i2c_set_bus_speed,
>   			 CONFIG_SYS_I2C_IHS_SPEED_0,
>   			 CONFIG_SYS_I2C_IHS_SLAVE_0, 0)
> +#ifdef CONFIG_SYS_I2C_IHS_DUAL
> +U_BOOT_I2C_ADAP_COMPLETE(ihs0_1, ihs_i2c_init, ihs_i2c_probe,
> +			 ihs_i2c_read, ihs_i2c_write,
> +			 ihs_i2c_set_bus_speed,
> +			 CONFIG_SYS_I2C_IHS_SPEED_0_1,
> +			 CONFIG_SYS_I2C_IHS_SLAVE_0_1, 16)
> +#endif
>   #endif
>   #ifdef CONFIG_SYS_I2C_IHS_CH1
>   U_BOOT_I2C_ADAP_COMPLETE(ihs1, ihs_i2c_init, ihs_i2c_probe,
> @@ -186,6 +215,13 @@ U_BOOT_I2C_ADAP_COMPLETE(ihs1, ihs_i2c_init, ihs_i2c_probe,
>   			 ihs_i2c_set_bus_speed,
>   			 CONFIG_SYS_I2C_IHS_SPEED_1,
>   			 CONFIG_SYS_I2C_IHS_SLAVE_1, 1)
> +#ifdef CONFIG_SYS_I2C_IHS_DUAL
> +U_BOOT_I2C_ADAP_COMPLETE(ihs1_1, ihs_i2c_init, ihs_i2c_probe,
> +			 ihs_i2c_read, ihs_i2c_write,
> +			 ihs_i2c_set_bus_speed,
> +			 CONFIG_SYS_I2C_IHS_SPEED_1_1,
> +			 CONFIG_SYS_I2C_IHS_SLAVE_1_1, 17)
> +#endif
>   #endif
>   #ifdef CONFIG_SYS_I2C_IHS_CH2
>   U_BOOT_I2C_ADAP_COMPLETE(ihs2, ihs_i2c_init, ihs_i2c_probe,
> @@ -193,6 +229,13 @@ U_BOOT_I2C_ADAP_COMPLETE(ihs2, ihs_i2c_init, ihs_i2c_probe,
>   			 ihs_i2c_set_bus_speed,
>   			 CONFIG_SYS_I2C_IHS_SPEED_2,
>   			 CONFIG_SYS_I2C_IHS_SLAVE_2, 2)
> +#ifdef CONFIG_SYS_I2C_IHS_DUAL
> +U_BOOT_I2C_ADAP_COMPLETE(ihs2_1, ihs_i2c_init, ihs_i2c_probe,
> +			 ihs_i2c_read, ihs_i2c_write,
> +			 ihs_i2c_set_bus_speed,
> +			 CONFIG_SYS_I2C_IHS_SPEED_2_1,
> +			 CONFIG_SYS_I2C_IHS_SLAVE_2_1, 18)
> +#endif
>   #endif
>   #ifdef CONFIG_SYS_I2C_IHS_CH3
>   U_BOOT_I2C_ADAP_COMPLETE(ihs3, ihs_i2c_init, ihs_i2c_probe,
> @@ -200,4 +243,11 @@ U_BOOT_I2C_ADAP_COMPLETE(ihs3, ihs_i2c_init, ihs_i2c_probe,
>   			 ihs_i2c_set_bus_speed,
>   			 CONFIG_SYS_I2C_IHS_SPEED_3,
>   			 CONFIG_SYS_I2C_IHS_SLAVE_3, 3)
> +#ifdef CONFIG_SYS_I2C_IHS_DUAL
> +U_BOOT_I2C_ADAP_COMPLETE(ihs3_1, ihs_i2c_init, ihs_i2c_probe,
> +			 ihs_i2c_read, ihs_i2c_write,
> +			 ihs_i2c_set_bus_speed,
> +			 CONFIG_SYS_I2C_IHS_SPEED_3_1,
> +			 CONFIG_SYS_I2C_IHS_SLAVE_3_1, 19)
> +#endif
>   #endif
> diff --git a/include/gdsys_fpga.h b/include/gdsys_fpga.h
> index 8a5efe7..f8d8322 100644
> --- a/include/gdsys_fpga.h
> +++ b/include/gdsys_fpga.h
> @@ -143,7 +143,7 @@ struct ihs_fpga {
>   	u16 reserved_2[2];	/* 0x001c */
>   	struct ihs_io_ep ep;	/* 0x0020 */
>   	u16 reserved_3[9];	/* 0x002e */
> -	struct ihs_i2c i2c;	/* 0x0040 */
> +	struct ihs_i2c i2c0;	/* 0x0040 */
>   	u16 reserved_4[10];	/* 0x004c */
>   	u16 mc_int;		/* 0x0060 */
>   	u16 mc_int_en;		/* 0x0062 */
> @@ -177,7 +177,7 @@ struct ihs_fpga {
>   	u16 reserved_2[2];	/* 0x001c */
>   	struct ihs_io_ep ep;	/* 0x0020 */
>   	u16 reserved_3[9];	/* 0x002e */
> -	struct ihs_i2c i2c;	/* 0x0040 */
> +	struct ihs_i2c i2c0;	/* 0x0040 */
>   	u16 reserved_4[10];	/* 0x004c */
>   	u16 mc_int;		/* 0x0060 */
>   	u16 mc_int_en;		/* 0x0062 */
> @@ -208,10 +208,12 @@ struct ihs_fpga {
>   	u16 reserved_1[29];	/* 0x001e */
>   	u16 mpc3w_control;	/* 0x0058 */
>   	u16 reserved_2[3];	/* 0x005a */
> -	struct ihs_i2c i2c;	/* 0x0060 */
> -	u16 reserved_3[205];	/* 0x0066 */
> +	struct ihs_i2c i2c0;	/* 0x0060 */
> +	u16 reserved_3[2];	/* 0x006c */
> +	struct ihs_i2c i2c1;	/* 0x0070 */
> +	u16 reserved_4[194];	/* 0x007c */
>   	struct ihs_osd osd;	/* 0x0200 */
> -	u16 reserved_4[761];	/* 0x020e */
> +	u16 reserved_5[761];	/* 0x020e */
>   	u16 videomem[31736];	/* 0x0800 */
>   };
>   #endif
>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

  reply	other threads:[~2015-10-28 11:23 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-28 10:46 [U-Boot] [PATCH v1 00/18] Fixes on gdsys boards and some new functionality dirk.eibach at gdsys.cc
2015-10-28 10:46 ` [U-Boot] [PATCH v1 01/18] i2c: ihs_i2c: Dual channel support dirk.eibach at gdsys.cc
2015-10-28 11:23   ` Heiko Schocher [this message]
2015-10-28 12:39     ` Dirk Eibach
2015-10-28 13:01       ` Heiko Schocher
2015-11-13  1:28   ` [U-Boot] [U-Boot,v1,01/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 02/18] i2c: ihs_i2c: Use macro bestpractices dirk.eibach at gdsys.cc
2015-10-28 11:23   ` Heiko Schocher
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 03/18] i2c: ihs_i2c: Fix hold_bus control dirk.eibach at gdsys.cc
2015-10-28 11:24   ` Heiko Schocher
2015-11-13  1:29   ` [U-Boot] [U-Boot,v1,03/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 04/18] board: gdsys: Configure DP501 SPDIF input dirk.eibach at gdsys.cc
2015-10-28 11:25   ` Heiko Schocher
2015-10-28 12:49     ` Dirk Eibach
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 05/18] board: gdsys: Increase DP501 I2C retry interval dirk.eibach at gdsys.cc
2015-10-28 11:33   ` Heiko Schocher
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 06/18] board: gdsys: Consider DP501 limits on link training dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 07/18] dlvision-10g: Support displayport dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot,v1,07/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 08/18] controlcenterd: Disable sideband clocks dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 09/18] iocon: reset FPGAs in last_stage_init() dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-11-13  1:29   ` Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 10/18] hrcon: Remove CH7301 configuration dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot,v1,10/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 11/18] mpc83xx: Add strider board dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot,v1,11/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 12/18] hrcon: Use generic ioep-fpga support dirk.eibach at gdsys.cc
2015-11-13  1:29   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 13/18] hrcon: Fix videoboard i2c setup dirk.eibach at gdsys.cc
2015-11-13  1:30   ` [U-Boot] [U-Boot,v1,13/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 14/18] hrcon: Add support for the DH variant dirk.eibach at gdsys.cc
2015-11-13  1:30   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 15/18] hrcon: Add fan controllers dirk.eibach at gdsys.cc
2015-11-13  1:30   ` [U-Boot] [U-Boot,v1,15/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 16/18] board: gdsys: Add osdsize command dirk.eibach at gdsys.cc
2015-11-13  1:30   ` [U-Boot] [U-Boot,v1,16/18] " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 17/18] board: gdsys: Enable osd on output only dirk.eibach at gdsys.cc
2015-11-13  1:30   ` [U-Boot] [U-Boot, v1, " Tom Rini
2015-10-28 10:46 ` [U-Boot] [PATCH v1 18/18] i2c: soft_i2c: Fix bus indizes dirk.eibach at gdsys.cc
2015-11-13  1:30   ` [U-Boot] [U-Boot,v1,18/18] " Tom Rini
2015-10-28 13:42 ` [U-Boot] [PATCH v1 00/18] Fixes on gdsys boards and some new functionality Simon Glass
2015-10-28 14:01   ` Dirk Eibach
2015-10-28 14:11     ` Heiko Schocher

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=5630B023.3030001@denx.de \
    --to=hs@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.