mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 10:19:47 +00:00
![Martin Schiller](/assets/img/avatar_default.png)
This patch introduces new dedicated "lantiq,<chip>-pinctrl" devicetree bindings, where <chip> is one of "ase", "danube", "xrx100", "xrx200" or "xrx300" and marks the "lantiq,pinctrl-xway", "lantiq,pinctrl-ase" and "lantiq,pinctrl-xr9" bindings as DEPRECATED. Based on the newest Lantiq Hardware Description it turend out, that there are some differences in the GPIO alternative functions of the Danube, xRX100 and xRX200 families, which makes it impossible to use only one xway_mfp table. This patch also adds support for the xRX300 family. Signed-off-by: Martin Schiller <mschiller@tdt.de> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
204 lines
3.6 KiB
C
204 lines
3.6 KiB
C
/*
|
|
* linux/drivers/pinctrl/pinctrl-lantiq.h
|
|
* based on linux/drivers/pinctrl/pinctrl-pxa3xx.h
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* publishhed by the Free Software Foundation.
|
|
*
|
|
* Copyright (C) 2012 John Crispin <blogic@openwrt.org>
|
|
*/
|
|
|
|
#ifndef __PINCTRL_LANTIQ_H
|
|
#define __PINCTRL_LANTIQ_H
|
|
|
|
#include <linux/clkdev.h>
|
|
#include <linux/pinctrl/pinctrl.h>
|
|
#include <linux/pinctrl/pinconf.h>
|
|
#include <linux/pinctrl/pinmux.h>
|
|
#include <linux/pinctrl/consumer.h>
|
|
#include <linux/pinctrl/machine.h>
|
|
|
|
#include "core.h"
|
|
|
|
#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x)
|
|
|
|
#define LTQ_MAX_MUX 4
|
|
#define MFPR_FUNC_MASK 0x3
|
|
|
|
#define LTQ_PINCONF_PACK(param, arg) ((param) << 16 | (arg))
|
|
#define LTQ_PINCONF_UNPACK_PARAM(conf) ((conf) >> 16)
|
|
#define LTQ_PINCONF_UNPACK_ARG(conf) ((conf) & 0xffff)
|
|
|
|
enum ltq_pinconf_param {
|
|
LTQ_PINCONF_PARAM_PULL,
|
|
LTQ_PINCONF_PARAM_OPEN_DRAIN,
|
|
LTQ_PINCONF_PARAM_DRIVE_CURRENT,
|
|
LTQ_PINCONF_PARAM_SLEW_RATE,
|
|
LTQ_PINCONF_PARAM_OUTPUT,
|
|
};
|
|
|
|
struct ltq_cfg_param {
|
|
const char *property;
|
|
enum ltq_pinconf_param param;
|
|
};
|
|
|
|
struct ltq_mfp_pin {
|
|
const char *name;
|
|
const unsigned int pin;
|
|
const unsigned short func[LTQ_MAX_MUX];
|
|
};
|
|
|
|
struct ltq_pin_group {
|
|
const char *name;
|
|
const unsigned mux;
|
|
const unsigned *pins;
|
|
const unsigned npins;
|
|
};
|
|
|
|
struct ltq_pmx_func {
|
|
const char *name;
|
|
const char * const *groups;
|
|
const unsigned num_groups;
|
|
};
|
|
|
|
struct ltq_pinmux_info {
|
|
struct device *dev;
|
|
struct pinctrl_dev *pctrl;
|
|
|
|
/* we need to manage up to 5 pad controllers */
|
|
void __iomem *membase[5];
|
|
|
|
/* the descriptor for the subsystem */
|
|
struct pinctrl_desc *desc;
|
|
|
|
/* we expose our pads to the subsystem */
|
|
struct pinctrl_pin_desc *pads;
|
|
|
|
/* the number of pads. this varies between socs */
|
|
unsigned int num_pads;
|
|
|
|
/* these are our multifunction pins */
|
|
const struct ltq_mfp_pin *mfp;
|
|
unsigned int num_mfp;
|
|
|
|
/* a number of multifunction pins can be grouped together */
|
|
const struct ltq_pin_group *grps;
|
|
unsigned int num_grps;
|
|
|
|
/* a mapping between function string and id */
|
|
const struct ltq_pmx_func *funcs;
|
|
unsigned int num_funcs;
|
|
|
|
/* the pinconf options that we are able to read from the DT */
|
|
const struct ltq_cfg_param *params;
|
|
unsigned int num_params;
|
|
|
|
/* the pad controller can have a irq mapping */
|
|
const unsigned *exin;
|
|
unsigned int num_exin;
|
|
|
|
/* we need 5 clocks max */
|
|
struct clk *clk[5];
|
|
|
|
/* soc specific callback used to apply muxing */
|
|
int (*apply_mux)(struct pinctrl_dev *pctrldev, int pin, int mux);
|
|
};
|
|
|
|
enum ltq_pin {
|
|
GPIO0 = 0,
|
|
GPIO1,
|
|
GPIO2,
|
|
GPIO3,
|
|
GPIO4,
|
|
GPIO5,
|
|
GPIO6,
|
|
GPIO7,
|
|
GPIO8,
|
|
GPIO9,
|
|
GPIO10, /* 10 */
|
|
GPIO11,
|
|
GPIO12,
|
|
GPIO13,
|
|
GPIO14,
|
|
GPIO15,
|
|
GPIO16,
|
|
GPIO17,
|
|
GPIO18,
|
|
GPIO19,
|
|
GPIO20, /* 20 */
|
|
GPIO21,
|
|
GPIO22,
|
|
GPIO23,
|
|
GPIO24,
|
|
GPIO25,
|
|
GPIO26,
|
|
GPIO27,
|
|
GPIO28,
|
|
GPIO29,
|
|
GPIO30, /* 30 */
|
|
GPIO31,
|
|
GPIO32,
|
|
GPIO33,
|
|
GPIO34,
|
|
GPIO35,
|
|
GPIO36,
|
|
GPIO37,
|
|
GPIO38,
|
|
GPIO39,
|
|
GPIO40, /* 40 */
|
|
GPIO41,
|
|
GPIO42,
|
|
GPIO43,
|
|
GPIO44,
|
|
GPIO45,
|
|
GPIO46,
|
|
GPIO47,
|
|
GPIO48,
|
|
GPIO49,
|
|
GPIO50, /* 50 */
|
|
GPIO51,
|
|
GPIO52,
|
|
GPIO53,
|
|
GPIO54,
|
|
GPIO55,
|
|
GPIO56,
|
|
GPIO57,
|
|
GPIO58,
|
|
GPIO59,
|
|
GPIO60, /* 60 */
|
|
GPIO61,
|
|
GPIO62,
|
|
GPIO63,
|
|
|
|
GPIO64,
|
|
GPIO65,
|
|
GPIO66,
|
|
GPIO67,
|
|
GPIO68,
|
|
GPIO69,
|
|
GPIO70,
|
|
GPIO71,
|
|
GPIO72,
|
|
GPIO73,
|
|
GPIO74,
|
|
GPIO75,
|
|
GPIO76,
|
|
GPIO77,
|
|
GPIO78,
|
|
GPIO79,
|
|
GPIO80,
|
|
GPIO81,
|
|
GPIO82,
|
|
GPIO83,
|
|
GPIO84,
|
|
GPIO85,
|
|
GPIO86,
|
|
GPIO87,
|
|
GPIO88,
|
|
};
|
|
|
|
extern int ltq_pinctrl_register(struct platform_device *pdev,
|
|
struct ltq_pinmux_info *info);
|
|
extern int ltq_pinctrl_unregister(struct platform_device *pdev);
|
|
#endif /* __PINCTRL_LANTIQ_H */
|