···306306static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,307307 const struct regmap_config *config)308308{309309+ const struct i2c_adapter_quirks *quirks;310310+ const struct regmap_bus *bus = NULL;311311+ struct regmap_bus *ret_bus;312312+ u16 max_read = 0, max_write = 0;313313+309314 if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))310310- return ®map_i2c;315315+ bus = ®map_i2c;311316 else if (config->val_bits == 8 && config->reg_bits == 8 &&312317 i2c_check_functionality(i2c->adapter,313318 I2C_FUNC_SMBUS_I2C_BLOCK))314314- return ®map_i2c_smbus_i2c_block;319319+ bus = ®map_i2c_smbus_i2c_block;315320 else if (config->val_bits == 8 && config->reg_bits == 16 &&316321 i2c_check_functionality(i2c->adapter,317322 I2C_FUNC_SMBUS_I2C_BLOCK))318318- return ®map_i2c_smbus_i2c_block_reg16;323323+ bus = ®map_i2c_smbus_i2c_block_reg16;319324 else if (config->val_bits == 16 && config->reg_bits == 8 &&320325 i2c_check_functionality(i2c->adapter,321326 I2C_FUNC_SMBUS_WORD_DATA))322327 switch (regmap_get_val_endian(&i2c->dev, NULL, config)) {323328 case REGMAP_ENDIAN_LITTLE:324324- return ®map_smbus_word;329329+ bus = ®map_smbus_word;330330+ break;325331 case REGMAP_ENDIAN_BIG:326326- return ®map_smbus_word_swapped;332332+ bus = ®map_smbus_word_swapped;333333+ break;327334 default: /* everything else is not supported */328335 break;329336 }330337 else if (config->val_bits == 8 && config->reg_bits == 8 &&331338 i2c_check_functionality(i2c->adapter,332339 I2C_FUNC_SMBUS_BYTE_DATA))333333- return ®map_smbus_byte;340340+ bus = ®map_smbus_byte;334341335335- return ERR_PTR(-ENOTSUPP);342342+ if (!bus)343343+ return ERR_PTR(-ENOTSUPP);344344+345345+ quirks = i2c->adapter->quirks;346346+ if (quirks) {347347+ if (quirks->max_read_len &&348348+ (bus->max_raw_read == 0 || bus->max_raw_read > quirks->max_read_len))349349+ max_read = quirks->max_read_len;350350+351351+ if (quirks->max_write_len &&352352+ (bus->max_raw_write == 0 || bus->max_raw_write > quirks->max_write_len))353353+ max_write = quirks->max_write_len;354354+355355+ if (max_read || max_write) {356356+ ret_bus = kmemdup(bus, sizeof(*bus), GFP_KERNEL);357357+ if (!ret_bus)358358+ return ERR_PTR(-ENOMEM);359359+ ret_bus->free_on_exit = true;360360+ ret_bus->max_raw_read = max_read;361361+ ret_bus->max_raw_write = max_write;362362+ bus = ret_bus;363363+ }364364+ }365365+366366+ return bus;336367}337368338369struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
+7
drivers/base/regmap/regmap-irq.c
···531531 }532532 }533533534534+ if (chip->status_invert)535535+ for (i = 0; i < data->chip->num_regs; i++)536536+ data->status_buf[i] = ~data->status_buf[i];537537+534538 /*535539 * Ignore masked IRQs and ack if we need to; we ack early so536540 * there is no race between handling and acknowleding the···803799 ret);804800 goto err_alloc;805801 }802802+803803+ if (chip->status_invert)804804+ d->status_buf[i] = ~d->status_buf[i];806805807806 if (d->status_buf[i] && (chip->ack_base || chip->use_ack)) {808807 reg = sub_irq_reg(d, d->chip->ack_base, i);
+116
drivers/base/regmap/regmap-mdio.c
···11+// SPDX-License-Identifier: GPL-2.022+33+#include <linux/errno.h>44+#include <linux/mdio.h>55+#include <linux/module.h>66+#include <linux/regmap.h>77+88+#define REGVAL_MASK GENMASK(15, 0)99+#define REGNUM_C22_MASK GENMASK(4, 0)1010+/* Clause-45 mask includes the device type (5 bit) and actual register number (16 bit) */1111+#define REGNUM_C45_MASK GENMASK(20, 0)1212+1313+static int regmap_mdio_read(struct mdio_device *mdio_dev, u32 reg, unsigned int *val)1414+{1515+ int ret;1616+1717+ ret = mdiobus_read(mdio_dev->bus, mdio_dev->addr, reg);1818+ if (ret < 0)1919+ return ret;2020+2121+ *val = ret & REGVAL_MASK;2222+ return 0;2323+}2424+2525+static int regmap_mdio_write(struct mdio_device *mdio_dev, u32 reg, unsigned int val)2626+{2727+ return mdiobus_write(mdio_dev->bus, mdio_dev->addr, reg, val);2828+}2929+3030+static int regmap_mdio_c22_read(void *context, unsigned int reg, unsigned int *val)3131+{3232+ struct mdio_device *mdio_dev = context;3333+3434+ if (unlikely(reg & ~REGNUM_C22_MASK))3535+ return -ENXIO;3636+3737+ return regmap_mdio_read(mdio_dev, reg, val);3838+}3939+4040+static int regmap_mdio_c22_write(void *context, unsigned int reg, unsigned int val)4141+{4242+ struct mdio_device *mdio_dev = context;4343+4444+ if (unlikely(reg & ~REGNUM_C22_MASK))4545+ return -ENXIO;4646+4747+ return mdiobus_write(mdio_dev->bus, mdio_dev->addr, reg, val);4848+}4949+5050+static const struct regmap_bus regmap_mdio_c22_bus = {5151+ .reg_write = regmap_mdio_c22_write,5252+ .reg_read = regmap_mdio_c22_read,5353+};5454+5555+static int regmap_mdio_c45_read(void *context, unsigned int reg, unsigned int *val)5656+{5757+ struct mdio_device *mdio_dev = context;5858+5959+ if (unlikely(reg & ~REGNUM_C45_MASK))6060+ return -ENXIO;6161+6262+ return regmap_mdio_read(mdio_dev, MII_ADDR_C45 | reg, val);6363+}6464+6565+static int regmap_mdio_c45_write(void *context, unsigned int reg, unsigned int val)6666+{6767+ struct mdio_device *mdio_dev = context;6868+6969+ if (unlikely(reg & ~REGNUM_C45_MASK))7070+ return -ENXIO;7171+7272+ return regmap_mdio_write(mdio_dev, MII_ADDR_C45 | reg, val);7373+}7474+7575+static const struct regmap_bus regmap_mdio_c45_bus = {7676+ .reg_write = regmap_mdio_c45_write,7777+ .reg_read = regmap_mdio_c45_read,7878+};7979+8080+struct regmap *__regmap_init_mdio(struct mdio_device *mdio_dev,8181+ const struct regmap_config *config, struct lock_class_key *lock_key,8282+ const char *lock_name)8383+{8484+ const struct regmap_bus *bus;8585+8686+ if (config->reg_bits == 5 && config->val_bits == 16)8787+ bus = ®map_mdio_c22_bus;8888+ else if (config->reg_bits == 21 && config->val_bits == 16)8989+ bus = ®map_mdio_c45_bus;9090+ else9191+ return ERR_PTR(-EOPNOTSUPP);9292+9393+ return __regmap_init(&mdio_dev->dev, bus, mdio_dev, config, lock_key, lock_name);9494+}9595+EXPORT_SYMBOL_GPL(__regmap_init_mdio);9696+9797+struct regmap *__devm_regmap_init_mdio(struct mdio_device *mdio_dev,9898+ const struct regmap_config *config, struct lock_class_key *lock_key,9999+ const char *lock_name)100100+{101101+ const struct regmap_bus *bus;102102+103103+ if (config->reg_bits == 5 && config->val_bits == 16)104104+ bus = ®map_mdio_c22_bus;105105+ else if (config->reg_bits == 21 && config->val_bits == 16)106106+ bus = ®map_mdio_c45_bus;107107+ else108108+ return ERR_PTR(-EOPNOTSUPP);109109+110110+ return __devm_regmap_init(&mdio_dev->dev, bus, mdio_dev, config, lock_key, lock_name);111111+}112112+EXPORT_SYMBOL_GPL(__devm_regmap_init_mdio);113113+114114+MODULE_AUTHOR("Sander Vanheule <sander@svanheule.net>");115115+MODULE_DESCRIPTION("Regmap MDIO Module");116116+MODULE_LICENSE("GPL v2");
+15
drivers/base/regmap/regmap.c
···243243 *out = cpu_to_be16((reg << 9) | val);244244}245245246246+static void regmap_format_7_17_write(struct regmap *map,247247+ unsigned int reg, unsigned int val)248248+{249249+ u8 *out = map->work_buf;250250+251251+ out[2] = val;252252+ out[1] = val >> 8;253253+ out[0] = (val >> 16) | (reg << 1);254254+}255255+246256static void regmap_format_10_14_write(struct regmap *map,247257 unsigned int reg, unsigned int val)248258{···895885 case 9:896886 map->format.format_write = regmap_format_7_9_write;897887 break;888888+ case 17:889889+ map->format.format_write = regmap_format_7_17_write;890890+ break;898891 default:899892 goto err_hwlock;900893 }···15091496 mutex_destroy(&map->mutex);15101497 kfree_const(map->name);15111498 kfree(map->patch);14991499+ if (map->bus && map->bus->free_on_exit)15001500+ kfree(map->bus);15121501 kfree(map);15131502}15141503EXPORT_SYMBOL_GPL(regmap_exit);
+40
include/linux/regmap.h
···2727struct i2c_client;2828struct i3c_device;2929struct irq_domain;3030+struct mdio_device;3031struct slim_device;3132struct spi_device;3233struct spmi_device;···503502 * DEFAULT, BIG is assumed.504503 * @max_raw_read: Max raw read size that can be used on the bus.505504 * @max_raw_write: Max raw write size that can be used on the bus.505505+ * @free_on_exit: kfree this on exit of regmap506506 */507507struct regmap_bus {508508 bool fast_io;···521519 enum regmap_endian val_format_endian_default;522520 size_t max_raw_read;523521 size_t max_raw_write;522522+ bool free_on_exit;524523};525524526525/*···538535 struct lock_class_key *lock_key,539536 const char *lock_name);540537struct regmap *__regmap_init_i2c(struct i2c_client *i2c,538538+ const struct regmap_config *config,539539+ struct lock_class_key *lock_key,540540+ const char *lock_name);541541+struct regmap *__regmap_init_mdio(struct mdio_device *mdio_dev,541542 const struct regmap_config *config,542543 struct lock_class_key *lock_key,543544 const char *lock_name);···598591 struct lock_class_key *lock_key,599592 const char *lock_name);600593struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,594594+ const struct regmap_config *config,595595+ struct lock_class_key *lock_key,596596+ const char *lock_name);597597+struct regmap *__devm_regmap_init_mdio(struct mdio_device *mdio_dev,601598 const struct regmap_config *config,602599 struct lock_class_key *lock_key,603600 const char *lock_name);···707696#define regmap_init_i2c(i2c, config) \708697 __regmap_lockdep_wrapper(__regmap_init_i2c, #config, \709698 i2c, config)699699+700700+/**701701+ * regmap_init_mdio() - Initialise register map702702+ *703703+ * @mdio_dev: Device that will be interacted with704704+ * @config: Configuration for register map705705+ *706706+ * The return value will be an ERR_PTR() on error or a valid pointer to707707+ * a struct regmap.708708+ */709709+#define regmap_init_mdio(mdio_dev, config) \710710+ __regmap_lockdep_wrapper(__regmap_init_mdio, #config, \711711+ mdio_dev, config)710712711713/**712714 * regmap_init_sccb() - Initialise register map···911887#define devm_regmap_init_i2c(i2c, config) \912888 __regmap_lockdep_wrapper(__devm_regmap_init_i2c, #config, \913889 i2c, config)890890+891891+/**892892+ * devm_regmap_init_mdio() - Initialise managed register map893893+ *894894+ * @mdio_dev: Device that will be interacted with895895+ * @config: Configuration for register map896896+ *897897+ * The return value will be an ERR_PTR() on error or a valid pointer898898+ * to a struct regmap. The regmap will be automatically freed by the899899+ * device management code.900900+ */901901+#define devm_regmap_init_mdio(mdio_dev, config) \902902+ __regmap_lockdep_wrapper(__devm_regmap_init_mdio, #config, \903903+ mdio_dev, config)914904915905/**916906 * devm_regmap_init_sccb() - Initialise managed register map···14491411 * @not_fixed_stride: Used when chip peripherals are not laid out with fixed14501412 * stride. Must be used with sub_reg_offsets containing the14511413 * offsets to each peripheral.14141414+ * @status_invert: Inverted status register: cleared bits are active interrupts.14521415 * @runtime_pm: Hold a runtime PM lock on the device when accessing it.14531416 *14541417 * @num_regs: Number of registers in each control bank.···15021463 bool type_in_mask:1;15031464 bool clear_on_unmask:1;15041465 bool not_fixed_stride:1;14661466+ bool status_invert:1;1505146715061468 int num_regs;15071469