Re: [balbi-usb:gadget 58/62] drivers/usb/gadget/ether.c:113:1: error: expected ')' before '.' token

2012-09-10 Thread Sebastian Andrzej Siewior

On 09/10/2012 03:54 PM, Fengguang Wu wrote:

tree:   git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git gadget
head:   7a7322b0a5d984025dd4faea9098b8fef07f8d8f
commit: 721e2e91945bc2520d57d795dfe1b502ecec567c [58/62] usb: gadget: 
libcomposite: move composite.c into libcomposite
config: x86_64-randconfig-s284 (attached as .config)

All related error/warning messages:

In file included from drivers/usb/gadget/ether.c:110:0:
drivers/usb/gadget/u_ether.c:87:21: error: expected ')' before 'uint'


That is the problem. u_ether.c lacks a #include linux/module.h. It
built here because I had rndis  EEM which included that file…

Thanks for finding this so quickly.

Felipe, patch on top or do fix up this commit?

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [balbi-usb:master 33/36] drivers/usb/gadget/serial.c:89:22: sparse: cast truncates bits from constant value (24000000 becomes 0)

2012-09-10 Thread Sebastian Andrzej Siewior

On 09/10/2012 06:40 PM, Fengguang Wu wrote:

tree:   git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git master
head:   d9c88901337158c9f253a7de58a10b5125d61d26
commit: 7a7322b0a5d984025dd4faea9098b8fef07f8d8f [33/36] usb: gadget: remove 
usb_gadget_controller_number()

All sparse warnings:


Once again, thank you.


   drivers/usb/gadget/f_acm.c:287:9: sparse: advancing past deep designator
   drivers/usb/gadget/f_obex.c:60:9: sparse: advancing past deep designator
   drivers/usb/gadget/f_serial.c:134:9: sparse: advancing past deep designator
   drivers/usb/gadget/serial.c:66:9: sparse: advancing past deep designator


I don't get these. The purpose is an all NULL terminating entry. Could
this be a sparse bug or is the [] / {} switch not really good C code?


+ drivers/usb/gadget/serial.c:89:22: sparse: cast truncates bits from constant 
value (2400 becomes 0)


I've sent a patch for this.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] tty: omap-serial: fix boot hang by converting to use a threaded IRQ handler (was Re: [PATCH] irq: always set IRQF_ONESHOT if no primary handler is specified)

2011-08-23 Thread Sebastian Andrzej Siewior
* Paul Walmsley | 2011-08-22 23:10:21 [-0600]:

IRQ handler type mismatch for IRQ 74

It turns out that the omap-serial code used one threaded IRQ
handler[1][2] and one non-threaded IRQ handler[3] that shared the same
IRQ.  During the 3.1-rc series, a patch was merged[4] that caused
IRQF_ONESHOT to be set on the threaded handler, but the non-threaded
handler did not have IRQF_ONESHOT set.  Since interrupt handlers

Is the type of IRQ74 edge or line/eoi?
Since you registered the serial handler as threaded and the primary
handler did _not_ disable the irq source (due to the absence of the
IRQF_ONESHOT flag or a custom primary handler which does this by
changing a bit in the hardware) it is more or less luck that you did not
hang forever on the first serial interrupt. Well, it does not happen
with edge typed interrupt lines.

that share the same IRQ must also share the presence or absence of
IRQF_ONESHOT[5], this new commit caused a mismatch that prevented the
non-threaded IRQ from registering.

In theory it should be okay if the handler without ONESHOT is either
primary only or primary + threaded and the primary disables the irq
source.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: 3.1-rc3 fails to boot on my pandaboard

2011-08-25 Thread Sebastian Andrzej Siewior
* Luciano Coelho | 2011-08-25 13:39:29 [+0300]:

Hi,
Hi,

Any ideas what may be going wrong?

I think my commit was identified as bogus and tglx is going to revert 
it. The problem is that I force ONESHOT mode for all threaded IRQs but
there are also others without the flag which is not allowed.

I was trying to check something but I don't get my board to boot. Could
you please try to boot with the patch reverted and paste me the
the output of 
 cat /proc/interrupts | grep 74 ?

I *think* that the flow handler is level (I can't find evidence of it
beeing edge, and omap_alloc_gc() is the place installing it).

So could you please gather additional debug info with this patch?

diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 2e94258..eda25a0 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1327,6 +1327,9 @@ int request_threaded_irq(unsigned int irq, irq_handler_t 
handler,
if (!irq_settings_can_request(desc))
return -EINVAL;
 
+   if (irq == 74)
+   printk(KERN_ERR %s() h %pS th %pS f %lx dev %s flow %pS\n, 
__func__,
+   handler, thread_fn, irqflags, devname, 
desc-handle_irq);
if (!handler) {
if (!thread_fn)
return -EINVAL;


%pS should resolve the function names.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: 3.1-rc3 fails to boot on my pandaboard

2011-08-25 Thread Sebastian Andrzej Siewior
* Luciano Coelho | 2011-08-25 14:24:34 [+0300]:

These are the interrupts reported in /proc/interrupts on my board:

Thank you, this is enough information.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [patch] dwc3: add a kfree() on error to dwc3_testmode_open()

2011-08-26 Thread Sebastian Andrzej Siewior
* Dan Carpenter | 2011-08-26 12:21:13 [+0300]:

Btw.  This function returns -EBUSY on success.  Was that really what
you want?

At that time yes. The idea was to enable the self-test mode of the core
and let it do transfers forth and back and see if it works. There is
also no off switch. I wasn't aware that this piece of code is going to
merged but now I think we need an off switch.
Thanks for spotting this.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [balbi-usb:merge-result-for-greg 59/99] webcam.c:(.text+0x14afec): undefined reference to `config_ep_by_speed'

2012-10-15 Thread Sebastian Andrzej Siewior

On 10/12/2012 06:39 PM, Fengguang Wu wrote:

Hi Sebastian,


Hi Fengguang,


FYI, kernel build failed on

tree:   git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git 
merge-result-for-greg
head:   23953bde3e4d6aa8780dc054f6ad9882ac63f4f4
commit: 721e2e91945bc2520d57d795dfe1b502ecec567c [59/99] usb: gadget: 
libcomposite: move composite.c into libcomposite
config: i386-randconfig-b199 (attached as .config)

All error/warnings:

drivers/built-in.o: In function `uvc_function_set_alt':


Yes. I accidentally broke this and this still fails in 3.7-rc1. Greg
has a patch for this in his tree (usb: gadget: Make webcam gadget
select USB_LIBCOMPOSITE) which fixes this.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC] dt: export of_have_populated_dt

2012-04-10 Thread Sebastian Andrzej Siewior

On 04/10/2012 05:11 PM, Balaji T K wrote:

If of_have_populated_dt is called from module, build fails with allnodes
undefined error, so remove inline and export of_have_populated_dt.


Why do you need this function at all? You should not need it. *I*
introduced it because I need it early x86 setup code to figure out if
there a DT available or not. A driver should not care about it. You do 
have your dev.of_node and this is it.


Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [net-next PATCH 1/1] drivers: net: cpsw: fix kernel warn on cpsw irq enable

2013-04-26 Thread Sebastian Andrzej Siewior
On 04/26/2013 01:30 PM, Mugunthan V N wrote:
 diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
 index 4e2d224..59c4391 100644
 --- a/drivers/net/ethernet/ti/cpsw.c
 +++ b/drivers/net/ethernet/ti/cpsw.c
 @@ -1633,7 +1633,6 @@ static int cpsw_probe_dual_emac(struct platform_device 
 *pdev,
   priv_sl2-irqs_table[i] = priv-irqs_table[i];
   priv_sl2-num_irqs = priv-num_irqs;
   }
 - priv-irq_enabled = true;
   ndev-features |= NETIF_F_HW_VLAN_CTAG_FILTER;
  
   ndev-netdev_ops = cpsw_netdev_ops;
 @@ -1679,6 +1678,7 @@ static int cpsw_probe(struct platform_device *pdev)
   priv-msg_enable = netif_msg_init(debug_level, CPSW_DEBUG);
   priv-rx_packet_max = max(rx_packet_max, 128);
   priv-cpts = devm_kzalloc(pdev-dev, sizeof(struct cpts), GFP_KERNEL);
 + priv-irq_enabled = true;
   if (!ndev) {
   pr_err(error allocating cpts\n);
   goto clean_ndev_ret;


David, how did this happen? The patch I've sent

   http://www.spinics.net/lists/netdev/msg234240.html

adds this to the probe function, according to the net-next tree it was
added to cpsw_probe_dual_emac(). The context is similar but not exact
the same.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [net-next PATCH 1/1] drivers: net: cpsw: irq not disabled in cpsw isr in particular sequence

2013-05-02 Thread Sebastian Andrzej Siewior
* Mugunthan V N | 2013-05-02 17:22:11 [+0530]:

In CPSW NAPI, after processing all interrupts IRQ is enabled and then book
keeping irq_enabled is updated. In random cases when a packet is transmitted
or received between processing packets and IRQ enabled, then just after
enabled IRQ and before irq_enabled is updated, ISR is called so IRQs are
not disabled as irq_enabled is still false and CPU gets locked in CPSW ISR.

By changing the sequence as update the irq_enabled and then enable IRQ
fixes the issue. This issue is not captured always as it is a timing issue
whether Tx or Rx IRQ is invoked between packet processing and enable IRQ.

Acked-by: Sebastian Andrzej Siewior bige...@linutronix.de

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] arm/omap: use const char properly

2013-06-06 Thread Sebastian Andrzej Siewior
The itention was probably to make both pointers const but as it is now,
it is just const used twice.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/mach-omap2/id.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 1272c41..54e4c16 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -601,7 +601,7 @@ void __init omap2_set_globals_tap(u32 class, void __iomem 
*tap)
 
 #ifdef CONFIG_SOC_BUS
 
-static const char const *omap_types[] = {
+static const char * const omap_types[] = {
[OMAP2_DEVICE_TYPE_TEST]= TST,
[OMAP2_DEVICE_TYPE_EMU] = EMU,
[OMAP2_DEVICE_TYPE_SEC] = HS,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/4] ARM: dts: AM33XX: Add PWM backlight DT data to am335x-evmsk

2013-06-06 Thread Sebastian Andrzej Siewior
From: Philip Avinash avinashphi...@ti.com

PWM output from ecap2 uses as backlight source. Also adds low threshold
value to have a uniform divisions in brightness-levels scales with
inverse polarity.

Signed-off-by: Philip Avinash avinashphi...@ti.com
Reviewed-by: Thierry Reding thierry.red...@avionic-design.de
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am335x-evmsk.dts |   23 +++
 1 file changed, 23 insertions(+)

diff --git a/arch/arm/boot/dts/am335x-evmsk.dts 
b/arch/arm/boot/dts/am335x-evmsk.dts
index f67c360..c21fdaf 100644
--- a/arch/arm/boot/dts/am335x-evmsk.dts
+++ b/arch/arm/boot/dts/am335x-evmsk.dts
@@ -51,6 +51,12 @@
0x9c 0x27   /* gpmc_ben0_cle.gpio2_5, INPUT 
| MODE7 */
;
};
+
+   ecap2_pins: backlight_pins {
+   pinctrl-single,pins = 
+   0x19c 0x4   /* 
mcasp0_ahclkr.ecap2_in_pwm2_out MODE4 */
+   ;
+   };
};
 
ocp {
@@ -94,6 +100,16 @@
st,max-limit-z = 750;
};
};
+
+   epwmss2: epwmss@48304000 {
+   status = okay;
+
+   ecap2: ecap@48304100 {
+   status = okay;
+   pinctrl-names = default;
+   pinctrl-0 = ecap2_pins;
+   };
+   };
};
 
vbat: fixedregulator@0 {
@@ -170,6 +186,13 @@
gpios = gpio2 5 0;
};
};
+
+   backlight {
+   compatible = pwm-backlight;
+   pwms = ecap2 0 5 1;
+   brightness-levels = 0 58 61 66 75 90 125 170 255;
+   default-brightness-level = 8;
+   };
 };
 
 /include/ tps65910.dtsi
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 3/4] ARM: dts: AM33XX: Add PWM backlight DT data to am335x-evm

2013-06-06 Thread Sebastian Andrzej Siewior
From: Philip Avinash avinashphi...@ti.com

PWM output from ecap0 uses as backlight source. Also adds low threshold
value to have a uniform divisions in brightness-levels scales.

Signed-off-by: Philip Avinash avinashphi...@ti.com
Reviewed-by: Thierry Reding thierry.red...@avionic-design.de
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am335x-evm.dts |   23 +++
 1 file changed, 23 insertions(+)

diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 0423298..35b2f77 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -44,6 +44,12 @@
0x154 0x27  /* spi0_d0.gpio0_3, INPUT | 
MODE7 */
;
};
+
+   ecap0_pins: backlight_pins {
+   pinctrl-single,pins = 
+   0x164 0x0   /* 
eCAP0_in_PWM0_out.eCAP0_in_PWM0_out MODE0 */
+   ;
+   };
};
 
ocp {
@@ -102,6 +108,16 @@
reg = 0x48;
};
};
+
+   epwmss0: epwmss@4830 {
+   status = okay;
+
+   ecap0: ecap@48300100 {
+   status = okay;
+   pinctrl-names = default;
+   pinctrl-0 = ecap0_pins;
+   };
+   };
};
 
vbat: fixedregulator@0 {
@@ -158,6 +174,13 @@
gpio-key,wakeup;
};
};
+
+   backlight {
+   compatible = pwm-backlight;
+   pwms = ecap0 0 5 0;
+   brightness-levels = 0 51 53 56 62 75 101 152 255;
+   default-brightness-level = 8;
+   };
 };
 
 /include/ tps65910.dtsi
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/4] ARM: dts: AM33XX: Add PWMSS device tree nodes

2013-06-06 Thread Sebastian Andrzej Siewior
From: Philip Avinash avinashphi...@ti.com

Add PWMSS device tree nodes in relation with ECAP  EHRPWM DT nodes to
AM33XX SoC family. Also populates device tree nodes for ECAP  EHRPWM by
adding necessary properties like pwm-cells, base reg  set disabled as
status.

Signed-off-by: Philip Avinash avinashphi...@ti.com
Reviewed-by: Thierry Reding thierry.red...@avionic-design.de
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am33xx.dtsi |   84 +
 1 file changed, 84 insertions(+)

diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 1460d9b..7fa9c5f 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -343,6 +343,90 @@
ti,hwmods = usb_otg_hs;
};
 
+   epwmss0: epwmss@4830 {
+   compatible = ti,am33xx-pwmss;
+   reg = 0x4830 0x10;
+   ti,hwmods = epwmss0;
+   #address-cells = 1;
+   #size-cells = 1;
+   status = disabled;
+   ranges = 0x48300100 0x48300100 0x80   /* ECAP */
+ 0x48300180 0x48300180 0x80   /* EQEP */
+ 0x48300200 0x48300200 0x80; /* EHRPWM */
+
+   ecap0: ecap@48300100 {
+   compatible = ti,am33xx-ecap;
+   #pwm-cells = 3;
+   reg = 0x48300100 0x80;
+   ti,hwmods = ecap0;
+   status = disabled;
+   };
+
+   ehrpwm0: ehrpwm@48300200 {
+   compatible = ti,am33xx-ehrpwm;
+   #pwm-cells = 3;
+   reg = 0x48300200 0x80;
+   ti,hwmods = ehrpwm0;
+   status = disabled;
+   };
+   };
+
+   epwmss1: epwmss@48302000 {
+   compatible = ti,am33xx-pwmss;
+   reg = 0x48302000 0x10;
+   ti,hwmods = epwmss1;
+   #address-cells = 1;
+   #size-cells = 1;
+   status = disabled;
+   ranges = 0x48302100 0x48302100 0x80   /* ECAP */
+ 0x48302180 0x48302180 0x80   /* EQEP */
+ 0x48302200 0x48302200 0x80; /* EHRPWM */
+
+   ecap1: ecap@48302100 {
+   compatible = ti,am33xx-ecap;
+   #pwm-cells = 3;
+   reg = 0x48302100 0x80;
+   ti,hwmods = ecap1;
+   status = disabled;
+   };
+
+   ehrpwm1: ehrpwm@48302200 {
+   compatible = ti,am33xx-ehrpwm;
+   #pwm-cells = 3;
+   reg = 0x48302200 0x80;
+   ti,hwmods = ehrpwm1;
+   status = disabled;
+   };
+   };
+
+   epwmss2: epwmss@48304000 {
+   compatible = ti,am33xx-pwmss;
+   reg = 0x48304000 0x10;
+   ti,hwmods = epwmss2;
+   #address-cells = 1;
+   #size-cells = 1;
+   status = disabled;
+   ranges = 0x48304100 0x48304100 0x80   /* ECAP */
+ 0x48304180 0x48304180 0x80   /* EQEP */
+ 0x48304200 0x48304200 0x80; /* EHRPWM */
+
+   ecap2: ecap@48304100 {
+   compatible = ti,am33xx-ecap;
+   #pwm-cells = 3;
+   reg = 0x48304100 0x80;
+   ti,hwmods = ecap2;
+   status = disabled;
+   };
+
+   ehrpwm2: ehrpwm@48304200 {
+   compatible = ti,am33xx-ehrpwm;
+   #pwm-cells = 3;
+   reg = 0x48304200 0x80;
+   ti,hwmods = ehrpwm2;
+   status = disabled;
+   };
+   };
+
mac: ethernet@4a10 {
compatible = ti,cpsw;
ti,hwmods = cpgmac0;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Missing pieces for AM335x PWM / backlight support

2013-06-06 Thread Sebastian Andrzej Siewior
The following changes since commit d683b96b072dc4680fc74964eca77e6a23d1fa6e:

  Linux 3.10-rc4 (2013-06-02 17:11:17 +0900)

are available in the git repository at:

  git://git.breakpoint.cc/bigeasy/linux.git tags/am335x-pwm

for you to fetch changes up to 6b319b16a27463c93ec36e59458448aae3ab94cd:

  ARM: dts: AM33XX: Add PWM backlight DT data to am335x-evmsk (2013-06-06 
14:59:18 +0200)


Collected patches from Philip Avinash to get PWM working on AM335x-evm.
The series includes the TBCLK and device tree entries.


Philip Avinash (4):
  ARM: AM33XX: clk: Add clock node for EHRPWM TBCLK
  ARM: dts: AM33XX: Add PWMSS device tree nodes
  ARM: dts: AM33XX: Add PWM backlight DT data to am335x-evm
  ARM: dts: AM33XX: Add PWM backlight DT data to am335x-evmsk

 arch/arm/boot/dts/am335x-evm.dts  |   23 +
 arch/arm/boot/dts/am335x-evmsk.dts|   23 +
 arch/arm/boot/dts/am33xx.dtsi |   84 +
 arch/arm/mach-omap2/cclock33xx_data.c |   30 
 arch/arm/mach-omap2/control.h |8 
 5 files changed, 168 insertions(+)

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/4] ARM: AM33XX: clk: Add clock node for EHRPWM TBCLK

2013-06-06 Thread Sebastian Andrzej Siewior
From: Philip Avinash avinashphi...@ti.com

EHRPWM module requires explicit clock gating of TBCLK from control
module. Hence add TBCLK clock node in clock tree for EHRPWM modules.

Signed-off-by: Philip Avinash avinashphi...@ti.com
[bigeasy: remove CK_AM33XX]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/mach-omap2/cclock33xx_data.c |   30 ++
 arch/arm/mach-omap2/control.h |8 
 2 files changed, 38 insertions(+)

