mirror of https://gitee.com/openkylin/linux.git
OMAP2+: mux: Fixed gpio mux mode analysis
OMAP_MODE_GPIO() macro verified only OMAP_MUX_MODE4. It is not correct for following platforms: 2430 - gpio mux mode 3 44xx - gpio mux mode 3 54xx - gpio mux mode 6 Patch reserves first 3 bits in partition flags for storing gpio mux mode in same format as stored in control pad register. Modified OMAP_MODE_GPIO() macro to handle all possible cases of gpio mux mode. Modified omap_mux_init() flags of omap34xx to include OMAP_MUX_GPIO_IN_MODE4. Signed-off-by: Oleg Matcovschi <oleg.matcovschi@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
ca2e16faa7
commit
421e845099
|
@ -135,10 +135,7 @@ static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition,
|
|||
|
||||
old_mode = omap_mux_read(partition, gpio_mux->reg_offset);
|
||||
mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
|
||||
if (partition->flags & OMAP_MUX_GPIO_IN_MODE3)
|
||||
mux_mode |= OMAP_MUX_MODE3;
|
||||
else
|
||||
mux_mode |= OMAP_MUX_MODE4;
|
||||
mux_mode |= partition->gpio;
|
||||
pr_debug("%s: Setting signal %s.gpio%i 0x%04x -> 0x%04x\n", __func__,
|
||||
gpio_mux->muxnames[0], gpio, old_mode, mux_mode);
|
||||
omap_mux_write(partition, mux_mode, gpio_mux->reg_offset);
|
||||
|
@ -800,7 +797,7 @@ int __init omap_mux_late_init(void)
|
|||
struct omap_mux *m = &e->mux;
|
||||
u16 mode = omap_mux_read(partition, m->reg_offset);
|
||||
|
||||
if (OMAP_MODE_GPIO(mode))
|
||||
if (OMAP_MODE_GPIO(partition, mode))
|
||||
continue;
|
||||
|
||||
#ifndef CONFIG_DEBUG_FS
|
||||
|
@ -1065,7 +1062,7 @@ static void __init omap_mux_init_list(struct omap_mux_partition *partition,
|
|||
}
|
||||
#else
|
||||
/* Skip pins that are not muxed as GPIO by bootloader */
|
||||
if (!OMAP_MODE_GPIO(omap_mux_read(partition,
|
||||
if (!OMAP_MODE_GPIO(partition, omap_mux_read(partition,
|
||||
superset->reg_offset))) {
|
||||
superset++;
|
||||
continue;
|
||||
|
@ -1132,6 +1129,7 @@ int __init omap_mux_init(const char *name, u32 flags,
|
|||
|
||||
partition->name = name;
|
||||
partition->flags = flags;
|
||||
partition->gpio = flags & OMAP_MUX_MODE7;
|
||||
partition->size = mux_size;
|
||||
partition->phys = mux_pbase;
|
||||
partition->base = ioremap(mux_pbase, mux_size);
|
||||
|
|
|
@ -58,7 +58,8 @@
|
|||
#define OMAP_PIN_OFF_INPUT_PULLDOWN (OMAP_OFF_EN | OMAP_OFF_PULL_EN)
|
||||
#define OMAP_PIN_OFF_WAKEUPENABLE OMAP_WAKEUP_EN
|
||||
|
||||
#define OMAP_MODE_GPIO(x) (((x) & OMAP_MUX_MODE7) == OMAP_MUX_MODE4)
|
||||
#define OMAP_MODE_GPIO(partition, x) (((x) & OMAP_MUX_MODE7) == \
|
||||
partition->gpio)
|
||||
#define OMAP_MODE_UART(x) (((x) & OMAP_MUX_MODE7) == OMAP_MUX_MODE0)
|
||||
|
||||
/* Flags for omapX_mux_init */
|
||||
|
@ -79,13 +80,20 @@
|
|||
/*
|
||||
* omap_mux_init flags definition:
|
||||
*
|
||||
* OMAP_GPIO_MUX_MODE, bits 0-2: gpio muxing mode, same like pad control
|
||||
* register which includes values from 0-7.
|
||||
* OMAP_MUX_REG_8BIT: Ensure that access to padconf is done in 8 bits.
|
||||
* The default value is 16 bits.
|
||||
* OMAP_MUX_GPIO_IN_MODE3: The GPIO is selected in mode3.
|
||||
* The default is mode4.
|
||||
*/
|
||||
#define OMAP_MUX_REG_8BIT (1 << 0)
|
||||
#define OMAP_MUX_GPIO_IN_MODE3 (1 << 1)
|
||||
#define OMAP_MUX_GPIO_IN_MODE0 OMAP_MUX_MODE0
|
||||
#define OMAP_MUX_GPIO_IN_MODE1 OMAP_MUX_MODE1
|
||||
#define OMAP_MUX_GPIO_IN_MODE2 OMAP_MUX_MODE2
|
||||
#define OMAP_MUX_GPIO_IN_MODE3 OMAP_MUX_MODE3
|
||||
#define OMAP_MUX_GPIO_IN_MODE4 OMAP_MUX_MODE4
|
||||
#define OMAP_MUX_GPIO_IN_MODE5 OMAP_MUX_MODE5
|
||||
#define OMAP_MUX_GPIO_IN_MODE6 OMAP_MUX_MODE6
|
||||
#define OMAP_MUX_GPIO_IN_MODE7 OMAP_MUX_MODE7
|
||||
#define OMAP_MUX_REG_8BIT (1 << 3)
|
||||
|
||||
/**
|
||||
* struct omap_board_data - board specific device data
|
||||
|
@ -105,6 +113,7 @@ struct omap_board_data {
|
|||
* struct mux_partition - contain partition related information
|
||||
* @name: name of the current partition
|
||||
* @flags: flags specific to this partition
|
||||
* @gpio: gpio mux mode
|
||||
* @phys: physical address
|
||||
* @size: partition size
|
||||
* @base: virtual address after ioremap
|
||||
|
@ -114,6 +123,7 @@ struct omap_board_data {
|
|||
struct omap_mux_partition {
|
||||
const char *name;
|
||||
u32 flags;
|
||||
u32 gpio;
|
||||
u32 phys;
|
||||
u32 size;
|
||||
void __iomem *base;
|
||||
|
|
|
@ -2053,7 +2053,7 @@ int __init omap3_mux_init(struct omap_board_mux *board_subset, int flags)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
return omap_mux_init("core", 0,
|
||||
return omap_mux_init("core", OMAP_MUX_GPIO_IN_MODE4,
|
||||
OMAP3_CONTROL_PADCONF_MUX_PBASE,
|
||||
OMAP3_CONTROL_PADCONF_MUX_SIZE,
|
||||
omap3_muxmodes, package_subset, board_subset,
|
||||
|
|
Loading…
Reference in New Issue