linux/drivers/soc/ti/smartreflex.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * OMAP SmartReflex Voltage Control
   4 *
   5 * Author: Thara Gopinath       <thara@ti.com>
   6 *
   7 * Copyright (C) 2012 Texas Instruments, Inc.
   8 * Thara Gopinath <thara@ti.com>
   9 *
  10 * Copyright (C) 2008 Nokia Corporation
  11 * Kalle Jokiniemi
  12 *
  13 * Copyright (C) 2007 Texas Instruments, Inc.
  14 * Lesly A M <x0080970@ti.com>
  15 */
  16
  17#include <linux/module.h>
  18#include <linux/mod_devicetable.h>
  19#include <linux/interrupt.h>
  20#include <linux/clk.h>
  21#include <linux/io.h>
  22#include <linux/debugfs.h>
  23#include <linux/delay.h>
  24#include <linux/slab.h>
  25#include <linux/pm_runtime.h>
  26#include <linux/power/smartreflex.h>
  27
  28#define DRIVER_NAME     "smartreflex"
  29#define SMARTREFLEX_NAME_LEN    32
  30#define NVALUE_NAME_LEN         40
  31#define SR_DISABLE_TIMEOUT      200
  32
  33/* sr_list contains all the instances of smartreflex module */
  34static LIST_HEAD(sr_list);
  35
  36static struct omap_sr_class_data *sr_class;
  37static struct dentry            *sr_dbg_dir;
  38
  39static inline void sr_write_reg(struct omap_sr *sr, unsigned offset, u32 value)
  40{
  41        __raw_writel(value, (sr->base + offset));
  42}
  43
  44static inline void sr_modify_reg(struct omap_sr *sr, unsigned offset, u32 mask,
  45                                        u32 value)
  46{
  47        u32 reg_val;
  48
  49        /*
  50         * Smartreflex error config register is special as it contains
  51         * certain status bits which if written a 1 into means a clear
  52         * of those bits. So in order to make sure no accidental write of
  53         * 1 happens to those status bits, do a clear of them in the read
  54         * value. This mean this API doesn't rewrite values in these bits
  55         * if they are currently set, but does allow the caller to write
  56         * those bits.
  57         */
  58        if (sr->ip_type == SR_TYPE_V1 && offset == ERRCONFIG_V1)
  59                mask |= ERRCONFIG_STATUS_V1_MASK;
  60        else if (sr->ip_type == SR_TYPE_V2 && offset == ERRCONFIG_V2)
  61                mask |= ERRCONFIG_VPBOUNDINTST_V2;
  62
  63        reg_val = __raw_readl(sr->base + offset);
  64        reg_val &= ~mask;
  65
  66        value &= mask;
  67
  68        reg_val |= value;
  69
  70        __raw_writel(reg_val, (sr->base + offset));
  71}
  72
  73static inline u32 sr_read_reg(struct omap_sr *sr, unsigned offset)
  74{
  75        return __raw_readl(sr->base + offset);
  76}
  77
  78static struct omap_sr *_sr_lookup(struct voltagedomain *voltdm)
  79{
  80        struct omap_sr *sr_info;
  81
  82        if (!voltdm) {
  83                pr_err("%s: Null voltage domain passed!\n", __func__);
  84                return ERR_PTR(-EINVAL);
  85        }
  86
  87        list_for_each_entry(sr_info, &sr_list, node) {
  88                if (voltdm == sr_info->voltdm)
  89                        return sr_info;
  90        }
  91
  92        return ERR_PTR(-ENODATA);
  93}
  94
  95static irqreturn_t sr_interrupt(int irq, void *data)
  96{
  97        struct omap_sr *sr_info = data;
  98        u32 status = 0;
  99
 100        switch (sr_info->ip_type) {
 101        case SR_TYPE_V1:
 102                /* Read the status bits */
 103                status = sr_read_reg(sr_info, ERRCONFIG_V1);
 104
 105                /* Clear them by writing back */
 106                sr_write_reg(sr_info, ERRCONFIG_V1, status);
 107                break;
 108        case SR_TYPE_V2:
 109                /* Read the status bits */
 110                status = sr_read_reg(sr_info, IRQSTATUS);
 111
 112                /* Clear them by writing back */
 113                sr_write_reg(sr_info, IRQSTATUS, status);
 114                break;
 115        default:
 116                dev_err(&sr_info->pdev->dev, "UNKNOWN IP type %d\n",
 117                        sr_info->ip_type);
 118                return IRQ_NONE;
 119        }
 120
 121        if (sr_class->notify)
 122                sr_class->notify(sr_info, status);
 123
 124        return IRQ_HANDLED;
 125}
 126
 127static void sr_set_clk_length(struct omap_sr *sr)
 128{
 129        u32 fclk_speed;
 130
 131        /* Try interconnect target module fck first if it already exists */
 132        if (IS_ERR(sr->fck))
 133                return;
 134
 135        fclk_speed = clk_get_rate(sr->fck);
 136
 137        switch (fclk_speed) {
 138        case 12000000:
 139                sr->clk_length = SRCLKLENGTH_12MHZ_SYSCLK;
 140                break;
 141        case 13000000:
 142                sr->clk_length = SRCLKLENGTH_13MHZ_SYSCLK;
 143                break;
 144        case 19200000:
 145                sr->clk_length = SRCLKLENGTH_19MHZ_SYSCLK;
 146                break;
 147        case 26000000:
 148                sr->clk_length = SRCLKLENGTH_26MHZ_SYSCLK;
 149                break;
 150        case 38400000:
 151                sr->clk_length = SRCLKLENGTH_38MHZ_SYSCLK;
 152                break;
 153        default:
 154                dev_err(&sr->pdev->dev, "%s: Invalid fclk rate: %d\n",
 155                        __func__, fclk_speed);
 156                break;
 157        }
 158}
 159
 160static void sr_start_vddautocomp(struct omap_sr *sr)
 161{
 162        if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
 163                dev_warn(&sr->pdev->dev,
 164                         "%s: smartreflex class driver not registered\n",
 165                         __func__);
 166                return;
 167        }
 168
 169        if (!sr_class->enable(sr))
 170                sr->autocomp_active = true;
 171}
 172
 173static void sr_stop_vddautocomp(struct omap_sr *sr)
 174{
 175        if (!sr_class || !(sr_class->disable)) {
 176                dev_warn(&sr->pdev->dev,
 177                         "%s: smartreflex class driver not registered\n",
 178                         __func__);
 179                return;
 180        }
 181
 182        if (sr->autocomp_active) {
 183                sr_class->disable(sr, 1);
 184                sr->autocomp_active = false;
 185        }
 186}
 187
 188/*
 189 * This function handles the initializations which have to be done
 190 * only when both sr device and class driver regiter has
 191 * completed. This will be attempted to be called from both sr class
 192 * driver register and sr device intializtion API's. Only one call
 193 * will ultimately succeed.
 194 *
 195 * Currently this function registers interrupt handler for a particular SR
 196 * if smartreflex class driver is already registered and has
 197 * requested for interrupts and the SR interrupt line in present.
 198 */
 199static int sr_late_init(struct omap_sr *sr_info)
 200{
 201        struct omap_sr_data *pdata = sr_info->pdev->dev.platform_data;
 202        int ret = 0;
 203
 204        if (sr_class->notify && sr_class->notify_flags && sr_info->irq) {
 205                ret = devm_request_irq(&sr_info->pdev->dev, sr_info->irq,
 206                                       sr_interrupt, 0, sr_info->name, sr_info);
 207                if (ret)
 208                        goto error;
 209                disable_irq(sr_info->irq);
 210        }
 211
 212        if (pdata && pdata->enable_on_init)
 213                sr_start_vddautocomp(sr_info);
 214
 215        return ret;
 216
 217error:
 218        list_del(&sr_info->node);
 219        dev_err(&sr_info->pdev->dev, "%s: ERROR in registering interrupt handler. Smartreflex will not function as desired\n",
 220                __func__);
 221
 222        return ret;
 223}
 224
 225static void sr_v1_disable(struct omap_sr *sr)
 226{
 227        int timeout = 0;
 228        int errconf_val = ERRCONFIG_MCUACCUMINTST | ERRCONFIG_MCUVALIDINTST |
 229                        ERRCONFIG_MCUBOUNDINTST;
 230
 231        /* Enable MCUDisableAcknowledge interrupt */
 232        sr_modify_reg(sr, ERRCONFIG_V1,
 233                        ERRCONFIG_MCUDISACKINTEN, ERRCONFIG_MCUDISACKINTEN);
 234
 235        /* SRCONFIG - disable SR */
 236        sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0);
 237
 238        /* Disable all other SR interrupts and clear the status as needed */
 239        if (sr_read_reg(sr, ERRCONFIG_V1) & ERRCONFIG_VPBOUNDINTST_V1)
 240                errconf_val |= ERRCONFIG_VPBOUNDINTST_V1;
 241        sr_modify_reg(sr, ERRCONFIG_V1,
 242                        (ERRCONFIG_MCUACCUMINTEN | ERRCONFIG_MCUVALIDINTEN |
 243                        ERRCONFIG_MCUBOUNDINTEN | ERRCONFIG_VPBOUNDINTEN_V1),
 244                        errconf_val);
 245
 246        /*
 247         * Wait for SR to be disabled.
 248         * wait until ERRCONFIG.MCUDISACKINTST = 1. Typical latency is 1us.
 249         */
 250        sr_test_cond_timeout((sr_read_reg(sr, ERRCONFIG_V1) &
 251                             ERRCONFIG_MCUDISACKINTST), SR_DISABLE_TIMEOUT,
 252                             timeout);
 253
 254        if (timeout >= SR_DISABLE_TIMEOUT)
 255                dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n",
 256                         __func__);
 257
 258        /* Disable MCUDisableAcknowledge interrupt & clear pending interrupt */
 259        sr_modify_reg(sr, ERRCONFIG_V1, ERRCONFIG_MCUDISACKINTEN,
 260                        ERRCONFIG_MCUDISACKINTST);
 261}
 262
 263static void sr_v2_disable(struct omap_sr *sr)
 264{
 265        int timeout = 0;
 266
 267        /* Enable MCUDisableAcknowledge interrupt */
 268        sr_write_reg(sr, IRQENABLE_SET, IRQENABLE_MCUDISABLEACKINT);
 269
 270        /* SRCONFIG - disable SR */
 271        sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, 0x0);
 272
 273        /*
 274         * Disable all other SR interrupts and clear the status
 275         * write to status register ONLY on need basis - only if status
 276         * is set.
 277         */
 278        if (sr_read_reg(sr, ERRCONFIG_V2) & ERRCONFIG_VPBOUNDINTST_V2)
 279                sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2,
 280                        ERRCONFIG_VPBOUNDINTST_V2);
 281        else
 282                sr_modify_reg(sr, ERRCONFIG_V2, ERRCONFIG_VPBOUNDINTEN_V2,
 283                                0x0);
 284        sr_write_reg(sr, IRQENABLE_CLR, (IRQENABLE_MCUACCUMINT |
 285                        IRQENABLE_MCUVALIDINT |
 286                        IRQENABLE_MCUBOUNDSINT));
 287        sr_write_reg(sr, IRQSTATUS, (IRQSTATUS_MCUACCUMINT |
 288                        IRQSTATUS_MCVALIDINT |
 289                        IRQSTATUS_MCBOUNDSINT));
 290
 291        /*
 292         * Wait for SR to be disabled.
 293         * wait until IRQSTATUS.MCUDISACKINTST = 1. Typical latency is 1us.
 294         */
 295        sr_test_cond_timeout((sr_read_reg(sr, IRQSTATUS) &
 296                             IRQSTATUS_MCUDISABLEACKINT), SR_DISABLE_TIMEOUT,
 297                             timeout);
 298
 299        if (timeout >= SR_DISABLE_TIMEOUT)
 300                dev_warn(&sr->pdev->dev, "%s: Smartreflex disable timedout\n",
 301                         __func__);
 302
 303        /* Disable MCUDisableAcknowledge interrupt & clear pending interrupt */
 304        sr_write_reg(sr, IRQENABLE_CLR, IRQENABLE_MCUDISABLEACKINT);
 305        sr_write_reg(sr, IRQSTATUS, IRQSTATUS_MCUDISABLEACKINT);
 306}
 307
 308static struct omap_sr_nvalue_table *sr_retrieve_nvalue_row(
 309                                struct omap_sr *sr, u32 efuse_offs)
 310{
 311        int i;
 312
 313        if (!sr->nvalue_table) {
 314                dev_warn(&sr->pdev->dev, "%s: Missing ntarget value table\n",
 315                         __func__);
 316                return NULL;
 317        }
 318
 319        for (i = 0; i < sr->nvalue_count; i++) {
 320                if (sr->nvalue_table[i].efuse_offs == efuse_offs)
 321                        return &sr->nvalue_table[i];
 322        }
 323
 324        return NULL;
 325}
 326
 327/* Public Functions */
 328
 329/**
 330 * sr_configure_errgen() - Configures the SmartReflex to perform AVS using the
 331 *                       error generator module.
 332 * @sr:                 SR module to be configured.
 333 *
 334 * This API is to be called from the smartreflex class driver to
 335 * configure the error generator module inside the smartreflex module.
 336 * SR settings if using the ERROR module inside Smartreflex.
 337 * SR CLASS 3 by default uses only the ERROR module where as
 338 * SR CLASS 2 can choose between ERROR module and MINMAXAVG
 339 * module. Returns 0 on success and error value in case of failure.
 340 */
 341int sr_configure_errgen(struct omap_sr *sr)
 342{
 343        u32 sr_config, sr_errconfig, errconfig_offs;
 344        u32 vpboundint_en, vpboundint_st;
 345        u32 senp_en = 0, senn_en = 0;
 346        u8 senp_shift, senn_shift;
 347
 348        if (!sr) {
 349                pr_warn("%s: NULL omap_sr from %pS\n",
 350                        __func__, (void *)_RET_IP_);
 351                return -EINVAL;
 352        }
 353
 354        if (!sr->clk_length)
 355                sr_set_clk_length(sr);
 356
 357        senp_en = sr->senp_mod;
 358        senn_en = sr->senn_mod;
 359
 360        sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) |
 361                SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN;
 362
 363        switch (sr->ip_type) {
 364        case SR_TYPE_V1:
 365                sr_config |= SRCONFIG_DELAYCTRL;
 366                senn_shift = SRCONFIG_SENNENABLE_V1_SHIFT;
 367                senp_shift = SRCONFIG_SENPENABLE_V1_SHIFT;
 368                errconfig_offs = ERRCONFIG_V1;
 369                vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V1;
 370                vpboundint_st = ERRCONFIG_VPBOUNDINTST_V1;
 371                break;
 372        case SR_TYPE_V2:
 373                senn_shift = SRCONFIG_SENNENABLE_V2_SHIFT;
 374                senp_shift = SRCONFIG_SENPENABLE_V2_SHIFT;
 375                errconfig_offs = ERRCONFIG_V2;
 376                vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V2;
 377                vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2;
 378                break;
 379        default:
 380                dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
 381                        __func__);
 382                return -EINVAL;
 383        }
 384
 385        sr_config |= ((senn_en << senn_shift) | (senp_en << senp_shift));
 386        sr_write_reg(sr, SRCONFIG, sr_config);
 387        sr_errconfig = (sr->err_weight << ERRCONFIG_ERRWEIGHT_SHIFT) |
 388                (sr->err_maxlimit << ERRCONFIG_ERRMAXLIMIT_SHIFT) |
 389                (sr->err_minlimit <<  ERRCONFIG_ERRMINLIMIT_SHIFT);
 390        sr_modify_reg(sr, errconfig_offs, (SR_ERRWEIGHT_MASK |
 391                SR_ERRMAXLIMIT_MASK | SR_ERRMINLIMIT_MASK),
 392                sr_errconfig);
 393
 394        /* Enabling the interrupts if the ERROR module is used */
 395        sr_modify_reg(sr, errconfig_offs, (vpboundint_en | vpboundint_st),
 396                      vpboundint_en);
 397
 398        return 0;
 399}
 400
 401/**
 402 * sr_disable_errgen() - Disables SmartReflex AVS module's errgen component
 403 * @sr:                 SR module to be configured.
 404 *
 405 * This API is to be called from the smartreflex class driver to
 406 * disable the error generator module inside the smartreflex module.
 407 *
 408 * Returns 0 on success and error value in case of failure.
 409 */
 410int sr_disable_errgen(struct omap_sr *sr)
 411{
 412        u32 errconfig_offs;
 413        u32 vpboundint_en, vpboundint_st;
 414
 415        if (!sr) {
 416                pr_warn("%s: NULL omap_sr from %pS\n",
 417                        __func__, (void *)_RET_IP_);
 418                return -EINVAL;
 419        }
 420
 421        switch (sr->ip_type) {
 422        case SR_TYPE_V1:
 423                errconfig_offs = ERRCONFIG_V1;
 424                vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V1;
 425                vpboundint_st = ERRCONFIG_VPBOUNDINTST_V1;
 426                break;
 427        case SR_TYPE_V2:
 428                errconfig_offs = ERRCONFIG_V2;
 429                vpboundint_en = ERRCONFIG_VPBOUNDINTEN_V2;
 430                vpboundint_st = ERRCONFIG_VPBOUNDINTST_V2;
 431                break;
 432        default:
 433                dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
 434                        __func__);
 435                return -EINVAL;
 436        }
 437
 438        /* Disable the Sensor and errorgen */
 439        sr_modify_reg(sr, SRCONFIG, SRCONFIG_SENENABLE | SRCONFIG_ERRGEN_EN, 0);
 440
 441        /*
 442         * Disable the interrupts of ERROR module
 443         * NOTE: modify is a read, modify,write - an implicit OCP barrier
 444         * which is required is present here - sequencing is critical
 445         * at this point (after errgen is disabled, vpboundint disable)
 446         */
 447        sr_modify_reg(sr, errconfig_offs, vpboundint_en | vpboundint_st, 0);
 448
 449        return 0;
 450}
 451
 452/**
 453 * sr_configure_minmax() - Configures the SmartReflex to perform AVS using the
 454 *                       minmaxavg module.
 455 * @sr:                 SR module to be configured.
 456 *
 457 * This API is to be called from the smartreflex class driver to
 458 * configure the minmaxavg module inside the smartreflex module.
 459 * SR settings if using the ERROR module inside Smartreflex.
 460 * SR CLASS 3 by default uses only the ERROR module where as
 461 * SR CLASS 2 can choose between ERROR module and MINMAXAVG
 462 * module. Returns 0 on success and error value in case of failure.
 463 */
 464int sr_configure_minmax(struct omap_sr *sr)
 465{
 466        u32 sr_config, sr_avgwt;
 467        u32 senp_en = 0, senn_en = 0;
 468        u8 senp_shift, senn_shift;
 469
 470        if (!sr) {
 471                pr_warn("%s: NULL omap_sr from %pS\n",
 472                        __func__, (void *)_RET_IP_);
 473                return -EINVAL;
 474        }
 475
 476        if (!sr->clk_length)
 477                sr_set_clk_length(sr);
 478
 479        senp_en = sr->senp_mod;
 480        senn_en = sr->senn_mod;
 481
 482        sr_config = (sr->clk_length << SRCONFIG_SRCLKLENGTH_SHIFT) |
 483                SRCONFIG_SENENABLE |
 484                (sr->accum_data << SRCONFIG_ACCUMDATA_SHIFT);
 485
 486        switch (sr->ip_type) {
 487        case SR_TYPE_V1:
 488                sr_config |= SRCONFIG_DELAYCTRL;
 489                senn_shift = SRCONFIG_SENNENABLE_V1_SHIFT;
 490                senp_shift = SRCONFIG_SENPENABLE_V1_SHIFT;
 491                break;
 492        case SR_TYPE_V2:
 493                senn_shift = SRCONFIG_SENNENABLE_V2_SHIFT;
 494                senp_shift = SRCONFIG_SENPENABLE_V2_SHIFT;
 495                break;
 496        default:
 497                dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
 498                        __func__);
 499                return -EINVAL;
 500        }
 501
 502        sr_config |= ((senn_en << senn_shift) | (senp_en << senp_shift));
 503        sr_write_reg(sr, SRCONFIG, sr_config);
 504        sr_avgwt = (sr->senp_avgweight << AVGWEIGHT_SENPAVGWEIGHT_SHIFT) |
 505                (sr->senn_avgweight << AVGWEIGHT_SENNAVGWEIGHT_SHIFT);
 506        sr_write_reg(sr, AVGWEIGHT, sr_avgwt);
 507
 508        /*
 509         * Enabling the interrupts if MINMAXAVG module is used.
 510         * TODO: check if all the interrupts are mandatory
 511         */
 512        switch (sr->ip_type) {
 513        case SR_TYPE_V1:
 514                sr_modify_reg(sr, ERRCONFIG_V1,
 515                        (ERRCONFIG_MCUACCUMINTEN | ERRCONFIG_MCUVALIDINTEN |
 516                        ERRCONFIG_MCUBOUNDINTEN),
 517                        (ERRCONFIG_MCUACCUMINTEN | ERRCONFIG_MCUACCUMINTST |
 518                         ERRCONFIG_MCUVALIDINTEN | ERRCONFIG_MCUVALIDINTST |
 519                         ERRCONFIG_MCUBOUNDINTEN | ERRCONFIG_MCUBOUNDINTST));
 520                break;
 521        case SR_TYPE_V2:
 522                sr_write_reg(sr, IRQSTATUS,
 523                        IRQSTATUS_MCUACCUMINT | IRQSTATUS_MCVALIDINT |
 524                        IRQSTATUS_MCBOUNDSINT | IRQSTATUS_MCUDISABLEACKINT);
 525                sr_write_reg(sr, IRQENABLE_SET,
 526                        IRQENABLE_MCUACCUMINT | IRQENABLE_MCUVALIDINT |
 527                        IRQENABLE_MCUBOUNDSINT | IRQENABLE_MCUDISABLEACKINT);
 528                break;
 529        default:
 530                dev_err(&sr->pdev->dev, "%s: Trying to Configure smartreflex module without specifying the ip\n",
 531                        __func__);
 532                return -EINVAL;
 533        }
 534
 535        return 0;
 536}
 537
 538/**
 539 * sr_enable() - Enables the smartreflex module.
 540 * @sr:         pointer to which the SR module to be configured belongs to.
 541 * @volt:       The voltage at which the Voltage domain associated with
 542 *              the smartreflex module is operating at.
 543 *              This is required only to program the correct Ntarget value.
 544 *
 545 * This API is to be called from the smartreflex class driver to
 546 * enable a smartreflex module. Returns 0 on success. Returns error
 547 * value if the voltage passed is wrong or if ntarget value is wrong.
 548 */
 549int sr_enable(struct omap_sr *sr, unsigned long volt)
 550{
 551        struct omap_volt_data *volt_data;
 552        struct omap_sr_nvalue_table *nvalue_row;
 553        int ret;
 554
 555        if (!sr) {
 556                pr_warn("%s: NULL omap_sr from %pS\n",
 557                        __func__, (void *)_RET_IP_);
 558                return -EINVAL;
 559        }
 560
 561        volt_data = omap_voltage_get_voltdata(sr->voltdm, volt);
 562
 563        if (IS_ERR(volt_data)) {
 564                dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table for nominal voltage %ld\n",
 565                         __func__, volt);
 566                return PTR_ERR(volt_data);
 567        }
 568
 569        nvalue_row = sr_retrieve_nvalue_row(sr, volt_data->sr_efuse_offs);
 570
 571        if (!nvalue_row) {
 572                dev_warn(&sr->pdev->dev, "%s: failure getting SR data for this voltage %ld\n",
 573                         __func__, volt);
 574                return -ENODATA;
 575        }
 576
 577        /* errminlimit is opp dependent and hence linked to voltage */
 578        sr->err_minlimit = nvalue_row->errminlimit;
 579
 580        clk_enable(sr->fck);
 581
 582        /* Check if SR is already enabled. If yes do nothing */
 583        if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE)
 584                goto out_enabled;
 585
 586        /* Configure SR */
 587        ret = sr_class->configure(sr);
 588        if (ret)
 589                goto out_enabled;
 590
 591        sr_write_reg(sr, NVALUERECIPROCAL, nvalue_row->nvalue);
 592
 593        /* SRCONFIG - enable SR */
 594        sr_modify_reg(sr, SRCONFIG, SRCONFIG_SRENABLE, SRCONFIG_SRENABLE);
 595
 596out_enabled:
 597        sr->enabled = 1;
 598
 599        return 0;
 600}
 601
 602/**
 603 * sr_disable() - Disables the smartreflex module.
 604 * @sr:         pointer to which the SR module to be configured belongs to.
 605 *
 606 * This API is to be called from the smartreflex class driver to
 607 * disable a smartreflex module.
 608 */
 609void sr_disable(struct omap_sr *sr)
 610{
 611        if (!sr) {
 612                pr_warn("%s: NULL omap_sr from %pS\n",
 613                        __func__, (void *)_RET_IP_);
 614                return;
 615        }
 616
 617        /* Check if SR clocks are already disabled. If yes do nothing */
 618        if (!sr->enabled)
 619                return;
 620
 621        /*
 622         * Disable SR if only it is indeed enabled. Else just
 623         * disable the clocks.
 624         */
 625        if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE) {
 626                switch (sr->ip_type) {
 627                case SR_TYPE_V1:
 628                        sr_v1_disable(sr);
 629                        break;
 630                case SR_TYPE_V2:
 631                        sr_v2_disable(sr);
 632                        break;
 633                default:
 634                        dev_err(&sr->pdev->dev, "UNKNOWN IP type %d\n",
 635                                sr->ip_type);
 636                }
 637        }
 638
 639        clk_disable(sr->fck);
 640        sr->enabled = 0;
 641}
 642
 643/**
 644 * sr_register_class() - API to register a smartreflex class parameters.
 645 * @class_data: The structure containing various sr class specific data.
 646 *
 647 * This API is to be called by the smartreflex class driver to register itself
 648 * with the smartreflex driver during init. Returns 0 on success else the
 649 * error value.
 650 */
 651int sr_register_class(struct omap_sr_class_data *class_data)
 652{
 653        struct omap_sr *sr_info;
 654
 655        if (!class_data) {
 656                pr_warn("%s:, Smartreflex class data passed is NULL\n",
 657                        __func__);
 658                return -EINVAL;
 659        }
 660
 661        if (sr_class) {
 662                pr_warn("%s: Smartreflex class driver already registered\n",
 663                        __func__);
 664                return -EBUSY;
 665        }
 666
 667        sr_class = class_data;
 668
 669        /*
 670         * Call into late init to do initializations that require
 671         * both sr driver and sr class driver to be initiallized.
 672         */
 673        list_for_each_entry(sr_info, &sr_list, node)
 674                sr_late_init(sr_info);
 675
 676        return 0;
 677}
 678
 679/**
 680 * omap_sr_enable() -  API to enable SR clocks and to call into the
 681 *                      registered smartreflex class enable API.
 682 * @voltdm:     VDD pointer to which the SR module to be configured belongs to.
 683 *
 684 * This API is to be called from the kernel in order to enable
 685 * a particular smartreflex module. This API will do the initial
 686 * configurations to turn on the smartreflex module and in turn call
 687 * into the registered smartreflex class enable API.
 688 */
 689void omap_sr_enable(struct voltagedomain *voltdm)
 690{
 691        struct omap_sr *sr = _sr_lookup(voltdm);
 692
 693        if (IS_ERR(sr)) {
 694                pr_warn("%s: omap_sr struct for voltdm not found\n", __func__);
 695                return;
 696        }
 697
 698        if (!sr->autocomp_active)
 699                return;
 700
 701        if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
 702                dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
 703                         __func__);
 704                return;
 705        }
 706
 707        sr_class->enable(sr);
 708}
 709
 710/**
 711 * omap_sr_disable() - API to disable SR without resetting the voltage
 712 *                      processor voltage
 713 * @voltdm:     VDD pointer to which the SR module to be configured belongs to.
 714 *
 715 * This API is to be called from the kernel in order to disable
 716 * a particular smartreflex module. This API will in turn call
 717 * into the registered smartreflex class disable API. This API will tell
 718 * the smartreflex class disable not to reset the VP voltage after
 719 * disabling smartreflex.
 720 */
 721void omap_sr_disable(struct voltagedomain *voltdm)
 722{
 723        struct omap_sr *sr = _sr_lookup(voltdm);
 724
 725        if (IS_ERR(sr)) {
 726                pr_warn("%s: omap_sr struct for voltdm not found\n", __func__);
 727                return;
 728        }
 729
 730        if (!sr->autocomp_active)
 731                return;
 732
 733        if (!sr_class || !(sr_class->disable)) {
 734                dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
 735                         __func__);
 736                return;
 737        }
 738
 739        sr_class->disable(sr, 0);
 740}
 741
 742/**
 743 * omap_sr_disable_reset_volt() - API to disable SR and reset the
 744 *                              voltage processor voltage
 745 * @voltdm:     VDD pointer to which the SR module to be configured belongs to.
 746 *
 747 * This API is to be called from the kernel in order to disable
 748 * a particular smartreflex module. This API will in turn call
 749 * into the registered smartreflex class disable API. This API will tell
 750 * the smartreflex class disable to reset the VP voltage after
 751 * disabling smartreflex.
 752 */
 753void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)
 754{
 755        struct omap_sr *sr = _sr_lookup(voltdm);
 756
 757        if (IS_ERR(sr)) {
 758                pr_warn("%s: omap_sr struct for voltdm not found\n", __func__);
 759                return;
 760        }
 761
 762        if (!sr->autocomp_active)
 763                return;
 764
 765        if (!sr_class || !(sr_class->disable)) {
 766                dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not registered\n",
 767                         __func__);
 768                return;
 769        }
 770
 771        sr_class->disable(sr, 1);
 772}
 773
 774/* PM Debug FS entries to enable and disable smartreflex. */
 775static int omap_sr_autocomp_show(void *data, u64 *val)
 776{
 777        struct omap_sr *sr_info = data;
 778
 779        if (!sr_info) {
 780                pr_warn("%s: omap_sr struct not found\n", __func__);
 781                return -EINVAL;
 782        }
 783
 784        *val = sr_info->autocomp_active;
 785
 786        return 0;
 787}
 788
 789static int omap_sr_autocomp_store(void *data, u64 val)
 790{
 791        struct omap_sr *sr_info = data;
 792
 793        if (!sr_info) {
 794                pr_warn("%s: omap_sr struct not found\n", __func__);
 795                return -EINVAL;
 796        }
 797
 798        /* Sanity check */
 799        if (val > 1) {
 800                pr_warn("%s: Invalid argument %lld\n", __func__, val);
 801                return -EINVAL;
 802        }
 803
 804        /* control enable/disable only if there is a delta in value */
 805        if (sr_info->autocomp_active != val) {
 806                if (!val)
 807                        sr_stop_vddautocomp(sr_info);
 808                else
 809                        sr_start_vddautocomp(sr_info);
 810        }
 811
 812        return 0;
 813}
 814
 815DEFINE_SIMPLE_ATTRIBUTE(pm_sr_fops, omap_sr_autocomp_show,
 816                        omap_sr_autocomp_store, "%llu\n");
 817
 818static int omap_sr_probe(struct platform_device *pdev)
 819{
 820        struct omap_sr *sr_info;
 821        struct omap_sr_data *pdata = pdev->dev.platform_data;
 822        struct resource *mem, *irq;
 823        struct dentry *nvalue_dir;
 824        int i, ret = 0;
 825
 826        sr_info = devm_kzalloc(&pdev->dev, sizeof(struct omap_sr), GFP_KERNEL);
 827        if (!sr_info)
 828                return -ENOMEM;
 829
 830        sr_info->name = devm_kzalloc(&pdev->dev,
 831                                     SMARTREFLEX_NAME_LEN, GFP_KERNEL);
 832        if (!sr_info->name)
 833                return -ENOMEM;
 834
 835        platform_set_drvdata(pdev, sr_info);
 836
 837        if (!pdata) {
 838                dev_err(&pdev->dev, "%s: platform data missing\n", __func__);
 839                return -EINVAL;
 840        }
 841
 842        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 843        sr_info->base = devm_ioremap_resource(&pdev->dev, mem);
 844        if (IS_ERR(sr_info->base))
 845                return PTR_ERR(sr_info->base);
 846
 847        irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 848
 849        sr_info->fck = devm_clk_get(pdev->dev.parent, "fck");
 850        if (IS_ERR(sr_info->fck))
 851                return PTR_ERR(sr_info->fck);
 852        clk_prepare(sr_info->fck);
 853
 854        pm_runtime_enable(&pdev->dev);
 855
 856        snprintf(sr_info->name, SMARTREFLEX_NAME_LEN, "%s", pdata->name);
 857
 858        sr_info->pdev = pdev;
 859        sr_info->srid = pdev->id;
 860        sr_info->voltdm = pdata->voltdm;
 861        sr_info->nvalue_table = pdata->nvalue_table;
 862        sr_info->nvalue_count = pdata->nvalue_count;
 863        sr_info->senn_mod = pdata->senn_mod;
 864        sr_info->senp_mod = pdata->senp_mod;
 865        sr_info->err_weight = pdata->err_weight;
 866        sr_info->err_maxlimit = pdata->err_maxlimit;
 867        sr_info->accum_data = pdata->accum_data;
 868        sr_info->senn_avgweight = pdata->senn_avgweight;
 869        sr_info->senp_avgweight = pdata->senp_avgweight;
 870        sr_info->autocomp_active = false;
 871        sr_info->ip_type = pdata->ip_type;
 872
 873        if (irq)
 874                sr_info->irq = irq->start;
 875
 876        sr_set_clk_length(sr_info);
 877
 878        list_add(&sr_info->node, &sr_list);
 879
 880        /*
 881         * Call into late init to do initializations that require
 882         * both sr driver and sr class driver to be initiallized.
 883         */
 884        if (sr_class) {
 885                ret = sr_late_init(sr_info);
 886                if (ret) {
 887                        pr_warn("%s: Error in SR late init\n", __func__);
 888                        goto err_list_del;
 889                }
 890        }
 891
 892        dev_info(&pdev->dev, "%s: SmartReflex driver initialized\n", __func__);
 893        if (!sr_dbg_dir)
 894                sr_dbg_dir = debugfs_create_dir("smartreflex", NULL);
 895
 896        sr_info->dbg_dir = debugfs_create_dir(sr_info->name, sr_dbg_dir);
 897
 898        debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, sr_info->dbg_dir,
 899                            sr_info, &pm_sr_fops);
 900        debugfs_create_x32("errweight", S_IRUGO, sr_info->dbg_dir,
 901                           &sr_info->err_weight);
 902        debugfs_create_x32("errmaxlimit", S_IRUGO, sr_info->dbg_dir,
 903                           &sr_info->err_maxlimit);
 904
 905        nvalue_dir = debugfs_create_dir("nvalue", sr_info->dbg_dir);
 906
 907        if (sr_info->nvalue_count == 0 || !sr_info->nvalue_table) {
 908                dev_warn(&pdev->dev, "%s: %s: No Voltage table for the corresponding vdd. Cannot create debugfs entries for n-values\n",
 909                         __func__, sr_info->name);
 910
 911                ret = -ENODATA;
 912                goto err_debugfs;
 913        }
 914
 915        for (i = 0; i < sr_info->nvalue_count; i++) {
 916                char name[NVALUE_NAME_LEN + 1];
 917
 918                snprintf(name, sizeof(name), "volt_%lu",
 919                                sr_info->nvalue_table[i].volt_nominal);
 920                debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,
 921                                   &(sr_info->nvalue_table[i].nvalue));
 922                snprintf(name, sizeof(name), "errminlimit_%lu",
 923                         sr_info->nvalue_table[i].volt_nominal);
 924                debugfs_create_x32(name, S_IRUGO | S_IWUSR, nvalue_dir,
 925                                   &(sr_info->nvalue_table[i].errminlimit));
 926
 927        }
 928
 929        return ret;
 930
 931err_debugfs:
 932        debugfs_remove_recursive(sr_info->dbg_dir);
 933err_list_del:
 934        list_del(&sr_info->node);
 935        clk_unprepare(sr_info->fck);
 936
 937        return ret;
 938}
 939
 940static int omap_sr_remove(struct platform_device *pdev)
 941{
 942        struct omap_sr_data *pdata = pdev->dev.platform_data;
 943        struct device *dev = &pdev->dev;
 944        struct omap_sr *sr_info;
 945
 946        if (!pdata) {
 947                dev_err(&pdev->dev, "%s: platform data missing\n", __func__);
 948                return -EINVAL;
 949        }
 950
 951        sr_info = _sr_lookup(pdata->voltdm);
 952        if (IS_ERR(sr_info)) {
 953                dev_warn(&pdev->dev, "%s: omap_sr struct not found\n",
 954                        __func__);
 955                return PTR_ERR(sr_info);
 956        }
 957
 958        if (sr_info->autocomp_active)
 959                sr_stop_vddautocomp(sr_info);
 960        debugfs_remove_recursive(sr_info->dbg_dir);
 961
 962        pm_runtime_disable(dev);
 963        clk_unprepare(sr_info->fck);
 964        list_del(&sr_info->node);
 965        return 0;
 966}
 967
 968static void omap_sr_shutdown(struct platform_device *pdev)
 969{
 970        struct omap_sr_data *pdata = pdev->dev.platform_data;
 971        struct omap_sr *sr_info;
 972
 973        if (!pdata) {
 974                dev_err(&pdev->dev, "%s: platform data missing\n", __func__);
 975                return;
 976        }
 977
 978        sr_info = _sr_lookup(pdata->voltdm);
 979        if (IS_ERR(sr_info)) {
 980                dev_warn(&pdev->dev, "%s: omap_sr struct not found\n",
 981                        __func__);
 982                return;
 983        }
 984
 985        if (sr_info->autocomp_active)
 986                sr_stop_vddautocomp(sr_info);
 987
 988        return;
 989}
 990
 991static const struct of_device_id omap_sr_match[] = {
 992        { .compatible = "ti,omap3-smartreflex-core", },
 993        { .compatible = "ti,omap3-smartreflex-mpu-iva", },
 994        { .compatible = "ti,omap4-smartreflex-core", },
 995        { .compatible = "ti,omap4-smartreflex-mpu", },
 996        { .compatible = "ti,omap4-smartreflex-iva", },
 997        {  },
 998};
 999MODULE_DEVICE_TABLE(of, omap_sr_match);
1000
1001static struct platform_driver smartreflex_driver = {
1002        .probe          = omap_sr_probe,
1003        .remove         = omap_sr_remove,
1004        .shutdown       = omap_sr_shutdown,
1005        .driver         = {
1006                .name   = DRIVER_NAME,
1007                .of_match_table = omap_sr_match,
1008        },
1009};
1010
1011static int __init sr_init(void)
1012{
1013        int ret = 0;
1014
1015        ret = platform_driver_register(&smartreflex_driver);
1016        if (ret) {
1017                pr_err("%s: platform driver register failed for SR\n",
1018                       __func__);
1019                return ret;
1020        }
1021
1022        return 0;
1023}
1024late_initcall(sr_init);
1025
1026static void __exit sr_exit(void)
1027{
1028        platform_driver_unregister(&smartreflex_driver);
1029}
1030module_exit(sr_exit);
1031
1032MODULE_DESCRIPTION("OMAP Smartreflex Driver");
1033MODULE_LICENSE("GPL");
1034MODULE_ALIAS("platform:" DRIVER_NAME);
1035MODULE_AUTHOR("Texas Instruments Inc");
1036