diff --git a/arch/arm/mach-omap2/cclock33xx_data.c 
b/arch/arm/mach-omap2/cclock33xx_data.c
index af3544c..0346de5 100644
--- a/arch/arm/mach-omap2/cclock33xx_data.c
+++ b/arch/arm/mach-omap2/cclock33xx_data.c
@@ -862,6 +862,33 @@ static struct clk_hw_omap wdt1_fck_hw = {
 
 DEFINE_STRUCT_CLK(wdt1_fck, wdt_ck_parents, gpio_fck_ops);
 
+static const char *pwmss_clk_parents[] = {
+   dpll_per_m2_ck,
+};
+
+static const struct clk_ops ehrpwm_tbclk_ops = {
+   .enable = omap2_dflt_clk_enable,
+   .disable= omap2_dflt_clk_disable,
+};
+
+DEFINE_CLK_OMAP_MUX_GATE(ehrpwm0_tbclk, l4ls_clkdm,
+NULL, NULL, 0,
+AM33XX_CTRL_REGADDR(AM33XX_PWMSS_TBCLK_CLKCTRL),
+AM33XX_PWMSS0_TBCLKEN_SHIFT,
+NULL, pwmss_clk_parents, ehrpwm_tbclk_ops);
+
+DEFINE_CLK_OMAP_MUX_GATE(ehrpwm1_tbclk, l4ls_clkdm,
+NULL, NULL, 0,
+AM33XX_CTRL_REGADDR(AM33XX_PWMSS_TBCLK_CLKCTRL),
+AM33XX_PWMSS1_TBCLKEN_SHIFT,
+NULL, pwmss_clk_parents, ehrpwm_tbclk_ops);
+
+DEFINE_CLK_OMAP_MUX_GATE(ehrpwm2_tbclk, l4ls_clkdm,
+NULL, NULL, 0,
+AM33XX_CTRL_REGADDR(AM33XX_PWMSS_TBCLK_CLKCTRL),
+AM33XX_PWMSS2_TBCLKEN_SHIFT,
+NULL, pwmss_clk_parents, ehrpwm_tbclk_ops);
+
 /*
  * clkdev
  */
@@ -942,6 +969,9 @@ static struct omap_clk am33xx_clks[] = {
CLK(NULL,   clkout2_div_ck,   clkout2_div_ck),
CLK(NULL,   timer_32k_ck, clkdiv32k_ick),
CLK(NULL,   timer_sys_ck, sys_clkin_ck),
+   CLK(48300200.ehrpwm,  tbclk,ehrpwm0_tbclk),
+   CLK(48302200.ehrpwm,  tbclk,ehrpwm1_tbclk),
+   CLK(48304200.ehrpwm,  tbclk,ehrpwm2_tbclk),
 };
 
 
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
index e6c3281..35d17a6 100644
--- a/arch/arm/mach-omap2/control.h
+++ b/arch/arm/mach-omap2/control.h
@@ -358,6 +358,14 @@
 #define AM33XX_CONTROL_STATUS_SYSBOOT1_WIDTH   0x2
 #define AM33XX_CONTROL_STATUS_SYSBOOT1_MASK(0x3  22)
 
+/* AM33XX PWMSS Control register */
+#define AM33XX_PWMSS_TBCLK_CLKCTRL 0x664
+
+/* AM33XX  PWMSS Control bitfields */
+#define AM33XX_PWMSS0_TBCLKEN_SHIFT0
+#define AM33XX_PWMSS1_TBCLKEN_SHIFT1
+#define AM33XX_PWMSS2_TBCLKEN_SHIFT2
+
 /* CONTROL OMAP STATUS register to identify OMAP3 features */
 #define OMAP3_CONTROL_OMAP_STATUS  0x044c
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap

2013-06-11 Thread Sebastian Andrzej Siewior
The MFD part uses regmap without caching and is the only user of the
regmap. The child drivers, that is input(touch) and iio(adc), use direct
reg access.
There is a patch which converts them to use regmap as well but I see no
benefit at all doing this. There is a direct MMIO bus access with no
need to cache values like for I2C or SPI devices. Furthermore, most (if
not all) of the access done by the touch  ADC driver read volatile
register.
Therefore this patch removes regmap part of the driver.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c   |   23 ++-
 include/linux/mfd/ti_am335x_tscadc.h |1 -
 2 files changed, 2 insertions(+), 22 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index e9f3fb5..804e61e 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -19,7 +19,6 @@
 #include linux/err.h
 #include linux/io.h
 #include linux/clk.h
-#include linux/regmap.h
 #include linux/mfd/core.h
 #include linux/pm_runtime.h
 
@@ -29,25 +28,15 @@
 
 static unsigned int tscadc_readl(struct ti_tscadc_dev *tsadc, unsigned int reg)
 {
-   unsigned int val;
-
-   regmap_read(tsadc-regmap_tscadc, reg, val);
-   return val;
+   return readl(tsadc-tscadc_base + reg);
 }
 
 static void tscadc_writel(struct ti_tscadc_dev *tsadc, unsigned int reg,
unsigned int val)
 {
-   regmap_write(tsadc-regmap_tscadc, reg, val);
+   writel(val, tsadc-tscadc_base + reg);
 }
 
-static const struct regmap_config tscadc_regmap_config = {
-   .name = ti_tscadc,
-   .reg_bits = 32,
-   .reg_stride = 4,
-   .val_bits = 32,
-};
-
 static void tscadc_idle_config(struct ti_tscadc_dev *config)
 {
unsigned int idleconfig;
@@ -121,14 +110,6 @@ static int ti_tscadc_probe(struct platform_device 
*pdev)
return -ENOMEM;
}
 
-   tscadc-regmap_tscadc = devm_regmap_init_mmio(pdev-dev,
-   tscadc-tscadc_base, tscadc_regmap_config);
-   if (IS_ERR(tscadc-regmap_tscadc)) {
-   dev_err(pdev-dev, regmap init failed\n);
-   err = PTR_ERR(tscadc-regmap_tscadc);
-   goto ret;
-   }
-
pm_runtime_enable(pdev-dev);
pm_runtime_get_sync(pdev-dev);
 
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index c79ad5d..dc75c34 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -137,7 +137,6 @@ struct mfd_tscadc_board {
 
 struct ti_tscadc_dev {
struct device *dev;
-   struct regmap *regmap_tscadc;
void __iomem *tscadc_base;
int irq;
struct mfd_cell cells[TSCADC_CELLS];
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 06/22] input/ti_am33x_tsc: Add DT support

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Add DT support for client touchscreen driver

[ pa...@antoniou-consulting.com : use of_get_child_by_name
instead of of_find_node_by_name ]

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
[ bigeasy: shift the code to the left, shirnk titsc_parse_dt() by not
   using temp value, change a binding and document them in
   ti-tsc-adc.txt which also contains ADC binding which will be
   used later, addd DT binding to mfd driver so we our DT node
   without of_get_child_by_name(), rename steps_to_configure to
   coordinate_readouts because this is what it really does,
   don't overrire err after calling  titsc_parse_dt() or
   titsc_parse_pdata()]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 .../bindings/input/touchscreen/ti-tsc-adc.txt  |   44 
 drivers/input/touchscreen/ti_am335x_tsc.c  |  105 +++-
 drivers/mfd/ti_am335x_tscadc.c |1 +
 3 files changed, 127 insertions(+), 23 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt

diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt 
b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
new file mode 100644
index 000..491c97b
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
@@ -0,0 +1,44 @@
+* TI - TSC ADC (Touschscreen and analog digital converter)
+~~
+
+Required properties:
+- child tsc
+   ti,wires: Wires refer to application modes i.e. 4/5/8 wire touchscreen
+ support on the platform.
+   ti,x-plate-resistance: X plate resistance
+   ti,coordiante-readouts: The sequencer supports a total of 16
+   programmable steps each step is used to
+   read a single coordinate. A single
+readout is enough but multiple reads can
+   increase the quality.
+   A value of 5 means, 5 reads for X, 5 for
+   Y and 2 for Z (always). This utilises 12
+   of the 16 software steps available. The
+   remaining 4 can be used by the ADC.
+   ti,wire-config: Different boards could have a different order for
+   connecting wires on touchscreen. We need to provide an
+   8 bit number where in the 1st four bits represent the
+   analog lines and the next 4 bits represent positive/
+   negative terminal on that input line. Notations to
+   represent the input lines and terminals resoectively
+   is as follows:
+   AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+   XP  = 0, XN = 1, YP = 2, YN = 3.
+- child adc
+   ti,adc-channels: List of analog inputs available for ADC.
+AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+
+Example:
+   tscadc: tscadc@44e0d000 {
+   compatible = ti,am3359-tscadc;
+   tsc {
+   ti,wires = 4;
+   ti,x-plate-resistance = 200;
+   ti,coordiante-readouts = 5;
+   ti,wire-config = 0x00 0x11 0x22 0x33;
+   };
+
+   adc {
+   ti,adc-channels = 4 5 6 7;
+   };
+   }
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index b2f8a46..a44d2c4 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -26,6 +26,8 @@
 #include linux/io.h
 #include linux/input/ti_am335x_tsc.h
 #include linux/delay.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 
@@ -47,7 +49,7 @@ struct titsc {
unsigned intwires;
unsigned intx_plate_resistance;
boolpen_down;
-   int steps_to_configure;
+   int coordinate_readouts;
u32 config_inp[4];
u32 bit_xp, bit_xn, bit_yp, bit_yn;
u32 inp_xp, inp_xn, inp_yp, inp_yn;
@@ -123,7 +125,7 @@ static void titsc_step_config(struct titsc *ts_dev)
int i, total_steps;
 
/* Configure the Step registers */
-   total_steps = 2 * ts_dev-steps_to_configure;
+   total_steps = 2 * ts_dev-coordinate_readouts;
 
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_xp;
@@ -141,7 +143,7 @@ static void titsc_step_config

[PATCH 08/22] iio/ti_am335x_adc: Add DT support

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Add DT support for client ADC driver.

[ pa...@antoniou-consulting.com : use of_get_child_by_name
instead of of_find_node_by_name ]

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: shift the code to the left, fix clean up on
  of_get_child_by_name() failer, provide OF binding in mfd, use
  own of node, get rid of of_get_child_by_name()]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |   29 -
 drivers/mfd/ti_am335x_tscadc.c  |1 +
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 543b9c4..b24402c 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -22,6 +22,8 @@
 #include linux/platform_device.h
 #include linux/io.h
 #include linux/iio/iio.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 #include linux/platform_data/ti_am335x_adc.h
@@ -152,11 +154,12 @@ static int tiadc_probe(struct platform_device *pdev)
struct iio_dev  *indio_dev;
struct tiadc_device *adc_dev;
struct ti_tscadc_dev*tscadc_dev = ti_tscadc_dev_get(pdev);
-   struct mfd_tscadc_board *pdata;
+   struct mfd_tscadc_board *pdata = tscadc_dev-dev-platform_data;
+   struct device_node  *node = pdev-dev.of_node;
int err;
+   u32 val32;
 
-   pdata = tscadc_dev-dev-platform_data;
-   if (!pdata || !pdata-adc_init) {
+   if (!pdata  !node) {
dev_err(pdev-dev, Could not find platform data\n);
return -EINVAL;
}
@@ -169,8 +172,17 @@ static int tiadc_probe(struct platform_device *pdev)
}
adc_dev = iio_priv(indio_dev);
 
-   adc_dev-mfd_tscadc = tscadc_dev;
-   adc_dev-channels = pdata-adc_init-adc_channels;
+   adc_dev-mfd_tscadc = ti_tscadc_dev_get(pdev);
+
+   if (pdata)
+   adc_dev-channels = pdata-adc_init-adc_channels;
+   else {
+   err = of_property_read_u32(node,
+   ti,adc-channels, val32);
+   if (err  0)
+   goto err_free_device;
+   adc_dev-channels = val32;
+   }
 
indio_dev-dev.parent = pdev-dev;
indio_dev-name = dev_name(pdev-dev);
@@ -260,11 +272,18 @@ static const struct dev_pm_ops tiadc_pm_ops = {
 #define TIADC_PM_OPS NULL
 #endif
 
+static const struct of_device_id ti_adc_dt_ids[] = {
+   { .compatible = ti,am3359-adc, },
+   { }
+};
+MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);
+
 static struct platform_driver tiadc_driver = {
.driver = {
.name   = tiadc,
.owner  = THIS_MODULE,
.pm = TIADC_PM_OPS,
+   .of_match_table = of_match_ptr(ti_adc_dt_ids),
},
.probe  = tiadc_probe,
.remove = tiadc_remove,
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 15a01f6..eaaa253 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -191,6 +191,7 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
/* ADC Cell */
cell = tscadc-cells[ADC_CELL];
cell-name = tiadc;
+   cell-of_compatible = ti,am3359-adc;
cell-platform_data = tscadc;
cell-pdata_size = sizeof(tscadc);
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 07/22] input/ti_am33x_tsc: remove platform_data support

2013-06-11 Thread Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.

Acked-by: Dmitry Torokhov dmitry.torok...@gmail.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |   25 +
 1 file changed, 1 insertion(+), 24 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index a44d2c4..66c5a26 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -24,7 +24,6 @@
 #include linux/clk.h
 #include linux/platform_device.h
 #include linux/io.h
-#include linux/input/ti_am335x_tsc.h
 #include linux/delay.h
 #include linux/of.h
 #include linux/of_device.h
@@ -347,24 +346,6 @@ static int titsc_parse_dt(struct platform_device *pdev,
ts_dev-config_inp, ARRAY_SIZE(ts_dev-config_inp));
 }
 
-static int titsc_parse_pdata(struct ti_tscadc_dev *tscadc_dev,
-   struct titsc *ts_dev)
-{
-   struct mfd_tscadc_board *pdata = tscadc_dev-dev-platform_data;
-
-   if (!pdata)
-   return -EINVAL;
-
-   ts_dev-wires = pdata-tsc_init-wires;
-   ts_dev-x_plate_resistance =
-   pdata-tsc_init-x_plate_resistance;
-   ts_dev-steps_to_configure =
-   pdata-tsc_init-steps_to_configure;
-   memcpy(ts_dev-config_inp, pdata-tsc_init-wire_config,
-   sizeof(pdata-tsc_init-wire_config));
-   return 0;
-}
-
 /*
  * The functions for inserting/removing driver as a module.
  */
@@ -390,11 +371,7 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev-input = input_dev;
ts_dev-irq = tscadc_dev-irq;
 
-   if (tscadc_dev-dev-platform_data)
-   err = titsc_parse_pdata(tscadc_dev, ts_dev);
-   else
-   err = titsc_parse_dt(pdev, ts_dev);
-
+   err = titsc_parse_dt(pdev, ts_dev);
if (err) {
dev_err(pdev-dev, Could not find valid DT data.\n);
goto err_free_mem;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 09/22] iio/ti_am335x_adc: remove platform_data support

2013-06-11 Thread Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |   21 +++--
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index b24402c..2868c0c 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -26,7 +26,6 @@
 #include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
-#include linux/platform_data/ti_am335x_adc.h
 
 struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
@@ -153,14 +152,12 @@ static int tiadc_probe(struct platform_device *pdev)
 {
struct iio_dev  *indio_dev;
struct tiadc_device *adc_dev;
-   struct ti_tscadc_dev*tscadc_dev = ti_tscadc_dev_get(pdev);
-   struct mfd_tscadc_board *pdata = tscadc_dev-dev-platform_data;
struct device_node  *node = pdev-dev.of_node;
int err;
u32 val32;
 
-   if (!pdata  !node) {
-   dev_err(pdev-dev, Could not find platform data\n);
+   if (!node) {
+   dev_err(pdev-dev, Could not find valid DT data.\n);
return -EINVAL;
}
 
@@ -174,15 +171,11 @@ static int tiadc_probe(struct platform_device *pdev)
 
adc_dev-mfd_tscadc = ti_tscadc_dev_get(pdev);
 
-   if (pdata)
-   adc_dev-channels = pdata-adc_init-adc_channels;
-   else {
-   err = of_property_read_u32(node,
-   ti,adc-channels, val32);
-   if (err  0)
-   goto err_free_device;
-   adc_dev-channels = val32;
-   }
+   err = of_property_read_u32(node,
+   ti,adc-channels, val32);
+   if (err  0)
+   goto err_free_device;
+   adc_dev-channels = val32;
 
indio_dev-dev.parent = pdev-dev;
indio_dev-name = dev_name(pdev-dev);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 05/22] input/ti_am33x_tsc: remove unwanted fifo flush

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

When touchscreen and ADC are used together, this
unwanted fifo flush leads to loss of ADC data.

Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |   10 --
 1 file changed, 10 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 56c6220..b2f8a46 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -252,8 +252,6 @@ static irqreturn_t titsc_irq(int irq, void *dev)
unsigned int x = 0, y = 0;
unsigned int z1, z2, z;
unsigned int fsm;
-   unsigned int fifo1count, fifo0count;
-   int i;
 
status = titsc_readl(ts_dev, REG_IRQSTATUS);
if (status  IRQENB_FIFO0THRES) {
@@ -262,14 +260,6 @@ static irqreturn_t titsc_irq(int irq, void *dev)
z1 = titsc_readl(ts_dev, REG_FIFO0)  0xfff;
z2 = titsc_readl(ts_dev, REG_FIFO1)  0xfff;
 
-   fifo1count = titsc_readl(ts_dev, REG_FIFO1CNT);
-   for (i = 0; i  fifo1count; i++)
-   titsc_readl(ts_dev, REG_FIFO1);
-
-   fifo0count = titsc_readl(ts_dev, REG_FIFO0CNT);
-   for (i = 0; i  fifo0count; i++)
-   titsc_readl(ts_dev, REG_FIFO0);
-
if (ts_dev-pen_down  z1 != 0  z2 != 0) {
/*
 * Calculate pressure using formula
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 02/22] mfd input iio/ti_am335x_adc: use one structure for ti_tscadc_dev

2013-06-11 Thread Sebastian Andrzej Siewior
The mfd driver creates platform data for the child devices and it is the
ti_tscadc_dev struct. This struct is copied for the two devices.
The copy of the structure makes a common lock in this structure a little
less usefull. Therefore the platform data is not a pointer to the
structure and the same structure is used.
While doing the change I noticed that the suspend/resume code assumes
the wrong pointer for ti_tscadc_dev and this has been fixed as well.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c   |5 +++--
 drivers/input/touchscreen/ti_am335x_tsc.c |   16 +---
 drivers/mfd/ti_am335x_tscadc.c|8 
 include/linux/mfd/ti_am335x_tscadc.h  |7 +++
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 5f9a7e7..9db352e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -140,7 +140,7 @@ static int tiadc_probe(struct platform_device *pdev)
 {
struct iio_dev  *indio_dev;
struct tiadc_device *adc_dev;
-   struct ti_tscadc_dev*tscadc_dev = pdev-dev.platform_data;
+   struct ti_tscadc_dev*tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
 
@@ -205,9 +205,10 @@ static int tiadc_suspend(struct device *dev)
 {
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct tiadc_device *adc_dev = iio_priv(indio_dev);
-   struct ti_tscadc_dev *tscadc_dev = dev-platform_data;
+   struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
 
+   tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (!device_may_wakeup(tscadc_dev-dev)) {
idle = tiadc_readl(adc_dev, REG_CTRL);
idle = ~(CNTRLREG_TSCSSENB);
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 51e7b87..16077d3 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -262,7 +262,7 @@ static int titsc_probe(struct platform_device *pdev)
 {
struct titsc *ts_dev;
struct input_dev *input_dev;
-   struct ti_tscadc_dev *tscadc_dev = pdev-dev.platform_data;
+   struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
 
@@ -329,8 +329,8 @@ static int titsc_probe(struct platform_device *pdev)
 
 static int titsc_remove(struct platform_device *pdev)
 {
-   struct ti_tscadc_dev *tscadc_dev = pdev-dev.platform_data;
-   struct titsc *ts_dev = tscadc_dev-tsc;
+   struct titsc *ts_dev = platform_get_drvdata(pdev);
+   u32 steps;
 
free_irq(ts_dev-irq, ts_dev);
 
@@ -344,10 +344,11 @@ static int titsc_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM
 static int titsc_suspend(struct device *dev)
 {
-   struct ti_tscadc_dev *tscadc_dev = dev-platform_data;
-   struct titsc *ts_dev = tscadc_dev-tsc;
+   struct titsc *ts_dev = dev_get_drvdata(dev);
+   struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
 
+   tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev-dev)) {
idle = titsc_readl(ts_dev, REG_IRQENABLE);
titsc_writel(ts_dev, REG_IRQENABLE,
@@ -359,9 +360,10 @@ static int titsc_suspend(struct device *dev)
 
 static int titsc_resume(struct device *dev)
 {
-   struct ti_tscadc_dev *tscadc_dev = dev-platform_data;
-   struct titsc *ts_dev = tscadc_dev-tsc;
+   struct titsc *ts_dev = dev_get_drvdata(dev);
+   struct ti_tscadc_dev *tscadc_dev;
 
+   tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev-dev)) {
titsc_writel(ts_dev, REG_IRQWAKEUP,
0x00);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 804e61e..490b2bd 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -157,14 +157,14 @@ staticint ti_tscadc_probe(struct platform_device 
*pdev)
/* TSC Cell */
cell = tscadc-cells[TSC_CELL];
cell-name = tsc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(*tscadc);
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
 
/* ADC Cell */
cell = tscadc-cells[ADC_CELL];
cell-name = tiadc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(*tscadc);
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
 
err = mfd_add_devices(pdev-dev, pdev-id, tscadc-cells,
TSCADC_CELLS, NULL, 0, NULL);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index dc75c34..5e430fe 100644
--- a/include/linux

[PATCH 04/22] input/ti_am33x_tsc: Order of TSC wires, made configurable

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

The current driver expected touchscreen input
wires(XP,XN,YP,YN) to be connected in a particular order.
Making changes to accept this as platform data.

Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: larger rework of the patch, no config[4][4] array, smaller
  sized config_inp, no regbit_map(), shrinked
  titsc_config_wires(), no config redo on resume, config_inp and
  friends are now u32]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |  102 -
 include/linux/input/ti_am335x_tsc.h   |   12 
 include/linux/mfd/ti_am335x_tscadc.h  |   10 ++-
 3 files changed, 105 insertions(+), 19 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 23d6a4d..56c6220 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -33,6 +33,13 @@
 #define SEQ_SETTLE 275
 #define MAX_12BIT  ((1  12) - 1)
 
+static const int config_pins[] = {
+   XPP,
+   XNN,
+   YPP,
+   YNN,
+};
+
 struct titsc {
struct input_dev*input;
struct ti_tscadc_dev*mfd_tscadc;
@@ -41,6 +48,9 @@ struct titsc {
unsigned intx_plate_resistance;
boolpen_down;
int steps_to_configure;
+   u32 config_inp[4];
+   u32 bit_xp, bit_xn, bit_yp, bit_yn;
+   u32 inp_xp, inp_xn, inp_yp, inp_yn;
 };
 
 static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -54,6 +64,58 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
writel(val, tsc-mfd_tscadc-tscadc_base + reg);
 }
 
+static int titsc_config_wires(struct titsc *ts_dev)
+{
+   u32 analog_line[4];
+   u32 wire_order[4];
+   int i, bit_cfg;
+
+   for (i = 0; i  4; i++) {
+   /*
+* Get the order in which TSC wires are attached
+* w.r.t. each of the analog input lines on the EVM.
+*/
+   analog_line[i] = (ts_dev-config_inp[i]  0xF0)  4;
+   wire_order[i] = ts_dev-config_inp[i]  0x0F;
+   if (WARN_ON(analog_line[i]  7))
+   return -EINVAL;
+   if (WARN_ON(wire_order[i]  ARRAY_SIZE(config_pins)))
+   return -EINVAL;
+   }
+
+   for (i = 0; i  4; i++) {
+   int an_line;
+   int wi_order;
+
+   an_line = analog_line[i];
+   wi_order = wire_order[i];
+   bit_cfg = config_pins[wi_order];
+   if (bit_cfg == 0)
+   return -EINVAL;
+   switch (wi_order) {
+   case 0:
+   ts_dev-bit_xp = bit_cfg;
+   ts_dev-inp_xp = an_line;
+   break;
+
+   case 1:
+   ts_dev-bit_xn = bit_cfg;
+   ts_dev-inp_xn = an_line;
+   break;
+
+   case 2:
+   ts_dev-bit_yp = bit_cfg;
+   ts_dev-inp_yp = an_line;
+   break;
+   case 3:
+   ts_dev-bit_yn = bit_cfg;
+   ts_dev-inp_yn = an_line;
+   break;
+   }
+   }
+   return 0;
+}
+
 static void titsc_step_config(struct titsc *ts_dev)
 {
unsigned intconfig;
@@ -64,18 +126,18 @@ static void titsc_step_config(struct titsc *ts_dev)
total_steps = 2 * ts_dev-steps_to_configure;
 
config = STEPCONFIG_MODE_HWSYNC |
-   STEPCONFIG_AVG_16 | STEPCONFIG_XPP;
+   STEPCONFIG_AVG_16 | ts_dev-bit_xp;
switch (ts_dev-wires) {
case 4:
-   config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+   config |= STEPCONFIG_INP(ts_dev-inp_yp) | ts_dev-bit_xn;
break;
case 5:
-   config |= STEPCONFIG_YNN |
-   STEPCONFIG_INP_AN4 | STEPCONFIG_XNN |
-   STEPCONFIG_YPP;
+   config |= ts_dev-bit_yn |
+   STEPCONFIG_INP_AN4 | ts_dev-bit_xn |
+   ts_dev-bit_yp;
break;
case 8:
-   config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+   config |= STEPCONFIG_INP(ts_dev-inp_yp) | ts_dev-bit_xn;
break;
}
 
@@ -86,18 +148,18 @@ static void titsc_step_config(struct titsc *ts_dev)
 
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
-   STEPCONFIG_AVG_16 | STEPCONFIG_YNN |
+   STEPCONFIG_AVG_16 | ts_dev-bit_yn

[PATCH 03/22] input/ti_am33x_tsc: Step enable bits made configurable

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Current code has hard coded value written to
step enable bits. Now the bits are updated based
on how many steps are needed to be configured got
from platform data.

The user needs to take care not to exceed
the count more than 16. While using ADC and TSC
one should take care to set this parameter correctly.

Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: add lock, move to MFD, use in TSC  ADC]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c   |   20 ++--
 drivers/input/touchscreen/ti_am335x_tsc.c |   12 ++--
 drivers/mfd/ti_am335x_tscadc.c|   29 -
 include/linux/mfd/ti_am335x_tscadc.h  |8 ++--
 4 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 9db352e..543b9c4 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -42,10 +42,20 @@ static void tiadc_writel(struct tiadc_device *adc, unsigned 
int reg,
writel(val, adc-mfd_tscadc-tscadc_base + reg);
 }
 
+static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
+{
+   u32 step_en;
+
+   step_en = ((1  adc_dev-channels) - 1);
+   step_en = TOTAL_STEPS - adc_dev-channels + 1;
+   return step_en;
+}
+
 static void tiadc_step_config(struct tiadc_device *adc_dev)
 {
unsigned int stepconfig;
int i, channels = 0, steps;
+   u32 step_en;
 
/*
 * There are 16 configurable steps and 8 analog input
@@ -69,7 +79,8 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
STEPCONFIG_OPENDLY);
channels++;
}
-   tiadc_writel(adc_dev, REG_SE, STPENB_STEPENB);
+   step_en = get_adc_step_mask(adc_dev);
+   am335x_tsc_se_set(adc_dev-mfd_tscadc, step_en);
 }
 
 static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
@@ -127,7 +138,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
if (i == chan-channel)
*val = readx1  0xfff;
}
-   tiadc_writel(adc_dev, REG_SE, STPENB_STEPENB);
+   am335x_tsc_se_update(adc_dev-mfd_tscadc);
 
return IIO_VAL_INT;
 }
@@ -191,10 +202,15 @@ static int tiadc_probe(struct platform_device *pdev)
 static int tiadc_remove(struct platform_device *pdev)
 {
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
+   struct tiadc_device *adc_dev = iio_priv(indio_dev);
+   u32 step_en;
 
iio_device_unregister(indio_dev);
tiadc_channels_remove(indio_dev);
 
+   step_en = get_adc_step_mask(adc_dev);
+   am335x_tsc_se_clr(adc_dev-mfd_tscadc, step_en);
+
iio_device_free(indio_dev);
 
return 0;
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 16077d3..23d6a4d 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -57,6 +57,7 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
 static void titsc_step_config(struct titsc *ts_dev)
 {
unsigned intconfig;
+   unsigned intstepenable = 0;
int i, total_steps;
 
/* Configure the Step registers */
@@ -128,7 +129,9 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
STEPCONFIG_OPENDLY);
 
-   titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC);
+   /* The steps1 … end and bit 0 for TS_Charge */
+   stepenable = (1  (total_steps + 2)) - 1;
+   am335x_tsc_se_set(ts_dev-mfd_tscadc, stepenable);
 }
 
 static void titsc_read_coordinates(struct titsc *ts_dev,
@@ -250,7 +253,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
 
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
 
-   titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC);
+   am335x_tsc_se_update(ts_dev-mfd_tscadc);
return IRQ_HANDLED;
 }
 
@@ -334,6 +337,11 @@ static int titsc_remove(struct platform_device *pdev)
 
free_irq(ts_dev-irq, ts_dev);
 
+   /* total steps followed by the enable mask */
+   steps = 2 * ts_dev-steps_to_configure + 2;
+   steps = (1  steps) - 1;
+   am335x_tsc_se_clr(ts_dev-mfd_tscadc, steps);
+
input_unregister_device(ts_dev-input);
 
platform_set_drvdata(pdev, NULL);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 490b2bd..7b091c4 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -37,6 +37,32 @@ static void tscadc_writel(struct ti_tscadc_dev *tsadc, 
unsigned int reg,
writel(val, tsadc-tscadc_base + reg);
 }
 
