Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 421e8450 authored by Oleg Matcovschi's avatar Oleg Matcovschi Committed by Tony Lindgren
Browse files

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: default avatarOleg Matcovschi <oleg.matcovschi@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent ca2e16fa
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -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);
+15 −5
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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,