0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/bitfield.h>
0009 #include <linux/bits.h>
0010 #include <linux/clk.h>
0011 #include <linux/device.h>
0012 #include <linux/iio/iio.h>
0013 #include <linux/module.h>
0014 #include <linux/mod_devicetable.h>
0015 #include <linux/notifier.h>
0016 #include <linux/property.h>
0017 #include <linux/regulator/consumer.h>
0018 #include <linux/spi/spi.h>
0019 #include <linux/units.h>
0020
0021 #include <asm/unaligned.h>
0022
0023
0024 #define ADMV1013_REG_SPI_CONTROL 0x00
0025 #define ADMV1013_REG_ALARM 0x01
0026 #define ADMV1013_REG_ALARM_MASKS 0x02
0027 #define ADMV1013_REG_ENABLE 0x03
0028 #define ADMV1013_REG_LO_AMP_I 0x05
0029 #define ADMV1013_REG_LO_AMP_Q 0x06
0030 #define ADMV1013_REG_OFFSET_ADJUST_I 0x07
0031 #define ADMV1013_REG_OFFSET_ADJUST_Q 0x08
0032 #define ADMV1013_REG_QUAD 0x09
0033 #define ADMV1013_REG_VVA_TEMP_COMP 0x0A
0034
0035
0036 #define ADMV1013_PARITY_EN_MSK BIT(15)
0037 #define ADMV1013_SPI_SOFT_RESET_MSK BIT(14)
0038 #define ADMV1013_CHIP_ID_MSK GENMASK(11, 4)
0039 #define ADMV1013_CHIP_ID 0xA
0040 #define ADMV1013_REVISION_ID_MSK GENMASK(3, 0)
0041
0042
0043 #define ADMV1013_PARITY_ERROR_MSK BIT(15)
0044 #define ADMV1013_TOO_FEW_ERRORS_MSK BIT(14)
0045 #define ADMV1013_TOO_MANY_ERRORS_MSK BIT(13)
0046 #define ADMV1013_ADDRESS_RANGE_ERROR_MSK BIT(12)
0047
0048
0049 #define ADMV1013_VGA_PD_MSK BIT(15)
0050 #define ADMV1013_MIXER_PD_MSK BIT(14)
0051 #define ADMV1013_QUAD_PD_MSK GENMASK(13, 11)
0052 #define ADMV1013_BG_PD_MSK BIT(10)
0053 #define ADMV1013_MIXER_IF_EN_MSK BIT(7)
0054 #define ADMV1013_DET_EN_MSK BIT(5)
0055
0056
0057 #define ADMV1013_LOAMP_PH_ADJ_FINE_MSK GENMASK(13, 7)
0058 #define ADMV1013_MIXER_VGATE_MSK GENMASK(6, 0)
0059
0060
0061 #define ADMV1013_MIXER_OFF_ADJ_P_MSK GENMASK(15, 9)
0062 #define ADMV1013_MIXER_OFF_ADJ_N_MSK GENMASK(8, 2)
0063
0064
0065 #define ADMV1013_QUAD_SE_MODE_MSK GENMASK(9, 6)
0066 #define ADMV1013_QUAD_FILTERS_MSK GENMASK(3, 0)
0067
0068
0069 #define ADMV1013_VVA_TEMP_COMP_MSK GENMASK(15, 0)
0070
0071
0072 #define ADMV1013_READ BIT(7)
0073 #define ADMV1013_REG_ADDR_READ_MSK GENMASK(6, 1)
0074 #define ADMV1013_REG_ADDR_WRITE_MSK GENMASK(22, 17)
0075 #define ADMV1013_REG_DATA_MSK GENMASK(16, 1)
0076
0077 enum {
0078 ADMV1013_IQ_MODE,
0079 ADMV1013_IF_MODE
0080 };
0081
0082 enum {
0083 ADMV1013_RFMOD_I_CALIBPHASE,
0084 ADMV1013_RFMOD_Q_CALIBPHASE,
0085 };
0086
0087 enum {
0088 ADMV1013_SE_MODE_POS = 6,
0089 ADMV1013_SE_MODE_NEG = 9,
0090 ADMV1013_SE_MODE_DIFF = 12
0091 };
0092
0093 struct admv1013_state {
0094 struct spi_device *spi;
0095 struct clk *clkin;
0096
0097 struct mutex lock;
0098 struct regulator *reg;
0099 struct notifier_block nb;
0100 unsigned int input_mode;
0101 unsigned int quad_se_mode;
0102 bool det_en;
0103 u8 data[3] __aligned(IIO_DMA_MINALIGN);
0104 };
0105
0106 static int __admv1013_spi_read(struct admv1013_state *st, unsigned int reg,
0107 unsigned int *val)
0108 {
0109 int ret;
0110 struct spi_transfer t = {0};
0111
0112 st->data[0] = ADMV1013_READ | FIELD_PREP(ADMV1013_REG_ADDR_READ_MSK, reg);
0113 st->data[1] = 0x0;
0114 st->data[2] = 0x0;
0115
0116 t.rx_buf = &st->data[0];
0117 t.tx_buf = &st->data[0];
0118 t.len = 3;
0119
0120 ret = spi_sync_transfer(st->spi, &t, 1);
0121 if (ret)
0122 return ret;
0123
0124 *val = FIELD_GET(ADMV1013_REG_DATA_MSK, get_unaligned_be24(&st->data[0]));
0125
0126 return ret;
0127 }
0128
0129 static int admv1013_spi_read(struct admv1013_state *st, unsigned int reg,
0130 unsigned int *val)
0131 {
0132 int ret;
0133
0134 mutex_lock(&st->lock);
0135 ret = __admv1013_spi_read(st, reg, val);
0136 mutex_unlock(&st->lock);
0137
0138 return ret;
0139 }
0140
0141 static int __admv1013_spi_write(struct admv1013_state *st,
0142 unsigned int reg,
0143 unsigned int val)
0144 {
0145 put_unaligned_be24(FIELD_PREP(ADMV1013_REG_DATA_MSK, val) |
0146 FIELD_PREP(ADMV1013_REG_ADDR_WRITE_MSK, reg), &st->data[0]);
0147
0148 return spi_write(st->spi, &st->data[0], 3);
0149 }
0150
0151 static int admv1013_spi_write(struct admv1013_state *st, unsigned int reg,
0152 unsigned int val)
0153 {
0154 int ret;
0155
0156 mutex_lock(&st->lock);
0157 ret = __admv1013_spi_write(st, reg, val);
0158 mutex_unlock(&st->lock);
0159
0160 return ret;
0161 }
0162
0163 static int __admv1013_spi_update_bits(struct admv1013_state *st, unsigned int reg,
0164 unsigned int mask, unsigned int val)
0165 {
0166 int ret;
0167 unsigned int data, temp;
0168
0169 ret = __admv1013_spi_read(st, reg, &data);
0170 if (ret)
0171 return ret;
0172
0173 temp = (data & ~mask) | (val & mask);
0174
0175 return __admv1013_spi_write(st, reg, temp);
0176 }
0177
0178 static int admv1013_spi_update_bits(struct admv1013_state *st, unsigned int reg,
0179 unsigned int mask, unsigned int val)
0180 {
0181 int ret;
0182
0183 mutex_lock(&st->lock);
0184 ret = __admv1013_spi_update_bits(st, reg, mask, val);
0185 mutex_unlock(&st->lock);
0186
0187 return ret;
0188 }
0189
0190 static int admv1013_read_raw(struct iio_dev *indio_dev,
0191 struct iio_chan_spec const *chan,
0192 int *val, int *val2, long info)
0193 {
0194 struct admv1013_state *st = iio_priv(indio_dev);
0195 unsigned int data, addr;
0196 int ret;
0197
0198 switch (info) {
0199 case IIO_CHAN_INFO_CALIBBIAS:
0200 switch (chan->channel) {
0201 case IIO_MOD_I:
0202 addr = ADMV1013_REG_OFFSET_ADJUST_I;
0203 break;
0204 case IIO_MOD_Q:
0205 addr = ADMV1013_REG_OFFSET_ADJUST_Q;
0206 break;
0207 default:
0208 return -EINVAL;
0209 }
0210
0211 ret = admv1013_spi_read(st, addr, &data);
0212 if (ret)
0213 return ret;
0214
0215 if (!chan->channel)
0216 *val = FIELD_GET(ADMV1013_MIXER_OFF_ADJ_P_MSK, data);
0217 else
0218 *val = FIELD_GET(ADMV1013_MIXER_OFF_ADJ_N_MSK, data);
0219
0220 return IIO_VAL_INT;
0221 default:
0222 return -EINVAL;
0223 }
0224 }
0225
0226 static int admv1013_write_raw(struct iio_dev *indio_dev,
0227 struct iio_chan_spec const *chan,
0228 int val, int val2, long info)
0229 {
0230 struct admv1013_state *st = iio_priv(indio_dev);
0231 unsigned int addr, data, msk;
0232
0233 switch (info) {
0234 case IIO_CHAN_INFO_CALIBBIAS:
0235 switch (chan->channel2) {
0236 case IIO_MOD_I:
0237 addr = ADMV1013_REG_OFFSET_ADJUST_I;
0238 break;
0239 case IIO_MOD_Q:
0240 addr = ADMV1013_REG_OFFSET_ADJUST_Q;
0241 break;
0242 default:
0243 return -EINVAL;
0244 }
0245
0246 if (!chan->channel) {
0247 msk = ADMV1013_MIXER_OFF_ADJ_P_MSK;
0248 data = FIELD_PREP(ADMV1013_MIXER_OFF_ADJ_P_MSK, val);
0249 } else {
0250 msk = ADMV1013_MIXER_OFF_ADJ_N_MSK;
0251 data = FIELD_PREP(ADMV1013_MIXER_OFF_ADJ_N_MSK, val);
0252 }
0253
0254 return admv1013_spi_update_bits(st, addr, msk, data);
0255 default:
0256 return -EINVAL;
0257 }
0258 }
0259
0260 static ssize_t admv1013_read(struct iio_dev *indio_dev,
0261 uintptr_t private,
0262 const struct iio_chan_spec *chan,
0263 char *buf)
0264 {
0265 struct admv1013_state *st = iio_priv(indio_dev);
0266 unsigned int data, addr;
0267 int ret;
0268
0269 switch ((u32)private) {
0270 case ADMV1013_RFMOD_I_CALIBPHASE:
0271 addr = ADMV1013_REG_LO_AMP_I;
0272 break;
0273 case ADMV1013_RFMOD_Q_CALIBPHASE:
0274 addr = ADMV1013_REG_LO_AMP_Q;
0275 break;
0276 default:
0277 return -EINVAL;
0278 }
0279
0280 ret = admv1013_spi_read(st, addr, &data);
0281 if (ret)
0282 return ret;
0283
0284 data = FIELD_GET(ADMV1013_LOAMP_PH_ADJ_FINE_MSK, data);
0285
0286 return sysfs_emit(buf, "%u\n", data);
0287 }
0288
0289 static ssize_t admv1013_write(struct iio_dev *indio_dev,
0290 uintptr_t private,
0291 const struct iio_chan_spec *chan,
0292 const char *buf, size_t len)
0293 {
0294 struct admv1013_state *st = iio_priv(indio_dev);
0295 unsigned int data;
0296 int ret;
0297
0298 ret = kstrtou32(buf, 10, &data);
0299 if (ret)
0300 return ret;
0301
0302 data = FIELD_PREP(ADMV1013_LOAMP_PH_ADJ_FINE_MSK, data);
0303
0304 switch ((u32)private) {
0305 case ADMV1013_RFMOD_I_CALIBPHASE:
0306 ret = admv1013_spi_update_bits(st, ADMV1013_REG_LO_AMP_I,
0307 ADMV1013_LOAMP_PH_ADJ_FINE_MSK,
0308 data);
0309 if (ret)
0310 return ret;
0311 break;
0312 case ADMV1013_RFMOD_Q_CALIBPHASE:
0313 ret = admv1013_spi_update_bits(st, ADMV1013_REG_LO_AMP_Q,
0314 ADMV1013_LOAMP_PH_ADJ_FINE_MSK,
0315 data);
0316 if (ret)
0317 return ret;
0318 break;
0319 default:
0320 return -EINVAL;
0321 }
0322
0323 return ret ? ret : len;
0324 }
0325
0326 static int admv1013_update_quad_filters(struct admv1013_state *st)
0327 {
0328 unsigned int filt_raw;
0329 u64 rate = clk_get_rate(st->clkin);
0330
0331 if (rate >= (5400 * HZ_PER_MHZ) && rate <= (7000 * HZ_PER_MHZ))
0332 filt_raw = 15;
0333 else if (rate >= (5400 * HZ_PER_MHZ) && rate <= (8000 * HZ_PER_MHZ))
0334 filt_raw = 10;
0335 else if (rate >= (6600 * HZ_PER_MHZ) && rate <= (9200 * HZ_PER_MHZ))
0336 filt_raw = 5;
0337 else
0338 filt_raw = 0;
0339
0340 return __admv1013_spi_update_bits(st, ADMV1013_REG_QUAD,
0341 ADMV1013_QUAD_FILTERS_MSK,
0342 FIELD_PREP(ADMV1013_QUAD_FILTERS_MSK, filt_raw));
0343 }
0344
0345 static int admv1013_update_mixer_vgate(struct admv1013_state *st)
0346 {
0347 unsigned int vcm, mixer_vgate;
0348
0349 vcm = regulator_get_voltage(st->reg);
0350
0351 if (vcm < 1800000)
0352 mixer_vgate = (2389 * vcm / 1000000 + 8100) / 100;
0353 else if (vcm > 1800000 && vcm < 2600000)
0354 mixer_vgate = (2375 * vcm / 1000000 + 125) / 100;
0355 else
0356 return -EINVAL;
0357
0358 return __admv1013_spi_update_bits(st, ADMV1013_REG_LO_AMP_I,
0359 ADMV1013_MIXER_VGATE_MSK,
0360 FIELD_PREP(ADMV1013_MIXER_VGATE_MSK, mixer_vgate));
0361 }
0362
0363 static int admv1013_reg_access(struct iio_dev *indio_dev,
0364 unsigned int reg,
0365 unsigned int write_val,
0366 unsigned int *read_val)
0367 {
0368 struct admv1013_state *st = iio_priv(indio_dev);
0369
0370 if (read_val)
0371 return admv1013_spi_read(st, reg, read_val);
0372 else
0373 return admv1013_spi_write(st, reg, write_val);
0374 }
0375
0376 static const struct iio_info admv1013_info = {
0377 .read_raw = admv1013_read_raw,
0378 .write_raw = admv1013_write_raw,
0379 .debugfs_reg_access = &admv1013_reg_access,
0380 };
0381
0382 static int admv1013_freq_change(struct notifier_block *nb, unsigned long action, void *data)
0383 {
0384 struct admv1013_state *st = container_of(nb, struct admv1013_state, nb);
0385 int ret;
0386
0387 if (action == POST_RATE_CHANGE) {
0388 mutex_lock(&st->lock);
0389 ret = notifier_from_errno(admv1013_update_quad_filters(st));
0390 mutex_unlock(&st->lock);
0391 return ret;
0392 }
0393
0394 return NOTIFY_OK;
0395 }
0396
0397 #define _ADMV1013_EXT_INFO(_name, _shared, _ident) { \
0398 .name = _name, \
0399 .read = admv1013_read, \
0400 .write = admv1013_write, \
0401 .private = _ident, \
0402 .shared = _shared, \
0403 }
0404
0405 static const struct iio_chan_spec_ext_info admv1013_ext_info[] = {
0406 _ADMV1013_EXT_INFO("i_calibphase", IIO_SEPARATE, ADMV1013_RFMOD_I_CALIBPHASE),
0407 _ADMV1013_EXT_INFO("q_calibphase", IIO_SEPARATE, ADMV1013_RFMOD_Q_CALIBPHASE),
0408 { },
0409 };
0410
0411 #define ADMV1013_CHAN_PHASE(_channel, _channel2, _admv1013_ext_info) { \
0412 .type = IIO_ALTVOLTAGE, \
0413 .output = 0, \
0414 .indexed = 1, \
0415 .channel2 = _channel2, \
0416 .channel = _channel, \
0417 .differential = 1, \
0418 .ext_info = _admv1013_ext_info, \
0419 }
0420
0421 #define ADMV1013_CHAN_CALIB(_channel, rf_comp) { \
0422 .type = IIO_ALTVOLTAGE, \
0423 .output = 0, \
0424 .indexed = 1, \
0425 .channel = _channel, \
0426 .channel2 = IIO_MOD_##rf_comp, \
0427 .info_mask_separate = BIT(IIO_CHAN_INFO_CALIBBIAS), \
0428 }
0429
0430 static const struct iio_chan_spec admv1013_channels[] = {
0431 ADMV1013_CHAN_PHASE(0, 1, admv1013_ext_info),
0432 ADMV1013_CHAN_CALIB(0, I),
0433 ADMV1013_CHAN_CALIB(0, Q),
0434 ADMV1013_CHAN_CALIB(1, I),
0435 ADMV1013_CHAN_CALIB(1, Q),
0436 };
0437
0438 static int admv1013_init(struct admv1013_state *st)
0439 {
0440 int ret;
0441 unsigned int data;
0442 struct spi_device *spi = st->spi;
0443
0444
0445 ret = __admv1013_spi_update_bits(st, ADMV1013_REG_SPI_CONTROL,
0446 ADMV1013_SPI_SOFT_RESET_MSK,
0447 FIELD_PREP(ADMV1013_SPI_SOFT_RESET_MSK, 1));
0448 if (ret)
0449 return ret;
0450
0451 ret = __admv1013_spi_update_bits(st, ADMV1013_REG_SPI_CONTROL,
0452 ADMV1013_SPI_SOFT_RESET_MSK,
0453 FIELD_PREP(ADMV1013_SPI_SOFT_RESET_MSK, 0));
0454 if (ret)
0455 return ret;
0456
0457 ret = __admv1013_spi_read(st, ADMV1013_REG_SPI_CONTROL, &data);
0458 if (ret)
0459 return ret;
0460
0461 data = FIELD_GET(ADMV1013_CHIP_ID_MSK, data);
0462 if (data != ADMV1013_CHIP_ID) {
0463 dev_err(&spi->dev, "Invalid Chip ID.\n");
0464 return -EINVAL;
0465 }
0466
0467 ret = __admv1013_spi_write(st, ADMV1013_REG_VVA_TEMP_COMP, 0xE700);
0468 if (ret)
0469 return ret;
0470
0471 data = FIELD_PREP(ADMV1013_QUAD_SE_MODE_MSK, st->quad_se_mode);
0472
0473 ret = __admv1013_spi_update_bits(st, ADMV1013_REG_QUAD,
0474 ADMV1013_QUAD_SE_MODE_MSK, data);
0475 if (ret)
0476 return ret;
0477
0478 ret = admv1013_update_mixer_vgate(st);
0479 if (ret)
0480 return ret;
0481
0482 ret = admv1013_update_quad_filters(st);
0483 if (ret)
0484 return ret;
0485
0486 return __admv1013_spi_update_bits(st, ADMV1013_REG_ENABLE,
0487 ADMV1013_DET_EN_MSK |
0488 ADMV1013_MIXER_IF_EN_MSK,
0489 st->det_en |
0490 st->input_mode);
0491 }
0492
0493 static void admv1013_clk_disable(void *data)
0494 {
0495 clk_disable_unprepare(data);
0496 }
0497
0498 static void admv1013_reg_disable(void *data)
0499 {
0500 regulator_disable(data);
0501 }
0502
0503 static void admv1013_powerdown(void *data)
0504 {
0505 unsigned int enable_reg, enable_reg_msk;
0506
0507
0508 enable_reg_msk = ADMV1013_VGA_PD_MSK |
0509 ADMV1013_MIXER_PD_MSK |
0510 ADMV1013_QUAD_PD_MSK |
0511 ADMV1013_BG_PD_MSK |
0512 ADMV1013_MIXER_IF_EN_MSK |
0513 ADMV1013_DET_EN_MSK;
0514
0515 enable_reg = FIELD_PREP(ADMV1013_VGA_PD_MSK, 1) |
0516 FIELD_PREP(ADMV1013_MIXER_PD_MSK, 1) |
0517 FIELD_PREP(ADMV1013_QUAD_PD_MSK, 7) |
0518 FIELD_PREP(ADMV1013_BG_PD_MSK, 1) |
0519 FIELD_PREP(ADMV1013_MIXER_IF_EN_MSK, 0) |
0520 FIELD_PREP(ADMV1013_DET_EN_MSK, 0);
0521
0522 admv1013_spi_update_bits(data, ADMV1013_REG_ENABLE, enable_reg_msk, enable_reg);
0523 }
0524
0525 static int admv1013_properties_parse(struct admv1013_state *st)
0526 {
0527 int ret;
0528 const char *str;
0529 struct spi_device *spi = st->spi;
0530
0531 st->det_en = device_property_read_bool(&spi->dev, "adi,detector-enable");
0532
0533 ret = device_property_read_string(&spi->dev, "adi,input-mode", &str);
0534 if (ret)
0535 st->input_mode = ADMV1013_IQ_MODE;
0536
0537 if (!strcmp(str, "iq"))
0538 st->input_mode = ADMV1013_IQ_MODE;
0539 else if (!strcmp(str, "if"))
0540 st->input_mode = ADMV1013_IF_MODE;
0541 else
0542 return -EINVAL;
0543
0544 ret = device_property_read_string(&spi->dev, "adi,quad-se-mode", &str);
0545 if (ret)
0546 st->quad_se_mode = ADMV1013_SE_MODE_DIFF;
0547
0548 if (!strcmp(str, "diff"))
0549 st->quad_se_mode = ADMV1013_SE_MODE_DIFF;
0550 else if (!strcmp(str, "se-pos"))
0551 st->quad_se_mode = ADMV1013_SE_MODE_POS;
0552 else if (!strcmp(str, "se-neg"))
0553 st->quad_se_mode = ADMV1013_SE_MODE_NEG;
0554 else
0555 return -EINVAL;
0556
0557 st->reg = devm_regulator_get(&spi->dev, "vcm");
0558 if (IS_ERR(st->reg))
0559 return dev_err_probe(&spi->dev, PTR_ERR(st->reg),
0560 "failed to get the common-mode voltage\n");
0561
0562 st->clkin = devm_clk_get(&spi->dev, "lo_in");
0563 if (IS_ERR(st->clkin))
0564 return dev_err_probe(&spi->dev, PTR_ERR(st->clkin),
0565 "failed to get the LO input clock\n");
0566
0567 return 0;
0568 }
0569
0570 static int admv1013_probe(struct spi_device *spi)
0571 {
0572 struct iio_dev *indio_dev;
0573 struct admv1013_state *st;
0574 int ret;
0575
0576 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
0577 if (!indio_dev)
0578 return -ENOMEM;
0579
0580 st = iio_priv(indio_dev);
0581
0582 indio_dev->info = &admv1013_info;
0583 indio_dev->name = "admv1013";
0584 indio_dev->channels = admv1013_channels;
0585 indio_dev->num_channels = ARRAY_SIZE(admv1013_channels);
0586
0587 st->spi = spi;
0588
0589 ret = admv1013_properties_parse(st);
0590 if (ret)
0591 return ret;
0592
0593 ret = regulator_enable(st->reg);
0594 if (ret) {
0595 dev_err(&spi->dev, "Failed to enable specified Common-Mode Voltage!\n");
0596 return ret;
0597 }
0598
0599 ret = devm_add_action_or_reset(&spi->dev, admv1013_reg_disable,
0600 st->reg);
0601 if (ret)
0602 return ret;
0603
0604 ret = clk_prepare_enable(st->clkin);
0605 if (ret)
0606 return ret;
0607
0608 ret = devm_add_action_or_reset(&spi->dev, admv1013_clk_disable, st->clkin);
0609 if (ret)
0610 return ret;
0611
0612 st->nb.notifier_call = admv1013_freq_change;
0613 ret = devm_clk_notifier_register(&spi->dev, st->clkin, &st->nb);
0614 if (ret)
0615 return ret;
0616
0617 mutex_init(&st->lock);
0618
0619 ret = admv1013_init(st);
0620 if (ret) {
0621 dev_err(&spi->dev, "admv1013 init failed\n");
0622 return ret;
0623 }
0624
0625 ret = devm_add_action_or_reset(&spi->dev, admv1013_powerdown, st);
0626 if (ret)
0627 return ret;
0628
0629 return devm_iio_device_register(&spi->dev, indio_dev);
0630 }
0631
0632 static const struct spi_device_id admv1013_id[] = {
0633 { "admv1013", 0 },
0634 {}
0635 };
0636 MODULE_DEVICE_TABLE(spi, admv1013_id);
0637
0638 static const struct of_device_id admv1013_of_match[] = {
0639 { .compatible = "adi,admv1013" },
0640 {},
0641 };
0642 MODULE_DEVICE_TABLE(of, admv1013_of_match);
0643
0644 static struct spi_driver admv1013_driver = {
0645 .driver = {
0646 .name = "admv1013",
0647 .of_match_table = admv1013_of_match,
0648 },
0649 .probe = admv1013_probe,
0650 .id_table = admv1013_id,
0651 };
0652 module_spi_driver(admv1013_driver);
0653
0654 MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com");
0655 MODULE_DESCRIPTION("Analog Devices ADMV1013");
0656 MODULE_LICENSE("GPL v2");