Re: [RFC PATCH 0/3] mux framework rework

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* Mike Rapoport <mike@xxxxxxxxxxxxxx> [091029 02:45]:
> 
> 
> Tony Lindgren wrote:
> > * Mike Rapoport <mike@xxxxxxxxxxxxxx> [091028 06:17]:
> >> This is an attempt to start rework of the mux framework keeping as
> >> much backward compatibility as possible.
> >> The patch serie introduces a new mux configuration interface that
> >> follows the ideas of PXA MFP implementation ([1] and [2]).
> >> The mux configuration interface is implemented for OMAP3 and partially
> >> for OMAP2 processors.
> >> The OMAP2 implementation is far from being complete. Unfortunately I
> >> do not have OMAP2 docs, so I've added only configration for pins
> >> defined in omap24xx_pins table.
> >>
> >> The older opam_cfg_reg interface is still present and can be used to
> >> avoid too many broken things in steps 2 & 3 as of Tony's plans ([3]).
> > 
> > Cool! I too have been working on this for past several days, but luckily
> > I've been working on the new mux data layout instead so far with some
> > help from Paul and Benoit.
> > 
> > So this should all come together quite nicely. I'll try to post some
> > patches as soon as the new mux data is working. I'll also take a close
> > look at your patches, it seems like they already separate the
> > mach-omap2 mux code nicely from what's needed for mach-omap1
> > (well, at least for 15xx).
> 
> I'd be glad to get those patches even before the new mux data is working :)

Got it working mostly, still need to clean it a bit this morning.
 
> > The reason I think we need to redo all the mux data is because the new
> > setup has several shortcomings:
> > 
> > - All the mux registers on the newer omaps are in a single register
> >   for each signal instead of being scattered across multiple registers
> >   like on 15xx. So the enumeration is not needed, and we don't need
> >   to specify each signal.
> > 
> > - We badly need mux register to GPIO mapping for runtime muxing of GPIO
> >   pins for the idle modes
> > 
> > - For debugging, we need to see the pin status if CONFIG_DEBUG_FS
> >   is set
> > 
> > - For adding custom hardware on boards such as Beagle, we need to
> >   be able to override pins via /debugfs or via cmdline
> > 
> > - Grepping the code for the signal + ball + mux register combination
> >   is currently impossible
> 
> Is it really necessary to have ball information? OMAP35x packages differ, so
> having ball information may be misleading.

Well it's very handy for debugging, it's there only if CONFIG_DEBUG_FS
is set. Everything gets optimized out if CONFIG_OMAP_MUX is not set,
all the bloat is optimized out if CONFIG_DEBUG_FS is set. Or it could
be behind the CONFIG_OMAP_MUX_DEBUG that we already have.

BTW, I already got the all the three existing 34xx package types covered,
3630 still needs to be added.
 
