* [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes @ 2010-01-25 8:27 Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 1/3] i2c-mpc: use __devinit[data] for initialization functions and data Wolfgang Grandegger 2010-01-25 12:02 ` [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes Wolfram Sang 0 siblings, 2 replies; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 8:27 UTC (permalink / raw) To: Linux-i2c; +Cc: Devicetree-discuss, Linuxppc-dev This patch series adds support for the MPC512x from Freescale to the i2c-mpc driver. At that occasion, issues with __devinit[data] have been fixed and the doc of the FSL I2C dts bindings updated. It has been tested on a MPC5121ADS, TQM5200 and TQM8560 board Wolfgang Wolfgang Grandegger (3): i2c-mpc: use __devinit[data] for initialization functions and data i2c-mpc: add support for the MPC512x processors from Freescale powerpc: doc/dts-bindings: update doc of FSL I2C bindings Documentation/powerpc/dts-bindings/fsl/i2c.txt | 10 +- drivers/i2c/busses/Kconfig | 9 +- drivers/i2c/busses/i2c-mpc.c | 185 +++++++++++++++--------- 3 files changed, 126 insertions(+), 78 deletions(-) ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/3] i2c-mpc: use __devinit[data] for initialization functions and data 2010-01-25 8:27 [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes Wolfgang Grandegger @ 2010-01-25 8:27 ` Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfgang Grandegger 2010-01-25 12:02 ` [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes Wolfram Sang 1 sibling, 1 reply; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 8:27 UTC (permalink / raw) To: Linux-i2c; +Cc: Devicetree-discuss, Linuxppc-dev, Wolfgang Grandegger From: Wolfgang Grandegger <wg@denx.de> "__devinit[data]" has not yet been used for all initialization functions and data. To avoid truncating lines, the struct mpc_i2c_match_data has been renamed to mpc_i2c_data, which is even the better name. Signed-off-by: Wolfgang Grandegger <wg@denx.de> --- drivers/i2c/busses/i2c-mpc.c | 99 +++++++++++++++++++---------------------- 1 files changed, 46 insertions(+), 53 deletions(-) diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index f627001..2cb864e 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c @@ -66,7 +66,7 @@ struct mpc_i2c_divider { u16 fdr; /* including dfsrr */ }; -struct mpc_i2c_match_data { +struct mpc_i2c_data { void (*setclock)(struct device_node *node, struct mpc_i2c *i2c, u32 clock, u32 prescaler); @@ -165,7 +165,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) } #ifdef CONFIG_PPC_MPC52xx -static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = { +static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_52xx[] = { {20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23}, {28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02}, {36, 0x26}, {40, 0x27}, {44, 0x04}, {48, 0x28}, @@ -186,7 +186,8 @@ static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = { {10240, 0x9d}, {12288, 0x9e}, {15360, 0x9f} }; -int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, int prescaler) +static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, + int prescaler) { const struct mpc_i2c_divider *div = NULL; unsigned int pvr = mfspr(SPRN_PVR); @@ -215,9 +216,9 @@ int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, int prescaler) return div ? (int)div->fdr : -EINVAL; } -static void mpc_i2c_setclock_52xx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { int ret, fdr; @@ -230,15 +231,15 @@ static void mpc_i2c_setclock_52xx(struct device_node *node, dev_info(i2c->dev, "clock %d Hz (fdr=%d)\n", clock, fdr); } #else /* !CONFIG_PPC_MPC52xx */ -static void mpc_i2c_setclock_52xx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { } #endif /* CONFIG_PPC_MPC52xx*/ #ifdef CONFIG_FSL_SOC -static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] = { +static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_8xxx[] = { {160, 0x0120}, {192, 0x0121}, {224, 0x0122}, {256, 0x0123}, {288, 0x0100}, {320, 0x0101}, {352, 0x0601}, {384, 0x0102}, {416, 0x0602}, {448, 0x0126}, {480, 0x0103}, {512, 0x0127}, @@ -258,7 +259,7 @@ static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] = { {49152, 0x011e}, {61440, 0x011f} }; -u32 mpc_i2c_get_sec_cfg_8xxx(void) +static u32 __devinit mpc_i2c_get_sec_cfg_8xxx(void) { struct device_node *node = NULL; u32 __iomem *reg; @@ -287,7 +288,8 @@ u32 mpc_i2c_get_sec_cfg_8xxx(void) return val; } -int mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, u32 prescaler) +static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, + u32 prescaler) { const struct mpc_i2c_divider *div = NULL; u32 divider; @@ -320,9 +322,9 @@ int mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, u32 prescaler) return div ? (int)div->fdr : -EINVAL; } -static void mpc_i2c_setclock_8xxx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { int ret, fdr; @@ -338,9 +340,9 @@ static void mpc_i2c_setclock_8xxx(struct device_node *node, } #else /* !CONFIG_FSL_SOC */ -static void mpc_i2c_setclock_8xxx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { } #endif /* CONFIG_FSL_SOC */ @@ -529,8 +531,8 @@ static int __devinit fsl_i2c_probe(struct of_device *op, clock = *prop; if (match->data) { - struct mpc_i2c_match_data *data = - (struct mpc_i2c_match_data *)match->data; + struct mpc_i2c_data *data = + (struct mpc_i2c_data *)match->data; data->setclock(op->node, i2c, clock, data->prescaler); } else { /* Backwards compatibility */ @@ -582,44 +584,35 @@ static int __devexit fsl_i2c_remove(struct of_device *op) return 0; }; +static struct mpc_i2c_data __devinitdata mpc_i2c_data_52xx = { + .setclock = mpc_i2c_setclock_52xx, +}; + +static struct mpc_i2c_data __devinitdata mpc_i2c_data_8313 = { + .setclock = mpc_i2c_setclock_8xxx, +}; + +static struct mpc_i2c_data __devinitdata mpc_i2c_data_8543 = { + .setclock = mpc_i2c_setclock_8xxx, + .prescaler = 2, +}; + +static struct mpc_i2c_data __devinitdata mpc_i2c_data_8544 = { + .setclock = mpc_i2c_setclock_8xxx, + .prescaler = 3, +}; + static const struct of_device_id mpc_i2c_of_match[] = { - {.compatible = "mpc5200-i2c", - .data = &(struct mpc_i2c_match_data) { - .setclock = mpc_i2c_setclock_52xx, - }, - }, - {.compatible = "fsl,mpc5200b-i2c", - .data = &(struct mpc_i2c_match_data) { - .setclock = mpc_i2c_setclock_52xx, - }, - }, - {.compatible = "fsl,mpc5200-i2c", - .data = &(struct mpc_i2c_match_data) { - .setclock = mpc_i2c_setclock_52xx, - }, - }, - {.compatible = "fsl,mpc8313-i2c", - .data = &(struct mpc_i2c_match_data) { - .setclock = mpc_i2c_setclock_8xxx, - }, - }, - {.compatible = "fsl,mpc8543-i2c", - .data = &(struct mpc_i2c_match_data) { - .setclock = mpc_i2c_setclock_8xxx, - .prescaler = 2, - }, - }, - {.compatible = "fsl,mpc8544-i2c", - .data = &(struct mpc_i2c_match_data) { - .setclock = mpc_i2c_setclock_8xxx, - .prescaler = 3, - }, + {.compatible = "mpc5200-i2c", .data = &mpc_i2c_data_52xx, }, + {.compatible = "fsl,mpc5200b-i2c", .data = &mpc_i2c_data_52xx, }, + {.compatible = "fsl,mpc5200-i2c", .data = &mpc_i2c_data_52xx, }, + {.compatible = "fsl,mpc8313-i2c", .data = &mpc_i2c_data_8313, }, + {.compatible = "fsl,mpc8543-i2c", .data = &mpc_i2c_data_8543, }, + {.compatible = "fsl,mpc8544-i2c", .data = &mpc_i2c_data_8544, }, /* Backward compatibility */ - }, {.compatible = "fsl-i2c", }, {}, }; - MODULE_DEVICE_TABLE(of, mpc_i2c_of_match); -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 8:27 ` [PATCH 1/3] i2c-mpc: use __devinit[data] for initialization functions and data Wolfgang Grandegger @ 2010-01-25 8:27 ` Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings Wolfgang Grandegger 2010-01-25 11:52 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfram Sang 0 siblings, 2 replies; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 8:27 UTC (permalink / raw) To: Linux-i2c; +Cc: Devicetree-discuss, Linuxppc-dev, Wolfgang Grandegger From: Wolfgang Grandegger <wg@denx.de> The "setclock" initialization functions have been renamed to "setup" because I2C interrupts must be enabled for the MPC512x. This requires to handle "fsl,preserve-clocking" in a slighly different way. Also, the old settings are now reported calling dev_dbg(). For the MPC512x the clock setup function of the MPC52xx can be re-used. Signed-off-by: Wolfgang Grandegger <wg@denx.de> --- drivers/i2c/busses/Kconfig | 9 ++-- drivers/i2c/busses/i2c-mpc.c | 122 ++++++++++++++++++++++++++++++------------ 2 files changed, 93 insertions(+), 38 deletions(-) diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 5f318ce..f481f30 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -418,13 +418,14 @@ config I2C_IXP2000 instead. config I2C_MPC - tristate "MPC107/824x/85xx/52xx/86xx" + tristate "MPC107/824x/85xx/512x/52xx/86xx" depends on PPC32 help If you say yes to this option, support will be included for the - built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245 and - MPC85xx/MPC8641 family processors. The driver may also work on 52xx - family processors, though interrupts are known not to work. + built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245, + MPC85xx/MPC8641 and MPC512x family processors. The driver may + also work on 52xx family processors, though interrupts are known + not to work. This driver can also be built as a module. If so, the module will be called i2c-mpc. diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 2cb864e..70c3e5d 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c @@ -67,9 +67,8 @@ struct mpc_i2c_divider { }; struct mpc_i2c_data { - void (*setclock)(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler); + void (*setup)(struct device_node *node, struct mpc_i2c *i2c, + u32 clock, u32 prescaler); u32 prescaler; }; @@ -164,7 +163,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) return 0; } -#ifdef CONFIG_PPC_MPC52xx +#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x) static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_52xx[] = { {20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23}, {28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02}, @@ -216,12 +215,18 @@ static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, return div ? (int)div->fdr : -EINVAL; } -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { int ret, fdr; + if (clock == -1) { + dev_dbg(i2c->dev, "using fdr %d\n", + readb(i2c->base + MPC_I2C_FDR)); + return; /* preserve clocking */ + } + ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler); fdr = (ret >= 0) ? ret : 0x3f; /* backward compatibility */ @@ -230,13 +235,50 @@ static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, if (ret >= 0) dev_info(i2c->dev, "clock %d Hz (fdr=%d)\n", clock, fdr); } -#else /* !CONFIG_PPC_MPC52xx */ -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +#else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */ +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) +{ +} +#endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */ + +#ifdef CONFIG_PPC_MPC512x +static void __devinit mpc_i2c_setup_512x(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) +{ + struct device_node *node_ctrl; + void __iomem *ctrl; + const u32 *pval; + u32 idx; + + /* Enable I2C interrupts for mpc5121 */ + node_ctrl = of_find_compatible_node(NULL, NULL, + "fsl,mpc5121-i2c-ctrl"); + if (node_ctrl) { + ctrl = of_iomap(node_ctrl, 0); + if (ctrl) { + + /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */ + pval = of_get_property(node, "reg", NULL); + idx = (*pval & 0xff) / 0x20; + setbits32(ctrl, 1 << (24 + idx * 2)); + iounmap(ctrl); + } + of_node_put(node_ctrl); + } + + /* The clock setup for the 52xx works also fine for the 512x */ + mpc_i2c_setup_52xx(node, i2c, clock, prescaler); +} +#else /* CONFIG_PPC_MPC512x */ +static void __devinit mpc_i2c_setup_512x(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { } -#endif /* CONFIG_PPC_MPC52xx*/ +#endif /* CONFIG_PPC_MPC512x */ #ifdef CONFIG_FSL_SOC static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_8xxx[] = { @@ -322,12 +364,19 @@ static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, return div ? (int)div->fdr : -EINVAL; } -static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { int ret, fdr; + if (clock == -1) { + dev_dbg(i2c->dev, "using dfsrr %d, fdr %d\n", + readb(i2c->base + MPC_I2C_DFSRR), + readb(i2c->base + MPC_I2C_FDR)); + return; /* preserve clocking */ + } + ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler); fdr = (ret >= 0) ? ret : 0x1031; /* backward compatibility */ @@ -340,9 +389,9 @@ static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, } #else /* !CONFIG_FSL_SOC */ -static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, - struct mpc_i2c *i2c, - u32 clock, u32 prescaler) +static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, + struct mpc_i2c *i2c, + u32 clock, u32 prescaler) { } #endif /* CONFIG_FSL_SOC */ @@ -525,21 +574,21 @@ static int __devinit fsl_i2c_probe(struct of_device *op, } } - if (!of_get_property(op->node, "fsl,preserve-clocking", NULL)) { + if (of_get_property(op->node, "fsl,preserve-clocking", NULL)) { + clock = -1; + } else { prop = of_get_property(op->node, "clock-frequency", &plen); if (prop && plen == sizeof(u32)) clock = *prop; + } - if (match->data) { - struct mpc_i2c_data *data = - (struct mpc_i2c_data *)match->data; - data->setclock(op->node, i2c, clock, data->prescaler); - } else { - /* Backwards compatibility */ - if (of_get_property(op->node, "dfsrr", NULL)) - mpc_i2c_setclock_8xxx(op->node, i2c, - clock, 0); - } + if (match->data) { + struct mpc_i2c_data *data = (struct mpc_i2c_data *)match->data; + data->setup(op->node, i2c, clock, data->prescaler); + } else { + /* Backwards compatibility */ + if (of_get_property(op->node, "dfsrr", NULL)) + mpc_i2c_setup_8xxx(op->node, i2c, clock, 0); } dev_set_drvdata(&op->dev, i2c); @@ -585,20 +634,24 @@ static int __devexit fsl_i2c_remove(struct of_device *op) }; static struct mpc_i2c_data __devinitdata mpc_i2c_data_52xx = { - .setclock = mpc_i2c_setclock_52xx, + .setup = mpc_i2c_setup_52xx, +}; + +static struct mpc_i2c_data __devinitdata mpc_i2c_data_512x = { + .setup = mpc_i2c_setup_512x, }; static struct mpc_i2c_data __devinitdata mpc_i2c_data_8313 = { - .setclock = mpc_i2c_setclock_8xxx, + .setup = mpc_i2c_setup_8xxx, }; static struct mpc_i2c_data __devinitdata mpc_i2c_data_8543 = { - .setclock = mpc_i2c_setclock_8xxx, + .setup = mpc_i2c_setup_8xxx, .prescaler = 2, }; static struct mpc_i2c_data __devinitdata mpc_i2c_data_8544 = { - .setclock = mpc_i2c_setclock_8xxx, + .setup = mpc_i2c_setup_8xxx, .prescaler = 3, }; @@ -606,6 +659,7 @@ static const struct of_device_id mpc_i2c_of_match[] = { {.compatible = "mpc5200-i2c", .data = &mpc_i2c_data_52xx, }, {.compatible = "fsl,mpc5200b-i2c", .data = &mpc_i2c_data_52xx, }, {.compatible = "fsl,mpc5200-i2c", .data = &mpc_i2c_data_52xx, }, + {.compatible = "fsl,mpc5121-i2c", .data = &mpc_i2c_data_512x, }, {.compatible = "fsl,mpc8313-i2c", .data = &mpc_i2c_data_8313, }, {.compatible = "fsl,mpc8543-i2c", .data = &mpc_i2c_data_8543, }, {.compatible = "fsl,mpc8544-i2c", .data = &mpc_i2c_data_8544, }, @@ -648,5 +702,5 @@ module_exit(fsl_i2c_exit); MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>"); MODULE_DESCRIPTION("I2C-Bus adapter for MPC107 bridge and " - "MPC824x/85xx/52xx processors"); + "MPC824x/85xx/512x/52xx processors"); MODULE_LICENSE("GPL"); -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings 2010-01-25 8:27 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfgang Grandegger @ 2010-01-25 8:27 ` Wolfgang Grandegger 2010-01-25 11:56 ` Wolfram Sang 2010-01-25 11:52 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfram Sang 1 sibling, 1 reply; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 8:27 UTC (permalink / raw) To: Linux-i2c; +Cc: Devicetree-discuss, Linuxppc-dev, Wolfgang Grandegger From: Wolfgang Grandegger <wg@denx.de> This patch adds the MPC5121 to the list of supported devices, enhances the doc of the "clock-frequency" property and removes the obsolete "cell-index" property from the example nodes. Signed-off-by: Wolfgang Grandegger <wg@denx.de> --- Documentation/powerpc/dts-bindings/fsl/i2c.txt | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Documentation/powerpc/dts-bindings/fsl/i2c.txt b/Documentation/powerpc/dts-bindings/fsl/i2c.txt index b6d2e21..2af8a05 100644 --- a/Documentation/powerpc/dts-bindings/fsl/i2c.txt +++ b/Documentation/powerpc/dts-bindings/fsl/i2c.txt @@ -9,8 +9,8 @@ Recommended properties : - compatible : compatibility list with 2 entries, the first should be "fsl,CHIP-i2c" where CHIP is the name of a compatible processor, - e.g. mpc8313, mpc8543, mpc8544, mpc5200 or mpc5200b. The second one - should be "fsl-i2c". + e.g. mpc8313, mpc8543, mpc8544, mpc5121, mpc5200 or mpc5200b. The + second one should be "fsl-i2c". - interrupts : <a b> where a is the interrupt number and b is a field that represents an encoding of the sense and level information for the interrupt. This should be encoded based on @@ -20,7 +20,9 @@ Recommended properties : services interrupts for this device. - fsl,preserve-clocking : boolean; if defined, the clock settings from the bootloader are preserved (not touched). - - clock-frequency : desired I2C bus clock frequency in Hz. + - clock-frequency : desired I2C bus clock frequency in Hz. If this + property and "fsl,preserve-clocking" is not defined, a safe fixed + clock divider value is used (resulting in a small clock frequency). Examples : @@ -28,7 +30,6 @@ Examples : #address-cells = <1>; #size-cells = <0>; compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; - cell-index = <0>; reg = <0x3d00 0x40>; interrupts = <2 15 0>; interrupt-parent = <&mpc5200_pic>; @@ -38,7 +39,6 @@ Examples : i2c@3100 { #address-cells = <1>; #size-cells = <0>; - cell-index = <1>; compatible = "fsl,mpc8544-i2c", "fsl-i2c"; reg = <0x3100 0x100>; interrupts = <43 2>; -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings 2010-01-25 8:27 ` [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings Wolfgang Grandegger @ 2010-01-25 11:56 ` Wolfram Sang 2010-01-25 11:58 ` Wolfgang Grandegger 0 siblings, 1 reply; 16+ messages in thread From: Wolfram Sang @ 2010-01-25 11:56 UTC (permalink / raw) To: Wolfgang Grandegger Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger [-- Attachment #1: Type: text/plain, Size: 2854 bytes --] On Mon, Jan 25, 2010 at 09:27:09AM +0100, Wolfgang Grandegger wrote: > From: Wolfgang Grandegger <wg@denx.de> > > This patch adds the MPC5121 to the list of supported devices, > enhances the doc of the "clock-frequency" property and removes > the obsolete "cell-index" property from the example nodes. I think "fsl,mpc5121-i2c-ctrl" needs to be documented here, too? > > Signed-off-by: Wolfgang Grandegger <wg@denx.de> > --- > Documentation/powerpc/dts-bindings/fsl/i2c.txt | 10 +++++----- > 1 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/Documentation/powerpc/dts-bindings/fsl/i2c.txt b/Documentation/powerpc/dts-bindings/fsl/i2c.txt > index b6d2e21..2af8a05 100644 > --- a/Documentation/powerpc/dts-bindings/fsl/i2c.txt > +++ b/Documentation/powerpc/dts-bindings/fsl/i2c.txt > @@ -9,8 +9,8 @@ Recommended properties : > > - compatible : compatibility list with 2 entries, the first should > be "fsl,CHIP-i2c" where CHIP is the name of a compatible processor, > - e.g. mpc8313, mpc8543, mpc8544, mpc5200 or mpc5200b. The second one > - should be "fsl-i2c". > + e.g. mpc8313, mpc8543, mpc8544, mpc5121, mpc5200 or mpc5200b. The > + second one should be "fsl-i2c". > - interrupts : <a b> where a is the interrupt number and b is a > field that represents an encoding of the sense and level > information for the interrupt. This should be encoded based on > @@ -20,7 +20,9 @@ Recommended properties : > services interrupts for this device. > - fsl,preserve-clocking : boolean; if defined, the clock settings > from the bootloader are preserved (not touched). > - - clock-frequency : desired I2C bus clock frequency in Hz. > + - clock-frequency : desired I2C bus clock frequency in Hz. If this > + property and "fsl,preserve-clocking" is not defined, a safe fixed > + clock divider value is used (resulting in a small clock frequency). > > Examples : > > @@ -28,7 +30,6 @@ Examples : > #address-cells = <1>; > #size-cells = <0>; > compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; > - cell-index = <0>; > reg = <0x3d00 0x40>; > interrupts = <2 15 0>; > interrupt-parent = <&mpc5200_pic>; > @@ -38,7 +39,6 @@ Examples : > i2c@3100 { > #address-cells = <1>; > #size-cells = <0>; > - cell-index = <1>; > compatible = "fsl,mpc8544-i2c", "fsl-i2c"; > reg = <0x3100 0x100>; > interrupts = <43 2>; > -- > 1.6.2.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-i2c" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings 2010-01-25 11:56 ` Wolfram Sang @ 2010-01-25 11:58 ` Wolfgang Grandegger 0 siblings, 0 replies; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 11:58 UTC (permalink / raw) To: Wolfram Sang Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger Wolfram Sang wrote: > On Mon, Jan 25, 2010 at 09:27:09AM +0100, Wolfgang Grandegger wrote: >> From: Wolfgang Grandegger <wg@denx.de> >> >> This patch adds the MPC5121 to the list of supported devices, >> enhances the doc of the "clock-frequency" property and removes >> the obsolete "cell-index" property from the example nodes. > > I think "fsl,mpc5121-i2c-ctrl" needs to be documented here, too? Yep, Wolfgang. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 8:27 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings Wolfgang Grandegger @ 2010-01-25 11:52 ` Wolfram Sang 2010-01-25 12:06 ` Wolfgang Grandegger 1 sibling, 1 reply; 16+ messages in thread From: Wolfram Sang @ 2010-01-25 11:52 UTC (permalink / raw) To: Wolfgang Grandegger Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger [-- Attachment #1: Type: text/plain, Size: 10200 bytes --] Hi Wolfgang, On Mon, Jan 25, 2010 at 09:27:08AM +0100, Wolfgang Grandegger wrote: > From: Wolfgang Grandegger <wg@denx.de> > > The "setclock" initialization functions have been renamed to "setup" > because I2C interrupts must be enabled for the MPC512x. This requires > to handle "fsl,preserve-clocking" in a slighly different way. Also, > the old settings are now reported calling dev_dbg(). For the MPC512x > the clock setup function of the MPC52xx can be re-used. > > Signed-off-by: Wolfgang Grandegger <wg@denx.de> > --- > drivers/i2c/busses/Kconfig | 9 ++-- > drivers/i2c/busses/i2c-mpc.c | 122 ++++++++++++++++++++++++++++++------------ > 2 files changed, 93 insertions(+), 38 deletions(-) > > diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig > index 5f318ce..f481f30 100644 > --- a/drivers/i2c/busses/Kconfig > +++ b/drivers/i2c/busses/Kconfig > @@ -418,13 +418,14 @@ config I2C_IXP2000 > instead. > > config I2C_MPC > - tristate "MPC107/824x/85xx/52xx/86xx" > + tristate "MPC107/824x/85xx/512x/52xx/86xx" > depends on PPC32 > help > If you say yes to this option, support will be included for the > - built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245 and > - MPC85xx/MPC8641 family processors. The driver may also work on 52xx > - family processors, though interrupts are known not to work. > + built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245, > + MPC85xx/MPC8641 and MPC512x family processors. The driver may > + also work on 52xx family processors, though interrupts are known > + not to work. Opinion poll: Can we remove the "may work" sentence while we are here? It has worked fine for years. BTW, which interrupts are meant here (from I2C slaves? interrupts of the controller?)? > > This driver can also be built as a module. If so, the module > will be called i2c-mpc. > diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c > index 2cb864e..70c3e5d 100644 > --- a/drivers/i2c/busses/i2c-mpc.c > +++ b/drivers/i2c/busses/i2c-mpc.c > @@ -67,9 +67,8 @@ struct mpc_i2c_divider { > }; > > struct mpc_i2c_data { > - void (*setclock)(struct device_node *node, > - struct mpc_i2c *i2c, > - u32 clock, u32 prescaler); > + void (*setup)(struct device_node *node, struct mpc_i2c *i2c, > + u32 clock, u32 prescaler); > u32 prescaler; > }; > > @@ -164,7 +163,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) > return 0; > } > > -#ifdef CONFIG_PPC_MPC52xx > +#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x) > static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_52xx[] = { > {20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23}, > {28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02}, > @@ -216,12 +215,18 @@ static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, > return div ? (int)div->fdr : -EINVAL; > } > > -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, > - struct mpc_i2c *i2c, > - u32 clock, u32 prescaler) > +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, > + struct mpc_i2c *i2c, > + u32 clock, u32 prescaler) > { > int ret, fdr; > > + if (clock == -1) { Could we use 0 for 'no_clock'? This would make the above statement simply if (!clock) and saves us using -1 with a u32. > + dev_dbg(i2c->dev, "using fdr %d\n", > + readb(i2c->base + MPC_I2C_FDR)); > + return; /* preserve clocking */ > + } > + > ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler); > fdr = (ret >= 0) ? ret : 0x3f; /* backward compatibility */ > > @@ -230,13 +235,50 @@ static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, > if (ret >= 0) > dev_info(i2c->dev, "clock %d Hz (fdr=%d)\n", clock, fdr); > } > -#else /* !CONFIG_PPC_MPC52xx */ > -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, > - struct mpc_i2c *i2c, > - u32 clock, u32 prescaler) > +#else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */ > +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, > + struct mpc_i2c *i2c, > + u32 clock, u32 prescaler) > +{ > +} > +#endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */ > + > +#ifdef CONFIG_PPC_MPC512x > +static void __devinit mpc_i2c_setup_512x(struct device_node *node, > + struct mpc_i2c *i2c, > + u32 clock, u32 prescaler) > +{ > + struct device_node *node_ctrl; > + void __iomem *ctrl; > + const u32 *pval; > + u32 idx; > + > + /* Enable I2C interrupts for mpc5121 */ > + node_ctrl = of_find_compatible_node(NULL, NULL, > + "fsl,mpc5121-i2c-ctrl"); > + if (node_ctrl) { > + ctrl = of_iomap(node_ctrl, 0); > + if (ctrl) { > + > + /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */ > + pval = of_get_property(node, "reg", NULL); > + idx = (*pval & 0xff) / 0x20; > + setbits32(ctrl, 1 << (24 + idx * 2)); > + iounmap(ctrl); > + } > + of_node_put(node_ctrl); > + } > + > + /* The clock setup for the 52xx works also fine for the 512x */ > + mpc_i2c_setup_52xx(node, i2c, clock, prescaler); > +} > +#else /* CONFIG_PPC_MPC512x */ > +static void __devinit mpc_i2c_setup_512x(struct device_node *node, > + struct mpc_i2c *i2c, > + u32 clock, u32 prescaler) > { > } > -#endif /* CONFIG_PPC_MPC52xx*/ > +#endif /* CONFIG_PPC_MPC512x */ > > #ifdef CONFIG_FSL_SOC > static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_8xxx[] = { > @@ -322,12 +364,19 @@ static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, > return div ? (int)div->fdr : -EINVAL; > } > > -static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, > - struct mpc_i2c *i2c, > - u32 clock, u32 prescaler) > +static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, > + struct mpc_i2c *i2c, > + u32 clock, u32 prescaler) > { > int ret, fdr; > > + if (clock == -1) { > + dev_dbg(i2c->dev, "using dfsrr %d, fdr %d\n", > + readb(i2c->base + MPC_I2C_DFSRR), > + readb(i2c->base + MPC_I2C_FDR)); > + return; /* preserve clocking */ > + } > + > ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler); > fdr = (ret >= 0) ? ret : 0x1031; /* backward compatibility */ > > @@ -340,9 +389,9 @@ static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, > } > > #else /* !CONFIG_FSL_SOC */ > -static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, > - struct mpc_i2c *i2c, > - u32 clock, u32 prescaler) > +static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, > + struct mpc_i2c *i2c, > + u32 clock, u32 prescaler) > { > } > #endif /* CONFIG_FSL_SOC */ > @@ -525,21 +574,21 @@ static int __devinit fsl_i2c_probe(struct of_device *op, > } > } > > - if (!of_get_property(op->node, "fsl,preserve-clocking", NULL)) { > + if (of_get_property(op->node, "fsl,preserve-clocking", NULL)) { > + clock = -1; > + } else { > prop = of_get_property(op->node, "clock-frequency", &plen); > if (prop && plen == sizeof(u32)) > clock = *prop; > + } > > - if (match->data) { > - struct mpc_i2c_data *data = > - (struct mpc_i2c_data *)match->data; > - data->setclock(op->node, i2c, clock, data->prescaler); > - } else { > - /* Backwards compatibility */ > - if (of_get_property(op->node, "dfsrr", NULL)) > - mpc_i2c_setclock_8xxx(op->node, i2c, > - clock, 0); > - } > + if (match->data) { > + struct mpc_i2c_data *data = (struct mpc_i2c_data *)match->data; The cast should not be necessary. > + data->setup(op->node, i2c, clock, data->prescaler); > + } else { > + /* Backwards compatibility */ > + if (of_get_property(op->node, "dfsrr", NULL)) > + mpc_i2c_setup_8xxx(op->node, i2c, clock, 0); > } > > dev_set_drvdata(&op->dev, i2c); > @@ -585,20 +634,24 @@ static int __devexit fsl_i2c_remove(struct of_device *op) > }; > > static struct mpc_i2c_data __devinitdata mpc_i2c_data_52xx = { > - .setclock = mpc_i2c_setclock_52xx, > + .setup = mpc_i2c_setup_52xx, > +}; > + > +static struct mpc_i2c_data __devinitdata mpc_i2c_data_512x = { > + .setup = mpc_i2c_setup_512x, > }; > > static struct mpc_i2c_data __devinitdata mpc_i2c_data_8313 = { > - .setclock = mpc_i2c_setclock_8xxx, > + .setup = mpc_i2c_setup_8xxx, > }; > > static struct mpc_i2c_data __devinitdata mpc_i2c_data_8543 = { > - .setclock = mpc_i2c_setclock_8xxx, > + .setup = mpc_i2c_setup_8xxx, > .prescaler = 2, > }; > > static struct mpc_i2c_data __devinitdata mpc_i2c_data_8544 = { > - .setclock = mpc_i2c_setclock_8xxx, > + .setup = mpc_i2c_setup_8xxx, > .prescaler = 3, > }; > > @@ -606,6 +659,7 @@ static const struct of_device_id mpc_i2c_of_match[] = { > {.compatible = "mpc5200-i2c", .data = &mpc_i2c_data_52xx, }, > {.compatible = "fsl,mpc5200b-i2c", .data = &mpc_i2c_data_52xx, }, > {.compatible = "fsl,mpc5200-i2c", .data = &mpc_i2c_data_52xx, }, > + {.compatible = "fsl,mpc5121-i2c", .data = &mpc_i2c_data_512x, }, > {.compatible = "fsl,mpc8313-i2c", .data = &mpc_i2c_data_8313, }, > {.compatible = "fsl,mpc8543-i2c", .data = &mpc_i2c_data_8543, }, > {.compatible = "fsl,mpc8544-i2c", .data = &mpc_i2c_data_8544, }, > @@ -648,5 +702,5 @@ module_exit(fsl_i2c_exit); > > MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>"); > MODULE_DESCRIPTION("I2C-Bus adapter for MPC107 bridge and " > - "MPC824x/85xx/52xx processors"); > + "MPC824x/85xx/512x/52xx processors"); > MODULE_LICENSE("GPL"); > -- > 1.6.2.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-i2c" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Regards, Wolfram -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 11:52 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfram Sang @ 2010-01-25 12:06 ` Wolfgang Grandegger 2010-01-25 15:15 ` Wolfram Sang 0 siblings, 1 reply; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 12:06 UTC (permalink / raw) To: Wolfram Sang Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger Hi Wolfram, Wolfram Sang wrote: > Hi Wolfgang, > > On Mon, Jan 25, 2010 at 09:27:08AM +0100, Wolfgang Grandegger wrote: >> From: Wolfgang Grandegger <wg@denx.de> >> >> The "setclock" initialization functions have been renamed to "setup" >> because I2C interrupts must be enabled for the MPC512x. This requires >> to handle "fsl,preserve-clocking" in a slighly different way. Also, >> the old settings are now reported calling dev_dbg(). For the MPC512x >> the clock setup function of the MPC52xx can be re-used. >> >> Signed-off-by: Wolfgang Grandegger <wg@denx.de> >> --- >> drivers/i2c/busses/Kconfig | 9 ++-- >> drivers/i2c/busses/i2c-mpc.c | 122 ++++++++++++++++++++++++++++++------------ >> 2 files changed, 93 insertions(+), 38 deletions(-) >> >> diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig >> index 5f318ce..f481f30 100644 >> --- a/drivers/i2c/busses/Kconfig >> +++ b/drivers/i2c/busses/Kconfig >> @@ -418,13 +418,14 @@ config I2C_IXP2000 >> instead. >> >> config I2C_MPC >> - tristate "MPC107/824x/85xx/52xx/86xx" >> + tristate "MPC107/824x/85xx/512x/52xx/86xx" >> depends on PPC32 >> help >> If you say yes to this option, support will be included for the >> - built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245 and >> - MPC85xx/MPC8641 family processors. The driver may also work on 52xx >> - family processors, though interrupts are known not to work. >> + built-in I2C interface on the MPC107/Tsi107/MPC8240/MPC8245, >> + MPC85xx/MPC8641 and MPC512x family processors. The driver may >> + also work on 52xx family processors, though interrupts are known >> + not to work. > > Opinion poll: Can we remove the "may work" sentence while we are here? It has > worked fine for years. BTW, which interrupts are meant here (from I2C slaves? > interrupts of the controller?)? I first wanted to remove this sentence but as I was not sure what it's exact meaning... Anyway, it's confusing and I would remove it. >> This driver can also be built as a module. If so, the module >> will be called i2c-mpc. >> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c >> index 2cb864e..70c3e5d 100644 >> --- a/drivers/i2c/busses/i2c-mpc.c >> +++ b/drivers/i2c/busses/i2c-mpc.c >> @@ -67,9 +67,8 @@ struct mpc_i2c_divider { >> }; >> >> struct mpc_i2c_data { >> - void (*setclock)(struct device_node *node, >> - struct mpc_i2c *i2c, >> - u32 clock, u32 prescaler); >> + void (*setup)(struct device_node *node, struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler); >> u32 prescaler; >> }; >> >> @@ -164,7 +163,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) >> return 0; >> } >> >> -#ifdef CONFIG_PPC_MPC52xx >> +#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x) >> static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_52xx[] = { >> {20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23}, >> {28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02}, >> @@ -216,12 +215,18 @@ static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, >> return div ? (int)div->fdr : -EINVAL; >> } >> >> -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, >> - struct mpc_i2c *i2c, >> - u32 clock, u32 prescaler) >> +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, >> + struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler) >> { >> int ret, fdr; >> >> + if (clock == -1) { > > Could we use 0 for 'no_clock'? This would make the above statement simply "0" is already used to maintain backward compatibility setting a safe divider. > if (!clock) > > and saves us using -1 with a u32. > >> + dev_dbg(i2c->dev, "using fdr %d\n", >> + readb(i2c->base + MPC_I2C_FDR)); >> + return; /* preserve clocking */ >> + } >> + >> ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler); >> fdr = (ret >= 0) ? ret : 0x3f; /* backward compatibility */ >> >> @@ -230,13 +235,50 @@ static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, >> if (ret >= 0) >> dev_info(i2c->dev, "clock %d Hz (fdr=%d)\n", clock, fdr); >> } >> -#else /* !CONFIG_PPC_MPC52xx */ >> -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, >> - struct mpc_i2c *i2c, >> - u32 clock, u32 prescaler) >> +#else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */ >> +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, >> + struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler) >> +{ >> +} >> +#endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */ >> + >> +#ifdef CONFIG_PPC_MPC512x >> +static void __devinit mpc_i2c_setup_512x(struct device_node *node, >> + struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler) >> +{ >> + struct device_node *node_ctrl; >> + void __iomem *ctrl; >> + const u32 *pval; >> + u32 idx; >> + >> + /* Enable I2C interrupts for mpc5121 */ >> + node_ctrl = of_find_compatible_node(NULL, NULL, >> + "fsl,mpc5121-i2c-ctrl"); >> + if (node_ctrl) { >> + ctrl = of_iomap(node_ctrl, 0); >> + if (ctrl) { >> + >> + /* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */ >> + pval = of_get_property(node, "reg", NULL); >> + idx = (*pval & 0xff) / 0x20; >> + setbits32(ctrl, 1 << (24 + idx * 2)); >> + iounmap(ctrl); >> + } >> + of_node_put(node_ctrl); >> + } >> + >> + /* The clock setup for the 52xx works also fine for the 512x */ >> + mpc_i2c_setup_52xx(node, i2c, clock, prescaler); >> +} >> +#else /* CONFIG_PPC_MPC512x */ >> +static void __devinit mpc_i2c_setup_512x(struct device_node *node, >> + struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler) >> { >> } >> -#endif /* CONFIG_PPC_MPC52xx*/ >> +#endif /* CONFIG_PPC_MPC512x */ >> >> #ifdef CONFIG_FSL_SOC >> static const struct __devinitdata mpc_i2c_divider mpc_i2c_dividers_8xxx[] = { >> @@ -322,12 +364,19 @@ static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, >> return div ? (int)div->fdr : -EINVAL; >> } >> >> -static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, >> - struct mpc_i2c *i2c, >> - u32 clock, u32 prescaler) >> +static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, >> + struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler) >> { >> int ret, fdr; >> >> + if (clock == -1) { >> + dev_dbg(i2c->dev, "using dfsrr %d, fdr %d\n", >> + readb(i2c->base + MPC_I2C_DFSRR), >> + readb(i2c->base + MPC_I2C_FDR)); >> + return; /* preserve clocking */ >> + } >> + >> ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler); >> fdr = (ret >= 0) ? ret : 0x1031; /* backward compatibility */ >> >> @@ -340,9 +389,9 @@ static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, >> } >> >> #else /* !CONFIG_FSL_SOC */ >> -static void __devinit mpc_i2c_setclock_8xxx(struct device_node *node, >> - struct mpc_i2c *i2c, >> - u32 clock, u32 prescaler) >> +static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, >> + struct mpc_i2c *i2c, >> + u32 clock, u32 prescaler) >> { >> } >> #endif /* CONFIG_FSL_SOC */ >> @@ -525,21 +574,21 @@ static int __devinit fsl_i2c_probe(struct of_device *op, >> } >> } >> >> - if (!of_get_property(op->node, "fsl,preserve-clocking", NULL)) { >> + if (of_get_property(op->node, "fsl,preserve-clocking", NULL)) { >> + clock = -1; >> + } else { >> prop = of_get_property(op->node, "clock-frequency", &plen); >> if (prop && plen == sizeof(u32)) >> clock = *prop; >> + } >> >> - if (match->data) { >> - struct mpc_i2c_data *data = >> - (struct mpc_i2c_data *)match->data; >> - data->setclock(op->node, i2c, clock, data->prescaler); >> - } else { >> - /* Backwards compatibility */ >> - if (of_get_property(op->node, "dfsrr", NULL)) >> - mpc_i2c_setclock_8xxx(op->node, i2c, >> - clock, 0); >> - } >> + if (match->data) { >> + struct mpc_i2c_data *data = (struct mpc_i2c_data *)match->data; > > The cast should not be necessary. Right. Wolfgang. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 12:06 ` Wolfgang Grandegger @ 2010-01-25 15:15 ` Wolfram Sang 2010-01-25 18:33 ` Wolfgang Grandegger 2010-01-26 14:39 ` Ben Dooks 0 siblings, 2 replies; 16+ messages in thread From: Wolfram Sang @ 2010-01-25 15:15 UTC (permalink / raw) To: Wolfgang Grandegger Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger [-- Attachment #1: Type: text/plain, Size: 1009 bytes --] > >> > >> -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, > >> - struct mpc_i2c *i2c, > >> - u32 clock, u32 prescaler) > >> +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, > >> + struct mpc_i2c *i2c, > >> + u32 clock, u32 prescaler) > >> { > >> int ret, fdr; > >> > >> + if (clock == -1) { > > > > Could we use 0 for 'no_clock'? This would make the above statement simply > > "0" is already used to maintain backward compatibility setting a safe > divider. Ah, now I see: 'clock == -1' means 'preserve clocks' (and is checked here in mpc_i2c_setup_52xx()) 'clock == 0' means 'safe divider' (and is checked in mpc_i2c_get_fdr_52xx()) This is not a beauty ;) What about adding a flags variable to the setup-functions? Regards, Wolfram -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 15:15 ` Wolfram Sang @ 2010-01-25 18:33 ` Wolfgang Grandegger 2010-01-25 20:48 ` Wolfram Sang 2010-01-26 14:39 ` Ben Dooks 1 sibling, 1 reply; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 18:33 UTC (permalink / raw) To: Wolfram Sang Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger Wolfram Sang wrote: >>>> >>>> -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, >>>> - struct mpc_i2c *i2c, >>>> - u32 clock, u32 prescaler) >>>> +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, >>>> + struct mpc_i2c *i2c, >>>> + u32 clock, u32 prescaler) >>>> { >>>> int ret, fdr; >>>> >>>> + if (clock == -1) { >>> Could we use 0 for 'no_clock'? This would make the above statement simply >> "0" is already used to maintain backward compatibility setting a safe >> divider. > > Ah, now I see: > > 'clock == -1' means 'preserve clocks' (and is checked here in mpc_i2c_setup_52xx()) Yes, this is now necessary because "setup" does not just do clock settings. > 'clock == 0' means 'safe divider' (and is checked in mpc_i2c_get_fdr_52xx()) This is for compatibility with old DTS files and last time it was tricky to get that right and therefore... > This is not a beauty ;) > > What about adding a flags variable to the setup-functions? .. I hesitate to make bigger changes to the code flow, which the introduction of a flags variable would required. Also it seems to be overkill to me. I will have a closer look, though. At a minimum I will replace "-1" with "MPC_I2C_PRESERVE_CLOCK". Wolfgang. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 18:33 ` Wolfgang Grandegger @ 2010-01-25 20:48 ` Wolfram Sang 2010-01-25 20:54 ` Wolfgang Grandegger 0 siblings, 1 reply; 16+ messages in thread From: Wolfram Sang @ 2010-01-25 20:48 UTC (permalink / raw) To: Wolfgang Grandegger Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger [-- Attachment #1: Type: text/plain, Size: 504 bytes --] > overkill to me. I will have a closer look, though. At a minimum I will > replace "-1" with "MPC_I2C_PRESERVE_CLOCK". Might be also an idea to define it with ~0 (clock is still unsigned). If possible, the code checking for those two cases (0 and "-1") should be close together. That could be a compromise until more quirks are needed ;) -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 20:48 ` Wolfram Sang @ 2010-01-25 20:54 ` Wolfgang Grandegger 2010-01-25 21:09 ` Wolfram Sang 0 siblings, 1 reply; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-25 20:54 UTC (permalink / raw) To: Wolfram Sang Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger Wolfram Sang wrote: >> overkill to me. I will have a closer look, though. At a minimum I will >> replace "-1" with "MPC_I2C_PRESERVE_CLOCK". > > Might be also an idea to define it with ~0 (clock is still unsigned). If > possible, the code checking for those two cases (0 and "-1") should be close > together. That could be a compromise until more quirks are needed ;) I just sent v2. Hope it's OK now. Wolfgang. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 20:54 ` Wolfgang Grandegger @ 2010-01-25 21:09 ` Wolfram Sang 0 siblings, 0 replies; 16+ messages in thread From: Wolfram Sang @ 2010-01-25 21:09 UTC (permalink / raw) To: Wolfgang Grandegger Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c, Wolfgang Grandegger [-- Attachment #1: Type: text/plain, Size: 228 bytes --] > I just sent v2. Hope it's OK now. Thanks, will check tomorrow. -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-25 15:15 ` Wolfram Sang 2010-01-25 18:33 ` Wolfgang Grandegger @ 2010-01-26 14:39 ` Ben Dooks 2010-01-26 18:44 ` Wolfgang Grandegger 1 sibling, 1 reply; 16+ messages in thread From: Ben Dooks @ 2010-01-26 14:39 UTC (permalink / raw) To: Wolfram Sang Cc: Wolfgang Grandegger, Devicetree-discuss, Linuxppc-dev, Linux-i2c On Mon, Jan 25, 2010 at 04:15:09PM +0100, Wolfram Sang wrote: > > >> > > >> -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, > > >> - struct mpc_i2c *i2c, > > >> - u32 clock, u32 prescaler) > > >> +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, > > >> + struct mpc_i2c *i2c, > > >> + u32 clock, u32 prescaler) > > >> { > > >> int ret, fdr; > > >> > > >> + if (clock == -1) { > > > > > > Could we use 0 for 'no_clock'? This would make the above statement simply > > > > "0" is already used to maintain backward compatibility setting a safe > > divider. > > Ah, now I see: > > 'clock == -1' means 'preserve clocks' (and is checked here in mpc_i2c_setup_52xx()) > 'clock == 0' means 'safe divider' (and is checked in mpc_i2c_get_fdr_52xx()) hmm, sounds like a job for a #define or similar. > This is not a beauty ;) > > What about adding a flags variable to the setup-functions? > > Regards, > > Wolfram > > -- > Pengutronix e.K. | Wolfram Sang | > Industrial Linux Solutions | http://www.pengutronix.de/ | -- Ben (ben@fluff.org, http://www.fluff.org/) 'a smiley only costs 4 bytes' ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale 2010-01-26 14:39 ` Ben Dooks @ 2010-01-26 18:44 ` Wolfgang Grandegger 0 siblings, 0 replies; 16+ messages in thread From: Wolfgang Grandegger @ 2010-01-26 18:44 UTC (permalink / raw) To: Ben Dooks Cc: Devicetree-discuss, Linuxppc-dev, Wolfgang Grandegger, Linux-i2c Ben Dooks wrote: > On Mon, Jan 25, 2010 at 04:15:09PM +0100, Wolfram Sang wrote: >>>>> >>>>> -static void __devinit mpc_i2c_setclock_52xx(struct device_node *node, >>>>> - struct mpc_i2c *i2c, >>>>> - u32 clock, u32 prescaler) >>>>> +static void __devinit mpc_i2c_setup_52xx(struct device_node *node, >>>>> + struct mpc_i2c *i2c, >>>>> + u32 clock, u32 prescaler) >>>>> { >>>>> int ret, fdr; >>>>> >>>>> + if (clock == -1) { >>>> Could we use 0 for 'no_clock'? This would make the above statement simply >>> "0" is already used to maintain backward compatibility setting a safe >>> divider. >> Ah, now I see: >> >> 'clock == -1' means 'preserve clocks' (and is checked here in mpc_i2c_setup_52xx()) >> 'clock == 0' means 'safe divider' (and is checked in mpc_i2c_get_fdr_52xx()) > > hmm, sounds like a job for a #define or similar. See v2 of this patch. Wolfgang. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes 2010-01-25 8:27 [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 1/3] i2c-mpc: use __devinit[data] for initialization functions and data Wolfgang Grandegger @ 2010-01-25 12:02 ` Wolfram Sang 1 sibling, 0 replies; 16+ messages in thread From: Wolfram Sang @ 2010-01-25 12:02 UTC (permalink / raw) To: Wolfgang Grandegger; +Cc: Devicetree-discuss, Linuxppc-dev, Linux-i2c [-- Attachment #1: Type: text/plain, Size: 593 bytes --] On Mon, Jan 25, 2010 at 09:27:06AM +0100, Wolfgang Grandegger wrote: > This patch series adds support for the MPC512x from Freescale to the > i2c-mpc driver. At that occasion, issues with __devinit[data] have > been fixed and the doc of the FSL I2C dts bindings updated. It has > been tested on a MPC5121ADS, TQM5200 and TQM8560 board Nice :) BTW, is there a git-tree meanwhile for your or Anatolij's MPC5121-development? -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2010-01-26 18:44 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-01-25 8:27 [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 1/3] i2c-mpc: use __devinit[data] for initialization functions and data Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfgang Grandegger 2010-01-25 8:27 ` [PATCH 3/3] powerpc: doc/dts-bindings: update doc of FSL I2C bindings Wolfgang Grandegger 2010-01-25 11:56 ` Wolfram Sang 2010-01-25 11:58 ` Wolfgang Grandegger 2010-01-25 11:52 ` [PATCH 2/3] i2c-mpc: add support for the MPC512x processors from Freescale Wolfram Sang 2010-01-25 12:06 ` Wolfgang Grandegger 2010-01-25 15:15 ` Wolfram Sang 2010-01-25 18:33 ` Wolfgang Grandegger 2010-01-25 20:48 ` Wolfram Sang 2010-01-25 20:54 ` Wolfgang Grandegger 2010-01-25 21:09 ` Wolfram Sang 2010-01-26 14:39 ` Ben Dooks 2010-01-26 18:44 ` Wolfgang Grandegger 2010-01-25 12:02 ` [PATCH 0/3] i2c-mpc: add support for the Freescale MPC512x and other fixes Wolfram Sang
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).