2006-04-02 20:46:30 +04:00
/*
* linux / arch / arm / mach - omap1 / board - ams - delta . c
*
* Modified from board - generic . c
*
* Board specific inits for the Amstrad E3 ( codename Delta ) videophone
*
* Copyright ( C ) 2006 Jonathan McDowell < noodles @ earth . li >
*
* 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 .
*/
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
# include <linux/basic_mmio_gpio.h>
2011-07-26 13:53:52 +04:00
# include <linux/gpio.h>
2006-04-02 20:46:30 +04:00
# include <linux/kernel.h>
# include <linux/init.h>
2006-12-07 04:13:52 +03:00
# include <linux/input.h>
2009-08-28 21:51:37 +04:00
# include <linux/interrupt.h>
2010-10-02 03:37:01 +04:00
# include <linux/leds.h>
2006-04-02 20:46:30 +04:00
# include <linux/platform_device.h>
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
# include <linux/regulator/consumer.h>
# include <linux/regulator/fixed.h>
# include <linux/regulator/machine.h>
2009-08-28 21:51:37 +04:00
# include <linux/serial_8250.h>
2011-08-01 00:17:29 +04:00
# include <linux/export.h>
2011-09-20 16:23:13 +04:00
# include <linux/omapfb.h>
2012-02-24 22:34:34 +04:00
# include <linux/io.h>
2012-08-31 02:37:24 +04:00
# include <linux/platform_data/gpio-omap.h>
2006-04-02 20:46:30 +04:00
2010-10-02 03:37:00 +04:00
# include <media/soc_camera.h>
2009-08-28 21:51:37 +04:00
# include <asm/serial.h>
2006-04-02 20:46:30 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2009-10-20 20:40:47 +04:00
# include <plat/board-ams-delta.h>
# include <plat/keypad.h>
# include <plat/mux.h>
2006-04-02 20:46:30 +04:00
2012-02-24 22:34:34 +04:00
# include <mach/hardware.h>
2010-04-28 05:07:42 +04:00
# include <mach/ams-delta-fiq.h>
2012-02-24 22:34:34 +04:00
# include <mach/camera.h>
2012-06-04 11:56:15 +04:00
# include <mach/usb.h>
2012-02-24 22:34:34 +04:00
# include "iomap.h"
# include "common.h"
2010-04-28 05:07:42 +04:00
2010-12-21 00:09:22 +03:00
static const unsigned int ams_delta_keymap [ ] = {
2006-12-08 00:58:17 +03:00
KEY ( 0 , 0 , KEY_F1 ) , /* Advert */
2006-12-07 04:13:52 +03:00
2010-12-21 00:09:22 +03:00
KEY ( 0 , 3 , KEY_COFFEE ) , /* Games */
KEY ( 0 , 2 , KEY_QUESTION ) , /* Directory */
KEY ( 2 , 3 , KEY_CONNECT ) , /* Internet */
KEY ( 1 , 2 , KEY_SHOP ) , /* Services */
2006-12-08 00:58:17 +03:00
KEY ( 1 , 1 , KEY_PHONE ) , /* VoiceMail */
2006-12-07 04:13:52 +03:00
2010-12-21 00:09:22 +03:00
KEY ( 0 , 1 , KEY_DELETE ) , /* Delete */
2006-12-08 00:58:17 +03:00
KEY ( 2 , 2 , KEY_PLAY ) , /* Play */
2010-12-21 00:09:22 +03:00
KEY ( 1 , 0 , KEY_PAGEUP ) , /* Up */
KEY ( 1 , 3 , KEY_PAGEDOWN ) , /* Down */
KEY ( 2 , 0 , KEY_EMAIL ) , /* ReadEmail */
KEY ( 2 , 1 , KEY_STOP ) , /* Stop */
2006-12-07 04:13:52 +03:00
/* Numeric keypad portion */
2010-12-21 00:09:22 +03:00
KEY ( 0 , 7 , KEY_KP1 ) ,
KEY ( 0 , 6 , KEY_KP2 ) ,
KEY ( 0 , 5 , KEY_KP3 ) ,
KEY ( 1 , 7 , KEY_KP4 ) ,
KEY ( 1 , 6 , KEY_KP5 ) ,
KEY ( 1 , 5 , KEY_KP6 ) ,
KEY ( 2 , 7 , KEY_KP7 ) ,
KEY ( 2 , 6 , KEY_KP8 ) ,
KEY ( 2 , 5 , KEY_KP9 ) ,
KEY ( 3 , 6 , KEY_KP0 ) ,
KEY ( 3 , 7 , KEY_KPASTERISK ) ,
KEY ( 3 , 5 , KEY_KPDOT ) , /* # key */
KEY ( 7 , 2 , KEY_NUMLOCK ) , /* Mute */
KEY ( 7 , 1 , KEY_KPMINUS ) , /* Recall */
KEY ( 6 , 1 , KEY_KPPLUS ) , /* Redial */
KEY ( 7 , 6 , KEY_KPSLASH ) , /* Handsfree */
KEY ( 6 , 0 , KEY_ENTER ) , /* Video */
KEY ( 7 , 4 , KEY_CAMERA ) , /* Photo */
KEY ( 0 , 4 , KEY_F2 ) , /* Home */
KEY ( 1 , 4 , KEY_F3 ) , /* Office */
KEY ( 2 , 4 , KEY_F4 ) , /* Mobile */
2006-12-08 00:58:17 +03:00
KEY ( 7 , 7 , KEY_F5 ) , /* SMS */
2010-12-21 00:09:22 +03:00
KEY ( 7 , 5 , KEY_F6 ) , /* Email */
2006-12-07 04:13:52 +03:00
/* QWERTY portion of keypad */
2010-12-21 00:09:22 +03:00
KEY ( 3 , 4 , KEY_Q ) ,
2006-12-07 04:13:52 +03:00
KEY ( 3 , 3 , KEY_W ) ,
2010-12-21 00:09:22 +03:00
KEY ( 3 , 2 , KEY_E ) ,
KEY ( 3 , 1 , KEY_R ) ,
KEY ( 3 , 0 , KEY_T ) ,
KEY ( 4 , 7 , KEY_Y ) ,
KEY ( 4 , 6 , KEY_U ) ,
KEY ( 4 , 5 , KEY_I ) ,
2006-12-07 04:13:52 +03:00
KEY ( 4 , 4 , KEY_O ) ,
2010-12-21 00:09:22 +03:00
KEY ( 4 , 3 , KEY_P ) ,
2006-12-07 04:13:52 +03:00
2010-12-21 00:09:22 +03:00
KEY ( 4 , 2 , KEY_A ) ,
KEY ( 4 , 1 , KEY_S ) ,
KEY ( 4 , 0 , KEY_D ) ,
KEY ( 5 , 7 , KEY_F ) ,
KEY ( 5 , 6 , KEY_G ) ,
2006-12-07 04:13:52 +03:00
KEY ( 5 , 5 , KEY_H ) ,
2010-12-21 00:09:22 +03:00
KEY ( 5 , 4 , KEY_J ) ,
KEY ( 5 , 3 , KEY_K ) ,
KEY ( 5 , 2 , KEY_L ) ,
2006-12-07 04:13:52 +03:00
2010-12-21 00:09:22 +03:00
KEY ( 5 , 1 , KEY_Z ) ,
KEY ( 5 , 0 , KEY_X ) ,
KEY ( 6 , 7 , KEY_C ) ,
2006-12-07 04:13:52 +03:00
KEY ( 6 , 6 , KEY_V ) ,
2010-12-21 00:09:22 +03:00
KEY ( 6 , 5 , KEY_B ) ,
KEY ( 6 , 4 , KEY_N ) ,
KEY ( 6 , 3 , KEY_M ) ,
KEY ( 6 , 2 , KEY_SPACE ) ,
2006-12-07 04:13:52 +03:00
2010-12-21 00:09:22 +03:00
KEY ( 7 , 0 , KEY_LEFTSHIFT ) , /* Vol up */
KEY ( 7 , 3 , KEY_LEFTCTRL ) , /* Vol down */
2006-12-07 04:13:52 +03:00
} ;
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
# define LATCH1_PHYS 0x01000000
# define LATCH1_VIRT 0xEA000000
# define MODEM_PHYS 0x04000000
# define MODEM_VIRT 0xEB000000
# define LATCH2_PHYS 0x08000000
# define LATCH2_VIRT 0xEC000000
2006-04-02 20:46:30 +04:00
static struct map_desc ams_delta_io_desc [ ] __initdata = {
2007-12-14 05:27:15 +03:00
/* AMS_DELTA_LATCH1 */
2006-04-02 20:46:30 +04:00
{
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. virtual = LATCH1_VIRT ,
. pfn = __phys_to_pfn ( LATCH1_PHYS ) ,
2006-04-02 20:46:30 +04:00
. length = 0x01000000 ,
. type = MT_DEVICE
} ,
2007-12-14 05:27:15 +03:00
/* AMS_DELTA_LATCH2 */
2006-04-02 20:46:30 +04:00
{
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. virtual = LATCH2_VIRT ,
. pfn = __phys_to_pfn ( LATCH2_PHYS ) ,
2006-04-02 20:46:30 +04:00
. length = 0x01000000 ,
. type = MT_DEVICE
} ,
2007-12-14 05:27:15 +03:00
/* AMS_DELTA_MODEM */
2006-04-02 20:46:30 +04:00
{
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. virtual = MODEM_VIRT ,
. pfn = __phys_to_pfn ( MODEM_PHYS ) ,
2006-04-02 20:46:30 +04:00
. length = 0x01000000 ,
. type = MT_DEVICE
}
} ;
2012-02-10 20:48:43 +04:00
static struct omap_lcd_config ams_delta_lcd_config __initdata = {
2006-12-08 00:58:17 +03:00
. ctrl_name = " internal " ,
} ;
2012-03-02 03:19:15 +04:00
static struct omap_usb_config ams_delta_usb_config = {
2006-06-27 03:16:01 +04:00
. register_host = 1 ,
. hmc_mode = 16 ,
. pins [ 0 ] = 2 ,
} ;
2011-12-20 03:08:53 +04:00
# define LATCH1_GPIO_BASE 232
# define LATCH1_NGPIO 8
2012-02-10 20:48:43 +04:00
static struct resource latch1_resources [ ] = {
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
[ 0 ] = {
. name = " dat " ,
. start = LATCH1_PHYS ,
2011-12-20 03:08:53 +04:00
. end = LATCH1_PHYS + ( LATCH1_NGPIO - 1 ) / 8 ,
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. flags = IORESOURCE_MEM ,
} ,
} ;
2012-02-10 20:48:43 +04:00
static struct bgpio_pdata latch1_pdata = {
2011-12-20 03:08:53 +04:00
. base = LATCH1_GPIO_BASE ,
. ngpio = LATCH1_NGPIO ,
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
} ;
static struct platform_device latch1_gpio_device = {
. name = " basic-mmio-gpio " ,
. id = 0 ,
. resource = latch1_resources ,
. num_resources = ARRAY_SIZE ( latch1_resources ) ,
. dev = {
. platform_data = & latch1_pdata ,
} ,
} ;
2012-02-10 20:48:43 +04:00
static struct resource latch2_resources [ ] = {
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
[ 0 ] = {
. name = " dat " ,
. start = LATCH2_PHYS ,
. end = LATCH2_PHYS + ( AMS_DELTA_LATCH2_NGPIO - 1 ) / 8 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2012-02-10 20:48:43 +04:00
static struct bgpio_pdata latch2_pdata = {
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. base = AMS_DELTA_LATCH2_GPIO_BASE ,
. ngpio = AMS_DELTA_LATCH2_NGPIO ,
} ;
static struct platform_device latch2_gpio_device = {
. name = " basic-mmio-gpio " ,
. id = 1 ,
. resource = latch2_resources ,
. num_resources = ARRAY_SIZE ( latch2_resources ) ,
. dev = {
. platform_data = & latch2_pdata ,
} ,
} ;
2012-02-10 20:48:43 +04:00
static const struct gpio latch_gpios [ ] __initconst = {
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
{
2011-12-20 03:08:53 +04:00
. gpio = LATCH1_GPIO_BASE + 6 ,
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. flags = GPIOF_OUT_INIT_LOW ,
. label = " dockit1 " ,
} ,
{
2011-12-20 03:08:53 +04:00
. gpio = LATCH1_GPIO_BASE + 7 ,
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. flags = GPIOF_OUT_INIT_LOW ,
. label = " dockit2 " ,
} ,
{
. gpio = AMS_DELTA_GPIO_PIN_SCARD_RSTIN ,
. flags = GPIOF_OUT_INIT_LOW ,
. label = " scard_rstin " ,
} ,
{
. gpio = AMS_DELTA_GPIO_PIN_SCARD_CMDVCC ,
. flags = GPIOF_OUT_INIT_LOW ,
. label = " scard_cmdvcc " ,
} ,
{
. gpio = AMS_DELTA_GPIO_PIN_MODEM_CODEC ,
. flags = GPIOF_OUT_INIT_LOW ,
. label = " modem_codec " ,
} ,
{
. gpio = AMS_DELTA_LATCH2_GPIO_BASE + 14 ,
. flags = GPIOF_OUT_INIT_LOW ,
. label = " hookflash1 " ,
} ,
{
. gpio = AMS_DELTA_LATCH2_GPIO_BASE + 15 ,
. flags = GPIOF_OUT_INIT_LOW ,
. label = " hookflash2 " ,
} ,
} ;
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
static struct regulator_consumer_supply modem_nreset_consumers [ ] = {
REGULATOR_SUPPLY ( " RESET# " , " serial8250.1 " ) ,
REGULATOR_SUPPLY ( " POR " , " cx20442-codec " ) ,
} ;
static struct regulator_init_data modem_nreset_data = {
. constraints = {
. valid_ops_mask = REGULATOR_CHANGE_STATUS ,
. boot_on = 1 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( modem_nreset_consumers ) ,
. consumer_supplies = modem_nreset_consumers ,
} ;
static struct fixed_voltage_config modem_nreset_config = {
. supply_name = " modem_nreset " ,
. microvolts = 3300000 ,
. gpio = AMS_DELTA_GPIO_PIN_MODEM_NRESET ,
. startup_delay = 25000 ,
. enable_high = 1 ,
. enabled_at_boot = 1 ,
. init_data = & modem_nreset_data ,
} ;
static struct platform_device modem_nreset_device = {
. name = " reg-fixed-voltage " ,
. id = - 1 ,
. dev = {
. platform_data = & modem_nreset_config ,
} ,
} ;
struct modem_private_data {
struct regulator * regulator ;
} ;
static struct modem_private_data modem_priv ;
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
void ams_delta_latch_write ( int base , int ngpio , u16 mask , u16 value )
{
int bit = 0 ;
u16 bitpos = 1 < < bit ;
for ( ; bit < ngpio ; bit + + , bitpos = bitpos < < 1 ) {
if ( ! ( mask & bitpos ) )
continue ;
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
else
gpio_set_value ( base + bit , ( value & bitpos ) ! = 0 ) ;
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
}
}
EXPORT_SYMBOL ( ams_delta_latch_write ) ;
2010-12-15 17:43:44 +03:00
static struct resource ams_delta_nand_resources [ ] = {
[ 0 ] = {
. start = OMAP1_MPUIO_BASE ,
. end = OMAP1_MPUIO_BASE +
OMAP_MPUIO_IO_CNTL + sizeof ( u32 ) - 1 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2010-12-14 23:09:40 +03:00
static struct platform_device ams_delta_nand_device = {
. name = " ams-delta-nand " ,
2010-12-15 17:43:44 +03:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( ams_delta_nand_resources ) ,
. resource = ams_delta_nand_resources ,
2010-12-14 23:09:40 +03:00
} ;
2006-12-07 04:13:52 +03:00
static struct resource ams_delta_kp_resources [ ] = {
[ 0 ] = {
. start = INT_KEYBOARD ,
. end = INT_KEYBOARD ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
2010-12-21 00:09:22 +03:00
static const struct matrix_keymap_data ams_delta_keymap_data = {
. keymap = ams_delta_keymap ,
. keymap_size = ARRAY_SIZE ( ams_delta_keymap ) ,
} ;
2012-03-02 03:19:15 +04:00
static struct omap_kp_platform_data ams_delta_kp_data = {
2006-12-07 04:13:52 +03:00
. rows = 8 ,
. cols = 8 ,
2010-12-21 00:09:22 +03:00
. keymap_data = & ams_delta_keymap_data ,
2006-12-07 04:13:52 +03:00
. delay = 9 ,
} ;
2011-07-04 14:56:15 +04:00
static struct platform_device ams_delta_kp_device = {
2006-12-07 04:13:52 +03:00
. name = " omap-keypad " ,
. id = - 1 ,
. dev = {
. platform_data = & ams_delta_kp_data ,
} ,
. num_resources = ARRAY_SIZE ( ams_delta_kp_resources ) ,
. resource = ams_delta_kp_resources ,
} ;
2011-07-04 14:56:15 +04:00
static struct platform_device ams_delta_lcd_device = {
2006-12-08 00:58:17 +03:00
. name = " lcd_ams_delta " ,
. id = - 1 ,
} ;
2012-02-10 20:48:43 +04:00
static const struct gpio_led gpio_leds [ ] __initconst = {
2011-12-20 03:08:53 +04:00
{
. name = " camera " ,
. gpio = LATCH1_GPIO_BASE + 0 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
# ifdef CONFIG_LEDS_TRIGGERS
. default_trigger = " ams_delta_camera " ,
# endif
} ,
{
. name = " advert " ,
. gpio = LATCH1_GPIO_BASE + 1 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} ,
{
. name = " email " ,
. gpio = LATCH1_GPIO_BASE + 2 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} ,
{
. name = " handsfree " ,
. gpio = LATCH1_GPIO_BASE + 3 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} ,
{
. name = " voicemail " ,
. gpio = LATCH1_GPIO_BASE + 4 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} ,
{
. name = " voice " ,
. gpio = LATCH1_GPIO_BASE + 5 ,
. default_state = LEDS_GPIO_DEFSTATE_OFF ,
} ,
} ;
2012-02-10 20:48:43 +04:00
static const struct gpio_led_platform_data leds_pdata __initconst = {
2011-12-20 03:08:53 +04:00
. leds = gpio_leds ,
. num_leds = ARRAY_SIZE ( gpio_leds ) ,
2006-06-23 13:05:33 +04:00
} ;
2010-10-02 03:37:00 +04:00
static struct i2c_board_info ams_delta_camera_board_info [ ] = {
{
I2C_BOARD_INFO ( " ov6650 " , 0x60 ) ,
} ,
} ;
2010-10-02 03:37:01 +04:00
# ifdef CONFIG_LEDS_TRIGGERS
DEFINE_LED_TRIGGER ( ams_delta_camera_led_trigger ) ;
static int ams_delta_camera_power ( struct device * dev , int power )
{
/*
* turn on camera LED
*/
if ( power )
led_trigger_event ( ams_delta_camera_led_trigger , LED_FULL ) ;
else
led_trigger_event ( ams_delta_camera_led_trigger , LED_OFF ) ;
return 0 ;
}
# else
# define ams_delta_camera_power NULL
# endif
2011-02-09 23:40:10 +03:00
static struct soc_camera_link ams_delta_iclink = {
2010-10-02 03:37:00 +04:00
. bus_id = 0 , /* OMAP1 SoC camera bus */
. i2c_adapter_id = 1 ,
. board_info = & ams_delta_camera_board_info [ 0 ] ,
. module_name = " ov6650 " ,
2010-10-02 03:37:01 +04:00
. power = ams_delta_camera_power ,
2010-10-02 03:37:00 +04:00
} ;
2011-07-04 14:56:15 +04:00
static struct platform_device ams_delta_camera_device = {
2010-10-02 03:37:00 +04:00
. name = " soc-camera-pdrv " ,
. id = 0 ,
. dev = {
. platform_data = & ams_delta_iclink ,
} ,
} ;
static struct omap1_cam_platform_data ams_delta_camera_platform_data = {
. camexclk_khz = 12000 , /* default 12MHz clock, no extra DPLL */
. lclk_khz_max = 1334 , /* results in 5fps CIF, 10fps QCIF */
} ;
2006-06-23 13:05:33 +04:00
static struct platform_device * ams_delta_devices [ ] __initdata = {
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
& latch1_gpio_device ,
& latch2_gpio_device ,
2006-12-07 04:13:52 +03:00
& ams_delta_kp_device ,
2010-10-02 03:37:00 +04:00
& ams_delta_camera_device ,
2006-06-23 13:05:33 +04:00
} ;
2012-02-10 20:48:43 +04:00
static struct platform_device * late_devices [ ] __initdata = {
ARM: OMAP1: ams-delta: register latch dependent devices later
In preparation to converting Amstrad Delta on-board latches to
basic_mmio_gpio devices, registration of platform devices which depend
on latches and will require initialization of their GPIO pins first,
should be moved out of .machine_init down to late_initcall level, as the
gpio-generic driver is not available until device_initcall time. The
latch reset operation, which will be replaced with GPIO initialization,
must also be moved to late_initcall for the same reason.
Since there was already another, separate arch_initcall function for
setting up one of those latch dependent devices, the on-board modem
device, reuse that function, i.e., rename it to a name that matches the
new purpose, extend with other device setup relocated from
.machine_init, and move down to the late_initcall level.
While being at it, add missing gpio_free() in case the modem platform
device registration fails.
Thanks to Tony Lindgren <tony@atomide.com> who suggested this approach
instead of shifting up the gpio-generic driver initialization.
In addition, defer registration of the Amstrad Delta ASoC and serio
devices, done from their device driver files, until late_initcall time,
as those drivers will depend on their GPIO pins already requested from
the board late_init() function until updated to register their GPIO pins
themselves.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-21 01:54:18 +04:00
& ams_delta_nand_device ,
2006-12-08 00:58:17 +03:00
& ams_delta_lcd_device ,
2006-06-23 13:05:33 +04:00
} ;
2006-04-02 20:46:30 +04:00
static void __init ams_delta_init ( void )
{
2009-10-23 01:47:42 +04:00
/* mux pins for uarts */
omap_cfg_reg ( UART1_TX ) ;
omap_cfg_reg ( UART1_RTS ) ;
2010-10-02 03:37:00 +04:00
/* parallel camera interface */
omap_cfg_reg ( H19_1610_CAM_EXCLK ) ;
omap_cfg_reg ( J15_1610_CAM_LCLK ) ;
omap_cfg_reg ( L18_1610_CAM_VS ) ;
omap_cfg_reg ( L15_1610_CAM_HS ) ;
omap_cfg_reg ( L19_1610_CAM_D0 ) ;
omap_cfg_reg ( K14_1610_CAM_D1 ) ;
omap_cfg_reg ( K15_1610_CAM_D2 ) ;
omap_cfg_reg ( K19_1610_CAM_D3 ) ;
omap_cfg_reg ( K18_1610_CAM_D4 ) ;
omap_cfg_reg ( J14_1610_CAM_D5 ) ;
omap_cfg_reg ( J19_1610_CAM_D6 ) ;
omap_cfg_reg ( J18_1610_CAM_D7 ) ;
2006-04-02 20:46:30 +04:00
omap_serial_init ( ) ;
2007-11-07 07:54:32 +03:00
omap_register_i2c_bus ( 1 , 100 , NULL , 0 ) ;
2006-04-02 20:46:30 +04:00
2010-07-05 17:31:30 +04:00
omap1_usb_init ( & ams_delta_usb_config ) ;
2010-10-02 03:37:00 +04:00
omap1_set_camera_info ( & ams_delta_camera_platform_data ) ;
2010-10-02 03:37:01 +04:00
# ifdef CONFIG_LEDS_TRIGGERS
led_trigger_register_simple ( " ams_delta_camera " ,
& ams_delta_camera_led_trigger ) ;
# endif
2011-12-20 03:08:53 +04:00
gpio_led_register_device ( - 1 , & leds_pdata ) ;
2006-06-23 13:05:33 +04:00
platform_add_devices ( ams_delta_devices , ARRAY_SIZE ( ams_delta_devices ) ) ;
2009-10-23 01:47:42 +04:00
2010-04-28 05:07:42 +04:00
ams_delta_init_fiq ( ) ;
2009-10-23 01:47:42 +04:00
omap_writew ( omap_readw ( ARM_RSTCT1 ) | 0x0004 , ARM_RSTCT1 ) ;
2011-09-20 16:23:13 +04:00
omapfb_set_lcd_config ( & ams_delta_lcd_config ) ;
2006-04-02 20:46:30 +04:00
}
2012-03-05 20:05:11 +04:00
static void modem_pm ( struct uart_port * port , unsigned int state , unsigned old )
{
struct modem_private_data * priv = port - > private_data ;
2012-03-05 20:05:12 +04:00
if ( IS_ERR ( priv - > regulator ) )
return ;
2012-03-05 20:05:11 +04:00
if ( state = = old )
return ;
2012-03-05 20:05:12 +04:00
if ( state = = 0 )
regulator_enable ( priv - > regulator ) ;
else if ( old = = 0 )
regulator_disable ( priv - > regulator ) ;
2012-03-05 20:05:11 +04:00
}
2009-08-28 21:51:37 +04:00
static struct plat_serial8250_port ams_delta_modem_ports [ ] = {
{
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
. membase = IOMEM ( MODEM_VIRT ) ,
. mapbase = MODEM_PHYS ,
2009-08-28 21:51:37 +04:00
. irq = - EINVAL , /* changed later */
. flags = UPF_BOOT_AUTOCONF ,
. irqflags = IRQF_TRIGGER_RISING ,
. iotype = UPIO_MEM ,
. regshift = 1 ,
. uartclk = BASE_BAUD * 16 ,
2012-03-05 20:05:11 +04:00
. pm = modem_pm ,
. private_data = & modem_priv ,
2009-08-28 21:51:37 +04:00
} ,
{ } ,
} ;
static struct platform_device ams_delta_modem_device = {
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM1 ,
. dev = {
. platform_data = ams_delta_modem_ports ,
} ,
} ;
ARM: OMAP1: ams-delta: register latch dependent devices later
In preparation to converting Amstrad Delta on-board latches to
basic_mmio_gpio devices, registration of platform devices which depend
on latches and will require initialization of their GPIO pins first,
should be moved out of .machine_init down to late_initcall level, as the
gpio-generic driver is not available until device_initcall time. The
latch reset operation, which will be replaced with GPIO initialization,
must also be moved to late_initcall for the same reason.
Since there was already another, separate arch_initcall function for
setting up one of those latch dependent devices, the on-board modem
device, reuse that function, i.e., rename it to a name that matches the
new purpose, extend with other device setup relocated from
.machine_init, and move down to the late_initcall level.
While being at it, add missing gpio_free() in case the modem platform
device registration fails.
Thanks to Tony Lindgren <tony@atomide.com> who suggested this approach
instead of shifting up the gpio-generic driver initialization.
In addition, defer registration of the Amstrad Delta ASoC and serio
devices, done from their device driver files, until late_initcall time,
as those drivers will depend on their GPIO pins already requested from
the board late_init() function until updated to register their GPIO pins
themselves.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-21 01:54:18 +04:00
static int __init late_init ( void )
2009-08-28 21:51:37 +04:00
{
2010-04-28 05:05:47 +04:00
int err ;
2010-12-10 20:46:24 +03:00
if ( ! machine_is_ams_delta ( ) )
return - ENODEV ;
ARM: OMAP1: ams-delta: convert latches to basic_mmio_gpio
Once ready, ams-delta specific device drivers currently calling custom
ams_delta_latch[12]_write() functions can be updated to call generic
gpio_set_value() instead, which will make them less platform dependent.
Even more, some custom ams-delta only drivers can perhaps be dropped
from the tree after converting selected ams-delta platform devices to
follow generic GPIO based device models.
The latch_gpios[] table is initially filled with all latch1 and latch2
GPIO pins in order to register and initialize them from the board file
until those are handled by respective existing device drivers (leds,
nand, lcd, serio, asoc, serial). That table will get almost empty after
the transision process is completed, holding only pins not used by any
drivers / connected to unused devices, in order to initialize them from
the board file for power saving purposes.
The new ams_delta_latch_write() function is a unified replacement for
those removed ams_delta_latch[12]_write(), and serves as a temporary
wrapper over gpio_set_value(), providing the old API for those not yet
updated device drivers, and will be removed after all custom drivers are
converted or replaced.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-20 06:24:21 +04:00
err = gpio_request_array ( latch_gpios , ARRAY_SIZE ( latch_gpios ) ) ;
if ( err ) {
pr_err ( " Couldn't take over latch1/latch2 GPIO pins \n " ) ;
return err ;
}
ARM: OMAP1: ams-delta: register latch dependent devices later
In preparation to converting Amstrad Delta on-board latches to
basic_mmio_gpio devices, registration of platform devices which depend
on latches and will require initialization of their GPIO pins first,
should be moved out of .machine_init down to late_initcall level, as the
gpio-generic driver is not available until device_initcall time. The
latch reset operation, which will be replaced with GPIO initialization,
must also be moved to late_initcall for the same reason.
Since there was already another, separate arch_initcall function for
setting up one of those latch dependent devices, the on-board modem
device, reuse that function, i.e., rename it to a name that matches the
new purpose, extend with other device setup relocated from
.machine_init, and move down to the late_initcall level.
While being at it, add missing gpio_free() in case the modem platform
device registration fails.
Thanks to Tony Lindgren <tony@atomide.com> who suggested this approach
instead of shifting up the gpio-generic driver initialization.
In addition, defer registration of the Amstrad Delta ASoC and serio
devices, done from their device driver files, until late_initcall time,
as those drivers will depend on their GPIO pins already requested from
the board late_init() function until updated to register their GPIO pins
themselves.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-21 01:54:18 +04:00
platform_add_devices ( late_devices , ARRAY_SIZE ( late_devices ) ) ;
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
err = platform_device_register ( & modem_nreset_device ) ;
if ( err ) {
pr_err ( " Couldn't register the modem regulator device \n " ) ;
return err ;
}
2009-08-28 21:51:37 +04:00
omap_cfg_reg ( M14_1510_GPIO2 ) ;
2010-04-28 05:05:47 +04:00
ams_delta_modem_ports [ 0 ] . irq =
gpio_to_irq ( AMS_DELTA_GPIO_PIN_MODEM_IRQ ) ;
err = gpio_request ( AMS_DELTA_GPIO_PIN_MODEM_IRQ , " modem " ) ;
if ( err ) {
pr_err ( " Couldn't request gpio pin for modem \n " ) ;
return err ;
}
gpio_direction_input ( AMS_DELTA_GPIO_PIN_MODEM_IRQ ) ;
2009-08-28 21:51:37 +04:00
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
/* Initialize the modem_nreset regulator consumer before use */
modem_priv . regulator = ERR_PTR ( - ENODEV ) ;
2012-03-05 20:05:11 +04:00
ams_delta_latch2_write ( AMS_DELTA_LATCH2_MODEM_CODEC ,
AMS_DELTA_LATCH2_MODEM_CODEC ) ;
2009-08-28 21:51:37 +04:00
ARM: OMAP1: ams-delta: register latch dependent devices later
In preparation to converting Amstrad Delta on-board latches to
basic_mmio_gpio devices, registration of platform devices which depend
on latches and will require initialization of their GPIO pins first,
should be moved out of .machine_init down to late_initcall level, as the
gpio-generic driver is not available until device_initcall time. The
latch reset operation, which will be replaced with GPIO initialization,
must also be moved to late_initcall for the same reason.
Since there was already another, separate arch_initcall function for
setting up one of those latch dependent devices, the on-board modem
device, reuse that function, i.e., rename it to a name that matches the
new purpose, extend with other device setup relocated from
.machine_init, and move down to the late_initcall level.
While being at it, add missing gpio_free() in case the modem platform
device registration fails.
Thanks to Tony Lindgren <tony@atomide.com> who suggested this approach
instead of shifting up the gpio-generic driver initialization.
In addition, defer registration of the Amstrad Delta ASoC and serio
devices, done from their device driver files, until late_initcall time,
as those drivers will depend on their GPIO pins already requested from
the board late_init() function until updated to register their GPIO pins
themselves.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-21 01:54:18 +04:00
err = platform_device_register ( & ams_delta_modem_device ) ;
if ( err )
goto gpio_free ;
2009-08-28 21:51:37 +04:00
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
/*
* Once the modem device is registered , the modem_nreset
* regulator can be requested on behalf of that device .
*/
modem_priv . regulator = regulator_get ( & ams_delta_modem_device . dev ,
" RESET# " ) ;
if ( IS_ERR ( modem_priv . regulator ) ) {
err = PTR_ERR ( modem_priv . regulator ) ;
goto unregister ;
}
ARM: OMAP1: ams-delta: register latch dependent devices later
In preparation to converting Amstrad Delta on-board latches to
basic_mmio_gpio devices, registration of platform devices which depend
on latches and will require initialization of their GPIO pins first,
should be moved out of .machine_init down to late_initcall level, as the
gpio-generic driver is not available until device_initcall time. The
latch reset operation, which will be replaced with GPIO initialization,
must also be moved to late_initcall for the same reason.
Since there was already another, separate arch_initcall function for
setting up one of those latch dependent devices, the on-board modem
device, reuse that function, i.e., rename it to a name that matches the
new purpose, extend with other device setup relocated from
.machine_init, and move down to the late_initcall level.
While being at it, add missing gpio_free() in case the modem platform
device registration fails.
Thanks to Tony Lindgren <tony@atomide.com> who suggested this approach
instead of shifting up the gpio-generic driver initialization.
In addition, defer registration of the Amstrad Delta ASoC and serio
devices, done from their device driver files, until late_initcall time,
as those drivers will depend on their GPIO pins already requested from
the board late_init() function until updated to register their GPIO pins
themselves.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-21 01:54:18 +04:00
return 0 ;
ARM: OMAP1: ams-delta: set up regulator over modem reset GPIO pin
The Amstrad Delta on-board latch2 bit named MODEM_NRESET, now available
as a GPIO pin AMS_DELTA_GPIO_PIN_NMODEM_RESET, is used to power up/down
(bring into/out of a reset state) two distinct on-board devices
simultaneously: the modem, and the voice codec. As a consequence, that
bit is, or can be, manipulated concurrently by two drivers, or their
platform provided hooks.
Instead of updating those drivers to use the gpiolib API as a new method
of controlling the MODEM_NRESET pin state, like it was done to other
drivers accessing latch2 pins, and still being vulnerable to potential
concurrency conflicts, or trying to solve that sharing issue with a
custom piece of code, set up a fixed regulator device on top of that
GPIO pin, with the intention of updating both drivers to manipulate that
regulator, not the GPIO pin directly.
Before the ASoC driver is updated and the modem platform data expanded
with a power management callback for switching its power, the
ams_delta_latch_write() function, which still provides the old API for
accessing latch2 functionality from not updated drivers, is modified to
toggle the regulator instead of the MODEM_NRESET GPIO pin. A helper
function provided for balancing the regulator enable/disable operations,
together with the consumer data needed for tracking the regulator state,
will be removed once the drivers are updated.
Depends on patch series "ARM: OMAP1: ams-delta: replace custom I/O with
GPIO".
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-03-05 20:05:10 +04:00
unregister :
platform_device_unregister ( & ams_delta_modem_device ) ;
ARM: OMAP1: ams-delta: register latch dependent devices later
In preparation to converting Amstrad Delta on-board latches to
basic_mmio_gpio devices, registration of platform devices which depend
on latches and will require initialization of their GPIO pins first,
should be moved out of .machine_init down to late_initcall level, as the
gpio-generic driver is not available until device_initcall time. The
latch reset operation, which will be replaced with GPIO initialization,
must also be moved to late_initcall for the same reason.
Since there was already another, separate arch_initcall function for
setting up one of those latch dependent devices, the on-board modem
device, reuse that function, i.e., rename it to a name that matches the
new purpose, extend with other device setup relocated from
.machine_init, and move down to the late_initcall level.
While being at it, add missing gpio_free() in case the modem platform
device registration fails.
Thanks to Tony Lindgren <tony@atomide.com> who suggested this approach
instead of shifting up the gpio-generic driver initialization.
In addition, defer registration of the Amstrad Delta ASoC and serio
devices, done from their device driver files, until late_initcall time,
as those drivers will depend on their GPIO pins already requested from
the board late_init() function until updated to register their GPIO pins
themselves.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2011-12-21 01:54:18 +04:00
gpio_free :
gpio_free ( AMS_DELTA_GPIO_PIN_MODEM_IRQ ) ;
return err ;
2009-08-28 21:51:37 +04:00
}
2012-04-26 09:49:29 +04:00
static void __init ams_delta_init_late ( void )
{
omap1_init_late ( ) ;
late_init ( ) ;
}
2009-08-28 21:51:37 +04:00
2011-11-10 03:29:31 +04:00
static void __init ams_delta_map_io ( void )
{
omap15xx_map_io ( ) ;
iotable_init ( ams_delta_io_desc , ARRAY_SIZE ( ams_delta_io_desc ) ) ;
}
2006-04-02 20:46:30 +04:00
MACHINE_START ( AMS_DELTA , " Amstrad E3 (Delta) " )
/* Maintainer: Jonathan McDowell <noodles@earth.li> */
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2011-11-10 03:29:31 +04:00
. map_io = ams_delta_map_io ,
2011-10-06 02:14:02 +04:00
. init_early = omap1_init_early ,
2010-05-23 13:18:16 +04:00
. reserve = omap_reserve ,
2011-10-06 02:14:02 +04:00
. init_irq = omap1_init_irq ,
2006-04-02 20:46:30 +04:00
. init_machine = ams_delta_init ,
2012-04-26 09:49:29 +04:00
. init_late = ams_delta_init_late ,
2011-03-30 02:54:48 +04:00
. timer = & omap1_timer ,
2011-11-05 21:06:28 +04:00
. restart = omap1_restart ,
2006-04-02 20:46:30 +04:00
MACHINE_END