10 Jan, 2012

2 commits

  • power management changes for omap and imx

    A significant part of the changes for these two platforms went into
    power management, so they are split out into a separate branch.

    * tag 'pm' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (65 commits)
    ARM: imx6: remove __CPUINIT annotation from v7_invalidate_l1
    ARM: imx6: fix v7_invalidate_l1 by adding I-Cache invalidation
    ARM: imx6q: resume PL310 only when CACHE_L2X0 defined
    ARM: imx6q: build pm code only when CONFIG_PM selected
    ARM: mx5: use generic irq chip pm interface for pm functions on
    ARM: omap: pass minimal SoC/board data for UART from dt
    arm/dts: Add minimal device tree support for omap2420 and omap2430
    omap-serial: Add minimal device tree support
    omap-serial: Use default clock speed (48Mhz) if not specified
    omap-serial: Get rid of all pdev->id usage
    ARM: OMAP2+: hwmod: Add a new flag to handle hwmods left enabled at init
    ARM: OMAP4: PRM: use PRCM interrupt handler
    ARM: OMAP3: pm: use prcm chain handler
    ARM: OMAP: hwmod: add support for selecting mpu_irq for each wakeup pad
    ARM: OMAP2+: mux: add support for PAD wakeup interrupts
    ARM: OMAP: PRCM: add suspend prepare / finish support
    ARM: OMAP: PRCM: add support for chain interrupt handler
    ARM: OMAP3/4: PRM: add functions to read pending IRQs, PRM barrier
    ARM: OMAP2+: hwmod: Add API to enable IO ring wakeup
    ARM: OMAP2+: mux: add wakeup-capable hwmod mux entries to dynamic list
    ...

    Linus Torvalds
     
  • Non-critical bug fixes

    Simple bug fixes that were not considered important enough for inclusion
    into 3.2.

    * tag 'fixes-non-critical' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
    MAINTAINERS: update pxa and mmp
    ARM: pxa: Include linux/export.h in balloon3.c
    ARM: OMAP4: clock: Add CPU local timer clock node
    ARM: OMAP4: hwmod: Don't wait for the idle status if modulemode is not supported
    ARM: OMAP: AM3517/3505: fix crash on boot due to incorrect voltagedomain data
    ARM: OMAP: hwmod data: fix the panic on Nokia RM-680 during boot
    ARM: OMAP2+: DMA: Workaround for invalid destination position
    ARM: OMAP2+: DMA: Workaround for invalid source position

    Linus Torvalds
     

17 Dec, 2011

