[PATCH v7 3/8] i2c: i2c-cortina: added CAxxxx I2C support
Heiko Schocher
hs at denx.de
Tue May 19 07:45:20 CEST 2020
Hello Alex,
Am 14.05.2020 um 22:11 schrieb Alex Nemirovsky:
> From: Arthur Li <arthur.li at cortina-access.com>
>
> Add I2C controller support for Cortina Access CAxxxx SoCs
>
> Signed-off-by: Arthur Li <arthur.li at cortina-access.com>
> Signed-off-by: Alex Nemirovsky <alex.nemirovsky at cortina-access.com>
> CC: Heiko Schocher <hs at denx.de>
>
> CA_I2C: DT binding for I2C controller
>
> DT binding document for Cortina I2C driver
>
> ---
>
> Changes in v7:
> - Added additional description info in I2C KConfig
>
> Changes in v6:
> - Add I2C DT binding document
>
> Changes in v5: None
> Changes in v4:
> - Utilize standard I2C macros from <i2c.h>
> - Return ETIMEDOUT in funcs that can timeout
> - Return i2c_xfer_init() result to caller of i2c_read() if it
> fails within i2c_read() execution
> - Fix misc. style guide conformance issues
> - Use printf() to report i2c_xfer() runtime errors
> instead of debug()
>
> Changes in v3: None
> Changes in v2: None
>
> MAINTAINERS | 4 +
> doc/device-tree-bindings/i2c/i2c-cortina.txt | 18 ++
> drivers/i2c/Kconfig | 8 +
> drivers/i2c/Makefile | 1 +
> drivers/i2c/i2c-cortina.c | 346 +++++++++++++++++++++++++++
> drivers/i2c/i2c-cortina.h | 84 +++++++
> 6 files changed, 461 insertions(+)
> create mode 100644 doc/device-tree-bindings/i2c/i2c-cortina.txt
> create mode 100644 drivers/i2c/i2c-cortina.c
> create mode 100644 drivers/i2c/i2c-cortina.h
Reviewed-by: Heiko Schocher <hs at denx.de>
Nitpick only ...
[...]
> diff --git a/drivers/i2c/i2c-cortina.c b/drivers/i2c/i2c-cortina.c
> new file mode 100644
> index 0000000..08b812a
> --- /dev/null
> +++ b/drivers/i2c/i2c-cortina.c
> @@ -0,0 +1,346 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2020
> + * Arthur Li, Cortina Access, arthur.li at cortina-access.com.
> + */
> +
> +#include <common.h>
> +#include <i2c.h>
> +#include <asm/io.h>
> +#include <dm.h>
> +#include <mapmem.h>
> +#include "i2c-cortina.h"
> +
> +static void set_speed(struct i2c_regs *regs, int i2c_spd)
> +{
> + union ca_biw_cfg i2c_cfg;
> +
> + i2c_cfg.wrd = readl(®s->i2c_cfg);
> + i2c_cfg.bf.core_en = 0;
> + writel(i2c_cfg.wrd, ®s->i2c_cfg);
> +
> + switch (i2c_spd) {
> + case IC_SPEED_MODE_FAST_PLUS:
> + i2c_cfg.bf.prer = CORTINA_PER_IO_FREQ /
> + (5 * I2C_SPEED_FAST_PLUS_RATE) - 1;
> + break;
> +
> + case IC_SPEED_MODE_STANDARD:
> + i2c_cfg.bf.prer = CORTINA_PER_IO_FREQ /
> + (5 * I2C_SPEED_STANDARD_RATE) - 1;
> + break;
> +
> + case IC_SPEED_MODE_FAST:
> + default:
> + i2c_cfg.bf.prer = CORTINA_PER_IO_FREQ /
> + (5 * I2C_SPEED_FAST_RATE) - 1;
> + break;
> + }
> +
> + i2c_cfg.bf.core_en = 1;
> + writel(i2c_cfg.wrd, ®s->i2c_cfg);
> +}
> +
> +static int ca_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
> +{
> + struct ca_i2c *priv = dev_get_priv(bus);
> + int i2c_spd;
> +
> + if (speed >= I2C_SPEED_FAST_PLUS_RATE) {
> + i2c_spd = IC_SPEED_MODE_FAST_PLUS;
> + priv->speed = I2C_SPEED_FAST_PLUS_RATE;
> + } else if (speed >= I2C_SPEED_FAST_RATE) {
> + i2c_spd = IC_SPEED_MODE_FAST;
> + priv->speed = I2C_SPEED_FAST_RATE;
> + } else {
> + i2c_spd = IC_SPEED_MODE_STANDARD;
> + priv->speed = I2C_SPEED_STANDARD_RATE;
> + }
you could set only one vairable in the if paths (and drop {)
and set the other variable later ...
[...]
bye,
Heiko
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: hs at denx.de
More information about the U-Boot
mailing list