[PATCH v2 1/5] ARM: PXA: Add z2-usb-switch driver
Marko Katić
dromede at gmail.com
Sun Oct 28 13:03:30 EDT 2012
On Sun, Oct 28, 2012 at 4:42 PM, Vasily Khoruzhick <anarsoul at gmail.com> wrote:
> This driver controls mode of USB port #2 pins - device or host.
>
> Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
> ---
> arch/arm/mach-pxa/Kconfig | 7 +++
> arch/arm/mach-pxa/Makefile | 1 +
> arch/arm/mach-pxa/z2-usb-switch.c | 100 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 108 insertions(+)
> create mode 100644 arch/arm/mach-pxa/z2-usb-switch.c
>
> diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig
> index 11aa739..5fffc4b 100644
> --- a/arch/arm/mach-pxa/Kconfig
> +++ b/arch/arm/mach-pxa/Kconfig
> @@ -630,6 +630,13 @@ config MACH_ZIPIT2
> bool "Zipit Z2 Handheld"
> select HAVE_PWM
> select PXA27x
> +
> +config Z2_USB_SWITCH
> + tristate "Control the state of USB port on Zipit Z2"
> + depends on MACH_ZIPIT2
> + help
> + This is a simple driver that is able to control
> + usb mode of Zipit Z2
> endif
> endmenu
>
> diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile
> index ee88d6e..86a032f 100644
> --- a/arch/arm/mach-pxa/Makefile
> +++ b/arch/arm/mach-pxa/Makefile
> @@ -99,3 +99,4 @@ obj-$(CONFIG_MACH_RAUMFELD_SPEAKER) += raumfeld.o
> obj-$(CONFIG_MACH_ZIPIT2) += z2.o
>
> obj-$(CONFIG_TOSA_BT) += tosa-bt.o
> +obj-$(CONFIG_Z2_USB_SWITCH) += z2-usb-switch.o
> diff --git a/arch/arm/mach-pxa/z2-usb-switch.c b/arch/arm/mach-pxa/z2-usb-switch.c
> new file mode 100644
> index 0000000..9583092
> --- /dev/null
> +++ b/arch/arm/mach-pxa/z2-usb-switch.c
> @@ -0,0 +1,100 @@
> +/*
> + * USB mode switcher for Z2
> + *
> + * Copyright (c) 2011 Vasily Khoruzhick
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/delay.h>
> +
> +#include <mach/pxa27x.h>
> +#include <mach/pxa27x-udc.h>
> +
> +#include <asm/io.h>
> +
> +#define MIN(a, b) ((a) < (b) ? (a) : (b))
> +
> +static ssize_t usb_mode_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> +{
> + if (UP2OCR & UP2OCR_HXS)
> + return sprintf(buf, "host\n");
> + else
> + return sprintf(buf, "device\n");
> +}
> +
> +static ssize_t usb_mode_set(struct device *dev, struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + if (strncmp(buf, "host", MIN(count, 4)) == 0) {
> + UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
> + return count;
> + } else if (strncmp(buf, "device", MIN(count, 6)) == 0) {
> + UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE;
> + return count;
> + }
> + return -EINVAL;
> +}
> +
> +static DEVICE_ATTR(usb_mode, 0644, usb_mode_show, usb_mode_set);
> +
> +static const struct attribute *attrs[] = {
> + &dev_attr_usb_mode.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group attr_group = {
> + .attrs = (struct attribute **)attrs,
> +};
> +
> +static int z2_usb_switch_probe(struct platform_device *dev)
> +{
> + int res;
> +
> + res = sysfs_create_group(&dev->dev.kobj, &attr_group);
> + if (res)
> + return res;
> +
> + UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE;
> +
> + return 0;
> +}
> +
> +static int __devexit z2_usb_switch_remove(struct platform_device *dev)
> +{
> + UP2OCR = UP2OCR_HXOE;
> + sysfs_remove_group(&dev->dev.kobj, &attr_group);
> +
> + return 0;
> +}
> +
> +static struct platform_driver z2_usb_switch_driver = {
> + .probe = z2_usb_switch_probe,
> + .remove = __devexit_p(z2_usb_switch_remove),
> +
> + .driver = {
> + .name = "z2-usb-switch",
> + .owner = THIS_MODULE,
> + },
> +};
> +
> +
> +static int __init z2_usb_switch_init(void)
> +{
> + return platform_driver_register(&z2_usb_switch_driver);
> +}
> +
> +static void __exit z2_usb_switch_exit(void)
> +{
> + platform_driver_unregister(&z2_usb_switch_driver);
> +}
> +
> +module_init(z2_usb_switch_init);
> +module_exit(z2_usb_switch_exit);
> --
> 1.7.12.4
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
A more fitting name might be something like "pxa270-usb-switch", since
this isn't really z2 specific. Other pxa270 based devices could use it
aswell.
More information about the linux-arm-kernel
mailing list