+void am335x_tsc_se_update(struct ti_tscadc_dev *tsadc)
+{
+   tscadc_writel(tsadc, REG_SE, tsadc-reg_se_cache);
+}
+EXPORT_SYMBOL_GPL

am335x: TSC ADC reworking including DT pieces, take 4

2013-06-11 Thread Sebastian Andrzej Siewior
I believe the whole thing should go via the MFD tree. It touches also
input  iio subsystem. I collected ACKs where I got some in the meantime.

I added Lee Jones because I hear no sign of life from Samuel.

The following changes since commit d683b96b072dc4680fc74964eca77e6a23d1fa6e:

  Linux 3.10-rc4 (2013-06-02 17:11:17 +0900)

are available in the git repository at:

  git://breakpoint.cc/bigeasy/linux tags/am335x_tsc-adc

for you to fetch changes up to fe12425dd7e93db2dfdfa4eb9289036100cb0338:

  iio/ti_am335x_adc: check if we found the value (2013-06-11 13:11:35 +0200)


A complete refurbished series inclunding:
- DT support for the MFD, TSC and ADC driver  platform device support,
  which has no users, has been killed.
- iio_map from last series is gone and replaced by proper nodes in the
  device tree.
- suspend fixes which means correct data structs are taken and no
  interrupt storm
- fifo split which should problem with TSC  ADC beeing used at the same
  time
- The ADC channels are now checked before blindly applied. That means the
  touch part reads X, Y and Z coordinates and does not mix them up. Same
  goes for the IIO ADC driver.
- The IIO ADC driver now creates files named in_voltageX_raw where X
  represents the ADC line instead of a number starting at 0. A read from
  this file can return -EBUSY in case touch is busy and the ADC didn't
  collect a value.


Pantelis Antoniou (2):
  iio/ti_tscadc: provide datasheet_name and scan_type
  mfd/ti_tscadc: deal with partial activation

Patil, Rachna (7):
  input/ti_am33x_tsc: Step enable bits made configurable
  input/ti_am33x_tsc: Order of TSC wires, made configurable
  input/ti_am33x_tsc: remove unwanted fifo flush
  input/ti_am33x_tsc: Add DT support
  iio/ti_am335x_adc: Add DT support
  mfd/ti_am335x_tscadc: Add DT support
  arm/am33xx: add TSC/ADC mfd device support

Sebastian Andrzej Siewior (13):
  mfd/ti_am335x_tscadc: remove regmap
  mfd  input  iio/ti_am335x_adc: use one structure for ti_tscadc_dev
  input/ti_am33x_tsc: remove platform_data support
  iio/ti_am335x_adc: remove platform_data support
  mfd/ti_am335x_tscadc: remove platform_data support
  input  mfd: ti_am335x_tsc remove remaining platform data pieces
  mfd  input/ti_am335x_tsc: rename device from tsc to TI-am335x-tsc
  mfd  iio/ti_am335x_adc: rename device from tiadc to TI-am335x-adc
  input/ti_am335x_adc: use only FIFO0 and clean up a little
  input/ti_am335x_tsc: ACK the HW_PEN irq in ISR
  input/ti_am335x_tsc: return IRQ_NONE if there was no IRQ for us
  iio/ti_am335x_adc: Allow to specify input line
  iio/ti_am335x_adc: check if we found the value

 .../bindings/input/touchscreen/ti-tsc-adc.txt  |   44 +++
 arch/arm/boot/dts/am335x-evm.dts   |   14 +
 arch/arm/boot/dts/am33xx.dtsi  |   18 ++
 drivers/iio/adc/ti_am335x_adc.c|  132 ++---
 drivers/input/touchscreen/ti_am335x_tsc.c  |  288 ++--
 drivers/mfd/ti_am335x_tscadc.c |  133 ++---
 include/linux/input/ti_am335x_tsc.h|   23 --
 include/linux/mfd/ti_am335x_tscadc.h   |   43 +--
 include/linux/platform_data/ti_am335x_adc.h|   14 -
 9 files changed, 494 insertions(+), 215 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
 delete mode 100644 include/linux/input/ti_am335x_tsc.h
 delete mode 100644 include/linux/platform_data/ti_am335x_adc.h

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 22/22] iio/ti_am335x_adc: check if we found the value

2013-06-11 Thread Sebastian Andrzej Siewior
Usually we get all the values we wanted but it is possible, that te ADC
unit is busy performing the conversation for the HW events. In that case
-EBUSY is returned and the user may re-call the function.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 8ffe52d..4427e8e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -145,6 +145,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
int i;
unsigned int fifo1count, read;
u32 step = UINT_MAX;
+   bool found = false;
 
/*
 * When the sub-system is first enabled,
@@ -169,11 +170,14 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
for (i = 0; i  fifo1count; i++) {
read = tiadc_readl(adc_dev, REG_FIFO1);
-   if (read  16 == step)
+   if (read  16 == step) {
*val = read  0xfff;
+   found = true;
+   }
}
am335x_tsc_se_update(adc_dev-mfd_tscadc);
-
+   if (found == false)
+   return -EBUSY;
return IIO_VAL_INT;
 }
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 17/22] mfd iio/ti_am335x_adc: rename device from tiadc to TI-am335x-adc

2013-06-11 Thread Sebastian Andrzej Siewior
TI-adc reads a little better compared to tiadc. And if we add am335x to
it then we have the same naming scheme as the tsc side.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |3 +--
 drivers/mfd/ti_am335x_tscadc.c  |2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 9939810..4bec91e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -292,7 +292,7 @@ MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);
 
 static struct platform_driver tiadc_driver = {
.driver = {
-   .name   = tiadc,
+   .name   = TI-am335x-adc,
.owner  = THIS_MODULE,
.pm = TIADC_PM_OPS,
.of_match_table = of_match_ptr(ti_adc_dt_ids),
@@ -300,7 +300,6 @@ static struct platform_driver tiadc_driver = {
.probe  = tiadc_probe,
.remove = tiadc_remove,
 };
-
 module_platform_driver(tiadc_driver);
 
 MODULE_DESCRIPTION(TI ADC controller driver);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index bf33134..d3f48d2 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -204,7 +204,7 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
if (adc_channels  0) {
tscadc-adc_cell = tscadc-used_cells;
cell = tscadc-cells[tscadc-used_cells++];
-   cell-name = tiadc;
+   cell-name = TI-am335x-adc;
cell-of_compatible = ti,am3359-adc;
cell-platform_data = tscadc;
cell-pdata_size = sizeof(tscadc);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 14/22] arm/am33xx: add TSC/ADC mfd device support

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Add support for core multifunctional device along
with its clients touchscreen and ADC.

[ pa...@antoniou-consulting.com : make sure status is
set to 'disabled' in dtsi file. ]

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: add 'status = okay']
Signed-off-by: Sebastian Andrzej Siewior sebast...@breakpoint.cc
---
 arch/arm/boot/dts/am335x-evm.dts |   14 ++
 arch/arm/boot/dts/am33xx.dtsi|   18 ++
 2 files changed, 32 insertions(+)

diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 0423298..26fea97 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -244,3 +244,17 @@
 cpsw_emac1 {
phy_id = davinci_mdio, 1;
 };
+
+tscadc {
+   status = okay;
+   tsc {
+   ti,wires = 4;
+   ti,x-plate-resistance = 200;
+   ti,coordiante-readouts = 5;
+   ti,wire-config = 0x00 0x11 0x22 0x33;
+   };
+
+   adc {
+   ti,adc-channels = 4;
+   };
+};
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 1460d9b..4ad7797 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -404,6 +404,24 @@
ti,hwmods = wkup_m3;
};
 
+   tscadc: tscadc@44e0d000 {
+   compatible = ti,am3359-tscadc;
+   reg = 0x44e0d000 0x1000;
+   interrupt-parent = intc;
+   interrupts = 16;
+   ti,hwmods = adc_tsc;
+   status = disabled;
+
+   tsc {
+   compatible = ti,am3359-tsc;
+   };
+   am335x_adc: adc {
+   #io-channel-cells = 1;
+   compatible = ti,am3359-adc;
+   };
+
+   };
+
gpmc: gpmc@5000 {
compatible = ti,am3352-gpmc;
ti,hwmods = gpmc;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 11/22] mfd/ti_am335x_tscadc: remove platform_data support

2013-06-11 Thread Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c |   23 ++-
 1 file changed, 6 insertions(+), 17 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index aae5e55..f9ad26f 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -25,8 +25,6 @@
 #include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
-#include linux/input/ti_am335x_tsc.h
-#include linux/platform_data/ti_am335x_adc.h
 
 static unsigned int tscadc_readl(struct ti_tscadc_dev *tsadc, unsigned int reg)
 {
@@ -80,31 +78,22 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
struct ti_tscadc_dev*tscadc;
struct resource *res;
struct clk  *clk;
-   struct mfd_tscadc_board *pdata = pdev-dev.platform_data;
struct device_node  *node = pdev-dev.of_node;
struct mfd_cell *cell;
int err, ctrl;
int clk_value, clock_rate;
int tsc_wires = 0, adc_channels = 0, total_channels;
 
-   if (!pdata  !pdev-dev.of_node) {
-   dev_err(pdev-dev, Could not find platform data\n);
+   if (!pdev-dev.of_node) {
+   dev_err(pdev-dev, Could not find valid DT data.\n);
return -EINVAL;
}
 
-   if (pdev-dev.platform_data) {
-   if (pdata-tsc_init)
-   tsc_wires = pdata-tsc_init-wires;
+   node = of_get_child_by_name(pdev-dev.of_node, tsc);
+   of_property_read_u32(node, ti,wires, tsc_wires);
 
-   if (pdata-adc_init)
-   adc_channels = pdata-adc_init-adc_channels;
-   } else {
-   node = of_get_child_by_name(pdev-dev.of_node, tsc);
-   of_property_read_u32(node, ti,wires, tsc_wires);
-
-   node = of_get_child_by_name(pdev-dev.of_node, adc);
-   of_property_read_u32(node, ti,adc-channels, adc_channels);
-   }
+   node = of_get_child_by_name(pdev-dev.of_node, adc);
+   of_property_read_u32(node, ti,adc-channels, adc_channels);
 
total_channels = tsc_wires + adc_channels;
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 12/22] iio/ti_tscadc: provide datasheet_name and scan_type

2013-06-11 Thread Sebastian Andrzej Siewior
From: Pantelis Antoniou pa...@antoniou-consulting.com

This patch provides the members datasheet_name and scan_type. This is
the remaining part of the earlier patch where I (bigeasy) removed iio_map
because it is now supplied by the device tree.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: use static AIN[0-8] names, use kcalloc(), removed iio_map,
patch description]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |   29 -
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 2868c0c..9939810 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -24,6 +24,8 @@
 #include linux/iio/iio.h
 #include linux/of.h
 #include linux/of_device.h
+#include linux/iio/machine.h
+#include linux/iio/driver.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 
@@ -84,29 +86,46 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
am335x_tsc_se_set(adc_dev-mfd_tscadc, step_en);
 }
 
+static const char * const chan_name_ain[] = {
+   AIN0,
+   AIN1,
+   AIN2,
+   AIN3,
+   AIN4,
+   AIN5,
+   AIN6,
+   AIN7,
+};
+
 static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
 {
+   struct tiadc_device *adc_dev = iio_priv(indio_dev);
struct iio_chan_spec *chan_array;
+   struct iio_chan_spec *chan;
int i;
 
indio_dev-num_channels = channels;
-   chan_array = kcalloc(indio_dev-num_channels,
+   chan_array = kcalloc(channels,
sizeof(struct iio_chan_spec), GFP_KERNEL);
-
if (chan_array == NULL)
return -ENOMEM;
 
-   for (i = 0; i  (indio_dev-num_channels); i++) {
-   struct iio_chan_spec *chan = chan_array + i;
+   chan = chan_array;
+   for (i = 0; i  channels; i++, chan++) {
+
chan-type = IIO_VOLTAGE;
chan-indexed = 1;
chan-channel = i;
chan-info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
+   chan-datasheet_name = chan_name_ain[i];
+   chan-scan_type.sign = 'u';
+   chan-scan_type.realbits = 12;
+   chan-scan_type.storagebits = 32;
}
 
indio_dev-channels = chan_array;
 
-   return indio_dev-num_channels;
+   return 0;
 }
 
 static void tiadc_channels_remove(struct iio_dev *indio_dev)
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 13/22] mfd/ti_tscadc: deal with partial activation

2013-06-11 Thread Sebastian Andrzej Siewior
From: Pantelis Antoniou pa...@antoniou-consulting.com

Fix the mfd device in the case where a subdevice might not be activated.

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: split out this chunk from the orignal patch, check for neither
  ADC nor TSC channels]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c   |   38 ++
 include/linux/mfd/ti_am335x_tscadc.h |8 +++
 2 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index f9ad26f..74e4694 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -96,11 +96,14 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
of_property_read_u32(node, ti,adc-channels, adc_channels);
 
total_channels = tsc_wires + adc_channels;
-
if (total_channels  8) {
dev_err(pdev-dev, Number of i/p channels more than 8\n);
return -EINVAL;
}
+   if (total_channels == 0) {
+   dev_err(pdev-dev, Need atleast one channel.\n);
+   return -EINVAL;
+   }
 
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
@@ -183,28 +186,37 @@ staticint ti_tscadc_probe(struct platform_device 
*pdev)
ctrl |= CNTRLREG_TSCSSENB;
tscadc_writel(tscadc, REG_CTRL, ctrl);
 
+   tscadc-used_cells = 0;
+   tscadc-tsc_cell = -1;
+   tscadc-adc_cell = -1;
+
/* TSC Cell */
-   cell = tscadc-cells[TSC_CELL];
-   cell-name = tsc;
-   cell-of_compatible = ti,am3359-tsc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(tscadc);
+   if (tsc_wires  0) {
+   tscadc-tsc_cell = tscadc-used_cells;
+   cell = tscadc-cells[tscadc-used_cells++];
+   cell-name = tsc;
+   cell-of_compatible = ti,am3359-tsc;
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
+   }
 
/* ADC Cell */
-   cell = tscadc-cells[ADC_CELL];
-   cell-name = tiadc;
-   cell-of_compatible = ti,am3359-adc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(tscadc);
+   if (adc_channels  0) {
+   tscadc-adc_cell = tscadc-used_cells;
+   cell = tscadc-cells[tscadc-used_cells++];
+   cell-name = tiadc;
+   cell-of_compatible = ti,am3359-adc;
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
+   }
 
err = mfd_add_devices(pdev-dev, pdev-id, tscadc-cells,
-   TSCADC_CELLS, NULL, 0, NULL);
+   tscadc-used_cells, NULL, 0, NULL);
if (err  0)
goto err_disable_clk;
 
device_init_wakeup(pdev-dev, true);
platform_set_drvdata(pdev, tscadc);
-
return 0;
 
 err_disable_clk:
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index 2d78af8..b6e7ac6 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -127,11 +127,6 @@
 
 #define TSCADC_CELLS   2
 
-enum tscadc_cells {
-   TSC_CELL,
-   ADC_CELL,
-};
-
 struct mfd_tscadc_board {
struct tsc_data *tsc_init;
struct adc_data *adc_init;
@@ -141,6 +136,9 @@ struct ti_tscadc_dev {
struct device *dev;
void __iomem *tscadc_base;
int irq;
+   int used_cells; /* 1-2 */
+   int tsc_cell;   /* -1 if not used */
+   int adc_cell;   /* -1 if not used */
struct mfd_cell cells[TSCADC_CELLS];
u32 reg_se_cache;
spinlock_t reg_lock;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 20/22] input/ti_am335x_tsc: return IRQ_NONE if there was no IRQ for us

2013-06-11 Thread Sebastian Andrzej Siewior
The previous patch (input/ti_am335x_tsc: ACK the HW_PEN irq in ISR)
acked the interrupt so we don't freeze if we don't handle an enabled
interrupt source. The interrupt core has a mechanism for this and to get
it work one should only say that it handled an interrupt if it is
actually the case.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |   10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 84859da..6327169 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -314,10 +314,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
}
 
-   titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
-
-   am335x_tsc_se_update(ts_dev-mfd_tscadc);
-   return IRQ_HANDLED;
+   if (irqclr) {
+   titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
+   am335x_tsc_se_update(ts_dev-mfd_tscadc);
+   return IRQ_HANDLED;
+   }
+   return IRQ_NONE;
 }
 
 static int titsc_parse_dt(struct platform_device *pdev,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 10/22] mfd/ti_am335x_tscadc: Add DT support

2013-06-11 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Make changes to add DT support in the MFD core driver.

[ pa...@antoniou-consulting.com : use of_get_child_by_name
instead of of_find_node_by_name ]

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
[bigeasy: module alias, rename to ti,am3359-tscadc as it was tested on
  AM3359]
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c |   32 ++--
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index eaaa253..aae5e55 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -21,6 +21,8 @@
 #include linux/clk.h
 #include linux/mfd/core.h
 #include linux/pm_runtime.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 #include linux/input/ti_am335x_tsc.h
@@ -79,20 +81,31 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
struct resource *res;
struct clk  *clk;
struct mfd_tscadc_board *pdata = pdev-dev.platform_data;
+   struct device_node  *node = pdev-dev.of_node;
struct mfd_cell *cell;
int err, ctrl;
int clk_value, clock_rate;
-   int tsc_wires, adc_channels = 0, total_channels;
+   int tsc_wires = 0, adc_channels = 0, total_channels;
 
-   if (!pdata) {
+   if (!pdata  !pdev-dev.of_node) {
dev_err(pdev-dev, Could not find platform data\n);
return -EINVAL;
}
 
-   if (pdata-adc_init)
-   adc_channels = pdata-adc_init-adc_channels;
+   if (pdev-dev.platform_data) {
+   if (pdata-tsc_init)
+   tsc_wires = pdata-tsc_init-wires;
+
+   if (pdata-adc_init)
+   adc_channels = pdata-adc_init-adc_channels;
+   } else {
+   node = of_get_child_by_name(pdev-dev.of_node, tsc);
+   of_property_read_u32(node, ti,wires, tsc_wires);
+
+   node = of_get_child_by_name(pdev-dev.of_node, adc);
+   of_property_read_u32(node, ti,adc-channels, adc_channels);
+   }
 
-   tsc_wires = pdata-tsc_init-wires;
total_channels = tsc_wires + adc_channels;
 
if (total_channels  8) {
@@ -266,11 +279,18 @@ static const struct dev_pm_ops tscadc_pm_ops = {
 #define TSCADC_PM_OPS NULL
 #endif
 
+static const struct of_device_id ti_tscadc_dt_ids[] = {
+   { .compatible = ti,am3359-tscadc, },
+   { }
+};
+MODULE_DEVICE_TABLE(of, ti_tscadc_dt_ids);
+
 static struct platform_driver ti_tscadc_driver = {
.driver = {
-   .name   = ti_tscadc,
+   .name   = ti_am3359-tscadc,
.owner  = THIS_MODULE,
.pm = TSCADC_PM_OPS,
+   .of_match_table = of_match_ptr(ti_tscadc_dt_ids),
},
.probe  = ti_tscadc_probe,
.remove = ti_tscadc_remove,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 21/22] iio/ti_am335x_adc: Allow to specify input line

2013-06-11 Thread Sebastian Andrzej Siewior
The TSC part allows to specify the input lines. The IIO part assumes
that it usues always the last few, that means if IIO has adc-channels
set to 2 it will use channel 6 and 7. However it might make sense to use
only 6.
This patch changes the device property (which was introduced recently
and was never in an official release) in a way that the user can specify
which of the AIN lines should be used. In Addition to this, the name is
now AINx where x is the channel number i.e. for AIN6 we would have 6.
Prior this, it always started counting at 0 which is confusing. In
addition to this, it also checks for correct step number during reading
and does not rely on proper FIFO depth.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am335x-evm.dts |2 +-
 drivers/iio/adc/ti_am335x_adc.c  |   57 +-
 drivers/mfd/ti_am335x_tscadc.c   |   20 +++--
 3 files changed, 56 insertions(+), 23 deletions(-)

diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 26fea97..0fa4c7f 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -255,6 +255,6 @@
};
 
adc {
-   ti,adc-channels = 4;
+   ti,adc-channels = 4 5 6 7;
};
 };
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 307a7c0..8ffe52d 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -32,6 +32,8 @@
 struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
int channels;
+   u8 channel_line[8];
+   u8 channel_step[8];
 };
 
 static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
