static int stm32_lptim_setup_trig(struct stm32_lptim_trigger *priv) { struct iio_trigger *trig; trig = devm_iio_trigger_alloc(priv->dev, "%s", priv->trg); if (!trig) return -ENOMEM; trig->dev.parent = priv->dev->parent; trig->ops = &stm32_lptim_trigger_ops; iio_trigger_set_drvdata(trig, priv); return devm_iio_trigger_register(priv->dev, trig); }
static int mma8452_trigger_setup(struct iio_dev *indio_dev) { struct mma8452_data *data = iio_priv(indio_dev); struct iio_trigger *trig; int ret; trig = devm_iio_trigger_alloc(&data->client->dev, "%s-dev%d", indio_dev->name, indio_dev->id); if (!trig) return -ENOMEM; trig->dev.parent = &data->client->dev; trig->ops = &mma8452_trigger_ops; iio_trigger_set_drvdata(trig, indio_dev); ret = iio_trigger_register(trig); if (ret) return ret; indio_dev->trig = trig; return 0; }
static int mpu3050_trigger_probe(struct iio_dev *indio_dev, int irq) { struct mpu3050 *mpu3050 = iio_priv(indio_dev); unsigned long irq_trig; int ret; mpu3050->trig = devm_iio_trigger_alloc(&indio_dev->dev, "%s-dev%d", indio_dev->name, indio_dev->id); if (!mpu3050->trig) return -ENOMEM; /* Check if IRQ is open drain */ if (of_property_read_bool(mpu3050->dev->of_node, "drive-open-drain")) mpu3050->irq_opendrain = true; irq_trig = irqd_get_trigger_type(irq_get_irq_data(irq)); /* * Configure the interrupt generator hardware to supply whatever * the interrupt is configured for, edges low/high level low/high, * we can provide it all. */ switch (irq_trig) { case IRQF_TRIGGER_RISING: dev_info(&indio_dev->dev, "pulse interrupts on the rising edge\n"); break; case IRQF_TRIGGER_FALLING: mpu3050->irq_actl = true; dev_info(&indio_dev->dev, "pulse interrupts on the falling edge\n"); break; case IRQF_TRIGGER_HIGH: mpu3050->irq_latch = true; dev_info(&indio_dev->dev, "interrupts active high level\n"); /* * With level IRQs, we mask the IRQ until it is processed, * but with edge IRQs (pulses) we can queue several interrupts * in the top half. */ irq_trig |= IRQF_ONESHOT; break; case IRQF_TRIGGER_LOW: mpu3050->irq_latch = true; mpu3050->irq_actl = true; irq_trig |= IRQF_ONESHOT; dev_info(&indio_dev->dev, "interrupts active low level\n"); break; default: /* This is the most preferred mode, if possible */ dev_err(&indio_dev->dev, "unsupported IRQ trigger specified (%lx), enforce " "rising edge\n", irq_trig); irq_trig = IRQF_TRIGGER_RISING; break; } /* An open drain line can be shared with several devices */ if (mpu3050->irq_opendrain) irq_trig |= IRQF_SHARED; ret = request_threaded_irq(irq, mpu3050_irq_handler, mpu3050_irq_thread, irq_trig, mpu3050->trig->name, mpu3050->trig); if (ret) { dev_err(mpu3050->dev, "can't get IRQ %d, error %d\n", irq, ret); return ret; } mpu3050->irq = irq; mpu3050->trig->dev.parent = mpu3050->dev; mpu3050->trig->ops = &mpu3050_trigger_ops; iio_trigger_set_drvdata(mpu3050->trig, indio_dev); ret = iio_trigger_register(mpu3050->trig); if (ret) return ret; indio_dev->trig = iio_trigger_get(mpu3050->trig); return 0; }