[U-Boot] [PATCH 2/4] i2c: UniPhier: add driver for UniPhier FIFO-builtin i2c controller
Masahiro Yamada
yamada.m at jp.panasonic.com
Thu Dec 25 08:15:26 CET 2014
Hi Simon,
On Tue, 23 Dec 2014 12:58:12 -0700
Simon Glass <sjg at chromium.org> wrote:
> Hi Masahiro,
>
> On 22 December 2014 at 03:58, Masahiro Yamada <yamada.m at jp.panasonic.com> wrote:
> > This commit adds on-chip I2C driver used on newer SoCs of Panasonic
> > UniPhier platform.
> >
> > Signed-off-by: Masahiro Yamada <yamada.m at jp.panasonic.com>
>
> For driver model bits:
>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> A few comments below.
>
> > ---
> >
> > drivers/i2c/Kconfig | 8 +
> > drivers/i2c/Makefile | 1 +
> > drivers/i2c/i2c-uniphier-f.c | 355 +++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 364 insertions(+)
> > create mode 100644 drivers/i2c/i2c-uniphier-f.c
> >
> > diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
> > index 6a479ef..e75c1ff 100644
> > --- a/drivers/i2c/Kconfig
> > +++ b/drivers/i2c/Kconfig
> > @@ -12,3 +12,11 @@ config SYS_I2C_UNIPHIER
> > help
> > Support for Panasonic UniPhier I2C controller driver. This I2C
> > controller is used on PH1-LD4, PH1-sLD8 or older UniPhier SoCs.
> > +
> > +config SYS_I2C_UNIPHIER_F
> > + bool "UniPhier I2C with FIFO driver"
> > + depends on ARCH_UNIPHIER && DM_I2C
> > + default y
> > + help
> > + Support for Panasonic UniPhier I2C with FIFO controller driver.
> > + This I2C controller is used on PH1-Pro4 or newer UniPhier SoCs.
> > diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
> > index e2fcd24..0e4c9f4 100644
> > --- a/drivers/i2c/Makefile
> > +++ b/drivers/i2c/Makefile
> > @@ -32,4 +32,5 @@ obj-$(CONFIG_SYS_I2C_SH) += sh_i2c.o
> > obj-$(CONFIG_SYS_I2C_SOFT) += soft_i2c.o
> > obj-$(CONFIG_SYS_I2C_TEGRA) += tegra_i2c.o
> > obj-$(CONFIG_SYS_I2C_UNIPHIER) += i2c-uniphier.o
> > +obj-$(CONFIG_SYS_I2C_UNIPHIER_F) += i2c-uniphier-f.o
> > obj-$(CONFIG_SYS_I2C_ZYNQ) += zynq_i2c.o
> > diff --git a/drivers/i2c/i2c-uniphier-f.c b/drivers/i2c/i2c-uniphier-f.c
> > new file mode 100644
> > index 0000000..14a7f1c
> > --- /dev/null
> > +++ b/drivers/i2c/i2c-uniphier-f.c
> > @@ -0,0 +1,355 @@
> > +/*
> > + * Copyright (C) 2014 Panasonic Corporation
> > + * Author: Masahiro Yamada <yamada.m at jp.panasonic.com>
> > + *
> > + * SPDX-License-Identifier: GPL-2.0+
> > + */
> > +
> > +/* #define DEBUG */
> > +
> > +#include <common.h>
> > +#include <linux/types.h>
> > +#include <asm/io.h>
> > +#include <asm/errno.h>
> > +#include <dm/device.h>
> > +#include <dm/root.h>
> > +#include <i2c.h>
> > +#include <fdtdec.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +#define I2C_CR 0x00 /* control register */
>
> struct i2c_reg {
> u32 cr;
> u32 fifo;
> ...
> }
I answered in the other reply.
> > +#define I2C_CR_MST (1 << 3) /* master mode */
> > +#define I2C_CR_STA (1 << 2) /* start condition */
> > +#define I2C_CR_STO (1 << 1) /* stop condition */
> > +#define I2C_CR_NACK (1 << 0) /* not ACK */
> > +
> > +#define I2C_DTTX 0x04 /* send FIFO */
> > +#define I2C_DTRX 0x04 /* receive FIFO */
> > +#define I2C_DTTX_CMD (1 << 8) /* send command (slave addr) */
> > +#define I2C_DTTX_RD (1 << 0) /* read */
> > +#define I2C_SLAD 0x0c /* slave address */
> > +#define I2C_CYC 0x10 /* clock cycle control */
> > +#define I2C_LCTL 0x14 /* clock low period control */
> > +#define I2C_SSUT 0x18 /* restart/stop setup time control */
> > +#define I2C_DSUT 0x1c /* data setup time control */
> > +#define I2C_INT 0x20 /* interrupt status */
> > +#define I2C_IE 0x24 /* interrupt enable */
> > +#define I2C_IC 0x28 /* interrupt clear */
> > +#define I2C_INT_TE (1 << 9) /* TX FIFO empty */
> > +#define I2C_INT_RB (1 << 4) /* received specified bytes */
> > +#define I2C_INT_NA (1 << 2) /* no answer */
> > +#define I2C_INT_AL (1 << 1) /* arbitration lost */
> > +#define I2C_SR 0x2c /* status register */
> > +#define I2C_SR_DB (1 << 12) /* device busy */
> > +#define I2C_SR_BB (1 << 8) /* bus busy */
> > +#define I2C_SR_RFF (1 << 3) /* Rx FIFO full */
> > +#define I2C_SR_RNE (1 << 2) /* Rx FIFO not empty */
> > +#define I2C_SR_TNF (1 << 1) /* Tx FIFO not full */
> > +#define I2C_SR_TFE (1 << 0) /* Tx FIFO empty */
> > +#define I2C_RST 0x34 /* reset control */
> > +#define I2C_RST_TBRST (1 << 2) /* clear Tx FIFO */
> > +#define I2C_RST_RBRST (1 << 1) /* clear Rx FIFO */
> > +#define I2C_RST_RST (1 << 0) /* forcible bus reset */
> > +#define I2C_TBC 0x40
> > +#define I2C_RBC 0x44
> > +#define I2C_TBCM 0x48
> > +#define I2C_RBCM 0x4c
> > +#define I2C_BRST 0x50 /* bus reset */
> > +#define I2C_BRST_FOEN (1 << 1) /* normal operation */
> > +#define I2C_BRST_RSCLO (1 << 0) /* release SCL low fixing */
> > +
> > +#define FIOCLK 50000000
> > +
> > +struct uniphier_fi2c_dev {
> > + void __iomem *base; /* register base */
>
> Should use register access in U-Boot.
>
> > + unsigned long fioclk; /* internal operation clock */
> > + unsigned long wait_us; /* wait for every byte transfer (us) */
>
> This is really a timeout isn't it?
Yes.
I will fix this comment.
Best Regards
Masahiro Yamada
More information about the U-Boot
mailing list