spmi: system power management interface - elinux.org · page 1 open source open possibilities open...

30
PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by: Josh Cartwright Presentation Date: 4/30/14

Upload: others

Post on 12-Jun-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 1 Open Source Open Possibilities

Open Source Open Possibilities

SPMI: System Power Management Interface Presented by: Josh Cartwright Presentation Date: 4/30/14

Page 2: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 2

Open Source Open Possibilities

What is SPMI?

Page 3: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 3 Open Source Open Possibilities

Agenda

Architectural Overview

Components

Addressing

Sequences and Arbitration

Command set

Linux Kernel API

Real World Example

Page 4: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 4

Open Source Open Possibilities

Architecture

Page 5: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 5 Open Source Open Possibilities

Components

Master

At least one master, up to four masters

One Master designated Bus Owner Master (BOM)

All Masters can initiate Requests

Slave

Up to 16 slaves

Slaves can optionally be Request Capable (RCS)

Page 6: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 6 Open Source Open Possibilities

Master

Slave

Master

Slave

Slave

Slave

Page 7: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 7 Open Source Open Possibilities

Addressing

Master Identifier (MID) – 2-bits

Unique Slave Identifier (USID) – 4-bits

Group Slave Identifier (GSID) – 4-bits

Page 8: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 8 Open Source Open Possibilities

Enumeration

Addressing scheme designed by “System Integrator”

Page 9: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 9 Open Source Open Possibilities

Sequences

Bus Arbitration

Start condition

One or more Frames

Command Frame

Data Frame

No response frame

Bus Park Cycle

Page 10: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 10 Open Source Open Possibilities

Bus Arbitration

Responsibility of the current Bus Owner Master (BOM)

Sequences prioritized in the following levels:

Priority Request Capable Slave initiated

Priority Master initiated

Secondary Request Capable Slave initiated

Secondary Master initiated

Within each level:

Slaves are prioritized based on Unique Slave Identifier (USID)

Masters are prioritized using round robin scheme

– Also results in transition of BOM

Page 11: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 11 Open Source Open Possibilities

Command Set

17 defined Commands

State Management

Master register access

Slave register access

Page 12: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 12 Open Source Open Possibilities

Slave State Machine

STARTUP

Entered on reset

Regulators must be off

ACTIVE

Normal operating state

Regulator state user/manufacturer defined

SLEEP

Lower power state

Regulator state user/manufacturer defined

SHUTDOWN

Entered via command

Regulators must be off

Page 13: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 13 Open Source Open Possibilities

Command Set : State Management

Reset

Puts slave into STARTUP state

Sleep

Puts slave into SLEEP state

Shutdown

Puts slave into SHUTDOWN state

Wakeup

Takes slave out of SLEEP into ACTIVE state

Page 14: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 14 Open Source Open Possibilities

Command Set : Register Access

Register Read/Write

5-bit address, 8-bit data

Register 0 Write

8-bit data (address assumed 0)

Extended Register Read/Write

8-bit address, 16 bytes data

Extended Register Read/Write Long

16-bit address, 8 bytes data

Page 15: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 15 Open Source Open Possibilities

Command Set : Register Access (Master)

Master Read/Write

8-bit address, 8-bit data

Page 16: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 17

Open Source Open Possibilities

Linux Kernel API

Page 17: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 18 Open Source Open Possibilities

Tree layout

drivers/spmi/*

Contains SPMI “core” (spmi.c)

Contains SPMI controller implementations

Include/linux/spmi.h

Contains SPMI data structure definitions/function prototypes

drivers/base/regmap/regmap-spmi.c

Regmap implementation for SPMI devices

Documentation/devicetree/bindings/spmi/*

Generic SPMI device tree binding documentation

SPMI controller-specific device tree binding

(Landed in v3.15 merge window)

Page 18: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 19 Open Source Open Possibilities

Data Structures

struct spmi_controller;

Represents a hardware block capable of acting as a Master on an SPMI bus

struct spmi_device;

Represents an individual unique slave on the SPMI bus

struct spmi_driver;

May be attached to one or more spmi_device objects, implements slave-specific logic

Page 19: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 20 Open Source Open Possibilities

struct spmi_controller

struct spmi_controller {

struct device dev;

unsigned int nr;

int (*cmd)(struct spmi_controller *ctrl, u8 opcode, u8 sid);

int (*read_cmd)(struct spmi_controller *ctrl, u8 opcode,

u8 sid, u16 addr, u8 *buf, size_t len);

int (*write_cmd)(struct spmi_controller *ctrl, u8 opcode,

u8 sid, u16 addr, const u8 *buf, size_t len);

};

First two fields are managed by the SPMI core

– ‘dev’ hooks the controller into the kernels’ device model

– ‘nr’ is a unique controller number allocated by the core

Last three members are called by the SPMI core when software wants to issue a Sequence on the bus

spmi_controller_get_drvdata() for controller private data

Page 20: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 21 Open Source Open Possibilities

struct spmi_controller by example

static int my_probe(struct parent_bus_type *pdev)

{

struct spmi_controller *ctrl;

struct my_data *my_data;

int err;

ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*my_data));

if (!ctrl)

/* bail */;

