diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-30 13:04:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-30 13:04:28 -0400 |
commit | cef0aa0ce8592f68fb093b2be0d341a568ff9890 (patch) | |
tree | 9bd2d26d5f12c81f470c5f61d6fd0345a98362c6 | |
parent | cf4f493b102399adea3cf65cdde7161c17fb605c (diff) | |
parent | 9bfd7319e8d353b8b81c4cfd4d7eced71adbfbb5 (diff) |
Merge tag 'armsoc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
Pull ARM SoC fixes from Olof Johansson:
"A few fixes that have trickled in through the merge window:
- Video fixes for OMAP due to panel-dpi driver removal
- Clock fixes for OMAP that broke no-idle quirks + nfsroot on DRA7
- Fixing arch version on ASpeed ast2500
- Two fixes for reset handling on ARM SCMI"
* tag 'armsoc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc:
ARM: aspeed: ast2500 is ARMv6K
reset: reset-scmi: add missing handle initialisation
firmware: arm_scmi: reset: fix reset_state assignment in scmi_domain_reset
bus: ti-sysc: Remove unpaired sysc_clkdm_deny_idle()
ARM: dts: logicpd-som-lv: Fix i2c2 and i2c3 Pin mux
ARM: dts: am3517-evm: Fix missing video
ARM: dts: logicpd-torpedo-baseboard: Fix missing video
ARM: omap2plus_defconfig: Fix missing video
bus: ti-sysc: Fix handling of invalid clocks
bus: ti-sysc: Fix clock handling for no-idle quirks
-rw-r--r-- | arch/arm/boot/dts/am3517-evm.dts | 23 | ||||
-rw-r--r-- | arch/arm/boot/dts/logicpd-som-lv.dtsi | 26 | ||||
-rw-r--r-- | arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | 37 | ||||
-rw-r--r-- | arch/arm/configs/omap2plus_defconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-aspeed/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/pdata-quirks.c | 4 | ||||
-rw-r--r-- | drivers/bus/ti-sysc.c | 52 | ||||
-rw-r--r-- | drivers/firmware/arm_scmi/reset.c | 2 | ||||
-rw-r--r-- | drivers/reset/reset-scmi.c | 1 |
9 files changed, 66 insertions, 81 deletions
diff --git a/arch/arm/boot/dts/am3517-evm.dts b/arch/arm/boot/dts/am3517-evm.dts index ebfe28c2f544..a1fd3e63e86e 100644 --- a/arch/arm/boot/dts/am3517-evm.dts +++ b/arch/arm/boot/dts/am3517-evm.dts | |||
@@ -124,10 +124,11 @@ | |||
124 | }; | 124 | }; |
125 | 125 | ||
126 | lcd0: display@0 { | 126 | lcd0: display@0 { |
127 | compatible = "panel-dpi"; | 127 | /* This isn't the exact LCD, but the timings meet spec */ |
128 | /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ | ||
129 | compatible = "newhaven,nhd-4.3-480272ef-atxl"; | ||
128 | label = "15"; | 130 | label = "15"; |
129 | status = "okay"; | 131 | backlight = <&bl>; |
130 | pinctrl-names = "default"; | ||
131 | enable-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>; /* gpio176, lcd INI */ | 132 | enable-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>; /* gpio176, lcd INI */ |
132 | vcc-supply = <&vdd_io_reg>; | 133 | vcc-supply = <&vdd_io_reg>; |
133 | 134 | ||
@@ -136,22 +137,6 @@ | |||
136 | remote-endpoint = <&dpi_out>; | 137 | remote-endpoint = <&dpi_out>; |
137 | }; | 138 | }; |
138 | }; | 139 | }; |
139 | |||
140 | panel-timing { | ||
141 | clock-frequency = <9000000>; | ||
142 | hactive = <480>; | ||
143 | vactive = <272>; | ||
144 | hfront-porch = <3>; | ||
145 | hback-porch = <2>; | ||
146 | hsync-len = <42>; | ||
147 | vback-porch = <3>; | ||
148 | vfront-porch = <4>; | ||
149 | vsync-len = <11>; | ||
150 | hsync-active = <0>; | ||
151 | vsync-active = <0>; | ||
152 | de-active = <1>; | ||
153 | pixelclk-active = <1>; | ||
154 | }; | ||
155 | }; | 140 | }; |
156 | 141 | ||
157 | bl: backlight { | 142 | bl: backlight { |
diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi index 5563ee54c960..b56524cc7fe2 100644 --- a/arch/arm/boot/dts/logicpd-som-lv.dtsi +++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi | |||
@@ -228,6 +228,20 @@ | |||
228 | >; | 228 | >; |
229 | }; | 229 | }; |
230 | 230 | ||
231 | i2c2_pins: pinmux_i2c2_pins { | ||
232 | pinctrl-single,pins = < | ||
233 | OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT | MUX_MODE0) /* i2c2_scl */ | ||
234 | OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT | MUX_MODE0) /* i2c2_sda */ | ||
235 | >; | ||
236 | }; | ||
237 | |||
238 | i2c3_pins: pinmux_i2c3_pins { | ||
239 | pinctrl-single,pins = < | ||
240 | OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT | MUX_MODE0) /* i2c3_scl */ | ||
241 | OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT | MUX_MODE0) /* i2c3_sda */ | ||
242 | >; | ||
243 | }; | ||
244 | |||
231 | tsc2004_pins: pinmux_tsc2004_pins { | 245 | tsc2004_pins: pinmux_tsc2004_pins { |
232 | pinctrl-single,pins = < | 246 | pinctrl-single,pins = < |
233 | OMAP3_CORE1_IOPAD(0x2186, PIN_INPUT | MUX_MODE4) /* mcbsp4_dr.gpio_153 */ | 247 | OMAP3_CORE1_IOPAD(0x2186, PIN_INPUT | MUX_MODE4) /* mcbsp4_dr.gpio_153 */ |
@@ -249,18 +263,6 @@ | |||
249 | OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */ | 263 | OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */ |
250 | >; | 264 | >; |
251 | }; | 265 | }; |
252 | i2c2_pins: pinmux_i2c2_pins { | ||
253 | pinctrl-single,pins = < | ||
254 | OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT | MUX_MODE0) /* i2c2_scl */ | ||
255 | OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT | MUX_MODE0) /* i2c2_sda */ | ||
256 | >; | ||
257 | }; | ||
258 | i2c3_pins: pinmux_i2c3_pins { | ||
259 | pinctrl-single,pins = < | ||
260 | OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT | MUX_MODE0) /* i2c3_scl */ | ||
261 | OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT | MUX_MODE0) /* i2c3_sda */ | ||
262 | >; | ||
263 | }; | ||
264 | }; | 266 | }; |
265 | 267 | ||
266 | &omap3_pmx_core2 { | 268 | &omap3_pmx_core2 { |
diff --git a/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi b/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi index 642e809e757a..449cc7616da6 100644 --- a/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi +++ b/arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | |||
@@ -108,7 +108,6 @@ | |||
108 | &dss { | 108 | &dss { |
109 | status = "ok"; | 109 | status = "ok"; |
110 | vdds_dsi-supply = <&vpll2>; | 110 | vdds_dsi-supply = <&vpll2>; |
111 | vdda_video-supply = <&video_reg>; | ||
112 | pinctrl-names = "default"; | 111 | pinctrl-names = "default"; |
113 | pinctrl-0 = <&dss_dpi_pins1>; | 112 | pinctrl-0 = <&dss_dpi_pins1>; |
114 | port { | 113 | port { |
@@ -124,44 +123,20 @@ | |||
124 | display0 = &lcd0; | 123 | display0 = &lcd0; |
125 | }; | 124 | }; |
126 | 125 | ||
127 | video_reg: video_reg { | ||
128 | pinctrl-names = "default"; | ||
129 | pinctrl-0 = <&panel_pwr_pins>; | ||
130 | compatible = "regulator-fixed"; | ||
131 | regulator-name = "fixed-supply"; | ||
132 | regulator-min-microvolt = <3300000>; | ||
133 | regulator-max-microvolt = <3300000>; | ||
134 | gpio = <&gpio5 27 GPIO_ACTIVE_HIGH>; /* gpio155, lcd INI */ | ||
135 | }; | ||
136 | |||
137 | lcd0: display { | 126 | lcd0: display { |
138 | compatible = "panel-dpi"; | 127 | /* This isn't the exact LCD, but the timings meet spec */ |
128 | /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ | ||
129 | compatible = "newhaven,nhd-4.3-480272ef-atxl"; | ||
139 | label = "15"; | 130 | label = "15"; |
140 | status = "okay"; | ||
141 | /* default-on; */ | ||
142 | pinctrl-names = "default"; | 131 | pinctrl-names = "default"; |
143 | 132 | pinctrl-0 = <&panel_pwr_pins>; | |
133 | backlight = <&bl>; | ||
134 | enable-gpios = <&gpio5 27 GPIO_ACTIVE_HIGH>; | ||
144 | port { | 135 | port { |
145 | lcd_in: endpoint { | 136 | lcd_in: endpoint { |
146 | remote-endpoint = <&dpi_out>; | 137 | remote-endpoint = <&dpi_out>; |
147 | }; | 138 | }; |
148 | }; | 139 | }; |
149 | |||
150 | panel-timing { | ||
151 | clock-frequency = <9000000>; | ||
152 | hactive = <480>; | ||
153 | vactive = <272>; | ||
154 | hfront-porch = <3>; | ||
155 | hback-porch = <2>; | ||
156 | hsync-len = <42>; | ||
157 | vback-porch = <3>; | ||
158 | vfront-porch = <4>; | ||
159 | vsync-len = <11>; | ||
160 | hsync-active = <0>; | ||
161 | vsync-active = <0>; | ||
162 | de-active = <1>; | ||
163 | pixelclk-active = <1>; | ||
164 | }; | ||
165 | }; | 140 | }; |
166 | 141 | ||
167 | bl: backlight { | 142 | bl: backlight { |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index c7bf9c493646..64eb896907bf 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -363,6 +363,7 @@ CONFIG_DRM_OMAP_PANEL_TPO_TD028TTEC1=m | |||
363 | CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m | 363 | CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m |
364 | CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m | 364 | CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m |
365 | CONFIG_DRM_TILCDC=m | 365 | CONFIG_DRM_TILCDC=m |
366 | CONFIG_DRM_PANEL_SIMPLE=m | ||
366 | CONFIG_FB=y | 367 | CONFIG_FB=y |
367 | CONFIG_FIRMWARE_EDID=y | 368 | CONFIG_FIRMWARE_EDID=y |
368 | CONFIG_FB_MODE_HELPERS=y | 369 | CONFIG_FB_MODE_HELPERS=y |
diff --git a/arch/arm/mach-aspeed/Kconfig b/arch/arm/mach-aspeed/Kconfig index 56007b0b6120..e8d6e9957d65 100644 --- a/arch/arm/mach-aspeed/Kconfig +++ b/arch/arm/mach-aspeed/Kconfig | |||
@@ -26,7 +26,6 @@ config MACH_ASPEED_G4 | |||
26 | config MACH_ASPEED_G5 | 26 | config MACH_ASPEED_G5 |
27 | bool "Aspeed SoC 5th Generation" | 27 | bool "Aspeed SoC 5th Generation" |
28 | depends on ARCH_MULTI_V6 | 28 | depends on ARCH_MULTI_V6 |
29 | select CPU_V6 | ||
30 | select PINCTRL_ASPEED_G5 | 29 | select PINCTRL_ASPEED_G5 |
31 | select FTTMR010_TIMER | 30 | select FTTMR010_TIMER |
32 | help | 31 | help |
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c index 6c6f8fce854e..d942a3357090 100644 --- a/arch/arm/mach-omap2/pdata-quirks.c +++ b/arch/arm/mach-omap2/pdata-quirks.c | |||
@@ -491,11 +491,11 @@ static int ti_sysc_clkdm_init(struct device *dev, | |||
491 | struct clk *fck, struct clk *ick, | 491 | struct clk *fck, struct clk *ick, |
492 | struct ti_sysc_cookie *cookie) | 492 | struct ti_sysc_cookie *cookie) |
493 | { | 493 | { |
494 | if (fck) | 494 | if (!IS_ERR(fck)) |
495 | cookie->clkdm = ti_sysc_find_one_clockdomain(fck); | 495 | cookie->clkdm = ti_sysc_find_one_clockdomain(fck); |
496 | if (cookie->clkdm) | 496 | if (cookie->clkdm) |
497 | return 0; | 497 | return 0; |
498 | if (ick) | 498 | if (!IS_ERR(ick)) |
499 | cookie->clkdm = ti_sysc_find_one_clockdomain(ick); | 499 | cookie->clkdm = ti_sysc_find_one_clockdomain(ick); |
500 | if (cookie->clkdm) | 500 | if (cookie->clkdm) |
501 | return 0; | 501 | return 0; |
diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c index 9207ac291341..ad50efb470aa 100644 --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c | |||
@@ -280,9 +280,6 @@ static int sysc_get_one_clock(struct sysc *ddata, const char *name) | |||
280 | 280 | ||
281 | ddata->clocks[index] = devm_clk_get(ddata->dev, name); | 281 | ddata->clocks[index] = devm_clk_get(ddata->dev, name); |
282 | if (IS_ERR(ddata->clocks[index])) { | 282 | if (IS_ERR(ddata->clocks[index])) { |
283 | if (PTR_ERR(ddata->clocks[index]) == -ENOENT) | ||
284 | return 0; | ||
285 | |||
286 | dev_err(ddata->dev, "clock get error for %s: %li\n", | 283 | dev_err(ddata->dev, "clock get error for %s: %li\n", |
287 | name, PTR_ERR(ddata->clocks[index])); | 284 | name, PTR_ERR(ddata->clocks[index])); |
288 | 285 | ||
@@ -357,7 +354,7 @@ static int sysc_get_clocks(struct sysc *ddata) | |||
357 | continue; | 354 | continue; |
358 | 355 | ||
359 | error = sysc_get_one_clock(ddata, name); | 356 | error = sysc_get_one_clock(ddata, name); |
360 | if (error && error != -ENOENT) | 357 | if (error) |
361 | return error; | 358 | return error; |
362 | } | 359 | } |
363 | 360 | ||
@@ -1632,17 +1629,19 @@ static int sysc_init_module(struct sysc *ddata) | |||
1632 | if (error) | 1629 | if (error) |
1633 | return error; | 1630 | return error; |
1634 | 1631 | ||
1635 | if (manage_clocks) { | 1632 | sysc_clkdm_deny_idle(ddata); |
1636 | sysc_clkdm_deny_idle(ddata); | ||
1637 | 1633 | ||
1638 | error = sysc_enable_opt_clocks(ddata); | 1634 | /* |
1639 | if (error) | 1635 | * Always enable clocks. The bootloader may or may not have enabled |
1640 | return error; | 1636 | * the related clocks. |
1637 | */ | ||
1638 | error = sysc_enable_opt_clocks(ddata); | ||
1639 | if (error) | ||
1640 | return error; | ||
1641 | 1641 | ||
1642 | error = sysc_enable_main_clocks(ddata); | 1642 | error = sysc_enable_main_clocks(ddata); |
1643 | if (error) | 1643 | if (error) |
1644 | goto err_opt_clocks; | 1644 | goto err_opt_clocks; |
1645 | } | ||
1646 | 1645 | ||
1647 | if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) { | 1646 | if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) { |
1648 | error = sysc_rstctrl_reset_deassert(ddata, true); | 1647 | error = sysc_rstctrl_reset_deassert(ddata, true); |
@@ -1660,7 +1659,7 @@ static int sysc_init_module(struct sysc *ddata) | |||
1660 | goto err_main_clocks; | 1659 | goto err_main_clocks; |
1661 | } | 1660 | } |
1662 | 1661 | ||
1663 | if (!ddata->legacy_mode && manage_clocks) { | 1662 | if (!ddata->legacy_mode) { |
1664 | error = sysc_enable_module(ddata->dev); | 1663 | error = sysc_enable_module(ddata->dev); |
1665 | if (error) | 1664 | if (error) |
1666 | goto err_main_clocks; | 1665 | goto err_main_clocks; |
@@ -1677,6 +1676,7 @@ err_main_clocks: | |||
1677 | if (manage_clocks) | 1676 | if (manage_clocks) |
1678 | sysc_disable_main_clocks(ddata); | 1677 | sysc_disable_main_clocks(ddata); |
1679 | err_opt_clocks: | 1678 | err_opt_clocks: |
1679 | /* No re-enable of clockdomain autoidle to prevent module autoidle */ | ||
1680 | if (manage_clocks) { | 1680 | if (manage_clocks) { |
1681 | sysc_disable_opt_clocks(ddata); | 1681 | sysc_disable_opt_clocks(ddata); |
1682 | sysc_clkdm_allow_idle(ddata); | 1682 | sysc_clkdm_allow_idle(ddata); |
@@ -2357,6 +2357,27 @@ static void ti_sysc_idle(struct work_struct *work) | |||
2357 | 2357 | ||
2358 | ddata = container_of(work, struct sysc, idle_work.work); | 2358 | ddata = container_of(work, struct sysc, idle_work.work); |
2359 | 2359 | ||
2360 | /* | ||
2361 | * One time decrement of clock usage counts if left on from init. | ||
2362 | * Note that we disable opt clocks unconditionally in this case | ||
2363 | * as they are enabled unconditionally during init without | ||
2364 | * considering sysc_opt_clks_needed() at that point. | ||
2365 | */ | ||
2366 | if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE | | ||
2367 | SYSC_QUIRK_NO_IDLE_ON_INIT)) { | ||
2368 | sysc_disable_main_clocks(ddata); | ||
2369 | sysc_disable_opt_clocks(ddata); | ||
2370 | sysc_clkdm_allow_idle(ddata); | ||
2371 | } | ||
2372 | |||
2373 | /* Keep permanent PM runtime usage count for SYSC_QUIRK_NO_IDLE */ | ||
2374 | if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE) | ||
2375 | return; | ||
2376 | |||
2377 | /* | ||
2378 | * Decrement PM runtime usage count for SYSC_QUIRK_NO_IDLE_ON_INIT | ||
2379 | * and SYSC_QUIRK_NO_RESET_ON_INIT | ||
2380 | */ | ||
2360 | if (pm_runtime_active(ddata->dev)) | 2381 | if (pm_runtime_active(ddata->dev)) |
2361 | pm_runtime_put_sync(ddata->dev); | 2382 | pm_runtime_put_sync(ddata->dev); |
2362 | } | 2383 | } |
@@ -2445,7 +2466,8 @@ static int sysc_probe(struct platform_device *pdev) | |||
2445 | INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle); | 2466 | INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle); |
2446 | 2467 | ||
2447 | /* At least earlycon won't survive without deferred idle */ | 2468 | /* At least earlycon won't survive without deferred idle */ |
2448 | if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE_ON_INIT | | 2469 | if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE | |
2470 | SYSC_QUIRK_NO_IDLE_ON_INIT | | ||
2449 | SYSC_QUIRK_NO_RESET_ON_INIT)) { | 2471 | SYSC_QUIRK_NO_RESET_ON_INIT)) { |
2450 | schedule_delayed_work(&ddata->idle_work, 3000); | 2472 | schedule_delayed_work(&ddata->idle_work, 3000); |
2451 | } else { | 2473 | } else { |
diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c index 64cc81915581..ab42c21c5517 100644 --- a/drivers/firmware/arm_scmi/reset.c +++ b/drivers/firmware/arm_scmi/reset.c | |||
@@ -150,7 +150,7 @@ static int scmi_domain_reset(const struct scmi_handle *handle, u32 domain, | |||
150 | dom = t->tx.buf; | 150 | dom = t->tx.buf; |
151 | dom->domain_id = cpu_to_le32(domain); | 151 | dom->domain_id = cpu_to_le32(domain); |
152 | dom->flags = cpu_to_le32(flags); | 152 | dom->flags = cpu_to_le32(flags); |
153 | dom->domain_id = cpu_to_le32(state); | 153 | dom->reset_state = cpu_to_le32(state); |
154 | 154 | ||
155 | if (rdom->async_reset) | 155 | if (rdom->async_reset) |
156 | ret = scmi_do_xfer_with_response(handle, t); | 156 | ret = scmi_do_xfer_with_response(handle, t); |
diff --git a/drivers/reset/reset-scmi.c b/drivers/reset/reset-scmi.c index c6d3c8427f14..b46df80ec6c3 100644 --- a/drivers/reset/reset-scmi.c +++ b/drivers/reset/reset-scmi.c | |||
@@ -102,6 +102,7 @@ static int scmi_reset_probe(struct scmi_device *sdev) | |||
102 | data->rcdev.owner = THIS_MODULE; | 102 | data->rcdev.owner = THIS_MODULE; |
103 | data->rcdev.of_node = np; | 103 | data->rcdev.of_node = np; |
104 | data->rcdev.nr_resets = handle->reset_ops->num_domains_get(handle); | 104 | data->rcdev.nr_resets = handle->reset_ops->num_domains_get(handle); |
105 | data->handle = handle; | ||
105 | 106 | ||
106 | return devm_reset_controller_register(dev, &data->rcdev); | 107 | return devm_reset_controller_register(dev, &data->rcdev); |
107 | } | 108 | } |