static int sm5502_int_init(struct sm5502_usbsw *usbsw) { struct i2c_client *client = usbsw->client; int ret; u8 intr1, intr2, val; INIT_WORK(&usbsw->work, sm5502_work_cb); ret = gpio_request(pxa_irq_to_gpio(client->irq), "sm5502 irq"); if (ret) { dev_err(&client->dev, "Unable to get gpio %d\n", client->irq); goto gpio_out; } gpio_direction_input(pxa_irq_to_gpio(client->irq)); ret = request_irq(client->irq, microusb_irq_handler, IRQF_NO_SUSPEND | IRQF_TRIGGER_FALLING, "sm5502 micro USB", usbsw); if (ret) { dev_err(&client->dev, "Unable to get IRQ %d\n", client->irq); goto out; } /* Read and Clear INTERRUPT1,2 REGS */ mutex_lock(&usbsw->mutex); read_reg(client, REG_INT1, &intr1); read_reg(client, REG_INT2, &intr2); mutex_unlock(&usbsw->mutex); if ( intr1 & OVP_EVENT_M ) { mutex_lock(&usbsw->mutex); read_reg(client, REG_CTRL, &val); mutex_unlock(&usbsw->mutex); if ( val == 0x1F ) { mutex_lock(&usbsw->mutex); sm5502_reg_init(usbsw); mutex_unlock(&usbsw->mutex); return; } } if ((usbsw->dev1 != 0 || usbsw->dev2 != 0 || usbsw->dev3 != 0) && (intr1 == 0 && intr2 == 0)) { dev_err(&client->dev, "Accs inserted but no data on int regs\n"); } return 0; gpio_out: gpio_free(pxa_irq_to_gpio(client->irq)); out: return ret; }
static int pxa25x_set_wake(struct irq_data *d, unsigned int on) { int gpio = pxa_irq_to_gpio(d->irq); uint32_t mask = 0; if (gpio >= 0 && gpio < 85) return gpio_set_wake(gpio, on); if (d->irq == IRQ_RTCAlrm) { mask = PWER_RTC; goto set_pwer; } return -EINVAL; set_pwer: if (on) PWER |= mask; else PWER &=~mask; return 0; }