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

i2c: at91: Move to generic GPIO bus recovery

Make the Microchip at91 driver the first to use the generic GPIO bus
recovery support from the I2C core and discard the driver implementation.

Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>

authored by

Codrin Ciubotariu and committed by
Wolfram Sang
543aa2c4 23a698fe

+3 -69
+3 -66
drivers/i2c/busses/i2c-at91-master.c
··· 816 816 return ret; 817 817 } 818 818 819 - static void at91_prepare_twi_recovery(struct i2c_adapter *adap) 820 - { 821 - struct at91_twi_dev *dev = i2c_get_adapdata(adap); 822 - 823 - pinctrl_select_state(dev->pinctrl, dev->pinctrl_pins_gpio); 824 - } 825 - 826 - static void at91_unprepare_twi_recovery(struct i2c_adapter *adap) 827 - { 828 - struct at91_twi_dev *dev = i2c_get_adapdata(adap); 829 - 830 - pinctrl_select_state(dev->pinctrl, dev->pinctrl_pins_default); 831 - } 832 - 833 819 static int at91_init_twi_recovery_gpio(struct platform_device *pdev, 834 820 struct at91_twi_dev *dev) 835 821 { 836 822 struct i2c_bus_recovery_info *rinfo = &dev->rinfo; 837 823 838 - dev->pinctrl = devm_pinctrl_get(&pdev->dev); 839 - if (!dev->pinctrl || IS_ERR(dev->pinctrl)) { 824 + rinfo->pinctrl = devm_pinctrl_get(&pdev->dev); 825 + if (!rinfo->pinctrl || IS_ERR(rinfo->pinctrl)) { 840 826 dev_info(dev->dev, "can't get pinctrl, bus recovery not supported\n"); 841 - return PTR_ERR(dev->pinctrl); 827 + return PTR_ERR(rinfo->pinctrl); 842 828 } 843 - 844 - dev->pinctrl_pins_default = pinctrl_lookup_state(dev->pinctrl, 845 - PINCTRL_STATE_DEFAULT); 846 - dev->pinctrl_pins_gpio = pinctrl_lookup_state(dev->pinctrl, 847 - "gpio"); 848 - if (IS_ERR(dev->pinctrl_pins_default) || 849 - IS_ERR(dev->pinctrl_pins_gpio)) { 850 - dev_info(&pdev->dev, "pinctrl states incomplete for recovery\n"); 851 - return -EINVAL; 852 - } 853 - 854 - /* 855 - * pins will be taken as GPIO, so we might as well inform pinctrl about 856 - * this and move the state to GPIO 857 - */ 858 - pinctrl_select_state(dev->pinctrl, dev->pinctrl_pins_gpio); 859 - 860 - rinfo->sda_gpiod = devm_gpiod_get(&pdev->dev, "sda", GPIOD_IN); 861 - if (PTR_ERR(rinfo->sda_gpiod) == -EPROBE_DEFER) 862 - return -EPROBE_DEFER; 863 - 864 - rinfo->scl_gpiod = devm_gpiod_get(&pdev->dev, "scl", 865 - GPIOD_OUT_HIGH_OPEN_DRAIN); 866 - if (PTR_ERR(rinfo->scl_gpiod) == -EPROBE_DEFER) 867 - return -EPROBE_DEFER; 868 - 869 - if (IS_ERR(rinfo->sda_gpiod) || 870 - IS_ERR(rinfo->scl_gpiod)) { 871 - dev_info(&pdev->dev, "recovery information incomplete\n"); 872 - if (!IS_ERR(rinfo->sda_gpiod)) { 873 - gpiod_put(rinfo->sda_gpiod); 874 - rinfo->sda_gpiod = NULL; 875 - } 876 - if (!IS_ERR(rinfo->scl_gpiod)) { 877 - gpiod_put(rinfo->scl_gpiod); 878 - rinfo->scl_gpiod = NULL; 879 - } 880 - pinctrl_select_state(dev->pinctrl, dev->pinctrl_pins_default); 881 - return -EINVAL; 882 - } 883 - 884 - /* change the state of the pins back to their default state */ 885 - pinctrl_select_state(dev->pinctrl, dev->pinctrl_pins_default); 886 - 887 - dev_info(&pdev->dev, "using scl, sda for recovery\n"); 888 - 889 - rinfo->prepare_recovery = at91_prepare_twi_recovery; 890 - rinfo->unprepare_recovery = at91_unprepare_twi_recovery; 891 - rinfo->recover_bus = i2c_generic_scl_recovery; 892 829 dev->adapter.bus_recovery_info = rinfo; 893 830 894 831 return 0;
-3
drivers/i2c/busses/i2c-at91.h
··· 157 157 struct at91_twi_dma dma; 158 158 bool slave_detected; 159 159 struct i2c_bus_recovery_info rinfo; 160 - struct pinctrl *pinctrl; 161 - struct pinctrl_state *pinctrl_pins_default; 162 - struct pinctrl_state *pinctrl_pins_gpio; 163 160 #ifdef CONFIG_I2C_AT91_SLAVE_EXPERIMENTAL 164 161 unsigned smr; 165 162 struct i2c_client *slave;