ARM: davinci: complete the conversion to using the reset framework
Subsystems (8)
v2 cover ARM: davinci: complete the conversion to using the reset framework
From: Bartosz Golaszewski <[email protected]>
This series converts the only user of the handcoded, mach-specific reset routines in the davinci platform to using the reset framework.
Patch 1 modifies the way lookup entries are registered with the reset framework.
Patches 2-4 add necessary lookups/DT-properties.
Patches 5-7 convert the davinci-rproc driver to the reset framework.
Patch 8 removes now dead code.
Philipp: it turned out that it's indeed better to use the reset controller's device name for the entry lookup.
Tested both in DT and legacy modes by booting the examples from ti-ipc-rtos recipe in meta-ti.
This series applies on top of David Lechner's common-clk-v9 branch[1] with Philipp Zabel's reset/next branch[2] pulled in.
It can be found in my github tree as well[3].
[1] git://github.com/dlech/ev3dev-kernel.git common-clk-v9
[2] git://git.pengutronix.de/git/pza/linux reset/next
[3] git at github.com:brgl/linux.git topic/davinci-reset
v1 -> v2:
- fixed the device tree patches the descriptions of which were mixed up
- return -EPROBE_DEFER from davinci-rproc's probe() if we can't get the reset provider, since it's possible that the lookup table was not yet registered
- made the local variable naming consistent in the davinci-rproc driver
- fixed a typo in PATCH 5/8
Bartosz Golaszewski (8):
reset: modify the way reset lookup works for board files
ARM: davinci: dts: make psc0 a reset provider
ARM: davinci: dts: add a reset control to the dsp node
clk: davinci: add a reset lookup table for psc0
remoteproc: da8xx: add the missing retval check for clk_enable()
remoteproc: da8xx: prepare and unprepare the clock where needed
remoteproc: da8xx: use the reset framework
clk: davinci: kill davinci_clk_reset_assert/deassert()
arch/arm/boot/dts/da850.dtsi | 2 ++ arch/arm/mach-davinci/include/mach/clock.h | 21 -------------- drivers/clk/davinci/psc-da850.c | 8 ++++++ drivers/clk/davinci/psc.c | 19 +------------ drivers/remoteproc/da8xx_remoteproc.c | 44 +++++++++++++++++++++++++----- drivers/reset/core.c | 33 +++++++++++++++++++--- include/linux/reset-controller.h | 8 ++++-- 7 files changed, 82 insertions(+), 53 deletions(-) delete mode 100644 arch/arm/mach-davinci/include/mach/clock.h
Signature · 1 line
2.16.1
PATCH v2 1/8 reset: modify the way reset lookup works for board files
From: Bartosz Golaszewski <[email protected]>
Commit 7af1bb19f1d7 ("reset: add support for non-DT systems") introduced reset control lookup mechanism for boards that still use board files.
The routine used to register lookup entries takes the corresponding reset_controlled_dev structure as argument.
It's been determined however that for the first user of this new interface - davinci psc driver - it will be easier to register the lookup entries using the reset controller device name.
This patch changes the way lookup entries are added.
--- drivers/reset/core.c | 33 +++++++++++++++++++++++++++++---- include/linux/reset-controller.h | 8 +++++--- 2 files changed, 34 insertions(+), 7 deletions(-)
drivers/reset/core.c +29 -4
@@ -153,11 +153,11 @@ EXPORT_SYMBOL_GPL(devm_reset_controller_register);/** * reset_controller_add_lookup - register a set of lookup entries -* @rcdev: initialized reset controller device owning the reset line +* @provider: name of the reset controller provider * @lookup: array of reset lookup entries * @num_entries: number of entries in the lookup array */ -void reset_controller_add_lookup (struct reset_controller_dev *rcdev, +void reset_controller_add_lookup (const char *provider,struct reset_control_lookup *lookup,unsigned int num_entries) {
@@ -174,7 +174,7 @@ void reset_controller_add_lookup(struct reset_controller_dev *rcdev,continue ; } - entry->rcdev = rcdev; + entry->provider = provider;list_add_tail (&entry->list, &reset_lookup_list); }mutex_unlock (&reset_lookup_mutex);
@@ -526,11 +526,30 @@ struct reset_control *__of_reset_control_get(struct device_node *node, }EXPORT_SYMBOL_GPL (__of_reset_control_get); +static struct reset_controller_dev * +__reset_controller_by_name (const char *name) +{ +struct reset_controller_dev *rcdev; + +lockdep_assert_held (&reset_list_mutex); + +list_for_each_entry (rcdev, &reset_controller_list, list) { +if (!rcdev->dev) +continue ; + +if (!strcmp (name,dev_name (rcdev->dev))) +return rcdev; + } + +return NULL ; +} +static struct reset_control *__reset_control_get_from_lookup (struct device *dev,const char *con_id,bool shared,bool optional) {const struct reset_control_lookup *lookup; +struct reset_controller_dev *rcdev;const char *dev_id =dev_name (dev);struct reset_control *rstc =NULL ;
@@ -547,7 +566,13 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id, ((con_id && lookup->con_id) && !strcmp(con_id, lookup->con_id))) {mutex_lock (&reset_list_mutex); - rstc =__reset_control_get_internal (lookup->rcdev, + rcdev =__reset_controller_by_name (lookup->provider); +if (!rcdev) { +mutex_unlock (&reset_list_mutex); +continue ; + } + + rstc =__reset_control_get_internal (rcdev, lookup->index, shared);mutex_unlock (&reset_list_mutex);
include/linux/reset-controller.h +5 -3
@@ -30,14 +30,14 @@ struct of_phandle_args;* struct reset_control_lookup - represents a single lookup entry * * @list: internal list of all reset lookup entries -* @rcdev: reset controller device controlling this reset line +* @provider: name of the reset controller device controlling this reset line * @index: ID of the reset controller in the reset controller device * @dev_id: name of the device associated with this reset line * @con_id name of the reset line (can be NULL) */ struct reset_control_lookup {struct list_head list; -struct reset_controller_dev *rcdev; +const char *provider;unsigned int index;const char *dev_id;const char *con_id;
@@ -57,6 +57,7 @@ struct reset_control_lookup {* @owner: kernel module of the reset controller driver * @list: internal list of reset controller devices * @reset_control_head: head of internal list of requested reset controls +* @dev: corresponding driver model device struct * @of_node: corresponding device tree node as phandle target * @of_reset_n_cells: number of cells in reset line specifiers * @of_xlate: translation function to translate from specifier as found in the
@@ -68,6 +69,7 @@ struct reset_controller_dev {struct module *owner;struct list_head list;struct list_head reset_control_head; +struct device *dev;struct device_node *of_node;int of_reset_n_cells; int (*of_xlate)(struct reset_controller_dev *rcdev,
@@ -82,7 +84,7 @@ struct device;int devm_reset_controller_register (struct device *dev,struct reset_controller_dev *rcdev); -void reset_controller_add_lookup (struct reset_controller_dev *rcdev, +void reset_controller_add_lookup (const char *provider,struct reset_control_lookup *lookup,unsigned int num_entries);
Signature · 1 line
2.16.1
Philipp Zabel
maintainerRe: [PATCH v2 1/8] reset: modify the way reset lookup works for board files
Hi Bartosz,
Quoted 6 lines · Bartosz Golaszewski
From: Bartosz Golaszewski <[email protected]>
Commit
7af1bb19f1d7("reset: add support for non-DT systems") introduced reset control lookup mechanism for boards that still use board files.
Quoted 6 lines
The routine used to register lookup entries takes the corresponding
reset_controlled_devstructure as argument.It's been determined however that for the first user of this new interface - davinci psc driver - it will be easier to register the lookup entries using the reset controller device name.
Thank you, this is what I expected in the first place.
Quoted 13 lines
This patch changes the way lookup entries are added.
Signed-off-by Bartosz Golaszewski <[email protected]>--- drivers/reset/core.c | 33 +++++++++++++++++++++++++++++---- include/linux/reset-controller.h | 8 +++++--- 2 files changed, 34 insertions(+), 7 deletions(-)drivers/reset/core.c +0
-0
drivers/reset/core.c EXPORT_SYMBOL_GPL(devm_reset_controller_register); · line 160
Quoted 10 lines
drivers/reset/core.c +2
-2@@ -153,11 +153,11 @@ EXPORT_SYMBOL_GPL(devm_reset_controller_register);/** * reset_controller_add_lookup - register a set of lookup entries -* @rcdev: initialized reset controller device owning the reset line +* @provider: name of the reset controller provider * @lookup: array of reset lookup entries * @num_entries: number of entries in the lookup array */ -void reset_controller_add_lookup(struct reset_controller_dev *rcdev, +void reset_controller_add_lookup(const char *provider,
Is there any reason not to drop the provider parameter completely? I'd just let the user add the provider device id to the lookup, see below.
Quoted 44 lines
drivers/reset/core.c +20
-1struct reset_control_lookup *lookup, unsigned int num_entries) {@@ -174,7 +174,7 @@ void reset_controller_add_lookup(struct reset_controller_dev *rcdev,continue ; } - entry->rcdev = rcdev; + entry->provider = provider;list_add_tail (&entry->list, &reset_lookup_list); }mutex_unlock (&reset_lookup_mutex);@@ -526,11 +526,30 @@ struct reset_control *__of_reset_control_get(struct device_node *node, }EXPORT_SYMBOL_GPL (__of_reset_control_get); +static struct reset_controller_dev * +__reset_controller_by_name (const char *name) +{ +struct reset_controller_dev *rcdev; + +lockdep_assert_held (&reset_list_mutex); + +list_for_each_entry (rcdev, &reset_controller_list, list) { +if (!rcdev->dev) +continue ; + +if (!strcmp (name,dev_name (rcdev->dev))) +return rcdev; + } + +return NULL ; +} +static struct reset_control *__reset_control_get_from_lookup (struct device *dev,const char *con_id,bool shared,bool optional) {const struct reset_control_lookup *lookup; +struct reset_controller_dev *rcdev;const char *dev_id =dev_name (dev);struct reset_control *rstc =NULL ;
drivers/reset/core.c __reset_control_get_from_lookup(struct device *dev, const char *con_id, · line 572
Quoted 8 lines
drivers/reset/core.c +4
-1@@ -547,7 +566,13 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id, ((con_id && lookup->con_id) && !strcmp(con_id, lookup->con_id))) {mutex_lock (&reset_list_mutex); - rstc = __reset_control_get_internal(lookup->rcdev, + rcdev =__reset_controller_by_name (lookup->provider); +if (!rcdev) { +mutex_unlock (&reset_list_mutex); +continue ;
What is the reason to continue here? If we've found a matching lookup that contains a rcdev dev_id for which there is no reset controller, shouldn't we just return an error?
Quoted 14 lines
drivers/reset/core.c +3
-0+ } + + rstc =__reset_control_get_internal (rcdev, lookup->index, shared);mutex_unlock (&reset_list_mutex);include/linux/reset-controller.h +0
-0@@ -30,14 +30,14 @@ struct of_phandle_args;* struct reset_control_lookup - represents a single lookup entry * * @list: internal list of all reset lookup entries
include/linux/reset-controller.h struct of_phandle_args; · line 40
Quoted 10 lines
include/linux/reset-controller.h +2
-2-* @rcdev: reset controller device controlling this reset line +* @provider: name of the reset controller device controlling this reset line * @index: ID of the reset controller in the reset controller device * @dev_id: name of the device associated with this reset line * @con_id name of the reset line (can be NULL) */ struct reset_control_lookup {struct list_head list; -struct reset_controller_dev *rcdev; +const char *provider;
Looks good to me, but I'd also extend RESET_LOOKUP to set the provider instead of passing it to the reset_controller_add_lookup function, similarly to PWM_LOOKUP:
#define RESET_LOOKUP(_provider, _index, _dev_id, _con_id)
Quoted 20 lines
include/linux/reset-controller.h +2
-0unsigned int index;const char *dev_id;const char *con_id;@@ -57,6 +57,7 @@ struct reset_control_lookup {* @owner: kernel module of the reset controller driver * @list: internal list of reset controller devices * @reset_control_head: head of internal list of requested reset controls +* @dev: corresponding driver model device struct * @of_node: corresponding device tree node as phandle target * @of_reset_n_cells: number of cells in reset line specifiers * @of_xlate: translation function to translate from specifier as found in the @@ -68,6 +69,7 @@ struct reset_controller_dev {struct module *owner;struct list_head list;struct list_head reset_control_head; +struct device *dev;struct device_node *of_node;int of_reset_n_cells; int (*of_xlate)(struct reset_controller_dev *rcdev,
include/linux/reset-controller.h struct device; · line 90
Quoted 8 lines
include/linux/reset-controller.h +1
-1@@ -82,7 +84,7 @@ struct device;int devm_reset_controller_register (struct device *dev,struct reset_controller_dev *rcdev); -void reset_controller_add_lookup (struct reset_controller_dev *rcdev, +void reset_controller_add_lookup (const char *provider,struct reset_control_lookup *lookup,unsigned int num_entries);
regards
Philipp
Re: [PATCH v2 1/8] reset: modify the way reset lookup works for board files
2018-03-23 11:24 GMT+01:00 Philipp Zabel <[email protected]>:
Quoted 89 lines
Hi Bartosz,
Quoted 6 lines · Bartosz Golaszewski
From: Bartosz Golaszewski <[email protected]>
Commit
7af1bb19f1d7("reset: add support for non-DT systems") introduced reset control lookup mechanism for boards that still use board files.Quoted 6 lines
The routine used to register lookup entries takes the corresponding
reset_controlled_devstructure as argument.It's been determined however that for the first user of this new interface - davinci psc driver - it will be easier to register the lookup entries using the reset controller device name.
Thank you, this is what I expected in the first place.
Quoted 13 lines
This patch changes the way lookup entries are added.
Signed-off-by Bartosz Golaszewski <[email protected]>--- drivers/reset/core.c | 33 +++++++++++++++++++++++++++++---- include/linux/reset-controller.h | 8 +++++--- 2 files changed, 34 insertions(+), 7 deletions(-)drivers/reset/core.c +0
-0drivers/reset/core.c EXPORT_SYMBOL_GPL(devm_reset_controller_register); · line 160
Quoted 10 lines
drivers/reset/core.c +2
-2@@ -153,11 +153,11 @@ EXPORT_SYMBOL_GPL(devm_reset_controller_register);/** * reset_controller_add_lookup - register a set of lookup entries -* @rcdev: initialized reset controller device owning the reset line +* @provider: name of the reset controller provider * @lookup: array of reset lookup entries * @num_entries: number of entries in the lookup array */ -void reset_controller_add_lookup(struct reset_controller_dev *rcdev, +void reset_controller_add_lookup(const char *provider,Is there any reason not to drop the provider parameter completely? I'd just let the user add the provider device id to the lookup, see below.
Quoted 43 lines
drivers/reset/core.c +20
-1struct reset_control_lookup *lookup, unsigned int num_entries) {@@ -174,7 +174,7 @@ void reset_controller_add_lookup(struct reset_controller_dev *rcdev,continue ; } - entry->rcdev = rcdev; + entry->provider = provider;list_add_tail (&entry->list, &reset_lookup_list); }mutex_unlock (&reset_lookup_mutex);@@ -526,11 +526,30 @@ struct reset_control *__of_reset_control_get(struct device_node *node, }EXPORT_SYMBOL_GPL (__of_reset_control_get); +static struct reset_controller_dev * +__reset_controller_by_name (const char *name) +{ +struct reset_controller_dev *rcdev; + +lockdep_assert_held (&reset_list_mutex); + +list_for_each_entry (rcdev, &reset_controller_list, list) { +if (!rcdev->dev) +continue ; + +if (!strcmp (name,dev_name (rcdev->dev))) +return rcdev; + } + +return NULL ; +} +static struct reset_control *__reset_control_get_from_lookup (struct device *dev,const char *con_id,bool shared,bool optional) {const struct reset_control_lookup *lookup; +struct reset_controller_dev *rcdev;const char *dev_id =dev_name (dev);struct reset_control *rstc =NULL ;
Quoted 14 lines
drivers/reset/core.c __reset_control_get_from_lookup(struct device *dev, const char *con_id, · line 572
Quoted 9 lines
drivers/reset/core.c +4
-1@@ -547,7 +566,13 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id, ((con_id && lookup->con_id) && !strcmp(con_id, lookup->con_id))) {mutex_lock (&reset_list_mutex); - rstc = __reset_control_get_internal(lookup->rcdev, + rcdev =__reset_controller_by_name (lookup->provider); +if (!rcdev) { +mutex_unlock (&reset_list_mutex); +continue ;What is the reason to continue here? If we've found a matching lookup that contains a rcdev
dev_idfor which there is no reset controller, shouldn't we just return an error?
Indeed. This could be used to indicate to drivers that the reset controller may not have yet been probed() or its probe() failed. How about returning -EPROBE_DEFER here?
Bart
Quoted 29 lines
Quoted 14 lines
drivers/reset/core.c +3
-0+ } + + rstc =__reset_control_get_internal (rcdev, lookup->index, shared);mutex_unlock (&reset_list_mutex);include/linux/reset-controller.h +0
-0@@ -30,14 +30,14 @@ struct of_phandle_args;* struct reset_control_lookup - represents a single lookup entry * * @list: internal list of all reset lookup entries include/linux/reset-controller.h struct of_phandle_args; · line 40
Quoted 10 lines
include/linux/reset-controller.h +2
-2-* @rcdev: reset controller device controlling this reset line +* @provider: name of the reset controller device controlling this reset line * @index: ID of the reset controller in the reset controller device * @dev_id: name of the device associated with this reset line * @con_id name of the reset line (can be NULL) */ struct reset_control_lookup {struct list_head list; -struct reset_controller_dev *rcdev; +const char *provider;Looks good to me, but I'd also extend
RESET_LOOKUPto set the provider instead of passing it to thereset_controller_add_lookupfunction, similarly toPWM_LOOKUP:
Quoted 2 lines
#define
RESET_LOOKUP(_provider, _index, _dev_id, _con_id)
I did it mostly for brevity - I don't mind changing it if you prefer this version.
Thanks,
Bart
Philipp Zabel
maintainerRe: [PATCH v2 1/8] reset: modify the way reset lookup works for board files
Quoted 105 lines · Bartosz Golaszewski
2018-03-23 11:24 GMT+01:00 Philipp Zabel <[email protected]>:
Quoted 89 lines
Hi Bartosz,
Quoted 6 lines · Bartosz Golaszewski
From: Bartosz Golaszewski <[email protected]>
Commit
7af1bb19f1d7("reset: add support for non-DT systems") introduced reset control lookup mechanism for boards that still use board files.Quoted 6 lines
The routine used to register lookup entries takes the corresponding
reset_controlled_devstructure as argument.It's been determined however that for the first user of this new interface - davinci psc driver - it will be easier to register the lookup entries using the reset controller device name.
Thank you, this is what I expected in the first place.
Quoted 13 lines
This patch changes the way lookup entries are added.
Signed-off-by Bartosz Golaszewski <[email protected]>--- drivers/reset/core.c | 33 +++++++++++++++++++++++++++++---- include/linux/reset-controller.h | 8 +++++--- 2 files changed, 34 insertions(+), 7 deletions(-)drivers/reset/core.c +0
-0drivers/reset/core.c EXPORT_SYMBOL_GPL(devm_reset_controller_register); · line 160
Quoted 10 lines
drivers/reset/core.c +2
-2@@ -153,11 +153,11 @@ EXPORT_SYMBOL_GPL(devm_reset_controller_register);/** * reset_controller_add_lookup - register a set of lookup entries -* @rcdev: initialized reset controller device owning the reset line +* @provider: name of the reset controller provider * @lookup: array of reset lookup entries * @num_entries: number of entries in the lookup array */ -void reset_controller_add_lookup(struct reset_controller_dev *rcdev, +void reset_controller_add_lookup(const char *provider,Is there any reason not to drop the provider parameter completely? I'd just let the user add the provider device id to the lookup, see below.
Quoted 43 lines
drivers/reset/core.c +20
-1struct reset_control_lookup *lookup, unsigned int num_entries) {@@ -174,7 +174,7 @@ void reset_controller_add_lookup(struct reset_controller_dev *rcdev,continue ; } - entry->rcdev = rcdev; + entry->provider = provider;list_add_tail (&entry->list, &reset_lookup_list); }mutex_unlock (&reset_lookup_mutex);@@ -526,11 +526,30 @@ struct reset_control *__of_reset_control_get(struct device_node *node, }EXPORT_SYMBOL_GPL (__of_reset_control_get); +static struct reset_controller_dev * +__reset_controller_by_name (const char *name) +{ +struct reset_controller_dev *rcdev; + +lockdep_assert_held (&reset_list_mutex); + +list_for_each_entry (rcdev, &reset_controller_list, list) { +if (!rcdev->dev) +continue ; + +if (!strcmp (name,dev_name (rcdev->dev))) +return rcdev; + } + +return NULL ; +} +static struct reset_control *__reset_control_get_from_lookup (struct device *dev,const char *con_id,bool shared,bool optional) {const struct reset_control_lookup *lookup; +struct reset_controller_dev *rcdev;const char *dev_id =dev_name (dev);struct reset_control *rstc =NULL ;Quoted 14 lines
drivers/reset/core.c __reset_control_get_from_lookup(struct device *dev, const char *con_id, · line 572
Quoted 9 lines
drivers/reset/core.c +4
-1@@ -547,7 +566,13 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id, ((con_id && lookup->con_id) && !strcmp(con_id, lookup->con_id))) {mutex_lock (&reset_list_mutex); - rstc = __reset_control_get_internal(lookup->rcdev, + rcdev =__reset_controller_by_name (lookup->provider); +if (!rcdev) { +mutex_unlock (&reset_list_mutex); +continue ;What is the reason to continue here? If we've found a matching lookup that contains a rcdev
dev_idfor which there is no reset controller, shouldn't we just return an error?
Quoted 3 lines
Indeed. This could be used to indicate to drivers that the reset controller may not have yet been
probed()or itsprobe()failed. How about returning -EPROBE_DEFER here?
That is a good point. The framework doesn't know whether the lookup->provider is bogus or whether it's correct and the corresponding driver just hasn't registered its reset controller yet. So we have to assume the latter and return -EPROBE_DEFER here.
Quoted 31 lines
Bart
Quoted 29 lines
Quoted 14 lines
drivers/reset/core.c +3
-0+ } + + rstc =__reset_control_get_internal (rcdev, lookup->index, shared);mutex_unlock (&reset_list_mutex);include/linux/reset-controller.h +0
-0@@ -30,14 +30,14 @@ struct of_phandle_args;* struct reset_control_lookup - represents a single lookup entry * * @list: internal list of all reset lookup entries include/linux/reset-controller.h struct of_phandle_args; · line 40
Quoted 10 lines
include/linux/reset-controller.h +2
-2-* @rcdev: reset controller device controlling this reset line +* @provider: name of the reset controller device controlling this reset line * @index: ID of the reset controller in the reset controller device * @dev_id: name of the device associated with this reset line * @con_id name of the reset line (can be NULL) */ struct reset_control_lookup {struct list_head list; -struct reset_controller_dev *rcdev; +const char *provider;Looks good to me, but I'd also extend
RESET_LOOKUPto set the provider instead of passing it to thereset_controller_add_lookupfunction, similarly toPWM_LOOKUP:
Quoted 5 lines
Quoted 2 lines
#define
RESET_LOOKUP(_provider, _index, _dev_id, _con_id)I did it mostly for brevity - I don't mind changing it if you prefer this version.
Yes, please. I like the consistency, and seeing provider and index right next to each other will make the lookups easier to read and understand.
regards
Philipp
PATCH v2 2/8 ARM: davinci: dts: make psc0 a reset provider
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
The psc driver registers with the reset framework as a provider. Add the #reset-cells property to the psc0 node.
--- arch/arm/boot/dts/da850.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/da850.dtsi +1 -0
@@ -123,6 +123,7 @@ compatible = "ti,da850-psc0"; reg = <0x10000 0x1000>; #clock-cells = <1>; + #reset-cells = <1>; #power-domain-cells = <1>; clocks = <&pll0_sysclk 1>, <&pll0_sysclk 2>, <&pll0_sysclk 4>, <&pll0_sysclk 6>,
Signature · 1 line
2.16.1
PATCH v2 3/8 ARM: davinci: dts: add a reset control to the dsp node
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
The davinci-rproc driver will soon use the reset framework. Add the resets property to the dsp node in da850.dtsi.
--- arch/arm/boot/dts/da850.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/da850.dtsi +1 -0
@@ -109,6 +109,7 @@ interrupt-parent = <&intc>; interrupts = <28>; clocks = <&psc0 15>; + resets = <&psc0 15>; status = "disabled"; }; soc at 1c00000 {
Signature · 1 line
2.16.1
PATCH v2 4/8 clk: davinci: add a reset lookup table for psc0
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
In order to be able to use the reset framework in legacy boot mode as well, add the reset lookup table to the psc driver for da850 variant.
--- drivers/clk/davinci/psc-da850.c | 8 ++++++++ drivers/clk/davinci/psc.c | 1 + 2 files changed, 9 insertions(+)
drivers/clk/davinci/psc-da850.c +8 -0
@@ -6,6 +6,7 @@*/ #include <linux/clk-provider.h> +#include <linux/reset-controller.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/init.h>
@@ -66,8 +67,15 @@ LPSC_CLKDEV3(ecap_clkdev, "fck", "ecap.0","fck" ,"ecap.1" , "fck", "ecap.2"); +static struct reset_control_lookup da850_psc0_reset_lookup_table[] = { +RESET_LOOKUP ("davinci-rproc.0" ,NULL ,15 ), +}; +static int da850_psc0_init (struct device *dev,void __iomem *base) { +reset_controller_add_lookup ("da850-psc0" , + da850_psc0_reset_lookup_table, +ARRAY_SIZE (da850_psc0_reset_lookup_table));return davinci_psc_register_clocks (dev, da850_psc0_info,16 , base); }
drivers/clk/davinci/psc.c +1 -0
@@ -425,6 +425,7 @@ __davinci_psc_register_clocks(struct device *dev, psc->rcdev.ops = &davinci_psc_reset_ops; psc->rcdev.owner =THIS_MODULE ; + psc->rcdev.dev = dev; psc->rcdev.of_node = dev->of_node; psc->rcdev.of_reset_n_cells =1 ; psc->rcdev.of_xlate = davinci_psc_reset_of_xlate;
Signature · 1 line
2.16.1
PATCH v2 5/8 remoteproc: da8xx: add the missing retval check for clk_enable()
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
The davinci platform is being switched to using the common clock framework, where clk_enable() can fail. Add the return value check.
--- drivers/remoteproc/da8xx_remoteproc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/remoteproc/da8xx_remoteproc.c +7 -1
@@ -138,6 +138,7 @@ static int da8xx_rproc_start(struct rproc *rproc)struct device *dev = rproc->dev.parent;struct da8xx_rproc *drproc = (struct da8xx_rproc *)rproc->priv;struct clk *dsp_clk = drproc->dsp_clk; +int ret;/* hw requires the start (boot) address be on 1KB boundary */ if (rproc->bootaddr &0x3ff ) {
@@ -148,7 +149,12 @@ static int da8xx_rproc_start(struct rproc *rproc)writel (rproc->bootaddr, drproc->bootreg); -clk_enable (dsp_clk); + ret =clk_enable (dsp_clk); +if (ret) { +dev_err (dev,"clk_enable() failed: %d\n" , ret); +return ret; + } +davinci_clk_reset_deassert (dsp_clk);return 0 ;
Signature · 1 line
2.16.1
PATCH v2 6/8 remoteproc: da8xx: prepare and unprepare the clock where needed
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
We're currently switching the platform to using the common clock framework. We need to explicitly prepare and unprepare the rproc clock.
--- drivers/remoteproc/da8xx_remoteproc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/remoteproc/da8xx_remoteproc.c +3 -3
@@ -149,9 +149,9 @@ static int da8xx_rproc_start(struct rproc *rproc)writel (rproc->bootaddr, drproc->bootreg); - ret =clk_enable (dsp_clk); + ret =clk_prepare_enable (dsp_clk);if (ret) { -dev_err (dev,"clk_enable() failed: %d\n" , ret); +dev_err (dev,"clk_prepare_enable() failed: %d\n" , ret);return ret; }
@@ -165,7 +165,7 @@ static int da8xx_rproc_stop(struct rproc *rproc)struct da8xx_rproc *drproc = rproc->priv;davinci_clk_reset_assert (drproc->dsp_clk); -clk_disable (drproc->dsp_clk); +clk_disable_unprepare (drproc->dsp_clk);return 0 ; }
Signature · 1 line
2.16.1
PATCH v2 7/8 remoteproc: da8xx: use the reset framework
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
Switch to using the reset framework instead of handcoded reset routines we used so far.
--- drivers/remoteproc/da8xx_remoteproc.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-)
drivers/remoteproc/da8xx_remoteproc.c +29 -5
@@ -10,6 +10,7 @@#include <linux/bitops.h> #include <linux/clk.h> +#include <linux/reset.h> #include <linux/err.h> #include <linux/interrupt.h> #include <linux/io.h>
@@ -20,8 +21,6 @@#include <linux/platform_device.h> #include <linux/remoteproc.h> -#include <mach/clock.h> /* for davinci_clk_reset_assert/deassert() */ -#include "remoteproc_internal.h" static char *da8xx_fw_name;
@@ -72,6 +71,7 @@ struct da8xx_rproc {struct da8xx_rproc_mem *mem;int num_mems;struct clk *dsp_clk; +struct reset_control *dsp_reset;void (*ack_fxn)(struct irq_data *data);struct irq_data *irq_data;void __iomem *chipsig;
@@ -138,6 +138,7 @@ static int da8xx_rproc_start(struct rproc *rproc)struct device *dev = rproc->dev.parent;struct da8xx_rproc *drproc = (struct da8xx_rproc *)rproc->priv;struct clk *dsp_clk = drproc->dsp_clk; +struct reset_control *dsp_reset = drproc->dsp_reset;int ret;/* hw requires the start (boot) address be on 1KB boundary */
@@ -155,7 +156,11 @@ static int da8xx_rproc_start(struct rproc *rproc)return ret; } -davinci_clk_reset_deassert (dsp_clk); + ret =reset_control_deassert (dsp_reset); +if (ret) { +dev_err (dev,"reset_control_deassert() failed: %d\n" , ret); +return ret; + }return 0 ; }
@@ -163,8 +168,15 @@ static int da8xx_rproc_start(struct rproc *rproc)static int da8xx_rproc_stop (struct rproc *rproc) {struct da8xx_rproc *drproc = rproc->priv; +int ret; + + ret =reset_control_assert (drproc->dsp_reset); +if (ret) { +dev_err (rproc->dev.parent, +"reset_control_assert() failed: %d\n" , ret); +return ret; + } -davinci_clk_reset_assert (drproc->dsp_clk);clk_disable_unprepare (drproc->dsp_clk);return 0 ;
@@ -232,6 +244,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev)struct resource *bootreg_res;struct resource *chipsig_res;struct clk *dsp_clk; +struct reset_control *dsp_reset;void __iomem *chipsig;void __iomem *bootreg;int irq;
@@ -268,6 +281,17 @@ static int da8xx_rproc_probe(struct platform_device *pdev)return PTR_ERR (dsp_clk); } + dsp_reset =devm_reset_control_get_exclusive (dev,NULL ); +if (IS_ERR (dsp_reset)) { +/* The platform lookup may not be registered yet. */ +if (PTR_ERR (dsp_reset) == -ENOENT ) +return -EPROBE_DEFER ; + +dev_err (dev,"unable to get reset control: %ld\n" , +PTR_ERR (dsp_reset)); +return PTR_ERR (dsp_reset); + } +if (dev->of_node) { ret =of_reserved_mem_device_init (dev);if (ret) {
@@ -309,7 +333,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev)* *not* in reset, but da8xx_rproc_start() needs the DSP to be * held in reset at the time it is called. */ - ret =davinci_clk_reset_assert (drproc->dsp_clk); + ret =reset_control_assert (dsp_reset);if (ret) goto free_rproc;
Signature · 1 line
2.16.1
PATCH v2 8/8 clk: davinci: kill davinci_clk_reset_assert/deassert()
In reply to Bartosz GolaszewskiFrom: Bartosz Golaszewski <[email protected]>
This code is no longer used. Remove it.
--- arch/arm/mach-davinci/include/mach/clock.h | 21 --------------------- drivers/clk/davinci/psc.c | 18 ------------------ 2 files changed, 39 deletions(-) delete mode 100644 arch/arm/mach-davinci/include/mach/clock.h
arch/arm/mach-davinci/include/mach/clock.h deleted +0 -21
@@ -1,21 +0,0 @@ -/* -* arch/arm/mach-davinci/include/mach/clock.h -* -* Clock control driver for DaVinci - header file -* -* Authors: Vladimir Barinov <[email protected]> -* -* 2007 (c) MontaVista Software, Inc. This file is licensed under -* the terms of the GNU General Public License version 2. This program -* is licensed "as is" without any warranty of any kind, whether express -* or implied. -*/ -#ifndef __ASM_ARCH_DAVINCI_CLOCK_H -#define __ASM_ARCH_DAVINCI_CLOCK_H - -struct clk ; - -int davinci_clk_reset_assert (struct clk *c); -int davinci_clk_reset_deassert (struct clk *c); - -#endif
drivers/clk/davinci/psc.c +0 -18
@@ -295,24 +295,6 @@ static int davinci_lpsc_clk_reset(struct clk *clk, bool reset)return 0 ; } -/* -* REVISIT: These exported functions can be removed after a non-DT lookup is -* added to the reset controller framework and the davinci-rproc driver is -* updated to use the generic reset controller framework. -*/ - -int davinci_clk_reset_assert (struct clk *clk) -{ -return davinci_lpsc_clk_reset (clk, true); -} -EXPORT_SYMBOL (davinci_clk_reset_assert); - -int davinci_clk_reset_deassert (struct clk *clk) -{ -return davinci_lpsc_clk_reset (clk, false); -} -EXPORT_SYMBOL (davinci_clk_reset_deassert); -static int davinci_psc_reset_assert (struct reset_controller_dev *rcdev,unsigned long id) {
Signature · 1 line
2.16.1