abd25a3e2e55a471e1544f6f1a7f9c907bb40af7
[openembedded.git] /
1 From b48754f4c77924a9351867e17e2f09fbe5a83b82 Mon Sep 17 00:00:00 2001
2 From: Koen Kooi <koen@dominion.thruhere.net>
3 Date: Thu, 25 Mar 2010 16:07:23 +0100
4 Subject: [PATCH 22/50] OMAP3: beagle: implement expansionboard detection based on board/overo.c code
5
6 ---
7  board/ti/beagle/beagle.c |   78 ++++++++++++++++++++++++++++++++++++++++++++++
8  board/ti/beagle/beagle.h |   25 +++++++++++++-
9  2 files changed, 101 insertions(+), 2 deletions(-)
10
11 diff --git a/board/ti/beagle/beagle.c b/board/ti/beagle/beagle.c
12 index d357588..8c5b88c 100644
13 --- a/board/ti/beagle/beagle.c
14 +++ b/board/ti/beagle/beagle.c
15 @@ -38,6 +38,31 @@
16  #include <asm/mach-types.h>
17  #include "beagle.h"
18  
19 +static struct {
20 +       unsigned int device_vendor;
21 +       unsigned char revision;
22 +       unsigned char content;
23 +       unsigned char fab_revision[8];
24 +       unsigned char env_var[16];
25 +       unsigned char env_setting[64];
26 +} expansion_config;
27 +
28 +#define TWL4030_I2C_BUS                        0
29 +
30 +#define EXPANSION_EEPROM_I2C_BUS       1
31 +#define EXPANSION_EEPROM_I2C_ADDRESS   0x50
32 +
33 +#define TINCANTOOLS_VENDORID   0x0100
34 +#define GUMSTIX_VENDORID               0x0200
35 +#define SPECIALCOMP_VENDORID   0x0300
36 +
37 +#define TINCANTOOLS_ZIPPY              0x01000100
38 +#define TINCANTOOLS_ZIPPY2             0x02000100
39 +#define TINCANTOOLS_TRAINER            0x03000100
40 +#define TINCANTOOLS_SHOWDOG            0x04000100
41 +
42 +#define BEAGLE_NO_EEPROM               0xffffffff
43 +
44  static int beagle_revision;
45  
46  /*
47 @@ -95,6 +120,27 @@ void beagle_identify(void)
48  }
49  
50  /*
51 + * Routine: get_expansion_id
52 + * Description: This function checks for expansion board by checking I2C
53 + *             bus 2 for the availability of an AT24C01B serial EEPROM.
54 + *             returns the device_vendor field from the EEPROM
55 + */
56 +unsigned int get_expansion_id(void)
57 +{
58 +       i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
59 +
60 +       /* return BEAGLE_NO_EEPROM if eeprom doesn't respond */
61 +       if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1)
62 +               return BEAGLE_NO_EEPROM;
63 +
64 +       /* read configuration data */
65 +       i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
66 +                sizeof(expansion_config));
67 +
68 +       return expansion_config.device_vendor;
69 +}
70 +
71 +/*
72   * Routine: misc_init_r
73   * Description: Configure board specific parts
74   */
75 @@ -104,6 +150,38 @@ int misc_init_r(void)
76         struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE;
77  
78         beagle_identify();
79 +       switch (get_expansion_id()) {
80 +               case TINCANTOOLS_ZIPPY:
81 +                       printf("Recognized Tincantools Zippy expansion board (rev %d %s)\n",
82 +                               expansion_config.revision, expansion_config.fab_revision);
83 +                       MUX_TINCANTOOLS_ZIPPY();
84 +                       break;
85 +               case TINCANTOOLS_ZIPPY2:
86 +                       printf("Recognized Tincantools Zippy2 expansion board (rev %d %s)\n",
87 +                               expansion_config.revision, expansion_config.fab_revision);
88 +                       MUX_TINCANTOOLS_ZIPPY();
89 +                       break;
90 +               case TINCANTOOLS_TRAINER:
91 +                       printf("Recognized Tincantools Trainer expansion board (rev %d %s)\n",
92 +                               expansion_config.revision, expansion_config.fab_revision);
93 +                       break;
94 +               case TINCANTOOLS_SHOWDOG:
95 +                       printf("Recognized Tincantools Showdow expansion board (rev %d %s)\n",
96 +                               expansion_config.revision, expansion_config.fab_revision);
97 +                       /* Place holder for DSS2 definition for showdog lcd */
98 +                       setenv("defaultdisplay", "showdoglcd");
99 +                       break;
100 +               case BEAGLE_NO_EEPROM:
101 +                       printf("No EEPROM on expansion board\n");
102 +                       break;
103 +               default:
104 +                       printf("Unrecognized expansion board: %x\n", expansion_config.device_vendor);
105 +       }
106 +
107 +       if (expansion_config.content == 1)
108 +               setenv(expansion_config.env_var, expansion_config.env_setting);
109 +
110 +       i2c_set_bus_num(TWL4030_I2C_BUS);
111  
112         twl4030_power_init();
113         twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
114 diff --git a/board/ti/beagle/beagle.h b/board/ti/beagle/beagle.h
115 index fd06d46..ec4f831 100644
116 --- a/board/ti/beagle/beagle.h
117 +++ b/board/ti/beagle/beagle.h
118 @@ -260,8 +260,8 @@ const omap3_sysinfo sysinfo = {
119         MUX_VAL(CP(HSUSB0_DATA7),       (IEN  | PTD | DIS | M0)) /*HSUSB0_DATA7*/\
120         MUX_VAL(CP(I2C1_SCL),           (IEN  | PTU | EN  | M0)) /*I2C1_SCL*/\
121         MUX_VAL(CP(I2C1_SDA),           (IEN  | PTU | EN  | M0)) /*I2C1_SDA*/\
122 -       MUX_VAL(CP(I2C2_SCL),           (IEN  | PTU | EN  | M4)) /*GPIO_168*/\
123 -       MUX_VAL(CP(I2C2_SDA),           (IEN  | PTU | EN  | M4)) /*GPIO_183*/\
124 +       MUX_VAL(CP(I2C2_SCL),       (IEN  | PTU | EN  | M0)) /*I2C2_SCL*/\
125 +       MUX_VAL(CP(I2C2_SDA),       (IEN  | PTU | EN  | M0)) /*I2C2_SDA*/\
126         MUX_VAL(CP(I2C3_SCL),           (IEN  | PTU | EN  | M0)) /*I2C3_SCL*/\
127         MUX_VAL(CP(I2C3_SDA),           (IEN  | PTU | EN  | M0)) /*I2C3_SDA*/\
128         MUX_VAL(CP(I2C4_SCL),           (IEN  | PTU | EN  | M0)) /*I2C4_SCL*/\
129 @@ -412,4 +412,25 @@ const omap3_sysinfo sysinfo = {
130         MUX_VAL(CP(SYS_BOOT5),          (IDIS | PTD | DIS | M3)) /*DSS_DATA22*/\
131         MUX_VAL(CP(SYS_BOOT6),          (IDIS | PTD | DIS | M3)) /*DSS_DATA23*/ 
132  
133 +#define MUX_TINCANTOOLS_ZIPPY() \
134 +       MUX_VAL(CP(MMC2_CLK),       (IEN  | PTU | EN  | M0)) /*MMC2_CLK*/\
135 +       MUX_VAL(CP(MMC2_CMD),       (IEN  | PTU | EN  | M0)) /*MMC2_CMD*/\
136 +       MUX_VAL(CP(MMC2_DAT0),      (IEN  | PTU | EN  | M0)) /*MMC2_DAT0*/\
137 +       MUX_VAL(CP(MMC2_DAT1),      (IEN  | PTU | EN  | M0)) /*MMC2_DAT1*/\
138 +       MUX_VAL(CP(MMC2_DAT2),      (IEN  | PTU | EN  | M0)) /*MMC2_DAT2*/\
139 +       MUX_VAL(CP(MMC2_DAT3),      (IEN  | PTU | EN  | M0)) /*MMC2_DAT3*/\
140 +       MUX_VAL(CP(MMC2_DAT4),      (IEN  | PTU | EN  | M1)) /*MMC2_DIR_DAT0*/\
141 +       MUX_VAL(CP(MMC2_DAT5),      (IEN  | PTU | EN  | M1)) /*MMC2_DIR_DAT1*/\
142 +       MUX_VAL(CP(MMC2_DAT6),      (IEN  | PTU | EN  | M1)) /*MMC2_DIR_CMD*/\
143 +       MUX_VAL(CP(MMC2_DAT7),      (IEN  | PTU | EN  | M1)) /*MMC2_CLKIN*/\
144 +       MUX_VAL(CP(MCBSP1_CLKR),    (IEN  | PTU | EN  | M1)) /*MCSPI4_CLK*/\
145 +       MUX_VAL(CP(MCBSP1_FSR),     (IEN  | PTU | EN  | M4)) /*GPIO_157*/\
146 +       MUX_VAL(CP(MCBSP1_DX),      (IEN  | PTD | EN  | M1)) /*MCSPI4_SIMO*/\
147 +       MUX_VAL(CP(MCBSP1_DR),      (IEN  | PTD | DIS | M1)) /*MCSPI4_SOMI*/\
148 +       MUX_VAL(CP(MCBSP1_FSX),     (IEN  | PTD | EN  | M1)) /*MCSPI4_CS0*/\
149 +       MUX_VAL(CP(MCBSP1_CLKX),    (IEN  | PTD | DIS | M4)) /*GPIO_162*/\
150 +       MUX_VAL(CP(MCBSP3_DX),      (IEN  | PTD | DIS | M4)) /*GPIO_140*/\
151 +       MUX_VAL(CP(MCBSP3_DR),      (IEN  | PTD | DIS | M4)) /*GPIO_142*/\
152 +       MUX_VAL(CP(MCBSP3_CLKX),    (IEN  | PTD | DIS | M4)) /*GPIO_141*/\
153 +
154  #endif
155 -- 
156 1.6.6.1
157