* [PATCH v2 0/4] I2C Ocores updates @ 2012-07-13 6:38 Jayachandran C [not found] ` <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Jayachandran C @ 2012-07-13 6:38 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Jayachandran C Updated patchset, changes in v2 are: * pass u32 value to of_property_read_u32() in ocores_i2c_of_probe() * undo whitespace change in include/linux/i2c-ocores.h * use int for reg_shift and reg_io_width in ocores_i2c_platform_data (include/linux/i2c-ocores.h) as well. V1 notes ======== While trying to add reg-io-width property to i2c-ocores, we noticed a few things that needs to fixed up in i2c-ocores device tree code. The changes are to: * use the standard 'reg-shift' property instead of 'regstep' * fix the fallout of the about change in drivers/mfd/timberdale.c * move bindings documentation to under Documentation/, * fix up formatting, and add \n to a few dev_* messages, * and finally to add reg-io-width optional property. Ganesan Ramalingam (2): i2c: i2c-ocores: Use reg-shift property i2c: i2c-ocores: support for 16bit and 32bit IO Jayachandran C (2): i2c: i2c-ocores - DT bindings and minor fixes. V4L/DVB: mfd: use reg_shift instead of regstep .../devicetree/bindings/i2c/i2c-ocores.txt | 33 +++++++ drivers/i2c/busses/i2c-ocores.c | 99 ++++++++++---------- drivers/mfd/timberdale.c | 2 +- include/linux/i2c-ocores.h | 3 +- 4 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ocores.txt -- 1.7.9.5 ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org>]
* [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes. [not found] ` <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> @ 2012-07-13 6:39 ` Jayachandran C 2012-07-13 6:39 ` [PATCH 2/4] i2c: i2c-ocores: Use reg-shift property Jayachandran C ` (2 subsequent siblings) 3 siblings, 0 replies; 9+ messages in thread From: Jayachandran C @ 2012-07-13 6:39 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Jayachandran C Cleanups to i2c-cores, no change in logic, changes are: * Move i2c-ocores device tree documentation from source file to Documentation/devicetree/bindings/i2c/i2c-ocores.txt. * Add \n to dev_warn and dev_err messages where missing * Minor updates to the text and formatting fixes. Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> --- .../devicetree/bindings/i2c/i2c-ocores.txt | 27 ++++++++++++ drivers/i2c/busses/i2c-ocores.c | 45 +++----------------- 2 files changed, 34 insertions(+), 38 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ocores.txt diff --git a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt new file mode 100644 index 0000000..bfec894 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt @@ -0,0 +1,27 @@ +Device tree configuration for i2c-ocores + +Required properties: +- compatible : "opencores,i2c-ocores" +- reg : bus address start and address range size of device +- interrupts : interrupt number +- regstep : size of device registers in bytes +- clock-frequency : frequency of bus clock in Hz +- #address-cells : should be <1> +- #size-cells : should be <0> + +Example: + + i2c0: ocores@a0000000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "opencores,i2c-ocores"; + reg = <0xa0000000 0x8>; + interrupts = <10>; + regstep = <1>; + clock-frequency = <20000000>; + + dummy@60 { + compatible = "dummy"; + reg = <0x60>; + }; + }; diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index 75194c5..e8159db 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c @@ -10,40 +10,9 @@ */ /* - * Device tree configuration: - * - * Required properties: - * - compatible : "opencores,i2c-ocores" - * - reg : bus address start and address range size of device - * - interrupts : interrupt number - * - regstep : size of device registers in bytes - * - clock-frequency : frequency of bus clock in Hz - * - * Example: - * - * i2c0: ocores@a0000000 { - * compatible = "opencores,i2c-ocores"; - * reg = <0xa0000000 0x8>; - * interrupts = <10>; - * - * regstep = <1>; - * clock-frequency = <20000000>; - * - * -- Devices connected on this I2C bus get - * -- defined here; address- and size-cells - * -- apply to these child devices - * - * #address-cells = <1>; - * #size-cells = <0>; - * - * dummy@60 { - * compatible = "dummy"; - * reg = <60>; - * }; - * }; - * + * This driver can be used from the device tree, see + * Documentation/devicetree/bindings/i2c/ocore-i2c.txt */ - #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> @@ -247,14 +216,14 @@ static struct i2c_adapter ocores_adapter = { }; #ifdef CONFIG_OF -static int ocores_i2c_of_probe(struct platform_device* pdev, - struct ocores_i2c* i2c) +static int ocores_i2c_of_probe(struct platform_device *pdev, + struct ocores_i2c *i2c) { const __be32* val; val = of_get_property(pdev->dev.of_node, "regstep", NULL); if (!val) { - dev_err(&pdev->dev, "Missing required parameter 'regstep'"); + dev_err(&pdev->dev, "Missing required parameter 'regstep'\n"); return -ENODEV; } i2c->regstep = be32_to_cpup(val); @@ -262,7 +231,7 @@ static int ocores_i2c_of_probe(struct platform_device* pdev, val = of_get_property(pdev->dev.of_node, "clock-frequency", NULL); if (!val) { dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'"); + "Missing required parameter 'clock-frequency'\n"); return -ENODEV; } i2c->clock_khz = be32_to_cpup(val) / 1000; @@ -351,7 +320,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) return 0; } -static int __devexit ocores_i2c_remove(struct platform_device* pdev) +static int __devexit ocores_i2c_remove(struct platform_device *pdev) { struct ocores_i2c *i2c = platform_get_drvdata(pdev); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/4] i2c: i2c-ocores: Use reg-shift property [not found] ` <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-07-13 6:39 ` [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes Jayachandran C @ 2012-07-13 6:39 ` Jayachandran C [not found] ` <1342161543-5838-3-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-07-13 6:39 ` [PATCH 4/4] i2c: i2c-ocores: support for 16bit and 32bit IO Jayachandran C 2012-07-13 6:49 ` [PATCH 3/4] V4L/DVB: mfd: use reg_shift instead of regstep Jayachandran C 3 siblings, 1 reply; 9+ messages in thread From: Jayachandran C @ 2012-07-13 6:39 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Ganesan Ramalingam, Jayachandran C From: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> Deprecate 'regstep' property and use the standard 'reg-shift' property for register offset shifts. 'regstep' will still be supported as an optional property, but will give a warning when used. Signed-off-by: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> --- .../devicetree/bindings/i2c/i2c-ocores.txt | 8 +++- drivers/i2c/busses/i2c-ocores.c | 39 ++++++++++++-------- include/linux/i2c-ocores.h | 2 +- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt index bfec894..1c9334b 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt @@ -4,11 +4,14 @@ Required properties: - compatible : "opencores,i2c-ocores" - reg : bus address start and address range size of device - interrupts : interrupt number -- regstep : size of device registers in bytes - clock-frequency : frequency of bus clock in Hz - #address-cells : should be <1> - #size-cells : should be <0> +Optional properties: +- reg-shift : device register offsets are shifted by this value +- regstep : deprecated, use reg-shift above + Example: i2c0: ocores@a0000000 { @@ -17,9 +20,10 @@ Example: compatible = "opencores,i2c-ocores"; reg = <0xa0000000 0x8>; interrupts = <10>; - regstep = <1>; clock-frequency = <20000000>; + reg-shift = <0>; /* 8 bit registers */ + dummy@60 { compatible = "dummy"; reg = <0x60>; diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index e8159db..fb8db30 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c @@ -25,10 +25,11 @@ #include <linux/slab.h> #include <linux/io.h> #include <linux/of_i2c.h> +#include <linux/log2.h> struct ocores_i2c { void __iomem *base; - int regstep; + int reg_shift; wait_queue_head_t wait; struct i2c_adapter adap; struct i2c_msg *msg; @@ -71,12 +72,12 @@ struct ocores_i2c { static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) { - iowrite8(value, i2c->base + reg * i2c->regstep); + iowrite8(value, i2c->base + (reg << i2c->reg_shift)); } static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) { - return ioread8(i2c->base + reg * i2c->regstep); + return ioread8(i2c->base + (reg << i2c->reg_shift)); } static void ocores_process(struct ocores_i2c *i2c) @@ -219,22 +220,30 @@ static struct i2c_adapter ocores_adapter = { static int ocores_i2c_of_probe(struct platform_device *pdev, struct ocores_i2c *i2c) { - const __be32* val; - - val = of_get_property(pdev->dev.of_node, "regstep", NULL); - if (!val) { - dev_err(&pdev->dev, "Missing required parameter 'regstep'\n"); - return -ENODEV; - } - i2c->regstep = be32_to_cpup(val); + struct device_node *np = pdev->dev.of_node; + u32 val; + + if (of_property_read_u32(np, "reg-shift", &val)) { + /* no 'reg-shift', check for deprecated 'regstep' */ + if (!of_property_read_u32(np, "regstep", &val)) { + if (!is_power_of_2(val)) { + dev_err(&pdev->dev, "invalid regstep %d\n", + val); + return -EINVAL; + } + i2c->reg_shift = ilog2(val); + dev_warn(&pdev->dev, + "regstep property deprecated, use reg-shift\n"); + } + } else + i2c->reg_shift = val; - val = of_get_property(pdev->dev.of_node, "clock-frequency", NULL); - if (!val) { + if (of_property_read_u32(np, "clock-frequency", &val)) { dev_err(&pdev->dev, "Missing required parameter 'clock-frequency'\n"); return -ENODEV; } - i2c->clock_khz = be32_to_cpup(val) / 1000; + i2c->clock_khz = val / 1000; return 0; } @@ -277,7 +286,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) pdata = pdev->dev.platform_data; if (pdata) { - i2c->regstep = pdata->regstep; + i2c->reg_shift = pdata->reg_shift; i2c->clock_khz = pdata->clock_khz; } else { ret = ocores_i2c_of_probe(pdev, i2c); diff --git a/include/linux/i2c-ocores.h b/include/linux/i2c-ocores.h index 4d5e57f..75d7767 100644 --- a/include/linux/i2c-ocores.h +++ b/include/linux/i2c-ocores.h @@ -12,7 +12,7 @@ #define _LINUX_I2C_OCORES_H struct ocores_i2c_platform_data { - u32 regstep; /* distance between registers */ + int reg_shift; /* register offset shift value */ u32 clock_khz; /* input clock in kHz */ u8 num_devices; /* number of devices in the devices list */ struct i2c_board_info const *devices; /* devices connected to the bus */ -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
[parent not found: <1342161543-5838-3-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org>]
* Re: [PATCH 2/4] i2c: i2c-ocores: Use reg-shift property [not found] ` <1342161543-5838-3-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> @ 2012-07-13 9:17 ` Wolfram Sang [not found] ` <20120713091731.GI32184-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Wolfram Sang @ 2012-07-13 9:17 UTC (permalink / raw) To: Jayachandran C Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA, devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Ganesan Ramalingam [-- Attachment #1: Type: text/plain, Size: 4805 bytes --] On Fri, Jul 13, 2012 at 12:09:01PM +0530, Jayachandran C wrote: > From: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> > > Deprecate 'regstep' property and use the standard 'reg-shift' property > for register offset shifts. 'regstep' will still be supported as an > optional property, but will give a warning when used. > > Signed-off-by: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> > Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> > --- > .../devicetree/bindings/i2c/i2c-ocores.txt | 8 +++- > drivers/i2c/busses/i2c-ocores.c | 39 ++++++++++++-------- > include/linux/i2c-ocores.h | 2 +- > 3 files changed, 31 insertions(+), 18 deletions(-) > > diff --git a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt > index bfec894..1c9334b 100644 > --- a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt > +++ b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt > @@ -4,11 +4,14 @@ Required properties: > - compatible : "opencores,i2c-ocores" > - reg : bus address start and address range size of device > - interrupts : interrupt number > -- regstep : size of device registers in bytes > - clock-frequency : frequency of bus clock in Hz > - #address-cells : should be <1> > - #size-cells : should be <0> > > +Optional properties: > +- reg-shift : device register offsets are shifted by this value > +- regstep : deprecated, use reg-shift above > + > Example: > > i2c0: ocores@a0000000 { > @@ -17,9 +20,10 @@ Example: > compatible = "opencores,i2c-ocores"; > reg = <0xa0000000 0x8>; > interrupts = <10>; > - regstep = <1>; > clock-frequency = <20000000>; > > + reg-shift = <0>; /* 8 bit registers */ > + > dummy@60 { > compatible = "dummy"; > reg = <0x60>; > diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c > index e8159db..fb8db30 100644 > --- a/drivers/i2c/busses/i2c-ocores.c > +++ b/drivers/i2c/busses/i2c-ocores.c > @@ -25,10 +25,11 @@ > #include <linux/slab.h> > #include <linux/io.h> > #include <linux/of_i2c.h> > +#include <linux/log2.h> > > struct ocores_i2c { > void __iomem *base; > - int regstep; > + int reg_shift; > wait_queue_head_t wait; > struct i2c_adapter adap; > struct i2c_msg *msg; > @@ -71,12 +72,12 @@ struct ocores_i2c { > > static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) > { > - iowrite8(value, i2c->base + reg * i2c->regstep); > + iowrite8(value, i2c->base + (reg << i2c->reg_shift)); > } > > static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) > { > - return ioread8(i2c->base + reg * i2c->regstep); > + return ioread8(i2c->base + (reg << i2c->reg_shift)); > } > > static void ocores_process(struct ocores_i2c *i2c) > @@ -219,22 +220,30 @@ static struct i2c_adapter ocores_adapter = { > static int ocores_i2c_of_probe(struct platform_device *pdev, > struct ocores_i2c *i2c) > { > - const __be32* val; > - > - val = of_get_property(pdev->dev.of_node, "regstep", NULL); > - if (!val) { > - dev_err(&pdev->dev, "Missing required parameter 'regstep'\n"); > - return -ENODEV; > - } > - i2c->regstep = be32_to_cpup(val); > + struct device_node *np = pdev->dev.of_node; > + u32 val; > + > + if (of_property_read_u32(np, "reg-shift", &val)) { > + /* no 'reg-shift', check for deprecated 'regstep' */ > + if (!of_property_read_u32(np, "regstep", &val)) { > + if (!is_power_of_2(val)) { > + dev_err(&pdev->dev, "invalid regstep %d\n", > + val); > + return -EINVAL; > + } > + i2c->reg_shift = ilog2(val); > + dev_warn(&pdev->dev, > + "regstep property deprecated, use reg-shift\n"); > + } > + } else > + i2c->reg_shift = val; Now you are assigning an u32 to an int. Regstep will never be really a huge number, but still... Also, braces around else-block according to coding style. > > - val = of_get_property(pdev->dev.of_node, "clock-frequency", NULL); > - if (!val) { > + if (of_property_read_u32(np, "clock-frequency", &val)) { > dev_err(&pdev->dev, > "Missing required parameter 'clock-frequency'\n"); > return -ENODEV; > } > - i2c->clock_khz = be32_to_cpup(val) / 1000; > + i2c->clock_khz = val / 1000; Okay, "/ 1000" will guarantee that the divided value will fit into an int. Yet, what do we gain by not using u32? Regards, Wolfram -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20120713091731.GI32184-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>]
* Re: [PATCH 2/4] i2c: i2c-ocores: Use reg-shift property [not found] ` <20120713091731.GI32184-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> @ 2012-07-13 12:38 ` Jayachandran C. 0 siblings, 0 replies; 9+ messages in thread From: Jayachandran C. @ 2012-07-13 12:38 UTC (permalink / raw) To: Wolfram Sang Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA, devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Ganesan Ramalingam On Fri, Jul 13, 2012 at 11:17:31AM +0200, Wolfram Sang wrote: > On Fri, Jul 13, 2012 at 12:09:01PM +0530, Jayachandran C wrote: > > From: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> > > > > Deprecate 'regstep' property and use the standard 'reg-shift' property > > for register offset shifts. 'regstep' will still be supported as an > > optional property, but will give a warning when used. > > > > Signed-off-by: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> > > Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> > > --- [...] > > + } > > + } else > > + i2c->reg_shift = val; > > Now you are assigning an u32 to an int. Regstep will never be really a > huge number, but still... > > Also, braces around else-block according to coding style. > > > > > - val = of_get_property(pdev->dev.of_node, "clock-frequency", NULL); > > - if (!val) { > > + if (of_property_read_u32(np, "clock-frequency", &val)) { > > dev_err(&pdev->dev, > > "Missing required parameter 'clock-frequency'\n"); > > return -ENODEV; > > } > > - i2c->clock_khz = be32_to_cpup(val) / 1000; > > + i2c->clock_khz = val / 1000; > > Okay, "/ 1000" will guarantee that the divided value will fit into an > int. Yet, what do we gain by not using u32? I will send out a new version of this patch using u32. In this case I felt that there is no need to use a fixed width type when an int would do. Regards, JC. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 4/4] i2c: i2c-ocores: support for 16bit and 32bit IO [not found] ` <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-07-13 6:39 ` [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes Jayachandran C 2012-07-13 6:39 ` [PATCH 2/4] i2c: i2c-ocores: Use reg-shift property Jayachandran C @ 2012-07-13 6:39 ` Jayachandran C 2012-07-13 6:49 ` [PATCH 3/4] V4L/DVB: mfd: use reg_shift instead of regstep Jayachandran C 3 siblings, 0 replies; 9+ messages in thread From: Jayachandran C @ 2012-07-13 6:39 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Ganesan Ramalingam, Jayachandran C From: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> Some architectures supports only 16-bit or 32-bit read/write access to their IO space. Add a 'reg-io-width' platform and OF parameter which specifies the IO width to support these platforms. reg-io-width can be specified as 1, 2 or 4, and has a default value of 1 if it is unspecified. Signed-off-by: Ganesan Ramalingam <ganesanr-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> --- .../devicetree/bindings/i2c/i2c-ocores.txt | 2 ++ drivers/i2c/busses/i2c-ocores.c | 21 ++++++++++++++++++-- include/linux/i2c-ocores.h | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt index 1c9334b..c15781f 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt @@ -10,6 +10,7 @@ Required properties: Optional properties: - reg-shift : device register offsets are shifted by this value +- reg-io-width : io register width in bytes (1, 2 or 4) - regstep : deprecated, use reg-shift above Example: @@ -23,6 +24,7 @@ Example: clock-frequency = <20000000>; reg-shift = <0>; /* 8 bit registers */ + reg-io-width = <1>; /* 8 bit read/write */ dummy@60 { compatible = "dummy"; diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index fb8db30..7e710bd 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c @@ -30,6 +30,7 @@ struct ocores_i2c { void __iomem *base; int reg_shift; + int reg_io_width; wait_queue_head_t wait; struct i2c_adapter adap; struct i2c_msg *msg; @@ -72,12 +73,22 @@ struct ocores_i2c { static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) { - iowrite8(value, i2c->base + (reg << i2c->reg_shift)); + if (i2c->reg_io_width == 4) + iowrite32(value, i2c->base + (reg << i2c->reg_shift)); + else if (i2c->reg_io_width == 2) + iowrite16(value, i2c->base + (reg << i2c->reg_shift)); + else + iowrite8(value, i2c->base + (reg << i2c->reg_shift)); } static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) { - return ioread8(i2c->base + (reg << i2c->reg_shift)); + if (i2c->reg_io_width == 4) + return ioread32(i2c->base + (reg << i2c->reg_shift)); + else if (i2c->reg_io_width == 2) + return ioread16(i2c->base + (reg << i2c->reg_shift)); + else + return ioread8(i2c->base + (reg << i2c->reg_shift)); } static void ocores_process(struct ocores_i2c *i2c) @@ -245,6 +256,8 @@ static int ocores_i2c_of_probe(struct platform_device *pdev, } i2c->clock_khz = val / 1000; + if (!of_property_read_u32(pdev->dev.of_node, "reg-io-width", &val)) + i2c->reg_io_width = val; return 0; } #else @@ -287,6 +300,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) pdata = pdev->dev.platform_data; if (pdata) { i2c->reg_shift = pdata->reg_shift; + i2c->reg_io_width = pdata->reg_io_width; i2c->clock_khz = pdata->clock_khz; } else { ret = ocores_i2c_of_probe(pdev, i2c); @@ -294,6 +308,9 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) return ret; } + if (i2c->reg_io_width == 0) + i2c->reg_io_width = 1; /* Set to default value */ + ocores_init(i2c); init_waitqueue_head(&i2c->wait); diff --git a/include/linux/i2c-ocores.h b/include/linux/i2c-ocores.h index 75d7767..5fef682 100644 --- a/include/linux/i2c-ocores.h +++ b/include/linux/i2c-ocores.h @@ -13,6 +13,7 @@ struct ocores_i2c_platform_data { int reg_shift; /* register offset shift value */ + int reg_io_width; /* register io read/write width */ u32 clock_khz; /* input clock in kHz */ u8 num_devices; /* number of devices in the devices list */ struct i2c_board_info const *devices; /* devices connected to the bus */ -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] V4L/DVB: mfd: use reg_shift instead of regstep [not found] ` <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> ` (2 preceding siblings ...) 2012-07-13 6:39 ` [PATCH 4/4] i2c: i2c-ocores: support for 16bit and 32bit IO Jayachandran C @ 2012-07-13 6:49 ` Jayachandran C 3 siblings, 0 replies; 9+ messages in thread From: Jayachandran C @ 2012-07-13 6:49 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, Jayachandran C Update for change in i2c-ocores.h which uses reg_shift to specify the register offset shifts instead of regstep. Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> Acked-by: Richard Rojfors <richard.rojfors-gfIc91nka+FZroRs9YW3xA@public.gmane.org> --- drivers/mfd/timberdale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mfd/timberdale.c b/drivers/mfd/timberdale.c index 0ba26fb..a447f4e 100644 --- a/drivers/mfd/timberdale.c +++ b/drivers/mfd/timberdale.c @@ -83,7 +83,7 @@ timberdale_xiic_platform_data = { static __devinitdata struct ocores_i2c_platform_data timberdale_ocores_platform_data = { - .regstep = 4, + .reg_shift = 2, .clock_khz = 62500, .devices = timberdale_i2c_board_info, .num_devices = ARRAY_SIZE(timberdale_i2c_board_info) -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH RESEND 0/4] I2C Ocores updates @ 2012-07-10 6:10 Jayachandran C [not found] ` <1341900658-7698-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Jayachandran C @ 2012-07-10 6:10 UTC (permalink / raw) To: w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, linux-i2c-u79uwXL29TY76Z2rM5mHXA, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: Jayachandran C [Sending this out again - the changes are straight-forward and I do not see any reason for not merging them. Comments welcome] While trying to add reg-io-width property to i2c-ocores, we noticed a few things that needs to fixed up in i2c-ocores device tree code. The changes are to: * use the standard 'reg-shift' property instead of 'regstep' * fix the fallout of the about change in drivers/mfd/timberdale.c * move bindings documentation to under Documentation/, * fix up formatting, and add \n to a few dev_* messages, * and finally to add reg-io-width optional property. Regards, JC. Ganesan Ramalingam (2): i2c: i2c-ocores: Use reg-shift property i2c: i2c-ocores: support for 16bit and 32bit IO Jayachandran C (2): i2c: i2c-ocores - DT bindings and minor fixes. V4L/DVB: mfd: use reg_shift instead of regstep .../devicetree/bindings/i2c/i2c-ocores.txt | 33 +++++++ drivers/i2c/busses/i2c-ocores.c | 96 +++++++++----------- drivers/mfd/timberdale.c | 2 +- include/linux/i2c-ocores.h | 7 +- 4 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ocores.txt -- 1.7.9.5 ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <1341900658-7698-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org>]
* [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes. [not found] ` <1341900658-7698-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> @ 2012-07-10 6:10 ` Jayachandran C 0 siblings, 0 replies; 9+ messages in thread From: Jayachandran C @ 2012-07-10 6:10 UTC (permalink / raw) To: w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, linux-i2c-u79uwXL29TY76Z2rM5mHXA, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA Cc: Jayachandran C Cleanups to i2c-cores, no change in logic, changes are: * Move i2c-ocores device tree documentation from source file to Documentation/devicetree/bindings/i2c/i2c-ocores.txt. * Add \n to dev_warn and dev_err messages where missing * Minor updates to the text and formatting fixes. Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> --- .../devicetree/bindings/i2c/i2c-ocores.txt | 27 ++++++++++++ drivers/i2c/busses/i2c-ocores.c | 45 +++----------------- 2 files changed, 34 insertions(+), 38 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ocores.txt diff --git a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt new file mode 100644 index 0000000..bfec894 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt @@ -0,0 +1,27 @@ +Device tree configuration for i2c-ocores + +Required properties: +- compatible : "opencores,i2c-ocores" +- reg : bus address start and address range size of device +- interrupts : interrupt number +- regstep : size of device registers in bytes +- clock-frequency : frequency of bus clock in Hz +- #address-cells : should be <1> +- #size-cells : should be <0> + +Example: + + i2c0: ocores@a0000000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "opencores,i2c-ocores"; + reg = <0xa0000000 0x8>; + interrupts = <10>; + regstep = <1>; + clock-frequency = <20000000>; + + dummy@60 { + compatible = "dummy"; + reg = <0x60>; + }; + }; diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index 75194c5..e8159db 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c @@ -10,40 +10,9 @@ */ /* - * Device tree configuration: - * - * Required properties: - * - compatible : "opencores,i2c-ocores" - * - reg : bus address start and address range size of device - * - interrupts : interrupt number - * - regstep : size of device registers in bytes - * - clock-frequency : frequency of bus clock in Hz - * - * Example: - * - * i2c0: ocores@a0000000 { - * compatible = "opencores,i2c-ocores"; - * reg = <0xa0000000 0x8>; - * interrupts = <10>; - * - * regstep = <1>; - * clock-frequency = <20000000>; - * - * -- Devices connected on this I2C bus get - * -- defined here; address- and size-cells - * -- apply to these child devices - * - * #address-cells = <1>; - * #size-cells = <0>; - * - * dummy@60 { - * compatible = "dummy"; - * reg = <60>; - * }; - * }; - * + * This driver can be used from the device tree, see + * Documentation/devicetree/bindings/i2c/ocore-i2c.txt */ - #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> @@ -247,14 +216,14 @@ static struct i2c_adapter ocores_adapter = { }; #ifdef CONFIG_OF -static int ocores_i2c_of_probe(struct platform_device* pdev, - struct ocores_i2c* i2c) +static int ocores_i2c_of_probe(struct platform_device *pdev, + struct ocores_i2c *i2c) { const __be32* val; val = of_get_property(pdev->dev.of_node, "regstep", NULL); if (!val) { - dev_err(&pdev->dev, "Missing required parameter 'regstep'"); + dev_err(&pdev->dev, "Missing required parameter 'regstep'\n"); return -ENODEV; } i2c->regstep = be32_to_cpup(val); @@ -262,7 +231,7 @@ static int ocores_i2c_of_probe(struct platform_device* pdev, val = of_get_property(pdev->dev.of_node, "clock-frequency", NULL); if (!val) { dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'"); + "Missing required parameter 'clock-frequency'\n"); return -ENODEV; } i2c->clock_khz = be32_to_cpup(val) / 1000; @@ -351,7 +320,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) return 0; } -static int __devexit ocores_i2c_remove(struct platform_device* pdev) +static int __devexit ocores_i2c_remove(struct platform_device *pdev) { struct ocores_i2c *i2c = platform_get_drvdata(pdev); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 0/4] I2C Ocores updates @ 2012-06-05 15:41 Jayachandran C [not found] ` <1338910868-12318-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Jayachandran C @ 2012-06-05 15:41 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA, Jayachandran C [devicetree-discuss-mnsaURCQ41sdnm+yROfE0A@public.gmane.org copied since most of the changes are device tree related] While trying to add reg-io-width property to i2c-ocores, we noticed a few things that needs to fixed up in i2c-ocores device tree code. The changes are to: * use the standard 'reg-shift' property instead of 'regstep' * fix the fallout of the about change in drivers/mfd/timberdale.c * move bindings documentation to under Documentation/, * fix up formatting, and add \n to a few dev_* messages, * and finally to add reg-io-width optional property. Regards, JC. Ganesan Ramalingam (2): i2c: i2c-ocores: Use reg-shift property i2c: i2c-ocores: support for 16bit and 32bit IO Jayachandran C (2): i2c: i2c-ocores - DT bindings and minor fixes. V4L/DVB: mfd: use reg_shift instead of regstep .../devicetree/bindings/i2c/i2c-ocores.txt | 33 +++++++ drivers/i2c/busses/i2c-ocores.c | 96 +++++++++----------- drivers/mfd/timberdale.c | 2 +- include/linux/i2c-ocores.h | 7 +- 4 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ocores.txt -- 1.7.9.5 ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <1338910868-12318-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org>]
* [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes. [not found] ` <1338910868-12318-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> @ 2012-06-05 15:41 ` Jayachandran C 0 siblings, 0 replies; 9+ messages in thread From: Jayachandran C @ 2012-06-05 15:41 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, w.sang-bIcnvbaLZ9MEGnE8C9+IrQ Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg, devicetree-discuss-mnsaURCQ41sdnm+yROfE0A, jacmet-OfajU3CKLf1/SzgSGea1oA, richard.rojfors-gfIc91nka+FZroRs9YW3xA, Jayachandran C Cleanups to i2c-cores, no change in logic, changes are: * Move i2c-ocores device tree documentation from source file to Documentation/devicetree/bindings/i2c/i2c-ocores.txt. * Add \n to dev_warn and dev_err messages where missing * Minor updates to the text and formatting fixes. Signed-off-by: Jayachandran C <jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> --- .../devicetree/bindings/i2c/i2c-ocores.txt | 27 ++++++++++++ drivers/i2c/busses/i2c-ocores.c | 45 +++----------------- 2 files changed, 34 insertions(+), 38 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ocores.txt diff --git a/Documentation/devicetree/bindings/i2c/i2c-ocores.txt b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt new file mode 100644 index 0000000..bfec894 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/i2c-ocores.txt @@ -0,0 +1,27 @@ +Device tree configuration for i2c-ocores + +Required properties: +- compatible : "opencores,i2c-ocores" +- reg : bus address start and address range size of device +- interrupts : interrupt number +- regstep : size of device registers in bytes +- clock-frequency : frequency of bus clock in Hz +- #address-cells : should be <1> +- #size-cells : should be <0> + +Example: + + i2c0: ocores@a0000000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "opencores,i2c-ocores"; + reg = <0xa0000000 0x8>; + interrupts = <10>; + regstep = <1>; + clock-frequency = <20000000>; + + dummy@60 { + compatible = "dummy"; + reg = <0x60>; + }; + }; diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index 75194c5..e8159db 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c @@ -10,40 +10,9 @@ */ /* - * Device tree configuration: - * - * Required properties: - * - compatible : "opencores,i2c-ocores" - * - reg : bus address start and address range size of device - * - interrupts : interrupt number - * - regstep : size of device registers in bytes - * - clock-frequency : frequency of bus clock in Hz - * - * Example: - * - * i2c0: ocores@a0000000 { - * compatible = "opencores,i2c-ocores"; - * reg = <0xa0000000 0x8>; - * interrupts = <10>; - * - * regstep = <1>; - * clock-frequency = <20000000>; - * - * -- Devices connected on this I2C bus get - * -- defined here; address- and size-cells - * -- apply to these child devices - * - * #address-cells = <1>; - * #size-cells = <0>; - * - * dummy@60 { - * compatible = "dummy"; - * reg = <60>; - * }; - * }; - * + * This driver can be used from the device tree, see + * Documentation/devicetree/bindings/i2c/ocore-i2c.txt */ - #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> @@ -247,14 +216,14 @@ static struct i2c_adapter ocores_adapter = { }; #ifdef CONFIG_OF -static int ocores_i2c_of_probe(struct platform_device* pdev, - struct ocores_i2c* i2c) +static int ocores_i2c_of_probe(struct platform_device *pdev, + struct ocores_i2c *i2c) { const __be32* val; val = of_get_property(pdev->dev.of_node, "regstep", NULL); if (!val) { - dev_err(&pdev->dev, "Missing required parameter 'regstep'"); + dev_err(&pdev->dev, "Missing required parameter 'regstep'\n"); return -ENODEV; } i2c->regstep = be32_to_cpup(val); @@ -262,7 +231,7 @@ static int ocores_i2c_of_probe(struct platform_device* pdev, val = of_get_property(pdev->dev.of_node, "clock-frequency", NULL); if (!val) { dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'"); + "Missing required parameter 'clock-frequency'\n"); return -ENODEV; } i2c->clock_khz = be32_to_cpup(val) / 1000; @@ -351,7 +320,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) return 0; } -static int __devexit ocores_i2c_remove(struct platform_device* pdev) +static int __devexit ocores_i2c_remove(struct platform_device *pdev) { struct ocores_i2c *i2c = platform_get_drvdata(pdev); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-07-13 12:38 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-07-13 6:38 [PATCH v2 0/4] I2C Ocores updates Jayachandran C [not found] ` <1342161543-5838-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-07-13 6:39 ` [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes Jayachandran C 2012-07-13 6:39 ` [PATCH 2/4] i2c: i2c-ocores: Use reg-shift property Jayachandran C [not found] ` <1342161543-5838-3-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-07-13 9:17 ` Wolfram Sang [not found] ` <20120713091731.GI32184-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 2012-07-13 12:38 ` Jayachandran C. 2012-07-13 6:39 ` [PATCH 4/4] i2c: i2c-ocores: support for 16bit and 32bit IO Jayachandran C 2012-07-13 6:49 ` [PATCH 3/4] V4L/DVB: mfd: use reg_shift instead of regstep Jayachandran C -- strict thread matches above, loose matches on Subject: below -- 2012-07-10 6:10 [PATCH RESEND 0/4] I2C Ocores updates Jayachandran C [not found] ` <1341900658-7698-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-07-10 6:10 ` [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes Jayachandran C 2012-06-05 15:41 [PATCH 0/4] I2C Ocores updates Jayachandran C [not found] ` <1338910868-12318-1-git-send-email-jayachandranc-oSioyQM9ZPnuBjGU1YDckgC/G2K4zDHf@public.gmane.org> 2012-06-05 15:41 ` [PATCH 1/4] i2c: i2c-ocores - DT bindings and minor fixes Jayachandran C
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).