[PATCH 5/9] at91: use structure to store the current soc

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Tue May 10 19:40:33 EDT 2011


 
> > +
> > +static void soc_detect(u32 dbgu_base)
> > +{
> 
> This looks far better than your previous patch, and is how I suggested
> it should have been done :-).
> 
> I think possibly that this function should return an boolean indicating
> whether or not it was able to detect the cpu, rather than the calling
> function checking the internals of the at91_soc_data structure.
no need as at91_soc_data.type is init to SOC_AT91_NONE first
this ways we use less code
> 
> > +	u32 cidr, socid;
> > +
> > +	cidr = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_CIDR);
> > +	socid = cidr & ~AT91_CIDR_VERSION;
> >
> > +	switch (socid) {
> > +	case ARCH_ID_AT572D940HF:
> > +		at91_soc_data.type = SOC_572D940HF;
> > +		set_at91_boot_soc(at572d940hf_soc);
> > +		break;
> > +
> > +	case ARCH_ID_AT91CAP9: {
> > +#ifdef CONFIG_AT91_PMC_UNIT
> > +		u32 pmc_ver = at91_sys_read(AT91_PMC_VER);
> > +
> > +		if (pmc_ver == ARCH_REVISION_CAP9_B)
> > +			at91_soc_data.subtype = SOC_CAP9_REV_B;
> > +		else if (pmc_ver == ARCH_REVISION_CAP9_C)
> > +			at91_soc_data.subtype = SOC_CAP9_REV_C;
> > +#endif
> > +		at91_soc_data.type = SOC_CAP9;
> > +		set_at91_boot_soc(at91cap9_soc);
> > +		break;
> > +	}
> > +
> > +	case ARCH_ID_AT91RM9200:
> > +		at91_soc_data.type = SOC_RM9200;
> > +		set_at91_boot_soc(at91rm9200_soc);
> > +		break;
> > +
> > +	case ARCH_ID_AT91SAM9260:
> > +		at91_soc_data.type = SOC_SAM9260;
> > +		set_at91_boot_soc(at91sam9260_soc);
> > +		break;
> > +
> > +	case ARCH_ID_AT91SAM9261:
> > +		at91_soc_data.type = SOC_SAM9261;
> > +		set_at91_boot_soc(at91sam9261_soc);
 > +
> > +	if (at91_soc_data.type == SOC_AT91_NONE)
> > +		return;
> > +
> > +	at91_soc_data.cidr = cidr;
> 
> Why not directly assign this to at91_soc_data.cidr above and remove the
> cidr local variable?
because I prefer to udpate the global struct only if we detect the soc
> 
> > +
> > +	/* sub version of soc */
> > +	at91_soc_data.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
> > +

> > +		case ARCH_EXID_AT91SAM9M11:
> > +			at91_soc_data.subtype = SOC_SAM9M11;
> > +			break;
> > +		}
> 
> If we reused the ARCH_EXID_ defines, then the above could become:
> 
> 	at91_soc_data.subtype = at91_soc_data.exid;
as sais in the commint comment to have a uniq subtype accross soc as example
g35 and 9m11 have the same exid
> 

> > +
> > +const char *get_at91_soc_type(struct at91_socinfo *c)
> > +{
> 
> Should probably be called at91_get_soc_type_name. Get get_type implies
> it will return the enum type value. I think the at91 prefix belongs at
> the start also.
> 
> Also, since at91_boot_soc is __initdata, the soc_name array should also
> be __initdata and this function should be __init.
no this data will be use for sysfs export later
and at91_soc_data is not __initdata
> 
> > +
> > +	if (at91_soc_data.type == SOC_AT91_NONE)
> > +		panic("AT91: Impossible to detect the SOC type");
> > +
> > +	pr_info("AT91: Detected soc type: %s\n", get_at91_soc_type(&at91_soc_data));
> > +	pr_info("AT91: Detected soc subtype: %s\n", get_at91_soc_subtype(&at91_soc_data));
> > +
> > +	if (!at91_boot_soc.init)
> > +		panic("AT91: Soc not enabled");
> 
> I would still like to see if it is possible to reorder these patches so
> that this intermediate rewrite is not needed.
there is none intermedaite write
> 
> >  
> >  	if (at91_boot_soc.map_io)
> >  		at91_boot_soc.map_io();
> > diff --git a/arch/arm/mach-at91/soc.h b/arch/arm/mach-at91/soc.h
> > index d847565..1125671 100644
> > --- a/arch/arm/mach-at91/soc.h
> > +++ b/arch/arm/mach-at91/soc.h
> > @@ -20,3 +20,41 @@ extern struct at91_soc at91sam9263_soc;
> >  extern struct at91_soc at91sam9g45_soc;
> >  extern struct at91_soc at91sam9rl_soc;
> >  extern struct at91_soc at91sam9x5_soc;
> > +
> > +#define set_at91_boot_soc(c) do { at91_boot_soc = c; } while(0)
> 
> Should be a static inline function.
a macro is fine here
> 
> > +
> > +#if !defined(CONFIG_ARCH_AT572D940HF)
> > +#define at572d940hf_soc	at91_boot_soc
> > +#endif
> 
> Possibly this needs to be reworked a little so that the user gets an
> informative if the soc type is detected correctly, but support for the
> soc is not included in the kernel?
it's already the case

Best Regards,
J.



More information about the linux-arm-kernel mailing list