Re: [PATCH 6/7] pxa/akita: use pca953x instead of akita-ioexp | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
2008/9/7 Eric Miao <eric.y.miao@xxxxxxxxx>:
> Use generic pca953x which provides gpiolib interface instead of
> akita-specific akita-ioexp with non-standard interface to pins.
Did you tried this at least in the emulator? This will barf badly,
as one must use _cansleep serie of functions.
>
> Signed-off-by: Dmitry Baryshkov <dbaryshkov@xxxxxxxxx>
> Cc: Richard Purdie <rpurdie@xxxxxxxxx>
> Cc: Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Eric Miao <eric.miao@xxxxxxxxxxx>
> ---
> arch/arm/mach-pxa/Makefile | 1 -
> arch/arm/mach-pxa/akita-ioexp.c | 222 --------------------------------
> arch/arm/mach-pxa/include/mach/akita.h | 32 -----
> arch/arm/mach-pxa/include/mach/spitz.h | 11 ++
> arch/arm/mach-pxa/spitz.c | 37 +++---
> sound/soc/pxa/spitz.c | 13 +--
> 6 files changed, 31 insertions(+), 285 deletions(-)
> delete mode 100644 arch/arm/mach-pxa/akita-ioexp.c
> delete mode 100644 arch/arm/mach-pxa/include/mach/akita.h
>
> diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile
> index 56f2162..fbedaaf 100644
> --- a/arch/arm/mach-pxa/Makefile
> +++ b/arch/arm/mach-pxa/Makefile
> @@ -30,7 +30,6 @@ obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o
> obj-$(CONFIG_MACH_COLIBRI) += colibri.o
> obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o sharpsl_pm.o corgi_pm.o
> obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o sharpsl_pm.o spitz_pm.o
> -obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o
> obj-$(CONFIG_MACH_POODLE) += poodle.o
> obj-$(CONFIG_MACH_PCM027) += pcm027.o
> obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o
> diff --git a/arch/arm/mach-pxa/akita-ioexp.c b/arch/arm/mach-pxa/akita-ioexp.c
> deleted file mode 100644
> index 5c67b18..0000000
> --- a/arch/arm/mach-pxa/akita-ioexp.c
> +++ /dev/null
> @@ -1,222 +0,0 @@
> -/*
> - * Support for the Extra GPIOs on the Sharp SL-C1000 (Akita)
> - * (uses a Maxim MAX7310 8 Port IO Expander)
> - *
> - * Copyright 2005 Openedhand Ltd.
> - *
> - * Author: Richard Purdie <richard@xxxxxxxxxxxxxx>
> - *
> - * 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/init.h>
> -#include <linux/platform_device.h>
> -#include <linux/module.h>
> -#include <linux/i2c.h>
> -#include <linux/slab.h>
> -#include <linux/workqueue.h>
> -#include <mach/akita.h>
> -
> -/* MAX7310 Regiser Map */
> -#define MAX7310_INPUT 0x00
> -#define MAX7310_OUTPUT 0x01
> -#define MAX7310_POLINV 0x02
> -#define MAX7310_IODIR 0x03 /* 1 = Input, 0 = Output */
> -#define MAX7310_TIMEOUT 0x04
> -
> -/* Addresses to scan */
> -static const unsigned short normal_i2c[] = { 0x18, I2C_CLIENT_END };
> -
> -/* I2C Magic */
> -I2C_CLIENT_INSMOD;
> -
> -static int max7310_write(struct i2c_client *client, int address, int data);
> -static struct i2c_client max7310_template;
> -static void akita_ioexp_work(struct work_struct *private_);
> -
> -static struct device *akita_ioexp_device;
> -static unsigned char ioexp_output_value = AKITA_IOEXP_IO_OUT;
> -DECLARE_WORK(akita_ioexp, akita_ioexp_work);
> -
> -
> -/*
> - * MAX7310 Access
> - */
> -static int max7310_config(struct device *dev, int iomode, int polarity)
> -{
> - int ret;
> - struct i2c_client *client = to_i2c_client(dev);
> -
> - ret = max7310_write(client, MAX7310_POLINV, polarity);
> - if (ret < 0)
> - return ret;
> - ret = max7310_write(client, MAX7310_IODIR, iomode);
> - return ret;
> -}
> -
> -static int max7310_set_ouputs(struct device *dev, int outputs)
> -{
> - struct i2c_client *client = to_i2c_client(dev);
> -
> - return max7310_write(client, MAX7310_OUTPUT, outputs);
> -}
> -
> -/*
> - * I2C Functions
> - */
> -static int max7310_write(struct i2c_client *client, int address, int value)
> -{
> - u8 data[2];
> -
> - data[0] = address & 0xff;
> - data[1] = value & 0xff;
> -
> - if (i2c_master_send(client, data, 2) == 2)
> - return 0;
> - return -1;
> -}
> -
> -static int max7310_detect(struct i2c_adapter *adapter, int address, int kind)
> -{
> - struct i2c_client *new_client;
> - int err;
> -
> - if (!(new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL)))
> - return -ENOMEM;
> -
> - max7310_template.adapter = adapter;
> - max7310_template.addr = address;
> -
> - memcpy(new_client, &max7310_template, sizeof(struct i2c_client));
> -
> - if ((err = i2c_attach_client(new_client))) {
> - kfree(new_client);
> - return err;
> - }
> -
> - max7310_config(&new_client->dev, AKITA_IOEXP_IO_DIR, 0);
> - akita_ioexp_device = &new_client->dev;
> - schedule_work(&akita_ioexp);
> -
> - return 0;
> -}
> -
> -static int max7310_attach_adapter(struct i2c_adapter *adapter)
> -{
> - return i2c_probe(adapter, &addr_data, max7310_detect);
> -}
> -
> -static int max7310_detach_client(struct i2c_client *client)
> -{
> - int err;
> -
> - akita_ioexp_device = NULL;
> -
> - if ((err = i2c_detach_client(client)))
> - return err;
> -
> - kfree(client);
> - return 0;
> -}
> -
> -static struct i2c_driver max7310_i2c_driver = {
> - .driver = {
> - .name = "akita-max7310",
> - },
> - .id = I2C_DRIVERID_AKITAIOEXP,
> - .attach_adapter = max7310_attach_adapter,
> - .detach_client = max7310_detach_client,
> -};
> -
> -static struct i2c_client max7310_template = {
> - name: "akita-max7310",
> - driver: &max7310_i2c_driver,
> -};
> -
> -void akita_set_ioexp(struct device *dev, unsigned char bit)
> -{
> - ioexp_output_value |= bit;
> -
> - if (akita_ioexp_device)
> - schedule_work(&akita_ioexp);
> - return;
> -}
> -
> -void akita_reset_ioexp(struct device *dev, unsigned char bit)
> -{
> - ioexp_output_value &= ~bit;
> -
> - if (akita_ioexp_device)
> - schedule_work(&akita_ioexp);
> - return;
> -}
> -
> -EXPORT_SYMBOL(akita_set_ioexp);
> -EXPORT_SYMBOL(akita_reset_ioexp);
> -
> -static void akita_ioexp_work(struct work_struct *private_)
> -{
> - if (akita_ioexp_device)
> - max7310_set_ouputs(akita_ioexp_device, ioexp_output_value);
> -}
> -
> -
> -#ifdef CONFIG_PM
> -static int akita_ioexp_suspend(struct platform_device *pdev,
> pm_message_t state)
> -{
> - flush_scheduled_work();
> - return 0;
> -}
> -
> -static int akita_ioexp_resume(struct platform_device *pdev)
> -{
> - schedule_work(&akita_ioexp);
> - return 0;
> -}
> -#else
> -#define akita_ioexp_suspend NULL
> -#define akita_ioexp_resume NULL
> -#endif
> -
> -static int __init akita_ioexp_probe(struct platform_device *pdev)
> -{
> - return i2c_add_driver(&max7310_i2c_driver);
> -}
> -
> -static int akita_ioexp_remove(struct platform_device *pdev)
> -{
> - i2c_del_driver(&max7310_i2c_driver);
> - return 0;
> -}
> -
> -static struct platform_driver akita_ioexp_driver = {
> - .probe = akita_ioexp_probe,
> - .remove = akita_ioexp_remove,
> - .suspend = akita_ioexp_suspend,
> - .resume = akita_ioexp_resume,
> - .driver = {
> - .name = "akita-ioexp",
> - },
> -};
> -
> -static int __init akita_ioexp_init(void)
> -{
> - return platform_driver_register(&akita_ioexp_driver);
> -}
> -
> -static void __exit akita_ioexp_exit(void)
> -{
> - platform_driver_unregister(&akita_ioexp_driver);
> -}
> -
> -MODULE_AUTHOR("Richard Purdie <rpurdie@xxxxxxxxxxxxxx>");
> -MODULE_DESCRIPTION("Akita IO-Expander driver");
> -MODULE_LICENSE("GPL");
> -
> -fs_initcall(akita_ioexp_init);
> -module_exit(akita_ioexp_exit);
> -
> diff --git a/arch/arm/mach-pxa/include/mach/akita.h
> b/arch/arm/mach-pxa/include/mach/akita.h
> deleted file mode 100644
> index 5d8cc1d..0000000
> --- a/arch/arm/mach-pxa/include/mach/akita.h
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -/*
> - * Hardware specific definitions for SL-C1000 (Akita)
> - *
> - * Copyright (c) 2005 Richard Purdie
> - *
> - * 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.
> - *
> - */
> -
> -/* Akita IO Expander GPIOs */
> -
> -#define AKITA_IOEXP_RESERVED_7 (1 << 7)
> -#define AKITA_IOEXP_IR_ON (1 << 6)
> -#define AKITA_IOEXP_AKIN_PULLUP (1 << 5)
> -#define AKITA_IOEXP_BACKLIGHT_CONT (1 << 4)
> -#define AKITA_IOEXP_BACKLIGHT_ON (1 << 3)
> -#define AKITA_IOEXP_MIC_BIAS (1 << 2)
> -#define AKITA_IOEXP_RESERVED_1 (1 << 1)
> -#define AKITA_IOEXP_RESERVED_0 (1 << 0)
> -
> -/* Direction Bitfield 0=output 1=input */
> -#define AKITA_IOEXP_IO_DIR 0
> -/* Default Values */
> -#define AKITA_IOEXP_IO_OUT (AKITA_IOEXP_IR_ON | AKITA_IOEXP_AKIN_PULLUP)
> -
> -extern struct platform_device akitaioexp_device;
> -
> -void akita_set_ioexp(struct device *dev, unsigned char bitmask);
> -void akita_reset_ioexp(struct device *dev, unsigned char bitmask);
> -
> diff --git a/arch/arm/mach-pxa/include/mach/spitz.h
> b/arch/arm/mach-pxa/include/mach/spitz.h
> index 3e28394..31ac26b 100644
> --- a/arch/arm/mach-pxa/include/mach/spitz.h
> +++ b/arch/arm/mach-pxa/include/mach/spitz.h
> @@ -151,6 +151,17 @@
> #define SPITZ_GPIO_BACKLIGHT_ON (SPITZ_SCP2_GPIO_BASE + 7)
> #define SPITZ_GPIO_MIC_BIAS (SPITZ_SCP2_GPIO_BASE + 8)
>
> +/* Akita IO Expander GPIOs */
> +#define AKITA_IOEXP_GPIO_BASE (NR_BUILTIN_GPIO + 12)
> +#define AKITA_GPIO_RESERVED_0 (AKITA_IOEXP_GPIO_BASE + 0)
> +#define AKITA_GPIO_RESERVED_1 (AKITA_IOEXP_GPIO_BASE + 1)
> +#define AKITA_GPIO_MIC_BIAS (AKITA_IOEXP_GPIO_BASE + 2)
> +#define AKITA_GPIO_BACKLIGHT_ON (AKITA_IOEXP_GPIO_BASE + 3)
> +#define AKITA_GPIO_BACKLIGHT_CONT (AKITA_IOEXP_GPIO_BASE + 4)
> +#define AKITA_GPIO_AKIN_PULLUP (AKITA_IOEXP_GPIO_BASE + 5)
> +#define AKITA_GPIO_IR_ON (AKITA_IOEXP_GPIO_BASE + 6)
> +#define AKITA_GPIO_RESERVED_7 (AKITA_IOEXP_GPIO_BASE + 7)
> +
> /* Spitz IRQ Definitions */
>
> #define SPITZ_IRQ_GPIO_KEY_INT IRQ_GPIO(SPITZ_GPIO_KEY_INT)
> diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
> index 0b17cf1..26a4184 100644
> --- a/arch/arm/mach-pxa/spitz.c
> +++ b/arch/arm/mach-pxa/spitz.c
> @@ -24,6 +24,8 @@
> #include <linux/mmc/host.h>
> #include <linux/pm.h>
> #include <linux/backlight.h>
> +#include <linux/i2c.h>
> +#include <linux/i2c/pca953x.h>
> #include <linux/spi/spi.h>
> #include <linux/spi/ads7846.h>
> #include <linux/spi/corgi_lcd.h>
> @@ -52,7 +54,6 @@
> #include <mach/udc.h>
> #include <mach/pxafb.h>
> #include <mach/pxa2xx_spi.h>
> -#include <mach/akita.h>
> #include <mach/spitz.h>
> #include <mach/sharpsl.h>
>
> @@ -308,16 +309,8 @@ static void spitz_notify_intensity(int intensity)
> }
>
> if (machine_is_akita()) {
> - /* Bit 5 is via IO-Expander */
> - if (intensity & 0x0020)
> - akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_CONT);
> - else
> - akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_CONT);
> -
> - if (intensity)
> - akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_ON);
> - else
> - akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_ON);
> + gpio_set_value(AKITA_GPIO_BACKLIGHT_CONT, !(intensity & 0x20));
> + gpio_set_value(AKITA_GPIO_BACKLIGHT_ON, intensity);
> return;
> }
> }
> @@ -530,10 +523,7 @@ static void spitz_irda_transceiver_mode(struct
> device *dev, int mode)
> #ifdef CONFIG_MACH_AKITA
> static void akita_irda_transceiver_mode(struct device *dev, int mode)
> {
> - if (mode & IR_OFF)
> - akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
> - else
> - akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
> + gpio_set_value(AKITA_GPIO_IR_ON, mode & IR_OFF);
> pxa2xx_transceiver_mode(dev, mode);
> }
> #endif
> @@ -644,12 +634,17 @@ static void __init spitz_init(void)
> /*
> * Akita IO Expander
> */
> -struct platform_device akitaioexp_device = {
> - .name = "akita-ioexp",
> - .id = -1,
> +static struct pca953x_platform_data akita_ioexp = {
> + .gpio_base = AKITA_IOEXP_GPIO_BASE,
> };
>
> -EXPORT_SYMBOL_GPL(akitaioexp_device);
> +static struct i2c_board_info akita_i2c_board_info[] = {
> + {
> + .type = "max7310",
> + .addr = 0x18,
> + .platform_data = &akita_ioexp,
> + },
> +};
>
> static void __init akita_init(void)
> {
> @@ -659,9 +654,9 @@ static void __init akita_init(void)
> spitz_pcmcia_config.num_devs = 1;
> platform_scoop_config = &spitz_pcmcia_config;
>
> - platform_device_register(&akitaioexp_device);
> + pxa_set_i2c_info(NULL);
> + i2c_register_board_info(0, ARRAY_AND_SIZE(akita_i2c_board_info));
>
> - spitzscoop_device.dev.parent = &akitaioexp_device.dev;
> common_init();
> }
> #endif
> diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c
> index acfa712..b89a3ed 100644
> --- a/sound/soc/pxa/spitz.c
> +++ b/sound/soc/pxa/spitz.c
> @@ -28,7 +28,6 @@
> #include <asm/mach-types.h>
> #include <mach/pxa-regs.h>
> #include <mach/hardware.h>
> -#include <mach/akita.h>
> #include <mach/spitz.h>
> #include "../codecs/wm8750.h"
> #include "pxa2xx-pcm.h"
> @@ -219,14 +218,10 @@ static int spitz_mic_bias(struct snd_soc_dapm_widget *w,
> gpio_set_value(SPITZ_GPIO_MIC_BIAS,
> SND_SOC_DAPM_EVENT_ON(event));
>
> - if (machine_is_akita()) {
> - if (SND_SOC_DAPM_EVENT_ON(event))
> - akita_set_ioexp(&akitaioexp_device.dev,
> - AKITA_IOEXP_MIC_BIAS);
> - else
> - akita_reset_ioexp(&akitaioexp_device.dev,
> - AKITA_IOEXP_MIC_BIAS);
> - }
> + if (machine_is_akita())
> + gpio_set_value(AKITA_GPIO_MIC_BIAS,
> + SND_SOC_DAPM_EVENT_ON(event));
> +
> return 0;
> }
>
> --
> 1.5.4.3
>
--
With best wishes
Dmitry
-------------------------------------------------------------------
List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php
Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php
[Site Home] [Linux Arm] [Fedora ARM] [Gcc Help] [Git] [DCCP] [IETF Announce] [Security] [PDAs] [Linux] [Linux Book List] [Linux MIPS] [Yosemite Campsites] [Photos]
![]() |
|