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

Commit 8419fdba authored by Tony Lindgren's avatar Tony Lindgren
Browse files

omap2+: Add omap_mux_get_by_name



Do this by splitting _omap_mux_init_signal as it already has most
of the necessary features.

Based on an earlier patch by Dan Murphy <dmurphy@ti.com>.

Cc: Dan Murphy <dmurphy@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 05fad3e7
Loading
Loading
Loading
Loading
+48 −25
Original line number Diff line number Diff line
@@ -151,12 +151,14 @@ int __init omap_mux_init_gpio(int gpio, int val)
	return -ENODEV;
}

static int __init _omap_mux_init_signal(struct omap_mux_partition *partition,
					const char *muxname, int val)
static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
					const char *muxname,
					struct omap_mux **found_mux)
{
	struct omap_mux *mux = NULL;
	struct omap_mux_entry *e;
	const char *mode_name;
	int found = 0, mode0_len = 0;
	int found = 0, found_mode, mode0_len = 0;
	struct list_head *muxmodes = &partition->muxmodes;

	mode_name = strchr(muxname, '.');
@@ -168,40 +170,34 @@ static int __init _omap_mux_init_signal(struct omap_mux_partition *partition,
	}

	list_for_each_entry(e, muxmodes, node) {
		struct omap_mux *m = &e->mux;
		char *m0_entry = m->muxnames[0];
		char *m0_entry;
		int i;

		mux = &e->mux;
		m0_entry = mux->muxnames[0];

		/* First check for full name in mode0.muxmode format */
		if (mode0_len && strncmp(muxname, m0_entry, mode0_len))
			continue;

		/* Then check for muxmode only */
		for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
			char *mode_cur = m->muxnames[i];
			char *mode_cur = mux->muxnames[i];

			if (!mode_cur)
				continue;

			if (!strcmp(mode_name, mode_cur)) {
				u16 old_mode;
				u16 mux_mode;

				old_mode = omap_mux_read(partition,
							 m->reg_offset);
				mux_mode = val | i;
				pr_debug("%s: Setting signal "
					 "%s.%s 0x%04x -> 0x%04x\n", __func__,
					 m0_entry, muxname, old_mode, mux_mode);
				omap_mux_write(partition, mux_mode,
					       m->reg_offset);
				*found_mux = mux;
				found++;
				found_mode = i;
			}
		}
	}

	if (found == 1)
		return 0;
	if (found == 1) {
		return found_mode;
	}

	if (found > 1) {
		pr_err("%s: Multiple signal paths (%i) for %s\n", __func__,
@@ -209,24 +205,51 @@ static int __init _omap_mux_init_signal(struct omap_mux_partition *partition,
		return -EINVAL;
	}

	pr_err("%s: Could not set signal %s\n", __func__, muxname);
	pr_err("%s: Could not find signal %s\n", __func__, muxname);

	return -ENODEV;
}

int __init omap_mux_init_signal(const char *muxname, int val)
static int __init
omap_mux_get_by_name(const char *muxname,
			struct omap_mux_partition **found_partition,
			struct omap_mux **found_mux)
{
	struct omap_mux_partition *partition;
	int ret;

	list_for_each_entry(partition, &mux_partitions, node) {
		ret = _omap_mux_init_signal(partition, muxname, val);
		if (!ret)
			return ret;
		struct omap_mux *mux = NULL;
		int mux_mode = _omap_mux_get_by_name(partition, muxname, &mux);
		if (mux_mode < 0)
			continue;

		*found_partition = partition;
		*found_mux = mux;

		return mux_mode;
	}

	return -ENODEV;
}

int __init omap_mux_init_signal(const char *muxname, int val)
{
	struct omap_mux_partition *partition = NULL;
	struct omap_mux *mux = NULL;
	u16 old_mode;
	int mux_mode;

	mux_mode = omap_mux_get_by_name(muxname, &partition, &mux);
	if (mux_mode < 0)
		return mux_mode;

	old_mode = omap_mux_read(partition, mux->reg_offset);
	mux_mode |= val;
	pr_debug("%s: Setting signal %s 0x%04x -> 0x%04x\n",
			 __func__, muxname, old_mode, mux_mode);
	omap_mux_write(partition, mux_mode, mux->reg_offset);

	return 0;
}

#ifdef CONFIG_DEBUG_FS