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

Merge tag 'soc-drivers-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc

Pull SoC driver updates from Arnd Bergmann:
"These are changes to SoC specific drivers and DT bindings that don't
have a separate subsystem tree, or that get grouped here for
simplicity.

Nothing out of the ordinary for the 6.14 release here:

- Most of the updates are for Qualcomm specific drivers, adding
support for additional SoCs in the exssting drivers, and support
for wrapped encryption key access in the SCM firmware.

- The Arm SCMI firmware code gains support for having multiple
instances of firmware running, and better module auto loading.

- A few minor updates for litex, samsung, ti, tegra, mediatek, imx
and renesas platforms.

- Reset controller updates for amlogic, to add support for the A1 soc
and clean up the existing code.

- Memory controller updates for ti davinci aemif, refactoring the
code and adding a few interfaces to other drivers"

* tag 'soc-drivers-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (58 commits)
drivers/soc/litex: Use devm_register_restart_handler()
reset: amlogic: aux: drop aux registration helper
reset: amlogic: aux: get regmap through parent device
reset: amlogic: add support for A1 SoC in auxiliary reset driver
dt-bindings: reset: add bindings for A1 SoC audio reset controller
soc/tegra: fuse: Update Tegra234 nvmem keepout list
soc/tegra: Fix spelling error in tegra234_lookup_slave_timeout()
soc/tegra: cbb: Drop unnecessary debugfs error handling
firmware: qcom: scm: add calls for wrapped key support
soc: qcom: pd_mapper: Add SM7225 compatible
dt-bindings: firmware: qcom,scm: Document ipq5424 SCM
soc: qcom: llcc: Update configuration data for IPQ5424
dt-bindings: cache: qcom,llcc: Add IPQ5424 compatible
soc: mediatek: mtk-devapc: Fix leaking IO map on driver remove
soc: mediatek: mtk-devapc: Fix leaking IO map on error paths
firmware: qcom: scm: smc: Narrow 'mempool' variable scope
firmware: qcom: scm: smc: Handle missing SCM device
firmware: qcom: scm: Cleanup global '__scm' on probe failures
firmware: qcom: scm: Fix missing read barrier in qcom_scm_get_tzmem_pool()
firmware: qcom: scm: Fix missing read barrier in qcom_scm_is_available()
...

