FILE
ucsi_ccg.c
File preview with syntax highlighting.
linux-6.19.14/drivers/usb/typec/ucsi/ucsi_ccg.c
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * UCSI driver for Cypress CCGx Type-C controller 4 * 5 * Copyright (C) 2017-2018 NVIDIA Corporation. All rights reserved. 6 * Author: Ajay Gupta <ajayg@nvidia.com> 7 * 8 * Some code borrowed from drivers/usb/typec/ucsi/ucsi_acpi.c 9 */ 10#include <linux/acpi.h> 11#include <linux/delay.h> 12#include <linux/firmware.h> 13#include <linux/i2c.h> 14#include <linux/module.h> 15#include <linux/pci.h> 16#include <linux/platform_device.h> 17#include <linux/pm.h> 18#include <linux/pm_runtime.h> 19#include <linux/usb/typec_dp.h> 20 21#include <linux/unaligned.h> 22#include "ucsi.h" 23 24enum enum_fw_mode { 25 BOOT, /* bootloader */ 26 FW1, /* FW partition-1 (contains secondary fw) */ 27 FW2, /* FW partition-2 (contains primary fw) */ 28 FW_INVALID, 29}; 30 31#define CCGX_RAB_DEVICE_MODE 0x0000 32#define CCGX_RAB_INTR_REG 0x0006 33#define DEV_INT BIT(0) 34#define PORT0_INT BIT(1) 35#define PORT1_INT BIT(2) 36#define UCSI_READ_INT BIT(7) 37#define CCGX_RAB_JUMP_TO_BOOT 0x0007 38#define TO_BOOT 'J' 39#define TO_ALT_FW 'A' 40#define CCGX_RAB_RESET_REQ 0x0008 41#define RESET_SIG 'R' 42#define CMD_RESET_I2C 0x0 43#define CMD_RESET_DEV 0x1 44#define CCGX_RAB_ENTER_FLASHING 0x000A 45#define FLASH_ENTER_SIG 'P' 46#define CCGX_RAB_VALIDATE_FW 0x000B 47#define CCGX_RAB_FLASH_ROW_RW 0x000C 48#define FLASH_SIG 'F' 49#define FLASH_RD_CMD 0x0 50#define FLASH_WR_CMD 0x1 51#define FLASH_FWCT1_WR_CMD 0x2 52#define FLASH_FWCT2_WR_CMD 0x3 53#define FLASH_FWCT_SIG_WR_CMD 0x4 54#define CCGX_RAB_READ_ALL_VER 0x0010 55#define CCGX_RAB_READ_FW2_VER 0x0020 56#define CCGX_RAB_UCSI_CONTROL 0x0039 57#define CCGX_RAB_UCSI_CONTROL_START BIT(0) 58#define CCGX_RAB_UCSI_CONTROL_STOP BIT(1) 59#define CCGX_RAB_UCSI_DATA_BLOCK(offset) (0xf000 | ((offset) & 0xff)) 60#define REG_FLASH_RW_MEM 0x0200 61#define DEV_REG_IDX CCGX_RAB_DEVICE_MODE 62#define CCGX_RAB_PDPORT_ENABLE 0x002C 63#define PDPORT_1 BIT(0) 64#define PDPORT_2 BIT(1) 65#define CCGX_RAB_RESPONSE 0x007E 66#define ASYNC_EVENT BIT(7) 67 68/* CCGx events & async msg codes */ 69#define RESET_COMPLETE 0x80 70#define EVENT_INDEX RESET_COMPLETE 71#define PORT_CONNECT_DET 0x84 72#define PORT_DISCONNECT_DET 0x85 73#define ROLE_SWAP_COMPELETE 0x87 74 75/* ccg firmware */ 76#define CYACD_LINE_SIZE 527 77#define CCG4_ROW_SIZE 256 78#define FW1_METADATA_ROW 0x1FF 79#define FW2_METADATA_ROW 0x1FE 80#define FW_CFG_TABLE_SIG_SIZE 256 81 82static int secondary_fw_min_ver = 41; 83 84enum enum_flash_mode { 85 SECONDARY_BL, /* update secondary using bootloader */ 86 PRIMARY, /* update primary using secondary */ 87 SECONDARY, /* update secondary using primary */ 88 FLASH_NOT_NEEDED, /* update not required */ 89 FLASH_INVALID, 90}; 91 92static const char * const ccg_fw_names[] = { 93 "ccg_boot.cyacd", 94 "ccg_primary.cyacd", 95 "ccg_secondary.cyacd" 96}; 97 98struct ccg_dev_info { 99#define CCG_DEVINFO_FWMODE_SHIFT (0) 100#define CCG_DEVINFO_FWMODE_MASK (0x3 << CCG_DEVINFO_FWMODE_SHIFT) 101#define CCG_DEVINFO_PDPORTS_SHIFT (2) 102#define CCG_DEVINFO_PDPORTS_MASK (0x3 << CCG_DEVINFO_PDPORTS_SHIFT) 103 u8 mode; 104 u8 bl_mode; 105 __le16 silicon_id; 106 __le16 bl_last_row; 107} __packed; 108 109struct version_format { 110 __le16 build; 111 u8 patch; 112 u8 ver; 113#define CCG_VERSION_PATCH(x) ((x) << 16) 114#define CCG_VERSION(x) ((x) << 24) 115#define CCG_VERSION_MIN_SHIFT (0) 116#define CCG_VERSION_MIN_MASK (0xf << CCG_VERSION_MIN_SHIFT) 117#define CCG_VERSION_MAJ_SHIFT (4) 118#define CCG_VERSION_MAJ_MASK (0xf << CCG_VERSION_MAJ_SHIFT) 119} __packed; 120 121/* 122 * Firmware version 3.1.10 or earlier, built for NVIDIA has known issue 123 * of missing interrupt when a device is connected for runtime resume 124 */ 125#define CCG_FW_BUILD_NVIDIA (('n' << 8) | 'v') 126#define CCG_OLD_FW_VERSION (CCG_VERSION(0x31) | CCG_VERSION_PATCH(10)) 127 128/* Firmware for Tegra doesn't support UCSI ALT command, built 129 * for NVIDIA has known issue of reporting wrong capability info 130 */ 131#define CCG_FW_BUILD_NVIDIA_TEGRA (('g' << 8) | 'n') 132 133/* Altmode offset for NVIDIA Function Test Board (FTB) */ 134#define NVIDIA_FTB_DP_OFFSET (2) 135#define NVIDIA_FTB_DBG_OFFSET (3) 136 137struct version_info { 138 struct version_format base; 139 struct version_format app; 140}; 141 142struct fw_config_table { 143 u32 identity; 144 u16 table_size; 145 u8 fwct_version; 146 u8 is_key_change; 147 u8 guid[16]; 148 struct version_format base; 149 struct version_format app; 150 u8 primary_fw_digest[32]; 151 u32 key_exp_length; 152 u8 key_modulus[256]; 153 u8 key_exp[4]; 154}; 155 156/* CCGx response codes */ 157enum ccg_resp_code { 158 CMD_NO_RESP = 0x00, 159 CMD_SUCCESS = 0x02, 160 FLASH_DATA_AVAILABLE = 0x03, 161 CMD_INVALID = 0x05, 162 FLASH_UPDATE_FAIL = 0x07, 163 INVALID_FW = 0x08, 164 INVALID_ARG = 0x09, 165 CMD_NOT_SUPPORT = 0x0A, 166 TRANSACTION_FAIL = 0x0C, 167 PD_CMD_FAIL = 0x0D, 168 UNDEF_ERROR = 0x0F, 169 INVALID_RESP = 0x10, 170}; 171 172#define CCG_EVENT_MAX (EVENT_INDEX + 43) 173 174struct ccg_cmd { 175 u16 reg; 176 u32 data; 177 int len; 178 u32 delay; /* ms delay for cmd timeout */ 179}; 180 181struct ccg_resp { 182 u8 code; 183 u8 length; 184}; 185 186struct ucsi_ccg_altmode { 187 u16 svid; 188 u32 mid; 189 u8 linked_idx; 190 u8 active_idx; 191#define UCSI_MULTI_DP_INDEX (0xff) 192 bool checked; 193} __packed; 194 195#define CCGX_MESSAGE_IN_MAX 4 196struct op_region { 197 __le32 cci; 198 __le32 message_in[CCGX_MESSAGE_IN_MAX]; 199}; 200 201struct ucsi_ccg { 202 struct device *dev; 203 struct ucsi *ucsi; 204 struct i2c_client *client; 205 206 struct ccg_dev_info info; 207 /* version info for boot, primary and secondary */ 208 struct version_info version[FW2 + 1]; 209 u32 fw_version; 210 /* CCG HPI communication flags */ 211 unsigned long flags; 212#define RESET_PENDING 0 213#define DEV_CMD_PENDING 1 214 struct ccg_resp dev_resp; 215 u8 cmd_resp; 216 int port_num; 217 int irq; 218 struct work_struct work; 219 struct mutex lock; /* to sync between user and driver thread */ 220 221 /* fw build with vendor information */ 222 u16 fw_build; 223 struct work_struct pm_work; 224 225 bool has_multiple_dp; 226 struct ucsi_ccg_altmode orig[UCSI_MAX_ALTMODES]; 227 struct ucsi_ccg_altmode updated[UCSI_MAX_ALTMODES]; 228 229 /* 230 * This spinlock protects op_data which includes CCI and MESSAGE_IN that 231 * will be updated in ISR 232 */ 233 spinlock_t op_lock; 234 struct op_region op_data; 235}; 236 237static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) 238{ 239 struct i2c_client *client = uc->client; 240 const struct i2c_adapter_quirks *quirks = client->adapter->quirks; 241 unsigned char buf[2]; 242 struct i2c_msg msgs[] = { 243 { 244 .addr = client->addr, 245 .flags = 0x0, 246 .len = sizeof(buf), 247 .buf = buf, 248 }, 249 { 250 .addr = client->addr, 251 .flags = I2C_M_RD, 252 .buf = data, 253 }, 254 }; 255 u32 rlen, rem_len = len, max_read_len = len; 256 int status; 257 258 /* check any max_read_len limitation on i2c adapter */ 259 if (quirks && quirks->max_read_len) 260 max_read_len = quirks->max_read_len; 261 262 pm_runtime_get_sync(uc->dev); 263 while (rem_len > 0) { 264 msgs[1].buf = &data[len - rem_len]; 265 rlen = min_t(u16, rem_len, max_read_len); 266 msgs[1].len = rlen; 267 put_unaligned_le16(rab, buf); 268 status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 269 if (status < 0) { 270 dev_err(uc->dev, "i2c_transfer failed %d\n", status); 271 pm_runtime_put_sync(uc->dev); 272 return status; 273 } 274 rab += rlen; 275 rem_len -= rlen; 276 } 277 278 pm_runtime_put_sync(uc->dev); 279 return 0; 280} 281 282static int ccg_write(struct ucsi_ccg *uc, u16 rab, const u8 *data, u32 len) 283{ 284 struct i2c_client *client = uc->client; 285 unsigned char *buf; 286 struct i2c_msg msgs[] = { 287 { 288 .addr = client->addr, 289 .flags = 0x0, 290 } 291 }; 292 int status; 293 294 buf = kzalloc(len + sizeof(rab), GFP_KERNEL); 295 if (!buf) 296 return -ENOMEM; 297 298 put_unaligned_le16(rab, buf); 299 memcpy(buf + sizeof(rab), data, len); 300 301 msgs[0].len = len + sizeof(rab); 302 msgs[0].buf = buf; 303 304 pm_runtime_get_sync(uc->dev); 305 status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 306 if (status < 0) { 307 dev_err(uc->dev, "i2c_transfer failed %d\n", status); 308 pm_runtime_put_sync(uc->dev); 309 kfree(buf); 310 return status; 311 } 312 313 pm_runtime_put_sync(uc->dev); 314 kfree(buf); 315 return 0; 316} 317 318static int ccg_op_region_update(struct ucsi_ccg *uc, u32 cci) 319{ 320 u16 reg = CCGX_RAB_UCSI_DATA_BLOCK(UCSI_MESSAGE_IN); 321 struct op_region *data = &uc->op_data; 322 unsigned char *buf; 323 size_t size = sizeof(data->message_in); 324 325 buf = kzalloc(size, GFP_ATOMIC); 326 if (!buf) 327 return -ENOMEM; 328 if (UCSI_CCI_LENGTH(cci)) { 329 int ret = ccg_read(uc, reg, (void *)buf, size); 330 331 if (ret) { 332 kfree(buf); 333 return ret; 334 } 335 } 336 337 spin_lock(&uc->op_lock); 338 data->cci = cpu_to_le32(cci); 339 if (UCSI_CCI_LENGTH(cci)) 340 memcpy(&data->message_in, buf, size); 341 spin_unlock(&uc->op_lock); 342 kfree(buf); 343 return 0; 344} 345 346static int ucsi_ccg_init(struct ucsi_ccg *uc) 347{ 348 unsigned int count = 10; 349 u8 data; 350 int status; 351 352 spin_lock_init(&uc->op_lock); 353 354 data = CCGX_RAB_UCSI_CONTROL_STOP; 355 status = ccg_write(uc, CCGX_RAB_UCSI_CONTROL, &data, sizeof(data)); 356 if (status < 0) 357 return status; 358 359 data = CCGX_RAB_UCSI_CONTROL_START; 360 status = ccg_write(uc, CCGX_RAB_UCSI_CONTROL, &data, sizeof(data)); 361 if (status < 0) 362 return status; 363 364 /* 365 * Flush CCGx RESPONSE queue by acking interrupts. Above ucsi control 366 * register write will push response which must be cleared. 367 */ 368 do { 369 status = ccg_read(uc, CCGX_RAB_INTR_REG, &data, sizeof(data)); 370 if (status < 0) 371 return status; 372 373 if (!(data & DEV_INT)) 374 return 0; 375 376 status = ccg_write(uc, CCGX_RAB_INTR_REG, &data, sizeof(data)); 377 if (status < 0) 378 return status; 379 380 usleep_range(10000, 11000); 381 } while (--count); 382 383 return -ETIMEDOUT; 384} 385 386static void ucsi_ccg_update_get_current_cam_cmd(struct ucsi_ccg *uc, u8 *data) 387{ 388 u8 cam, new_cam; 389 390 cam = data[0]; 391 new_cam = uc->orig[cam].linked_idx; 392 uc->updated[new_cam].active_idx = cam; 393 data[0] = new_cam; 394} 395 396static bool ucsi_ccg_update_altmodes(struct ucsi *ucsi, 397 u8 recipient, 398 struct ucsi_altmode *orig, 399 struct ucsi_altmode *updated) 400{ 401 struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi); 402 struct ucsi_ccg_altmode *alt, *new_alt; 403 int i, j, k = 0; 404 bool found = false; 405 406 if (recipient != UCSI_RECIPIENT_CON) 407 return false; 408 409 alt = uc->orig; 410 new_alt = uc->updated; 411 memset(uc->updated, 0, sizeof(uc->updated)); 412 413 /* 414 * Copy original connector altmodes to new structure. 415 * We need this before second loop since second loop 416 * checks for duplicate altmodes. 417 */ 418 for (i = 0; i < UCSI_MAX_ALTMODES; i++) { 419 alt[i].svid = orig[i].svid; 420 alt[i].mid = orig[i].mid; 421 if (!alt[i].svid) 422 break; 423 } 424 425 for (i = 0; i < UCSI_MAX_ALTMODES; i++) { 426 if (!alt[i].svid) 427 break; 428 429 /* already checked and considered */ 430 if (alt[i].checked) 431 continue; 432 433 if (!DP_CONF_GET_PIN_ASSIGN(alt[i].mid)) { 434 /* Found Non DP altmode */ 435 new_alt[k].svid = alt[i].svid; 436 new_alt[k].mid |= alt[i].mid; 437 new_alt[k].linked_idx = i; 438 alt[i].linked_idx = k; 439 updated[k].svid = new_alt[k].svid; 440 updated[k].mid = new_alt[k].mid; 441 k++; 442 continue; 443 } 444 445 for (j = i + 1; j < UCSI_MAX_ALTMODES; j++) { 446 if (alt[i].svid != alt[j].svid || 447 !DP_CONF_GET_PIN_ASSIGN(alt[j].mid)) { 448 continue; 449 } else { 450 /* Found duplicate DP mode */ 451 new_alt[k].svid = alt[i].svid; 452 new_alt[k].mid |= alt[i].mid | alt[j].mid; 453 new_alt[k].linked_idx = UCSI_MULTI_DP_INDEX; 454 alt[i].linked_idx = k; 455 alt[j].linked_idx = k; 456 alt[j].checked = true; 457 found = true; 458 } 459 } 460 if (found) { 461 uc->has_multiple_dp = true; 462 } else { 463 /* Didn't find any duplicate DP altmode */ 464 new_alt[k].svid = alt[i].svid; 465 new_alt[k].mid |= alt[i].mid; 466 new_alt[k].linked_idx = i; 467 alt[i].linked_idx = k; 468 } 469 updated[k].svid = new_alt[k].svid; 470 updated[k].mid = new_alt[k].mid; 471 k++; 472 } 473 return found; 474} 475 476static void ucsi_ccg_update_set_new_cam_cmd(struct ucsi_ccg *uc, 477 struct ucsi_connector *con, 478 u64 *cmd) 479{ 480 struct ucsi_ccg_altmode *new_port, *port; 481 struct typec_altmode *alt = NULL; 482 u8 new_cam, cam, pin; 483 bool enter_new_mode; 484 int i, j, k = 0xff; 485 486 port = uc->orig; 487 new_cam = UCSI_SET_NEW_CAM_GET_AM(*cmd); 488 if (new_cam >= ARRAY_SIZE(uc->updated)) 489 return; 490 new_port = &uc->updated[new_cam]; 491 cam = new_port->linked_idx; 492 enter_new_mode = UCSI_SET_NEW_CAM_ENTER(*cmd); 493 494 /* 495 * If CAM is UCSI_MULTI_DP_INDEX then this is DP altmode 496 * with multiple DP mode. Find out CAM for best pin assignment 497 * among all DP mode. Priorite pin E->D->C after making sure 498 * the partner supports that pin. 499 */ 500 if (cam == UCSI_MULTI_DP_INDEX) { 501 if (enter_new_mode) { 502 for (i = 0; con->partner_altmode[i]; i++) { 503 alt = con->partner_altmode[i]; 504 if (alt->svid == new_port->svid) 505 break; 506 } 507 /* 508 * alt will always be non NULL since this is 509 * UCSI_SET_NEW_CAM command and so there will be 510 * at least one con->partner_altmode[i] with svid 511 * matching with new_port->svid. 512 */ 513 for (j = 0; port[j].svid; j++) { 514 pin = DP_CONF_GET_PIN_ASSIGN(port[j].mid); 515 if (alt && port[j].svid == alt->svid && 516 (pin & DP_CONF_GET_PIN_ASSIGN(alt->vdo))) { 517 /* prioritize pin E->D->C */ 518 if (k == 0xff || (k != 0xff && pin > 519 DP_CONF_GET_PIN_ASSIGN(port[k].mid)) 520 ) { 521 k = j; 522 } 523 } 524 } 525 cam = k; 526 new_port->active_idx = cam; 527 } else { 528 cam = new_port->active_idx; 529 } 530 } 531 *cmd &= ~UCSI_SET_NEW_CAM_AM_MASK; 532 *cmd |= UCSI_SET_NEW_CAM_SET_AM(cam); 533} 534 535/* 536 * Change the order of vdo values of NVIDIA test device FTB 537 * (Function Test Board) which reports altmode list with vdo=0x3 538 * first and then vdo=0x. Current logic to assign mode value is 539 * based on order in altmode list and it causes a mismatch of CON 540 * and SOP altmodes since NVIDIA GPU connector has order of vdo=0x1 541 * first and then vdo=0x3 542 */ 543static void ucsi_ccg_nvidia_altmode(struct ucsi_ccg *uc, 544 struct ucsi_altmode *alt, 545 u64 command) 546{ 547 switch (UCSI_ALTMODE_OFFSET(command)) { 548 case NVIDIA_FTB_DP_OFFSET: 549 if (alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DBG_VDO) 550 alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DP_VDO | 551 DP_CAP_DP_SIGNALLING(0) | DP_CAP_USB | 552 DP_CONF_SET_PIN_ASSIGN(BIT(DP_PIN_ASSIGN_E)); 553 break; 554 case NVIDIA_FTB_DBG_OFFSET: 555 if (alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DP_VDO) 556 alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DBG_VDO; 557 break; 558 default: 559 break; 560 } 561} 562 563static int ucsi_ccg_read_version(struct ucsi *ucsi, u16 *version) 564{ 565 struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi); 566 u16 reg = CCGX_RAB_UCSI_DATA_BLOCK(UCSI_VERSION); 567 568 return ccg_read(uc, reg, (u8 *)version, sizeof(*version)); 569} 570 571static int ucsi_ccg_read_cci(struct ucsi *ucsi, u32 *cci) 572{ 573 struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi); 574 575 spin_lock(&uc->op_lock); 576 *cci = uc->op_data.cci; 577 spin_unlock(&uc->op_lock); 578 579 return 0; 580} 581 582static int ucsi_ccg_read_message_in(struct ucsi *ucsi, void *val, size_t val_len) 583{ 584 struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi); 585 586 spin_lock(&uc->op_lock); 587 memcpy(val, uc->op_data.message_in, val_len); 588 spin_unlock(&uc->op_lock); 589 590 return 0; 591} 592 593static int ucsi_ccg_async_control(struct ucsi *ucsi, u64 command) 594{ 595 struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi); 596 u16 reg = CCGX_RAB_UCSI_DATA_BLOCK(UCSI_CONTROL); 597 598 /* 599 * UCSI may read CCI instantly after async_control, 600 * clear CCI to avoid caller getting wrong data before we get CCI from ISR 601 */ 602 spin_lock(&uc->op_lock); 603 uc->op_data.cci = 0; 604 spin_unlock(&uc->op_lock); 605 606 return ccg_write(uc, reg, (u8 *)&command, sizeof(command)); 607} 608 609static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command, u32 *cci, 610 void *data, size_t size) 611{ 612 struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi); 613 struct ucsi_connector *con; 614 int con_index; 615 int ret; 616 617 mutex_lock(&uc->lock); 618 pm_runtime_get_sync(uc->dev); 619 620 if (UCSI_COMMAND(command) == UCSI_SET_NEW_CAM && 621 uc->has_multiple_dp) { 622 con_index = (command >> 16) & 623 UCSI_CMD_CONNECTOR_MASK; 624 if (con_index == 0) { 625 ret = -EINVAL; 626 goto err_put; 627 } 628 con = &uc->ucsi->connector[con_index - 1]; 629 ucsi_ccg_update_set_new_cam_cmd(uc, con, &command); 630 } 631 632 ret = ucsi_sync_control_common(ucsi, command, cci, data, size); 633 634 switch (UCSI_COMMAND(command)) { 635 case UCSI_GET_CURRENT_CAM: 636 if (uc->has_multiple_dp) 637 ucsi_ccg_update_get_current_cam_cmd(uc, (u8 *)data); 638 break; 639 case UCSI_GET_ALTERNATE_MODES: 640 if (UCSI_ALTMODE_RECIPIENT(command) == UCSI_RECIPIENT_SOP) { 641 struct ucsi_altmode *alt = data; 642 643 if (alt[0].svid == USB_TYPEC_NVIDIA_VLINK_SID) 644 ucsi_ccg_nvidia_altmode(uc, alt, command); 645 } 646 break; 647 case UCSI_GET_CAPABILITY: 648 if (uc->fw_build == CCG_FW_BUILD_NVIDIA_TEGRA) { 649 struct ucsi_capability *cap = data; 650 651 cap->features &= ~UCSI_CAP_ALT_MODE_DETAILS; 652 } 653 break; 654 default: 655 break; 656 } 657 658err_put: 659 pm_runtime_put_sync(uc->dev); 660 mutex_unlock(&uc->lock); 661 662 return ret; 663} 664 665static const struct ucsi_operations ucsi_ccg_ops = { 666 .read_version = ucsi_ccg_read_version, 667 .read_cci = ucsi_ccg_read_cci, 668 .poll_cci = ucsi_ccg_read_cci, 669 .read_message_in = ucsi_ccg_read_message_in, 670 .sync_control = ucsi_ccg_sync_control, 671 .async_control = ucsi_ccg_async_control, 672 .update_altmodes = ucsi_ccg_update_altmodes 673}; 674 675static irqreturn_t ccg_irq_handler(int irq, void *data) 676{ 677 u16 reg = CCGX_RAB_UCSI_DATA_BLOCK(UCSI_CCI); 678 struct ucsi_ccg *uc = data; 679 u8 intr_reg; 680 u32 cci = 0; 681 int ret = 0; 682 683 ret = ccg_read(uc, CCGX_RAB_INTR_REG, &intr_reg, sizeof(intr_reg)); 684 if (ret) 685 return ret; 686 687 if (!intr_reg) 688 return IRQ_HANDLED; 689 else if (!(intr_reg & UCSI_READ_INT)) 690 goto err_clear_irq; 691 692 ret = ccg_read(uc, reg, (void *)&cci, sizeof(cci)); 693 if (ret) 694 goto err_clear_irq; 695 696 /* 697 * As per CCGx UCSI interface guide, copy CCI and MESSAGE_IN 698 * to the OpRegion before clear the UCSI interrupt 699 */ 700 ret = ccg_op_region_update(uc, cci); 701 if (ret) 702 goto err_clear_irq; 703 704err_clear_irq: 705 ccg_write(uc, CCGX_RAB_INTR_REG, &intr_reg, sizeof(intr_reg)); 706 707 if (!ret) 708 ucsi_notify_common(uc->ucsi, cci); 709 710 return IRQ_HANDLED; 711} 712 713static int ccg_request_irq(struct ucsi_ccg *uc) 714{ 715 unsigned long flags = IRQF_ONESHOT; 716 717 if (!dev_fwnode(uc->dev)) 718 flags |= IRQF_TRIGGER_HIGH; 719 720 return request_threaded_irq(uc->irq, NULL, ccg_irq_handler, flags, dev_name(uc->dev), uc); 721} 722 723static void ccg_pm_workaround_work(struct work_struct *pm_work) 724{ 725 ccg_irq_handler(0, container_of(pm_work, struct ucsi_ccg, pm_work)); 726} 727 728static int get_fw_info(struct ucsi_ccg *uc) 729{ 730 int err; 731 732 err = ccg_read(uc, CCGX_RAB_READ_ALL_VER, (u8 *)(&uc->version), 733 sizeof(uc->version)); 734 if (err < 0) 735 return err; 736 737 uc->fw_version = CCG_VERSION(uc->version[FW2].app.ver) | 738 CCG_VERSION_PATCH(uc->version[FW2].app.patch); 739 740 err = ccg_read(uc, CCGX_RAB_DEVICE_MODE, (u8 *)(&uc->info), 741 sizeof(uc->info)); 742 if (err < 0) 743 return err; 744 745 return 0; 746} 747 748static inline bool invalid_async_evt(int code) 749{ 750 return (code >= CCG_EVENT_MAX) || (code < EVENT_INDEX); 751} 752 753static void ccg_process_response(struct ucsi_ccg *uc) 754{ 755 struct device *dev = uc->dev; 756 757 if (uc->dev_resp.code & ASYNC_EVENT) { 758 if (uc->dev_resp.code == RESET_COMPLETE) { 759 if (test_bit(RESET_PENDING, &uc->flags)) 760 uc->cmd_resp = uc->dev_resp.code; 761 get_fw_info(uc); 762 } 763 if (invalid_async_evt(uc->dev_resp.code)) 764 dev_err(dev, "invalid async evt %d\n", 765 uc->dev_resp.code); 766 } else { 767 if (test_bit(DEV_CMD_PENDING, &uc->flags)) { 768 uc->cmd_resp = uc->dev_resp.code; 769 clear_bit(DEV_CMD_PENDING, &uc->flags); 770 } else { 771 dev_err(dev, "dev resp 0x%04x but no cmd pending\n", 772 uc->dev_resp.code); 773 } 774 } 775} 776 777static int ccg_read_response(struct ucsi_ccg *uc) 778{ 779 unsigned long target = jiffies + msecs_to_jiffies(1000); 780 struct device *dev = uc->dev; 781 u8 intval; 782 int status; 783 784 /* wait for interrupt status to get updated */ 785 do { 786 status = ccg_read(uc, CCGX_RAB_INTR_REG, &intval, 787 sizeof(intval)); 788 if (status < 0) 789 return status; 790 791 if (intval & DEV_INT) 792 break; 793 usleep_range(500, 600); 794 } while (time_is_after_jiffies(target)); 795 796 if (time_is_before_jiffies(target)) { 797 dev_err(dev, "response timeout error\n"); 798 return -ETIME; 799 } 800 801 status = ccg_read(uc, CCGX_RAB_RESPONSE, (u8 *)&uc->dev_resp, 802 sizeof(uc->dev_resp)); 803 if (status < 0) 804 return status; 805 806 status = ccg_write(uc, CCGX_RAB_INTR_REG, &intval, sizeof(intval)); 807 if (status < 0) 808 return status; 809 810 return 0; 811} 812 813/* Caller must hold uc->lock */ 814static int ccg_send_command(struct ucsi_ccg *uc, struct ccg_cmd *cmd) 815{ 816 struct device *dev = uc->dev; 817 int ret; 818 819 switch (cmd->reg & 0xF000) { 820 case DEV_REG_IDX: 821 set_bit(DEV_CMD_PENDING, &uc->flags); 822 break; 823 default: 824 dev_err(dev, "invalid cmd register\n"); 825 break; 826 } 827 828 ret = ccg_write(uc, cmd->reg, (u8 *)&cmd->data, cmd->len); 829 if (ret < 0) 830 return ret; 831 832 msleep(cmd->delay); 833 834 ret = ccg_read_response(uc); 835 if (ret < 0) { 836 dev_err(dev, "response read error\n"); 837 switch (cmd->reg & 0xF000) { 838 case DEV_REG_IDX: 839 clear_bit(DEV_CMD_PENDING, &uc->flags); 840 break; 841 default: 842 dev_err(dev, "invalid cmd register\n"); 843 break; 844 } 845 return -EIO; 846 } 847 ccg_process_response(uc); 848 849 return uc->cmd_resp; 850} 851 852static int ccg_cmd_enter_flashing(struct ucsi_ccg *uc) 853{ 854 struct ccg_cmd cmd; 855 int ret; 856 857 cmd.reg = CCGX_RAB_ENTER_FLASHING; 858 cmd.data = FLASH_ENTER_SIG; 859 cmd.len = 1; 860 cmd.delay = 50; 861 862 mutex_lock(&uc->lock); 863 864 ret = ccg_send_command(uc, &cmd); 865 866 mutex_unlock(&uc->lock); 867 868 if (ret != CMD_SUCCESS) { 869 dev_err(uc->dev, "enter flashing failed ret=%d\n", ret); 870 return ret; 871 } 872 873 return 0; 874} 875 876static int ccg_cmd_reset(struct ucsi_ccg *uc) 877{ 878 struct ccg_cmd cmd; 879 u8 *p; 880 int ret; 881 882 p = (u8 *)&cmd.data; 883 cmd.reg = CCGX_RAB_RESET_REQ; 884 p[0] = RESET_SIG; 885 p[1] = CMD_RESET_DEV; 886 cmd.len = 2; 887 cmd.delay = 5000; 888 889 mutex_lock(&uc->lock); 890 891 set_bit(RESET_PENDING, &uc->flags); 892 893 ret = ccg_send_command(uc, &cmd); 894 if (ret != RESET_COMPLETE) 895 goto err_clear_flag; 896 897 ret = 0; 898 899err_clear_flag: 900 clear_bit(RESET_PENDING, &uc->flags); 901 902 mutex_unlock(&uc->lock); 903 904 return ret; 905} 906 907static int ccg_cmd_port_control(struct ucsi_ccg *uc, bool enable) 908{ 909 struct ccg_cmd cmd; 910 int ret; 911 912 cmd.reg = CCGX_RAB_PDPORT_ENABLE; 913 if (enable) 914 cmd.data = (uc->port_num == 1) ? 915 PDPORT_1 : (PDPORT_1 | PDPORT_2); 916 else 917 cmd.data = 0x0; 918 cmd.len = 1; 919 cmd.delay = 10; 920 921 mutex_lock(&uc->lock); 922 923 ret = ccg_send_command(uc, &cmd); 924 925 mutex_unlock(&uc->lock); 926 927 if (ret != CMD_SUCCESS) { 928 dev_err(uc->dev, "port control failed ret=%d\n", ret); 929 return ret; 930 } 931 return 0; 932} 933 934static int ccg_cmd_jump_boot_mode(struct ucsi_ccg *uc, int bl_mode) 935{ 936 struct ccg_cmd cmd; 937 int ret; 938 939 cmd.reg = CCGX_RAB_JUMP_TO_BOOT; 940 941 if (bl_mode) 942 cmd.data = TO_BOOT; 943 else 944 cmd.data = TO_ALT_FW; 945 946 cmd.len = 1; 947 cmd.delay = 100; 948 949 mutex_lock(&uc->lock); 950 951 set_bit(RESET_PENDING, &uc->flags); 952 953 ret = ccg_send_command(uc, &cmd); 954 if (ret != RESET_COMPLETE) 955 goto err_clear_flag; 956 957 ret = 0; 958 959err_clear_flag: 960 clear_bit(RESET_PENDING, &uc->flags); 961 962 mutex_unlock(&uc->lock); 963 964 return ret; 965} 966 967static int 968ccg_cmd_write_flash_row(struct ucsi_ccg *uc, u16 row, 969 const void *data, u8 fcmd) 970{ 971 struct i2c_client *client = uc->client; 972 struct ccg_cmd cmd; 973 u8 buf[CCG4_ROW_SIZE + 2]; 974 u8 *p; 975 int ret; 976 977 /* Copy the data into the flash read/write memory. */ 978 put_unaligned_le16(REG_FLASH_RW_MEM, buf); 979 980 memcpy(buf + 2, data, CCG4_ROW_SIZE); 981 982 mutex_lock(&uc->lock); 983 984 ret = i2c_master_send(client, buf, CCG4_ROW_SIZE + 2); 985 if (ret != CCG4_ROW_SIZE + 2) { 986 dev_err(uc->dev, "REG_FLASH_RW_MEM write fail %d\n", ret); 987 mutex_unlock(&uc->lock); 988 return ret < 0 ? ret : -EIO; 989 } 990 991 /* Use the FLASH_ROW_READ_WRITE register to trigger */ 992 /* writing of data to the desired flash row */ 993 p = (u8 *)&cmd.data; 994 cmd.reg = CCGX_RAB_FLASH_ROW_RW; 995 p[0] = FLASH_SIG; 996 p[1] = fcmd; 997 put_unaligned_le16(row, &p[2]); 998 cmd.len = 4; 999 cmd.delay = 50; 1000 if (fcmd == FLASH_FWCT_SIG_WR_CMD) 1001 cmd.delay += 400; 1002 if (row == 510) 1003 cmd.delay += 220; 1004 ret = ccg_send_command(uc, &cmd); 1005 1006 mutex_unlock(&uc->lock); 1007 1008 if (ret != CMD_SUCCESS) { 1009 dev_err(uc->dev, "write flash row failed ret=%d\n", ret); 1010 return ret; 1011 } 1012 1013 return 0; 1014} 1015 1016static int ccg_cmd_validate_fw(struct ucsi_ccg *uc, unsigned int fwid) 1017{ 1018 struct ccg_cmd cmd; 1019 int ret; 1020 1021 cmd.reg = CCGX_RAB_VALIDATE_FW; 1022 cmd.data = fwid; 1023 cmd.len = 1; 1024 cmd.delay = 500; 1025 1026 mutex_lock(&uc->lock); 1027 1028 ret = ccg_send_command(uc, &cmd); 1029 1030 mutex_unlock(&uc->lock); 1031 1032 if (ret != CMD_SUCCESS) 1033 return ret; 1034 1035 return 0; 1036} 1037 1038static bool ccg_check_vendor_version(struct ucsi_ccg *uc, 1039 struct version_format *app, 1040 struct fw_config_table *fw_cfg) 1041{ 1042 struct device *dev = uc->dev; 1043 1044 /* Check if the fw build is for supported vendors */ 1045 if (le16_to_cpu(app->build) != uc->fw_build) { 1046 dev_info(dev, "current fw is not from supported vendor\n"); 1047 return false; 1048 } 1049 1050 /* Check if the new fw build is for supported vendors */ 1051 if (le16_to_cpu(fw_cfg->app.build) != uc->fw_build) { 1052 dev_info(dev, "new fw is not from supported vendor\n"); 1053 return false; 1054 } 1055 return true; 1056} 1057 1058static bool ccg_check_fw_version(struct ucsi_ccg *uc, const char *fw_name, 1059 struct version_format *app) 1060{ 1061 const struct firmware *fw = NULL; 1062 struct device *dev = uc->dev; 1063 struct fw_config_table fw_cfg; 1064 u32 cur_version, new_version; 1065 bool is_later = false; 1066 1067 if (request_firmware(&fw, fw_name, dev) != 0) { 1068 dev_err(dev, "error: Failed to open cyacd file %s\n", fw_name); 1069 return false; 1070 } 1071 1072 /* 1073 * check if signed fw 1074 * last part of fw image is fw cfg table and signature 1075 */ 1076 if (fw->size < sizeof(fw_cfg) + FW_CFG_TABLE_SIG_SIZE) 1077 goto out_release_firmware; 1078 1079 memcpy((uint8_t *)&fw_cfg, fw->data + fw->size - 1080 sizeof(fw_cfg) - FW_CFG_TABLE_SIG_SIZE, sizeof(fw_cfg)); 1081 1082 if (fw_cfg.identity != ('F' | 'W' << 8 | 'C' << 16 | 'T' << 24)) { 1083 dev_info(dev, "not a signed image\n"); 1084 goto out_release_firmware; 1085 } 1086 1087 /* compare input version with FWCT version */ 1088 cur_version = le16_to_cpu(app->build) | CCG_VERSION_PATCH(app->patch) | 1089 CCG_VERSION(app->ver); 1090 1091 new_version = le16_to_cpu(fw_cfg.app.build) | 1092 CCG_VERSION_PATCH(fw_cfg.app.patch) | 1093 CCG_VERSION(fw_cfg.app.ver); 1094 1095 if (!ccg_check_vendor_version(uc, app, &fw_cfg)) 1096 goto out_release_firmware; 1097 1098 if (new_version > cur_version) 1099 is_later = true; 1100 1101out_release_firmware: 1102 release_firmware(fw); 1103 return is_later; 1104} 1105 1106static int ccg_fw_update_needed(struct ucsi_ccg *uc, 1107 enum enum_flash_mode *mode) 1108{ 1109 struct device *dev = uc->dev; 1110 int err; 1111 struct version_info version[3]; 1112 1113 err = ccg_read(uc, CCGX_RAB_DEVICE_MODE, (u8 *)(&uc->info), 1114 sizeof(uc->info)); 1115 if (err) { 1116 dev_err(dev, "read device mode failed\n"); 1117 return err; 1118 } 1119 1120 err = ccg_read(uc, CCGX_RAB_READ_ALL_VER, (u8 *)version, 1121 sizeof(version)); 1122 if (err) { 1123 dev_err(dev, "read device mode failed\n"); 1124 return err; 1125 } 1126 1127 if (memcmp(&version[FW1], "\0\0\0\0\0\0\0\0", 1128 sizeof(struct version_info)) == 0) { 1129 dev_info(dev, "secondary fw is not flashed\n"); 1130 *mode = SECONDARY_BL; 1131 } else if (le16_to_cpu(version[FW1].base.build) < 1132 secondary_fw_min_ver) { 1133 dev_info(dev, "secondary fw version is too low (< %d)\n", 1134 secondary_fw_min_ver); 1135 *mode = SECONDARY; 1136 } else if (memcmp(&version[FW2], "\0\0\0\0\0\0\0\0", 1137 sizeof(struct version_info)) == 0) { 1138 dev_info(dev, "primary fw is not flashed\n"); 1139 *mode = PRIMARY; 1140 } else if (ccg_check_fw_version(uc, ccg_fw_names[PRIMARY], 1141 &version[FW2].app)) { 1142 dev_info(dev, "found primary fw with later version\n"); 1143 *mode = PRIMARY; 1144 } else { 1145 dev_info(dev, "secondary and primary fw are the latest\n"); 1146 *mode = FLASH_NOT_NEEDED; 1147 } 1148 return 0; 1149} 1150 1151static int do_flash(struct ucsi_ccg *uc, enum enum_flash_mode mode) 1152{ 1153 struct device *dev = uc->dev; 1154 const struct firmware *fw = NULL; 1155 const char *p, *s; 1156 const char *eof; 1157 int err, row, len, line_sz, line_cnt = 0; 1158 unsigned long start_time = jiffies; 1159 struct fw_config_table fw_cfg; 1160 u8 fw_cfg_sig[FW_CFG_TABLE_SIG_SIZE]; 1161 u8 *wr_buf; 1162 1163 err = request_firmware(&fw, ccg_fw_names[mode], dev); 1164 if (err) { 1165 dev_err(dev, "request %s failed err=%d\n", 1166 ccg_fw_names[mode], err); 1167 return err; 1168 } 1169 1170 if (((uc->info.mode & CCG_DEVINFO_FWMODE_MASK) >> 1171 CCG_DEVINFO_FWMODE_SHIFT) == FW2) { 1172 err = ccg_cmd_port_control(uc, false); 1173 if (err < 0) 1174 goto release_fw; 1175 err = ccg_cmd_jump_boot_mode(uc, 0); 1176 if (err < 0) 1177 goto release_fw; 1178 } 1179 1180 eof = fw->data + fw->size; 1181 1182 /* 1183 * check if signed fw 1184 * last part of fw image is fw cfg table and signature 1185 */ 1186 if (fw->size < sizeof(fw_cfg) + sizeof(fw_cfg_sig)) 1187 goto not_signed_fw; 1188 1189 memcpy((uint8_t *)&fw_cfg, fw->data + fw->size - 1190 sizeof(fw_cfg) - sizeof(fw_cfg_sig), sizeof(fw_cfg)); 1191 1192 if (fw_cfg.identity != ('F' | ('W' << 8) | ('C' << 16) | ('T' << 24))) { 1193 dev_info(dev, "not a signed image\n"); 1194 goto not_signed_fw; 1195 } 1196 eof = fw->data + fw->size - sizeof(fw_cfg) - sizeof(fw_cfg_sig); 1197 1198 memcpy((uint8_t *)&fw_cfg_sig, 1199 fw->data + fw->size - sizeof(fw_cfg_sig), sizeof(fw_cfg_sig)); 1200 1201 /* flash fw config table and signature first */ 1202 err = ccg_cmd_write_flash_row(uc, 0, (u8 *)&fw_cfg, 1203 FLASH_FWCT1_WR_CMD); 1204 if (err) 1205 goto release_fw; 1206 1207 err = ccg_cmd_write_flash_row(uc, 0, (u8 *)&fw_cfg + CCG4_ROW_SIZE, 1208 FLASH_FWCT2_WR_CMD); 1209 if (err) 1210 goto release_fw; 1211 1212 err = ccg_cmd_write_flash_row(uc, 0, &fw_cfg_sig, 1213 FLASH_FWCT_SIG_WR_CMD); 1214 if (err) 1215 goto release_fw; 1216 1217not_signed_fw: 1218 wr_buf = kzalloc(CCG4_ROW_SIZE + 4, GFP_KERNEL); 1219 if (!wr_buf) { 1220 err = -ENOMEM; 1221 goto release_fw; 1222 } 1223 1224 err = ccg_cmd_enter_flashing(uc); 1225 if (err) 1226 goto release_mem; 1227 1228 /***************************************************************** 1229 * CCG firmware image (.cyacd) file line format 1230 * 1231 * :00rrrrllll[dd....]cc/r/n 1232 * 1233 * :00 header 1234 * rrrr is row number to flash (4 char) 1235 * llll is data len to flash (4 char) 1236 * dd is a data field represents one byte of data (512 char) 1237 * cc is checksum (2 char) 1238 * \r\n newline 1239 * 1240 * Total length: 3 + 4 + 4 + 512 + 2 + 2 = 527 1241 * 1242 *****************************************************************/ 1243 1244 p = strnchr(fw->data, fw->size, ':'); 1245 while (p < eof) { 1246 s = strnchr(p + 1, eof - p - 1, ':'); 1247 1248 if (!s) 1249 s = eof; 1250 1251 line_sz = s - p; 1252 1253 if (line_sz != CYACD_LINE_SIZE) { 1254 dev_err(dev, "Bad FW format line_sz=%d\n", line_sz); 1255 err = -EINVAL; 1256 goto release_mem; 1257 } 1258 1259 if (hex2bin(wr_buf, p + 3, CCG4_ROW_SIZE + 4)) { 1260 err = -EINVAL; 1261 goto release_mem; 1262 } 1263 1264 row = get_unaligned_be16(wr_buf); 1265 len = get_unaligned_be16(&wr_buf[2]); 1266 1267 if (len != CCG4_ROW_SIZE) { 1268 err = -EINVAL; 1269 goto release_mem; 1270 } 1271 1272 err = ccg_cmd_write_flash_row(uc, row, wr_buf + 4, 1273 FLASH_WR_CMD); 1274 if (err) 1275 goto release_mem; 1276 1277 line_cnt++; 1278 p = s; 1279 } 1280 1281 dev_info(dev, "total %d row flashed. time: %dms\n", 1282 line_cnt, jiffies_to_msecs(jiffies - start_time)); 1283 1284 err = ccg_cmd_validate_fw(uc, (mode == PRIMARY) ? FW2 : FW1); 1285 if (err) 1286 dev_err(dev, "%s validation failed err=%d\n", 1287 (mode == PRIMARY) ? "FW2" : "FW1", err); 1288 else 1289 dev_info(dev, "%s validated\n", 1290 (mode == PRIMARY) ? "FW2" : "FW1"); 1291 1292 err = ccg_cmd_port_control(uc, false); 1293 if (err < 0) 1294 goto release_mem; 1295 1296 err = ccg_cmd_reset(uc); 1297 if (err < 0) 1298 goto release_mem; 1299 1300 err = ccg_cmd_port_control(uc, true); 1301 if (err < 0) 1302 goto release_mem; 1303 1304release_mem: 1305 kfree(wr_buf); 1306 1307release_fw: 1308 release_firmware(fw); 1309 return err; 1310} 1311 1312/******************************************************************************* 1313 * CCG4 has two copies of the firmware in addition to the bootloader. 1314 * If the device is running FW1, FW2 can be updated with the new version. 1315 * Dual firmware mode allows the CCG device to stay in a PD contract and support 1316 * USB PD and Type-C functionality while a firmware update is in progress. 1317 ******************************************************************************/ 1318static int ccg_fw_update(struct ucsi_ccg *uc, enum enum_flash_mode flash_mode) 1319{ 1320 int err = 0; 1321 1322 while (flash_mode != FLASH_NOT_NEEDED) { 1323 err = do_flash(uc, flash_mode); 1324 if (err < 0) 1325 return err; 1326 err = ccg_fw_update_needed(uc, &flash_mode); 1327 if (err < 0) 1328 return err; 1329 } 1330 dev_info(uc->dev, "CCG FW update successful\n"); 1331 1332 return err; 1333} 1334 1335static int ccg_restart(struct ucsi_ccg *uc) 1336{ 1337 struct device *dev = uc->dev; 1338 int status; 1339 1340 status = ucsi_ccg_init(uc); 1341 if (status < 0) { 1342 dev_err(dev, "ucsi_ccg_start fail, err=%d\n", status); 1343 return status; 1344 } 1345 1346 status = ccg_request_irq(uc); 1347 if (status < 0) { 1348 dev_err(dev, "request_threaded_irq failed - %d\n", status); 1349 return status; 1350 } 1351 1352 status = ucsi_register(uc->ucsi); 1353 if (status) { 1354 dev_err(uc->dev, "failed to register the interface\n"); 1355 return status; 1356 } 1357 1358 pm_runtime_enable(uc->dev); 1359 return 0; 1360} 1361 1362static void ccg_update_firmware(struct work_struct *work) 1363{ 1364 struct ucsi_ccg *uc = container_of(work, struct ucsi_ccg, work); 1365 enum enum_flash_mode flash_mode; 1366 int status; 1367 1368 status = ccg_fw_update_needed(uc, &flash_mode); 1369 if (status < 0) 1370 return; 1371 1372 if (flash_mode != FLASH_NOT_NEEDED) { 1373 ucsi_unregister(uc->ucsi); 1374 pm_runtime_disable(uc->dev); 1375 free_irq(uc->irq, uc); 1376 1377 ccg_fw_update(uc, flash_mode); 1378 ccg_restart(uc); 1379 } 1380} 1381 1382static ssize_t do_flash_store(struct device *dev, 1383 struct device_attribute *attr, 1384 const char *buf, size_t n) 1385{ 1386 struct ucsi_ccg *uc = i2c_get_clientdata(to_i2c_client(dev)); 1387 bool flash; 1388 1389 if (kstrtobool(buf, &flash)) 1390 return -EINVAL; 1391 1392 if (!flash) 1393 return n; 1394 1395 schedule_work(&uc->work); 1396 return n; 1397} 1398 1399static umode_t ucsi_ccg_attrs_is_visible(struct kobject *kobj, struct attribute *attr, int idx) 1400{ 1401 struct device *dev = kobj_to_dev(kobj); 1402 struct ucsi_ccg *uc = i2c_get_clientdata(to_i2c_client(dev)); 1403 1404 if (!uc->fw_build) 1405 return 0; 1406 1407 return attr->mode; 1408} 1409 1410static DEVICE_ATTR_WO(do_flash); 1411 1412static struct attribute *ucsi_ccg_attrs[] = { 1413 &dev_attr_do_flash.attr, 1414 NULL, 1415}; 1416static struct attribute_group ucsi_ccg_attr_group = { 1417 .attrs = ucsi_ccg_attrs, 1418 .is_visible = ucsi_ccg_attrs_is_visible, 1419}; 1420static const struct attribute_group *ucsi_ccg_groups[] = { 1421 &ucsi_ccg_attr_group, 1422 NULL, 1423}; 1424 1425static int ucsi_ccg_probe(struct i2c_client *client) 1426{ 1427 struct device *dev = &client->dev; 1428 struct ucsi_ccg *uc; 1429 const char *fw_name; 1430 int status; 1431 1432 uc = devm_kzalloc(dev, sizeof(*uc), GFP_KERNEL); 1433 if (!uc) 1434 return -ENOMEM; 1435 1436 uc->dev = dev; 1437 uc->client = client; 1438 uc->irq = client->irq; 1439 mutex_init(&uc->lock); 1440 INIT_WORK(&uc->work, ccg_update_firmware); 1441 INIT_WORK(&uc->pm_work, ccg_pm_workaround_work); 1442 1443 /* Only fail FW flashing when FW build information is not provided */ 1444 status = device_property_read_string(dev, "firmware-name", &fw_name); 1445 if (!status) { 1446 if (!strcmp(fw_name, "nvidia,jetson-agx-xavier")) 1447 uc->fw_build = CCG_FW_BUILD_NVIDIA_TEGRA; 1448 else if (!strcmp(fw_name, "nvidia,gpu")) 1449 uc->fw_build = CCG_FW_BUILD_NVIDIA; 1450 if (!uc->fw_build) 1451 dev_err(uc->dev, "failed to get FW build information\n"); 1452 } 1453 1454 /* reset ccg device and initialize ucsi */ 1455 status = ucsi_ccg_init(uc); 1456 if (status < 0) { 1457 dev_err(uc->dev, "ucsi_ccg_init failed - %d\n", status); 1458 return status; 1459 } 1460 1461 status = get_fw_info(uc); 1462 if (status < 0) { 1463 dev_err(uc->dev, "get_fw_info failed - %d\n", status); 1464 return status; 1465 } 1466 1467 uc->port_num = 1; 1468 1469 if (uc->info.mode & CCG_DEVINFO_PDPORTS_MASK) 1470 uc->port_num++; 1471 1472 uc->ucsi = ucsi_create(dev, &ucsi_ccg_ops); 1473 if (IS_ERR(uc->ucsi)) 1474 return PTR_ERR(uc->ucsi); 1475 1476 ucsi_set_drvdata(uc->ucsi, uc); 1477 1478 status = ccg_request_irq(uc); 1479 if (status < 0) { 1480 dev_err(uc->dev, "request_threaded_irq failed - %d\n", status); 1481 goto out_ucsi_destroy; 1482 } 1483 1484 status = ucsi_register(uc->ucsi); 1485 if (status) 1486 goto out_free_irq; 1487 1488 i2c_set_clientdata(client, uc); 1489 1490 device_disable_async_suspend(uc->dev); 1491 1492 pm_runtime_set_active(uc->dev); 1493 pm_runtime_enable(uc->dev); 1494 pm_runtime_use_autosuspend(uc->dev); 1495 pm_runtime_set_autosuspend_delay(uc->dev, 5000); 1496 pm_runtime_idle(uc->dev); 1497 1498 return 0; 1499 1500out_free_irq: 1501 free_irq(uc->irq, uc); 1502out_ucsi_destroy: 1503 ucsi_destroy(uc->ucsi); 1504 1505 return status; 1506} 1507 1508static void ucsi_ccg_remove(struct i2c_client *client) 1509{ 1510 struct ucsi_ccg *uc = i2c_get_clientdata(client); 1511 1512 cancel_work_sync(&uc->pm_work); 1513 cancel_work_sync(&uc->work); 1514 pm_runtime_disable(uc->dev); 1515 ucsi_unregister(uc->ucsi); 1516 ucsi_destroy(uc->ucsi); 1517 free_irq(uc->irq, uc); 1518} 1519 1520static const struct of_device_id ucsi_ccg_of_match_table[] = { 1521 { .compatible = "cypress,cypd4226", }, 1522 { /* sentinel */ } 1523}; 1524MODULE_DEVICE_TABLE(of, ucsi_ccg_of_match_table); 1525 1526static const struct i2c_device_id ucsi_ccg_device_id[] = { 1527 { "ccgx-ucsi" }, 1528 {} 1529}; 1530MODULE_DEVICE_TABLE(i2c, ucsi_ccg_device_id); 1531 1532static const struct acpi_device_id amd_i2c_ucsi_match[] = { 1533 {"AMDI0042"}, 1534 {} 1535}; 1536MODULE_DEVICE_TABLE(acpi, amd_i2c_ucsi_match); 1537 1538static int ucsi_ccg_resume(struct device *dev) 1539{ 1540 struct i2c_client *client = to_i2c_client(dev); 1541 struct ucsi_ccg *uc = i2c_get_clientdata(client); 1542 1543 return ucsi_resume(uc->ucsi); 1544} 1545 1546static int ucsi_ccg_runtime_suspend(struct device *dev) 1547{ 1548 return 0; 1549} 1550 1551static int ucsi_ccg_runtime_resume(struct device *dev) 1552{ 1553 struct i2c_client *client = to_i2c_client(dev); 1554 struct ucsi_ccg *uc = i2c_get_clientdata(client); 1555 1556 /* 1557 * Firmware version 3.1.10 or earlier, built for NVIDIA has known issue 1558 * of missing interrupt when a device is connected for runtime resume. 1559 * Schedule a work to call ISR as a workaround. 1560 */ 1561 if (uc->fw_build == CCG_FW_BUILD_NVIDIA && 1562 uc->fw_version <= CCG_OLD_FW_VERSION) 1563 schedule_work(&uc->pm_work); 1564 1565 return 0; 1566} 1567 1568static const struct dev_pm_ops ucsi_ccg_pm = { 1569 .resume = ucsi_ccg_resume, 1570 .runtime_suspend = ucsi_ccg_runtime_suspend, 1571 .runtime_resume = ucsi_ccg_runtime_resume, 1572}; 1573 1574static struct i2c_driver ucsi_ccg_driver = { 1575 .driver = { 1576 .name = "ucsi_ccg", 1577 .pm = &ucsi_ccg_pm, 1578 .dev_groups = ucsi_ccg_groups, 1579 .acpi_match_table = amd_i2c_ucsi_match, 1580 .of_match_table = ucsi_ccg_of_match_table, 1581 }, 1582 .probe = ucsi_ccg_probe, 1583 .remove = ucsi_ccg_remove, 1584 .id_table = ucsi_ccg_device_id, 1585}; 1586 1587module_i2c_driver(ucsi_ccg_driver); 1588 1589MODULE_AUTHOR("Ajay Gupta <ajayg@nvidia.com>"); 1590MODULE_DESCRIPTION("UCSI driver for Cypress CCGx Type-C controller"); 1591MODULE_LICENSE("GPL v2");
~/
Read-only file preview.