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

Merge tag 'i2c-host-6.19-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/andi.shyti/linux into i2c/for-mergewindow

i2c-host for v6.19

- general cleanups in bcm2835, designware, pcf8584, and stm32
- amd-mp2: fix device refcount
- designware: avoid interrupt storms caused by bad firmware
- i801: fix supported features
- spacemit: fix device detection failures

New device support:
- Intel Diamond Rapids
- Rockchip RK3506
- Qualcomm Kaanapali, MSM8953

+71 -109
+1
Documentation/devicetree/bindings/i2c/i2c-rk3x.yaml
··· 37 37 - rockchip,px30-i2c 38 38 - rockchip,rk3308-i2c 39 39 - rockchip,rk3328-i2c 40 + - rockchip,rk3506-i2c 40 41 - rockchip,rk3528-i2c 41 42 - rockchip,rk3562-i2c 42 43 - rockchip,rk3568-i2c
+4
Documentation/devicetree/bindings/i2c/qcom,i2c-cci.yaml
··· 15 15 oneOf: 16 16 - enum: 17 17 - qcom,msm8226-cci 18 + - qcom,msm8953-cci 18 19 - qcom,msm8974-cci 19 20 - qcom,msm8996-cci 20 21 ··· 26 25 27 26 - items: 28 27 - enum: 28 + - qcom,kaanapali-cci 29 29 - qcom,qcm2290-cci 30 30 - qcom,sa8775p-cci 31 31 - qcom,sc7280-cci ··· 130 128 compatible: 131 129 contains: 132 130 enum: 131 + - qcom,kaanapali-cci 133 132 - qcom,qcm2290-cci 134 133 then: 135 134 properties: ··· 149 146 - contains: 150 147 enum: 151 148 - qcom,msm8916-cci 149 + - qcom,msm8953-cci 152 150 153 151 - const: qcom,msm8996-cci 154 152 then:
+1
Documentation/i2c/busses/i2c-i801.rst
··· 51 51 * Intel Arrow Lake (SOC) 52 52 * Intel Panther Lake (SOC) 53 53 * Intel Wildcat Lake (SOC) 54 + * Intel Diamond Rapids (SOC) 54 55 55 56 Datasheets: Publicly available at the Intel website 56 57
+25 -80
drivers/i2c/algos/i2c-algo-pcf.c
··· 23 23 #include "i2c-algo-pcf.h" 24 24 25 25 26 - #define DEB2(x) if (i2c_debug >= 2) x 27 - #define DEB3(x) if (i2c_debug >= 3) x /* print several statistical values */ 28 - #define DEBPROTO(x) if (i2c_debug >= 9) x; 29 - /* debug the protocol by showing transferred bits */ 30 26 #define DEF_TIMEOUT 16 31 - 32 - /* 33 - * module parameters: 34 - */ 35 - static int i2c_debug; 36 27 37 28 /* setting states on the bus with the right timing: */ 38 29 ··· 38 47 39 48 static void i2c_start(struct i2c_algo_pcf_data *adap) 40 49 { 41 - DEBPROTO(printk(KERN_DEBUG "S ")); 42 50 set_pcf(adap, 1, I2C_PCF_START); 43 51 } 44 52 45 53 static void i2c_repstart(struct i2c_algo_pcf_data *adap) 46 54 { 47 - DEBPROTO(printk(" Sr ")); 48 55 set_pcf(adap, 1, I2C_PCF_REPSTART); 49 56 } 50 57 51 58 static void i2c_stop(struct i2c_algo_pcf_data *adap) 52 59 { 53 - DEBPROTO(printk("P\n")); 54 60 set_pcf(adap, 1, I2C_PCF_STOP); 55 61 } 56 62 57 63 static void handle_lab(struct i2c_algo_pcf_data *adap, const int *status) 58 64 { 59 - DEB2(printk(KERN_INFO 60 - "i2c-algo-pcf.o: lost arbitration (CSR 0x%02x)\n", 61 - *status)); 62 65 /* 63 66 * Cleanup from LAB -- reset and enable ESO. 64 67 * This resets the PCF8584; since we've lost the bus, no ··· 73 88 if (adap->lab_mdelay) 74 89 mdelay(adap->lab_mdelay); 75 90 76 - DEB2(printk(KERN_INFO 77 - "i2c-algo-pcf.o: reset LAB condition (CSR 0x%02x)\n", 78 - get_pcf(adap, 1))); 79 91 } 80 92 81 93 static int wait_for_bb(struct i2c_algo_pcf_data *adap) ··· 129 147 * 130 148 * vdovikin: added detect code for PCF8584 131 149 */ 132 - static int pcf_init_8584 (struct i2c_algo_pcf_data *adap) 150 + static int pcf_init_8584(struct i2c_algo_pcf_data *adap) 133 151 { 134 152 unsigned char temp; 135 - 136 - DEB3(printk(KERN_DEBUG "i2c-algo-pcf.o: PCF state 0x%02x\n", 137 - get_pcf(adap, 1))); 138 153 139 154 /* S1=0x80: S0 selected, serial interface off */ 140 155 set_pcf(adap, 1, I2C_PCF_PIN); ··· 139 160 * check to see S1 now used as R/W ctrl - 140 161 * PCF8584 does that when ESO is zero 141 162 */ 142 - if (((temp = get_pcf(adap, 1)) & 0x7f) != (0)) { 143 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S0 (0x%02x).\n", temp)); 163 + temp = get_pcf(adap, 1); 164 + if ((temp & 0x7f) != 0) 144 165 return -ENXIO; /* definitely not PCF8584 */ 145 - } 146 166 147 167 /* load own address in S0, effective address is (own << 1) */ 148 168 i2c_outb(adap, get_own(adap)); 149 169 /* check it's really written */ 150 - if ((temp = i2c_inb(adap)) != get_own(adap)) { 151 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't set S0 (0x%02x).\n", temp)); 170 + temp = i2c_inb(adap); 171 + if (temp != get_own(adap)) 152 172 return -ENXIO; 153 - } 154 173 155 174 /* S1=0xA0, next byte in S2 */ 156 175 set_pcf(adap, 1, I2C_PCF_PIN | I2C_PCF_ES1); 157 176 /* check to see S2 now selected */ 158 - if (((temp = get_pcf(adap, 1)) & 0x7f) != I2C_PCF_ES1) { 159 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S2 (0x%02x).\n", temp)); 177 + temp = get_pcf(adap, 1); 178 + if ((temp & 0x7f) != I2C_PCF_ES1) 160 179 return -ENXIO; 161 - } 162 180 163 181 /* load clock register S2 */ 164 182 i2c_outb(adap, get_clock(adap)); 165 183 /* check it's really written, the only 5 lowest bits does matter */ 166 - if (((temp = i2c_inb(adap)) & 0x1f) != get_clock(adap)) { 167 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't set S2 (0x%02x).\n", temp)); 184 + temp = i2c_inb(adap); 185 + if ((temp & 0x1f) != get_clock(adap)) 168 186 return -ENXIO; 169 - } 170 187 171 188 /* Enable serial interface, idle, S0 selected */ 172 189 set_pcf(adap, 1, I2C_PCF_IDLE); 173 190 174 191 /* check to see PCF is really idled and we can access status register */ 175 - if ((temp = get_pcf(adap, 1)) != (I2C_PCF_PIN | I2C_PCF_BB)) { 176 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S1` (0x%02x).\n", temp)); 192 + temp = get_pcf(adap, 1); 193 + if (temp != (I2C_PCF_PIN | I2C_PCF_BB)) 177 194 return -ENXIO; 178 - } 179 195 180 196 printk(KERN_DEBUG "i2c-algo-pcf.o: detected and initialized PCF8584.\n"); 181 197 ··· 183 209 struct i2c_algo_pcf_data *adap = i2c_adap->algo_data; 184 210 int wrcount, status, timeout; 185 211 186 - for (wrcount=0; wrcount<count; ++wrcount) { 187 - DEB2(dev_dbg(&i2c_adap->dev, "i2c_write: writing %2.2X\n", 188 - buf[wrcount] & 0xff)); 212 + for (wrcount = 0; wrcount < count; ++wrcount) { 189 213 i2c_outb(adap, buf[wrcount]); 190 214 timeout = wait_for_pin(adap, &status); 191 215 if (timeout) { ··· 218 246 /* increment number of bytes to read by one -- read dummy byte */ 219 247 for (i = 0; i <= count; i++) { 220 248 221 - if ((wfp = wait_for_pin(adap, &status))) { 249 + wfp = wait_for_pin(adap, &status); 250 + if (wfp) { 222 251 if (wfp == -EINTR) 223 252 return -EINTR; /* arbitration lost */ 224 253 ··· 253 280 } 254 281 255 282 256 - static int pcf_doAddress(struct i2c_algo_pcf_data *adap, 283 + static void pcf_send_address(struct i2c_algo_pcf_data *adap, 257 284 struct i2c_msg *msg) 258 285 { 259 286 unsigned char addr = i2c_8bit_addr_from_msg(msg); ··· 261 288 if (msg->flags & I2C_M_REV_DIR_ADDR) 262 289 addr ^= 1; 263 290 i2c_outb(adap, addr); 264 - 265 - return 0; 266 291 } 267 292 268 293 static int pcf_xfer(struct i2c_adapter *i2c_adap, ··· 270 299 struct i2c_algo_pcf_data *adap = i2c_adap->algo_data; 271 300 struct i2c_msg *pmsg; 272 301 int i; 273 - int ret=0, timeout, status; 302 + int timeout, status; 274 303 275 304 if (adap->xfer_begin) 276 305 adap->xfer_begin(adap->data); ··· 278 307 /* Check for bus busy */ 279 308 timeout = wait_for_bb(adap); 280 309 if (timeout) { 281 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: " 282 - "Timeout waiting for BB in pcf_xfer\n");) 283 310 i = -EIO; 284 311 goto out; 285 312 } 286 313 287 - for (i = 0;ret >= 0 && i < num; i++) { 314 + for (i = 0; i < num; i++) { 315 + int ret; 316 + 288 317 pmsg = &msgs[i]; 289 - 290 - DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: Doing %s %d bytes to 0x%02x - %d of %d messages\n", 291 - str_read_write(pmsg->flags & I2C_M_RD), 292 - pmsg->len, pmsg->addr, i + 1, num);) 293 - 294 - ret = pcf_doAddress(adap, pmsg); 318 + pcf_send_address(adap, pmsg); 295 319 296 320 /* Send START */ 297 321 if (i == 0) ··· 301 335 goto out; 302 336 } 303 337 i2c_stop(adap); 304 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting " 305 - "for PIN(1) in pcf_xfer\n");) 306 338 i = -EREMOTEIO; 307 339 goto out; 308 340 } ··· 308 344 /* Check LRB (last rcvd bit - slave ack) */ 309 345 if (status & I2C_PCF_LRB) { 310 346 i2c_stop(adap); 311 - DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");) 312 347 i = -EREMOTEIO; 313 348 goto out; 314 349 } 315 350 316 - DEB3(printk(KERN_DEBUG "i2c-algo-pcf.o: Msg %d, addr=0x%x, flags=0x%x, len=%d\n", 317 - i, msgs[i].addr, msgs[i].flags, msgs[i].len);) 318 351 319 352 if (pmsg->flags & I2C_M_RD) { 320 353 ret = pcf_readbytes(i2c_adap, pmsg->buf, pmsg->len, 321 354 (i + 1 == num)); 322 - 323 - if (ret != pmsg->len) { 324 - DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: fail: " 325 - "only read %d bytes.\n",ret)); 326 - } else { 327 - DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: read %d bytes.\n",ret)); 328 - } 329 355 } else { 330 356 ret = pcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len, 331 357 (i + 1 == num)); 332 - 333 - if (ret != pmsg->len) { 334 - DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: fail: " 335 - "only wrote %d bytes.\n",ret)); 336 - } else { 337 - DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: wrote %d bytes.\n",ret)); 338 - } 339 358 } 359 + 360 + if (ret < 0) 361 + goto out; 340 362 } 341 363 342 364 out: ··· 351 401 struct i2c_algo_pcf_data *pcf_adap = adap->algo_data; 352 402 int rval; 353 403 354 - DEB2(dev_dbg(&adap->dev, "hw routines registered.\n")); 355 - 356 404 /* register new adapter to i2c module... */ 357 405 adap->algo = &pcf_algo; 358 406 359 - if ((rval = pcf_init_8584(pcf_adap))) 407 + rval = pcf_init_8584(pcf_adap); 408 + if (rval) 360 409 return rval; 361 410 362 411 rval = i2c_add_adapter(adap); ··· 367 418 MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>"); 368 419 MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm"); 369 420 MODULE_LICENSE("GPL"); 370 - 371 - module_param(i2c_debug, int, S_IRUGO | S_IWUSR); 372 - MODULE_PARM_DESC(i2c_debug, 373 - "debug level - 0 off; 1 normal; 2,3 more verbose; 9 pcf-protocol");
+1
drivers/i2c/busses/Kconfig
··· 166 166 Arrow Lake (SOC) 167 167 Panther Lake (SOC) 168 168 Wildcat Lake (SOC) 169 + Diamond Rapids (SOC) 169 170 170 171 This driver can also be built as a module. If so, the module 171 172 will be called i2c-i801.
+4 -1
drivers/i2c/busses/i2c-amd-mp2-pci.c
··· 458 458 { 459 459 struct device *dev; 460 460 struct pci_dev *pci_dev; 461 + struct amd_mp2_dev *mp2_dev; 461 462 462 463 dev = driver_find_next_device(&amd_mp2_pci_driver.driver, NULL); 463 464 if (!dev) 464 465 return NULL; 465 466 466 467 pci_dev = to_pci_dev(dev); 467 - return (struct amd_mp2_dev *)pci_get_drvdata(pci_dev); 468 + mp2_dev = (struct amd_mp2_dev *)pci_get_drvdata(pci_dev); 469 + put_device(dev); 470 + return mp2_dev; 468 471 } 469 472 EXPORT_SYMBOL_GPL(amd_mp2_find_device); 470 473
+7 -5
drivers/i2c/busses/i2c-bcm2835.c
··· 137 137 return 0; 138 138 } 139 139 140 - static long clk_bcm2835_i2c_round_rate(struct clk_hw *hw, unsigned long rate, 141 - unsigned long *parent_rate) 140 + static int clk_bcm2835_i2c_determine_rate(struct clk_hw *hw, 141 + struct clk_rate_request *req) 142 142 { 143 - u32 divider = clk_bcm2835_i2c_calc_divider(rate, *parent_rate); 143 + u32 divider = clk_bcm2835_i2c_calc_divider(req->rate, req->best_parent_rate); 144 144 145 - return DIV_ROUND_UP(*parent_rate, divider); 145 + req->rate = DIV_ROUND_UP(req->best_parent_rate, divider); 146 + 147 + return 0; 146 148 } 147 149 148 150 static unsigned long clk_bcm2835_i2c_recalc_rate(struct clk_hw *hw, ··· 158 156 159 157 static const struct clk_ops clk_bcm2835_i2c_ops = { 160 158 .set_rate = clk_bcm2835_i2c_set_rate, 161 - .round_rate = clk_bcm2835_i2c_round_rate, 159 + .determine_rate = clk_bcm2835_i2c_determine_rate, 162 160 .recalc_rate = clk_bcm2835_i2c_recalc_rate, 163 161 }; 164 162
+1 -1
drivers/i2c/busses/i2c-designware-core.h
··· 78 78 #define DW_IC_TX_ABRT_SOURCE 0x80 79 79 #define DW_IC_ENABLE_STATUS 0x9c 80 80 #define DW_IC_CLR_RESTART_DET 0xa8 81 + #define DW_IC_SMBUS_INTR_MASK 0xcc 81 82 #define DW_IC_COMP_PARAM_1 0xf4 82 83 #define DW_IC_COMP_VERSION 0xf8 83 84 #define DW_IC_SDA_HOLD_MIN_VERS 0x3131312A /* "111*" == v1.11* */ ··· 331 330 332 331 struct i2c_dw_semaphore_callbacks { 333 332 int (*probe)(struct dw_i2c_dev *dev); 334 - void (*remove)(struct dw_i2c_dev *dev); 335 333 }; 336 334 337 335 int i2c_dw_init_regmap(struct dw_i2c_dev *dev);
+7
drivers/i2c/busses/i2c-designware-master.c
··· 220 220 /* Disable the adapter */ 221 221 __i2c_dw_disable(dev); 222 222 223 + /* 224 + * Mask SMBus interrupts to block storms from broken 225 + * firmware that leaves IC_SMBUS=1; the handler never 226 + * services them. 227 + */ 228 + regmap_write(dev->map, DW_IC_SMBUS_INTR_MASK, 0); 229 + 223 230 /* Write standard speed timing parameters */ 224 231 regmap_write(dev->map, DW_IC_SS_SCL_HCNT, dev->ss_hcnt); 225 232 regmap_write(dev->map, DW_IC_SS_SCL_LCNT, dev->ss_lcnt);
+1 -12
drivers/i2c/busses/i2c-designware-platdrv.c
··· 197 197 return 0; 198 198 } 199 199 200 - static void i2c_dw_remove_lock_support(struct dw_i2c_dev *dev) 201 - { 202 - if (dev->semaphore_idx < 0) 203 - return; 204 - 205 - if (i2c_dw_semaphore_cb_table[dev->semaphore_idx].remove) 206 - i2c_dw_semaphore_cb_table[dev->semaphore_idx].remove(dev); 207 - } 208 - 209 200 static int dw_i2c_plat_probe(struct platform_device *pdev) 210 201 { 211 202 u32 flags = (uintptr_t)device_get_match_data(&pdev->dev); ··· 239 248 240 249 ret = i2c_dw_probe_lock_support(dev); 241 250 if (ret) { 242 - ret = dev_err_probe(device, ret, "failed to probe lock support\n"); 251 + dev_err_probe(device, ret, "failed to probe lock support\n"); 243 252 goto exit_reset; 244 253 } 245 254 ··· 329 338 dw_i2c_plat_pm_cleanup(dev); 330 339 331 340 i2c_dw_prepare_clk(dev, false); 332 - 333 - i2c_dw_remove_lock_support(dev); 334 341 335 342 reset_control_assert(dev->rst); 336 343 }
+3
drivers/i2c/busses/i2c-i801.c
··· 84 84 * Panther Lake-H (SOC) 0xe322 32 hard yes yes yes 85 85 * Panther Lake-P (SOC) 0xe422 32 hard yes yes yes 86 86 * Wildcat Lake-U (SOC) 0x4d22 32 hard yes yes yes 87 + * Diamond Rapids (SOC) 0x5827 32 hard yes yes yes 87 88 * 88 89 * Features supported by this driver: 89 90 * Software PEC no ··· 243 242 #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_P_SMBUS 0x51a3 244 243 #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_M_SMBUS 0x54a3 245 244 #define PCI_DEVICE_ID_INTEL_BIRCH_STREAM_SMBUS 0x5796 245 + #define PCI_DEVICE_ID_INTEL_DIAMOND_RAPIDS_SMBUS 0x5827 246 246 #define PCI_DEVICE_ID_INTEL_BROXTON_SMBUS 0x5ad4 247 247 #define PCI_DEVICE_ID_INTEL_ARROW_LAKE_H_SMBUS 0x7722 248 248 #define PCI_DEVICE_ID_INTEL_RAPTOR_LAKE_S_SMBUS 0x7a23 ··· 1056 1054 { PCI_DEVICE_DATA(INTEL, METEOR_LAKE_SOC_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, 1057 1055 { PCI_DEVICE_DATA(INTEL, METEOR_LAKE_PCH_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, 1058 1056 { PCI_DEVICE_DATA(INTEL, BIRCH_STREAM_SMBUS, FEATURES_ICH5) }, 1057 + { PCI_DEVICE_DATA(INTEL, DIAMOND_RAPIDS_SMBUS, FEATURES_ICH5) }, 1059 1058 { PCI_DEVICE_DATA(INTEL, ARROW_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, 1060 1059 { PCI_DEVICE_DATA(INTEL, PANTHER_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) }, 1061 1060 { PCI_DEVICE_DATA(INTEL, PANTHER_LAKE_P_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
+13 -6
drivers/i2c/busses/i2c-k1.c
··· 158 158 { 159 159 dev_dbg(i2c->dev, "i2c error status: 0x%08x\n", i2c->status); 160 160 161 - if (i2c->status & (SPACEMIT_SR_BED | SPACEMIT_SR_ALD)) { 161 + /* Arbitration Loss Detected */ 162 + if (i2c->status & SPACEMIT_SR_ALD) { 162 163 spacemit_i2c_reset(i2c); 163 164 return -EAGAIN; 164 165 } 166 + 167 + /* Bus Error No ACK/NAK */ 168 + if (i2c->status & SPACEMIT_SR_BED) 169 + spacemit_i2c_reset(i2c); 165 170 166 171 return i2c->status & SPACEMIT_SR_ACKNAK ? -ENXIO : -EIO; 167 172 } ··· 229 224 } 230 225 } 231 226 227 + static inline void 228 + spacemit_i2c_clear_int_status(struct spacemit_i2c_dev *i2c, u32 mask) 229 + { 230 + writel(mask & SPACEMIT_I2C_INT_STATUS_MASK, i2c->base + SPACEMIT_ISR); 231 + } 232 + 232 233 static void spacemit_i2c_init(struct spacemit_i2c_dev *i2c) 233 234 { 234 235 u32 val; ··· 278 267 val = readl(i2c->base + SPACEMIT_IRCR); 279 268 val |= SPACEMIT_RCR_SDA_GLITCH_NOFIX; 280 269 writel(val, i2c->base + SPACEMIT_IRCR); 281 - } 282 270 283 - static inline void 284 - spacemit_i2c_clear_int_status(struct spacemit_i2c_dev *i2c, u32 mask) 285 - { 286 - writel(mask & SPACEMIT_I2C_INT_STATUS_MASK, i2c->base + SPACEMIT_ISR); 271 + spacemit_i2c_clear_int_status(i2c, SPACEMIT_I2C_INT_STATUS_MASK); 287 272 } 288 273 289 274 static void spacemit_i2c_start(struct spacemit_i2c_dev *i2c)
+3 -4
drivers/i2c/busses/i2c-stm32.c
··· 27 27 if (IS_ERR(dma->chan_tx)) { 28 28 ret = PTR_ERR(dma->chan_tx); 29 29 if (ret != -ENODEV) 30 - ret = dev_err_probe(dev, ret, 31 - "can't request DMA tx channel\n"); 30 + dev_err_probe(dev, ret, "can't request DMA tx channel\n"); 31 + 32 32 goto fail_al; 33 33 } 34 34 ··· 48 48 if (IS_ERR(dma->chan_rx)) { 49 49 ret = PTR_ERR(dma->chan_rx); 50 50 if (ret != -ENODEV) 51 - ret = dev_err_probe(dev, ret, 52 - "can't request DMA rx channel\n"); 51 + dev_err_probe(dev, ret, "can't request DMA rx channel\n"); 53 52 54 53 goto fail_tx; 55 54 }