linux/drivers/i2c/busses/scx200_acb.c
<<
>>
Prefs
   1/*
   2    Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com>
   3
   4    National Semiconductor SCx200 ACCESS.bus support
   5    Also supports the AMD CS5535 and AMD CS5536
   6
   7    Based on i2c-keywest.c which is:
   8        Copyright (c) 2001 Benjamin Herrenschmidt <benh@kernel.crashing.org>
   9        Copyright (c) 2000 Philip Edelbrock <phil@stimpy.netroedge.com>
  10
  11    This program is free software; you can redistribute it and/or
  12    modify it under the terms of the GNU General Public License as
  13    published by the Free Software Foundation; either version 2 of the
  14    License, or (at your option) any later version.
  15
  16    This program is distributed in the hope that it will be useful,
  17    but WITHOUT ANY WARRANTY; without even the implied warranty of
  18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19    General Public License for more details.
  20*/
  21
  22#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  23
  24#include <linux/module.h>
  25#include <linux/errno.h>
  26#include <linux/kernel.h>
  27#include <linux/init.h>
  28#include <linux/i2c.h>
  29#include <linux/pci.h>
  30#include <linux/platform_device.h>
  31#include <linux/delay.h>
  32#include <linux/mutex.h>
  33#include <linux/slab.h>
  34#include <linux/io.h>
  35
  36#include <linux/scx200.h>
  37
  38MODULE_AUTHOR("Christer Weinigel <wingel@nano-system.com>");
  39MODULE_DESCRIPTION("NatSemi SCx200 ACCESS.bus Driver");
  40MODULE_ALIAS("platform:cs5535-smb");
  41MODULE_LICENSE("GPL");
  42
  43#define MAX_DEVICES 4
  44static int base[MAX_DEVICES] = { 0x820, 0x840 };
  45module_param_array(base, int, NULL, 0);
  46MODULE_PARM_DESC(base, "Base addresses for the ACCESS.bus controllers");
  47
  48#define POLL_TIMEOUT    (HZ/5)
  49
  50enum scx200_acb_state {
  51        state_idle,
  52        state_address,
  53        state_command,
  54        state_repeat_start,
  55        state_quick,
  56        state_read,
  57        state_write,
  58};
  59
  60static const char *scx200_acb_state_name[] = {
  61        "idle",
  62        "address",
  63        "command",
  64        "repeat_start",
  65        "quick",
  66        "read",
  67        "write",
  68};
  69
  70/* Physical interface */
  71struct scx200_acb_iface {
  72        struct scx200_acb_iface *next;
  73        struct i2c_adapter adapter;
  74        unsigned base;
  75        struct mutex mutex;
  76
  77        /* State machine data */
  78        enum scx200_acb_state state;
  79        int result;
  80        u8 address_byte;
  81        u8 command;
  82        u8 *ptr;
  83        char needs_reset;
  84        unsigned len;
  85};
  86
  87/* Register Definitions */
  88#define ACBSDA          (iface->base + 0)
  89#define ACBST           (iface->base + 1)
  90#define    ACBST_SDAST          0x40 /* SDA Status */
  91#define    ACBST_BER            0x20
  92#define    ACBST_NEGACK         0x10 /* Negative Acknowledge */
  93#define    ACBST_STASTR         0x08 /* Stall After Start */
  94#define    ACBST_MASTER         0x02
  95#define ACBCST          (iface->base + 2)
  96#define    ACBCST_BB            0x02
  97#define ACBCTL1         (iface->base + 3)
  98#define    ACBCTL1_STASTRE      0x80
  99#define    ACBCTL1_NMINTE       0x40
 100#define    ACBCTL1_ACK          0x10
 101#define    ACBCTL1_STOP         0x02
 102#define    ACBCTL1_START        0x01
 103#define ACBADDR         (iface->base + 4)
 104#define ACBCTL2         (iface->base + 5)
 105#define    ACBCTL2_ENABLE       0x01
 106
 107/************************************************************************/
 108
 109static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status)
 110{
 111        const char *errmsg;
 112
 113        dev_dbg(&iface->adapter.dev, "state %s, status = 0x%02x\n",
 114                scx200_acb_state_name[iface->state], status);
 115
 116        if (status & ACBST_BER) {
 117                errmsg = "bus error";
 118                goto error;
 119        }
 120        if (!(status & ACBST_MASTER)) {
 121                errmsg = "not master";
 122                goto error;
 123        }
 124        if (status & ACBST_NEGACK) {
 125                dev_dbg(&iface->adapter.dev, "negative ack in state %s\n",
 126                        scx200_acb_state_name[iface->state]);
 127
 128                iface->state = state_idle;
 129                iface->result = -ENXIO;
 130
 131                outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
 132                outb(ACBST_STASTR | ACBST_NEGACK, ACBST);
 133
 134                /* Reset the status register */
 135                outb(0, ACBST);
 136                return;
 137        }
 138
 139        switch (iface->state) {
 140        case state_idle:
 141                dev_warn(&iface->adapter.dev, "interrupt in idle state\n");
 142                break;
 143
 144        case state_address:
 145                /* Do a pointer write first */
 146                outb(iface->address_byte & ~1, ACBSDA);
 147
 148                iface->state = state_command;
 149                break;
 150
 151        case state_command:
 152                outb(iface->command, ACBSDA);
 153
 154                if (iface->address_byte & 1)
 155                        iface->state = state_repeat_start;
 156                else
 157                        iface->state = state_write;
 158                break;
 159
 160        case state_repeat_start:
 161                outb(inb(ACBCTL1) | ACBCTL1_START, ACBCTL1);
 162                /* fallthrough */
 163
 164        case state_quick:
 165                if (iface->address_byte & 1) {
 166                        if (iface->len == 1)
 167                                outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1);
 168                        else
 169                                outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1);
 170                        outb(iface->address_byte, ACBSDA);
 171
 172                        iface->state = state_read;
 173                } else {
 174                        outb(iface->address_byte, ACBSDA);
 175
 176                        iface->state = state_write;
 177                }
 178                break;
 179
 180        case state_read:
 181                /* Set ACK if _next_ byte will be the last one */
 182                if (iface->len == 2)
 183                        outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1);
 184                else
 185                        outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1);
 186
 187                if (iface->len == 1) {
 188                        iface->result = 0;
 189                        iface->state = state_idle;
 190                        outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
 191                }
 192
 193                *iface->ptr++ = inb(ACBSDA);
 194                --iface->len;
 195
 196                break;
 197
 198        case state_write:
 199                if (iface->len == 0) {
 200                        iface->result = 0;
 201                        iface->state = state_idle;
 202                        outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
 203                        break;
 204                }
 205
 206                outb(*iface->ptr++, ACBSDA);
 207                --iface->len;
 208
 209                break;
 210        }
 211
 212        return;
 213
 214 error:
 215        dev_err(&iface->adapter.dev,
 216                "%s in state %s (addr=0x%02x, len=%d, status=0x%02x)\n", errmsg,
 217                scx200_acb_state_name[iface->state], iface->address_byte,
 218                iface->len, status);
 219
 220        iface->state = state_idle;
 221        iface->result = -EIO;
 222        iface->needs_reset = 1;
 223}
 224
 225static void scx200_acb_poll(struct scx200_acb_iface *iface)
 226{
 227        u8 status;
 228        unsigned long timeout;
 229
 230        timeout = jiffies + POLL_TIMEOUT;
 231        while (1) {
 232                status = inb(ACBST);
 233
 234                /* Reset the status register to avoid the hang */
 235                outb(0, ACBST);
 236
 237                if ((status & (ACBST_SDAST|ACBST_BER|ACBST_NEGACK)) != 0) {
 238                        scx200_acb_machine(iface, status);
 239                        return;
 240                }
 241                if (time_after(jiffies, timeout))
 242                        break;
 243                cpu_relax();
 244                cond_resched();
 245        }
 246
 247        dev_err(&iface->adapter.dev, "timeout in state %s\n",
 248                scx200_acb_state_name[iface->state]);
 249
 250        iface->state = state_idle;
 251        iface->result = -EIO;
 252        iface->needs_reset = 1;
 253}
 254
 255static void scx200_acb_reset(struct scx200_acb_iface *iface)
 256{
 257        /* Disable the ACCESS.bus device and Configure the SCL
 258           frequency: 16 clock cycles */
 259        outb(0x70, ACBCTL2);
 260        /* Polling mode */
 261        outb(0, ACBCTL1);
 262        /* Disable slave address */
 263        outb(0, ACBADDR);
 264        /* Enable the ACCESS.bus device */
 265        outb(inb(ACBCTL2) | ACBCTL2_ENABLE, ACBCTL2);
 266        /* Free STALL after START */
 267        outb(inb(ACBCTL1) & ~(ACBCTL1_STASTRE | ACBCTL1_NMINTE), ACBCTL1);
 268        /* Send a STOP */
 269        outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
 270        /* Clear BER, NEGACK and STASTR bits */
 271        outb(ACBST_BER | ACBST_NEGACK | ACBST_STASTR, ACBST);
 272        /* Clear BB bit */
 273        outb(inb(ACBCST) | ACBCST_BB, ACBCST);
 274}
 275
 276static s32 scx200_acb_smbus_xfer(struct i2c_adapter *adapter,
 277                                 u16 address, unsigned short flags,
 278                                 char rw, u8 command, int size,
 279                                 union i2c_smbus_data *data)
 280{
 281        struct scx200_acb_iface *iface = i2c_get_adapdata(adapter);
 282        int len;
 283        u8 *buffer;
 284        u16 cur_word;
 285        int rc;
 286
 287        switch (size) {
 288        case I2C_SMBUS_QUICK:
 289                len = 0;
 290                buffer = NULL;
 291                break;
 292
 293        case I2C_SMBUS_BYTE:
 294                len = 1;
 295                buffer = rw ? &data->byte : &command;
 296                break;
 297
 298        case I2C_SMBUS_BYTE_DATA:
 299                len = 1;
 300                buffer = &data->byte;
 301                break;
 302
 303        case I2C_SMBUS_WORD_DATA:
 304                len = 2;
 305                cur_word = cpu_to_le16(data->word);
 306                buffer = (u8 *)&cur_word;
 307                break;
 308
 309        case I2C_SMBUS_I2C_BLOCK_DATA:
 310                len = data->block[0];
 311                if (len == 0 || len > I2C_SMBUS_BLOCK_MAX)
 312                        return -EINVAL;
 313                buffer = &data->block[1];
 314                break;
 315
 316        default:
 317                return -EINVAL;
 318        }
 319
 320        dev_dbg(&adapter->dev,
 321                "size=%d, address=0x%x, command=0x%x, len=%d, read=%d\n",
 322                size, address, command, len, rw);
 323
 324        if (!len && rw == I2C_SMBUS_READ) {
 325                dev_dbg(&adapter->dev, "zero length read\n");
 326                return -EINVAL;
 327        }
 328
 329        mutex_lock(&iface->mutex);
 330
 331        iface->address_byte = (address << 1) | rw;
 332        iface->command = command;
 333        iface->ptr = buffer;
 334        iface->len = len;
 335        iface->result = -EINVAL;
 336        iface->needs_reset = 0;
 337
 338        outb(inb(ACBCTL1) | ACBCTL1_START, ACBCTL1);
 339
 340        if (size == I2C_SMBUS_QUICK || size == I2C_SMBUS_BYTE)
 341                iface->state = state_quick;
 342        else
 343                iface->state = state_address;
 344
 345        while (iface->state != state_idle)
 346                scx200_acb_poll(iface);
 347
 348        if (iface->needs_reset)
 349                scx200_acb_reset(iface);
 350
 351        rc = iface->result;
 352
 353        mutex_unlock(&iface->mutex);
 354
 355        if (rc == 0 && size == I2C_SMBUS_WORD_DATA && rw == I2C_SMBUS_READ)
 356                data->word = le16_to_cpu(cur_word);
 357
 358#ifdef DEBUG
 359        dev_dbg(&adapter->dev, "transfer done, result: %d", rc);
 360        if (buffer) {
 361                int i;
 362                printk(" data:");
 363                for (i = 0; i < len; ++i)
 364                        printk(" %02x", buffer[i]);
 365        }
 366        printk("\n");
 367#endif
 368
 369        return rc;
 370}
 371
 372static u32 scx200_acb_func(struct i2c_adapter *adapter)
 373{
 374        return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
 375               I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
 376               I2C_FUNC_SMBUS_I2C_BLOCK;
 377}
 378
 379/* For now, we only handle combined mode (smbus) */
 380static const struct i2c_algorithm scx200_acb_algorithm = {
 381        .smbus_xfer     = scx200_acb_smbus_xfer,
 382        .functionality  = scx200_acb_func,
 383};
 384
 385static struct scx200_acb_iface *scx200_acb_list;
 386static DEFINE_MUTEX(scx200_acb_list_mutex);
 387
 388static int scx200_acb_probe(struct scx200_acb_iface *iface)
 389{
 390        u8 val;
 391
 392        /* Disable the ACCESS.bus device and Configure the SCL
 393           frequency: 16 clock cycles */
 394        outb(0x70, ACBCTL2);
 395
 396        if (inb(ACBCTL2) != 0x70) {
 397                pr_debug("ACBCTL2 readback failed\n");
 398                return -ENXIO;
 399        }
 400
 401        outb(inb(ACBCTL1) | ACBCTL1_NMINTE, ACBCTL1);
 402
 403        val = inb(ACBCTL1);
 404        if (val) {
 405                pr_debug("disabled, but ACBCTL1=0x%02x\n", val);
 406                return -ENXIO;
 407        }
 408
 409        outb(inb(ACBCTL2) | ACBCTL2_ENABLE, ACBCTL2);
 410
 411        outb(inb(ACBCTL1) | ACBCTL1_NMINTE, ACBCTL1);
 412
 413        val = inb(ACBCTL1);
 414        if ((val & ACBCTL1_NMINTE) != ACBCTL1_NMINTE) {
 415                pr_debug("enabled, but NMINTE won't be set, ACBCTL1=0x%02x\n",
 416                         val);
 417                return -ENXIO;
 418        }
 419
 420        return 0;
 421}
 422
 423static struct scx200_acb_iface *scx200_create_iface(const char *text,
 424                struct device *dev, int index)
 425{
 426        struct scx200_acb_iface *iface;
 427        struct i2c_adapter *adapter;
 428
 429        iface = kzalloc(sizeof(*iface), GFP_KERNEL);
 430        if (!iface) {
 431                pr_err("can't allocate memory\n");
 432                return NULL;
 433        }
 434
 435        adapter = &iface->adapter;
 436        i2c_set_adapdata(adapter, iface);
 437        snprintf(adapter->name, sizeof(adapter->name), "%s ACB%d", text, index);
 438        adapter->owner = THIS_MODULE;
 439        adapter->algo = &scx200_acb_algorithm;
 440        adapter->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
 441        adapter->dev.parent = dev;
 442
 443        mutex_init(&iface->mutex);
 444
 445        return iface;
 446}
 447
 448static int scx200_acb_create(struct scx200_acb_iface *iface)
 449{
 450        struct i2c_adapter *adapter;
 451        int rc;
 452
 453        adapter = &iface->adapter;
 454
 455        rc = scx200_acb_probe(iface);
 456        if (rc) {
 457                pr_warn("probe failed\n");
 458                return rc;
 459        }
 460
 461        scx200_acb_reset(iface);
 462
 463        if (i2c_add_adapter(adapter) < 0) {
 464                pr_err("failed to register\n");
 465                return -ENODEV;
 466        }
 467
 468        if (!adapter->dev.parent) {
 469                /* If there's no dev, we're tracking (ISA) ifaces manually */
 470                mutex_lock(&scx200_acb_list_mutex);
 471                iface->next = scx200_acb_list;
 472                scx200_acb_list = iface;
 473                mutex_unlock(&scx200_acb_list_mutex);
 474        }
 475
 476        return 0;
 477}
 478
 479static struct scx200_acb_iface *scx200_create_dev(const char *text,
 480                unsigned long base, int index, struct device *dev)
 481{
 482        struct scx200_acb_iface *iface;
 483        int rc;
 484
 485        iface = scx200_create_iface(text, dev, index);
 486
 487        if (iface == NULL)
 488                return NULL;
 489
 490        if (!request_region(base, 8, iface->adapter.name)) {
 491                pr_err("can't allocate io 0x%lx-0x%lx\n", base, base + 8 - 1);
 492                goto errout_free;
 493        }
 494
 495        iface->base = base;
 496        rc = scx200_acb_create(iface);
 497
 498        if (rc == 0)
 499                return iface;
 500
 501        release_region(base, 8);
 502 errout_free:
 503        kfree(iface);
 504        return NULL;
 505}
 506
 507static int scx200_probe(struct platform_device *pdev)
 508{
 509        struct scx200_acb_iface *iface;
 510        struct resource *res;
 511
 512        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 513        if (!res) {
 514                dev_err(&pdev->dev, "can't fetch device resource info\n");
 515                return -ENODEV;
 516        }
 517
 518        iface = scx200_create_dev("CS5535", res->start, 0, &pdev->dev);
 519        if (!iface)
 520                return -EIO;
 521
 522        dev_info(&pdev->dev, "SCx200 device '%s' registered\n",
 523                        iface->adapter.name);
 524        platform_set_drvdata(pdev, iface);
 525
 526        return 0;
 527}
 528
 529static void scx200_cleanup_iface(struct scx200_acb_iface *iface)
 530{
 531        i2c_del_adapter(&iface->adapter);
 532        release_region(iface->base, 8);
 533        kfree(iface);
 534}
 535
 536static int scx200_remove(struct platform_device *pdev)
 537{
 538        struct scx200_acb_iface *iface;
 539
 540        iface = platform_get_drvdata(pdev);
 541        scx200_cleanup_iface(iface);
 542
 543        return 0;
 544}
 545
 546static struct platform_driver scx200_pci_driver = {
 547        .driver = {
 548                .name = "cs5535-smb",
 549                .owner = THIS_MODULE,
 550        },
 551        .probe = scx200_probe,
 552        .remove = scx200_remove,
 553};
 554
 555static const struct pci_device_id scx200_isa[] = {
 556        { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_BRIDGE) },
 557        { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SC1100_BRIDGE) },
 558        { 0, }
 559};
 560
 561static __init void scx200_scan_isa(void)
 562{
 563        int i;
 564
 565        if (!pci_dev_present(scx200_isa))
 566                return;
 567
 568        for (i = 0; i < MAX_DEVICES; ++i) {
 569                if (base[i] == 0)
 570                        continue;
 571
 572                /* XXX: should we care about failures? */
 573                scx200_create_dev("SCx200", base[i], i, NULL);
 574        }
 575}
 576
 577static int __init scx200_acb_init(void)
 578{
 579        pr_debug("NatSemi SCx200 ACCESS.bus Driver\n");
 580
 581        /* First scan for ISA-based devices */
 582        scx200_scan_isa();      /* XXX: should we care about errors? */
 583
 584        /* If at least one bus was created, init must succeed */
 585        if (scx200_acb_list)
 586                return 0;
 587
 588        /* No ISA devices; register the platform driver for PCI-based devices */
 589        return platform_driver_register(&scx200_pci_driver);
 590}
 591
 592static void __exit scx200_acb_cleanup(void)
 593{
 594        struct scx200_acb_iface *iface;
 595
 596        platform_driver_unregister(&scx200_pci_driver);
 597
 598        mutex_lock(&scx200_acb_list_mutex);
 599        while ((iface = scx200_acb_list) != NULL) {
 600                scx200_acb_list = iface->next;
 601                mutex_unlock(&scx200_acb_list_mutex);
 602
 603                scx200_cleanup_iface(iface);
 604
 605                mutex_lock(&scx200_acb_list_mutex);
 606        }
 607        mutex_unlock(&scx200_acb_list_mutex);
 608}
 609
 610module_init(scx200_acb_init);
 611module_exit(scx200_acb_cleanup);
 612