5 commits

  • If the module does not have any modulemode, the _disable_module function
    will do nothing. There is then no point waiting for a idle status change.

    It will remove the following warnings.

    [ 0.331848] omap_hwmod: dmm: _wait_target_disable failed
    [ 0.339935] omap_hwmod: emif_fw: _wait_target_disable failed
    [ 0.348358] omap_hwmod: l3_main_1: _wait_target_disable failed
    [ 0.356964] omap_hwmod: l3_main_2: _wait_target_disable failed
    [ 0.365600] omap_hwmod: l4_abe: _wait_target_disable failed
    [ 0.373931] omap_hwmod: l4_cfg: _wait_target_disable failed
    [ 0.382263] omap_hwmod: l4_per: _wait_target_disable failed
    [ 0.391113] omap_hwmod: l4_wkup: _wait_target_disable failed
    [ 0.399536] omap_hwmod: dma_system: _wait_target_disable failed
    [ 0.408325] omap_hwmod: dss_core: _wait_target_disable failed
    [ 0.416839] omap_hwmod: dss_dispc: _wait_target_disable failed
    [ 0.425445] omap_hwmod: dss_dsi1: _wait_target_disable failed
    [ 0.433990] omap_hwmod: dss_dsi2: _wait_target_disable failed
    [ 0.442504] omap_hwmod: dss_hdmi: _wait_target_disable failed
    [ 0.451019] omap_hwmod: dss_rfbi: _wait_target_disable failed
    [ 0.459564] omap_hwmod: dss_venc: _wait_target_disable failed
    [ 0.489471] omap_hwmod: mailbox: _wait_target_disable failed
    [ 0.505920] omap_hwmod: spinlock: _wait_target_disable failed

    Note: For such module, the state is managed automatically by HW according
    to clock domain transition. It is then not possible to wait for idle even
    later in the _idle function since the status will change at clock domain
    boundary.

    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Cc: Rajendra Nayak
    [paul@pwsan.com: renamed fns to indicate that they are OMAP4-only; moved
    _wait_target_disable() into _disable_module(), removing duplicate code]
    Signed-off-by: Paul Walmsley
    Signed-off-by: Tony Lindgren

    Benoit Cousson
     
  • Conflicts:
    arch/arm/mach-omap2/Makefile

    Tony Lindgren
     
  • An hwmod with a 'HWMOD_INIT_NO_IDLE' flag set, is left in
    enabled state by the hwmod framework post the initial setup.
    Once a real user of the device (a driver) tries to enable it
    at a later point, the hwmod framework throws a WARN() about
    the device being already in enabled state.

    Fix this by introducing a new internal flag '_HWMOD_SKIP_ENABLE' to
    identify such devices/hwmods. When the device/hwmod is requested to be
    enabled (the first time) by its driver/user, nothing except the
    mux-enable is needed. The mux data is board specific and is
    unavailable during initial enable() of the device, done by the
    framework as part of setup().

    A good example of a such a device is an UART used as debug console.
    The UART module needs to be kept enabled through the boot, until the
    UART driver takes control of it, for debug prints to appear on
    the console.

    Acked-by: Kevin Hilman
    Acked-by: Benoit Cousson
    Signed-off-by: Rajendra Nayak
    [paul@pwsan.com: use a flag rather than a state; updated commit message;
    edited some documentation]
    Signed-off-by: Paul Walmsley
    Signed-off-by: Tony Lindgren

    Rajendra Nayak
     
  • By default all registered pads will trigger mpu_irqs[0]. Now there is
    an API for selecting used mpu_irq on pad basis, which can be used to
    trigger different irq handlers for different pads in the same hwmod.
    Each pad that requires its interrupt to be re-routed this way must
    have a separate call to omap_hwmod_pad_route_irq(hwmod, pad, irq).

    Signed-off-by: Tero Kristo
    Acked-by: Tony Lindgren
    Tested-by: Kevin Hilman
    Reviewed-by: Kevin Hilman
    [paul@pwsan.com: moved fn to omap_hwmod.c; separated fn from mux scan_wakeups
    changes; added kerneldoc]
    Signed-off-by: Paul Walmsley

    Tero Kristo
     
  • Add API to enable IO pad wakeup capability based on mux pad and
    wake_up enable flag available from hwmod_mux initialization.

    Use the wakeup_enable flag and enable wakeup capability for the given
    pads. Wakeup capability will be enabled/disabled during hwmod idle
    transition based on whether wakeup_flag is set or cleared. If the
    hwmod is currently idled, and any mux values were changed by
    _set_idle_ioring_wakeup(), the SCM PADCTRL registers will be updated.

    Signed-off-by: Govindraj.R
    Signed-off-by: Tero Kristo
    Tested-by: Kevin Hilman
    Reviewed-by: Kevin Hilman
    [paul@pwsan.com: rearranged code to limit indentation; cleaned up
    function documentation; removed unused non-static functions; modified
    to search all hwmod pads, not just dynamic remuxing ones; modified to
    update SCM regs if hwmod is currently idle and any pads have changed]
    Signed-off-by: Paul Walmsley

    Govindraj R
     

06 Dec, 2011

1 commit


24 Nov, 2011

