162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for ADAU1372 codec 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2016 Analog Devices Inc. 662306a36Sopenharmony_ci * Author: Lars-Peter Clausen <lars@metafoo.de> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/mod_devicetable.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/regmap.h> 1262306a36Sopenharmony_ci#include <linux/spi/spi.h> 1362306a36Sopenharmony_ci#include <sound/soc.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "adau1372.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic void adau1372_spi_switch_mode(struct device *dev) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci struct spi_device *spi = to_spi_device(dev); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci /* 2262306a36Sopenharmony_ci * To get the device into SPI mode CLATCH has to be pulled low three 2362306a36Sopenharmony_ci * times. Do this by issuing three dummy reads. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci spi_w8r8(spi, 0x00); 2662306a36Sopenharmony_ci spi_w8r8(spi, 0x00); 2762306a36Sopenharmony_ci spi_w8r8(spi, 0x00); 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic int adau1372_spi_probe(struct spi_device *spi) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct regmap_config config; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci config = adau1372_regmap_config; 3562306a36Sopenharmony_ci config.read_flag_mask = 0x1; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci return adau1372_probe(&spi->dev, 3862306a36Sopenharmony_ci devm_regmap_init_spi(spi, &config), adau1372_spi_switch_mode); 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic const struct spi_device_id adau1372_spi_id[] = { 4262306a36Sopenharmony_ci { "adau1372", 0 }, 4362306a36Sopenharmony_ci { } 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(spi, adau1372_spi_id); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic struct spi_driver adau1372_spi_driver = { 4862306a36Sopenharmony_ci .driver = { 4962306a36Sopenharmony_ci .name = "adau1372", 5062306a36Sopenharmony_ci }, 5162306a36Sopenharmony_ci .probe = adau1372_spi_probe, 5262306a36Sopenharmony_ci .id_table = adau1372_spi_id, 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_cimodule_spi_driver(adau1372_spi_driver); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC ADAU1372 CODEC SPI driver"); 5762306a36Sopenharmony_ciMODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 5862306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 59