From: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>
To: Nikolaus Voss <n.voss-+umVssTZoCsb1SvskN2V4Q@public.gmane.org>
Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org,
carsten.behling-0M7HhAU3Y85FsXB23wyQUg@public.gmane.org
Subject: Re: [PATCH v7 3/5] drivers/i2c/busses/i2c-at91.c: add new driver
Date: Wed, 23 Nov 2011 16:18:45 +0000 [thread overview]
Message-ID: <201111231618.45951.arnd@arndb.de> (raw)
In-Reply-To: <ee23c49c5a190a2cce0859f7828c2dc771ff3207.1322062555.git.n.voss-+umVssTZoCsb1SvskN2V4Q@public.gmane.org>
On Tuesday 08 November 2011, Nikolaus Voss wrote:
> +
> +static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg)
> +{
> + return __raw_readl(dev->base + reg);
> +}
> +
> +static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned val)
> +{
> + __raw_writel(val, dev->base + reg);
> +}
Better use readl/writel or readl_relaxed/writel_relaxed.
> +/*
> + * Calculate and set symmetric clock as stated in datasheet:
> + * twi_clk = F_MAIN / (2 * cdiv * (1 << ckdiv) + 4)
> + */
> +static void __devinit at91_set_twi_clock(struct at91_twi_dev *dev, int twi_clk)
> +{
> + const int div = DIV_ROUND_UP(clk_get_rate(dev->clk), 2 * twi_clk) - 2;
> + int ckdiv = fls(div >> 8);
> + const int cdiv = div >> ckdiv;
> +
> + if (cpu_is_at91rm9200() && (ckdiv > 5)) {
> + dev_warn(dev->dev, "AT91RM9200 erratum 22: using ckdiv = 5.\n");
> + ckdiv = 5;
> + }
Don't check a global property like this locally in the driver. Instead,
make it a property of the device that you check here and set it based on
the the device name set by the platform, or by a device tree property.
> diff --git a/drivers/i2c/busses/i2c-at91.h b/drivers/i2c/busses/i2c-at91.h
> new file mode 100644
> index 0000000..a898159
> --- /dev/null
> +++ b/drivers/i2c/busses/i2c-at91.h
> @@ -0,0 +1,80 @@
> +
> +#ifndef AT91_TWI_H
> +#define AT91_TWI_H
> +
No need for a header file if all the values in it are used in only one
source file. Just move everything to i2c_at91.c
> +#define AT91_TWI_MMR 0x04 /* Master Mode Register */
> +#define AT91_TWI_IADRSZ (3 << 8) /* Internal Device Address
> + * Size */
> +#define AT91_TWI_IADRSZ_NO (0 << 8)
> +#define AT91_TWI_IADRSZ_1 (1 << 8)
> +#define AT91_TWI_IADRSZ_2 (2 << 8)
> +#define AT91_TWI_IADRSZ_3 (3 << 8)
> +#define AT91_TWI_MREAD (1 << 12) /* Master Read Direction */
> +#define AT91_TWI_DADR (0x7f << 16) /* Device Address */
These are harder to read than just using hexadecimal bitmasks:
#define AT91_TWI_MMR 0x00000004
#define AT91_TWI_IADRSZ 0x00000300
#define AT91_TWI_IADRSZ_NO 0x00000000
#define AT91_TWI_IADRSZ_1 0x00000100
...
Arnd
WARNING: multiple messages have this Message-ID (diff)
From: arnd@arndb.de (Arnd Bergmann)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v7 3/5] drivers/i2c/busses/i2c-at91.c: add new driver
Date: Wed, 23 Nov 2011 16:18:45 +0000 [thread overview]
Message-ID: <201111231618.45951.arnd@arndb.de> (raw)
In-Reply-To: <ee23c49c5a190a2cce0859f7828c2dc771ff3207.1322062555.git.n.voss@weinmann.de>
On Tuesday 08 November 2011, Nikolaus Voss wrote:
> +
> +static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg)
> +{
> + return __raw_readl(dev->base + reg);
> +}
> +
> +static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned val)
> +{
> + __raw_writel(val, dev->base + reg);
> +}
Better use readl/writel or readl_relaxed/writel_relaxed.
> +/*
> + * Calculate and set symmetric clock as stated in datasheet:
> + * twi_clk = F_MAIN / (2 * cdiv * (1 << ckdiv) + 4)
> + */
> +static void __devinit at91_set_twi_clock(struct at91_twi_dev *dev, int twi_clk)
> +{
> + const int div = DIV_ROUND_UP(clk_get_rate(dev->clk), 2 * twi_clk) - 2;
> + int ckdiv = fls(div >> 8);
> + const int cdiv = div >> ckdiv;
> +
> + if (cpu_is_at91rm9200() && (ckdiv > 5)) {
> + dev_warn(dev->dev, "AT91RM9200 erratum 22: using ckdiv = 5.\n");
> + ckdiv = 5;
> + }
Don't check a global property like this locally in the driver. Instead,
make it a property of the device that you check here and set it based on
the the device name set by the platform, or by a device tree property.
> diff --git a/drivers/i2c/busses/i2c-at91.h b/drivers/i2c/busses/i2c-at91.h
> new file mode 100644
> index 0000000..a898159
> --- /dev/null
> +++ b/drivers/i2c/busses/i2c-at91.h
> @@ -0,0 +1,80 @@
> +
> +#ifndef AT91_TWI_H
> +#define AT91_TWI_H
> +
No need for a header file if all the values in it are used in only one
source file. Just move everything to i2c_at91.c
> +#define AT91_TWI_MMR 0x04 /* Master Mode Register */
> +#define AT91_TWI_IADRSZ (3 << 8) /* Internal Device Address
> + * Size */
> +#define AT91_TWI_IADRSZ_NO (0 << 8)
> +#define AT91_TWI_IADRSZ_1 (1 << 8)
> +#define AT91_TWI_IADRSZ_2 (2 << 8)
> +#define AT91_TWI_IADRSZ_3 (3 << 8)
> +#define AT91_TWI_MREAD (1 << 12) /* Master Read Direction */
> +#define AT91_TWI_DADR (0x7f << 16) /* Device Address */
These are harder to read than just using hexadecimal bitmasks:
#define AT91_TWI_MMR 0x00000004
#define AT91_TWI_IADRSZ 0x00000300
#define AT91_TWI_IADRSZ_NO 0x00000000
#define AT91_TWI_IADRSZ_1 0x00000100
...
Arnd
WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de>
To: Nikolaus Voss <n.voss@weinmann.de>
Cc: linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, ben-linux@fluff.org,
carsten.behling@garz-fricke.com
Subject: Re: [PATCH v7 3/5] drivers/i2c/busses/i2c-at91.c: add new driver
Date: Wed, 23 Nov 2011 16:18:45 +0000 [thread overview]
Message-ID: <201111231618.45951.arnd@arndb.de> (raw)
In-Reply-To: <ee23c49c5a190a2cce0859f7828c2dc771ff3207.1322062555.git.n.voss@weinmann.de>
On Tuesday 08 November 2011, Nikolaus Voss wrote:
> +
> +static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg)
> +{
> + return __raw_readl(dev->base + reg);
> +}
> +
> +static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned val)
> +{
> + __raw_writel(val, dev->base + reg);
> +}
Better use readl/writel or readl_relaxed/writel_relaxed.
> +/*
> + * Calculate and set symmetric clock as stated in datasheet:
> + * twi_clk = F_MAIN / (2 * cdiv * (1 << ckdiv) + 4)
> + */
> +static void __devinit at91_set_twi_clock(struct at91_twi_dev *dev, int twi_clk)
> +{
> + const int div = DIV_ROUND_UP(clk_get_rate(dev->clk), 2 * twi_clk) - 2;
> + int ckdiv = fls(div >> 8);
> + const int cdiv = div >> ckdiv;
> +
> + if (cpu_is_at91rm9200() && (ckdiv > 5)) {
> + dev_warn(dev->dev, "AT91RM9200 erratum 22: using ckdiv = 5.\n");
> + ckdiv = 5;
> + }
Don't check a global property like this locally in the driver. Instead,
make it a property of the device that you check here and set it based on
the the device name set by the platform, or by a device tree property.
> diff --git a/drivers/i2c/busses/i2c-at91.h b/drivers/i2c/busses/i2c-at91.h
> new file mode 100644
> index 0000000..a898159
> --- /dev/null
> +++ b/drivers/i2c/busses/i2c-at91.h
> @@ -0,0 +1,80 @@
> +
> +#ifndef AT91_TWI_H
> +#define AT91_TWI_H
> +
No need for a header file if all the values in it are used in only one
source file. Just move everything to i2c_at91.c
> +#define AT91_TWI_MMR 0x04 /* Master Mode Register */
> +#define AT91_TWI_IADRSZ (3 << 8) /* Internal Device Address
> + * Size */
> +#define AT91_TWI_IADRSZ_NO (0 << 8)
> +#define AT91_TWI_IADRSZ_1 (1 << 8)
> +#define AT91_TWI_IADRSZ_2 (2 << 8)
> +#define AT91_TWI_IADRSZ_3 (3 << 8)
> +#define AT91_TWI_MREAD (1 << 12) /* Master Read Direction */
> +#define AT91_TWI_DADR (0x7f << 16) /* Device Address */
These are harder to read than just using hexadecimal bitmasks:
#define AT91_TWI_MMR 0x00000004
#define AT91_TWI_IADRSZ 0x00000300
#define AT91_TWI_IADRSZ_NO 0x00000000
#define AT91_TWI_IADRSZ_1 0x00000100
...
Arnd
next prev parent reply other threads:[~2011-11-23 16:18 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-23 15:35 [PATCH v7 0/5] AT91: replace broken TWI driver i2c-at91.c Nikolaus Voss
2011-11-23 15:35 ` Nikolaus Voss
2011-11-08 10:49 ` [PATCH v7 1/5] drivers/i2c/busses/i2c-at91.c: remove broken driver Nikolaus Voss
[not found] ` <cover.1322062555.git.n.voss-+umVssTZoCsb1SvskN2V4Q@public.gmane.org>
2011-11-08 10:49 ` [PATCH v7 3/5] drivers/i2c/busses/i2c-at91.c: add new driver Nikolaus Voss
2011-11-08 10:49 ` Nikolaus Voss
[not found] ` <ee23c49c5a190a2cce0859f7828c2dc771ff3207.1322062555.git.n.voss-+umVssTZoCsb1SvskN2V4Q@public.gmane.org>
2011-11-23 16:18 ` Arnd Bergmann [this message]
2011-11-23 16:18 ` Arnd Bergmann
2011-11-23 16:18 ` Arnd Bergmann
[not found] ` <201111231618.45951.arnd-r2nGTMty4D4@public.gmane.org>
2011-11-24 10:33 ` Voss, Nikolaus
2011-11-24 10:33 ` Voss, Nikolaus
2011-11-24 10:33 ` Voss, Nikolaus
[not found] ` <EF2E73589CA71846A15D0B2CDF79505D087B44FEAF-qhZVaJ2D3XF9OWT4OSQXE9BPR1lH4CV8@public.gmane.org>
2011-11-24 15:39 ` Arnd Bergmann
2011-11-24 15:39 ` Arnd Bergmann
2011-11-24 15:39 ` Arnd Bergmann
[not found] ` <201111241539.06990.arnd-r2nGTMty4D4@public.gmane.org>
2011-11-24 16:36 ` Voss, Nikolaus
2011-11-24 16:36 ` Voss, Nikolaus
2011-11-24 16:36 ` Voss, Nikolaus
[not found] ` <EF2E73589CA71846A15D0B2CDF79505D087B45007C-qhZVaJ2D3XF9OWT4OSQXE9BPR1lH4CV8@public.gmane.org>
2011-11-24 16:47 ` Arnd Bergmann
2011-11-24 16:47 ` Arnd Bergmann
2011-11-24 16:47 ` Arnd Bergmann
2011-11-08 11:09 ` [PATCH v7 2/5] Replace clk_lookup.con_id with clk_lookup.dev_id entries for twi clk Nikolaus Voss
2011-11-08 11:09 ` Nikolaus Voss
2011-11-23 23:32 ` [PATCH v7 0/5] AT91: replace broken TWI driver i2c-at91.c Ben Dooks
2011-11-23 23:32 ` Ben Dooks
2011-11-23 23:32 ` Ben Dooks
[not found] ` <20111123233238.GL19115-SMNkleLxa3Z6Wcw2j4pizdi2O/JbrIOy@public.gmane.org>
2011-11-24 6:33 ` Voss, Nikolaus
2011-11-24 6:33 ` Voss, Nikolaus
2011-11-24 6:33 ` Voss, Nikolaus
2011-11-24 22:13 ` Ryan Mallon
2011-11-24 22:13 ` Ryan Mallon
2011-11-25 15:42 ` Hubert Feurstein
2011-11-25 15:42 ` Hubert Feurstein
2011-11-25 15:42 ` Hubert Feurstein
[not found] ` <4ECFB755.6060509-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-28 13:36 ` AW: " Carsten Behling
2011-12-28 13:36 ` Carsten Behling
2011-12-28 13:36 ` Carsten Behling
2012-01-11 14:06 ` Voss, Nikolaus
2012-01-11 14:06 ` Voss, Nikolaus
2012-01-11 14:06 ` Voss, Nikolaus
2011-11-08 11:11 ` [PATCH v7 4/5] G45 TWI: remove open drain setting for twi function gpios Nikolaus Voss
2011-11-18 11:38 ` [PATCH v7 5/5] i2c-at91.c: add SMBUS_READ_BLOCK_DATA functionality Nikolaus Voss
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=201111231618.45951.arnd@arndb.de \
--to=arnd-r2ngtmty4d4@public.gmane.org \
--cc=ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org \
--cc=carsten.behling-0M7HhAU3Y85FsXB23wyQUg@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=n.voss-+umVssTZoCsb1SvskN2V4Q@public.gmane.org \
/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.