1 commit

  • The address spaces, irqs and dma reqs count APIs return the
    number of corresponding entries in a hwmod including a additional
    null value or a -1 terminator in the structure introduced recently.
    More information here:

    - 212738a4: omap_hwmod: use a terminator record with omap_hwmod_mpu_irqs
    arrays

    - 78183f3f: omap_hwmod: use a null structure record to terminate
    omap_hwmod_addr_space arrays

    - bc614958: omap_hwmod: use a terminator record with omap_hwmod_dma_info
    arrays

    The issue with irqs and dma info was originally reported by Benoit Cousson.

    The devices which have multiple hwmods and use device_build_ss are
    broken with this, as their resources are populated with a extra null
    value, subsequently the probe fails. So fix the API not to include
    the array terminator in the count.

    Reported-by: Benoit Cousson
    Signed-off-by: Santosh Shilimkar
    Signed-off-by: sricharan
    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Cc: stable@vger.kernel.org
    Signed-off-by: Tony Lindgren

    sricharan
     

18 Nov, 2011

1 commit

  • As suggested by Russell King - ARM Linux ,
    there's no need to keep local prototypes in non-local headers.

    Add mach-omap1/common.h and mach-omap2/common.h and move the
    local prototypes there from plat/common.h and mach/omap4-common.h.

    Signed-off-by: Tony Lindgren
    Signed-off-by: Russell King

    Tony Lindgren
     

05 Nov, 2011

1 commit

  • get_context_loss_count functions return context loss count as u32, and
    zero means an error. However, zero is also returned when context has
    never been lost and could also be returned when the context loss count
    has wrapped and goes to zero.

    Change the functions to return an int, with negative value meaning an
    error.

    OMAP HSMMC code uses omap_pm_get_dev_context_loss_count(), but as the
    hsmmc code handles the returned value as an int, with negative value
    meaning an error, this patch actually fixes hsmmc code also.

    Signed-off-by: Tomi Valkeinen
    Acked-by: Kevin Hilman
    Acked-by: Paul Walmsley
    [tony@atomide.com: updated to fix a warning with recent dmtimer changes]
    Signed-off-by: Tony Lindgren

    Tomi Valkeinen
     

15 Sep, 2011

1 commit

  • At Tony's request, remove the OMAP_CHIP* flags from the hwmod data, and
    replace it instead with chip family, variant, and ES level-specific lists
    of hwmods to register.

    Thanks to Gražvydas Ignotas for finding a bug in the
    AM3517/3505 support, and for other review comments.

    Signed-off-by: Paul Walmsley
    Cc: Gražvydas Ignotas

    Paul Walmsley
     

10 Jul, 2011

