| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | /* * Critical Link MityOMAP-L138 SoM * * Copyright (C) 2010 Critical Link LLC - http://www.criticallink.com * * This file is licensed under the terms of the GNU General Public License * version 2. This program is licensed "as is" without any warranty of * any kind, whether express or implied. */#include <linux/kernel.h>#include <linux/init.h>#include <linux/console.h>#include <linux/platform_device.h>#include <linux/mtd/partitions.h>#include <linux/regulator/machine.h>#include <linux/i2c.h>#include <linux/i2c/at24.h>#include <linux/etherdevice.h>#include <linux/spi/spi.h>#include <linux/spi/flash.h>#include <asm/io.h>#include <asm/mach-types.h>#include <asm/mach/arch.h>#include <mach/common.h>#include <mach/cp_intc.h>#include <mach/da8xx.h>#include <linux/platform_data/mtd-davinci.h>#include <mach/mux.h>#include <linux/platform_data/spi-davinci.h>#define MITYOMAPL138_PHY_ID		""#define FACTORY_CONFIG_MAGIC	0x012C0138#define FACTORY_CONFIG_VERSION	0x00010001/* Data Held in On-Board I2C device */struct factory_config {	u32	magic;	u32	version;	u8	mac[6];	u32	fpga_type;	u32	spare;	u32	serialnumber;	char	partnum[32];};static struct factory_config factory_config;struct part_no_info {	const char	*part_no;	/* part number string of interest */	int		max_freq;	/* khz */};static struct part_no_info mityomapl138_pn_info[] = {	{		.part_no	= "L138-C",		.max_freq	= 300000,	},	{		.part_no	= "L138-D",		.max_freq	= 375000,	},	{		.part_no	= "L138-F",		.max_freq	= 456000,	},	{		.part_no	= "1808-C",		.max_freq	= 300000,	},	{		.part_no	= "1808-D",		.max_freq	= 375000,	},	{		.part_no	= "1808-F",		.max_freq	= 456000,	},	{		.part_no	= "1810-D",		.max_freq	= 375000,	},};#ifdef CONFIG_CPU_FREQstatic void mityomapl138_cpufreq_init(const char *partnum){	int i, ret;	for (i = 0; partnum && i < ARRAY_SIZE(mityomapl138_pn_info); i++) {		/*		 * the part number has additional characters beyond what is		 * stored in the table.  This information is not needed for		 * determining the speed grade, and would require several		 * more table entries.  Only check the first N characters		 * for a match.		 */		if (!strncmp(partnum, mityomapl138_pn_info[i].part_no,			     strlen(mityomapl138_pn_info[i].part_no))) {			da850_max_speed = mityomapl138_pn_info[i].max_freq;			break;		}	}	ret = da850_register_cpufreq("pll0_sysclk3");	if (ret)		pr_warning("cpufreq registration failed: %d\n", ret);}#elsestatic void mityomapl138_cpufreq_init(const char *partnum) { }#endifstatic void read_factory_config(struct memory_accessor *a, void *context){	int ret;	const char *partnum = NULL;	struct davinci_soc_info *soc_info = &davinci_soc_info;	ret = a->read(a, (char *)&factory_config, 0, sizeof(factory_config));	if (ret != sizeof(struct factory_config)) {		pr_warning("MityOMAPL138: Read Factory Config Failed: %d\n",				ret);		goto bad_config;	}	if (factory_config.magic != FACTORY_CONFIG_MAGIC) {		pr_warning("MityOMAPL138: Factory Config Magic Wrong (%X)\n",				factory_config.magic);		goto bad_config;	}	if (factory_config.version != FACTORY_CONFIG_VERSION) {		pr_warning("MityOMAPL138: Factory Config Version Wrong (%X)\n",				factory_config.version);		goto bad_config;	}
 |