imx27: pinctrl: GPIO set output value failed
Markus Pargmann
mpa at pengutronix.de
Wed Jan 15 03:56:35 EST 2014
Hi Chris,
On Tue, Jan 14, 2014 at 05:13:25PM +0800, Chris Ruehl wrote:
> On Tuesday, January 14, 2014 04:57 PM, Markus Pargmann wrote:
> >Hi,
> >
> >On Tue, Jan 14, 2014 at 01:39:22PM +0800, Chris Ruehl wrote:
> >>Just fall over the Reference manual for the GPIO ports.
> >>Seams the iconfb0 is not addressed right.
> >>
> >>On Tuesday, January 14, 2014 12:13 PM, Chris Ruehl wrote:
> >>>Hi,
> >>>
> >>>some kind of weired problem:
> >>>Some GPIO's can modified via /sysfs others cannot
> >>>in my case gpio9 works, and gpio10,12 not.
> >>>The pinctrl debug out looks good to me.
> >>>
> >>>running kernel 3.13-rc
> >>>
> >>>Working OK
> >>Table 6.1 of the imx27 reference manual says (Page 6-5,6-6)
> >>>[ 1.553601] imx27-pinctrl 10015000.iomuxc: imx1_pmx_enable, pin
> >>>0x9, function 0, gpio 1, direction 1, oconf 3, iconfa 0, iconfb 0
> >>>[ 1.553657] imx27-pinctrl 10015000.iomuxc: write: register
> >>>0xf4415004 offset 18 value 0x3
> >>PTA_OCR1 1001_5004 OK
> >>>[ 1.553712] imx27-pinctrl 10015000.iomuxc: write: register
> >>>0xf441500c offset 18 value 0x0
> >>PTA_ICONFA1 1001_500C OK
> >>>[ 1.553766] imx27-pinctrl 10015000.iomuxc: write: register
> >>>0xf4415010 offset 18 value 0x0
> >>PTA_ICONFB1 1001_5014 ---> 0xf4415010 seams the wrong address
> >>1001_5010 is the PTA_ICONFA2
> >Yes you are right, it is wrong by 0x4, pinctrl-imx1-core.c:
> >#define MX1_ICONFB 0x10
> >
> >Can you send a patch?
> >
> >Thanks,
> >
> >Markus
> >
> Hi Markus,
>
> I found the wrong define already and recompile the kernel, but still
> not working for me. Very strange.
> gpio9,13 and 14,16 as input works OK. Only this buggers 10 and 12
> are bugging around.
>
> a) I replaced a debug output statement after the address correction
> when the pin-id > 16 to get correct
> address output. Here a preview of the patch.
> b) add pin soft reset before set the gpio parameter.
gpios 10 and 12 are working correctly with a previous pin soft reset?
>
> diff --git a/drivers/pinctrl/pinctrl-imx1-core.c
> b/drivers/pinctrl/pinctrl-imx1-core.c
> index 17aecde..fbaa70e 100644
> --- a/drivers/pinctrl/pinctrl-imx1-core.c
> +++ b/drivers/pinctrl/pinctrl-imx1-core.c
> @@ -27,6 +27,7 @@
> #include <linux/pinctrl/pinctrl.h>
> #include <linux/pinctrl/pinmux.h>
> #include <linux/slab.h>
> +#include <linux/delay.h>
>
> #include "core.h"
> #include "pinctrl-imx1.h"
> @@ -45,9 +46,10 @@ struct imx1_pinctrl {
> #define MX1_DDIR 0x00
> #define MX1_OCR 0x04
> #define MX1_ICONFA 0x0c
> -#define MX1_ICONFB 0x10
> +#define MX1_ICONFB 0x14
> #define MX1_GIUS 0x20
> #define MX1_GPR 0x38
> +#define MX1_SWR 0x3C
> #define MX1_PUEN 0x40
>
> #define MX1_PORT_STRIDE 0x100
> @@ -97,13 +99,13 @@ static void imx1_write_2bit(struct imx1_pinctrl
> *ipctl, unsigned int pin_id,
> u32 old_val;
> u32 new_val;
>
> - dev_dbg(ipctl->dev, "write: register 0x%p offset %d value 0x%x\n",
> - reg, offset, value);
> -
> /* Use the next register if the pin's port pin number is >=16 */
> if (pin_id % 32 >= 16)
> reg += 0x04;
>
> + dev_dbg(ipctl->dev, "write: register 0x%p offset %d value 0x%x\n",
> + reg, offset, value);
> +
> /* Get current state of pins */
> old_val = readl(reg);
> old_val &= mask;
> @@ -334,6 +336,9 @@ static int imx1_pmx_enable(struct pinctrl_dev
> *pctldev, unsigned selector,
> direction, gpio_oconf, gpio_iconfa,
> gpio_iconfb);
>
> + imx1_write_bit(ipctl, pin_id, 1, MX1_SWR); /* Soft
> reset the pin */
This is over 80 lines, simply put the comment above. Would also be
great if you could add some more description here why a soft reset is
necessary. It is not listed in the reference manual, so this may be
confusing otherwise.
> + /* reset done within 6 cycles */
> + usleep_range(10000,20000);
> imx1_write_bit(ipctl, pin_id, gpio_in_use, MX1_GIUS);
> imx1_write_bit(ipctl, pin_id, direction, MX1_DDIR);
>
>
> I will do some more testing and send the patch after, OK for you?
Yes that's ok. You could also seperate the ICONFB bugfix into a seperate
patch.
Regards,
Markus
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the linux-arm
mailing list