root/drivers/staging/nvec/nvec.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nvec_register_notifier
  2. nvec_unregister_notifier
  3. nvec_status_notifier
  4. nvec_msg_alloc
  5. nvec_msg_free
  6. nvec_msg_is_event
  7. nvec_msg_size
  8. nvec_gpio_set_value
  9. nvec_write_async
  10. nvec_write_sync
  11. nvec_toggle_global_events
  12. nvec_event_mask
  13. nvec_request_master
  14. parse_msg
  15. nvec_dispatch
  16. nvec_tx_completed
  17. nvec_rx_completed
  18. nvec_invalid_flags
  19. nvec_tx_set
  20. nvec_interrupt
  21. tegra_init_i2c_slave
  22. nvec_disable_i2c_slave
  23. nvec_power_off
  24. tegra_nvec_probe
  25. tegra_nvec_remove
  26. nvec_suspend
  27. nvec_resume

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * NVEC: NVIDIA compliant embedded controller interface
   4  *
   5  * Copyright (C) 2011 The AC100 Kernel Team <ac100@lists.lauchpad.net>
   6  *
   7  * Authors:  Pierre-Hugues Husson <phhusson@free.fr>
   8  *           Ilya Petrov <ilya.muromec@gmail.com>
   9  *           Marc Dietrich <marvin24@gmx.de>
  10  *           Julian Andres Klode <jak@jak-linux.org>
  11  */
  12 
  13 #include <linux/kernel.h>
  14 #include <linux/module.h>
  15 #include <linux/atomic.h>
  16 #include <linux/clk.h>
  17 #include <linux/completion.h>
  18 #include <linux/delay.h>
  19 #include <linux/err.h>
  20 #include <linux/gpio/consumer.h>
  21 #include <linux/interrupt.h>
  22 #include <linux/io.h>
  23 #include <linux/irq.h>
  24 #include <linux/of.h>
  25 #include <linux/list.h>
  26 #include <linux/mfd/core.h>
  27 #include <linux/mutex.h>
  28 #include <linux/notifier.h>
  29 #include <linux/slab.h>
  30 #include <linux/spinlock.h>
  31 #include <linux/workqueue.h>
  32 
  33 #include "nvec.h"
  34 
  35 #define I2C_CNFG                        0x00
  36 #define I2C_CNFG_PACKET_MODE_EN         BIT(10)
  37 #define I2C_CNFG_NEW_MASTER_SFM         BIT(11)
  38 #define I2C_CNFG_DEBOUNCE_CNT_SHIFT     12
  39 
  40 #define I2C_SL_CNFG             0x20
  41 #define I2C_SL_NEWSL            BIT(2)
  42 #define I2C_SL_NACK             BIT(1)
  43 #define I2C_SL_RESP             BIT(0)
  44 #define I2C_SL_IRQ              BIT(3)
  45 #define END_TRANS               BIT(4)
  46 #define RCVD                    BIT(2)
  47 #define RNW                     BIT(1)
  48 
  49 #define I2C_SL_RCVD             0x24
  50 #define I2C_SL_STATUS           0x28
  51 #define I2C_SL_ADDR1            0x2c
  52 #define I2C_SL_ADDR2            0x30
  53 #define I2C_SL_DELAY_COUNT      0x3c
  54 
  55 /**
  56  * enum nvec_msg_category - Message categories for nvec_msg_alloc()
  57  * @NVEC_MSG_RX: The message is an incoming message (from EC)
  58  * @NVEC_MSG_TX: The message is an outgoing message (to EC)
  59  */
  60 enum nvec_msg_category  {
  61         NVEC_MSG_RX,
  62         NVEC_MSG_TX,
  63 };
  64 
  65 enum nvec_sleep_subcmds {
  66         GLOBAL_EVENTS,
  67         AP_PWR_DOWN,
  68         AP_SUSPEND,
  69 };
  70 
  71 #define CNF_EVENT_REPORTING 0x01
  72 #define GET_FIRMWARE_VERSION 0x15
  73 #define LID_SWITCH BIT(1)
  74 #define PWR_BUTTON BIT(15)
  75 
  76 static struct nvec_chip *nvec_power_handle;
  77 
  78 static const struct mfd_cell nvec_devices[] = {
  79         {
  80                 .name = "nvec-kbd",
  81         },
  82         {
  83                 .name = "nvec-mouse",
  84         },
  85         {
  86                 .name = "nvec-power",
  87                 .id = 0,
  88         },
  89         {
  90                 .name = "nvec-power",
  91                 .id = 1,
  92         },
  93         {
  94                 .name = "nvec-paz00",
  95         },
  96 };
  97 
  98 /**
  99  * nvec_register_notifier - Register a notifier with nvec
 100  * @nvec: A &struct nvec_chip
 101  * @nb: The notifier block to register
 102  *
 103  * Registers a notifier with @nvec. The notifier will be added to an atomic
 104  * notifier chain that is called for all received messages except those that
 105  * correspond to a request initiated by nvec_write_sync().
 106  */
 107 int nvec_register_notifier(struct nvec_chip *nvec, struct notifier_block *nb,
 108                            unsigned int events)
 109 {
 110         return atomic_notifier_chain_register(&nvec->notifier_list, nb);
 111 }
 112 EXPORT_SYMBOL_GPL(nvec_register_notifier);
 113 
 114 /**
 115  * nvec_unregister_notifier - Unregister a notifier with nvec
 116  * @nvec: A &struct nvec_chip
 117  * @nb: The notifier block to unregister
 118  *
 119  * Unregisters a notifier with @nvec. The notifier will be removed from the
 120  * atomic notifier chain.
 121  */
 122 int nvec_unregister_notifier(struct nvec_chip *nvec, struct notifier_block *nb)
 123 {
 124         return atomic_notifier_chain_unregister(&nvec->notifier_list, nb);
 125 }
 126 EXPORT_SYMBOL_GPL(nvec_unregister_notifier);
 127 
 128 /**
 129  * nvec_status_notifier - The final notifier
 130  *
 131  * Prints a message about control events not handled in the notifier
 132  * chain.
 133  */
 134 static int nvec_status_notifier(struct notifier_block *nb,
 135                                 unsigned long event_type, void *data)
 136 {
 137         struct nvec_chip *nvec = container_of(nb, struct nvec_chip,
 138                                                 nvec_status_notifier);
 139         unsigned char *msg = data;
 140 
 141         if (event_type != NVEC_CNTL)
 142                 return NOTIFY_DONE;
 143 
 144         dev_warn(nvec->dev, "unhandled msg type %ld\n", event_type);
 145         print_hex_dump(KERN_WARNING, "payload: ", DUMP_PREFIX_NONE, 16, 1,
 146                        msg, msg[1] + 2, true);
 147 
 148         return NOTIFY_OK;
 149 }
 150 
 151 /**
 152  * nvec_msg_alloc:
 153  * @nvec: A &struct nvec_chip
 154  * @category: Pool category, see &enum nvec_msg_category
 155  *
 156  * Allocate a single &struct nvec_msg object from the message pool of
 157  * @nvec. The result shall be passed to nvec_msg_free() if no longer
 158  * used.
 159  *
 160  * Outgoing messages are placed in the upper 75% of the pool, keeping the
 161  * lower 25% available for RX buffers only. The reason is to prevent a
 162  * situation where all buffers are full and a message is thus endlessly
 163  * retried because the response could never be processed.
 164  */
 165 static struct nvec_msg *nvec_msg_alloc(struct nvec_chip *nvec,
 166                                        enum nvec_msg_category category)
 167 {
 168         int i = (category == NVEC_MSG_TX) ? (NVEC_POOL_SIZE / 4) : 0;
 169 
 170         for (; i < NVEC_POOL_SIZE; i++) {
 171                 if (atomic_xchg(&nvec->msg_pool[i].used, 1) == 0) {
 172                         dev_vdbg(nvec->dev, "INFO: Allocate %i\n", i);
 173                         return &nvec->msg_pool[i];
 174                 }
 175         }
 176 
 177         dev_err(nvec->dev, "could not allocate %s buffer\n",
 178                 (category == NVEC_MSG_TX) ? "TX" : "RX");
 179 
 180         return NULL;
 181 }
 182 
 183 /**
 184  * nvec_msg_free:
 185  * @nvec: A &struct nvec_chip
 186  * @msg:  A message (must be allocated by nvec_msg_alloc() and belong to @nvec)
 187  *
 188  * Free the given message
 189  */
 190 void nvec_msg_free(struct nvec_chip *nvec, struct nvec_msg *msg)
 191 {
 192         if (msg != &nvec->tx_scratch)
 193                 dev_vdbg(nvec->dev, "INFO: Free %ti\n", msg - nvec->msg_pool);
 194         atomic_set(&msg->used, 0);
 195 }
 196 EXPORT_SYMBOL_GPL(nvec_msg_free);
 197 
 198 /**
 199  * nvec_msg_is_event - Return %true if @msg is an event
 200  * @msg: A message
 201  */
 202 static bool nvec_msg_is_event(struct nvec_msg *msg)
 203 {
 204         return msg->data[0] >> 7;
 205 }
 206 
 207 /**
 208  * nvec_msg_size - Get the size of a message
 209  * @msg: The message to get the size for
 210  *
 211  * This only works for received messages, not for outgoing messages.
 212  */
 213 static size_t nvec_msg_size(struct nvec_msg *msg)
 214 {
 215         bool is_event = nvec_msg_is_event(msg);
 216         int event_length = (msg->data[0] & 0x60) >> 5;
 217 
 218         /* for variable size, payload size in byte 1 + count (1) + cmd (1) */
 219         if (!is_event || event_length == NVEC_VAR_SIZE)
 220                 return (msg->pos || msg->size) ? (msg->data[1] + 2) : 0;
 221         else if (event_length == NVEC_2BYTES)
 222                 return 2;
 223         else if (event_length == NVEC_3BYTES)
 224                 return 3;
 225         return 0;
 226 }
 227 
 228 /**
 229  * nvec_gpio_set_value - Set the GPIO value
 230  * @nvec: A &struct nvec_chip
 231  * @value: The value to write (0 or 1)
 232  *
 233  * Like gpio_set_value(), but generating debugging information
 234  */
 235 static void nvec_gpio_set_value(struct nvec_chip *nvec, int value)
 236 {
 237         dev_dbg(nvec->dev, "GPIO changed from %u to %u\n",
 238                 gpiod_get_value(nvec->gpiod), value);
 239         gpiod_set_value(nvec->gpiod, value);
 240 }
 241 
 242 /**
 243  * nvec_write_async - Asynchronously write a message to NVEC
 244  * @nvec: An nvec_chip instance
 245  * @data: The message data, starting with the request type
 246  * @size: The size of @data
 247  *
 248  * Queue a single message to be transferred to the embedded controller
 249  * and return immediately.
 250  *
 251  * Returns: 0 on success, a negative error code on failure. If a failure
 252  * occurred, the nvec driver may print an error.
 253  */
 254 int nvec_write_async(struct nvec_chip *nvec, const unsigned char *data,
 255                      short size)
 256 {
 257         struct nvec_msg *msg;
 258         unsigned long flags;
 259 
 260         msg = nvec_msg_alloc(nvec, NVEC_MSG_TX);
 261 
 262         if (!msg)
 263                 return -ENOMEM;
 264 
 265         msg->data[0] = size;
 266         memcpy(msg->data + 1, data, size);
 267         msg->size = size + 1;
 268 
 269         spin_lock_irqsave(&nvec->tx_lock, flags);
 270         list_add_tail(&msg->node, &nvec->tx_data);
 271         spin_unlock_irqrestore(&nvec->tx_lock, flags);
 272 
 273         schedule_work(&nvec->tx_work);
 274 
 275         return 0;
 276 }
 277 EXPORT_SYMBOL(nvec_write_async);
 278 
 279 /**
 280  * nvec_write_sync - Write a message to nvec and read the response
 281  * @nvec: An &struct nvec_chip
 282  * @data: The data to write
 283  * @size: The size of @data
 284  * @msg:  The response message received
 285  *
 286  * This is similar to nvec_write_async(), but waits for the
 287  * request to be answered before returning. This function
 288  * uses a mutex and can thus not be called from e.g.
 289  * interrupt handlers.
 290  *
 291  * Returns: 0 on success, a negative error code on failure.
 292  * The response message is returned in @msg. Shall be freed with
 293  * with nvec_msg_free() once no longer used.
 294  *
 295  */
 296 int nvec_write_sync(struct nvec_chip *nvec,
 297                     const unsigned char *data, short size,
 298                     struct nvec_msg **msg)
 299 {
 300         mutex_lock(&nvec->sync_write_mutex);
 301 
 302         *msg = NULL;
 303         nvec->sync_write_pending = (data[1] << 8) + data[0];
 304 
 305         if (nvec_write_async(nvec, data, size) < 0) {
 306                 mutex_unlock(&nvec->sync_write_mutex);
 307                 return -ENOMEM;
 308         }
 309 
 310         dev_dbg(nvec->dev, "nvec_sync_write: 0x%04x\n",
 311                 nvec->sync_write_pending);
 312         if (!(wait_for_completion_timeout(&nvec->sync_write,
 313                                           msecs_to_jiffies(2000)))) {
 314                 dev_warn(nvec->dev,
 315                          "timeout waiting for sync write to complete\n");
 316                 mutex_unlock(&nvec->sync_write_mutex);
 317                 return -ETIMEDOUT;
 318         }
 319 
 320         dev_dbg(nvec->dev, "nvec_sync_write: pong!\n");
 321 
 322         *msg = nvec->last_sync_msg;
 323 
 324         mutex_unlock(&nvec->sync_write_mutex);
 325 
 326         return 0;
 327 }
 328 EXPORT_SYMBOL(nvec_write_sync);
 329 
 330 /**
 331  * nvec_toggle_global_events - enables or disables global event reporting
 332  * @nvec: nvec handle
 333  * @state: true for enable, false for disable
 334  *
 335  * This switches on/off global event reports by the embedded controller.
 336  */
 337 static void nvec_toggle_global_events(struct nvec_chip *nvec, bool state)
 338 {
 339         unsigned char global_events[] = { NVEC_SLEEP, GLOBAL_EVENTS, state };
 340 
 341         nvec_write_async(nvec, global_events, 3);
 342 }
 343 
 344 /**
 345  * nvec_event_mask - fill the command string with event bitfield
 346  * ev: points to event command string
 347  * mask: bit to insert into the event mask
 348  *
 349  * Configure event command expects a 32 bit bitfield which describes
 350  * which events to enable. The bitfield has the following structure
 351  * (from highest byte to lowest):
 352  *      system state bits 7-0
 353  *      system state bits 15-8
 354  *      oem system state bits 7-0
 355  *      oem system state bits 15-8
 356  */
 357 static void nvec_event_mask(char *ev, u32 mask)
 358 {
 359         ev[3] = mask >> 16 & 0xff;
 360         ev[4] = mask >> 24 & 0xff;
 361         ev[5] = mask >> 0  & 0xff;
 362         ev[6] = mask >> 8  & 0xff;
 363 }
 364 
 365 /**
 366  * nvec_request_master - Process outgoing messages
 367  * @work: A &struct work_struct (the tx_worker member of &struct nvec_chip)
 368  *
 369  * Processes all outgoing requests by sending the request and awaiting the
 370  * response, then continuing with the next request. Once a request has a
 371  * matching response, it will be freed and removed from the list.
 372  */
 373 static void nvec_request_master(struct work_struct *work)
 374 {
 375         struct nvec_chip *nvec = container_of(work, struct nvec_chip, tx_work);
 376         unsigned long flags;
 377         long err;
 378         struct nvec_msg *msg;
 379 
 380         spin_lock_irqsave(&nvec->tx_lock, flags);
 381         while (!list_empty(&nvec->tx_data)) {
 382                 msg = list_first_entry(&nvec->tx_data, struct nvec_msg, node);
 383                 spin_unlock_irqrestore(&nvec->tx_lock, flags);
 384                 nvec_gpio_set_value(nvec, 0);
 385                 err = wait_for_completion_interruptible_timeout(
 386                                 &nvec->ec_transfer, msecs_to_jiffies(5000));
 387 
 388                 if (err == 0) {
 389                         dev_warn(nvec->dev, "timeout waiting for ec transfer\n");
 390                         nvec_gpio_set_value(nvec, 1);
 391                         msg->pos = 0;
 392                 }
 393 
 394                 spin_lock_irqsave(&nvec->tx_lock, flags);
 395 
 396                 if (err > 0) {
 397                         list_del_init(&msg->node);
 398                         nvec_msg_free(nvec, msg);
 399                 }
 400         }
 401         spin_unlock_irqrestore(&nvec->tx_lock, flags);
 402 }
 403 
 404 /**
 405  * parse_msg - Print some information and call the notifiers on an RX message
 406  * @nvec: A &struct nvec_chip
 407  * @msg: A message received by @nvec
 408  *
 409  * Paarse some pieces of the message and then call the chain of notifiers
 410  * registered via nvec_register_notifier.
 411  */
 412 static int parse_msg(struct nvec_chip *nvec, struct nvec_msg *msg)
 413 {
 414         if ((msg->data[0] & 1 << 7) == 0 && msg->data[3]) {
 415                 dev_err(nvec->dev, "ec responded %*ph\n", 4, msg->data);
 416                 return -EINVAL;
 417         }
 418 
 419         if ((msg->data[0] >> 7) == 1 && (msg->data[0] & 0x0f) == 5)
 420                 print_hex_dump(KERN_WARNING, "ec system event ",
 421                                DUMP_PREFIX_NONE, 16, 1, msg->data,
 422                                msg->data[1] + 2, true);
 423 
 424         atomic_notifier_call_chain(&nvec->notifier_list, msg->data[0] & 0x8f,
 425                                    msg->data);
 426 
 427         return 0;
 428 }
 429 
 430 /**
 431  * nvec_dispatch - Process messages received from the EC
 432  * @work: A &struct work_struct (the tx_worker member of &struct nvec_chip)
 433  *
 434  * Process messages previously received from the EC and put into the RX
 435  * queue of the &struct nvec_chip instance associated with @work.
 436  */
 437 static void nvec_dispatch(struct work_struct *work)
 438 {
 439         struct nvec_chip *nvec = container_of(work, struct nvec_chip, rx_work);
 440         unsigned long flags;
 441         struct nvec_msg *msg;
 442 
 443         spin_lock_irqsave(&nvec->rx_lock, flags);
 444         while (!list_empty(&nvec->rx_data)) {
 445                 msg = list_first_entry(&nvec->rx_data, struct nvec_msg, node);
 446                 list_del_init(&msg->node);
 447                 spin_unlock_irqrestore(&nvec->rx_lock, flags);
 448 
 449                 if (nvec->sync_write_pending ==
 450                       (msg->data[2] << 8) + msg->data[0]) {
 451                         dev_dbg(nvec->dev, "sync write completed!\n");
 452                         nvec->sync_write_pending = 0;
 453                         nvec->last_sync_msg = msg;
 454                         complete(&nvec->sync_write);
 455                 } else {
 456                         parse_msg(nvec, msg);
 457                         nvec_msg_free(nvec, msg);
 458                 }
 459                 spin_lock_irqsave(&nvec->rx_lock, flags);
 460         }
 461         spin_unlock_irqrestore(&nvec->rx_lock, flags);
 462 }
 463 
 464 /**
 465  * nvec_tx_completed - Complete the current transfer
 466  * @nvec: A &struct nvec_chip
 467  *
 468  * This is called when we have received an END_TRANS on a TX transfer.
 469  */
 470 static void nvec_tx_completed(struct nvec_chip *nvec)
 471 {
 472         /* We got an END_TRANS, let's skip this, maybe there's an event */
 473         if (nvec->tx->pos != nvec->tx->size) {
 474                 dev_err(nvec->dev, "premature END_TRANS, resending\n");
 475                 nvec->tx->pos = 0;
 476                 nvec_gpio_set_value(nvec, 0);
 477         } else {
 478                 nvec->state = 0;
 479         }
 480 }
 481 
 482 /**
 483  * nvec_rx_completed - Complete the current transfer
 484  * @nvec: A &struct nvec_chip
 485  *
 486  * This is called when we have received an END_TRANS on a RX transfer.
 487  */
 488 static void nvec_rx_completed(struct nvec_chip *nvec)
 489 {
 490         if (nvec->rx->pos != nvec_msg_size(nvec->rx)) {
 491                 dev_err(nvec->dev, "RX incomplete: Expected %u bytes, got %u\n",
 492                         (uint)nvec_msg_size(nvec->rx),
 493                         (uint)nvec->rx->pos);
 494 
 495                 nvec_msg_free(nvec, nvec->rx);
 496                 nvec->state = 0;
 497 
 498                 /* Battery quirk - Often incomplete, and likes to crash */
 499                 if (nvec->rx->data[0] == NVEC_BAT)
 500                         complete(&nvec->ec_transfer);
 501 
 502                 return;
 503         }
 504 
 505         spin_lock(&nvec->rx_lock);
 506 
 507         /*
 508          * Add the received data to the work list and move the ring buffer
 509          * pointer to the next entry.
 510          */
 511         list_add_tail(&nvec->rx->node, &nvec->rx_data);
 512 
 513         spin_unlock(&nvec->rx_lock);
 514 
 515         nvec->state = 0;
 516 
 517         if (!nvec_msg_is_event(nvec->rx))
 518                 complete(&nvec->ec_transfer);
 519 
 520         schedule_work(&nvec->rx_work);
 521 }
 522 
 523 /**
 524  * nvec_invalid_flags - Send an error message about invalid flags and jump
 525  * @nvec: The nvec device
 526  * @status: The status flags
 527  * @reset: Whether we shall jump to state 0.
 528  */
 529 static void nvec_invalid_flags(struct nvec_chip *nvec, unsigned int status,
 530                                bool reset)
 531 {
 532         dev_err(nvec->dev, "unexpected status flags 0x%02x during state %i\n",
 533                 status, nvec->state);
 534         if (reset)
 535                 nvec->state = 0;
 536 }
 537 
 538 /**
 539  * nvec_tx_set - Set the message to transfer (nvec->tx)
 540  * @nvec: A &struct nvec_chip
 541  *
 542  * Gets the first entry from the tx_data list of @nvec and sets the
 543  * tx member to it. If the tx_data list is empty, this uses the
 544  * tx_scratch message to send a no operation message.
 545  */
 546 static void nvec_tx_set(struct nvec_chip *nvec)
 547 {
 548         spin_lock(&nvec->tx_lock);
 549         if (list_empty(&nvec->tx_data)) {
 550                 dev_err(nvec->dev, "empty tx - sending no-op\n");
 551                 memcpy(nvec->tx_scratch.data, "\x02\x07\x02", 3);
 552                 nvec->tx_scratch.size = 3;
 553                 nvec->tx_scratch.pos = 0;
 554                 nvec->tx = &nvec->tx_scratch;
 555                 list_add_tail(&nvec->tx->node, &nvec->tx_data);
 556         } else {
 557                 nvec->tx = list_first_entry(&nvec->tx_data, struct nvec_msg,
 558                                             node);
 559                 nvec->tx->pos = 0;
 560         }
 561         spin_unlock(&nvec->tx_lock);
 562 
 563         dev_dbg(nvec->dev, "Sending message of length %u, command 0x%x\n",
 564                 (uint)nvec->tx->size, nvec->tx->data[1]);
 565 }
 566 
 567 /**
 568  * nvec_interrupt - Interrupt handler
 569  * @irq: The IRQ
 570  * @dev: The nvec device
 571  *
 572  * Interrupt handler that fills our RX buffers and empties our TX
 573  * buffers. This uses a finite state machine with ridiculous amounts
 574  * of error checking, in order to be fairly reliable.
 575  */
 576 static irqreturn_t nvec_interrupt(int irq, void *dev)
 577 {
 578         unsigned long status;
 579         unsigned int received = 0;
 580         unsigned char to_send = 0xff;
 581         const unsigned long irq_mask = I2C_SL_IRQ | END_TRANS | RCVD | RNW;
 582         struct nvec_chip *nvec = dev;
 583         unsigned int state = nvec->state;
 584 
 585         status = readl(nvec->base + I2C_SL_STATUS);
 586 
 587         /* Filter out some errors */
 588         if ((status & irq_mask) == 0 && (status & ~irq_mask) != 0) {
 589                 dev_err(nvec->dev, "unexpected irq mask %lx\n", status);
 590                 return IRQ_HANDLED;
 591         }
 592         if ((status & I2C_SL_IRQ) == 0) {
 593                 dev_err(nvec->dev, "Spurious IRQ\n");
 594                 return IRQ_HANDLED;
 595         }
 596 
 597         /* The EC did not request a read, so it send us something, read it */
 598         if ((status & RNW) == 0) {
 599                 received = readl(nvec->base + I2C_SL_RCVD);
 600                 if (status & RCVD)
 601                         writel(0, nvec->base + I2C_SL_RCVD);
 602         }
 603 
 604         if (status == (I2C_SL_IRQ | RCVD))
 605                 nvec->state = 0;
 606 
 607         switch (nvec->state) {
 608         case 0:         /* Verify that its a transfer start, the rest later */
 609                 if (status != (I2C_SL_IRQ | RCVD))
 610                         nvec_invalid_flags(nvec, status, false);
 611                 break;
 612         case 1:         /* command byte */
 613                 if (status != I2C_SL_IRQ) {
 614                         nvec_invalid_flags(nvec, status, true);
 615                 } else {
 616                         nvec->rx = nvec_msg_alloc(nvec, NVEC_MSG_RX);
 617                         /* Should not happen in a normal world */
 618                         if (unlikely(!nvec->rx)) {
 619                                 nvec->state = 0;
 620                                 break;
 621                         }
 622                         nvec->rx->data[0] = received;
 623                         nvec->rx->pos = 1;
 624                         nvec->state = 2;
 625                 }
 626                 break;
 627         case 2:         /* first byte after command */
 628                 if (status == (I2C_SL_IRQ | RNW | RCVD)) {
 629                         udelay(33);
 630                         if (nvec->rx->data[0] != 0x01) {
 631                                 dev_err(nvec->dev,
 632                                         "Read without prior read command\n");
 633                                 nvec->state = 0;
 634                                 break;
 635                         }
 636                         nvec_msg_free(nvec, nvec->rx);
 637                         nvec->state = 3;
 638                         nvec_tx_set(nvec);
 639                         to_send = nvec->tx->data[0];
 640                         nvec->tx->pos = 1;
 641                 } else if (status == (I2C_SL_IRQ)) {
 642                         nvec->rx->data[1] = received;
 643                         nvec->rx->pos = 2;
 644                         nvec->state = 4;
 645                 } else {
 646                         nvec_invalid_flags(nvec, status, true);
 647                 }
 648                 break;
 649         case 3:         /* EC does a block read, we transmit data */
 650                 if (status & END_TRANS) {
 651                         nvec_tx_completed(nvec);
 652                 } else if ((status & RNW) == 0 || (status & RCVD)) {
 653                         nvec_invalid_flags(nvec, status, true);
 654                 } else if (nvec->tx && nvec->tx->pos < nvec->tx->size) {
 655                         to_send = nvec->tx->data[nvec->tx->pos++];
 656                 } else {
 657                         dev_err(nvec->dev,
 658                                 "tx buffer underflow on %p (%u > %u)\n",
 659                                 nvec->tx,
 660                                 (uint)(nvec->tx ? nvec->tx->pos : 0),
 661                                 (uint)(nvec->tx ? nvec->tx->size : 0));
 662                         nvec->state = 0;
 663                 }
 664                 break;
 665         case 4:         /* EC does some write, we read the data */
 666                 if ((status & (END_TRANS | RNW)) == END_TRANS)
 667                         nvec_rx_completed(nvec);
 668                 else if (status & (RNW | RCVD))
 669                         nvec_invalid_flags(nvec, status, true);
 670                 else if (nvec->rx && nvec->rx->pos < NVEC_MSG_SIZE)
 671                         nvec->rx->data[nvec->rx->pos++] = received;
 672                 else
 673                         dev_err(nvec->dev,
 674                                 "RX buffer overflow on %p: Trying to write byte %u of %u\n",
 675                                 nvec->rx, nvec->rx ? nvec->rx->pos : 0,
 676                                 NVEC_MSG_SIZE);
 677                 break;
 678         default:
 679                 nvec->state = 0;
 680         }
 681 
 682         /* If we are told that a new transfer starts, verify it */
 683         if ((status & (RCVD | RNW)) == RCVD) {
 684                 if (received != nvec->i2c_addr)
 685                         dev_err(nvec->dev,
 686                                 "received address 0x%02x, expected 0x%02x\n",
 687                                 received, nvec->i2c_addr);
 688                 nvec->state = 1;
 689         }
 690 
 691         /* Send data if requested, but not on end of transmission */
 692         if ((status & (RNW | END_TRANS)) == RNW)
 693                 writel(to_send, nvec->base + I2C_SL_RCVD);
 694 
 695         /* If we have send the first byte */
 696         if (status == (I2C_SL_IRQ | RNW | RCVD))
 697                 nvec_gpio_set_value(nvec, 1);
 698 
 699         dev_dbg(nvec->dev,
 700                 "Handled: %s 0x%02x, %s 0x%02x in state %u [%s%s%s]\n",
 701                 (status & RNW) == 0 ? "received" : "R=",
 702                 received,
 703                 (status & (RNW | END_TRANS)) ? "sent" : "S=",
 704                 to_send,
 705                 state,
 706                 status & END_TRANS ? " END_TRANS" : "",
 707                 status & RCVD ? " RCVD" : "",
 708                 status & RNW ? " RNW" : "");
 709 
 710         /*
 711          * TODO: A correct fix needs to be found for this.
 712          *
 713          * We experience less incomplete messages with this delay than without
 714          * it, but we don't know why. Help is appreciated.
 715          */
 716         udelay(100);
 717 
 718         return IRQ_HANDLED;
 719 }
 720 
 721 static void tegra_init_i2c_slave(struct nvec_chip *nvec)
 722 {
 723         u32 val;
 724 
 725         clk_prepare_enable(nvec->i2c_clk);
 726 
 727         reset_control_assert(nvec->rst);
 728         udelay(2);
 729         reset_control_deassert(nvec->rst);
 730 
 731         val = I2C_CNFG_NEW_MASTER_SFM | I2C_CNFG_PACKET_MODE_EN |
 732             (0x2 << I2C_CNFG_DEBOUNCE_CNT_SHIFT);
 733         writel(val, nvec->base + I2C_CNFG);
 734 
 735         clk_set_rate(nvec->i2c_clk, 8 * 80000);
 736 
 737         writel(I2C_SL_NEWSL, nvec->base + I2C_SL_CNFG);
 738         writel(0x1E, nvec->base + I2C_SL_DELAY_COUNT);
 739 
 740         writel(nvec->i2c_addr >> 1, nvec->base + I2C_SL_ADDR1);
 741         writel(0, nvec->base + I2C_SL_ADDR2);
 742 
 743         enable_irq(nvec->irq);
 744 }
 745 
 746 #ifdef CONFIG_PM_SLEEP
 747 static void nvec_disable_i2c_slave(struct nvec_chip *nvec)
 748 {
 749         disable_irq(nvec->irq);
 750         writel(I2C_SL_NEWSL | I2C_SL_NACK, nvec->base + I2C_SL_CNFG);
 751         clk_disable_unprepare(nvec->i2c_clk);
 752 }
 753 #endif
 754 
 755 static void nvec_power_off(void)
 756 {
 757         char ap_pwr_down[] = { NVEC_SLEEP, AP_PWR_DOWN };
 758 
 759         nvec_toggle_global_events(nvec_power_handle, false);
 760         nvec_write_async(nvec_power_handle, ap_pwr_down, 2);
 761 }
 762 
 763 static int tegra_nvec_probe(struct platform_device *pdev)
 764 {
 765         int err, ret;
 766         struct clk *i2c_clk;
 767         struct device *dev = &pdev->dev;
 768         struct nvec_chip *nvec;
 769         struct nvec_msg *msg;
 770         void __iomem *base;
 771         char    get_firmware_version[] = { NVEC_CNTL, GET_FIRMWARE_VERSION },
 772                 unmute_speakers[] = { NVEC_OEM0, 0x10, 0x59, 0x95 },
 773                 enable_event[7] = { NVEC_SYS, CNF_EVENT_REPORTING, true };
 774 
 775         if (!dev->of_node) {
 776                 dev_err(dev, "must be instantiated using device tree\n");
 777                 return -ENODEV;
 778         }
 779 
 780         nvec = devm_kzalloc(dev, sizeof(struct nvec_chip), GFP_KERNEL);
 781         if (!nvec)
 782                 return -ENOMEM;
 783 
 784         platform_set_drvdata(pdev, nvec);
 785         nvec->dev = dev;
 786 
 787         if (of_property_read_u32(dev->of_node, "slave-addr", &nvec->i2c_addr)) {
 788                 dev_err(dev, "no i2c address specified");
 789                 return -ENODEV;
 790         }
 791 
 792         base = devm_platform_ioremap_resource(pdev, 0);
 793         if (IS_ERR(base))
 794                 return PTR_ERR(base);
 795 
 796         nvec->irq = platform_get_irq(pdev, 0);
 797         if (nvec->irq < 0)
 798                 return -ENODEV;
 799 
 800         i2c_clk = devm_clk_get(dev, "div-clk");
 801         if (IS_ERR(i2c_clk)) {
 802                 dev_err(dev, "failed to get controller clock\n");
 803                 return -ENODEV;
 804         }
 805 
 806         nvec->rst = devm_reset_control_get_exclusive(dev, "i2c");
 807         if (IS_ERR(nvec->rst)) {
 808                 dev_err(dev, "failed to get controller reset\n");
 809                 return PTR_ERR(nvec->rst);
 810         }
 811 
 812         nvec->base = base;
 813         nvec->i2c_clk = i2c_clk;
 814         nvec->rx = &nvec->msg_pool[0];
 815 
 816         ATOMIC_INIT_NOTIFIER_HEAD(&nvec->notifier_list);
 817 
 818         init_completion(&nvec->sync_write);
 819         init_completion(&nvec->ec_transfer);
 820         mutex_init(&nvec->sync_write_mutex);
 821         spin_lock_init(&nvec->tx_lock);
 822         spin_lock_init(&nvec->rx_lock);
 823         INIT_LIST_HEAD(&nvec->rx_data);
 824         INIT_LIST_HEAD(&nvec->tx_data);
 825         INIT_WORK(&nvec->rx_work, nvec_dispatch);
 826         INIT_WORK(&nvec->tx_work, nvec_request_master);
 827 
 828         nvec->gpiod = devm_gpiod_get(dev, "request", GPIOD_OUT_HIGH);
 829         if (IS_ERR(nvec->gpiod)) {
 830                 dev_err(dev, "couldn't request gpio\n");
 831                 return PTR_ERR(nvec->gpiod);
 832         }
 833 
 834         err = devm_request_irq(dev, nvec->irq, nvec_interrupt, 0,
 835                                "nvec", nvec);
 836         if (err) {
 837                 dev_err(dev, "couldn't request irq\n");
 838                 return -ENODEV;
 839         }
 840         disable_irq(nvec->irq);
 841 
 842         tegra_init_i2c_slave(nvec);
 843 
 844         /* enable event reporting */
 845         nvec_toggle_global_events(nvec, true);
 846 
 847         nvec->nvec_status_notifier.notifier_call = nvec_status_notifier;
 848         nvec_register_notifier(nvec, &nvec->nvec_status_notifier, 0);
 849 
 850         nvec_power_handle = nvec;
 851         pm_power_off = nvec_power_off;
 852 
 853         /* Get Firmware Version */
 854         err = nvec_write_sync(nvec, get_firmware_version, 2, &msg);
 855 
 856         if (!err) {
 857                 dev_warn(dev,
 858                          "ec firmware version %02x.%02x.%02x / %02x\n",
 859                          msg->data[4], msg->data[5],
 860                          msg->data[6], msg->data[7]);
 861 
 862                 nvec_msg_free(nvec, msg);
 863         }
 864 
 865         ret = mfd_add_devices(dev, 0, nvec_devices,
 866                               ARRAY_SIZE(nvec_devices), NULL, 0, NULL);
 867         if (ret)
 868                 dev_err(dev, "error adding subdevices\n");
 869 
 870         /* unmute speakers? */
 871         nvec_write_async(nvec, unmute_speakers, 4);
 872 
 873         /* enable lid switch event */
 874         nvec_event_mask(enable_event, LID_SWITCH);
 875         nvec_write_async(nvec, enable_event, 7);
 876 
 877         /* enable power button event */
 878         nvec_event_mask(enable_event, PWR_BUTTON);
 879         nvec_write_async(nvec, enable_event, 7);
 880 
 881         return 0;
 882 }
 883 
 884 static int tegra_nvec_remove(struct platform_device *pdev)
 885 {
 886         struct nvec_chip *nvec = platform_get_drvdata(pdev);
 887 
 888         nvec_toggle_global_events(nvec, false);
 889         mfd_remove_devices(nvec->dev);
 890         nvec_unregister_notifier(nvec, &nvec->nvec_status_notifier);
 891         cancel_work_sync(&nvec->rx_work);
 892         cancel_work_sync(&nvec->tx_work);
 893         /* FIXME: needs check whether nvec is responsible for power off */
 894         pm_power_off = NULL;
 895 
 896         return 0;
 897 }
 898 
 899 #ifdef CONFIG_PM_SLEEP
 900 static int nvec_suspend(struct device *dev)
 901 {
 902         int err;
 903         struct nvec_chip *nvec = dev_get_drvdata(dev);
 904         struct nvec_msg *msg;
 905         char ap_suspend[] = { NVEC_SLEEP, AP_SUSPEND };
 906 
 907         dev_dbg(nvec->dev, "suspending\n");
 908 
 909         /* keep these sync or you'll break suspend */
 910         nvec_toggle_global_events(nvec, false);
 911 
 912         err = nvec_write_sync(nvec, ap_suspend, sizeof(ap_suspend), &msg);
 913         if (!err)
 914                 nvec_msg_free(nvec, msg);
 915 
 916         nvec_disable_i2c_slave(nvec);
 917 
 918         return 0;
 919 }
 920 
 921 static int nvec_resume(struct device *dev)
 922 {
 923         struct nvec_chip *nvec = dev_get_drvdata(dev);
 924 
 925         dev_dbg(nvec->dev, "resuming\n");
 926         tegra_init_i2c_slave(nvec);
 927         nvec_toggle_global_events(nvec, true);
 928 
 929         return 0;
 930 }
 931 #endif
 932 
 933 static SIMPLE_DEV_PM_OPS(nvec_pm_ops, nvec_suspend, nvec_resume);
 934 
 935 /* Match table for of_platform binding */
 936 static const struct of_device_id nvidia_nvec_of_match[] = {
 937         { .compatible = "nvidia,nvec", },
 938         {},
 939 };
 940 MODULE_DEVICE_TABLE(of, nvidia_nvec_of_match);
 941 
 942 static struct platform_driver nvec_device_driver = {
 943         .probe   = tegra_nvec_probe,
 944         .remove  = tegra_nvec_remove,
 945         .driver  = {
 946                 .name = "nvec",
 947                 .pm = &nvec_pm_ops,
 948                 .of_match_table = nvidia_nvec_of_match,
 949         }
 950 };
 951 
 952 module_platform_driver(nvec_device_driver);
 953 
 954 MODULE_ALIAS("platform:nvec");
 955 MODULE_DESCRIPTION("NVIDIA compliant embedded controller interface");
 956 MODULE_AUTHOR("Marc Dietrich <marvin24@gmx.de>");
 957 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */