new locomo driver
Subsystems (13)
cover new locomo driver
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. Current drivers present in Linux kernel has some problems:
* It uses custom bus instead of platform bus/mfd core.
* Device drivers are not well layered/separated.
* It uses custom gpio accessors instead of using GPIOLIB.
With this patchset I tried to modernise and restructure the LoCoMo driver. Also I added an experimental SPI driver that will be used by mmc-spi on Sharp SL-5500 collie devices.
----------------------------------------------------------------
Dmitry Eremin-Solenikov (15):
mfd: add new driver for Sharp LoCoMo
GPIO: port LoCoMo gpio support from old driver
leds: port locomo leds driver to new locomo core
input: convert LoCoMo keyboard driver to use new locomo core
video: backlight: add new locomo backlight driver
video: lcd: add LoCoMo LCD driver
video: backlight: drop old locomo bl/lcd driver
ARM: sa1100: make collie use new locomo drivers
ARM: sa1100: don't preallocate IRQ space for locomo
ARM: pxa: poodle: use new LoCoMo driver
sound: soc: poodle: make use of new locomo GPIO interface
ARM: pxa: poodle: don't preallocate IRQ space for locomo
ARM: drop old LoCoMo driver
gpio: locomo: implement per-pin irq handling
spi: add locomo SPI driver
arch/arm/common/Kconfig | 3 -
arch/arm/common/Makefile | 1 -
arch/arm/common/locomo.c | 914 ---------------------
arch/arm/mach-pxa/Kconfig | 1 -
arch/arm/mach-pxa/include/mach/poodle.h | 16 +-
arch/arm/mach-pxa/poodle.c | 23 +-
arch/arm/mach-sa1100/Kconfig | 1 -
arch/arm/mach-sa1100/collie.c | 112 +--
arch/arm/mach-sa1100/include/mach/collie.h | 25 +-
arch/arm/mach-sa1100/include/mach/irqs.h | 19 +-
drivers/gpio/Kconfig | 7 +
drivers/gpio/Makefile | 1 +
drivers/gpio/gpio-locomo.c | 386 +++++++++
drivers/input/keyboard/Kconfig | 1 -
drivers/input/keyboard/locomokbd.c | 165 ++--
drivers/leds/Kconfig | 1 -
drivers/leds/leds-locomo.c | 104 ++-
drivers/mfd/Kconfig | 8 +
drivers/mfd/Makefile | 1 +
drivers/mfd/locomo.c | 644 +++++++++++++++
drivers/spi/Kconfig | 8 +
drivers/spi/Makefile | 1 +
drivers/spi/spi-locomo.c | 370 +++++++++
drivers/video/backlight/Kconfig | 14 +-
drivers/video/backlight/Makefile | 3 +-
drivers/video/backlight/locomo_bl.c | 171 ++++
drivers/video/backlight/locomo_lcd.c | 224 +++++
drivers/video/backlight/locomolcd.c | 255 ------
.../asm/hardware => include/linux/mfd}/locomo.h | 148 ++--
sound/soc/pxa/poodle.c | 51 +-
30 files changed, 2185 insertions(+), 1493 deletions(-)
delete mode 100644 arch/arm/common/locomo.c
create mode 100644 drivers/gpio/gpio-locomo.c
create mode 100644 drivers/mfd/locomo.c
create mode 100644 drivers/spi/spi-locomo.c
create mode 100644 drivers/video/backlight/locomo_bl.c
create mode 100644 drivers/video/backlight/locomo_lcd.c
delete mode 100644 drivers/video/backlight/locomolcd.c
rename {arch/arm/include/asm/hardware => include/linux/mfd}/locomo.h (55%)PATCH 1/15 mfd: add new driver for Sharp LoCoMo
LoCoMo is a GA used on Sharp Zaurus SL-5x00. Current driver does has several design issues (special bus instead of platform bus, doesn't use mfd-core, etc).
Implement 'core' parts of locomo support as an mfd driver.
--- drivers/mfd/Kconfig | 8 + drivers/mfd/Makefile | 1 + drivers/mfd/locomo.c | 644 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/locomo.h | 171 ++++++++++++ 4 files changed, 824 insertions(+) create mode 100644 drivers/mfd/locomo.c create mode 100644 include/linux/mfd/locomo.h
drivers/mfd/Kconfig +8 -0
@@ -1318,6 +1318,14 @@ config MFD_STW481X in various ST Microelectronics and ST-Ericsson embedded Nomadik series. +config MFD_LOCOMO + bool "Sharp LoCoMo support" + depends on ARM + select MFD_CORE + help + Support for Sharp LoCoMo Grid Array found in Sharp SL-5x00 + PDA family. + menu "Multimedia Capabilities Port drivers" depends on ARCH_SA1100
drivers/mfd/Makefile +1 -0
@@ -174,6 +174,7 @@ obj-$(CONFIG_MFD_STW481X) += stw481x.o obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o +obj-$(CONFIG_MFD_LOCOMO) += locomo.o intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o
drivers/mfd/locomo.c new file +644 -0
644 lines not on this page · raw message
include/linux/mfd/locomo.h new file +171 -0
171 lines not on this page · raw message
Signature · 1 line
2.1.1
A message that is not in the archive (sent off-list or not yet received): 1414454528-24240-2-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Quoted 7 lines · Dmitry Eremin-Solenikov
LoCoMo is a GA used on Sharp Zaurus SL-5x00. Current driver does has several design issues (special bus instead of platform bus, doesn't use mfd-core, etc).
Implement 'core' parts of locomo support as an mfd driver.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
(...)
Quoted 7 lines
drivers/mfd/locomo.c new file +7
-0+/* DAC send data */ +#define M62332_SLAVE_ADDR 0x4e/* Slave address */ +#define M62332_W_BIT 0x00/* W bit (0 only) */ +#define M62332_SUB_ADDR 0x00/* Sub address */ +#define M62332_A_BIT 0x00/* A bit (0 only) */ + +/* DAC setup and hold times (expressed in us) */
drivers/mfd/locomo.c line 151
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+#define DAC_BUS_FREE_TIME 5/* 4.7 us */ +#define DAC_START_SETUP_TIME 5/* 4.7 us */ +#define DAC_STOP_SETUP_TIME 4/* 4.0 us */ +#define DAC_START_HOLD_TIME 5/* 4.7 us */ +#define DAC_SCL_LOW_HOLD_TIME 5/* 4.7 us */ +#define DAC_SCL_HIGH_HOLD_TIME 4/* 4.0 us */ +#define DAC_DATA_SETUP_TIME 1/* 250 ns */ +#define DAC_DATA_HOLD_TIME 1/* 300 ns */ +#define DAC_LOW_SETUP_TIME 1/* 300 ns */ +#define DAC_HIGH_SETUP_TIME 1/* 1000 ns */
(...)
It seems some DAC handling is part of the MFD driver, and we recently discussed that MFD should not be doing misc stuff but mainly act as arbiter and switching station.
Can you please move the DAC parts of the driver to drivers/iio/dac?
The IIO DAC subsystem will likely add other goodies to the driver for free and give a nice API to consumers.
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+/* IRQ support */ +static void locomo_handler (unsigned int irq,struct irq_desc *desc) +{ +struct locomo *lchip =irq_get_handler_data (irq); +int req, i;
drivers/mfd/locomo.c line 359
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ +/* Acknowledge the parent IRQ */ + desc->irq_data.chip->irq_ack (&desc->irq_data); + +/* check why this interrupt was generated */ + req =readw (lchip->base +LOCOMO_ICR ) &0x0f00 ; + +if (req) { +/* generate the next interrupt(s) */ + irq = lchip->irq_base;
This use if a static IRQ base is oldschool. Use irqdomain, see for example tc3589x.c.
irq_domain_add_simple() should suffice.
IIRC you have used irqdomain before so you know the drill.
drivers/mfd/locomo.c line 364
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+for (i =0 ; i <=3 ; i++, irq++) { +if (req & (0x0100 << i)) +generic_handle_irq (irq); + + }
Reading the status register once and then check the IRQs can be dangerous on non-threaded interrupt handlers as it could miss transient IRQs appearing duing the IRQ handling.
The best example code is in drivers/irqchip.
For example in irq-vic.c there is this nice loop:
while ((stat = readl_relaxed(vic->base + VIC_IRQ_STATUS))) {
irq = ffs(stat) - 1;
handle_domain_irq(vic->domain, irq, regs);
handled = 1;
}Note how stat is re-read on each iteration.
drivers/mfd/locomo.c line 403
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+static void locomo_setup_irq (struct locomo *lchip) +{ +int irq; + + lchip->irq_base =irq_alloc_descs (-1 ,0 ,LOCOMO_NR_IRQS ,-1 );
irqdomain will allocate descriptors for you when calling irq_create_mapping() which should be done for all lines.
Quoted 16 lines
drivers/mfd/locomo.c new file +16
-0+/* Install handlers for IRQ_LOCOMO_* */ +for (irq = lchip->irq_base; + irq < lchip->irq_base +LOCOMO_NR_IRQS ; + irq++) { +irq_set_chip_and_handler (irq, &locomo_chip, handle_level_irq); +irq_set_chip_data (irq, lchip); +set_irq_flags (irq,IRQF_VALID |IRQF_PROBE ); + } + +/* +* Install handler for IRQ_LOCOMO_HW. +*/ +irq_set_irq_type (lchip->irq,IRQ_TYPE_EDGE_FALLING ); +irq_set_handler_data (lchip->irq, lchip); +irq_set_chained_handler (lchip->irq, locomo_handler); +}
(...)
drivers/mfd/locomo.c line 547
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+/* Longtime timer */ +writew (0 , lchip->base +LOCOMO_LTINT ); +/* SPI */ +writew (0 , lchip->base +LOCOMO_SPI +LOCOMO_SPIIE ); + +writew (6 +8 +320 +30 -10 , lchip->base +LOCOMO_ASD );
That's a few magic numbers and calculation don't you think?
A comment stating what's going on would be helpful.
drivers/mfd/locomo.c line 552
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+ r =readw (lchip->base +LOCOMO_ASD ); + r |=0x8000 ; +writew (r, lchip->base +LOCOMO_ASD ); + +writew (6 +8 +320 +30 -10 -128 +4 , lchip->base +LOCOMO_HSD );
Dito.
drivers/mfd/locomo.c line 557
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+ r =readw (lchip->base +LOCOMO_HSD ); + r |=0x8000 ; +writew (r, lchip->base +LOCOMO_HSD ); + +writew (128 /8 , lchip->base +LOCOMO_HSC );
Dito.
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Hello,
Thank you for the review of patches.
2014-10-31 10:42 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 35 lines
Quoted 7 lines · Dmitry Eremin-Solenikov
LoCoMo is a GA used on Sharp Zaurus SL-5x00. Current driver does has several design issues (special bus instead of platform bus, doesn't use mfd-core, etc).
Implement 'core' parts of locomo support as an mfd driver.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>(...)
Quoted 7 lines
drivers/mfd/locomo.c new file +7
-0+/* DAC send data */ +#define M62332_SLAVE_ADDR 0x4e/* Slave address */ +#define M62332_W_BIT 0x00/* W bit (0 only) */ +#define M62332_SUB_ADDR 0x00/* Sub address */ +#define M62332_A_BIT 0x00/* A bit (0 only) */ + +/* DAC setup and hold times (expressed in us) */ drivers/mfd/locomo.c line 151
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+#define DAC_BUS_FREE_TIME 5/* 4.7 us */ +#define DAC_START_SETUP_TIME 5/* 4.7 us */ +#define DAC_STOP_SETUP_TIME 4/* 4.0 us */ +#define DAC_START_HOLD_TIME 5/* 4.7 us */ +#define DAC_SCL_LOW_HOLD_TIME 5/* 4.7 us */ +#define DAC_SCL_HIGH_HOLD_TIME 4/* 4.0 us */ +#define DAC_DATA_SETUP_TIME 1/* 250 ns */ +#define DAC_DATA_HOLD_TIME 1/* 300 ns */ +#define DAC_LOW_SETUP_TIME 1/* 300 ns */ +#define DAC_HIGH_SETUP_TIME 1/* 1000 ns */ (...)
It seems some DAC handling is part of the MFD driver, and we recently discussed that MFD should not be doing misc stuff but mainly act as arbiter and switching station.
Quoted 5 lines
Can you please move the DAC parts of the driver to
drivers/iio/dac?The IIO DAC subsystem will likely add other goodies to the driver for free and give a nice API to consumers.
I wanted this part to be as simple as possible. I will look into IIO DAC subsystem.
The DAC is as simple 2 channel 8-bit i2c device connected to a separate i2c bus controlled through a register in LoCoMo device. One channel is used for backlight,
other will be used for volume control. So (in theory) I can add the following device
chain: locomo -> i2c-locomo -> m62332 -> IIO DAC client. However isn't that quite an overkill for just backlight & volume control? Please advice me on this.
[skipped the irqdomain part - I will use them, thanks for the suggestion.]
Quoted 10 lines
drivers/mfd/locomo.c line 547
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+/* Longtime timer */ +writew (0 , lchip->base +LOCOMO_LTINT ); +/* SPI */ +writew (0 , lchip->base +LOCOMO_SPI +LOCOMO_SPIIE ); + +writew (6 +8 +320 +30 -10 , lchip->base +LOCOMO_ASD );That's a few magic numbers and calculation don't you think?
A comment stating what's going on would be helpful.
Unfortunately little is known here - these values are c&p from old 2.4 Lineo code.
This part is related to generating synchronization pulses for accessing touchscreen.
Signature · 2 lines
With best wishes Dmitry
A message that is not in the archive (sent off-list or not yet received): CALT56yNX8v4mZn=o1ZoVLHPmg6wq0dgFNowpqNuFtU=eCc+d8w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Quoted 12 lines · Dmitry Eremin-Solenikov
2014-10-31 10:42 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 9 lines
It seems some DAC handling is part of the MFD driver, and we recently discussed that MFD should not be doing misc stuff but mainly act as arbiter and switching station.
Can you please move the DAC parts of the driver to
drivers/iio/dac?The IIO DAC subsystem will likely add other goodies to the driver for free and give a nice API to consumers.
Quoted 9 lines
I wanted this part to be as simple as possible. I will look into IIO DAC subsystem.
The DAC is as simple 2 channel 8-bit i2c device connected to a separate i2c bus controlled through a register in LoCoMo device. One channel is used for backlight,
other will be used for volume control. So (in theory) I can add the following device
chain: locomo -> i2c-locomo -> m62332 -> IIO DAC client. However isn't that quite an overkill for just backlight & volume control? Please advice me on this.
The point is still the same: no unrelated code in drivers/mfd, then either use IIO DAC as a middle layer or sink the DAC handling into respective subdriver, i.e. push it into the backlight or volume directly then.
Quoted 7 lines
Quoted 7 lines
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+/* Longtime timer */ +writew (0 , lchip->base +LOCOMO_LTINT ); +/* SPI */ +writew (0 , lchip->base +LOCOMO_SPI +LOCOMO_SPIIE ); + +writew (6 +8 +320 +30 -10 , lchip->base +LOCOMO_ASD );
Quoted 8 lines
Quoted 3 lines
That's a few magic numbers and calculation don't you think?
A comment stating what's going on would be helpful.
Unfortunately little is known here - these values are c&p from old 2.4 Lineo code.
This part is related to generating synchronization pulses for accessing touchscreen.
OK we have to live with reverse engineering results, that's OK.
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
2014-11-03 16:41 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 24 lines
Quoted 12 lines · Dmitry Eremin-Solenikov
2014-10-31 10:42 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 9 lines
It seems some DAC handling is part of the MFD driver, and we recently discussed that MFD should not be doing misc stuff but mainly act as arbiter and switching station.
Can you please move the DAC parts of the driver to
drivers/iio/dac?The IIO DAC subsystem will likely add other goodies to the driver for free and give a nice API to consumers.
Quoted 9 lines
I wanted this part to be as simple as possible. I will look into IIO DAC subsystem.
The DAC is as simple 2 channel 8-bit i2c device connected to a separate i2c bus controlled through a register in LoCoMo device. One channel is used for backlight,
other will be used for volume control. So (in theory) I can add the following device
chain: locomo -> i2c-locomo -> m62332 -> IIO DAC client. However isn't that quite an overkill for just backlight & volume control? Please advice me on this.
Quoted 4 lines
The point is still the same: no unrelated code in
drivers/mfd, then either use IIO DAC as a middle layer or sink the DAC handling into respective subdriver, i.e. push it into the backlight or volume directly then.
The problem is that the DAC is equally used by backlight and by sound device (WIP).
What about true i2c device driver sitting in drivers/misc and exporting a regmap of 2 8-bit registers?
Signature · 2 lines
With best wishes Dmitry
Mark Brown
maintainerRe: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Quoted 11 lines · Dmitry Eremin-Solenikov
2014-11-03 16:41 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 4 lines
The point is still the same: no unrelated code in
drivers/mfd, then either use IIO DAC as a middle layer or sink the DAC handling into respective subdriver, i.e. push it into the backlight or volume directly then.The problem is that the DAC is equally used by backlight and by sound device (WIP).
What about true i2c device driver sitting indrivers/miscand exporting a regmap of 2 8-bit registers?
If it can just export registers that sounds like a MFD. If it needs to export functionality then like Linus says the IIO subsystem abstracts DACs.
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Hello,
2014-11-05 23:24 GMT+03:00 Mark Brown <[email protected]>:
Quoted 8 lines · Dmitry Eremin-Solenikov
Quoted 6 lines
2014-11-03 16:41 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 4 lines
The point is still the same: no unrelated code in
drivers/mfd, then either use IIO DAC as a middle layer or sink the DAC handling into respective subdriver, i.e. push it into the backlight or volume directly then.
Quoted 8 lines
Quoted 4 lines
The problem is that the DAC is equally used by backlight and by sound device (WIP).
What about true i2c device driver sitting indrivers/miscand exporting a regmap of 2 8-bit registers?If it can just export registers that sounds like a MFD. If it needs to export functionality then like Linus says the IIO subsystem abstracts DACs.
I took a look at IIO subsystem. Thanks for the pointer. Indeed max517 driver can drive m62332 DAC with minimal modifications. However write support of the consumer interface is non-existing yet (which would be required to support DACs in unified manner).
I'm actually looking at the regulator interface. Since this DAC serves mostly like a (semi-)constant voltage interface, would it be rather logical to use regulator subsystem to drive it?
Signature · 2 lines
With best wishes Dmitry
Mark Brown
maintainerRe: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Quoted 3 lines · Dmitry Eremin-Solenikov
I'm actually looking at the regulator interface. Since this DAC serves mostly like a (semi-)constant voltage interface, would it be rather logical to use regulator subsystem to drive it?
Possibly... it's mostly a function of what the consumers of the functionality look like - if that code looks weird calling into the regulator API then it's bad, if that code looks OK it's fine. I haven't looked at the hardware at all so don't have strong feelings either way so long as the result looks tasteful.
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
2014-11-14 18:10 GMT+03:00 Mark Brown <[email protected]>:
Quoted 11 lines · Dmitry Eremin-Solenikov
Quoted 4 lines
I'm actually looking at the regulator interface. Since this DAC serves mostly like a (semi-)constant voltage interface, would it be rather logical to use regulator subsystem to drive it?
Possibly... it's mostly a function of what the consumers of the functionality look like - if that code looks weird calling into the regulator API then it's bad, if that code looks OK it's fine. I haven't looked at the hardware at all so don't have strong feelings either way so long as the result looks tasteful.
The DAC is used in backlight driver (control brightness) and in ASoC machine driver (master joined volume).
Signature · 2 lines
With best wishes Dmitry
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
In reply to Dmitry Eremin-SolenikovQuoted 25 lines · Dmitry Eremin-Solenikov
2014-11-03 16:41 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 24 lines
Quoted 21 lines · Dmitry Eremin-Solenikov
2014-10-31 10:42 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 9 lines
It seems some DAC handling is part of the MFD driver, and we recently discussed that MFD should not be doing misc stuff but mainly act as arbiter and switching station.
Can you please move the DAC parts of the driver to
drivers/iio/dac?The IIO DAC subsystem will likely add other goodies to the driver for free and give a nice API to consumers.
I wanted this part to be as simple as possible. I will look into IIO DAC subsystem.
The DAC is as simple 2 channel 8-bit i2c device connected to a separate i2c bus controlled through a register in LoCoMo device. One channel is used for backlight,
other will be used for volume control. So (in theory) I can add the following device
chain: locomo -> i2c-locomo -> m62332 -> IIO DAC client. However isn't that quite an overkill for just backlight & volume control? Please advice me on this.
Quoted 7 lines
Quoted 4 lines
The point is still the same: no unrelated code in
drivers/mfd, then either use IIO DAC as a middle layer or sink the DAC handling into respective subdriver, i.e. push it into the backlight or volume directly then.The problem is that the DAC is equally used by backlight and by sound device (WIP).
That shouldn't be a problem. The IIO API allows different consumers to request different channels of a converter. You can write a generic IIO based backlight driver and a generic IIO based volume control driver. This makes it possible to re-use them in other circuits with other DACs but the same application.
Quoted 2 lines
What about true i2c device driver sitting in
drivers/miscand exporting a regmap of 2 8-bit registers?
If it is a generic DAC it should go into drivers/iio/, this will allow code sharing and code re-usability. Given the simplicity of the DAC there might even be other existing drivers that can be used to control it.
- Lars
Re: [PATCH 01/15] mfd: add new driver for Sharp LoCoMo
Quoted 3 lines · Lars-Peter Clausen
If it is a generic DAC it should go into
drivers/iio/, this will allow code sharing and code re-usability. Given the simplicity of the DAC there might even be other existing drivers that can be used to control it.
I just had a quick look and I think the M62332 will work out of the box with the max517 driver.
- Lars
PATCH 2/15 GPIO: port LoCoMo gpio support from old driver
In reply to Dmitry Eremin-SolenikovAdd gpiolib driver for gpio pins placed on the LoCoMo GA.
--- drivers/gpio/Kconfig | 7 ++ drivers/gpio/Makefile | 1 + drivers/gpio/gpio-locomo.c | 228 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 236 insertions(+) create mode 100644 drivers/gpio/gpio-locomo.c
drivers/gpio/Kconfig +7 -0
@@ -457,6 +457,13 @@ config GPIO_TB10X select GENERIC_IRQ_CHIP select OF_GPIO +config GPIO_LOCOMO + bool "Sharp LoCoMo GPIO support" + depends on MFD_LOCOMO + help + Select this to support GPIO pins on Sharp LoCoMo Grid Array found + in Sharp Zaurus collie and poodle models. + comment "I2C GPIO expanders:" config GPIO_ARIZONA
drivers/gpio/Makefile +1 -0
@@ -39,6 +39,7 @@ obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o obj-$(CONFIG_GPIO_KEMPLD) += gpio-kempld.o obj-$(CONFIG_ARCH_KS8695) += gpio-ks8695.o obj-$(CONFIG_GPIO_INTEL_MID) += gpio-intel-mid.o +obj-$(CONFIG_GPIO_LOCOMO) += gpio-locomo.o obj-$(CONFIG_GPIO_LP3943) += gpio-lp3943.o obj-$(CONFIG_ARCH_LPC32XX) += gpio-lpc32xx.o obj-$(CONFIG_GPIO_LYNXPOINT) += gpio-lynxpoint.o
drivers/gpio/gpio-locomo.c new file +228 -0
228 lines not on this page · raw message
Signature · 1 line
2.1.1
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
Quoted 3 lines · Dmitry Eremin-Solenikov
Add gpiolib driver for gpio pins placed on the LoCoMo GA.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
(...)
drivers/gpio/gpio-locomo.c line 41
Quoted 6 lines
drivers/gpio/gpio-locomo.c new file +6
-0+static int locomo_gpio_get (struct gpio_chip *chip, +unsigned offset) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); + +return readw (lg->regs +LOCOMO_GPL ) & (1 << offset);
Do this:
#include <linux/bitops.h>
return !!(readw(lg->regs + LOCOMO_GPL) & BIT(offset));
So you clamp the returned value to a bool.
drivers/gpio/gpio-locomo.c line 52
Quoted 9 lines
drivers/gpio/gpio-locomo.c new file +9
-0+static void __locomo_gpio_set (struct gpio_chip *chip, +unsigned offset,int value) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); +u16 r; + + r =readw (lg->regs +LOCOMO_GPO ); +if (value) + r |=1 << offset;
r |= BIT(offset);
Review
Quoted 2 lines
(quoted diff) +2
-0+ else + r &= ~(1 << offset);
r &= BIT(offset);
(etc, everywhere this pattern occurs).
drivers/gpio/gpio-locomo.c line 68
Quoted 11 lines
drivers/gpio/gpio-locomo.c new file +11
-0+static void locomo_gpio_set (struct gpio_chip *chip, +unsigned offset,int value) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); +unsigned long flags; + +spin_lock_irqsave (&lg->lock, flags); + +__locomo_gpio_set (chip, offset, value); + +spin_unlock_irqrestore (&lg->lock, flags);
If you actually always have to be getting and releasing a spin lock around the register writes, contemplate using regmap-mmio because that is part of what it does.
But is this locking really necessary?
drivers/gpio/gpio-locomo.c line 209
Quoted 10 lines
drivers/gpio/gpio-locomo.c new file +10
-0+static int locomo_gpio_remove (struct platform_device *pdev) +{ +struct locomo_gpio *lg =platform_get_drvdata (pdev); +int ret; + + ret =gpiochip_remove (&lg->gpio); +if (ret) { +dev_err (&pdev->dev,"Can't remove gpio chip: %d\n" , ret); +return ret; + }
The return value from gpiochip_remove() has been removed in v3.18-rc1 so this will not compile.
Yours,
Linus Walleij
A message that is not in the archive (sent off-list or not yet received): CACRpkdY7tRadod2vQfEytmw-ubaMAvr_=XTczD5bUMkqie0xkg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
2014-10-31 10:48 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 7 lines
Quoted 3 lines · Dmitry Eremin-Solenikov
Add gpiolib driver for gpio pins placed on the LoCoMo GA.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
[skipped]
Quoted 17 lines
(etc, everywhere this pattern occurs).
drivers/gpio/gpio-locomo.c line 68
Quoted 11 lines
drivers/gpio/gpio-locomo.c new file +11
-0+static void locomo_gpio_set (struct gpio_chip *chip, +unsigned offset,int value) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); +unsigned long flags; + +spin_lock_irqsave (&lg->lock, flags); + +__locomo_gpio_set (chip, offset, value); + +spin_unlock_irqrestore (&lg->lock, flags);If you actually always have to be getting and releasing a spin lock around the register writes, contemplate using regmap-mmio because that is part of what it does.
Quoted 1 line
But is this locking really necessary?
I have a custom of doing such locking and never having to think about somebody breaking into RMW cycles.
Also isn't regmap an overkill here? Wouldn't regmap also do a lock/unlock around each register read/write/RMW?
Quoted 5 lines
Quoted 5 lines
drivers/gpio/gpio-locomo.c new file +5
-0+static int locomo_gpio_remove (struct platform_device *pdev) +{ +struct locomo_gpio *lg =platform_get_drvdata (pdev); +int ret; +
Quoted 8 lines
drivers/gpio/gpio-locomo.c line 209
Quoted 5 lines
drivers/gpio/gpio-locomo.c new file +5
-0+ ret =gpiochip_remove (&lg->gpio); +if (ret) { +dev_err (&pdev->dev,"Can't remove gpio chip: %d\n" , ret); +return ret; + }The return value from
gpiochip_remove()has been removed in v3.18-rc1 so this will not compile.
Yes, the fix will be in the next iteration. This patchset was based on 3.17
Signature · 6 lines
With best wishes Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): CALT56yOgMUA7o2dzfHph=S2zkDV4zERzMh4ishpPwpAx7Cqj6Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
Quoted 28 lines · Dmitry Eremin-Solenikov
2014-10-31 10:48 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 7 lines
Quoted 3 lines · Dmitry Eremin-Solenikov
Add gpiolib driver for gpio pins placed on the LoCoMo GA.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>[skipped]
Quoted 17 lines
(etc, everywhere this pattern occurs).
drivers/gpio/gpio-locomo.c line 68
Quoted 11 lines
drivers/gpio/gpio-locomo.c new file +11
-0+static void locomo_gpio_set (struct gpio_chip *chip, +unsigned offset,int value) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); +unsigned long flags; + +spin_lock_irqsave (&lg->lock, flags); + +__locomo_gpio_set (chip, offset, value); + +spin_unlock_irqrestore (&lg->lock, flags);If you actually always have to be getting and releasing a spin lock around the register writes, contemplate using regmap-mmio because that is part of what it does.
Quoted 7 lines
Quoted 1 line
But is this locking really necessary?
I have a custom of doing such locking and never having to think about somebody breaking into RMW cycles.
Also isn't regmap an overkill here? Wouldn't regmap also do a lock/unlock around each register read/write/RMW?
Yes that's the point: if you use regmap mmio you get the RMW-locking for free, with the regmap implementation.
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): CACRpkdb7v3LmOhbhQ9TPk1_bnLnpwizawW6RQvhQRLSjRewAaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
2014-11-03 16:43 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 32 lines
Quoted 30 lines · Dmitry Eremin-Solenikov
2014-10-31 10:48 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 7 lines
Quoted 3 lines · Dmitry Eremin-Solenikov
Add gpiolib driver for gpio pins placed on the LoCoMo GA.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>[skipped]
Quoted 18 lines
(etc, everywhere this pattern occurs).
Review
Quoted 11 lines
(quoted diff) +11
-0+static void locomo_gpio_set(struct gpio_chip *chip, + unsigned offset, int value) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); + unsigned long flags; + + spin_lock_irqsave(&lg->lock, flags); + + __locomo_gpio_set(chip, offset, value); + + spin_unlock_irqrestore(&lg->lock, flags);If you actually always have to be getting and releasing a spin lock around the register writes, contemplate using regmap-mmio because that is part of what it does.
But is this locking really necessary?
Quoted 8 lines
Quoted 5 lines
I have a custom of doing such locking and never having to think about somebody breaking into RMW cycles.
Also isn't regmap an overkill here? Wouldn't regmap also do a lock/unlock around each register read/write/RMW?
Yes that's the point: if you use regmap mmio you get the RMW-locking for free, with the regmap implementation.
Just to be more concrete. Currently locomo_gpio_ack_irq() function uses one lock and one unlock for doing 3 consecutive RMW I I convert locomo to regmap, will that be 3 lock/unlock calls or still one? (Or maybe I'm trying to be over-protective here and adding more lock/unlock cycles won't matter that much?)
Next question: if I have to export regmap to several subdrivers, is it better to have one big regmap or to have one-map-per-driver approach?
Signature · 6 lines
With best wishes Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Mark Brown
maintainerRe: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
Quoted 10 lines · Dmitry Eremin-Solenikov
2014-11-03 16:43 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 2 lines
Yes that's the point: if you use regmap mmio you get the RMW-locking for free, with the regmap implementation.
Just to be more concrete. Currently
locomo_gpio_ack_irq()function uses one lock and one unlock for doing 3 consecutive RMW I I convert locomo to regmap, will that be 3 lock/unlock calls or still one? (Or maybe I'm trying to be over-protective here and adding more lock/unlock cycles won't matter that much?)
You'll get three lock/unlocks, we could add an interface for bulk updates under one lock if it's important though.
Quoted 2 lines
Next question: if I have to export regmap to several subdrivers, is it better to have one big regmap or to have one-map-per-driver approach?
One regmap for the physical register map which is shared between all the users.
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
2014-11-06 9:03 GMT+03:00 Mark Brown <[email protected]>:
Quoted 12 lines · Dmitry Eremin-Solenikov
Quoted 10 lines
2014-11-03 16:43 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 2 lines
Yes that's the point: if you use regmap mmio you get the RMW-locking for free, with the regmap implementation.
Just to be more concrete. Currently
locomo_gpio_ack_irq()function uses one lock and one unlock for doing 3 consecutive RMW I I convert locomo to regmap, will that be 3 lock/unlock calls or still one? (Or maybe I'm trying to be over-protective here and adding more lock/unlock cycles won't matter that much?)
Quoted 8 lines
You'll get three lock/unlocks, we could add an interface for bulk updates under one lock if it's important though.
Quoted 2 lines
Next question: if I have to export regmap to several subdrivers, is it better to have one big regmap or to have one-map-per-driver approach?
One regmap for the physical register map which is shared between all the users.
Mark, Linus,
Just to better understand your suggestions: do you want me to convert to regmap only gpio driver or do you suggest to convert all LoCoMo drivers? That is doable, of course, but the amount of changes is overwhelming. Also I'm concerned about the performance impact from going through regmap layers.
Signature · 2 lines
With best wishes Dmitry
A message that is not in the archive (sent off-list or not yet received): CALT56yPr42FV66USngocw=eWPt81d5R2MJxmzBnv02HOMmXAkA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
Quoted 5 lines · Dmitry Eremin-Solenikov
Just to better understand your suggestions: do you want me to convert to regmap only gpio driver or do you suggest to convert all LoCoMo drivers? That is doable, of course, but the amount of changes is overwhelming. Also I'm concerned about the performance impact from going through regmap layers.
I don't care.
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
In reply to a message not in the archiveQuoted 2 lines · Dmitry Eremin-Solenikov
Just to better understand your suggestions: do you want me to convert to regmap only gpio driver or do you suggest to convert all LoCoMo drivers?
Um... I was just thinking about this one usecase.
It's no big deal, the other review comments are more important.
Quoted 3 lines
That is doable, of course, but the amount of changes is overwhelming. Also I'm concerned about the performance impact from going through regmap layers.
Is it on a critical path? The current locking isn't any less invasive AFAICT.
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 02/15] GPIO: port LoCoMo gpio support from old driver
2014-11-14 13:11 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 7 lines
Quoted 2 lines · Dmitry Eremin-Solenikov
Just to better understand your suggestions: do you want me to convert to regmap only gpio driver or do you suggest to convert all LoCoMo drivers?
Um... I was just thinking about this one usecase.
I ended up converting all drivers. It allowed me to clean up several points in the driver.
Quoted 2 lines
It's no big deal, the other review comments are more important.
Fixed most of the comments. Last remaining issue is factoring out m62332 interface.
Quoted 9 lines
Quoted 3 lines
That is doable, of course, but the amount of changes is overwhelming. Also I'm concerned about the performance impact from going through regmap layers.
Is it on a critical path? The current locking isn't any less invasive AFAICT.
Yours,
Linus Walleij
Signature · 2 lines
With best wishes Dmitry
PATCH 3/15 leds: port locomo leds driver to new locomo core
In reply to Dmitry Eremin-SolenikovAdapt locomo leds driver to new locomo core setup.
--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 104 +++++++++++++++++++++++++++------------------ 2 files changed, 62 insertions(+), 43 deletions(-)
drivers/leds/Kconfig +0 -1
@@ -69,7 +69,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMO help This option enables support for the LEDs on Sharp Locomo. Zaurus models SL-5500 and SL-5600.
drivers/leds/leds-locomo.c +62 -42
149 lines not on this page · raw message
Signature · 1 line
2.1.1
A message that is not in the archive (sent off-list or not yet received): 1414454528-24240-1-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
PATCH 4/15 input: convert LoCoMo keyboard driver to use new locomo core
As LoCoMo is switching to new device model, adapt keyboard driver to support new locomo core driver.
--- drivers/input/keyboard/Kconfig | 1 - drivers/input/keyboard/locomokbd.c | 165 ++++++++++++++++++++----------------- 2 files changed, 91 insertions(+), 75 deletions(-)
drivers/input/keyboard/Kconfig +0 -1
@@ -337,7 +337,6 @@ config KEYBOARD_LM8333 config KEYBOARD_LOCOMO tristate "LoCoMo Keyboard Support" - depends on SHARP_LOCOMO help Say Y here if you are running Linux on a Sharp Zaurus Collie or Poodle based PDA
drivers/input/keyboard/locomokbd.c +91 -74
284 lines not on this page · raw message
Signature · 6 lines
2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Dmitry Torokhov
maintainerRe: [PATCH 04/15] input: convert LoCoMo keyboard driver to use new locomo core
Quoted 191 lines · Dmitry Eremin-Solenikov
As LoCoMo is switching to new device model, adapt keyboard driver to support new locomo core driver.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/input/keyboard/Kconfig | 1 - drivers/input/keyboard/locomokbd.c | 165 ++++++++++++++++++++----------------- 2 files changed, 91 insertions(+), 75 deletions(-)drivers/input/keyboard/Kconfig +0
-1@@ -337,7 +337,6 @@ config KEYBOARD_LM8333 config KEYBOARD_LOCOMO tristate "LoCoMo Keyboard Support" - depends on SHARP_LOCOMO help Say Y here if you are running Linux on a Sharp Zaurus Collie or Poodle based PDAdrivers/input/keyboard/locomokbd.c +35
-43@@ -28,16 +28,10 @@#include <linux/init.h> #include <linux/input.h> #include <linux/delay.h> -#include <linux/device.h> +#include <linux/platform_device.h> #include <linux/interrupt.h> -#include <linux/ioport.h> - -#include <asm/hardware/locomo.h> -#include <asm/irq.h> - -MODULE_AUTHOR ("John Lenz <[email protected]>" ); -MODULE_DESCRIPTION ("LoCoMo keyboard driver" ); -MODULE_LICENSE ("GPL" ); +#include <linux/io.h> +#include <linux/mfd/locomo.h> #define LOCOMOKBD_NUMKEYS 128@@ -75,7 +69,8 @@ struct locomokbd {struct input_dev *input;char phys[32 ]; -unsigned long base; +void __iomem *base; +int irq;spinlock_t lock;struct timer_list timer;@@ -84,37 +79,37 @@ struct locomokbd { };/* helper functions for reading the keyboard matrix */ -static inline void locomokbd_charge_all (unsigned long membase) +static inline void locomokbd_charge_all (void __iomem *membase) { -locomo_writel (0x00FF , membase +LOCOMO_KSC ); +writew (0x00FF , membase +LOCOMO_KSC ); } -static inline void locomokbd_activate_all (unsigned long membase) +static inline void locomokbd_activate_all (void __iomem *membase) {unsigned long r; -locomo_writel (0 , membase +LOCOMO_KSC ); - r =locomo_readl (membase +LOCOMO_KIC ); +writew (0 , membase +LOCOMO_KSC ); + r =readw (membase +LOCOMO_KIC ); r &=0xFEFF ; -locomo_writel (r, membase +LOCOMO_KIC ); +writew (r, membase +LOCOMO_KIC ); } -static inline void locomokbd_activate_col (unsigned long membase,int col) +static inline void locomokbd_activate_col (void __iomem *membase,int col) {unsigned short nset;unsigned short nbset; nset =0xFF & ~(1 << col); nbset = (nset <<8 ) + nset; -locomo_writel (nbset, membase +LOCOMO_KSC ); +writew (nbset, membase +LOCOMO_KSC ); } -static inline void locomokbd_reset_col (unsigned long membase,int col) +static inline void locomokbd_reset_col (void __iomem *membase,int col) {unsigned short nbset; nbset = ((0xFF & ~(1 << col)) <<8 ) +0xFF ; -locomo_writel (nbset, membase +LOCOMO_KSC ); +writew (nbset, membase +LOCOMO_KSC ); }/* @@ -129,7 +124,7 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd)unsigned int row, col, rowd;unsigned long flags;unsigned int num_pressed; -unsigned long membase = locomokbd->base; +void __iomem *membase = locomokbd->base;spin_lock_irqsave (&locomokbd->lock, flags);@@ -141,7 +136,7 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd)locomokbd_activate_col (membase, col);udelay (KB_DELAY ); - rowd = ~locomo_readl (membase +LOCOMO_KIB ); + rowd = ~readw (membase +LOCOMO_KIB );for (row =0 ; row <KB_ROWS ; row++) {unsigned int scancode, pressed, key;@@ -194,11 +189,11 @@ static irqreturn_t locomokbd_interrupt(int irq, void *dev_id)struct locomokbd *locomokbd = dev_id;u16 r; - r =locomo_readl (locomokbd->base +LOCOMO_KIC ); + r =readw (locomokbd->base +LOCOMO_KIC );if ((r &0x0001 ) ==0 )return IRQ_HANDLED ; -locomo_writel (r & ~0x0100 , locomokbd->base +LOCOMO_KIC );/* Ack */ +writew (r & ~0x0100 , locomokbd->base +LOCOMO_KIC );/* Ack */ /** wait chattering delay **/ udelay (100 );@@ -222,8 +217,8 @@ static int locomokbd_open(struct input_dev *dev)struct locomokbd *locomokbd =input_get_drvdata (dev);u16 r; - r =locomo_readl (locomokbd->base +LOCOMO_KIC ) |0x0010 ; -locomo_writel (r, locomokbd->base +LOCOMO_KIC ); + r =readw (locomokbd->base +LOCOMO_KIC ) |0x0010 ; +writew (r, locomokbd->base +LOCOMO_KIC );return 0 ; }@@ -232,35 +227,39 @@ static void locomokbd_close(struct input_dev *dev)struct locomokbd *locomokbd =input_get_drvdata (dev);u16 r; - r =locomo_readl (locomokbd->base +LOCOMO_KIC ) & ~0x0010 ; -locomo_writel (r, locomokbd->base +LOCOMO_KIC ); + r =readw (locomokbd->base +LOCOMO_KIC ) & ~0x0010 ; +writew (r, locomokbd->base +LOCOMO_KIC ); } -static int locomokbd_probe (struct locomo_dev *dev) +static int locomokbd_probe (struct platform_device *dev) {struct locomokbd *locomokbd;struct input_dev *input_dev;int i, err; +struct resource *res; + + locomokbd =devm_kzalloc (&dev->dev,sizeof (struct locomokbd ), +GFP_KERNEL ); +if (!locomokbd) +return -ENOMEM ; - locomokbd =kzalloc (sizeof (struct locomokbd ),GFP_KERNEL ); input_dev =input_allocate_device (); -if (!locomokbd || !input_dev) { - err = -ENOMEM ; - goto err_free_mem; - } +if (!input_dev) +return -ENOMEM ; -/* try and claim memory region */ -if (!request_mem_region ((unsigned long ) dev->mapbase, - dev->length, -LOCOMO_DRIVER_NAME (dev))) { - err = -EBUSY ; -printk (KERN_ERR "locomokbd: Can't acquire access to io memory for keyboard\n" ); - goto err_free_mem; - } + res =platform_get_resource (dev,IORESOURCE_MEM ,0 ); +if (!res) +return -ENODEV ; -locomo_set_drvdata (dev, locomokbd);
drivers/input/keyboard/locomokbd.c static void locomokbd_close(struct input_dev *dev) · line 262
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +8
-1+ locomokbd->irq =platform_get_irq (dev,0 ); +if (locomokbd->irq <0 ) +return -ENXIO ; - locomokbd->base = (unsigned long ) dev->mapbase; +platform_set_drvdata (dev, locomokbd); + + locomokbd->base =devm_ioremap_resource (&dev->dev, res); +if (IS_ERR (locomokbd->base)) +return PTR_ERR (locomokbd->base);
You are leaking memory (input device) here. Since you can't convert all resources to devm* I'd rather you leave them all explicitly managed instead of having a mix.
Thanks.
Signature · 1 line
Dmitry
PATCH 8/15 ARM: sa1100: make collie use new locomo drivers
In reply to a message not in the archiveSwitch collie to new mfd-based locomo driver.
--- arch/arm/mach-sa1100/Kconfig | 1 - arch/arm/mach-sa1100/collie.c | 112 +++++++++++++++-------------- arch/arm/mach-sa1100/include/mach/collie.h | 25 ++++++- 3 files changed, 79 insertions(+), 59 deletions(-)
arch/arm/mach-sa1100/Kconfig +0 -1
@@ -48,7 +48,6 @@ endchoice config SA1100_COLLIE bool "Sharp Zaurus SL5500" # FIXME: select ARM_SA11x0_CPUFREQ - select SHARP_LOCOMO select SHARP_PARAM select SHARP_SCOOP help
arch/arm/mach-sa1100/collie.c +57 -55
192 lines not on this page · raw message
arch/arm/mach-sa1100/include/mach/collie.h +22 -3
@@ -24,12 +24,12 @@ extern void locomolcd_power(int on);#define COLLIE_SCP_MUTE_L SCOOP_GPCR_PA14#define COLLIE_SCP_MUTE_R SCOOP_GPCR_PA15#define COLLIE_SCP_5VON SCOOP_GPCR_PA16 -#define COLLIE_SCP_AMP_ON SCOOP_GPCR_PA17 +#define COLLIE_GPIO_AMP2_ON (COLLIE_SCOOP_GPIO_BASE + 6)#define COLLIE_GPIO_VPEN (COLLIE_SCOOP_GPIO_BASE + 7)#define COLLIE_SCP_LB_VOL_CHG SCOOP_GPCR_PA19#define COLLIE_SCOOP_IO_DIR (COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ - COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON | \ + COLLIE_SCP_5VON | \ COLLIE_SCP_LB_VOL_CHG)#define COLLIE_SCOOP_IO_OUT (COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R)
@@ -81,7 +81,7 @@ extern void locomolcd_power(int on);#define COLLIE_TC35143_GPIO_TBL_CHK UCB_IO_1#define COLLIE_TC35143_GPIO_VPEN_ON UCB_IO_2#define COLLIE_GPIO_IR_ON (COLLIE_TC35143_GPIO_BASE + 3) -#define COLLIE_TC35143_GPIO_AMP_ON UCB_IO_4 +#define COLLIE_GPIO_AMP1_ON (COLLIE_TC35143_GPIO_BASE + 4)#define COLLIE_TC35143_GPIO_VERSION1 UCB_IO_5#define COLLIE_TC35143_GPIO_FS8KLPF UCB_IO_5#define COLLIE_TC35143_GPIO_BUZZER_BIAS UCB_IO_6
@@ -92,4 +92,23 @@ extern void locomolcd_power(int on);#define COLLIE_TC35143_GPIO_OUT (UCB_IO_1 | UCB_IO_3 | UCB_IO_4 \ | UCB_IO_6) +/* GPIOs on LoCoMo GA */ +#define COLLIE_LOCOMO_GPIO_BASE (GPIO_MAX + 23) +#define COLLIE_GPIO_RTS (COLLIE_LOCOMO_GPIO_BASE + 0) +#define COLLIE_GPIO_CTS (COLLIE_LOCOMO_GPIO_BASE + 1) +#define COLLIE_GPIO_DSR (COLLIE_LOCOMO_GPIO_BASE + 2) +#define COLLIE_GPIO_DTR (COLLIE_LOCOMO_GPIO_BASE + 3) +#define COLLIE_GPIO_LCD_VSHA_ON (COLLIE_LOCOMO_GPIO_BASE + 4) +#define COLLIE_GPIO_LCD_VSHD_ON (COLLIE_LOCOMO_GPIO_BASE + 5) +#define COLLIE_GPIO_LCD_VEE_ON (COLLIE_LOCOMO_GPIO_BASE + 6) +#define COLLIE_GPIO_LCD_MOD (COLLIE_LOCOMO_GPIO_BASE + 7) +#define COLLIE_LOCOMO_GPIO_DAC_ON LOCOMO_GPIO(8) +#define COLLIE_GPIO_FL_VR (COLLIE_LOCOMO_GPIO_BASE + 9) +#define COLLIE_LOCOMO_GPIO_DAC_SDATA LOCOMO_GPIO(10) +#define COLLIE_LOCOMO_GPIO_DAC_SCK LOCOMO_GPIO(11) +#define COLLIE_LOCOMO_GPIO_DAC_SLOAD LOCOMO_GPIO(12) +#define COLLIE_LOCOMO_GPIO_CARD_DETECT LOCOMO_GPIO(13) +#define COLLIE_LOCOMO_GPIO_WRITE_PROT LOCOMO_GPIO(14) +#define COLLIE_LOCOMO_GPIO_CARD_POWER LOCOMO_GPIO(15) +#endif
Signature · 6 lines
2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 12/15 ARM: pxa: poodle: don't preallocate IRQ space for locomo
In reply to a message not in the archiveAs new locomo driver supports SPARSE_IRQ, don't preallocate NR_IRQS space for it on poodle.
--- arch/arm/mach-pxa/include/mach/poodle.h | 2 +- arch/arm/mach-pxa/poodle.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-)
arch/arm/mach-pxa/include/mach/poodle.h +1 -1
@@ -91,7 +91,7 @@#define POODLE_GPIO_MUTE_L (POODLE_LOCOMO_GPIO_BASE + 10)#define POODLE_GPIO_MUTE_R (POODLE_LOCOMO_GPIO_BASE + 11) -#define POODLE_NR_IRQS (IRQ_BOARD_START + 4)/* 4 for LoCoMo */ +#define POODLE_NR_IRQS IRQ_BOARD_STARTextern struct platform_device poodle_locomo_device;
arch/arm/mach-pxa/poodle.c +6 -2
@@ -181,14 +181,18 @@ static struct locomo_platform_data locomo_info = { .gpio_data = { .gpio_base = POODLE_LOCOMO_GPIO_BASE, }, - .bl_data = { + .lcd_data = { .comadj = 118, .gpio_lcd_vsha_on = POODLE_GPIO_LCD_VSHA_ON, .gpio_lcd_vshd_on = POODLE_GPIO_LCD_VSHD_ON, .gpio_lcd_vee_on = POODLE_GPIO_LCD_VEE_ON, .gpio_lcd_mod = POODLE_GPIO_LCD_MOD, + }, + .bl_data = { .gpio_fl_vr = POODLE_GPIO_FL_VR, }, + .gpio_amp1_on = -1, + .gpio_amp2_on = -1, };struct platform_device poodle_locomo_device = {
@@ -453,7 +457,7 @@ static void __init poodle_init(void) platform_scoop_config = &poodle_pcmcia_config;if (sharpsl_param.comadj !=-1 ) - locomo_info.bl_data.comadj = sharpsl_param.comadj; + locomo_info.lcd_data.comadj = sharpsl_param.comadj; ret =platform_add_devices (devices,ARRAY_SIZE (devices));if (ret)
Signature · 6 lines
2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Robert Jarzmik
maintainerRe: [PATCH 12/15] ARM: pxa: poodle: don't preallocate IRQ space for locomo
Dmitry Eremin-Solenikov <[email protected]> writes:
...zip...
arch/arm/mach-pxa/poodle.c static struct locomo_platform_data locomo_info = { · line 184
Quoted 10 lines
arch/arm/mach-pxa/poodle.c +1
-1@@ -181,14 +181,18 @@ static struct locomo_platform_data locomo_info = { .gpio_data = { .gpio_base = POODLE_LOCOMO_GPIO_BASE, }, - .bl_data = { + .lcd_data = {
Is that part really belonging to that patch ? It seems to me that this changes the code included in patch 10/15 "ARM: pxa: poodle: use new LoCoMo driver".
Therefore I'm wondering if I take the serie, halt it at patch 10, and try to compile I would succeed ... I think I wouldn't.
arch/arm/mach-pxa/poodle.c static struct locomo_platform_data locomo_info = { · line 193
Quoted 4 lines
arch/arm/mach-pxa/poodle.c +2
-0+ }, + .bl_data = { .gpio_fl_vr = POODLE_GPIO_FL_VR, },
Ditto.
arch/arm/mach-pxa/poodle.c static struct locomo_platform_data locomo_info = { · line 195
Quoted 2 lines
arch/arm/mach-pxa/poodle.c +2
-0+ .gpio_amp1_on = -1, + .gpio_amp2_on = -1,
This won't prevent compilation, but is it the target of this patch which is IRQ space oriented ?
arch/arm/mach-pxa/poodle.c static void __init poodle_init(void) · line 460
Quoted 6 lines
arch/arm/mach-pxa/poodle.c +1
-1@@ -453,7 +457,7 @@ static void __init poodle_init(void) platform_scoop_config = &poodle_pcmcia_config;if (sharpsl_param.comadj !=-1 ) - locomo_info.bl_data.comadj = sharpsl_param.comadj; + locomo_info.lcd_data.comadj = sharpsl_param.comadj;
Ditto.
Cheers.
Signature · 1 line
Robert
PATCH 13/15 ARM: drop old LoCoMo driver
In reply to a message not in the archiveAs there are no in-kernel users of old locomo driver, drop all alltogether. Remove Kconfig entry, driver and header.
--- arch/arm/common/Kconfig | 3 - arch/arm/common/Makefile | 1 - arch/arm/common/locomo.c | 914 --------------------------------- arch/arm/include/asm/hardware/locomo.h | 221 -------- 4 files changed, 1139 deletions(-) delete mode 100644 arch/arm/common/locomo.c delete mode 100644 arch/arm/include/asm/hardware/locomo.h
arch/arm/common/Kconfig +0 -3
@@ -9,9 +9,6 @@ config DMABOUNCE bool select ZONE_DMA -config SHARP_LOCOMO - bool - config SHARP_PARAM bool
arch/arm/common/Makefile +0 -1
@@ -7,7 +7,6 @@ obj-y += firmware.o obj-$(CONFIG_ICST) += icst.o obj-$(CONFIG_SA1111) += sa1111.o obj-$(CONFIG_DMABOUNCE) += dmabounce.o -obj-$(CONFIG_SHARP_LOCOMO) += locomo.o obj-$(CONFIG_SHARP_PARAM) += sharpsl_param.o obj-$(CONFIG_SHARP_SCOOP) += scoop.o obj-$(CONFIG_PCI_HOST_ITE8152) += it8152.o
arch/arm/common/locomo.c deleted +0 -914
914 lines not on this page · raw message
arch/arm/include/asm/hardware/locomo.h deleted +0 -221
221 lines not on this page · raw message
Signature · 6 lines
2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 14/15 gpio: locomo: implement per-pin irq handling
In reply to a message not in the archiveLoCoMo has a possibility to generate per-GPIO edge irqs. Support for that was there in old locomo driver, got 'cleaned up' during old driver IRQ cascading cleanup and is now reimplemented. It is expected that SL-5500 (collie) will use locomo gpio irqs for mmc detection irq.
--- drivers/gpio/gpio-locomo.c | 158 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+)
drivers/gpio/gpio-locomo.c +158 -0
@@ -18,13 +18,18 @@#include <linux/gpio.h> #include <linux/io.h> #include <linux/spinlock.h> +#include <linux/irq.h> #include <linux/mfd/locomo.h> +#define LOCOMO_GPIO_NR_IRQS 16 +struct locomo_gpio {void __iomem *regs; +int irq;spinlock_t lock;struct gpio_chip gpio; +int irq_base;u16 rising_edge;u16 falling_edge;
@@ -114,6 +119,148 @@ static int locomo_gpio_direction_output(struct gpio_chip *chip,return 0 ; } +static int locomo_gpio_to_irq (struct gpio_chip *chip,unsigned offset) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); + +return lg->irq_base + offset; +} + +static void +locomo_gpio_handler (unsigned int irq,struct irq_desc *desc) +{ +u16 req; +struct locomo_gpio *lg =irq_get_handler_data (irq); +int i = lg->irq_base; + + req =readw (lg->regs +LOCOMO_GIR ) & +readw (lg->regs +LOCOMO_GPD ); + +while (req) { +if (req &1 ) +generic_handle_irq (i); + req >>=1 ; + i++; + } +} + +static void locomo_gpio_ack_irq (struct irq_data *d) +{ +struct locomo_gpio *lg =irq_data_get_irq_chip_data (d); +unsigned long flags; +u16 r; + +spin_lock_irqsave (&lg->lock, flags); + + r =readw (lg->regs +LOCOMO_GWE ); + r |= (0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GWE ); + + r =readw (lg->regs +LOCOMO_GIS ); + r &= ~(0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GIS ); + + r =readw (lg->regs +LOCOMO_GWE ); + r &= ~(0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GWE ); + +spin_unlock_irqrestore (&lg->lock, flags); +} + +static void locomo_gpio_mask_irq (struct irq_data *d) +{ +struct locomo_gpio *lg =irq_data_get_irq_chip_data (d); +unsigned long flags; +u16 r; + +spin_lock_irqsave (&lg->lock, flags); + + r =readw (lg->regs +LOCOMO_GIE ); + r &= ~(0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GIE ); + +spin_unlock_irqrestore (&lg->lock, flags); +} + +static void locomo_gpio_unmask_irq (struct irq_data *d) +{ +struct locomo_gpio *lg =irq_data_get_irq_chip_data (d); +unsigned long flags; +u16 r; + +spin_lock_irqsave (&lg->lock, flags); + + r =readw (lg->regs +LOCOMO_GIE ); + r |= (0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GIE ); + +spin_unlock_irqrestore (&lg->lock, flags); +} + +static int locomo_gpio_type (struct irq_data *d,unsigned int type) +{ +unsigned int mask; +struct locomo_gpio *lg =irq_data_get_irq_chip_data (d); +unsigned long flags; + + mask =1 << (d->irq - lg->irq_base); + +if (type ==IRQ_TYPE_PROBE ) { +if ((lg->rising_edge | lg->falling_edge) & mask) +return 0 ; + type =IRQ_TYPE_EDGE_RISING |IRQ_TYPE_EDGE_FALLING ; + } + +if (type &IRQ_TYPE_EDGE_RISING ) + lg->rising_edge |= mask; +else + lg->rising_edge &= ~mask; +if (type &IRQ_TYPE_EDGE_FALLING ) + lg->falling_edge |= mask; +else + lg->falling_edge &= ~mask; + +spin_lock_irqsave (&lg->lock, flags); + +writew (lg->rising_edge, lg->regs +LOCOMO_GRIE ); +writew (lg->falling_edge, lg->regs +LOCOMO_GFIE ); + +spin_unlock_irqrestore (&lg->lock, flags); + +return 0 ; +} + +static struct irq_chip locomo_gpio_chip = { + .name ="LOCOMO-gpio" , + .irq_ack = locomo_gpio_ack_irq, + .irq_mask = locomo_gpio_mask_irq, + .irq_unmask = locomo_gpio_unmask_irq, + .irq_set_type = locomo_gpio_type, +}; + +static void locomo_gpio_setup_irq (struct locomo_gpio *lg) +{ +int irq; + + lg->irq_base =irq_alloc_descs (-1 ,0 ,LOCOMO_GPIO_NR_IRQS ,-1 ); + +/* Install handlers for IRQ_LOCOMO_* */ +for (irq = lg->irq_base; + irq < lg->irq_base +LOCOMO_GPIO_NR_IRQS ; + irq++) { +irq_set_chip_and_handler (irq, &locomo_gpio_chip, + handle_edge_irq); +irq_set_chip_data (irq, lg); +set_irq_flags (irq,IRQF_VALID |IRQF_PROBE ); + } + +/* +* Install handler for IRQ_LOCOMO_HW. +*/ +irq_set_handler_data (lg->irq, lg); +irq_set_chained_handler (lg->irq, locomo_gpio_handler); +} +#ifdef CONFIG_PM_SLEEP static int locomo_gpio_suspend (struct device *dev) {
@@ -169,6 +316,10 @@ static int locomo_gpio_probe(struct platform_device *pdev)if (!lg)return -ENOMEM ; + lg->irq =platform_get_irq (pdev,0 ); +if (lg->irq <0 ) +return -ENXIO ; + lg->regs =devm_ioremap_resource (&pdev->dev, res);if (IS_ERR (lg->regs))return PTR_ERR (lg->regs);
@@ -189,11 +340,14 @@ static int locomo_gpio_probe(struct platform_device *pdev) lg->gpio.get = locomo_gpio_get; lg->gpio.direction_input = locomo_gpio_direction_input; lg->gpio.direction_output = locomo_gpio_direction_output; + lg->gpio.to_irq = locomo_gpio_to_irq; ret =gpiochip_add (&lg->gpio);if (ret)return ret; +locomo_gpio_setup_irq (lg); +return 0 ; }
@@ -208,6 +362,10 @@ static int locomo_gpio_remove(struct platform_device *pdev)return ret; } +irq_set_chained_handler (lg->irq,NULL ); +irq_set_handler_data (lg->irq,NULL ); +irq_free_descs (lg->irq_base,LOCOMO_GPIO_NR_IRQS ); +return 0 ; }
Signature · 6 lines
2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 14/15] gpio: locomo: implement per-pin irq handling
Quoted 6 lines · Dmitry Eremin-Solenikov
LoCoMo has a possibility to generate per-GPIO edge irqs. Support for that was there in old locomo driver, got 'cleaned up' during old driver IRQ cascading cleanup and is now reimplemented. It is expected that SL-5500 (collie) will use locomo gpio irqs for mmc detection irq.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
Please don't use open-coded IRQ handling like this, we are moving away from that.
In Kconfig,
select GPIOLIB_IRQCHIP
and look at the other drivers selecting this for inspiration. There is even some documentation in Documentation/gpio/driver.txt
You will find that it cuts down a lot of overhead from your driver and does everything in the right way in a central place.
drivers/gpio/gpio-locomo.c line 32
Quoted 7 lines
struct locomo_gpio { void __iomem *regs;drivers/gpio/gpio-locomo.c +2
-0+int irq;spinlock_t lock;struct gpio_chip gpio; +int irq_base;
gpiolib irqchip helpers uses irqdomain to do all this debasing and rebasing for you. Go with that.
drivers/gpio/gpio-locomo.c static int locomo_gpio_direction_output(struct gpio_chip *chip, · line 127
Quoted 6 lines
drivers/gpio/gpio-locomo.c +6
-0+static int locomo_gpio_to_irq (struct gpio_chip *chip,unsigned offset) +{ + struct locomo_gpio *lg = container_of(chip, struct locomo_gpio, gpio); + +return lg->irq_base + offset; +}
And it implements .to_irq() in the gpiolib core.
drivers/gpio/gpio-locomo.c static int locomo_gpio_direction_output(struct gpio_chip *chip, · line 130
Quoted 2 lines
drivers/gpio/gpio-locomo.c +2
-0+static void +locomo_gpio_handler (unsigned int irq,struct irq_desc *desc)
It's locomo_gpio_irq_handler() right?
Quoted 4 lines
drivers/gpio/gpio-locomo.c +4
-0+{ +u16 req; +struct locomo_gpio *lg =irq_get_handler_data (irq); +int i = lg->irq_base;
drivers/gpio/gpio-locomo.c static int locomo_gpio_direction_output(struct gpio_chip *chip, · line 144
Quoted 10 lines
drivers/gpio/gpio-locomo.c +10
-0+ + req =readw (lg->regs +LOCOMO_GIR ) & +readw (lg->regs +LOCOMO_GPD ); + +while (req) { +if (req &1 ) +generic_handle_irq (i); + req >>=1 ; + i++; + }
Same thing as the MFD device, look closer at how you construct the IRQ handling loop, so the register gets re-read each iteration.
Quoted 12 lines
drivers/gpio/gpio-locomo.c +12
-0+static void locomo_gpio_ack_irq (struct irq_data *d) +{ +struct locomo_gpio *lg =irq_data_get_irq_chip_data (d); +unsigned long flags; +u16 r; + +spin_lock_irqsave (&lg->lock, flags); + + r =readw (lg->regs +LOCOMO_GWE ); + r |= (0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GWE ); +
drivers/gpio/gpio-locomo.c static int locomo_gpio_direction_output(struct gpio_chip *chip, · line 168
Quoted 10 lines
drivers/gpio/gpio-locomo.c +10
-0+ r =readw (lg->regs +LOCOMO_GIS ); + r &= ~(0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GIS ); + + r =readw (lg->regs +LOCOMO_GWE ); + r &= ~(0x0001 << (d->irq - lg->irq_base)); +writew (r, lg->regs +LOCOMO_GWE ); + +spin_unlock_irqrestore (&lg->lock, flags); +}
I really wonder if this locking is needed around these regioster accesses. It seems more like a habit than like something that is actually needed. Think it over.
*irqsave* versions of spinlocks are definately wrong in the irqchip callbacks, if you give it a minute I think you quickly realize why.
drivers/gpio/gpio-locomo.c static int locomo_gpio_direction_output(struct gpio_chip *chip, · line 206
Quoted 7 lines
drivers/gpio/gpio-locomo.c +7
-0+static int locomo_gpio_type (struct irq_data *d,unsigned int type) +{ +unsigned int mask; +struct locomo_gpio *lg =irq_data_get_irq_chip_data (d); +unsigned long flags; + + mask =1 << (d->irq - lg->irq_base);
This should just use d->hwirq with irqdomain implemented correctly.
(...)
Quoted 12 lines
drivers/gpio/gpio-locomo.c +12
-0+static void locomo_gpio_setup_irq (struct locomo_gpio *lg) +{ +int irq; + + lg->irq_base =irq_alloc_descs (-1 ,0 ,LOCOMO_GPIO_NR_IRQS ,-1 ); + +/* Install handlers for IRQ_LOCOMO_* */ +for (irq = lg->irq_base; + irq < lg->irq_base +LOCOMO_GPIO_NR_IRQS ; + irq++) { +irq_set_chip_and_handler (irq, &locomo_gpio_chip, + handle_edge_irq);
drivers/gpio/gpio-locomo.c static int locomo_gpio_direction_output(struct gpio_chip *chip, · line 262
Quoted 10 lines
drivers/gpio/gpio-locomo.c +10
-0+irq_set_chip_data (irq, lg); +set_irq_flags (irq,IRQF_VALID |IRQF_PROBE ); + } + +/* +* Install handler for IRQ_LOCOMO_HW. +*/ +irq_set_handler_data (lg->irq, lg); +irq_set_chained_handler (lg->irq, locomo_gpio_handler); +}
All this gets redundant with gpiochip_irqchip_add() and gpiochip_set_chained_irqchip().
Yours,
Linus Walleij
Re: [PATCH 14/15] gpio: locomo: implement per-pin irq handling
2014-10-31 11:00 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 15 lines
Quoted 6 lines · Dmitry Eremin-Solenikov
LoCoMo has a possibility to generate per-GPIO edge irqs. Support for that was there in old locomo driver, got 'cleaned up' during old driver IRQ cascading cleanup and is now reimplemented. It is expected that SL-5500 (collie) will use locomo gpio irqs for mmc detection irq.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>Please don't use open-coded IRQ handling like this, we are moving away from that.
In
Kconfig,
Quoted 7 lines
select
GPIOLIB_IRQCHIPand look at the other drivers selecting this for inspiration. There is even some documentation in
Documentation/gpio/driver.txtYou will find that it cuts down a lot of overhead from your driver and does everything in the right way in a central place.
Thanks, I will take a look.
[Skipped the rest of the comments mostly dedicated to gpiolib_irqchip].
Signature · 2 lines
With best wishes Dmitry
PATCH 15/15 spi: add locomo SPI driver
In reply to a message not in the archiveLoCoMo chip has a built-in simple SPI controller. On Sharp SL-5500 PDDAs it is connected to external MMC slot.
--- drivers/spi/Kconfig | 8 + drivers/spi/Makefile | 1 + drivers/spi/spi-locomo.c | 370 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/locomo.h | 30 ++++ 4 files changed, 409 insertions(+) create mode 100644 drivers/spi/spi-locomo.c
drivers/spi/Kconfig +8 -0
@@ -242,6 +242,14 @@ config SPI_LM70_LLP which interfaces to an LM70 temperature sensor using a parallel port. +config SPI_LOCOMO + tristate "Locomo SPI master" + depends on MFD_LOCOMO + select SPI_BITBANG + help + This enables using the SPI controller as present in the LoCoMo + chips. It is probably only usefull on the Sharp SL-5x00 PDA family. + config SPI_MPC52xx tristate "Freescale MPC52xx SPI (non-PSC) controller support" depends on PPC_MPC52xx
drivers/spi/Makefile +1 -0
@@ -42,6 +42,7 @@ obj-$(CONFIG_SPI_FSL_SPI) += spi-fsl-spi.o obj-$(CONFIG_SPI_GPIO) += spi-gpio.o obj-$(CONFIG_SPI_IMX) += spi-imx.o obj-$(CONFIG_SPI_LM70_LLP) += spi-lm70llp.o +obj-$(CONFIG_SPI_LOCOMO) += spi-locomo.o obj-$(CONFIG_SPI_MPC512x_PSC) += spi-mpc512x-psc.o obj-$(CONFIG_SPI_MPC52xx_PSC) += spi-mpc52xx-psc.o obj-$(CONFIG_SPI_MPC52xx) += spi-mpc52xx.o
drivers/spi/spi-locomo.c new file +370 -0
370 lines not on this page · raw message
include/linux/mfd/locomo.h +30 -0
@@ -53,7 +53,37 @@/* SPI interface */ #define LOCOMO_SPI 0x60#define LOCOMO_SPIMD 0x00/* SPI mode setting */ +#define LOCOMO_SPIMD_LOOPBACK (1 << 15)/* loopback tx to rx */ +#define LOCOMO_SPIMD_MSB1ST (1 << 14)/* send MSB first */ +#define LOCOMO_SPIMD_DOSTAT (1 << 13)/* transmit line is idle high */ +#define LOCOMO_SPIMD_TCPOL (1 << 11)/* transmit CPOL (maybe affects CPHA too) */ +#define LOCOMO_SPIMD_RCPOL (1 << 10)/* receive CPOL (maybe affects CPHA too) */ +#define LOCOMO_SPIMD_TDINV (1 << 9)/* invert transmit line */ +#define LOCOMO_SPIMD_RDINV (1 << 8)/* invert receive line */ +#define LOCOMO_SPIMD_XON (1 << 7)/* enable spi controller clock */ +#define LOCOMO_SPIMD_XEN (1 << 6)/* clock bit write enable xon must be off, wait 300 us before xon->1 */ +#define LOCOMO_SPIMD_XSEL 0x0018/* clock select */ +#define CLOCK_18MHZ 0/* 18,432 MHz clock */ +#define CLOCK_22MHZ 1/* 22,5792 MHz clock */ +#define CLOCK_25MHZ 2/* 24,576 MHz clock */ +#define LOCOMO_SPIMD_CLKSEL 0x7 +#define DIV_1 0/* don't divide clock */ +#define DIV_2 1/* divide clock by two */ +#define DIV_4 2/* divide clock by four */ +#define DIV_8 3/* divide clock by eight*/ +#define DIV_64 4/* divide clock by 64 */ +#define LOCOMO_SPICT 0x04/* SPI mode control */ +#define LOCOMO_SPICT_CRC16_7_B (1 << 15)/* 0: crc16 1: crc7 */ +#define LOCOMO_SPICT_CRCRX_TX_B (1 << 14) +#define LOCOMO_SPICT_CRCRESET_B (1 << 13) +#define LOCOMO_SPICT_CEN (1 << 7)/* ?? enable */ +#define LOCOMO_SPICT_CS (1 << 6)/* chip select */ +#define LOCOMO_SPICT_UNIT16 (1 << 5)/* 0: 8 bit units, 1: 16 bit unit */ +#define LOCOMO_SPICT_ALIGNEN (1 << 2)/* align transfer enable */ +#define LOCOMO_SPICT_RXWEN (1 << 1)/* continous receive */ +#define LOCOMO_SPICT_RXUEN (1 << 0)/* aligned receive */ +#define LOCOMO_SPIST 0x08/* SPI status */ #define LOCOMO_SPI_TEND (1 << 3)/* Transfer end bit */ #define LOCOMO_SPI_REND (1 << 2)/* Receive end bit */
Signature · 6 lines
2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 1414454528-24240-16-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Re: [PATCH 15/15] spi: add locomo SPI driver
drivers/spi/Kconfig config SPI_LM70_LLP · line 248
Quoted 7 lines · Dmitry Eremin-Solenikov
LoCoMo chip has a built-in simple SPI controller. On Sharp SL-5500 PDDAs it is connected to external MMC slot.
drivers/spi/Kconfig +4
-0+config SPI_LOCOMO + tristate "Locomo SPI master" + depends on MFD_LOCOMO + select SPI_BITBANG
Rather than using SPI_BITBANG it'd be good for new drivers to convert to using the core transfer_one() functionality which replaces most of what the bitbang code is doing. The bitbang functionality was misnamed for most of the users and we're going to try to move most of the functionality not actually related to bitbanging out of it.
drivers/spi/spi-locomo.c line 49
Quoted 9 lines
drivers/spi/spi-locomo.c new file +9
-0+/* if (locomospi_carddetect()) { */ + r =readw (spidev->base +LOCOMO_SPIMD ); + r |=LOCOMO_SPIMD_XON ; +writew (r, spidev->base +LOCOMO_SPIMD ); + + r =readw (spidev->base +LOCOMO_SPIMD ); + r |=LOCOMO_SPIMD_XEN ; +writew (r, spidev->base +LOCOMO_SPIMD ); +/* } */
Either remove or implement the comments.
drivers/spi/spi-locomo.c line 85
Quoted 3 lines
drivers/spi/spi-locomo.c new file +3
-0+ r =readw (spidev->base +LOCOMO_SPICT ); + r |=LOCOMO_SPIMD_XEN ;/* FIXME */ +writew (r, spidev->base +LOCOMO_SPICT );
FIXME?
drivers/spi/spi-locomo.c line 222
Quoted 4 lines
drivers/spi/spi-locomo.c new file +4
-0+if (t) + hz = t->speed_hz; +if (!hz) + hz = spi->max_speed_hz;
The core will ensure that the transfer always has a speed set in it.
drivers/spi/spi-locomo.c line 294
Quoted 8 lines
drivers/spi/spi-locomo.c new file +8
-0+static int locomo_spi_probe (struct platform_device *pdev) +{ +struct resource *res; +struct spi_master *master; +struct locomospi_dev *spidev; +int ret; + +dev_info (&pdev->dev,"LoCoO SPI Driver\n" );
Remove this, it's not adding anything.
PATCH 5/15 video: backlight: add new locomo backlight driver
In reply to Dmitry Eremin-SolenikovAdd new simple backlight driver - it cares only about PWM/frontlight part of LoCoMo, it does not touch TFT settings and does not export TFT power control.
--- drivers/video/backlight/Kconfig | 6 +- drivers/video/backlight/Makefile | 2 +- drivers/video/backlight/locomo_bl.c | 171 ++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 drivers/video/backlight/locomo_bl.c
drivers/video/backlight/Kconfig +3 -3
@@ -218,12 +218,12 @@ config BACKLIGHT_LM3533 levels. config BACKLIGHT_LOCOMO - tristate "Sharp LOCOMO LCD/Backlight Driver" - depends on SHARP_LOCOMO + tristate "Sharp LOCOMO Backlight Driver" + depends on MFD_LOCOMO default y help If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to - enable the LCD/backlight driver. + enable the backlight driver. config BACKLIGHT_OMAP1 tristate "OMAP1 PWL-based LCD Backlight"
drivers/video/backlight/Makefile +1 -1
@@ -39,7 +39,7 @@ obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o -obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o +obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomo_bl.o obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o obj-$(CONFIG_BACKLIGHT_LV5207LP) += lv5207lp.o
drivers/video/backlight/locomo_bl.c new file +171 -0
171 lines not on this page · raw message
Signature · 1 line
2.1.1
Re: [PATCH 05/15] video: backlight: add new locomo backlight driver
Quoted 63 lines · Dmitry Eremin-Solenikov
Add new simple backlight driver - it cares only about PWM/frontlight part of LoCoMo, it does not touch TFT settings and does not export TFT power control.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/video/backlight/Kconfig | 6 +- drivers/video/backlight/Makefile | 2 +- drivers/video/backlight/locomo_bl.c | 171 ++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 drivers/video/backlight/locomo_bl.cdrivers/video/backlight/Kconfig +3
-3@@ -218,12 +218,12 @@ config BACKLIGHT_LM3533 levels. config BACKLIGHT_LOCOMO - tristate "Sharp LOCOMO LCD/Backlight Driver" - depends on SHARP_LOCOMO + tristate "Sharp LOCOMO Backlight Driver" + depends on MFD_LOCOMO default y help If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to - enable the LCD/backlight driver. + enable the backlight driver. config BACKLIGHT_OMAP1 tristate "OMAP1 PWL-based LCD Backlight"drivers/video/backlight/Makefile +1
-1@@ -39,7 +39,7 @@ obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o -obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o +obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomo_bl.o obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o obj-$(CONFIG_BACKLIGHT_LV5207LP) += lv5207lp.odrivers/video/backlight/locomo_bl.c new file +11
-0@@ -0,0 +1,171 @@ +/* +* Backlight control code for Sharp Zaurus SL-5500 +* +* Copyright 2005 John Lenz <[email protected]> +* Maintainer: Pavel Machek <[email protected]> (unless John wants to :-) +* GPL v2 +* +* This driver assumes single CPU. That's okay, because collie is +* slightly old hardware, and no one is going to retrofit second CPU to +* old PDA. +*/
drivers/video/backlight/locomo_bl.c line 21
Quoted 10 lines
drivers/video/backlight/locomo_bl.c new file +10
-0+ +#include <linux/module.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/fb.h> +#include <linux/backlight.h> +#include <linux/err.h> +#include <linux/gpio.h> +#include <linux/delay.h> +#include <linux/mfd/locomo.h>
Please, re-order these headers alphabetically. It enhances the readability.
Quoted 26 lines
drivers/video/backlight/locomo_bl.c new file +26
-0+ +struct locomo_bl { +void __iomem *regs; +int current_intensity; +int gpio_fl_vr; +}; + +static const struct { +u16 duty, bpwf; +bool vr; +} locomo_bl_pwm[] = { + {0 ,161 , false }, + {117 ,161 , false }, + {163 ,148 , false }, + {194 ,161 , false }, + {194 ,161 , true }, +}; + +static int locomo_bl_set_intensity (struct backlight_device *bd) +{ +int intensity = bd->props.brightness; +struct locomo_bl *bl =dev_get_drvdata (&bd->dev); + +if (bd->props.power !=FB_BLANK_UNBLANK ) + intensity =0 ; +if (bd->props.fb_blank !=FB_BLANK_UNBLANK )
drivers/video/backlight/locomo_bl.c line 57
Quoted 10 lines
drivers/video/backlight/locomo_bl.c new file +10
-0+ intensity =0 ; +if (bd->props.state &BL_CORE_SUSPENDED ) + intensity =0 ; + +gpio_set_value (bl->gpio_fl_vr, locomo_bl_pwm[intensity].vr); + +writew (locomo_bl_pwm[intensity].bpwf, bl->regs +LOCOMO_ALS ); +udelay (100 ); +writew (locomo_bl_pwm[intensity].duty, bl->regs +LOCOMO_ALD ); +udelay (100 );
How about changing udelay() to usleep_range()?
Quoted 30 lines
drivers/video/backlight/locomo_bl.c new file +29
-0+writew (locomo_bl_pwm[intensity].bpwf |LOCOMO_ALC_EN , + bl->regs +LOCOMO_ALS ); + + bl->current_intensity = intensity; +if (bd->props.state &BL_CORE_SUSPENDED ) +writew (0x00 , bl->regs +LOCOMO_ALS ); + +return 0 ; +} + +static int locomo_bl_get_intensity (struct backlight_device *bd) +{ +struct locomo_bl *bl =dev_get_drvdata (&bd->dev); + +return bl->current_intensity; +} + +static const struct backlight_ops locomo_bl_ops = { + .options =BL_CORE_SUSPENDRESUME , + .get_brightness = locomo_bl_get_intensity, + .update_status = locomo_bl_set_intensity, +}; + +static int locomo_bl_probe (struct platform_device *dev) +{ +struct backlight_properties props; +struct resource *res; +struct locomo_bl_platform_data *pdata; +struct locomo_bl *bl;
drivers/video/backlight/locomo_bl.c line 96
Quoted 10 lines
drivers/video/backlight/locomo_bl.c new file +10
-0+struct backlight_device *locomo_bl_device; +int rc; + + bl =devm_kmalloc (&dev->dev,sizeof (struct locomo_bl ),GFP_KERNEL ); +if (!bl) +return -ENOMEM ; + + res =platform_get_resource (dev,IORESOURCE_MEM ,0 ); +if (!res) +return -EINVAL ;
There is no need to check this, because devm_ioremap_resource() will check this.
drivers/video/backlight/locomo_bl.c line 99
Quoted 3 lines
drivers/video/backlight/locomo_bl.c new file +3
-0+ bl->regs =devm_ioremap_resource (&dev->dev, res); +if (!bl->regs) +return -EINVAL ;
The correct usage is as follows.
if (IS_ERR(base)) return PTR_ERR(base);
Please change it as below.
res = platform_get_resource(dev, IORESOURCE_MEM, 0); bl->regs = devm_ioremap_resource(&dev->dev, res); if (IS_ERR(bl->regs)) return PTR_ERR(bl->regs);
Quoted 9 lines
drivers/video/backlight/locomo_bl.c new file +9
-0+ + pdata =dev_get_platdata (&dev->dev); +if (!pdata) +return -EINVAL ; + + bl->gpio_fl_vr = pdata->gpio_fl_vr; + rc =devm_gpio_request_one (&dev->dev, bl->gpio_fl_vr, +GPIOF_OUT_INIT_LOW ,"FL VR" ); +if (rc)
drivers/video/backlight/locomo_bl.c line 118
Quoted 10 lines
drivers/video/backlight/locomo_bl.c new file +10
-0+return rc; + +writew (0 , bl->regs +LOCOMO_ALS ); +writew (0 , bl->regs +LOCOMO_ALD ); + +memset (&props,0 ,sizeof (struct backlight_properties )); + props.type =BACKLIGHT_RAW ; + props.max_brightness =ARRAY_SIZE (locomo_bl_pwm) -1 ; + props.brightness = props.max_brightness /2 ; + locomo_bl_device = backlight_device_register("locomo-bl",
Please use devm_backlight_device_register().
Quoted 14 lines
drivers/video/backlight/locomo_bl.c new file +13
-0+ &dev->dev, bl, + &locomo_bl_ops, &props); + +if (IS_ERR (locomo_bl_device)) +return PTR_ERR (locomo_bl_device); + +platform_set_drvdata (dev, locomo_bl_device); + +/* Set up frontlight so that screen is readable */ +backlight_update_status (locomo_bl_device); + +return 0 ; +}
drivers/video/backlight/locomo_bl.c line 141
Quoted 10 lines
drivers/video/backlight/locomo_bl.c new file +10
-0+ +static int locomo_bl_remove (struct platform_device *dev) +{ +struct backlight_device *locomo_bl_device =platform_get_drvdata (dev); + + locomo_bl_device->props.brightness =0 ; + locomo_bl_device->props.power =0 ; +locomo_bl_set_intensity (locomo_bl_device); + +backlight_device_unregister (locomo_bl_device);
If devm_backlight_device_register() is used in probe(), there is no need to call backlight_device_unregister() in remove().
Quoted 17 lines
drivers/video/backlight/locomo_bl.c new file +17
-0+ +return 0 ; +} + +static void locomo_bl_shutdown (struct platform_device *dev) +{ +struct backlight_device *locomo_bl_device =platform_get_drvdata (dev); + + locomo_bl_device->props.brightness =0 ; + locomo_bl_device->props.power =0 ; +locomo_bl_set_intensity (locomo_bl_device); +} + +static struct platform_driver locomo_bl_driver = { + .driver = { + .name ="locomo-backlight" , + .owner =THIS_MODULE ,
drivers/video/backlight/locomo_bl.c line 168
Quoted 10 lines
drivers/video/backlight/locomo_bl.c new file +10
-0+ }, + .probe = locomo_bl_probe, + .remove = locomo_bl_remove, + /* Turn off bl on power off/reboot */ + .shutdown = locomo_bl_shutdown, +}; + +module_platform_driver (locomo_bl_driver); + +MODULE_AUTHOR ("John Lenz <[email protected]>, Pavel Machek <[email protected]>" );
This might make checkpatch warning.
Please split these authors to lines as below.
MODULE_AUTHOR("John Lenz <[email protected]>"); MODULE_AUTHOR("Pavel Machek <[email protected]>");
Quoted 1 line
+MODULE_DESCRIPTION("Collie Backlight driver");
What does mean 'Collie'? 'Locomo' looks better.
Quoted 1 line
+MODULE_LICENSE("GPL");
How about using "GPL v2"?
Thank you.
Best regards,
Jingoo Han
Quoted 3 lines
+MODULE_ALIAS("platform:locomo-backlight");
--
2.1.1
PATCH 6/15 video: lcd: add LoCoMo LCD driver
In reply to Dmitry Eremin-SolenikovLoCoMo has some special handling for TFT screens attached to Collie and Poodle. Implement that as a separate driver.
--- drivers/video/backlight/Kconfig | 8 ++ drivers/video/backlight/Makefile | 1 + drivers/video/backlight/locomo_lcd.c | 224 +++++++++++++++++++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100644 drivers/video/backlight/locomo_lcd.c
drivers/video/backlight/Kconfig +8 -0
@@ -48,6 +48,14 @@ config LCD_LMS283GF05 SPI driver for Samsung LMS283GF05. This provides basic support for powering the LCD up/down through a sysfs interface. +config LCD_LOCOMO + tristate "Sharp LOCOMO LCD Driver" + depends on MFD_LOCOMO + default y + help + If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to + enable the LCD driver. + config LCD_LTV350QV tristate "Samsung LTV350QV LCD Panel" depends on SPI_MASTER
drivers/video/backlight/Makefile +1 -0
@@ -9,6 +9,7 @@ obj-$(CONFIG_LCD_ILI922X) += ili922x.o obj-$(CONFIG_LCD_ILI9320) += ili9320.o obj-$(CONFIG_LCD_L4F00242T03) += l4f00242t03.o obj-$(CONFIG_LCD_LD9040) += ld9040.o +obj-$(CONFIG_LCD_LOCOMO) += locomo_lcd.o obj-$(CONFIG_LCD_LMS283GF05) += lms283gf05.o obj-$(CONFIG_LCD_LMS501KF03) += lms501kf03.o obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o
drivers/video/backlight/locomo_lcd.c new file +224 -0
224 lines not on this page · raw message
Signature · 1 line
2.1.1
Re: [PATCH 06/15] video: lcd: add LoCoMo LCD driver
Quoted 36 lines · Dmitry Eremin-Solenikov
LoCoMo has some special handling for TFT screens attached to Collie and Poodle. Implement that as a separate driver.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/video/backlight/Kconfig | 8 ++ drivers/video/backlight/Makefile | 1 + drivers/video/backlight/locomo_lcd.c | 224 +++++++++++++++++++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100644 drivers/video/backlight/locomo_lcd.cdrivers/video/backlight/Kconfig +8
-0@@ -48,6 +48,14 @@ config LCD_LMS283GF05 SPI driver for Samsung LMS283GF05. This provides basic support for powering the LCD up/down through a sysfs interface. +config LCD_LOCOMO + tristate "Sharp LOCOMO LCD Driver" + depends on MFD_LOCOMO + default y + help + If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to + enable the LCD driver. + config LCD_LTV350QV tristate "Samsung LTV350QV LCD Panel" depends on SPI_MASTERdrivers/video/backlight/Makefile +0
-0
drivers/video/backlight/Makefile obj-$(CONFIG_LCD_ILI922X) += ili922x.o · line 12
Quoted 4 lines
drivers/video/backlight/Makefile +1
-0@@ -9,6 +9,7 @@ obj-$(CONFIG_LCD_ILI922X) += ili922x.o obj-$(CONFIG_LCD_ILI9320) += ili9320.o obj-$(CONFIG_LCD_L4F00242T03) += l4f00242t03.o obj-$(CONFIG_LCD_LD9040) += ld9040.o +obj-$(CONFIG_LCD_LOCOMO) += locomo_lcd.o
Please insert this alphabetically for the readability.
Quoted 22 lines
drivers/video/backlight/Makefile +0
-0obj-$(CONFIG_LCD_LMS283GF05) += lms283gf05.o obj-$(CONFIG_LCD_LMS501KF03) += lms501kf03.o obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.odrivers/video/backlight/locomo_lcd.c new file +13
-0@@ -0,0 +1,224 @@ +/* +* Backlight control code for Sharp Zaurus SL-5500 +* +* Copyright 2005 John Lenz <[email protected]> +* Maintainer: Pavel Machek <[email protected]> (unless John wants to :-) +* GPL v2 +* +* This driver assumes single CPU. That's okay, because collie is +* slightly old hardware, and no one is going to retrofit second CPU to +* old PDA. +*/ + +/* LCD power functions */
drivers/video/backlight/locomo_lcd.c line 23
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+#include <linux/module.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/fb.h> +#include <linux/backlight.h> +#include <linux/err.h> +#include <linux/gpio.h> +#include <linux/delay.h> +#include <linux/lcd.h> +#include <linux/mfd/locomo.h>
Please, re-order these headers alphabetically.
It enhances the readability.
Quoted 18 lines
drivers/video/backlight/locomo_lcd.c new file +18
-0+ +static struct platform_device *locomolcd_dev; +static struct locomo_lcd_platform_data lcd_data; +static bool locomolcd_is_on; +static bool locomolcd_is_suspended; +static void __iomem *locomolcd_regs; +static struct lcd_device *lcd_dev; + +static struct gpio locomo_gpios[] = { + {0 ,GPIOF_OUT_INIT_LOW ,"LCD VSHA on" }, + {0 ,GPIOF_OUT_INIT_LOW ,"LCD VSHD on" }, + {0 ,GPIOF_OUT_INIT_LOW ,"LCD Vee on" }, + {0 ,GPIOF_OUT_INIT_LOW ,"LCD MOD" }, +}; + +static void locomolcd_on (void ) +{ +gpio_set_value (lcd_data.gpio_lcd_vsha_on,1 );
drivers/video/backlight/locomo_lcd.c line 51
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+mdelay (2 ); + +gpio_set_value (lcd_data.gpio_lcd_vshd_on,1 ); +mdelay (2 ); + +locomo_m62332_senddata (locomolcd_dev->dev.parent, lcd_data.comadj,0 ); +mdelay (5 ); + +gpio_set_value (lcd_data.gpio_lcd_vee_on,1 ); +mdelay (10 );
How about changing mdelay() to usleep_range()?
Quoted 18 lines
drivers/video/backlight/locomo_lcd.c new file +18
-0+ +/* TFTCRST | CPSOUT=0 | CPSEN */ +writew (0x01 , locomolcd_regs +LOCOMO_TC ); + +/* Set CPSD */ +writew (6 , locomolcd_regs +LOCOMO_CPSD ); + +/* TFTCRST | CPSOUT=0 | CPSEN */ +writew ((0x04 |0x01 ), locomolcd_regs +LOCOMO_TC ); +mdelay (10 ); + +gpio_set_value (lcd_data.gpio_lcd_mod,1 ); +} + +static void locomolcd_off (void ) +{ +/* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */ +writew (0x06 , locomolcd_regs +LOCOMO_TC );
drivers/video/backlight/locomo_lcd.c line 79
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+mdelay (1 ); + +gpio_set_value (lcd_data.gpio_lcd_vsha_on,0 ); +mdelay (110 ); + +gpio_set_value (lcd_data.gpio_lcd_vee_on,0 ); +mdelay (700 ); + +locomo_m62332_senddata (locomolcd_dev->dev.parent,0 ,0 ); +mdelay (5 );
How about changing mdelay() to usleep_range() or msleep()?
Quoted 59 lines
drivers/video/backlight/locomo_lcd.c new file +59
-0+ +/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */ +writew (0 , locomolcd_regs +LOCOMO_TC ); +gpio_set_value (lcd_data.gpio_lcd_mod,0 ); +gpio_set_value (lcd_data.gpio_lcd_vshd_on,0 ); +} + +int locomo_lcd_set_power (struct lcd_device *lcd,int power) +{ +dev_dbg (&lcd->dev,"LCD power %d (is %d)\n" , power, locomolcd_is_on); +if (power ==0 && !locomolcd_is_on) { + locomolcd_is_on =1 ; +locomolcd_on (); + } +if (power !=0 && locomolcd_is_on) { + locomolcd_is_on =0 ; +locomolcd_off (); + } +return 0 ; +} + +static int locomo_lcd_get_power (struct lcd_device *lcd) +{ +return !locomolcd_is_on; +} + +static struct lcd_ops locomo_lcd_ops = { + .set_power = locomo_lcd_set_power, + .get_power = locomo_lcd_get_power, +}; + +#ifdef CONFIG_PM_SLEEP +static int locomolcd_suspend (struct device *dev) +{ + locomolcd_is_suspended = true; +locomolcd_off (); + +return 0 ; +} + +static int locomolcd_resume (struct device *dev) +{ + locomolcd_is_suspended = false; + +if (locomolcd_is_on) +locomolcd_on (); + +return 0 ; +} + +static SIMPLE_DEV_PM_OPS(locomolcd_pm, locomolcd_suspend, locomolcd_resume); +#define LOCOMOLCD_PM (&locomolcd_pm) +#else +#define LOCOMOLCD_PM NULL +#endif + +static int locomolcd_probe (struct platform_device *dev) +{ +unsigned long flags;
drivers/video/backlight/locomo_lcd.c line 148
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+struct resource *res; +struct locomo_lcd_platform_data *pdata; +int rc; + + res =platform_get_resource (dev,IORESOURCE_MEM ,0 ); +if (!res) +return -EINVAL ; + locomolcd_regs =devm_ioremap_resource (&dev->dev, res); +if (!locomolcd_regs) +return -EINVAL ;
Please change it as below.
res = platform_get_resource(dev, IORESOURCE_MEM, 0); locomolcd_regs = devm_ioremap_resource(&dev->dev, res); if (IS_ERR(locomolcd_regs)) return PTR_ERR(locomolcd_regs);
Quoted 21 lines
drivers/video/backlight/locomo_lcd.c new file +21
-0+ + pdata =dev_get_platdata (&dev->dev); +if (!pdata) +return -EINVAL ; + + lcd_data = *pdata; + + locomo_gpios[0 ].gpio = lcd_data.gpio_lcd_vsha_on; + locomo_gpios[1 ].gpio = lcd_data.gpio_lcd_vshd_on; + locomo_gpios[2 ].gpio = lcd_data.gpio_lcd_vee_on; + locomo_gpios[3 ].gpio = lcd_data.gpio_lcd_mod; +dev_info (&dev->dev,"GPIOs: %d %d %d %d\n" , + locomo_gpios[0 ].gpio, + locomo_gpios[1 ].gpio, + locomo_gpios[2 ].gpio, + locomo_gpios[3 ].gpio); + + rc =gpio_request_array (locomo_gpios,ARRAY_SIZE (locomo_gpios)); +if (rc) +return rc; +
drivers/video/backlight/locomo_lcd.c line 179
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+local_irq_save (flags); + locomolcd_dev = dev; + + locomolcd_is_on =1 ; +if (locomolcd_is_on) +locomolcd_on (); + +local_irq_restore (flags); + + lcd_dev = lcd_device_register("locomo", &dev->dev, NULL,
Please use devm_lcd_device_register().
drivers/video/backlight/locomo_lcd.c line 189
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+ &locomo_lcd_ops); + +return 0 ; +} + +static int locomolcd_remove (struct platform_device *dev) +{ +unsigned long flags; + +lcd_device_unregister (lcd_dev);
If devm_lcd_device_register() is used in probe(), there is no need to call lcd_device_unregister() in remove().
Quoted 22 lines
drivers/video/backlight/locomo_lcd.c new file +22
-0+ +local_irq_save (flags); + +locomolcd_off (); + locomolcd_dev =NULL ; + +local_irq_restore (flags); + +gpio_free_array (locomo_gpios,ARRAY_SIZE (locomo_gpios)); + +return 0 ; +} + +static void locomolcd_shutdown (struct platform_device *dev) +{ +locomolcd_off (); +} + +static struct platform_driver locomolcd_driver = { + .driver = { + .name ="locomo-lcd" , + .owner =THIS_MODULE ,
drivers/video/backlight/locomo_lcd.c line 221
Quoted 10 lines
drivers/video/backlight/locomo_lcd.c new file +10
-0+ .pm = LOCOMOLCD_PM, + }, + .probe = locomolcd_probe, + .remove = locomolcd_remove, + .shutdown = locomolcd_shutdown, +}; + +module_platform_driver (locomolcd_driver); + +MODULE_AUTHOR ("John Lenz <[email protected]>, Pavel Machek <[email protected]>" );
Please split these authors to lines as below.
MODULE_AUTHOR("John Lenz <[email protected]>");MODULE_AUTHOR("Pavel Machek <[email protected]>");
drivers/video/backlight/locomo_lcd.c line 222
Quoted 1 line
drivers/video/backlight/locomo_lcd.c new file +1
-0+MODULE_DESCRIPTION ("Collie LCD driver" );
What does mean 'Collie'? 'Locomo' looks better.
drivers/video/backlight/locomo_lcd.c line 223
Quoted 1 line
drivers/video/backlight/locomo_lcd.c new file +1
-0+MODULE_LICENSE ("GPL" );
How about using "GPL v2"?
Thank you.
Best regards,
Jingoo Han
Quoted 3 lines
drivers/video/backlight/locomo_lcd.c new file +1
-1+MODULE_ALIAS ("platform:locomo-lcd" ); --2.1.1
Re: [PATCH 06/15] video: lcd: add LoCoMo LCD driver
Quoted 4 lines · Jingoo Han
Quoted 3 lines · Dmitry Eremin-Solenikov
LoCoMo has some special handling for TFT screens attached to Collie and Poodle. Implement that as a separate driver.
Thanks for the review, changes for both LCD and Backlight will be implemented in V2.
Signature · 2 lines
With best wishes Dmitry
PATCH 7/15 video: backlight: drop old locomo bl/lcd driver
In reply to Dmitry Eremin-SolenikovOld locomolcd driver is now completely obsolete by new locomo_bl and locomo_lcd drivers, so let's drop it.
--- drivers/video/backlight/locomolcd.c | 255 ------------------------------------ 1 file changed, 255 deletions(-) delete mode 100644 drivers/video/backlight/locomolcd.c
drivers/video/backlight/locomolcd.c deleted +0 -255
@@ -1,255 +0,0 @@ -/* -* Backlight control code for Sharp Zaurus SL-5500 -* -* Copyright 2005 John Lenz <[email protected]> -* Maintainer: Pavel Machek <[email protected]> (unless John wants to :-) -* GPL v2 -* -* This driver assumes single CPU. That's okay, because collie is -* slightly old hardware, and no one is going to retrofit second CPU to -* old PDA. -*/ - -/* LCD power functions */ -#include <linux/module.h> -#include <linux/init.h> -#include <linux/delay.h> -#include <linux/device.h> -#include <linux/interrupt.h> -#include <linux/fb.h> -#include <linux/backlight.h> - -#include <asm/hardware/locomo.h> -#include <asm/irq.h> -#include <asm/mach/sharpsl_param.h> -#include <asm/mach-types.h> - -#include "../../../arch/arm/mach-sa1100/generic.h" - -static struct backlight_device *locomolcd_bl_device; -static struct locomo_dev *locomolcd_dev; -static unsigned long locomolcd_flags; -#define LOCOMOLCD_SUSPENDED 0x01 - -static void locomolcd_on (int comadj) -{ -locomo_gpio_set_dir (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VSHA_ON ,0 ); -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VSHA_ON ,1 ); -mdelay (2 ); - -locomo_gpio_set_dir (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VSHD_ON ,0 ); -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VSHD_ON ,1 ); -mdelay (2 ); - -locomo_m62332_senddata (locomolcd_dev, comadj,0 ); -mdelay (5 ); - -locomo_gpio_set_dir (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VEE_ON ,0 ); -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VEE_ON ,1 ); -mdelay (10 ); - -/* TFTCRST | CPSOUT=0 | CPSEN */ -locomo_writel (0x01 , locomolcd_dev->mapbase +LOCOMO_TC ); - -/* Set CPSD */ -locomo_writel (6 , locomolcd_dev->mapbase +LOCOMO_CPSD ); - -/* TFTCRST | CPSOUT=0 | CPSEN */ -locomo_writel ((0x04 |0x01 ), locomolcd_dev->mapbase +LOCOMO_TC ); -mdelay (10 ); - -locomo_gpio_set_dir (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_MOD ,0 ); -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_MOD ,1 ); -} - -static void locomolcd_off (int comadj) -{ -/* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */ -locomo_writel (0x06 , locomolcd_dev->mapbase +LOCOMO_TC ); -mdelay (1 ); - -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VSHA_ON ,0 ); -mdelay (110 ); - -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VEE_ON ,0 ); -mdelay (700 ); - -/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */ -locomo_writel (0 , locomolcd_dev->mapbase +LOCOMO_TC ); -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_MOD ,0 ); -locomo_gpio_write (locomolcd_dev->dev.parent,LOCOMO_GPIO_LCD_VSHD_ON ,0 ); -} - -void locomolcd_power (int on) -{ -int comadj = sharpsl_param.comadj; -unsigned long flags; - -local_irq_save (flags); - -if (!locomolcd_dev) { -local_irq_restore (flags); -return ; - } - -/* read comadj */ -if (comadj ==-1 &&machine_is_collie ()) - comadj =128 ; -if (comadj ==-1 &&machine_is_poodle ()) - comadj =118 ; - -if (on) -locomolcd_on (comadj); -else -locomolcd_off (comadj); - -local_irq_restore (flags); -} -EXPORT_SYMBOL (locomolcd_power); - -static int current_intensity; - -static int locomolcd_set_intensity (struct backlight_device *bd) -{ -int intensity = bd->props.brightness; - -if (bd->props.power !=FB_BLANK_UNBLANK ) - intensity =0 ; -if (bd->props.fb_blank !=FB_BLANK_UNBLANK ) - intensity =0 ; -if (locomolcd_flags &LOCOMOLCD_SUSPENDED ) - intensity =0 ; - -switch (intensity) { -/* -* AC and non-AC are handled differently, -* but produce same results in sharp code? -*/ -case 0 : -locomo_frontlight_set (locomolcd_dev,0 ,0 ,161 ); -break ; -case 1 : -locomo_frontlight_set (locomolcd_dev,117 ,0 ,161 ); -break ; -case 2 : -locomo_frontlight_set (locomolcd_dev,163 ,0 ,148 ); -break ; -case 3 : -locomo_frontlight_set (locomolcd_dev,194 ,0 ,161 ); -break ; -case 4 : -locomo_frontlight_set (locomolcd_dev,194 ,1 ,161 ); -break ; -default : -return -ENODEV ; - } - current_intensity = intensity; -return 0 ; -} - -static int locomolcd_get_intensity (struct backlight_device *bd) -{ -return current_intensity; -} - -static const struct backlight_ops locomobl_data = { - .get_brightness = locomolcd_get_intensity, - .update_status = locomolcd_set_intensity, -}; - -#ifdef CONFIG_PM_SLEEP -static int locomolcd_suspend (struct device *dev) -{ - locomolcd_flags |=LOCOMOLCD_SUSPENDED ; -locomolcd_set_intensity (locomolcd_bl_device); -return 0 ; -} - -static int locomolcd_resume (struct device *dev) -{ - locomolcd_flags &= ~LOCOMOLCD_SUSPENDED ; -locomolcd_set_intensity (locomolcd_bl_device); -return 0 ; -} -#endif - -static SIMPLE_DEV_PM_OPS(locomolcd_pm_ops, locomolcd_suspend, locomolcd_resume); - -static int locomolcd_probe (struct locomo_dev *ldev) -{ -struct backlight_properties props; -unsigned long flags; - -local_irq_save (flags); - locomolcd_dev = ldev; - -locomo_gpio_set_dir (ldev->dev.parent,LOCOMO_GPIO_FL_VR ,0 ); - -/* -* the poodle_lcd_power function is called for the first time -* from fs_initcall, which is before locomo is activated. -* We need to recall poodle_lcd_power here -*/ -if (machine_is_poodle ()) -locomolcd_power (1 ); - -local_irq_restore (flags); - -memset (&props,0 ,sizeof (struct backlight_properties )); - props.type =BACKLIGHT_RAW ; - props.max_brightness =4 ; - locomolcd_bl_device =backlight_device_register ("locomo-bl" , - &ldev->dev,NULL , - &locomobl_data, &props); - -if (IS_ERR (locomolcd_bl_device)) -return PTR_ERR (locomolcd_bl_device); - -/* Set up frontlight so that screen is readable */ - locomolcd_bl_device->props.brightness =2 ; -locomolcd_set_intensity (locomolcd_bl_device); - -return 0 ; -} - -static int locomolcd_remove (struct locomo_dev *dev) -{ -unsigned long flags; - - locomolcd_bl_device->props.brightness =0 ; - locomolcd_bl_device->props.power =0 ; -locomolcd_set_intensity (locomolcd_bl_device); - -backlight_device_unregister (locomolcd_bl_device); -local_irq_save (flags); - locomolcd_dev =NULL ; -local_irq_restore (flags); -return 0 ; -} - -static struct locomo_driver poodle_lcd_driver = { - .drv = { - .name ="locomo-backlight" , - .pm = &locomolcd_pm_ops, - }, - .devid =LOCOMO_DEVID_BACKLIGHT , - .probe = locomolcd_probe, - .remove = locomolcd_remove, -}; - -static int __init locomolcd_init (void ) -{ -return locomo_driver_register (&poodle_lcd_driver); -} - -static void __exit locomolcd_exit(void) -{ -locomo_driver_unregister (&poodle_lcd_driver); -} - -module_init (locomolcd_init); -module_exit (locomolcd_exit); - -MODULE_AUTHOR ("John Lenz <[email protected]>, Pavel Machek <[email protected]>" ); -MODULE_DESCRIPTION ("Collie LCD driver" ); -MODULE_LICENSE ("GPL" );
Signature · 1 line
2.1.1
PATCH 9/15 ARM: sa1100: don't preallocate IRQ space for locomo
In reply to Dmitry Eremin-SolenikovAs new locomo driver properly supports SPARSE_IRQ, stop playing with NR_IRQS on sa1100 (locomo was the last chip requiring NR_IRQ tricks).
--- arch/arm/mach-sa1100/include/mach/irqs.h | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-)
arch/arm/mach-sa1100/include/mach/irqs.h +2 -17
@@ -68,22 +68,7 @@#define IRQ_BOARD_START 49#define IRQ_BOARD_END 65 -/* -* Figure out the MAX IRQ number. -* -* Neponset, SA1111 and UCB1x00 are sparse IRQ aware, so can dynamically -* allocate their IRQs above NR_IRQS. -* -* LoCoMo has 4 additional IRQs, but is not sparse IRQ aware, and so has -* to be included in the NR_IRQS calculation. -*/ -#ifdef CONFIG_SHARP_LOCOMO -#define NR_IRQS_LOCOMO 4 -#else -#define NR_IRQS_LOCOMO 0 -#endif -#ifndef NR_IRQS -#define NR_IRQS (IRQ_BOARD_START + NR_IRQS_LOCOMO) +#define NR_IRQS IRQ_BOARD_START#endif -#define SA1100_NR_IRQS (IRQ_BOARD_START + NR_IRQS_LOCOMO) +#define SA1100_NR_IRQS IRQ_BOARD_START
Signature · 1 line
2.1.1
Re: [PATCH 09/15] ARM: sa1100: don't preallocate IRQ space for locomo
Quoted 4 lines · Dmitry Eremin-Solenikov
As new locomo driver properly supports
SPARSE_IRQ, stop playing withNR_IRQSon sa1100 (locomo was the last chip requiringNR_IRQtricks).Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
That's right! By moving to irqdomain things get even better :)
Yours,
Linus Walleij
Re: [PATCH 09/15] ARM: sa1100: don't preallocate IRQ space for locomo
2014-10-31 10:50 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 9 lines
Quoted 4 lines · Dmitry Eremin-Solenikov
As new locomo driver properly supports
SPARSE_IRQ, stop playing withNR_IRQSon sa1100 (locomo was the last chip requiringNR_IRQtricks).Signed-off-by Dmitry Eremin-Solenikov <[email protected]>That's right! By moving to irqdomain things get even better :)
That is a separate topic in my repo. I'll push that after finishing with LoCoMo.
Signature · 2 lines
With best wishes Dmitry
PATCH 10/15 ARM: pxa: poodle: use new LoCoMo driver
In reply to Dmitry Eremin-SolenikovConvert poodle to use new mfd-based LoCoMo driver.
--- arch/arm/mach-pxa/Kconfig | 1 - arch/arm/mach-pxa/include/mach/poodle.h | 14 +++++++++----- arch/arm/mach-pxa/poodle.c | 19 +++++++++++++++---- 3 files changed, 24 insertions(+), 10 deletions(-)
arch/arm/mach-pxa/Kconfig +0 -1
@@ -473,7 +473,6 @@ config MACH_POODLE bool "Enable Sharp SL-5600 (Poodle) Support" depends on PXA_SHARPSL select PXA25x - select SHARP_LOCOMO config MACH_CORGI bool "Enable Sharp SL-C700 (Corgi) Support"
arch/arm/mach-pxa/include/mach/poodle.h +9 -5
@@ -81,11 +81,15 @@#define POODLE_GPIO_L_LCLK (POODLE_SCOOP_GPIO_BASE + 10)#define POODLE_GPIO_HS_OUT (POODLE_SCOOP_GPIO_BASE + 11) -#define POODLE_LOCOMO_GPIO_AMP_ON LOCOMO_GPIO(8) -#define POODLE_LOCOMO_GPIO_MUTE_L LOCOMO_GPIO(10) -#define POODLE_LOCOMO_GPIO_MUTE_R LOCOMO_GPIO(11) -#define POODLE_LOCOMO_GPIO_232VCC_ON LOCOMO_GPIO(12) -#define POODLE_LOCOMO_GPIO_JK_B LOCOMO_GPIO(13) +#define POODLE_LOCOMO_GPIO_BASE (PXA_NR_BUILTIN_GPIO + 12) +#define POODLE_GPIO_LCD_VSHA_ON (POODLE_LOCOMO_GPIO_BASE + 4) +#define POODLE_GPIO_LCD_VSHD_ON (POODLE_LOCOMO_GPIO_BASE + 5) +#define POODLE_GPIO_LCD_VEE_ON (POODLE_LOCOMO_GPIO_BASE + 6) +#define POODLE_GPIO_LCD_MOD (POODLE_LOCOMO_GPIO_BASE + 7) +#define POODLE_GPIO_AMP_ON (POODLE_LOCOMO_GPIO_BASE + 8) +#define POODLE_GPIO_FL_VR (POODLE_LOCOMO_GPIO_BASE + 9) +#define POODLE_GPIO_MUTE_L (POODLE_LOCOMO_GPIO_BASE + 10) +#define POODLE_GPIO_MUTE_R (POODLE_LOCOMO_GPIO_BASE + 11)#define POODLE_NR_IRQS (IRQ_BOARD_START + 4)/* 4 for LoCoMo */
arch/arm/mach-pxa/poodle.c +15 -4
@@ -30,6 +30,7 @@#include <linux/spi/pxa2xx_spi.h> #include <linux/mtd/sharpsl.h> #include <linux/memblock.h> +#include <linux/mfd/locomo.h> #include <mach/hardware.h> #include <asm/mach-types.h>
@@ -48,7 +49,6 @@#include <linux/platform_data/video-pxafb.h> #include <asm/hardware/scoop.h> -#include <asm/hardware/locomo.h> #include <asm/mach/sharpsl_param.h> #include "generic.h"
@@ -178,7 +178,17 @@ static struct resource locomo_resources[] = { };static struct locomo_platform_data locomo_info = { - .irq_base =IRQ_BOARD_START , + .gpio_data = { + .gpio_base =POODLE_LOCOMO_GPIO_BASE , + }, + .bl_data = { + .comadj =118 , + .gpio_lcd_vsha_on =POODLE_GPIO_LCD_VSHA_ON , + .gpio_lcd_vshd_on =POODLE_GPIO_LCD_VSHD_ON , + .gpio_lcd_vee_on =POODLE_GPIO_LCD_VEE_ON , + .gpio_lcd_mod =POODLE_GPIO_LCD_MOD , + .gpio_fl_vr =POODLE_GPIO_FL_VR , + }, };struct platform_device poodle_locomo_device = {
@@ -191,8 +201,6 @@ struct platform_device poodle_locomo_device = { }, }; -EXPORT_SYMBOL (poodle_locomo_device); -#if defined(CONFIG_SPI_PXA2XX ) || defined(CONFIG_SPI_PXA2XX_MODULE )static struct pxa2xx_spi_master poodle_spi_info = { .num_chipselect = 1,
@@ -444,6 +452,9 @@ static void __init poodle_init(void) platform_scoop_config = &poodle_pcmcia_config; +if (sharpsl_param.comadj !=-1 ) + locomo_info.bl_data.comadj = sharpsl_param.comadj; + ret =platform_add_devices (devices,ARRAY_SIZE (devices));if (ret)pr_warning ("poodle: Unable to register LoCoMo device\n" );
Signature · 1 line
2.1.1
PATCH 11/15 sound: soc: poodle: make use of new locomo GPIO interface
In reply to Dmitry Eremin-SolenikovSince LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
--- sound/soc/pxa/poodle.c | 51 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 27 deletions(-)
sound/soc/pxa/poodle.c +24 -27
@@ -20,12 +20,12 @@#include <linux/i2c.h> #include <linux/interrupt.h> #include <linux/platform_device.h> +#include <linux/gpio.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/soc.h> #include <asm/mach-types.h> -#include <asm/hardware/locomo.h> #include <mach/poodle.h> #include <mach/audio.h>
@@ -48,16 +48,12 @@ static void poodle_ext_control(struct snd_soc_dapm_context *dapm)/* set up jack connection */ if (poodle_jack_func ==POODLE_HP ) {/* set = unmute headphone */ -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_L ,1 ); -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_R ,1 ); +gpio_set_value (POODLE_GPIO_MUTE_L ,1 ); +gpio_set_value (POODLE_GPIO_MUTE_R ,1 );snd_soc_dapm_enable_pin (dapm,"Headphone Jack" ); }else { -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_L ,0 ); -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_R ,0 ); +gpio_set_value (POODLE_GPIO_MUTE_L ,0 ); +gpio_set_value (POODLE_GPIO_MUTE_R ,0 );snd_soc_dapm_disable_pin (dapm,"Headphone Jack" ); }
@@ -85,10 +81,8 @@ static int poodle_startup(struct snd_pcm_substream *substream)static void poodle_shutdown (struct snd_pcm_substream *substream) {/* set = unmute headphone */ -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_L ,1 ); -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_R ,1 ); +gpio_set_value (POODLE_GPIO_MUTE_L ,1 ); +gpio_set_value (POODLE_GPIO_MUTE_R ,1 ); } static int poodle_hw_params(struct snd_pcm_substream *substream,
@@ -178,12 +172,7 @@ static int poodle_set_spk(struct snd_kcontrol *kcontrol,static int poodle_amp_event (struct snd_soc_dapm_widget *w,struct snd_kcontrol *k,int event) { -if (SND_SOC_DAPM_EVENT_ON (event)) -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_AMP_ON ,0 ); -else -locomo_gpio_write (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_AMP_ON ,1 ); +gpio_set_value (POODLE_GPIO_AMP_ON , !(SND_SOC_DAPM_EVENT_ON (event)));return 0 ; }
@@ -263,25 +252,32 @@ static struct snd_soc_card poodle = { .num_dapm_routes = ARRAY_SIZE(poodle_audio_map), }; +struct gpio poodle_gpios[] = { + {POODLE_GPIO_AMP_ON ,GPIOF_OUT_INIT_HIGH ,"Amplifier" }, + {POODLE_GPIO_MUTE_L ,GPIOF_OUT_INIT_LOW ,"Mute left" }, + {POODLE_GPIO_MUTE_R ,GPIOF_OUT_INIT_LOW ,"Mute right" }, +}; +static int poodle_probe (struct platform_device *pdev) {struct snd_soc_card *card = &poodle;int ret; -locomo_gpio_set_dir (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_AMP_ON ,0 ); -/* should we mute HP at startup - burning power ?*/ -locomo_gpio_set_dir (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_L ,0 ); -locomo_gpio_set_dir (&poodle_locomo_device.dev, -POODLE_LOCOMO_GPIO_MUTE_R ,0 ); + ret =gpio_request_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); +if (ret) { +dev_err (&pdev->dev,"gpio_request_array() failed: %d\n" , + ret); +return ret; + } card->dev = &pdev->dev; ret =snd_soc_register_card (card); -if (ret) +if (ret) {dev_err (&pdev->dev,"snd_soc_register_card() failed: %d\n" , ret); +gpio_free_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); + }return ret; }
@@ -290,6 +286,7 @@ static int poodle_remove(struct platform_device *pdev)struct snd_soc_card *card =platform_get_drvdata (pdev);snd_soc_unregister_card (card); +gpio_free_array (poodle_gpios,ARRAY_SIZE (poodle_gpios));return 0 ; }
Signature · 1 line
2.1.1
A message that is not in the archive (sent off-list or not yet received): 1414454528-24240-12-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Mark Brown
Acked-byRe: [PATCH 11/15] sound: soc: poodle: make use of new locomo GPIO interface
Quoted 2 lines · Dmitry Eremin-Solenikov
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Please use subject lines matching the style for the subsystem.
sound/soc/pxa/poodle.c static struct snd_soc_card poodle = { · line 271
Quoted 6 lines
sound/soc/pxa/poodle.c +6
-0+ ret =gpio_request_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); +if (ret) { +dev_err (&pdev->dev,"gpio_request_array() failed: %d\n" , + ret); +return ret; + }
I sense a need for devm_gpio_request_array() here. Otherwise this looks fine - ideally it'd move to gpiod but moving to gpiolib is a clear win so no need to block on this.
with at least the subject line fixed.
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH 11/15] sound: soc: poodle: make use of new locomo GPIO interface
Quoted 6 lines · Mark Brown
Quoted 2 lines · Dmitry Eremin-Solenikov
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Please use subject lines matching the style for the subsystem.
Quoted 10 lines
sound/soc/pxa/poodle.c static struct snd_soc_card poodle = { · line 271
Quoted 6 lines
sound/soc/pxa/poodle.c +6
-0+ ret =gpio_request_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); +if (ret) { +dev_err (&pdev->dev,"gpio_request_array() failed: %d\n" , + ret); +return ret; + }I sense a need for
devm_gpio_request_array()here. Otherwise this looks fine - ideally it'd move to gpiod but moving to gpiolib is a clear win so no need to block on this.
I like the idea of devm_gpio_request_array. But I would like not to add additional (core) patches to this patchset.
Quoted 4 lines
Acked-by Mark Brown <[email protected]>with at least the subject line fixed.
Subject line fixed.
Signature · 6 lines
With best wishes Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 11/15] sound: soc: poodle: make use of new locomo GPIO interface
In reply to Mark BrownQuoted 13 lines · Mark Brown
Quoted 2 lines · Dmitry Eremin-Solenikov
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Please use subject lines matching the style for the subsystem.
sound/soc/pxa/poodle.c static struct snd_soc_card poodle = { · line 271
Quoted 6 lines
sound/soc/pxa/poodle.c +6
-0+ ret =gpio_request_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); +if (ret) { +dev_err (&pdev->dev,"gpio_request_array() failed: %d\n" , + ret); +return ret; + }
Quoted 3 lines
I sense a need for
devm_gpio_request_array()here. Otherwise this looks fine - ideally it'd move to gpiod but moving to gpiolib is a clear win so no need to block on this.
I wish Dmitry took the opportunity to move this driver to the gpiod API, especially since doing so would be trivial for this driver. Not a critical requirement though, the present patch is already an improvement. But if you want to do that last step, please have a look at Documentation/gpio/consumer.txt and the "Platform Data" section of Documentation/gpio/board.txt.
A message that is not in the archive (sent off-list or not yet received): CAAVeFuKgARoMFzf+663iP6cULs93d4WSQS8ESjUb9VcxguWurA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH 11/15] sound: soc: poodle: make use of new locomo GPIO interface
Quoted 14 lines · Alexandre Courbot
Quoted 13 lines · Mark Brown
Quoted 2 lines · Dmitry Eremin-Solenikov
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Please use subject lines matching the style for the subsystem.
Quoted 6 lines
sound/soc/pxa/poodle.c +6
-0+ ret =gpio_request_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); +if (ret) { +dev_err (&pdev->dev,"gpio_request_array() failed: %d\n" , + ret); +return ret; + }
Quoted 6 lines
Quoted 3 lines
I sense a need for
devm_gpio_request_array()here. Otherwise this looks fine - ideally it'd move to gpiod but moving to gpiolib is a clear win so no need to block on this.I wish Dmitry took the opportunity to move this driver to the gpiod API, especially since doing so would be trivial for this driver.
+1 on this.
However this platform is not device tree, so this implies setting up a descriptor table for the affected driver(s) to work properly. See Documentation/gpio/board.txt
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 11/15] sound: soc: poodle: make use of new locomo GPIO interface
2014-10-31 12:52 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 19 lines · Alexandre Courbot
Quoted 18 lines · Mark Brown
Quoted 16 lines · Dmitry Eremin-Solenikov
Quoted 2 lines
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Please use subject lines matching the style for the subsystem.
sound/soc/pxa/poodle.c static struct snd_soc_card poodle = { · line 271
Quoted 6 lines
sound/soc/pxa/poodle.c +6
-0+ ret =gpio_request_array (poodle_gpios,ARRAY_SIZE (poodle_gpios)); +if (ret) { +dev_err (&pdev->dev,"gpio_request_array() failed: %d\n" , + ret); +return ret; + }I sense a need for
devm_gpio_request_array()here. Otherwise this looks fine - ideally it'd move to gpiod but moving to gpiolib is a clear win so no need to block on this.
Quoted 8 lines
Quoted 2 lines
I wish Dmitry took the opportunity to move this driver to the gpiod API, especially since doing so would be trivial for this driver.
+1 on this.
However this platform is not device tree, so this implies setting up a descriptor table for the affected driver(s) to work properly. See
Documentation/gpio/board.txt
I checked the gpiod interfaces after original suggestion by Alexandre.
Introducing those mapping tables (much like pinctrl tables) look like a duplicate effort if Russell will permit adding a DT support. So I thought that I will reconsider gpiod/pinctrl/etc after fixing LoCoMo, reiterating IRQ patches, possibly switching to COMMON_CLK and (finally) thinking about device tree support.
Signature · 2 lines
With best wishes Dmitry
Re: [PATCH 11/15] sound: soc: poodle: make use of new locomo GPIO interface
Quoted 29 lines · Dmitry Eremin-Solenikov
2014-10-31 12:52 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 19 lines · Alexandre Courbot
Quoted 18 lines · Mark Brown
Quoted 16 lines · Dmitry Eremin-Solenikov
Quoted 2 lines
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Please use subject lines matching the style for the subsystem.
Review
Quoted 6 lines
(quoted diff) +6
-0+ ret = gpio_request_array(poodle_gpios, ARRAY_SIZE(poodle_gpios)); + if (ret) { + dev_err(&pdev->dev, "gpio_request_array() failed: %d\n", + ret); + return ret; + }I sense a need for
devm_gpio_request_array()here. Otherwise this looks fine - ideally it'd move to gpiod but moving to gpiolib is a clear win so no need to block on this.Quoted 8 lines
Quoted 2 lines
I wish Dmitry took the opportunity to move this driver to the gpiod API, especially since doing so would be trivial for this driver.
+1 on this.
However this platform is not device tree, so this implies setting up a descriptor table for the affected driver(s) to work properly. See
Documentation/gpio/board.txt
Quoted 7 lines
I checked the gpiod interfaces after original suggestion by Alexandre.
Introducing those mapping tables (much like pinctrl tables) look like a duplicate effort if Russell will permit adding a DT support. So I thought that I will reconsider gpiod/pinctrl/etc after fixing LoCoMo, reiterating IRQ patches, possibly switching to
COMMON_CLKand (finally) thinking about device tree support.
Note that the mapping tables are likely not going to end up being huge, and taking that step will allow you to convert to the gpiod interface, something you would probably want to do later when adding DT support anyway. So at the end of the day there would be very little wasted effort: once converting to DT, just add the GPIO properties into the appropriate node, remove the mapping tables, and you're done.
Quoted 4 lines · Dmitry Eremin-Solenikov
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. Current drivers present in Linux kernel has some problems:
* It uses custom bus instead of platform bus/mfd core.
I believe Greg wouldn't see that as a positive point.
Don't think that the platform bus _should_ always be used. It shouldn't (Greg has said he'd like to see the platform bus to be totally killed off.) Instead, custom buses properly suited to the class of device in question is much preferred, especially if it aids in...
Quoted 1 line
* Device drivers are not well layered/separated.
... better layering or separation of drivers.
So, thinking that converting from a custom bus to a platform bus definitely is /not/ a positive step forward.
(Why mfd was ever allowed to re-use the platform bus stuff is a separate question not relevent to these patches.)
Signature · 2 lines
FTTC broadband for 0.8mile line: currently at 9.5Mbps down 400kbps up according to speedtest.net.
A message that is not in the archive (sent off-list or not yet received): 20141028001338.GZ27405-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org
2014-10-28 4:13 GMT+04:00 Russell King - ARM Linux <linux-lFZ/[email protected]>:
Quoted 12 lines · Dmitry Eremin-Solenikov
Quoted 4 lines
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. Current drivers present in Linux kernel has some problems:
* It uses custom bus instead of platform bus/mfd core.
I believe Greg wouldn't see that as a positive point.
Don't think that the platform bus _should_ always be used. It shouldn't (Greg has said he'd like to see the platform bus to be totally killed off.) Instead, custom buses properly suited to the class of device in question is much preferred, especially if it aids in...
I'm sorry, I must be outdated on this topic. Few years ago things were exactly opposite - we explicitly had to use platform bus for mfd devices. I still think that
mfd devices containing several cells should use mfd-core (is it still OK to use it?).
And mfd-core (up to now) uses platform bus.
Quoted 7 lines
Quoted 2 lines
* Device drivers are not well layered/separated.
... better layering or separation of drivers.
So, thinking that converting from a custom bus to a platform bus definitely is /not/ a positive step forward.
Is there an example of new approach? Current locomo-dev implementation is poisoned with several bugs. For example it passes ioremapped memory as resources to child devices that later call request_resource() on it. Adding additional features (like correct work with IRQs) will duplicate platform bus code and mfd functions.
Quoted 3 lines
(Why mfd was ever allowed to re-use the platform bus stuff is a separate question not relevent to these patches.)
I remember this story - Ian Molton and me wrote mfd-core.c.
Signature · 6 lines
With best wishes Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Mark Brown
maintainerQuoted 15 lines · Russell King - ARM Linux
Quoted 4 lines · Dmitry Eremin-Solenikov
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. Current drivers present in Linux kernel has some problems:
* It uses custom bus instead of platform bus/mfd core.
I believe Greg wouldn't see that as a positive point.
Don't think that the platform bus _should_ always be used. It shouldn't (Greg has said he'd like to see the platform bus to be totally killed off.) Instead, custom buses properly suited to the class of device in question is much preferred, especially if it aids in...
Quoted 1 line
* Device drivers are not well layered/separated.
Quoted 7 lines
... better layering or separation of drivers.
So, thinking that converting from a custom bus to a platform bus definitely is /not/ a positive step forward.
(Why mfd was ever allowed to re-use the platform bus stuff is a separate question not relevent to these patches.)
The reason we ended up reusing the platform bus so much was that originally people were doing custom buses but people started complaining that the code was (or should be) a cut'n'paste of the platform bus and that this duplication was both not pretty and a bit tedious for anyone doing anything that involved deploying good practice over a lot of buses. Early MFDs were actually MMIO devices so the platform bus was a good fit, then people (including me when I upstreamed the wm97xx drivers and apparently whoever worked on these devices) started adding custom buses and then people complianed that we should reuse both the bus type and the MFD infrastructure so here we are.
Probably a way of sharing the platform code but giving the bus another name and bus_type would allow for better separation here.
cover new locomo driver
In reply to Russell King - ARM Linux2014-10-28 3:13 GMT+03:00 Russell King - ARM Linux <[email protected]>:
Quoted 12 lines · Dmitry Eremin-Solenikov
Quoted 4 lines
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. Current drivers present in Linux kernel has some problems:
* It uses custom bus instead of platform bus/mfd core.
I believe Greg wouldn't see that as a positive point.
Don't think that the platform bus _should_ always be used. It shouldn't (Greg has said he'd like to see the platform bus to be totally killed off.) Instead, custom buses properly suited to the class of device in question is much preferred, especially if it aids in...
Greg, Russell, what should I use then for mfd multi-cell devices? Is mfd-core still a permitted API? Should we change mfd-core internals to spawn extra bus (busses?) for the cells?
Quoted 7 lines
Quoted 2 lines
* Device drivers are not well layered/separated.
... better layering or separation of drivers.
So, thinking that converting from a custom bus to a platform bus definitely is /not/ a positive step forward.
Signature · 2 lines
With best wishes Dmitry
cover new locomo driver
Quoted 9 lines · Dmitry Eremin-Solenikov
2014-10-28 3:13 GMT+03:00 Russell King - ARM Linux <[email protected]>:
Quoted 8 lines · Dmitry Eremin-Solenikov
Quoted 4 lines
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. Current drivers present in Linux kernel has some problems:
* It uses custom bus instead of platform bus/mfd core.
I believe Greg wouldn't see that as a positive point.
Quoted 8 lines
Quoted 4 lines
Don't think that the platform bus _should_ always be used. It shouldn't (Greg has said he'd like to see the platform bus to be totally killed off.) Instead, custom buses properly suited to the class of device in question is much preferred, especially if it aids in...
Greg, Russell, what should I use then for mfd multi-cell devices? Is mfd-core still a permitted API? Should we change mfd-core internals to spawn extra bus (busses?) for the cells?
I have no objection to the current mfd code, it's just a long-time grumbling on my part about the state of the platform interfaces. Not enough of an issue to make me actually do anything about it :)
thanks,
greg k-h