my_data = spmi_controller_get_drvdata(ctrl);

/* initialize private my_data */

ctrl->cmd = my_cmd;

ctrl->read_cmd = my_read_cmd;

ctrl->write_cmd = my_write_cmd;

err = spmi_controller_add(ctrl);

if (err)

/* bail, but don't forget to spmi_controller_put()! */;

}

Page 21: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 22 Open Source Open Possibilities

struct spmi_controller::read_cmd

int (*read_cmd)(struct spmi_controller *ctrl, u8 opcode,

u8 sid, u16 addr, u8 *buf, size_t len);

ctrl: driver’s controller object

opcode: one of the following (defined in include/linux/spmi.h)

– SPMI_CMD_READ

– SPMI_CMD_READL

– SPMI_CMD_EXT_READL

sid: Slave Identififer (SID)

addr: register address

buf: buffer to read into

len: length of buffer

Page 22: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 23 Open Source Open Possibilities

struct spmi_driver

struct spmi_driver {

struct device_driver driver;

int (*probe)(struct spmi_device *sdev);

void (*remove)(struct spmi_device *sdev);

};

Simple device driver object

probe() is issued when the SPMI core wishes to attach the driver to a slave

remove() is issued when the SPMI device is to be removed

Page 23: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 24 Open Source Open Possibilities

struct spmi_driver by example

static const struct of_device_id my_of_table = {

{ .compatible = “acme,my_device” }, { },

};

MODULE_DEVICE_TABLE(of, my_of_table);

static struct spmi_driver my_spmi_driver = {

.driver = {

.name = “my_spmi_driver”,

.of_match_table = my_of_table,

},

.probe = my_spmi_probe,

.remove = my_spmi_remove,

};

module_spmi_driver(my_spmi_driver);

Page 24: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 25 Open Source Open Possibilities

struct spmi_device

struct spmi_device {

struct device dev;

struct spmi_controller *ctrl;

u8 usid;

};

spmi_device objects managed by the SPMI core

Page 25: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 26 Open Source Open Possibilities

struct spmi_device API

int spmi_register_read(struct spmi_device *sdev, u8 addr, u8 *buf);

int spmi_ext_register_read(struct spmi_device *sdev, u8 addr, u8 *buf,

size_t len);

int spmi_ext_register_readl(struct spmi_device *sdev, u16 addr, u8 *buf,

size_t len);

int spmi_register_write(struct spmi_device *sdev, u8 addr, u8 data);

int spmi_register_zero_write(struct spmi_device *sdev, u8 data);

int spmi_ext_register_write(struct spmi_device *sdev, u8 addr,

const u8 *buf, size_t len);

int spmi_ext_register_writel(struct spmi_device *sdev, u16 addr,

const u8 *buf, size_t len);

int spmi_command_reset(struct spmi_device *sdev);

int spmi_command_sleep(struct spmi_device *sdev);

int spmi_command_wakeup(struct spmi_device *sdev);

int spmi_command_shutdown(struct spmi_device *sdev);

Page 26: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 28 Open Source Open Possibilities

Device Tree Bindings

spmi@.. {

compatible = "...";

reg = <...>;

#address-cells = <2>;

#size-cells <0>;

child@0 {

compatible = "...";

reg = <0 SPMI_USID>;

};

child@7 {

compatible = "...";

reg = <7 SPMI_USID

3 SPMI_GSID>;

};

};

Page 27: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 29

Open Source Open Possibilities

Real World Implementation

Page 28: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 30 Open Source Open Possibilities

SPMI in the wild

MSM8974

Member of Qualcomm Snapdragon 800 Series SoCs

Quad-core Krait, Adreno 330 GPU, …

PM8841 & PM8941

Pair of PMICs housing regulators used to power the SoC and peripherals

Also responsible for battery management/charging

Various misc. functionality, too (GPIOs, RTC, …)

Communication between SoC and PMIC implemented over SPMI

Page 29: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 31 Open Source Open Possibilities

SPMI PMIC

Arbiter

MSM8974 PM8841

SPMI Slave

USID 0x4

SPMI Slave

USID 0x5

Regulators Regulators Regulators

PM8941

SPMI Slave

USID 0x0

SPMI Slave

USID 0x1

Regulators Regulators Regulators

On-chip

Masters

Page 30: SPMI: System Power Management Interface - eLinux.org · PAGE 1 Open Source Open Possibilities Open Source Open Possibilities SPMI: System Power Management Interface Presented by:

PAGE 32

Open Source Open Possibilities

Questions?