static irqreturn_t stylus_updown(int irqno, void *param) { unsigned long data0; unsigned long data1; int updown; data0 = readl(ts_base + S3C_ADCDAT0); data1 = readl(ts_base + S3C_ADCDAT1); updown = (!(data0 & S3C_ADCDAT0_UPDOWN)) && (!(data1 & S3C_ADCDAT1_UPDOWN)); /* TODO we should never get an interrupt with updown set while * the timer is running, but maybe we ought to verify that the * timer isn't running anyways. */ if (updown) touch_timer_fire(0); if (ts->s3c_adc_con == ADC_TYPE_2) { __raw_writel(0x0, ts_base + S3C_ADCCLRWK); __raw_writel(0x0, ts_base + S3C_ADCCLRINT); } return IRQ_HANDLED; }
static void s3c2410_intc_stylus_updown(void) { rt_uint32_t data0; rt_uint32_t data1; int updown; data0 = ADCDAT0; data1 = ADCDAT1; updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); /* rt_kprintf("stylus: %s\n", updown? "down" : "up"); */ if (updown) { touch_timer_fire(0); } else { /* stop timer */ rt_timer_stop(touch->poll_timer); touch->first_down_report = RT_TRUE; if (ts.xp >= 0 && ts.yp >= 0) { report_touch_input(updown); } ts.count = 0; ADCTSC = WAIT4INT(0); } SUBSRCPND |= BIT_SUB_TC; }