Hi Matheusz, On 10 December 2015 at 14:41, Mateusz Kulikowski <mateusz.kulikow...@gmail.com> wrote: > Qualcom processors use proprietary bus to talk with PMIC devices - > SPMI (System Power Management Interface). > On wiring level it is similar to I2C, but on protocol level, it's > multi-master and has simple autodetection capabilities. > This commit adds simple uclass that provides bus read/write interface. > > Signed-off-by: Mateusz Kulikowski <mateusz.kulikow...@gmail.com> > --- > > drivers/Kconfig | 2 ++ > drivers/Makefile | 1 + > drivers/spmi/Kconfig | 10 +++++++++ > drivers/spmi/Makefile | 7 ++++++ > drivers/spmi/spmi-uclass.c | 53 > ++++++++++++++++++++++++++++++++++++++++++++++ > include/dm/uclass-id.h | 1 + > include/spmi/spmi.h | 44 ++++++++++++++++++++++++++++++++++++++ > 7 files changed, 118 insertions(+) > create mode 100644 drivers/spmi/Kconfig > create mode 100644 drivers/spmi/Makefile > create mode 100644 drivers/spmi/spmi-uclass.c > create mode 100644 include/spmi/spmi.h > > diff --git a/drivers/Kconfig b/drivers/Kconfig > index c481e93..4cbe976 100644 > --- a/drivers/Kconfig > +++ b/drivers/Kconfig > @@ -52,6 +52,8 @@ source "drivers/remoteproc/Kconfig" > > source "drivers/rtc/Kconfig" > > +source "drivers/spmi/Kconfig" > + > source "drivers/serial/Kconfig" > > source "drivers/sound/Kconfig" > diff --git a/drivers/Makefile b/drivers/Makefile > index c9031f2..7ae72c0 100644 > --- a/drivers/Makefile > +++ b/drivers/Makefile > @@ -53,6 +53,7 @@ obj-y += pcmcia/ > obj-y += dfu/ > obj-y += rtc/ > obj-y += sound/ > +obj-y += spmi/ > obj-y += timer/ > obj-y += tpm/ > obj-y += twserial/ > diff --git a/drivers/spmi/Kconfig b/drivers/spmi/Kconfig > new file mode 100644 > index 0000000..2d8d78b > --- /dev/null > +++ b/drivers/spmi/Kconfig > @@ -0,0 +1,10 @@ > +menu "SPMI support" > + > +config DM_SPMI > + bool "Enable SPMI bus support" > + depends on DM > + ---help--- > + Select this to enable to support SPMI bus. > + SPMI (System Power Management Interface) bus is used > + to connect PMIC devices on various SoCs. > +endmenu > diff --git a/drivers/spmi/Makefile b/drivers/spmi/Makefile > new file mode 100644 > index 0000000..2015b1a > --- /dev/null > +++ b/drivers/spmi/Makefile > @@ -0,0 +1,7 @@ > +# > +# (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikow...@gmail.com> > +# > +# SPDX-License-Identifier: GPL-2.0+ > +# > + > +obj-$(CONFIG_DM_SPMI) += spmi-uclass.o > diff --git a/drivers/spmi/spmi-uclass.c b/drivers/spmi/spmi-uclass.c > new file mode 100644 > index 0000000..981da68 > --- /dev/null > +++ b/drivers/spmi/spmi-uclass.c > @@ -0,0 +1,53 @@ > +/* > + * SPMI bus uclass driver > + * > + * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikow...@gmail.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <fdtdec.h> > +#include <errno.h> > +#include <dm.h> > +#include <dm/root.h> > +#include <vsprintf.h> > +#include <dm/lists.h> > +#include <dm/device-internal.h> > +#include <dm/uclass-internal.h> > +#include <linux/ctype.h> > +#include <spmi/spmi.h>
Fix ordering > + > +DECLARE_GLOBAL_DATA_PTR; > + > +int spmi_reg_read(struct udevice *dev, int usid, int pid, int reg) > +{ > + const struct dm_spmi_ops *ops = dev_get_driver_ops(dev); > + > + if (!ops || !ops->read) > + return -ENOSYS; > + > + return ops->read(dev, usid, pid, reg); > +} > + > +int spmi_reg_write(struct udevice *dev, int usid, int pid, int reg, > + uint8_t value) > +{ > + const struct dm_spmi_ops *ops = dev_get_driver_ops(dev); > + > + if (!ops || !ops->write) > + return -ENOSYS; > + > + return ops->write(dev, usid, pid, reg, value); > +} > + > +static int msm_spmi_post_bind(struct udevice *dev) > +{ > + return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false); > +} > + > +UCLASS_DRIVER(spmi) = { > + .id = UCLASS_SPMI, > + .name = "spmi", > + .post_bind = msm_spmi_post_bind, > +}; > diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h > index 27fa0b6..772e780 100644 > --- a/include/dm/uclass-id.h > +++ b/include/dm/uclass-id.h > @@ -57,6 +57,7 @@ enum uclass_id { > UCLASS_RTC, /* Real time clock device */ > UCLASS_SERIAL, /* Serial UART */ > UCLASS_SPI, /* SPI bus */ > + UCLASS_SPMI, /* System Power Management Interface bus */ > UCLASS_SPI_FLASH, /* SPI flash */ > UCLASS_SPI_GENERIC, /* Generic SPI flash target */ > UCLASS_SYSCON, /* System configuration device */ > diff --git a/include/spmi/spmi.h b/include/spmi/spmi.h > new file mode 100644 > index 0000000..e06a79e > --- /dev/null > +++ b/include/spmi/spmi.h > @@ -0,0 +1,44 @@ > +#ifndef _SPMI_SPMI_H > +#define _SPMI_SPMI_H > + > +/** > + * struct dm_spmi_ops - SPMI device I/O interface > + * > + * Should be implemented by UCLASS_SPMI device drivers. The standard > + * device operations provides the I/O interface for it's childs. > + * > + * @read: read register > + * @write: write register You should describe the args also. What is different between this and I2C? Could you use that uclass? It seems to have an additional address value (pid)- is that right? If you do end up with a new uclass, please add a sandbox driver for it and a test. > + */ > +struct dm_spmi_ops { > + int (*read)(struct udevice *dev, int usid, int pid, int reg); > + int (*write)(struct udevice *dev, int usid, int pid, int reg, > + uint8_t value); > +}; > + > +/** > + * spmi_reg_read() - read a register from specific slave/peripheral > + * > + * @dev: SPMI bus to read > + * @usid SlaveID > + * @pid Peripheral ID > + * @reg: Register to read > + * @return value read on success or negative value of errno. > + */ > +int spmi_reg_read(struct udevice *dev, int usid, int pid, int reg); > + > +/** > + * spmi_reg_write() - write a register of specific slave/peripheral > + * > + * @dev: SPMI bus to write > + * @usid SlaveID > + * @pid Peripheral ID > + * @reg: Register to write > + * @value: Value to write > + * @return 0 on success or negative value of errno. > + */ > +int spmi_reg_write(struct udevice *dev, int usid, int pid, int reg, > + uint8_t value); > + > +#endif > + > -- > 2.5.0 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot