1a15123c7SMark Brown /* 2a15123c7SMark Brown * arizona-spi.c -- Arizona SPI bus interface 3a15123c7SMark Brown * 4a15123c7SMark Brown * Copyright 2012 Wolfson Microelectronics plc 5a15123c7SMark Brown * 6a15123c7SMark Brown * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 7a15123c7SMark Brown * 8a15123c7SMark Brown * This program is free software; you can redistribute it and/or modify 9a15123c7SMark Brown * it under the terms of the GNU General Public License version 2 as 10a15123c7SMark Brown * published by the Free Software Foundation. 11a15123c7SMark Brown */ 12a15123c7SMark Brown 13a15123c7SMark Brown #include <linux/err.h> 14a15123c7SMark Brown #include <linux/module.h> 15a15123c7SMark Brown #include <linux/pm_runtime.h> 16a15123c7SMark Brown #include <linux/regmap.h> 17a15123c7SMark Brown #include <linux/regulator/consumer.h> 18a15123c7SMark Brown #include <linux/slab.h> 19a15123c7SMark Brown #include <linux/spi/spi.h> 20a15123c7SMark Brown 21a15123c7SMark Brown #include <linux/mfd/arizona/core.h> 22a15123c7SMark Brown 23a15123c7SMark Brown #include "arizona.h" 24a15123c7SMark Brown 25*f791be49SBill Pemberton static int arizona_spi_probe(struct spi_device *spi) 26a15123c7SMark Brown { 27a15123c7SMark Brown const struct spi_device_id *id = spi_get_device_id(spi); 28a15123c7SMark Brown struct arizona *arizona; 29a15123c7SMark Brown const struct regmap_config *regmap_config; 30a15123c7SMark Brown int ret; 31a15123c7SMark Brown 32a15123c7SMark Brown switch (id->driver_data) { 33a15123c7SMark Brown #ifdef CONFIG_MFD_WM5102 34a15123c7SMark Brown case WM5102: 35a15123c7SMark Brown regmap_config = &wm5102_spi_regmap; 36a15123c7SMark Brown break; 37a15123c7SMark Brown #endif 38e102befeSMark Brown #ifdef CONFIG_MFD_WM5110 39e102befeSMark Brown case WM5110: 40e102befeSMark Brown regmap_config = &wm5110_spi_regmap; 41e102befeSMark Brown break; 42e102befeSMark Brown #endif 43a15123c7SMark Brown default: 44a15123c7SMark Brown dev_err(&spi->dev, "Unknown device type %ld\n", 45a15123c7SMark Brown id->driver_data); 46a15123c7SMark Brown return -EINVAL; 47a15123c7SMark Brown } 48a15123c7SMark Brown 49a15123c7SMark Brown arizona = devm_kzalloc(&spi->dev, sizeof(*arizona), GFP_KERNEL); 50a15123c7SMark Brown if (arizona == NULL) 51a15123c7SMark Brown return -ENOMEM; 52a15123c7SMark Brown 53a15123c7SMark Brown arizona->regmap = devm_regmap_init_spi(spi, regmap_config); 54a15123c7SMark Brown if (IS_ERR(arizona->regmap)) { 55a15123c7SMark Brown ret = PTR_ERR(arizona->regmap); 56a15123c7SMark Brown dev_err(&spi->dev, "Failed to allocate register map: %d\n", 57a15123c7SMark Brown ret); 58a15123c7SMark Brown return ret; 59a15123c7SMark Brown } 60a15123c7SMark Brown 61a15123c7SMark Brown arizona->type = id->driver_data; 62a15123c7SMark Brown arizona->dev = &spi->dev; 63a15123c7SMark Brown arizona->irq = spi->irq; 64a15123c7SMark Brown 65a15123c7SMark Brown return arizona_dev_init(arizona); 66a15123c7SMark Brown } 67a15123c7SMark Brown 68a15123c7SMark Brown static int __devexit arizona_spi_remove(struct spi_device *spi) 69a15123c7SMark Brown { 70a15123c7SMark Brown struct arizona *arizona = dev_get_drvdata(&spi->dev); 71a15123c7SMark Brown arizona_dev_exit(arizona); 72a15123c7SMark Brown return 0; 73a15123c7SMark Brown } 74a15123c7SMark Brown 75a15123c7SMark Brown static const struct spi_device_id arizona_spi_ids[] = { 76a15123c7SMark Brown { "wm5102", WM5102 }, 77e102befeSMark Brown { "wm5110", WM5110 }, 78a15123c7SMark Brown { }, 79a15123c7SMark Brown }; 80a15123c7SMark Brown MODULE_DEVICE_TABLE(spi, arizona_spi_ids); 81a15123c7SMark Brown 82a15123c7SMark Brown static struct spi_driver arizona_spi_driver = { 83a15123c7SMark Brown .driver = { 84a15123c7SMark Brown .name = "arizona", 85a15123c7SMark Brown .owner = THIS_MODULE, 86a15123c7SMark Brown .pm = &arizona_pm_ops, 87a15123c7SMark Brown }, 88a15123c7SMark Brown .probe = arizona_spi_probe, 8984449216SBill Pemberton .remove = arizona_spi_remove, 90a15123c7SMark Brown .id_table = arizona_spi_ids, 91a15123c7SMark Brown }; 92a15123c7SMark Brown 93a15123c7SMark Brown module_spi_driver(arizona_spi_driver); 94a15123c7SMark Brown 95a15123c7SMark Brown MODULE_DESCRIPTION("Arizona SPI bus interface"); 96a15123c7SMark Brown MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 97a15123c7SMark Brown MODULE_LICENSE("GPL"); 98