new locomo driver set
Subsystems (14)
v2 cover new locomo driver set
Sharp Zaurus SL-5500 and SL-5600 use special companion Gate Array. With this patchset I tried to modernise and restructure the LoCoMo drivers.
* Use platform bus and mfd core code
* Use GPIO API instead of custom locomo GPIO code
* Use irqdomains to manage IRQs
* Split mixed locomolcd driver to lcd and backlight parts
* Implement IRQ handling in GPIO driver
* Implement SPI driver used as a host for mmc_spi device to control SD cards
V1 was submitted about a half of a year ago. Major changes:
* Use gpiod_* in most of places
* Use regmap for accessing registers instead of manual RMW cycles
* Split dac driver from core module to i2c bus and separate IIO driver
* Replaced mdelay() calls with usleep_range or msleep where it was suitable
* Rewrote SPI driver to use core transfer_one() interface
--
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 v2 1/17 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 | 10 ++ drivers/mfd/Makefile | 1 + drivers/mfd/locomo.c | 356 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/locomo.h | 173 ++++++++++++++++++++++ 4 files changed, 540 insertions(+) create mode 100644 drivers/mfd/locomo.c create mode 100644 include/linux/mfd/locomo.h
drivers/mfd/Kconfig +10 -0
@@ -1430,6 +1430,16 @@ 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 + select IRQ_DOMAIN + select REGMAP_MMIO + 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
@@ -181,6 +181,7 @@ obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o obj-$(CONFIG_MFD_DLN2) += dln2.o obj-$(CONFIG_MFD_RT5033) += rt5033.o obj-$(CONFIG_MFD_SKY81452) += sky81452.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 +356 -0
356 lines not on this page · raw message
include/linux/mfd/locomo.h new file +173 -0
173 lines not on this page · raw message
Signature · 1 line
2.1.4
A message that is not in the archive (sent off-list or not yet received): 1430178954-11138-2-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Re: [PATCH v2 01/17] mfd: add new driver for Sharp LoCoMo
Quoted 23 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]>--- drivers/mfd/Kconfig | 10 ++ drivers/mfd/Makefile | 1 + drivers/mfd/locomo.c | 356 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/locomo.h | 173 ++++++++++++++++++++++ 4 files changed, 540 insertions(+) create mode 100644 drivers/mfd/locomo.c create mode 100644 include/linux/mfd/locomo.hdrivers/mfd/Kconfig +0
-0@@ -1430,6 +1430,16 @@ config MFD_STW481X in various ST Microelectronics and ST-Ericsson embedded Nomadik series.
drivers/mfd/Kconfig config MFD_STW481X · line 1441
Quoted 10 lines
drivers/mfd/Kconfig +9
-0+config MFD_LOCOMO + bool "Sharp LoCoMo support" + depends on ARM + select MFD_CORE + select IRQ_DOMAIN + select REGMAP_MMIO + help + Support for Sharp LoCoMo Grid Array found in Sharp SL-5x00 + PDA family.
Are people really still using this stuff?
Quoted 25 lines
drivers/mfd/Kconfig +0
-0menu "Multimedia Capabilities Port drivers" depends on ARCH_SA1100drivers/mfd/Makefile +1
-0@@ -181,6 +181,7 @@ obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o obj-$(CONFIG_MFD_DLN2) += dln2.o obj-$(CONFIG_MFD_RT5033) += rt5033.o obj-$(CONFIG_MFD_SKY81452) += sky81452.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.odrivers/mfd/locomo.c new file +4
-0@@ -0,0 +1,356 @@ +/* +* Sharp LoCoMo support +* +* Based on old driver at arch/arm/common/locomo.c
drivers/mfd/locomo.c line 14
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* This file contains all generic LoCoMo support. +* +* All initialization functions provided here are intended to be called +* from machine specific code with proper arguments when required. +*/
'\n'
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/io.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/platform_device.h>
drivers/mfd/locomo.c line 34
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+#include <linux/mfd/core.h> +#include <linux/mfd/locomo.h> + +/* LoCoMo Interrupts */ +#define IRQ_LOCOMO_KEY (0) +#define IRQ_LOCOMO_GPIO (1) +#define IRQ_LOCOMO_LT (2) +#define IRQ_LOCOMO_SPI (3) + +#define LOCOMO_NR_IRQS (4)
No need for all this added () protection.
Quoted 9 lines
drivers/mfd/locomo.c new file +9
-0+/* the following is the overall data for the locomo chip */ +struct locomo { +struct device *dev; +unsigned int irq; +spinlock_t lock; +struct irq_domain *domain; +struct regmap *regmap; +}; +
drivers/mfd/locomo.c line 54
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+static struct resource locomo_kbd_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_KEY ), +}; + +static struct resource locomo_gpio_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_GPIO ), +}; + +/* Filled in locomo_probe() function. */ +static struct locomo_gpio_platform_data locomo_gpio_pdata;
I'd prefer you didn't use globals for this.
Quoted 30 lines
drivers/mfd/locomo.c new file +30
-0+static struct resource locomo_lt_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_LT ), +}; + +static struct resource locomo_spi_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_SPI ), +}; + +/* Filled in locomo_probe() function. */ +static struct locomo_lcd_platform_data locomo_lcd_pdata; + +static struct mfd_cell locomo_cells[] = { + { + .name ="locomo-kbd" , + .resources = locomo_kbd_resources, + .num_resources =ARRAY_SIZE (locomo_kbd_resources), + }, + { + .name ="locomo-gpio" , + .resources = locomo_gpio_resources, + .num_resources =ARRAY_SIZE (locomo_gpio_resources), + .platform_data = &locomo_gpio_pdata, + .pdata_size =sizeof (locomo_gpio_pdata), + }, + { + .name ="locomo-lt" ,/* Long time timer */ + .resources = locomo_lt_resources, + .num_resources =ARRAY_SIZE (locomo_lt_resources), + }, + {
drivers/mfd/locomo.c line 95
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ .name = "locomo-spi", + .resources = locomo_spi_resources, + .num_resources = ARRAY_SIZE(locomo_spi_resources), + }, + { + .name = "locomo-led", + }, + { + .name = "locomo-backlight", + },
Please make these:
drivers/mfd/locomo.c line 95
Quoted 2 lines
drivers/mfd/locomo.c new file +2
-0+ { .name = "locomo-led" }, + { .name = "locomo-backlight" },
... and put them at the bottom.
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ { + .name = "locomo-lcd", + .platform_data = &locomo_lcd_pdata, + .pdata_size = sizeof(locomo_lcd_pdata), + }, + { + .name = "locomo-i2c", + }, +}; +
drivers/mfd/locomo.c line 115
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+/* IRQ support */ +static void locomo_handler (unsigned int irq,struct irq_desc *desc) +{ +struct locomo *lchip =irq_get_handler_data (irq); +struct irq_chip *irqchip =irq_desc_get_chip (desc); +unsigned int req; + +chained_irq_enter (irqchip, desc); + +/* check why this interrupt was generated */
Start comments with an uppercase character.
drivers/mfd/locomo.c line 118
Quoted 3 lines
drivers/mfd/locomo.c new file +3
-0+while (1 ) { +regmap_read (lchip->regmap,LOCOMO_ICR , &req); + req &=0x0f00 ;
What is this magic number? Please #define it.
drivers/mfd/locomo.c line 123
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+if (!req) +break ; + + irq =ffs (req) -9 ;
Minus another random number? Either define it or enter a comment.
drivers/mfd/locomo.c line 132
Quoted 9 lines
drivers/mfd/locomo.c new file +9
-0+generic_handle_irq (irq_find_mapping (lchip->domain, irq)); + } + +chained_irq_exit (irqchip, desc); +} + +static void locomo_ack_irq (struct irq_data *d) +{ +}
Not sure you need this. Please check.
If you do, please fix the caller, as it should be checked for NULL prior to invocation.
drivers/mfd/locomo.c line 140
Quoted 7 lines
drivers/mfd/locomo.c new file +7
-0+static void locomo_mask_irq (struct irq_data *d) +{ +struct locomo *lchip =irq_data_get_irq_chip_data (d); + +regmap_update_bits (lchip->regmap,LOCOMO_ICR , +0x0010 << d->hwirq, +0 );
Why the forced line break here.
More magic numbers -- please define.
drivers/mfd/locomo.c line 149
Quoted 9 lines
drivers/mfd/locomo.c new file +9
-0+} + +static void locomo_unmask_irq (struct irq_data *d) +{ +struct locomo *lchip =irq_data_get_irq_chip_data (d); + +regmap_update_bits (lchip->regmap,LOCOMO_ICR , + (0x0010 << d->hwirq), + (0x0010 << d->hwirq));
This looks hacky. Please define a proper mask and value.
drivers/mfd/locomo.c line 153
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+} + +static struct irq_chip locomo_chip = { + .name ="LOCOMO" ,
Any reason why this has to be uppercase?
Quoted 25 lines
drivers/mfd/locomo.c new file +25
-0+ .irq_ack = locomo_ack_irq, + .irq_mask = locomo_mask_irq, + .irq_unmask = locomo_unmask_irq, +}; + +static int locomo_irq_map (struct irq_domain *d,unsigned int virq, +irq_hw_number_t hwirq) +{ +struct locomo *locomo = d->host_data; + +irq_set_chip_data (virq, locomo); +irq_set_chip_and_handler (virq, &locomo_chip, + handle_level_irq); +set_irq_flags (virq,IRQF_VALID ); + +return 0 ; +} + +static void locomo_irq_unmap (struct irq_domain *d,unsigned int virq) +{ +set_irq_flags (virq,0 ); +irq_set_chip_and_handler (virq,NULL ,NULL ); +irq_set_chip_data (virq,NULL ); +} +
drivers/mfd/locomo.c line 188
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+static struct irq_domain_ops locomo_irq_ops = { + .map = locomo_irq_map, + .unmap = locomo_irq_unmap, + .xlate = irq_domain_xlate_onecell, +}; + +static int locomo_setup_irq (struct locomo *lchip) +{ + lchip->domain =irq_domain_add_simple (NULL ,LOCOMO_NR_IRQS ,0 , + &locomo_irq_ops, lchip);
Please line up line breaks with the '('.
drivers/mfd/locomo.c line 190
Quoted 2 lines
drivers/mfd/locomo.c new file +2
-0+if (!lchip->domain) { +dev_err (lchip->dev,"Failed to register irqdomain\n" );
No need for this. The IRQ domain handling with print one out for you.
Quoted 9 lines
drivers/mfd/locomo.c new file +9
-0+return -ENOMEM ; + } + +/* +* 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 209
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ +return 0 ; +} + +#ifdef CONFIG_PM_SLEEP +static int locomo_suspend (struct device *dev) +{ +struct locomo *lchip =dev_get_drvdata (dev); + +/* AUDIO */
WHY ARE YOU SHOUTING? Ironic eh? ;)
Quoted 9 lines
drivers/mfd/locomo.c new file +9
-0+regmap_write (lchip->regmap,LOCOMO_PAIF ,0x00 ); + +/* +* Original code disabled the clock depending on leds settings +* However we disable leds before suspend, thus it's safe +* to just assume this setting. +*/ +/* CLK32 off */ +regmap_write (lchip->regmap,LOCOMO_C32K ,0x00 );
drivers/mfd/locomo.c line 228
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ +/* 22MHz/24MHz clock off */ +regmap_write (lchip->regmap,LOCOMO_ACC ,0x00 ); + +return 0 ; +} + +static int locomo_resume (struct device *dev) +{ +struct locomo *lchip =dev_get_drvdata (dev);
Do audio and clk sort themselves out?
drivers/mfd/locomo.c line 235
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+regmap_write (lchip->regmap,LOCOMO_C32K ,0x00 ); + +return 0 ; +} + +static SIMPLE_DEV_PM_OPS(locomo_pm, locomo_suspend, locomo_resume);
Put this outside of CONFIG_PM_SLEEP and SIMPLE_DEV_PM_OPS() will take care of this for you.
drivers/mfd/locomo.c
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+#define LOCOMO_PM (&locomo_pm) + +#else +#define LOCOMO_PM / NULL
This you can remove all of this.
drivers/mfd/locomo.c line 251
Quoted 12 lines
drivers/mfd/locomo.c new file +12
-0+#endif + +static const struct regmap_config locomo_regmap_config = { + .name ="LoCoMo" , + .reg_bits =8 , + .reg_stride =4 , + .val_bits =16 , + .cache_type =REGCACHE_NONE , + .max_register =0xec , +}; + +static int locomo_probe (struct platform_device *dev)
s/dev/pdev/
dev is usually used for 'struct device' pointers.
drivers/mfd/locomo.c line 254
Quoted 3 lines
drivers/mfd/locomo.c new file +3
-0+{ +struct locomo_platform_data *pdata =dev_get_platdata (&dev->dev); +struct resource *mem;
Nit: res is more commonplace.
drivers/mfd/locomo.c line 256
Quoted 2 lines
drivers/mfd/locomo.c new file +2
-0+void __iomem *base; +struct locomo *lchip;
I always quite like ldev.
drivers/mfd/locomo.c line 257
Quoted 1 line
drivers/mfd/locomo.c new file +1
-0+unsigned int r;
r is not a good variable name.
drivers/mfd/locomo.c line 258
Quoted 1 line
drivers/mfd/locomo.c new file +1
-0+int ret = -ENODEV ;
No need to initialise.
drivers/mfd/locomo.c line 260
Quoted 1 line
drivers/mfd/locomo.c new file +1
-0+ lchip =devm_kzalloc (&dev->dev,sizeof (struct locomo ),GFP_KERNEL );
s/struct locomo/*lchip/
drivers/mfd/locomo.c line 269
Quoted 9 lines
drivers/mfd/locomo.c new file +9
-0+if (!lchip) +return -ENOMEM ; + +spin_lock_init (&lchip->lock); + lchip->dev = &dev->dev; + + lchip->irq =platform_get_irq (dev,0 ); +if (lchip->irq <0 ) +return -ENXIO ;
Why are you making up your own return codes?
return lchip->irq;
drivers/mfd/locomo.c line 277
Quoted 7 lines
drivers/mfd/locomo.c new file +7
-0+ mem =platform_get_resource (dev,IORESOURCE_MEM ,0 ); + base =devm_ioremap_resource (&dev->dev, mem); +if (IS_ERR (base)) +return PTR_ERR (base); + + lchip->regmap =devm_regmap_init_mmio (&dev->dev, base, + &locomo_regmap_config);
Line up with '('.
drivers/mfd/locomo.c line 287
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+if (IS_ERR (lchip->regmap)) +return PTR_ERR (lchip->regmap); + +if (pdata) { + locomo_gpio_pdata.gpio_base = pdata->gpio_base; + locomo_lcd_pdata.comadj = pdata->comadj; + }else { + locomo_gpio_pdata.gpio_base =-1 ; + locomo_lcd_pdata.comadj =128 ; + }
struct locomo_gpio_platform_data locomo_gpio_pdata;
locomo_gpio_pdata = devm_kzalloc(<blah>);
locomo_cells[GPIO].platform_data = locomo_gpio_pdata;
drivers/mfd/locomo.c line 292
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+platform_set_drvdata (dev, lchip); + +regmap_read (lchip->regmap,LOCOMO_VER , &r); +dev_info (&dev->dev,"LoCoMo Chip: %04x\n" , r);
s/r/rev/
or
s/r/id/
drivers/mfd/locomo.c line 295
Quoted 2 lines
drivers/mfd/locomo.c new file +2
-0+/* locomo initialize */ +regmap_write (lchip->regmap,LOCOMO_ICR ,0 );
What does initialize mean? Enable? Reset IRQs? Reset chip?
drivers/mfd/locomo.c line 303
Quoted 7 lines
drivers/mfd/locomo.c new file +7
-0+/* Longtime timer */ +regmap_write (lchip->regmap,LOCOMO_LTINT ,0 ); + +/* +* The interrupt controller must be initialised before any +* other device to ensure that the interrupts are available. +*/
That's pretty normal isn't it?
drivers/mfd/locomo.c line 306
Quoted 3 lines
drivers/mfd/locomo.c new file +3
-0+ ret =locomo_setup_irq (lchip); +if (ret <0 ) + goto err_add;
What if ret > 0?
Suggest:
if (ret)
drivers/mfd/locomo.c line 310
Quoted 3 lines
drivers/mfd/locomo.c new file +3
-0+ ret =mfd_add_devices (&dev->dev, dev->id, + locomo_cells,ARRAY_SIZE (locomo_cells), + mem,-1 , lchip->domain);
s/mem/base/
drivers/mfd/locomo.c line 316
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+if (ret) + goto err_add; + +return 0 ; + +err_add:
What does err_add mean?
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+irq_set_chained_handler (lchip->irq,NULL ); +irq_set_handler_data (lchip->irq,NULL ); +if (lchip->domain) +irq_domain_remove (lchip->domain);
drivers/mfd/locomo.c line 330
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ +return ret; +} + +static int locomo_remove (struct platform_device *dev) +{ +struct locomo *lchip =platform_get_drvdata (dev); + +if (!lchip) +return 0 ;
Is that even possible?
drivers/mfd/locomo.c line 335
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+mfd_remove_devices (&dev->dev); + +irq_set_chained_handler (lchip->irq,NULL ); +irq_set_handler_data (lchip->irq,NULL );
'\n'
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+if (lchip->domain) +irq_domain_remove (lchip->domain); + +return 0 ;
drivers/mfd/locomo.c line 349
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+} + +static struct platform_driver locomo_device_driver = { + .probe = locomo_probe, + .remove = locomo_remove, + .driver = { + .name ="locomo" , + .pm =LOCOMO_PM , + }, +};
Lining these up looks weird. Especially as the stuff in .driver is *meant* to be indented.
drivers/mfd/locomo.c line 354
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+module_platform_driver (locomo_device_driver); + +MODULE_DESCRIPTION ("Sharp LoCoMo core driver" ); +MODULE_LICENSE ("GPL" );
GPL v2
include/linux/mfd/locomo.h
Quoted 7 lines
drivers/mfd/locomo.c new file +2
-0+MODULE_AUTHOR ("John Lenz <[email protected]>" ); +MODULE_ALIAS ("platform:locomo" );include/linux/mfd/locomo.h new file +0
-0
This whole file needs a jolly good tidy-up.
include/linux/mfd/locomo.h line 2
Quoted 3 lines
include/linux/mfd/locomo.h new file +2
-0@@ -0,0 +1,173 @@ +/* +* include/linux/mfd/locomo.h
Remove this. We know what file it's in.
include/linux/mfd/locomo.h line 6
Quoted 3 lines
include/linux/mfd/locomo.h new file +3
-0+* This file contains the definitions for the LoCoMo G/A Chip +* +* (C) Copyright 2004 John Lenz
This is out of date.
include/linux/mfd/locomo.h line 12
Quoted 5 lines
include/linux/mfd/locomo.h new file +5
-0+* May be copied or modified under the terms of the GNU General Public +* License. See linux/COPYING for more information. +* +* Based on sa1111.h +*/
'/n'
include/linux/mfd/locomo.h line 17
Quoted 5 lines
include/linux/mfd/locomo.h new file +5
-0+#ifndef _ASM_ARCH_LOCOMO +#define _ASM_ARCH_LOCOMO + +/* LOCOMO version */ +#define LOCOMO_VER 0x00
This is misleading.
The version is not 0, this is the register address.
Quoted 4 lines
include/linux/mfd/locomo.h new file +4
-0+/* Pin status */ +#define LOCOMO_ST 0x04 + +/* Pin status */
include/linux/mfd/locomo.h line 32
Quoted 10 lines
include/linux/mfd/locomo.h new file +10
-0+#define LOCOMO_C32K 0x08 + +/* Interrupt controller */ +#define LOCOMO_ICR 0x0C + +/* MCS decoder for boot selecting */ +#define LOCOMO_MCSX0 0x10 +#define LOCOMO_MCSX1 0x14 +#define LOCOMO_MCSX2 0x18 +#define LOCOMO_MCSX3 0x1c
These are pretty cryptic. Any way of making them easier to identify.
Quoted 20 lines
include/linux/mfd/locomo.h new file +20
-0+/* Touch panel controller */ +#define LOCOMO_ASD 0x20/* AD start delay */ +#define LOCOMO_HSD 0x28/* HSYS delay */ +#define LOCOMO_HSC 0x2c/* HSYS period */ +#define LOCOMO_TADC 0x30/* tablet ADC clock */ + +/* Backlight controller: TFT signal */ +#define LOCOMO_TC 0x38/* TFT control signal */ +#define LOCOMO_CPSD 0x3c/* CPS delay */ + +/* Keyboard controller */ +#define LOCOMO_KIB 0x40/* KIB level */ +#define LOCOMO_KSC 0x44/* KSTRB control */ +#define LOCOMO_KCMD 0x48/* KSTRB command */ +#define LOCOMO_KIC 0x4c/* Key interrupt */ + +/* Audio clock */ +#define LOCOMO_ACC 0x54/* Audio clock */ +#define LOCOMO_ACC_XON 0x80 +#define LOCOMO_ACC_XEN 0x40
include/linux/mfd/locomo.h line 63
Quoted 10 lines
include/linux/mfd/locomo.h new file +10
-0+#define LOCOMO_ACC_XSEL0 0x00 +#define LOCOMO_ACC_XSEL1 0x20 +#define LOCOMO_ACC_MCLKEN 0x10 +#define LOCOMO_ACC_64FSEN 0x08 +#define LOCOMO_ACC_CLKSEL000 0x00/* mclk 2 */ +#define LOCOMO_ACC_CLKSEL001 0x01/* mclk 3 */ +#define LOCOMO_ACC_CLKSEL010 0x02/* mclk 4 */ +#define LOCOMO_ACC_CLKSEL011 0x03/* mclk 6 */ +#define LOCOMO_ACC_CLKSEL100 0x04/* mclk 8 */ +#define LOCOMO_ACC_CLKSEL101 0x05/* mclk 12 */
I think you have an issue with spaces and tabs here.
include/linux/mfd/locomo.h line 67
Quoted 3 lines
include/linux/mfd/locomo.h new file +3
-0+/* SPI interface */ +#define LOCOMO_SPIMD 0x60/* SPI mode setting */ +#define LOCOMO_SPIMD_LOOPBACK (1 << 15)/* loopback tx to rx */
Use BIT() for all '1 <<'s.
include/linux/mfd/locomo.h line 72
Quoted 5 lines
include/linux/mfd/locomo.h new file +5
-0+#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) */ +#define LOCOMO_SPIMD_RCPOL (1 << 10)/* receive CPOL (maybe affects CPHA) */ +#define LOCOMO_SPIMD_TDINV (1 << 9)/* invert transmit line */
Why is this different?
Quoted 4 lines
include/linux/mfd/locomo.h new file +4
-0+#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 */ +#define LOCOMO_SPIMD_XSEL 0x0018/* clock select */
include/linux/mfd/locomo.h line 86
Quoted 10 lines
include/linux/mfd/locomo.h new file +10
-0+/* xon must be off when enabling xen, wait 300 us before xon -> 1 */ +#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 */
Better to line all of these up along with the rest of the file.
Quoted 65 lines
include/linux/mfd/locomo.h new file +65
-0+#define LOCOMO_SPICT 0x64/* 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, 1: 16 bit*/ +#define LOCOMO_SPICT_ALIGNEN (1 << 2)/* align transfer enable */ +#define LOCOMO_SPICT_RXWEN (1 << 1)/* continuous receive */ +#define LOCOMO_SPICT_RXUEN (1 << 0)/* aligned receive */ + +#define LOCOMO_SPIST 0x68/* SPI status */ +#define LOCOMO_SPI_TEND (1 << 3)/* Transfer end bit */ +#define LOCOMO_SPI_REND (1 << 2)/* Receive end bit */ +#define LOCOMO_SPI_RFW (1 << 1)/* write buffer bit */ +#define LOCOMO_SPI_RFR (1)/* read buffer bit */ + +#define LOCOMO_SPIIS 0x70/* SPI interrupt status */ +#define LOCOMO_SPIWE 0x74/* SPI interrupt status write enable */ +#define LOCOMO_SPIIE 0x78/* SPI interrupt enable */ +#define LOCOMO_SPIIR 0x7c/* SPI interrupt request */ +#define LOCOMO_SPITD 0x80/* SPI transfer data write */ +#define LOCOMO_SPIRD 0x84/* SPI receive data read */ +#define LOCOMO_SPITS 0x88/* SPI transfer data shift */ +#define LOCOMO_SPIRS 0x8C/* SPI receive data shift */ + +/* GPIO */ +#define LOCOMO_GPD 0x90/* GPIO direction */ +#define LOCOMO_GPE 0x94/* GPIO input enable */ +#define LOCOMO_GPL 0x98/* GPIO level */ +#define LOCOMO_GPO 0x9c/* GPIO out data setting */ +#define LOCOMO_GRIE 0xa0/* GPIO rise detection */ +#define LOCOMO_GFIE 0xa4/* GPIO fall detection */ +#define LOCOMO_GIS 0xa8/* GPIO edge detection status */ +#define LOCOMO_GWE 0xac/* GPIO status write enable */ +#define LOCOMO_GIE 0xb0/* GPIO interrupt enable */ +#define LOCOMO_GIR 0xb4/* GPIO interrupt request */ + +/* Front light adjustment controller */ +#define LOCOMO_ALS 0xc8/* Adjust light cycle */ +#define LOCOMO_ALS_EN 0x8000 +#define LOCOMO_ALD 0xcc/* Adjust light duty */ + +/* PCM audio interface */ +#define LOCOMO_PAIF 0xd0/* PCM audio interface */ +#define LOCOMO_PAIF_SCINV 0x20 +#define LOCOMO_PAIF_SCEN 0x10 +#define LOCOMO_PAIF_LRCRST 0x08 +#define LOCOMO_PAIF_LRCEVE 0x04 +#define LOCOMO_PAIF_LRCINV 0x02 +#define LOCOMO_PAIF_LRCEN 0x01 + +/* Long time timer */ +#define LOCOMO_LTC 0xd8/* LTC interrupt setting */ +#define LOCOMO_LTINT 0xdc/* LTC interrupt */ + +/* DAC control signal for LCD (COMADJ ) */ +#define LOCOMO_DAC 0xe0 +/* DAC control */ +#define LOCOMO_DAC_SCLOEB 0x08/* SCL pin output data */ +#define LOCOMO_DAC_TEST 0x04/* Test bit */ +#define LOCOMO_DAC_SDA 0x02/* SDA pin level (read-only) */ +#define LOCOMO_DAC_SDAOEB 0x01/* SDA pin output data */ + +/* LED controller */
include/linux/mfd/locomo.h line 162
Quoted 10 lines
include/linux/mfd/locomo.h new file +10
-0+#define LOCOMO_LPT0 0xe8 +#define LOCOMO_LPT1 0xec +#define LOCOMO_LPT_TOFH 0x80 +#define LOCOMO_LPT_TOFL 0x08 +#define LOCOMO_LPT_TOH (TOH ) ((TOH & 0x7) << 4) +#define LOCOMO_LPT_TOL (TOL ) ((TOL & 0x7)) + +struct locomo_gpio_platform_data { +unsigned int gpio_base; +};
A struct for a single int seems overkill.
include/linux/mfd/locomo.h line 171
Quoted 8 lines
include/linux/mfd/locomo.h new file +8
-0+struct locomo_lcd_platform_data { +u8 comadj; +}; + +struct locomo_platform_data { +unsigned int gpio_base; +u8 comadj; +};
Why do you need to pass gpio_base twice?
Quoted 1 line
include/linux/mfd/locomo.h new file +1
-0+#endif
Signature · 4 lines
Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
Re: [PATCH v2 01/17] mfd: add new driver for Sharp LoCoMo
2015-04-28 21:45 GMT+03:00 Lee Jones <[email protected]>:
Quoted 10 lines · Dmitry Eremin-Solenikov
Quoted 9 lines
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]>---
Thanks for the review. I agree (and have implemented) with most of your comments.
However I have few questions. See below.
Quoted 14 lines
Quoted 14 lines
drivers/mfd/locomo.c new file +13
-0+/* the following is the overall data for the locomo chip */ +struct locomo { +struct device *dev; +unsigned int irq; +spinlock_t lock; +struct irq_domain *domain; +struct regmap *regmap; +}; + +static struct resource locomo_kbd_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_KEY ), +}; +
Quoted 8 lines
drivers/mfd/locomo.c line 54
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+static struct resource locomo_gpio_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_GPIO ), +}; + +/* Filled in locomo_probe() function. */ +static struct locomo_gpio_platform_data locomo_gpio_pdata;I'd prefer you didn't use globals for this.
Just for platform data, or for all the structures?
Quoted 43 lines
Quoted 30 lines
drivers/mfd/locomo.c new file +30
-0+static struct resource locomo_lt_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_LT ), +}; + +static struct resource locomo_spi_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_SPI ), +}; + +/* Filled in locomo_probe() function. */ +static struct locomo_lcd_platform_data locomo_lcd_pdata; + +static struct mfd_cell locomo_cells[] = { + { + .name ="locomo-kbd" , + .resources = locomo_kbd_resources, + .num_resources =ARRAY_SIZE (locomo_kbd_resources), + }, + { + .name ="locomo-gpio" , + .resources = locomo_gpio_resources, + .num_resources =ARRAY_SIZE (locomo_gpio_resources), + .platform_data = &locomo_gpio_pdata, + .pdata_size =sizeof (locomo_gpio_pdata), + }, + { + .name ="locomo-lt" ,/* Long time timer */ + .resources = locomo_lt_resources, + .num_resources =ARRAY_SIZE (locomo_lt_resources), + }, + {drivers/mfd/locomo.c line 95
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ .name = "locomo-spi", + .resources = locomo_spi_resources, + .num_resources = ARRAY_SIZE(locomo_spi_resources), + }, + { + .name = "locomo-led", + }, + { + .name = "locomo-backlight", + },Please make these:
Quoted 4 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ { .name = "locomo-led" }, + { .name = "locomo-backlight" },... and put them at the bottom.
They will be populated by of_compatible lines, so it makes little sense to me. What about adding of compatibility lines to this patch?
Quoted 5 lines
drivers/mfd/locomo.c line 118
Quoted 3 lines
drivers/mfd/locomo.c new file +3
-0+while (1 ) { +regmap_read (lchip->regmap,LOCOMO_ICR , &req); + req &=0x0f00 ;What is this magic number? Please #define it.
Adding comments to this function instead.
Quoted 30 lines
drivers/mfd/locomo.c line 123
Quoted 5 lines
drivers/mfd/locomo.c new file +4
-0+if (!req) +break ; + + irq =ffs (req) -9 ;Minus another random number? Either define it or enter a comment.
drivers/mfd/locomo.c line 209
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+#ifdef CONFIG_PM_SLEEP +static int locomo_suspend (struct device *dev) +{ +struct locomo *lchip =dev_get_drvdata (dev); + +/* AUDIO */ WHY ARE YOU SHOUTING? Ironic eh? ;)
Quoted 13 lines
drivers/mfd/locomo.c new file +13
-0+regmap_write (lchip->regmap,LOCOMO_PAIF ,0x00 ); + +/* +* Original code disabled the clock depending on leds settings +* However we disable leds before suspend, thus it's safe +* to just assume this setting. +*/ +/* CLK32 off */ +regmap_write (lchip->regmap,LOCOMO_C32K ,0x00 ); + +/* 22MHz/24MHz clock off */ +regmap_write (lchip->regmap,LOCOMO_ACC ,0x00 ); +
Quoted 8 lines
drivers/mfd/locomo.c line 228
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+return 0 ; +} + +static int locomo_resume (struct device *dev) +{ +struct locomo *lchip =dev_get_drvdata (dev);Do audio and clk sort themselves out?
PAIF and ACC registers are used only by audio parts of the device. However there is no current Linux driver for those parts. The registers are cleared in case the firmware has set something in them, but in future it will be the task
of the audio driver to properly clear and restore them.
Quoted 5 lines
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+regmap_write (lchip->regmap,LOCOMO_C32K ,0x00 ); + +return 0 ; +} +
[skipped]
Quoted 9 lines
drivers/mfd/locomo.c line 287
Quoted 8 lines
drivers/mfd/locomo.c new file +8
-0+ +if (pdata) { + locomo_gpio_pdata.gpio_base = pdata->gpio_base; + locomo_lcd_pdata.comadj = pdata->comadj; + }else { + locomo_gpio_pdata.gpio_base =-1 ; + locomo_lcd_pdata.comadj =128 ; + }
Quoted 5 lines
struct
locomo_gpio_platform_datalocomo_gpio_pdata;
locomo_gpio_pdata=devm_kzalloc(<blah>);locomo_cells[GPIO].platform_data =
locomo_gpio_pdata;
I do not quite agree with you at this place. The passed platform_data will be kmemdup()'ed inside platform core. So the whole struct will be duplicated twice inside kmallocate'd memory. Ideally I'd like to drop the whole platform_data busyness, but that requires switching to DTS first.
Quoted 6 lines
Quoted 5 lines
include/linux/mfd/locomo.h new file +0
-0
Quoted 7 lines
include/linux/mfd/locomo.h line 32
Quoted 5 lines
include/linux/mfd/locomo.h new file +5
-0+/* MCS decoder for boot selecting */ +#define LOCOMO_MCSX0 0x10 +#define LOCOMO_MCSX1 0x14 +#define LOCOMO_MCSX2 0x18 +#define LOCOMO_MCSX3 0x1cThese are pretty cryptic. Any way of making them easier to identify.
No way. The names are based on old Sharp code. The drivers do not use them, but I'd like to still keep the registers for the reference purposes.
Quoted 6 lines
include/linux/mfd/locomo.h line 162
Quoted 3 lines
include/linux/mfd/locomo.h new file +3
-0+struct locomo_gpio_platform_data { +unsigned int gpio_base; +};A struct for a single int seems overkill.
Quoted 10 lines
include/linux/mfd/locomo.h line 171
Quoted 8 lines
include/linux/mfd/locomo.h new file +8
-0+struct locomo_lcd_platform_data { +u8 comadj; +}; + +struct locomo_platform_data { +unsigned int gpio_base; +u8 comadj; +};Why do you need to pass
gpio_basetwice?
First: machine file -> core driver
Second: core driver -> gpio driver
The other way to do the same would be:
struct locomo_gpio_platform_data {
unsigned int gpio_base;
};struct locomo_lcd_platform_data {
u8 comadj;
};struct locomo_platform_data {
struct locomo_gpio_platform_data gpio_pdata;
struct locomo_lcd_platform_data lcd_pdata;
};And to assign pointers to the passed data in the mfd_cells during locomo_probe. Does that look better to you?
Signature · 2 lines
With best wishes Dmitry
Re: [PATCH v2 01/17] mfd: add new driver for Sharp LoCoMo
Quoted 39 lines · Dmitry Eremin-Solenikov
2015-04-28 21:45 GMT+03:00 Lee Jones <[email protected]>:
Quoted 10 lines · Dmitry Eremin-Solenikov
Quoted 9 lines
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]>---
Thanks for the review. I agree (and have implemented) with most of your comments.
However I have few questions. See below.Quoted 14 lines
Quoted 14 lines
drivers/mfd/locomo.c new file +13
-0+/* the following is the overall data for the locomo chip */ +struct locomo { +struct device *dev; +unsigned int irq; +spinlock_t lock; +struct irq_domain *domain; +struct regmap *regmap; +}; + +static struct resource locomo_kbd_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_KEY ), +}; +Quoted 8 lines
drivers/mfd/locomo.c line 54
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+static struct resource locomo_gpio_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_GPIO ), +}; + +/* Filled in locomo_probe() function. */ +static struct locomo_gpio_platform_data locomo_gpio_pdata;I'd prefer you didn't use globals for this.
Quoted 1 line
Just for platform data, or for all the structures?
Just for this. The remainder are standard.
Quoted 43 lines
Quoted 43 lines
Quoted 30 lines
drivers/mfd/locomo.c new file +30
-0+static struct resource locomo_lt_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_LT ), +}; + +static struct resource locomo_spi_resources[] = { +DEFINE_RES_IRQ (IRQ_LOCOMO_SPI ), +}; + +/* Filled in locomo_probe() function. */ +static struct locomo_lcd_platform_data locomo_lcd_pdata; + +static struct mfd_cell locomo_cells[] = { + { + .name ="locomo-kbd" , + .resources = locomo_kbd_resources, + .num_resources =ARRAY_SIZE (locomo_kbd_resources), + }, + { + .name ="locomo-gpio" , + .resources = locomo_gpio_resources, + .num_resources =ARRAY_SIZE (locomo_gpio_resources), + .platform_data = &locomo_gpio_pdata, + .pdata_size =sizeof (locomo_gpio_pdata), + }, + { + .name ="locomo-lt" ,/* Long time timer */ + .resources = locomo_lt_resources, + .num_resources =ARRAY_SIZE (locomo_lt_resources), + }, + {drivers/mfd/locomo.c line 95
Quoted 10 lines
drivers/mfd/locomo.c new file +10
-0+ .name = "locomo-spi", + .resources = locomo_spi_resources, + .num_resources = ARRAY_SIZE(locomo_spi_resources), + }, + { + .name = "locomo-led", + }, + { + .name = "locomo-backlight", + },Please make these:
Quoted 7 lines
Quoted 4 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ { .name = "locomo-led" }, + { .name = "locomo-backlight" },... and put them at the bottom.
They will be populated by
of_compatiblelines, so it makes little sense to me. What about adding of compatibility lines to this patch?
Also fine.
Although if you assure me you will do it, you can add them separately.
Quoted 7 lines
Quoted 5 lines
drivers/mfd/locomo.c line 118
Quoted 3 lines
drivers/mfd/locomo.c new file +3
-0+while (1 ) { +regmap_read (lchip->regmap,LOCOMO_ICR , &req); + req &=0x0f00 ;What is this magic number? Please #define it.
Adding comments to this function instead.
Also acceptable.
Quoted 64 lines
Quoted 29 lines
drivers/mfd/locomo.c line 123
Quoted 4 lines
drivers/mfd/locomo.c new file +4
-0+if (!req) +break ; + + irq =ffs (req) -9 ;Minus another random number? Either define it or enter a comment.
drivers/mfd/locomo.c line 209
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+#ifdef CONFIG_PM_SLEEP +static int locomo_suspend (struct device *dev) +{ +struct locomo *lchip =dev_get_drvdata (dev); + +/* AUDIO */ WHY ARE YOU SHOUTING? Ironic eh? ;)
Quoted 13 lines
drivers/mfd/locomo.c new file +13
-0+regmap_write (lchip->regmap,LOCOMO_PAIF ,0x00 ); + +/* +* Original code disabled the clock depending on leds settings +* However we disable leds before suspend, thus it's safe +* to just assume this setting. +*/ +/* CLK32 off */ +regmap_write (lchip->regmap,LOCOMO_C32K ,0x00 ); + +/* 22MHz/24MHz clock off */ +regmap_write (lchip->regmap,LOCOMO_ACC ,0x00 ); +Quoted 8 lines
drivers/mfd/locomo.c line 228
Quoted 6 lines
drivers/mfd/locomo.c new file +6
-0+return 0 ; +} + +static int locomo_resume (struct device *dev) +{ +struct locomo *lchip =dev_get_drvdata (dev);Do audio and clk sort themselves out?
PAIF and ACC registers are used only by audio parts of the device. However there is no current Linux driver for those parts. The registers are cleared in case the firmware has set something in them, but in future it will be the task
of the audio driver to properly clear and restore them.Quoted 5 lines
Quoted 5 lines
drivers/mfd/locomo.c new file +5
-0+regmap_write (lchip->regmap,LOCOMO_C32K ,0x00 ); + +return 0 ; +} +[skipped]
Quoted 13 lines
drivers/mfd/locomo.c line 287
Quoted 8 lines
drivers/mfd/locomo.c new file +8
-0+ +if (pdata) { + locomo_gpio_pdata.gpio_base = pdata->gpio_base; + locomo_lcd_pdata.comadj = pdata->comadj; + }else { + locomo_gpio_pdata.gpio_base =-1 ; + locomo_lcd_pdata.comadj =128 ; + }struct
locomo_gpio_platform_datalocomo_gpio_pdata;
locomo_gpio_pdata=devm_kzalloc(<blah>);
Quoted 7 lines
Quoted 1 line
locomo_cells[GPIO].platform_data =
locomo_gpio_pdata;I do not quite agree with you at this place. The passed
platform_datawill be kmemdup()'ed inside platform core. So the whole struct will be duplicated twice inside kmallocate'd memory. Ideally I'd like to drop the wholeplatform_databusyness, but that requires switching to DTS first.
Sounds reasonable.
Quoted 14 lines
Quoted 6 lines
Quoted 5 lines
include/linux/mfd/locomo.h new file +0
-0Quoted 7 lines
include/linux/mfd/locomo.h line 32
Quoted 5 lines
include/linux/mfd/locomo.h new file +5
-0+/* MCS decoder for boot selecting */ +#define LOCOMO_MCSX0 0x10 +#define LOCOMO_MCSX1 0x14 +#define LOCOMO_MCSX2 0x18 +#define LOCOMO_MCSX3 0x1cThese are pretty cryptic. Any way of making them easier to identify.
Quoted 2 lines
No way. The names are based on old Sharp code. The drivers do not use them, but I'd like to still keep the registers for the reference purposes.
So they are not used at all? Then why do you want to keep them?
Quoted 30 lines
Quoted 6 lines
include/linux/mfd/locomo.h line 162
Quoted 3 lines
include/linux/mfd/locomo.h new file +3
-0+struct locomo_gpio_platform_data { +unsigned int gpio_base; +};A struct for a single int seems overkill.
Quoted 10 lines
include/linux/mfd/locomo.h line 171
Quoted 8 lines
include/linux/mfd/locomo.h new file +8
-0+struct locomo_lcd_platform_data { +u8 comadj; +}; + +struct locomo_platform_data { +unsigned int gpio_base; +u8 comadj; +};Why do you need to pass
gpio_basetwice?First: machine file -> core driver
Second: core driver -> gpio driverThe other way to do the same would be:
struct locomo_gpio_platform_data { unsigned int gpio_base; };struct locomo_lcd_platform_data { u8 comadj; };
Quoted 7 lines
struct locomo_platform_data { struct locomo_gpio_platform_data gpio_pdata; struct locomo_lcd_platform_data lcd_pdata; };And to assign pointers to the passed data in the
mfd_cellsduringlocomo_probe. Does that look better to you?
Bingo.
Signature · 8 lines
Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 2/17 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 | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)
drivers/leds/Kconfig +0 -1
@@ -79,7 +79,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 +61 -58
150 lines not on this page · raw message
Signature · 1 line
2.1.4
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
Quoted 13 lines · Dmitry Eremin-Solenikov
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)drivers/leds/Kconfig +0
-0
drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 4 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMO
Why do you remove this dependency?
Quoted 12 lines
drivers/leds/Kconfig +0
-0help This option enables support for the LEDs on Sharp Locomo. Zaurus models SL-5500 and SL-5600.drivers/leds/leds-locomo.c +0
-1@@ -9,89 +9,92 @@*/ #include <linux/kernel.h> -#include <linux/init.h>
drivers/leds/leds-locomo.c line 16
Quoted 10 lines
drivers/leds/leds-locomo.c +4
-5-#include <linux/module.h> -#include <linux/device.h> #include <linux/leds.h> - -#include <mach/hardware.h> -#include <asm/hardware/locomo.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/mfd/locomo.h>
Please keep alphabetical order.
Quoted 14 lines
drivers/leds/leds-locomo.c +8
-3+ +struct locomo_led { +struct led_classdev led; +struct regmap *regmap; +unsigned int reg; +};static void locomoled_brightness_set (struct led_classdev *led_cdev, -enum led_brightness value,int offset) +enum led_brightness value) { -struct locomo_dev *locomo_dev =LOCOMO_DEV (led_cdev->dev->parent); -unsigned long flags; + struct locomo_led *led = container_of(led_cdev, struct locomo_led, led);
drivers/leds/leds-locomo.c line 31
Quoted 10 lines
drivers/leds/leds-locomo.c +2
-6-local_irq_save (flags); -if (value) -locomo_writel (LOCOMO_LPT_TOFH , locomo_dev->mapbase + offset); -else -locomo_writel (LOCOMO_LPT_TOFL , locomo_dev->mapbase + offset); -local_irq_restore (flags); +regmap_write (led->regmap, led->reg, + value ?LOCOMO_LPT_TOFH :LOCOMO_LPT_TOFL ); }
Please use work queue for setting brightness. This is required for the driver to be compatible with led triggers. You can refer to the existing LED drivers on how to implement this.
Quoted 113 lines
drivers/leds/leds-locomo.c +47
-43-static void locomoled_brightness_set0 (struct led_classdev *led_cdev, -enum led_brightness value) +static int locomo_led_register ( +struct device *dev, +struct locomo_led *led, +const char *name, +const char *trigger, +struct regmap *regmap, +unsigned int reg) { -locomoled_brightness_set (led_cdev, value,LOCOMO_LPT0 ); + led->led.name = name; + led->led.flags =LED_CORE_SUSPENDRESUME ; + led->led.default_trigger = trigger; + led->led.brightness_set = locomoled_brightness_set; + led->regmap = regmap; + led->reg = reg; + +return devm_led_classdev_register (dev, &led->led); } -static void locomoled_brightness_set1 (struct led_classdev *led_cdev, -enum led_brightness value) -{ -locomoled_brightness_set (led_cdev, value,LOCOMO_LPT1 ); -} - -static struct led_classdev locomo_led0 = { - .name ="locomo:amber:charge" , - .default_trigger ="main-battery-charging" , - .brightness_set = locomoled_brightness_set0, -}; - -static struct led_classdev locomo_led1 = { - .name ="locomo:green:mail" , - .default_trigger ="nand-disk" , - .brightness_set = locomoled_brightness_set1, -}; - -static int locomoled_probe (struct locomo_dev *ldev) +static int locomoled_probe (struct platform_device *pdev) {int ret; - - ret =led_classdev_register (&ldev->dev, &locomo_led0); +struct locomo_led *leds; +struct regmap *regmap; + + leds =devm_kzalloc (&pdev->dev,2 *sizeof (*leds),GFP_KERNEL ); +if (!leds) +return -ENOMEM ; + + regmap =dev_get_regmap (pdev->dev.parent,NULL ); +if (!regmap) +return -ENODEV ; + + ret =locomo_led_register ( + &pdev->dev, + leds, +"locomo:amber:charge" , +"main-battery-charging" , + regmap, +LOCOMO_LPT0 );if (ret <0 )return ret; - ret =led_classdev_register (&ldev->dev, &locomo_led1); + ret =locomo_led_register ( + &pdev->dev, + leds +1 , +"locomo:green:mail" , +"mmc0" , + regmap, +LOCOMO_LPT1 );if (ret <0 ) -led_classdev_unregister (&locomo_led0); - -return ret; -} +return ret; -static int locomoled_remove (struct locomo_dev *dev) -{ -led_classdev_unregister (&locomo_led0); -led_classdev_unregister (&locomo_led1);return 0 ; } -static struct locomo_driver locomoled_driver = { - .drv = { - .name ="locomoled" +static struct platform_driver locomoled_driver = { + .driver = { + .name ="locomo-led" }, - .devid =LOCOMO_DEVID_LED , .probe = locomoled_probe, - .remove = locomoled_remove, }; -static int __init locomoled_init (void ) -{ -return locomo_driver_register (&locomoled_driver); -} -module_init (locomoled_init); +module_platform_driver (locomoled_driver);MODULE_AUTHOR ("John Lenz <[email protected]>" );MODULE_DESCRIPTION ("Locomo LED driver" );MODULE_LICENSE ("GPL" ); +MODULE_ALIAS ("platform:locomo-led" );
Signature · 2 lines
Best Regards, Jacek Anaszewski
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
2015-05-06 18:05 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 11 lines · Dmitry Eremin-Solenikov
Quoted 10 lines
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)
Quoted 12 lines
drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 9 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMOWhy do you remove this dependency?
Because SHARP_LOCOMO is a Kconfig symbol for the old driver. New driver uses MFD_LOCOMO Kconfig entry. Also the driver now uses generic platform device and regmap interfaces, so there is no direct dependency on main LoCoMo driver. And the policy (IIRC) was not to have such dependencies.
Quoted 11 lines
Quoted 11 lines
drivers/leds/Kconfig +0
-0help This option enables support for the LEDs on Sharp Locomo. Zaurus models SL-5500 and SL-5600.drivers/leds/leds-locomo.c +0
-0@@ -9,89 +9,92 @@*/
Quoted 15 lines
drivers/leds/leds-locomo.c line 16
Quoted 12 lines
drivers/leds/leds-locomo.c +4
-6#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/device.h> #include <linux/leds.h> - -#include <mach/hardware.h> -#include <asm/hardware/locomo.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/mfd/locomo.h> Please keep alphabetical order.
Ack
Quoted 17 lines
Quoted 17 lines
drivers/leds/leds-locomo.c +8
-3+ +struct locomo_led { +struct led_classdev led; +struct regmap *regmap; +unsigned int reg; +};static void locomoled_brightness_set (struct led_classdev *led_cdev, -enum led_brightness value,int offset) +enum led_brightness value) { -struct locomo_dev *locomo_dev =LOCOMO_DEV (led_cdev->dev->parent); -unsigned long flags; + struct locomo_led *led = container_of(led_cdev, struct locomo_led, led);
Quoted 16 lines
drivers/leds/leds-locomo.c line 31
Quoted 11 lines
drivers/leds/leds-locomo.c +2
-6-local_irq_save (flags); -if (value) -locomo_writel (LOCOMO_LPT_TOFH , locomo_dev->mapbase + offset); -else -locomo_writel (LOCOMO_LPT_TOFL , locomo_dev->mapbase + offset); -local_irq_restore (flags); +regmap_write (led->regmap, led->reg, + value ?LOCOMO_LPT_TOFH :LOCOMO_LPT_TOFL ); }Please use work queue for setting brightness. This is required for the driver to be compatible with led triggers. You can refer to the existing LED drivers on how to implement this.
Hmm. Why? The regmap here uses MMIO access, so it is atomic operation and doesn't need to be wrapped into work queue, does it?
[skipped]
Signature · 2 lines
With best wishes Dmitry
A message that is not in the archive (sent off-list or not yet received): CALT56yNJWapNw1XLrzfbUDUz1LF_BB9DfF94H6GhbnBUEP80_w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
Quoted 25 lines · Dmitry Eremin-Solenikov
2015-05-06 18:05 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 11 lines · Dmitry Eremin-Solenikov
Quoted 10 lines
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)Quoted 12 lines
drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 9 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMOWhy do you remove this dependency?
Quoted 4 lines
Because
SHARP_LOCOMOis aKconfigsymbol for the old driver. New driver usesMFD_LOCOMOKconfigentry. Also the driver now uses generic platform device and regmap interfaces, so there is no direct dependency on main LoCoMo driver. And the policy (IIRC) was not to have such dependencies.
Ack. Shouldn't you also need "select REGMAP_MMIO" ?
Quoted 63 lines
Quoted 11 lines
Quoted 11 lines
drivers/leds/Kconfig +0
-0help This option enables support for the LEDs on Sharp Locomo. Zaurus models SL-5500 and SL-5600.drivers/leds/leds-locomo.c +0
-0@@ -9,89 +9,92 @@*/ Quoted 15 lines
drivers/leds/leds-locomo.c line 16
Quoted 12 lines
drivers/leds/leds-locomo.c +4
-6#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/device.h> #include <linux/leds.h> - -#include <mach/hardware.h> -#include <asm/hardware/locomo.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/mfd/locomo.h> Please keep alphabetical order.
Ack
Quoted 17 lines
Quoted 17 lines
drivers/leds/leds-locomo.c +8
-3+ +struct locomo_led { +struct led_classdev led; +struct regmap *regmap; +unsigned int reg; +};static void locomoled_brightness_set (struct led_classdev *led_cdev, -enum led_brightness value,int offset) +enum led_brightness value) { -struct locomo_dev *locomo_dev =LOCOMO_DEV (led_cdev->dev->parent); -unsigned long flags; + struct locomo_led *led = container_of(led_cdev, struct locomo_led, led);Quoted 16 lines
drivers/leds/leds-locomo.c line 31
Quoted 11 lines
drivers/leds/leds-locomo.c +2
-6-local_irq_save (flags); -if (value) -locomo_writel (LOCOMO_LPT_TOFH , locomo_dev->mapbase + offset); -else -locomo_writel (LOCOMO_LPT_TOFL , locomo_dev->mapbase + offset); -local_irq_restore (flags); +regmap_write (led->regmap, led->reg, + value ?LOCOMO_LPT_TOFH :LOCOMO_LPT_TOFL ); }Please use work queue for setting brightness. This is required for the driver to be compatible with led triggers. You can refer to the existing LED drivers on how to implement this.
Quoted 2 lines
Hmm. Why? The regmap here uses MMIO access, so it is atomic operation and doesn't need to be wrapped into work queue, does it?
Triggers can call brightness_set op in the interrupt context, so it cannot sleep. I see "map->lock(map->lock_arg)" in regmap_write, thus I am inferring that it can sleep.
I am not sure if regmap implements its 'lock' op when using MMIO.
The best way to figure this out is turning "LED Timer Trigger" on in the config and execute:
echo "timer" > trigger
Signature · 2 lines
Best Regards, Jacek Anaszewski
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
2015-05-13 13:31 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 31 lines · Dmitry Eremin-Solenikov
Quoted 30 lines
2015-05-06 18:05 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 26 lines · Dmitry Eremin-Solenikov
Quoted 16 lines
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)drivers/leds/Kconfig +0
-0drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 4 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMOWhy do you remove this dependency?
Quoted 7 lines
Quoted 4 lines
Because
SHARP_LOCOMOis aKconfigsymbol for the old driver. New driver usesMFD_LOCOMOKconfigentry. Also the driver now uses generic platform device and regmap interfaces, so there is no direct dependency on main LoCoMo driver. And the policy (IIRC) was not to have such dependencies.Ack. Shouldn't you also need "select
REGMAP_MMIO" ?
No. Maybe I should add "select REGMAP" instead.
Quoted 38 lines
Quoted 25 lines
Quoted 25 lines
Quoted 22 lines
drivers/leds/Kconfig +1
-2static void locomoled_brightness_set(struct led_classdev *led_cdev, - enum led_brightness value, int offset) + enum led_brightness value) { - struct locomo_dev *locomo_dev =
LOCOMO_DEV(led_cdev->dev->parent);drivers/leds/Kconfig +1
-1- unsigned long flags; + struct locomo_led *led = container_of(led_cdev, struct
locomo_led,
led);drivers/leds/Kconfig +0
-3- local_irq_save(flags); - if (value) - locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase +offset);
drivers/leds/Kconfig +0
-2- else - locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase +offset);
drivers/leds/Kconfig +2
-1- local_irq_restore(flags); + regmap_write(led->regmap, led->reg, + value ? LOCOMO_LPT_TOFH : LOCOMO_LPT_TOFL); }Quoted 7 lines
Quoted 3 lines
Please use work queue for setting brightness. This is required for the driver to be compatible with led triggers. You can refer to the existing LED drivers on how to implement this.
Hmm. Why? The regmap here uses MMIO access, so it is atomic operation and doesn't need to be wrapped into work queue, does it?
Triggers can call
brightness_setop in the interrupt context, so it cannot sleep. I see "map->lock(map->lock_arg)" inregmap_write, thus I am inferring that it can sleep.
Quoted 6 lines
I am not sure if regmap implements its 'lock' op when using MMIO.
The best way to figure this out is turning "LED Timer Trigger" on in the config and execute:
echo "timer" > trigger
It works without any "might sleep/sleeping in atomic context" warnings.
Technically I'd agree with you. If I'm using regmaps, ideally I should not depend on the exact backend and put working with it to the work queue. However as this is a driver for quite old IP block, it is not used with regmap backends other than MMIO, I'd deduce, it's ok to do things in a more relaxed way and to call regmap_write even from atomic contexts.
Signature · 2 lines
With best wishes Dmitry
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
Quoted 38 lines · Dmitry Eremin-Solenikov
2015-05-13 13:31 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 37 lines · Dmitry Eremin-Solenikov
Quoted 34 lines
2015-05-06 18:05 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 13 lines · Dmitry Eremin-Solenikov
Quoted 11 lines
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)Quoted 13 lines
drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 9 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMOWhy do you remove this dependency?
Because
SHARP_LOCOMOis aKconfigsymbol for the old driver. New driver usesMFD_LOCOMOKconfigentry. Also the driver now uses generic platform device and regmap interfaces, so there is no direct dependency on main LoCoMo driver. And the policy (IIRC) was not to have such dependencies.
Quoted 3 lines
Quoted 1 line
Ack. Shouldn't you also need "select
REGMAP_MMIO" ?No. Maybe I should add "select REGMAP" instead.
REGMAP is enabled by default if REGMAP_MMIO is enabled. Having REGMAP_MMIO selected would also allow to notice at first glance which regmap backend is used. This would in turn provide a straightforward explanation on why brightness_set op is not delegated to work queue.
Quoted 45 lines
Quoted 38 lines
Quoted 25 lines
Quoted 25 lines
Quoted 22 lines
drivers/leds/Kconfig +1
-2static void locomoled_brightness_set(struct led_classdev *led_cdev, - enum led_brightness value, int offset) + enum led_brightness value) { - struct locomo_dev *locomo_dev =
LOCOMO_DEV(led_cdev->dev->parent);drivers/leds/Kconfig +1
-1- unsigned long flags; + struct locomo_led *led = container_of(led_cdev, struct
locomo_led,
led);drivers/leds/Kconfig +0
-3- local_irq_save(flags); - if (value) - locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase +offset);
drivers/leds/Kconfig +0
-2- else - locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase +offset);
drivers/leds/Kconfig +2
-1- local_irq_restore(flags); + regmap_write(led->regmap, led->reg, + value ? LOCOMO_LPT_TOFH : LOCOMO_LPT_TOFL); }Quoted 7 lines
Quoted 3 lines
Please use work queue for setting brightness. This is required for the driver to be compatible with led triggers. You can refer to the existing LED drivers on how to implement this.
Hmm. Why? The regmap here uses MMIO access, so it is atomic operation and doesn't need to be wrapped into work queue, does it?
Triggers can call
brightness_setop in the interrupt context, so it cannot sleep. I see "map->lock(map->lock_arg)" inregmap_write, thus I am inferring that it can sleep.Quoted 6 lines
I am not sure if regmap implements its 'lock' op when using MMIO.
The best way to figure this out is turning "LED Timer Trigger" on in the config and execute:
echo "timer" > trigger
Quoted 8 lines
It works without any "might sleep/sleeping in atomic context" warnings.
Technically I'd agree with you. If I'm using regmaps, ideally I should not depend on the exact backend and put working with it to the work queue. However as this is a driver for quite old IP block, it is not used with regmap backends other than MMIO, I'd deduce, it's ok to do things in a more relaxed way and to call
regmap_writeeven from atomic contexts.
Ack.
Signature · 2 lines
Best Regards, Jacek Anaszewski
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
Quoted 39 lines · Jacek Anaszewski
Quoted 38 lines · Dmitry Eremin-Solenikov
2015-05-13 13:31 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 37 lines · Dmitry Eremin-Solenikov
Quoted 34 lines
2015-05-06 18:05 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 13 lines · Dmitry Eremin-Solenikov
Quoted 11 lines
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)Quoted 13 lines
drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 9 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMOWhy do you remove this dependency?
Because
SHARP_LOCOMOis aKconfigsymbol for the old driver. New driver usesMFD_LOCOMOKconfigentry. Also the driver now uses generic platform device and regmap interfaces, so there is no direct dependency on main LoCoMo driver. And the policy (IIRC) was not to have such dependencies.
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Ack. Shouldn't you also need "select
REGMAP_MMIO" ?No. Maybe I should add "select REGMAP" instead.
REGMAP is enabled by default if
REGMAP_MMIOis enabled. Having
That is unfortunately not how select works: it does not automatically select parents for the selected symbol.
Thanks.
Signature · 1 line
Dmitry
Re: [PATCH v2 02/17] leds: port locomo leds driver to new locomo core
Quoted 40 lines · Dmitry Torokhov
Quoted 39 lines · Jacek Anaszewski
Quoted 38 lines · Dmitry Eremin-Solenikov
2015-05-13 13:31 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 37 lines · Dmitry Eremin-Solenikov
Quoted 34 lines
2015-05-06 18:05 GMT+03:00 Jacek Anaszewski <[email protected]>:
Quoted 13 lines · Dmitry Eremin-Solenikov
Quoted 11 lines
Adapt locomo leds driver to new locomo core setup.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/leds/Kconfig | 1 - drivers/leds/leds-locomo.c | 119 +++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 59 deletions(-)Quoted 13 lines
drivers/leds/Kconfig config LEDS_LM3642 · line 82
Quoted 9 lines
drivers/leds/Kconfig +0
-1@@ -79,7 +79,6 @@ config LEDS_LM3642 config LEDS_LOCOMO tristate "LED Support for Locomo device" depends on LEDS_CLASS - depends on SHARP_LOCOMOWhy do you remove this dependency?
Because
SHARP_LOCOMOis aKconfigsymbol for the old driver. New driver usesMFD_LOCOMOKconfigentry. Also the driver now uses generic platform device and regmap interfaces, so there is no direct dependency on main LoCoMo driver. And the policy (IIRC) was not to have such dependencies.
Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Ack. Shouldn't you also need "select
REGMAP_MMIO" ?No. Maybe I should add "select REGMAP" instead.
REGMAP is enabled by default if
REGMAP_MMIOis enabled. HavingThat is unfortunately not how select works: it does not automatically select parents for the selected symbol.
Please look at config REGMAP declaration in the file drivers/base/regmap/Kconfig:
config REGMAP
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI ||
REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ)
select LZO_COMPRESS
select LZO_DECOMPRESS
select IRQ_DOMAIN if REGMAP_IRQ
bool
Signature · 2 lines
Best Regards, Jacek Anaszewski
A message that is not in the archive (sent off-list or not yet received): 1430178954-11138-1-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
PATCH v2 3/17 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 | 271 +++++++++++++++++++------------------ 2 files changed, 143 insertions(+), 129 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 +143 -128
436 lines not on this page · raw message
Signature · 6 lines
2.1.4 -- 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 v2 03/17] input: convert LoCoMo keyboard driver to use new locomo core
Hi Dmitry,
Quoted 104 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 | 271 +++++++++++++++++++------------------ 2 files changed, 143 insertions(+), 129 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 +17
-23@@ -23,37 +23,37 @@* */ -#include <linux/slab.h> -#include <linux/module.h> +#include <linux/delay.h> #include <linux/init.h> #include <linux/input.h> -#include <linux/delay.h> -#include <linux/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/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/mfd/locomo.h> -#define LOCOMOKBD_NUMKEYS 128 +/* There is one minor difference between mappings on poodle and collie */ +#include <asm/mach-types.h> #define KEY_ACTIVITY KEY_F16#define KEY_CONTACT KEY_F18#define KEY_CENTER KEY_F15 +#define KB_ROWS 16 +#define KB_COLS 8 +#define LOCOMOKBD_NUMKEYS (KB_ROWS * KB_COLS) +#define SCANCODE (c, r) (((c)<<4) + (r) + 1) +static const unsigned char locomokbd_keycode[LOCOMOKBD_NUMKEYS ] = {0 ,KEY_ESC ,KEY_ACTIVITY ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 0 - 9 */ -0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_MENU ,KEY_HOME ,KEY_CONTACT ,/* 10 - 19 */ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_MENU ,0 ,KEY_CONTACT ,/* 10 - 19 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 20 - 29 */ 0 ,0 ,0 ,KEY_CENTER ,0 ,KEY_MAIL ,0 ,0 ,0 ,0 ,/* 30 - 39 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_RIGHT ,/* 40 - 49 */ KEY_UP ,KEY_LEFT ,0 ,0 ,KEY_P ,0 ,KEY_O ,KEY_I ,KEY_Y ,KEY_T ,/* 50 - 59 */ -KEY_E ,KEY_W ,0 ,0 ,0 ,0 ,KEY_DOWN ,KEY_ENTER ,0 ,0 ,/* 60 - 69 */ +KEY_E ,KEY_W ,0 ,0 ,0 ,0 ,KEY_DOWN ,KEY_KPENTER ,0 ,0 ,/* 60 - 69 */ KEY_BACKSPACE ,0 ,KEY_L ,KEY_U ,KEY_H ,KEY_R ,KEY_D ,KEY_Q ,0 ,0 ,/* 70 - 79 */ 0 ,0 ,0 ,0 ,0 ,0 ,KEY_ENTER ,KEY_RIGHTSHIFT ,KEY_K ,KEY_J ,/* 80 - 89 */ KEY_G ,KEY_F ,KEY_X ,KEY_S ,0 ,0 ,0 ,0 ,0 ,0 ,/* 90 - 99 */ @@ -62,20 +62,14 @@ locomokbd_keycode[LOCOMOKBD_NUMKEYS] = {KEY_M ,KEY_SPACE ,KEY_V ,KEY_APOSTROPHE ,KEY_SLASH ,0 ,0 ,0 /* 120 - 128 */ }; -#define KB_ROWS 16 -#define KB_COLS 8 -#define KB_ROWMASK (r) (1 << (r)) -#define SCANCODE (c,r) ( ((c)<<4) + (r) + 1 ) -#define KB_DELAY 8 -#define SCAN_INTERVAL (HZ/10)struct locomokbd {unsigned char keycode[LOCOMOKBD_NUMKEYS ];struct input_dev *input; -char phys[32 ]; -unsigned long base; +struct regmap *regmap; +int irq;spinlock_t lock;struct timer_list timer;@@ -84,37 +78,33 @@ struct locomokbd { };
drivers/input/keyboard/locomokbd.c struct locomokbd { · line 86
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +3
-3/* helper functions for reading the keyboard matrix */ -static inline void locomokbd_charge_all (unsigned long membase) +static inline void locomokbd_charge_all (struct locomokbd *locomokbd) { -locomo_writel (0x00FF , membase +LOCOMO_KSC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0x00ff ); } -static inline void locomokbd_activate_all (unsigned long membase) +static inline void locomokbd_activate_all (struct locomokbd *locomokbd)
Drop "inline"s from the .c file please.
Quoted 96 lines
drivers/input/keyboard/locomokbd.c +19
-32{ -unsigned long r; - -locomo_writel (0 , membase +LOCOMO_KSC ); - r =locomo_readl (membase +LOCOMO_KIC ); - r &=0xFEFF ; -locomo_writel (r, membase +LOCOMO_KIC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0 ); +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x100 ,0 ); } -static inline void locomokbd_activate_col (unsigned long membase,int col) +static inline void locomokbd_activate_col (struct locomokbd *locomokbd,int col) {unsigned short nset;unsigned short nbset; - nset =0xFF & ~(1 << col); + nset =0xFF & ~BIT (col); nbset = (nset <<8 ) + nset; -locomo_writel (nbset, membase +LOCOMO_KSC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC , nbset); } -static inline void locomokbd_reset_col (unsigned long membase,int col) +static inline void locomokbd_reset_col (struct locomokbd *locomokbd,int col) {unsigned short nbset; - nbset = ((0xFF & ~(1 << col)) <<8 ) +0xFF ; -locomo_writel (nbset, membase +LOCOMO_KSC ); + nbset = ((0xFF & ~BIT (col)) <<8 ) +0xFF ; +regmap_write (locomokbd->regmap,LOCOMO_KSC , nbset); }/* @@ -129,24 +119,25 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd)unsigned int row, col, rowd;unsigned long flags;unsigned int num_pressed; -unsigned long membase = locomokbd->base; +bool esc_pressed = false;spin_lock_irqsave (&locomokbd->lock, flags); -locomokbd_charge_all (membase); +locomokbd_charge_all (locomokbd); num_pressed =0 ;for (col =0 ; col <KB_COLS ; col++) { - -locomokbd_activate_col (membase, col); +udelay (KB_DELAY ); +locomokbd_activate_col (locomokbd, col);udelay (KB_DELAY ); - rowd = ~locomo_readl (membase +LOCOMO_KIB ); +regmap_read (locomokbd->regmap,LOCOMO_KIB , &rowd); + rowd = ~rowd;for (row =0 ; row <KB_ROWS ; row++) {unsigned int scancode, pressed, key; scancode =SCANCODE (col, row); - pressed = rowd &KB_ROWMASK (row); + pressed = rowd &BIT (row); key = locomokbd->keycode[scancode];input_report_key (locomokbd->input, key, pressed);@@ -158,29 +149,30 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd)/* The "Cancel/ESC" key is labeled "On/Off" on * Collie and Poodle and should suspend the device * if it was pressed for more than a second. */ -if (unlikely (key ==KEY_ESC )) { -if (!time_after (jiffies, - locomokbd->suspend_jiffies +HZ )) -continue ; -if (locomokbd->count_cancel++ - != (HZ /SCAN_INTERVAL +1 )) -continue ; -input_event (locomokbd->input,EV_PWR , -KEY_SUSPEND ,1 ); - locomokbd->suspend_jiffies = jiffies; - }else - locomokbd->count_cancel =0 ; +if (unlikely (key ==KEY_ESC )) + esc_pressed = true; } -locomokbd_reset_col (membase, col); +locomokbd_reset_col (locomokbd, col); } -locomokbd_activate_all (membase); +locomokbd_activate_all (locomokbd);input_sync (locomokbd->input);/* if any keys are pressed, enable the timer */
drivers/input/keyboard/locomokbd.c static void locomokbd_scankeyboard(struct locomokbd *locomokbd) · line 170
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +7
-1if (num_pressed) -mod_timer (&locomokbd->timer, jiffies +SCAN_INTERVAL ); +mod_timer (&locomokbd->timer, jiffies +msecs_to_jiffies (100 ));else +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x10 ,0x10 ); + + +if (esc_pressed &&time_after (jiffies, + locomokbd->suspend_jiffies +msecs_to_jiffies (1000 ))) { +if (locomokbd->count_cancel++ > (20 )) {
Why parentheses around 20?
drivers/input/keyboard/locomokbd.c static void locomokbd_scankeyboard(struct locomokbd *locomokbd) · line 176
Quoted 6 lines
drivers/input/keyboard/locomokbd.c +5
-0+input_event (locomokbd->input,EV_PWR , +KEY_SUSPEND ,1 ); + locomokbd->suspend_jiffies = jiffies; + } + }else locomokbd->count_cancel =0 ;
If one branch has curly braces the other should have them too.
Quoted 92 lines
drivers/input/keyboard/locomokbd.c +22
-32spin_unlock_irqrestore (&locomokbd->lock, flags);@@ -192,18 +184,18 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd)static irqreturn_t locomokbd_interrupt (int irq,void *dev_id) {struct locomokbd *locomokbd = dev_id; -u16 r; +unsigned int r; - r =locomo_readl (locomokbd->base +LOCOMO_KIC ); + +regmap_read (locomokbd->regmap,LOCOMO_KIC , &r);if ((r &0x0001 ) ==0 )return IRQ_HANDLED ; -locomo_writel (r & ~0x0100 , locomokbd->base +LOCOMO_KIC );/* Ack */ +/* Mask and Ack */ +regmap_write (locomokbd->regmap,LOCOMO_KIC , r & ~0x110 ); -/** wait chattering delay **/ -udelay (100 ); +mod_timer (&locomokbd->timer, jiffies +msecs_to_jiffies (1 )); -locomokbd_scankeyboard (locomokbd);return IRQ_HANDLED ; }@@ -220,47 +212,37 @@ static void locomokbd_timer_callback(unsigned long data)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 ); -return 0 ; + +return regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x10 ,0x10 ); }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 ); + +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x10 ,0x0 ); } -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; - locomokbd =kzalloc (sizeof (struct locomokbd ),GFP_KERNEL ); - input_dev =input_allocate_device (); -if (!locomokbd || !input_dev) { - err = -ENOMEM ; - goto err_free_mem; - } + locomokbd =devm_kzalloc (&dev->dev,sizeof (struct locomokbd ), +GFP_KERNEL ); +if (!locomokbd) +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; - } + locomokbd->regmap =dev_get_regmap (dev->dev.parent,NULL ); +if (!locomokbd->regmap) +return -EINVAL ; -locomo_set_drvdata (dev, locomokbd); + locomokbd->irq =platform_get_irq (dev,0 ); +if (locomokbd->irq <0 ) +return -ENXIO ; - locomokbd->base = (unsigned long ) dev->mapbase; +platform_set_drvdata (dev, locomokbd);spin_lock_init (&locomokbd->lock);
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 255
Quoted 6 lines
drivers/input/keyboard/locomokbd.c +1
-2@@ -270,11 +252,13 @@ static int locomokbd_probe(struct locomo_dev *dev) locomokbd->suspend_jiffies = jiffies; - locomokbd->input = input_dev; -strcpy (locomokbd->phys,"locomokbd/input0" ); + input_dev =input_allocate_device ();
devm_input_allocate_device()?
Quoted 13 lines
drivers/input/keyboard/locomokbd.c +4
-1+if (!input_dev) +return -ENOMEM ; + locomokbd->input = input_dev; input_dev->name ="LoCoMo keyboard" ; - input_dev->phys = locomokbd->phys; + input_dev->phys ="locomokbd/input0" ; input_dev->id.bustype =BUS_HOST ; input_dev->id.vendor =0x0001 ; input_dev->id.product =0x0001 ;@@ -291,16 +275,30 @@ static int locomokbd_probe(struct locomo_dev *dev)input_set_drvdata (input_dev, locomokbd);
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 285
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +8
-1-memcpy (locomokbd->keycode, locomokbd_keycode,sizeof (locomokbd->keycode)); +memcpy (locomokbd->keycode, + locomokbd_keycode, +sizeof (locomokbd->keycode)); + +if (machine_is_collie ()) + locomokbd->keycode[18 ] =KEY_HOME ; +else + locomokbd->keycode[3 ] =KEY_HOME ;
This seems like a new addition. Ideally keymap twiddling shoudl be done from userspace.
Quoted 6 lines
drivers/input/keyboard/locomokbd.c +3
-2+for (i =0 ; i <LOCOMOKBD_NUMKEYS ; i++) -set_bit (locomokbd->keycode[i], input_dev->keybit); -clear_bit (0 , input_dev->keybit); +input_set_capability (input_dev,EV_KEY , locomokbd->keycode[i]); +input_set_capability (input_dev,EV_PWR ,KEY_SUSPEND );
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 298
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +7
-1+__set_bit (EV_REP , input_dev->evbit); + +regmap_write (locomokbd->regmap,LOCOMO_KCMD ,1 ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0x0 ); +regmap_write (locomokbd->regmap,LOCOMO_KIC ,0x0 );/* attempt to get the interrupt */ - err =request_irq (dev->irq[0 ], locomokbd_interrupt,0 ,"locomokbd" , locomokbd); + err =request_irq (locomokbd->irq, locomokbd_interrupt,0 , +"locomokbd" , locomokbd);
devm_request_irq()?
Quoted 25 lines
drivers/input/keyboard/locomokbd.c +5
-9if (err) { -printk (KERN_ERR "locomokbd: Can't get irq for keyboard\n" ); - goto err_release_region; +dev_err (&dev->dev,"locomokbd: Can't get irq for keyboard\n" ); + goto err_free_mem; } err =input_register_device (locomokbd->input);@@ -309,54 +307,71 @@ static int locomokbd_probe(struct locomo_dev *dev)return 0 ; - err_free_irq: -free_irq (dev->irq[0 ], locomokbd); - err_release_region: -release_mem_region ((unsigned long ) dev->mapbase, dev->length); -locomo_set_drvdata (dev,NULL ); - err_free_mem: +err_free_irq: +free_irq (locomokbd->irq, locomokbd); +err_free_mem:input_free_device (input_dev); -kfree (locomokbd);return err;
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 322
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +3
-3} -static int locomokbd_remove (struct locomo_dev *dev) +static int locomokbd_remove (struct platform_device *dev) { -struct locomokbd *locomokbd =locomo_get_drvdata (dev); +struct locomokbd *locomokbd =platform_get_drvdata (dev); -free_irq (dev->irq[0 ], locomokbd); +free_irq (locomokbd->irq, locomokbd);
Is not needed with devm.
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 324
Quoted 2 lines
drivers/input/keyboard/locomokbd.c +0
-0del_timer_sync (&locomokbd->timer);
Should likely to go into close().
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 326
Quoted 2 lines
drivers/input/keyboard/locomokbd.c +0
-0input_unregister_device (locomokbd->input);
Is not needed with devm.
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 332
Quoted 8 lines
drivers/input/keyboard/locomokbd.c +5
-2-locomo_set_drvdata (dev,NULL ); -release_mem_region ((unsigned long ) dev->mapbase, dev->length); +return 0 ; +} + +#ifdef CONFIG_PM_SLEEP +static int locomokbd_suspend (struct device *dev)
Mark as __maybe_unused instead of giarding with CONFIG_PM_SLEEP.
Quoted 5 lines
drivers/input/keyboard/locomokbd.c +4
-0+{ +struct locomokbd *locomokbd =dev_get_drvdata (dev); + +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x10 ,0x0 );
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 343
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +2
-4-kfree (locomokbd); +del_timer_sync (&locomokbd->timer);return 0 ; } -static struct locomo_driver keyboard_driver = { - .drv = { - .name ="locomokbd" +static int locomokbd_resume (struct device *dev)
__maybe_unused as well.
Quoted 8 lines
drivers/input/keyboard/locomokbd.c +8
-0+{ +struct locomokbd *locomokbd =dev_get_drvdata (dev); + +regmap_write (locomokbd->regmap,LOCOMO_KCMD ,1 ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0 ); +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x100 ,0 ); +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x10 ,0x10 ); +
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 361
Quoted 10 lines
drivers/input/keyboard/locomokbd.c +10
-0+locomokbd_scankeyboard (locomokbd); + +return 0 ; +} + +static SIMPLE_DEV_PM_OPS(locomo_kbd_pm, locomokbd_suspend, locomokbd_resume); +#define LOCOMO_KBD_PM (&locomo_kbd_pm) +#else +#define LOCOMO_KBD_PM NULL +#endif
Just do
static SIMPLE_DEV_PM_OPS(locomo_kbd_pm,
locomokbd_suspend, locomokbd_resume);
outside of #ifdef, it will produce the right thing (an empty structure).
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 366
Quoted 5 lines
drivers/input/keyboard/locomokbd.c +5
-0+ +static struct platform_driver locomokbd_driver = { + .driver = { + .name ="locomo-kbd" , + .pm =LOCOMO_KBD_PM ,
.pm = &locomo_kbd_pm;
Quoted 26 lines
drivers/input/keyboard/locomokbd.c +5
-12}, - .devid = LOCOMO_DEVID_KEYBOARD, .probe = locomokbd_probe, .remove = locomokbd_remove, }; -static int __init locomokbd_init (void ) -{ -return locomo_driver_register (&keyboard_driver); -} - -static void __exit locomokbd_exit(void) -{ -locomo_driver_unregister (&keyboard_driver); -} +module_platform_driver (locomokbd_driver); -module_init (locomokbd_init); -module_exit (locomokbd_exit); +MODULE_AUTHOR ("John Lenz <[email protected]>" ); +MODULE_DESCRIPTION ("LoCoMo keyboard driver" ); +MODULE_LICENSE ("GPL" ); +MODULE_ALIAS ("platform:locomo-kbd" );Signature · 1 line
2.1.4
Thanks.
Signature · 1 line
Dmitry
Re: [PATCH v2 03/17] input: convert LoCoMo keyboard driver to use new locomo core
Hello,
2015-05-12 23:21 GMT+03:00 Dmitry Torokhov <[email protected]>:
Quoted 8 lines
Hi Dmitry,
Quoted 5 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]>---
Thanks for the review.
Quoted 8 lines
Quoted 8 lines
/* helper functions for reading the keyboard matrix */
drivers/input/keyboard/locomokbd.c +2
-2-static inline void locomokbd_charge_all (unsigned long membase) +static inline void locomokbd_charge_all (struct locomokbd *locomokbd) { -locomo_writel (0x00FF , membase +LOCOMO_KSC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0x00ff ); }
Quoted 4 lines
drivers/input/keyboard/locomokbd.c struct locomokbd { · line 86
Quoted 2 lines
drivers/input/keyboard/locomokbd.c +1
-1-static inline void locomokbd_activate_all (unsigned long membase) +static inline void locomokbd_activate_all (struct locomokbd *locomokbd)Drop "inline"s from the .c file please.
Why?
Quoted 12 lines
Quoted 12 lines
{
drivers/input/keyboard/locomokbd.c +2
-6-unsigned long r; - -locomo_writel (0 , membase +LOCOMO_KSC ); - r =locomo_readl (membase +LOCOMO_KIC ); - r &=0xFEFF ; -locomo_writel (r, membase +LOCOMO_KIC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0 ); +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x100 ,0 ); }
[skipped]
Quoted 4 lines
Quoted 4 lines
drivers/input/keyboard/locomokbd.c +0
-0@@ -291,16 +275,30 @@ static int locomokbd_probe(struct locomo_dev *dev)input_set_drvdata (input_dev, locomokbd);
Quoted 12 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 285
Quoted 9 lines
drivers/input/keyboard/locomokbd.c +8
-1-memcpy (locomokbd->keycode, locomokbd_keycode,sizeof (locomokbd->keycode)); +memcpy (locomokbd->keycode, + locomokbd_keycode, +sizeof (locomokbd->keycode)); + +if (machine_is_collie ()) + locomokbd->keycode[18 ] =KEY_HOME ; +else + locomokbd->keycode[3 ] =KEY_HOME ;This seems like a new addition. Ideally keymap twiddling shoudl be done from userspace.
This fixes a hardware issue. Home key is wired differently on two devices using this driver.
I'd prefer to have such setting in board file or in DTS in future, however that looks like an
overkill. What would be your suggestion?
Quoted 7 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 298
Quoted 4 lines
drivers/input/keyboard/locomokbd.c +2
-1/* attempt to get the interrupt */ - err =request_irq (dev->irq[0 ], locomokbd_interrupt,0 ,"locomokbd" , locomokbd); + err =request_irq (locomokbd->irq, locomokbd_interrupt,0 , +"locomokbd" , locomokbd);
devm_request_irq()?
[skipped]
Quoted 10 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 322
Quoted 8 lines
drivers/input/keyboard/locomokbd.c +3
-3-static int locomokbd_remove (struct locomo_dev *dev) +static int locomokbd_remove (struct platform_device *dev) { -struct locomokbd *locomokbd =locomo_get_drvdata (dev); +struct locomokbd *locomokbd =platform_get_drvdata (dev); -free_irq (dev->irq[0 ], locomokbd); +free_irq (locomokbd->irq, locomokbd);Is not needed with devm.
Not quite. There will be a possibility for the IRQ to happen after deleting a timer in locomokbd_remove() and before freeing the IRQ through the devres core. Oops.
Quoted 5 lines
Quoted 3 lines
del_timer_sync(&locomokbd->timer);Should likely to go into
close().
Hmm. I will rethink this part, thank you.
Quoted 5 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 332
Quoted 3 lines
drivers/input/keyboard/locomokbd.c +3
-0+ +#ifdef CONFIG_PM_SLEEP +static int locomokbd_suspend (struct device *dev)Mark as
__maybe_unusedinstead of giarding withCONFIG_PM_SLEEP.
Fine, however I thought that #ifdef's here are a typical pattern.
[skipped the rest]
Signature · 2 lines
With best wishes Dmitry
Dmitry Torokhov
maintainerRe: [PATCH v2 03/17] input: convert LoCoMo keyboard driver to use new locomo core
Quoted 22 lines · Dmitry Eremin-Solenikov
Hello,
2015-05-12 23:21 GMT+03:00 Dmitry Torokhov <[email protected]>:
Quoted 8 lines
Hi Dmitry,
Quoted 5 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]>---
Thanks for the review.
Quoted 8 lines
Quoted 8 lines
/* helper functions for reading the keyboard matrix */
drivers/input/keyboard/locomokbd.c +2
-2-static inline void locomokbd_charge_all (unsigned long membase) +static inline void locomokbd_charge_all (struct locomokbd *locomokbd) { -locomo_writel (0x00FF , membase +LOCOMO_KSC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0x00ff ); }
Quoted 6 lines
Quoted 4 lines
drivers/input/keyboard/locomokbd.c struct locomokbd { · line 86
Quoted 2 lines
drivers/input/keyboard/locomokbd.c +1
-1-static inline void locomokbd_activate_all (unsigned long membase) +static inline void locomokbd_activate_all (struct locomokbd *locomokbd)Drop "inline"s from the .c file please.
Why?
Because compiler usually knows better whether a function should be inlined or not as it keeps track of available registers, so leave the decision to it.
Quoted 33 lines
Quoted 13 lines
Quoted 13 lines
{
drivers/input/keyboard/locomokbd.c +2
-6-unsigned long r; - -locomo_writel (0 , membase +LOCOMO_KSC ); - r =locomo_readl (membase +LOCOMO_KIC ); - r &=0xFEFF ; -locomo_writel (r, membase +LOCOMO_KIC ); +regmap_write (locomokbd->regmap,LOCOMO_KSC ,0 ); +regmap_update_bits (locomokbd->regmap,LOCOMO_KIC ,0x100 ,0 ); }[skipped]
Quoted 4 lines
Quoted 4 lines
drivers/input/keyboard/locomokbd.c +0
-0@@ -291,16 +275,30 @@ static int locomokbd_probe(struct locomo_dev *dev)input_set_drvdata (input_dev, locomokbd);Quoted 12 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 285
Quoted 9 lines
drivers/input/keyboard/locomokbd.c +8
-1-memcpy (locomokbd->keycode, locomokbd_keycode,sizeof (locomokbd->keycode)); +memcpy (locomokbd->keycode, + locomokbd_keycode, +sizeof (locomokbd->keycode)); + +if (machine_is_collie ()) + locomokbd->keycode[18 ] =KEY_HOME ; +else + locomokbd->keycode[3 ] =KEY_HOME ;This seems like a new addition. Ideally keymap twiddling shoudl be done from userspace.
Quoted 5 lines
This fixes a hardware issue. Home key is wired differently on two devices using this driver.
I'd prefer to have such setting in board file or in DTS in future, however that looks like an
overkill. What would be your suggestion?
I am OK with doing this in driver, just as a separate patch please.
Quoted 16 lines
Quoted 8 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 298
Quoted 5 lines
drivers/input/keyboard/locomokbd.c +2
-1/* attempt to get the interrupt */ - err =request_irq (dev->irq[0 ], locomokbd_interrupt,0 ,"locomokbd" , locomokbd); + err =request_irq (locomokbd->irq, locomokbd_interrupt,0 , +"locomokbd" , locomokbd);
devm_request_irq()?[skipped]
Quoted 6 lines
Quoted 6 lines
drivers/input/keyboard/locomokbd.c +2
-2-static int locomokbd_remove (struct locomo_dev *dev) +static int locomokbd_remove (struct platform_device *dev) { -struct locomokbd *locomokbd =locomo_get_drvdata (dev); +struct locomokbd *locomokbd =platform_get_drvdata (dev);
Quoted 8 lines
Quoted 4 lines
Review
Quoted 2 lines
(quoted diff) +1
-1- free_irq(dev->irq[0], locomokbd); + free_irq(locomokbd->irq, locomokbd);Is not needed with devm.
Not quite. There will be a possibility for the IRQ to happen after deleting a timer in
locomokbd_remove()and before freeing the IRQ through the devres core. Oops.
Right, but if you make sure that device does not generate interrupts in probe() until open() is called and do the same in close(), then it should be OK.
Quoted 9 lines
Quoted 6 lines
Quoted 4 lines
del_timer_sync(&locomokbd->timer);Should likely to go into
close().Hmm. I will rethink this part, thank you.
Quoted 7 lines
Quoted 5 lines
drivers/input/keyboard/locomokbd.c static int locomokbd_probe(struct locomo_dev *dev) · line 332
Quoted 3 lines
drivers/input/keyboard/locomokbd.c +3
-0+ +#ifdef CONFIG_PM_SLEEP +static int locomokbd_suspend (struct device *dev)Mark as
__maybe_unusedinstead of giarding withCONFIG_PM_SLEEP.Fine, however I thought that #ifdef's here are a typical pattern.
It is up to subsystems, __maybe_unused provides better compile coverage.
Thanks.
Signature · 1 line
Dmitry
PATCH v2 4/17 input: locomokbd: provide an Alt-SysRQ combination
In reply to a message not in the archiveIt is usefull sometimes to have an Alt-SysRQ combo on the keyboard to be able to trigger sysrq functions directly. Add an option providing sysrq mapping for Contact-Home keys.
--- drivers/input/keyboard/Kconfig | 7 +++++++ drivers/input/keyboard/locomokbd.c | 14 +++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-)
drivers/input/keyboard/Kconfig +7 -0
@@ -343,6 +343,13 @@ config KEYBOARD_LOCOMO To compile this driver as a module, choose M here: the module will be called locomokbd. +config KEYBOARD_LOCOMO_SYSRQ + bool "Provide SysRQ key on LoCoMo keyboard" + depends on KEYBOARD_LOCOMO + help + Say Y here to be able to use Contact-Home as Alt-Sysrq combo. + Say N if you want to use them as usual keys. + config KEYBOARD_LPC32XX tristate "LPC32XX matrix key scanner support" depends on ARCH_LPC32XX && OF
drivers/input/keyboard/locomokbd.c +11 -3
@@ -40,6 +40,14 @@#define KEY_CONTACT KEY_F18#define KEY_CENTER KEY_F15 +#ifdef CONFIG_KEYBOARD_LOCOMOKBD_SYSRQ +#define LOCOMO_KEY_CONTACT KEY_LEFTALT +#define LOCOMO_KEY_HOME KEY_SYSRQ +#else +#define LOCOMO_KEY_CONTACT KEY_CONTACT +#define LOCOMO_KEY_HOME KEY_HOME +#endif +#define KB_ROWS 16#define KB_COLS 8#define LOCOMOKBD_NUMKEYS (KB_ROWS * KB_COLS)
@@ -48,7 +56,7 @@static const unsigned char locomokbd_keycode[LOCOMOKBD_NUMKEYS ] = {0 ,KEY_ESC ,KEY_ACTIVITY ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 0 - 9 */ -0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_MENU ,0 ,KEY_CONTACT ,/* 10 - 19 */ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_MENU ,0 ,LOCOMO_KEY_CONTACT ,/* 10 - 19 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 20 - 29 */ 0 ,0 ,0 ,KEY_CENTER ,0 ,KEY_MAIL ,0 ,0 ,0 ,0 ,/* 30 - 39 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_RIGHT ,/* 40 - 49 */
@@ -280,9 +288,9 @@ static int locomokbd_probe(struct platform_device *dev) sizeof(locomokbd->keycode));if (machine_is_collie ()) - locomokbd->keycode[18 ] =KEY_HOME ; + locomokbd->keycode[18 ] =LOCOMO_KEY_HOME ;else - locomokbd->keycode[3 ] =KEY_HOME ; + locomokbd->keycode[3 ] =LOCOMO_KEY_HOME ;for (i =0 ; i <LOCOMOKBD_NUMKEYS ; i++)input_set_capability (input_dev,EV_KEY , locomokbd->keycode[i]);
Signature · 1 line
2.1.4
Dmitry Torokhov
maintainerRe: [PATCH v2 04/17] input: locomokbd: provide an Alt-SysRQ combination
Hi Dmitry,
Quoted 3 lines · Dmitry Eremin-Solenikov
It is usefull sometimes to have an Alt-SysRQ combo on the keyboard to be able to trigger sysrq functions directly. Add an option providing sysrq mapping for Contact-Home keys.
No, if you want to remap the keys please do it from usepspace; locomokbd supports it (EVIOCSKEYCODE ioctl).
Thanks.
Quoted 68 lines
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>--- drivers/input/keyboard/Kconfig | 7 +++++++ drivers/input/keyboard/locomokbd.c | 14 +++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/input/keyboard/Kconfig +7
-0@@ -343,6 +343,13 @@ config KEYBOARD_LOCOMO To compile this driver as a module, choose M here: the module will be called locomokbd. +config KEYBOARD_LOCOMO_SYSRQ + bool "Provide SysRQ key on LoCoMo keyboard" + depends on KEYBOARD_LOCOMO + help + Say Y here to be able to use Contact-Home as Alt-Sysrq combo. + Say N if you want to use them as usual keys. + config KEYBOARD_LPC32XX tristate "LPC32XX matrix key scanner support" depends on ARCH_LPC32XX && OFdrivers/input/keyboard/locomokbd.c +11
-3@@ -40,6 +40,14 @@#define KEY_CONTACT KEY_F18#define KEY_CENTER KEY_F15 +#ifdef CONFIG_KEYBOARD_LOCOMOKBD_SYSRQ +#define LOCOMO_KEY_CONTACT KEY_LEFTALT +#define LOCOMO_KEY_HOME KEY_SYSRQ +#else +#define LOCOMO_KEY_CONTACT KEY_CONTACT +#define LOCOMO_KEY_HOME KEY_HOME +#endif +#define KB_ROWS 16#define KB_COLS 8#define LOCOMOKBD_NUMKEYS (KB_ROWS * KB_COLS)@@ -48,7 +56,7 @@static const unsigned char locomokbd_keycode[LOCOMOKBD_NUMKEYS ] = {0 ,KEY_ESC ,KEY_ACTIVITY ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 0 - 9 */ -0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_MENU ,0 ,KEY_CONTACT ,/* 10 - 19 */ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_MENU ,0 ,LOCOMO_KEY_CONTACT ,/* 10 - 19 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,/* 20 - 29 */ 0 ,0 ,0 ,KEY_CENTER ,0 ,KEY_MAIL ,0 ,0 ,0 ,0 ,/* 30 - 39 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,KEY_RIGHT ,/* 40 - 49 */ @@ -280,9 +288,9 @@ static int locomokbd_probe(struct platform_device *dev) sizeof(locomokbd->keycode));if (machine_is_collie ()) - locomokbd->keycode[18 ] =KEY_HOME ; + locomokbd->keycode[18 ] =LOCOMO_KEY_HOME ;else - locomokbd->keycode[3 ] =KEY_HOME ; + locomokbd->keycode[3 ] =LOCOMO_KEY_HOME ;for (i =0 ; i <LOCOMOKBD_NUMKEYS ; i++)input_set_capability (input_dev,EV_KEY , locomokbd->keycode[i]);Signature · 1 line
2.1.4
Signature · 1 line
Dmitry
Re: [PATCH v2 04/17] input: locomokbd: provide an Alt-SysRQ combination
2015-05-12 23:12 GMT+03:00 Dmitry Torokhov <[email protected]>:
Quoted 9 lines
Hi Dmitry,
Quoted 3 lines · Dmitry Eremin-Solenikov
It is usefull sometimes to have an Alt-SysRQ combo on the keyboard to be able to trigger sysrq functions directly. Add an option providing sysrq mapping for Contact-Home keys.
No, if you want to remap the keys please do it from usepspace; locomokbd supports it (EVIOCSKEYCODE ioctl).
OK, this was useful to boot kernels with minimal to no userspace (tiny initramfs)
and still have the SysRQ at hand. I'll keep this as a local/OE patch instead.
Signature · 2 lines
With best wishes Dmitry
PATCH v2 6/17 video: lcd: add LoCoMo LCD driver
In reply to a message not in the archiveLoCoMo has some special handling for TFT screens attached to Collie and Poodle. Implement that as a separate driver.
--- drivers/video/backlight/Kconfig | 10 ++ drivers/video/backlight/Makefile | 1 + drivers/video/backlight/locomo_lcd.c | 285 +++++++++++++++++++++++++++++++++++ 3 files changed, 296 insertions(+) create mode 100644 drivers/video/backlight/locomo_lcd.c
drivers/video/backlight/Kconfig +10 -0
@@ -48,6 +48,16 @@ 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 + select IIO + help + If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to + enable the LCD driver. The panel starts up in power + off state, so you need this driver in order to see any + output. + config LCD_LTV350QV tristate "Samsung LTV350QV LCD Panel" depends on SPI_MASTER
drivers/video/backlight/Makefile +1 -0
@@ -11,6 +11,7 @@ obj-$(CONFIG_LCD_L4F00242T03) += l4f00242t03.o obj-$(CONFIG_LCD_LD9040) += ld9040.o obj-$(CONFIG_LCD_LMS283GF05) += lms283gf05.o obj-$(CONFIG_LCD_LMS501KF03) += lms501kf03.o +obj-$(CONFIG_LCD_LOCOMO) += locomo_lcd.o obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o obj-$(CONFIG_LCD_PLATFORM) += platform_lcd.o obj-$(CONFIG_LCD_S6E63M0) += s6e63m0.o
drivers/video/backlight/locomo_lcd.c new file +285 -0
285 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH v2 10/17 i2c: add locomo i2c driver
In reply to a message not in the archiveLoCoMo chip contains a tiny i2c controller destined to control M62332 DAC. Provide a separate I2C driver for this cell.
--- drivers/i2c/busses/Kconfig | 12 ++++ drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-locomo.c | 136 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 drivers/i2c/busses/i2c-locomo.c
drivers/i2c/busses/Kconfig +12 -0
@@ -602,6 +602,18 @@ config I2C_KEMPLD This driver can also be built as a module. If so, the module will be called i2c-kempld. +config I2C_LOCOMO + tristate "I2C bus support for LoCoMo chips" + depends on MFD_LOCOMO + select I2C_ALGOBIT + help + Say yes if you will run the kernel on Sharp SL-5x00 family of devices. + + If you don't know what to do here, say N. + + This driver can also be built as a module. If so, the module + will be called i2c-locomo. + config I2C_MESON tristate "Amlogic Meson I2C controller" depends on ARCH_MESON
drivers/i2c/busses/Makefile +1 -0
@@ -58,6 +58,7 @@ obj-$(CONFIG_I2C_IMX) += i2c-imx.o obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o obj-$(CONFIG_I2C_JZ4780) += i2c-jz4780.o obj-$(CONFIG_I2C_KEMPLD) += i2c-kempld.o +obj-$(CONFIG_I2C_LOCOMO) += i2c-locomo.o obj-$(CONFIG_I2C_MESON) += i2c-meson.o obj-$(CONFIG_I2C_MPC) += i2c-mpc.o obj-$(CONFIG_I2C_MV64XXX) += i2c-mv64xxx.o
drivers/i2c/busses/i2c-locomo.c new file +136 -0
136 lines not on this page · raw message
Signature · 6 lines
2.1.4 -- 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 v2 10/17] i2c: add locomo i2c driver
Quoted 4 lines · Dmitry Eremin-Solenikov
LoCoMo chip contains a tiny i2c controller destined to control M62332 DAC. Provide a separate I2C driver for this cell.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
Thanks for the submission!
drivers/i2c/busses/i2c-locomo.c line 14
Quoted 9 lines
drivers/i2c/busses/i2c-locomo.c new file +9
-0+#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/mfd/locomo.h> + +#include <linux/i2c.h> +#include <linux/i2c-algo-bit.h>
To avoid duplicates, I prefer the includes to be sorted. No need to resend because of that, though.
Kudos for brushing up old code! Do you want the drivers go via the subsystem trees? Or is there a dependency so it should go in via some other tree in one go?
Re: [PATCH v2 10/17] i2c: add locomo i2c driver
2015-05-12 22:24 GMT+03:00 Wolfram Sang <[email protected]>:
Quoted 21 lines · Dmitry Eremin-Solenikov
Quoted 4 lines
LoCoMo chip contains a tiny i2c controller destined to control M62332 DAC. Provide a separate I2C driver for this cell.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>Thanks for the submission!
drivers/i2c/busses/i2c-locomo.c line 14
Quoted 9 lines
drivers/i2c/busses/i2c-locomo.c new file +9
-0+#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/mfd/locomo.h> + +#include <linux/i2c.h> +#include <linux/i2c-algo-bit.h> To avoid duplicates, I prefer the includes to be sorted. No need to resend because of that, though.
Quoted 3 lines
Kudos for brushing up old code! Do you want the drivers go via the subsystem trees? Or is there a dependency so it should go in via some other tree in one go?
There is a header dependency -- <linux/mfd/locomo.h> is a new header. I'd prefer for these patches to go in via one of MFD, arm-soc or ARM trees as a whole series (if that would be ok with respective maintainers).
Signature · 2 lines
With best wishes Dmitry
Wolfram Sang
Reviewed-byRe: [PATCH v2 10/17] i2c: add locomo i2c driver
Quoted 22 lines · Dmitry Eremin-Solenikov
2015-05-12 22:24 GMT+03:00 Wolfram Sang <[email protected]>:
Quoted 21 lines · Dmitry Eremin-Solenikov
Quoted 4 lines
LoCoMo chip contains a tiny i2c controller destined to control M62332 DAC. Provide a separate I2C driver for this cell.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>Thanks for the submission!
drivers/i2c/busses/i2c-locomo.c line 14
Quoted 9 lines
drivers/i2c/busses/i2c-locomo.c new file +9
-0+#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include <linux/mfd/locomo.h> + +#include <linux/i2c.h> +#include <linux/i2c-algo-bit.h> To avoid duplicates, I prefer the includes to be sorted. No need to resend because of that, though.
Quoted 7 lines
Quoted 3 lines
Kudos for brushing up old code! Do you want the drivers go via the subsystem trees? Or is there a dependency so it should go in via some other tree in one go?
There is a header dependency -- <
linux/mfd/locomo.h> is a new header. I'd prefer for these patches to go in via one of MFD, arm-soc or ARM trees as a whole series (if that would be ok with respective maintainers).
Fine with me.
PATCH v2 5/17 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 | 153 ++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 drivers/video/backlight/locomo_bl.c
drivers/video/backlight/Kconfig +3 -3
@@ -217,12 +217,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 +153 -0
153 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH v2 7/17 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 | 12 ++++ drivers/gpio/Makefile | 1 + drivers/gpio/gpio-locomo.c | 170 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 drivers/gpio/gpio-locomo.c
drivers/gpio/Kconfig +12 -0
@@ -734,6 +734,18 @@ config GPIO_KEMPLD This driver can also be built as a module. If so, the module will be called gpio-kempld. +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. + + Sat Yes if you have such PDA, say No otherwise. + + This driver can also be built as a module. If so, the module will be + called gpio-locomo. + config GPIO_LP3943 tristate "TI/National Semiconductor LP3943 GPIO expander" depends on MFD_LP3943
drivers/gpio/Makefile +1 -0
@@ -42,6 +42,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_LOONGSON) += gpio-loongson.o obj-$(CONFIG_GPIO_LP3943) += gpio-lp3943.o obj-$(CONFIG_ARCH_LPC32XX) += gpio-lpc32xx.o
drivers/gpio/gpio-locomo.c new file +170 -0
170 lines not on this page · raw message
Signature · 1 line
2.1.4
Re: [PATCH v2 07/17] 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]>
I assume this will be funneled through the MFD tree?
Yours,
Linus Walleij
PATCH v2 8/17 gpio: locomo: implement per-pin irq handling
In reply to Dmitry Eremin-SolenikovLoCoMo 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/Kconfig | 1 + drivers/gpio/gpio-locomo.c | 120 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 1 deletion(-)
drivers/gpio/Kconfig +1 -0
@@ -737,6 +737,7 @@ config GPIO_KEMPLD config GPIO_LOCOMO bool "Sharp LoCoMo GPIO support" depends on MFD_LOCOMO + select GPIOLIB_IRQCHIP help Select this to support GPIO pins on Sharp LoCoMo Grid Array found in Sharp Zaurus collie and poodle models.
drivers/gpio/gpio-locomo.c +119 -1
163 lines not on this page · raw message
Signature · 1 line
2.1.4
Re: [PATCH v2 08/17] 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]>
Assume this will also go through MFD.
drivers/gpio/gpio-locomo.c static int locomo_gpio_remove(struct platform_device *pdev) · line 270
Quoted 2 lines
drivers/gpio/gpio-locomo.c +2
-0+irq_set_chained_handler (lg->irq,NULL ); +irq_set_handler_data (lg->irq,NULL );
Why is this needed? If the GPIOLIB_IRQCHIP code in gpiolib.c is not doing this then maybe it's the core code that needs fixing rather than having this in the driver.
Yours,
Linus Walleij
Re: [PATCH v2 08/17] gpio: locomo: implement per-pin irq handling
2015-05-06 17:15 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 11 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]>Reviewed-by Linus Walleij <[email protected]>
Thanks for review of the patches.
Quoted 8 lines
Assume this will also go through MFD.
drivers/gpio/gpio-locomo.c static int locomo_gpio_remove(struct platform_device *pdev) · line 270
Quoted 2 lines
drivers/gpio/gpio-locomo.c +2
-0+irq_set_chained_handler (lg->irq,NULL ); +irq_set_handler_data (lg->irq,NULL );Why is this needed? If the
GPIOLIB_IRQCHIPcode ingpiolib.cis not doing this then maybe it's the core code that needs fixing rather than having this in the driver.
I have skimmed through the rest of drivers using gpiochip_set_chained_irqchip(). Indeed none of the drivers NULL the chained handled and handler data. However I couldn't locate the code where they would be cleared.
Should I still send the patch fixing the GPIOLIB_IRQCHIP?
Quoted 3 lines
Yours,
Linus Walleij
Signature · 2 lines
With best wishes Dmitry
Re: [PATCH v2 08/17] gpio: locomo: implement per-pin irq handling
Quoted 24 lines · Dmitry Eremin-Solenikov
2015-05-06 17:15 GMT+03:00 Linus Walleij <[email protected]>:
Quoted 11 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]>Reviewed-by Linus Walleij <[email protected]>Thanks for review of the patches.
Quoted 8 lines
Assume this will also go through MFD.
drivers/gpio/gpio-locomo.c static int locomo_gpio_remove(struct platform_device *pdev) · line 270
Quoted 2 lines
drivers/gpio/gpio-locomo.c +2
-0+irq_set_chained_handler (lg->irq,NULL ); +irq_set_handler_data (lg->irq,NULL );Why is this needed? If the
GPIOLIB_IRQCHIPcode ingpiolib.cis not doing this then maybe it's the core code that needs fixing rather than having this in the driver.
Quoted 6 lines
I have skimmed through the rest of drivers using
gpiochip_set_chained_irqchip(). Indeed none of the drivers NULL the chained handled and handler data. However I couldn't locate the code where they would be cleared.Should I still send the patch fixing the
GPIOLIB_IRQCHIP?
Yes I guess you need to save parent_irq in struct gpio_chip and remove it in gpiochip_irqchip_remove() if it's != 0.
Yours,
Linus Walleij
PATCH v2 9/17 spi: add locomo SPI driver
In reply to Dmitry Eremin-SolenikovLoCoMo chip has a built-in simple SPI controller. On Sharp SL-5500 PDDAs it is connected to external MMC slot.
--- drivers/spi/Kconfig | 10 ++ drivers/spi/Makefile | 1 + drivers/spi/spi-locomo.c | 363 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 374 insertions(+) create mode 100644 drivers/spi/spi-locomo.c
drivers/spi/Kconfig +10 -0
@@ -258,6 +258,16 @@ 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 + help + This enables using the SPI controller as present in the LoCoMo + chips. It is probably only useful on the Sharp SL-5x00 PDA family. + + On SL-5500 and SL-5000 devices this controller is used for + MMC/SD cards. + config SPI_MPC52xx tristate "Freescale MPC52xx SPI (non-PSC) controller support" depends on PPC_MPC52xx
drivers/spi/Makefile +1 -0
@@ -44,6 +44,7 @@ obj-$(CONFIG_SPI_GPIO) += spi-gpio.o obj-$(CONFIG_SPI_IMG_SPFI) += spi-img-spfi.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_MESON_SPIFC) += spi-meson-spifc.o obj-$(CONFIG_SPI_MPC512x_PSC) += spi-mpc512x-psc.o obj-$(CONFIG_SPI_MPC52xx_PSC) += spi-mpc52xx-psc.o
drivers/spi/spi-locomo.c new file +363 -0
363 lines not on this page · raw message
Signature · 1 line
2.1.4
Mark Brown
maintainerRe: [PATCH v2 09/17] spi: add locomo SPI driver
drivers/spi/spi-locomo.c line 59
Quoted 5 lines · Dmitry Eremin-Solenikov
drivers/spi/spi-locomo.c new file +4
-0+static int locomospi_reg_open (struct locomospi_dev *spidev) +{ +static int locomospi_reg_release (struct locomospi_dev *spidev) +{
These are a bit weird - as far as I can tell they're just doing some init done on probe and release? I think I'd expect to see them either inlined there or done as part of the PM operations too (including runtime ones).
drivers/spi/spi-locomo.c line 106
Quoted 7 lines
drivers/spi/spi-locomo.c new file +7
-0+for (j =0 ; j < wait; j++) { +regmap_read (spidev->regmap,LOCOMO_SPIST , &r); +if (r &LOCOMO_SPI_RFW ) +break ; + } +if (j == wait) +dev_err (&spi->dev,"rfw timeout\n" );
But we don't return an error if we time out?
drivers/spi/spi-locomo.c line 200
Quoted 10 lines
drivers/spi/spi-locomo.c new file +10
-0+static int locomo_spi_setup_transfer (struct spi_device *spi, +struct spi_transfer *t) +{ +struct locomospi_dev *spidev; +u32 hz =0 ; + +if (t) + hz = t->speed_hz; +if (!hz) + hz = spi->max_speed_hz;
The core will set a speed on every transfer for you.
drivers/spi/spi-locomo.c line 225
Quoted 2 lines
drivers/spi/spi-locomo.c new file +2
-0+if (!tx && !rx && t->len) +return -EINVAL ;
Put this in the core if it's needed.
drivers/spi/spi-locomo.c line 347
Quoted 6 lines
drivers/spi/spi-locomo.c new file +6
-0+static int locomo_spi_remove (struct platform_device *pdev) +{ +struct spi_master *master =platform_get_drvdata (pdev); +struct locomospi_dev *spidev =spi_master_get_devdata (master); + +return locomospi_reg_release (spidev);
We're doing this release before we free the master which is potentially racy - but do we even need to do it at all?
PATCH v2 11/17 ARM: sa1100: make collie use new locomo drivers
In reply to Dmitry Eremin-SolenikovSwitch collie to new mfd-based locomo driver. Update platform data and add necessary spi, i2c and regulator devices.
--- arch/arm/mach-sa1100/Kconfig | 1 - arch/arm/mach-sa1100/collie.c | 213 ++++++++++++++++++++++------- arch/arm/mach-sa1100/include/mach/collie.h | 25 +++- 3 files changed, 187 insertions(+), 52 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 +165 -48
312 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_GPIO_CARD_DETECT (COLLIE_LOCOMO_GPIO_BASE + 13) +#define COLLIE_GPIO_CARD_RO (COLLIE_LOCOMO_GPIO_BASE + 14) +#define COLLIE_GPIO_CARD_POWER (COLLIE_LOCOMO_GPIO_BASE + 15) +#endif
Signature · 1 line
2.1.4
PATCH v2 12/17 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
@@ -79,22 +79,7 @@#define IRQ_BOARD_START 61#define IRQ_BOARD_END 77 -/* -* 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.4
PATCH v2 13/17 ASoC: pxa: 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 | 52 +++++++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 32 deletions(-)
sound/soc/pxa/poodle.c +20 -32
@@ -20,15 +20,11 @@#include <linux/i2c.h> #include <linux/interrupt.h> #include <linux/platform_device.h> +#include <linux/gpio/consumer.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> -#include "../codecs/wm8731.h" #include "pxa2xx-i2s.h"
@@ -42,22 +38,18 @@static int poodle_jack_func;static int poodle_spk_func; +static struct gpio_desc *poodle_mute_l, *poodle_mute_r, *poodle_amp_on;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 ); +gpiod_set_value (poodle_mute_l,0 ); +gpiod_set_value (poodle_mute_r,0 );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 ); +gpiod_set_value (poodle_mute_l,1 ); +gpiod_set_value (poodle_mute_r,1 );snd_soc_dapm_disable_pin (dapm,"Headphone Jack" ); }
@@ -84,11 +76,8 @@ static int poodle_startup(struct snd_pcm_substream *substream)/* we need to unmute the HP at shutdown as the mute burns power on poodle */ 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 ); +gpiod_set_value (poodle_mute_l,0 ); +gpiod_set_value (poodle_mute_r,0 ); } static int poodle_hw_params(struct snd_pcm_substream *substream,
@@ -178,12 +167,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 ); +gpiod_set_value (poodle_amp_on, (SND_SOC_DAPM_EVENT_ON (event)));return 0 ; }
@@ -268,13 +252,17 @@ 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 ); + poodle_mute_l =devm_gpiod_get (&pdev->dev,"mute-l" ,GPIOD_OUT_HIGH ); +if (IS_ERR (poodle_mute_l)) +return PTR_ERR (poodle_mute_l); + + poodle_mute_r =devm_gpiod_get (&pdev->dev,"mute-r" ,GPIOD_OUT_HIGH ); +if (IS_ERR (poodle_mute_r)) +return PTR_ERR (poodle_mute_l); + + poodle_amp_on =devm_gpiod_get (&pdev->dev,"amp-on" ,GPIOD_OUT_LOW ); +if (IS_ERR (poodle_amp_on)) +return PTR_ERR (poodle_amp_on); card->dev = &pdev->dev;
Signature · 1 line
2.1.4
Re: [PATCH v2 13/17] ASoC: pxa: poodle: make use of new locomo GPIO interface
Quoted 5 lines · Dmitry Eremin-Solenikov
Since LoCoMo driver has been converted to provide proper gpiolib interface, make poodle ASoC platform driver use gpiolib API.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>Acked-by Mark Brown <[email protected]>
Yours,
Linus Walleij
PATCH v2 14/17 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 | 16 ++++++--- arch/arm/mach-pxa/poodle.c | 58 ++++++++++++++++++++++++++++++--- 3 files changed, 65 insertions(+), 10 deletions(-)
arch/arm/mach-pxa/Kconfig +0 -1
@@ -481,7 +481,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 +11 -5
@@ -81,11 +81,17 @@#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_GPIO_232VCC_ON (POODLE_LOCOMO_GPIO_BASE + 12) +#define POODLE_GPIO_JK_B (POODLE_LOCOMO_GPIO_BASE + 13)#define POODLE_NR_IRQS (IRQ_BOARD_START + 4)/* 4 for LoCoMo */
arch/arm/mach-pxa/poodle.c +54 -4
106 lines not on this page · raw message
Signature · 1 line
2.1.4
A message that is not in the archive (sent off-list or not yet received): 1430178954-11138-15-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Re: [PATCH v2 14/17] ARM: pxa: poodle: use new LoCoMo driver
arch/arm/mach-pxa/include/mach/poodle.h line 84
Quoted 6 lines · Dmitry Eremin-Solenikov
arch/arm/mach-pxa/include/mach/poodle.h +1
-5-#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)
I missed that in the v1 serie : why twelve ?
arch/arm/mach-pxa/include/mach/poodle.h line 94
Quoted 10 lines
arch/arm/mach-pxa/include/mach/poodle.h +10
-0+#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_GPIO_232VCC_ON (POODLE_LOCOMO_GPIO_BASE + 12) +#define POODLE_GPIO_JK_B (POODLE_LOCOMO_GPIO_BASE + 13)
Why not keep the LOCOMO_GPIO() defines, and redevice LOCOMO_GPIO(x) to (POODLE_LOCOMO_GPIO_BASE + (x)) ?
No comments on the remaining part, as long as it's tested, you know me by now
...
Cheers.
Signature · 1 line
Robert
Linus Walleij
Reviewed-byRe: [PATCH v2 14/17] ARM: pxa: poodle: use new LoCoMo driver
In reply to a message not in the archiveQuoted 3 lines · Dmitry Eremin-Solenikov
Convert poodle to use new mfd-based LoCoMo driver.
Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
This:
arch/arm/mach-pxa/poodle.c static struct i2c_board_info __initdata poodle_i2c_devices[] = { · line 457
Quoted 9 lines
arch/arm/mach-pxa/poodle.c +9
-0+static struct gpiod_lookup_table poodle_audio_gpios_table = { + .dev_id ="poodle-audio" , + .table = { +GPIO_LOOKUP ("locomo-gpio" ,10 ,"mute-l" ,GPIO_ACTIVE_LOW ), +GPIO_LOOKUP ("locomo-gpio" ,11 ,"mute-r" ,GPIO_ACTIVE_LOW ), +GPIO_LOOKUP ("locomo-gpio" ,8 ,"amp-on" ,GPIO_ACTIVE_LOW ), + { }, + }, +},
Is very nice to see.
Yours,
Linus Walleij
PATCH v2 15/17 ARM: pxa: poodle: don't preallocate IRQ space for locomo
In reply to Dmitry Eremin-SolenikovAs 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 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-pxa/include/mach/poodle.h +1 -1
@@ -93,7 +93,7 @@#define POODLE_GPIO_232VCC_ON (POODLE_LOCOMO_GPIO_BASE + 12)#define POODLE_GPIO_JK_B (POODLE_LOCOMO_GPIO_BASE + 13) -#define POODLE_NR_IRQS (IRQ_BOARD_START + 4)/* 4 for LoCoMo */ +#define POODLE_NR_IRQS IRQ_BOARD_STARTextern struct platform_device poodle_locomo_device;
Signature · 1 line
2.1.4
Re: [PATCH v2 15/17] ARM: pxa: poodle: don't preallocate IRQ space for locomo
Quoted 4 lines · Dmitry Eremin-Solenikov
As new locomo driver supports
SPARSE_IRQ, don't preallocateNR_IRQSspace for it on poodle.Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
Signature · 1 line
Robert
PATCH v2 16/17 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.4
PATCH v2 17/17 ARM: drop old LoCoMo driver
In reply to Dmitry Eremin-SolenikovAs 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 · 1 line
2.1.4
A message that is not in the archive (sent off-list or not yet received): 1430178954-11138-18-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Linus Walleij
Reviewed-byRe: [PATCH v2 17/17] ARM: drop old LoCoMo driver
Quoted 4 lines · Dmitry Eremin-Solenikov
As there are no in-kernel users of old locomo driver, drop all alltogether. Remove
Kconfigentry, driver and header.Signed-off-by Dmitry Eremin-Solenikov <[email protected]>
Good riddance.
Yours,
Linus Walleij