linux/drivers/phy/ti/phy-twl4030-usb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * twl4030_usb - TWL4030 USB transceiver, talking to OMAP OTG controller
   4 *
   5 * Copyright (C) 2004-2007 Texas Instruments
   6 * Copyright (C) 2008 Nokia Corporation
   7 * Contact: Felipe Balbi <felipe.balbi@nokia.com>
   8 *
   9 * Current status:
  10 *      - HS USB ULPI mode works.
  11 *      - 3-pin mode support may be added in future.
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/init.h>
  16#include <linux/interrupt.h>
  17#include <linux/platform_device.h>
  18#include <linux/workqueue.h>
  19#include <linux/io.h>
  20#include <linux/delay.h>
  21#include <linux/usb/otg.h>
  22#include <linux/phy/phy.h>
  23#include <linux/pm_runtime.h>
  24#include <linux/usb/musb.h>
  25#include <linux/usb/ulpi.h>
  26#include <linux/mfd/twl.h>
  27#include <linux/regulator/consumer.h>
  28#include <linux/err.h>
  29#include <linux/slab.h>
  30
  31/* Register defines */
  32
  33#define MCPC_CTRL                       0x30
  34#define MCPC_CTRL_RTSOL                 (1 << 7)
  35#define MCPC_CTRL_EXTSWR                (1 << 6)
  36#define MCPC_CTRL_EXTSWC                (1 << 5)
  37#define MCPC_CTRL_VOICESW               (1 << 4)
  38#define MCPC_CTRL_OUT64K                (1 << 3)
  39#define MCPC_CTRL_RTSCTSSW              (1 << 2)
  40#define MCPC_CTRL_HS_UART               (1 << 0)
  41
  42#define MCPC_IO_CTRL                    0x33
  43#define MCPC_IO_CTRL_MICBIASEN          (1 << 5)
  44#define MCPC_IO_CTRL_CTS_NPU            (1 << 4)
  45#define MCPC_IO_CTRL_RXD_PU             (1 << 3)
  46#define MCPC_IO_CTRL_TXDTYP             (1 << 2)
  47#define MCPC_IO_CTRL_CTSTYP             (1 << 1)
  48#define MCPC_IO_CTRL_RTSTYP             (1 << 0)
  49
  50#define MCPC_CTRL2                      0x36
  51#define MCPC_CTRL2_MCPC_CK_EN           (1 << 0)
  52
  53#define OTHER_FUNC_CTRL                 0x80
  54#define OTHER_FUNC_CTRL_BDIS_ACON_EN    (1 << 4)
  55#define OTHER_FUNC_CTRL_FIVEWIRE_MODE   (1 << 2)
  56
  57#define OTHER_IFC_CTRL                  0x83
  58#define OTHER_IFC_CTRL_OE_INT_EN        (1 << 6)
  59#define OTHER_IFC_CTRL_CEA2011_MODE     (1 << 5)
  60#define OTHER_IFC_CTRL_FSLSSERIALMODE_4PIN      (1 << 4)
  61#define OTHER_IFC_CTRL_HIZ_ULPI_60MHZ_OUT       (1 << 3)
  62#define OTHER_IFC_CTRL_HIZ_ULPI         (1 << 2)
  63#define OTHER_IFC_CTRL_ALT_INT_REROUTE  (1 << 0)
  64
  65#define OTHER_INT_EN_RISE               0x86
  66#define OTHER_INT_EN_FALL               0x89
  67#define OTHER_INT_STS                   0x8C
  68#define OTHER_INT_LATCH                 0x8D
  69#define OTHER_INT_VB_SESS_VLD           (1 << 7)
  70#define OTHER_INT_DM_HI                 (1 << 6) /* not valid for "latch" reg */
  71#define OTHER_INT_DP_HI                 (1 << 5) /* not valid for "latch" reg */
  72#define OTHER_INT_BDIS_ACON             (1 << 3) /* not valid for "fall" regs */
  73#define OTHER_INT_MANU                  (1 << 1)
  74#define OTHER_INT_ABNORMAL_STRESS       (1 << 0)
  75
  76#define ID_STATUS                       0x96
  77#define ID_RES_FLOAT                    (1 << 4)
  78#define ID_RES_440K                     (1 << 3)
  79#define ID_RES_200K                     (1 << 2)
  80#define ID_RES_102K                     (1 << 1)
  81#define ID_RES_GND                      (1 << 0)
  82
  83#define POWER_CTRL                      0xAC
  84#define POWER_CTRL_OTG_ENAB             (1 << 5)
  85
  86#define OTHER_IFC_CTRL2                 0xAF
  87#define OTHER_IFC_CTRL2_ULPI_STP_LOW    (1 << 4)
  88#define OTHER_IFC_CTRL2_ULPI_TXEN_POL   (1 << 3)
  89#define OTHER_IFC_CTRL2_ULPI_4PIN_2430  (1 << 2)
  90#define OTHER_IFC_CTRL2_USB_INT_OUTSEL_MASK     (3 << 0) /* bits 0 and 1 */
  91#define OTHER_IFC_CTRL2_USB_INT_OUTSEL_INT1N    (0 << 0)
  92#define OTHER_IFC_CTRL2_USB_INT_OUTSEL_INT2N    (1 << 0)
  93
  94#define REG_CTRL_EN                     0xB2
  95#define REG_CTRL_ERROR                  0xB5
  96#define ULPI_I2C_CONFLICT_INTEN         (1 << 0)
  97
  98#define OTHER_FUNC_CTRL2                0xB8
  99#define OTHER_FUNC_CTRL2_VBAT_TIMER_EN  (1 << 0)
 100
 101/* following registers do not have separate _clr and _set registers */
 102#define VBUS_DEBOUNCE                   0xC0
 103#define ID_DEBOUNCE                     0xC1
 104#define VBAT_TIMER                      0xD3
 105#define PHY_PWR_CTRL                    0xFD
 106#define PHY_PWR_PHYPWD                  (1 << 0)
 107#define PHY_CLK_CTRL                    0xFE
 108#define PHY_CLK_CTRL_CLOCKGATING_EN     (1 << 2)
 109#define PHY_CLK_CTRL_CLK32K_EN          (1 << 1)
 110#define REQ_PHY_DPLL_CLK                (1 << 0)
 111#define PHY_CLK_CTRL_STS                0xFF
 112#define PHY_DPLL_CLK                    (1 << 0)
 113
 114/* In module TWL_MODULE_PM_MASTER */
 115#define STS_HW_CONDITIONS               0x0F
 116
 117/* In module TWL_MODULE_PM_RECEIVER */
 118#define VUSB_DEDICATED1                 0x7D
 119#define VUSB_DEDICATED2                 0x7E
 120#define VUSB1V5_DEV_GRP                 0x71
 121#define VUSB1V5_TYPE                    0x72
 122#define VUSB1V5_REMAP                   0x73
 123#define VUSB1V8_DEV_GRP                 0x74
 124#define VUSB1V8_TYPE                    0x75
 125#define VUSB1V8_REMAP                   0x76
 126#define VUSB3V1_DEV_GRP                 0x77
 127#define VUSB3V1_TYPE                    0x78
 128#define VUSB3V1_REMAP                   0x79
 129
 130/* In module TWL4030_MODULE_INTBR */
 131#define PMBR1                           0x0D
 132#define GPIO_USB_4PIN_ULPI_2430C        (3 << 0)
 133
 134static irqreturn_t twl4030_usb_irq(int irq, void *_twl);
 135/*
 136 * If VBUS is valid or ID is ground, then we know a
 137 * cable is present and we need to be runtime-enabled
 138 */
 139static inline bool cable_present(enum musb_vbus_id_status stat)
 140{
 141        return stat == MUSB_VBUS_VALID ||
 142                stat == MUSB_ID_GROUND;
 143}
 144
 145struct twl4030_usb {
 146        struct usb_phy          phy;
 147        struct device           *dev;
 148
 149        /* TWL4030 internal USB regulator supplies */
 150        struct regulator        *usb1v5;
 151        struct regulator        *usb1v8;
 152        struct regulator        *usb3v1;
 153
 154        /* for vbus reporting with irqs disabled */
 155        struct mutex            lock;
 156
 157        /* pin configuration */
 158        enum twl4030_usb_mode   usb_mode;
 159
 160        int                     irq;
 161        enum musb_vbus_id_status linkstat;
 162        atomic_t                connected;
 163        bool                    vbus_supplied;
 164        bool                    musb_mailbox_pending;
 165        unsigned long           runtime_suspended:1;
 166        unsigned long           needs_resume:1;
 167
 168        struct delayed_work     id_workaround_work;
 169};
 170
 171/* internal define on top of container_of */
 172#define phy_to_twl(x)           container_of((x), struct twl4030_usb, phy)
 173
 174/*-------------------------------------------------------------------------*/
 175
 176static int twl4030_i2c_write_u8_verify(struct twl4030_usb *twl,
 177                u8 module, u8 data, u8 address)
 178{
 179        u8 check = 0xFF;
 180
 181        if ((twl_i2c_write_u8(module, data, address) >= 0) &&
 182            (twl_i2c_read_u8(module, &check, address) >= 0) &&
 183                                                (check == data))
 184                return 0;
 185        dev_dbg(twl->dev, "Write%d[%d,0x%x] wrote %02x but read %02x\n",
 186                        1, module, address, check, data);
 187
 188        /* Failed once: Try again */
 189        if ((twl_i2c_write_u8(module, data, address) >= 0) &&
 190            (twl_i2c_read_u8(module, &check, address) >= 0) &&
 191                                                (check == data))
 192                return 0;
 193        dev_dbg(twl->dev, "Write%d[%d,0x%x] wrote %02x but read %02x\n",
 194                        2, module, address, check, data);
 195
 196        /* Failed again: Return error */
 197        return -EBUSY;
 198}
 199
 200#define twl4030_usb_write_verify(twl, address, data)    \
 201        twl4030_i2c_write_u8_verify(twl, TWL_MODULE_USB, (data), (address))
 202
 203static inline int twl4030_usb_write(struct twl4030_usb *twl,
 204                u8 address, u8 data)
 205{
 206        int ret = 0;
 207
 208        ret = twl_i2c_write_u8(TWL_MODULE_USB, data, address);
 209        if (ret < 0)
 210                dev_dbg(twl->dev,
 211                        "TWL4030:USB:Write[0x%x] Error %d\n", address, ret);
 212        return ret;
 213}
 214
 215static inline int twl4030_readb(struct twl4030_usb *twl, u8 module, u8 address)
 216{
 217        u8 data;
 218        int ret = 0;
 219
 220        ret = twl_i2c_read_u8(module, &data, address);
 221        if (ret >= 0)
 222                ret = data;
 223        else
 224                dev_dbg(twl->dev,
 225                        "TWL4030:readb[0x%x,0x%x] Error %d\n",
 226                                        module, address, ret);
 227
 228        return ret;
 229}
 230
 231static inline int twl4030_usb_read(struct twl4030_usb *twl, u8 address)
 232{
 233        return twl4030_readb(twl, TWL_MODULE_USB, address);
 234}
 235
 236/*-------------------------------------------------------------------------*/
 237
 238static inline int
 239twl4030_usb_set_bits(struct twl4030_usb *twl, u8 reg, u8 bits)
 240{
 241        return twl4030_usb_write(twl, ULPI_SET(reg), bits);
 242}
 243
 244static inline int
 245twl4030_usb_clear_bits(struct twl4030_usb *twl, u8 reg, u8 bits)
 246{
 247        return twl4030_usb_write(twl, ULPI_CLR(reg), bits);
 248}
 249
 250/*-------------------------------------------------------------------------*/
 251
 252static bool twl4030_is_driving_vbus(struct twl4030_usb *twl)
 253{
 254        int ret;
 255
 256        ret = twl4030_usb_read(twl, PHY_CLK_CTRL_STS);
 257        if (ret < 0 || !(ret & PHY_DPLL_CLK))
 258                /*
 259                 * if clocks are off, registers are not updated,
 260                 * but we can assume we don't drive VBUS in this case
 261                 */
 262                return false;
 263
 264        ret = twl4030_usb_read(twl, ULPI_OTG_CTRL);
 265        if (ret < 0)
 266                return false;
 267
 268        return (ret & (ULPI_OTG_DRVVBUS | ULPI_OTG_CHRGVBUS)) ? true : false;
 269}
 270
 271static enum musb_vbus_id_status
 272        twl4030_usb_linkstat(struct twl4030_usb *twl)
 273{
 274        int     status;
 275        enum musb_vbus_id_status linkstat = MUSB_UNKNOWN;
 276
 277        twl->vbus_supplied = false;
 278
 279        /*
 280         * For ID/VBUS sensing, see manual section 15.4.8 ...
 281         * except when using only battery backup power, two
 282         * comparators produce VBUS_PRES and ID_PRES signals,
 283         * which don't match docs elsewhere.  But ... BIT(7)
 284         * and BIT(2) of STS_HW_CONDITIONS, respectively, do
 285         * seem to match up.  If either is true the USB_PRES
 286         * signal is active, the OTG module is activated, and
 287         * its interrupt may be raised (may wake the system).
 288         */
 289        status = twl4030_readb(twl, TWL_MODULE_PM_MASTER, STS_HW_CONDITIONS);
 290        if (status < 0)
 291                dev_err(twl->dev, "USB link status err %d\n", status);
 292        else if (status & (BIT(7) | BIT(2))) {
 293                if (status & BIT(7)) {
 294                        if (twl4030_is_driving_vbus(twl))
 295                                status &= ~BIT(7);
 296                        else
 297                                twl->vbus_supplied = true;
 298                }
 299
 300                if (status & BIT(2))
 301                        linkstat = MUSB_ID_GROUND;
 302                else if (status & BIT(7))
 303                        linkstat = MUSB_VBUS_VALID;
 304                else
 305                        linkstat = MUSB_VBUS_OFF;
 306        } else {
 307                if (twl->linkstat != MUSB_UNKNOWN)
 308                        linkstat = MUSB_VBUS_OFF;
 309        }
 310
 311        kobject_uevent(&twl->dev->kobj, linkstat == MUSB_VBUS_VALID
 312                                        ? KOBJ_ONLINE : KOBJ_OFFLINE);
 313
 314        dev_dbg(twl->dev, "HW_CONDITIONS 0x%02x/%d; link %d\n",
 315                        status, status, linkstat);
 316
 317        /* REVISIT this assumes host and peripheral controllers
 318         * are registered, and that both are active...
 319         */
 320
 321        return linkstat;
 322}
 323
 324static void twl4030_usb_set_mode(struct twl4030_usb *twl, int mode)
 325{
 326        twl->usb_mode = mode;
 327
 328        switch (mode) {
 329        case T2_USB_MODE_ULPI:
 330                twl4030_usb_clear_bits(twl, ULPI_IFC_CTRL,
 331                                        ULPI_IFC_CTRL_CARKITMODE);
 332                twl4030_usb_set_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB);
 333                twl4030_usb_clear_bits(twl, ULPI_FUNC_CTRL,
 334                                        ULPI_FUNC_CTRL_XCVRSEL_MASK |
 335                                        ULPI_FUNC_CTRL_OPMODE_MASK);
 336                break;
 337        case -1:
 338                /* FIXME: power on defaults */
 339                break;
 340        default:
 341                dev_err(twl->dev, "unsupported T2 transceiver mode %d\n",
 342                                mode);
 343                break;
 344        }
 345}
 346
 347static void twl4030_i2c_access(struct twl4030_usb *twl, int on)
 348{
 349        unsigned long timeout;
 350        int val = twl4030_usb_read(twl, PHY_CLK_CTRL);
 351
 352        if (val >= 0) {
 353                if (on) {
 354                        /* enable DPLL to access PHY registers over I2C */
 355                        val |= REQ_PHY_DPLL_CLK;
 356                        WARN_ON(twl4030_usb_write_verify(twl, PHY_CLK_CTRL,
 357                                                (u8)val) < 0);
 358
 359                        timeout = jiffies + HZ;
 360                        while (!(twl4030_usb_read(twl, PHY_CLK_CTRL_STS) &
 361                                                        PHY_DPLL_CLK)
 362                                && time_before(jiffies, timeout))
 363                                        udelay(10);
 364                        if (!(twl4030_usb_read(twl, PHY_CLK_CTRL_STS) &
 365                                                        PHY_DPLL_CLK))
 366                                dev_err(twl->dev, "Timeout setting T2 HSUSB "
 367                                                "PHY DPLL clock\n");
 368                } else {
 369                        /* let ULPI control the DPLL clock */
 370                        val &= ~REQ_PHY_DPLL_CLK;
 371                        WARN_ON(twl4030_usb_write_verify(twl, PHY_CLK_CTRL,
 372                                                (u8)val) < 0);
 373                }
 374        }
 375}
 376
 377static void __twl4030_phy_power(struct twl4030_usb *twl, int on)
 378{
 379        u8 pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
 380
 381        if (on)
 382                pwr &= ~PHY_PWR_PHYPWD;
 383        else
 384                pwr |= PHY_PWR_PHYPWD;
 385
 386        WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
 387}
 388
 389static int twl4030_usb_runtime_suspend(struct device *dev);
 390static int twl4030_usb_runtime_resume(struct device *dev);
 391
 392static int __maybe_unused twl4030_usb_suspend(struct device *dev)
 393{
 394        struct twl4030_usb *twl = dev_get_drvdata(dev);
 395
 396        /*
 397         * we need enabled runtime on resume,
 398         * so turn irq off here, so we do not get it early
 399         * note: wakeup on usb plug works independently of this
 400         */
 401        dev_dbg(twl->dev, "%s\n", __func__);
 402        disable_irq(twl->irq);
 403        if (!twl->runtime_suspended && !atomic_read(&twl->connected)) {
 404                twl4030_usb_runtime_suspend(dev);
 405                twl->needs_resume = 1;
 406        }
 407
 408        return 0;
 409}
 410
 411static int __maybe_unused twl4030_usb_resume(struct device *dev)
 412{
 413        struct twl4030_usb *twl = dev_get_drvdata(dev);
 414
 415        dev_dbg(twl->dev, "%s\n", __func__);
 416        enable_irq(twl->irq);
 417        if (twl->needs_resume)
 418                twl4030_usb_runtime_resume(dev);
 419        /* check whether cable status changed */
 420        twl4030_usb_irq(0, twl);
 421
 422        twl->runtime_suspended = 0;
 423
 424        return 0;
 425}
 426
 427static int __maybe_unused twl4030_usb_runtime_suspend(struct device *dev)
 428{
 429        struct twl4030_usb *twl = dev_get_drvdata(dev);
 430
 431        dev_dbg(twl->dev, "%s\n", __func__);
 432
 433        __twl4030_phy_power(twl, 0);
 434        regulator_disable(twl->usb1v5);
 435        regulator_disable(twl->usb1v8);
 436        regulator_disable(twl->usb3v1);
 437
 438        twl->runtime_suspended = 1;
 439
 440        return 0;
 441}
 442
 443static int __maybe_unused twl4030_usb_runtime_resume(struct device *dev)
 444{
 445        struct twl4030_usb *twl = dev_get_drvdata(dev);
 446        int res;
 447
 448        dev_dbg(twl->dev, "%s\n", __func__);
 449
 450        res = regulator_enable(twl->usb3v1);
 451        if (res)
 452                dev_err(twl->dev, "Failed to enable usb3v1\n");
 453
 454        res = regulator_enable(twl->usb1v8);
 455        if (res)
 456                dev_err(twl->dev, "Failed to enable usb1v8\n");
 457
 458        /*
 459         * Disabling usb3v1 regulator (= writing 0 to VUSB3V1_DEV_GRP
 460         * in twl4030) resets the VUSB_DEDICATED2 register. This reset
 461         * enables VUSB3V1_SLEEP bit that remaps usb3v1 ACTIVE state to
 462         * SLEEP. We work around this by clearing the bit after usv3v1
 463         * is re-activated. This ensures that VUSB3V1 is really active.
 464         */
 465        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);
 466
 467        res = regulator_enable(twl->usb1v5);
 468        if (res)
 469                dev_err(twl->dev, "Failed to enable usb1v5\n");
 470
 471        __twl4030_phy_power(twl, 1);
 472        twl4030_usb_write(twl, PHY_CLK_CTRL,
 473                          twl4030_usb_read(twl, PHY_CLK_CTRL) |
 474                          (PHY_CLK_CTRL_CLOCKGATING_EN |
 475                           PHY_CLK_CTRL_CLK32K_EN));
 476
 477        twl4030_i2c_access(twl, 1);
 478        twl4030_usb_set_mode(twl, twl->usb_mode);
 479        if (twl->usb_mode == T2_USB_MODE_ULPI)
 480                twl4030_i2c_access(twl, 0);
 481        /*
 482         * According to the TPS65950 TRM, there has to be at least 50ms
 483         * delay between setting POWER_CTRL_OTG_ENAB and enabling charging
 484         * so wait here so that a fully enabled phy can be expected after
 485         * resume
 486         */
 487        msleep(50);
 488        return 0;
 489}
 490
 491static int twl4030_phy_power_off(struct phy *phy)
 492{
 493        struct twl4030_usb *twl = phy_get_drvdata(phy);
 494
 495        dev_dbg(twl->dev, "%s\n", __func__);
 496
 497        return 0;
 498}
 499
 500static int twl4030_phy_power_on(struct phy *phy)
 501{
 502        struct twl4030_usb *twl = phy_get_drvdata(phy);
 503
 504        dev_dbg(twl->dev, "%s\n", __func__);
 505        pm_runtime_get_sync(twl->dev);
 506        schedule_delayed_work(&twl->id_workaround_work, HZ);
 507        pm_runtime_mark_last_busy(twl->dev);
 508        pm_runtime_put_autosuspend(twl->dev);
 509
 510        return 0;
 511}
 512
 513static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
 514{
 515        /* Enable writing to power configuration registers */
 516        twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG1,
 517                         TWL4030_PM_MASTER_PROTECT_KEY);
 518
 519        twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG2,
 520                         TWL4030_PM_MASTER_PROTECT_KEY);
 521
 522        /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/
 523        /*twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/
 524
 525        /* input to VUSB3V1 LDO is from VBAT, not VBUS */
 526        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1);
 527
 528        /* Initialize 3.1V regulator */
 529        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB3V1_DEV_GRP);
 530
 531        twl->usb3v1 = devm_regulator_get(twl->dev, "usb3v1");
 532        if (IS_ERR(twl->usb3v1))
 533                return -ENODEV;
 534
 535        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB3V1_TYPE);
 536
 537        /* Initialize 1.5V regulator */
 538        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V5_DEV_GRP);
 539
 540        twl->usb1v5 = devm_regulator_get(twl->dev, "usb1v5");
 541        if (IS_ERR(twl->usb1v5))
 542                return -ENODEV;
 543
 544        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V5_TYPE);
 545
 546        /* Initialize 1.8V regulator */
 547        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V8_DEV_GRP);
 548
 549        twl->usb1v8 = devm_regulator_get(twl->dev, "usb1v8");
 550        if (IS_ERR(twl->usb1v8))
 551                return -ENODEV;
 552
 553        twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V8_TYPE);
 554
 555        /* disable access to power configuration registers */
 556        twl_i2c_write_u8(TWL_MODULE_PM_MASTER, 0,
 557                         TWL4030_PM_MASTER_PROTECT_KEY);
 558
 559        return 0;
 560}
 561
 562static ssize_t vbus_show(struct device *dev,
 563                         struct device_attribute *attr, char *buf)
 564{
 565        struct twl4030_usb *twl = dev_get_drvdata(dev);
 566        int ret = -EINVAL;
 567
 568        mutex_lock(&twl->lock);
 569        ret = sprintf(buf, "%s\n",
 570                        twl->vbus_supplied ? "on" : "off");
 571        mutex_unlock(&twl->lock);
 572
 573        return ret;
 574}
 575static DEVICE_ATTR_RO(vbus);
 576
 577static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
 578{
 579        struct twl4030_usb *twl = _twl;
 580        enum musb_vbus_id_status status;
 581        int err;
 582
 583        status = twl4030_usb_linkstat(twl);
 584
 585        mutex_lock(&twl->lock);
 586        twl->linkstat = status;
 587        mutex_unlock(&twl->lock);
 588
 589        if (cable_present(status)) {
 590                if (atomic_add_unless(&twl->connected, 1, 1)) {
 591                        dev_dbg(twl->dev, "%s: cable connected %i\n",
 592                                __func__, status);
 593                        pm_runtime_get_sync(twl->dev);
 594                        twl->musb_mailbox_pending = true;
 595                }
 596        } else {
 597                if (atomic_add_unless(&twl->connected, -1, 0)) {
 598                        dev_dbg(twl->dev, "%s: cable disconnected %i\n",
 599                                __func__, status);
 600                        pm_runtime_mark_last_busy(twl->dev);
 601                        pm_runtime_put_autosuspend(twl->dev);
 602                        twl->musb_mailbox_pending = true;
 603                }
 604        }
 605        if (twl->musb_mailbox_pending) {
 606                err = musb_mailbox(status);
 607                if (!err)
 608                        twl->musb_mailbox_pending = false;
 609        }
 610
 611        /* don't schedule during sleep - irq works right then */
 612        if (status == MUSB_ID_GROUND && pm_runtime_active(twl->dev)) {
 613                cancel_delayed_work(&twl->id_workaround_work);
 614                schedule_delayed_work(&twl->id_workaround_work, HZ);
 615        }
 616
 617        if (irq)
 618                sysfs_notify(&twl->dev->kobj, NULL, "vbus");
 619
 620        return IRQ_HANDLED;
 621}
 622
 623static void twl4030_id_workaround_work(struct work_struct *work)
 624{
 625        struct twl4030_usb *twl = container_of(work, struct twl4030_usb,
 626                id_workaround_work.work);
 627
 628        twl4030_usb_irq(0, twl);
 629}
 630
 631static int twl4030_phy_init(struct phy *phy)
 632{
 633        struct twl4030_usb *twl = phy_get_drvdata(phy);
 634
 635        pm_runtime_get_sync(twl->dev);
 636        twl->linkstat = MUSB_UNKNOWN;
 637        schedule_delayed_work(&twl->id_workaround_work, HZ);
 638        pm_runtime_mark_last_busy(twl->dev);
 639        pm_runtime_put_autosuspend(twl->dev);
 640
 641        return 0;
 642}
 643
 644static int twl4030_set_peripheral(struct usb_otg *otg,
 645                                        struct usb_gadget *gadget)
 646{
 647        if (!otg)
 648                return -ENODEV;
 649
 650        otg->gadget = gadget;
 651        if (!gadget)
 652                otg->state = OTG_STATE_UNDEFINED;
 653
 654        return 0;
 655}
 656
 657static int twl4030_set_host(struct usb_otg *otg, struct usb_bus *host)
 658{
 659        if (!otg)
 660                return -ENODEV;
 661
 662        otg->host = host;
 663        if (!host)
 664                otg->state = OTG_STATE_UNDEFINED;
 665
 666        return 0;
 667}
 668
 669static const struct phy_ops ops = {
 670        .init           = twl4030_phy_init,
 671        .power_on       = twl4030_phy_power_on,
 672        .power_off      = twl4030_phy_power_off,
 673        .owner          = THIS_MODULE,
 674};
 675
 676static const struct dev_pm_ops twl4030_usb_pm_ops = {
 677        SET_RUNTIME_PM_OPS(twl4030_usb_runtime_suspend,
 678                           twl4030_usb_runtime_resume, NULL)
 679        SET_SYSTEM_SLEEP_PM_OPS(twl4030_usb_suspend, twl4030_usb_resume)
 680};
 681
 682static int twl4030_usb_probe(struct platform_device *pdev)
 683{
 684        struct twl4030_usb_data *pdata = dev_get_platdata(&pdev->dev);
 685        struct twl4030_usb      *twl;
 686        struct phy              *phy;
 687        int                     status, err;
 688        struct usb_otg          *otg;
 689        struct device_node      *np = pdev->dev.of_node;
 690        struct phy_provider     *phy_provider;
 691
 692        twl = devm_kzalloc(&pdev->dev, sizeof(*twl), GFP_KERNEL);
 693        if (!twl)
 694                return -ENOMEM;
 695
 696        if (np)
 697                of_property_read_u32(np, "usb_mode",
 698                                (enum twl4030_usb_mode *)&twl->usb_mode);
 699        else if (pdata) {
 700                twl->usb_mode = pdata->usb_mode;
 701        } else {
 702                dev_err(&pdev->dev, "twl4030 initialized without pdata\n");
 703                return -EINVAL;
 704        }
 705
 706        otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL);
 707        if (!otg)
 708                return -ENOMEM;
 709
 710        twl->dev                = &pdev->dev;
 711        twl->irq                = platform_get_irq(pdev, 0);
 712        twl->vbus_supplied      = false;
 713        twl->linkstat           = MUSB_UNKNOWN;
 714        twl->musb_mailbox_pending = false;
 715
 716        twl->phy.dev            = twl->dev;
 717        twl->phy.label          = "twl4030";
 718        twl->phy.otg            = otg;
 719        twl->phy.type           = USB_PHY_TYPE_USB2;
 720
 721        otg->usb_phy            = &twl->phy;
 722        otg->set_host           = twl4030_set_host;
 723        otg->set_peripheral     = twl4030_set_peripheral;
 724
 725        phy = devm_phy_create(twl->dev, NULL, &ops);
 726        if (IS_ERR(phy)) {
 727                dev_dbg(&pdev->dev, "Failed to create PHY\n");
 728                return PTR_ERR(phy);
 729        }
 730
 731        phy_set_drvdata(phy, twl);
 732
 733        phy_provider = devm_of_phy_provider_register(twl->dev,
 734                of_phy_simple_xlate);
 735        if (IS_ERR(phy_provider))
 736                return PTR_ERR(phy_provider);
 737
 738        /* init mutex for workqueue */
 739        mutex_init(&twl->lock);
 740
 741        INIT_DELAYED_WORK(&twl->id_workaround_work, twl4030_id_workaround_work);
 742
 743        err = twl4030_usb_ldo_init(twl);
 744        if (err) {
 745                dev_err(&pdev->dev, "ldo init failed\n");
 746                return err;
 747        }
 748        usb_add_phy_dev(&twl->phy);
 749
 750        platform_set_drvdata(pdev, twl);
 751        if (device_create_file(&pdev->dev, &dev_attr_vbus))
 752                dev_warn(&pdev->dev, "could not create sysfs file\n");
 753
 754        ATOMIC_INIT_NOTIFIER_HEAD(&twl->phy.notifier);
 755
 756        pm_runtime_use_autosuspend(&pdev->dev);
 757        pm_runtime_set_autosuspend_delay(&pdev->dev, 2000);
 758        pm_runtime_enable(&pdev->dev);
 759        pm_runtime_get_sync(&pdev->dev);
 760
 761        /* Our job is to use irqs and status from the power module
 762         * to keep the transceiver disabled when nothing's connected.
 763         *
 764         * FIXME we actually shouldn't start enabling it until the
 765         * USB controller drivers have said they're ready, by calling
 766         * set_host() and/or set_peripheral() ... OTG_capable boards
 767         * need both handles, otherwise just one suffices.
 768         */
 769        status = devm_request_threaded_irq(twl->dev, twl->irq, NULL,
 770                        twl4030_usb_irq, IRQF_TRIGGER_FALLING |
 771                        IRQF_TRIGGER_RISING | IRQF_ONESHOT, "twl4030_usb", twl);
 772        if (status < 0) {
 773                dev_dbg(&pdev->dev, "can't get IRQ %d, err %d\n",
 774                        twl->irq, status);
 775                return status;
 776        }
 777
 778        if (pdata)
 779                err = phy_create_lookup(phy, "usb", "musb-hdrc.0");
 780        if (err)
 781                return err;
 782
 783        pm_runtime_mark_last_busy(&pdev->dev);
 784        pm_runtime_put_autosuspend(twl->dev);
 785
 786        dev_info(&pdev->dev, "Initialized TWL4030 USB module\n");
 787        return 0;
 788}
 789
 790static int twl4030_usb_remove(struct platform_device *pdev)
 791{
 792        struct twl4030_usb *twl = platform_get_drvdata(pdev);
 793        int val;
 794
 795        usb_remove_phy(&twl->phy);
 796        pm_runtime_get_sync(twl->dev);
 797        cancel_delayed_work_sync(&twl->id_workaround_work);
 798        device_remove_file(twl->dev, &dev_attr_vbus);
 799
 800        /* set transceiver mode to power on defaults */
 801        twl4030_usb_set_mode(twl, -1);
 802
 803        /* idle ulpi before powering off */
 804        if (cable_present(twl->linkstat))
 805                pm_runtime_put_noidle(twl->dev);
 806        pm_runtime_mark_last_busy(twl->dev);
 807        pm_runtime_dont_use_autosuspend(&pdev->dev);
 808        pm_runtime_put_sync(twl->dev);
 809        pm_runtime_disable(twl->dev);
 810
 811        /* autogate 60MHz ULPI clock,
 812         * clear dpll clock request for i2c access,
 813         * disable 32KHz
 814         */
 815        val = twl4030_usb_read(twl, PHY_CLK_CTRL);
 816        if (val >= 0) {
 817                val |= PHY_CLK_CTRL_CLOCKGATING_EN;
 818                val &= ~(PHY_CLK_CTRL_CLK32K_EN | REQ_PHY_DPLL_CLK);
 819                twl4030_usb_write(twl, PHY_CLK_CTRL, (u8)val);
 820        }
 821
 822        /* disable complete OTG block */
 823        twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB);
 824
 825        return 0;
 826}
 827
 828#ifdef CONFIG_OF
 829static const struct of_device_id twl4030_usb_id_table[] = {
 830        { .compatible = "ti,twl4030-usb" },
 831        {}
 832};
 833MODULE_DEVICE_TABLE(of, twl4030_usb_id_table);
 834#endif
 835
 836static struct platform_driver twl4030_usb_driver = {
 837        .probe          = twl4030_usb_probe,
 838        .remove         = twl4030_usb_remove,
 839        .driver         = {
 840                .name   = "twl4030_usb",
 841                .pm     = &twl4030_usb_pm_ops,
 842                .of_match_table = of_match_ptr(twl4030_usb_id_table),
 843        },
 844};
 845
 846static int __init twl4030_usb_init(void)
 847{
 848        return platform_driver_register(&twl4030_usb_driver);
 849}
 850subsys_initcall(twl4030_usb_init);
 851
 852static void __exit twl4030_usb_exit(void)
 853{
 854        platform_driver_unregister(&twl4030_usb_driver);
 855}
 856module_exit(twl4030_usb_exit);
 857
 858MODULE_ALIAS("platform:twl4030_usb");
 859MODULE_AUTHOR("Texas Instruments, Inc, Nokia Corporation");
 860MODULE_DESCRIPTION("TWL4030 USB transceiver driver");
 861MODULE_LICENSE("GPL");
 862