Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'qcom-drivers-for-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into arm/drivers

Qualcomm driver updates for v5.11

This adds support for the core power domains on MSM8916, MSM8939, SDM660
and SDX55. It adds SM8150 support to the last-level cache controller
driver and it makes it possible to build the Command DB and RPMh drivers
as modules.

It also contains a slew of smaller cleanups, style and bug fixes
throughout the various drivers.

* tag 'qcom-drivers-for-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (39 commits)
soc: qcom: rpmhpd: Add SDX55 power domains
dt-bindings: power: Add rpm power domain bindings for sdx55
soc: qcom: rpmh: Use __fill_rpmh_msg API during rpmh_write()
samples: qmi: Constify static qmi ops
soc: qcom: pdr: Constify static qmi structs
soc: qcom: initialize local variable
soc: qcom: socinfo: add soc ids for msm8953 variants
soc: qcom: geni: Remove "iova" check
soc: qcom: llcc: Add configuration data for SM8150
dt-bindings: msm: Add LLCC for SM8150
soc: qcom: rpmh: Fix possible doc-rot in rpmh_write()'s header
soc: qcom: kryo-l2-accessors: Fix misnaming of 'val'
soc: qcom: rpmhpd: Provide some missing struct member descriptions
soc: qcom: llcc-qcom: Fix expected kernel-doc formatting
soc: qcom: smp2p: Remove unused struct attribute provide another
soc: qcom: wcnss_ctrl: Demote non-conformant struct header and fix function headers
soc: qcom: smsm: Fix some kernel-doc formatting and naming problems
soc: qcom: smem: Fix formatting and missing documentation issues
soc: qcom: qcom-geni-se: Fix misnamed function parameter 'rx_rfr'
soc: qcom: qcom_aoss: Add missing description for 'cooling_devs'
...

