Skip to content

Commit 9b98f92

Browse files
committed
Merge remote-tracking branch 'regmap/for-5.8' into regmap-next
2 parents 4bcc6a0 + 93b9299 commit 9b98f92

File tree

4 files changed

+222
-55
lines changed

4 files changed

+222
-55
lines changed

drivers/base/regmap/regmap-i2c.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,63 @@ static const struct regmap_bus regmap_i2c_smbus_i2c_block = {
246246
.max_raw_write = I2C_SMBUS_BLOCK_MAX,
247247
};
248248

249+
static int regmap_i2c_smbus_i2c_write_reg16(void *context, const void *data,
250+
size_t count)
251+
{
252+
struct device *dev = context;
253+
struct i2c_client *i2c = to_i2c_client(dev);
254+
255+
if (count < 2)
256+
return -EINVAL;
257+
258+
count--;
259+
return i2c_smbus_write_i2c_block_data(i2c, ((u8 *)data)[0], count,
260+
(u8 *)data + 1);
261+
}
262+
263+
static int regmap_i2c_smbus_i2c_read_reg16(void *context, const void *reg,
264+
size_t reg_size, void *val,
265+
size_t val_size)
266+
{
267+
struct device *dev = context;
268+
struct i2c_client *i2c = to_i2c_client(dev);
269+
int ret, count, len = val_size;
270+
271+
if (reg_size != 2)
272+
return -EINVAL;
273+
274+
ret = i2c_smbus_write_byte_data(i2c, ((u16 *)reg)[0] & 0xff,
275+
((u16 *)reg)[0] >> 8);
276+
if (ret < 0)
277+
return ret;
278+
279+
count = 0;
280+
do {
281+
/* Current Address Read */
282+
ret = i2c_smbus_read_byte(i2c);
283+
if (ret < 0)
284+
break;
285+
286+
*((u8 *)val++) = ret;
287+
count++;
288+
len--;
289+
} while (len > 0);
290+
291+
if (count == val_size)
292+
return 0;
293+
else if (ret < 0)
294+
return ret;
295+
else
296+
return -EIO;
297+
}
298+
299+
static const struct regmap_bus regmap_i2c_smbus_i2c_block_reg16 = {
300+
.write = regmap_i2c_smbus_i2c_write_reg16,
301+
.read = regmap_i2c_smbus_i2c_read_reg16,
302+
.max_raw_read = I2C_SMBUS_BLOCK_MAX,
303+
.max_raw_write = I2C_SMBUS_BLOCK_MAX,
304+
};
305+
249306
static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
250307
const struct regmap_config *config)
251308
{
@@ -255,6 +312,10 @@ static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
255312
i2c_check_functionality(i2c->adapter,
256313
I2C_FUNC_SMBUS_I2C_BLOCK))
257314
return &regmap_i2c_smbus_i2c_block;
315+
else if (config->val_bits == 8 && config->reg_bits == 16 &&
316+
i2c_check_functionality(i2c->adapter,
317+
I2C_FUNC_SMBUS_I2C_BLOCK))
318+
return &regmap_i2c_smbus_i2c_block_reg16;
258319
else if (config->val_bits == 16 && config->reg_bits == 8 &&
259320
i2c_check_functionality(i2c->adapter,
260321
I2C_FUNC_SMBUS_WORD_DATA))

drivers/base/regmap/regmap-irq.c

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -541,8 +541,9 @@ static const struct irq_domain_ops regmap_domain_ops = {
541541
};
542542

543543
/**
544-
* regmap_add_irq_chip() - Use standard regmap IRQ controller handling
544+
* regmap_add_irq_chip_np() - Use standard regmap IRQ controller handling
545545
*
546+
* @np: The device_node where the IRQ domain should be added to.
546547
* @map: The regmap for the device.
547548
* @irq: The IRQ the device uses to signal interrupts.
548549
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
@@ -556,9 +557,10 @@ static const struct irq_domain_ops regmap_domain_ops = {
556557
* register cache. The chip driver is responsible for restoring the
557558
* register values used by the IRQ controller over suspend and resume.
558559
*/
559-
int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
560-
int irq_base, const struct regmap_irq_chip *chip,
561-
struct regmap_irq_chip_data **data)
560+
int regmap_add_irq_chip_np(struct device_node *np, struct regmap *map, int irq,
561+
int irq_flags, int irq_base,
562+
const struct regmap_irq_chip *chip,
563+
struct regmap_irq_chip_data **data)
562564
{
563565
struct regmap_irq_chip_data *d;
564566
int i;
@@ -769,12 +771,10 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
769771
}
770772

771773
if (irq_base)
772-
d->domain = irq_domain_add_legacy(map->dev->of_node,
773-
chip->num_irqs, irq_base, 0,
774-
&regmap_domain_ops, d);
774+
d->domain = irq_domain_add_legacy(np, chip->num_irqs, irq_base,
775+
0, &regmap_domain_ops, d);
775776
else
776-
d->domain = irq_domain_add_linear(map->dev->of_node,
777-
chip->num_irqs,
777+
d->domain = irq_domain_add_linear(np, chip->num_irqs,
778778
&regmap_domain_ops, d);
779779
if (!d->domain) {
780780
dev_err(map->dev, "Failed to create IRQ domain\n");
@@ -808,6 +808,30 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
808808
kfree(d);
809809
return ret;
810810
}
811+
EXPORT_SYMBOL_GPL(regmap_add_irq_chip_np);
812+
813+
/**
814+
* regmap_add_irq_chip() - Use standard regmap IRQ controller handling
815+
*
816+
* @map: The regmap for the device.
817+
* @irq: The IRQ the device uses to signal interrupts.
818+
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
819+
* @irq_base: Allocate at specific IRQ number if irq_base > 0.
820+
* @chip: Configuration for the interrupt controller.
821+
* @data: Runtime data structure for the controller, allocated on success.
822+
*
823+
* Returns 0 on success or an errno on failure.
824+
*
825+
* This is the same as regmap_add_irq_chip_np, except that the device
826+
* node of the regmap is used.
827+
*/
828+
int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
829+
int irq_base, const struct regmap_irq_chip *chip,
830+
struct regmap_irq_chip_data **data)
831+
{
832+
return regmap_add_irq_chip_np(map->dev->of_node, map, irq, irq_flags,
833+
irq_base, chip, data);
834+
}
811835
EXPORT_SYMBOL_GPL(regmap_add_irq_chip);
812836

