1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2fc35a91bSJosef Gajdusek /* 35a059bd2SJosef Gajdusek * i2c driver for hmc5843/5843/5883/5883l/5983 4fc35a91bSJosef Gajdusek * 5fc35a91bSJosef Gajdusek * Split from hmc5843.c 6fc35a91bSJosef Gajdusek * Copyright (C) Josef Gajdusek <atx@atx.name> 74630adb8SCristina Moraru */ 8fc35a91bSJosef Gajdusek 9fc35a91bSJosef Gajdusek #include <linux/module.h> 10fc35a91bSJosef Gajdusek #include <linux/i2c.h> 11fc35a91bSJosef Gajdusek #include <linux/regmap.h> 12fc35a91bSJosef Gajdusek #include <linux/iio/iio.h> 13fc35a91bSJosef Gajdusek #include <linux/iio/triggered_buffer.h> 14fc35a91bSJosef Gajdusek 15fc35a91bSJosef Gajdusek #include "hmc5843.h" 16fc35a91bSJosef Gajdusek 17fc35a91bSJosef Gajdusek static const struct regmap_range hmc5843_readable_ranges[] = { 18fc35a91bSJosef Gajdusek regmap_reg_range(0, HMC5843_ID_END), 19fc35a91bSJosef Gajdusek }; 20fc35a91bSJosef Gajdusek 2115313309SKrzysztof Kozlowski static const struct regmap_access_table hmc5843_readable_table = { 22fc35a91bSJosef Gajdusek .yes_ranges = hmc5843_readable_ranges, 23fc35a91bSJosef Gajdusek .n_yes_ranges = ARRAY_SIZE(hmc5843_readable_ranges), 24fc35a91bSJosef Gajdusek }; 25fc35a91bSJosef Gajdusek 26fc35a91bSJosef Gajdusek static const struct regmap_range hmc5843_writable_ranges[] = { 27fc35a91bSJosef Gajdusek regmap_reg_range(0, HMC5843_MODE_REG), 28fc35a91bSJosef Gajdusek }; 29fc35a91bSJosef Gajdusek 3015313309SKrzysztof Kozlowski static const struct regmap_access_table hmc5843_writable_table = { 31fc35a91bSJosef Gajdusek .yes_ranges = hmc5843_writable_ranges, 32fc35a91bSJosef Gajdusek .n_yes_ranges = ARRAY_SIZE(hmc5843_writable_ranges), 33fc35a91bSJosef Gajdusek }; 34fc35a91bSJosef Gajdusek 35fc35a91bSJosef Gajdusek static const struct regmap_range hmc5843_volatile_ranges[] = { 36fc35a91bSJosef Gajdusek regmap_reg_range(HMC5843_DATA_OUT_MSB_REGS, HMC5843_STATUS_REG), 37fc35a91bSJosef Gajdusek }; 38fc35a91bSJosef Gajdusek 3915313309SKrzysztof Kozlowski static const struct regmap_access_table hmc5843_volatile_table = { 40fc35a91bSJosef Gajdusek .yes_ranges = hmc5843_volatile_ranges, 41fc35a91bSJosef Gajdusek .n_yes_ranges = ARRAY_SIZE(hmc5843_volatile_ranges), 42fc35a91bSJosef Gajdusek }; 43fc35a91bSJosef Gajdusek 4415313309SKrzysztof Kozlowski static const struct regmap_config hmc5843_i2c_regmap_config = { 45fc35a91bSJosef Gajdusek .reg_bits = 8, 46fc35a91bSJosef Gajdusek .val_bits = 8, 47fc35a91bSJosef Gajdusek 48fc35a91bSJosef Gajdusek .rd_table = &hmc5843_readable_table, 49fc35a91bSJosef Gajdusek .wr_table = &hmc5843_writable_table, 50fc35a91bSJosef Gajdusek .volatile_table = &hmc5843_volatile_table, 51fc35a91bSJosef Gajdusek 52fc35a91bSJosef Gajdusek .cache_type = REGCACHE_RBTREE, 53fc35a91bSJosef Gajdusek }; 54fc35a91bSJosef Gajdusek 55aa6432f1SCristina Opriceana static int hmc5843_i2c_probe(struct i2c_client *cli, 56fc35a91bSJosef Gajdusek const struct i2c_device_id *id) 57fc35a91bSJosef Gajdusek { 58536cc27dSKangjie Lu struct regmap *regmap = devm_regmap_init_i2c(cli, 59536cc27dSKangjie Lu &hmc5843_i2c_regmap_config); 60536cc27dSKangjie Lu if (IS_ERR(regmap)) 61536cc27dSKangjie Lu return PTR_ERR(regmap); 62536cc27dSKangjie Lu 63aa6432f1SCristina Opriceana return hmc5843_common_probe(&cli->dev, 64536cc27dSKangjie Lu regmap, 6570b2737eSYong Li id->driver_data, id->name); 66fc35a91bSJosef Gajdusek } 67fc35a91bSJosef Gajdusek 68fc35a91bSJosef Gajdusek static int hmc5843_i2c_remove(struct i2c_client *client) 69fc35a91bSJosef Gajdusek { 704b6fb9f3SUwe Kleine-König hmc5843_common_remove(&client->dev); 714b6fb9f3SUwe Kleine-König 724b6fb9f3SUwe Kleine-König return 0; 73fc35a91bSJosef Gajdusek } 74fc35a91bSJosef Gajdusek 75fc35a91bSJosef Gajdusek static const struct i2c_device_id hmc5843_id[] = { 76fc35a91bSJosef Gajdusek { "hmc5843", HMC5843_ID }, 77fc35a91bSJosef Gajdusek { "hmc5883", HMC5883_ID }, 78fc35a91bSJosef Gajdusek { "hmc5883l", HMC5883L_ID }, 795a059bd2SJosef Gajdusek { "hmc5983", HMC5983_ID }, 80fc35a91bSJosef Gajdusek { } 81fc35a91bSJosef Gajdusek }; 82fc35a91bSJosef Gajdusek MODULE_DEVICE_TABLE(i2c, hmc5843_id); 83fc35a91bSJosef Gajdusek 84fc35a91bSJosef Gajdusek static const struct of_device_id hmc5843_of_match[] = { 85fc35a91bSJosef Gajdusek { .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID }, 86fc35a91bSJosef Gajdusek { .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID }, 87fc35a91bSJosef Gajdusek { .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID }, 885a059bd2SJosef Gajdusek { .compatible = "honeywell,hmc5983", .data = (void *)HMC5983_ID }, 89fc35a91bSJosef Gajdusek {} 90fc35a91bSJosef Gajdusek }; 91fc35a91bSJosef Gajdusek MODULE_DEVICE_TABLE(of, hmc5843_of_match); 92fc35a91bSJosef Gajdusek 93fc35a91bSJosef Gajdusek static struct i2c_driver hmc5843_driver = { 94fc35a91bSJosef Gajdusek .driver = { 95fc35a91bSJosef Gajdusek .name = "hmc5843", 96fc35a91bSJosef Gajdusek .pm = HMC5843_PM_OPS, 97fc35a91bSJosef Gajdusek .of_match_table = hmc5843_of_match, 98fc35a91bSJosef Gajdusek }, 99fc35a91bSJosef Gajdusek .id_table = hmc5843_id, 100fc35a91bSJosef Gajdusek .probe = hmc5843_i2c_probe, 101fc35a91bSJosef Gajdusek .remove = hmc5843_i2c_remove, 102fc35a91bSJosef Gajdusek }; 103fc35a91bSJosef Gajdusek module_i2c_driver(hmc5843_driver); 104fc35a91bSJosef Gajdusek 105fc35a91bSJosef Gajdusek MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>"); 1065a059bd2SJosef Gajdusek MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 i2c driver"); 107fc35a91bSJosef Gajdusek MODULE_LICENSE("GPL"); 1087e615cafSJonathan Cameron MODULE_IMPORT_NS(IIO_HMC5843); 109