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