static irqreturn_t pxa930_trkball_interrupt(int irq, void *dev_id) { struct pxa930_trkball *trkball = dev_id; struct input_dev *input = trkball->input; int tbcntr, x, y; /* According to the spec software must read TBCNTR twice: * if the read value is the same, the reading is valid */ tbcntr = __raw_readl(trkball->mmio_base + TBCNTR); if (tbcntr == __raw_readl(trkball->mmio_base + TBCNTR)) { x = (TBCNTR_XP(tbcntr) - TBCNTR_XM(tbcntr)) / 2; y = (TBCNTR_YP(tbcntr) - TBCNTR_YM(tbcntr)) / 2; input_report_rel(input, REL_X, x); input_report_rel(input, REL_Y, y); input_sync(input); } __raw_writel(TBSBC_TBSBC, trkball->mmio_base + TBSBC); __raw_writel(0, trkball->mmio_base + TBSBC); return IRQ_HANDLED; }
static irqreturn_t pxa930_trkball_interrupt(int irq, void *dev_id) { struct pxa930_trkball *trkball = dev_id; struct input_dev *input = trkball->input; int tbcntr, x, y; /* */ tbcntr = __raw_readl(trkball->mmio_base + TBCNTR); if (tbcntr == __raw_readl(trkball->mmio_base + TBCNTR)) { x = (TBCNTR_XP(tbcntr) - TBCNTR_XM(tbcntr)) / 2; y = (TBCNTR_YP(tbcntr) - TBCNTR_YM(tbcntr)) / 2; input_report_rel(input, REL_X, x); input_report_rel(input, REL_Y, y); input_sync(input); } __raw_writel(TBSBC_TBSBC, trkball->mmio_base + TBSBC); __raw_writel(0, trkball->mmio_base + TBSBC); return IRQ_HANDLED; }