From: Matt Ranostay <hidden> Date: 2014-09-21 03:00:36
These patches enable using cap11xx devices that have different
number of capacitance channels, and using active-high on the
interrupt output.
Matt Ranostay (3):
cap1106: Add support for various cap11xx devices
cap1106: support for active-high interrupt option
dt: cap1106 active-high property addition
.../devicetree/bindings/input/cap1106.txt | 4 ++
drivers/input/keyboard/cap1106.c | 58 ++++++++++++----------
2 files changed, 35 insertions(+), 27 deletions(-)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Matt Ranostay <hidden> Date: 2014-09-21 03:00:52
Several other variants of the cap11xx device exists with a varying
number of capacitance detection channels. Add support for creating
the channels dynamically.
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 54 +++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 28 deletions(-)
@@ -220,6 +215,10 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,return-ENODEV;}+error=regmap_read(priv->regmap,CAP1106_REG_PRODUCT_ID,&prod);+if(error<0)+returnerror;+error=regmap_read(priv->regmap,CAP1106_REG_REVISION,&rev);if(error<0)returnerror;
@@ -235,17 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,dev_err(dev,"Invalid sensor-gain value %d\n",gain32);}-BUILD_BUG_ON(ARRAY_SIZE(keycodes)!=ARRAY_SIZE(priv->keycodes));-/* Provide some useful defaults */-for(i=0;i<ARRAY_SIZE(keycodes);i++)-keycodes[i]=KEY_A+i;+for(i=0;i<priv->num_channels;i++)+priv->keycodes[i]=KEY_A+i;of_property_read_u32_array(node,"linux,keycodes",-keycodes,ARRAY_SIZE(keycodes));--for(i=0;i<ARRAY_SIZE(keycodes);i++)-priv->keycodes[i]=keycodes[i];+priv->keycodes,priv->num_channels);error=regmap_update_bits(priv->regmap,CAP1106_REG_MAIN_CONTROL,CAP1106_REG_MAIN_CONTROL_GAIN_MASK,
@@ -269,17 +263,17 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,if(of_property_read_bool(node,"autorepeat"))__set_bit(EV_REP,priv->idev->evbit);-for(i=0;i<CAP1106_NUM_CHN;i++)+for(i=0;i<priv->num_channels;i++)__set_bit(priv->keycodes[i],priv->idev->keybit);__clear_bit(KEY_RESERVED,priv->idev->keybit);priv->idev->keycode=priv->keycodes;priv->idev->keycodesize=sizeof(priv->keycodes[0]);-priv->idev->keycodemax=ARRAY_SIZE(priv->keycodes);+priv->idev->keycodemax=priv->num_channels;priv->idev->id.vendor=CAP1106_MANUFACTURER_ID;-priv->idev->id.product=CAP1106_PRODUCT_ID;+priv->idev->id.product=prod;priv->idev->id.version=rev;priv->idev->open=cap1106_input_open;
@@ -313,12 +307,16 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,staticconststructof_device_idcap1106_dt_ids[]={{.compatible="microchip,cap1106",},+{.compatible="microchip,cap1126",},+{.compatible="microchip,cap1188",},{}};MODULE_DEVICE_TABLE(of,cap1106_dt_ids);staticconststructi2c_device_idcap1106_i2c_ids[]={-{"cap1106",0},+{"cap1106",6},+{"cap1126",6},+{"cap1188",8},{}};MODULE_DEVICE_TABLE(i2c,cap1106_i2c_ids);
From: Matt Ranostay <hidden> Date: 2014-09-21 03:00:55
Some applications need to use the active-high push-pull interrupt
option. This allows it be enabled in the device tree child node.
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -234,6 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,dev_err(dev,"Invalid sensor-gain value %d\n",gain32);}+if(of_property_read_bool(node,"microchip,active-high")){+error=regmap_write(priv->regmap,CAP1106_REG_CONFIG2,0);+if(error)+returnerror;+}+/* Provide some useful defaults */for(i=0;i<priv->num_channels;i++)priv->keycodes[i]=KEY_A+i;
@@ -26,6 +26,10 @@ Optional properties: Valid values are 1, 2, 4, and 8. By default, a gain of 1 is set.+ microchip,active-high: By default the interrupt pin is active low open+ drain. This property allows using the active high+ push-pull output.+ linux,keycodes: Specifies an array of numeric keycode values to be used for the channels. If this property is omitted, KEY_A, KEY_B, etc are used as
From: Daniel Mack <daniel@zonque.org> Date: 2014-09-21 09:58:40
Hi,
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
Several other variants of the cap11xx device exists with a varying
number of capacitance detection channels. Add support for creating
the channels dynamically.
Thanks for the patches!
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 54 +++++++++++++++++++---------------------
Please also add a patch to rename the file to cap11xx.c, and make sure
to export the patch with 'git format-patch -M' to detect the rename.
@@ -235,17 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client, dev_err(dev, "Invalid sensor-gain value %d\n", gain32); }- BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes));- /* Provide some useful defaults */- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- keycodes[i] = KEY_A + i;+ for (i = 0; i < priv->num_channels; i++)+ priv->keycodes[i] = KEY_A + i; of_property_read_u32_array(node, "linux,keycodes",- keycodes, ARRAY_SIZE(keycodes));-- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- priv->keycodes[i] = keycodes[i];+ priv->keycodes, priv->num_channels);
Hmm, no. Internally, you have to store the keycodes as unsigned short,
otherwise EVIOC{G|S}KEYCODE from usespace doesn't work.
of_property_read_u16_array() should work here for unsigned short, I
guess. Otherwise, you'd have to open-code the routine.
From: Daniel Mack <daniel@zonque.org> Date: 2014-09-21 10:06:34
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
quoted hunk
Some applications need to use the active-high push-pull interrupt
option. This allows it be enabled in the device tree child node.
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -234,6 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,dev_err(dev,"Invalid sensor-gain value %d\n",gain32);}+if(of_property_read_bool(node,"microchip,active-high")){
I think the name of that property should make clear it's only changing
the interrupt output driver configuration. What about
"microchip,irq-active-high"?
Also, patch 3/3, which documents this new property, can be squashed into
this one.
This register controls a lot more details than that. Overriding it with
0 doesn't seem right. Please use regmap_update_bits() to just update
ALT_POL, and also add a #define for it, so the next reader knows what
the code is doing :)
Thanks,
Daniel
Btw - the purpose of this code was to detect board configuration
mismatch. After all, I2C lacks a way to properly identify peripherals,
so the more runtime checks we do at probe time, the more of a chance we
have to detect wrong setups. This device is actually well implemented
and tells us something about itself.
Hence, I'd propose to define a structure like this:
struct cap11xx_hw_model {
uint8_t product_id;
unsigned int num_channels;
};
... and attach instances of that to the members of cap1106_dt_ids[] and
cap1106_i2c_ids[]. In the probe function, check that the contents of
CAP1106_PRODUCT_ID match what is expected by the configured model.
Thanks,
Daniel
From: Matt Ranostay <hidden> Date: 2014-09-21 22:46:51
On Sun, Sep 21, 2014 at 2:58 AM, Daniel Mack [off-list ref] wrote:
Hi,
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
quoted
Several other variants of the cap11xx device exists with a varying
number of capacitance detection channels. Add support for creating
the channels dynamically.
Thanks for the patches!
quoted
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 54 +++++++++++++++++++---------------------
Please also add a patch to rename the file to cap11xx.c, and make sure
to export the patch with 'git format-patch -M' to detect the rename.
@@ -235,17 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client, dev_err(dev, "Invalid sensor-gain value %d\n", gain32); }- BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes));- /* Provide some useful defaults */- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- keycodes[i] = KEY_A + i;+ for (i = 0; i < priv->num_channels; i++)+ priv->keycodes[i] = KEY_A + i; of_property_read_u32_array(node, "linux,keycodes",- keycodes, ARRAY_SIZE(keycodes));-- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- priv->keycodes[i] = keycodes[i];+ priv->keycodes, priv->num_channels);
Hmm, no. Internally, you have to store the keycodes as unsigned short,
otherwise EVIOC{G|S}KEYCODE from usespace doesn't work.
of_property_read_u16_array() should work here for unsigned short, I
guess. Otherwise, you'd have to open-code the routine.
Hmm, how can that work unless you set .data to the number of channels
here? Did you test that with a DT-enabled board?
Yes it was tested on a BBB. The num_channels is set from cap1106_i2c_ids
Thanks,
Daniel
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Matt Ranostay <hidden> Date: 2014-09-22 00:28:09
On Sun, Sep 21, 2014 at 2:58 AM, Daniel Mack [off-list ref] wrote:
Hi,
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
quoted
Several other variants of the cap11xx device exists with a varying
number of capacitance detection channels. Add support for creating
the channels dynamically.
Thanks for the patches!
quoted
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 54 +++++++++++++++++++---------------------
Please also add a patch to rename the file to cap11xx.c, and make sure
to export the patch with 'git format-patch -M' to detect the rename.
@@ -235,17 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client, dev_err(dev, "Invalid sensor-gain value %d\n", gain32); }- BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes));- /* Provide some useful defaults */- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- keycodes[i] = KEY_A + i;+ for (i = 0; i < priv->num_channels; i++)+ priv->keycodes[i] = KEY_A + i; of_property_read_u32_array(node, "linux,keycodes",- keycodes, ARRAY_SIZE(keycodes));-- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- priv->keycodes[i] = keycodes[i];+ priv->keycodes, priv->num_channels);
Hmm, no. Internally, you have to store the keycodes as unsigned short,
otherwise EVIOC{G|S}KEYCODE from usespace doesn't work.
of_property_read_u16_array() should work here for unsigned short, I
guess. Otherwise, you'd have to open-code the routine.
Problem with u16 is you'll to mark it */bits/ 16* in the device tree
entry.. I doubt that is acceptable
On Sun, Sep 21, 2014 at 12:06:30PM +0200, Daniel Mack wrote:
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
quoted
Some applications need to use the active-high push-pull interrupt
option. This allows it be enabled in the device tree child node.
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -234,6 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,dev_err(dev,"Invalid sensor-gain value %d\n",gain32);}+if(of_property_read_bool(node,"microchip,active-high")){
I think the name of that property should make clear it's only changing
the interrupt output driver configuration. What about
"microchip,irq-active-high"?
Can we infer the setting from IRQ flags by chance?
Thanks.
--
Dmitry
On Sun, Sep 21, 2014 at 05:28:05PM -0700, Matt Ranostay wrote:
On Sun, Sep 21, 2014 at 2:58 AM, Daniel Mack [off-list ref] wrote:
quoted
Hi,
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
quoted
Several other variants of the cap11xx device exists with a varying
number of capacitance detection channels. Add support for creating
the channels dynamically.
Thanks for the patches!
quoted
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 54 +++++++++++++++++++---------------------
Please also add a patch to rename the file to cap11xx.c, and make sure
to export the patch with 'git format-patch -M' to detect the rename.
You do not need to allocate keycodes separately if you make a flexible length
array at the end of the main structure.
quoted
Use devm_kcalloc() to allocate an array.
quoted
@@ -235,17 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client, dev_err(dev, "Invalid sensor-gain value %d\n", gain32); }- BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes));- /* Provide some useful defaults */- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- keycodes[i] = KEY_A + i;+ for (i = 0; i < priv->num_channels; i++)+ priv->keycodes[i] = KEY_A + i; of_property_read_u32_array(node, "linux,keycodes",- keycodes, ARRAY_SIZE(keycodes));-- for (i = 0; i < ARRAY_SIZE(keycodes); i++)- priv->keycodes[i] = keycodes[i];+ priv->keycodes, priv->num_channels);
Hmm, no. Internally, you have to store the keycodes as unsigned short,
otherwise EVIOC{G|S}KEYCODE from usespace doesn't work.
of_property_read_u16_array() should work here for unsigned short, I
guess. Otherwise, you'd have to open-code the routine.
Problem with u16 is you'll to mark it */bits/ 16* in the device tree
entry.. I doubt that is acceptable
You can make keymap u32. As long as you set input->keycodesize appropriately
(and we do) everything should work just fine.
Thanks.
--
Dmitry
Hmm, how can that work unless you set .data to the number of channels
here? Did you test that with a DT-enabled board?
Yes it was tested on a BBB. The num_channels is set from cap1106_i2c_ids
Ah ok. I forgot there's this fallback to the i2c ids. What others driver
do is to use of_match_device() in the probe function, and then access
->data of the returned match.
But I'm fine with falling back to cap1106_i2c_ids unless anyone else has
objections.
Thanks,
Daniel
From: Daniel Mack <daniel@zonque.org> Date: 2014-09-22 07:44:06
On 09/22/2014 07:56 AM, Dmitry Torokhov wrote:
On Sun, Sep 21, 2014 at 12:06:30PM +0200, Daniel Mack wrote:
quoted
On 09/21/2014 05:01 AM, Matt Ranostay wrote:
quoted
Some applications need to use the active-high push-pull interrupt
option. This allows it be enabled in the device tree child node.
Signed-off-by: Matt Ranostay <redacted>
---
drivers/input/keyboard/cap1106.c | 6 ++++++
1 file changed, 6 insertions(+)
@@ -234,6 +234,12 @@ static int cap1106_i2c_probe(struct i2c_client *i2c_client,dev_err(dev,"Invalid sensor-gain value %d\n",gain32);}+if(of_property_read_bool(node,"microchip,active-high")){
I think the name of that property should make clear it's only changing
the interrupt output driver configuration. What about
"microchip,irq-active-high"?
Can we infer the setting from IRQ flags by chance?
Hmm, I thought of that as well, but there could be electrical wiring
setups that want the CPU's hardware pin in push/pull mode but the one on
the sensor chip in open-drain. I'd rather not make the assuption the
pins are directly connected and have both sides individually configurable.
Thanks,
Daniel