18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Driver for the Analog Devices digital potentiometers (SPI bus) 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2010-2011 Michael Hennerich, Analog Devices Inc. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 98c2ecf20Sopenharmony_ci#include <linux/module.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "ad525x_dpot.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* SPI bus functions */ 148c2ecf20Sopenharmony_cistatic int write8(void *client, u8 val) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci u8 data = val; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci return spi_write(client, &data, 1); 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic int write16(void *client, u8 reg, u8 val) 228c2ecf20Sopenharmony_ci{ 238c2ecf20Sopenharmony_ci u8 data[2] = {reg, val}; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci return spi_write(client, data, 2); 268c2ecf20Sopenharmony_ci} 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic int write24(void *client, u8 reg, u16 val) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci u8 data[3] = {reg, val >> 8, val}; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci return spi_write(client, data, 3); 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistatic int read8(void *client) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci int ret; 388c2ecf20Sopenharmony_ci u8 data; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci ret = spi_read(client, &data, 1); 418c2ecf20Sopenharmony_ci if (ret < 0) 428c2ecf20Sopenharmony_ci return ret; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci return data; 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistatic int read16(void *client, u8 reg) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci int ret; 508c2ecf20Sopenharmony_ci u8 buf_rx[2]; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci write16(client, reg, 0); 538c2ecf20Sopenharmony_ci ret = spi_read(client, buf_rx, 2); 548c2ecf20Sopenharmony_ci if (ret < 0) 558c2ecf20Sopenharmony_ci return ret; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci return (buf_rx[0] << 8) | buf_rx[1]; 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistatic int read24(void *client, u8 reg) 618c2ecf20Sopenharmony_ci{ 628c2ecf20Sopenharmony_ci int ret; 638c2ecf20Sopenharmony_ci u8 buf_rx[3]; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci write24(client, reg, 0); 668c2ecf20Sopenharmony_ci ret = spi_read(client, buf_rx, 3); 678c2ecf20Sopenharmony_ci if (ret < 0) 688c2ecf20Sopenharmony_ci return ret; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci return (buf_rx[1] << 8) | buf_rx[2]; 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistatic const struct ad_dpot_bus_ops bops = { 748c2ecf20Sopenharmony_ci .read_d8 = read8, 758c2ecf20Sopenharmony_ci .read_r8d8 = read16, 768c2ecf20Sopenharmony_ci .read_r8d16 = read24, 778c2ecf20Sopenharmony_ci .write_d8 = write8, 788c2ecf20Sopenharmony_ci .write_r8d8 = write16, 798c2ecf20Sopenharmony_ci .write_r8d16 = write24, 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_cistatic int ad_dpot_spi_probe(struct spi_device *spi) 828c2ecf20Sopenharmony_ci{ 838c2ecf20Sopenharmony_ci struct ad_dpot_bus_data bdata = { 848c2ecf20Sopenharmony_ci .client = spi, 858c2ecf20Sopenharmony_ci .bops = &bops, 868c2ecf20Sopenharmony_ci }; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci return ad_dpot_probe(&spi->dev, &bdata, 898c2ecf20Sopenharmony_ci spi_get_device_id(spi)->driver_data, 908c2ecf20Sopenharmony_ci spi_get_device_id(spi)->name); 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic int ad_dpot_spi_remove(struct spi_device *spi) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci return ad_dpot_remove(&spi->dev); 968c2ecf20Sopenharmony_ci} 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistatic const struct spi_device_id ad_dpot_spi_id[] = { 998c2ecf20Sopenharmony_ci {"ad5160", AD5160_ID}, 1008c2ecf20Sopenharmony_ci {"ad5161", AD5161_ID}, 1018c2ecf20Sopenharmony_ci {"ad5162", AD5162_ID}, 1028c2ecf20Sopenharmony_ci {"ad5165", AD5165_ID}, 1038c2ecf20Sopenharmony_ci {"ad5200", AD5200_ID}, 1048c2ecf20Sopenharmony_ci {"ad5201", AD5201_ID}, 1058c2ecf20Sopenharmony_ci {"ad5203", AD5203_ID}, 1068c2ecf20Sopenharmony_ci {"ad5204", AD5204_ID}, 1078c2ecf20Sopenharmony_ci {"ad5206", AD5206_ID}, 1088c2ecf20Sopenharmony_ci {"ad5207", AD5207_ID}, 1098c2ecf20Sopenharmony_ci {"ad5231", AD5231_ID}, 1108c2ecf20Sopenharmony_ci {"ad5232", AD5232_ID}, 1118c2ecf20Sopenharmony_ci {"ad5233", AD5233_ID}, 1128c2ecf20Sopenharmony_ci {"ad5235", AD5235_ID}, 1138c2ecf20Sopenharmony_ci {"ad5260", AD5260_ID}, 1148c2ecf20Sopenharmony_ci {"ad5262", AD5262_ID}, 1158c2ecf20Sopenharmony_ci {"ad5263", AD5263_ID}, 1168c2ecf20Sopenharmony_ci {"ad5290", AD5290_ID}, 1178c2ecf20Sopenharmony_ci {"ad5291", AD5291_ID}, 1188c2ecf20Sopenharmony_ci {"ad5292", AD5292_ID}, 1198c2ecf20Sopenharmony_ci {"ad5293", AD5293_ID}, 1208c2ecf20Sopenharmony_ci {"ad7376", AD7376_ID}, 1218c2ecf20Sopenharmony_ci {"ad8400", AD8400_ID}, 1228c2ecf20Sopenharmony_ci {"ad8402", AD8402_ID}, 1238c2ecf20Sopenharmony_ci {"ad8403", AD8403_ID}, 1248c2ecf20Sopenharmony_ci {"adn2850", ADN2850_ID}, 1258c2ecf20Sopenharmony_ci {"ad5270", AD5270_ID}, 1268c2ecf20Sopenharmony_ci {"ad5271", AD5271_ID}, 1278c2ecf20Sopenharmony_ci {} 1288c2ecf20Sopenharmony_ci}; 1298c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(spi, ad_dpot_spi_id); 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic struct spi_driver ad_dpot_spi_driver = { 1328c2ecf20Sopenharmony_ci .driver = { 1338c2ecf20Sopenharmony_ci .name = "ad_dpot", 1348c2ecf20Sopenharmony_ci }, 1358c2ecf20Sopenharmony_ci .probe = ad_dpot_spi_probe, 1368c2ecf20Sopenharmony_ci .remove = ad_dpot_spi_remove, 1378c2ecf20Sopenharmony_ci .id_table = ad_dpot_spi_id, 1388c2ecf20Sopenharmony_ci}; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_cimodule_spi_driver(ad_dpot_spi_driver); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ciMODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); 1438c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("digital potentiometer SPI bus driver"); 1448c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 1458c2ecf20Sopenharmony_ciMODULE_ALIAS("spi:ad_dpot"); 146