Am Montag, 26. November 2012, 10:43:21 schrieb Alexander Varnin: > S3C2443 CPU has a problem with incorrect reading from EXTINTn > registers. So s3c_irqext_type function wrongly modifies them. > So add special check to s3c_irqext_type, to handle this case. > > Signed-off-by: Alexander Varnin <fenixk19@xxxxxxx> Acked-by: Heiko Stuebner <heiko@xxxxxxxxx> > --- > styling and comment fixes > arch/arm/plat-s3c24xx/irq.c | 25 +++++++++++++++++++++++++ > 1 files changed, 25 insertions(+), 0 deletions(-) > > diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c > index fe57bbb..b05c573 100644 > --- a/arch/arm/plat-s3c24xx/irq.c > +++ b/arch/arm/plat-s3c24xx/irq.c > @@ -219,6 +219,31 @@ s3c_irqext_type(struct irq_data *data, unsigned int > type) } > > value = __raw_readl(extint_reg); > + > + /* > + * S3C2443 CPU has a problem with EXTINTn registers. > + * Essentially register-reads return transformed data, but the write > + * is done according to the datasheet. > + * > + * Fix this by transforming the read data to the correct format. > + * > + * For details refer to the document "S3C2443 GUIDE TO EXTRA GPIO" > + */ > + if (soc_is_s3c2443()) { > + int i; > + int 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; > + } > + > value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset); > __raw_writel(value, extint_reg); -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html