18 commits

  • On OMAP4, the PRCM recommended sequence for enabling
    a module after power-on-reset is:
    -1- Force clkdm to SW_WKUP
    -2- Enabling the clocks
    -3- Configure desired module mode to "enable" or "auto"
    -4- Wait for the desired module idle status to be FUNC
    -5- Program clkdm in HW_AUTO(if supported)

    This sequence applies to all older OMAPs' as well,
    however since they use autodeps, it makes sure that
    no clkdm is in IDLE, and hence not requiring a force
    SW_WKUP when a module is being enabled.

    OMAP4 does not need to support autodeps, because
    of the dyanamic dependency feature, wherein
    the HW takes care of waking up a clockdomain from
    idle and hence the module, whenever an interconnect
    access happens to the given module.

    Implementing the sequence for OMAP4 requires
    the clockdomain handling that is currently done in
    clock framework to be done as part of hwmod framework
    since the step -4- above to "Wait for the desired
    module idle status to be FUNC" is done as part of
    hwmod framework.

    Signed-off-by: Rajendra Nayak
    [b-cousson@ti.com: Adapt it to the new clkdm hwmod attribute and API]
    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    [paul@pwsan.com: dropped mach-omap2/clock.c changes; modified to only
    call the clockdomain code if oh->clkdm is set; disable clock->clockdomain
    interaction on OMAP4]
    Signed-off-by: Paul Walmsley

    Rajendra Nayak
     
  • Take advantage of the explicit modulemode control to fix
    the way parents clocks are managed.
    A module must be disabled before any parents are disabled.
    That programming model was not possible with the previous
    implementation that was considering a modulemode as a leaf
    clock node managed by the clock fmwk.
    This was leading to bad crash upon disable when the parent
    clock was gated before the module completed its transition
    to idle.

    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Cc: Rajendra Nayak
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • The RSTCTRL register was accessed using an absolute address.
    The usage of hardcoded macros to calculate virtual address from physical
    one should be avoided as much as possible.
    The usage of an offset will allow future improvement like migration from
    the current architecture code toward a module driver.

    Update prm_xxx accessors, move definition to the proper header file and
    update copyrights.
    Change the s16 register offset parameter to u16.

    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Cc: Rajendra Nayak
    [paul@pwsan.com: use '_prminst_' in function names that are part of the
    prminst44xx.c file]
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • It is mandatory to wait for a module to be in disabled state before
    potentially disabling source clock or re-asserting a reset.

    omap_hwmod_idle and omap_hwmod_shutdown does not wait for
    the module to be fully idle.

    Add a cm_xxx accessor to wait the clkctrl idle status to be disabled.
    Fix hwmod_[idle|shutdown] to use this API.

    Based on Rajendra's initial patch.

    Please note that most interconnects hwmod will return one timeout because
    it is impossible for them to be in idle since the processor is accessing
    the registers though the interconnect.

    Signed-off-by: Benoit Cousson
    Signed-off-by: Rajendra Nayak
    Cc: Paul Walmsley
    Cc: Todd Poynor
    [paul@pwsan.com: move cpu_is_*() tests to the top of _wait_target_disable();
    incorporate some feedback from Todd]
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • The CLKCTRL register was accessed using an absolute address.
    The usage of hardcoded macros to calculate virtual address from physical
    one should be avoided as much as possible.
    The usage of a offset will allow future improvement like migration from
    the current architecture code toward a module driver.

    Update cm_xxx accessor, move definition to the proper header file and
    update copyrights.

    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Cc: Rajendra Nayak
    Cc: Todd Poynor
    [paul@pwsan.com: renamed 'omap4_cm_' fns to 'omap4_cminst_'; removed empty
    fn prototype section from cm44xx.h; incorporated comments from Todd;
    documented some functions]
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • At boot time, lookup the clkdm_name to get the clkdm
    structure pointer for further usage.

    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Cc: Rajendra Nayak
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • The sequence of _ocp_softreset doesn't work for i2c. The i2c module has a
    special sequence to reset the module. The sequence is
    - Disable the I2C.
    - Write to SOFTRESET bit.
    - Enable the I2C.
    - Poll on the RESETDONE bit.
    The sequence is implemented as a function and the i2c_class is updated with
    the correct 'reset' pointer. omap_hwmod_softreset function is implemented
    which triggers the softreset by writing into sysconfig register. On following
    this sequence, i2c module resets properly and timeouts are not seen.

    Cc: Rajendra Nayak
    Cc: Paul Walmsley
    Cc: Benoit Cousson
    Cc: Kevin Hilman
    Signed-off-by: Avinash.H.M
    [paul@pwsan.com: combined this patch with a patch to remove
    HWMOD_INIT_NO_RESET from the 44xx hwmod flags; change register
    offset conditional code to use the IP block revision; minor code
    cleanup]
    Signed-off-by: Paul Walmsley

    Avinash.H.M
     
  • …mmon_hwmod_3.1', 'omap4_hwmod_data_cleanup_a_3.1', 'clock_cleanup_a_3.1', 'prcm_cleanup_a_3.1', 'omap_pm_cleanup_3.1' and 'omap_device_cleanup_3.1' into prcm-cleanup-3.1

    Paul Walmsley
     
  • Previously, struct omap_hwmod_dma_info arrays were unterminated; and
    users of these arrays used the ARRAY_SIZE() macro to determine the
    length of the array. However, ARRAY_SIZE() only works when the array
    is in the same scope as the macro user.

    So far this hasn't been a problem. However, to reduce duplicated
    data, a subsequent patch will move common data to a separate, shared
    file. When this is done, ARRAY_SIZE() will no longer be usable.

    This patch removes ARRAY_SIZE() usage for struct omap_hwmod_dma_info
    arrays and uses a sentinel value (irq == -1) as the array terminator
    instead.

    Signed-off-by: Paul Walmsley

    Paul Walmsley
     
  • Previously, struct omap_hwmod_mpu_irqs arrays were unterminated; and
    users of these arrays used the ARRAY_SIZE() macro to determine the
    length of the array. However, ARRAY_SIZE() only works when the array
    is in the same scope as the macro user.

    So far this hasn't been a problem. However, to reduce duplicated
    data, a subsequent patch will move common data to a separate, shared
    file. When this is done, ARRAY_SIZE() will no longer be usable.

    This patch removes ARRAY_SIZE() usage for struct omap_hwmod_mpu_irqs
    arrays and uses a sentinel value (irq == -1) as the array terminator
    instead.

    Signed-off-by: Paul Walmsley

    Paul Walmsley
     
  • Previously, struct omap_hwmod_addr_space arrays were unterminated; and
    users of these arrays used the ARRAY_SIZE() macro to determine the
    length of the array. However, ARRAY_SIZE() only works when the array
    is in the same scope as the macro user.

    So far this hasn't been a problem. However, to reduce duplicated
    data, a subsequent patch will move common data to a separate, shared
    file. When this is done, ARRAY_SIZE() will no longer be usable.

    This patch removes ARRAY_SIZE() usage for struct omap_hwmod_addr_space
    arrays and uses a null structure member as the array terminator
    instead.

    Signed-off-by: Paul Walmsley

    Paul Walmsley
     
  • Move the pr_debug at the top of the function
    to trace the entry even if the first test is failing.
    That help understanding that we entered the function
    but failed in it.

    Move the _enable last part out of the test to reduce
    indentation and improve readability.

    Signed-off-by: Benoit Cousson
    Cc: Paul Walmsley
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • Change the debug into warning to check what IPs are failing.

    Signed-off-by: Benoit Cousson
    Cc: Rajendra Nayak
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • The HW reset must be de-assert after the clocks are enabled
    but before waiting for the target to be ready. Otherwise the
    reset might not work properly since the clock is not running
    to proceed the reset.

    De-assert the reset after _enable_clocks and before
    _wait_target_ready.
    Re-assert it only when the clocks are disabled.

    Signed-off-by: Benoit Cousson
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • It is perfectly valid for some hwmod to not have any
    register target address for sysconfig. This is especially
    true for interconnect hwmods.
    Remove the warning.

    Signed-off-by: Benoit Cousson
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • The Type 2 type of IPs will not have any enawakeup bit in their sysconfig.
    Writing to that bit will instead trigger a softreset.
    Check the flag to write this bit only if the module supports it.

    Reported-by: Miguel Vadillo
    Signed-off-by: Benoit Cousson
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     
  • When calling the shutdown, the module may be already in idle.
    Accessing the sysconfig register will then lead to a crash.
    In that case, re-enable the module in order to allow the access
    to the sysconfig register.

    Signed-off-by: Miguel Vadillo
    Signed-off-by: Benoit Cousson
    Signed-off-by: Paul Walmsley

    Miguel Vadillo
     
  • The commit 86009eb326afde34ffdc5648cd344aa86b8d58d4 was adding
    the wakeup support for new OMAP4 IPs. This support is incomplete for
    busmaster IPs that need as well to use smart-standby with wakeup.

    This new standbymode is suported on HSI and USB_HOST_FS for the moment.

    Add the new MSTANDBY_SMART_WKUP flag to mark the IPs that support this
    capability.

    Enable this new mode when applicable in _enable_wakeup, _disable_wakeup,
    _enable_sysc and _idle_sysc.

    The omap_hwmod_44xx_data.c will have to be updated to add this new flag.

    Signed-off-by: Benoit Cousson
    Signed-off-by: Djamil Elaidi
    Signed-off-by: Paul Walmsley

    Benoit Cousson
     

01 Jun, 2011

1 commit

  • Fix below compilation warnings.

    arch/arm/mach-omap2/omap_hwmod.c: In function 'omap_hwmod_for_each':
    arch/arm/mach-omap2/omap_hwmod.c:1631: warning: 'ret' may be used uninitialized in this function

    arch/arm/mach-omap2/mux.c: In function 'omap_mux_get_gpio':
    arch/arm/mach-omap2/mux.c:917: warning: 'm' may be used uninitialized in this function

    Signed-off-by: Govindraj.R
    Signed-off-by: Tony Lindgren

    Govindraj.R
     

12 Mar, 2011

1 commit


11 Mar, 2011

2 commits


10 Mar, 2011

6 commits

  • Add a new clockdomain flag, CLKDM_NO_AUTODEPS, which, when marked on a
    clockdomain, will prevent "autodeps" from being associated with the
    clockdomain. ("Autodeps" are sleep dependencies and wakeup
    dependencies from/to processor modules that are automatically added to
    a clockdomain when it is in hardware-supervised idle mode. They are
    deprecated -- a relic from the old CDP trees -- but are still in use
    for OMAP3.)

    Also, prevent the hwmod code from adding or removing initiator
    dependencies for clockdomains with this flag set.

    This patch should allow others to test which clockdomains actually
    still need autodeps.

    Thanks to Kevin Hilman for noting that the original
    version should also modify the hwmod code.

    Signed-off-by: Paul Walmsley
    Cc: Kevin Hilman

    Paul Walmsley
     
  • Create a new API that forms a wrapper to _set_module_autoidle()
    to modify the AUTOIDLE bit.

    This API is intended to be used by drivers that requires direct
    manipulation of the AUTOIDLE bits in SYSCONFIG register.
    McBSP driver requires autoidle bit to be enabled/disabled while
    using sidetone feature.

    Signed-off-by: Kishon Vijay Abraham I
    Cc: Paul Walmsley
    Cc: Benoit Cousson
    [paul@pwsan.com: restrict the hwmod states that the autoidle bit can be changed
    in; changed function name; dropped "int" from "unsigned int long"]
    Signed-off-by: Paul Walmsley

    Kishon Vijay Abraham I
     
  • Some boards can't tolerate IP blocks being reset when they are initialized.
    Michael Büsch cites a case with the Nokia N810:

    http://www.spinics.net/lists/linux-omap/msg47277.html

    To allow such boards to continue working normally, allow board file
    maintainers to mark IP blocks to prevent them from being reset upon
    init. This is done via a hwmod function, omap_hwmod_no_setup_reset().

    Signed-off-by: Paul Walmsley
    Cc: Michael Buesch

    Paul Walmsley
     
  • On OMAP2 and OMAP3 the reset ctrl shift doesn't match the
    status bit, as it does on OMAP4, when handling the reset lines.

    This patch adds a new member in the reset info structure, so now it
    can be added as part of hwmod data, and checked accordingly for
    OMAP2 or 3; otherwise, there could be cases when the shift masks
    doesn't match both of the registers, and a successful reset might
    throw an error message or vice versa.

    Signed-off-by: Omar Ramirez Luna
    [paul@pwsan.com: added a warning if st_shift used on OMAP4; renamed 'r'
    variable; improved some documentation]
    Signed-off-by: Paul Walmsley

    omar ramirez
     
  • _init_clock always returns 0 and does
    not propogate the error (in case of failure)
    back to the caller, causing _init_clocks to
    fail silently.

    Signed-off-by: Rajendra Nayak
    Acked-by: Benoît Cousson
    Signed-off-by: Paul Walmsley

    Rajendra Nayak
     
  • Autoidle is a single bit, TIOCP_CFG[0], setting on OMAP1/2/3/4 platforms.
    In _set_module_autoidle() I am seeing 0x3 value where the mask is computed.
    This should be 0x1.

    v2:
    (1) Modified the subject.
    (2) Modified the description with further specific information.

    Baseline:
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

    Tested Info:
    Boot tested on OMAP 1/2/3/4.

    Signed-off-by: Tarun Kanti DebBarma
    Acked-by: Rajendra Nayak
    Acked-by: Benoit Cousson
    Signed-off-by: Paul Walmsley

    Tarun Kanti DebBarma