Re: [alsa-devel] Fwd: [PATCH 1/1] SPI : spi-pxa2xx : fix spi init of WM510205 codec via ACPI (resend)

Mika Westerberg
2015-08-20T11:58:45Z

On Thu, Aug 20, 2015 at 01:34:00PM +0200, Christian Hartmann wrote:
> Hi,
>
> 2015-08-20 11:45 GMT+02:00 Mika Westerberg <mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>:
> > devm_gpiod_get_optional() returns GPIO descriptor which should not be
> > cast to anything else. If you want to get the numberic value for
> > logging purposes you can call desc_to_gpio(desc) for the returned
> > descriptor.
>
>
> that done, it looks much better. thank you, Mika
>
> I got a new error instead for the LDO1 as seen below:
>
> [ 5.951646] arizona spi-WM510205:00: GPIO lookup for consumer reset
> [ 5.951650] arizona spi-WM510205:00: using ACPI for GPIO lookup
> [ 5.951656] acpi WM510205:00: GPIO: looking up reset-gpios
> [ 5.951663] acpi WM510205:00: GPIO: _DSD returned WM510205:00 3 1 0 0
> [ 5.951779] acpi WM510205:00: GPIO: looking up 0 in _CRS
> [ 5.951831] arizona spi-WM510205:00: GPIO lookup for consumer ldoena
> [ 5.951838] arizona spi-WM510205:00: using ACPI for GPIO lookup
> [ 5.951843] acpi WM510205:00: GPIO: looking up ldoena-gpios
> [ 5.951852] acpi WM510205:00: GPIO: _DSD returned WM510205:00 3 2 0 0
> [ 5.951909] acpi WM510205:00: GPIO: looking up 0 in _CRS
> [ 5.951975] arizona spi-WM510205:00: arizona_of_get_core_pdata
> (ACPI) using irq_gpio GPIO = 146
> [ 5.951980] arizona spi-WM510205:00: arizona_of_get_core_pdata
> (ACPI) using ldoena GPIO = 405
> [ 5.951985] arizona spi-WM510205:00: arizona_of_get_core_pdata
> (ACPI) using reset GPIO = 342
> [ 5.951989] arizona spi-WM510205:00: arizona_of_get_core_pdata for 1
> [ 5.951994] arizona spi-WM510205:00: regcache_cache_only for 1 set
> [ 5.951999] arizona spi-WM510205:00: added wm5102_core_supplies for 1
> [ 5.952283] arizona spi-WM510205:00: mfd_add_devices done for 1
> [ 5.952291] spi-WM510205:00 supply AVDD not found, using dummy regulator
> [ 5.952338] spi-WM510205:00 supply DBVDD1 not found, using dummy regulator
> [ 5.952381] arizona spi-WM510205:00: devm_regulator_bulk_get done for 1
> [ 5.952387] LDO1: supplied by regulator-dummy
> [ 5.952452] arizona spi-WM510205:00: regulator_get done for 1
> [ 5.952457] ------------[ cut here ]------------
> [ 5.952469] WARNING: CPU: 3 PID: 464 at drivers/gpio/gpiolib.c:86
> gpio_to_desc+0xbb/0xd0()
> [ 5.952472] invalid GPIO -184850384
> [ 5.952475] Modules linked in: int3400_thermal(+)
> int3403_thermal(+) processor_thermal_device(+)
> snd_soc_sst_mfld_platform int3402_thermal in
> t340x_thermal_zone rfkill_gpio acpi_thermal_rel intel_soc_dts_iosf
> acpi_pad spi_pxa2xx_platform(+) i2c_designware_platform(+) rfkill
> pwm_lpss_pl
> atform snd_soc_sst_acpi pwm_lpss i2c_designware_core ax88179_178a usbnet i2c_hid
> [ 5.952510] CPU: 3 PID: 464 Comm: systemd-udevd Not tainted 4.2.0.84-rc7 #252
> [ 5.952513] Hardware name: LENOVO 60072/INVALID, BIOS 02WT18WW 08/01/2014
> [ 5.952517] c0e619a7 b4cc43d7 00000000 f3687974 c0b606c4 f36879b4
> f36879a4 c044cad8
> [ 5.952528] c0d90c73 f36879d4 000001d0 c0d90c84 00000056 c0711d6b
> c0711d6b c0ebf250
> [ 5.952538] f4fb6830 f4fb6830 f36879c0 c044cb4f 00000009 f36879b4
> c0d90c73 f36879d4
> [ 5.952548] Call Trace:
> [ 5.952558] [<c0b606c4>] dump_stack+0x41/0x52
> [ 5.952565] [<c044cad8>] warn_slowpath_common+0x88/0xc0
> [ 5.952570] [<c0711d6b>] ? gpio_to_desc+0xbb/0xd0
> [ 5.952575] [<c0711d6b>] ? gpio_to_desc+0xbb/0xd0
> [ 5.952579] [<c044cb4f>] warn_slowpath_fmt+0x3f/0x60
> [ 5.952584] [<c0711d6b>] gpio_to_desc+0xbb/0xd0
> [ 5.952590] [<c0713f7b>] gpio_request_one+0x1b/0xf0
> [ 5.952595] [<c0710da3>] devm_gpio_request_one+0x43/0x80
> [ 5.952602] [<c08e6de7>] arizona_dev_init+0x257/0xc90
> [ 5.952607] [<c077bf65>] ? acpi_get_data_full+0x68/0x77
> [ 5.952614] [<c08c46e9>] ? dev_err+0x39/0x60
> [ 5.952619] [<c08e8635>] arizona_spi_probe+0x195/0x240
> [ 5.952625] [<c075c016>] ? acpi_dev_pm_attach+0x57/0x79
> [ 5.952632] [<c092e286>] spi_drv_probe+0x36/0x60
> [ 5.952640] [<c08c7faa>] driver_probe_device+0x1ca/0x410
> [ 5.952646] [<c075e61b>] ? acpi_driver_match_device+0x36/0x3f
> [ 5.952651] [<c092eab2>] ? spi_match_device+0x22/0x70
> [ 5.952655] [<c08c82fb>] __device_attach_driver+0x5b/0x70
> [ 5.952660] [<c08c82a0>] ? driver_allows_async_probing+0x30/0x30
> [ 5.952665] [<c08c6197>] bus_for_each_drv+0x57/0xa0
> [ 5.952670] [<c08c7d02>] __device_attach+0xb2/0x120
> [ 5.952674] [<c08c82a0>] ? driver_allows_async_probing+0x30/0x30
> [ 5.952679] [<c08c8442>] device_initial_probe+0x12/0x20
> [ 5.952685] [<c08c7267>] bus_probe_device+0x67/0x70
> [ 5.952690] [<c08c52c0>] device_add+0x3c0/0x5b0
> [ 5.952695] [<c092e859>] spi_add_device+0xe9/0x220
> [ 5.952700] [<c092da10>] ? spi_drv_shutdown+0x20/0x20
> [ 5.952706] [<c06e58a4>] ? strlcpy+0x34/0x50
> [ 5.952712] [<c0930db3>] acpi_spi_add_device+0x123/0x170
> [ 5.952739] [<c077b7fd>] acpi_ns_walk_namespace+0xba/0x16d
> [ 5.952745] [<c077bcd7>] acpi_walk_namespace+0x8d/0xbc
> [ 5.952750] [<c0930c90>] ? devm_spi_register_master+0x80/0x80
> [ 5.952755] [<c0930a19>] spi_register_master+0x229/0x420
> [ 5.952760] [<c0930c90>] ? devm_spi_register_master+0x80/0x80
> [ 5.952766] [<c0930c4b>] devm_spi_register_master+0x3b/0x80
> [ 5.952775] [<f81cec4a>] pxa2xx_spi_probe+0x24a/0x530 [spi_pxa2xx_platform]
> [ 5.952781] [<c075bfd9>] ? acpi_dev_pm_attach+0x1a/0x79
> [ 5.952786] [<c08ca01d>] platform_drv_probe+0x2d/0x80
> [ 5.952792] [<c08c7802>] ? driver_sysfs_add+0x62/0x80
> [ 5.952796] [<c08c7faa>] driver_probe_device+0x1ca/0x410
> [ 5.952801] [<c08c8261>] __driver_attach+0x71/0x80
> [ 5.952806] [<c08c81f0>] ? driver_probe_device+0x410/0x410
> [ 5.952811] [<c08c60d7>] bus_for_each_dev+0x57/0xa0
> [ 5.952817] [<c08c79af>] driver_attach+0x1f/0x30
> [ 5.952821] [<c08c81f0>] ? driver_probe_device+0x410/0x410
> [ 5.952826] [<c08c7557>] bus_add_driver+0x1c7/0x290
> [ 5.952831] [<f81d5000>] ? 0xf81d5000
> [ 5.952835] [<f81d5000>] ? 0xf81d5000
> [ 5.952839] [<c08c8b5a>] driver_register+0x5a/0xe0
> [ 5.952845] [<c06ec1c1>] ? kvasprintf+0x41/0x50
> [ 5.952850] [<c08c9f83>] __platform_driver_register+0x43/0x50
> [ 5.952857] [<f81d5012>] pxa2xx_spi_init+0x12/0x1000 [spi_pxa2xx_platform]
> [ 5.952863] [<c0400472>] do_one_initcall+0xc2/0x1f0
> [ 5.952867] [<f81d5000>] ? 0xf81d5000
> [ 5.952873] [<c0ad0a4f>] ? netlink_broadcast_filtered+0x10f/0x390
> [ 5.952880] [<c052fd2e>] ? free_pages_prepare+0x1ce/0x320
> [ 5.952886] [<c05718ad>] ? kmem_cache_alloc_trace+0x17d/0x1e0
> [ 5.952890] [<c0570b87>] ? kfree+0xe7/0x130
> [ 5.952897] [<c0b5c764>] do_init_module+0x54/0x1cd
> [ 5.952903] [<c04c7895>] load_module+0x1145/0x17d0
> [ 5.952910] [<c04c4549>] ? copy_module_from_fd.isra.53+0x109/0x1a0
> [ 5.952916] [<c04c810d>] SyS_finit_module+0x8d/0xd0
> [ 5.952922] [<c0544ce3>] ? vm_mmap_pgoff+0x93/0xb0
> [ 5.952929] [<c0b6a20f>] sysenter_do_call+0x12/0x12
> [ 5.952933] ---[ end trace 1e444d913002c55d ]---
> [ 5.952936] gpiod_request: invalid GPIO
> [ 5.952941] arizona spi-WM510205:00: Failed to request /RESET: -22
> [ 5.982461] arizona: probe of spi-WM510205:00 failed with error -22
> [ 5.982478] pxa2xx-spi 80860F0E:00: registered child spi-WM510205:00
> [ 5.988213] i2c i2c-11: Failed to register i2c client MAGN0001:00
> at 0x1d (-16)
>
> the code in arizona-core.c arizona_dev_init looks like
>
> if (arizona->pdata.reset) {
> /* Start out with /RESET low to put the chip into reset */
> ret = devm_gpio_request_one(arizona->dev, arizona->pdata.reset,
> }
>
> which fails here. seems that I have to use desc_to_gpio() here too.
> Does anybody have an idea whats wrong with LDO1? I try the
> desc_to_gpio at first and will report soon

I don't think passing the converted GPIO numbers in pdata is good idea.
Instead you can just get the GPIO descriptors in the driver itself using
devm_gpiod_get*().

For example you can try following:

if (arizona->pdata.reset) {
/* Start out with /RESET low to put the chip into reset * */
ret = devm_gpio_request_one(arizona->dev, arizona->pdata.reset,
GPIOF_DIR_OUT | GPIOF_INIT_LOW,
"arizona /RESET");
if (ret != 0) {
dev_err(dev, "Failed to request /RESET: %d\n", ret);
goto err_dcvdd;
}
} else {
struct gpio_desc *desc;

desc = devm_gpiod_get(arizona->dev, "reset",
GPIOF_DIR_OUT | GPIOF_INIT_LOW);
if (!IS_ERR(desc))
arizona.pdata.reset = desc_to_gpio(desc);
}

Eventually it might be good idea to convert the driver to use GPIO
descriptors. The above can be intermediate step to that.