linux/drivers/spmi/spmi.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 and
   6 * only version 2 as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 */
  13#include <linux/kernel.h>
  14#include <linux/errno.h>
  15#include <linux/idr.h>
  16#include <linux/slab.h>
  17#include <linux/module.h>
  18#include <linux/of.h>
  19#include <linux/of_device.h>
  20#include <linux/platform_device.h>
  21#include <linux/spmi.h>
  22#include <linux/pm_runtime.h>
  23
  24#include <dt-bindings/spmi/spmi.h>
  25#define CREATE_TRACE_POINTS
  26#include <trace/events/spmi.h>
  27
  28static DEFINE_IDA(ctrl_ida);
  29
  30static void spmi_dev_release(struct device *dev)
  31{
  32        struct spmi_device *sdev = to_spmi_device(dev);
  33        kfree(sdev);
  34}
  35
  36static const struct device_type spmi_dev_type = {
  37        .release        = spmi_dev_release,
  38};
  39
  40static void spmi_ctrl_release(struct device *dev)
  41{
  42        struct spmi_controller *ctrl = to_spmi_controller(dev);
  43        ida_simple_remove(&ctrl_ida, ctrl->nr);
  44        kfree(ctrl);
  45}
  46
  47static const struct device_type spmi_ctrl_type = {
  48        .release        = spmi_ctrl_release,
  49};
  50
  51static int spmi_device_match(struct device *dev, struct device_driver *drv)
  52{
  53        if (of_driver_match_device(dev, drv))
  54                return 1;
  55
  56        if (drv->name)
  57                return strncmp(dev_name(dev), drv->name,
  58                               SPMI_NAME_SIZE) == 0;
  59
  60        return 0;
  61}
  62
  63/**
  64 * spmi_device_add() - add a device previously constructed via spmi_device_alloc()
  65 * @sdev:       spmi_device to be added
  66 */
  67int spmi_device_add(struct spmi_device *sdev)
  68{
  69        struct spmi_controller *ctrl = sdev->ctrl;
  70        int err;
  71
  72        dev_set_name(&sdev->dev, "%d-%02x", ctrl->nr, sdev->usid);
  73
  74        err = device_add(&sdev->dev);
  75        if (err < 0) {
  76                dev_err(&sdev->dev, "Can't add %s, status %d\n",
  77                        dev_name(&sdev->dev), err);
  78                goto err_device_add;
  79        }
  80
  81        dev_dbg(&sdev->dev, "device %s registered\n", dev_name(&sdev->dev));
  82
  83err_device_add:
  84        return err;
  85}
  86EXPORT_SYMBOL_GPL(spmi_device_add);
  87
  88/**
  89 * spmi_device_remove(): remove an SPMI device
  90 * @sdev:       spmi_device to be removed
  91 */
  92void spmi_device_remove(struct spmi_device *sdev)
  93{
  94        device_unregister(&sdev->dev);
  95}
  96EXPORT_SYMBOL_GPL(spmi_device_remove);
  97
  98static inline int
  99spmi_cmd(struct spmi_controller *ctrl, u8 opcode, u8 sid)
 100{
 101        int ret;
 102
 103        if (!ctrl || !ctrl->cmd || ctrl->dev.type != &spmi_ctrl_type)
 104                return -EINVAL;
 105
 106        ret = ctrl->cmd(ctrl, opcode, sid);
 107        trace_spmi_cmd(opcode, sid, ret);
 108        return ret;
 109}
 110
 111static inline int spmi_read_cmd(struct spmi_controller *ctrl, u8 opcode,
 112                                u8 sid, u16 addr, u8 *buf, size_t len)
 113{
 114        int ret;
 115
 116        if (!ctrl || !ctrl->read_cmd || ctrl->dev.type != &spmi_ctrl_type)
 117                return -EINVAL;
 118
 119        trace_spmi_read_begin(opcode, sid, addr);
 120        ret = ctrl->read_cmd(ctrl, opcode, sid, addr, buf, len);
 121        trace_spmi_read_end(opcode, sid, addr, ret, len, buf);
 122        return ret;
 123}
 124
 125static inline int spmi_write_cmd(struct spmi_controller *ctrl, u8 opcode,
 126                                 u8 sid, u16 addr, const u8 *buf, size_t len)
 127{
 128        int ret;
 129
 130        if (!ctrl || !ctrl->write_cmd || ctrl->dev.type != &spmi_ctrl_type)
 131                return -EINVAL;
 132
 133        trace_spmi_write_begin(opcode, sid, addr, len, buf);
 134        ret = ctrl->write_cmd(ctrl, opcode, sid, addr, buf, len);
 135        trace_spmi_write_end(opcode, sid, addr, ret);
 136        return ret;
 137}
 138
 139/**
 140 * spmi_register_read() - register read
 141 * @sdev:       SPMI device.
 142 * @addr:       slave register address (5-bit address).
 143 * @buf:        buffer to be populated with data from the Slave.
 144 *
 145 * Reads 1 byte of data from a Slave device register.
 146 */
 147int spmi_register_read(struct spmi_device *sdev, u8 addr, u8 *buf)
 148{
 149        /* 5-bit register address */
 150        if (addr > 0x1F)
 151                return -EINVAL;
 152
 153        return spmi_read_cmd(sdev->ctrl, SPMI_CMD_READ, sdev->usid, addr,
 154                             buf, 1);
 155}
 156EXPORT_SYMBOL_GPL(spmi_register_read);
 157
 158/**
 159 * spmi_ext_register_read() - extended register read
 160 * @sdev:       SPMI device.
 161 * @addr:       slave register address (8-bit address).
 162 * @buf:        buffer to be populated with data from the Slave.
 163 * @len:        the request number of bytes to read (up to 16 bytes).
 164 *
 165 * Reads up to 16 bytes of data from the extended register space on a
 166 * Slave device.
 167 */
 168int spmi_ext_register_read(struct spmi_device *sdev, u8 addr, u8 *buf,
 169                           size_t len)
 170{
 171        /* 8-bit register address, up to 16 bytes */
 172        if (len == 0 || len > 16)
 173                return -EINVAL;
 174
 175        return spmi_read_cmd(sdev->ctrl, SPMI_CMD_EXT_READ, sdev->usid, addr,
 176                             buf, len);
 177}
 178EXPORT_SYMBOL_GPL(spmi_ext_register_read);
 179
 180/**
 181 * spmi_ext_register_readl() - extended register read long
 182 * @sdev:       SPMI device.
 183 * @addr:       slave register address (16-bit address).
 184 * @buf:        buffer to be populated with data from the Slave.
 185 * @len:        the request number of bytes to read (up to 8 bytes).
 186 *
 187 * Reads up to 8 bytes of data from the extended register space on a
 188 * Slave device using 16-bit address.
 189 */
 190int spmi_ext_register_readl(struct spmi_device *sdev, u16 addr, u8 *buf,
 191                            size_t len)
 192{
 193        /* 16-bit register address, up to 8 bytes */
 194        if (len == 0 || len > 8)
 195                return -EINVAL;
 196
 197        return spmi_read_cmd(sdev->ctrl, SPMI_CMD_EXT_READL, sdev->usid, addr,
 198                             buf, len);
 199}
 200EXPORT_SYMBOL_GPL(spmi_ext_register_readl);
 201
 202/**
 203 * spmi_register_write() - register write
 204 * @sdev:       SPMI device
 205 * @addr:       slave register address (5-bit address).
 206 * @data:       buffer containing the data to be transferred to the Slave.
 207 *
 208 * Writes 1 byte of data to a Slave device register.
 209 */
 210int spmi_register_write(struct spmi_device *sdev, u8 addr, u8 data)
 211{
 212        /* 5-bit register address */
 213        if (addr > 0x1F)
 214                return -EINVAL;
 215
 216        return spmi_write_cmd(sdev->ctrl, SPMI_CMD_WRITE, sdev->usid, addr,
 217                              &data, 1);
 218}
 219EXPORT_SYMBOL_GPL(spmi_register_write);
 220
 221/**
 222 * spmi_register_zero_write() - register zero write
 223 * @sdev:       SPMI device.
 224 * @data:       the data to be written to register 0 (7-bits).
 225 *
 226 * Writes data to register 0 of the Slave device.
 227 */
 228int spmi_register_zero_write(struct spmi_device *sdev, u8 data)
 229{
 230        return spmi_write_cmd(sdev->ctrl, SPMI_CMD_ZERO_WRITE, sdev->usid, 0,
 231                              &data, 1);
 232}
 233EXPORT_SYMBOL_GPL(spmi_register_zero_write);
 234
 235/**
 236 * spmi_ext_register_write() - extended register write
 237 * @sdev:       SPMI device.
 238 * @addr:       slave register address (8-bit address).
 239 * @buf:        buffer containing the data to be transferred to the Slave.
 240 * @len:        the request number of bytes to read (up to 16 bytes).
 241 *
 242 * Writes up to 16 bytes of data to the extended register space of a
 243 * Slave device.
 244 */
 245int spmi_ext_register_write(struct spmi_device *sdev, u8 addr, const u8 *buf,
 246                            size_t len)
 247{
 248        /* 8-bit register address, up to 16 bytes */
 249        if (len == 0 || len > 16)
 250                return -EINVAL;
 251
 252        return spmi_write_cmd(sdev->ctrl, SPMI_CMD_EXT_WRITE, sdev->usid, addr,
 253                              buf, len);
 254}
 255EXPORT_SYMBOL_GPL(spmi_ext_register_write);
 256
 257/**
 258 * spmi_ext_register_writel() - extended register write long
 259 * @sdev:       SPMI device.
 260 * @addr:       slave register address (16-bit address).
 261 * @buf:        buffer containing the data to be transferred to the Slave.
 262 * @len:        the request number of bytes to read (up to 8 bytes).
 263 *
 264 * Writes up to 8 bytes of data to the extended register space of a
 265 * Slave device using 16-bit address.
 266 */
 267int spmi_ext_register_writel(struct spmi_device *sdev, u16 addr, const u8 *buf,
 268                             size_t len)
 269{
 270        /* 4-bit Slave Identifier, 16-bit register address, up to 8 bytes */
 271        if (len == 0 || len > 8)
 272                return -EINVAL;
 273
 274        return spmi_write_cmd(sdev->ctrl, SPMI_CMD_EXT_WRITEL, sdev->usid,
 275                              addr, buf, len);
 276}
 277EXPORT_SYMBOL_GPL(spmi_ext_register_writel);
 278
 279/**
 280 * spmi_command_reset() - sends RESET command to the specified slave
 281 * @sdev:       SPMI device.
 282 *
 283 * The Reset command initializes the Slave and forces all registers to
 284 * their reset values. The Slave shall enter the STARTUP state after
 285 * receiving a Reset command.
 286 */
 287int spmi_command_reset(struct spmi_device *sdev)
 288{
 289        return spmi_cmd(sdev->ctrl, SPMI_CMD_RESET, sdev->usid);
 290}
 291EXPORT_SYMBOL_GPL(spmi_command_reset);
 292
 293/**
 294 * spmi_command_sleep() - sends SLEEP command to the specified SPMI device
 295 * @sdev:       SPMI device.
 296 *
 297 * The Sleep command causes the Slave to enter the user defined SLEEP state.
 298 */
 299int spmi_command_sleep(struct spmi_device *sdev)
 300{
 301        return spmi_cmd(sdev->ctrl, SPMI_CMD_SLEEP, sdev->usid);
 302}
 303EXPORT_SYMBOL_GPL(spmi_command_sleep);
 304
 305/**
 306 * spmi_command_wakeup() - sends WAKEUP command to the specified SPMI device
 307 * @sdev:       SPMI device.
 308 *
 309 * The Wakeup command causes the Slave to move from the SLEEP state to
 310 * the ACTIVE state.
 311 */
 312int spmi_command_wakeup(struct spmi_device *sdev)
 313{
 314        return spmi_cmd(sdev->ctrl, SPMI_CMD_WAKEUP, sdev->usid);
 315}
 316EXPORT_SYMBOL_GPL(spmi_command_wakeup);
 317
 318/**
 319 * spmi_command_shutdown() - sends SHUTDOWN command to the specified SPMI device
 320 * @sdev:       SPMI device.
 321 *
 322 * The Shutdown command causes the Slave to enter the SHUTDOWN state.
 323 */
 324int spmi_command_shutdown(struct spmi_device *sdev)
 325{
 326        return spmi_cmd(sdev->ctrl, SPMI_CMD_SHUTDOWN, sdev->usid);
 327}
 328EXPORT_SYMBOL_GPL(spmi_command_shutdown);
 329
 330static int spmi_drv_probe(struct device *dev)
 331{
 332        const struct spmi_driver *sdrv = to_spmi_driver(dev->driver);
 333        struct spmi_device *sdev = to_spmi_device(dev);
 334        int err;
 335
 336        pm_runtime_get_noresume(dev);
 337        pm_runtime_set_active(dev);
 338        pm_runtime_enable(dev);
 339
 340        err = sdrv->probe(sdev);
 341        if (err)
 342                goto fail_probe;
 343
 344        return 0;
 345
 346fail_probe:
 347        pm_runtime_disable(dev);
 348        pm_runtime_set_suspended(dev);
 349        pm_runtime_put_noidle(dev);
 350        return err;
 351}
 352
 353static int spmi_drv_remove(struct device *dev)
 354{
 355        const struct spmi_driver *sdrv = to_spmi_driver(dev->driver);
 356
 357        pm_runtime_get_sync(dev);
 358        sdrv->remove(to_spmi_device(dev));
 359        pm_runtime_put_noidle(dev);
 360
 361        pm_runtime_disable(dev);
 362        pm_runtime_set_suspended(dev);
 363        pm_runtime_put_noidle(dev);
 364        return 0;
 365}
 366
 367static struct bus_type spmi_bus_type = {
 368        .name           = "spmi",
 369        .match          = spmi_device_match,
 370        .probe          = spmi_drv_probe,
 371        .remove         = spmi_drv_remove,
 372};
 373
 374/**
 375 * spmi_controller_alloc() - Allocate a new SPMI device
 376 * @ctrl:       associated controller
 377 *
 378 * Caller is responsible for either calling spmi_device_add() to add the
 379 * newly allocated controller, or calling spmi_device_put() to discard it.
 380 */
 381struct spmi_device *spmi_device_alloc(struct spmi_controller *ctrl)
 382{
 383        struct spmi_device *sdev;
 384
 385        sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
 386        if (!sdev)
 387                return NULL;
 388
 389        sdev->ctrl = ctrl;
 390        device_initialize(&sdev->dev);
 391        sdev->dev.parent = &ctrl->dev;
 392        sdev->dev.bus = &spmi_bus_type;
 393        sdev->dev.type = &spmi_dev_type;
 394        return sdev;
 395}
 396EXPORT_SYMBOL_GPL(spmi_device_alloc);
 397
 398/**
 399 * spmi_controller_alloc() - Allocate a new SPMI controller
 400 * @parent:     parent device
 401 * @size:       size of private data
 402 *
 403 * Caller is responsible for either calling spmi_controller_add() to add the
 404 * newly allocated controller, or calling spmi_controller_put() to discard it.
 405 * The allocated private data region may be accessed via
 406 * spmi_controller_get_drvdata()
 407 */
 408struct spmi_controller *spmi_controller_alloc(struct device *parent,
 409                                              size_t size)
 410{
 411        struct spmi_controller *ctrl;
 412        int id;
 413
 414        if (WARN_ON(!parent))
 415                return NULL;
 416
 417        ctrl = kzalloc(sizeof(*ctrl) + size, GFP_KERNEL);
 418        if (!ctrl)
 419                return NULL;
 420
 421        device_initialize(&ctrl->dev);
 422        ctrl->dev.type = &spmi_ctrl_type;
 423        ctrl->dev.bus = &spmi_bus_type;
 424        ctrl->dev.parent = parent;
 425        ctrl->dev.of_node = parent->of_node;
 426        spmi_controller_set_drvdata(ctrl, &ctrl[1]);
 427
 428        id = ida_simple_get(&ctrl_ida, 0, 0, GFP_KERNEL);
 429        if (id < 0) {
 430                dev_err(parent,
 431                        "unable to allocate SPMI controller identifier.\n");
 432                spmi_controller_put(ctrl);
 433                return NULL;
 434        }
 435
 436        ctrl->nr = id;
 437        dev_set_name(&ctrl->dev, "spmi-%d", id);
 438
 439        dev_dbg(&ctrl->dev, "allocated controller 0x%p id %d\n", ctrl, id);
 440        return ctrl;
 441}
 442EXPORT_SYMBOL_GPL(spmi_controller_alloc);
 443
 444static void of_spmi_register_devices(struct spmi_controller *ctrl)
 445{
 446        struct device_node *node;
 447        int err;
 448
 449        if (!ctrl->dev.of_node)
 450                return;
 451
 452        for_each_available_child_of_node(ctrl->dev.of_node, node) {
 453                struct spmi_device *sdev;
 454                u32 reg[2];
 455
 456                dev_dbg(&ctrl->dev, "adding child %s\n", node->full_name);
 457
 458                err = of_property_read_u32_array(node, "reg", reg, 2);
 459                if (err) {
 460                        dev_err(&ctrl->dev,
 461                                "node %s err (%d) does not have 'reg' property\n",
 462                                node->full_name, err);
 463                        continue;
 464                }
 465
 466                if (reg[1] != SPMI_USID) {
 467                        dev_err(&ctrl->dev,
 468                                "node %s contains unsupported 'reg' entry\n",
 469                                node->full_name);
 470                        continue;
 471                }
 472
 473                if (reg[0] >= SPMI_MAX_SLAVE_ID) {
 474                        dev_err(&ctrl->dev,
 475                                "invalid usid on node %s\n",
 476                                node->full_name);
 477                        continue;
 478                }
 479
 480                dev_dbg(&ctrl->dev, "read usid %02x\n", reg[0]);
 481
 482                sdev = spmi_device_alloc(ctrl);
 483                if (!sdev)
 484                        continue;
 485
 486                sdev->dev.of_node = node;
 487                sdev->usid = (u8) reg[0];
 488
 489                err = spmi_device_add(sdev);
 490                if (err) {
 491                        dev_err(&sdev->dev,
 492                                "failure adding device. status %d\n", err);
 493                        spmi_device_put(sdev);
 494                }
 495        }
 496}
 497
 498/**
 499 * spmi_controller_add() - Add an SPMI controller
 500 * @ctrl:       controller to be registered.
 501 *
 502 * Register a controller previously allocated via spmi_controller_alloc() with
 503 * the SPMI core.
 504 */
 505int spmi_controller_add(struct spmi_controller *ctrl)
 506{
 507        int ret;
 508
 509        /* Can't register until after driver model init */
 510        if (WARN_ON(!spmi_bus_type.p))
 511                return -EAGAIN;
 512
 513        ret = device_add(&ctrl->dev);
 514        if (ret)
 515                return ret;
 516
 517        if (IS_ENABLED(CONFIG_OF))
 518                of_spmi_register_devices(ctrl);
 519
 520        dev_dbg(&ctrl->dev, "spmi-%d registered: dev:%p\n",
 521                ctrl->nr, &ctrl->dev);
 522
 523        return 0;
 524};
 525EXPORT_SYMBOL_GPL(spmi_controller_add);
 526
 527/* Remove a device associated with a controller */
 528static int spmi_ctrl_remove_device(struct device *dev, void *data)
 529{
 530        struct spmi_device *spmidev = to_spmi_device(dev);
 531        if (dev->type == &spmi_dev_type)
 532                spmi_device_remove(spmidev);
 533        return 0;
 534}
 535
 536/**
 537 * spmi_controller_remove(): remove an SPMI controller
 538 * @ctrl:       controller to remove
 539 *
 540 * Remove a SPMI controller.  Caller is responsible for calling
 541 * spmi_controller_put() to discard the allocated controller.
 542 */
 543void spmi_controller_remove(struct spmi_controller *ctrl)
 544{
 545        int dummy;
 546
 547        if (!ctrl)
 548                return;
 549
 550        dummy = device_for_each_child(&ctrl->dev, NULL,
 551                                      spmi_ctrl_remove_device);
 552        device_del(&ctrl->dev);
 553}
 554EXPORT_SYMBOL_GPL(spmi_controller_remove);
 555
 556/**
 557 * spmi_driver_register() - Register client driver with SPMI core
 558 * @sdrv:       client driver to be associated with client-device.
 559 *
 560 * This API will register the client driver with the SPMI framework.
 561 * It is typically called from the driver's module-init function.
 562 */
 563int __spmi_driver_register(struct spmi_driver *sdrv, struct module *owner)
 564{
 565        sdrv->driver.bus = &spmi_bus_type;
 566        sdrv->driver.owner = owner;
 567        return driver_register(&sdrv->driver);
 568}
 569EXPORT_SYMBOL_GPL(__spmi_driver_register);
 570
 571static void __exit spmi_exit(void)
 572{
 573        bus_unregister(&spmi_bus_type);
 574}
 575module_exit(spmi_exit);
 576
 577static int __init spmi_init(void)
 578{
 579        return bus_register(&spmi_bus_type);
 580}
 581postcore_initcall(spmi_init);
 582
 583MODULE_LICENSE("GPL v2");
 584MODULE_DESCRIPTION("SPMI module");
 585MODULE_ALIAS("platform:spmi");
 586