Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 355340
b: refs/heads/master
c: 6f6a4a6
h: refs/heads/master
v: v3
  • Loading branch information
Laurent Pinchart authored and Simon Horman committed Jan 25, 2013
1 parent 777be7c commit 3b22b1d
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 88 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f9492fda70c87b410e61675095212dc806bdf615
refs/heads/master: 6f6a4a683be97837f3baae443aacd2b0e6162b10
2 changes: 1 addition & 1 deletion trunk/drivers/sh/pfc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ config SH_PFC
def_bool y

config GPIO_SH_PFC
tristate "SuperH PFC GPIO support"
bool "SuperH PFC GPIO support"
depends on SH_PFC && GPIOLIB
help
This enables support for GPIOs within the SoC's pin function
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/sh/pfc/Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
sh-pfc-objs = core.o pinctrl.o
ifeq ($(CONFIG_GPIO_SH_PFC),y)
sh-pfc-objs += gpio.o
endif
obj-y += sh-pfc.o
obj-$(CONFIG_GPIO_SH_PFC) += gpio.o
23 changes: 9 additions & 14 deletions trunk/drivers/sh/pfc/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ int sh_pfc_read_bit(struct pinmux_data_reg *dr, unsigned long in_pos)

return (gpio_read_raw_reg(dr->mapped_reg, dr->reg_width) >> pos) & 1;
}
EXPORT_SYMBOL_GPL(sh_pfc_read_bit);

void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
unsigned long value)
Expand All @@ -169,7 +168,6 @@ void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,

gpio_write_raw_reg(dr->mapped_reg, dr->reg_width, dr->reg_shadow);
}
EXPORT_SYMBOL_GPL(sh_pfc_write_bit);

static void config_reg_helper(struct sh_pfc *pfc,
struct pinmux_cfg_reg *crp,
Expand Down Expand Up @@ -307,7 +305,6 @@ int sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
*bitp = n;
return 0;
}
EXPORT_SYMBOL_GPL(sh_pfc_get_data_reg);

static int get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
struct pinmux_cfg_reg **crp,
Expand Down Expand Up @@ -384,7 +381,6 @@ int sh_pfc_gpio_to_enum(struct sh_pfc *pfc, unsigned gpio, int pos,
pr_err("cannot locate data/mark enum_id for gpio %d\n", gpio);
return -1;
}
EXPORT_SYMBOL_GPL(sh_pfc_gpio_to_enum);

int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
int cfg_mode)
Expand Down Expand Up @@ -500,7 +496,6 @@ int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,

int register_sh_pfc(struct sh_pfc_platform_data *pdata)
{
int (*initroutine)(struct sh_pfc *) = NULL;
int ret;

/*
Expand Down Expand Up @@ -531,24 +526,20 @@ int register_sh_pfc(struct sh_pfc_platform_data *pdata)
if (unlikely(ret != 0))
goto err;

#ifdef CONFIG_GPIO_SH_PFC
/*
* Then the GPIO chip
*/
initroutine = symbol_request(sh_pfc_register_gpiochip);
if (initroutine) {
ret = (*initroutine)(&sh_pfc);
symbol_put_addr(initroutine);

ret = sh_pfc_register_gpiochip(&sh_pfc);
if (unlikely(ret != 0)) {
/*
* If the GPIO chip fails to come up we still leave the
* PFC state as it is, given that there are already
* extant users of it that have succeeded by this point.
*/
if (unlikely(ret != 0)) {
pr_notice("failed to init GPIO chip, ignoring...\n");
ret = 0;
}
pr_notice("failed to init GPIO chip, ignoring...\n");
}
#endif

pr_info("%s support registered\n", sh_pfc.pdata->name);

Expand All @@ -560,3 +551,7 @@ int register_sh_pfc(struct sh_pfc_platform_data *pdata)

return ret;
}

MODULE_AUTHOR("Magnus Damm, Paul Mundt, Laurent Pinchart");
MODULE_DESCRIPTION("Pin Control and GPIO driver for SuperH pin function controller");
MODULE_LICENSE("GPL v2");
4 changes: 4 additions & 0 deletions trunk/drivers/sh/pfc/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,18 @@ struct pfc_window {
unsigned long size;
};

struct sh_pfc_chip;

struct sh_pfc {
struct sh_pfc_platform_data *pdata;
spinlock_t lock;

struct pfc_window *window;
struct sh_pfc_chip *gpio;
};

int sh_pfc_register_gpiochip(struct sh_pfc *pfc);
int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc);

int sh_pfc_register_pinctrl(struct sh_pfc *pfc);

Expand Down
79 changes: 8 additions & 71 deletions trunk/drivers/sh/pfc/gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/pinctrl/consumer.h>
#include <linux/sh_pfc.h>

Expand Down Expand Up @@ -152,92 +151,30 @@ int sh_pfc_register_gpiochip(struct sh_pfc *pfc)
sh_pfc_gpio_setup(chip);

ret = gpiochip_add(&chip->gpio_chip);
if (unlikely(ret < 0))
if (unlikely(ret < 0)) {
kfree(chip);
return ret;
}

pfc->gpio = chip;

pr_info("%s handling gpio %d -> %d\n",
pfc->pdata->name, pfc->pdata->first_gpio,
pfc->pdata->last_gpio);

return ret;
}
EXPORT_SYMBOL_GPL(sh_pfc_register_gpiochip);

static int sh_pfc_gpio_match(struct gpio_chip *gc, void *data)
{
return !!strstr(gc->label, data);
}

static int sh_pfc_gpio_probe(struct platform_device *pdev)
{
struct sh_pfc_chip *chip;
struct gpio_chip *gc;

gc = gpiochip_find("_pfc", sh_pfc_gpio_match);
if (unlikely(!gc)) {
pr_err("Cant find gpio chip\n");
return -ENODEV;
}

chip = gpio_to_pfc_chip(gc);
platform_set_drvdata(pdev, chip);

pr_info("attaching to GPIO chip %s\n", chip->pfc->pdata->name);

return 0;
}

static int sh_pfc_gpio_remove(struct platform_device *pdev)
int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc)
{
struct sh_pfc_chip *chip = platform_get_drvdata(pdev);
struct sh_pfc_chip *chip = pfc->gpio;
int ret;

ret = gpiochip_remove(&chip->gpio_chip);
if (unlikely(ret < 0))
return ret;

kfree(chip);
pfc->gpio = NULL;
return 0;
}

static struct platform_driver sh_pfc_gpio_driver = {
.probe = sh_pfc_gpio_probe,
.remove = sh_pfc_gpio_remove,
.driver = {
.name = KBUILD_MODNAME,
.owner = THIS_MODULE,
},
};

static struct platform_device sh_pfc_gpio_device = {
.name = KBUILD_MODNAME,
.id = -1,
};

static int __init sh_pfc_gpio_init(void)
{
int rc;

rc = platform_driver_register(&sh_pfc_gpio_driver);
if (likely(!rc)) {
rc = platform_device_register(&sh_pfc_gpio_device);
if (unlikely(rc))
platform_driver_unregister(&sh_pfc_gpio_driver);
}

return rc;
}

static void __exit sh_pfc_gpio_exit(void)
{
platform_device_unregister(&sh_pfc_gpio_device);
platform_driver_unregister(&sh_pfc_gpio_driver);
}

module_init(sh_pfc_gpio_init);
module_exit(sh_pfc_gpio_exit);

MODULE_AUTHOR("Magnus Damm, Paul Mundt");
MODULE_DESCRIPTION("GPIO driver for SuperH pin function controller");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:pfc-gpio");

0 comments on commit 3b22b1d

Please sign in to comment.