• Dan Carpenter's avatar
    extcon: Fix extcon_get_extcon_dev() error handling · 58e4a2d2
    Dan Carpenter authored
    The extcon_get_extcon_dev() function returns error pointers on error,
    NULL when it's a -EPROBE_DEFER defer situation, and ERR_PTR(-ENODEV)
    when the CONFIG_EXTCON option is disabled.  This is very complicated for
    the callers to handle and a number of them had bugs that would lead to
    an Oops.
    
    In real life, there are two things which prevented crashes.  First,
    error pointers would only be returned if there was bug in the caller
    where they passed a NULL "extcon_name" and none of them do that.
    Second, only two out of the eight drivers will build when CONFIG_EXTCON
    is disabled.
    
    The normal way to write this would be to return -EPROBE_DEFER directly
    when appropriate and return NULL when CONFIG_EXTCON is disabled.  Then
    the error handling is simple and just looks like:
    
    	dev->edev = extcon_get_extcon_dev(acpi_dev_name(adev));
    	if (IS_ERR(dev->edev))
    		return PTR_ERR(dev->edev);
    
    For the two drivers which can build with CONFIG_EXTCON disabled, then
    extcon_get_extcon_dev() will now return NULL which is not treated as an
    error and the probe will continue successfully.  Those two drivers are
    "typec_fusb302" and "max8997-battery".  In the original code, the
    typec_fusb302 driver had an 800ms hang in tcpm_get_current_limit() but
    now that function is a no-op.  For the max8997-battery driver everything
    should continue working as is.
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
    Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Acked-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
    58e4a2d2
axp288_charger.c 26.9 KB