* [PATCH 0/2] Add bus recovery to i2c-pxa @ 2020-05-06 9:40 Russell King - ARM Linux admin 2020-05-06 9:40 ` [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery Russell King 2020-05-06 9:40 ` [PATCH 2/2] arm64: dts: add uDPU " Russell King 0 siblings, 2 replies; 7+ messages in thread From: Russell King - ARM Linux admin @ 2020-05-06 9:40 UTC (permalink / raw) To: linux-i2c Hi, This series adds bus recovery to i2c-pxa, using GPIOs to manually recover the bus. This has been proven to work on Armada 3720 with various SFP modules that appear to misbehave. I am only expecting patch 1 to be applied to the i2c tree; patch 2 should be applied through normal routes via the arm-soc tree, but are included in this series since it is part of the same change. arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts | 22 ++- drivers/i2c/busses/i2c-pxa.c | 176 ++++++++++++++++++++--- 2 files changed, 179 insertions(+), 19 deletions(-) -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 10.2Mbps down 587kbps up ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery 2020-05-06 9:40 [PATCH 0/2] Add bus recovery to i2c-pxa Russell King - ARM Linux admin @ 2020-05-06 9:40 ` Russell King 2020-05-06 14:00 ` Andrew Lunn 2020-05-06 9:40 ` [PATCH 2/2] arm64: dts: add uDPU " Russell King 1 sibling, 1 reply; 7+ messages in thread From: Russell King @ 2020-05-06 9:40 UTC (permalink / raw) To: linux-i2c Cc: Andrew Lunn, devicetree, Gregory Clement, Jason Cooper, linux-arm-kernel, Rob Herring, Sebastian Hesselbarth, Vladimir Vid Implement generic GPIO-based I2C bus recovery for the PXA I2C driver. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> --- drivers/i2c/busses/i2c-pxa.c | 176 +++++++++++++++++++++++++++++++---- 1 file changed, 159 insertions(+), 17 deletions(-) diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 0e194d6cd1b5..da15ab2a519e 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c @@ -20,6 +20,7 @@ #include <linux/delay.h> #include <linux/err.h> #include <linux/errno.h> +#include <linux/gpio/consumer.h> #include <linux/i2c.h> #include <linux/init.h> #include <linux/interrupt.h> @@ -28,6 +29,7 @@ #include <linux/module.h> #include <linux/of.h> #include <linux/of_device.h> +#include <linux/pinctrl/consumer.h> #include <linux/platform_device.h> #include <linux/platform_data/i2c-pxa.h> #include <linux/slab.h> @@ -260,6 +262,11 @@ struct pxa_i2c { bool highmode_enter; u32 fm_mask; u32 hs_mask; + + struct i2c_bus_recovery_info recovery; + struct pinctrl *pinctrl; + struct pinctrl_state *pinctrl_default; + struct pinctrl_state *pinctrl_recovery; }; #define _IBMR(i2c) ((i2c)->reg_ibmr) @@ -559,13 +566,8 @@ static void i2c_pxa_set_slave(struct pxa_i2c *i2c, int errcode) #define i2c_pxa_set_slave(i2c, err) do { } while (0) #endif -static void i2c_pxa_reset(struct pxa_i2c *i2c) +static void i2c_pxa_do_reset(struct pxa_i2c *i2c) { - pr_debug("Resetting I2C Controller Unit\n"); - - /* abort any transfer currently under way */ - i2c_pxa_abort(i2c); - /* reset according to 9.8 */ writel(ICR_UR, _ICR(i2c)); writel(I2C_ISR_INIT, _ISR(i2c)); @@ -584,12 +586,25 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c) #endif i2c_pxa_set_slave(i2c, 0); +} +static void i2c_pxa_enable(struct pxa_i2c *i2c) +{ /* enable unit */ writel(readl(_ICR(i2c)) | ICR_IUE, _ICR(i2c)); udelay(100); } +static void i2c_pxa_reset(struct pxa_i2c *i2c) +{ + pr_debug("Resetting I2C Controller Unit\n"); + + /* abort any transfer currently under way */ + i2c_pxa_abort(i2c); + i2c_pxa_do_reset(i2c); + i2c_pxa_enable(i2c); +} + #ifdef CONFIG_I2C_PXA_SLAVE /* @@ -1043,6 +1058,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num) ret = i2c_pxa_wait_bus_not_busy(i2c); if (ret) { dev_err(&i2c->adap.dev, "i2c_pxa: timeout waiting for bus free\n"); + i2c_recover_bus(&i2c->adap); goto out; } @@ -1088,6 +1104,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num) if (!timeout && i2c->msg_num) { i2c_pxa_scream_blue_murder(i2c, "timeout with active message"); + i2c_recover_bus(&i2c->adap); ret = I2C_RETRY; } @@ -1277,6 +1294,129 @@ static int i2c_pxa_probe_pdata(struct platform_device *pdev, return 0; } +static void i2c_pxa_prepare_recovery(struct i2c_adapter *adap) +{ + struct pxa_i2c *i2c = adap->algo_data; + u32 ibmr = readl(_IBMR(i2c)); + + /* + * Program the GPIOs to reflect the current I2C bus state while + * we transition to recovery; this avoids glitching the bus. + */ + gpiod_set_value(i2c->recovery.scl_gpiod, ibmr & IBMR_SCLS); + gpiod_set_value(i2c->recovery.sda_gpiod, ibmr & IBMR_SDAS); + + WARN_ON(pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_recovery)); +} + +static void i2c_pxa_unprepare_recovery(struct i2c_adapter *adap) +{ + struct pxa_i2c *i2c = adap->algo_data; + u32 isr; + + /* + * The bus should now be free. Clear up the I2C controller before + * handing control of the bus back to avoid the bus changing state. + */ + isr = readl(_ISR(i2c)); + if (isr & (ISR_UB | ISR_IBB)) { + dev_dbg(&i2c->adap.dev, + "recovery: resetting controller, ISR=0x%08x\n", isr); + i2c_pxa_do_reset(i2c); + } + + WARN_ON(pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_default)); + + dev_dbg(&i2c->adap.dev, "recovery: IBMR 0x%08x ISR 0x%08x\n", + readl(_IBMR(i2c)), readl(_ISR(i2c))); + + i2c_pxa_enable(i2c); +} + +static int i2c_pxa_init_recovery(struct pxa_i2c *i2c) +{ + struct i2c_bus_recovery_info *bri = &i2c->recovery; + struct device *dev = i2c->adap.dev.parent; + + /* + * When slave mode is enabled, we are not the only master on the bus. + * Bus recovery can only be performed when we are the master, which + * we can't be certain of. Therefore, when slave mode is enabled, do + * not configure bus recovery. + */ + if (IS_ENABLED(CONFIG_I2C_PXA_SLAVE)) + return 0; + + i2c->pinctrl = devm_pinctrl_get(dev); + if (IS_ERR(i2c->pinctrl)) + return PTR_ERR(i2c->pinctrl); + + if (!i2c->pinctrl) + return 0; + + i2c->pinctrl_default = pinctrl_lookup_state(i2c->pinctrl, + PINCTRL_STATE_DEFAULT); + i2c->pinctrl_recovery = pinctrl_lookup_state(i2c->pinctrl, "recovery"); + + if (IS_ERR(i2c->pinctrl_default) || IS_ERR(i2c->pinctrl_recovery)) { + dev_info(dev, "missing pinmux recovery information: %ld %ld\n", + PTR_ERR(i2c->pinctrl_default), + PTR_ERR(i2c->pinctrl_recovery)); + return 0; + } + + /* + * Claiming GPIOs can influence the pinmux state, and may glitch the + * I2C bus. Do this carefully. + */ + bri->scl_gpiod = devm_gpiod_get(dev, "scl", GPIOD_OUT_HIGH_OPEN_DRAIN); + if (bri->scl_gpiod == ERR_PTR(-EPROBE_DEFER)) + return -EPROBE_DEFER; + if (IS_ERR(bri->scl_gpiod)) { + dev_info(dev, "missing scl gpio recovery information: %pe\n", + bri->scl_gpiod); + return 0; + } + + /* + * We have SCL. Pull SCL low and wait a bit so that SDA glitches + * have no effect. + */ + gpiod_direction_output(bri->scl_gpiod, 0); + udelay(10); + bri->sda_gpiod = devm_gpiod_get(dev, "sda", GPIOD_OUT_HIGH_OPEN_DRAIN); + + /* Wait a bit in case of a SDA glitch, and then release SCL. */ + udelay(10); + gpiod_direction_output(bri->scl_gpiod, 1); + + if (bri->sda_gpiod == ERR_PTR(-EPROBE_DEFER)) + return -EPROBE_DEFER; + + if (IS_ERR(bri->sda_gpiod)) { + dev_info(dev, "missing sda gpio recovery information: %pe\n", + bri->sda_gpiod); + return 0; + } + + bri->prepare_recovery = i2c_pxa_prepare_recovery; + bri->unprepare_recovery = i2c_pxa_unprepare_recovery; + bri->recover_bus = i2c_generic_scl_recovery; + + i2c->adap.bus_recovery_info = bri; + + /* + * Claiming GPIOs can change the pinmux state, which confuses the + * pinctrl since since pinctrl's idea of the current setting is + * unaffected by the pinmux change caused by claiming the GPIO. + * Work around that by switching pinctrl to the GPIO state here. + * We do it this way to avoid glitching the I2C bus. + */ + pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_recovery); + + return pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_default); +} + static int i2c_pxa_probe(struct platform_device *dev) { struct i2c_pxa_platform_data *plat = dev_get_platdata(&dev->dev); @@ -1289,6 +1429,16 @@ static int i2c_pxa_probe(struct platform_device *dev) if (!i2c) return -ENOMEM; + /* Default adapter num to device id; i2c_pxa_probe_dt can override. */ + i2c->adap.nr = dev->id; + i2c->adap.owner = THIS_MODULE; + i2c->adap.retries = 5; + i2c->adap.algo_data = i2c; + i2c->adap.dev.parent = &dev->dev; +#ifdef CONFIG_OF + i2c->adap.dev.of_node = dev->dev.of_node; +#endif + res = platform_get_resource(dev, IORESOURCE_MEM, 0); i2c->reg_base = devm_ioremap_resource(&dev->dev, res); if (IS_ERR(i2c->reg_base)) @@ -1298,8 +1448,9 @@ static int i2c_pxa_probe(struct platform_device *dev) if (irq < 0) return irq; - /* Default adapter num to device id; i2c_pxa_probe_dt can override. */ - i2c->adap.nr = dev->id; + ret = i2c_pxa_init_recovery(i2c); + if (ret) + return ret; ret = i2c_pxa_probe_dt(dev, i2c, &i2c_type); if (ret > 0) @@ -1307,9 +1458,6 @@ static int i2c_pxa_probe(struct platform_device *dev) if (ret < 0) return ret; - i2c->adap.owner = THIS_MODULE; - i2c->adap.retries = 5; - spin_lock_init(&i2c->lock); init_waitqueue_head(&i2c->wait); @@ -1375,12 +1523,6 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c_pxa_reset(i2c); - i2c->adap.algo_data = i2c; - i2c->adap.dev.parent = &dev->dev; -#ifdef CONFIG_OF - i2c->adap.dev.of_node = dev->dev.of_node; -#endif - ret = i2c_add_numbered_adapter(&i2c->adap); if (ret < 0) goto ereqirq; -- 2.20.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery 2020-05-06 9:40 ` [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery Russell King @ 2020-05-06 14:00 ` Andrew Lunn 2020-05-13 9:29 ` Russell King - ARM Linux admin 0 siblings, 1 reply; 7+ messages in thread From: Andrew Lunn @ 2020-05-06 14:00 UTC (permalink / raw) To: Russell King Cc: linux-i2c, devicetree, Gregory Clement, Jason Cooper, linux-arm-kernel, Rob Herring, Sebastian Hesselbarth, Vladimir Vid On Wed, May 06, 2020 at 10:40:31AM +0100, Russell King wrote: > Implement generic GPIO-based I2C bus recovery for the PXA I2C driver. > > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> > --- > drivers/i2c/busses/i2c-pxa.c | 176 +++++++++++++++++++++++++++++++---- > 1 file changed, 159 insertions(+), 17 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c > index 0e194d6cd1b5..da15ab2a519e 100644 > --- a/drivers/i2c/busses/i2c-pxa.c > +++ b/drivers/i2c/busses/i2c-pxa.c > @@ -20,6 +20,7 @@ > #include <linux/delay.h> > #include <linux/err.h> > #include <linux/errno.h> > +#include <linux/gpio/consumer.h> > #include <linux/i2c.h> > #include <linux/init.h> > #include <linux/interrupt.h> > @@ -28,6 +29,7 @@ > #include <linux/module.h> > #include <linux/of.h> > #include <linux/of_device.h> > +#include <linux/pinctrl/consumer.h> > #include <linux/platform_device.h> > #include <linux/platform_data/i2c-pxa.h> > #include <linux/slab.h> > @@ -260,6 +262,11 @@ struct pxa_i2c { > bool highmode_enter; > u32 fm_mask; > u32 hs_mask; > + > + struct i2c_bus_recovery_info recovery; > + struct pinctrl *pinctrl; > + struct pinctrl_state *pinctrl_default; > + struct pinctrl_state *pinctrl_recovery; > }; > > #define _IBMR(i2c) ((i2c)->reg_ibmr) > @@ -559,13 +566,8 @@ static void i2c_pxa_set_slave(struct pxa_i2c *i2c, int errcode) > #define i2c_pxa_set_slave(i2c, err) do { } while (0) > #endif > > -static void i2c_pxa_reset(struct pxa_i2c *i2c) > +static void i2c_pxa_do_reset(struct pxa_i2c *i2c) > { > - pr_debug("Resetting I2C Controller Unit\n"); > - > - /* abort any transfer currently under way */ > - i2c_pxa_abort(i2c); > - > /* reset according to 9.8 */ > writel(ICR_UR, _ICR(i2c)); > writel(I2C_ISR_INIT, _ISR(i2c)); > @@ -584,12 +586,25 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c) > #endif > > i2c_pxa_set_slave(i2c, 0); > +} > > +static void i2c_pxa_enable(struct pxa_i2c *i2c) > +{ > /* enable unit */ > writel(readl(_ICR(i2c)) | ICR_IUE, _ICR(i2c)); > udelay(100); > } > > +static void i2c_pxa_reset(struct pxa_i2c *i2c) > +{ > + pr_debug("Resetting I2C Controller Unit\n"); Hi Russell I know you are just moving code around, but maybe pr_debug() could be cleaned up to dev_debug()? > + /* > + * Claiming GPIOs can change the pinmux state, which confuses the > + * pinctrl since since pinctrl's idea of the current setting is since since I don't know too much about this hardware, but for what it is worth, Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery 2020-05-06 14:00 ` Andrew Lunn @ 2020-05-13 9:29 ` Russell King - ARM Linux admin 0 siblings, 0 replies; 7+ messages in thread From: Russell King - ARM Linux admin @ 2020-05-13 9:29 UTC (permalink / raw) To: Andrew Lunn Cc: linux-i2c, devicetree, Gregory Clement, Jason Cooper, linux-arm-kernel, Rob Herring, Sebastian Hesselbarth, Vladimir Vid On Wed, May 06, 2020 at 04:00:54PM +0200, Andrew Lunn wrote: > On Wed, May 06, 2020 at 10:40:31AM +0100, Russell King wrote: > > Implement generic GPIO-based I2C bus recovery for the PXA I2C driver. > > > > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> > > --- > > drivers/i2c/busses/i2c-pxa.c | 176 +++++++++++++++++++++++++++++++---- > > 1 file changed, 159 insertions(+), 17 deletions(-) > > > > diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c > > index 0e194d6cd1b5..da15ab2a519e 100644 > > --- a/drivers/i2c/busses/i2c-pxa.c > > +++ b/drivers/i2c/busses/i2c-pxa.c > > @@ -20,6 +20,7 @@ > > #include <linux/delay.h> > > #include <linux/err.h> > > #include <linux/errno.h> > > +#include <linux/gpio/consumer.h> > > #include <linux/i2c.h> > > #include <linux/init.h> > > #include <linux/interrupt.h> > > @@ -28,6 +29,7 @@ > > #include <linux/module.h> > > #include <linux/of.h> > > #include <linux/of_device.h> > > +#include <linux/pinctrl/consumer.h> > > #include <linux/platform_device.h> > > #include <linux/platform_data/i2c-pxa.h> > > #include <linux/slab.h> > > @@ -260,6 +262,11 @@ struct pxa_i2c { > > bool highmode_enter; > > u32 fm_mask; > > u32 hs_mask; > > + > > + struct i2c_bus_recovery_info recovery; > > + struct pinctrl *pinctrl; > > + struct pinctrl_state *pinctrl_default; > > + struct pinctrl_state *pinctrl_recovery; > > }; > > > > #define _IBMR(i2c) ((i2c)->reg_ibmr) > > @@ -559,13 +566,8 @@ static void i2c_pxa_set_slave(struct pxa_i2c *i2c, int errcode) > > #define i2c_pxa_set_slave(i2c, err) do { } while (0) > > #endif > > > > -static void i2c_pxa_reset(struct pxa_i2c *i2c) > > +static void i2c_pxa_do_reset(struct pxa_i2c *i2c) > > { > > - pr_debug("Resetting I2C Controller Unit\n"); > > - > > - /* abort any transfer currently under way */ > > - i2c_pxa_abort(i2c); > > - > > /* reset according to 9.8 */ > > writel(ICR_UR, _ICR(i2c)); > > writel(I2C_ISR_INIT, _ISR(i2c)); > > @@ -584,12 +586,25 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c) > > #endif > > > > i2c_pxa_set_slave(i2c, 0); > > +} > > > > +static void i2c_pxa_enable(struct pxa_i2c *i2c) > > +{ > > /* enable unit */ > > writel(readl(_ICR(i2c)) | ICR_IUE, _ICR(i2c)); > > udelay(100); > > } > > > > +static void i2c_pxa_reset(struct pxa_i2c *i2c) > > +{ > > + pr_debug("Resetting I2C Controller Unit\n"); > > Hi Russell > > I know you are just moving code around, but maybe pr_debug() could be > cleaned up to dev_debug()? Yes, but I don't want to add irrelevant changes into this; changing the way the driver prints stuff wouldn't be part of adding recovery support, and would likely get review comments suggesting it should be a separate patch. > > + /* > > + * Claiming GPIOs can change the pinmux state, which confuses the > > + * pinctrl since since pinctrl's idea of the current setting is > > since since > > I don't know too much about this hardware, but for what it is worth, > > Reviewed-by: Andrew Lunn <andrew@lunn.ch> -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 10.2Mbps down 587kbps up ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] arm64: dts: add uDPU i2c bus recovery 2020-05-06 9:40 [PATCH 0/2] Add bus recovery to i2c-pxa Russell King - ARM Linux admin 2020-05-06 9:40 ` [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery Russell King @ 2020-05-06 9:40 ` Russell King 2020-05-06 13:48 ` Andrew Lunn 2020-05-17 16:10 ` Gregory CLEMENT 1 sibling, 2 replies; 7+ messages in thread From: Russell King @ 2020-05-06 9:40 UTC (permalink / raw) To: linux-i2c Cc: Andrew Lunn, devicetree, Gregory Clement, Jason Cooper, linux-arm-kernel, Rob Herring, Sebastian Hesselbarth, Vladimir Vid Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> --- .../boot/dts/marvell/armada-3720-uDPU.dts | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts index 7eb6c1796cef..95d46e8d081c 100644 --- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts +++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts @@ -117,18 +117,36 @@ }; }; +&pinctrl_nb { + i2c1_recovery_pins: i2c1-recovery-pins { + groups = "i2c1"; + function = "gpio"; + }; + + i2c2_recovery_pins: i2c2-recovery-pins { + groups = "i2c2"; + function = "gpio"; + }; +}; + &i2c0 { status = "okay"; - pinctrl-names = "default"; + pinctrl-names = "default", "recovery"; pinctrl-0 = <&i2c1_pins>; + pinctrl-1 = <&i2c1_recovery_pins>; /delete-property/mrvl,i2c-fast-mode; + scl-gpios = <&gpionb 0 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + sda-gpios = <&gpionb 1 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; }; &i2c1 { status = "okay"; - pinctrl-names = "default"; + pinctrl-names = "default", "recovery"; pinctrl-0 = <&i2c2_pins>; + pinctrl-1 = <&i2c2_recovery_pins>; /delete-property/mrvl,i2c-fast-mode; + scl-gpios = <&gpionb 2 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + sda-gpios = <&gpionb 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; lm75@48 { status = "okay"; -- 2.20.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] arm64: dts: add uDPU i2c bus recovery 2020-05-06 9:40 ` [PATCH 2/2] arm64: dts: add uDPU " Russell King @ 2020-05-06 13:48 ` Andrew Lunn 2020-05-17 16:10 ` Gregory CLEMENT 1 sibling, 0 replies; 7+ messages in thread From: Andrew Lunn @ 2020-05-06 13:48 UTC (permalink / raw) To: Russell King Cc: linux-i2c, devicetree, Gregory Clement, Jason Cooper, linux-arm-kernel, Rob Herring, Sebastian Hesselbarth, Vladimir Vid On Wed, May 06, 2020 at 10:40:37AM +0100, Russell King wrote: > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> > --- > .../boot/dts/marvell/armada-3720-uDPU.dts | 22 +++++++++++++++++-- Hi Russell Interesting that the 3720 uses pxa, not orion i2c. I had not noticed that before. Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] arm64: dts: add uDPU i2c bus recovery 2020-05-06 9:40 ` [PATCH 2/2] arm64: dts: add uDPU " Russell King 2020-05-06 13:48 ` Andrew Lunn @ 2020-05-17 16:10 ` Gregory CLEMENT 1 sibling, 0 replies; 7+ messages in thread From: Gregory CLEMENT @ 2020-05-17 16:10 UTC (permalink / raw) To: Russell King, linux-i2c Cc: Andrew Lunn, devicetree, Jason Cooper, linux-arm-kernel, Rob Herring, Sebastian Hesselbarth, Vladimir Vid Hi Russell, > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Applied on mvebu/dt64 Thanks, Gregory > --- > .../boot/dts/marvell/armada-3720-uDPU.dts | 22 +++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts > index 7eb6c1796cef..95d46e8d081c 100644 > --- a/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts > +++ b/arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts > @@ -117,18 +117,36 @@ > }; > }; > > +&pinctrl_nb { > + i2c1_recovery_pins: i2c1-recovery-pins { > + groups = "i2c1"; > + function = "gpio"; > + }; > + > + i2c2_recovery_pins: i2c2-recovery-pins { > + groups = "i2c2"; > + function = "gpio"; > + }; > +}; > + > &i2c0 { > status = "okay"; > - pinctrl-names = "default"; > + pinctrl-names = "default", "recovery"; > pinctrl-0 = <&i2c1_pins>; > + pinctrl-1 = <&i2c1_recovery_pins>; > /delete-property/mrvl,i2c-fast-mode; > + scl-gpios = <&gpionb 0 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; > + sda-gpios = <&gpionb 1 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; > }; > > &i2c1 { > status = "okay"; > - pinctrl-names = "default"; > + pinctrl-names = "default", "recovery"; > pinctrl-0 = <&i2c2_pins>; > + pinctrl-1 = <&i2c2_recovery_pins>; > /delete-property/mrvl,i2c-fast-mode; > + scl-gpios = <&gpionb 2 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; > + sda-gpios = <&gpionb 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; > > lm75@48 { > status = "okay"; > -- > 2.20.1 > -- Gregory Clement, Bootlin Embedded Linux and Kernel engineering http://bootlin.com ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-05-17 16:10 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-05-06 9:40 [PATCH 0/2] Add bus recovery to i2c-pxa Russell King - ARM Linux admin 2020-05-06 9:40 ` [PATCH 1/2] i2c: pxa: implement generic i2c bus recovery Russell King 2020-05-06 14:00 ` Andrew Lunn 2020-05-13 9:29 ` Russell King - ARM Linux admin 2020-05-06 9:40 ` [PATCH 2/2] arm64: dts: add uDPU " Russell King 2020-05-06 13:48 ` Andrew Lunn 2020-05-17 16:10 ` Gregory CLEMENT
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).