mirror of https://gitee.com/openkylin/linux.git
pinctrl: Use new GPIO_LINE_DIRECTION
Use newly added GPIO defines GPIO_LINE_DIRECTION_IN and GPIO_LINE_DIRECTION_OUT instead of using hard-coded 1 and 0. Main benefit is to make it easier to see which values mean IN and which OUT. As a side effect this helps GPIO framework to change the direction defines to something else if ever needed. Please note that return value from get_direction call on pinctrl-axp209 driver was changed. Previously pinctrl-axp209 might have returned value 2 for direction INPUT. Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> Reported-by: kbuild test robot <lkp@intel.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Acked-by: Geert Uytterhoeven <geert+renesas@glider.be> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org> Link: https://lore.kernel.org/r/20200214135712.GA14557@localhost.localdomain Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
8587b21c59
commit
3c82787359
|
@ -329,7 +329,10 @@ static int bcm2835_gpio_get_direction(struct gpio_chip *chip, unsigned int offse
|
|||
if (fsel > BCM2835_FSEL_GPIO_OUT)
|
||||
return -EINVAL;
|
||||
|
||||
return (fsel == BCM2835_FSEL_GPIO_IN);
|
||||
if (fsel == BCM2835_FSEL_GPIO_IN)
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
static void bcm2835_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
|
|
|
@ -363,7 +363,10 @@ static int iproc_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
|
|||
unsigned int offset = IPROC_GPIO_REG(gpio, IPROC_GPIO_OUT_EN_OFFSET);
|
||||
unsigned int shift = IPROC_GPIO_SHIFT(gpio);
|
||||
|
||||
return !(readl(chip->base + offset) & BIT(shift));
|
||||
if (readl(chip->base + offset) & BIT(shift))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static void iproc_gpio_set(struct gpio_chip *gc, unsigned gpio, int val)
|
||||
|
|
|
@ -804,7 +804,10 @@ static int mtk_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
pctl->devdata->spec_dir_set(®_addr, offset);
|
||||
|
||||
regmap_read(pctl->regmap1, reg_addr, &read_val);
|
||||
return !(read_val & bit);
|
||||
if (read_val & bit)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int mtk_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
|
@ -775,7 +775,10 @@ static int mtk_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
return !value;
|
||||
if (value)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int mtk_gpio_get(struct gpio_chip *chip, unsigned int gpio)
|
||||
|
|
|
@ -402,7 +402,10 @@ static int armada_37xx_gpio_get_direction(struct gpio_chip *chip,
|
|||
mask = BIT(offset);
|
||||
regmap_read(info->regmap, reg, &val);
|
||||
|
||||
return !(val & mask);
|
||||
if (val & mask)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int armada_37xx_gpio_direction_output(struct gpio_chip *chip,
|
||||
|
|
|
@ -831,11 +831,14 @@ static int nmk_gpio_get_dir(struct gpio_chip *chip, unsigned offset)
|
|||
|
||||
clk_enable(nmk_chip->clk);
|
||||
|
||||
dir = !(readl(nmk_chip->addr + NMK_GPIO_DIR) & BIT(offset));
|
||||
dir = readl(nmk_chip->addr + NMK_GPIO_DIR) & BIT(offset);
|
||||
|
||||
clk_disable(nmk_chip->clk);
|
||||
|
||||
return dir;
|
||||
if (dir)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
|
@ -46,7 +46,10 @@ static int amd_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
|
|||
pin_reg = readl(gpio_dev->base + offset * 4);
|
||||
raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
|
||||
|
||||
return !(pin_reg & BIT(OUTPUT_ENABLE_OFF));
|
||||
if (pin_reg & BIT(OUTPUT_ENABLE_OFF))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int amd_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
|
||||
|
|
|
@ -1414,7 +1414,10 @@ static int at91_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
u32 osr;
|
||||
|
||||
osr = readl_relaxed(pio + PIO_OSR);
|
||||
return !(osr & mask);
|
||||
if (osr & mask)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int at91_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
|
@ -149,13 +149,16 @@ static int axp20x_gpio_get_direction(struct gpio_chip *chip,
|
|||
* going to change the value soon anyway. Default to output.
|
||||
*/
|
||||
if ((val & AXP20X_GPIO_FUNCTIONS) > 2)
|
||||
return 0;
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
/*
|
||||
* The GPIO directions are the three lowest values.
|
||||
* 2 is input, 0 and 1 are output
|
||||
*/
|
||||
return val & 2;
|
||||
if (val & 2)
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
static int axp20x_gpio_output(struct gpio_chip *chip, unsigned int offset,
|
||||
|
|
|
@ -1916,13 +1916,19 @@ static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
|
|||
struct ingenic_pinctrl *jzpc = jzgc->jzpc;
|
||||
unsigned int pin = gc->base + offset;
|
||||
|
||||
if (jzpc->info->version >= ID_JZ4760)
|
||||
return ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PAT1);
|
||||
if (jzpc->info->version >= ID_JZ4760) {
|
||||
if (ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PAT1))
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
|
||||
return true;
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR);
|
||||
if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static const struct pinctrl_ops ingenic_pctlops = {
|
||||
|
|
|
@ -604,7 +604,10 @@ static int ocelot_gpio_get_direction(struct gpio_chip *chip,
|
|||
|
||||
regmap_read(info->map, REG(OCELOT_GPIO_OE, info, offset), &val);
|
||||
|
||||
return !(val & BIT(offset % 32));
|
||||
if (val & BIT(offset % 32))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int ocelot_gpio_direction_input(struct gpio_chip *chip,
|
||||
|
|
|
@ -756,7 +756,10 @@ static int oxnas_gpio_get_direction(struct gpio_chip *chip,
|
|||
struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
|
||||
u32 mask = BIT(offset);
|
||||
|
||||
return !(readl_relaxed(bank->reg_base + OUTPUT_EN) & mask);
|
||||
if (readl_relaxed(bank->reg_base + OUTPUT_EN) & mask)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int oxnas_gpio_direction_input(struct gpio_chip *chip,
|
||||
|
|
|
@ -1990,7 +1990,10 @@ static int pic32_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
{
|
||||
struct pic32_gpio_bank *bank = gpiochip_get_data(chip);
|
||||
|
||||
return !!(readl(bank->reg_base + TRIS_REG) & BIT(offset));
|
||||
if (readl(bank->reg_base + TRIS_REG) & BIT(offset))
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
static void pic32_gpio_irq_ack(struct irq_data *data)
|
||||
|
|
|
@ -1166,7 +1166,10 @@ static int pistachio_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
{
|
||||
struct pistachio_gpio_bank *bank = gpiochip_get_data(chip);
|
||||
|
||||
return !(gpio_readl(bank, GPIO_OUTPUT_EN) & BIT(offset));
|
||||
if (gpio_readl(bank, GPIO_OUTPUT_EN) & BIT(offset))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int pistachio_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
|
@ -184,7 +184,7 @@ static int rk805_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
|||
|
||||
/* default output*/
|
||||
if (!pci->pin_cfg[offset].dir_msk)
|
||||
return 0;
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
ret = regmap_read(pci->rk808->regmap,
|
||||
pci->pin_cfg[offset].reg,
|
||||
|
@ -194,7 +194,10 @@ static int rk805_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
|||
return ret;
|
||||
}
|
||||
|
||||
return !(val & pci->pin_cfg[offset].dir_msk);
|
||||
if (val & pci->pin_cfg[offset].dir_msk)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static const struct gpio_chip rk805_gpio_chip = {
|
||||
|
|
|
@ -2549,7 +2549,10 @@ static int rockchip_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
|
||||
clk_disable(bank->clk);
|
||||
|
||||
return !(data & BIT(offset));
|
||||
if (data & BIT(offset))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -777,7 +777,10 @@ static int rza1_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
|
|||
{
|
||||
struct rza1_port *port = gpiochip_get_data(chip);
|
||||
|
||||
return !!rza1_get_bit(port, RZA1_PM_REG, gpio);
|
||||
if (rza1_get_bit(port, RZA1_PM_REG, gpio))
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
static int rza1_gpio_direction_input(struct gpio_chip *chip,
|
||||
|
|
|
@ -135,10 +135,10 @@ static int rza2_chip_get_direction(struct gpio_chip *chip, unsigned int offset)
|
|||
reg16 = (reg16 >> (pin * 2)) & RZA2_PDR_MASK;
|
||||
|
||||
if (reg16 == RZA2_PDR_OUTPUT)
|
||||
return 0;
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
if (reg16 == RZA2_PDR_INPUT)
|
||||
return 1;
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
/*
|
||||
* This GPIO controller has a default Hi-Z state that is not input or
|
||||
|
@ -146,7 +146,7 @@ static int rza2_chip_get_direction(struct gpio_chip *chip, unsigned int offset)
|
|||
*/
|
||||
rza2_pin_to_gpio(priv->base, offset, 1);
|
||||
|
||||
return 1;
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int rza2_chip_direction_input(struct gpio_chip *chip,
|
||||
|
|
|
@ -746,7 +746,10 @@ static int st_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
function = st_pctl_get_pin_function(&pc, offset);
|
||||
if (function) {
|
||||
st_pinconf_get_direction(&pc, offset, &config);
|
||||
return !ST_PINCONF_UNPACK_OE(config);
|
||||
if (ST_PINCONF_UNPACK_OE(config))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -758,7 +761,10 @@ static int st_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
direction |= ((value >> offset) & 0x1) << i;
|
||||
}
|
||||
|
||||
return (direction == ST_GPIO_DIRECTION_IN);
|
||||
if (direction == ST_GPIO_DIRECTION_IN)
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
/* Pinctrl Groups */
|
||||
|
@ -996,6 +1002,7 @@ static void st_pinconf_dbg_show(struct pinctrl_dev *pctldev,
|
|||
unsigned int function;
|
||||
int offset = st_gpio_pin(pin_id);
|
||||
char f[16];
|
||||
int oe;
|
||||
|
||||
mutex_unlock(&pctldev->mutex);
|
||||
pc = st_get_pio_control(pctldev, pin_id);
|
||||
|
@ -1008,10 +1015,11 @@ static void st_pinconf_dbg_show(struct pinctrl_dev *pctldev,
|
|||
else
|
||||
snprintf(f, 5, "GPIO");
|
||||
|
||||
oe = st_gpio_get_direction(&pc_to_bank(pc)->gpio_chip, offset);
|
||||
seq_printf(s, "[OE:%d,PU:%ld,OD:%ld]\t%s\n"
|
||||
"\t\t[retime:%ld,invclk:%ld,clknotdat:%ld,"
|
||||
"de:%ld,rt-clk:%ld,rt-delay:%ld]",
|
||||
!st_gpio_get_direction(&pc_to_bank(pc)->gpio_chip, offset),
|
||||
(oe == GPIO_LINE_DIRECTION_OUT),
|
||||
ST_PINCONF_UNPACK_PU(config),
|
||||
ST_PINCONF_UNPACK_OD(config),
|
||||
f,
|
||||
|
|
|
@ -134,10 +134,14 @@ static int stmfx_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
|
|||
ret = regmap_read(pctl->stmfx->map, reg, &val);
|
||||
/*
|
||||
* On stmfx, gpio pins direction is (0)input, (1)output.
|
||||
* .get_direction returns 0=out, 1=in
|
||||
*/
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret ? ret : !(val & mask);
|
||||
if (val & mask)
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int stmfx_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
|
||||
|
@ -223,6 +227,13 @@ static int stmfx_pinconf_get(struct pinctrl_dev *pctldev,
|
|||
dir = stmfx_gpio_get_direction(&pctl->gpio_chip, pin);
|
||||
if (dir < 0)
|
||||
return dir;
|
||||
|
||||
/*
|
||||
* Currently the gpiolib IN is 1 and OUT is 0 but let's not count
|
||||
* on it just to be on the safe side also in the future :)
|
||||
*/
|
||||
dir = (dir == GPIO_LINE_DIRECTION_IN) ? 1 : 0;
|
||||
|
||||
type = stmfx_pinconf_get_type(pctl, pin);
|
||||
if (type < 0)
|
||||
return type;
|
||||
|
@ -360,7 +371,7 @@ static void stmfx_pinconf_dbg_show(struct pinctrl_dev *pctldev,
|
|||
if (val < 0)
|
||||
return;
|
||||
|
||||
if (!dir) {
|
||||
if (dir == GPIO_LINE_DIRECTION_OUT) {
|
||||
seq_printf(s, "output %s ", val ? "high" : "low");
|
||||
if (type)
|
||||
seq_printf(s, "open drain %s internal pull-up ",
|
||||
|
|
|
@ -391,13 +391,16 @@ static int sx150x_gpio_get_direction(struct gpio_chip *chip,
|
|||
int ret;
|
||||
|
||||
if (sx150x_pin_is_oscio(pctl, offset))
|
||||
return false;
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
ret = regmap_read(pctl->regmap, pctl->data->reg_dir, &value);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return !!(value & BIT(offset));
|
||||
if (value & BIT(offset))
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
static int sx150x_gpio_get(struct gpio_chip *chip, unsigned int offset)
|
||||
|
@ -687,7 +690,7 @@ static int sx150x_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret)
|
||||
if (ret == GPIO_LINE_DIRECTION_IN)
|
||||
return -EINVAL;
|
||||
|
||||
ret = sx150x_gpio_get(&pctl->gpio, pin);
|
||||
|
|
|
@ -489,8 +489,8 @@ static int msm_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
|||
|
||||
val = msm_readl_ctl(pctrl, g);
|
||||
|
||||
/* 0 = output, 1 = input */
|
||||
return val & BIT(g->oe_bit) ? 0 : 1;
|
||||
return val & BIT(g->oe_bit) ? GPIO_LINE_DIRECTION_OUT :
|
||||
GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int msm_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
|
@ -283,9 +283,9 @@ static int stm32_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
|||
|
||||
stm32_pmx_get_mode(bank, pin, &mode, &alt);
|
||||
if ((alt == 0) && (mode == 0))
|
||||
ret = 1;
|
||||
ret = GPIO_LINE_DIRECTION_IN;
|
||||
else if ((alt == 0) && (mode == 1))
|
||||
ret = 0;
|
||||
ret = GPIO_LINE_DIRECTION_OUT;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
|
|
|
@ -486,8 +486,10 @@ static int wmt_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
|||
u32 val;
|
||||
|
||||
val = readl_relaxed(data->base + reg_dir);
|
||||
/* Return 0 == output, 1 == input */
|
||||
return !(val & BIT(bit));
|
||||
if (val & BIT(bit))
|
||||
return GPIO_LINE_DIRECTION_OUT;
|
||||
|
||||
return GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int wmt_gpio_get_value(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
Loading…
Reference in New Issue