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

Merge branch 'next/gpio-samsung' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/dt

From Kukjin Kim:

Since there are many changes for gpio-samsung in my tree, this has been
included in my tree with Linus' agreement.

* 'next/gpio-samsung' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
gpio: samsung: add devicetree init for s3c24xx arches

+106
+43
Documentation/devicetree/bindings/gpio/gpio-samsung.txt
··· 39 39 #gpio-cells = <4>; 40 40 gpio-controller; 41 41 }; 42 + 43 + 44 + Samsung S3C24XX GPIO Controller 45 + 46 + Required properties: 47 + - compatible: Compatible property value should be "samsung,s3c24xx-gpio". 48 + 49 + - reg: Physical base address of the controller and length of memory mapped 50 + region. 51 + 52 + - #gpio-cells: Should be 3. The syntax of the gpio specifier used by client nodes 53 + should be the following with values derived from the SoC user manual. 54 + <[phandle of the gpio controller node] 55 + [pin number within the gpio controller] 56 + [mux function] 57 + [flags and pull up/down] 58 + 59 + Values for gpio specifier: 60 + - Pin number: depending on the controller a number from 0 up to 15. 61 + - Mux function: Depending on the SoC and the gpio bank the gpio can be set 62 + as input, output or a special function 63 + - Flags and Pull Up/Down: the values to use differ for the individual SoCs 64 + example S3C2416/S3C2450: 65 + 0 - Pull Up/Down Disabled. 66 + 1 - Pull Down Enabled. 67 + 2 - Pull Up Enabled. 68 + Bit 16 (0x00010000) - Input is active low. 69 + Consult the user manual for the correct values of Mux and Pull Up/Down. 70 + 71 + - gpio-controller: Specifies that the node is a gpio controller. 72 + - #address-cells: should be 1. 73 + - #size-cells: should be 1. 74 + 75 + Example: 76 + 77 + gpa: gpio-controller@56000000 { 78 + #address-cells = <1>; 79 + #size-cells = <1>; 80 + compatible = "samsung,s3c24xx-gpio"; 81 + reg = <0x56000000 0x10>; 82 + #gpio-cells = <3>; 83 + gpio-controller; 84 + };
+63
drivers/gpio/gpio-samsung.c
··· 938 938 s3c_gpiolib_track(chip); 939 939 } 940 940 941 + #if defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) 942 + static int s3c24xx_gpio_xlate(struct gpio_chip *gc, 943 + const struct of_phandle_args *gpiospec, u32 *flags) 944 + { 945 + unsigned int pin; 946 + 947 + if (WARN_ON(gc->of_gpio_n_cells < 3)) 948 + return -EINVAL; 949 + 950 + if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells)) 951 + return -EINVAL; 952 + 953 + if (gpiospec->args[0] > gc->ngpio) 954 + return -EINVAL; 955 + 956 + pin = gc->base + gpiospec->args[0]; 957 + 958 + if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1]))) 959 + pr_warn("gpio_xlate: failed to set pin function\n"); 960 + if (s3c_gpio_setpull(pin, gpiospec->args[2] & 0xffff)) 961 + pr_warn("gpio_xlate: failed to set pin pull up/down\n"); 962 + 963 + if (flags) 964 + *flags = gpiospec->args[2] >> 16; 965 + 966 + return gpiospec->args[0]; 967 + } 968 + 969 + static const struct of_device_id s3c24xx_gpio_dt_match[] __initdata = { 970 + { .compatible = "samsung,s3c24xx-gpio", }, 971 + {} 972 + }; 973 + 974 + static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip, 975 + u64 base, u64 offset) 976 + { 977 + struct gpio_chip *gc = &chip->chip; 978 + u64 address; 979 + 980 + if (!of_have_populated_dt()) 981 + return; 982 + 983 + address = chip->base ? base + ((u32)chip->base & 0xfff) : base + offset; 984 + gc->of_node = of_find_matching_node_by_address(NULL, 985 + s3c24xx_gpio_dt_match, address); 986 + if (!gc->of_node) { 987 + pr_info("gpio: device tree node not found for gpio controller" 988 + " with base address %08llx\n", address); 989 + return; 990 + } 991 + gc->of_gpio_n_cells = 3; 992 + gc->of_xlate = s3c24xx_gpio_xlate; 993 + } 994 + #else 995 + static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip, 996 + u64 base, u64 offset) 997 + { 998 + return; 999 + } 1000 + #endif /* defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) */ 1001 + 941 1002 static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip, 942 1003 int nr_chips, void __iomem *base) 943 1004 { ··· 1023 962 gc->direction_output = samsung_gpiolib_2bit_output; 1024 963 1025 964 samsung_gpiolib_add(chip); 965 + 966 + s3c24xx_gpiolib_attach_ofnode(chip, S3C24XX_PA_GPIO, i * 0x10); 1026 967 } 1027 968 } 1028 969