Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e653034e authored by Kevin Hilman's avatar Kevin Hilman
Browse files

davinci: add runtime CPU detection support

parent 9232fcc9
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@

#define JTAG_ID_BASE		0x01c40028

static unsigned int davinci_revision;

struct davinci_id {
	u8	variant;	/* JTAG ID bits 31:28 */
	u16	part_no;	/* JTAG ID bits 27:12 */
@@ -33,6 +35,20 @@ static struct davinci_id davinci_ids[] __initdata = {
		.manufacturer = 0x017,
		.type	      = 0x64460000,
	},
	{
		/* DM646X */
		.part_no      = 0xb770,
		.variant      = 0x0,
		.manufacturer = 0x017,
		.type         = 0x64670000,
	},
	{
		/* DM355 */
		.part_no	= 0xb73b,
		.variant	= 0x0,
		.manufacturer	= 0x00f,
		.type		= 0x03550000,
	},
};

/*
@@ -63,6 +79,12 @@ static u8 __init davinci_get_variant(void)
	return variant;
}

unsigned int davinci_rev(void)
{
	return davinci_revision >> 16;
}
EXPORT_SYMBOL(davinci_rev);

void __init davinci_check_revision(void)
{
	int i;
@@ -75,7 +97,7 @@ void __init davinci_check_revision(void)
	/* First check only the major version in a safe way */
	for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) {
		if (part_no == (davinci_ids[i].part_no)) {
			system_rev = davinci_ids[i].type;
			davinci_revision = davinci_ids[i].type;
			break;
		}
	}
@@ -84,10 +106,11 @@ void __init davinci_check_revision(void)
	for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) {
		if (part_no == davinci_ids[i].part_no &&
		    variant == davinci_ids[i].variant) {
			system_rev = davinci_ids[i].type;
			davinci_revision = davinci_ids[i].type;
			break;
		}
	}

	printk("DaVinci DM%04x variant 0x%x\n", system_rev >> 16, variant);
	printk(KERN_INFO "DaVinci DM%04x variant 0x%x\n",
	       davinci_rev(), variant);
}
+49 −0
Original line number Diff line number Diff line
/*
 * DaVinci CPU type detection
 *
 * Author: Kevin Hilman, Deep Root Systems, LLC
 *
 * Defines the cpu_is_*() macros for runtime detection of DaVinci
 * device type.  In addtion, if support for a given device is not
 * compiled in to the kernel, the macros return 0 so that
 * resulting code can be optimized out.
 *
 * 2009 (c) Deep Root Systems, LLC. 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.
 */
#ifndef _ASM_ARCH_CPU_H
#define _ASM_ARCH_CPU_H

extern unsigned int davinci_rev(void);

#define IS_DAVINCI_CPU(type, id)			\
static inline int is_davinci_dm ##type(void)	        \
{							\
	return (davinci_rev() == (id)) ? 1 : 0;	        \
}

IS_DAVINCI_CPU(644x, 0x6446)
IS_DAVINCI_CPU(646x, 0x6467)
IS_DAVINCI_CPU(355, 0x355)

#ifdef CONFIG_ARCH_DAVINCI_DM644x
#define cpu_is_davinci_dm644x() is_davinci_dm644x()
#else
#define cpu_is_davinci_dm644x() 0
#endif

#ifdef CONFIG_ARCH_DAVINCI_DM646x
#define cpu_is_davinci_dm646x() is_davinci_dm646x()
#else
#define cpu_is_davinci_dm646x() 0
#endif

#ifdef CONFIG_ARCH_DAVINCI_DM355
#define cpu_is_davinci_dm355() is_davinci_dm355()
#else
#define cpu_is_davinci_dm355() 0
#endif

#endif