Lines Matching +full:ir +full:- +full:spi +full:- +full:led

1 // SPDX-License-Identifier: GPL-2.0
2 // SPI driven IR LED device driver
13 #include <linux/spi/spi.h>
14 #include <media/rc-core.h>
16 #define IR_SPI_DRIVER_NAME "ir-spi"
30 struct spi_device *spi; member
40 struct ir_spi_data *idata = dev->priv; in ir_spi_tx()
49 periods = DIV_ROUND_CLOSEST(buffer[i] * idata->freq, 1000000); in ir_spi_tx()
52 return -EINVAL; in ir_spi_tx()
59 val = (i % 2) ? idata->space : idata->pulse; in ir_spi_tx()
61 idata->tx_buf[len++] = val; in ir_spi_tx()
66 xfer.speed_hz = idata->freq * 16; in ir_spi_tx()
67 xfer.len = len * sizeof(*idata->tx_buf); in ir_spi_tx()
68 xfer.tx_buf = idata->tx_buf; in ir_spi_tx()
70 ret = regulator_enable(idata->regulator); in ir_spi_tx()
74 ret = spi_sync_transfer(idata->spi, &xfer, 1); in ir_spi_tx()
76 dev_err(&idata->spi->dev, "unable to deliver the signal\n"); in ir_spi_tx()
78 regulator_disable(idata->regulator); in ir_spi_tx()
85 struct ir_spi_data *idata = dev->priv; in ir_spi_set_tx_carrier()
88 return -EINVAL; in ir_spi_set_tx_carrier()
90 idata->freq = carrier; in ir_spi_set_tx_carrier()
97 struct ir_spi_data *idata = dev->priv; in ir_spi_set_duty_cycle()
100 idata->pulse = GENMASK(bits, 0); in ir_spi_set_duty_cycle()
102 if (idata->negated) { in ir_spi_set_duty_cycle()
103 idata->pulse = ~idata->pulse; in ir_spi_set_duty_cycle()
104 idata->space = 0xffff; in ir_spi_set_duty_cycle()
106 idata->space = 0; in ir_spi_set_duty_cycle()
112 static int ir_spi_probe(struct spi_device *spi) in ir_spi_probe() argument
118 idata = devm_kzalloc(&spi->dev, sizeof(*idata), GFP_KERNEL); in ir_spi_probe()
120 return -ENOMEM; in ir_spi_probe()
122 idata->regulator = devm_regulator_get(&spi->dev, "irda_regulator"); in ir_spi_probe()
123 if (IS_ERR(idata->regulator)) in ir_spi_probe()
124 return PTR_ERR(idata->regulator); in ir_spi_probe()
126 idata->rc = devm_rc_allocate_device(&spi->dev, RC_DRIVER_IR_RAW_TX); in ir_spi_probe()
127 if (!idata->rc) in ir_spi_probe()
128 return -ENOMEM; in ir_spi_probe()
130 idata->rc->tx_ir = ir_spi_tx; in ir_spi_probe()
131 idata->rc->s_tx_carrier = ir_spi_set_tx_carrier; in ir_spi_probe()
132 idata->rc->s_tx_duty_cycle = ir_spi_set_duty_cycle; in ir_spi_probe()
133 idata->rc->device_name = "IR SPI"; in ir_spi_probe()
134 idata->rc->driver_name = IR_SPI_DRIVER_NAME; in ir_spi_probe()
135 idata->rc->priv = idata; in ir_spi_probe()
136 idata->spi = spi; in ir_spi_probe()
138 idata->negated = of_property_read_bool(spi->dev.of_node, in ir_spi_probe()
139 "led-active-low"); in ir_spi_probe()
140 ret = of_property_read_u8(spi->dev.of_node, "duty-cycle", &dc); in ir_spi_probe()
146 * rc->s_tx_duty_cycle function in ir_spi_probe()
148 ir_spi_set_duty_cycle(idata->rc, dc); in ir_spi_probe()
150 idata->freq = IR_SPI_DEFAULT_FREQUENCY; in ir_spi_probe()
152 return devm_rc_register_device(&spi->dev, idata->rc); in ir_spi_probe()
156 { .compatible = "ir-spi-led" },
162 { "ir-spi-led" },
165 MODULE_DEVICE_TABLE(spi, ir_spi_ids);
179 MODULE_DESCRIPTION("SPI IR LED");