sorry, forgot half of it [inline]
Am Freitag, 23. November 2012, 08:10:15 schrieb Alexander Varnin:
> Please take a look at this document. It describes the problem with
> EXTINTn registers on 2443.
> In fact, the irqext_set function for s3c2443 differs from common
> starting from "//Hack for 2443 error workaround" comment.
wow ... this is a crazy bug :-)
[...]
> >> diff --git a/arch/arm/mach-s3c24xx/s3c2443.c
> >> b/arch/arm/mach-s3c24xx/s3c2443.c index ab648ad..99eef31 100644
> >> --- a/arch/arm/mach-s3c24xx/s3c2443.c
> >> +++ b/arch/arm/mach-s3c24xx/s3c2443.c
[...]
> >> +#if defined(CONFIG_CPU_S3C2443)
> >> +int
> >> +s3c2443_irqext_type(struct irq_data *data, unsigned int type)
> >> +{
[...]
> >> + value = __raw_readl(extint_reg);
> >> + //Hack for 2443 error workaround
> >> + fixed = 0;
> >> + if(extint_reg == S3C24XX_EXTINT1 || extint_reg == S3C24XX_EXTINT2)
> >> + for(i=0; i<7;i++)
> >> + fixed |= (((value >> ((7-i)*4+1)) & 7) | ((value >> ((7-
i)*4-3))
> >> & 8)) << i*4; + else
> >> + for(i=0; i<7;i++)
> >> + fixed |= ( (value >> (7-i)*4) & 0xf ) << i*4;
> >> + fixed |= (((value>>1) & 7) | ((value<<3) & 8)) << 27;
> >> + value = fixed;
> >
> > What does this do or what should it do? Also it gets calculated but
> > never used?
> >
> > And please use scripts/checkpatch.pl to verify your patch follows
> > coding guidelines, as this block is especially hard to read.
So essentially register-reads somehow returned transformed data, but the write
is done according to the datasheet.
It would definitely be better to integrate it into the existing _irqext_type
function instead of introducing a second one.
The cpu_id is present in the samsung_cpu_id var and the list of cpus including
the s3c2443 can be found in common.c. With this it would be possible to
identify when the irq code is run on a s3c2443 machine and the original
_irqext_type function could change the behaviour accordingly.
Not sure if it would make sense to introduce soc_is_s3c2443() etc macros for
this.
And of course the actual block doing the transformation on read would need a
more elaborate comment on the why and how, because in 3 years someone might
not directly see what this does and why it was necessary.
> >> + value = (value & ~(7 << extint_offset)) | (newvalue <<
extint_offset);
> >> + __raw_writel(value, extint_reg);
> >> +
> >> + return 0;
> >> +}
> >> +#endif //defined(CONFIG_CPU_S3C2443)
> >>
> >> static struct irq_chip s3c_irqext_chip = {
> >>
> >> .name = "s3c-ext",
> >> .irq_mask = s3c_irqext_mask,
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html