lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 12 Aug 2019 11:37:15 +0200
From:   Geert Uytterhoeven <geert@...ux-m68k.org>
To:     Max Staudt <max@...as.org>
Cc:     Linux I2C <linux-i2c@...r.kernel.org>,
        Wolfram Sang <wsa+renesas@...g-engineering.com>,
        "Linux/m68k" <linux-m68k@...r.kernel.org>,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        John Paul Adrian Glaubitz <glaubitz@...sik.fu-berlin.de>
Subject: Re: [PATCH] i2c/busses: Add i2c-icy for I2C on m68k/Amiga

Hi Max,

Thanks for your patch!

On Sun, Aug 11, 2019 at 6:33 AM Max Staudt <max@...as.org> wrote:
> This is the i2c-icy driver for the ICY board for Amiga computers.
> It connects a PCF8584 I2C controller to the Zorro bus, providing I2C
> connectivity. The original documentation can be found on Aminet:
>
> https://aminet.net/package/docs/hard/icy
>
> Since the 2019 a1k.org community re-print of these PCBs sports an
> LTC2990 hwmon chip as an example use case, this driver autoprobes for
> that as well. If it is present, modprobing ltc2990 is sufficient.

What about the RTC? The schematics show both a ds1620 and pcf8583.

> IRQ support is currently not implemented, as i2c-algo-pcf is built for
> the ISA bus and a straight implementation of the same stack locks up a
> Zorro machine.
>
> Tested-by: Max Staudt <max@...as.org>

This tag is usually implied for a driver author ;-)

> Signed-off-by: Max Staudt <max@...as.org>

> --- /dev/null
> +++ b/drivers/i2c/busses/i2c-icy.c

> +/*
> + * Functions called by i2c-algo-pcf
> + */
> +static void icy_pcf_setbyte(void *data, int ctl, int val)

icy_pcf_setpcf(), to match the callback name?

> +{
> +       struct icy_i2c *i2c = (struct icy_i2c *)data;
> +
> +       u8 __iomem *address = ctl ? i2c->reg_s1 : i2c->reg_s0;
> +
> +       iowrite8(val, address);

As this is on a Zorro bus, z_writeb()?

> +}
> +
> +static int icy_pcf_getbyte(void *data, int ctl)

icy_pcf_getpcf(), to match the callback name?


> +{
> +       struct icy_i2c *i2c = (struct icy_i2c *)data;
> +
> +       u8 __iomem *address = ctl ? i2c->reg_s1 : i2c->reg_s0;
> +       int val = ioread8(address);

z_readb()

> +
> +       return val;
> +}

> +static int icy_probe(struct zorro_dev *z,
> +                        const struct zorro_device_id *ent)
> +{
> +       struct icy_i2c *i2c;
> +       struct i2c_algo_pcf_data *algo_data;
> +
> +
> +       i2c = devm_kzalloc(&z->dev, sizeof(*i2c), GFP_KERNEL);
> +       if (!i2c)
> +               return -ENOMEM;
> +
> +       algo_data = devm_kzalloc(&z->dev, sizeof(*algo_data), GFP_KERNEL);
> +       if (!algo_data)
> +               return -ENOMEM;
> +
> +       dev_set_drvdata(&z->dev, i2c);
> +       i2c->adapter.dev.parent = &z->dev;
> +       i2c->adapter.owner = THIS_MODULE;
> +       i2c->adapter.class = I2C_CLASS_DEPRECATED;
> +       /* i2c->adapter.algo assigned by i2c_pcf_add_bus() */
> +       i2c->adapter.algo_data = algo_data;
> +       strlcpy(i2c->adapter.name, "ICY I2C Zorro adapter",
> +               sizeof(i2c->adapter.name));
> +
> +       if (!devm_request_mem_region(&z->dev,
> +                                    z->resource.start,
> +                                    4, i2c->adapter.name))

zorro_request_device()?
Ah, there's no devm_*() variant yet. OK.

> +               return -ENXIO;
> +
> +       /* Driver private data */
> +       i2c->reg_s0 = ZTWO_VADDR(z->resource.start);
> +       i2c->reg_s1 = ZTWO_VADDR(z->resource.start + 2);
> +
> +       algo_data->data = (void *)i2c;
> +       algo_data->setpcf     = icy_pcf_setbyte;
> +       algo_data->getpcf     = icy_pcf_getbyte;
> +       algo_data->getown     = icy_pcf_getown;
> +       algo_data->getclock   = icy_pcf_getclock;
> +       algo_data->waitforpin = icy_pcf_waitforpin;
> +
> +       if (i2c_pcf_add_bus(&i2c->adapter)) {
> +               dev_err(&z->dev, "i2c_pcf_add_bus() failed\n");
> +               return -ENXIO;
> +       }
> +
> +       dev_info(&z->dev, "ICY I2C controller at %#x, IRQ not implemented\n",
> +                z->resource.start);
> +
> +       /*
> +        * The 2019 a1k.org PCBs have an LTC2990 at 0x4c, so start
> +        * it automatically once ltc2990 is modprobed.
> +        *
> +        * in0 is the voltage of the internal 5V power supply.
> +        * temp1 is the temperature inside the chip.
> +        *
> +        * Configuration 0x18 enables all sensors on this PCB:
> +        *  # modprobe i2c-dev
> +        *  # i2cset 0 0x4c 1 0x18

What's the reason for the i2cset command?

> +        *  # modprobe ltc2990
> +        * in1 will be the voltage of the 5V rail, divided by 2.
> +        * in2 will be the voltage of the 12V rail, divided by 4.
> +        * temp3 will be measured using a PCB loop next the chip.
> +        */
> +       i2c->client_ltc2990 = i2c_new_probed_device(&i2c->adapter,
> +                                                   &icy_ltc2990_info,
> +                                                   icy_ltc2990_addresses,
> +                                                   NULL);
> +
> +       return 0;
> +}

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@...ux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