@@ -57,7 +59,7 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
 static void tiadc_step_config(struct tiadc_device *adc_dev)
 {
unsigned int stepconfig;
-   int i, channels = 0, steps;
+   int i, steps;
u32 step_en;
 
/*
@@ -71,16 +73,18 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
 */
 
steps = TOTAL_STEPS - adc_dev-channels;
-   channels = TOTAL_CHANNELS - adc_dev-channels;
-
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
-   for (i = steps; i  TOTAL_STEPS; i++) {
-   tiadc_writel(adc_dev, REG_STEPCONFIG(i),
-   stepconfig | STEPCONFIG_INP(channels));
-   tiadc_writel(adc_dev, REG_STEPDELAY(i),
+   for (i = 0; i  adc_dev-channels; i++) {
+   int chan;
+
+   chan = adc_dev-channel_line[i];
+   tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
+   stepconfig | STEPCONFIG_INP(chan));
+   tiadc_writel(adc_dev, REG_STEPDELAY(steps),
STEPCONFIG_OPENDLY);
-   channels++;
+   adc_dev-channel_step[i] = steps;
+   steps++;
}
step_en = get_adc_step_mask(adc_dev);
am335x_tsc_se_set(adc_dev-mfd_tscadc, step_en);
@@ -115,9 +119,9 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, 
int channels)
 
chan-type = IIO_VOLTAGE;
chan-indexed = 1;
-   chan-channel = i;
+   chan-channel = adc_dev-channel_line[i];
chan-info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
-   chan-datasheet_name = chan_name_ain[i];
+   chan-datasheet_name = chan_name_ain[chan-channel];
chan-scan_type.sign = 'u';
chan-scan_type.realbits = 12;
chan-scan_type.storagebits = 32;
@@ -139,7 +143,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
 {
struct tiadc_device *adc_dev = iio_priv(indio_dev);
int i;
-   unsigned int fifo1count, readx1;
+   unsigned int fifo1count, read;
+   u32 step = UINT_MAX;
 
/*
 * When the sub-system is first enabled,
@@ -152,11 +157,20 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
 * Hence we need to flush out this data.
 */
 
+   for (i = 0; i  ARRAY_SIZE(adc_dev-channel_step); i++) {
+   if (chan-channel == adc_dev-channel_line[i]) {
+   step = adc_dev-channel_step[i];
+   break;
+   }
+   }
+   if (WARN_ON_ONCE(step == UINT_MAX))
+   return -EINVAL;
+
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
for (i = 0; i  fifo1count; i++) {
-   readx1 = tiadc_readl(adc_dev, REG_FIFO1);
-   if (i == chan-channel)
-   *val = readx1  0xfff;
+   read = tiadc_readl(adc_dev, REG_FIFO1);
+   if (read  16 == step)
+   *val = read  0xfff;
}
am335x_tsc_se_update(adc_dev-mfd_tscadc);
 
@@ -172,8 +186,11 @@ static int tiadc_probe(struct

[PATCH 18/22] input/ti_am335x_adc: use only FIFO0 and clean up a little

2013-06-11 Thread Sebastian Andrzej Siewior
The driver programs a threshold of coordinate_readouts say 5. The
REG_FIFO0THR registers says it should it be programmed to threshold
minus one. The driver does not expect just 5 coordinates but 5 * 2 + 2.
Multiplied by two because 5 for X and 5 for Y and plus 2 because we have
two Z.
The whole thing kind of works because It reads the 5 coordinates for X
and Y from FIFO0 and FIFO1 and the last element in each FIFO is ignored
within the loop and read later.
Nothing guaranties that FIFO1 is ready by the time it is read. In fact I
could see that that FIFO1 reaturns for Y channels 8,9, 10, 12, 6 and for
Y channel 7 for Z. The problem is that channel 7 and channel 12 got
somehow mixed up.
The other Problem is that FIFO1 is also used by the IIO part leading to
wrong results if both (tsc  adc) are used.

The patch tries to clean up the whole thing a little:
- Remove the +1 and -1 in REG_STEPCONFIG, REG_STEPDELAY and its counter
  part in the for loop. This is just confusing.

- Use only FIFO0 in TSC. The fifo has space for 64 entries so should be
  fine.

- Read the whole FIFO in one function and check the channel.

- in case we dawdle around, make sure we only read a multiple of our
  coordinate set. On the second interrupt we will cleanup the remaining
  enties.

Acked-by: Dmitry Torokhov dmitry.torok...@gmail.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c   |2 +-
 drivers/input/touchscreen/ti_am335x_tsc.c |   78 +++--
 include/linux/mfd/ti_am335x_tscadc.h  |4 +-
 3 files changed, 44 insertions(+), 40 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 4bec91e..307a7c0 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -75,7 +75,7 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
 
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
-   for (i = (steps + 1); i = TOTAL_STEPS; i++) {
+   for (i = steps; i  TOTAL_STEPS; i++) {
tiadc_writel(adc_dev, REG_STEPCONFIG(i),
stepconfig | STEPCONFIG_INP(channels));
tiadc_writel(adc_dev, REG_STEPDELAY(i),
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index d6643cb..29febe9 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -120,11 +120,9 @@ static int titsc_config_wires(struct titsc *ts_dev)
 static void titsc_step_config(struct titsc *ts_dev)
 {
unsigned intconfig;
-   unsigned intstepenable = 0;
-   int i, total_steps;
-
-   /* Configure the Step registers */
-   total_steps = 2 * ts_dev-coordinate_readouts;
+   int i;
+   int end_step;
+   u32 stepenable;
 
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_xp;
@@ -142,7 +140,9 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
 
-   for (i = 1; i = ts_dev-coordinate_readouts; i++) {
+   /* 1 … coordinate_readouts is for X */
+   end_step = ts_dev-coordinate_readouts;
+   for (i = 0; i  end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -150,7 +150,7 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_yn |
-   STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
+   STEPCONFIG_INM_ADCREFM;
switch (ts_dev-wires) {
case 4:
config |= ts_dev-bit_yp | STEPCONFIG_INP(ts_dev-inp_xp);
@@ -164,12 +164,13 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
 
-   for (i = (ts_dev-coordinate_readouts + 1); i = total_steps; i++) {
+   /* coordinate_readouts … coordinate_readouts * 2 is for Y */
+   end_step = ts_dev-coordinate_readouts * 2;
+   for (i = ts_dev-coordinate_readouts; i  end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
 
-   config = 0;
/* Charge step configuration */
config = ts_dev-bit_xp | ts_dev-bit_yn |
STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
@@ -178,35 +179,39 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
 
-   config = 0;
-   /* Configure to calculate pressure */
+   /* coordinate_readouts * 2 … coordinate_readouts * 2 + 2 is for Z */
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_yp

[PATCH 15/22] input mfd: ti_am335x_tsc remove remaining platform data pieces

2013-06-11 Thread Sebastian Andrzej Siewior
The two header files removed here are unused and have no users as this
platform was never used with platform devices.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 include/linux/input/ti_am335x_tsc.h |   35 ---
 include/linux/mfd/ti_am335x_tscadc.h|5 
 include/linux/platform_data/ti_am335x_adc.h |   14 ---
 3 files changed, 54 deletions(-)
 delete mode 100644 include/linux/input/ti_am335x_tsc.h
 delete mode 100644 include/linux/platform_data/ti_am335x_adc.h

diff --git a/include/linux/input/ti_am335x_tsc.h 
b/include/linux/input/ti_am335x_tsc.h
deleted file mode 100644
index 6a66b4d..000
--- a/include/linux/input/ti_am335x_tsc.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __LINUX_TI_AM335X_TSC_H
-#define __LINUX_TI_AM335X_TSC_H
-
-/**
- * struct tsc_data Touchscreen wire configuration
- * @wires: Wires refer to application modes
- * i.e. 4/5/8 wire touchscreen support
- * on the platform.
- * @x_plate_resistance:X plate resistance.
- * @steps_to_configure:The sequencer supports a total of
- * 16 programmable steps.
- * A step configured to read a single
- * co-ordinate value, can be applied
- * more number of times for better results.
- * @wire_config:   Different EVM's could have a different order
- * for connecting wires on touchscreen.
- * We need to provide an 8 bit number where in
- * the 1st four bits represent the analog lines
- * and the next 4 bits represent positive/
- * negative terminal on that input line.
- * Notations to represent the input lines and
- * terminals resoectively is as follows:
- * AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
- * XP  = 0, XN = 1, YP = 2, YN = 3.
- *
- */
-
-struct tsc_data {
-   int wires;
-   int x_plate_resistance;
-   int steps_to_configure;
-   int wire_config[10];
-};
-
-#endif
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index b6e7ac6..cd8686b 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -127,11 +127,6 @@
 
 #define TSCADC_CELLS   2
 
-struct mfd_tscadc_board {
-   struct tsc_data *tsc_init;
-   struct adc_data *adc_init;
-};
-
 struct ti_tscadc_dev {
struct device *dev;
void __iomem *tscadc_base;
diff --git a/include/linux/platform_data/ti_am335x_adc.h 
b/include/linux/platform_data/ti_am335x_adc.h
deleted file mode 100644
index e41d583..000
--- a/include/linux/platform_data/ti_am335x_adc.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __LINUX_TI_AM335X_ADC_H
-#define __LINUX_TI_AM335X_ADC_H
-
-/**
- * struct adc_data ADC Input information
- * @adc_channels:  Number of analog inputs
- * available for ADC.
- */
-
-struct adc_data {
-   unsigned int adc_channels;
-};
-
-#endif
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 19/22] input/ti_am335x_tsc: ACK the HW_PEN irq in ISR

2013-06-11 Thread Sebastian Andrzej Siewior
The interrupt source IRQENB_HW_PEN is enabled in suspend and suposed to
be used as a wake up source. Once this interrupt source is unmaksed, the
devices ends up in ISR and never continues.
This change ACKs the interrupt and disables it so the system does not
freeze.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 29febe9..84859da 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -308,6 +308,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
irqclr |= IRQENB_PENUP;
}
 
+   if (status  IRQENB_HW_PEN) {
+
+   titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
+   titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
+   }
+
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
 
am335x_tsc_se_update(ts_dev-mfd_tscadc);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 16/22] mfd input/ti_am335x_tsc: rename device from tsc to TI-am335x-tsc

2013-06-11 Thread Sebastian Andrzej Siewior
tsc is a very generic name. This patch adds a TI and HW prefix to it
less generic.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |2 +-
 drivers/mfd/ti_am335x_tscadc.c|2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 66c5a26..d6643cb 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -491,7 +491,7 @@ static struct platform_driver ti_tsc_driver = {
.probe  = titsc_probe,
.remove = titsc_remove,
.driver = {
-   .name   = tsc,
+   .name   = TI-am335x-tsc,
.owner  = THIS_MODULE,
.pm = TITSC_PM_OPS,
.of_match_table = of_match_ptr(ti_tsc_dt_ids),
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 74e4694..bf33134 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -194,7 +194,7 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
if (tsc_wires  0) {
tscadc-tsc_cell = tscadc-used_cells;
cell = tscadc-cells[tscadc-used_cells++];
-   cell-name = tsc;
+   cell-name = TI-am335x-tsc;
cell-of_compatible = ti,am3359-tsc;
cell-platform_data = tscadc;
cell-pdata_size = sizeof(tscadc);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap

2013-06-11 Thread Sebastian Andrzej Siewior
On 06/11/2013 04:23 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 Therefore this patch removes regmap part of the driver.
 NAK. Using regmap is better than open coding your register accesses, and
 the children not using this API is not a reason for the MFD driver to do
 the same.

There is no advantage over using regmap in the first place. It goes
through a few layers, uses no caching because almost all registers are
volatile and this is a direct bus. In the end it complicates more than
it helps.

 
 Cheers,
 Samuel.
 

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 04/22] input/ti_am33x_tsc: Order of TSC wires, made configurable

2013-06-11 Thread Sebastian Andrzej Siewior
On 06/11/2013 04:23 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 On Tue, Jun 11, 2013 at 01:30:50PM +0200, Sebastian Andrzej Siewior wrote:
 diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
 b/include/linux/mfd/ti_am335x_tscadc.h
 index eeead15..2d78af8 100644
 --- a/include/linux/mfd/ti_am335x_tscadc.h
 +++ b/include/linux/mfd/ti_am335x_tscadc.h
 @@ -116,6 +113,13 @@
  #define CNTRLREG_8WIRE  CNTRLREG_AFE_CTRL(3)
  #define CNTRLREG_TSCENB BIT(7)
  
 +#define XPP STEPCONFIG_XPP
 +#define XNP STEPCONFIG_XNP
 +#define XNN STEPCONFIG_XNN
 +#define YPP STEPCONFIG_YPP
 +#define YPN STEPCONFIG_YPN
 +#define YNN STEPCONFIG_YNN
 What is that for ? Isn't STEPCONFIG_XPP explicit enough ?

Yeah :P It was added by the original author of the patch, I have no
problem getting rid of it.

 
 Cheers,
 Samuel.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 10/22] mfd/ti_am335x_tscadc: Add DT support

2013-06-11 Thread Sebastian Andrzej Siewior
On 06/11/2013 04:23 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 On Tue, Jun 11, 2013 at 01:30:56PM +0200, Sebastian Andrzej Siewior wrote:
 From: Patil, Rachna rac...@ti.com

 Make changes to add DT support in the MFD core driver.
 Which changes ?

So rewrite the commit log…

 [ pa...@antoniou-consulting.com : use of_get_child_by_name
  instead of of_find_node_by_name ]
 I have no idea where that is coming from. Please remove this kind of
 stuff and build a proper commit log instead.
 
 
 Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
 Signed-off-by: Patil, Rachna rac...@ti.com
 Signed-off-by: Felipe Balbi ba...@ti.com
 [bigeasy: module alias, rename to ti,am3359-tscadc as it was tested on
   AM3359]
 I honestly can't tell if this is a change from the last version of your
 patchset or a description of this patch changes in general.
 This is cluttering your commit logs, please remove this as well.

I took the original patch. Every change I made to it because people
asked to merge changes into the patch where the problem occurred I
added it here before my sign-off.

In the end I would like not to post a patch with From: != me and
don't make change which the original author did not do. Also dropping
their authorship isn't nice. What could we agree on?

 Cheers,
 Samuel.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: am335x: TSC ADC reworking including DT pieces, take 4

2013-06-11 Thread Sebastian Andrzej Siewior
On 06/11/2013 04:23 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 On Tue, Jun 11, 2013 at 01:30:46PM +0200, Sebastian Andrzej Siewior wrote:
 I believe the whole thing should go via the MFD tree. It touches also
 input  iio subsystem. I collected ACKs where I got some in the meantime.
 Please fix your commit logs, and your subject lines. It should be e.g.
 mfd: input: ti_am335x_adc: Blablabla
 
 if it's mostly an mfd patch that also touches an input driver.

I usually do subsystem / driver: short description but if you want
the : as delimiter I can do this.

 Then, this is a pretty big patchset, with iio, input and mfd all mixed
 together and it is likely to create merge conflicts.
They somehow depend on each other. Otherwise I would have sent three
series, one per subsystem.

From what I can see from it, and please correct me if I'm
 wrong, the iio and input changes depend on the mfd ones, and not the
 other way around. If that's so, I'm going to ask you to reshuffle your
 patch set and separate the MFD changes from the iio and input ones. I'll
 take the MFD ones and will create an immutable branch for Jonathan and
 Dmitry to pull from and apply the iio and input changes on top of it.
 Merge conflicts should be mostly avoided that way.
 AFAICT, only patch #2 should be kept with input and iio bits mixed
 together with MFD as otherwise this would introduce functional breakage.
 Otherwise, all MFD bits from the other patches could be either separated
 or merged together (e.g. MFD bits from patches #6 and #8, and #16 and
 #17).
 
 Does that sound doable to you ?

The device renaming shouldn't matter since I added DT nodes for the mfd
child devices earlier. But then the of_compatible assignments should
go hand in hand. However if I split this then the driver won't work
but then it does not now as well (because there is no platform_data
provider in tree).

Still. There is #18 which reworks the step addressing and involves
changes in both (iio  input) at the same time.
There is #21. Adding this to the initial DT support patch would be bad
I think because it requires some changes on the iio side which have
nothing to do with DT. Putting the iio changes before DT would require
to make some change to platform-data part which will go away anyway.

So I started collecting ACKs from input and iio to avoid this split. If
you really want the split then I will start doing so…

 Cheers,
 Samuel.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 10/22] mfd/ti_am335x_tscadc: Add DT support

2013-06-11 Thread Sebastian Andrzej Siewior
On 06/11/2013 05:05 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 On Tue, Jun 11, 2013 at 04:42:30PM +0200, Sebastian Andrzej Siewior wrote:
 In the end I would like not to post a patch with From: != me and
 don't make change which the original author did not do. Also dropping
 their authorship isn't nice. What could we agree on?
 You probably don't want to change authorship unless the final patch is
 really far from the original one. In which case you can change it and
 mention the original author name in the commit log.
 If you have only made a few changes on top of the original patch, please
 say so explicitely in the commit log. Don't bother if we're talking
 about small changes or cosmetic ones. But your commit log has to be
 readable and clear.

Commit 06c9494 on of many examples where cosmetic are recorded. But to
make some progress I rewrite the commit log to resolve this and don't
add anything to the sign-off area.

 Cheers,
 Samuel.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: am335x: TSC ADC reworking including DT pieces, take 4

2013-06-11 Thread Sebastian Andrzej Siewior
On 06/11/2013 06:10 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 On Tue, Jun 11, 2013 at 05:29:22PM +0200, Sebastian Andrzej Siewior wrote:
 Then, this is a pretty big patchset, with iio, input and mfd all mixed
 together and it is likely to create merge conflicts.
 They somehow depend on each other. Otherwise I would have sent three
 series, one per subsystem.
 Of course they depend on each other, but the dependency is mostly for
 iio and input to depend on the MFD changes.

Except for the one #18 as mentioned below.

 Still. There is #18 which reworks the step addressing and involves
 changes in both (iio  input) at the same time.
 Would splitting iio and input break anything there ?

Yes. Once the header files is modified without the two .c files the
driver is not working. To fix this I need another patch making sure
input + iio does not the header files and another to user it (once
everything is merged).

 There is #21. Adding this to the initial DT support patch would be bad
 I think because it requires some changes on the iio side which have
 nothing to do with DT. Putting the iio changes before DT would require
 to make some change to platform-data part which will go away anyway.
 Wouldn't it workif you split this one into an MFD+dts file changes and
 another one for the iio changes ?

It would work in general. The first few DT-iio patches wouldn't make
sense but then why not.

 So I started collecting ACKs from input and iio to avoid this split. If
 you really want the split then I will start doing so…
 I think it would be nicer, yes.

Nicer. I see. Please tell me what you think about #1 because I really
would like to drop regmap and then I can start reshuffle the series :)

 
 Cheers,
 Samuel.
 

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: am335x: TSC ADC reworking including DT pieces, take 4

2013-06-12 Thread Sebastian Andrzej Siewior
On 06/11/2013 07:55 PM, Samuel Ortiz wrote:
 Hi Jonathan,

Hi Samuel,

 Sebastian, please address the commit log and cosmetic issues I pointed out,
 keep the regmap code and I'll pull this patchset in.

By keep the regmap code you mean I am allowed to remove the regmap
usage in mfd (keep patch #1) or do you insist on adding its usage in
iio and input?

 Cheers,
 Samuel.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: am335x: TSC ADC reworking including DT pieces, take 4

2013-06-12 Thread Sebastian Andrzej Siewior
On 06/12/2013 03:50 PM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 By keep the regmap code you mean I am allowed to remove the regmap
 usage in mfd (keep patch #1) or do you insist on adding its usage in
 iio and input?
 I insist on keeping it on the MFD driver, i.e. _not_ keeping patch #1.

This forces me redo a few things and most likely adding it to the
iio and input driver to be consistent here.

Could you please give a reason why using the regmap here is a good
thing? I mentioned a few why it is not and why is better to leave it
out.

 Cheers,
 Samuel.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: am335x: TSC ADC reworking including DT pieces, take 4

2013-06-12 Thread Sebastian Andrzej Siewior
On 06/12/2013 04:41 PM, Samuel Ortiz wrote:
 This forces me redo a few things and most likely adding it to the
 iio and input driver to be consistent here.
 I'm not asking for that. The current MFD code uses regmap fine without
 the iio and input using it, I don't see why you would have to add regmap
 support there.

Right. Since no reg-cache is used then this should be fine then.

 Could you please give a reason why using the regmap here is a good
 thing? I mentioned a few why it is not and why is better to leave it
 out.
 Yes, and I'm not convinced obviously. regmap prevents you from open
 coding your MMIO access, and this is the right approach.

I am not convinced that adding another layer of indirection for doing
the same thing is a good approach. Pointer chasing _is_ expensive.
_None_ of the regmap features are used here.
I would understand if I would re-implement register caching or a
wrapper across multiple buses but nothing of this is the case.
The current code even ignores the return value.

So, are we going to convert all drivers to use regmap now?

 Cheers,
 Samuel.
 

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/4] ARM: dts: AM33XX: Add PWMSS device tree nodes

2013-06-12 Thread Sebastian Andrzej Siewior
On 06/06/2013 03:52 PM, Sebastian Andrzej Siewior wrote:
 From: Philip Avinash avinashphi...@ti.com
 
 Add PWMSS device tree nodes in relation with ECAP  EHRPWM DT nodes to
 AM33XX SoC family. Also populates device tree nodes for ECAP  EHRPWM by
 adding necessary properties like pwm-cells, base reg  set disabled as
 status.
 
 Signed-off-by: Philip Avinash avinashphi...@ti.com
 Reviewed-by: Thierry Reding thierry.red...@avionic-design.de
 Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de

Can someone please grab #2 till #4? Paul took just #1 as far as I can
tell.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


am335x: TSC ADC reworking including DT pieces, take 5

2013-06-12 Thread Sebastian Andrzej Siewior
Hi Samuel,

I did the cosmetic changes of the subject line and removed the changes
from within the sob lines in each patch. I dropped the #define XPP
STEPCONFIG_XPP thingy and patch #1 which removed regmap from mfd. Not
that I agree with it, I just do not want to miss the merge window due to
this.

The following changes since commit d683b96b072dc4680fc74964eca77e6a23d1fa6e:

  Linux 3.10-rc4 (2013-06-02 17:11:17 +0900)

are available in the git repository at:

  git://breakpoint.cc/bigeasy/linux tags/am335x_tsc-adc

for you to fetch changes up to 1460c152c53335b5403045d056502eda1204c33a:

  iio: ti_am335x_adc: check if we found the value (2013-06-12 18:50:23 +0200)


A complete refurbished series inclunding:
- DT support for the MFD, TSC and ADC driver  platform device support,
  which has no users, has been killed.
- iio_map from last series is gone and replaced by proper nodes in the
  device tree.
- suspend fixes which means correct data structs are taken and no
  interrupt storm
- fifo split which should problem with TSC  ADC beeing used at the same
  time
- The ADC channels are now checked before blindly applied. That means the
  touch part reads X, Y and Z coordinates and does not mix them up. Same
  goes for the IIO ADC driver.
- The IIO ADC driver now creates files named in_voltageX_raw where X
  represents the ADC line instead of a number starting at 0. A read from
  this file can return -EBUSY in case touch is busy and the ADC didn't
  collect a value.


Pantelis Antoniou (2):
  iio: ti_tscadc: provide datasheet_name and scan_type
  mfd: ti_tscadc: deal with partial activation

Patil, Rachna (7):
  input: ti_am33x_tsc: Step enable bits made configurable
  input: ti_am33x_tsc: Order of TSC wires, made configurable
  input: ti_am33x_tsc: remove unwanted fifo flush
  input: ti_am33x_tsc: Add DT support
  iio: ti_am335x_adc: Add DT support
  mfd: ti_am335x_tscadc: Add DT support
  arm: am33xx: add TSC/ADC mfd device support

Sebastian Andrzej Siewior (12):
  mfd: input: iio: ti_am335x_adc: use one structure for ti_tscadc_dev
  input: ti_am33x_tsc: remove platform_data support
  iio: ti_am335x_adc: remove platform_data support
  mfd: ti_am335x_tscadc: remove platform_data support
  input: mfd: ti_am335x_tsc remove remaining platform data pieces
  mfd: input: ti_am335x_tsc: rename device from tsc to TI-am335x-tsc
  mfd: iio: ti_am335x_adc: rename device from tiadc to TI-am335x-adc
  input: ti_am335x_adc: use only FIFO0 and clean up a little
  input: ti_am335x_tsc: ACK the HW_PEN irq in ISR
  input: ti_am335x_tsc: return IRQ_NONE if there was no IRQ for us
  iio: ti_am335x_adc: Allow to specify input line
  iio: ti_am335x_adc: check if we found the value

 .../bindings/input/touchscreen/ti-tsc-adc.txt  |   44 +++
 arch/arm/boot/dts/am335x-evm.dts   |   14 +
 arch/arm/boot/dts/am33xx.dtsi  |   18 ++
 drivers/iio/adc/ti_am335x_adc.c|  132 ++---
 drivers/input/touchscreen/ti_am335x_tsc.c  |  288 ++--
 drivers/mfd/ti_am335x_tscadc.c |  112 ++--
 include/linux/input/ti_am335x_tsc.h|   23 --
 include/linux/mfd/ti_am335x_tscadc.h   |   35 +--
 include/linux/platform_data/ti_am335x_adc.h|   14 -
 9 files changed, 486 insertions(+), 194 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
 delete mode 100644 include/linux/input/ti_am335x_tsc.h
 delete mode 100644 include/linux/platform_data/ti_am335x_adc.h

Sebastian

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 08/21] iio: ti_am335x_adc: remove platform_data support

2013-06-12 Thread Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |   21 +++--
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index b24402c..2868c0c 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -26,7 +26,6 @@
 #include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
-#include linux/platform_data/ti_am335x_adc.h
 
 struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
@@ -153,14 +152,12 @@ static int tiadc_probe(struct platform_device *pdev)
 {
struct iio_dev  *indio_dev;
struct tiadc_device *adc_dev;
-   struct ti_tscadc_dev*tscadc_dev = ti_tscadc_dev_get(pdev);
-   struct mfd_tscadc_board *pdata = tscadc_dev-dev-platform_data;
struct device_node  *node = pdev-dev.of_node;
int err;
u32 val32;
 
-   if (!pdata  !node) {
-   dev_err(pdev-dev, Could not find platform data\n);
+   if (!node) {
+   dev_err(pdev-dev, Could not find valid DT data.\n);
return -EINVAL;
}
 
@@ -174,15 +171,11 @@ static int tiadc_probe(struct platform_device *pdev)
 
adc_dev-mfd_tscadc = ti_tscadc_dev_get(pdev);
 
-   if (pdata)
-   adc_dev-channels = pdata-adc_init-adc_channels;
-   else {
-   err = of_property_read_u32(node,
-   ti,adc-channels, val32);
-   if (err  0)
-   goto err_free_device;
-   adc_dev-channels = val32;
-   }
+   err = of_property_read_u32(node,
+   ti,adc-channels, val32);
+   if (err  0)
+   goto err_free_device;
+   adc_dev-channels = val32;
 
indio_dev-dev.parent = pdev-dev;
indio_dev-name = dev_name(pdev-dev);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 06/21] input: ti_am33x_tsc: remove platform_data support

2013-06-12 Thread Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.

Acked-by: Dmitry Torokhov dmitry.torok...@gmail.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |   25 +
 1 file changed, 1 insertion(+), 24 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 449c0fb..a1db55d 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -24,7 +24,6 @@
 #include linux/clk.h
 #include linux/platform_device.h
 #include linux/io.h
-#include linux/input/ti_am335x_tsc.h
 #include linux/delay.h
 #include linux/of.h
 #include linux/of_device.h
@@ -347,24 +346,6 @@ static int titsc_parse_dt(struct platform_device *pdev,
ts_dev-config_inp, ARRAY_SIZE(ts_dev-config_inp));
 }
 
-static int titsc_parse_pdata(struct ti_tscadc_dev *tscadc_dev,
-   struct titsc *ts_dev)
-{
-   struct mfd_tscadc_board *pdata = tscadc_dev-dev-platform_data;
-
-   if (!pdata)
-   return -EINVAL;
-
-   ts_dev-wires = pdata-tsc_init-wires;
-   ts_dev-x_plate_resistance =
-   pdata-tsc_init-x_plate_resistance;
-   ts_dev-steps_to_configure =
-   pdata-tsc_init-steps_to_configure;
-   memcpy(ts_dev-config_inp, pdata-tsc_init-wire_config,
-   sizeof(pdata-tsc_init-wire_config));
-   return 0;
-}
-
 /*
  * The functions for inserting/removing driver as a module.
  */
@@ -390,11 +371,7 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev-input = input_dev;
ts_dev-irq = tscadc_dev-irq;
 
-   if (tscadc_dev-dev-platform_data)
-   err = titsc_parse_pdata(tscadc_dev, ts_dev);
-   else
-   err = titsc_parse_dt(pdev, ts_dev);
-
+   err = titsc_parse_dt(pdev, ts_dev);
if (err) {
dev_err(pdev-dev, Could not find valid DT data.\n);
goto err_free_mem;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 03/21] input: ti_am33x_tsc: Order of TSC wires, made configurable

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

The current driver expected touchscreen input
wires(XP,XN,YP,YN) to be connected in a particular order.
Making changes to accept this as platform data.

Sebastian reworked the original patch and removed a lot of the not
required pieces.

Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |  102 -
 include/linux/input/ti_am335x_tsc.h   |   12 
 include/linux/mfd/ti_am335x_tscadc.h  |3 -
 3 files changed, 98 insertions(+), 19 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 23d6a4d..2bdd66c 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -33,6 +33,13 @@
 #define SEQ_SETTLE 275
 #define MAX_12BIT  ((1  12) - 1)
 
+static const int config_pins[] = {
+   STEPCONFIG_XPP,
+   STEPCONFIG_XNN,
+   STEPCONFIG_YPP,
+   STEPCONFIG_YNN,
+};
+
 struct titsc {
struct input_dev*input;
struct ti_tscadc_dev*mfd_tscadc;
@@ -41,6 +48,9 @@ struct titsc {
unsigned intx_plate_resistance;
boolpen_down;
int steps_to_configure;
+   u32 config_inp[4];
+   u32 bit_xp, bit_xn, bit_yp, bit_yn;
+   u32 inp_xp, inp_xn, inp_yp, inp_yn;
 };
 
 static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -54,6 +64,58 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
writel(val, tsc-mfd_tscadc-tscadc_base + reg);
 }
 
+static int titsc_config_wires(struct titsc *ts_dev)
+{
+   u32 analog_line[4];
+   u32 wire_order[4];
+   int i, bit_cfg;
+
+   for (i = 0; i  4; i++) {
+   /*
+* Get the order in which TSC wires are attached
+* w.r.t. each of the analog input lines on the EVM.
+*/
+   analog_line[i] = (ts_dev-config_inp[i]  0xF0)  4;
+   wire_order[i] = ts_dev-config_inp[i]  0x0F;
+   if (WARN_ON(analog_line[i]  7))
+   return -EINVAL;
+   if (WARN_ON(wire_order[i]  ARRAY_SIZE(config_pins)))
+   return -EINVAL;
+   }
+
+   for (i = 0; i  4; i++) {
+   int an_line;
+   int wi_order;
+
+   an_line = analog_line[i];
+   wi_order = wire_order[i];
+   bit_cfg = config_pins[wi_order];
+   if (bit_cfg == 0)
+   return -EINVAL;
+   switch (wi_order) {
+   case 0:
+   ts_dev-bit_xp = bit_cfg;
+   ts_dev-inp_xp = an_line;
+   break;
+
+   case 1:
+   ts_dev-bit_xn = bit_cfg;
+   ts_dev-inp_xn = an_line;
+   break;
+
+   case 2:
+   ts_dev-bit_yp = bit_cfg;
+   ts_dev-inp_yp = an_line;
+   break;
+   case 3:
+   ts_dev-bit_yn = bit_cfg;
+   ts_dev-inp_yn = an_line;
+   break;
+   }
+   }
+   return 0;
+}
+
 static void titsc_step_config(struct titsc *ts_dev)
 {
unsigned intconfig;
@@ -64,18 +126,18 @@ static void titsc_step_config(struct titsc *ts_dev)
total_steps = 2 * ts_dev-steps_to_configure;
 
config = STEPCONFIG_MODE_HWSYNC |
-   STEPCONFIG_AVG_16 | STEPCONFIG_XPP;
+   STEPCONFIG_AVG_16 | ts_dev-bit_xp;
switch (ts_dev-wires) {
case 4:
-   config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+   config |= STEPCONFIG_INP(ts_dev-inp_yp) | ts_dev-bit_xn;
break;
case 5:
-   config |= STEPCONFIG_YNN |
-   STEPCONFIG_INP_AN4 | STEPCONFIG_XNN |
-   STEPCONFIG_YPP;
+   config |= ts_dev-bit_yn |
+   STEPCONFIG_INP_AN4 | ts_dev-bit_xn |
+   ts_dev-bit_yp;
break;
case 8:
-   config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN;
+   config |= STEPCONFIG_INP(ts_dev-inp_yp) | ts_dev-bit_xn;
break;
}
 
@@ -86,18 +148,18 @@ static void titsc_step_config(struct titsc *ts_dev)
 
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
-   STEPCONFIG_AVG_16 | STEPCONFIG_YNN |
+   STEPCONFIG_AVG_16 | ts_dev-bit_yn |
STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
switch (ts_dev-wires) {
case 4

[PATCH 09/21] mfd: ti_am335x_tscadc: Add DT support

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Add DT support in the MFD core driver. The node name is am3359 because
it was tested on this platform.

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c |   32 ++--
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 1d6c740..292d34e 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -22,6 +22,8 @@
 #include linux/regmap.h
 #include linux/mfd/core.h
 #include linux/pm_runtime.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 #include linux/input/ti_am335x_tsc.h
@@ -90,20 +92,31 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
struct resource *res;
struct clk  *clk;
struct mfd_tscadc_board *pdata = pdev-dev.platform_data;
+   struct device_node  *node = pdev-dev.of_node;
struct mfd_cell *cell;
int err, ctrl;
int clk_value, clock_rate;
-   int tsc_wires, adc_channels = 0, total_channels;
+   int tsc_wires = 0, adc_channels = 0, total_channels;
 
-   if (!pdata) {
+   if (!pdata  !pdev-dev.of_node) {
dev_err(pdev-dev, Could not find platform data\n);
return -EINVAL;
}
 
-   if (pdata-adc_init)
-   adc_channels = pdata-adc_init-adc_channels;
+   if (pdev-dev.platform_data) {
+   if (pdata-tsc_init)
+   tsc_wires = pdata-tsc_init-wires;
+
+   if (pdata-adc_init)
+   adc_channels = pdata-adc_init-adc_channels;
+   } else {
+   node = of_get_child_by_name(pdev-dev.of_node, tsc);
+   of_property_read_u32(node, ti,wires, tsc_wires);
+
+   node = of_get_child_by_name(pdev-dev.of_node, adc);
+   of_property_read_u32(node, ti,adc-channels, adc_channels);
+   }
 
-   tsc_wires = pdata-tsc_init-wires;
total_channels = tsc_wires + adc_channels;
 
if (total_channels  8) {
@@ -285,11 +298,18 @@ static const struct dev_pm_ops tscadc_pm_ops = {
 #define TSCADC_PM_OPS NULL
 #endif
 
+static const struct of_device_id ti_tscadc_dt_ids[] = {
+   { .compatible = ti,am3359-tscadc, },
+   { }
+};
+MODULE_DEVICE_TABLE(of, ti_tscadc_dt_ids);
+
 static struct platform_driver ti_tscadc_driver = {
.driver = {
-   .name   = ti_tscadc,
+   .name   = ti_am3359-tscadc,
.owner  = THIS_MODULE,
.pm = TSCADC_PM_OPS,
+   .of_match_table = of_match_ptr(ti_tscadc_dt_ids),
},
.probe  = ti_tscadc_probe,
.remove = ti_tscadc_remove,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 07/21] iio: ti_am335x_adc: Add DT support

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Add DT support for client ADC driver.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |   29 -
 drivers/mfd/ti_am335x_tscadc.c  |1 +
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 543b9c4..b24402c 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -22,6 +22,8 @@
 #include linux/platform_device.h
 #include linux/io.h
 #include linux/iio/iio.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 #include linux/platform_data/ti_am335x_adc.h
@@ -152,11 +154,12 @@ static int tiadc_probe(struct platform_device *pdev)
struct iio_dev  *indio_dev;
struct tiadc_device *adc_dev;
struct ti_tscadc_dev*tscadc_dev = ti_tscadc_dev_get(pdev);
-   struct mfd_tscadc_board *pdata;
+   struct mfd_tscadc_board *pdata = tscadc_dev-dev-platform_data;
+   struct device_node  *node = pdev-dev.of_node;
int err;
+   u32 val32;
 
-   pdata = tscadc_dev-dev-platform_data;
-   if (!pdata || !pdata-adc_init) {
+   if (!pdata  !node) {
dev_err(pdev-dev, Could not find platform data\n);
return -EINVAL;
}
@@ -169,8 +172,17 @@ static int tiadc_probe(struct platform_device *pdev)
}
adc_dev = iio_priv(indio_dev);
 
-   adc_dev-mfd_tscadc = tscadc_dev;
-   adc_dev-channels = pdata-adc_init-adc_channels;
+   adc_dev-mfd_tscadc = ti_tscadc_dev_get(pdev);
+
+   if (pdata)
+   adc_dev-channels = pdata-adc_init-adc_channels;
+   else {
+   err = of_property_read_u32(node,
+   ti,adc-channels, val32);
+   if (err  0)
+   goto err_free_device;
+   adc_dev-channels = val32;
+   }
 
indio_dev-dev.parent = pdev-dev;
indio_dev-name = dev_name(pdev-dev);
@@ -260,11 +272,18 @@ static const struct dev_pm_ops tiadc_pm_ops = {
 #define TIADC_PM_OPS NULL
 #endif
 
+static const struct of_device_id ti_adc_dt_ids[] = {
+   { .compatible = ti,am3359-adc, },
+   { }
+};
+MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);
+
 static struct platform_driver tiadc_driver = {
.driver = {
.name   = tiadc,
.owner  = THIS_MODULE,
.pm = TIADC_PM_OPS,
+   .of_match_table = of_match_ptr(ti_adc_dt_ids),
},
.probe  = tiadc_probe,
.remove = tiadc_remove,
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index f509766..1d6c740 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -210,6 +210,7 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
/* ADC Cell */
cell = tscadc-cells[ADC_CELL];
cell-name = tiadc;
+   cell-of_compatible = ti,am3359-adc;
cell-platform_data = tscadc;
cell-pdata_size = sizeof(tscadc);
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 01/21] mfd: input: iio: ti_am335x_adc: use one structure for ti_tscadc_dev

2013-06-12 Thread Sebastian Andrzej Siewior
The mfd driver creates platform data for the child devices and it is the
ti_tscadc_dev struct. This struct is copied for the two devices.
The copy of the structure makes a common lock in this structure a little
less usefull. Therefore the platform data is not a pointer to the
structure and the same structure is used.
While doing the change I noticed that the suspend/resume code assumes
the wrong pointer for ti_tscadc_dev and this has been fixed as well.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c   |5 +++--
 drivers/input/touchscreen/ti_am335x_tsc.c |   16 +---
 drivers/mfd/ti_am335x_tscadc.c|8 
 include/linux/mfd/ti_am335x_tscadc.h  |7 +++
 4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 5f9a7e7..9db352e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -140,7 +140,7 @@ static int tiadc_probe(struct platform_device *pdev)
 {
struct iio_dev  *indio_dev;
struct tiadc_device *adc_dev;
-   struct ti_tscadc_dev*tscadc_dev = pdev-dev.platform_data;
+   struct ti_tscadc_dev*tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
 
@@ -205,9 +205,10 @@ static int tiadc_suspend(struct device *dev)
 {
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct tiadc_device *adc_dev = iio_priv(indio_dev);
-   struct ti_tscadc_dev *tscadc_dev = dev-platform_data;
+   struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
 
+   tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (!device_may_wakeup(tscadc_dev-dev)) {
idle = tiadc_readl(adc_dev, REG_CTRL);
idle = ~(CNTRLREG_TSCSSENB);
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 51e7b87..16077d3 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -262,7 +262,7 @@ static int titsc_probe(struct platform_device *pdev)
 {
struct titsc *ts_dev;
struct input_dev *input_dev;
-   struct ti_tscadc_dev *tscadc_dev = pdev-dev.platform_data;
+   struct ti_tscadc_dev *tscadc_dev = ti_tscadc_dev_get(pdev);
struct mfd_tscadc_board *pdata;
int err;
 
@@ -329,8 +329,8 @@ static int titsc_probe(struct platform_device *pdev)
 
 static int titsc_remove(struct platform_device *pdev)
 {
-   struct ti_tscadc_dev *tscadc_dev = pdev-dev.platform_data;
-   struct titsc *ts_dev = tscadc_dev-tsc;
+   struct titsc *ts_dev = platform_get_drvdata(pdev);
+   u32 steps;
 
free_irq(ts_dev-irq, ts_dev);
 
@@ -344,10 +344,11 @@ static int titsc_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM
 static int titsc_suspend(struct device *dev)
 {
-   struct ti_tscadc_dev *tscadc_dev = dev-platform_data;
-   struct titsc *ts_dev = tscadc_dev-tsc;
+   struct titsc *ts_dev = dev_get_drvdata(dev);
+   struct ti_tscadc_dev *tscadc_dev;
unsigned int idle;
 
+   tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev-dev)) {
idle = titsc_readl(ts_dev, REG_IRQENABLE);
titsc_writel(ts_dev, REG_IRQENABLE,
@@ -359,9 +360,10 @@ static int titsc_suspend(struct device *dev)
 
 static int titsc_resume(struct device *dev)
 {
-   struct ti_tscadc_dev *tscadc_dev = dev-platform_data;
-   struct titsc *ts_dev = tscadc_dev-tsc;
+   struct titsc *ts_dev = dev_get_drvdata(dev);
+   struct ti_tscadc_dev *tscadc_dev;
 
+   tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev-dev)) {
titsc_writel(ts_dev, REG_IRQWAKEUP,
0x00);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index e9f3fb5..772ea2a 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -176,14 +176,14 @@ staticint ti_tscadc_probe(struct platform_device 
*pdev)
/* TSC Cell */
cell = tscadc-cells[TSC_CELL];
cell-name = tsc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(*tscadc);
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
 
/* ADC Cell */
cell = tscadc-cells[ADC_CELL];
cell-name = tiadc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(*tscadc);
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
 
err = mfd_add_devices(pdev-dev, pdev-id, tscadc-cells,
TSCADC_CELLS, NULL, 0, NULL);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index c79ad5d..8114e4e 100644
--- a/include/linux

[PATCH 02/21] input: ti_am33x_tsc: Step enable bits made configurable

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Current code has hard coded value written to
step enable bits. Now the bits are updated based
on how many steps are needed to be configured got
from platform data.

The user needs to take care not to exceed
the count more than 16. While using ADC and TSC
one should take care to set this parameter correctly.

Sebastian added the common lock and moved the code, that manipulates the
steps, from into the mfd module.

Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c   |   20 ++--
 drivers/input/touchscreen/ti_am335x_tsc.c |   12 ++--
 drivers/mfd/ti_am335x_tscadc.c|   29 -
 include/linux/mfd/ti_am335x_tscadc.h  |8 ++--
 4 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 9db352e..543b9c4 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -42,10 +42,20 @@ static void tiadc_writel(struct tiadc_device *adc, unsigned 
int reg,
writel(val, adc-mfd_tscadc-tscadc_base + reg);
 }
 
+static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
+{
+   u32 step_en;
+
+   step_en = ((1  adc_dev-channels) - 1);
+   step_en = TOTAL_STEPS - adc_dev-channels + 1;
+   return step_en;
+}
+
 static void tiadc_step_config(struct tiadc_device *adc_dev)
 {
unsigned int stepconfig;
int i, channels = 0, steps;
+   u32 step_en;
 
/*
 * There are 16 configurable steps and 8 analog input
@@ -69,7 +79,8 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
STEPCONFIG_OPENDLY);
channels++;
}
-   tiadc_writel(adc_dev, REG_SE, STPENB_STEPENB);
+   step_en = get_adc_step_mask(adc_dev);
+   am335x_tsc_se_set(adc_dev-mfd_tscadc, step_en);
 }
 
 static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
@@ -127,7 +138,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
if (i == chan-channel)
*val = readx1  0xfff;
}
-   tiadc_writel(adc_dev, REG_SE, STPENB_STEPENB);
+   am335x_tsc_se_update(adc_dev-mfd_tscadc);
 
return IIO_VAL_INT;
 }
@@ -191,10 +202,15 @@ static int tiadc_probe(struct platform_device *pdev)
 static int tiadc_remove(struct platform_device *pdev)
 {
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
+   struct tiadc_device *adc_dev = iio_priv(indio_dev);
+   u32 step_en;
 
iio_device_unregister(indio_dev);
tiadc_channels_remove(indio_dev);
 
+   step_en = get_adc_step_mask(adc_dev);
+   am335x_tsc_se_clr(adc_dev-mfd_tscadc, step_en);
+
iio_device_free(indio_dev);
 
return 0;
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 16077d3..23d6a4d 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -57,6 +57,7 @@ static void titsc_writel(struct titsc *tsc, unsigned int reg,
 static void titsc_step_config(struct titsc *ts_dev)
 {
unsigned intconfig;
+   unsigned intstepenable = 0;
int i, total_steps;
 
/* Configure the Step registers */
@@ -128,7 +129,9 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2),
STEPCONFIG_OPENDLY);
 
-   titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC);
+   /* The steps1 … end and bit 0 for TS_Charge */
+   stepenable = (1  (total_steps + 2)) - 1;
+   am335x_tsc_se_set(ts_dev-mfd_tscadc, stepenable);
 }
 
 static void titsc_read_coordinates(struct titsc *ts_dev,
@@ -250,7 +253,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
 
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
 
-   titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC);
+   am335x_tsc_se_update(ts_dev-mfd_tscadc);
return IRQ_HANDLED;
 }
 
@@ -334,6 +337,11 @@ static int titsc_remove(struct platform_device *pdev)
 
free_irq(ts_dev-irq, ts_dev);
 
+   /* total steps followed by the enable mask */
+   steps = 2 * ts_dev-steps_to_configure + 2;
+   steps = (1  steps) - 1;
+   am335x_tsc_se_clr(ts_dev-mfd_tscadc, steps);
+
input_unregister_device(ts_dev-input);
 
platform_set_drvdata(pdev, NULL);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 772ea2a..90ccfc0 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -48,6 +48,32 @@ static const struct regmap_config tscadc_regmap_config = {
.val_bits = 32,
 };
 
+void am335x_tsc_se_update(struct ti_tscadc_dev *tsadc)
+{
+   tscadc_writel(tsadc, REG_SE, tsadc-reg_se_cache

[PATCH 04/21] input: ti_am33x_tsc: remove unwanted fifo flush

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

When touchscreen and ADC are used together, this
unwanted fifo flush leads to loss of ADC data.

Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |   10 --
 1 file changed, 10 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 2bdd66c..7b7de60 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -252,8 +252,6 @@ static irqreturn_t titsc_irq(int irq, void *dev)
unsigned int x = 0, y = 0;
unsigned int z1, z2, z;
unsigned int fsm;
-   unsigned int fifo1count, fifo0count;
-   int i;
 
status = titsc_readl(ts_dev, REG_IRQSTATUS);
if (status  IRQENB_FIFO0THRES) {
@@ -262,14 +260,6 @@ static irqreturn_t titsc_irq(int irq, void *dev)
z1 = titsc_readl(ts_dev, REG_FIFO0)  0xfff;
z2 = titsc_readl(ts_dev, REG_FIFO1)  0xfff;
 
-   fifo1count = titsc_readl(ts_dev, REG_FIFO1CNT);
-   for (i = 0; i  fifo1count; i++)
-   titsc_readl(ts_dev, REG_FIFO1);
-
-   fifo0count = titsc_readl(ts_dev, REG_FIFO0CNT);
-   for (i = 0; i  fifo0count; i++)
-   titsc_readl(ts_dev, REG_FIFO0);
-
if (ts_dev-pen_down  z1 != 0  z2 != 0) {
/*
 * Calculate pressure using formula
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 05/21] input: ti_am33x_tsc: Add DT support

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

This patch adds DT support to touch driver. It also provides a binding
document which is used by the MFD and IIO part of the device.
This patch also renames steps_to_configure to coordinate_readouts
because the original name misleads the purpose of the variable.

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 .../bindings/input/touchscreen/ti-tsc-adc.txt  |   44 
 drivers/input/touchscreen/ti_am335x_tsc.c  |  105 +++-
 drivers/mfd/ti_am335x_tscadc.c |1 +
 3 files changed, 127 insertions(+), 23 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt

diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt 
b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
new file mode 100644
index 000..491c97b
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt
@@ -0,0 +1,44 @@
+* TI - TSC ADC (Touschscreen and analog digital converter)
+~~
+
+Required properties:
+- child tsc
+   ti,wires: Wires refer to application modes i.e. 4/5/8 wire touchscreen
+ support on the platform.
+   ti,x-plate-resistance: X plate resistance
+   ti,coordiante-readouts: The sequencer supports a total of 16
+   programmable steps each step is used to
+   read a single coordinate. A single
+readout is enough but multiple reads can
+   increase the quality.
+   A value of 5 means, 5 reads for X, 5 for
+   Y and 2 for Z (always). This utilises 12
+   of the 16 software steps available. The
+   remaining 4 can be used by the ADC.
+   ti,wire-config: Different boards could have a different order for
+   connecting wires on touchscreen. We need to provide an
+   8 bit number where in the 1st four bits represent the
+   analog lines and the next 4 bits represent positive/
+   negative terminal on that input line. Notations to
+   represent the input lines and terminals resoectively
+   is as follows:
+   AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+   XP  = 0, XN = 1, YP = 2, YN = 3.
+- child adc
+   ti,adc-channels: List of analog inputs available for ADC.
+AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
+
+Example:
+   tscadc: tscadc@44e0d000 {
+   compatible = ti,am3359-tscadc;
+   tsc {
+   ti,wires = 4;
+   ti,x-plate-resistance = 200;
+   ti,coordiante-readouts = 5;
+   ti,wire-config = 0x00 0x11 0x22 0x33;
+   };
+
+   adc {
+   ti,adc-channels = 4 5 6 7;
+   };
+   }
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 7b7de60..449c0fb 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -26,6 +26,8 @@
 #include linux/io.h
 #include linux/input/ti_am335x_tsc.h
 #include linux/delay.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 
@@ -47,7 +49,7 @@ struct titsc {
unsigned intwires;
unsigned intx_plate_resistance;
boolpen_down;
-   int steps_to_configure;
+   int coordinate_readouts;
u32 config_inp[4];
u32 bit_xp, bit_xn, bit_yp, bit_yn;
u32 inp_xp, inp_xn, inp_yp, inp_yn;
@@ -123,7 +125,7 @@ static void titsc_step_config(struct titsc *ts_dev)
int i, total_steps;
 
/* Configure the Step registers */
-   total_steps = 2 * ts_dev-steps_to_configure;
+   total_steps = 2 * ts_dev-coordinate_readouts;
 
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_xp;
@@ -141,7 +143,7 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
 
-   for (i = 1; i = ts_dev-steps_to_configure; i++) {
+   for (i = 1; i = ts_dev-coordinate_readouts; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -163,7 +165,7 @@ static void titsc_step_config(struct titsc *ts_dev

[PATCH 13/21] arm: am33xx: add TSC/ADC mfd device support

2013-06-12 Thread Sebastian Andrzej Siewior
From: Patil, Rachna rac...@ti.com

Add support for core multifunctional device along
with its clients touchscreen and ADC.

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Patil, Rachna rac...@ti.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior sebast...@breakpoint.cc
---
 arch/arm/boot/dts/am335x-evm.dts |   14 ++
 arch/arm/boot/dts/am33xx.dtsi|   18 ++
 2 files changed, 32 insertions(+)

diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 0423298..26fea97 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -244,3 +244,17 @@
 cpsw_emac1 {
phy_id = davinci_mdio, 1;
 };
+
+tscadc {
+   status = okay;
+   tsc {
+   ti,wires = 4;
+   ti,x-plate-resistance = 200;
+   ti,coordiante-readouts = 5;
+   ti,wire-config = 0x00 0x11 0x22 0x33;
+   };
+
+   adc {
+   ti,adc-channels = 4;
+   };
+};
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 1460d9b..4ad7797 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -404,6 +404,24 @@
ti,hwmods = wkup_m3;
};
 
+   tscadc: tscadc@44e0d000 {
+   compatible = ti,am3359-tscadc;
+   reg = 0x44e0d000 0x1000;
+   interrupt-parent = intc;
+   interrupts = 16;
+   ti,hwmods = adc_tsc;
+   status = disabled;
+
+   tsc {
+   compatible = ti,am3359-tsc;
+   };
+   am335x_adc: adc {
+   #io-channel-cells = 1;
+   compatible = ti,am3359-adc;
+   };
+
+   };
+
gpmc: gpmc@5000 {
compatible = ti,am3352-gpmc;
ti,hwmods = gpmc;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 11/21] iio: ti_tscadc: provide datasheet_name and scan_type

2013-06-12 Thread Sebastian Andrzej Siewior
From: Pantelis Antoniou pa...@antoniou-consulting.com

This patch provides the members datasheet_name and scan_type. This is
the remaining part of the earlier patch where I (bigeasy) removed iio_map
because it is now supplied by the device tree. It also static names as
suggested by Jonathan.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |   29 -
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 2868c0c..9939810 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -24,6 +24,8 @@
 #include linux/iio/iio.h
 #include linux/of.h
 #include linux/of_device.h
+#include linux/iio/machine.h
+#include linux/iio/driver.h
 
 #include linux/mfd/ti_am335x_tscadc.h
 
@@ -84,29 +86,46 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
am335x_tsc_se_set(adc_dev-mfd_tscadc, step_en);
 }
 
+static const char * const chan_name_ain[] = {
+   AIN0,
+   AIN1,
+   AIN2,
+   AIN3,
+   AIN4,
+   AIN5,
+   AIN6,
+   AIN7,
+};
+
 static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
 {
+   struct tiadc_device *adc_dev = iio_priv(indio_dev);
struct iio_chan_spec *chan_array;
+   struct iio_chan_spec *chan;
int i;
 
indio_dev-num_channels = channels;
-   chan_array = kcalloc(indio_dev-num_channels,
+   chan_array = kcalloc(channels,
sizeof(struct iio_chan_spec), GFP_KERNEL);
-
if (chan_array == NULL)
return -ENOMEM;
 
-   for (i = 0; i  (indio_dev-num_channels); i++) {
-   struct iio_chan_spec *chan = chan_array + i;
+   chan = chan_array;
+   for (i = 0; i  channels; i++, chan++) {
+
chan-type = IIO_VOLTAGE;
chan-indexed = 1;
chan-channel = i;
chan-info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
+   chan-datasheet_name = chan_name_ain[i];
+   chan-scan_type.sign = 'u';
+   chan-scan_type.realbits = 12;
+   chan-scan_type.storagebits = 32;
}
 
indio_dev-channels = chan_array;
 
-   return indio_dev-num_channels;
+   return 0;
 }
 
 static void tiadc_channels_remove(struct iio_dev *indio_dev)
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 18/21] input: ti_am335x_tsc: ACK the HW_PEN irq in ISR

2013-06-12 Thread Sebastian Andrzej Siewior
The interrupt source IRQENB_HW_PEN is enabled in suspend and suposed to
be used as a wake up source. Once this interrupt source is unmaksed, the
devices ends up in ISR and never continues.
This change ACKs the interrupt and disables it so the system does not
freeze.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 1bceb25..2ba7703 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -308,6 +308,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
irqclr |= IRQENB_PENUP;
}
 
+   if (status  IRQENB_HW_PEN) {
+
+   titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
+   titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
+   }
+
titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
 
am335x_tsc_se_update(ts_dev-mfd_tscadc);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 12/21] mfd: ti_tscadc: deal with partial activation

2013-06-12 Thread Sebastian Andrzej Siewior
From: Pantelis Antoniou pa...@antoniou-consulting.com

Fix the mfd device in the case where a subdevice might not be activated.

Signed-off-by: Pantelis Antoniou pa...@antoniou-consulting.com
Signed-off-by: Felipe Balbi ba...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c   |   38 ++
 include/linux/mfd/ti_am335x_tscadc.h |8 +++
 2 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index e78b9df..d05fcba 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -107,11 +107,14 @@ staticint ti_tscadc_probe(struct platform_device 
*pdev)
of_property_read_u32(node, ti,adc-channels, adc_channels);
 
total_channels = tsc_wires + adc_channels;
-
if (total_channels  8) {
dev_err(pdev-dev, Number of i/p channels more than 8\n);
return -EINVAL;
}
+   if (total_channels == 0) {
+   dev_err(pdev-dev, Need atleast one channel.\n);
+   return -EINVAL;
+   }
 
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
@@ -202,28 +205,37 @@ staticint ti_tscadc_probe(struct platform_device 
*pdev)
ctrl |= CNTRLREG_TSCSSENB;
tscadc_writel(tscadc, REG_CTRL, ctrl);
 
+   tscadc-used_cells = 0;
+   tscadc-tsc_cell = -1;
+   tscadc-adc_cell = -1;
+
/* TSC Cell */
-   cell = tscadc-cells[TSC_CELL];
-   cell-name = tsc;
-   cell-of_compatible = ti,am3359-tsc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(tscadc);
+   if (tsc_wires  0) {
+   tscadc-tsc_cell = tscadc-used_cells;
+   cell = tscadc-cells[tscadc-used_cells++];
+   cell-name = tsc;
+   cell-of_compatible = ti,am3359-tsc;
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
+   }
 
/* ADC Cell */
-   cell = tscadc-cells[ADC_CELL];
-   cell-name = tiadc;
-   cell-of_compatible = ti,am3359-adc;
-   cell-platform_data = tscadc;
-   cell-pdata_size = sizeof(tscadc);
+   if (adc_channels  0) {
+   tscadc-adc_cell = tscadc-used_cells;
+   cell = tscadc-cells[tscadc-used_cells++];
+   cell-name = tiadc;
+   cell-of_compatible = ti,am3359-adc;
+   cell-platform_data = tscadc;
+   cell-pdata_size = sizeof(tscadc);
+   }
 
err = mfd_add_devices(pdev-dev, pdev-id, tscadc-cells,
-   TSCADC_CELLS, NULL, 0, NULL);
+   tscadc-used_cells, NULL, 0, NULL);
if (err  0)
goto err_disable_clk;
 
device_init_wakeup(pdev-dev, true);
platform_set_drvdata(pdev, tscadc);
-
return 0;
 
 err_disable_clk:
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index e36ae41..fe54ba4 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -120,11 +120,6 @@
 
 #define TSCADC_CELLS   2
 
-enum tscadc_cells {
-   TSC_CELL,
-   ADC_CELL,
-};
-
 struct mfd_tscadc_board {
struct tsc_data *tsc_init;
struct adc_data *adc_init;
@@ -135,6 +130,9 @@ struct ti_tscadc_dev {
struct regmap *regmap_tscadc;
void __iomem *tscadc_base;
int irq;
+   int used_cells; /* 1-2 */
+   int tsc_cell;   /* -1 if not used */
+   int adc_cell;   /* -1 if not used */
struct mfd_cell cells[TSCADC_CELLS];
u32 reg_se_cache;
spinlock_t reg_lock;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 17/21] input: ti_am335x_adc: use only FIFO0 and clean up a little

2013-06-12 Thread Sebastian Andrzej Siewior
The driver programs a threshold of coordinate_readouts say 5. The
REG_FIFO0THR registers says it should it be programmed to threshold
minus one. The driver does not expect just 5 coordinates but 5 * 2 + 2.
Multiplied by two because 5 for X and 5 for Y and plus 2 because we have
two Z.
The whole thing kind of works because It reads the 5 coordinates for X
and Y from FIFO0 and FIFO1 and the last element in each FIFO is ignored
within the loop and read later.
Nothing guaranties that FIFO1 is ready by the time it is read. In fact I
could see that that FIFO1 reaturns for Y channels 8,9, 10, 12, 6 and for
Y channel 7 for Z. The problem is that channel 7 and channel 12 got
somehow mixed up.
The other Problem is that FIFO1 is also used by the IIO part leading to
wrong results if both (tsc  adc) are used.

The patch tries to clean up the whole thing a little:
- Remove the +1 and -1 in REG_STEPCONFIG, REG_STEPDELAY and its counter
  part in the for loop. This is just confusing.

- Use only FIFO0 in TSC. The fifo has space for 64 entries so should be
  fine.

- Read the whole FIFO in one function and check the channel.

- in case we dawdle around, make sure we only read a multiple of our
  coordinate set. On the second interrupt we will cleanup the remaining
  enties.

Acked-by: Dmitry Torokhov dmitry.torok...@gmail.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c   |2 +-
 drivers/input/touchscreen/ti_am335x_tsc.c |   78 +++--
 include/linux/mfd/ti_am335x_tscadc.h  |4 +-
 3 files changed, 44 insertions(+), 40 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 4bec91e..307a7c0 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -75,7 +75,7 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
 
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
-   for (i = (steps + 1); i = TOTAL_STEPS; i++) {
+   for (i = steps; i  TOTAL_STEPS; i++) {
tiadc_writel(adc_dev, REG_STEPCONFIG(i),
stepconfig | STEPCONFIG_INP(channels));
tiadc_writel(adc_dev, REG_STEPDELAY(i),
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index ff3215d..1bceb25 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -120,11 +120,9 @@ static int titsc_config_wires(struct titsc *ts_dev)
 static void titsc_step_config(struct titsc *ts_dev)
 {
unsigned intconfig;
-   unsigned intstepenable = 0;
-   int i, total_steps;
-
-   /* Configure the Step registers */
-   total_steps = 2 * ts_dev-coordinate_readouts;
+   int i;
+   int end_step;
+   u32 stepenable;
 
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_xp;
@@ -142,7 +140,9 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
 
-   for (i = 1; i = ts_dev-coordinate_readouts; i++) {
+   /* 1 … coordinate_readouts is for X */
+   end_step = ts_dev-coordinate_readouts;
+   for (i = 0; i  end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
@@ -150,7 +150,7 @@ static void titsc_step_config(struct titsc *ts_dev)
config = 0;
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_yn |
-   STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1;
+   STEPCONFIG_INM_ADCREFM;
switch (ts_dev-wires) {
case 4:
config |= ts_dev-bit_yp | STEPCONFIG_INP(ts_dev-inp_xp);
@@ -164,12 +164,13 @@ static void titsc_step_config(struct titsc *ts_dev)
break;
}
 
-   for (i = (ts_dev-coordinate_readouts + 1); i = total_steps; i++) {
+   /* coordinate_readouts … coordinate_readouts * 2 is for Y */
+   end_step = ts_dev-coordinate_readouts * 2;
+   for (i = ts_dev-coordinate_readouts; i  end_step; i++) {
titsc_writel(ts_dev, REG_STEPCONFIG(i), config);
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
}
 
-   config = 0;
/* Charge step configuration */
config = ts_dev-bit_xp | ts_dev-bit_yn |
STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR |
@@ -178,35 +179,39 @@ static void titsc_step_config(struct titsc *ts_dev)
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
 
-   config = 0;
-   /* Configure to calculate pressure */
+   /* coordinate_readouts * 2 … coordinate_readouts * 2 + 2 is for Z */
config = STEPCONFIG_MODE_HWSYNC |
STEPCONFIG_AVG_16 | ts_dev-bit_yp

[PATCH 20/21] iio: ti_am335x_adc: Allow to specify input line

2013-06-12 Thread Sebastian Andrzej Siewior
The TSC part allows to specify the input lines. The IIO part assumes
that it usues always the last few, that means if IIO has adc-channels
set to 2 it will use channel 6 and 7. However it might make sense to use
only 6.
This patch changes the device property (which was introduced recently
and was never in an official release) in a way that the user can specify
which of the AIN lines should be used. In Addition to this, the name is
now AINx where x is the channel number i.e. for AIN6 we would have 6.
Prior this, it always started counting at 0 which is confusing. In
addition to this, it also checks for correct step number during reading
and does not rely on proper FIFO depth.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am335x-evm.dts |2 +-
 drivers/iio/adc/ti_am335x_adc.c  |   57 +-
 drivers/mfd/ti_am335x_tscadc.c   |   20 +++--
 3 files changed, 56 insertions(+), 23 deletions(-)

diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 26fea97..0fa4c7f 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -255,6 +255,6 @@
};
 
adc {
-   ti,adc-channels = 4;
+   ti,adc-channels = 4 5 6 7;
};
 };
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 307a7c0..8ffe52d 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -32,6 +32,8 @@
 struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
int channels;
+   u8 channel_line[8];
+   u8 channel_step[8];
 };
 
 static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
@@ -57,7 +59,7 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
 static void tiadc_step_config(struct tiadc_device *adc_dev)
 {
unsigned int stepconfig;
-   int i, channels = 0, steps;
+   int i, steps;
u32 step_en;
 
/*
@@ -71,16 +73,18 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
 */
 
steps = TOTAL_STEPS - adc_dev-channels;
-   channels = TOTAL_CHANNELS - adc_dev-channels;
-
stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
 
-   for (i = steps; i  TOTAL_STEPS; i++) {
-   tiadc_writel(adc_dev, REG_STEPCONFIG(i),
-   stepconfig | STEPCONFIG_INP(channels));
-   tiadc_writel(adc_dev, REG_STEPDELAY(i),
+   for (i = 0; i  adc_dev-channels; i++) {
+   int chan;
+
+   chan = adc_dev-channel_line[i];
+   tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
+   stepconfig | STEPCONFIG_INP(chan));
+   tiadc_writel(adc_dev, REG_STEPDELAY(steps),
STEPCONFIG_OPENDLY);
-   channels++;
+   adc_dev-channel_step[i] = steps;
+   steps++;
}
step_en = get_adc_step_mask(adc_dev);
am335x_tsc_se_set(adc_dev-mfd_tscadc, step_en);
@@ -115,9 +119,9 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, 
int channels)
 
chan-type = IIO_VOLTAGE;
chan-indexed = 1;
-   chan-channel = i;
+   chan-channel = adc_dev-channel_line[i];
chan-info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
-   chan-datasheet_name = chan_name_ain[i];
+   chan-datasheet_name = chan_name_ain[chan-channel];
chan-scan_type.sign = 'u';
chan-scan_type.realbits = 12;
chan-scan_type.storagebits = 32;
@@ -139,7 +143,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
 {
struct tiadc_device *adc_dev = iio_priv(indio_dev);
int i;
-   unsigned int fifo1count, readx1;
+   unsigned int fifo1count, read;
+   u32 step = UINT_MAX;
 
/*
 * When the sub-system is first enabled,
@@ -152,11 +157,20 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
 * Hence we need to flush out this data.
 */
 
+   for (i = 0; i  ARRAY_SIZE(adc_dev-channel_step); i++) {
+   if (chan-channel == adc_dev-channel_line[i]) {
+   step = adc_dev-channel_step[i];
+   break;
+   }
+   }
+   if (WARN_ON_ONCE(step == UINT_MAX))
+   return -EINVAL;
+
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
for (i = 0; i  fifo1count; i++) {
-   readx1 = tiadc_readl(adc_dev, REG_FIFO1);
-   if (i == chan-channel)
-   *val = readx1  0xfff;
+   read = tiadc_readl(adc_dev, REG_FIFO1);
+   if (read  16 == step)
+   *val = read  0xfff;
}
am335x_tsc_se_update(adc_dev-mfd_tscadc);
 
@@ -172,8 +186,11 @@ static int tiadc_probe(struct

[PATCH 16/21] mfd: iio: ti_am335x_adc: rename device from tiadc to TI-am335x-adc

2013-06-12 Thread Sebastian Andrzej Siewior
TI-adc reads a little better compared to tiadc. And if we add am335x to
it then we have the same naming scheme as the tsc side.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |3 +--
 drivers/mfd/ti_am335x_tscadc.c  |2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 9939810..4bec91e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -292,7 +292,7 @@ MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);
 
 static struct platform_driver tiadc_driver = {
.driver = {
-   .name   = tiadc,
+   .name   = TI-am335x-adc,
.owner  = THIS_MODULE,
.pm = TIADC_PM_OPS,
.of_match_table = of_match_ptr(ti_adc_dt_ids),
@@ -300,7 +300,6 @@ static struct platform_driver tiadc_driver = {
.probe  = tiadc_probe,
.remove = tiadc_remove,
 };
-
 module_platform_driver(tiadc_driver);
 
 MODULE_DESCRIPTION(TI ADC controller driver);
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 5fb8b1d..2532339 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -223,7 +223,7 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
if (adc_channels  0) {
tscadc-adc_cell = tscadc-used_cells;
cell = tscadc-cells[tscadc-used_cells++];
-   cell-name = tiadc;
+   cell-name = TI-am335x-adc;
cell-of_compatible = ti,am3359-adc;
cell-platform_data = tscadc;
cell-pdata_size = sizeof(tscadc);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 21/21] iio: ti_am335x_adc: check if we found the value

2013-06-12 Thread Sebastian Andrzej Siewior
Usually we get all the values we wanted but it is possible, that te ADC
unit is busy performing the conversation for the HW events. In that case
-EBUSY is returned and the user may re-call the function.

Acked-by: Jonathan Cameron ji...@kernel.org
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/iio/adc/ti_am335x_adc.c |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 8ffe52d..4427e8e 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -145,6 +145,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
int i;
unsigned int fifo1count, read;
u32 step = UINT_MAX;
+   bool found = false;
 
/*
 * When the sub-system is first enabled,
@@ -169,11 +170,14 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
for (i = 0; i  fifo1count; i++) {
read = tiadc_readl(adc_dev, REG_FIFO1);
-   if (read  16 == step)
+   if (read  16 == step) {
*val = read  0xfff;
+   found = true;
+   }
}
am335x_tsc_se_update(adc_dev-mfd_tscadc);
-
+   if (found == false)
+   return -EBUSY;
return IIO_VAL_INT;
 }
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 10/21] mfd: ti_am335x_tscadc: remove platform_data support

2013-06-12 Thread Sebastian Andrzej Siewior
This patch removes access to platform data mfd_tscadc_board because the
platform is DT only.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/mfd/ti_am335x_tscadc.c |   23 ++-
 1 file changed, 6 insertions(+), 17 deletions(-)

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index 292d34e..e78b9df 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -26,8 +26,6 @@
 #include linux/of_device.h
 
 #include linux/mfd/ti_am335x_tscadc.h
-#include linux/input/ti_am335x_tsc.h
-#include linux/platform_data/ti_am335x_adc.h
 
 static unsigned int tscadc_readl(struct ti_tscadc_dev *tsadc, unsigned int reg)
 {
@@ -91,31 +89,22 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
struct ti_tscadc_dev*tscadc;
struct resource *res;
struct clk  *clk;
-   struct mfd_tscadc_board *pdata = pdev-dev.platform_data;
struct device_node  *node = pdev-dev.of_node;
struct mfd_cell *cell;
int err, ctrl;
int clk_value, clock_rate;
int tsc_wires = 0, adc_channels = 0, total_channels;
 
-   if (!pdata  !pdev-dev.of_node) {
-   dev_err(pdev-dev, Could not find platform data\n);
+   if (!pdev-dev.of_node) {
+   dev_err(pdev-dev, Could not find valid DT data.\n);
return -EINVAL;
}
 
-   if (pdev-dev.platform_data) {
-   if (pdata-tsc_init)
-   tsc_wires = pdata-tsc_init-wires;
+   node = of_get_child_by_name(pdev-dev.of_node, tsc);
+   of_property_read_u32(node, ti,wires, tsc_wires);
 
-   if (pdata-adc_init)
-   adc_channels = pdata-adc_init-adc_channels;
-   } else {
-   node = of_get_child_by_name(pdev-dev.of_node, tsc);
-   of_property_read_u32(node, ti,wires, tsc_wires);
-
-   node = of_get_child_by_name(pdev-dev.of_node, adc);
-   of_property_read_u32(node, ti,adc-channels, adc_channels);
-   }
+   node = of_get_child_by_name(pdev-dev.of_node, adc);
+   of_property_read_u32(node, ti,adc-channels, adc_channels);
 
total_channels = tsc_wires + adc_channels;
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 15/21] mfd: input: ti_am335x_tsc: rename device from tsc to TI-am335x-tsc

2013-06-12 Thread Sebastian Andrzej Siewior
tsc is a very generic name. This patch adds a TI and HW prefix to it
less generic.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |2 +-
 drivers/mfd/ti_am335x_tscadc.c|2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index a1db55d..ff3215d 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -491,7 +491,7 @@ static struct platform_driver ti_tsc_driver = {
.probe  = titsc_probe,
.remove = titsc_remove,
.driver = {
-   .name   = tsc,
+   .name   = TI-am335x-tsc,
.owner  = THIS_MODULE,
.pm = TITSC_PM_OPS,
.of_match_table = of_match_ptr(ti_tsc_dt_ids),
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index d05fcba..5fb8b1d 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -213,7 +213,7 @@ static  int ti_tscadc_probe(struct platform_device 
*pdev)
if (tsc_wires  0) {
tscadc-tsc_cell = tscadc-used_cells;
cell = tscadc-cells[tscadc-used_cells++];
-   cell-name = tsc;
+   cell-name = TI-am335x-tsc;
cell-of_compatible = ti,am3359-tsc;
cell-platform_data = tscadc;
cell-pdata_size = sizeof(tscadc);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 19/21] input: ti_am335x_tsc: return IRQ_NONE if there was no IRQ for us

2013-06-12 Thread Sebastian Andrzej Siewior
The previous patch (input/ti_am335x_tsc: ACK the HW_PEN irq in ISR)
acked the interrupt so we don't freeze if we don't handle an enabled
interrupt source. The interrupt core has a mechanism for this and to get
it work one should only say that it handled an interrupt if it is
actually the case.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/input/touchscreen/ti_am335x_tsc.c |   10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c 
b/drivers/input/touchscreen/ti_am335x_tsc.c
index 2ba7703..0e9f02a 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -314,10 +314,12 @@ static irqreturn_t titsc_irq(int irq, void *dev)
titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
}
 
-   titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
-
-   am335x_tsc_se_update(ts_dev-mfd_tscadc);
-   return IRQ_HANDLED;
+   if (irqclr) {
+   titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
+   am335x_tsc_se_update(ts_dev-mfd_tscadc);
+   return IRQ_HANDLED;
+   }
+   return IRQ_NONE;
 }
 
 static int titsc_parse_dt(struct platform_device *pdev,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 14/21] input: mfd: ti_am335x_tsc remove remaining platform data pieces

2013-06-12 Thread Sebastian Andrzej Siewior
The two header files removed here are unused and have no users as this
platform was never used with platform devices.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 include/linux/input/ti_am335x_tsc.h |   35 ---
 include/linux/mfd/ti_am335x_tscadc.h|5 
 include/linux/platform_data/ti_am335x_adc.h |   14 ---
 3 files changed, 54 deletions(-)
 delete mode 100644 include/linux/input/ti_am335x_tsc.h
 delete mode 100644 include/linux/platform_data/ti_am335x_adc.h

diff --git a/include/linux/input/ti_am335x_tsc.h 
b/include/linux/input/ti_am335x_tsc.h
deleted file mode 100644
index 6a66b4d..000
--- a/include/linux/input/ti_am335x_tsc.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __LINUX_TI_AM335X_TSC_H
-#define __LINUX_TI_AM335X_TSC_H
-
-/**
- * struct tsc_data Touchscreen wire configuration
- * @wires: Wires refer to application modes
- * i.e. 4/5/8 wire touchscreen support
- * on the platform.
- * @x_plate_resistance:X plate resistance.
- * @steps_to_configure:The sequencer supports a total of
- * 16 programmable steps.
- * A step configured to read a single
- * co-ordinate value, can be applied
- * more number of times for better results.
- * @wire_config:   Different EVM's could have a different order
- * for connecting wires on touchscreen.
- * We need to provide an 8 bit number where in
- * the 1st four bits represent the analog lines
- * and the next 4 bits represent positive/
- * negative terminal on that input line.
- * Notations to represent the input lines and
- * terminals resoectively is as follows:
- * AIN0 = 0, AIN1 = 1 and so on till AIN7 = 7.
- * XP  = 0, XN = 1, YP = 2, YN = 3.
- *
- */
-
-struct tsc_data {
-   int wires;
-   int x_plate_resistance;
-   int steps_to_configure;
-   int wire_config[10];
-};
-
-#endif
diff --git a/include/linux/mfd/ti_am335x_tscadc.h 
b/include/linux/mfd/ti_am335x_tscadc.h
index fe54ba4..533f200 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -120,11 +120,6 @@
 
 #define TSCADC_CELLS   2
 
-struct mfd_tscadc_board {
-   struct tsc_data *tsc_init;
-   struct adc_data *adc_init;
-};
-
 struct ti_tscadc_dev {
struct device *dev;
struct regmap *regmap_tscadc;
diff --git a/include/linux/platform_data/ti_am335x_adc.h 
b/include/linux/platform_data/ti_am335x_adc.h
deleted file mode 100644
index e41d583..000
--- a/include/linux/platform_data/ti_am335x_adc.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __LINUX_TI_AM335X_ADC_H
-#define __LINUX_TI_AM335X_ADC_H
-
-/**
- * struct adc_data ADC Input information
- * @adc_channels:  Number of analog inputs
- * available for ADC.
- */
-
-struct adc_data {
-   unsigned int adc_channels;
-};
-
-#endif
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: am335x: TSC ADC reworking including DT pieces, take 5

2013-06-13 Thread Sebastian Andrzej Siewior
On 06/13/2013 11:07 AM, Samuel Ortiz wrote:
 Hi Sebastian,

Hi Samuel,

 Pulled and pushed back to mfd-next, thanks.

Thank you.

 I fixed a couple of unused variable warnings on top of it.

I saw your patch at git.k.o and I am asking you not to taking it :)
The code is:

of_property_for_each_u32(node, ti,adc-channels, prop, cur, val) {
 adc_channels++;
 if (val  7) {
 dev_err(pdev-dev,  PIN numbers are 0..7 (not
%d)\n,
 val);
 return -EINVAL;
 }
 }

and without CONFIG_OF of_property_for_each_u32() becomes most likely
empty. That is why I haven't seen it.
So either the macro should be changed to tell the compiler that the
variables are used (so the warning does not show up) or let the driver
depend on CONFIG_OF. I will look at the former and can prepare a patch
for the latter if you want.

 
 Cheers,
 Samuel.
 

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap

2013-06-17 Thread Sebastian Andrzej Siewior
On 06/14/2013 03:53 PM, Mark Brown wrote:
 On Tue, Jun 11, 2013 at 04:34:53PM +0200, Sebastian Andrzej Siewior
 wrote:
 
 It does give you tracepoints and debugfs.  If it's making things at
 all complicated we need to look at why that is and figure out how
 to fix that since it's probably an issue for other users.

debugfs are tracepoints is our offer? Let me check the price one more
time.

A simply mmio read does right now:
- lock + unlock.
  each time you chase another pointer plus enable/disable interrupts
  plus you have to save flags in another structure.

- _regmap_read()
  We check a few variables and then we go after reg_read and we end up
  in _regmap_raw_read().
  Here we call _regmap_range_lookup() which should return NULL. Next
  thing we invoke map-format.format_reg(). Finally we can call
  map-bus-read() which brings us to regmap_mmio_read().
  At the end we invoke map-format.parse_val().

write looks most likely the same.

A simple register read invokes 5 functions pointers. I am not counting
the function arguments in between and I am also not counting the number
of arguments which are involved and take pointer as well. This is a lot
of stuff that is done for a simple read of an mmio.

I understand that most of this may not be expensive in total if it
comes to SPI or I2C and all the goodies like reg caching and one
interface which deals with SPI and I2C. I also understand that some
chips have a non standard interface and are either BE or LE. We have
similar things on USB where people wired the BUS wrongly either at the
BUS level or at the SoC level so some PowerPC have an in-core ehci
controller but its registers are BE and not LE like it should be. The
solution here was variable check a simple swap() in that case.
I like abstractions but this gone a little too far I think.

This is a lot of for a simple mmio access. In terms of performance: If
I add a trace point to my read and write I have still less code which
is called and it can be disabled. This regmap overhead is always there
chasing pointers.

As I said before: I doubt that you get this regmap access in an one GiB
network driver and in turn remove their trace points to register access.

Please don't get me wrong: It is still nice for slow buses and this ADC
driver isn't anything close to high performance like a 1GiB network
driver but it adds a lot of unwanted overhead which I prefer not to
have.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] ARM: dts: omap3-beagle: fix the USB phy node

2013-06-17 Thread Sebastian Andrzej Siewior
I haven't tested this but it should not work the way it is now. The
format for of_parse_phandle() is usuall phandle index not the other
way around.

Cc: Benoît Cousson b-cous...@ti.com
Cc: Roger Quadros rog...@ti.com
Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/omap3-beagle.dts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/omap3-beagle.dts 
b/arch/arm/boot/dts/omap3-beagle.dts
index 6eec699..a12e9b0 100644
--- a/arch/arm/boot/dts/omap3-beagle.dts
+++ b/arch/arm/boot/dts/omap3-beagle.dts
@@ -128,7 +128,7 @@
 };
 
 usbhsehci {
-   phys = 0 hsusb2_phy;
+   phys = hsusb2_phy 0;
 };
 
 twl_gpio {
-- 
1.8.3.1

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: dts: omap3-beagle: fix the USB phy node

2013-06-17 Thread Sebastian Andrzej Siewior
On 06/17/2013 03:27 PM, Sebastian Andrzej Siewior wrote:
 index 6eec699..a12e9b0 100644
 --- a/arch/arm/boot/dts/omap3-beagle.dts
 +++ b/arch/arm/boot/dts/omap3-beagle.dts
 @@ -128,7 +128,7 @@
  };
  
  usbhsehci {
 - phys = 0 hsusb2_phy;
 + phys = hsusb2_phy 0;
  };
  
  twl_gpio {

Wait. Or does it mean that the first phy is deactivated and we add
phyhandle 0 (which is the root node) to skip it?

I assume that now since we don't have a cells property (like
#gpio-cells for the gpio lookup).

So ignore it please…

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC] Add support for am33xx which has two musb ports

2013-06-17 Thread Sebastian Andrzej Siewior
Hi Felipe,

so with these two I can use the second port on my am335x-evm in hostmode.
After the second ports gets noticed by Linux I see over and over:
|musb_bus_suspend 2457: trying to suspend as a_wait_bcon while active

Which disappears once I plug in a device and does not come back after I
unplug it.

Port 0 in device seems to run as well. On the first time i see

| CAUTION: musb: Babble Interrupt Occurred
| g_ncm gadget: high-speed config #1: CDC Ethernet (NCM)

and on the second time I plug it in there is no such babble error. Maybe
there is some kind of init missing here.
Any comments?

Sebastian

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] musb: musb: dsps: determine the number of instances at runtime

2013-06-17 Thread Sebastian Andrzej Siewior
There is no need to hardcode the number of instances here. It is better to
determine them at runtime. Even if the device provides two instances one
might only want to use one of them.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/usb/musb/musb_dsps.c | 33 +++--
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index d9ff390..0ac9934 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -110,8 +110,6 @@ struct dsps_musb_wrapper {
/* miscellaneous stuff */
u32 musb_core_offset;
u8  poll_seconds;
-   /* number of musb instances */
-   u8  instances;
 };
 
 /**
@@ -124,6 +122,7 @@ struct dsps_glue {
struct timer_list timer[2]; /* otg_workaround timer */
unsigned long last_timer[2];/* last timer data for each instance */
u32 __iomem *usb_ctrl[2];
+   u8 instances;
 };
 
 #defineDSPS_AM33XX_CONTROL_MODULE_PHYS_0   0x44e10620
@@ -646,6 +645,23 @@ static int dsps_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, glue);
 
+   i = 1;
+   do {
+   iomem = platform_get_resource(pdev, IORESOURCE_MEM, i);
+   if (!iomem) {
+   i--;
+   break;
+   }
+   i++;
+   } while (1);
+
+   glue-instances = i;
+   if (glue-instances  1) {
+   dev_err(pdev-dev, Need atleast iomem for one port.\n);
+   ret = -EINVAL;
+   goto err1_5;
+   }
+
/* enable the usbss clocks */
pm_runtime_enable(pdev-dev);
 
@@ -656,7 +672,7 @@ static int dsps_probe(struct platform_device *pdev)
}
 
/* create the child platform device for all instances of musb */
-   for (i = 0; i  wrp-instances ; i++) {
+   for (i = 0; i  glue-instances; i++) {
ret = dsps_create_musb_pdev(glue, i);
if (ret != 0) {
dev_err(pdev-dev, failed to create child pdev\n);
@@ -673,6 +689,7 @@ static int dsps_probe(struct platform_device *pdev)
pm_runtime_put(pdev-dev);
 err2:
pm_runtime_disable(pdev-dev);
+err1_5:
kfree(glue-wrp);
 err1:
kfree(glue);
@@ -682,11 +699,10 @@ static int dsps_probe(struct platform_device *pdev)
 static int dsps_remove(struct platform_device *pdev)
 {
struct dsps_glue *glue = platform_get_drvdata(pdev);
-   const struct dsps_musb_wrapper *wrp = glue-wrp;
int i;
 
/* delete the child platform device */
-   for (i = 0; i  wrp-instances ; i++)
+   for (i = 0; i  glue-instances; i++)
platform_device_unregister(glue-musb[i]);
 
/* disable usbss clocks */
@@ -702,10 +718,9 @@ static int dsps_suspend(struct device *dev)
 {
struct platform_device *pdev = to_platform_device(dev-parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
-   const struct dsps_musb_wrapper *wrp = glue-wrp;
int i;
 
-   for (i = 0; i  wrp-instances; i++)
+   for (i = 0; i  glue-instances; i++)
musb_dsps_phy_control(glue, i, 0);
 
return 0;
@@ -715,10 +730,9 @@ static int dsps_resume(struct device *dev)
 {
struct platform_device *pdev = to_platform_device(dev-parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
-   const struct dsps_musb_wrapper *wrp = glue-wrp;
int i;
 
-   for (i = 0; i  wrp-instances; i++)
+   for (i = 0; i  glue-instances; i++)
musb_dsps_phy_control(glue, i, 1);
 
return 0;
@@ -755,7 +769,6 @@ static const struct dsps_musb_wrapper ti81xx_driver_data = {
.rxep_bitmap= (0xfffe  16),
.musb_core_offset   = 0x400,
.poll_seconds   = 2,
-   .instances  = 1,
 };
 
 static const struct platform_device_id musb_dsps_id_table[] = {
-- 
1.8.3.1

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] musb: musb: dsps: support multiple instances

2013-06-17 Thread Sebastian Andrzej Siewior
If we specify right now more than once instance then we attempt to add
the platform device twice. The nop driver does not mind the second add
because it checks for it and returns without a word. At removal time a
segfault is likely because the first intance clean ups the phy and
second, well, goes boom.
This patchs adds two dummy device node to the am33xx for the dummy phy
which we have now. During probe time, we grab the phy based on the
device node if we have one. If not, we use the same hack we used so far.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am33xx.dtsi |  8 
 drivers/usb/musb/musb_dsps.c  | 18 +-
 include/linux/usb/musb.h  |  1 +
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 8e1248f..30d0d45 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -341,6 +341,14 @@
port1-mode = 3;
power = 250;
ti,hwmods = usb_otg_hs;
+   phys = nopphy0 nopphy1;
+   };
+
+   nopphy0: usbphy@0 {
+   compatible = usb-nop-xceiv;
+   };
+   nopphy1: usbphy@1 {
+   compatible = usb-nop-xceiv;
};
 
mac: ethernet@4a10 {
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index e1b661d..d9ff390 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -415,9 +415,14 @@ static int dsps_musb_init(struct musb *musb)
/* mentor core register starts at offset of 0x400 from musb base */
musb-mregs += wrp-musb_core_offset;
 
-   /* NOP driver needs change if supporting dual instance */
-   usb_nop_xceiv_register();
-   musb-xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
+   if (!glue-dev-of_node) {
+   /* This hack works only for a single instance. */
+   usb_nop_xceiv_register();
+   musb-xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
+   } else {
+   musb-xceiv = devm_usb_get_phy_by_phandle(glue-dev, phys,
+   musb-config-instance);
+   }
if (IS_ERR_OR_NULL(musb-xceiv))
return -EPROBE_DEFER;
 
@@ -449,7 +454,8 @@ static int dsps_musb_init(struct musb *musb)
return 0;
 err0:
usb_put_phy(musb-xceiv);
-   usb_nop_xceiv_unregister();
+   if (!glue-dev-of_node)
+   usb_nop_xceiv_unregister();
return status;
 }
 
@@ -466,7 +472,8 @@ static int dsps_musb_exit(struct musb *musb)
 
/* NOP driver needs change if supporting dual instance */
usb_put_phy(musb-xceiv);
-   usb_nop_xceiv_unregister();
+   if (!glue-dev-of_node)
+   usb_nop_xceiv_unregister();
 
return 0;
 }
@@ -570,6 +577,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 
id)
of_property_read_u32(np, res_name, (u32 *)pdata-mode);
of_property_read_u32(np, power, (u32 *)pdata-power);
config-multipoint = of_property_read_bool(np, multipoint);
+   config-instance = id;
 
pdata-config   = config;
}
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h
index 053c268..e027705 100644
--- a/include/linux/usb/musb.h
+++ b/include/linux/usb/musb.h
@@ -83,6 +83,7 @@ struct musb_hdrc_config {
u8  vendor_stat __deprecated; /* vendor status reg witdh */
u8  dma_req_chan __deprecated; /* bitmask for required dma 
channels */
u8  ram_bits;   /* ram address size */
+   u8  instance;
 
struct musb_hdrc_eps_bits *eps_bits __deprecated;
 #ifdef CONFIG_BLACKFIN
-- 
1.8.3.1

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] musb: musb: dsps: support multiple instances

2013-06-18 Thread Sebastian Andrzej Siewior
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA256

On 06/18/2013 10:27 AM, Felipe Balbi wrote:
 diff --git a/drivers/usb/musb/musb_dsps.c
 b/drivers/usb/musb/musb_dsps.c index e1b661d..d9ff390 100644 ---
 a/drivers/usb/musb/musb_dsps.c +++
 b/drivers/usb/musb/musb_dsps.c @@ -415,9 +415,14 @@ static int
 dsps_musb_init(struct musb *musb) /* mentor core register starts
 at offset of 0x400 from musb base */ musb-mregs +=
 wrp-musb_core_offset;
 
 -/* NOP driver needs change if supporting dual instance */ -
 usb_nop_xceiv_register(); -  musb-xceiv =
 usb_get_phy(USB_PHY_TYPE_USB2); +if (!glue-dev-of_node) { +
 /* This hack works only for a single instance. */ +
 usb_nop_xceiv_register(); +  musb-xceiv =
 usb_get_phy(USB_PHY_TYPE_USB2);
 
 I think you can drop this altogether, am335x is DT-only anyway :-)

Yes, but this is also used by:

$ git grep musb-ti81xx
arch/arm/mach-omap2/usb-musb.c: name = musb-ti81xx;
drivers/usb/musb/musb_dsps.c:   .name   = musb-ti81xx,

Is that one also am33xx?

 
 +} else { +  musb-xceiv =
 devm_usb_get_phy_by_phandle(glue-dev, phys, +
 musb-config-instance); +   }
 
 after doing all this, perhaps we should re-factor phy_get into 
 musb_core.c, so that we can remove this sort of support from all
 glue layers.

So keep this is as is and add later a phy_get into musb? I would have
check if everyone has a phy instance but I guess so.

Sebastian
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)

iQIcBAEBCAAGBQJRwBucAAoJEHuW6BYqjPXRhK4P/3SjhljlSmWO0XN1pjXCu+L+
m6yxlz+epFfJSnXKX8FWmVQOahtQrbclv+KhcMo/KWeHj/epp30u924avkexwOc7
RRPCYEldhJdySNEkv14MpAan5WfOXNm8NuD7wCnrADahQxw6vQPoU3wnDIRKuW5i
b4kR+V2cSJatlg5tNeXiYR+LLygtSaBprBwcdUSeJ/BsivZBYx4TnwQ/LpMD24br
vORIbivMf+SKkJAmxBqHg956L38vL6C3iLYR0GHnk7a4x9cQ4Kk5jJVz6HbphYkJ
zzIrYojFXQ5SE7F4+jyEidUx2hQnNhNT6TAFGXG9fCpdNoi+3zhxBKUW1b7aIAHP
fbQJbNM4wRNBmxKvQPTLzlsnLTFbjfBb+vd1KBst8niIjLfhaYiV9oLiwAUilrvw
ugndxyzGgfKWbBDwcS6pVNwfP3eE54ZunOrRJnS/EF1GRrC1yaPZb0xuTxuMiqN2
97R9H1SPyUv9qJidB/EoJKFMyoq6fWlNTMTMGK+S80ctdQp+bOWdNcpJGaPx7XGc
8z+AKoQZapC/TunWqrJrNz6mcTh2ibyG+hfTD7FJULq9NYM7oAtAn9MOser4gwTB
YxsJnEIj29TNJQx4g7/29rr+vNKNX1DPNTgW7r3v4JFKPClx4wZpXLe9qOG48LKa
ciA5Sp9sWio6AwtyhEyl
=xL1i
-END PGP SIGNATURE-
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] musb: musb: dsps: determine the number of instances at runtime

2013-06-18 Thread Sebastian Andrzej Siewior
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA256

On 06/18/2013 10:31 AM, Felipe Balbi wrote:
 Hi,
Hi Felipe,

 --- a/drivers/usb/musb/musb_dsps.c +++
 b/drivers/usb/musb/musb_dsps.c @@ -110,8 +110,6 @@ struct
 dsps_musb_wrapper { @@ -646,6 +645,23 @@ static int
 dsps_probe(struct platform_device *pdev) } 
 platform_set_drvdata(pdev, glue);
 
 +i = 1; +do { +  iomem = platform_get_resource(pdev,
 IORESOURCE_MEM, i);
 
 IIRC this index starts at zero, no ? Meaning that this should be:
 
 i = 0 do { iomem = platform_get_resource(pdev, IORESOURCE_MEM, i); 
 if (!iomem) break;
 
 i++; } while (true);
 
 glue-instances = i + 1;

No. 3x ioadress i.e. 0, 1, 2 means two instances because we have 0 as
the glue io address and two musb port (1 and 2).

 Also, why are you getting the resource and doing nothing with it ?
 Is it just to figure out the amount of instances ? Isn't there a DT
 helper to

exactly, just to count.

 count how many child nodes a certain node has ?
This isn't exactly a child node, is it? There is of_get_child_count()
but this isn't a child, it is one property.

Sebastian
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.12 (GNU/Linux)

iQIcBAEBCAAGBQJRwB3LAAoJEHuW6BYqjPXRu1MQALwY/DHJWIKBZm18OdlJizmC
UZMfZCqwtObDtHcbUpMx5jFmF6jblVCY56Vx713oarRYwona65jRuCVp+BmPpvbh
rH7Vfdj7ZK02sSXD49lu/eM+StOoLAEuCdZV5cP2sQCQHzGY50eDVXynjFTmr6wH
nIC/MCPrTLGgH3bWLM1PshmIThbeovp/UupGXU0ABxThL3Dm2EAolBEWjvwAgbZy
CUL3OoUvb6SdJiPkI4ORUvHzyS78JDsvEj1zuCio13m+/FW3uvvQEjIWefS/lAmP
0AyoDf+6VTdAhJVcEev5RJNJpIzFMZDQYjarHO8q5NSwr5WN+h+QOEQjYdQsAfkf
Jv68nnj6mwE1HUv32EnTIu3il0101QU+dU4zDsMykCneMhY2GBXbRqjrfZXiTqKO
WjtJg0HeKhIrG6i5ffLt/4kfPIyXYYJriOqJf2nvlBf7/RqsX4OT5ThIW2BAV7Zx
7qY9CgwDdSjyBq1GpcIGbpBNvzrVGxJfLxNec73EOJmHdu6zCZWLWpujAQIvv3kf
XJWtPXYAVNB7lpSBaxJO6CeSE6YAy5CkxaL8EMeTcqKxwh/ntRw/YLt45MUb8Ao5
J82znl3hByO/9FNPi9KA4A6TDuFtRNNu5lm8o+PdQndTO6heMzJTs8AL/PqH1vRA
q2e6Wxg65ZTs4aUUyVFF
=f5YG
-END PGP SIGNATURE-
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] musb: musb: dsps: determine the number of instances at runtime

2013-06-18 Thread Sebastian Andrzej Siewior
On 06/18/2013 10:54 AM, Felipe Balbi wrote:
 Hi,

Hi Felipe,

 This isn't exactly a child node, is it? There is
 of_get_child_count() but this isn't a child, it is one property.
 
 is it because we haven't added DTS support for musb core ?
 Eventually we can/should add and convert this to
 of_get_child_count() then. For now, we can go ahead with your
 approach.

 mother {
 child1 {
 };
 child1 {
 };
 };

That would be a child imho.
For counting of phandles (for the number of assigned gpios for instance)
you would use
  of_count_phandle_with_args(node, gpios, #gpio-cell-size);

We don't have an equivalent for #gpio-cell-size. In our case it would
be the sum of #address-cells and #size-cells minus 1 because we
don't have a phandle and abuse a function :)
Counting the number of addresses is special since bother its
members (address and size) can be either 32bit or 64bit in size.

 We have such a large amount of function pointers to sort out anyway
 :-(

If you want get the while() loop replaced by something else I have a
few suggestions:
- check for iomem(2). If it is there we have two instances. If not,
  just 1. This includes also the hope that we don't get a third port.

- loop over of_address_to_resource(). This is what of_device_alloc() is
  doing:
   if (of_can_translate_address(np))
 while (of_address_to_resource(np, num_reg, temp_res) == 0)
num_reg++;
  So it is different.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/4] ARM: dts: AM33XX: Add PWMSS device tree nodes

2013-06-18 Thread Sebastian Andrzej Siewior
On 06/12/2013 06:40 PM, Felipe Balbi wrote:
 On Wed, Jun 12, 2013 at 06:10:32PM +0200, Sebastian Andrzej Siewior wrote:
 On 06/06/2013 03:52 PM, Sebastian Andrzej Siewior wrote:
 From: Philip Avinash avinashphi...@ti.com

 Add PWMSS device tree nodes in relation with ECAP  EHRPWM DT nodes to
 AM33XX SoC family. Also populates device tree nodes for ECAP  EHRPWM by
 adding necessary properties like pwm-cells, base reg  set disabled as
 status.
 Can someone please grab #2 till #4? Paul took just #1 as far as I can
 tell.
 
 DTS should be Benoit Cousson

So, Benoit. Would you please be so kind and pick up the dts pieces?

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] musb: musb: dsps: support multiple instances

2013-06-19 Thread Sebastian Andrzej Siewior
On 06/18/2013 10:27 AM, Felipe Balbi wrote:
 --- a/arch/arm/boot/dts/am33xx.dtsi +++
 b/arch/arm/boot/dts/am33xx.dtsi @@ -341,6 +341,14 @@ port1-mode =
 3; power = 250; ti,hwmods = usb_otg_hs; +  phys =
 nopphy0 nopphy1; +   }; + +  nopphy0: usbphy@0 { +
 compatible = usb-nop-xceiv; +  }; +nopphy1: 
 usbphy@1 { +
 compatible = usb-nop-xceiv; };
 
 mac: ethernet@4a10 {

Any opinion on those phy nodes? Is it likely that we need a real phy
driver here and also expose a little more information like the memory
register or reset / vcc supply?

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC] am33xx: create child nodes for the two musb controllers

2013-06-26 Thread Sebastian Andrzej Siewior
I've been thinkig about creating two child nodes for the independent musb
controllers on the am33. I've been thinking about the following:

diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 8e1248f..6aa9506 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -326,21 +326,78 @@
status = disabled;
};
 
usb@4740 {
compatible = ti,musb-am33xx;
-   reg = 0x4740 0x1000/* usbss */
-  0x47401000 0x800 /* musb instance 0 */
-  0x47401800 0x800;   /* musb instance 1 */
-   interrupts = 17/* usbss */
- 18/* musb instance 0 */
- 19;  /* musb instance 1 */
-   multipoint = 1;
-   num-eps = 16;
-   ram-bits = 12;
-   port0-mode = 3;
-   port1-mode = 3;
-   power = 250;
+   reg = 0x4740 0x1000;  /* usbss */
+   interrupts = 17;  /* usbss */
ti,hwmods = usb_otg_hs;
+
+   usb0@0x47401000 {
+   reg = 0x47401000 0x800;   /* musb 
instance 0 */
+   interrupts = 18;  /* musb 
instance 0 */
+   multipoint = 1;
+   num-eps = 16;
+   ram-bits = 12;
+   port-mode = 3;
+   power = 250;
+
+   phys = nopphy0;
+   dmas = cppi41dma 0
+   cppi41dma 1
+   cppi41dma 2
+   cppi41dma 3
+   cppi41dma 4
+   cppi41dma 32
+   cppi41dma 34
+   cppi41dma 36
+   cppi41dma 38
+   cppi41dma 40;
+   dma-names = rx1, rx2, rx3, rx4, rx5,
+   tx1, tx2, tx3, tx4, tx5;
+   };
+
+   usb0@0x47401800 {
+   reg = 0x47401800 0x800;   /* musb 
instance 1 */
+   interrupts = 19;  /* musb 
instance 1 */
+   multipoint = 1;
+   num-eps = 16;
+   ram-bits = 12;
+   port-mode = 3;
+   power = 250;
+
+   phys = nopphy1;
+   dmas = cppi41dma 0
+   cppi41dma 1
+   cppi41dma 2
+   cppi41dma 3
+   cppi41dma 4
+   cppi41dma 62
+   cppi41dma 64
+   cppi41dma 66
+   cppi41dma 68
+   cppi41dma 70;
+   dma-names = rx1, rx2, rx3, rx4, rx5,
+   tx1, tx2, tx3, tx4, tx5;
+   };
+   };

Please keep in mind that his is not a proper patch it should point out
what I have in mind.
This would easy the for instance the dma channel assignment. Also, it will
move back to the port-mode property instead of portX-mode one which it has
now. This is kind of confusing since it is not a root hub or anything like
that it is a complete musb controller. Plus for the phys property could
easily take the one avaible and would not require which instance it
really it is.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC] am33xx: create child nodes for the two musb controllers

2013-06-27 Thread Sebastian Andrzej Siewior
On 06/27/2013 08:51 AM, Felipe Balbi wrote:
 Hi,

Hi Felipe,

 the patch is alright, but what about the giant amoutn of function 
 pointers we have ? Are you planning to use of_dev_auxdata ??

I didn't plan to use of_dev_auxdata. What do you mean by giant amount
of function pointers?

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC] am33xx: create child nodes for the two musb controllers

2013-06-27 Thread Sebastian Andrzej Siewior
On 06/27/2013 01:23 PM, Benoit Cousson wrote:
 Hi Sebastian,

Hi Benoit,

 BTW, why do have so many DMA compared to the previous version?
I added them, the previous had none and is PIO only.
I currently use three cells per dma channel (the posted example had
two).
In general I think I have to request 2 * 15 dma channels for the 15 TX
and RX endpoints. So we end up with 30 channels per device (and we have
two of them).
The DMA engine has specific queues which depend on the USB endpoint
that is used. Instead of hacking this information in some kind of
platform data I decided to push this detail into device tree.

 I don't know the HW in detail, but that looks indeed much better and
 seems to reflect the partitioning with multiple instances accurately.
 
 If Felipe is OK with that partitioning, I'll take it.

Okay, thanks.

 
 Thanks,
 Benoit

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap

2013-07-04 Thread Sebastian Andrzej Siewior
Sorry for the long pause…

On 06/17/2013 06:03 PM, Mark Brown wrote:
 This is a lot of for a simple mmio access. In terms of
 performance: If I add a trace point to my read and write I have
 still less code which is called and it can be disabled. This
 regmap overhead is always there chasing pointers.
 
 Equally well what you're implementing here is support for
 something that's typically implemented with an I2C or SPI control
 interface so you're already going to be quite a way ahead of the
 norm.  This is part of what's confusing me, usually for this
 application things aren't that bad performance wise even on a
 massively slower bus.
 
 If all you're saying here is that there's some overhead that's fine
 if a bit surprising, but the way you're talking made it sound like
 there was some issue that made the API actually unusable.

No, sorry for that confusion. I had a problem with the locking in irq
context, changed the driver  pointed out the problem, been told that
there is a fix, applied it, never complained again.

This is simply about I am forced to use regmap and I don't agree with
it.

 As I said before: I doubt that you get this regmap access in an
 one GiB network driver and in turn remove their trace points to
 register access.
 
 Well, of course for that sort of thing the general trick is not to
 talk to the hardware at all and do as much as possible with memory
 that the hardware can DMA - there's actually still non-trivial
 costs in talking over the buses.

That is true but even while doing DMA you have enough handshake with
the HW to trigger the transfer and if you are lucky your DMA
descriptors are in cached memory.

 Please don't get me wrong: It is still nice for slow buses and
 this ADC driver isn't anything close to high performance like a
 1GiB network driver but it adds a lot of unwanted overhead which
 I prefer not to have.
 
 OK, but equally well remember that from a subsystem maintainer
 point of view having things factored out is a win in itself; for
 example with the MFDs locking on the register I/O has been a
 persistent issue in the past.

I agree with that. But:

The driver here does not use atomic updates but read followed by write
so your locking here is futile. So the API/regmap alone does not make
it right. And look: the MFD part uses regmap. Its children (IIO 
input) do not use it. After I told this Samuel he said that it is okay.
So here I am. Using regmap in MFD which is only used once on init and
never again. It has regmap.

The register access in both child driver is split making sure they do
not use the same ones. I added one function which writes a common
register. That one is reset after an operation and needs to be written
by the currently active child so the HW continues to work. Haven't seen
anything close to it in regmap.

I ask, politely I hope, to get this patch in and remove regmap since
none of its features are used in this driver.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 01/22] mfd/ti_am335x_tscadc: remove regmap

2013-07-04 Thread Sebastian Andrzej Siewior
On 07/04/2013 12:45 PM, Mark Brown wrote:
 On Thu, Jul 04, 2013 at 11:02:41AM +0200, Sebastian Andrzej Siewior
 wrote:
 
 The driver here does not use atomic updates but read followed by
 write so your locking here is futile. So the API/regmap alone
 does not make
 
 Doesn't that sound like the driver ought to be using a r/m/w
 primitive though?

It does this in the init phase before the child devices are created so
no harm is done. I just wanted to say that regmap alone does not help
as long as the use simply replaces all reads  writes with regmap reads
 writes.

 
 it right. And look: the MFD part uses regmap. Its children (IIO
  input) do not use it. After I told this Samuel he said that it
 is okay.
 
 Again I think the point here was that they probably ought to do
 so.

It didn't sound that way.

 But I guess if you're saying there's no problem that's fine...
Thank you.

Samuel, is it okay if I repost the patch? It can wait till past -rc1 if
you are willing to take it.

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 04/22] input/ti_am33x_tsc: Order of TSC wires, made configurable

2013-07-04 Thread Sebastian Andrzej Siewior
On 07/04/2013 01:14 PM, Sekhar Nori wrote:
 
 On 6/11/2013 5:00 PM, Sebastian Andrzej Siewior wrote:
 From: Patil, Rachna rac...@ti.com

 The current driver expected touchscreen input
 wires(XP,XN,YP,YN) to be connected in a particular order.
 Making changes to accept this as platform data
 
 The platform data part of this driver will never get used since it is
 used on DT-only platforms (and future platforms will all be DT-only).
 You should get rid of it as it will save you some code.

If you follow the series you will notice that the platform bits are
removed later. Should I have overlooked something please say so.

 
 Thanks,
 Sekhar
 

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 14/22] arm/am33xx: add TSC/ADC mfd device support

2013-07-04 Thread Sebastian Andrzej Siewior
On 07/04/2013 03:49 PM, Sekhar Nori wrote:
 diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
 index 1460d9b..4ad7797 100644
 --- a/arch/arm/boot/dts/am33xx.dtsi
 +++ b/arch/arm/boot/dts/am33xx.dtsi
 @@ -404,6 +404,24 @@
  ti,hwmods = wkup_m3;
  };
  
 +tscadc: tscadc@44e0d000 {
 +compatible = ti,am3359-tscadc;
 +reg = 0x44e0d000 0x1000;
 +interrupt-parent = intc;
 
 interrupt-parent can be dropped since it will be inherited from parent.

That is true. I prepare a patch for that after the merge window.

 
 Thanks,
 Sekhar

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 04/22] input/ti_am33x_tsc: Order of TSC wires, made configurable

2013-07-04 Thread Sebastian Andrzej Siewior
On 07/04/2013 03:39 PM, Sekhar Nori wrote:
 Yes, I noticed that after sending the mail. To me it does not make sense
 to make changes to accept something as platform data only to remove
 platform data itself later.

The patches were made earlier and it was easier that way to take
everything and simple remove the platform part later.

 May be reorder the series to move this to after platform data removal -
 that way any platform data related changes in the patch will have to go
 away.
 
 Thanks,
 Sekhar

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/5] usb: phy: phy-nop: add support for am335x PHY

2013-07-05 Thread Sebastian Andrzej Siewior
The am335x PHY code is well hidden in multiple places. The glue layer
uses the nop and does up/down in the background. This patch copies the
power on / power off part out of dsps so it can be removed later in
dsps. At this point I am not sure if it is better to write a new phy
driver for am335x or just add the missing pieces to this one.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/usb/phy/phy-nop.c | 113 +-
 1 file changed, 101 insertions(+), 12 deletions(-)

diff --git a/drivers/usb/phy/phy-nop.c b/drivers/usb/phy/phy-nop.c
index 55445e5d..ad85090 100644
--- a/drivers/usb/phy/phy-nop.c
+++ b/drivers/usb/phy/phy-nop.c
@@ -35,6 +35,7 @@
 #include linux/clk.h
 #include linux/regulator/consumer.h
 #include linux/of.h
+#include linux/of_address.h
 
 struct nop_usb_xceiv {
struct usb_phy phy;
@@ -42,6 +43,14 @@ struct nop_usb_xceiv {
struct clk *clk;
struct regulator *vcc;
struct regulator *reset;
+
+   void __iomem *priv_reg;
+};
+
+struct phy_data {
+   int (*phy_init)(struct usb_phy *x);
+   void(*phy_shutdown)(struct usb_phy *x);
+   int (*reg_init)(struct platform_device *pdev);
 };
 
 static struct platform_device *pd;
@@ -139,10 +148,84 @@ static int nop_set_host(struct usb_otg *otg, struct 
usb_bus *host)
return 0;
 }
 
+static int am335x_reg_init(struct platform_device *pdev)
+{
+   struct device_node *node = pdev-dev.of_node;
+   struct nop_usb_xceiv *nop;
+   struct resource res;
+   int ret;
+
+   nop = platform_get_drvdata(pdev);
+   ret = of_address_to_resource(node, 0, res);
+   return ret;
+
+   nop-priv_reg = devm_request_and_ioremap(pdev-dev, 0);
+   if (!nop-priv_reg)
+   return -EINVAL;
+   return 0;
+}
+
+#define AM335X_USB_CTRL0x00
+#define AM335x_USB_STS 0x04
+
+#define USBPHY_CM_PWRDN(1  0)
+#define USBPHY_OTG_PWRDN   (1  1)
+#define USBPHY_OTGVDET_EN  (1  19)
+#define USBPHY_OTGSESSEND_EN   (1  20)
+
+static void am335x_phy_power(struct nop_usb_xceiv *nop, bool on)
+{
+   u32 val;
+
+   val = readl(nop-priv_reg);
+   if (on) {
+   val = ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
+   val |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
+   } else {
+   val |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
+   }
+
+   writel(val, nop-priv_reg);
+}
+
+static int am335x_phy_init(struct usb_phy *phy)
+{
+   struct nop_usb_xceiv *nop = dev_get_drvdata(phy-dev);
+   int ret;
+
+   ret = nop_init(phy);
+   if (ret)
+   return ret;
+   am335x_phy_power(nop, true);
+   return 0;
+}
+
+static void am335x_phy_shutdown(struct usb_phy *phy)
+{
+   struct nop_usb_xceiv *nop = dev_get_drvdata(phy-dev);
+
+   am335x_phy_power(nop, false);
+   nop_shutdown(phy);
+}
+
+struct phy_data am335x_phy_data = {
+   .reg_init   = am335x_reg_init,
+   .phy_init   = am335x_phy_init,
+   .phy_shutdown   = am335x_phy_shutdown,
+};
+
+static const struct of_device_id nop_xceiv_dt_ids[] = {
+   { .compatible = usb-nop-xceiv },
+   { .compatible = ti,am335x-usb-phy, .data = am335x_phy_data },
+   { }
+};
+MODULE_DEVICE_TABLE(of, nop_xceiv_dt_ids);
+
 static int nop_usb_xceiv_probe(struct platform_device *pdev)
 {
struct device *dev = pdev-dev;
struct nop_usb_xceiv_platform_data *pdata = pdev-dev.platform_data;
+   const struct phy_data   *phy_data = NULL;
struct nop_usb_xceiv*nop;
enum usb_phy_type   type = USB_PHY_TYPE_USB2;
int err;
@@ -154,6 +237,7 @@ static int nop_usb_xceiv_probe(struct platform_device *pdev)
if (!nop)
return -ENOMEM;
 
+   platform_set_drvdata(pdev, nop);
nop-phy.otg = devm_kzalloc(pdev-dev, sizeof(*nop-phy.otg),
GFP_KERNEL);
if (!nop-phy.otg)
@@ -161,13 +245,20 @@ static int nop_usb_xceiv_probe(struct platform_device 
*pdev)
 
if (dev-of_node) {
struct device_node *node = dev-of_node;
+   const struct of_device_id *of_id;
 
if (of_property_read_u32(node, clock-frequency, clk_rate))
clk_rate = 0;
 
needs_vcc = of_property_read_bool(node, vcc-supply);
needs_reset = of_property_read_bool(node, reset-supply);
-
+   of_id = of_match_node(nop_xceiv_dt_ids, node);
+   if (of_id) {
+   phy_data = of_id-data;
+   err = phy_data-reg_init(pdev);
+   if (err)
+   return err;
+   }
} else if (pdata) {
type = pdata-type;
clk_rate = pdata-clk_rate;
@@ -217,8 +308,15 @@ static int nop_usb_xceiv_probe(struct platform_device 
*pdev)
nop

musb: dsps: make it work with two instances

2013-07-05 Thread Sebastian Andrzej Siewior
This enables the two musb instances on am335x to work.
Could someone explain what
ti,hwmods = usb_otg_hs;
doing? I would want to have something like
| musb {
|/* glue /*
|   {
|   musb child node
|}
| }

and this twice. This would put the glue layer into the right position and
remove this nonsense and the += 0x400 chicken dance (look for
musb_core_offset).

Sebastian

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/5] arm: dts: am33xx: add USB phy nodes

2013-07-05 Thread Sebastian Andrzej Siewior
The memory address contains three pieces that is the reset module which
is currently the only one used and two other pices which seem
interresting based on what the register.
The phy id (0 or 1) can be obtained via of_alias_get_id(). However once
we need this, we should used something for common register access.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am33xx.dtsi | 16 
 1 file changed, 16 insertions(+)

diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 0d4df90..a24f1cb 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -333,6 +333,22 @@
status = disabled;
};
 
+   musb0_phy: phy0@47401000 {
+   compatible = ti,am335x-usb-phy;
+   reg = 0x44e10620 0x2c  /* reset module */
+   0x47401000 0x200
+   0x47401300 0x100;
+   status = disabled;
+   };
+
+   musb1_phy: phy1@47401800 {
+   compatible = ti,am335x-usb-phy;
+   reg = 0x44e10628 0x24  /* reset module */
+   0x47401800 0x200
+   0x47401b00 0x100;
+   status = disabled;
+   };
+
usb@4740 {
compatible = ti,musb-am33xx;
reg = 0x4740 0x1000/* usbss */
-- 
1.8.3.2

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/5] usb: musb: dsps: use proper child nodes

2013-07-05 Thread Sebastian Andrzej Siewior
This moves the two instances from the big node into two child nodes. The
glue layer ontop does almost nothing.
This could be two indepentant child nodes but I have no idea how
'ti,hwmods = usb_otg_hs;' affects the two musb controler.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am335x-bone.dts  |  8 ++
 arch/arm/boot/dts/am335x-evm.dts   | 16 
 arch/arm/boot/dts/am335x-evmsk.dts | 16 
 arch/arm/boot/dts/am33xx.dtsi  | 47 ---
 drivers/usb/musb/musb_dsps.c   | 51 ++
 5 files changed, 97 insertions(+), 41 deletions(-)

diff --git a/arch/arm/boot/dts/am335x-bone.dts 
b/arch/arm/boot/dts/am335x-bone.dts
index 83184e5..ae50fd7 100644
--- a/arch/arm/boot/dts/am335x-bone.dts
+++ b/arch/arm/boot/dts/am335x-bone.dts
@@ -124,6 +124,14 @@
status = okay;
};
 
+   musb: usb@4740 {
+   status = okay;
+
+   usb0@47401000 {
+   status = okay;
+   };
+   };
+
i2c0: i2c@44e0b000 {
pinctrl-names = default;
pinctrl-0 = i2c0_pins;
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 317637a..dc236f4 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -175,6 +175,22 @@
status = okay;
};
 
+   musb1_phy: phy1@47401800 {
+   status = okay;
+   };
+
+   musb: usb@4740 {
+   status = okay;
+
+   usb0@47401000 {
+   status = okay;
+   };
+
+   usb1@47401800 {
+   status = okay;
+   };
+   };
+
i2c1: i2c@4802a000 {
pinctrl-names = default;
pinctrl-0 = i2c1_pins;
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts 
b/arch/arm/boot/dts/am335x-evmsk.dts
index 99d9444..74ce579 100644
--- a/arch/arm/boot/dts/am335x-evmsk.dts
+++ b/arch/arm/boot/dts/am335x-evmsk.dts
@@ -211,6 +211,22 @@
status = okay;
};
 
+   musb1_phy: phy1@47401800 {
+   status = okay;
+   };
+
+   musb: usb@4740 {
+   status = okay;
+
+   usb0@47401000 {
+   status = okay;
+   };
+
+   usb1@47401800 {
+   status = okay;
+   };
+   };
+
epwmss2: epwmss@48304000 {
status = okay;
 
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 66bb420..bb2298c 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -349,22 +349,41 @@
status = disabled;
};
 
-   usb@4740 {
+   musb: usb@4740 {
compatible = ti,musb-am33xx;
-   reg = 0x4740 0x1000/* usbss */
-  0x47401000 0x800 /* musb instance 0 */
-  0x47401800 0x800;   /* musb instance 1 */
-   interrupts = 17/* usbss */
- 18/* musb instance 0 */
- 19;  /* musb instance 1 */
-   multipoint = 1;
-   num-eps = 16;
-   ram-bits = 12;
-   port0-mode = 3;
-   port1-mode = 3;
-   power = 250;
+   reg = 0x4740 0x1000;
+   ranges;
+   #address-cells = 1;
+   #size-cells = 1;
+   interrupts = 17;
ti,hwmods = usb_otg_hs;
-   phys = musb1_phy;
+   status = disabled;
+
+   usb0@47401000 {
+   reg = 0x47401000 0x800;
+   interrupts = 18;
+   interrupt-names = mc;
+   multipoint = 1;
+   num-eps = 16;
+   ram-bits = 12;
+   port-mode = 3;
+   power = 250;
+   phys = musb0_phy;
+   status = disabled;
+   };
+
+   usb1@47401800 {
+   reg = 0x47401800 0x800

[PATCH 5/5] musb: musb: dsps: remove instances variable

2013-07-05 Thread Sebastian Andrzej Siewior
Remove the instances variable, there is no single use of it.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 drivers/usb/musb/musb_dsps.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 0e01cc1..edeb2ad 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -111,8 +111,6 @@ struct dsps_musb_wrapper {
/* miscellaneous stuff */
u32 musb_core_offset;
u8  poll_seconds;
-   /* number of musb instances */
-   u8  instances;
 };
 
 /**
@@ -650,7 +648,6 @@ static const struct dsps_musb_wrapper ti81xx_driver_data = {
.rxep_bitmap= (0xfffe  16),
.musb_core_offset   = 0x400,
.poll_seconds   = 2,
-   .instances  = 1,
 };
 
 static const struct platform_device_id musb_dsps_id_table[] = {
-- 
1.8.3.2

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 3/5] usb: musb: dsps: remove the hardcoded phy pieces

2013-07-05 Thread Sebastian Andrzej Siewior
dsps uses a nop driver which is added in dsps itself and does the PHY
on/off calls within dsps. Since those calls are now moved the nop driver
itself, we can now request the phy proper phy and remove those calls.
Currently only the first musb interface is used so we only add one phy
node for now.

Signed-off-by: Sebastian Andrzej Siewior bige...@linutronix.de
---
 arch/arm/boot/dts/am335x-bone.dts  |  4 ++
 arch/arm/boot/dts/am335x-evm.dts   |  4 ++
 arch/arm/boot/dts/am335x-evmsk.dts |  4 ++
 arch/arm/boot/dts/am33xx.dtsi  |  1 +
 drivers/usb/musb/musb_dsps.c   | 97 +-
 5 files changed, 14 insertions(+), 96 deletions(-)

diff --git a/arch/arm/boot/dts/am335x-bone.dts 
b/arch/arm/boot/dts/am335x-bone.dts
index 04feaf8..83184e5 100644
--- a/arch/arm/boot/dts/am335x-bone.dts
+++ b/arch/arm/boot/dts/am335x-bone.dts
@@ -120,6 +120,10 @@
status = okay;
};
 
+   musb0_phy: phy0@47401000 {
+   status = okay;
+   };
+
i2c0: i2c@44e0b000 {
pinctrl-names = default;
pinctrl-0 = i2c0_pins;
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index a16bb96..317637a 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -171,6 +171,10 @@
};
};
 
+   musb0_phy: phy0@47401000 {
+   status = okay;
+   };
+
i2c1: i2c@4802a000 {
pinctrl-names = default;
pinctrl-0 = i2c1_pins;
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts 
b/arch/arm/boot/dts/am335x-evmsk.dts
index 9e00eef..99d9444 100644
--- a/arch/arm/boot/dts/am335x-evmsk.dts
+++ b/arch/arm/boot/dts/am335x-evmsk.dts
@@ -207,6 +207,10 @@
};
};
 
+   musb0_phy: phy0@47401000 {
+   status = okay;
+   };
+
epwmss2: epwmss@48304000 {
status = okay;
 
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index a24f1cb..66bb420 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -364,6 +364,7 @@
port1-mode = 3;
power = 250;
ti,hwmods = usb_otg_hs;
+   phys = musb1_phy;
};
 
epwmss0: epwmss@4830 {
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index e1b661d..22ad532 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -123,49 +123,8 @@ struct dsps_glue {
const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
struct timer_list timer[2]; /* otg_workaround timer */
unsigned long last_timer[2];/* last timer data for each instance */
-   u32 __iomem *usb_ctrl[2];
 };
 
-#defineDSPS_AM33XX_CONTROL_MODULE_PHYS_0   0x44e10620
-#defineDSPS_AM33XX_CONTROL_MODULE_PHYS_1   0x44e10628
-
-static const resource_size_t dsps_control_module_phys[] = {
-   DSPS_AM33XX_CONTROL_MODULE_PHYS_0,
-   DSPS_AM33XX_CONTROL_MODULE_PHYS_1,
-};
-
-#define USBPHY_CM_PWRDN(1  0)
-#define USBPHY_OTG_PWRDN   (1  1)
-#define USBPHY_OTGVDET_EN  (1  19)
-#define USBPHY_OTGSESSEND_EN   (1  20)
-
-/**
- * musb_dsps_phy_control - phy on/off
- * @glue: struct dsps_glue *
- * @id: musb instance
- * @on: flag for phy to be switched on or off
- *
- * This is to enable the PHY using usb_ctrl register in system control
- * module space.
- *
- * XXX: This function will be removed once we have a seperate driver for
- * control module
- */
-static void musb_dsps_phy_control(struct dsps_glue *glue, u8 id, u8 on)
-{
-   u32 usbphycfg;
-
-   usbphycfg = readl(glue-usb_ctrl[id]);
-
-   if (on) {
-   usbphycfg = ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
-   usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
-   } else {
-   usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
-   }
-
-   writel(usbphycfg, glue-usb_ctrl[id]);
-}
 /**
  * dsps_musb_enable - enable interrupts
  */
@@ -416,8 +375,7 @@ static int dsps_musb_init(struct musb *musb)
musb-mregs += wrp-musb_core_offset;
 
/* NOP driver needs change if supporting dual instance */
-   usb_nop_xceiv_register();
-   musb-xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
+   musb-xceiv = devm_usb_get_phy_by_phandle(glue-dev, phys, 0);
if (IS_ERR_OR_NULL(musb-xceiv))
return -EPROBE_DEFER;
 
@@ -433,9 +391,6 @@ static int dsps_musb_init(struct musb *musb)
/* Reset the musb */
dsps_writel(reg_base, wrp-control, (1  wrp-reset));
 
-   /* Start the on-chip PHY and its PLL. */
-   musb_dsps_phy_control(glue, pdev-id, 1

Re: [PATCH 2/5] arm: dts: am33xx: add USB phy nodes

2013-07-05 Thread Sebastian Andrzej Siewior
On 07/05/2013 04:41 PM, Ruchika Kharwar wrote:
 
 On 07/05/2013 08:32 AM, Sebastian Andrzej Siewior wrote:
 The memory address contains three pieces that is the reset module which
 is currently the only one used and two other pices which seem
 interresting based on what the register.
 Please fix typos pices.. interresting.. also the description is not
 clear.

Okay. What part is not clear?


Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/5] usb: musb: dsps: use proper child nodes

2013-07-05 Thread Sebastian Andrzej Siewior
On 07/05/2013 05:08 PM, Enric Balletbo Serra wrote:
 Hi Sebastian,

Hi Enric,

 I'm trying to test these patches but I've problems, I've following error,
 
 [   10.096492] musb-dsps 4740.usb: failed to get memory for instance 0
 [   10.103481] musb-dsps 4740.usb: failed to create child pdev
 
 I'm missing something ?

This is printed if you don't have the memory for the child device. Did
you update your device tree?

 
 Thanks in advance,
  Enric

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/5] usb: musb: dsps: use proper child nodes

2013-07-05 Thread Sebastian Andrzej Siewior
On 07/05/2013 05:22 PM, Enric Balletbo Serra wrote:
 Fixed, I didn't update my DT for my custom board properly. Thanks.

Good. I hate breaking the compatibility for DT but unfortunately it is
beyond repair.

Sebastian

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


  1   2   3   4   5   >