1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Critical Link MityOMAP-L138 SoM
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2010 Critical Link LLC - https://www.criticallink.com
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * This file is licensed under the terms of the GNU General Public License
7*4882a593Smuzhiyun * version 2. This program is licensed "as is" without any warranty of
8*4882a593Smuzhiyun * any kind, whether express or implied.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #define pr_fmt(fmt) "MityOMAPL138: " fmt
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <linux/kernel.h>
14*4882a593Smuzhiyun #include <linux/init.h>
15*4882a593Smuzhiyun #include <linux/console.h>
16*4882a593Smuzhiyun #include <linux/platform_device.h>
17*4882a593Smuzhiyun #include <linux/property.h>
18*4882a593Smuzhiyun #include <linux/mtd/partitions.h>
19*4882a593Smuzhiyun #include <linux/notifier.h>
20*4882a593Smuzhiyun #include <linux/nvmem-consumer.h>
21*4882a593Smuzhiyun #include <linux/nvmem-provider.h>
22*4882a593Smuzhiyun #include <linux/regulator/machine.h>
23*4882a593Smuzhiyun #include <linux/i2c.h>
24*4882a593Smuzhiyun #include <linux/etherdevice.h>
25*4882a593Smuzhiyun #include <linux/spi/spi.h>
26*4882a593Smuzhiyun #include <linux/spi/flash.h>
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #include <asm/io.h>
29*4882a593Smuzhiyun #include <asm/mach-types.h>
30*4882a593Smuzhiyun #include <asm/mach/arch.h>
31*4882a593Smuzhiyun #include <mach/common.h>
32*4882a593Smuzhiyun #include <mach/da8xx.h>
33*4882a593Smuzhiyun #include <linux/platform_data/mtd-davinci.h>
34*4882a593Smuzhiyun #include <linux/platform_data/mtd-davinci-aemif.h>
35*4882a593Smuzhiyun #include <linux/platform_data/ti-aemif.h>
36*4882a593Smuzhiyun #include <mach/mux.h>
37*4882a593Smuzhiyun #include <linux/platform_data/spi-davinci.h>
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #define MITYOMAPL138_PHY_ID ""
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #define FACTORY_CONFIG_MAGIC 0x012C0138
42*4882a593Smuzhiyun #define FACTORY_CONFIG_VERSION 0x00010001
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* Data Held in On-Board I2C device */
45*4882a593Smuzhiyun struct factory_config {
46*4882a593Smuzhiyun u32 magic;
47*4882a593Smuzhiyun u32 version;
48*4882a593Smuzhiyun u8 mac[6];
49*4882a593Smuzhiyun u32 fpga_type;
50*4882a593Smuzhiyun u32 spare;
51*4882a593Smuzhiyun u32 serialnumber;
52*4882a593Smuzhiyun char partnum[32];
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun static struct factory_config factory_config;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun #ifdef CONFIG_CPU_FREQ
58*4882a593Smuzhiyun struct part_no_info {
59*4882a593Smuzhiyun const char *part_no; /* part number string of interest */
60*4882a593Smuzhiyun int max_freq; /* khz */
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun static struct part_no_info mityomapl138_pn_info[] = {
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun .part_no = "L138-C",
66*4882a593Smuzhiyun .max_freq = 300000,
67*4882a593Smuzhiyun },
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun .part_no = "L138-D",
70*4882a593Smuzhiyun .max_freq = 375000,
71*4882a593Smuzhiyun },
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun .part_no = "L138-F",
74*4882a593Smuzhiyun .max_freq = 456000,
75*4882a593Smuzhiyun },
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun .part_no = "1808-C",
78*4882a593Smuzhiyun .max_freq = 300000,
79*4882a593Smuzhiyun },
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun .part_no = "1808-D",
82*4882a593Smuzhiyun .max_freq = 375000,
83*4882a593Smuzhiyun },
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun .part_no = "1808-F",
86*4882a593Smuzhiyun .max_freq = 456000,
87*4882a593Smuzhiyun },
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun .part_no = "1810-D",
90*4882a593Smuzhiyun .max_freq = 375000,
91*4882a593Smuzhiyun },
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun
mityomapl138_cpufreq_init(const char * partnum)94*4882a593Smuzhiyun static void mityomapl138_cpufreq_init(const char *partnum)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun int i, ret;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun for (i = 0; partnum && i < ARRAY_SIZE(mityomapl138_pn_info); i++) {
99*4882a593Smuzhiyun /*
100*4882a593Smuzhiyun * the part number has additional characters beyond what is
101*4882a593Smuzhiyun * stored in the table. This information is not needed for
102*4882a593Smuzhiyun * determining the speed grade, and would require several
103*4882a593Smuzhiyun * more table entries. Only check the first N characters
104*4882a593Smuzhiyun * for a match.
105*4882a593Smuzhiyun */
106*4882a593Smuzhiyun if (!strncmp(partnum, mityomapl138_pn_info[i].part_no,
107*4882a593Smuzhiyun strlen(mityomapl138_pn_info[i].part_no))) {
108*4882a593Smuzhiyun da850_max_speed = mityomapl138_pn_info[i].max_freq;
109*4882a593Smuzhiyun break;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun ret = da850_register_cpufreq("pll0_sysclk3");
114*4882a593Smuzhiyun if (ret)
115*4882a593Smuzhiyun pr_warn("cpufreq registration failed: %d\n", ret);
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun #else
mityomapl138_cpufreq_init(const char * partnum)118*4882a593Smuzhiyun static void mityomapl138_cpufreq_init(const char *partnum) { }
119*4882a593Smuzhiyun #endif
120*4882a593Smuzhiyun
read_factory_config(struct notifier_block * nb,unsigned long event,void * data)121*4882a593Smuzhiyun static int read_factory_config(struct notifier_block *nb,
122*4882a593Smuzhiyun unsigned long event, void *data)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun int ret;
125*4882a593Smuzhiyun const char *partnum = NULL;
126*4882a593Smuzhiyun struct nvmem_device *nvmem = data;
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun if (strcmp(nvmem_dev_name(nvmem), "1-00500") != 0)
129*4882a593Smuzhiyun return NOTIFY_DONE;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun if (!IS_BUILTIN(CONFIG_NVMEM)) {
132*4882a593Smuzhiyun pr_warn("Factory Config not available without CONFIG_NVMEM\n");
133*4882a593Smuzhiyun goto bad_config;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun ret = nvmem_device_read(nvmem, 0, sizeof(factory_config),
137*4882a593Smuzhiyun &factory_config);
138*4882a593Smuzhiyun if (ret != sizeof(struct factory_config)) {
139*4882a593Smuzhiyun pr_warn("Read Factory Config Failed: %d\n", ret);
140*4882a593Smuzhiyun goto bad_config;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun if (factory_config.magic != FACTORY_CONFIG_MAGIC) {
144*4882a593Smuzhiyun pr_warn("Factory Config Magic Wrong (%X)\n",
145*4882a593Smuzhiyun factory_config.magic);
146*4882a593Smuzhiyun goto bad_config;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun if (factory_config.version != FACTORY_CONFIG_VERSION) {
150*4882a593Smuzhiyun pr_warn("Factory Config Version Wrong (%X)\n",
151*4882a593Smuzhiyun factory_config.version);
152*4882a593Smuzhiyun goto bad_config;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun partnum = factory_config.partnum;
156*4882a593Smuzhiyun pr_info("Part Number = %s\n", partnum);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun bad_config:
159*4882a593Smuzhiyun /* default maximum speed is valid for all platforms */
160*4882a593Smuzhiyun mityomapl138_cpufreq_init(partnum);
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun return NOTIFY_STOP;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun static struct notifier_block mityomapl138_nvmem_notifier = {
166*4882a593Smuzhiyun .notifier_call = read_factory_config,
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun /*
170*4882a593Smuzhiyun * We don't define a cell for factory config as it will be accessed from the
171*4882a593Smuzhiyun * board file using the nvmem notifier chain.
172*4882a593Smuzhiyun */
173*4882a593Smuzhiyun static struct nvmem_cell_info mityomapl138_nvmem_cells[] = {
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun .name = "macaddr",
176*4882a593Smuzhiyun .offset = 0x64,
177*4882a593Smuzhiyun .bytes = ETH_ALEN,
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun static struct nvmem_cell_table mityomapl138_nvmem_cell_table = {
182*4882a593Smuzhiyun .nvmem_name = "1-00500",
183*4882a593Smuzhiyun .cells = mityomapl138_nvmem_cells,
184*4882a593Smuzhiyun .ncells = ARRAY_SIZE(mityomapl138_nvmem_cells),
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun static struct nvmem_cell_lookup mityomapl138_nvmem_cell_lookup = {
188*4882a593Smuzhiyun .nvmem_name = "1-00500",
189*4882a593Smuzhiyun .cell_name = "macaddr",
190*4882a593Smuzhiyun .dev_id = "davinci_emac.1",
191*4882a593Smuzhiyun .con_id = "mac-address",
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun static const struct property_entry mityomapl138_fd_chip_properties[] = {
195*4882a593Smuzhiyun PROPERTY_ENTRY_U32("pagesize", 8),
196*4882a593Smuzhiyun PROPERTY_ENTRY_BOOL("read-only"),
197*4882a593Smuzhiyun { }
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun static struct davinci_i2c_platform_data mityomap_i2c_0_pdata = {
201*4882a593Smuzhiyun .bus_freq = 100, /* kHz */
202*4882a593Smuzhiyun .bus_delay = 0, /* usec */
203*4882a593Smuzhiyun };
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun /* TPS65023 voltage regulator support */
206*4882a593Smuzhiyun /* 1.2V Core */
207*4882a593Smuzhiyun static struct regulator_consumer_supply tps65023_dcdc1_consumers[] = {
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun .supply = "cvdd",
210*4882a593Smuzhiyun },
211*4882a593Smuzhiyun };
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun /* 1.8V */
214*4882a593Smuzhiyun static struct regulator_consumer_supply tps65023_dcdc2_consumers[] = {
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun .supply = "usb0_vdda18",
217*4882a593Smuzhiyun },
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun .supply = "usb1_vdda18",
220*4882a593Smuzhiyun },
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun .supply = "ddr_dvdd18",
223*4882a593Smuzhiyun },
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun .supply = "sata_vddr",
226*4882a593Smuzhiyun },
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun /* 1.2V */
230*4882a593Smuzhiyun static struct regulator_consumer_supply tps65023_dcdc3_consumers[] = {
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun .supply = "sata_vdd",
233*4882a593Smuzhiyun },
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun .supply = "usb_cvdd",
236*4882a593Smuzhiyun },
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun .supply = "pll0_vdda",
239*4882a593Smuzhiyun },
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun .supply = "pll1_vdda",
242*4882a593Smuzhiyun },
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun /* 1.8V Aux LDO, not used */
246*4882a593Smuzhiyun static struct regulator_consumer_supply tps65023_ldo1_consumers[] = {
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun .supply = "1.8v_aux",
249*4882a593Smuzhiyun },
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun /* FPGA VCC Aux (2.5 or 3.3) LDO */
253*4882a593Smuzhiyun static struct regulator_consumer_supply tps65023_ldo2_consumers[] = {
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun .supply = "vccaux",
256*4882a593Smuzhiyun },
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun static struct regulator_init_data tps65023_regulator_data[] = {
260*4882a593Smuzhiyun /* dcdc1 */
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun .constraints = {
263*4882a593Smuzhiyun .min_uV = 1150000,
264*4882a593Smuzhiyun .max_uV = 1350000,
265*4882a593Smuzhiyun .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
266*4882a593Smuzhiyun REGULATOR_CHANGE_STATUS,
267*4882a593Smuzhiyun .boot_on = 1,
268*4882a593Smuzhiyun },
269*4882a593Smuzhiyun .num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc1_consumers),
270*4882a593Smuzhiyun .consumer_supplies = tps65023_dcdc1_consumers,
271*4882a593Smuzhiyun },
272*4882a593Smuzhiyun /* dcdc2 */
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun .constraints = {
275*4882a593Smuzhiyun .min_uV = 1800000,
276*4882a593Smuzhiyun .max_uV = 1800000,
277*4882a593Smuzhiyun .valid_ops_mask = REGULATOR_CHANGE_STATUS,
278*4882a593Smuzhiyun .boot_on = 1,
279*4882a593Smuzhiyun },
280*4882a593Smuzhiyun .num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc2_consumers),
281*4882a593Smuzhiyun .consumer_supplies = tps65023_dcdc2_consumers,
282*4882a593Smuzhiyun },
283*4882a593Smuzhiyun /* dcdc3 */
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun .constraints = {
286*4882a593Smuzhiyun .min_uV = 1200000,
287*4882a593Smuzhiyun .max_uV = 1200000,
288*4882a593Smuzhiyun .valid_ops_mask = REGULATOR_CHANGE_STATUS,
289*4882a593Smuzhiyun .boot_on = 1,
290*4882a593Smuzhiyun },
291*4882a593Smuzhiyun .num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc3_consumers),
292*4882a593Smuzhiyun .consumer_supplies = tps65023_dcdc3_consumers,
293*4882a593Smuzhiyun },
294*4882a593Smuzhiyun /* ldo1 */
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun .constraints = {
297*4882a593Smuzhiyun .min_uV = 1800000,
298*4882a593Smuzhiyun .max_uV = 1800000,
299*4882a593Smuzhiyun .valid_ops_mask = REGULATOR_CHANGE_STATUS,
300*4882a593Smuzhiyun .boot_on = 1,
301*4882a593Smuzhiyun },
302*4882a593Smuzhiyun .num_consumer_supplies = ARRAY_SIZE(tps65023_ldo1_consumers),
303*4882a593Smuzhiyun .consumer_supplies = tps65023_ldo1_consumers,
304*4882a593Smuzhiyun },
305*4882a593Smuzhiyun /* ldo2 */
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun .constraints = {
308*4882a593Smuzhiyun .min_uV = 2500000,
309*4882a593Smuzhiyun .max_uV = 3300000,
310*4882a593Smuzhiyun .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
311*4882a593Smuzhiyun REGULATOR_CHANGE_STATUS,
312*4882a593Smuzhiyun .boot_on = 1,
313*4882a593Smuzhiyun },
314*4882a593Smuzhiyun .num_consumer_supplies = ARRAY_SIZE(tps65023_ldo2_consumers),
315*4882a593Smuzhiyun .consumer_supplies = tps65023_ldo2_consumers,
316*4882a593Smuzhiyun },
317*4882a593Smuzhiyun };
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun static struct i2c_board_info __initdata mityomap_tps65023_info[] = {
320*4882a593Smuzhiyun {
321*4882a593Smuzhiyun I2C_BOARD_INFO("tps65023", 0x48),
322*4882a593Smuzhiyun .platform_data = &tps65023_regulator_data[0],
323*4882a593Smuzhiyun },
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun I2C_BOARD_INFO("24c02", 0x50),
326*4882a593Smuzhiyun .properties = mityomapl138_fd_chip_properties,
327*4882a593Smuzhiyun },
328*4882a593Smuzhiyun };
329*4882a593Smuzhiyun
pmic_tps65023_init(void)330*4882a593Smuzhiyun static int __init pmic_tps65023_init(void)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun return i2c_register_board_info(1, mityomap_tps65023_info,
333*4882a593Smuzhiyun ARRAY_SIZE(mityomap_tps65023_info));
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /*
337*4882a593Smuzhiyun * SPI Devices:
338*4882a593Smuzhiyun * SPI1_CS0: 8M Flash ST-M25P64-VME6G
339*4882a593Smuzhiyun */
340*4882a593Smuzhiyun static struct mtd_partition spi_flash_partitions[] = {
341*4882a593Smuzhiyun [0] = {
342*4882a593Smuzhiyun .name = "ubl",
343*4882a593Smuzhiyun .offset = 0,
344*4882a593Smuzhiyun .size = SZ_64K,
345*4882a593Smuzhiyun .mask_flags = MTD_WRITEABLE,
346*4882a593Smuzhiyun },
347*4882a593Smuzhiyun [1] = {
348*4882a593Smuzhiyun .name = "u-boot",
349*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
350*4882a593Smuzhiyun .size = SZ_512K,
351*4882a593Smuzhiyun .mask_flags = MTD_WRITEABLE,
352*4882a593Smuzhiyun },
353*4882a593Smuzhiyun [2] = {
354*4882a593Smuzhiyun .name = "u-boot-env",
355*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
356*4882a593Smuzhiyun .size = SZ_64K,
357*4882a593Smuzhiyun .mask_flags = MTD_WRITEABLE,
358*4882a593Smuzhiyun },
359*4882a593Smuzhiyun [3] = {
360*4882a593Smuzhiyun .name = "periph-config",
361*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
362*4882a593Smuzhiyun .size = SZ_64K,
363*4882a593Smuzhiyun .mask_flags = MTD_WRITEABLE,
364*4882a593Smuzhiyun },
365*4882a593Smuzhiyun [4] = {
366*4882a593Smuzhiyun .name = "reserved",
367*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
368*4882a593Smuzhiyun .size = SZ_256K + SZ_64K,
369*4882a593Smuzhiyun },
370*4882a593Smuzhiyun [5] = {
371*4882a593Smuzhiyun .name = "kernel",
372*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
373*4882a593Smuzhiyun .size = SZ_2M + SZ_1M,
374*4882a593Smuzhiyun },
375*4882a593Smuzhiyun [6] = {
376*4882a593Smuzhiyun .name = "fpga",
377*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
378*4882a593Smuzhiyun .size = SZ_2M,
379*4882a593Smuzhiyun },
380*4882a593Smuzhiyun [7] = {
381*4882a593Smuzhiyun .name = "spare",
382*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
383*4882a593Smuzhiyun .size = MTDPART_SIZ_FULL,
384*4882a593Smuzhiyun },
385*4882a593Smuzhiyun };
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun static struct flash_platform_data mityomapl138_spi_flash_data = {
388*4882a593Smuzhiyun .name = "m25p80",
389*4882a593Smuzhiyun .parts = spi_flash_partitions,
390*4882a593Smuzhiyun .nr_parts = ARRAY_SIZE(spi_flash_partitions),
391*4882a593Smuzhiyun .type = "m24p64",
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun static struct davinci_spi_config spi_eprom_config = {
395*4882a593Smuzhiyun .io_type = SPI_IO_TYPE_DMA,
396*4882a593Smuzhiyun .c2tdelay = 8,
397*4882a593Smuzhiyun .t2cdelay = 8,
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun static struct spi_board_info mityomapl138_spi_flash_info[] = {
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun .modalias = "m25p80",
403*4882a593Smuzhiyun .platform_data = &mityomapl138_spi_flash_data,
404*4882a593Smuzhiyun .controller_data = &spi_eprom_config,
405*4882a593Smuzhiyun .mode = SPI_MODE_0,
406*4882a593Smuzhiyun .max_speed_hz = 30000000,
407*4882a593Smuzhiyun .bus_num = 1,
408*4882a593Smuzhiyun .chip_select = 0,
409*4882a593Smuzhiyun },
410*4882a593Smuzhiyun };
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun /*
413*4882a593Smuzhiyun * MityDSP-L138 includes a 256 MByte large-page NAND flash
414*4882a593Smuzhiyun * (128K blocks).
415*4882a593Smuzhiyun */
416*4882a593Smuzhiyun static struct mtd_partition mityomapl138_nandflash_partition[] = {
417*4882a593Smuzhiyun {
418*4882a593Smuzhiyun .name = "rootfs",
419*4882a593Smuzhiyun .offset = 0,
420*4882a593Smuzhiyun .size = SZ_128M,
421*4882a593Smuzhiyun .mask_flags = 0, /* MTD_WRITEABLE, */
422*4882a593Smuzhiyun },
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun .name = "homefs",
425*4882a593Smuzhiyun .offset = MTDPART_OFS_APPEND,
426*4882a593Smuzhiyun .size = MTDPART_SIZ_FULL,
427*4882a593Smuzhiyun .mask_flags = 0,
428*4882a593Smuzhiyun },
429*4882a593Smuzhiyun };
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun static struct davinci_nand_pdata mityomapl138_nandflash_data = {
432*4882a593Smuzhiyun .core_chipsel = 1,
433*4882a593Smuzhiyun .parts = mityomapl138_nandflash_partition,
434*4882a593Smuzhiyun .nr_parts = ARRAY_SIZE(mityomapl138_nandflash_partition),
435*4882a593Smuzhiyun .engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST,
436*4882a593Smuzhiyun .bbt_options = NAND_BBT_USE_FLASH,
437*4882a593Smuzhiyun .options = NAND_BUSWIDTH_16,
438*4882a593Smuzhiyun .ecc_bits = 1, /* 4 bit mode is not supported with 16 bit NAND */
439*4882a593Smuzhiyun };
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun static struct resource mityomapl138_nandflash_resource[] = {
442*4882a593Smuzhiyun {
443*4882a593Smuzhiyun .start = DA8XX_AEMIF_CS3_BASE,
444*4882a593Smuzhiyun .end = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
445*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
446*4882a593Smuzhiyun },
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun .start = DA8XX_AEMIF_CTL_BASE,
449*4882a593Smuzhiyun .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
450*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
451*4882a593Smuzhiyun },
452*4882a593Smuzhiyun };
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun static struct platform_device mityomapl138_aemif_devices[] = {
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun .name = "davinci_nand",
457*4882a593Smuzhiyun .id = 1,
458*4882a593Smuzhiyun .dev = {
459*4882a593Smuzhiyun .platform_data = &mityomapl138_nandflash_data,
460*4882a593Smuzhiyun },
461*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(mityomapl138_nandflash_resource),
462*4882a593Smuzhiyun .resource = mityomapl138_nandflash_resource,
463*4882a593Smuzhiyun },
464*4882a593Smuzhiyun };
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun static struct resource mityomapl138_aemif_resources[] = {
467*4882a593Smuzhiyun {
468*4882a593Smuzhiyun .start = DA8XX_AEMIF_CTL_BASE,
469*4882a593Smuzhiyun .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
470*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
471*4882a593Smuzhiyun },
472*4882a593Smuzhiyun };
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun static struct aemif_abus_data mityomapl138_aemif_abus_data[] = {
475*4882a593Smuzhiyun {
476*4882a593Smuzhiyun .cs = 1,
477*4882a593Smuzhiyun },
478*4882a593Smuzhiyun };
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun static struct aemif_platform_data mityomapl138_aemif_pdata = {
481*4882a593Smuzhiyun .abus_data = mityomapl138_aemif_abus_data,
482*4882a593Smuzhiyun .num_abus_data = ARRAY_SIZE(mityomapl138_aemif_abus_data),
483*4882a593Smuzhiyun .sub_devices = mityomapl138_aemif_devices,
484*4882a593Smuzhiyun .num_sub_devices = ARRAY_SIZE(mityomapl138_aemif_devices),
485*4882a593Smuzhiyun };
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun static struct platform_device mityomapl138_aemif_device = {
488*4882a593Smuzhiyun .name = "ti-aemif",
489*4882a593Smuzhiyun .id = -1,
490*4882a593Smuzhiyun .dev = {
491*4882a593Smuzhiyun .platform_data = &mityomapl138_aemif_pdata,
492*4882a593Smuzhiyun },
493*4882a593Smuzhiyun .resource = mityomapl138_aemif_resources,
494*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(mityomapl138_aemif_resources),
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun
mityomapl138_setup_nand(void)497*4882a593Smuzhiyun static void __init mityomapl138_setup_nand(void)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun if (platform_device_register(&mityomapl138_aemif_device))
500*4882a593Smuzhiyun pr_warn("%s: Cannot register AEMIF device\n", __func__);
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun static const short mityomap_mii_pins[] = {
504*4882a593Smuzhiyun DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
505*4882a593Smuzhiyun DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
506*4882a593Smuzhiyun DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
507*4882a593Smuzhiyun DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
508*4882a593Smuzhiyun DA850_MDIO_D,
509*4882a593Smuzhiyun -1
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun static const short mityomap_rmii_pins[] = {
513*4882a593Smuzhiyun DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
514*4882a593Smuzhiyun DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
515*4882a593Smuzhiyun DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
516*4882a593Smuzhiyun DA850_MDIO_D,
517*4882a593Smuzhiyun -1
518*4882a593Smuzhiyun };
519*4882a593Smuzhiyun
mityomapl138_config_emac(void)520*4882a593Smuzhiyun static void __init mityomapl138_config_emac(void)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun void __iomem *cfg_chip3_base;
523*4882a593Smuzhiyun int ret;
524*4882a593Smuzhiyun u32 val;
525*4882a593Smuzhiyun struct davinci_soc_info *soc_info = &davinci_soc_info;
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun soc_info->emac_pdata->rmii_en = 0; /* hardcoded for now */
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
530*4882a593Smuzhiyun val = __raw_readl(cfg_chip3_base);
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun if (soc_info->emac_pdata->rmii_en) {
533*4882a593Smuzhiyun val |= BIT(8);
534*4882a593Smuzhiyun ret = davinci_cfg_reg_list(mityomap_rmii_pins);
535*4882a593Smuzhiyun pr_info("RMII PHY configured\n");
536*4882a593Smuzhiyun } else {
537*4882a593Smuzhiyun val &= ~BIT(8);
538*4882a593Smuzhiyun ret = davinci_cfg_reg_list(mityomap_mii_pins);
539*4882a593Smuzhiyun pr_info("MII PHY configured\n");
540*4882a593Smuzhiyun }
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun if (ret) {
543*4882a593Smuzhiyun pr_warn("mii/rmii mux setup failed: %d\n", ret);
544*4882a593Smuzhiyun return;
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun /* configure the CFGCHIP3 register for RMII or MII */
548*4882a593Smuzhiyun __raw_writel(val, cfg_chip3_base);
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun soc_info->emac_pdata->phy_id = MITYOMAPL138_PHY_ID;
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun ret = da8xx_register_emac();
553*4882a593Smuzhiyun if (ret)
554*4882a593Smuzhiyun pr_warn("emac registration failed: %d\n", ret);
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun
mityomapl138_init(void)557*4882a593Smuzhiyun static void __init mityomapl138_init(void)
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun int ret;
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun da850_register_clocks();
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun /* for now, no special EDMA channels are reserved */
564*4882a593Smuzhiyun ret = da850_register_edma(NULL);
565*4882a593Smuzhiyun if (ret)
566*4882a593Smuzhiyun pr_warn("edma registration failed: %d\n", ret);
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun ret = da8xx_register_watchdog();
569*4882a593Smuzhiyun if (ret)
570*4882a593Smuzhiyun pr_warn("watchdog registration failed: %d\n", ret);
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun davinci_serial_init(da8xx_serial_device);
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun nvmem_register_notifier(&mityomapl138_nvmem_notifier);
575*4882a593Smuzhiyun nvmem_add_cell_table(&mityomapl138_nvmem_cell_table);
576*4882a593Smuzhiyun nvmem_add_cell_lookups(&mityomapl138_nvmem_cell_lookup, 1);
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata);
579*4882a593Smuzhiyun if (ret)
580*4882a593Smuzhiyun pr_warn("i2c0 registration failed: %d\n", ret);
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun ret = pmic_tps65023_init();
583*4882a593Smuzhiyun if (ret)
584*4882a593Smuzhiyun pr_warn("TPS65023 PMIC init failed: %d\n", ret);
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun mityomapl138_setup_nand();
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun ret = spi_register_board_info(mityomapl138_spi_flash_info,
589*4882a593Smuzhiyun ARRAY_SIZE(mityomapl138_spi_flash_info));
590*4882a593Smuzhiyun if (ret)
591*4882a593Smuzhiyun pr_warn("spi info registration failed: %d\n", ret);
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun ret = da8xx_register_spi_bus(1,
594*4882a593Smuzhiyun ARRAY_SIZE(mityomapl138_spi_flash_info));
595*4882a593Smuzhiyun if (ret)
596*4882a593Smuzhiyun pr_warn("spi 1 registration failed: %d\n", ret);
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun mityomapl138_config_emac();
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun ret = da8xx_register_rtc();
601*4882a593Smuzhiyun if (ret)
602*4882a593Smuzhiyun pr_warn("rtc setup failed: %d\n", ret);
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun ret = da8xx_register_cpuidle();
605*4882a593Smuzhiyun if (ret)
606*4882a593Smuzhiyun pr_warn("cpuidle registration failed: %d\n", ret);
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun davinci_pm_init();
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_CONSOLE
mityomapl138_console_init(void)612*4882a593Smuzhiyun static int __init mityomapl138_console_init(void)
613*4882a593Smuzhiyun {
614*4882a593Smuzhiyun if (!machine_is_mityomapl138())
615*4882a593Smuzhiyun return 0;
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun return add_preferred_console("ttyS", 1, "115200");
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun console_initcall(mityomapl138_console_init);
620*4882a593Smuzhiyun #endif
621*4882a593Smuzhiyun
mityomapl138_map_io(void)622*4882a593Smuzhiyun static void __init mityomapl138_map_io(void)
623*4882a593Smuzhiyun {
624*4882a593Smuzhiyun da850_init();
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")
628*4882a593Smuzhiyun .atag_offset = 0x100,
629*4882a593Smuzhiyun .map_io = mityomapl138_map_io,
630*4882a593Smuzhiyun .init_irq = da850_init_irq,
631*4882a593Smuzhiyun .init_time = da850_init_time,
632*4882a593Smuzhiyun .init_machine = mityomapl138_init,
633*4882a593Smuzhiyun .init_late = davinci_init_late,
634*4882a593Smuzhiyun .dma_zone_size = SZ_128M,
635*4882a593Smuzhiyun MACHINE_END
636