Linux Audio

Check our new training course

Loading...
v6.8
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * SPI access for Dialog DA9052 PMICs.
  4 *
  5 * Copyright(c) 2011 Dialog Semiconductor Ltd.
  6 *
  7 * Author: David Dajun Chen <dchen@diasemi.com>
 
 
 
 
 
 
  8 */
  9
 10#include <linux/device.h>
 11#include <linux/module.h>
 12#include <linux/input.h>
 13#include <linux/mfd/core.h>
 14#include <linux/spi/spi.h>
 15#include <linux/err.h>
 16
 17#include <linux/mfd/da9052/da9052.h>
 18
 19static int da9052_spi_probe(struct spi_device *spi)
 20{
 21	struct regmap_config config;
 22	int ret;
 23	const struct spi_device_id *id = spi_get_device_id(spi);
 24	struct da9052 *da9052;
 25
 26	da9052 = devm_kzalloc(&spi->dev, sizeof(struct da9052), GFP_KERNEL);
 27	if (!da9052)
 28		return -ENOMEM;
 29
 30	spi->mode = SPI_MODE_0;
 31	spi->bits_per_word = 8;
 32	spi_setup(spi);
 33
 34	da9052->dev = &spi->dev;
 35	da9052->chip_irq = spi->irq;
 36
 37	spi_set_drvdata(spi, da9052);
 38
 39	config = da9052_regmap_config;
 40	config.read_flag_mask = 1;
 41	config.reg_bits = 7;
 42	config.pad_bits = 1;
 43	config.val_bits = 8;
 44	config.use_single_read = true;
 45	config.use_single_write = true;
 46
 47	da9052->regmap = devm_regmap_init_spi(spi, &config);
 48	if (IS_ERR(da9052->regmap)) {
 49		ret = PTR_ERR(da9052->regmap);
 50		dev_err(&spi->dev, "Failed to allocate register map: %d\n",
 51			ret);
 52		return ret;
 53	}
 54
 55	return da9052_device_init(da9052, id->driver_data);
 
 
 
 
 56}
 57
 58static void da9052_spi_remove(struct spi_device *spi)
 59{
 60	struct da9052 *da9052 = spi_get_drvdata(spi);
 61
 62	da9052_device_exit(da9052);
 
 63}
 64
 65static const struct spi_device_id da9052_spi_id[] = {
 66	{"da9052", DA9052},
 67	{"da9053-aa", DA9053_AA},
 68	{"da9053-ba", DA9053_BA},
 69	{"da9053-bb", DA9053_BB},
 70	{"da9053-bc", DA9053_BC},
 71	{}
 72};
 73
 74static struct spi_driver da9052_spi_driver = {
 75	.probe = da9052_spi_probe,
 76	.remove = da9052_spi_remove,
 77	.id_table = da9052_spi_id,
 78	.driver = {
 79		.name = "da9052",
 
 80	},
 81};
 82
 83static int __init da9052_spi_init(void)
 84{
 85	int ret;
 86
 87	ret = spi_register_driver(&da9052_spi_driver);
 88	if (ret != 0) {
 89		pr_err("Failed to register DA9052 SPI driver, %d\n", ret);
 90		return ret;
 91	}
 92
 93	return 0;
 94}
 95subsys_initcall(da9052_spi_init);
 96
 97static void __exit da9052_spi_exit(void)
 98{
 99	spi_unregister_driver(&da9052_spi_driver);
100}
101module_exit(da9052_spi_exit);
102
103MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
104MODULE_DESCRIPTION("SPI driver for Dialog DA9052 PMIC");
v3.5.6
 
  1/*
  2 * SPI access for Dialog DA9052 PMICs.
  3 *
  4 * Copyright(c) 2011 Dialog Semiconductor Ltd.
  5 *
  6 * Author: David Dajun Chen <dchen@diasemi.com>
  7 *
  8 * This program is free software; you can redistribute it and/or modify
  9 * it under the terms of the GNU General Public License as published by
 10 * the Free Software Foundation; either version 2 of the License, or
 11 * (at your option) any later version.
 12 *
 13 */
 14
 15#include <linux/device.h>
 16#include <linux/module.h>
 17#include <linux/input.h>
 18#include <linux/mfd/core.h>
 19#include <linux/spi/spi.h>
 20#include <linux/err.h>
 21
 22#include <linux/mfd/da9052/da9052.h>
 23
 24static int __devinit da9052_spi_probe(struct spi_device *spi)
 25{
 
 26	int ret;
 27	const struct spi_device_id *id = spi_get_device_id(spi);
 28	struct da9052 *da9052;
 29
 30	da9052 = devm_kzalloc(&spi->dev, sizeof(struct da9052), GFP_KERNEL);
 31	if (!da9052)
 32		return -ENOMEM;
 33
 34	spi->mode = SPI_MODE_0 | SPI_CPOL;
 35	spi->bits_per_word = 8;
 36	spi_setup(spi);
 37
 38	da9052->dev = &spi->dev;
 39	da9052->chip_irq = spi->irq;
 40
 41	dev_set_drvdata(&spi->dev, da9052);
 42
 43	da9052_regmap_config.read_flag_mask = 1;
 44	da9052_regmap_config.write_flag_mask = 0;
 
 
 
 
 
 45
 46	da9052->regmap = devm_regmap_init_spi(spi, &da9052_regmap_config);
 47	if (IS_ERR(da9052->regmap)) {
 48		ret = PTR_ERR(da9052->regmap);
 49		dev_err(&spi->dev, "Failed to allocate register map: %d\n",
 50			ret);
 51		return ret;
 52	}
 53
 54	ret = da9052_device_init(da9052, id->driver_data);
 55	if (ret != 0)
 56		return ret;
 57
 58	return 0;
 59}
 60
 61static int __devexit da9052_spi_remove(struct spi_device *spi)
 62{
 63	struct da9052 *da9052 = dev_get_drvdata(&spi->dev);
 64
 65	da9052_device_exit(da9052);
 66	return 0;
 67}
 68
 69static struct spi_device_id da9052_spi_id[] = {
 70	{"da9052", DA9052},
 71	{"da9053-aa", DA9053_AA},
 72	{"da9053-ba", DA9053_BA},
 73	{"da9053-bb", DA9053_BB},
 
 74	{}
 75};
 76
 77static struct spi_driver da9052_spi_driver = {
 78	.probe = da9052_spi_probe,
 79	.remove = __devexit_p(da9052_spi_remove),
 80	.id_table = da9052_spi_id,
 81	.driver = {
 82		.name = "da9052",
 83		.owner = THIS_MODULE,
 84	},
 85};
 86
 87static int __init da9052_spi_init(void)
 88{
 89	int ret;
 90
 91	ret = spi_register_driver(&da9052_spi_driver);
 92	if (ret != 0) {
 93		pr_err("Failed to register DA9052 SPI driver, %d\n", ret);
 94		return ret;
 95	}
 96
 97	return 0;
 98}
 99subsys_initcall(da9052_spi_init);
100
101static void __exit da9052_spi_exit(void)
102{
103	spi_unregister_driver(&da9052_spi_driver);
104}
105module_exit(da9052_spi_exit);
106
107MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
108MODULE_DESCRIPTION("SPI driver for Dialog DA9052 PMIC");
109MODULE_LICENSE("GPL");