Link: https://lore.kernel.org/r/20201130190142.345246-1-bjorn.andersson@linaro.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+345 -99
+1
Documentation/devicetree/bindings/arm/msm/qcom,llcc.yaml
··· 23 23 enum: 24 24 - qcom,sc7180-llcc 25 25 - qcom,sdm845-llcc 26 + - qcom,sm8150-llcc 26 27 27 28 reg: 28 29 items:
+4
Documentation/devicetree/bindings/power/qcom,rpmpd.yaml
··· 16 16 properties: 17 17 compatible: 18 18 enum: 19 + - qcom,msm8916-rpmpd 20 + - qcom,msm8939-rpmpd 19 21 - qcom,msm8976-rpmpd 20 22 - qcom,msm8996-rpmpd 21 23 - qcom,msm8998-rpmpd 22 24 - qcom,qcs404-rpmpd 25 + - qcom,sdm660-rpmpd 23 26 - qcom,sc7180-rpmhpd 24 27 - qcom,sdm845-rpmhpd 28 + - qcom,sdx55-rpmhpd 25 29 - qcom,sm8150-rpmhpd 26 30 - qcom,sm8250-rpmhpd 27 31
+2 -4
drivers/i2c/busses/i2c-qcom-geni.c
··· 366 366 geni_se_select_mode(se, GENI_SE_FIFO); 367 367 368 368 writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN); 369 + geni_se_setup_m_cmd(se, I2C_READ, m_param); 369 370 370 371 if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) { 371 372 geni_se_select_mode(se, GENI_SE_FIFO); 372 373 i2c_put_dma_safe_msg_buf(dma_buf, msg, false); 373 374 dma_buf = NULL; 374 375 } 375 - 376 - geni_se_setup_m_cmd(se, I2C_READ, m_param); 377 376 378 377 time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); 379 378 if (!time_left) ··· 407 408 geni_se_select_mode(se, GENI_SE_FIFO); 408 409 409 410 writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN); 411 + geni_se_setup_m_cmd(se, I2C_WRITE, m_param); 410 412 411 413 if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) { 412 414 geni_se_select_mode(se, GENI_SE_FIFO); 413 415 i2c_put_dma_safe_msg_buf(dma_buf, msg, false); 414 416 dma_buf = NULL; 415 417 } 416 - 417 - geni_se_setup_m_cmd(se, I2C_WRITE, m_param); 418 418 419 419 if (!dma_buf) /* Get FIFO IRQ */ 420 420 writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);
+3 -2
drivers/soc/qcom/Kconfig
··· 17 17 Subsystem (AOSS) using Qualcomm Messaging Protocol (QMP). 18 18 19 19 config QCOM_COMMAND_DB 20 - bool "Qualcomm Command DB" 20 + tristate "Qualcomm Command DB" 21 21 depends on ARCH_QCOM || COMPILE_TEST 22 22 depends on OF_RESERVED_MEM 23 23 help ··· 108 108 Say y here if you intend to boot the modem remoteproc. 109 109 110 110 config QCOM_RPMH 111 - bool "Qualcomm RPM-Hardened (RPMH) Communication" 111 + tristate "Qualcomm RPM-Hardened (RPMH) Communication" 112 112 depends on ARCH_QCOM || COMPILE_TEST 113 + depends on (QCOM_COMMAND_DB || !QCOM_COMMAND_DB) 113 114 help 114 115 Support for communication with the hardened-RPM blocks in 115 116 Qualcomm Technologies Inc (QTI) SoCs. RPMH communication uses an
+7 -1
drivers/soc/qcom/cmd-db.c
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 - /* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. */ 2 + /* Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved. */ 3 3 4 4 #include <linux/debugfs.h> 5 5 #include <linux/kernel.h> 6 + #include <linux/module.h> 6 7 #include <linux/of.h> 7 8 #include <linux/of_address.h> 8 9 #include <linux/of_reserved_mem.h> ··· 341 340 { .compatible = "qcom,cmd-db" }, 342 341 { } 343 342 }; 343 + MODULE_DEVICE_TABLE(of, cmd_db_match_table); 344 344 345 345 static struct platform_driver cmd_db_dev_driver = { 346 346 .probe = cmd_db_dev_probe, 347 347 .driver = { 348 348 .name = "cmd-db", 349 349 .of_match_table = cmd_db_match_table, 350 + .suppress_bind_attrs = true, 350 351 }, 351 352 }; 352 353 ··· 357 354 return platform_driver_register(&cmd_db_dev_driver); 358 355 } 359 356 arch_initcall(cmd_db_device_init); 357 + 358 + MODULE_DESCRIPTION("Qualcomm Technologies, Inc. Command DB Driver"); 359 + MODULE_LICENSE("GPL v2");
+1 -1
drivers/soc/qcom/kryo-l2-accessors.c
··· 16 16 /** 17 17 * kryo_l2_set_indirect_reg() - write value to an L2 register 18 18 * @reg: Address of L2 register. 19 - * @value: Value to be written to register. 19 + * @val: Value to be written to register. 20 20 * 21 21 * Use architecturally required barriers for ordering between system register 22 22 * accesses, and system registers with respect to device memory
+106 -41
drivers/soc/qcom/llcc-qcom.c
··· 45 45 #define LLCC_TRP_ATTR0_CFGn(n) (0x21000 + SZ_8 * n) 46 46 #define LLCC_TRP_ATTR1_CFGn(n) (0x21004 + SZ_8 * n) 47 47 48 + #define LLCC_TRP_SCID_DIS_CAP_ALLOC 0x21f00 49 + #define LLCC_TRP_PCB_ACT 0x21f04 50 + 48 51 #define BANK_OFFSET_STRIDE 0x80000 49 52 50 53 /** 51 - * llcc_slice_config - Data associated with the llcc slice 54 + * struct llcc_slice_config - Data associated with the llcc slice 52 55 * @usecase_id: Unique id for the client's use case 53 56 * @slice_id: llcc slice id for each client 54 57 * @max_cap: The maximum capacity of the cache slice provided in KB ··· 92 89 struct qcom_llcc_config { 93 90 const struct llcc_slice_config *sct_data; 94 91 int size; 92 + bool need_llcc_cfg; 95 93 }; 96 94 97 95 static const struct llcc_slice_config sc7180_data[] = { ··· 123 119 { LLCC_AUDHW, 22, 1024, 1, 1, 0xffc, 0x2, 0, 0, 1, 1, 0 }, 124 120 }; 125 121 122 + static const struct llcc_slice_config sm8150_data[] = { 123 + { LLCC_CPUSS, 1, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 1 }, 124 + { LLCC_VIDSC0, 2, 512, 2, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 125 + { LLCC_VIDSC1, 3, 512, 2, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 126 + { LLCC_AUDIO, 6, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 127 + { LLCC_MDMHPGRW, 7, 3072, 1, 0, 0xFF, 0xF00, 0, 0, 0, 1, 0 }, 128 + { LLCC_MDM, 8, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 129 + { LLCC_MODHW, 9, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 130 + { LLCC_CMPT, 10, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 131 + { LLCC_GPUHTW , 11, 512, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 132 + { LLCC_GPU, 12, 2560, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 133 + { LLCC_MMUHWT, 13, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1 }, 134 + { LLCC_CMPTDMA, 15, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 135 + { LLCC_DISP, 16, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 136 + { LLCC_MDMHPFX, 20, 1024, 2, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 137 + { LLCC_MDMHPFX, 21, 1024, 0, 1, 0xF, 0x0, 0, 0, 0, 1, 0 }, 138 + { LLCC_AUDHW, 22, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 139 + { LLCC_NPU, 23, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 140 + { LLCC_WLHW, 24, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 }, 141 + { LLCC_MODPE, 29, 256, 1, 1, 0xF, 0x0, 0, 0, 0, 1, 0 }, 142 + { LLCC_APTCM, 30, 256, 3, 1, 0x0, 0x1, 1, 0, 0, 1, 0 }, 143 + { LLCC_WRCACHE, 31, 128, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0 }, 144 + }; 145 + 126 146 static const struct qcom_llcc_config sc7180_cfg = { 127 147 .sct_data = sc7180_data, 128 148 .size = ARRAY_SIZE(sc7180_data), 149 + .need_llcc_cfg = true, 129 150 }; 130 151 131 152 static const struct qcom_llcc_config sdm845_cfg = { 132 153 .sct_data = sdm845_data, 133 154 .size = ARRAY_SIZE(sdm845_data), 155 + .need_llcc_cfg = false, 156 + }; 157 + 158 + static const struct qcom_llcc_config sm8150_cfg = { 159 + .sct_data = sm8150_data, 160 + .size = ARRAY_SIZE(sm8150_data), 134 161 }; 135 162 136 163 static struct llcc_drv_data *drv_data = (void *) -EPROBE_DEFER; ··· 353 318 } 354 319 EXPORT_SYMBOL_GPL(llcc_get_slice_size); 355 320 356 - static int qcom_llcc_cfg_program(struct platform_device *pdev) 321 + static int _qcom_llcc_cfg_program(const struct llcc_slice_config *config, 322 + const struct qcom_llcc_config *cfg) 357 323 { 358 - int i; 324 + int ret; 359 325 u32 attr1_cfg; 360 326 u32 attr0_cfg; 361 327 u32 attr1_val; 362 328 u32 attr0_val; 363 329 u32 max_cap_cacheline; 330 + struct llcc_slice_desc desc; 331 + 332 + attr1_val = config->cache_mode; 333 + attr1_val |= config->probe_target_ways << ATTR1_PROBE_TARGET_WAYS_SHIFT; 334 + attr1_val |= config->fixed_size << ATTR1_FIXED_SIZE_SHIFT; 335 + attr1_val |= config->priority << ATTR1_PRIORITY_SHIFT; 336 + 337 + max_cap_cacheline = MAX_CAP_TO_BYTES(config->max_cap); 338 + 339 + /* 340 + * LLCC instances can vary for each target. 341 + * The SW writes to broadcast register which gets propagated 342 + * to each llcc instance (llcc0,.. llccN). 343 + * Since the size of the memory is divided equally amongst the 344 + * llcc instances, we need to configure the max cap accordingly. 345 + */ 346 + max_cap_cacheline = max_cap_cacheline / drv_data->num_banks; 347 + max_cap_cacheline >>= CACHE_LINE_SIZE_SHIFT; 348 + attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT; 349 + 350 + attr1_cfg = LLCC_TRP_ATTR1_CFGn(config->slice_id); 351 + 352 + ret = regmap_write(drv_data->bcast_regmap, attr1_cfg, attr1_val); 353 + if (ret) 354 + return ret; 355 + 356 + attr0_val = config->res_ways & ATTR0_RES_WAYS_MASK; 357 + attr0_val |= config->bonus_ways << ATTR0_BONUS_WAYS_SHIFT; 358 + 359 + attr0_cfg = LLCC_TRP_ATTR0_CFGn(config->slice_id); 360 + 361 + ret = regmap_write(drv_data->bcast_regmap, attr0_cfg, attr0_val); 362 + if (ret) 363 + return ret; 364 + 365 + if (cfg->need_llcc_cfg) { 366 + u32 disable_cap_alloc, retain_pc; 367 + 368 + disable_cap_alloc = config->dis_cap_alloc << config->slice_id; 369 + ret = regmap_write(drv_data->bcast_regmap, 370 + LLCC_TRP_SCID_DIS_CAP_ALLOC, disable_cap_alloc); 371 + if (ret) 372 + return ret; 373 + 374 + retain_pc = config->retain_on_pc << config->slice_id; 375 + ret = regmap_write(drv_data->bcast_regmap, 376 + LLCC_TRP_PCB_ACT, retain_pc); 377 + if (ret) 378 + return ret; 379 + } 380 + 381 + if (config->activate_on_init) { 382 + desc.slice_id = config->slice_id; 383 + ret = llcc_slice_activate(&desc); 384 + } 385 + 386 + return ret; 387 + } 388 + 389 + static int qcom_llcc_cfg_program(struct platform_device *pdev, 390 + const struct qcom_llcc_config *cfg) 391 + { 392 + int i; 364 393 u32 sz; 365 394 int ret = 0; 366 395 const struct llcc_slice_config *llcc_table; 367 - struct llcc_slice_desc desc; 368 396 369 397 sz = drv_data->cfg_size; 370 398 llcc_table = drv_data->cfg; 371 399 372 400 for (i = 0; i < sz; i++) { 373 - attr1_cfg = LLCC_TRP_ATTR1_CFGn(llcc_table[i].slice_id); 374 - attr0_cfg = LLCC_TRP_ATTR0_CFGn(llcc_table[i].slice_id); 375 - 376 - attr1_val = llcc_table[i].cache_mode; 377 - attr1_val |= llcc_table[i].probe_target_ways << 378 - ATTR1_PROBE_TARGET_WAYS_SHIFT; 379 - attr1_val |= llcc_table[i].fixed_size << 380 - ATTR1_FIXED_SIZE_SHIFT; 381 - attr1_val |= llcc_table[i].priority << 382 - ATTR1_PRIORITY_SHIFT; 383 - 384 - max_cap_cacheline = MAX_CAP_TO_BYTES(llcc_table[i].max_cap); 385 - 386 - /* LLCC instances can vary for each target. 387 - * The SW writes to broadcast register which gets propagated 388 - * to each llcc instace (llcc0,.. llccN). 389 - * Since the size of the memory is divided equally amongst the 390 - * llcc instances, we need to configure the max cap accordingly. 391 - */ 392 - max_cap_cacheline = max_cap_cacheline / drv_data->num_banks; 393 - max_cap_cacheline >>= CACHE_LINE_SIZE_SHIFT; 394 - attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT; 395 - 396 - attr0_val = llcc_table[i].res_ways & ATTR0_RES_WAYS_MASK; 397 - attr0_val |= llcc_table[i].bonus_ways << ATTR0_BONUS_WAYS_SHIFT; 398 - 399 - ret = regmap_write(drv_data->bcast_regmap, attr1_cfg, 400 - attr1_val); 401 + ret = _qcom_llcc_cfg_program(&llcc_table[i], cfg); 401 402 if (ret) 402 403 return ret; 403 - ret = regmap_write(drv_data->bcast_regmap, attr0_cfg, 404 - attr0_val); 405 - if (ret) 406 - return ret; 407 - if (llcc_table[i].activate_on_init) { 408 - desc.slice_id = llcc_table[i].slice_id; 409 - ret = llcc_slice_activate(&desc); 410 - } 411 404 } 405 + 412 406 return ret; 413 407 } 414 408 ··· 536 472 mutex_init(&drv_data->lock); 537 473 platform_set_drvdata(pdev, drv_data); 538 474 539 - ret = qcom_llcc_cfg_program(pdev); 475 + ret = qcom_llcc_cfg_program(pdev, cfg); 540 476 if (ret) 541 477 goto err; 542 478 ··· 558 494 static const struct of_device_id qcom_llcc_of_match[] = { 559 495 { .compatible = "qcom,sc7180-llcc", .data = &sc7180_cfg }, 560 496 { .compatible = "qcom,sdm845-llcc", .data = &sdm845_cfg }, 497 + { .compatible = "qcom,sm8150-llcc", .data = &sm8150_cfg }, 561 498 { } 562 499 }; 563 500
+4 -4
drivers/soc/qcom/pdr_interface.c
··· 110 110 pdr->locator_addr.sq_port = 0; 111 111 } 112 112 113 - static struct qmi_ops pdr_locator_ops = { 113 + static const struct qmi_ops pdr_locator_ops = { 114 114 .new_server = pdr_locator_new_server, 115 115 .del_server = pdr_locator_del_server, 116 116 }; ··· 238 238 mutex_unlock(&pdr->list_lock); 239 239 } 240 240 241 - static struct qmi_ops pdr_notifier_ops = { 241 + static const struct qmi_ops pdr_notifier_ops = { 242 242 .new_server = pdr_notifier_new_server, 243 243 .del_server = pdr_notifier_del_server, 244 244 }; ··· 343 343 queue_work(pdr->indack_wq, &pdr->indack_work); 344 344 } 345 345 346 - static struct qmi_msg_handler qmi_indication_handler[] = { 346 + static const struct qmi_msg_handler qmi_indication_handler[] = { 347 347 { 348 348 .type = QMI_INDICATION, 349 349 .msg_id = SERVREG_STATE_UPDATED_IND_ID, ··· 569 569 int pdr_restart_pd(struct pdr_handle *pdr, struct pdr_service *pds) 570 570 { 571 571 struct servreg_restart_pd_resp resp; 572 - struct servreg_restart_pd_req req; 572 + struct servreg_restart_pd_req req = { 0 }; 573 573 struct sockaddr_qrtr addr; 574 574 struct pdr_service *tmp; 575 575 struct qmi_txn txn;
+46 -18
drivers/soc/qcom/qcom-geni-se.c
··· 82 82 #define NUM_AHB_CLKS 2 83 83 84 84 /** 85 - * @struct geni_wrapper - Data structure to represent the QUP Wrapper Core 85 + * struct geni_wrapper - Data structure to represent the QUP Wrapper Core 86 86 * @dev: Device pointer of the QUP wrapper core 87 87 * @base: Base address of this instance of QUP wrapper core 88 88 * @ahb_clks: Handle to the primary & secondary AHB clocks 89 + * @to_core: Core ICC path 89 90 */ 90 91 struct geni_wrapper { 91 92 struct device *dev; ··· 238 237 * geni_se_init() - Initialize the GENI serial engine 239 238 * @se: Pointer to the concerned serial engine. 240 239 * @rx_wm: Receive watermark, in units of FIFO words. 241 - * @rx_rfr_wm: Ready-for-receive watermark, in units of FIFO words. 240 + * @rx_rfr: Ready-for-receive watermark, in units of FIFO words. 242 241 * 243 242 * This function is used to initialize the GENI serial engine, configure 244 243 * receive watermark and ready-for-receive watermarks. ··· 267 266 static void geni_se_select_fifo_mode(struct geni_se *se) 268 267 { 269 268 u32 proto = geni_se_read_proto(se); 270 - u32 val; 269 + u32 val, val_old; 271 270 272 271 geni_se_irq_clear(se); 273 272 274 - val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); 273 + /* 274 + * The RX path for the UART is asynchronous and so needs more 275 + * complex logic for enabling / disabling its interrupts. 276 + * 277 + * Specific notes: 278 + * - The done and TX-related interrupts are managed manually. 279 + * - We don't RX from the main sequencer (we use the secondary) so 280 + * we don't need the RX-related interrupts enabled in the main 281 + * sequencer for UART. 282 + */ 275 283 if (proto != GENI_SE_UART) { 284 + val_old = val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); 276 285 val |= M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN; 277 286 val |= M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN; 278 - } 279 - writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); 287 + if (val != val_old) 288 + writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); 280 289 281 - val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); 282 - if (proto != GENI_SE_UART) 290 + val_old = val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); 283 291 val |= S_CMD_DONE_EN; 284 - writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); 292 + if (val != val_old) 293 + writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); 294 + } 285 295 286 - val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 296 + val_old = val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 287 297 val &= ~GENI_DMA_MODE_EN; 288 - writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 298 + if (val != val_old) 299 + writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 289 300 } 290 301 291 302 static void geni_se_select_dma_mode(struct geni_se *se) 292 303 { 293 - u32 val; 304 + u32 proto = geni_se_read_proto(se); 305 + u32 val, val_old; 294 306 295 307 geni_se_irq_clear(se); 296 308 297 - val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 309 + if (proto != GENI_SE_UART) { 310 + val_old = val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); 311 + val &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN); 312 + val &= ~(M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN); 313 + if (val != val_old) 314 + writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); 315 + 316 + val_old = val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); 317 + val &= ~S_CMD_DONE_EN; 318 + if (val != val_old) 319 + writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); 320 + } 321 + 322 + val_old = val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 298 323 val |= GENI_DMA_MODE_EN; 299 - writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 324 + if (val != val_old) 325 + writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 300 326 } 301 327 302 328 /** ··· 679 651 writel_relaxed(lower_32_bits(*iova), se->base + SE_DMA_TX_PTR_L); 680 652 writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_TX_PTR_H); 681 653 writel_relaxed(GENI_SE_DMA_EOT_BUF, se->base + SE_DMA_TX_ATTR); 682 - writel_relaxed(len, se->base + SE_DMA_TX_LEN); 654 + writel(len, se->base + SE_DMA_TX_LEN); 683 655 return 0; 684 656 } 685 657 EXPORT_SYMBOL(geni_se_tx_dma_prep); ··· 716 688 writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_RX_PTR_H); 717 689 /* RX does not have EOT buffer type bit. So just reset RX_ATTR */ 718 690 writel_relaxed(0, se->base + SE_DMA_RX_ATTR); 719 - writel_relaxed(len, se->base + SE_DMA_RX_LEN); 691 + writel(len, se->base + SE_DMA_RX_LEN); 720 692 return 0; 721 693 } 722 694 EXPORT_SYMBOL(geni_se_rx_dma_prep); ··· 733 705 { 734 706 struct geni_wrapper *wrapper = se->wrapper; 735 707 736 - if (iova && !dma_mapping_error(wrapper->dev, iova)) 708 + if (!dma_mapping_error(wrapper->dev, iova)) 737 709 dma_unmap_single(wrapper->dev, iova, len, DMA_TO_DEVICE); 738 710 } 739 711 EXPORT_SYMBOL(geni_se_tx_dma_unprep); ··· 750 722 { 751 723 struct geni_wrapper *wrapper = se->wrapper; 752 724 753 - if (iova && !dma_mapping_error(wrapper->dev, iova)) 725 + if (!dma_mapping_error(wrapper->dev, iova)) 754 726 dma_unmap_single(wrapper->dev, iova, len, DMA_FROM_DEVICE); 755 727 } 756 728 EXPORT_SYMBOL(geni_se_rx_dma_unprep);
+2 -2
drivers/soc/qcom/qcom_aoss.c
··· 65 65 * @tx_lock: provides synchronization between multiple callers of qmp_send() 66 66 * @qdss_clk: QDSS clock hw struct 67 67 * @pd_data: genpd data 68 + * @cooling_devs: thermal cooling devices 68 69 */ 69 70 struct qmp { 70 71 void __iomem *msgram; ··· 226 225 static int qmp_send(struct qmp *qmp, const void *data, size_t len) 227 226 { 228 227 long time_left; 229 - size_t tlen; 230 228 int ret; 231 229 232 230 if (WARN_ON(len + sizeof(u32) > qmp->size)) ··· 242 242 writel(len, qmp->msgram + qmp->offset); 243 243 244 244 /* Read back len to confirm data written in message RAM */ 245 - tlen = readl(qmp->msgram + qmp->offset); 245 + readl(qmp->msgram + qmp->offset); 246 246 qmp_kick(qmp); 247 247 248 248 time_left = wait_event_interruptible_timeout(qmp->event,
+6 -1
drivers/soc/qcom/rpmh-rsc.c
··· 13 13 #include <linux/iopoll.h> 14 14 #include <linux/kernel.h> 15 15 #include <linux/list.h> 16 + #include <linux/module.h> 16 17 #include <linux/of.h> 17 18 #include <linux/of_irq.h> 18 19 #include <linux/of_platform.h> ··· 498 497 write_tcs_cmd(drv, RSC_DRV_CMD_MSGID, tcs_id, j, msgid); 499 498 write_tcs_cmd(drv, RSC_DRV_CMD_ADDR, tcs_id, j, cmd->addr); 500 499 write_tcs_cmd(drv, RSC_DRV_CMD_DATA, tcs_id, j, cmd->data); 501 - trace_rpmh_send_msg_rcuidle(drv, tcs_id, j, msgid, cmd); 500 + trace_rpmh_send_msg(drv, tcs_id, j, msgid, cmd); 502 501 } 503 502 504 503 write_tcs_reg(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, tcs_id, cmd_complete); ··· 1019 1018 { .compatible = "qcom,rpmh-rsc", }, 1020 1019 { } 1021 1020 }; 1021 + MODULE_DEVICE_TABLE(of, rpmh_drv_match); 1022 1022 1023 1023 static struct platform_driver rpmh_driver = { 1024 1024 .probe = rpmh_rsc_probe, ··· 1035 1033 return platform_driver_register(&rpmh_driver); 1036 1034 } 1037 1035 arch_initcall(rpmh_driver_init); 1036 + 1037 + MODULE_DESCRIPTION("Qualcomm Technologies, Inc. RPMh Driver"); 1038 + MODULE_LICENSE("GPL v2");
+4 -10
drivers/soc/qcom/rpmh.c
··· 181 181 struct cache_req *req; 182 182 int i; 183 183 184 - rpm_msg->msg.state = state; 185 - 186 184 /* Cache the request in our store and link the payload */ 187 185 for (i = 0; i < rpm_msg->msg.num_cmds; i++) { 188 186 req = cache_rpm_request(ctrlr, state, &rpm_msg->msg.cmds[i]); 189 187 if (IS_ERR(req)) 190 188 return PTR_ERR(req); 191 189 } 192 - 193 - rpm_msg->msg.state = state; 194 190 195 191 if (state == RPMH_ACTIVE_ONLY_STATE) { 196 192 WARN_ON(irqs_disabled()); ··· 250 254 /** 251 255 * rpmh_write: Write a set of RPMH commands and block until response 252 256 * 253 - * @rc: The RPMH handle got from rpmh_get_client 257 + * @dev: The device making the request 254 258 * @state: Active/sleep set 255 259 * @cmd: The payload data 256 260 * @n: The number of elements in @cmd ··· 264 268 DEFINE_RPMH_MSG_ONSTACK(dev, state, &compl, rpm_msg); 265 269 int ret; 266 270 267 - if (!cmd || !n || n > MAX_RPMH_PAYLOAD) 268 - return -EINVAL; 269 - 270 - memcpy(rpm_msg.cmd, cmd, n * sizeof(*cmd)); 271 - rpm_msg.msg.num_cmds = n; 271 + ret = __fill_rpmh_msg(&rpm_msg, state, cmd, n); 272 + if (ret) 273 + return ret; 272 274 273 275 ret = __rpmh_write(dev, state, &rpm_msg); 274 276 if (ret)
+16
drivers/soc/qcom/rpmhpd.c
··· 24 24 * struct rpmhpd - top level RPMh power domain resource data structure 25 25 * @dev: rpmh power domain controller device 26 26 * @pd: generic_pm_domain corrresponding to the power domain 27 + * @parent: generic_pm_domain corrresponding to the parent's power domain 27 28 * @peer: A peer power domain in case Active only Voting is 28 29 * supported 29 30 * @active_only: True if it represents an Active only peer 31 + * @corner: current corner 32 + * @active_corner: current active corner 30 33 * @level: An array of level (vlvl) to corner (hlvl) mappings 31 34 * derived from cmd-db 32 35 * @level_count: Number of levels supported by the power domain. max ··· 135 132 .num_pds = ARRAY_SIZE(sdm845_rpmhpds), 136 133 }; 137 134 135 + /* SDX55 RPMH powerdomains */ 136 + static struct rpmhpd *sdx55_rpmhpds[] = { 137 + [SDX55_MSS] = &sdm845_mss, 138 + [SDX55_MX] = &sdm845_mx, 139 + [SDX55_CX] = &sdm845_cx, 140 + }; 141 + 142 + static const struct rpmhpd_desc sdx55_desc = { 143 + .rpmhpds = sdx55_rpmhpds, 144 + .num_pds = ARRAY_SIZE(sdx55_rpmhpds), 145 + }; 146 + 138 147 /* SM8150 RPMH powerdomains */ 139 148 140 149 static struct rpmhpd sm8150_mmcx_ao; ··· 220 205 static const struct of_device_id rpmhpd_match_table[] = { 221 206 { .compatible = "qcom,sc7180-rpmhpd", .data = &sc7180_desc }, 222 207 { .compatible = "qcom,sdm845-rpmhpd", .data = &sdm845_desc }, 208 + { .compatible = "qcom,sdx55-rpmhpd", .data = &sdx55_desc}, 223 209 { .compatible = "qcom,sm8150-rpmhpd", .data = &sm8150_desc }, 224 210 { .compatible = "qcom,sm8250-rpmhpd", .data = &sm8250_desc }, 225 211 { }
+83 -2
drivers/soc/qcom/rpmpd.c
··· 35 35 #define KEY_FLOOR_LEVEL 0x6c6676 /* vfl */ 36 36 #define KEY_LEVEL 0x6c766c76 /* vlvl */ 37 37 38 - #define MAX_8996_RPMPD_STATE 6 38 + #define MAX_CORNER_RPMPD_STATE 6 39 39 40 40 #define DEFINE_RPMPD_PAIR(_platform, _name, _active, r_type, r_key, \ 41 41 r_id) \ ··· 116 116 117 117 static DEFINE_MUTEX(rpmpd_lock); 118 118 119 + /* msm8939 RPM Power Domains */ 120 + DEFINE_RPMPD_PAIR(msm8939, vddmd, vddmd_ao, SMPA, CORNER, 1); 121 + DEFINE_RPMPD_VFC(msm8939, vddmd_vfc, SMPA, 1); 122 + 123 + DEFINE_RPMPD_PAIR(msm8939, vddcx, vddcx_ao, SMPA, CORNER, 2); 124 + DEFINE_RPMPD_VFC(msm8939, vddcx_vfc, SMPA, 2); 125 + 126 + DEFINE_RPMPD_PAIR(msm8939, vddmx, vddmx_ao, LDOA, CORNER, 3); 127 + 128 + static struct rpmpd *msm8939_rpmpds[] = { 129 + [MSM8939_VDDMDCX] = &msm8939_vddmd, 130 + [MSM8939_VDDMDCX_AO] = &msm8939_vddmd_ao, 131 + [MSM8939_VDDMDCX_VFC] = &msm8939_vddmd_vfc, 132 + [MSM8939_VDDCX] = &msm8939_vddcx, 133 + [MSM8939_VDDCX_AO] = &msm8939_vddcx_ao, 134 + [MSM8939_VDDCX_VFC] = &msm8939_vddcx_vfc, 135 + [MSM8939_VDDMX] = &msm8939_vddmx, 136 + [MSM8939_VDDMX_AO] = &msm8939_vddmx_ao, 137 + }; 138 + 139 + static const struct rpmpd_desc msm8939_desc = { 140 + .rpmpds = msm8939_rpmpds, 141 + .num_pds = ARRAY_SIZE(msm8939_rpmpds), 142 + .max_state = MAX_CORNER_RPMPD_STATE, 143 + }; 144 + 145 + /* msm8916 RPM Power Domains */ 146 + DEFINE_RPMPD_PAIR(msm8916, vddcx, vddcx_ao, SMPA, CORNER, 1); 147 + DEFINE_RPMPD_PAIR(msm8916, vddmx, vddmx_ao, LDOA, CORNER, 3); 148 + 149 + DEFINE_RPMPD_VFC(msm8916, vddcx_vfc, SMPA, 1); 150 + 151 + static struct rpmpd *msm8916_rpmpds[] = { 152 + [MSM8916_VDDCX] = &msm8916_vddcx, 153 + [MSM8916_VDDCX_AO] = &msm8916_vddcx_ao, 154 + [MSM8916_VDDCX_VFC] = &msm8916_vddcx_vfc, 155 + [MSM8916_VDDMX] = &msm8916_vddmx, 156 + [MSM8916_VDDMX_AO] = &msm8916_vddmx_ao, 157 + }; 158 + 159 + static const struct rpmpd_desc msm8916_desc = { 160 + .rpmpds = msm8916_rpmpds, 161 + .num_pds = ARRAY_SIZE(msm8916_rpmpds), 162 + .max_state = MAX_CORNER_RPMPD_STATE, 163 + }; 164 + 119 165 /* msm8976 RPM Power Domains */ 120 166 DEFINE_RPMPD_PAIR(msm8976, vddcx, vddcx_ao, SMPA, LEVEL, 2); 121 167 DEFINE_RPMPD_PAIR(msm8976, vddmx, vddmx_ao, SMPA, LEVEL, 6); ··· 205 159 static const struct rpmpd_desc msm8996_desc = { 206 160 .rpmpds = msm8996_rpmpds, 207 161 .num_pds = ARRAY_SIZE(msm8996_rpmpds), 208 - .max_state = MAX_8996_RPMPD_STATE, 162 + .max_state = MAX_CORNER_RPMPD_STATE, 209 163 }; 210 164 211 165 /* msm8998 RPM Power domains */ ··· 266 220 .max_state = RPM_SMD_LEVEL_BINNING, 267 221 }; 268 222 223 + /* sdm660 RPM Power domains */ 224 + DEFINE_RPMPD_PAIR(sdm660, vddcx, vddcx_ao, RWCX, LEVEL, 0); 225 + DEFINE_RPMPD_VFL(sdm660, vddcx_vfl, RWCX, 0); 226 + 227 + DEFINE_RPMPD_PAIR(sdm660, vddmx, vddmx_ao, RWMX, LEVEL, 0); 228 + DEFINE_RPMPD_VFL(sdm660, vddmx_vfl, RWMX, 0); 229 + 230 + DEFINE_RPMPD_LEVEL(sdm660, vdd_ssccx, RWLC, 0); 231 + DEFINE_RPMPD_VFL(sdm660, vdd_ssccx_vfl, RWLC, 0); 232 + 233 + DEFINE_RPMPD_LEVEL(sdm660, vdd_sscmx, RWLM, 0); 234 + DEFINE_RPMPD_VFL(sdm660, vdd_sscmx_vfl, RWLM, 0); 235 + 236 + static struct rpmpd *sdm660_rpmpds[] = { 237 + [SDM660_VDDCX] = &sdm660_vddcx, 238 + [SDM660_VDDCX_AO] = &sdm660_vddcx_ao, 239 + [SDM660_VDDCX_VFL] = &sdm660_vddcx_vfl, 240 + [SDM660_VDDMX] = &sdm660_vddmx, 241 + [SDM660_VDDMX_AO] = &sdm660_vddmx_ao, 242 + [SDM660_VDDMX_VFL] = &sdm660_vddmx_vfl, 243 + [SDM660_SSCCX] = &sdm660_vdd_ssccx, 244 + [SDM660_SSCCX_VFL] = &sdm660_vdd_ssccx_vfl, 245 + [SDM660_SSCMX] = &sdm660_vdd_sscmx, 246 + [SDM660_SSCMX_VFL] = &sdm660_vdd_sscmx_vfl, 247 + }; 248 + 249 + static const struct rpmpd_desc sdm660_desc = { 250 + .rpmpds = sdm660_rpmpds, 251 + .num_pds = ARRAY_SIZE(sdm660_rpmpds), 252 + .max_state = RPM_SMD_LEVEL_TURBO, 253 + }; 254 + 269 255 static const struct of_device_id rpmpd_match_table[] = { 256 + { .compatible = "qcom,msm8916-rpmpd", .data = &msm8916_desc }, 257 + { .compatible = "qcom,msm8939-rpmpd", .data = &msm8939_desc }, 270 258 { .compatible = "qcom,msm8976-rpmpd", .data = &msm8976_desc }, 271 259 { .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc }, 272 260 { .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc }, 273 261 { .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc }, 262 + { .compatible = "qcom,sdm660-rpmpd", .data = &sdm660_desc }, 274 263 { } 275 264 }; 276 265 MODULE_DEVICE_TABLE(of, rpmpd_match_table);
+2 -1
drivers/soc/qcom/smem.c
··· 122 122 * @free_offset: index of the first unallocated byte in smem 123 123 * @available: number of bytes available for allocation 124 124 * @reserved: reserved field, must be 0 125 - * toc: array of references to items 125 + * @toc: array of references to items 126 126 */ 127 127 struct smem_header { 128 128 struct smem_proc_comm proc_comm[4]; ··· 255 255 * processor/host 256 256 * @cacheline: list of cacheline sizes for each host 257 257 * @item_count: max accepted item number 258 + * @socinfo: platform device pointer 258 259 * @num_regions: number of @regions 259 260 * @regions: list of the memory regions defining the shared memory 260 261 */
+4 -2
drivers/soc/qcom/smp2p.c
··· 112 112 * struct qcom_smp2p - device driver context 113 113 * @dev: device driver handle 114 114 * @in: pointer to the inbound smem item 115 + * @out: pointer to the outbound smem item 115 116 * @smem_items: ids of the two smem items 116 117 * @valid_entries: already scanned inbound entries 117 118 * @local_pid: processor id of the inbound edge ··· 319 318 static int smp2p_update_bits(void *data, u32 mask, u32 value) 320 319 { 321 320 struct smp2p_entry *entry = data; 321 + unsigned long flags; 322 322 u32 orig; 323 323 u32 val; 324 324 325 - spin_lock(&entry->lock); 325 + spin_lock_irqsave(&entry->lock, flags); 326 326 val = orig = readl(entry->value); 327 327 val &= ~mask; 328 328 val |= value; 329 329 writel(val, entry->value); 330 - spin_unlock(&entry->lock); 330 + spin_unlock_irqrestore(&entry->lock, flags); 331 331 332 332 if (val != orig) 333 333 qcom_smp2p_kick(entry->smp2p);
+1 -3
drivers/soc/qcom/smsm.c
··· 130 130 /** 131 131 * smsm_update_bits() - change bit in outgoing entry and inform subscribers 132 132 * @data: smsm context pointer 133 - * @offset: bit in the entry 133 + * @mask: value mask 134 134 * @value: new value 135 135 * 136 136 * Used to set and clear the bits in the outgoing/local entry and inform ··· 254 254 * smsm_unmask_irq() - subscribe to cascades of IRQs of a certain status bit 255 255 * @irqd: IRQ handle to be unmasked 256 256 * 257 - 258 257 * This subscribes the local CPU to interrupts upon changes to the defined 259 258 * status bit. The bit is also marked for cascading. 260 - 261 259 */ 262 260 static void smsm_unmask_irq(struct irq_data *irqd) 263 261 {
+6
drivers/soc/qcom/socinfo.c
··· 218 218 { 251, "MSM8992" }, 219 219 { 253, "APQ8094" }, 220 220 { 291, "APQ8096" }, 221 + { 293, "MSM8953" }, 222 + { 304, "APQ8053" }, 221 223 { 305, "MSM8996SG" }, 222 224 { 310, "MSM8996AU" }, 223 225 { 311, "APQ8096AU" }, 224 226 { 312, "APQ8096SG" }, 225 227 { 318, "SDM630" }, 226 228 { 321, "SDM845" }, 229 + { 338, "SDM450" }, 227 230 { 341, "SDA845" }, 231 + { 349, "SDM632" }, 232 + { 350, "SDA632" }, 233 + { 351, "SDA450" }, 228 234 { 356, "SM8250" }, 229 235 { 402, "IPQ6018" }, 230 236 { 425, "SC7180" },
+5 -3
drivers/soc/qcom/wcnss_ctrl.c
··· 68 68 u32 len; 69 69 } __packed; 70 70 71 - /** 71 + /* 72 72 * struct wcnss_version_resp - version request response 73 - * @hdr: common packet wcnss_msg_hdr header 74 73 */ 75 74 struct wcnss_version_resp { 76 75 struct wcnss_msg_hdr hdr; ··· 107 108 108 109 /** 109 110 * wcnss_ctrl_smd_callback() - handler from SMD responses 110 - * @channel: smd channel handle 111 + * @rpdev: remote processor message device pointer 111 112 * @data: pointer to the incoming data packet 112 113 * @count: size of the incoming data packet 114 + * @priv: unused 115 + * @addr: unused 113 116 * 114 117 * Handles any incoming packets from the remote WCNSS_CTRL service. 115 118 */ ··· 268 267 * @wcnss: wcnss handle, retrieved from drvdata 269 268 * @name: SMD channel name 270 269 * @cb: callback to handle incoming data on the channel 270 + * @priv: private data for use in the call-back 271 271 */ 272 272 struct rpmsg_endpoint *qcom_wcnss_open_channel(void *wcnss, const char *name, rpmsg_rx_cb_t cb, void *priv) 273 273 {
+34
include/dt-bindings/power/qcom-rpmpd.h
··· 15 15 #define SDM845_GFX 7 16 16 #define SDM845_MSS 8 17 17 18 + /* SDX55 Power Domain Indexes */ 19 + #define SDX55_MSS 0 20 + #define SDX55_MX 1 21 + #define SDX55_CX 2 22 + 18 23 /* SM8150 Power Domain Indexes */ 19 24 #define SM8150_MSS 0 20 25 #define SM8150_EBI 1 ··· 69 64 #define RPMH_REGULATOR_LEVEL_TURBO 384 70 65 #define RPMH_REGULATOR_LEVEL_TURBO_L1 416 71 66 67 + /* MSM8939 Power Domains */ 68 + #define MSM8939_VDDMDCX 0 69 + #define MSM8939_VDDMDCX_AO 1 70 + #define MSM8939_VDDMDCX_VFC 2 71 + #define MSM8939_VDDCX 3 72 + #define MSM8939_VDDCX_AO 4 73 + #define MSM8939_VDDCX_VFC 5 74 + #define MSM8939_VDDMX 6 75 + #define MSM8939_VDDMX_AO 7 76 + 77 + /* MSM8916 Power Domain Indexes */ 78 + #define MSM8916_VDDCX 0 79 + #define MSM8916_VDDCX_AO 1 80 + #define MSM8916_VDDCX_VFC 2 81 + #define MSM8916_VDDMX 3 82 + #define MSM8916_VDDMX_AO 4 83 + 72 84 /* MSM8976 Power Domain Indexes */ 73 85 #define MSM8976_VDDCX 0 74 86 #define MSM8976_VDDCX_AO 1 ··· 123 101 #define QCS404_LPICX_VFL 4 124 102 #define QCS404_LPIMX 5 125 103 #define QCS404_LPIMX_VFL 6 104 + 105 + /* SDM660 Power Domains */ 106 + #define SDM660_VDDCX 0 107 + #define SDM660_VDDCX_AO 1 108 + #define SDM660_VDDCX_VFL 2 109 + #define SDM660_VDDMX 3 110 + #define SDM660_VDDMX_AO 4 111 + #define SDM660_VDDMX_VFL 5 112 + #define SDM660_SSCCX 6 113 + #define SDM660_SSCCX_VFL 7 114 + #define SDM660_SSCMX 8 115 + #define SDM660_SSCMX_VFL 9 126 116 127 117 /* RPM SMD Power Domain performance levels */ 128 118 #define RPM_SMD_LEVEL_RETENTION 16
-2
include/linux/qcom-geni-se.h
··· 48 48 * @clk_perf_tbl: Table of clock frequency input to serial engine clock 49 49 * @icc_paths: Array of ICC paths for SE 50 50 * @opp_table: Pointer to the OPP table 51 - * @has_opp_table: Specifies if the SE has an OPP table 52 51 */ 53 52 struct geni_se { 54 53 void __iomem *base; ··· 58 59 unsigned long *clk_perf_tbl; 59 60 struct geni_icc_path icc_paths[3]; 60 61 struct opp_table *opp_table; 61 - bool has_opp_table; 62 62 }; 63 63 64 64 /* Common SE registers */
+6
include/linux/soc/qcom/llcc-qcom.h
··· 16 16 #define LLCC_AUDIO 6 17 17 #define LLCC_MDMHPGRW 7 18 18 #define LLCC_MDM 8 19 + #define LLCC_MODHW 9 19 20 #define LLCC_CMPT 10 20 21 #define LLCC_GPUHTW 11 21 22 #define LLCC_GPU 12 ··· 27 26 #define LLCC_MDMHPFX 20 28 27 #define LLCC_MDMPNG 21 29 28 #define LLCC_AUDHW 22 29 + #define LLCC_NPU 23 30 + #define LLCC_WLHW 24 31 + #define LLCC_MODPE 29 32 + #define LLCC_APTCM 30 33 + #define LLCC_WRCACHE 31 30 34 31 35 /** 32 36 * llcc_slice_desc - Cache slice descriptor
+2 -2
samples/qmi/qmi_sample_client.c
··· 429 429 .write = data_write, 430 430 }; 431 431 432 - static struct qmi_msg_handler qmi_sample_handlers[] = { 432 + static const struct qmi_msg_handler qmi_sample_handlers[] = { 433 433 { 434 434 .type = QMI_RESPONSE, 435 435 .msg_id = TEST_PING_REQ_MSG_ID_V01, ··· 571 571 572 572 static struct qmi_handle lookup_client; 573 573 574 - static struct qmi_ops lookup_ops = { 574 + static const struct qmi_ops lookup_ops = { 575 575 .new_server = qmi_sample_new_server, 576 576 .del_server = qmi_sample_del_server, 577 577 };