xref: /OK3568_Linux_fs/kernel/arch/arm/mach-davinci/board-mityomapl138.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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