185 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * STMicroelectronics st_lsm6dsx spi driver4 *5 * Copyright 2016 STMicroelectronics Inc.6 *7 * Lorenzo Bianconi <lorenzo.bianconi@st.com>8 * Denis Ciocca <denis.ciocca@st.com>9 */10 11#include <linux/kernel.h>12#include <linux/module.h>13#include <linux/spi/spi.h>14#include <linux/slab.h>15#include <linux/regmap.h>16 17#include "st_lsm6dsx.h"18 19static const struct regmap_config st_lsm6dsx_spi_regmap_config = {20 .reg_bits = 8,21 .val_bits = 8,22};23 24static int st_lsm6dsx_spi_probe(struct spi_device *spi)25{26 const struct spi_device_id *id = spi_get_device_id(spi);27 int hw_id = id->driver_data;28 struct regmap *regmap;29 30 regmap = devm_regmap_init_spi(spi, &st_lsm6dsx_spi_regmap_config);31 if (IS_ERR(regmap)) {32 dev_err(&spi->dev, "Failed to register spi regmap %ld\n", PTR_ERR(regmap));33 return PTR_ERR(regmap);34 }35 36 return st_lsm6dsx_probe(&spi->dev, spi->irq, hw_id, regmap);37}38 39static const struct of_device_id st_lsm6dsx_spi_of_match[] = {40 {41 .compatible = "st,lsm6ds3",42 .data = (void *)ST_LSM6DS3_ID,43 },44 {45 .compatible = "st,lsm6ds3h",46 .data = (void *)ST_LSM6DS3H_ID,47 },48 {49 .compatible = "st,lsm6dsl",50 .data = (void *)ST_LSM6DSL_ID,51 },52 {53 .compatible = "st,lsm6dsm",54 .data = (void *)ST_LSM6DSM_ID,55 },56 {57 .compatible = "st,ism330dlc",58 .data = (void *)ST_ISM330DLC_ID,59 },60 {61 .compatible = "st,lsm6dso",62 .data = (void *)ST_LSM6DSO_ID,63 },64 {65 .compatible = "st,asm330lhh",66 .data = (void *)ST_ASM330LHH_ID,67 },68 {69 .compatible = "st,lsm6dsox",70 .data = (void *)ST_LSM6DSOX_ID,71 },72 {73 .compatible = "st,lsm6dsr",74 .data = (void *)ST_LSM6DSR_ID,75 },76 {77 .compatible = "st,lsm6ds3tr-c",78 .data = (void *)ST_LSM6DS3TRC_ID,79 },80 {81 .compatible = "st,ism330dhcx",82 .data = (void *)ST_ISM330DHCX_ID,83 },84 {85 .compatible = "st,lsm9ds1-imu",86 .data = (void *)ST_LSM9DS1_ID,87 },88 {89 .compatible = "st,lsm6ds0",90 .data = (void *)ST_LSM6DS0_ID,91 },92 {93 .compatible = "st,lsm6dsrx",94 .data = (void *)ST_LSM6DSRX_ID,95 },96 {97 .compatible = "st,lsm6dst",98 .data = (void *)ST_LSM6DST_ID,99 },100 {101 .compatible = "st,lsm6dsop",102 .data = (void *)ST_LSM6DSOP_ID,103 },104 {105 .compatible = "st,asm330lhhx",106 .data = (void *)ST_ASM330LHHX_ID,107 },108 {109 .compatible = "st,lsm6dstx",110 .data = (void *)ST_LSM6DSTX_ID,111 },112 {113 .compatible = "st,lsm6dsv",114 .data = (void *)ST_LSM6DSV_ID,115 },116 {117 .compatible = "st,lsm6dsv16x",118 .data = (void *)ST_LSM6DSV16X_ID,119 },120 {121 .compatible = "st,lsm6dso16is",122 .data = (void *)ST_LSM6DSO16IS_ID,123 },124 {125 .compatible = "st,ism330is",126 .data = (void *)ST_ISM330IS_ID,127 },128 {129 .compatible = "st,asm330lhb",130 .data = (void *)ST_ASM330LHB_ID,131 },132 {133 .compatible = "st,asm330lhhxg1",134 .data = (void *)ST_ASM330LHHXG1_ID,135 },136 {},137};138MODULE_DEVICE_TABLE(of, st_lsm6dsx_spi_of_match);139 140static const struct spi_device_id st_lsm6dsx_spi_id_table[] = {141 { ST_LSM6DS3_DEV_NAME, ST_LSM6DS3_ID },142 { ST_LSM6DS3H_DEV_NAME, ST_LSM6DS3H_ID },143 { ST_LSM6DSL_DEV_NAME, ST_LSM6DSL_ID },144 { ST_LSM6DSM_DEV_NAME, ST_LSM6DSM_ID },145 { ST_ISM330DLC_DEV_NAME, ST_ISM330DLC_ID },146 { ST_LSM6DSO_DEV_NAME, ST_LSM6DSO_ID },147 { ST_ASM330LHH_DEV_NAME, ST_ASM330LHH_ID },148 { ST_LSM6DSOX_DEV_NAME, ST_LSM6DSOX_ID },149 { ST_LSM6DSR_DEV_NAME, ST_LSM6DSR_ID },150 { ST_LSM6DS3TRC_DEV_NAME, ST_LSM6DS3TRC_ID },151 { ST_ISM330DHCX_DEV_NAME, ST_ISM330DHCX_ID },152 { ST_LSM9DS1_DEV_NAME, ST_LSM9DS1_ID },153 { ST_LSM6DS0_DEV_NAME, ST_LSM6DS0_ID },154 { ST_LSM6DSRX_DEV_NAME, ST_LSM6DSRX_ID },155 { ST_LSM6DST_DEV_NAME, ST_LSM6DST_ID },156 { ST_LSM6DSOP_DEV_NAME, ST_LSM6DSOP_ID },157 { ST_ASM330LHHX_DEV_NAME, ST_ASM330LHHX_ID },158 { ST_LSM6DSTX_DEV_NAME, ST_LSM6DSTX_ID },159 { ST_LSM6DSV_DEV_NAME, ST_LSM6DSV_ID },160 { ST_LSM6DSV16X_DEV_NAME, ST_LSM6DSV16X_ID },161 { ST_LSM6DSO16IS_DEV_NAME, ST_LSM6DSO16IS_ID },162 { ST_ISM330IS_DEV_NAME, ST_ISM330IS_ID },163 { ST_ASM330LHB_DEV_NAME, ST_ASM330LHB_ID },164 { ST_ASM330LHHXG1_DEV_NAME, ST_ASM330LHHXG1_ID },165 {},166};167MODULE_DEVICE_TABLE(spi, st_lsm6dsx_spi_id_table);168 169static struct spi_driver st_lsm6dsx_driver = {170 .driver = {171 .name = "st_lsm6dsx_spi",172 .pm = pm_sleep_ptr(&st_lsm6dsx_pm_ops),173 .of_match_table = st_lsm6dsx_spi_of_match,174 },175 .probe = st_lsm6dsx_spi_probe,176 .id_table = st_lsm6dsx_spi_id_table,177};178module_spi_driver(st_lsm6dsx_driver);179 180MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");181MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");182MODULE_DESCRIPTION("STMicroelectronics st_lsm6dsx spi driver");183MODULE_LICENSE("GPL v2");184MODULE_IMPORT_NS(IIO_LSM6DSX);185