> > So I suggest we get rid of defining each mux mode separately, and
> > just define the register offsets from the mux base.
> > 
> > Then for the new omap_set_mux(), we should pass the register offset,
> > the desired value, and optional flags.
> > 
> > For the new mux data, I currently have something like the below just
> > to give an idea what I was thinking, maybe take a quick look at
> > that and see how that fits into what you had in mind?
> > 
> > arch/arm/mach-omap2/mux.h:
> > 
> > /**
> >  * struct omap_mux - data for omap mux register offset and it's value
> >  * @reg_offset:	mux register offset from the mux base
> >  * @gpio:	GPIO number
> >  * @muxnames:	available signal modes for a ball
> >  */
> > struct omap_mux {
> > 	u16	reg_offset;
> > 	u16	gpio;
> > #ifdef CONFIG_DEBUG_FS
> > 	char	*muxnames[8];
> > 	char	*balls[2];
> 
> Again, I do not quite understand what do we need the ball names for?

Just debug info (if compiled in). We could allow muxing by ball name
if we wanted to.
 
> > #endif
> > };
> > ...
> > 
> > arch/arm/mach-omap2/mux34xx.h:
> > 
> > #ifdef CONFIG_DEBUG_FS
> > 
> > #define _OMAP3_MUXENTRY(M0, g, m0, m1, m2, m3, m4, m5, m6, m7)		\
> > {									\
> > 	.reg_offset	= (OMAP3_CONTROL_PADCONF_##M0##_OFFSET),	\
> > 	.gpio		= (g),						\
> > 	.muxnames	= { m0, m1, m2, m3, m4, m5, m6, m7 },		\
> > }
> > 
> > #else
> > 
> > #define _OMAP3_MUXENTRY(M0, g, m0, m1, m2, m3, m4, m5, m6, m7)		\
> > {									\
> > 	.reg_offset	= (OMAP3_CONTROL_PADCONF_##M0##_OFFSET),	\
> > 	.gpio		= (g),						\
> > }
> > 
> > #endif
> > 
> > /* 
> >  * OMAP3 CONTROL_PADCONF* register offsets for pin-muxing
> >  *
> >  * Extracted from the TRM.  Add 0x48002030 to these values to get the
> >  * absolute addresses.  The name in the macro is the mode-0 name of
> >  * the pin.  NOTE: These registers are 16-bits wide.
> >  */ 
> > #define OMAP3_CONTROL_PADCONF_SDRC_D0_OFFSET			0x000
> > #define OMAP3_CONTROL_PADCONF_SDRC_D1_OFFSET			0x002
> > #define OMAP3_CONTROL_PADCONF_SDRC_D2_OFFSET			0x004
> > #define OMAP3_CONTROL_PADCONF_SDRC_D3_OFFSET			0x006
> > #define OMAP3_CONTROL_PADCONF_SDRC_D4_OFFSET			0x008
> > ...
> > 
> > /*
> >  * Superset of all mux modes, same as the CBC package
> >  */
> > struct omap_mux omap3_muxmodes[] = {
> > 	_OMAP3_MUXENTRY(CAM_D0, 99,
> > 		"cam_d0", NULL, NULL, NULL,
> > 		"gpio_99", NULL, NULL, "safe_mode"),
> [ snip ]
> > ...
> > 	{ .reg_offset = OMAP_MUX_TERMINATOR },
> > };
> > ...
> >
> > 
> > And this is what I was thinking for the new mux function:
> > 
> > int omap_set_mux(u16 val, u16 offset, int flags);
> 
> I have slightly different approach in mind. My idea was to have a table that
> provides some mapping between pin and it's PADCONF offset. That table
> initialization is CPU variant specific, so mapping for OMAP24XX will be
> different from the mapping for OMAP2430 and OMAP35x. The mapping table is
> indexed with enumeration that lists all configurable pins for all processor and
> package variants.
> Next, there are macros that encode the index and PADCONF value for each possible
> pin configuration into u32, e.g.
> 
> #define OMAP3_CAM_D0		OMAP3_PIN(CAM_D0, MODE0)
> #define OMAP3_CAM_D0_CSI2_DX2	OMAP3_PIN(CAM_D0, MODE2)
> #define OMAP3_CAM_D0_GPIO_99	OMAP3_PIN(CAM_D0, MODE4)
> 
> And omap_cfg_pin (my name for omap_cfg_mux) takes the encoded mux configuration,
> extracts from there the index into the mapping table and PADCONF value and
> updates the PADCONF register.
> 
> My approach allows reusing the same code for setting mux configuration for OMAP2
>  and OMAP3 (and probably OMAP4), and , apparently would use less memory that
> your proposal. Another advantage of using encoded mux configuration is a
> simplification of board-specific code. You can use an array with all pins
> configured there and pass this array to, say, omap_cfg_pins:
> 
> unsigned long board_pins[] = {
> 	OMAP3_CAM_D0_GPIO_99,
> 	OMAP3_GPMC_WAIT3_GPIO_65,
> 
> 	OMAP3_MCBSP2_FSX,
> 	OMAP3_MCBSP2_CLKX,
> 	OMAP3_MCBSP2_DR,
> 	OMAP3_MCBSP2_DX,
> ...
> };
> 
> static void __init some_board_init(void)
> {
> ...
> 	omap_cfg_pins(board_pins, ARRAY_SIZE(board_pins));
> ...
> }
> 
> The drawbacks of using encoded mux configuration are
> - limit maximal number of configurable pins by bitfield size in the encoding
> - absence of pin <-> gpio mapping
> - absence of nice debug strings :)
> 
> So, if you think that large "struct omap_mux omap_xxx_muxmodes" tables are
> acceptable, I'd propose to go with "struct omap_mux" as you described it and add
> some macros to allow simple interface for board-* files like the one above.

OK, well let's play with it a bit and see what's the best way to go.

Currently all the tables are __initdata, and copied to a list for only
for pins that are set as GPIO (mode4), or flagged as dynamic from the
board-*.c file.

Regards,

Tony
 
> > And then also have a function to initialize a whole struct omap_mux
> > array from each board-*.c files.
> > 
> > Regards,
> > 
> > Tony
> > 
> > 
> >  
> >> [1] Documentation/arm/pxa/mfp.txt
> >> [2] http://elinux.org/OMAP_wishlist#References
> >> [3] http://elinux.org/OMAP_wishlist#Initial_plans_.28from_Tony.2C_for_next_merge_window.29
> >>
> >> Changes since commit 0bbf5337f2f2957775051a3caf60b66d3306c815
> >>   Tony Lindgren
> >>   	Fix compile for 1510 innovator
> >>
> >> Mike Rapoport (3):
> >>   omap2: mux: intoduce omap_mux_{read,write}
> >>   omap: mux: add interface for encoded mux configration
> >>   omap2: mux: implement encoded mux configuration
> >>
> >>  arch/arm/mach-omap2/include/mach/mux.h     |  452 +++++++++++++++
> >>  arch/arm/mach-omap2/include/mach/mux24xx.h |  128 ++++
> >>  arch/arm/mach-omap2/include/mach/mux34xx.h |  862 ++++++++++++++++++++++++++++
> >>  arch/arm/mach-omap2/mux.c                  |  158 +++++-
> >>  arch/arm/plat-omap/include/plat/mux.h      |   62 +--
> >>  arch/arm/plat-omap/mux.c                   |   17 +
> >>  6 files changed, 1614 insertions(+), 65 deletions(-)
> >>  create mode 100644 arch/arm/mach-omap2/include/mach/mux.h
> >>  create mode 100644 arch/arm/mach-omap2/include/mach/mux24xx.h
> >>  create mode 100644 arch/arm/mach-omap2/include/mach/mux34xx.h
> >>
> >> --
> >> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> >> the body of a message to majordomo@xxxxxxxxxxxxxxx
> >> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> 
> -- 
> Sincerely yours,
> Mike.
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux