Hello.
I found out what was the problem with the "less touchscreen events" patch for
2.6.39-nodrm.
I have found thet the most important function pointers in this patch where not
initialized, unlike the patch for 2.6.37.
Now I have usable toucscreen without panics....
the correct patch is attached.
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
index 6f82f5a..0ee315d 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -110,6 +110,7 @@
#include <linux/jbt6k74.h>
#include <linux/glamofb.h>
#include <linux/mfd/glamo.h>
+#include <linux/mfd/glamo-core.h>
static struct pcf50633 *gta02_pcf;
@@ -950,11 +951,31 @@ static struct s3c2410_hcd_info gta02_usb_info __initdata = {
},
};
+static int glamo_slowed = 0;
+
+static void gta02_ts_hook_before_adc ()
+{
+ if (!glamo_slowed) {
+ glamo_slowed = 1;
+ glamo_pixclock_slow(dev_get_drvdata (>a02_glamo_dev.dev));
+ }
+};
+
+static void gta02_ts_hook_after_adc ()
+{
+ if (glamo_slowed) {
+ glamo_slowed = 0;
+ glamo_pixclock_fast(dev_get_drvdata (>a02_glamo_dev.dev));
+ }
+};
+
/* Touchscreen */
static struct s3c2410_ts_mach_info gta02_ts_info = {
- .delay = 10000,
+ .delay = 1000,
.presc = 0xff, /* slow as we can go */
- .oversampling_shift = 2,
+ .oversampling_shift = 2, /* 2.6.37 had 0 */
+ .before_adc_hook = gta02_ts_hook_before_adc,
+ .after_adc_hook = gta02_ts_hook_after_adc,
};
/* Buttons */
diff --git a/arch/arm/plat-samsung/include/plat/ts.h b/arch/arm/plat-samsung/include/plat/ts.h
index 26fdb22..f475349 100644
--- a/arch/arm/plat-samsung/include/plat/ts.h
+++ b/arch/arm/plat-samsung/include/plat/ts.h
@@ -15,6 +15,8 @@ struct s3c2410_ts_mach_info {
int presc;
int oversampling_shift;
void (*cfg_gpio)(struct platform_device *dev);
+ void (*before_adc_hook)(void);
+ void (*after_adc_hook)(void);
};
extern void s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *);
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
index 8feb7f3..8992ce3 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -85,6 +85,10 @@ struct s3c2410ts {
int count;
int shift;
int features;
+#ifdef CONFIG_MACH_NEO1973_GTA02
+ void (*before_adc_hook)(void);
+ void (*after_adc_hook)(void);
+#endif
};
static struct s3c2410ts ts;
@@ -133,6 +137,9 @@ static void touch_timer_fire(unsigned long data)
ts.count = 0;
}
+#ifdef CONFIG_MACH_NEO1973_GTA02
+ ts.before_adc_hook();
+#endif
s3c_adc_start(ts.client, 0, 1 << ts.shift);
} else {
ts.xp = 0;
@@ -170,9 +177,9 @@ static irqreturn_t stylus_irq(int irq, void *dev_id)
* the timer is running, but maybe we ought to verify that the
* timer isn't running anyways. */
- if (down)
- s3c_adc_start(ts.client, 0, 1 << ts.shift);
- else
+ if (down) {
+ mod_timer(&touch_timer, jiffies + 2);
+ } else
dev_dbg(ts.dev, "%s: count=%d\n", __func__, ts.count);
if (ts.features & FEAT_PEN_IRQ) {
@@ -203,6 +210,11 @@ static void s3c24xx_ts_conversion(struct s3c_adc_client *client,
ts.count++;
+#ifdef CONFIG_MACH_NEO1973_GTA02
+ if (!*left)
+ ts.after_adc_hook();
+#endif
+
/* From tests, it seems that it is unlikely to get a pen-up
* event during the conversion process which means we can
* ignore any pen-up events with less than the requisite
@@ -226,7 +238,7 @@ static void s3c24xx_ts_select(struct s3c_adc_client *client, unsigned select)
writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
ts.io + S3C2410_ADCTSC);
} else {
- mod_timer(&touch_timer, jiffies+1);
+ mod_timer(&touch_timer, jiffies + 3);
writel(WAIT4INT | INT_UP, ts.io + S3C2410_ADCTSC);
}
}
@@ -328,6 +340,11 @@ static int __devinit s3c2410ts_probe(struct platform_device *pdev)
ts.shift = info->oversampling_shift;
ts.features = platform_get_device_id(pdev)->driver_data;
+#ifdef CONFIG_MACH_NEO1973_GTA02
+ ts.before_adc_hook = info->before_adc_hook;
+ ts.after_adc_hook = info->after_adc_hook;
+#endif
+
ret = request_irq(ts.irq_tc, stylus_irq, IRQF_DISABLED,
"s3c2410_ts_pen", ts.input);
if (ret) {
diff --git a/drivers/mfd/glamo-core.c b/drivers/mfd/glamo-core.c
index c9b2ae5..9fd6076 100644
--- a/drivers/mfd/glamo-core.c
+++ b/drivers/mfd/glamo-core.c
@@ -160,6 +160,19 @@ static void reg_set_bit_mask(struct glamo_core *glamo,
spin_unlock(&glamo->lock);
}
+
+
+static void reg_checkandset_bit_mask(struct glamo_core *glamo,
+ uint16_t reg, uint16_t mask,
+ uint16_t val, uint16_t check)
+{
+ spin_lock(&glamo->lock);
+ if (__reg_read(glamo, reg) & mask == check)
+ __reg_set_bit_mask(glamo, reg, mask, val);
+ spin_unlock(&glamo->lock);
+}
+
+
static inline void __reg_set_bit(struct glamo_core *glamo,
uint16_t reg, uint16_t bit)
{
@@ -169,6 +182,49 @@ static inline void __reg_set_bit(struct glamo_core *glamo,
__reg_write(glamo, reg, tmp);
}
+void glamo_pixclock_slow (struct glamo_core *glamo)
+{
+
+ int x, lastx = 0;
+ int timeout = 1000000;
+ int threshold = 5;
+ int fa;
+
+ int evcnt = 0;
+
+ for (fa = 0; fa < timeout; fa++) {
+ x = glamo_reg_read(glamo, 0x1100 + GLAMO_REG_LCD_STATUS1) & 0x3ff;
+
+
+ if (x == lastx) {
+ evcnt++;
+ if (evcnt == threshold)
+ break;
+ } else {
+ evcnt = 0;
+ lastx = x;
+ }
+ }
+ if (fa == timeout) {
+ printk (KERN_WARNING "Glamo: Error waiting for stable x position.\n");
+ }
+
+ /* then, make glamo slower */
+ /* it's not a problems if in rare case we do not slow down glamo properly
+ as all we'll get in that case is singe jittered value */
+
+ glamo->slowed_divider = glamo_reg_read (glamo, 0x36) & 0xFF;
+ reg_set_bit_mask (glamo, 0x36, 0xFF, 0xFF);
+
+}
+
+void glamo_pixclock_fast (struct glamo_core *glamo)
+{
+ reg_checkandset_bit_mask (glamo, 0x36, 0xFF, glamo->slowed_divider, 0xFF);
+}
+EXPORT_SYMBOL_GPL(glamo_pixclock_fast);
+EXPORT_SYMBOL_GPL(glamo_pixclock_slow);
+
static inline void __reg_clear_bit(struct glamo_core *glamo,
uint16_t reg, uint16_t bit)
{
@@ -901,6 +957,7 @@ static int __devinit glamo_probe(struct platform_device *pdev)
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
glamo->irq = platform_get_irq(pdev, 0);
glamo->pdata = pdev->dev.platform_data;
+ glamo->slowed_divider = 0xFF;
if (glamo->irq < 0) {
ret = glamo->irq;
@@ -938,7 +995,7 @@ static int __devinit glamo_probe(struct platform_device *pdev)
goto err_irq_free_descs;
}
- glamo->base = ioremap(glamo->mem->start, resource_size(glamo->mem));
+ glamo->base = ioremap(glamo->mem->start, resource_size(glamo->mem)+0x1100);
if (!glamo->base) {
dev_err(&pdev->dev, "Failed to ioremap() memory region\n");
goto err_release_mem_region;
diff --git a/include/linux/mfd/glamo-core.h b/include/linux/mfd/glamo-core.h
index 8275a2f..8e3e56e 100644
--- a/include/linux/mfd/glamo-core.h
+++ b/include/linux/mfd/glamo-core.h
@@ -37,6 +37,7 @@ struct glamo_core {
enum glamo_engine_state engine_state[__NUM_GLAMO_ENGINES];
spinlock_t lock;
uint16_t saved_irq_mask;
+ int slowed_divider;
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_dir;
#endif
@@ -55,4 +56,6 @@ int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine);
void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine);
int glamo_engine_reclock(struct glamo_core *glamo,
enum glamo_engine engine, int ps);
+void glamo_pixclock_slow (struct glamo_core *glamo);
+void glamo_pixclock_fast (struct glamo_core *glamo);
#endif /* __GLAMO_CORE_H */
_______________________________________________
Shr-devel mailing list
[email protected]
http://lists.shr-project.org/mailman/listinfo/shr-devel