mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-28 21:35:13 -04:00
While being less compact, using named initializers allows to more easily see which members of the structs are assigned which value without having to lookup the declaration of the struct. And it's also more robust against changes to the struct definition. The mentioned robustness is relevant for a planned change to struct i2c_device_id that replaces .driver_data by an anonymous union. This patch doesn't modify the compiled arrays, only their representation in source form benefits. The former was confirmed with x86 and arm64 builds. Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com> Link: https://patch.msgid.link/20260515164848.497608-2-u.kleine-koenig@baylibre.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
114 lines
2.5 KiB
C
114 lines
2.5 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Implements I2C interface for VTI CMA300_D0x Accelerometer driver
|
|
*
|
|
* Copyright (C) 2010 Texas Instruments
|
|
* Author: Hemanth V <hemanthv@ti.com>
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/input/cma3000.h>
|
|
#include "cma3000_d0x.h"
|
|
|
|
static int cma3000_i2c_set(struct device *dev,
|
|
u8 reg, u8 val, char *msg)
|
|
{
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
int ret;
|
|
|
|
ret = i2c_smbus_write_byte_data(client, reg, val);
|
|
if (ret < 0)
|
|
dev_err(&client->dev,
|
|
"%s failed (%s, %d)\n", __func__, msg, ret);
|
|
return ret;
|
|
}
|
|
|
|
static int cma3000_i2c_read(struct device *dev, u8 reg, char *msg)
|
|
{
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
int ret;
|
|
|
|
ret = i2c_smbus_read_byte_data(client, reg);
|
|
if (ret < 0)
|
|
dev_err(&client->dev,
|
|
"%s failed (%s, %d)\n", __func__, msg, ret);
|
|
return ret;
|
|
}
|
|
|
|
static const struct cma3000_bus_ops cma3000_i2c_bops = {
|
|
.bustype = BUS_I2C,
|
|
#define CMA3000_BUSI2C (0 << 4)
|
|
.ctrl_mod = CMA3000_BUSI2C,
|
|
.read = cma3000_i2c_read,
|
|
.write = cma3000_i2c_set,
|
|
};
|
|
|
|
static int cma3000_i2c_probe(struct i2c_client *client)
|
|
{
|
|
struct cma3000_accl_data *data;
|
|
|
|
data = cma3000_init(&client->dev, client->irq, &cma3000_i2c_bops);
|
|
if (IS_ERR(data))
|
|
return PTR_ERR(data);
|
|
|
|
i2c_set_clientdata(client, data);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void cma3000_i2c_remove(struct i2c_client *client)
|
|
{
|
|
struct cma3000_accl_data *data = i2c_get_clientdata(client);
|
|
|
|
cma3000_exit(data);
|
|
}
|
|
|
|
static int cma3000_i2c_suspend(struct device *dev)
|
|
{
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
struct cma3000_accl_data *data = i2c_get_clientdata(client);
|
|
|
|
cma3000_suspend(data);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int cma3000_i2c_resume(struct device *dev)
|
|
{
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
struct cma3000_accl_data *data = i2c_get_clientdata(client);
|
|
|
|
cma3000_resume(data);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct dev_pm_ops cma3000_i2c_pm_ops = {
|
|
.suspend = cma3000_i2c_suspend,
|
|
.resume = cma3000_i2c_resume,
|
|
};
|
|
|
|
static const struct i2c_device_id cma3000_i2c_id[] = {
|
|
{ .name = "cma3000_d01" },
|
|
{ }
|
|
};
|
|
|
|
MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id);
|
|
|
|
static struct i2c_driver cma3000_i2c_driver = {
|
|
.probe = cma3000_i2c_probe,
|
|
.remove = cma3000_i2c_remove,
|
|
.id_table = cma3000_i2c_id,
|
|
.driver = {
|
|
.name = "cma3000_i2c_accl",
|
|
.pm = pm_sleep_ptr(&cma3000_i2c_pm_ops),
|
|
},
|
|
};
|
|
|
|
module_i2c_driver(cma3000_i2c_driver);
|
|
|
|
MODULE_DESCRIPTION("CMA3000-D0x Accelerometer I2C Driver");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("Hemanth V <hemanthv@ti.com>");
|