From mboxrd@z Thu Jan 1 00:00:00 1970 From: 21cnbao@gmail.com (Barry Song) Date: Wed, 7 Sep 2011 20:55:28 +0800 Subject: [PATCH v2] gpio: rewrite U300 GPIO to use gpiolib In-Reply-To: <1315383085-26352-1-git-send-email-linus.walleij@stericsson.com> References: <1315383085-26352-1-git-send-email-linus.walleij@stericsson.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org > -/* GPIO Pull-Up status */ > -#define DISABLE_PULL_UP ?0 > -#define ENABLE_PULL_UP ?1 > +#define U300_OUTPUT_LOW { \ > + ? ? ? .output = true, \ > + ? ? ? .outval = 0, \ > +} > > -#define GPIO_NOT_USED 0 > -#define GPIO_IN ? ? ? 1 > -#define GPIO_OUT ? ? ?2 > +#define U300_OUTPUT_HIGH { \ > + ? ? ? .output = true, \ > + ? ? ? .outval = 1, \ > +} > > -struct u300_gpio_configuration_data { > - ? ? ? unsigned char pin_usage; > - ? ? ? unsigned char default_output_value; > - ? ? ? unsigned char pull_up; > -}; > > ?/* Initial configuration */ > -const struct u300_gpio_configuration_data > -u300_gpio_config[U300_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { > -#ifdef CONFIG_MACH_U300_BS335 > +static const struct __initdata u300_gpio_confdata > +bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { > ? ? ? ?/* Port 0, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_HIGH, ?DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_HIGH, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > ? ? ? ?}, > ? ? ? ?/* Port 1, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_HIGH, ?DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_HIGH, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > ? ? ? ?}, > ? ? ? ?/* Port 2, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 3, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 4, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 5, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 6, pind 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > ? ? ? ?} > -#endif > +}; > > -#ifdef CONFIG_MACH_U300_BS365 > +static const struct __initdata u300_gpio_confdata > +bs365_gpio_config[BS365_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { > ? ? ? ?/* Port 0, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 1, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_HIGH, ?DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_HIGH, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > ? ? ? ?}, > ? ? ? ?/* Port 2, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? DISABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_FLOATING_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 3, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > ? ? ? ?}, > ? ? ? ?/* Port 4, pins 0-7 */ > ? ? ? ?{ > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_IN, ?DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > + ? ? ? ? ? ? ? U300_PULL_UP_INPUT, > ? ? ? ? ? ? ? ?/* These 4 pins doesn't exist on DB3210 */ > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP}, > - ? ? ? ? ? ? ? {GPIO_OUT, DEFAULT_OUTPUT_LOW, ? ?ENABLE_PULL_UP} > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > + ? ? ? ? ? ? ? U300_OUTPUT_LOW, > ? ? ? ?} > -#endif > ?}; > -#endif > > - > -/* No users == we can power down GPIO */ > -static int gpio_users; > - > -struct gpio_struct { > - ? ? ? int (*callback)(void *); > - ? ? ? void *data; > - ? ? ? int users; > -} > -/* > - * Let drivers register callback in order to get notified when there is > - * an interrupt on the gpio pin > +static int u300_gpio_config(struct gpio_chip *chip, unsigned offset, > + ? ? ? ? ? ? ? ? ? ?u16 param, unsigned long *data) > +{ > + ? ? ? struct u300_gpio *gpio = to_u300_gpio(chip); > ? ? ? ?unsigned long flags; > ? ? ? ?u32 val; > > - ? ? ? if (gpio > U300_GPIO_MAX) > - ? ? ? ? ? ? ? return -EINVAL; > - > ? ? ? ?local_irq_save(flags); > - ? ? ? val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? U300_GPIO_PORTX_SPACING); > - ? ? ? /* Mask out this pin*/ > - ? ? ? val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); > - ? ? ? /* This is not needed since it sets the bits to zero.*/ > - ? ? ? /* val |= (U300_GPIO_PXPCR_PIN_MODE_INPUT << (gpio*2)); */ > - ? ? ? writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? U300_GPIO_PORTX_SPACING); > + ? ? ? switch (param) { > + ? ? ? case GPIO_U300_CONFIG_BIAS_UNKNOWN: > + ? ? ? case GPIO_U300_CONFIG_BIAS_FLOAT: > + ? ? ? ? ? ? ? val = readl(U300_PIN_REG(offset, per)); > + ? ? ? ? ? ? ? writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, per)); > + ? ? ? ? ? ? ? break; > + ? ? ? case GPIO_U300_CONFIG_BIAS_PULL_UP: > + ? ? ? ? ? ? ? val = readl(U300_PIN_REG(offset, per)); > + ? ? ? ? ? ? ? writel(val & ~U300_PIN_BIT(offset), U300_PIN_REG(offset, per)); > + ? ? ? ? ? ? ? break; > + ? ? ? case GPIO_U300_CONFIG_DRIVE_PUSH_PULL: > + ? ? ? ? ? ? ? val = readl(U300_PIN_REG(offset, pcr)); > + ? ? ? ? ? ? ? val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK > + ? ? ? ? ? ? ? ? ? ? ? ?<< ((offset & 0x07) << 1)); > + ? ? ? ? ? ? ? val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL > + ? ? ? ? ? ? ? ? ? ? ? << ((offset & 0x07) << 1)); > + ? ? ? ? ? ? ? writel(val, U300_PIN_REG(offset, pcr)); > + ? ? ? ? ? ? ? break; > + ? ? ? case GPIO_U300_CONFIG_DRIVE_OPEN_DRAIN: > + ? ? ? ? ? ? ? val = readl(U300_PIN_REG(offset, pcr)); > + ? ? ? ? ? ? ? val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK > + ? ? ? ? ? ? ? ? ? ? ? ?<< ((offset & 0x07) << 1)); > + ? ? ? ? ? ? ? val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_DRAIN > + ? ? ? ? ? ? ? ? ? ? ? << ((offset & 0x07) << 1)); > + ? ? ? ? ? ? ? writel(val, U300_PIN_REG(offset, pcr)); > + ? ? ? ? ? ? ? break; > + ? ? ? case GPIO_U300_CONFIG_DRIVE_OPEN_SOURCE: > + ? ? ? ? ? ? ? val = readl(U300_PIN_REG(offset, pcr)); > + ? ? ? ? ? ? ? val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK > + ? ? ? ? ? ? ? ? ? ? ? ?<< ((offset & 0x07) << 1)); > + ? ? ? ? ? ? ? val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_SOURCE > + ? ? ? ? ? ? ? ? ? ? ? << ((offset & 0x07) << 1)); > + ? ? ? ? ? ? ? writel(val, U300_PIN_REG(offset, pcr)); > + ? ? ? ? ? ? ? break; > + ? ? ? default: > + ? ? ? ? ? ? ? local_irq_restore(flags); > + ? ? ? ? ? ? ? dev_err(gpio->dev, "illegal configuration requested\n"); > + ? ? ? ? ? ? ? return -EINVAL; > + ? ? ? } > ? ? ? ?local_irq_restore(flags); > ? ? ? ?return 0; > ?} > > -static void gpio_set_initial_values(void) > +static void __init u300_gpio_init_pin(struct u300_gpio *gpio, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int offset, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const struct u300_gpio_confdata *conf) > ?{ > -#ifdef U300_COH901571_3 > - ? ? ? int i, j; > - ? ? ? unsigned long flags; > - ? ? ? u32 val; > + ? ? ? /* Set mode: input or output */ > + ? ? ? if (conf->output) { > + ? ? ? ? ? ? ? u300_gpio_direction_output(&gpio->chip, offset, conf->outval); > > - ? ? ? /* Write default values to all pins */ > - ? ? ? for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { > - ? ? ? ? ? ? ? val = 0; > - ? ? ? ? ? ? ? for (j = 0; j < 8; j++) > - ? ? ? ? ? ? ? ? ? ? ? val |= (u32) (u300_gpio_config[i][j].default_output_value != DEFAULT_OUTPUT_LOW) << j; > - ? ? ? ? ? ? ? local_irq_save(flags); > - ? ? ? ? ? ? ? writel(val, virtbase + U300_GPIO_PXPDOR + i * U300_GPIO_PORTX_SPACING); > - ? ? ? ? ? ? ? local_irq_restore(flags); > + ? ? ? ? ? ? ? /* Deactivate bias mode for output */ > + ? ? ? ? ? ? ? u300_gpio_config(&gpio->chip, offset, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_U300_CONFIG_BIAS_FLOAT, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL); > + > + ? ? ? ? ? ? ? /* Set drive mode for output */ > + ? ? ? ? ? ? ? u300_gpio_config(&gpio->chip, offset, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_U300_CONFIG_DRIVE_PUSH_PULL, NULL); > + > + ? ? ? ? ? ? ? dev_dbg(gpio->dev, "set up pin %d as output, value: %d\n", > + ? ? ? ? ? ? ? ? ? ? ? offset, conf->outval); > + ? ? ? } else { > + ? ? ? ? ? ? ? u300_gpio_direction_input(&gpio->chip, offset); > + > + ? ? ? ? ? ? ? /* Always set output low on input pins */ > + ? ? ? ? ? ? ? u300_gpio_set(&gpio->chip, offset, 0); > + > + ? ? ? ? ? ? ? /* Set bias mode for input */ > + ? ? ? ? ? ? ? u300_gpio_config(&gpio->chip, offset, conf->bias_mode, NULL); > + > + ? ? ? ? ? ? ? dev_dbg(gpio->dev, "set up pin %d as input, bias: %04x\n", > + ? ? ? ? ? ? ? ? ? ? ? offset, conf->bias_mode); > ? ? ? ?} > +} > > - ? ? ? /* > - ? ? ? ?* Put all pins that are set to either 'GPIO_OUT' or 'GPIO_NOT_USED' > - ? ? ? ?* to output and 'GPIO_IN' to input for each port. And initialize > - ? ? ? ?* default value on outputs. > - ? ? ? ?*/ > - ? ? ? for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { > - ? ? ? ? ? ? ? for (j = 0; j < U300_GPIO_PINS_PER_PORT; j++) { > - ? ? ? ? ? ? ? ? ? ? ? local_irq_save(flags); > - ? ? ? ? ? ? ? ? ? ? ? val = readl(virtbase + U300_GPIO_PXPCR + > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?i * U300_GPIO_PORTX_SPACING); > - ? ? ? ? ? ? ? ? ? ? ? /* Mask out this pin */ > - ? ? ? ? ? ? ? ? ? ? ? val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << (j << 1)); > - > - ? ? ? ? ? ? ? ? ? ? ? if (u300_gpio_config[i][j].pin_usage != GPIO_IN) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL << (j << 1)); > - ? ? ? ? ? ? ? ? ? ? ? writel(val, virtbase + U300_GPIO_PXPCR + > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?i * U300_GPIO_PORTX_SPACING); > - ? ? ? ? ? ? ? ? ? ? ? local_irq_restore(flags); > +static void __init u300_gpio_init_coh901571(struct u300_gpio *gpio, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct u300_gpio_platform *plat) > +{ > + ? ? ? int i, j; > + > + ? ? ? /* Write default config and values to all pins */ > + ? ? ? for (i = 0; i < plat->ports; i++) { > + ? ? ? ? ? ? ? for (j = 0; j < 8; j++) { > + ? ? ? ? ? ? ? ? ? ? ? const struct u300_gpio_confdata *conf; > + ? ? ? ? ? ? ? ? ? ? ? int offset = (i*8) + j; > + > + ? ? ? ? ? ? ? ? ? ? ? if (plat->variant == U300_GPIO_COH901571_3_BS335) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? conf = &bs335_gpio_config[i][j]; > + ? ? ? ? ? ? ? ? ? ? ? else if (plat->variant == U300_GPIO_COH901571_3_BS365) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? conf = &bs365_gpio_config[i][j]; > + ? ? ? ? ? ? ? ? ? ? ? else > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break; > + > + ? ? ? ? ? ? ? ? ? ? ? u300_gpio_init_pin(gpio, offset, conf); > ? ? ? ? ? ? ? ?} > ? ? ? ?} > +} > > - ? ? ? /* Enable or disable the internal pull-ups in the GPIO ASIC block */ > - ? ? ? for (i = 0; i < U300_GPIO_MAX; i++) { > - ? ? ? ? ? ? ? val = 0; > - ? ? ? ? ? ? ? for (j = 0; j < 8; j++) > - ? ? ? ? ? ? ? ? ? ? ? val |= (u32)((u300_gpio_config[i][j].pull_up == DISABLE_PULL_UP) << j); > - ? ? ? ? ? ? ? local_irq_save(flags); > - ? ? ? ? ? ? ? writel(val, virtbase + U300_GPIO_PXPER + i * U300_GPIO_PORTX_SPACING); > - ? ? ? ? ? ? ? local_irq_restore(flags); this has used array/table to set the pull of gpio. so what's our plan about api to config GPIO pull dynamically? -barry