813837
/**
@@ -875,9 +899,10 @@ static int devm_regmap_irq_chip_match(struct device *dev, void *res, void *data)
875899
}
876900

877901
/**
878-
* devm_regmap_add_irq_chip() - Resource manager regmap_add_irq_chip()
902+
* devm_regmap_add_irq_chip_np() - Resource manager regmap_add_irq_chip_np()
879903
*
880904
* @dev: The device pointer on which irq_chip belongs to.
905+
* @np: The device_node where the IRQ domain should be added to.
881906
* @map: The regmap for the device.
882907
* @irq: The IRQ the device uses to signal interrupts
883908
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
@@ -890,10 +915,11 @@ static int devm_regmap_irq_chip_match(struct device *dev, void *res, void *data)
890915
* The &regmap_irq_chip_data will be automatically released when the device is
891916
* unbound.
892917
*/
893-
int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
894-
int irq_flags, int irq_base,
895-
const struct regmap_irq_chip *chip,
896-
struct regmap_irq_chip_data **data)
918+
int devm_regmap_add_irq_chip_np(struct device *dev, struct device_node *np,
919+
struct regmap *map, int irq, int irq_flags,
920+
int irq_base,
921+
const struct regmap_irq_chip *chip,
922+
struct regmap_irq_chip_data **data)
897923
{
898924
struct regmap_irq_chip_data **ptr, *d;
899925
int ret;
@@ -903,8 +929,8 @@ int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
903929
if (!ptr)
904930
return -ENOMEM;
905931

906-
ret = regmap_add_irq_chip(map, irq, irq_flags, irq_base,
907-
chip, &d);
932+
ret = regmap_add_irq_chip_np(np, map, irq, irq_flags, irq_base,
933+
chip, &d);
908934
if (ret < 0) {
909935
devres_free(ptr);
910936
return ret;
@@ -915,6 +941,32 @@ int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
915941
*data = d;
916942
return 0;
917943
}
944+
EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip_np);
945+
946+
/**
947+
* devm_regmap_add_irq_chip() - Resource manager regmap_add_irq_chip()
948+
*
949+
* @dev: The device pointer on which irq_chip belongs to.
950+
* @map: The regmap for the device.
951+
* @irq: The IRQ the device uses to signal interrupts
952+
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
953+
* @irq_base: Allocate at specific IRQ number if irq_base > 0.
954+
* @chip: Configuration for the interrupt controller.
955+
* @data: Runtime data structure for the controller, allocated on success
956+
*
957+
* Returns 0 on success or an errno on failure.
958+
*
959+
* The &regmap_irq_chip_data will be automatically released when the device is
960+
* unbound.
961+
*/
962+
int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
963+
int irq_flags, int irq_base,
964+
const struct regmap_irq_chip *chip,
965+
struct regmap_irq_chip_data **data)
966+
{
967+
return devm_regmap_add_irq_chip_np(dev, map->dev->of_node, map, irq,
968+
irq_flags, irq_base, chip, data);
969+
}
918970
EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip);
919971

920972
/**

drivers/base/regmap/regmap.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,7 @@ struct regmap *__regmap_init(struct device *dev,
827827
} else if (!bus->read || !bus->write) {
828828
map->reg_read = _regmap_bus_reg_read;
829829
map->reg_write = _regmap_bus_reg_write;
830+
map->reg_update_bits = bus->reg_update_bits;
830831

831832
map->defer_caching = false;
832833
goto skip_format_initialization;
@@ -2936,6 +2937,28 @@ int regmap_update_bits_base(struct regmap *map, unsigned int reg,
29362937
}
29372938
EXPORT_SYMBOL_GPL(regmap_update_bits_base);
29382939

2940+
/**
2941+
* regmap_test_bits() - Check if all specified bits are set in a register.
2942+
*
2943+
* @map: Register map to operate on
2944+
* @reg: Register to read from
2945+
* @bits: Bits to test
2946+
*
2947+
* Returns -1 if the underlying regmap_read() fails, 0 if at least one of the
2948+
* tested bits is not set and 1 if all tested bits are set.
2949+
*/
2950+
int regmap_test_bits(struct regmap *map, unsigned int reg, unsigned int bits)
2951+
{
2952+
unsigned int val, ret;
2953+
2954+
ret = regmap_read(map, reg, &val);
2955+
if (ret)
2956+
return ret;
2957+
2958+
return (val & bits) == bits;
2959+
}
2960+
EXPORT_SYMBOL_GPL(regmap_test_bits);
2961+
29392962
void regmap_async_complete_cb(struct regmap_async *async, int ret)
29402963
{
29412964
struct regmap *map = async->map;

0 commit comments

Comments
 (0)