pinctrl: mediatek: questions about gpio/pinctrl/eint

2 messages, 2 authors, 2016-01-28 · open the first message on its own page

pinctrl: mediatek: questions about gpio/pinctrl/eint

From: biao huang <hidden>
Date: 2016-01-28 10:35:56

Hi Linus,

	We have two questions associate with mediatek pinctrl/gpio in linux
kernel to asking for your help.

	First, when user call GPIO API to control medaitek gpio, they should
call pinctrl API to set pinmux to mode 0 ahead, so this pin is function
as gpio. And this makes things a little complicated. Is there any simple
API can solve this problem? How about add pinmux setting in
gpio_request?

	Second, here is our request_irq flow in mkd eint driver:
request_irq --> mtk_pinctrl_irq_request_resources--> mtk_pmx_set_mode,
Normally, it'll set pinmux to eint mode (usually is mode 0) in
mtk_pmx_set_mode function. But for special case, such as iddig (connect
to usb), when iddig request_irq, it should set pinmux to iddig mode
(mode 2 in mt8163).
	Is there a better way than changing
        MTK_PIN(
                PINCTRL_PIN(16, "IDDIG"),
                NULL, "mt8173",
                MTK_EINT_FUNCTION(0, 16),
                MTK_FUNCTION(0, "GPIO16"),
                MTK_FUNCTION(1, "IDDIG"),
                MTK_FUNCTION(2, "CMFLASH"),
                MTK_FUNCTION(4, "PWM5")
        ),
	to
        MTK_PIN(
                PINCTRL_PIN(16, "IDDIG"),
                NULL, "mt8173",
                MTK_EINT_FUNCTION(2, 16),
                MTK_FUNCTION(0, "GPIO16"),
                MTK_FUNCTION(1, "IDDIG"),
                MTK_FUNCTION(2, "CMFLASH"),
                MTK_FUNCTION(4, "PWM5")
        ),
	in drivers/pinctrl/mediatek/pinctrl-mtk-mt8163.h?

	We are looking forward for your help, thanks very much!

Best Regards!
Yours,
Biao Huang

Re: pinctrl: mediatek: questions about gpio/pinctrl/eint

From: Linus Walleij <hidden>
Date: 2016-01-28 11:22:15

On Thu, Jan 28, 2016 at 3:35 AM, biao huang [off-list ref] wrote:
        First, when user call GPIO API to control medaitek gpio, they should
call pinctrl API to set pinmux to mode 0 ahead, so this pin is function
as gpio. And this makes things a little complicated. Is there any simple
API can solve this problem? How about add pinmux setting in
gpio_request?
This is what the
pinctrl_request_gpio, pinctrl_free_gpio, pinctrl_gpio_direction_input
andpinctrl_gpio_direction_output calls are for.

Look for example in drivers/gpio/gpio-pl061.c:

      if (of_property_read_bool(dev->of_node, "gpio-ranges")) {
                chip->gc.request = gpiochip_generic_request;
                chip->gc.free = gpiochip_generic_free;
        }

What does that do:

/**
 * gpiochip_generic_request() - request the gpio function for a pin
 * @chip: the gpiochip owning the GPIO
 * @offset: the offset of the GPIO to request for GPIO function
 */
int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset)
{
        return pinctrl_request_gpio(chip->base + offset);
}
EXPORT_SYMBOL_GPL(gpiochip_generic_request);

/**
 * gpiochip_generic_free() - free the gpio function from a pin
 * @chip: the gpiochip to request the gpio function for
 * @offset: the offset of the GPIO to free from GPIO function
 */
void gpiochip_generic_free(struct gpio_chip *chip, unsigned offset)
{
        pinctrl_free_gpio(chip->base + offset);
}
EXPORT_SYMBOL_GPL(gpiochip_generic_free);

Yes....

Your pinctrl driver needs to implement the
.gpio_request_enable()
.gpio_disable_free()
.gpio_set_direction()
callbacks in struct pinmux_ops.

Also read in Documentation/pinctrl.txt about pinctrl/GPIO interaction.
        Second, here is our request_irq flow in mkd eint driver:
request_irq --> mtk_pinctrl_irq_request_resources--> mtk_pmx_set_mode,
Normally, it'll set pinmux to eint mode (usually is mode 0) in
mtk_pmx_set_mode function. But for special case, such as iddig (connect
to usb), when iddig request_irq, it should set pinmux to iddig mode
(mode 2 in mt8163).
        Is there a better way than changing
        MTK_PIN(
                PINCTRL_PIN(16, "IDDIG"),
                NULL, "mt8173",
                MTK_EINT_FUNCTION(0, 16),
                MTK_FUNCTION(0, "GPIO16"),
                MTK_FUNCTION(1, "IDDIG"),
                MTK_FUNCTION(2, "CMFLASH"),
                MTK_FUNCTION(4, "PWM5")
        ),
        to
        MTK_PIN(
                PINCTRL_PIN(16, "IDDIG"),
                NULL, "mt8173",
                MTK_EINT_FUNCTION(2, 16),
                MTK_FUNCTION(0, "GPIO16"),
                MTK_FUNCTION(1, "IDDIG"),
                MTK_FUNCTION(2, "CMFLASH"),
                MTK_FUNCTION(4, "PWM5")
        ),
        in drivers/pinctrl/mediatek/pinctrl-mtk-mt8163.h?
This is the mediatek driver internals, I don't understand that.
Your guess is as good as mine, ask help from the other
driver authors is my hint, I can only help with the framework...

Yours,
Linus Walleij
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help