xref: /minix3/minix/kernel/arch/earm/bsp/ti/omap_padconf.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc /* Implements sys_padconf() for the AM335X and DM37XX. */
2*433d6423SLionel Sambuc 
3*433d6423SLionel Sambuc #include "kernel/kernel.h"
4*433d6423SLionel Sambuc #include "arch_proto.h"
5*433d6423SLionel Sambuc #include <sys/types.h>
6*433d6423SLionel Sambuc #include <machine/cpu.h>
7*433d6423SLionel Sambuc #include <minix/mmio.h>
8*433d6423SLionel Sambuc #include <minix/padconf.h>
9*433d6423SLionel Sambuc #include <minix/board.h>
10*433d6423SLionel Sambuc #include <minix/com.h>
11*433d6423SLionel Sambuc #include <assert.h>
12*433d6423SLionel Sambuc #include <io.h>
13*433d6423SLionel Sambuc #include <stdlib.h>
14*433d6423SLionel Sambuc #include <stdio.h>
15*433d6423SLionel Sambuc 
16*433d6423SLionel Sambuc #include "bsp_padconf.h"
17*433d6423SLionel Sambuc 
18*433d6423SLionel Sambuc struct omap_padconf
19*433d6423SLionel Sambuc {
20*433d6423SLionel Sambuc 	vir_bytes base;
21*433d6423SLionel Sambuc 	vir_bytes offset;
22*433d6423SLionel Sambuc 	vir_bytes size;
23*433d6423SLionel Sambuc 	unsigned int board_filter_value;
24*433d6423SLionel Sambuc 	unsigned int board_filter_mask;
25*433d6423SLionel Sambuc };
26*433d6423SLionel Sambuc 
27*433d6423SLionel Sambuc static struct omap_padconf omap_padconfs[] = {
28*433d6423SLionel Sambuc 	{
29*433d6423SLionel Sambuc 		    .base = PADCONF_DM37XX_REGISTERS_BASE,
30*433d6423SLionel Sambuc 		    .offset = PADCONF_DM37XX_REGISTERS_OFFSET,
31*433d6423SLionel Sambuc 		    .size = PADCONF_DM37XX_REGISTERS_SIZE,
32*433d6423SLionel Sambuc 		    .board_filter_value = BOARD_FILTER_BBXM_VALUE,
33*433d6423SLionel Sambuc 		    .board_filter_mask = BOARD_FILTER_BBXM_MASK,
34*433d6423SLionel Sambuc 	    },
35*433d6423SLionel Sambuc 	{
36*433d6423SLionel Sambuc 		    .base = PADCONF_AM335X_REGISTERS_BASE,
37*433d6423SLionel Sambuc 		    .offset = PADCONF_AM335X_REGISTERS_OFFSET,
38*433d6423SLionel Sambuc 		    .size = PADCONF_AM335X_REGISTERS_SIZE,
39*433d6423SLionel Sambuc 		    .board_filter_value = BOARD_FILTER_BB_VALUE,
40*433d6423SLionel Sambuc 		    .board_filter_mask = BOARD_FILTER_BB_MASK,
41*433d6423SLionel Sambuc 	    },
42*433d6423SLionel Sambuc };
43*433d6423SLionel Sambuc 
44*433d6423SLionel Sambuc /* initialized in init */
45*433d6423SLionel Sambuc static struct omap_padconf *omap_padconf;
46*433d6423SLionel Sambuc 
47*433d6423SLionel Sambuc static kern_phys_map padconf_phys_map;
48*433d6423SLionel Sambuc 
49*433d6423SLionel Sambuc int
bsp_padconf_set(u32_t padconf,u32_t mask,u32_t value)50*433d6423SLionel Sambuc bsp_padconf_set(u32_t padconf, u32_t mask, u32_t value)
51*433d6423SLionel Sambuc {
52*433d6423SLionel Sambuc 	/* check that the value will be inside the padconf memory range */
53*433d6423SLionel Sambuc 	if (padconf >= (omap_padconf->size - omap_padconf->offset)) {
54*433d6423SLionel Sambuc 		return EINVAL;	/* outside of valid range */
55*433d6423SLionel Sambuc 	}
56*433d6423SLionel Sambuc 
57*433d6423SLionel Sambuc 	set32(padconf + omap_padconf->base + omap_padconf->offset, mask,
58*433d6423SLionel Sambuc 	    value);
59*433d6423SLionel Sambuc 
60*433d6423SLionel Sambuc 	return OK;
61*433d6423SLionel Sambuc }
62*433d6423SLionel Sambuc 
63*433d6423SLionel Sambuc void
bsp_padconf_init(void)64*433d6423SLionel Sambuc bsp_padconf_init(void)
65*433d6423SLionel Sambuc {
66*433d6423SLionel Sambuc 	int x;
67*433d6423SLionel Sambuc 	omap_padconf = NULL;
68*433d6423SLionel Sambuc 	/* find the correct padconf */
69*433d6423SLionel Sambuc 	for (x = 0; x < sizeof(omap_padconfs) / sizeof(omap_padconfs[0]); x++) {
70*433d6423SLionel Sambuc 		if ((omap_padconfs[x].board_filter_mask & machine.board_id) ==
71*433d6423SLionel Sambuc 		    omap_padconfs[x].board_filter_value) {
72*433d6423SLionel Sambuc 			omap_padconf = &omap_padconfs[x];
73*433d6423SLionel Sambuc 			break;
74*433d6423SLionel Sambuc 		}
75*433d6423SLionel Sambuc 	}
76*433d6423SLionel Sambuc 	assert(omap_padconf);
77*433d6423SLionel Sambuc 
78*433d6423SLionel Sambuc 	kern_phys_map_ptr(omap_padconf->base, omap_padconf->size,
79*433d6423SLionel Sambuc 	    VMMF_UNCACHED | VMMF_WRITE,
80*433d6423SLionel Sambuc 	    &padconf_phys_map, (vir_bytes) & omap_padconf->base);
81*433d6423SLionel Sambuc 
82*433d6423SLionel Sambuc 	return;
83*433d6423SLionel Sambuc }
84