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;
}
Exemple #2
0
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;
}