brintos

brintos / linux-shallow public Read only

0
0
Text · 2.9 KiB · 389523d Raw
125 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * STMicroelectronics pressures driver4 *5 * Copyright 2013 STMicroelectronics Inc.6 *7 * Denis Ciocca <denis.ciocca@st.com>8 */9 10#include <linux/kernel.h>11#include <linux/module.h>12#include <linux/mod_devicetable.h>13#include <linux/i2c.h>14#include <linux/iio/iio.h>15 16#include <linux/iio/common/st_sensors.h>17#include <linux/iio/common/st_sensors_i2c.h>18#include "st_pressure.h"19 20static const struct of_device_id st_press_of_match[] = {21	{22		.compatible = "st,lps001wp-press",23		.data = LPS001WP_PRESS_DEV_NAME,24	},25	{26		.compatible = "st,lps25h-press",27		.data = LPS25H_PRESS_DEV_NAME,28	},29	{30		.compatible = "st,lps331ap-press",31		.data = LPS331AP_PRESS_DEV_NAME,32	},33	{34		.compatible = "st,lps22hb-press",35		.data = LPS22HB_PRESS_DEV_NAME,36	},37	{38		.compatible = "st,lps33hw",39		.data = LPS33HW_PRESS_DEV_NAME,40	},41	{42		.compatible = "st,lps35hw",43		.data = LPS35HW_PRESS_DEV_NAME,44	},45	{46		.compatible = "st,lps22hh",47		.data = LPS22HH_PRESS_DEV_NAME,48	},49	{50		.compatible = "st,lps22df",51		.data = LPS22DF_PRESS_DEV_NAME,52	},53	{},54};55MODULE_DEVICE_TABLE(of, st_press_of_match);56 57static const struct acpi_device_id st_press_acpi_match[] = {58	{"SNO9210", LPS22HB},59	{ },60};61MODULE_DEVICE_TABLE(acpi, st_press_acpi_match);62 63static const struct i2c_device_id st_press_id_table[] = {64	{ LPS001WP_PRESS_DEV_NAME, LPS001WP },65	{ LPS25H_PRESS_DEV_NAME,  LPS25H },66	{ LPS331AP_PRESS_DEV_NAME, LPS331AP },67	{ LPS22HB_PRESS_DEV_NAME, LPS22HB },68	{ LPS33HW_PRESS_DEV_NAME, LPS33HW },69	{ LPS35HW_PRESS_DEV_NAME, LPS35HW },70	{ LPS22HH_PRESS_DEV_NAME, LPS22HH },71	{ LPS22DF_PRESS_DEV_NAME, LPS22DF },72	{},73};74MODULE_DEVICE_TABLE(i2c, st_press_id_table);75 76static int st_press_i2c_probe(struct i2c_client *client)77{78	const struct st_sensor_settings *settings;79	struct st_sensor_data *press_data;80	struct iio_dev *indio_dev;81	int ret;82 83	st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));84 85	settings = st_press_get_settings(client->name);86	if (!settings) {87		dev_err(&client->dev, "device name %s not recognized.\n",88			client->name);89		return -ENODEV;90	}91 92	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*press_data));93	if (!indio_dev)94		return -ENOMEM;95 96	press_data = iio_priv(indio_dev);97	press_data->sensor_settings = (struct st_sensor_settings *)settings;98 99	ret = st_sensors_i2c_configure(indio_dev, client);100	if (ret < 0)101		return ret;102 103	ret = st_sensors_power_enable(indio_dev);104	if (ret)105		return ret;106 107	return st_press_common_probe(indio_dev);108}109 110static struct i2c_driver st_press_driver = {111	.driver = {112		.name = "st-press-i2c",113		.of_match_table = st_press_of_match,114		.acpi_match_table = st_press_acpi_match,115	},116	.probe = st_press_i2c_probe,117	.id_table = st_press_id_table,118};119module_i2c_driver(st_press_driver);120 121MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");122MODULE_DESCRIPTION("STMicroelectronics pressures i2c driver");123MODULE_LICENSE("GPL v2");124MODULE_IMPORT_NS(IIO_ST_SENSORS);125