From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] PATCH 3/8 Multi-adapter multi-bus I2C
Date: Mon, 09 Feb 2009 13:21:50 +0100 [thread overview]
Message-ID: <49901FDE.8050405@denx.de> (raw)
In-Reply-To: <Pine.LNX.4.64ksi.0902061704470.14843@home-gw.koi8.net>
Hello ksi,
ksi at koi8.net wrote:
> Signed-off-by: Sergey Kubushyn <ksi@koi8.net>
> ---
> diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c
> index da6cec1..f0c1771 100644
> --- a/drivers/i2c/soft_i2c.c
> +++ b/drivers/i2c/soft_i2c.c
> @@ -1,4 +1,8 @@
> /*
> + * Copyright (c) 2009 Sergey Kubushyn <ksi@koi8.net>
> + *
> + * Changes for multibus/multiadapter I2C support.
> + *
> * (C) Copyright 2001, 2002
> * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> *
> @@ -72,375 +76,493 @@ DECLARE_GLOBAL_DATA_PTR;
> #define PRINTD(fmt,args...)
> #endif
>
> -#if defined(CONFIG_I2C_MULTI_BUS)
> -static unsigned int i2c_bus_num __attribute__ ((section (".data"))) = 0;
> -#endif /* CONFIG_I2C_MULTI_BUS */
> -
> /*-----------------------------------------------------------------------
> * Local functions
> */
> -#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
> -static void send_reset (void);
> +#ifndef I2C_INIT
> +#define I2C_INIT do {} while(0)
> #endif
> -static void send_start (void);
> -static void send_stop (void);
> -static void send_ack (int);
> -static int write_byte (uchar byte);
> -static uchar read_byte (int);
> -
> -#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
> -/*-----------------------------------------------------------------------
> - * Send a reset sequence consisting of 9 clocks with the data signal high
> - * to clock any confused device back into an idle state. Also send a
> - * <stop> at the end of the sequence for belts & suspenders.
> - */
> -static void send_reset(void)
> -{
> - I2C_SOFT_DECLARATIONS /* intentional without ';' */
> - int j;
> -
> - I2C_SCL(1);
> - I2C_SDA(1);
> -#ifdef I2C_INIT
> - I2C_INIT;
> +#ifndef I2C_INIT0
> +#define I2C_INIT0 do {} while(0)
> #endif
> - I2C_TRISTATE;
> - for(j = 0; j < 9; j++) {
> - I2C_SCL(0);
> - I2C_DELAY;
> - I2C_DELAY;
> - I2C_SCL(1);
> - I2C_DELAY;
> - I2C_DELAY;
> - }
> - send_stop();
> - I2C_TRISTATE;
> -}
> +#ifndef I2C_INIT1
> +#define I2C_INIT1 do {} while(0)
> +#endif
> +#ifndef I2C_INIT2
> +#define I2C_INIT2 do {} while(0)
> #endif
> +#ifndef I2C_INIT3
> +#define I2C_INIT3 do {} while(0)
> +#endif
> +
>
> /*-----------------------------------------------------------------------
> * START: High -> Low on SDA while SCL is High
> */
> -static void send_start(void)
> -{
> - I2C_SOFT_DECLARATIONS /* intentional without ';' */
> -
> - I2C_DELAY;
> - I2C_SDA(1);
> - I2C_ACTIVE;
> - I2C_DELAY;
> - I2C_SCL(1);
> - I2C_DELAY;
> - I2C_SDA(0);
> - I2C_DELAY;
> +#define I2C_SOFT_SEND_START(n) \
> +static void send_start##n(void) \
> +{ \
> + I2C_SOFT_DECLARATIONS##n \
> + I2C_DELAY##n; \
> + I2C_SDA##n(1); \
> + I2C_ACTIVE##n; \
> + I2C_DELAY##n; \
> + I2C_SCL##n(1); \
> + I2C_DELAY##n; \
> + I2C_SDA##n(0); \
> + I2C_DELAY##n; \
> }
>
[...]
> - PRINTD("i2c_read: fix addr_overflow: chip %02X addr %02X\n",
> - chip, addr);
> -#endif
> +#define DO_EEAD_OVF chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW); \
>
Line too long.
> + PRINTD("%s: fix addr_overflow: chip %02X addr %02X\n", \
> + __FUNCTION__, chip, addr);
>
> - /*
> - * Do the addressing portion of a write cycle to set the
> - * chip's address pointer. If the address length is zero,
> - * don't do the normal write cycle to set the address pointer,
> - * there is no address pointer in this chip.
>
[...]
> +#if defined(I2C_SOFT_DECLARATIONS3)
> +I2C_SOFT_SEND_START(3)
> +I2C_SOFT_SEND_STOP(3)
> +I2C_SOFT_SEND_ACK(3)
> +#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
> +I2C_SOFT_SEND_RESET(3)
> +#endif
> +I2C_SOFT_WRITE_BYTE(3)
> +I2C_SOFT_READ_BYTE(3)
> +I2C_SOFT_INIT_ADAPTER(3)
> +I2C_SOFT_PROBE(3)
> +I2C_SOFT_READ(3)
> +I2C_SOFT_WRITE(3)
> +I2C_SOFT_GET_BUS_SPEED(3)
> +I2C_SOFT_SET_BUS_SPEED(3)
> +#endif
> +
>
Hmm... are this lots of defines really necessary? Couldn't we add
something like
int hw_adapnr; /* hardware adapter number */
to the i2c_adap_t struct, and have an pointer (cur_i2c_adap?) to the
current used i2c_adap_t? Then you have where you need it, your
hw_adapnr and need not all of this defines.
For example you need in the config for MPC8548CDS.h just this define:
#define I2C_SDA(bit) (printf("HW adap: %d sda: %d", cur_i2c_adap->hw_adapnr, bit))
and not I2C_SDA(bit) and I2C_SDA1(bit)
> +i2c_adap_t soft_i2c_adap[] = {
> + {
> +#if defined(I2C_SOFT_DECLARATIONS)
> + .init = soft_i2c_init,
> + .probe = soft_i2c_probe,
> + .read = soft_i2c_read,
> + .write = soft_i2c_write,
> + .set_bus_speed = soft_i2c_set_bus_speed,
> + .get_bus_speed = soft_i2c_get_bus_speed,
> + .speed = CONFIG_SYS_SOFT_I2C_SPEED,
> + .slaveaddr = CONFIG_SYS_SOFT_I2C_SLAVE,
> + .init_done = 0,
> + .name = "soft-i2c"
> +#elif defined(I2C_SOFT_DECLARATIONS0)
> + .init = soft_i2c_init0,
> + .probe = soft_i2c_probe0,
> + .read = soft_i2c_read0,
> + .write = soft_i2c_write0,
> + .set_bus_speed = soft_i2c_set_bus_speed0,
> + .get_bus_speed = soft_i2c_get_bus_speed0,
> + .speed = CONFIG_SYS_SOFT_I2C0_SPEED,
> + .slaveaddr = CONFIG_SYS_SOFT_I2C0_SLAVE,
> + .init_done = 0,
> + .name = "soft-i2c#0"
> +#endif
> + },
> +#if defined(I2C_SOFT_DECLARATIONS1)
> + {
> + .init = soft_i2c_init1,
> + .probe = soft_i2c_probe1,
> + .read = soft_i2c_read1,
> + .write = soft_i2c_write1,
> + .set_bus_speed = soft_i2c_set_bus_speed1,
> + .get_bus_speed = soft_i2c_get_bus_speed1,
> + .speed = CONFIG_SYS_SOFT_I2C1_SPEED,
> + .slaveaddr = CONFIG_SYS_SOFT_I2C1_SLAVE,
> + .init_done = 0,
> + .name = "soft-i2c#1"
> + },
> +#endif
> +#if defined(I2C_SOFT_DECLARATIONS2)
> + {
> + .init = soft_i2c_init2,
> + .probe = soft_i2c_probe2,
> + .read = soft_i2c_read2,
> + .write = soft_i2c_write2,
> + .set_bus_speed = soft_i2c_set_bus_speed2,
> + .get_bus_speed = soft_i2c_get_bus_speed2,
> + .speed = CONFIG_SYS_SOFT_I2C2_SPEED,
> + .slaveaddr = CONFIG_SYS_SOFT_I2C2_SLAVE,
> + .init_done = 0,
> + .name = "soft-i2c#2"
> + },
> +#endif
> +#if defined(I2C_SOFT_DECLARATIONS3)
> + {
> + .init = soft_i2c_init3,
> + .probe = soft_i2c_probe3,
> + .read = soft_i2c_read3,
> + .write = soft_i2c_write3,
> + .set_bus_speed = soft_i2c_set_bus_speed3,
> + .get_bus_speed = soft_i2c_get_bus_speed3,
> + .speed = CONFIG_SYS_SOFT_I2C3_SPEED,
> + .slaveaddr = CONFIG_SYS_SOFT_I2C3_SLAVE,
> + .init_done = 0,
> + .name = "soft-i2c#3"
> + },
> +#endif
> +};
>
bye
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
next prev parent reply other threads:[~2009-02-09 12:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-07 1:05 [U-Boot] PATCH 3/8 Multi-adapter multi-bus I2C ksi at koi8.net
2009-02-09 12:21 ` Heiko Schocher [this message]
2009-02-09 22:25 ` ksi at koi8.net
2009-02-10 8:20 ` 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=49901FDE.8050405@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.