+877 -375
+18 -2
Documentation/devicetree/bindings/cache/qcom,llcc.yaml
··· 20 20 properties: 21 21 compatible: 22 22 enum: 23 + - qcom,ipq5424-llcc 23 24 - qcom,qcs615-llcc 24 25 - qcom,qcs8300-llcc 25 26 - qcom,qdu1000-llcc ··· 43 42 - qcom,x1e80100-llcc 44 43 45 44 reg: 46 - minItems: 2 45 + minItems: 1 47 46 maxItems: 10 48 47 49 48 reg-names: 50 - minItems: 2 49 + minItems: 1 51 50 maxItems: 10 52 51 53 52 interrupts: ··· 67 66 - reg-names 68 67 69 68 allOf: 69 + - if: 70 + properties: 71 + compatible: 72 + contains: 73 + enum: 74 + - qcom,ipq5424-llcc 75 + then: 76 + properties: 77 + reg: 78 + items: 79 + - description: LLCC0 base register region 80 + reg-names: 81 + items: 82 + - const: llcc0_base 83 + 70 84 - if: 71 85 properties: 72 86 compatible:
+2
Documentation/devicetree/bindings/firmware/qcom,scm.yaml
··· 26 26 - qcom,scm-ipq4019 27 27 - qcom,scm-ipq5018 28 28 - qcom,scm-ipq5332 29 + - qcom,scm-ipq5424 29 30 - qcom,scm-ipq6018 30 31 - qcom,scm-ipq806x 31 32 - qcom,scm-ipq8074 ··· 43 42 - qcom,scm-msm8996 44 43 - qcom,scm-msm8998 45 44 - qcom,scm-qcm2290 45 + - qcom,scm-qcs615 46 46 - qcom,scm-qcs8300 47 47 - qcom,scm-qdu1000 48 48 - qcom,scm-sa8255p
+2
Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml
··· 26 26 - items: 27 27 - enum: 28 28 - qcom,qcm2290-cpu-bwmon 29 + - qcom,qcs615-cpu-bwmon 29 30 - qcom,qcs8300-cpu-bwmon 30 31 - qcom,sa8775p-cpu-bwmon 31 32 - qcom,sc7180-cpu-bwmon ··· 42 41 - const: qcom,sdm845-bwmon # BWMON v4, unified register space 43 42 - items: 44 43 - enum: 44 + - qcom,qcs615-llcc-bwmon 45 45 - qcom,qcs8300-llcc-bwmon 46 46 - qcom,sa8775p-llcc-bwmon 47 47 - qcom,sc7180-llcc-bwmon
+1
Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.yaml
··· 25 25 compatible: 26 26 items: 27 27 - enum: 28 + - qcom,qcs615-aoss-qmp 28 29 - qcom,qcs8300-aoss-qmp 29 30 - qcom,qdu1000-aoss-qmp 30 31 - qcom,sa8255p-aoss-qmp
+1
Documentation/devicetree/bindings/soc/samsung/exynos-usi.yaml
··· 64 64 65 65 samsung,mode: 66 66 $ref: /schemas/types.yaml#/definitions/uint32 67 + enum: [0, 1, 2, 3] 67 68 description: 68 69 Selects USI function (which serial protocol to use). Refer to 69 70 <include/dt-bindings/soc/samsung,exynos-usi.h> for valid USI mode values.
+8
Documentation/devicetree/bindings/soc/samsung/samsung,exynos-sysreg.yaml
··· 21 21 - samsung,exynos3-sysreg 22 22 - samsung,exynos4-sysreg 23 23 - samsung,exynos5-sysreg 24 + - samsung,exynos8895-fsys0-sysreg 25 + - samsung,exynos8895-fsys1-sysreg 26 + - samsung,exynos8895-peric0-sysreg 27 + - samsung,exynos8895-peric1-sysreg 24 28 - samsung,exynosautov920-peric0-sysreg 25 29 - samsung,exynosautov920-peric1-sysreg 26 30 - tesla,fsd-cam-sysreg ··· 83 79 - samsung,exynos850-cmgp-sysreg 84 80 - samsung,exynos850-peri-sysreg 85 81 - samsung,exynos850-sysreg 82 + - samsung,exynos8895-fsys0-sysreg 83 + - samsung,exynos8895-fsys1-sysreg 84 + - samsung,exynos8895-peric0-sysreg 85 + - samsung,exynos8895-peric1-sysreg 86 86 then: 87 87 required: 88 88 - clocks
+1
MAINTAINERS
··· 23661 23661 F: Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml 23662 23662 F: drivers/pmdomain/ti/omap_prm.c 23663 23663 F: drivers/soc/ti/* 23664 + F: include/linux/pruss_driver.h 23664 23665 23665 23666 TI LM49xxx FAMILY ASoC CODEC DRIVERS 23666 23667 M: M R Swami Reddy <mr.swami.reddy@ti.com>
+2 -2
drivers/firmware/arm_scmi/common.h
··· 442 442 */ 443 443 struct scmi_transport { 444 444 struct device *supplier; 445 - struct scmi_desc *desc; 445 + struct scmi_desc desc; 446 446 struct scmi_transport_core_operations **core_ops; 447 447 }; 448 448 ··· 468 468 device_set_of_node_from_dev(&spdev->dev, dev); \ 469 469 \ 470 470 strans.supplier = dev; \ 471 - strans.desc = &(__desc); \ 471 + memcpy(&strans.desc, &(__desc), sizeof(strans.desc)); \ 472 472 strans.core_ops = &(__core_ops); \ 473 473 \ 474 474 ret = platform_device_add_data(spdev, &strans, sizeof(strans)); \
+55 -19
drivers/firmware/arm_scmi/driver.c
··· 24 24 #include <linux/io.h> 25 25 #include <linux/io-64-nonatomic-hi-lo.h> 26 26 #include <linux/kernel.h> 27 + #include <linux/kmod.h> 27 28 #include <linux/ktime.h> 28 29 #include <linux/hashtable.h> 29 30 #include <linux/list.h> ··· 43 42 44 43 #define CREATE_TRACE_POINTS 45 44 #include <trace/events/scmi.h> 45 + 46 + #define SCMI_VENDOR_MODULE_ALIAS_FMT "scmi-protocol-0x%02x-%s" 46 47 47 48 static DEFINE_IDA(scmi_id); 48 49 ··· 279 276 } 280 277 281 278 static const struct scmi_protocol * 279 + scmi_vendor_protocol_get(int protocol_id, struct scmi_revision_info *version) 280 + { 281 + const struct scmi_protocol *proto; 282 + 283 + proto = scmi_vendor_protocol_lookup(protocol_id, version->vendor_id, 284 + version->sub_vendor_id, 285 + version->impl_ver); 286 + if (!proto) { 287 + int ret; 288 + 289 + pr_debug("Looking for '" SCMI_VENDOR_MODULE_ALIAS_FMT "'\n", 290 + protocol_id, version->vendor_id); 291 + 292 + /* Note that vendor_id is mandatory for vendor protocols */ 293 + ret = request_module(SCMI_VENDOR_MODULE_ALIAS_FMT, 294 + protocol_id, version->vendor_id); 295 + if (ret) { 296 + pr_warn("Problem loading module for protocol 0x%x\n", 297 + protocol_id); 298 + return NULL; 299 + } 300 + 301 + /* Lookup again, once modules loaded */ 302 + proto = scmi_vendor_protocol_lookup(protocol_id, 303 + version->vendor_id, 304 + version->sub_vendor_id, 305 + version->impl_ver); 306 + } 307 + 308 + if (proto) 309 + pr_info("Loaded SCMI Vendor Protocol 0x%x - %s %s %X\n", 310 + protocol_id, proto->vendor_id ?: "", 311 + proto->sub_vendor_id ?: "", proto->impl_ver); 312 + 313 + return proto; 314 + } 315 + 316 + static const struct scmi_protocol * 282 317 scmi_protocol_get(int protocol_id, struct scmi_revision_info *version) 283 318 { 284 319 const struct scmi_protocol *proto = NULL; ··· 324 283 if (protocol_id < SCMI_PROTOCOL_VENDOR_BASE) 325 284 proto = xa_load(&scmi_protocols, protocol_id); 326 285 else 327 - proto = scmi_vendor_protocol_lookup(protocol_id, 328 - version->vendor_id, 329 - version->sub_vendor_id, 330 - version->impl_ver); 286 + proto = scmi_vendor_protocol_get(protocol_id, version); 287 + 331 288 if (!proto || !try_module_get(proto->owner)) { 332 289 pr_warn("SCMI Protocol 0x%x not found!\n", protocol_id); 333 290 return NULL; 334 291 } 335 292 336 293 pr_debug("Found SCMI Protocol 0x%x\n", protocol_id); 337 - 338 - if (protocol_id >= SCMI_PROTOCOL_VENDOR_BASE) 339 - pr_info("Loaded SCMI Vendor Protocol 0x%x - %s %s %X\n", 340 - protocol_id, proto->vendor_id ?: "", 341 - proto->sub_vendor_id ?: "", proto->impl_ver); 342 294 343 295 return proto; 344 296 } ··· 400 366 return ret; 401 367 } 402 368 403 - pr_debug("Registered SCMI Protocol 0x%x\n", proto->id); 369 + pr_debug("Registered SCMI Protocol 0x%x - %s %s 0x%08X\n", 370 + proto->id, proto->vendor_id, proto->sub_vendor_id, 371 + proto->impl_ver); 404 372 405 373 return 0; 406 374 } ··· 3064 3028 int ret; 3065 3029 3066 3030 trans = dev_get_platdata(dev); 3067 - if (!trans || !trans->desc || !trans->supplier || !trans->core_ops) 3031 + if (!trans || !trans->supplier || !trans->core_ops) 3068 3032 return NULL; 3069 3033 3070 3034 if (!device_link_add(dev, trans->supplier, DL_FLAG_AUTOREMOVE_CONSUMER)) { ··· 3079 3043 dev_info(dev, "Using %s\n", dev_driver_string(trans->supplier)); 3080 3044 3081 3045 ret = of_property_read_u32(dev->of_node, "arm,max-rx-timeout-ms", 3082 - &trans->desc->max_rx_timeout_ms); 3046 + &trans->desc.max_rx_timeout_ms); 3083 3047 if (ret && ret != -EINVAL) 3084 3048 dev_err(dev, "Malformed arm,max-rx-timeout-ms DT property.\n"); 3085 3049 3086 3050 ret = of_property_read_u32(dev->of_node, "arm,max-msg-size", 3087 - &trans->desc->max_msg_size); 3051 + &trans->desc.max_msg_size); 3088 3052 if (ret && ret != -EINVAL) 3089 3053 dev_err(dev, "Malformed arm,max-msg-size DT property.\n"); 3090 3054 3091 3055 ret = of_property_read_u32(dev->of_node, "arm,max-msg", 3092 - &trans->desc->max_msg); 3056 + &trans->desc.max_msg); 3093 3057 if (ret && ret != -EINVAL) 3094 3058 dev_err(dev, "Malformed arm,max-msg DT property.\n"); 3095 3059 3096 3060 dev_info(dev, 3097 3061 "SCMI max-rx-timeout: %dms / max-msg-size: %dbytes / max-msg: %d\n", 3098 - trans->desc->max_rx_timeout_ms, trans->desc->max_msg_size, 3099 - trans->desc->max_msg); 3062 + trans->desc.max_rx_timeout_ms, trans->desc.max_msg_size, 3063 + trans->desc.max_msg); 3100 3064 3101 3065 /* System wide atomic threshold for atomic ops .. if any */ 3102 3066 if (!of_property_read_u32(dev->of_node, "atomic-threshold-us", 3103 - &trans->desc->atomic_threshold)) 3067 + &trans->desc.atomic_threshold)) 3104 3068 dev_info(dev, 3105 3069 "SCMI System wide atomic threshold set to %u us\n", 3106 - trans->desc->atomic_threshold); 3070 + trans->desc.atomic_threshold); 3107 3071 3108 - return trans->desc; 3072 + return &trans->desc; 3109 3073 } 3110 3074 3111 3075 static int scmi_probe(struct platform_device *pdev)
+1
drivers/firmware/arm_scmi/transports/mailbox.c
··· 378 378 { .compatible = "arm,scmi" }, 379 379 { /* Sentinel */ }, 380 380 }; 381 + MODULE_DEVICE_TABLE(of, scmi_of_match); 381 382 382 383 DEFINE_SCMI_TRANSPORT_DRIVER(scmi_mailbox, scmi_mailbox_driver, 383 384 scmi_mailbox_desc, scmi_of_match, core);
+1
drivers/firmware/arm_scmi/transports/smc.c
··· 301 301 { .compatible = "qcom,scmi-smc" }, 302 302 { /* Sentinel */ }, 303 303 }; 304 + MODULE_DEVICE_TABLE(of, scmi_of_match); 304 305 305 306 DEFINE_SCMI_TRANSPORT_DRIVER(scmi_smc, scmi_smc_driver, scmi_smc_desc, 306 307 scmi_of_match, core);
+1
drivers/firmware/arm_scmi/transports/virtio.c
··· 921 921 { VIRTIO_ID_SCMI, VIRTIO_DEV_ANY_ID }, 922 922 { 0 } 923 923 }; 924 + MODULE_DEVICE_TABLE(virtio, id_table); 924 925 925 926 static struct virtio_driver virtio_scmi_driver = { 926 927 .driver.name = "scmi-virtio",
+3 -2
drivers/firmware/arm_scmi/vendors/imx/imx-sm-bbm.c
··· 374 374 .ops = &scmi_imx_bbm_proto_ops, 375 375 .events = &scmi_imx_bbm_protocol_events, 376 376 .supported_version = SCMI_PROTOCOL_SUPPORTED_VERSION, 377 - .vendor_id = "NXP", 378 - .sub_vendor_id = "IMX", 377 + .vendor_id = SCMI_IMX_VENDOR, 378 + .sub_vendor_id = SCMI_IMX_SUBVENDOR, 379 379 }; 380 380 module_scmi_protocol(scmi_imx_bbm); 381 381 382 + MODULE_ALIAS("scmi-protocol-" __stringify(SCMI_PROTOCOL_IMX_BBM) "-" SCMI_IMX_VENDOR); 382 383 MODULE_DESCRIPTION("i.MX SCMI BBM driver"); 383 384 MODULE_LICENSE("GPL");
+3 -2
drivers/firmware/arm_scmi/vendors/imx/imx-sm-misc.c
··· 309 309 .ops = &scmi_imx_misc_proto_ops, 310 310 .events = &scmi_imx_misc_protocol_events, 311 311 .supported_version = SCMI_PROTOCOL_SUPPORTED_VERSION, 312 - .vendor_id = "NXP", 313 - .sub_vendor_id = "IMX", 312 + .vendor_id = SCMI_IMX_VENDOR, 313 + .sub_vendor_id = SCMI_IMX_SUBVENDOR, 314 314 }; 315 315 module_scmi_protocol(scmi_imx_misc); 316 316 317 + MODULE_ALIAS("scmi-protocol-" __stringify(SCMI_PROTOCOL_IMX_MISC) "-" SCMI_IMX_VENDOR); 317 318 MODULE_DESCRIPTION("i.MX SCMI MISC driver"); 318 319 MODULE_LICENSE("GPL");
+5 -1
drivers/firmware/qcom/qcom_scm-smc.c
··· 152 152 enum qcom_scm_convention qcom_convention, 153 153 struct qcom_scm_res *res, bool atomic) 154 154 { 155 - struct qcom_tzmem_pool *mempool = qcom_scm_get_tzmem_pool(); 156 155 int arglen = desc->arginfo & 0xf; 157 156 int i, ret; 158 157 void *args_virt __free(qcom_tzmem) = NULL; ··· 172 173 smc.args[i + SCM_SMC_FIRST_REG_IDX] = desc->args[i]; 173 174 174 175 if (unlikely(arglen > SCM_SMC_N_REG_ARGS)) { 176 + struct qcom_tzmem_pool *mempool = qcom_scm_get_tzmem_pool(); 177 + 178 + if (!mempool) 179 + return -EINVAL; 180 + 175 181 args_virt = qcom_tzmem_alloc(mempool, 176 182 SCM_SMC_N_EXT_ARGS * sizeof(u64), 177 183 flag);
+255 -16
drivers/firmware/qcom/qcom_scm.c
··· 217 217 218 218 struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void) 219 219 { 220 - return __scm ? __scm->mempool : NULL; 220 + if (!qcom_scm_is_available()) 221 + return NULL; 222 + 223 + return __scm->mempool; 221 224 } 222 225 223 226 static enum qcom_scm_convention __get_convention(void) ··· 1282 1279 } 1283 1280 EXPORT_SYMBOL_GPL(qcom_scm_ice_set_key); 1284 1281 1282 + bool qcom_scm_has_wrapped_key_support(void) 1283 + { 1284 + return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1285 + QCOM_SCM_ES_DERIVE_SW_SECRET) && 1286 + __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1287 + QCOM_SCM_ES_GENERATE_ICE_KEY) && 1288 + __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1289 + QCOM_SCM_ES_PREPARE_ICE_KEY) && 1290 + __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1291 + QCOM_SCM_ES_IMPORT_ICE_KEY); 1292 + } 1293 + EXPORT_SYMBOL_GPL(qcom_scm_has_wrapped_key_support); 1294 + 1295 + /** 1296 + * qcom_scm_derive_sw_secret() - Derive software secret from wrapped key 1297 + * @eph_key: an ephemerally-wrapped key 1298 + * @eph_key_size: size of @eph_key in bytes 1299 + * @sw_secret: output buffer for the software secret 1300 + * @sw_secret_size: size of the software secret to derive in bytes 1301 + * 1302 + * Derive a software secret from an ephemerally-wrapped key for software crypto 1303 + * operations. This is done by calling into the secure execution environment, 1304 + * which then calls into the hardware to unwrap and derive the secret. 1305 + * 1306 + * For more information on sw_secret, see the "Hardware-wrapped keys" section of 1307 + * Documentation/block/inline-encryption.rst. 1308 + * 1309 + * Return: 0 on success; -errno on failure. 1310 + */ 1311 + int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size, 1312 + u8 *sw_secret, size_t sw_secret_size) 1313 + { 1314 + struct qcom_scm_desc desc = { 1315 + .svc = QCOM_SCM_SVC_ES, 1316 + .cmd = QCOM_SCM_ES_DERIVE_SW_SECRET, 1317 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, 1318 + QCOM_SCM_RW, QCOM_SCM_VAL), 1319 + .owner = ARM_SMCCC_OWNER_SIP, 1320 + }; 1321 + int ret; 1322 + 1323 + void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1324 + eph_key_size, 1325 + GFP_KERNEL); 1326 + if (!eph_key_buf) 1327 + return -ENOMEM; 1328 + 1329 + void *sw_secret_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1330 + sw_secret_size, 1331 + GFP_KERNEL); 1332 + if (!sw_secret_buf) 1333 + return -ENOMEM; 1334 + 1335 + memcpy(eph_key_buf, eph_key, eph_key_size); 1336 + desc.args[0] = qcom_tzmem_to_phys(eph_key_buf); 1337 + desc.args[1] = eph_key_size; 1338 + desc.args[2] = qcom_tzmem_to_phys(sw_secret_buf); 1339 + desc.args[3] = sw_secret_size; 1340 + 1341 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1342 + if (!ret) 1343 + memcpy(sw_secret, sw_secret_buf, sw_secret_size); 1344 + 1345 + memzero_explicit(eph_key_buf, eph_key_size); 1346 + memzero_explicit(sw_secret_buf, sw_secret_size); 1347 + return ret; 1348 + } 1349 + EXPORT_SYMBOL_GPL(qcom_scm_derive_sw_secret); 1350 + 1351 + /** 1352 + * qcom_scm_generate_ice_key() - Generate a wrapped key for storage encryption 1353 + * @lt_key: output buffer for the long-term wrapped key 1354 + * @lt_key_size: size of @lt_key in bytes. Must be the exact wrapped key size 1355 + * used by the SoC. 1356 + * 1357 + * Generate a key using the built-in HW module in the SoC. The resulting key is 1358 + * returned wrapped with the platform-specific Key Encryption Key. 1359 + * 1360 + * Return: 0 on success; -errno on failure. 1361 + */ 1362 + int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size) 1363 + { 1364 + struct qcom_scm_desc desc = { 1365 + .svc = QCOM_SCM_SVC_ES, 1366 + .cmd = QCOM_SCM_ES_GENERATE_ICE_KEY, 1367 + .arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL), 1368 + .owner = ARM_SMCCC_OWNER_SIP, 1369 + }; 1370 + int ret; 1371 + 1372 + void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1373 + lt_key_size, 1374 + GFP_KERNEL); 1375 + if (!lt_key_buf) 1376 + return -ENOMEM; 1377 + 1378 + desc.args[0] = qcom_tzmem_to_phys(lt_key_buf); 1379 + desc.args[1] = lt_key_size; 1380 + 1381 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1382 + if (!ret) 1383 + memcpy(lt_key, lt_key_buf, lt_key_size); 1384 + 1385 + memzero_explicit(lt_key_buf, lt_key_size); 1386 + return ret; 1387 + } 1388 + EXPORT_SYMBOL_GPL(qcom_scm_generate_ice_key); 1389 + 1390 + /** 1391 + * qcom_scm_prepare_ice_key() - Re-wrap a key with the per-boot ephemeral key 1392 + * @lt_key: a long-term wrapped key 1393 + * @lt_key_size: size of @lt_key in bytes 1394 + * @eph_key: output buffer for the ephemerally-wrapped key 1395 + * @eph_key_size: size of @eph_key in bytes. Must be the exact wrapped key size 1396 + * used by the SoC. 1397 + * 1398 + * Given a long-term wrapped key, re-wrap it with the per-boot ephemeral key for 1399 + * added protection. The resulting key will only be valid for the current boot. 1400 + * 1401 + * Return: 0 on success; -errno on failure. 1402 + */ 1403 + int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size, 1404 + u8 *eph_key, size_t eph_key_size) 1405 + { 1406 + struct qcom_scm_desc desc = { 1407 + .svc = QCOM_SCM_SVC_ES, 1408 + .cmd = QCOM_SCM_ES_PREPARE_ICE_KEY, 1409 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RO, QCOM_SCM_VAL, 1410 + QCOM_SCM_RW, QCOM_SCM_VAL), 1411 + .owner = ARM_SMCCC_OWNER_SIP, 1412 + }; 1413 + int ret; 1414 + 1415 + void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1416 + lt_key_size, 1417 + GFP_KERNEL); 1418 + if (!lt_key_buf) 1419 + return -ENOMEM; 1420 + 1421 + void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1422 + eph_key_size, 1423 + GFP_KERNEL); 1424 + if (!eph_key_buf) 1425 + return -ENOMEM; 1426 + 1427 + memcpy(lt_key_buf, lt_key, lt_key_size); 1428 + desc.args[0] = qcom_tzmem_to_phys(lt_key_buf); 1429 + desc.args[1] = lt_key_size; 1430 + desc.args[2] = qcom_tzmem_to_phys(eph_key_buf); 1431 + desc.args[3] = eph_key_size; 1432 + 1433 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1434 + if (!ret) 1435 + memcpy(eph_key, eph_key_buf, eph_key_size); 1436 + 1437 + memzero_explicit(lt_key_buf, lt_key_size); 1438 + memzero_explicit(eph_key_buf, eph_key_size); 1439 + return ret; 1440 + } 1441 + EXPORT_SYMBOL_GPL(qcom_scm_prepare_ice_key); 1442 + 1443 + /** 1444 + * qcom_scm_import_ice_key() - Import key for storage encryption 1445 + * @raw_key: the raw key to import 1446 + * @raw_key_size: size of @raw_key in bytes 1447 + * @lt_key: output buffer for the long-term wrapped key 1448 + * @lt_key_size: size of @lt_key in bytes. Must be the exact wrapped key size 1449 + * used by the SoC. 1450 + * 1451 + * Import a raw key and return a long-term wrapped key. Uses the SoC's HWKM to 1452 + * wrap the raw key using the platform-specific Key Encryption Key. 1453 + * 1454 + * Return: 0 on success; -errno on failure. 1455 + */ 1456 + int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size, 1457 + u8 *lt_key, size_t lt_key_size) 1458 + { 1459 + struct qcom_scm_desc desc = { 1460 + .svc = QCOM_SCM_SVC_ES, 1461 + .cmd = QCOM_SCM_ES_IMPORT_ICE_KEY, 1462 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RO, QCOM_SCM_VAL, 1463 + QCOM_SCM_RW, QCOM_SCM_VAL), 1464 + .owner = ARM_SMCCC_OWNER_SIP, 1465 + }; 1466 + int ret; 1467 + 1468 + void *raw_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1469 + raw_key_size, 1470 + GFP_KERNEL); 1471 + if (!raw_key_buf) 1472 + return -ENOMEM; 1473 + 1474 + void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1475 + lt_key_size, 1476 + GFP_KERNEL); 1477 + if (!lt_key_buf) 1478 + return -ENOMEM; 1479 + 1480 + memcpy(raw_key_buf, raw_key, raw_key_size); 1481 + desc.args[0] = qcom_tzmem_to_phys(raw_key_buf); 1482 + desc.args[1] = raw_key_size; 1483 + desc.args[2] = qcom_tzmem_to_phys(lt_key_buf); 1484 + desc.args[3] = lt_key_size; 1485 + 1486 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1487 + if (!ret) 1488 + memcpy(lt_key, lt_key_buf, lt_key_size); 1489 + 1490 + memzero_explicit(raw_key_buf, raw_key_size); 1491 + memzero_explicit(lt_key_buf, lt_key_size); 1492 + return ret; 1493 + } 1494 + EXPORT_SYMBOL_GPL(qcom_scm_import_ice_key); 1495 + 1285 1496 /** 1286 1497 * qcom_scm_hdcp_available() - Check if secure environment supports HDCP. 1287 1498 * ··· 1985 1768 + any potential issues with this, only allow validated machines for now. 1986 1769 */ 1987 1770 static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = { 1771 + { .compatible = "asus,vivobook-s15" }, 1988 1772 { .compatible = "dell,xps13-9345" }, 1773 + { .compatible = "hp,omnibook-x14" }, 1774 + { .compatible = "huawei,gaokun3" }, 1989 1775 { .compatible = "lenovo,flex-5g" }, 1990 1776 { .compatible = "lenovo,thinkpad-t14s" }, 1991 1777 { .compatible = "lenovo,thinkpad-x13s", }, 1992 1778 { .compatible = "lenovo,yoga-slim7x" }, 1993 1779 { .compatible = "microsoft,arcata", }, 1780 + { .compatible = "microsoft,blackrock" }, 1994 1781 { .compatible = "microsoft,romulus13", }, 1995 1782 { .compatible = "microsoft,romulus15", }, 1996 1783 { .compatible = "qcom,sc8180x-primus" }, 1997 1784 { .compatible = "qcom,x1e001de-devkit" }, 1998 1785 { .compatible = "qcom,x1e80100-crd" }, 1999 1786 { .compatible = "qcom,x1e80100-qcp" }, 1787 + { .compatible = "qcom,x1p42100-crd" }, 2000 1788 { } 2001 1789 }; 2002 1790 ··· 2089 1867 */ 2090 1868 bool qcom_scm_is_available(void) 2091 1869 { 2092 - return !!READ_ONCE(__scm); 1870 + /* Paired with smp_store_release() in qcom_scm_probe */ 1871 + return !!smp_load_acquire(&__scm); 2093 1872 } 2094 1873 EXPORT_SYMBOL_GPL(qcom_scm_is_available); 2095 1874 ··· 2247 2024 if (ret) 2248 2025 return ret; 2249 2026 2250 - /* Let all above stores be available after this */ 2027 + /* Paired with smp_load_acquire() in qcom_scm_is_available(). */ 2251 2028 smp_store_release(&__scm, scm); 2252 2029 2253 2030 irq = platform_get_irq_optional(pdev, 0); 2254 2031 if (irq < 0) { 2255 - if (irq != -ENXIO) 2256 - return irq; 2032 + if (irq != -ENXIO) { 2033 + ret = irq; 2034 + goto err; 2035 + } 2257 2036 } else { 2258 2037 ret = devm_request_threaded_irq(__scm->dev, irq, NULL, qcom_scm_irq_handler, 2259 2038 IRQF_ONESHOT, "qcom-scm", __scm); 2260 - if (ret < 0) 2261 - return dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n"); 2039 + if (ret < 0) { 2040 + dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n"); 2041 + goto err; 2042 + } 2262 2043 } 2263 2044 2264 2045 __get_convention(); ··· 2281 2054 qcom_scm_disable_sdi(); 2282 2055 2283 2056 ret = of_reserved_mem_device_init(__scm->dev); 2284 - if (ret && ret != -ENODEV) 2285 - return dev_err_probe(__scm->dev, ret, 2286 - "Failed to setup the reserved memory region for TZ mem\n"); 2057 + if (ret && ret != -ENODEV) { 2058 + dev_err_probe(__scm->dev, ret, 2059 + "Failed to setup the reserved memory region for TZ mem\n"); 2060 + goto err; 2061 + } 2287 2062 2288 2063 ret = qcom_tzmem_enable(__scm->dev); 2289 - if (ret) 2290 - return dev_err_probe(__scm->dev, ret, 2291 - "Failed to enable the TrustZone memory allocator\n"); 2064 + if (ret) { 2065 + dev_err_probe(__scm->dev, ret, 2066 + "Failed to enable the TrustZone memory allocator\n"); 2067 + goto err; 2068 + } 2292 2069 2293 2070 memset(&pool_config, 0, sizeof(pool_config)); 2294 2071 pool_config.initial_size = 0; ··· 2300 2069 pool_config.max_size = SZ_256K; 2301 2070 2302 2071 __scm->mempool = devm_qcom_tzmem_pool_new(__scm->dev, &pool_config); 2303 - if (IS_ERR(__scm->mempool)) 2304 - return dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool), 2305 - "Failed to create the SCM memory pool\n"); 2072 + if (IS_ERR(__scm->mempool)) { 2073 + dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool), 2074 + "Failed to create the SCM memory pool\n"); 2075 + goto err; 2076 + } 2306 2077 2307 2078 /* 2308 2079 * Initialize the QSEECOM interface. ··· 2320 2087 WARN(ret < 0, "failed to initialize qseecom: %d\n", ret); 2321 2088 2322 2089 return 0; 2090 + 2091 + err: 2092 + /* Paired with smp_load_acquire() in qcom_scm_is_available(). */ 2093 + smp_store_release(&__scm, NULL); 2094 + 2095 + return ret; 2323 2096 } 2324 2097 2325 2098 static void qcom_scm_shutdown(struct platform_device *pdev)
+4
drivers/firmware/qcom/qcom_scm.h
··· 128 128 #define QCOM_SCM_SVC_ES 0x10 /* Enterprise Security */ 129 129 #define QCOM_SCM_ES_INVALIDATE_ICE_KEY 0x03 130 130 #define QCOM_SCM_ES_CONFIG_SET_ICE_KEY 0x04 131 + #define QCOM_SCM_ES_DERIVE_SW_SECRET 0x07 132 + #define QCOM_SCM_ES_GENERATE_ICE_KEY 0x08 133 + #define QCOM_SCM_ES_PREPARE_ICE_KEY 0x09 134 + #define QCOM_SCM_ES_IMPORT_ICE_KEY 0x0a 131 135 132 136 #define QCOM_SCM_SVC_HDCP 0x11 133 137 #define QCOM_SCM_HDCP_INVOKE 0x01
+7 -26
drivers/memory/omap-gpmc.c
··· 358 358 return (time_ps + tick_ps - 1) / tick_ps; 359 359 } 360 360 361 - static unsigned int gpmc_clk_ticks_to_ns(unsigned int ticks, int cs, 362 - enum gpmc_clk_domain cd) 363 - { 364 - return ticks * gpmc_get_clk_period(cs, cd) / 1000; 365 - } 366 - 367 - unsigned int gpmc_ticks_to_ns(unsigned int ticks) 368 - { 369 - return gpmc_clk_ticks_to_ns(ticks, /* any CS */ 0, GPMC_CD_FCLK); 370 - } 371 - 372 361 static unsigned int gpmc_ticks_to_ps(unsigned int ticks) 373 362 { 374 363 return ticks * gpmc_get_fclk_period(); ··· 404 415 } 405 416 406 417 #ifdef CONFIG_OMAP_GPMC_DEBUG 418 + 419 + static unsigned int gpmc_clk_ticks_to_ns(unsigned int ticks, int cs, 420 + enum gpmc_clk_domain cd) 421 + { 422 + return ticks * gpmc_get_clk_period(cs, cd) / 1000; 423 + } 424 + 407 425 /** 408 426 * get_gpmc_timing_reg - read a timing parameter and print DTS settings for it. 409 427 * @cs: Chip Select Region ··· 1290 1294 return gpmc_cs_set_timings(cs, &gpmc_t, &gpmc_s); 1291 1295 } 1292 1296 EXPORT_SYMBOL_GPL(gpmc_omap_onenand_set_timings); 1293 - 1294 - int gpmc_get_client_irq(unsigned int irq_config) 1295 - { 1296 - if (!gpmc_irq_domain) { 1297 - pr_warn("%s called before GPMC IRQ domain available\n", 1298 - __func__); 1299 - return 0; 1300 - } 1301 - 1302 - /* we restrict this to NAND IRQs only */ 1303 - if (irq_config >= GPMC_NR_NAND_IRQS) 1304 - return 0; 1305 - 1306 - return irq_create_mapping(gpmc_irq_domain, irq_config); 1307 - } 1308 1297 1309 1298 static int gpmc_irq_endis(unsigned long hwirq, bool endis) 1310 1299 {
+4 -4
drivers/memory/tegra/tegra20-emc.c
··· 474 474 475 475 ram_code = tegra_read_ram_code(); 476 476 477 - for (np = of_find_node_by_name(dev->of_node, "emc-tables"); np; 478 - np = of_find_node_by_name(np, "emc-tables")) { 477 + for_each_child_of_node(dev->of_node, np) { 478 + if (!of_node_name_eq(np, "emc-tables")) 479 + continue; 479 480 err = of_property_read_u32(np, "nvidia,ram-code", &value); 480 481 if (err || value != ram_code) { 481 482 struct device_node *lpddr2_np; 482 483 bool cfg_mismatches = false; 483 484 484 - lpddr2_np = of_find_node_by_name(np, "lpddr2"); 485 + lpddr2_np = of_get_child_by_name(np, "lpddr2"); 485 486 if (lpddr2_np) { 486 487 const struct lpddr2_info *info; 487 488 ··· 519 518 } 520 519 521 520 if (cfg_mismatches) { 522 - of_node_put(np); 523 521 continue; 524 522 } 525 523 }
+116 -76
drivers/memory/ti-aemif.c
··· 13 13 #include <linux/err.h> 14 14 #include <linux/io.h> 15 15 #include <linux/kernel.h> 16 + #include <linux/memory/ti-aemif.h> 16 17 #include <linux/module.h> 18 + #include <linux/mutex.h> 17 19 #include <linux/of.h> 18 20 #include <linux/of_platform.h> 19 21 #include <linux/platform_device.h> ··· 71 69 #define ACR_SSTROBE_MASK BIT(31) 72 70 #define ASIZE_16BIT 1 73 71 74 - #define CONFIG_MASK (TA(TA_MAX) | \ 75 - RHOLD(RHOLD_MAX) | \ 76 - RSTROBE(RSTROBE_MAX) | \ 77 - RSETUP(RSETUP_MAX) | \ 78 - WHOLD(WHOLD_MAX) | \ 79 - WSTROBE(WSTROBE_MAX) | \ 80 - WSETUP(WSETUP_MAX) | \ 81 - EW(EW_MAX) | SSTROBE(SSTROBE_MAX) | \ 82 - ASIZE_MAX) 72 + #define TIMINGS_MASK (TA(TA_MAX) | \ 73 + RHOLD(RHOLD_MAX) | \ 74 + RSTROBE(RSTROBE_MAX) | \ 75 + RSETUP(RSETUP_MAX) | \ 76 + WHOLD(WHOLD_MAX) | \ 77 + WSTROBE(WSTROBE_MAX) | \ 78 + WSETUP(WSETUP_MAX)) 79 + 80 + #define CONFIG_MASK (EW(EW_MAX) | SSTROBE(SSTROBE_MAX) | ASIZE_MAX) 83 81 84 82 /** 85 - * struct aemif_cs_data: structure to hold cs parameters 83 + * struct aemif_cs_data: structure to hold CS parameters 84 + * @timings: timings configuration 86 85 * @cs: chip-select number 87 - * @wstrobe: write strobe width, ns 88 - * @rstrobe: read strobe width, ns 89 - * @wsetup: write setup width, ns 90 - * @whold: write hold width, ns 91 - * @rsetup: read setup width, ns 92 - * @rhold: read hold width, ns 93 - * @ta: minimum turn around time, ns 94 86 * @enable_ss: enable/disable select strobe mode 95 87 * @enable_ew: enable/disable extended wait mode 96 88 * @asize: width of the asynchronous device's data bus 97 89 */ 98 90 struct aemif_cs_data { 91 + struct aemif_cs_timings timings; 99 92 u8 cs; 100 - u16 wstrobe; 101 - u16 rstrobe; 102 - u8 wsetup; 103 - u8 whold; 104 - u8 rsetup; 105 - u8 rhold; 106 - u8 ta; 107 93 u8 enable_ss; 108 94 u8 enable_ew; 109 95 u8 asize; ··· 105 115 * @num_cs: number of assigned chip-selects 106 116 * @cs_offset: start number of cs nodes 107 117 * @cs_data: array of chip-select settings 118 + * @config_cs_lock: lock used to access CS configuration 108 119 */ 109 120 struct aemif_device { 110 121 void __iomem *base; ··· 114 123 u8 num_cs; 115 124 int cs_offset; 116 125 struct aemif_cs_data cs_data[NUM_CS]; 126 + struct mutex config_cs_lock; 117 127 }; 128 + 129 + /** 130 + * aemif_check_cs_timings() - Check the validity of a CS timing configuration. 131 + * @timings: timings configuration 132 + * 133 + * @return: 0 if the timing configuration is valid, negative error number otherwise. 134 + */ 135 + int aemif_check_cs_timings(struct aemif_cs_timings *timings) 136 + { 137 + if (timings->ta > TA_MAX) 138 + return -EINVAL; 139 + 140 + if (timings->rhold > RHOLD_MAX) 141 + return -EINVAL; 142 + 143 + if (timings->rstrobe > RSTROBE_MAX) 144 + return -EINVAL; 145 + 146 + if (timings->rsetup > RSETUP_MAX) 147 + return -EINVAL; 148 + 149 + if (timings->whold > WHOLD_MAX) 150 + return -EINVAL; 151 + 152 + if (timings->wstrobe > WSTROBE_MAX) 153 + return -EINVAL; 154 + 155 + if (timings->wsetup > WSETUP_MAX) 156 + return -EINVAL; 157 + 158 + return 0; 159 + } 160 + EXPORT_SYMBOL_GPL(aemif_check_cs_timings); 161 + 162 + /** 163 + * aemif_set_cs_timings() - Set the timing configuration of a given chip select. 164 + * @aemif: aemif device to configure 165 + * @cs: index of the chip select to configure 166 + * @timings: timings configuration to set 167 + * 168 + * @return: 0 on success, else negative errno. 169 + */ 170 + int aemif_set_cs_timings(struct aemif_device *aemif, u8 cs, 171 + struct aemif_cs_timings *timings) 172 + { 173 + unsigned int offset; 174 + u32 val, set; 175 + int ret; 176 + 177 + if (!timings || !aemif) 178 + return -EINVAL; 179 + 180 + if (cs > aemif->num_cs) 181 + return -EINVAL; 182 + 183 + ret = aemif_check_cs_timings(timings); 184 + if (ret) 185 + return ret; 186 + 187 + set = TA(timings->ta) | RHOLD(timings->rhold) | RSTROBE(timings->rstrobe) | 188 + RSETUP(timings->rsetup) | WHOLD(timings->whold) | 189 + WSTROBE(timings->wstrobe) | WSETUP(timings->wsetup); 190 + 191 + offset = A1CR_OFFSET + cs * 4; 192 + 193 + mutex_lock(&aemif->config_cs_lock); 194 + val = readl(aemif->base + offset); 195 + val &= ~TIMINGS_MASK; 196 + val |= set; 197 + writel(val, aemif->base + offset); 198 + mutex_unlock(&aemif->config_cs_lock); 199 + 200 + return 0; 201 + } 202 + EXPORT_SYMBOL_GPL(aemif_set_cs_timings); 118 203 119 204 /** 120 205 * aemif_calc_rate - calculate timing data. 121 206 * @pdev: platform device to calculate for 122 207 * @wanted: The cycle time needed in nanoseconds. 123 208 * @clk: The input clock rate in kHz. 124 - * @max: The maximum divider value that can be programmed. 125 209 * 126 - * On success, returns the calculated timing value minus 1 for easy 127 - * programming into AEMIF timing registers, else negative errno. 210 + * @return: the calculated timing value minus 1 for easy 211 + * programming into AEMIF timing registers. 128 212 */ 129 - static int aemif_calc_rate(struct platform_device *pdev, int wanted, 130 - unsigned long clk, int max) 213 + static u32 aemif_calc_rate(struct platform_device *pdev, int wanted, unsigned long clk) 131 214 { 132 215 int result; 133 216 ··· 213 148 /* It is generally OK to have a more relaxed timing than requested... */ 214 149 if (result < 0) 215 150 result = 0; 216 - 217 - /* ... But configuring tighter timings is not an option. */ 218 - else if (result > max) 219 - result = -EINVAL; 220 151 221 152 return result; 222 153 } ··· 235 174 { 236 175 struct aemif_device *aemif = platform_get_drvdata(pdev); 237 176 struct aemif_cs_data *data = &aemif->cs_data[csnum]; 238 - int ta, rhold, rstrobe, rsetup, whold, wstrobe, wsetup; 239 - unsigned long clk_rate = aemif->clk_rate; 240 177 unsigned offset; 241 178 u32 set, val; 242 179 243 180 offset = A1CR_OFFSET + (data->cs - aemif->cs_offset) * 4; 244 181 245 - ta = aemif_calc_rate(pdev, data->ta, clk_rate, TA_MAX); 246 - rhold = aemif_calc_rate(pdev, data->rhold, clk_rate, RHOLD_MAX); 247 - rstrobe = aemif_calc_rate(pdev, data->rstrobe, clk_rate, RSTROBE_MAX); 248 - rsetup = aemif_calc_rate(pdev, data->rsetup, clk_rate, RSETUP_MAX); 249 - whold = aemif_calc_rate(pdev, data->whold, clk_rate, WHOLD_MAX); 250 - wstrobe = aemif_calc_rate(pdev, data->wstrobe, clk_rate, WSTROBE_MAX); 251 - wsetup = aemif_calc_rate(pdev, data->wsetup, clk_rate, WSETUP_MAX); 252 - 253 - if (ta < 0 || rhold < 0 || rstrobe < 0 || rsetup < 0 || 254 - whold < 0 || wstrobe < 0 || wsetup < 0) { 255 - dev_err(&pdev->dev, "%s: cannot get suitable timings\n", 256 - __func__); 257 - return -EINVAL; 258 - } 259 - 260 - set = TA(ta) | RHOLD(rhold) | RSTROBE(rstrobe) | RSETUP(rsetup) | 261 - WHOLD(whold) | WSTROBE(wstrobe) | WSETUP(wsetup); 262 - 263 - set |= (data->asize & ACR_ASIZE_MASK); 182 + set = (data->asize & ACR_ASIZE_MASK); 264 183 if (data->enable_ew) 265 184 set |= ACR_EW_MASK; 266 185 if (data->enable_ss) 267 186 set |= ACR_SSTROBE_MASK; 268 187 188 + mutex_lock(&aemif->config_cs_lock); 269 189 val = readl(aemif->base + offset); 270 190 val &= ~CONFIG_MASK; 271 191 val |= set; 272 192 writel(val, aemif->base + offset); 193 + mutex_unlock(&aemif->config_cs_lock); 273 194 274 - return 0; 275 - } 276 - 277 - static inline int aemif_cycles_to_nsec(int val, unsigned long clk_rate) 278 - { 279 - return ((val + 1) * NSEC_PER_MSEC) / clk_rate; 195 + return aemif_set_cs_timings(aemif, data->cs - aemif->cs_offset, &data->timings); 280 196 } 281 197 282 198 /** ··· 269 231 { 270 232 struct aemif_device *aemif = platform_get_drvdata(pdev); 271 233 struct aemif_cs_data *data = &aemif->cs_data[csnum]; 272 - unsigned long clk_rate = aemif->clk_rate; 273 234 u32 val, offset; 274 235 275 236 offset = A1CR_OFFSET + (data->cs - aemif->cs_offset) * 4; 276 237 val = readl(aemif->base + offset); 277 238 278 - data->ta = aemif_cycles_to_nsec(TA_VAL(val), clk_rate); 279 - data->rhold = aemif_cycles_to_nsec(RHOLD_VAL(val), clk_rate); 280 - data->rstrobe = aemif_cycles_to_nsec(RSTROBE_VAL(val), clk_rate); 281 - data->rsetup = aemif_cycles_to_nsec(RSETUP_VAL(val), clk_rate); 282 - data->whold = aemif_cycles_to_nsec(WHOLD_VAL(val), clk_rate); 283 - data->wstrobe = aemif_cycles_to_nsec(WSTROBE_VAL(val), clk_rate); 284 - data->wsetup = aemif_cycles_to_nsec(WSETUP_VAL(val), clk_rate); 239 + data->timings.ta = TA_VAL(val); 240 + data->timings.rhold = RHOLD_VAL(val); 241 + data->timings.rstrobe = RSTROBE_VAL(val); 242 + data->timings.rsetup = RSETUP_VAL(val); 243 + data->timings.whold = WHOLD_VAL(val); 244 + data->timings.wstrobe = WSTROBE_VAL(val); 245 + data->timings.wsetup = WSETUP_VAL(val); 285 246 data->enable_ew = EW_VAL(val); 286 247 data->enable_ss = SSTROBE_VAL(val); 287 248 data->asize = val & ASIZE_MAX; ··· 298 261 struct device_node *np) 299 262 { 300 263 struct aemif_device *aemif = platform_get_drvdata(pdev); 264 + unsigned long clk_rate = aemif->clk_rate; 301 265 struct aemif_cs_data *data; 302 266 u32 cs; 303 267 u32 val; ··· 326 288 327 289 /* override the values from device node */ 328 290 if (!of_property_read_u32(np, "ti,cs-min-turnaround-ns", &val)) 329 - data->ta = val; 291 + data->timings.ta = aemif_calc_rate(pdev, val, clk_rate); 330 292 331 293 if (!of_property_read_u32(np, "ti,cs-read-hold-ns", &val)) 332 - data->rhold = val; 294 + data->timings.rhold = aemif_calc_rate(pdev, val, clk_rate); 333 295 334 296 if (!of_property_read_u32(np, "ti,cs-read-strobe-ns", &val)) 335 - data->rstrobe = val; 297 + data->timings.rstrobe = aemif_calc_rate(pdev, val, clk_rate); 336 298 337 299 if (!of_property_read_u32(np, "ti,cs-read-setup-ns", &val)) 338 - data->rsetup = val; 300 + data->timings.rsetup = aemif_calc_rate(pdev, val, clk_rate); 339 301 340 302 if (!of_property_read_u32(np, "ti,cs-write-hold-ns", &val)) 341 - data->whold = val; 303 + data->timings.whold = aemif_calc_rate(pdev, val, clk_rate); 342 304 343 305 if (!of_property_read_u32(np, "ti,cs-write-strobe-ns", &val)) 344 - data->wstrobe = val; 306 + data->timings.wstrobe = aemif_calc_rate(pdev, val, clk_rate); 345 307 346 308 if (!of_property_read_u32(np, "ti,cs-write-setup-ns", &val)) 347 - data->wsetup = val; 309 + data->timings.wsetup = aemif_calc_rate(pdev, val, clk_rate); 348 310 349 311 if (!of_property_read_u32(np, "ti,cs-bus-width", &val)) 350 312 if (val == 16) 351 313 data->asize = 1; 352 314 data->enable_ew = of_property_read_bool(np, "ti,cs-extended-wait-mode"); 353 315 data->enable_ss = of_property_read_bool(np, "ti,cs-select-strobe-mode"); 354 - return 0; 316 + 317 + return aemif_check_cs_timings(&data->timings); 355 318 } 356 319 357 320 static const struct of_device_id aemif_of_match[] = { ··· 390 351 if (IS_ERR(aemif->base)) 391 352 return PTR_ERR(aemif->base); 392 353 354 + mutex_init(&aemif->config_cs_lock); 393 355 if (np) { 394 356 /* 395 357 * For every controller device node, there is a cs device node
+21 -76
drivers/reset/amlogic/reset-meson-aux.c
··· 11 11 #include <linux/auxiliary_bus.h> 12 12 #include <linux/regmap.h> 13 13 #include <linux/reset-controller.h> 14 - #include <linux/slab.h> 15 14 16 15 #include "reset-meson.h" 17 - #include <soc/amlogic/reset-meson-aux.h> 18 16 19 - static DEFINE_IDA(meson_rst_aux_ida); 20 - 21 - struct meson_reset_adev { 22 - struct auxiliary_device adev; 23 - struct regmap *map; 17 + static const struct meson_reset_param meson_a1_audio_param = { 18 + .reset_ops = &meson_reset_toggle_ops, 19 + .reset_num = 32, 20 + .level_offset = 0x28, 24 21 }; 25 22 26 - #define to_meson_reset_adev(_adev) \ 27 - container_of((_adev), struct meson_reset_adev, adev) 23 + static const struct meson_reset_param meson_a1_audio_vad_param = { 24 + .reset_ops = &meson_reset_toggle_ops, 25 + .reset_num = 6, 26 + .level_offset = 0x8, 27 + }; 28 28 29 29 static const struct meson_reset_param meson_g12a_audio_param = { 30 30 .reset_ops = &meson_reset_toggle_ops, ··· 40 40 41 41 static const struct auxiliary_device_id meson_reset_aux_ids[] = { 42 42 { 43 + .name = "a1-audio-clkc.rst-a1", 44 + .driver_data = (kernel_ulong_t)&meson_a1_audio_param, 45 + }, { 46 + .name = "a1-audio-clkc.rst-a1-vad", 47 + .driver_data = (kernel_ulong_t)&meson_a1_audio_vad_param, 48 + }, { 43 49 .name = "axg-audio-clkc.rst-g12a", 44 50 .driver_data = (kernel_ulong_t)&meson_g12a_audio_param, 45 51 }, { ··· 60 54 { 61 55 const struct meson_reset_param *param = 62 56 (const struct meson_reset_param *)(id->driver_data); 63 - struct meson_reset_adev *raux = 64 - to_meson_reset_adev(adev); 57 + struct regmap *map; 65 58 66 - return meson_reset_controller_register(&adev->dev, raux->map, param); 59 + map = dev_get_regmap(adev->dev.parent, NULL); 60 + if (!map) 61 + return -EINVAL; 62 + 63 + return meson_reset_controller_register(&adev->dev, map, param); 67 64 } 68 65 69 66 static struct auxiliary_driver meson_reset_aux_driver = { ··· 74 65 .id_table = meson_reset_aux_ids, 75 66 }; 76 67 module_auxiliary_driver(meson_reset_aux_driver); 77 - 78 - static void meson_rst_aux_release(struct device *dev) 79 - { 80 - struct auxiliary_device *adev = to_auxiliary_dev(dev); 81 - struct meson_reset_adev *raux = 82 - to_meson_reset_adev(adev); 83 - 84 - ida_free(&meson_rst_aux_ida, adev->id); 85 - kfree(raux); 86 - } 87 - 88 - static void meson_rst_aux_unregister_adev(void *_adev) 89 - { 90 - struct auxiliary_device *adev = _adev; 91 - 92 - auxiliary_device_delete(adev); 93 - auxiliary_device_uninit(adev); 94 - } 95 - 96 - int devm_meson_rst_aux_register(struct device *dev, 97 - struct regmap *map, 98 - const char *adev_name) 99 - { 100 - struct meson_reset_adev *raux; 101 - struct auxiliary_device *adev; 102 - int ret; 103 - 104 - raux = kzalloc(sizeof(*raux), GFP_KERNEL); 105 - if (!raux) 106 - return -ENOMEM; 107 - 108 - ret = ida_alloc(&meson_rst_aux_ida, GFP_KERNEL); 109 - if (ret < 0) 110 - goto raux_free; 111 - 112 - raux->map = map; 113 - 114 - adev = &raux->adev; 115 - adev->id = ret; 116 - adev->name = adev_name; 117 - adev->dev.parent = dev; 118 - adev->dev.release = meson_rst_aux_release; 119 - device_set_of_node_from_dev(&adev->dev, dev); 120 - 121 - ret = auxiliary_device_init(adev); 122 - if (ret) 123 - goto ida_free; 124 - 125 - ret = __auxiliary_device_add(adev, dev->driver->name); 126 - if (ret) { 127 - auxiliary_device_uninit(adev); 128 - return ret; 129 - } 130 - 131 - return devm_add_action_or_reset(dev, meson_rst_aux_unregister_adev, 132 - adev); 133 - 134 - ida_free: 135 - ida_free(&meson_rst_aux_ida, adev->id); 136 - raux_free: 137 - kfree(raux); 138 - return ret; 139 - } 140 - EXPORT_SYMBOL_GPL(devm_meson_rst_aux_register); 141 68 142 69 MODULE_DESCRIPTION("Amlogic Meson Reset Auxiliary driver"); 143 70 MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
+1 -1
drivers/soc/imx/Makefile
··· 3 3 obj-$(CONFIG_ARCH_MXC) += soc-imx.o 4 4 endif 5 5 obj-$(CONFIG_SOC_IMX8M) += soc-imx8m.o 6 - obj-$(CONFIG_SOC_IMX9) += imx93-src.o 6 + obj-$(CONFIG_SOC_IMX9) += imx93-src.o soc-imx9.o
+128
drivers/soc/imx/soc-imx9.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Copyright 2024 NXP 4 + */ 5 + 6 + #include <linux/arm-smccc.h> 7 + #include <linux/init.h> 8 + #include <linux/module.h> 9 + #include <linux/of.h> 10 + #include <linux/platform_device.h> 11 + #include <linux/slab.h> 12 + #include <linux/sys_soc.h> 13 + 14 + #define IMX_SIP_GET_SOC_INFO 0xc2000006 15 + #define SOC_ID(x) (((x) & 0xFFFF) >> 8) 16 + #define SOC_REV_MAJOR(x) ((((x) >> 28) & 0xF) - 0x9) 17 + #define SOC_REV_MINOR(x) (((x) >> 24) & 0xF) 18 + 19 + static int imx9_soc_probe(struct platform_device *pdev) 20 + { 21 + struct soc_device_attribute *attr; 22 + struct arm_smccc_res res; 23 + struct soc_device *sdev; 24 + u32 soc_id, rev_major, rev_minor; 25 + u64 uid127_64, uid63_0; 26 + int err; 27 + 28 + attr = kzalloc(sizeof(*attr), GFP_KERNEL); 29 + if (!attr) 30 + return -ENOMEM; 31 + 32 + err = of_property_read_string(of_root, "model", &attr->machine); 33 + if (err) { 34 + pr_err("%s: missing model property: %d\n", __func__, err); 35 + goto attr; 36 + } 37 + 38 + attr->family = kasprintf(GFP_KERNEL, "Freescale i.MX"); 39 + 40 + /* 41 + * Retrieve the soc id, rev & uid info: 42 + * res.a1[31:16]: soc revision; 43 + * res.a1[15:0]: soc id; 44 + * res.a2: uid[127:64]; 45 + * res.a3: uid[63:0]; 46 + */ 47 + arm_smccc_smc(IMX_SIP_GET_SOC_INFO, 0, 0, 0, 0, 0, 0, 0, &res); 48 + if (res.a0 != SMCCC_RET_SUCCESS) { 49 + pr_err("%s: SMC failed: 0x%lx\n", __func__, res.a0); 50 + err = -EINVAL; 51 + goto family; 52 + } 53 + 54 + soc_id = SOC_ID(res.a1); 55 + rev_major = SOC_REV_MAJOR(res.a1); 56 + rev_minor = SOC_REV_MINOR(res.a1); 57 + 58 + attr->soc_id = kasprintf(GFP_KERNEL, "i.MX%2x", soc_id); 59 + attr->revision = kasprintf(GFP_KERNEL, "%d.%d", rev_major, rev_minor); 60 + 61 + uid127_64 = res.a2; 62 + uid63_0 = res.a3; 63 + attr->serial_number = kasprintf(GFP_KERNEL, "%016llx%016llx", uid127_64, uid63_0); 64 + 65 + sdev = soc_device_register(attr); 66 + if (IS_ERR(sdev)) { 67 + err = PTR_ERR(sdev); 68 + pr_err("%s failed to register SoC as a device: %d\n", __func__, err); 69 + goto serial_number; 70 + } 71 + 72 + return 0; 73 + 74 + serial_number: 75 + kfree(attr->serial_number); 76 + kfree(attr->revision); 77 + kfree(attr->soc_id); 78 + family: 79 + kfree(attr->family); 80 + attr: 81 + kfree(attr); 82 + return err; 83 + } 84 + 85 + static __maybe_unused const struct of_device_id imx9_soc_match[] = { 86 + { .compatible = "fsl,imx93", }, 87 + { .compatible = "fsl,imx95", }, 88 + { } 89 + }; 90 + 91 + #define IMX_SOC_DRIVER "imx9-soc" 92 + 93 + static struct platform_driver imx9_soc_driver = { 94 + .probe = imx9_soc_probe, 95 + .driver = { 96 + .name = IMX_SOC_DRIVER, 97 + }, 98 + }; 99 + 100 + static int __init imx9_soc_init(void) 101 + { 102 + int ret; 103 + struct platform_device *pdev; 104 + 105 + /* No match means it is not an i.MX 9 series SoC, do nothing. */ 106 + if (!of_match_node(imx9_soc_match, of_root)) 107 + return 0; 108 + 109 + ret = platform_driver_register(&imx9_soc_driver); 110 + if (ret) { 111 + pr_err("failed to register imx9_soc platform driver: %d\n", ret); 112 + return ret; 113 + } 114 + 115 + pdev = platform_device_register_simple(IMX_SOC_DRIVER, -1, NULL, 0); 116 + if (IS_ERR(pdev)) { 117 + pr_err("failed to register imx9_soc platform device: %ld\n", PTR_ERR(pdev)); 118 + platform_driver_unregister(&imx9_soc_driver); 119 + return PTR_ERR(pdev); 120 + } 121 + 122 + return 0; 123 + } 124 + device_initcall(imx9_soc_init); 125 + 126 + MODULE_AUTHOR("NXP"); 127 + MODULE_DESCRIPTION("NXP i.MX9 SoC"); 128 + MODULE_LICENSE("GPL");
+5 -18
drivers/soc/litex/litex_soc_ctrl.c
··· 69 69 70 70 struct litex_soc_ctrl_device { 71 71 void __iomem *base; 72 - struct notifier_block reset_nb; 73 72 }; 74 73 75 - static int litex_reset_handler(struct notifier_block *this, unsigned long mode, 76 - void *cmd) 74 + static int litex_reset_handler(struct sys_off_data *data) 77 75 { 78 - struct litex_soc_ctrl_device *soc_ctrl_dev = 79 - container_of(this, struct litex_soc_ctrl_device, reset_nb); 76 + struct litex_soc_ctrl_device *soc_ctrl_dev = data->cb_data; 80 77 81 78 litex_write32(soc_ctrl_dev->base + RESET_REG_OFF, RESET_REG_VALUE); 82 79 return NOTIFY_DONE; ··· 102 105 if (error) 103 106 return error; 104 107 105 - platform_set_drvdata(pdev, soc_ctrl_dev); 106 - 107 - soc_ctrl_dev->reset_nb.notifier_call = litex_reset_handler; 108 - soc_ctrl_dev->reset_nb.priority = 128; 109 - error = register_restart_handler(&soc_ctrl_dev->reset_nb); 108 + error = devm_register_restart_handler(&pdev->dev, 109 + litex_reset_handler, 110 + soc_ctrl_dev); 110 111 if (error) { 111 112 dev_warn(&pdev->dev, "cannot register restart handler: %d\n", 112 113 error); ··· 113 118 return 0; 114 119 } 115 120 116 - static void litex_soc_ctrl_remove(struct platform_device *pdev) 117 - { 118 - struct litex_soc_ctrl_device *soc_ctrl_dev = platform_get_drvdata(pdev); 119 - 120 - unregister_restart_handler(&soc_ctrl_dev->reset_nb); 121 - } 122 - 123 121 static struct platform_driver litex_soc_ctrl_driver = { 124 122 .driver = { 125 123 .name = "litex-soc-controller", 126 124 .of_match_table = litex_soc_ctrl_of_match, 127 125 }, 128 126 .probe = litex_soc_ctrl_probe, 129 - .remove = litex_soc_ctrl_remove, 130 127 }; 131 128 132 129 module_platform_driver(litex_soc_ctrl_driver);
+14 -5
drivers/soc/mediatek/mtk-devapc.c
··· 273 273 return -EINVAL; 274 274 275 275 devapc_irq = irq_of_parse_and_map(node, 0); 276 - if (!devapc_irq) 277 - return -EINVAL; 276 + if (!devapc_irq) { 277 + ret = -EINVAL; 278 + goto err; 279 + } 278 280 279 281 ctx->infra_clk = devm_clk_get_enabled(&pdev->dev, "devapc-infra-clock"); 280 - if (IS_ERR(ctx->infra_clk)) 281 - return -EINVAL; 282 + if (IS_ERR(ctx->infra_clk)) { 283 + ret = -EINVAL; 284 + goto err; 285 + } 282 286 283 287 ret = devm_request_irq(&pdev->dev, devapc_irq, devapc_violation_irq, 284 288 IRQF_TRIGGER_NONE, "devapc", ctx); 285 289 if (ret) 286 - return ret; 290 + goto err; 287 291 288 292 platform_set_drvdata(pdev, ctx); 289 293 290 294 start_devapc(ctx); 291 295 292 296 return 0; 297 + 298 + err: 299 + iounmap(ctx->infra_base); 300 + return ret; 293 301 } 294 302 295 303 static void mtk_devapc_remove(struct platform_device *pdev) ··· 305 297 struct mtk_devapc_context *ctx = platform_get_drvdata(pdev); 306 298 307 299 stop_devapc(ctx); 300 + iounmap(ctx->infra_base); 308 301 } 309 302 310 303 static struct platform_driver mtk_devapc_driver = {
+1 -1
drivers/soc/qcom/Kconfig
··· 139 139 140 140 config QCOM_RMTFS_MEM 141 141 tristate "Qualcomm Remote Filesystem memory driver" 142 - depends on ARCH_QCOM 142 + depends on ARCH_QCOM || COMPILE_TEST 143 143 select QCOM_SCM 144 144 help 145 145 The Qualcomm remote filesystem memory driver is used for allocating
+56 -2
drivers/soc/qcom/llcc-qcom.c
··· 142 142 bool skip_llcc_cfg; 143 143 bool no_edac; 144 144 bool irq_configured; 145 + bool no_broadcast_register; 145 146 }; 146 147 147 148 struct qcom_sct_config { ··· 153 152 enum llcc_reg_offset { 154 153 LLCC_COMMON_HW_INFO, 155 154 LLCC_COMMON_STATUS0, 155 + }; 156 + 157 + static const struct llcc_slice_config ipq5424_data[] = { 158 + { 159 + .usecase_id = LLCC_CPUSS, 160 + .slice_id = 1, 161 + .max_cap = 768, 162 + .priority = 1, 163 + .bonus_ways = 0xFFFF, 164 + .retain_on_pc = true, 165 + .activate_on_init = true, 166 + .write_scid_cacheable_en = true, 167 + .stale_en = true, 168 + .stale_cap_en = true, 169 + .alloc_oneway_en = true, 170 + .ovcap_en = true, 171 + .ovcap_prio = true, 172 + .vict_prio = true, 173 + }, 174 + { 175 + .usecase_id = LLCC_VIDSC0, 176 + .slice_id = 2, 177 + .max_cap = 256, 178 + .priority = 2, 179 + .fixed_size = true, 180 + .bonus_ways = 0xF000, 181 + .retain_on_pc = true, 182 + .activate_on_init = true, 183 + .write_scid_cacheable_en = true, 184 + .stale_en = true, 185 + .stale_cap_en = true, 186 + }, 156 187 }; 157 188 158 189 static const struct llcc_slice_config sa8775p_data[] = { ··· 3037 3004 .fixed_size = true, 3038 3005 .bonus_ways = 0xfff, 3039 3006 .cache_mode = 0, 3007 + .activate_on_init = true, 3040 3008 }, { 3041 3009 .usecase_id = LLCC_CAMEXP0, 3042 3010 .slice_id = 4, ··· 3219 3185 }, 3220 3186 }; 3221 3187 3188 + static const struct qcom_llcc_config ipq5424_cfg[] = { 3189 + { 3190 + .sct_data = ipq5424_data, 3191 + .size = ARRAY_SIZE(ipq5424_data), 3192 + .reg_offset = llcc_v2_1_reg_offset, 3193 + .edac_reg_offset = &llcc_v2_1_edac_reg_offset, 3194 + .no_broadcast_register = true, 3195 + }, 3196 + }; 3197 + 3222 3198 static const struct qcom_llcc_config sa8775p_cfg[] = { 3223 3199 { 3224 3200 .sct_data = sa8775p_data, ··· 3402 3358 static const struct qcom_sct_config qdu1000_cfgs = { 3403 3359 .llcc_config = qdu1000_cfg, 3404 3360 .num_config = ARRAY_SIZE(qdu1000_cfg), 3361 + }; 3362 + 3363 + static const struct qcom_sct_config ipq5424_cfgs = { 3364 + .llcc_config = ipq5424_cfg, 3365 + .num_config = ARRAY_SIZE(ipq5424_cfg), 3405 3366 }; 3406 3367 3407 3368 static const struct qcom_sct_config sa8775p_cfgs = { ··· 4006 3957 4007 3958 drv_data->bcast_regmap = qcom_llcc_init_mmio(pdev, i, "llcc_broadcast_base"); 4008 3959 if (IS_ERR(drv_data->bcast_regmap)) { 4009 - ret = PTR_ERR(drv_data->bcast_regmap); 4010 - goto err; 3960 + if (cfg->no_broadcast_register) { 3961 + drv_data->bcast_regmap = regmap; 3962 + } else { 3963 + ret = PTR_ERR(drv_data->bcast_regmap); 3964 + goto err; 3965 + } 4011 3966 } 4012 3967 4013 3968 /* Extract version of the IP */ ··· 4082 4029 } 4083 4030 4084 4031 static const struct of_device_id qcom_llcc_of_match[] = { 4032 + { .compatible = "qcom,ipq5424-llcc", .data = &ipq5424_cfgs}, 4085 4033 { .compatible = "qcom,qcs615-llcc", .data = &qcs615_cfgs}, 4086 4034 { .compatible = "qcom,qcs8300-llcc", .data = &qcs8300_cfgs}, 4087 4035 { .compatible = "qcom,qdu1000-llcc", .data = &qdu1000_cfgs},
+30 -42
drivers/soc/qcom/pmic_glink.c
··· 4 4 * Copyright (c) 2022, Linaro Ltd 5 5 */ 6 6 #include <linux/auxiliary_bus.h> 7 + #include <linux/cleanup.h> 7 8 #include <linux/delay.h> 8 9 #include <linux/module.h> 9 10 #include <linux/of.h> ··· 101 100 struct pmic_glink *pg = client->pg; 102 101 unsigned long flags; 103 102 104 - mutex_lock(&pg->state_lock); 103 + guard(mutex)(&pg->state_lock); 105 104 spin_lock_irqsave(&pg->client_lock, flags); 106 105 107 106 list_add(&client->node, &pg->clients); 108 107 client->pdr_notify(client->priv, pg->client_state); 109 108 110 109 spin_unlock_irqrestore(&pg->client_lock, flags); 111 - mutex_unlock(&pg->state_lock); 112 - 113 110 } 114 111 EXPORT_SYMBOL_GPL(pmic_glink_client_register); 115 112 ··· 118 119 unsigned long start; 119 120 int ret; 120 121 121 - mutex_lock(&pg->state_lock); 122 + guard(mutex)(&pg->state_lock); 122 123 if (!pg->ept) { 123 - ret = -ECONNRESET; 124 - } else { 125 - start = jiffies; 126 - for (;;) { 127 - ret = rpmsg_send(pg->ept, data, len); 128 - if (ret != -EAGAIN) 129 - break; 130 - 131 - if (timeout_reached) { 132 - ret = -ETIMEDOUT; 133 - break; 134 - } 135 - 136 - usleep_range(1000, 5000); 137 - timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT); 138 - } 124 + return -ECONNRESET; 139 125 } 140 - mutex_unlock(&pg->state_lock); 126 + 127 + start = jiffies; 128 + for (;;) { 129 + ret = rpmsg_send(pg->ept, data, len); 130 + if (ret != -EAGAIN) 131 + break; 132 + 133 + if (timeout_reached) { 134 + ret = -ETIMEDOUT; 135 + break; 136 + } 137 + 138 + usleep_range(1000, 5000); 139 + timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT); 140 + } 141 141 142 142 return ret; 143 143 } ··· 225 227 { 226 228 struct pmic_glink *pg = priv; 227 229 228 - mutex_lock(&pg->state_lock); 230 + guard(mutex)(&pg->state_lock); 229 231 pg->pdr_state = state; 230 232 231 233 pmic_glink_state_notify_clients(pg); 232 - mutex_unlock(&pg->state_lock); 233 234 } 234 235 235 236 static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev) 236 237 { 237 238 struct pmic_glink *pg = __pmic_glink; 238 - int ret = 0; 239 239 240 - mutex_lock(&__pmic_glink_lock); 241 - if (!pg) { 242 - ret = dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n"); 243 - goto out_unlock; 244 - } 240 + guard(mutex)(&__pmic_glink_lock); 241 + pg = __pmic_glink; 242 + if (!pg) 243 + return dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n"); 245 244 246 245 dev_set_drvdata(&rpdev->dev, pg); 247 246 248 - mutex_lock(&pg->state_lock); 247 + guard(mutex)(&pg->state_lock); 249 248 pg->ept = rpdev->ept; 250 249 pmic_glink_state_notify_clients(pg); 251 - mutex_unlock(&pg->state_lock); 252 250 253 - out_unlock: 254 - mutex_unlock(&__pmic_glink_lock); 255 - return ret; 251 + return 0; 256 252 } 257 253 258 254 static void pmic_glink_rpmsg_remove(struct rpmsg_device *rpdev) 259 255 { 260 256 struct pmic_glink *pg; 261 257 262 - mutex_lock(&__pmic_glink_lock); 258 + guard(mutex)(&__pmic_glink_lock); 263 259 pg = __pmic_glink; 264 260 if (!pg) 265 - goto out_unlock; 261 + return; 266 262 267 - mutex_lock(&pg->state_lock); 263 + guard(mutex)(&pg->state_lock); 268 264 pg->ept = NULL; 269 265 pmic_glink_state_notify_clients(pg); 270 - mutex_unlock(&pg->state_lock); 271 - out_unlock: 272 - mutex_unlock(&__pmic_glink_lock); 273 266 } 274 267 275 268 static const struct rpmsg_device_id pmic_glink_rpmsg_id_match[] = { ··· 367 378 if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) 368 379 pmic_glink_del_aux_device(pg, &pg->ucsi_aux); 369 380 370 - mutex_lock(&__pmic_glink_lock); 381 + guard(mutex)(&__pmic_glink_lock); 371 382 __pmic_glink = NULL; 372 - mutex_unlock(&__pmic_glink_lock); 373 383 } 374 384 375 385 static const unsigned long pmic_glink_sc8280xp_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
+2
drivers/soc/qcom/qcom_pd_mapper.c
··· 553 553 { .compatible = "qcom,sm4250", .data = sm6115_domains, }, 554 554 { .compatible = "qcom,sm6115", .data = sm6115_domains, }, 555 555 { .compatible = "qcom,sm6350", .data = sm6350_domains, }, 556 + { .compatible = "qcom,sm7225", .data = sm6350_domains, }, 556 557 { .compatible = "qcom,sm7325", .data = sc7280_domains, }, 557 558 { .compatible = "qcom,sm8150", .data = sm8150_domains, }, 558 559 { .compatible = "qcom,sm8250", .data = sm8250_domains, }, ··· 562 561 { .compatible = "qcom,sm8550", .data = sm8550_domains, }, 563 562 { .compatible = "qcom,sm8650", .data = sm8550_domains, }, 564 563 { .compatible = "qcom,x1e80100", .data = x1e80100_domains, }, 564 + { .compatible = "qcom,x1p42100", .data = x1e80100_domains, }, 565 565 {}, 566 566 }; 567 567
+1 -1
drivers/soc/qcom/rmtfs_mem.c
··· 125 125 return 0; 126 126 } 127 127 128 - static struct class rmtfs_class = { 128 + static const struct class rmtfs_class = { 129 129 .name = "rmtfs", 130 130 }; 131 131
+2 -1
drivers/soc/qcom/smem_state.c
··· 112 112 113 113 if (args.args_count != 1) { 114 114 dev_err(dev, "invalid #qcom,smem-state-cells\n"); 115 - return ERR_PTR(-EINVAL); 115 + state = ERR_PTR(-EINVAL); 116 + goto put; 116 117 } 117 118 118 119 state = of_node_to_state(args.np);
+2 -1
drivers/soc/qcom/socinfo.c
··· 451 451 { qcom_board_id(QCS9100) }, 452 452 { qcom_board_id(QCS8300) }, 453 453 { qcom_board_id(QCS8275) }, 454 + { qcom_board_id(QCS9075) }, 454 455 { qcom_board_id(QCS615) }, 455 456 }; 456 457 ··· 797 796 if (!qs->attr.soc_id || !qs->attr.revision) 798 797 return -ENOMEM; 799 798 800 - if (offsetof(struct socinfo, serial_num) <= item_size) { 799 + if (offsetofend(struct socinfo, serial_num) <= item_size) { 801 800 qs->attr.serial_number = devm_kasprintf(&pdev->dev, GFP_KERNEL, 802 801 "%u", 803 802 le32_to_cpu(info->serial_num));
+5
drivers/soc/renesas/Kconfig
··· 345 345 help 346 346 This enables support for the Renesas RZ/V2M SoC. 347 347 348 + config ARCH_R9A09G047 349 + bool "ARM64 Platform support for RZ/G3E" 350 + help 351 + This enables support for the Renesas RZ/G3E SoC variants. 352 + 348 353 config ARCH_R9A09G057 349 354 bool "ARM64 Platform support for RZ/V2H(P)" 350 355 select RENESAS_RZV2H_ICU
+1 -1
drivers/soc/samsung/exynos-pmu.c
··· 126 126 if (ret) 127 127 return ret; 128 128 } 129 - return ret; 129 + return 0; 130 130 } 131 131 132 132 static bool tensor_is_atomic(unsigned int reg)
+4 -16
drivers/soc/tegra/cbb/tegra-cbb.c
··· 69 69 } 70 70 DEFINE_SHOW_ATTRIBUTE(tegra_cbb_err); 71 71 72 - static int tegra_cbb_err_debugfs_init(struct tegra_cbb *cbb) 72 + static void tegra_cbb_err_debugfs_init(struct tegra_cbb *cbb) 73 73 { 74 74 static struct dentry *root; 75 75 76 - if (!root) { 76 + if (!root) 77 77 root = debugfs_create_file("tegra_cbb_err", 0444, NULL, cbb, &tegra_cbb_err_fops); 78 - if (IS_ERR_OR_NULL(root)) { 79 - pr_err("%s(): could not create debugfs node\n", __func__); 80 - return PTR_ERR(root); 81 - } 82 - } 83 - 84 - return 0; 85 78 } 86 79 87 80 void tegra_cbb_stall_enable(struct tegra_cbb *cbb) ··· 141 148 { 142 149 int ret; 143 150 144 - if (IS_ENABLED(CONFIG_DEBUG_FS)) { 145 - ret = tegra_cbb_err_debugfs_init(cbb); 146 - if (ret) { 147 - dev_err(cbb->dev, "failed to create debugfs\n"); 148 - return ret; 149 - } 150 - } 151 + if (IS_ENABLED(CONFIG_DEBUG_FS)) 152 + tegra_cbb_err_debugfs_init(cbb); 151 153 152 154 /* register interrupt handler for errors due to different initiators */ 153 155 ret = cbb->ops->interrupt_enable(cbb);
+1 -1
drivers/soc/tegra/cbb/tegra234-cbb.c
··· 277 277 * which timed out. 278 278 * a) Get block number from the index of set bit in 279 279 * <FABRIC>_SN_AXI2APB_<>_BLOCK_TMO_STATUS_0 register. 280 - * b) Get address of register repective to block number i.e. 280 + * b) Get address of register respective to block number i.e. 281 281 * <FABRIC>_SN_AXI2APB_<>_BLOCK<index-set-bit>_TMO_0. 282 282 * c) Read the register in above step to get client_id which 283 283 * timed out as per the set bits.
+11 -6
drivers/soc/tegra/fuse/fuse-tegra30.c
··· 647 647 }; 648 648 649 649 static const struct nvmem_keepout tegra234_fuse_keepouts[] = { 650 - { .start = 0x01c, .end = 0x0c8 }, 651 - { .start = 0x12c, .end = 0x184 }, 650 + { .start = 0x01c, .end = 0x064 }, 651 + { .start = 0x084, .end = 0x0a0 }, 652 + { .start = 0x0a4, .end = 0x0c8 }, 653 + { .start = 0x12c, .end = 0x164 }, 654 + { .start = 0x16c, .end = 0x184 }, 652 655 { .start = 0x190, .end = 0x198 }, 653 656 { .start = 0x1a0, .end = 0x204 }, 654 - { .start = 0x21c, .end = 0x250 }, 655 - { .start = 0x25c, .end = 0x2f0 }, 657 + { .start = 0x21c, .end = 0x2f0 }, 656 658 { .start = 0x310, .end = 0x3d8 }, 657 - { .start = 0x400, .end = 0x4f0 }, 658 - { .start = 0x4f8, .end = 0x7e8 }, 659 + { .start = 0x400, .end = 0x420 }, 660 + { .start = 0x444, .end = 0x490 }, 661 + { .start = 0x4bc, .end = 0x4f0 }, 662 + { .start = 0x4f8, .end = 0x54c }, 663 + { .start = 0x57c, .end = 0x7e8 }, 659 664 { .start = 0x8d0, .end = 0x8d8 }, 660 665 { .start = 0xacc, .end = 0xf00 } 661 666 };
+3 -2
drivers/tee/optee/smc_abi.c
··· 1272 1272 &res.smccc); 1273 1273 1274 1274 if (res.result.build_id) 1275 - pr_info("revision %lu.%lu (%08lx)", res.result.major, 1276 - res.result.minor, res.result.build_id); 1275 + pr_info("revision %lu.%lu (%0*lx)", res.result.major, 1276 + res.result.minor, (int)sizeof(res.result.build_id) * 2, 1277 + res.result.build_id); 1277 1278 else 1278 1279 pr_info("revision %lu.%lu", res.result.major, res.result.minor); 1279 1280 }
+1
include/dt-bindings/arm/qcom,ids.h
··· 284 284 #define QCOM_ID_QCS9100 667 285 285 #define QCOM_ID_QCS8300 674 286 286 #define QCOM_ID_QCS8275 675 287 + #define QCOM_ID_QCS9075 676 287 288 #define QCOM_ID_QCS615 680 288 289 289 290 /*
+36
include/dt-bindings/reset/amlogic,meson-a1-audio-reset.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 + /* 3 + * Copyright (c) 2024, SaluteDevices. All Rights Reserved. 4 + * 5 + * Author: Jan Dakinevich <jan.dakinevich@salutedevices.com> 6 + */ 7 + 8 + #ifndef _DT_BINDINGS_AMLOGIC_MESON_A1_AUDIO_RESET_H 9 + #define _DT_BINDINGS_AMLOGIC_MESON_A1_AUDIO_RESET_H 10 + 11 + #define AUD_RESET_DDRARB 0 12 + #define AUD_RESET_TDMIN_A 1 13 + #define AUD_RESET_TDMIN_B 2 14 + #define AUD_RESET_TDMIN_LB 3 15 + #define AUD_RESET_LOOPBACK 4 16 + #define AUD_RESET_TDMOUT_A 5 17 + #define AUD_RESET_TDMOUT_B 6 18 + #define AUD_RESET_FRDDR_A 7 19 + #define AUD_RESET_FRDDR_B 8 20 + #define AUD_RESET_TODDR_A 9 21 + #define AUD_RESET_TODDR_B 10 22 + #define AUD_RESET_SPDIFIN 11 23 + #define AUD_RESET_RESAMPLE 12 24 + #define AUD_RESET_EQDRC 13 25 + #define AUD_RESET_LOCKER 14 26 + #define AUD_RESET_TOACODEC 30 27 + #define AUD_RESET_CLKTREE 31 28 + 29 + #define AUD_VAD_RESET_DDRARB 0 30 + #define AUD_VAD_RESET_PDM 1 31 + #define AUD_VAD_RESET_TDMIN_VAD 2 32 + #define AUD_VAD_RESET_TODDR_VAD 3 33 + #define AUD_VAD_RESET_TOVAD 4 34 + #define AUD_VAD_RESET_CLKTREE 5 35 + 36 + #endif /* _DT_BINDINGS_AMLOGIC_MESON_A1_AUDIO_RESET_H */
+8
include/linux/firmware/qcom/qcom_scm.h
··· 105 105 int qcom_scm_ice_invalidate_key(u32 index); 106 106 int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size, 107 107 enum qcom_scm_ice_cipher cipher, u32 data_unit_size); 108 + bool qcom_scm_has_wrapped_key_support(void); 109 + int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size, 110 + u8 *sw_secret, size_t sw_secret_size); 111 + int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size); 112 + int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size, 113 + u8 *eph_key, size_t eph_key_size); 114 + int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size, 115 + u8 *lt_key, size_t lt_key_size); 108 116 109 117 bool qcom_scm_hdcp_available(void); 110 118 int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp);
+32
include/linux/memory/ti-aemif.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + 3 + #ifndef __MEMORY_TI_AEMIF_H 4 + #define __MEMORY_TI_AEMIF_H 5 + 6 + /** 7 + * struct aemif_cs_timings: structure to hold CS timing configuration 8 + * values are expressed in number of clock cycles - 1 9 + * @ta: minimum turn around time 10 + * @rhold: read hold width 11 + * @rstrobe: read strobe width 12 + * @rsetup: read setup width 13 + * @whold: write hold width 14 + * @wstrobe: write strobe width 15 + * @wsetup: write setup width 16 + */ 17 + struct aemif_cs_timings { 18 + u32 ta; 19 + u32 rhold; 20 + u32 rstrobe; 21 + u32 rsetup; 22 + u32 whold; 23 + u32 wstrobe; 24 + u32 wsetup; 25 + }; 26 + 27 + struct aemif_device; 28 + 29 + int aemif_set_cs_timings(struct aemif_device *aemif, u8 cs, struct aemif_cs_timings *timings); 30 + int aemif_check_cs_timings(struct aemif_cs_timings *timings); 31 + 32 + #endif // __MEMORY_TI_AEMIF_H
-4
include/linux/omap-gpmc.h
··· 66 66 67 67 struct device_node; 68 68 69 - extern int gpmc_get_client_irq(unsigned irq_config); 70 - 71 - extern unsigned int gpmc_ticks_to_ns(unsigned int ticks); 72 - 73 69 extern void gpmc_cs_write_reg(int cs, int idx, u32 val); 74 70 extern int gpmc_calc_divider(unsigned int sync_clk); 75 71 extern int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t,
+5 -4
include/linux/scmi_imx_protocol.h
··· 13 13 #include <linux/notifier.h> 14 14 #include <linux/types.h> 15 15 16 - enum scmi_nxp_protocol { 17 - SCMI_PROTOCOL_IMX_BBM = 0x81, 18 - SCMI_PROTOCOL_IMX_MISC = 0x84, 19 - }; 16 + #define SCMI_PROTOCOL_IMX_BBM 0x81 17 + #define SCMI_PROTOCOL_IMX_MISC 0x84 18 + 19 + #define SCMI_IMX_VENDOR "NXP" 20 + #define SCMI_IMX_SUBVENDOR "IMX" 20 21 21 22 struct scmi_imx_bbm_proto_ops { 22 23 int (*rtc_time_set)(const struct scmi_protocol_handle *ph, u32 id,
-23
include/soc/amlogic/reset-meson-aux.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 */ 2 - #ifndef __SOC_RESET_MESON_AUX_H 3 - #define __SOC_RESET_MESON_AUX_H 4 - 5 - #include <linux/err.h> 6 - 7 - struct device; 8 - struct regmap; 9 - 10 - #if IS_ENABLED(CONFIG_RESET_MESON_AUX) 11 - int devm_meson_rst_aux_register(struct device *dev, 12 - struct regmap *map, 13 - const char *adev_name); 14 - #else 15 - static inline int devm_meson_rst_aux_register(struct device *dev, 16 - struct regmap *map, 17 - const char *adev_name) 18 - { 19 - return 0; 20 - } 21 - #endif 22 - 23 - #endif /* __SOC_RESET_MESON_AUX_H */
+12 -14
include/soc/qcom/tcs.h
··· 6 6 #ifndef __SOC_QCOM_TCS_H__ 7 7 #define __SOC_QCOM_TCS_H__ 8 8 9 + #include <linux/bitfield.h> 10 + #include <linux/bits.h> 11 + 9 12 #define MAX_RPMH_PAYLOAD 16 10 13 11 14 /** ··· 63 60 struct tcs_cmd *cmds; 64 61 }; 65 62 66 - #define BCM_TCS_CMD_COMMIT_SHFT 30 67 - #define BCM_TCS_CMD_COMMIT_MASK 0x40000000 68 - #define BCM_TCS_CMD_VALID_SHFT 29 69 - #define BCM_TCS_CMD_VALID_MASK 0x20000000 70 - #define BCM_TCS_CMD_VOTE_X_SHFT 14 71 - #define BCM_TCS_CMD_VOTE_MASK 0x3fff 72 - #define BCM_TCS_CMD_VOTE_Y_SHFT 0 73 - #define BCM_TCS_CMD_VOTE_Y_MASK 0xfffc000 63 + #define BCM_TCS_CMD_COMMIT_MASK BIT(30) 64 + #define BCM_TCS_CMD_VALID_MASK BIT(29) 65 + #define BCM_TCS_CMD_VOTE_MASK GENMASK(13, 0) 66 + #define BCM_TCS_CMD_VOTE_Y_MASK GENMASK(13, 0) 67 + #define BCM_TCS_CMD_VOTE_X_MASK GENMASK(27, 14) 74 68 75 69 /* Construct a Bus Clock Manager (BCM) specific TCS command */ 76 70 #define BCM_TCS_CMD(commit, valid, vote_x, vote_y) \ 77 - (((commit) << BCM_TCS_CMD_COMMIT_SHFT) | \ 78 - ((valid) << BCM_TCS_CMD_VALID_SHFT) | \ 79 - ((cpu_to_le32(vote_x) & \ 80 - BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_X_SHFT) | \ 81 - ((cpu_to_le32(vote_y) & \ 82 - BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_Y_SHFT)) 71 + (u32_encode_bits(commit, BCM_TCS_CMD_COMMIT_MASK) | \ 72 + u32_encode_bits(valid, BCM_TCS_CMD_VALID_MASK) | \ 73 + u32_encode_bits(vote_x, BCM_TCS_CMD_VOTE_X_MASK) | \ 74 + u32_encode_bits(vote_y, BCM_TCS_CMD_VOTE_Y_MASK)) 83 75 84 76 #endif /* __SOC_QCOM_TCS_H__ */