Merge tag 'sh-for-linus' of git://github.com/pmundt/linux-sh
Pull SuperH updates from Paul Mundt:
- Migration off of old-style dynamic IRQ API.
- irqdomain and generic irq chip propagation.
- div4/6 clock consolidation, another step towards co-existing with the
common struct clk infrastructure.
- Extensive PFC rework
- Decoupling GPIO from pin state.
- Initial pinctrl support to facilitate incremental migration off of
legacy pinmux.
- gpiolib support made optional, and made pinctrl-backed.
* tag 'sh-for-linus' of git://github.com/pmundt/linux-sh: (38 commits)
sh: pfc: pin config get/set support.
sh: pfc: Prefer DRV_NAME over KBUILD_MODNAME.
sh: pfc: pinctrl legacy group support.
sh: pfc: Ignore pinmux GPIOs with invalid enum IDs.
sh: pfc: Export pinctrl binding init symbol.
sh: pfc: Error out on pinctrl init resolution failure.
sh: pfc: Make pr_fmt consistent across pfc drivers.
sh: pfc: pinctrl legacy function support.
sh: pfc: Rudimentary pinctrl-backed GPIO support.
sh: pfc: Dumb GPIO stringification.
sh: pfc: Shuffle PFC support core.
sh: pfc: Verify pin type encoding size at build time.
sh: pfc: Kill off unused pinmux bias flags.
sh: pfc: Make gpio chip support optional where possible.
sh: pfc: Split out gpio chip support.
sh64: Fix up section mismatch warnings.
sh64: Attempt to make reserved insn trap handler resemble C.
sh: Consolidate die definitions for trap handlers.
sh64: Kill off old exception debugging helpers.
sh64: Use generic unaligned access control/counters.
...
This commit is contained in:
@@ -18,7 +18,6 @@ struct clk_mapping {
|
||||
struct kref ref;
|
||||
};
|
||||
|
||||
|
||||
struct sh_clk_ops {
|
||||
#ifdef CONFIG_SH_CLK_CPG_LEGACY
|
||||
void (*init)(struct clk *clk);
|
||||
@@ -31,6 +30,10 @@ struct sh_clk_ops {
|
||||
long (*round_rate)(struct clk *clk, unsigned long rate);
|
||||
};
|
||||
|
||||
#define SH_CLK_DIV_MSK(div) ((1 << (div)) - 1)
|
||||
#define SH_CLK_DIV4_MSK SH_CLK_DIV_MSK(4)
|
||||
#define SH_CLK_DIV6_MSK SH_CLK_DIV_MSK(6)
|
||||
|
||||
struct clk {
|
||||
struct list_head node;
|
||||
struct clk *parent;
|
||||
@@ -52,6 +55,7 @@ struct clk {
|
||||
unsigned int enable_bit;
|
||||
void __iomem *mapped_reg;
|
||||
|
||||
unsigned int div_mask;
|
||||
unsigned long arch_flags;
|
||||
void *priv;
|
||||
struct clk_mapping *mapping;
|
||||
@@ -65,6 +69,8 @@ struct clk {
|
||||
#define CLK_ENABLE_REG_16BIT BIT(2)
|
||||
#define CLK_ENABLE_REG_8BIT BIT(3)
|
||||
|
||||
#define CLK_MASK_DIV_ON_DISABLE BIT(4)
|
||||
|
||||
#define CLK_ENABLE_REG_MASK (CLK_ENABLE_REG_32BIT | \
|
||||
CLK_ENABLE_REG_16BIT | \
|
||||
CLK_ENABLE_REG_8BIT)
|
||||
@@ -146,14 +152,17 @@ static inline int __deprecated sh_clk_mstp32_register(struct clk *clks, int nr)
|
||||
.enable_reg = (void __iomem *)_reg, \
|
||||
.enable_bit = _shift, \
|
||||
.arch_flags = _div_bitmap, \
|
||||
.div_mask = SH_CLK_DIV4_MSK, \
|
||||
.flags = _flags, \
|
||||
}
|
||||
|
||||
struct clk_div4_table {
|
||||
struct clk_div_table {
|
||||
struct clk_div_mult_table *div_mult_table;
|
||||
void (*kick)(struct clk *clk);
|
||||
};
|
||||
|
||||
#define clk_div4_table clk_div_table
|
||||
|
||||
int sh_clk_div4_register(struct clk *clks, int nr,
|
||||
struct clk_div4_table *table);
|
||||
int sh_clk_div4_enable_register(struct clk *clks, int nr,
|
||||
@@ -165,7 +174,9 @@ int sh_clk_div4_reparent_register(struct clk *clks, int nr,
|
||||
_num_parents, _src_shift, _src_width) \
|
||||
{ \
|
||||
.enable_reg = (void __iomem *)_reg, \
|
||||
.flags = _flags, \
|
||||
.enable_bit = 0, /* unused */ \
|
||||
.flags = _flags | CLK_MASK_DIV_ON_DISABLE, \
|
||||
.div_mask = SH_CLK_DIV6_MSK, \
|
||||
.parent_table = _parents, \
|
||||
.parent_num = _num_parents, \
|
||||
.src_shift = _src_shift, \
|
||||
@@ -176,7 +187,9 @@ int sh_clk_div4_reparent_register(struct clk *clks, int nr,
|
||||
{ \
|
||||
.parent = _parent, \
|
||||
.enable_reg = (void __iomem *)_reg, \
|
||||
.flags = _flags, \
|
||||
.enable_bit = 0, /* unused */ \
|
||||
.div_mask = SH_CLK_DIV6_MSK, \
|
||||
.flags = _flags | CLK_MASK_DIV_ON_DISABLE, \
|
||||
}
|
||||
|
||||
int sh_clk_div6_register(struct clk *clks, int nr);
|
||||
|
||||
@@ -11,22 +11,24 @@
|
||||
#ifndef __SH_PFC_H
|
||||
#define __SH_PFC_H
|
||||
|
||||
#include <linux/stringify.h>
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
typedef unsigned short pinmux_enum_t;
|
||||
typedef unsigned short pinmux_flag_t;
|
||||
|
||||
#define PINMUX_TYPE_NONE 0
|
||||
#define PINMUX_TYPE_FUNCTION 1
|
||||
#define PINMUX_TYPE_GPIO 2
|
||||
#define PINMUX_TYPE_OUTPUT 3
|
||||
#define PINMUX_TYPE_INPUT 4
|
||||
#define PINMUX_TYPE_INPUT_PULLUP 5
|
||||
#define PINMUX_TYPE_INPUT_PULLDOWN 6
|
||||
enum {
|
||||
PINMUX_TYPE_NONE,
|
||||
|
||||
#define PINMUX_FLAG_TYPE (0x7)
|
||||
#define PINMUX_FLAG_WANT_PULLUP (1 << 3)
|
||||
#define PINMUX_FLAG_WANT_PULLDOWN (1 << 4)
|
||||
PINMUX_TYPE_FUNCTION,
|
||||
PINMUX_TYPE_GPIO,
|
||||
PINMUX_TYPE_OUTPUT,
|
||||
PINMUX_TYPE_INPUT,
|
||||
PINMUX_TYPE_INPUT_PULLUP,
|
||||
PINMUX_TYPE_INPUT_PULLDOWN,
|
||||
|
||||
PINMUX_FLAG_TYPE, /* must be last */
|
||||
};
|
||||
|
||||
#define PINMUX_FLAG_DBIT_SHIFT 5
|
||||
#define PINMUX_FLAG_DBIT (0x1f << PINMUX_FLAG_DBIT_SHIFT)
|
||||
@@ -36,9 +38,12 @@ typedef unsigned short pinmux_flag_t;
|
||||
struct pinmux_gpio {
|
||||
pinmux_enum_t enum_id;
|
||||
pinmux_flag_t flags;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
#define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark }
|
||||
#define PINMUX_GPIO(gpio, data_or_mark) \
|
||||
[gpio] = { .name = __stringify(gpio), .enum_id = data_or_mark, .flags = PINMUX_TYPE_NONE }
|
||||
|
||||
#define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0
|
||||
|
||||
struct pinmux_cfg_reg {
|
||||
@@ -89,7 +94,7 @@ struct pfc_window {
|
||||
unsigned long size;
|
||||
};
|
||||
|
||||
struct pinmux_info {
|
||||
struct sh_pfc {
|
||||
char *name;
|
||||
pinmux_enum_t reserved_id;
|
||||
struct pinmux_range data;
|
||||
@@ -112,17 +117,45 @@ struct pinmux_info {
|
||||
struct pinmux_irq *gpio_irq;
|
||||
unsigned int gpio_irq_size;
|
||||
|
||||
spinlock_t lock;
|
||||
|
||||
struct resource *resource;
|
||||
unsigned int num_resources;
|
||||
struct pfc_window *window;
|
||||
|
||||
unsigned long unlock_reg;
|
||||
|
||||
struct gpio_chip chip;
|
||||
};
|
||||
|
||||
int register_pinmux(struct pinmux_info *pip);
|
||||
int unregister_pinmux(struct pinmux_info *pip);
|
||||
/* XXX compat for now */
|
||||
#define pinmux_info sh_pfc
|
||||
|
||||
/* drivers/sh/pfc/gpio.c */
|
||||
int sh_pfc_register_gpiochip(struct sh_pfc *pfc);
|
||||
|
||||
/* drivers/sh/pfc/pinctrl.c */
|
||||
int sh_pfc_register_pinctrl(struct sh_pfc *pfc);
|
||||
|
||||
/* drivers/sh/pfc/core.c */
|
||||
int register_sh_pfc(struct sh_pfc *pfc);
|
||||
|
||||
int sh_pfc_read_bit(struct pinmux_data_reg *dr, unsigned long in_pos);
|
||||
void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
|
||||
unsigned long value);
|
||||
int sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
|
||||
struct pinmux_data_reg **drp, int *bitp);
|
||||
int sh_pfc_gpio_to_enum(struct sh_pfc *pfc, unsigned gpio, int pos,
|
||||
pinmux_enum_t *enum_idp);
|
||||
int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
|
||||
int cfg_mode);
|
||||
|
||||
/* xxx */
|
||||
static inline int register_pinmux(struct pinmux_info *pip)
|
||||
{
|
||||
struct sh_pfc *pfc = pip;
|
||||
return register_sh_pfc(pfc);
|
||||
}
|
||||
|
||||
enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE };
|
||||
|
||||
/* helper macro for port */
|
||||
#define PORT_1(fn, pfx, sfx) fn(pfx, sfx)
|
||||
|
||||
Reference in New Issue
Block a user