Messages in this thread | | | Date | Thu, 24 Oct 2019 09:29:28 +0100 | From | Lee Jones <> | Subject | Re: [PATCH v4] mfd: mt6360: add pmic mt6360 driver |
| |
On Tue, 22 Oct 2019, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com> > > Add mfd driver for mt6360 pmic chip include > Battery Charger/USB_PD/Flash LED/RGB LED/LDO/Buck > > Signed-off-by: Gene Chen <gene_chen@richtek.com > --- > drivers/mfd/Kconfig | 12 + > drivers/mfd/Makefile | 1 + > drivers/mfd/mt6360-core.c | 457 +++++++++++++++++++++++++++++++++++++ > include/linux/mfd/mt6360-private.h | 279 ++++++++++++++++++++++ > include/linux/mfd/mt6360.h | 32 +++ > 5 files changed, 781 insertions(+) > create mode 100644 drivers/mfd/mt6360-core.c > create mode 100644 include/linux/mfd/mt6360-private.h > create mode 100644 include/linux/mfd/mt6360.h > > changelogs between v1 & v2 > - include missing header file > > changelogs between v2 & v3 > - add changelogs > > changelogs between v3 & v4 > - fix Kconfig description > - replace mt6360_pmu_info with mt6360_pmu_data > - replace probe with probe_new > - remove unnecessary irq_chip variable > - remove annotation > - replace MT6360_MFD_CELL with OF_MFD_CELL
[...]
> +/* IRQ definitions */ > +struct mt6360_pmu_irq_desc { > + const char *name; > + irq_handler_t irq_handler; > +}; > + > +#define MT6360_DT_VALPROP(name, type) \ > + {#name, offsetof(type, name)} > + > +struct mt6360_val_prop { > + const char *name; > + size_t offset; > +}; > + > +static inline void mt6360_dt_parser_helper(struct device_node *np, void *data, > + const struct mt6360_val_prop *props, > + int prop_cnt) > +{ > + int i; > + > + for (i = 0; i < prop_cnt; i++) { > + if (unlikely(!props[i].name)) > + continue; > + of_property_read_u32(np, props[i].name, data + props[i].offset); > + } > +} > + > +#define MT6360_PDATA_VALPROP(name, type, reg, shift, mask, func, base) \ > + {offsetof(type, name), reg, shift, mask, func, base} > + > +struct mt6360_pdata_prop { > + size_t offset; > + u8 reg; > + u8 shift; > + u8 mask; > + u32 (*transform)(u32 val); > + u8 base; > +}; > + > +static inline int mt6360_pdata_apply_helper(void *context, void *pdata, > + const struct mt6360_pdata_prop *prop, > + int prop_cnt) > +{ > + int i, ret; > + u32 val; > + > + for (i = 0; i < prop_cnt; i++) { > + val = *(u32 *)(pdata + prop[i].offset); > + if (prop[i].transform) > + val = prop[i].transform(val); > + val += prop[i].base; > + ret = regmap_update_bits(context, > + prop[i].reg, prop[i].mask, val << prop[i].shift); > + if (ret < 0) > + return ret; > + } > + return 0; > +}
Where are these helpers used?
Are they generic?
Why are they helpful to you, but not helpful to anyone else?
-- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
| |